Merge branch 'feat/organizations' into feat/organizations-banner

This commit is contained in:
Leo Giovanetti 2023-05-30 18:55:21 -03:00
commit 3c0bc42b36
176 changed files with 2901 additions and 1580 deletions

View File

@ -8,7 +8,7 @@ runs:
using: "composite"
steps:
- name: Cache production build
uses: actions/cache@v3
uses: buildjet/cache@v3
id: cache-build
env:
cache-name: prod-build

View File

@ -12,7 +12,7 @@ runs:
steps:
- name: Cache database
id: cache-db
uses: actions/cache@v3
uses: buildjet/cache@v3
env:
cache-name: cache-db
key-1: ${{ hashFiles('packages/prisma/schema.prisma', 'packages/prisma/migrations/**/**.sql', 'packages/prisma/*.ts') }}

View File

@ -4,7 +4,7 @@ runs:
using: "composite"
steps:
- name: Create env file
uses: actions/cache@v3
uses: buildjet/cache@v3
id: env-cache
with:
path: gh.env
@ -13,4 +13,4 @@ runs:
- name: Set Environment Variables
uses: tw3lveparsecs/github-actions-setvars@latest
with:
envFilePath: gh.env
envFilePath: gh.env

View File

@ -20,7 +20,7 @@ runs:
using: "composite"
steps:
- name: Use Node ${{ inputs.node_version }}
uses: actions/setup-node@v3
uses: buildjet/setup-node@v3
with:
node-version: ${{ inputs.node_version }}
- name: Expose yarn config as "$GITHUB_OUTPUT"
@ -32,7 +32,7 @@ runs:
# Yarn rotates the downloaded cache archives, @see https://github.com/actions/setup-node/issues/325
# Yarn cache is also reusable between arch and os.
- name: Restore yarn cache
uses: actions/cache@v3
uses: buildjet/cache@v3
id: yarn-download-cache
with:
path: ${{ steps.yarn-config.outputs.CACHE_FOLDER }}
@ -43,7 +43,7 @@ runs:
# Invalidated on yarn.lock changes
- name: Restore yarn install state
id: yarn-install-state-cache
uses: actions/cache@v3
uses: buildjet/cache@v3
with:
path: .yarn/ci-cache/
key: ${{ runner.os }}-yarn-install-state-cache-${{ hashFiles('yarn.lock', '.yarnrc.yml') }}

View File

@ -5,7 +5,7 @@ runs:
steps:
- name: Cache playwright binaries
id: playwright-cache
uses: actions/cache@v2
uses: buildjet/cache@v2
with:
path: |
~/Library/Caches/ms-playwright

View File

@ -6,7 +6,7 @@ on:
jobs:
cleanup:
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
steps:
- name: Check out code
uses: actions/checkout@v3

View File

@ -5,7 +5,7 @@ env:
NODE_OPTIONS: "--max-old-space-size=8192"
jobs:
check-types:
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/dangerous-git-checkout

View File

@ -6,7 +6,7 @@ jobs:
e2e-app-store:
timeout-minutes: 20
name: E2E App-Store Apps
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
services:
postgres:
image: postgres:12.1

View File

@ -5,7 +5,7 @@ on:
jobs:
e2e-embed:
timeout-minutes: 20
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
services:
postgres:
image: postgres:12.1

View File

@ -5,7 +5,7 @@ on:
jobs:
e2e-embed:
timeout-minutes: 20
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
services:
postgres:
image: postgres:12.1

View File

@ -4,8 +4,8 @@ on:
jobs:
e2e:
timeout-minutes: 20
name: E2E tests
runs-on: ubuntu-latest
name: E2E tests (${{ matrix.shard }}/${{ strategy.job-total }})
runs-on: buildjet-4vcpu-ubuntu-2204
services:
postgres:
image: postgres:12.1
@ -14,6 +14,10 @@ jobs:
POSTGRES_DB: calendso
ports:
- 5432:5432
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3, 4, 5]
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/dangerous-git-checkout
@ -23,13 +27,15 @@ jobs:
- uses: ./.github/actions/env-read-file
- uses: ./.github/actions/cache-db
- uses: ./.github/actions/cache-build
- name: Seed Test DB
run: yarn db-seed
- name: Run Tests
run: yarn test-e2e
run: yarn e2e --shard=${{ matrix.shard }}/${{ strategy.job-total }}
env:
DEPLOYSENTINEL_API_KEY: ${{ secrets.DEPLOYSENTINEL_API_KEY }}
- name: Upload Test Results
if: ${{ always() }}
uses: actions/upload-artifact@v2
with:
name: test-results
name: test-results-${{ matrix.shard }}_${{ strategy.job-total }}
path: test-results

View File

@ -20,7 +20,7 @@ env:
INPUT_ENV_PAYMENT_FEE_FIXED: 10
INPUT_ENV_SAML_DATABASE_URL: postgresql://postgres:@localhost:5432/calendso
INPUT_ENV_SAML_ADMINS: pro@example.com
INPUT_ENV_NEXTAUTH_URL: http://127.0.0.1:3000/api/auth
INPUT_ENV_NEXTAUTH_URL: http://localhost:3000
INPUT_ENV_NEXT_PUBLIC_IS_E2E: 1
# INPUT_ENV_EMAIL_FROM: e2e@cal.com
# INPUT_ENV_EMAIL_SERVER_HOST: ${{ secrets.CI_EMAIL_SERVER_HOST }}
@ -36,14 +36,14 @@ env:
jobs:
create_env_file:
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/dangerous-git-checkout
- uses: ozaytsev86/create-env-file@v1
with:
file-name: ${{ github.workspace }}/gh.env
- uses: actions/cache@v3
- uses: buildjet/cache@v3
id: env-cache
with:
path: gh.env

View File

@ -3,7 +3,7 @@ on:
workflow_call:
jobs:
lint:
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v3

View File

@ -15,7 +15,7 @@ jobs:
analyze:
needs: build
if: always()
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/dangerous-git-checkout

View File

@ -16,7 +16,7 @@ concurrency:
jobs:
changes:
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
permissions:
pull-requests: read
outputs:
@ -101,7 +101,7 @@ jobs:
required:
needs: [lint, type-check, test, build, e2e]
if: always()
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
steps:
- name: fail if conditional jobs failed
if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'skipped') || contains(needs.*.result, 'cancelled')

View File

@ -6,7 +6,7 @@ on:
jobs:
build:
name: Build
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
timeout-minutes: 30
services:
postgres:

View File

@ -0,0 +1,21 @@
name: "Validate PRs"
on:
pull_request_target:
types:
- opened
- reopened
- edited
- synchronize
permissions:
pull-requests: read
jobs:
validate-pr:
name: Validate PR title
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -7,7 +7,7 @@ on:
jobs:
test:
timeout-minutes: 20
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/dangerous-git-checkout

View File

@ -6,7 +6,7 @@ on:
jobs:
setup:
name: Yarn install & cache
runs-on: ubuntu-latest
runs-on: buildjet-4vcpu-ubuntu-2204
timeout-minutes: 10
steps:
- uses: actions/checkout@v3

View File

@ -106,7 +106,7 @@ To get a local copy up and running, please follow these simple steps.
Here is what you need to be able to run Cal.com.
- Node.js (Version: >=15.x <17)
- Node.js (Version: >=18.x)
- PostgreSQL
- Yarn _(recommended)_

View File

@ -1 +0,0 @@
module.exports = require("@calcom/config/eslint-preset");

View File

@ -11,10 +11,8 @@
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf .next",
"dev": "PORT=3002 next dev",
"lint": "eslint . --ignore-path .gitignore",
"lint:report": "eslint . --format json --output-file ../../lint-results/api.json",
"lint:fix": "eslint . --ext .ts,.js,.tsx,.jsx --fix",
"start": "PORT=3002 next start",
"test": "echo 'No tests yet' && exit 0",
"type-check": "tsc --pretty --noEmit"
},
"devDependencies": {

View File

@ -1,5 +1,23 @@
# @calcom/web
## 2.9.4
### Patch Changes
- Updated dependencies
- @calcom/embed-snippet@1.0.9
- @calcom/embed-react@1.1.1
- @calcom/embed-core@1.2.1
## 2.9.3
### Patch Changes
- Updated dependencies
- @calcom/embed-react@1.1.0
- @calcom/embed-core@1.2.0
- @calcom/embed-snippet@1.0.8
## 2.7.16
### Patch Changes

View File

@ -129,7 +129,10 @@ const Component = ({
className="bg-subtle text-emphasis rounded-md p-1 text-xs capitalize">
{categories[0]}
</Link>{" "}
{t("published_by", { author })}
{" "}
<a target="_blank" rel="noreferrer" href={website}>
{t("published_by", { author })}
</a>
</h2>
{isTemplate && (
<Badge variant="red" className="mt-4">
@ -257,7 +260,7 @@ const Component = ({
)}
</span>
<h4 className="text-emphasis mt-8 mb-2 font-semibold ">{t("learn_more")}</h4>
<h4 className="text-emphasis mt-8 mb-2 font-semibold ">{t("contact")}</h4>
<ul className="prose-sm -ml-1 -mr-1 leading-5">
{docs && (
<li>

View File

@ -123,7 +123,8 @@ function BookingListItem(booking: BookingItemProps) {
disabled: mutation.isLoading,
},
// For bookings with payment, only confirm if the booking is paid for
...((isPending && !booking?.eventType?.price) || (!!booking?.eventType?.price && booking.paid)
...((isPending && !paymentAppData.enabled) ||
(paymentAppData.enabled && !!paymentAppData.price && booking.paid)
? [
{
id: "confirm",
@ -318,6 +319,7 @@ function BookingListItem(booking: BookingItemProps) {
<DialogClose />
<Button
disabled={mutation.isLoading}
data-testid="rejection-confirm"
onClick={() => {
bookingConfirm(false);
}}>

View File

@ -238,20 +238,34 @@ function EventTypeSingleLayout({
<div className="flex items-center justify-end">
{!eventType.metadata.managedEventConfig && (
<>
<div className="sm:hover:bg-muted hidden items-center rounded-md px-2 lg:flex">
<Skeleton
as={Label}
htmlFor="hiddenSwitch"
className="mt-2 hidden cursor-pointer self-center whitespace-nowrap pr-2 sm:inline">
{t("hide_from_profile")}
</Skeleton>
<Switch
id="hiddenSwitch"
checked={formMethods.watch("hidden")}
onCheckedChange={(e) => {
formMethods.setValue("hidden", e);
}}
/>
<div
className={classNames(
"sm:hover:bg-muted hidden cursor-pointer items-center rounded-md",
formMethods.watch("hidden") ? "px-2" : "",
"lg:flex"
)}>
{formMethods.watch("hidden") && (
<Skeleton
as={Label}
htmlFor="hiddenSwitch"
className="mt-2 hidden cursor-pointer self-center whitespace-nowrap pr-2 sm:inline">
{t("hidden")}
</Skeleton>
)}
<Tooltip
content={
formMethods.watch("hidden") ? t("show_eventtype_on_profile") : t("hide_from_profile")
}>
<div className="self-center rounded-md p-2">
<Switch
id="hiddenSwitch"
checked={!formMethods.watch("hidden")}
onCheckedChange={(e) => {
formMethods.setValue("hidden", !e);
}}
/>
</div>
</Tooltip>
</div>
<VerticalDivider className="hidden lg:block" />
</>
@ -344,18 +358,18 @@ function EventTypeSingleLayout({
</DropdownItem>
</DropdownMenuItem>
<DropdownMenuSeparator />
<div className="sm:hover:bg-subtle flex h-9 flex-row items-center justify-between py-2 px-4">
<div className="hover:bg-subtle flex h-9 cursor-pointer flex-row items-center justify-between py-2 px-4">
<Skeleton
as={Label}
htmlFor="hiddenSwitch"
className="mt-2 inline cursor-pointer self-center pr-2 ">
{t("hide_from_profile")}
{formMethods.watch("hidden") ? t("show_eventtype_on_profile") : t("hide_from_profile")}
</Skeleton>
<Switch
id="hiddenSwitch"
checked={formMethods.watch("hidden")}
checked={!formMethods.watch("hidden")}
onCheckedChange={(e) => {
formMethods.setValue("hidden", e);
formMethods.setValue("hidden", !e);
}}
/>
</div>

View File

@ -90,7 +90,7 @@ const DisableTwoFactorAuthModal = ({
</div>
<div className="mt-5 sm:mt-4 sm:flex sm:flex-row-reverse">
<Button type="submit" className="ms-2 me-2" disabled={isDisabling}>
<Button type="submit" className="ms-2 me-2" data-testid="disable-2fa" disabled={isDisabling}>
{t("disable")}
</Button>
<Button color="secondary" onClick={onCancel}>

View File

@ -156,7 +156,9 @@ const EnableTwoFactorModal = ({ onEnable, onCancel, open, onOpenChange }: Enable
<img src={dataUri} alt="" />
}
</div>
<p className="text-center font-mono text-xs">{secret}</p>
<p data-testid="two-factor-secret" className="text-center font-mono text-xs">
{secret}
</p>
</>
</WithStep>
<Form handleSubmit={handleEnable} form={form}>
@ -164,7 +166,11 @@ const EnableTwoFactorModal = ({ onEnable, onCancel, open, onOpenChange }: Enable
<div className="mb-4">
<TwoFactor center />
{errorMessage && <p className="mt-1 text-sm text-red-700">{errorMessage}</p>}
{errorMessage && (
<p data-testid="error-submitting-code" className="mt-1 text-sm text-red-700">
{errorMessage}
</p>
)}
</div>
</WithStep>
<div className="mt-5 sm:mt-4 sm:flex sm:flex-row-reverse">
@ -178,12 +184,16 @@ const EnableTwoFactorModal = ({ onEnable, onCancel, open, onOpenChange }: Enable
</Button>
</WithStep>
<WithStep step={SetupStep.DisplayQrCode} current={step}>
<Button type="submit" className="ms-2 me-2" onClick={() => setStep(SetupStep.EnterTotpCode)}>
<Button
type="submit"
data-testid="goto-otp-screen"
className="ms-2 me-2"
onClick={() => setStep(SetupStep.EnterTotpCode)}>
{t("continue")}
</Button>
</WithStep>
<WithStep step={SetupStep.EnterTotpCode} current={step}>
<Button type="submit" className="ms-2 me-2" disabled={isSubmitting}>
<Button type="submit" className="ms-2 me-2" data-testid="enable-2fa" disabled={isSubmitting}>
{t("enable")}
</Button>
</WithStep>

View File

@ -7,16 +7,10 @@ import { CONSOLE_URL, WEBAPP_URL, WEBSITE_URL } from "@calcom/lib/constants";
import { isIpInBanlist } from "@calcom/lib/getIP";
import { extendEventData, nextCollectBasicSettings } from "@calcom/lib/telemetry";
let cold = true;
const middleware: NextMiddleware = async (req) => {
const url = req.nextUrl;
const requestHeaders = new Headers(req.headers);
// This console.log is required to create a report in axios for hot and cold requests
console.log(cold ? "Cold Start" : "Hot Start");
requestHeaders.set("x-cal-cold-start", cold ? "true" : "false");
cold = false;
if (!url.pathname.startsWith("/api")) {
//
// NOTE: When tRPC hits an error a 500 is returned, when this is received

View File

@ -109,6 +109,7 @@
"react-intl": "^5.25.1",
"react-live-chat-loader": "^2.7.3",
"react-multi-email": "^0.5.3",
"react-phone-input-2": "^2.15.1",
"react-phone-number-input": "^3.2.7",
"react-schemaorg": "^2.0.0",
"react-select": "^5.7.0",

View File

@ -6,7 +6,7 @@ import { useEffect, useState } from "react";
import { DOCS_URL, JOIN_SLACK, WEBSITE_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { HeadSeo } from "@calcom/ui";
import { BookOpen, Check, ChevronRight, FileText } from "@calcom/ui/components/icon";
import { BookOpen, Check, ChevronRight, FileText, Slack } from "@calcom/ui/components/icon";
import PageWrapper from "@components/PageWrapper";
@ -165,29 +165,7 @@ export default function Custom404() {
className="relative flex items-start space-x-4 py-6 rtl:space-x-reverse">
<div className="flex-shrink-0">
<span className="bg-muted flex h-12 w-12 items-center justify-center rounded-lg">
<svg
viewBox="0 0 2447.6 2452.5"
className="h-6 w-6"
xmlns="http://www.w3.org/2000/svg">
<g clipRule="evenodd" fillRule="evenodd">
<path
d="m897.4 0c-135.3.1-244.8 109.9-244.7 245.2-.1 135.3 109.5 245.1 244.8 245.2h244.8v-245.1c.1-135.3-109.5-245.1-244.9-245.3.1 0 .1 0 0 0m0 654h-652.6c-135.3.1-244.9 109.9-244.8 245.2-.2 135.3 109.4 245.1 244.7 245.3h652.7c135.3-.1 244.9-109.9 244.8-245.2.1-135.4-109.5-245.2-244.8-245.3z"
fill="rgba(55, 65, 81)"
/>
<path
d="m2447.6 899.2c.1-135.3-109.5-245.1-244.8-245.2-135.3.1-244.9 109.9-244.8 245.2v245.3h244.8c135.3-.1 244.9-109.9 244.8-245.3zm-652.7 0v-654c.1-135.2-109.4-245-244.7-245.2-135.3.1-244.9 109.9-244.8 245.2v654c-.2 135.3 109.4 245.1 244.7 245.3 135.3-.1 244.9-109.9 244.8-245.3z"
fill="rgba(55, 65, 81)"
/>
<path
d="m1550.1 2452.5c135.3-.1 244.9-109.9 244.8-245.2.1-135.3-109.5-245.1-244.8-245.2h-244.8v245.2c-.1 135.2 109.5 245 244.8 245.2zm0-654.1h652.7c135.3-.1 244.9-109.9 244.8-245.2.2-135.3-109.4-245.1-244.7-245.3h-652.7c-135.3.1-244.9 109.9-244.8 245.2-.1 135.4 109.4 245.2 244.7 245.3z"
fill="rgba(55, 65, 81)"
/>
<path
d="m0 1553.2c-.1 135.3 109.5 245.1 244.8 245.2 135.3-.1 244.9-109.9 244.8-245.2v-245.2h-244.8c-135.3.1-244.9 109.9-244.8 245.2zm652.7 0v654c-.2 135.3 109.4 245.1 244.7 245.3 135.3-.1 244.9-109.9 244.8-245.2v-653.9c.2-135.3-109.4-245.1-244.7-245.3-135.4 0-244.9 109.8-244.8 245.1 0 0 0 .1 0 0"
fill="rgba(55, 65, 81)"
/>
</g>
</svg>
<Slack strokeWidth="1.5" fill="currentColor" className="h-6 w-6" />
</span>
</div>
<div className="min-w-0 flex-1">
@ -313,29 +291,7 @@ export default function Custom404() {
className="relative flex items-start space-x-4 py-6 rtl:space-x-reverse">
<div className="flex-shrink-0">
<span className="bg-muted flex h-12 w-12 items-center justify-center rounded-lg">
<svg
viewBox="0 0 2447.6 2452.5"
className="h-6 w-6"
xmlns="http://www.w3.org/2000/svg">
<g clipRule="evenodd" fillRule="evenodd">
<path
d="m897.4 0c-135.3.1-244.8 109.9-244.7 245.2-.1 135.3 109.5 245.1 244.8 245.2h244.8v-245.1c.1-135.3-109.5-245.1-244.9-245.3.1 0 .1 0 0 0m0 654h-652.6c-135.3.1-244.9 109.9-244.8 245.2-.2 135.3 109.4 245.1 244.7 245.3h652.7c135.3-.1 244.9-109.9 244.8-245.2.1-135.4-109.5-245.2-244.8-245.3z"
fill="rgba(55, 65, 81)"
/>
<path
d="m2447.6 899.2c.1-135.3-109.5-245.1-244.8-245.2-135.3.1-244.9 109.9-244.8 245.2v245.3h244.8c135.3-.1 244.9-109.9 244.8-245.3zm-652.7 0v-654c.1-135.2-109.4-245-244.7-245.2-135.3.1-244.9 109.9-244.8 245.2v654c-.2 135.3 109.4 245.1 244.7 245.3 135.3-.1 244.9-109.9 244.8-245.3z"
fill="rgba(55, 65, 81)"
/>
<path
d="m1550.1 2452.5c135.3-.1 244.9-109.9 244.8-245.2.1-135.3-109.5-245.1-244.8-245.2h-244.8v245.2c-.1 135.2 109.5 245 244.8 245.2zm0-654.1h652.7c135.3-.1 244.9-109.9 244.8-245.2.2-135.3-109.4-245.1-244.7-245.3h-652.7c-135.3.1-244.9 109.9-244.8 245.2-.1 135.4 109.4 245.2 244.7 245.3z"
fill="rgba(55, 65, 81)"
/>
<path
d="m0 1553.2c-.1 135.3 109.5 245.1 244.8 245.2 135.3-.1 244.9-109.9 244.8-245.2v-245.2h-244.8c-135.3.1-244.9 109.9-244.8 245.2zm652.7 0v654c-.2 135.3 109.4 245.1 244.7 245.3 135.3-.1 244.9-109.9 244.8-245.2v-653.9c.2-135.3-109.4-245.1-244.7-245.3-135.4 0-244.9 109.8-244.8 245.1 0 0 0 .1 0 0"
fill="rgba(55, 65, 81)"
/>
</g>
</svg>
<Slack strokeWidth="1.5" fill="currentColor" className="h-6 w-6" />
</span>
</div>
<div className="min-w-0 flex-1">

View File

@ -40,9 +40,9 @@ class MyDocument extends Document<Props> {
return (
<Html lang={locale}>
<Head nonce={nonce}>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/api/logo?type=apple-touch-icon" />
<link rel="icon" type="image/png" sizes="32x32" href="/api/logo?type=favicon-32" />
<link rel="icon" type="image/png" sizes="16x16" href="/api/logo?type=favicon-16" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#000000" />
<meta name="msapplication-TileColor" content="#ff0000" />

View File

@ -6,6 +6,7 @@ import dayjs from "@calcom/dayjs";
import { sendPasswordResetEmail } from "@calcom/emails";
import { PASSWORD_RESET_EXPIRY_HOURS } from "@calcom/emails/templates/forgot-password-email";
import rateLimit from "@calcom/lib/rateLimit";
import { defaultHandler } from "@calcom/lib/server";
import { getTranslation } from "@calcom/lib/server/i18n";
import prisma from "@calcom/prisma";
@ -13,28 +14,39 @@ const limiter = rateLimit({
intervalInMs: 60 * 1000, // 1 minute
});
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
async function handler(req: NextApiRequest, res: NextApiResponse) {
const t = await getTranslation(req.body.language ?? "en", "common");
const email = z
.string()
.email()
.transform((val) => val.toLowerCase())
.parse(req.body?.email);
.safeParse(req.body?.email);
const { isRateLimited } = limiter.check(10, email); // 10 requests per minute
if (isRateLimited) {
return res.status(429).json({ message: "Too Many Requests." });
if (!email.success) {
return res.status(400).json({ message: "email is required" });
}
if (req.method !== "POST") {
return res.status(405).end();
// fallback to email if ip is not present
let ip = (req.headers["x-real-ip"] as string) ?? email.data;
const forwardedFor = req.headers["x-forwarded-for"] as string;
if (!ip && forwardedFor) {
ip = forwardedFor?.split(",").at(0) ?? email.data;
}
// 10 requests per minute
try {
limiter.check(10, ip);
} catch (e) {
return res.status(429).json({ message: "Too Many Requests." });
}
try {
const maybeUser = await prisma.user.findUnique({
where: {
email,
email: email.data,
},
select: {
name: true,
@ -97,3 +109,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
return res.status(500).json({ message: "Unable to create password reset request" });
}
}
export default defaultHandler({
POST: Promise.resolve({ default: handler }),
});

View File

@ -1,7 +1,18 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { z } from "zod";
import { IS_SELF_HOSTED, LOGO, LOGO_ICON, WEBAPP_URL } from "@calcom/lib/constants";
import {
ANDROID_CHROME_ICON_192,
ANDROID_CHROME_ICON_256,
APPLE_TOUCH_ICON,
FAVICON_16,
FAVICON_32,
IS_SELF_HOSTED,
LOGO,
LOGO_ICON,
MSTILE_ICON,
WEBAPP_URL,
} from "@calcom/lib/constants";
import logger from "@calcom/lib/logger";
const log = logger.getChildLogger({ prefix: ["[api/logo]"] });
@ -20,11 +31,79 @@ function extractSubdomainAndDomain(hostname: string) {
}
const logoApiSchema = z.object({
icon: z.coerce.boolean().optional(),
type: z.coerce.string().optional(),
});
const SYSTEM_SUBDOMAINS = ["console", "app", "www"];
type LogoType =
| "logo"
| "icon"
| "favicon-16"
| "favicon-32"
| "apple-touch-icon"
| "mstile"
| "android-chrome-192"
| "android-chrome-256";
type LogoTypeDefinition = {
fallback: string;
w?: number;
h?: number;
source: "appLogo" | "appIconLogo";
};
const logoDefinitions: Record<LogoType, LogoTypeDefinition> = {
logo: {
fallback: `${WEBAPP_URL}${LOGO}`,
source: "appLogo",
},
icon: {
fallback: `${WEBAPP_URL}${LOGO_ICON}`,
source: "appIconLogo",
},
"favicon-16": {
fallback: `${WEBAPP_URL}${FAVICON_16}`,
w: 16,
h: 16,
source: "appIconLogo",
},
"favicon-32": {
fallback: `${WEBAPP_URL}${FAVICON_32}`,
w: 32,
h: 32,
source: "appIconLogo",
},
"apple-touch-icon": {
fallback: `${WEBAPP_URL}${APPLE_TOUCH_ICON}`,
w: 180,
h: 180,
source: "appLogo",
},
mstile: {
fallback: `${WEBAPP_URL}${MSTILE_ICON}`,
w: 150,
h: 150,
source: "appLogo",
},
"android-chrome-192": {
fallback: `${WEBAPP_URL}${ANDROID_CHROME_ICON_192}`,
w: 192,
h: 192,
source: "appLogo",
},
"android-chrome-256": {
fallback: `${WEBAPP_URL}${ANDROID_CHROME_ICON_256}`,
w: 256,
h: 256,
source: "appLogo",
},
};
function isValidLogoType(type: string): type is LogoType {
return type in logoDefinitions;
}
async function getTeamLogos(subdomain: string) {
try {
if (
@ -39,7 +118,7 @@ async function getTeamLogos(subdomain: string) {
}
// load from DB
const { default: prisma } = await import("@calcom/prisma");
const team = await prisma.team.findUniqueOrThrow({
const team = await prisma.team.findUnique({
where: {
slug: subdomain,
},
@ -48,16 +127,16 @@ async function getTeamLogos(subdomain: string) {
appIconLogo: true,
},
});
// try to use team logos, otherwise default to LOGO/LOGO_ICON regardless
return {
appLogo: team.appLogo || `${WEBAPP_URL}${LOGO}`,
appIconLogo: team.appIconLogo || `${WEBAPP_URL}${LOGO_ICON}`,
appLogo: team?.appLogo,
appIconLogo: team?.appIconLogo,
};
} catch (error) {
if (error instanceof Error) log.debug(error.message);
return {
appLogo: `${WEBAPP_URL}${LOGO}`,
appIconLogo: `${WEBAPP_URL}${LOGO_ICON}`,
appLogo: undefined,
appIconLogo: undefined,
};
}
}
@ -75,14 +154,35 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
if (!domains) throw new Error("No domains");
const [subdomain] = domains;
const { appLogo, appIconLogo } = await getTeamLogos(subdomain);
const teamLogos = await getTeamLogos(subdomain);
const filteredLogo = parsedQuery?.icon ? appIconLogo : appLogo;
// Resolve all icon types to team logos, falling back to Cal.com defaults.
const type: LogoType = parsedQuery?.type && isValidLogoType(parsedQuery.type) ? parsedQuery.type : "logo";
const logoDefinition = logoDefinitions[type];
const filteredLogo = teamLogos[logoDefinition.source] ?? logoDefinition.fallback;
const response = await fetch(filteredLogo);
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
res.setHeader("Content-Type", response.headers.get("content-type") as string);
res.setHeader("Cache-Control", "s-maxage=86400");
res.send(buffer);
try {
const response = await fetch(filteredLogo);
const arrayBuffer = await response.arrayBuffer();
let buffer = Buffer.from(arrayBuffer);
// If we need to resize the team logos (via Next.js' built-in image processing)
if (teamLogos[logoDefinition.source] && logoDefinition.w) {
const { detectContentType, optimizeImage } = await import("next/dist/server/image-optimizer");
buffer = await optimizeImage({
buffer,
contentType: detectContentType(buffer) ?? "image/jpeg",
quality: 100,
width: logoDefinition.w,
height: logoDefinition.h, // optional
});
}
res.setHeader("Content-Type", response.headers.get("content-type") as string);
res.setHeader("Cache-Control", "s-maxage=86400");
res.send(buffer);
} catch (error) {
res.statusCode = 404;
res.json({ error: "Failed fetching logo" });
}
}

View File

@ -43,6 +43,8 @@ import {
CreateButton,
HorizontalTabs,
HeadSeo,
Skeleton,
Label,
} from "@calcom/ui";
import {
ArrowDown,
@ -418,7 +420,8 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
{!isManagedEventType && (
<>
{type.hidden && <Badge variant="gray">{t("hidden")}</Badge>}
<Tooltip content={t("show_eventtype_on_profile")}>
<Tooltip
content={type.hidden ? t("show_eventtype_on_profile") : t("hide_from_profile")}>
<div className="self-center rounded-md p-2">
<Switch
name="Hidden"
@ -609,7 +612,6 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
{(group.metadata?.readOnly === false || group.metadata.readOnly === null) &&
!isChildrenManagedEventType && (
<>
<DropdownMenuSeparator />
<DropdownMenuItem className="outline-none">
<DropdownItem
color="destructive"
@ -625,6 +627,25 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
</DropdownMenuItem>
</>
)}
<DropdownMenuSeparator />
{!isManagedEventType && (
<div className="hover:bg-subtle flex h-9 cursor-pointer flex-row items-center justify-between py-2 px-4">
<Skeleton
as={Label}
htmlFor="hiddenSwitch"
className="mt-2 inline cursor-pointer self-center pr-2 ">
{type.hidden ? t("show_eventtype_on_profile") : t("hide_from_profile")}
</Skeleton>
<Switch
id="hiddenSwitch"
name="Hidden"
checked={!type.hidden}
onCheckedChange={() => {
setHiddenMutation.mutate({ id: type.id, hidden: !type.hidden });
}}
/>
</div>
)}
</DropdownMenuContent>
</DropdownMenuPortal>
</Dropdown>

View File

@ -66,7 +66,15 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) {
booking = await getBookingByUidOrRescheduleUid(`${rescheduleUid}`);
}
await ssr.viewer.public.event.prefetch({ username: user, eventSlug: slug });
// We use this to both prefetch the query on the server,
// as well as to check if the event exist, so we c an show a 404 otherwise.
const eventData = await ssr.viewer.public.event.fetch({ username: user, eventSlug: slug });
if (!eventData) {
return {
notFound: true,
};
}
return {
props: {
@ -107,7 +115,15 @@ async function getUserPageProps(context: GetServerSidePropsContext) {
booking = await getBookingByUidOrRescheduleUid(`${rescheduleUid}`);
}
await ssr.viewer.public.event.prefetch({ username, eventSlug: slug });
// We use this to both prefetch the query on the server,
// as well as to check if the event exist, so we c an show a 404 otherwise.
const eventData = await ssr.viewer.public.event.fetch({ username, eventSlug: slug });
if (!eventData) {
return {
notFound: true,
};
}
return {
props: {

View File

@ -66,7 +66,17 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
if (rescheduleUid) {
booking = await getBookingByUidOrRescheduleUid(`${rescheduleUid}`);
}
await ssr.viewer.public.event.prefetch({ username: teamSlug, eventSlug: meetingSlug });
// We use this to both prefetch the query on the server,
// as well as to check if the event exist, so we c an show a 404 otherwise.
const eventData = await ssr.viewer.public.event.fetch({ username: teamSlug, eventSlug: meetingSlug });
if (!eventData) {
return {
notFound: true,
};
}
return {
props: {
booking,

View File

@ -67,12 +67,14 @@ const AppearanceView = () => {
const {
formState: { isSubmitting, isDirty },
reset,
} = formMethods;
const mutation = trpc.viewer.updateProfile.useMutation({
onSuccess: async () => {
onSuccess: async (data) => {
await utils.viewer.me.invalidate();
showToast(t("settings_updated_successfully"), "success");
reset(data);
},
onError: () => {
showToast(t("error_updating_settings"), "error");

View File

@ -13,6 +13,7 @@ import {
Label,
Meta,
Select,
SettingsToggle,
showToast,
SkeletonButton,
SkeletonContainer,
@ -120,6 +121,7 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
value: user.weekStart,
label: nameOfDay(localeProp, user.weekStart === "Sunday" ? 0 : 1),
},
allowDynamicBooking: user.allowDynamicBooking ?? true,
},
});
const {
@ -213,6 +215,22 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
</>
)}
/>
<div className="mt-8">
<Controller
name="allowDynamicBooking"
control={formMethods.control}
render={() => (
<SettingsToggle
title={t("dynamic_booking")}
description={t("allow_dynamic_booking")}
checked={formMethods.getValues("allowDynamicBooking")}
onCheckedChange={(checked) => {
formMethods.setValue("allowDynamicBooking", checked, { shouldDirty: true });
}}
/>
)}
/>
</div>
<Button disabled={isDisabled} color="primary" type="submit" className="mt-8">
<>{t("update")}</>
</Button>

View File

@ -203,6 +203,7 @@ const ProfileView = () => {
<ProfileForm
key={JSON.stringify(defaultValues)}
defaultValues={defaultValues}
isLoading={mutation.isLoading}
onSubmit={(values) => {
if (values.email !== user.email && isCALIdentityProviver) {
setTempFormValues(values);
@ -314,10 +315,12 @@ const ProfileForm = ({
defaultValues,
onSubmit,
extraField,
isLoading = false,
}: {
defaultValues: FormValues;
onSubmit: (values: FormValues) => void;
extraField?: React.ReactNode;
isLoading: boolean;
}) => {
const { t } = useLocale();
const [firstRender, setFirstRender] = useState(true);
@ -390,7 +393,7 @@ const ProfileForm = ({
setFirstRender={setFirstRender}
/>
</div>
<Button disabled={isDisabled} color="primary" className="mt-8" type="submit">
<Button loading={isLoading} disabled={isDisabled} color="primary" className="mt-8" type="submit">
{t("update")}
</Button>
</Form>

View File

@ -40,6 +40,7 @@ const TwoFactorAuthView = () => {
{!isCalProvider && <Alert severity="neutral" message={t("2fa_disabled")} />}
<div className="mt-6 flex items-start space-x-4">
<Switch
data-testid="two-factor-switch"
disabled={!isCalProvider}
checked={user?.twoFactorEnabled}
onCheckedChange={() =>

View File

@ -1,5 +1,4 @@
import { test } from "../lib/fixtures";
import { todo } from "../lib/testUtils";
test.describe("Can signup from a team invite", async () => {
test.beforeEach(async ({ users }) => {
@ -96,5 +95,3 @@ test.describe("Can signup from a team invite", async () => {
expect(createdUser.teams[0].accepted).toBe(true);*/
});
});
todo("Can login using 2FA");

View File

@ -13,6 +13,7 @@ test("Can delete user account", async ({ page, users }) => {
await page.waitForSelector("[data-testid=dashboard-shell]");
await page.goto(`/settings/my-account/profile`);
await page.waitForLoadState("networkidle");
await page.click("[data-testid=delete-account]");
if (!user.username) throw Error(`Test user doesn't have a username`);

View File

@ -29,9 +29,7 @@ test("Can reset forgotten password", async ({ page, users }) => {
// Click text=Submit
await page.click('button[type="submit"]');
await page.waitForSelector("text=Password updated", {
timeout: 3000,
});
await page.waitForSelector("text=Password updated");
await expect(page.locator(`text=Password updated`)).toBeVisible();
// Click button:has-text("Login")

View File

@ -65,7 +65,6 @@ testBothBookers.describe("pro user", () => {
});
test("pro user's page has at least 2 visible events", async ({ page }) => {
// await page.pause();
const $eventTypes = page.locator("[data-testid=event-types] > *");
expect(await $eventTypes.count()).toBeGreaterThanOrEqual(2);
});

View File

@ -99,373 +99,367 @@ testBothBookers.describe("Booking with Seats", (bookerVariant) => {
// todo("Attendee #1 should be able to reschedule his booking");
// TODO: Make E2E test: All attendees canceling should delete the booking for the User
// todo("All attendees canceling should delete the booking for the User");
});
testBothBookers.describe("Reschedule for booking with seats", () => {
test("Should reschedule booking with seats", async ({ page, users, bookings }) => {
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "John Third", email: "third+seats@cal.com", timeZone: "Europe/Berlin" },
]);
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[2].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
const references = await prisma.bookingSeat.findMany({
where: { bookingId: booking.id },
});
await page.goto(`/reschedule/${references[2].referenceUid}`);
await selectFirstAvailableTimeSlotNextMonth(page);
// expect input to be filled with attendee number 3 data
const thirdAttendeeElement = await page.locator("input[name=name]");
const attendeeName = await thirdAttendeeElement.inputValue();
expect(attendeeName).toBe("John Third");
await page.locator('[data-testid="confirm-reschedule-button"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
// Should expect old booking to be accepted with two attendees
const oldBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
include: { seatsReferences: true, attendees: true },
});
expect(oldBooking?.status).toBe(BookingStatus.ACCEPTED);
expect(oldBooking?.attendees.length).toBe(2);
expect(oldBooking?.seatsReferences.length).toBe(2);
testBothBookers.describe("Reschedule for booking with seats", () => {
test("Should reschedule booking with seats", async ({ page, users, bookings }) => {
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "John Third", email: "third+seats@cal.com", timeZone: "Europe/Berlin" },
]);
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
test("Should reschedule booking with seats and if everyone rescheduled it should be deleted", async ({
page,
users,
bookings,
}) => {
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[2].id, referenceUid: uuidv4() },
];
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
const references = await prisma.bookingSeat.findMany({
where: { bookingId: booking.id },
});
await page.goto(`/reschedule/${references[0].referenceUid}`);
await selectFirstAvailableTimeSlotNextMonth(page);
await page.locator('[data-testid="confirm-reschedule-button"]').click();
await page.waitForURL(/.*booking/);
await page.goto(`/reschedule/${references[1].referenceUid}`);
await selectFirstAvailableTimeSlotNextMonth(page);
await page.locator('[data-testid="confirm-reschedule-button"]').click();
// Using waitForUrl here fails the assertion `expect(oldBooking?.status).toBe(BookingStatus.CANCELLED);` probably because waitForUrl is considered complete before waitForNavigation and till that time the booking is not cancelled
await page.waitForNavigation({ url: /.*booking/ });
// Should expect old booking to be cancelled
const oldBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
include: {
seatsReferences: true,
attendees: true,
eventType: {
include: { users: true, hosts: true },
},
},
});
expect(oldBooking?.status).toBe(BookingStatus.CANCELLED);
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
test("Should cancel with seats and have no attendees and cancelled", async ({
page,
users,
bookings,
}) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
const oldBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
include: { seatsReferences: true, attendees: true },
});
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Now we cancel the booking as the organizer
await page.goto(`/booking/${booking.uid}?cancel=true`);
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
// Should expect old booking to be cancelled
const updatedBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
include: { seatsReferences: true, attendees: true },
});
expect(oldBooking?.startTime).not.toBe(updatedBooking?.startTime);
const references = await prisma.bookingSeat.findMany({
where: { bookingId: booking.id },
});
test("If rescheduled/cancelled booking with seats it should display the correct number of seats", async ({
page,
users,
bookings,
}) => {
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await page.goto(`/reschedule/${references[2].referenceUid}`);
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
await selectFirstAvailableTimeSlotNextMonth(page);
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
// expect input to be filled with attendee number 3 data
const thirdAttendeeElement = await page.locator("input[name=name]");
const attendeeName = await thirdAttendeeElement.inputValue();
expect(attendeeName).toBe("John Third");
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
await page.locator('[data-testid="confirm-reschedule-button"]').click();
const references = await prisma.bookingSeat.findMany({
where: { bookingId: booking.id },
});
await page.waitForLoadState("networkidle");
await page.goto(
`/booking/${references[0].referenceUid}?cancel=true&seatReferenceUid=${references[0].referenceUid}`
);
await expect(page).toHaveURL(/.*booking/);
await page.locator('[data-testid="cancel"]').click();
const oldBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
select: {
id: true,
status: true,
},
});
expect(oldBooking?.status).toBe(BookingStatus.ACCEPTED);
await page.goto(`/reschedule/${references[1].referenceUid}`);
await page.click('[data-testid="incrementMonth"]');
await page.locator('[data-testid="day"][data-disabled="false"]').nth(1).click();
// Validate that the number of seats its 10
expect(await page.locator("text=9 / 10 Seats available").count()).toEqual(0);
// Should expect old booking to be accepted with two attendees
const oldBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
include: { seatsReferences: true, attendees: true },
});
test("Should cancel with seats but event should be still accesible and with one less attendee/seat", async ({
page,
users,
bookings,
}) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
expect(oldBooking?.status).toBe(BookingStatus.ACCEPTED);
expect(oldBooking?.attendees.length).toBe(2);
expect(oldBooking?.seatsReferences.length).toBe(2);
});
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
test("Should reschedule booking with seats and if everyone rescheduled it should be deleted", async ({
page,
users,
bookings,
}) => {
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Now we cancel the booking as the first attendee
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
);
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
);
// Page should not be 404
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
test("Should book with seats and hide attendees info from showAttendees true", async ({
page,
users,
bookings,
}) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
const bookingWithEventType = await prisma.booking.findFirst({
where: { uid: booking.uid },
select: {
id: true,
eventTypeId: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.eventType.update({
data: {
seatsShowAttendees: false,
},
where: {
id: bookingWithEventType?.eventTypeId || -1,
},
});
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Go to cancel page and see that attendees are listed and myself as I'm owner of the booking
await page.goto(`/booking/${booking.uid}?cancel=true&allRemainingBookings=false`);
const foundFirstAttendeeAsOwner = await page.locator(
'p[data-testid="attendee-email-first+seats@cal.com"]'
);
await expect(foundFirstAttendeeAsOwner).toHaveCount(1);
const foundSecondAttendeeAsOwner = await page.locator(
'p[data-testid="attendee-email-second+seats@cal.com"]'
);
await expect(foundSecondAttendeeAsOwner).toHaveCount(1);
await page.pause();
await page.goto("auth/logout");
// Now we cancel the booking as the first attendee
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
);
// No attendees should be displayed only the one that it's cancelling
const notFoundSecondAttendee = await page.locator(
'p[data-testid="attendee-email-second+seats@cal.com"]'
);
await expect(notFoundSecondAttendee).toHaveCount(0);
const foundFirstAttendee = await page.locator('p[data-testid="attendee-email-first+seats@cal.com"]');
await expect(foundFirstAttendee).toHaveCount(1);
await prisma.eventType.update({
data: {
seatsShowAttendees: true,
},
where: {
id: bookingWithEventType?.eventTypeId || -1,
},
});
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
);
// Now attendees should be displayed
const foundSecondAttendee = await page.locator('p[data-testid="attendee-email-second+seats@cal.com"]');
await expect(foundSecondAttendee).toHaveCount(1);
const foundFirstAttendeeAgain = await page
.locator('p[data-testid="attendee-email-first+seats@cal.com"]')
.first();
await expect(foundFirstAttendeeAgain).toHaveCount(1);
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
const references = await prisma.bookingSeat.findMany({
where: { bookingId: booking.id },
});
await page.goto(`/reschedule/${references[0].referenceUid}`);
await selectFirstAvailableTimeSlotNextMonth(page);
await page.locator('[data-testid="confirm-reschedule-button"]').click();
await page.waitForURL(/.*booking/);
await page.goto(`/reschedule/${references[1].referenceUid}`);
await selectFirstAvailableTimeSlotNextMonth(page);
await page.locator('[data-testid="confirm-reschedule-button"]').click();
// Using waitForUrl here fails the assertion `expect(oldBooking?.status).toBe(BookingStatus.CANCELLED);` probably because waitForUrl is considered complete before waitForNavigation and till that time the booking is not cancelled
await page.waitForNavigation({ url: /.*booking/ });
// Should expect old booking to be cancelled
const oldBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
include: {
seatsReferences: true,
attendees: true,
eventType: {
include: { users: true, hosts: true },
},
},
});
expect(oldBooking?.status).toBe(BookingStatus.CANCELLED);
});
test("Should cancel with seats and have no attendees and cancelled", async ({ page, users, bookings }) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
const oldBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
include: { seatsReferences: true, attendees: true },
});
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Now we cancel the booking as the organizer
await page.goto(`/booking/${booking.uid}?cancel=true`);
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
// Should expect old booking to be cancelled
const updatedBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
include: { seatsReferences: true, attendees: true },
});
expect(oldBooking?.startTime).not.toBe(updatedBooking?.startTime);
});
test("If rescheduled/cancelled booking with seats it should display the correct number of seats", async ({
page,
users,
bookings,
}) => {
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
const references = await prisma.bookingSeat.findMany({
where: { bookingId: booking.id },
});
await page.goto(
`/booking/${references[0].referenceUid}?cancel=true&seatReferenceUid=${references[0].referenceUid}`
);
await page.locator('[data-testid="cancel"]').click();
const oldBooking = await prisma.booking.findFirst({
where: { uid: booking.uid },
select: {
id: true,
status: true,
},
});
expect(oldBooking?.status).toBe(BookingStatus.ACCEPTED);
await page.goto(`/reschedule/${references[1].referenceUid}`);
await page.click('[data-testid="incrementMonth"]');
await page.locator('[data-testid="day"][data-disabled="false"]').nth(1).click();
// Validate that the number of seats its 10
expect(await page.locator("text=9 / 10 Seats available").count()).toEqual(0);
});
test("Should cancel with seats but event should be still accesible and with one less attendee/seat", async ({
page,
users,
bookings,
}) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Now we cancel the booking as the first attendee
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
);
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
);
// Page should not be 404
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
});
test("Should book with seats and hide attendees info from showAttendees true", async ({
page,
users,
bookings,
}) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
const bookingWithEventType = await prisma.booking.findFirst({
where: { uid: booking.uid },
select: {
id: true,
eventTypeId: true,
},
});
await prisma.eventType.update({
data: {
seatsShowAttendees: false,
},
where: {
id: bookingWithEventType?.eventTypeId || -1,
},
});
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Go to cancel page and see that attendees are listed and myself as I'm owner of the booking
await page.goto(`/booking/${booking.uid}?cancel=true&allRemainingBookings=false`);
const foundFirstAttendeeAsOwner = await page.locator(
'p[data-testid="attendee-email-first+seats@cal.com"]'
);
await expect(foundFirstAttendeeAsOwner).toHaveCount(1);
const foundSecondAttendeeAsOwner = await page.locator(
'p[data-testid="attendee-email-second+seats@cal.com"]'
);
await expect(foundSecondAttendeeAsOwner).toHaveCount(1);
await page.goto("auth/logout");
// Now we cancel the booking as the first attendee
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
);
// No attendees should be displayed only the one that it's cancelling
const notFoundSecondAttendee = await page.locator('p[data-testid="attendee-email-second+seats@cal.com"]');
await expect(notFoundSecondAttendee).toHaveCount(0);
const foundFirstAttendee = await page.locator('p[data-testid="attendee-email-first+seats@cal.com"]');
await expect(foundFirstAttendee).toHaveCount(1);
await prisma.eventType.update({
data: {
seatsShowAttendees: true,
},
where: {
id: bookingWithEventType?.eventTypeId || -1,
},
});
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
);
// Now attendees should be displayed
const foundSecondAttendee = await page.locator('p[data-testid="attendee-email-second+seats@cal.com"]');
await expect(foundSecondAttendee).toHaveCount(1);
const foundFirstAttendeeAgain = await page
.locator('p[data-testid="attendee-email-first+seats@cal.com"]')
.first();
await expect(foundFirstAttendeeAgain).toHaveCount(1);
});
});

View File

@ -178,7 +178,7 @@ test.describe("Embed Code Generator Tests", () => {
test.beforeEach(async ({ page }) => {
await page.goto(`/event-types`);
await Promise.all([
page.locator('[href*="/event-types/"]').first().click(),
page.locator('a[href*="/event-types/"]').first().click(),
page.waitForURL((url) => url.pathname.startsWith("/event-types/")),
]);
});

View File

@ -15,7 +15,6 @@ test.fixme("hash my url", () => {
await users.deleteAll();
});
test("generate url hash", async ({ page }) => {
// await page.pause();
await page.goto("/event-types");
// We wait until loading is finished
await page.waitForSelector('[data-testid="event-types"]');

View File

@ -0,0 +1,156 @@
import type { Page } from "@playwright/test";
import { expect } from "@playwright/test";
import { authenticator } from "otplib";
import { symmetricDecrypt } from "@calcom/lib/crypto";
import { test } from "./lib/fixtures";
test.describe.configure({ mode: "parallel" });
// a test to logout requires both a succesfull login as logout, to prevent
// a doubling of tests failing on logout & logout, we can group them.
test.describe("2FA Tests", async () => {
test.afterAll(async ({ users }) => {
await users.deleteAll();
});
test("should allow a user to enable 2FA and login using 2FA", async ({ page, users }) => {
// log in trail user
const user = await test.step("Enable 2FA", async () => {
const user = await users.create();
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const userPassword = user.username!;
await user.login();
// expects the home page for an authorized user
await page.goto("/settings/security/two-factor-auth");
await page.click(`[data-testid=two-factor-switch]`);
await page.fill('input[name="password"]', userPassword);
await page.press('input[name="password"]', "Enter");
const secret = await page.locator(`[data-testid=two-factor-secret]`).textContent();
expect(secret).toHaveLength(32);
await page.click('[data-testid="goto-otp-screen"]');
/**
* Try a wrong code and test that wrong code is rejected.
*/
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
await fillOtp({ page, secret: "123456", noRetry: true });
await page.press('input[name="2fa6"]', "Enter");
await expect(page.locator('[data-testid="error-submitting-code"]')).toBeVisible();
await fillOtp({
page,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
secret: secret!,
});
await page.press('input[name="2fa6"]', "Enter");
await expect(page.locator(`[data-testid=two-factor-switch][data-state="checked"]`)).toBeVisible();
return user;
});
await test.step("Logout", async () => {
await page.goto("/auth/logout");
});
await test.step("Login with 2FA enabled", async () => {
await user.login();
const userWith2FaSecret = await prisma?.user.findFirst({
where: {
id: user.id,
},
});
const secret = symmetricDecrypt(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
userWith2FaSecret!.twoFactorSecret!,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
process.env.CALENDSO_ENCRYPTION_KEY!
);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
await fillOtp({ page, secret: secret! });
await Promise.all([
page.press('input[name="2fa6"]', "Enter"),
page.waitForResponse("**/api/auth/callback/credentials**"),
]);
const shellLocator = page.locator(`[data-testid=dashboard-shell]`);
// expects the home page for an authorized user
await page.goto("/");
await expect(shellLocator).toBeVisible();
});
});
test("should allow a user to disable 2FA", async ({ page, users }) => {
// log in trail user
const user = await test.step("Enable 2FA", async () => {
const user = await users.create();
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const userPassword = user.username!;
await user.login();
// expects the home page for an authorized user
await page.goto("/settings/security/two-factor-auth");
await page.click(`[data-testid=two-factor-switch][data-state="unchecked"]`);
await page.fill('input[name="password"]', userPassword);
await page.press('input[name="password"]', "Enter");
const secret = await page.locator(`[data-testid=two-factor-secret]`).textContent();
expect(secret).toHaveLength(32);
await page.click('[data-testid="goto-otp-screen"]');
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
await fillOtp({ page, secret: secret! });
await page.click('[data-testid="enable-2fa"]');
await expect(page.locator(`[data-testid=two-factor-switch][data-state="checked"]`)).toBeVisible();
return user;
});
await test.step("Disable 2FA", async () => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const userPassword = user.username!;
// expects the home page for an authorized user
await page.goto("/settings/security/two-factor-auth");
await page.click(`[data-testid=two-factor-switch][data-state="checked"]`);
await page.fill('input[name="password"]', userPassword);
const userWith2FaSecret = await prisma?.user.findFirst({
where: {
id: user.id,
},
});
const secret = symmetricDecrypt(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
userWith2FaSecret!.twoFactorSecret!,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
process.env.CALENDSO_ENCRYPTION_KEY!
);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
await fillOtp({ page, secret: secret! });
await page.click('[data-testid="disable-2fa"]');
await expect(page.locator(`[data-testid=two-factor-switch][data-state="unchecked"]`)).toBeVisible();
return user;
});
});
});
async function fillOtp({ page, secret, noRetry }: { page: Page; secret: string; noRetry?: boolean }) {
let token = authenticator.generate(secret);
if (!noRetry && !authenticator.check(token, secret)) {
console.log("Token expired, Renerating.");
// Maybe token was just about to expire, try again just once more
token = authenticator.generate(secret);
}
await page.fill('input[name="2fa1"]', token[0]);
await page.fill('input[name="2fa2"]', token[1]);
await page.fill('input[name="2fa3"]', token[2]);
await page.fill('input[name="2fa4"]', token[3]);
await page.fill('input[name="2fa5"]', token[4]);
await page.fill('input[name="2fa6"]', token[5]);
}

View File

@ -35,11 +35,9 @@ test.describe("user can login & logout succesfully", async () => {
const signOutBtn = await page.locator(`text=${signOutLabel}`);
await signOutBtn.click();
// 2s of delay to assure the session is cleared
await page.waitForURL("/auth/logout");
await page.locator('a[href="/auth/login"]').click();
// Reroute to the home page to check if the login form shows up
await page.goto("/");
await expect(page.locator(`[data-testid=login-form]`)).toBeVisible();
});
});

View File

@ -39,10 +39,10 @@ test.describe("Managed Event Types tests", () => {
await page.click("[data-testid=new-event-type-dropdown]");
await page.click("[data-testid=option-team-1]");
// Expecting we can add a managed event type as team owner
await expect(page.locator('input[value="MANAGED"]')).toBeVisible();
await expect(page.locator('button[value="MANAGED"]')).toBeVisible();
// Actually creating a managed event type to test things further
await page.click('input[value="MANAGED"]');
await page.click('button[value="MANAGED"]');
await page.fill("[name=title]", "managed");
await page.click("[type=submit]");
});

View File

@ -1,131 +1,387 @@
import { expect } from "@playwright/test";
import { test } from "./lib/fixtures";
import { createHttpServer, selectFirstAvailableTimeSlotNextMonth, waitFor } from "./lib/testUtils";
import {
bookOptinEvent,
createHttpServer,
selectFirstAvailableTimeSlotNextMonth,
waitFor,
} from "./lib/testUtils";
test.afterEach(({ users }) => users.deleteAll());
test("add webhook & test that creating an event triggers a webhook call", async ({
page,
users,
}, testInfo) => {
const webhookReceiver = createHttpServer();
const user = await users.create();
const [eventType] = user.eventTypes;
await user.login();
await page.goto(`/settings/developer/webhooks`);
test.describe("BOOKING_CREATED", async () => {
test("add webhook & test that creating an event triggers a webhook call", async ({
page,
users,
}, testInfo) => {
const webhookReceiver = createHttpServer();
const user = await users.create();
const [eventType] = user.eventTypes;
await user.login();
await page.goto(`/settings/developer/webhooks`);
// --- add webhook
await page.click('[data-testid="new_webhook"]');
// --- add webhook
await page.click('[data-testid="new_webhook"]');
await page.fill('[name="subscriberUrl"]', webhookReceiver.url);
await page.fill('[name="subscriberUrl"]', webhookReceiver.url);
await page.fill('[name="secret"]', "secret");
await page.fill('[name="secret"]', "secret");
await Promise.all([
page.click("[type=submit]"),
page.waitForURL((url) => url.pathname.endsWith("/settings/developer/webhooks")),
]);
await Promise.all([
page.click("[type=submit]"),
page.waitForURL((url) => url.pathname.endsWith("/settings/developer/webhooks")),
]);
// page contains the url
expect(page.locator(`text='${webhookReceiver.url}'`)).toBeDefined();
// page contains the url
expect(page.locator(`text='${webhookReceiver.url}'`)).toBeDefined();
// --- Book the first available day next month in the pro user's "30min"-event
await page.goto(`/${user.username}/${eventType.slug}`);
await selectFirstAvailableTimeSlotNextMonth(page);
// --- Book the first available day next month in the pro user's "30min"-event
await page.goto(`/${user.username}/${eventType.slug}`);
await selectFirstAvailableTimeSlotNextMonth(page);
// --- fill form
await page.fill('[name="name"]', "Test Testson");
await page.fill('[name="email"]', "test@example.com");
await page.press('[name="email"]', "Enter");
// --- fill form
await page.fill('[name="name"]', "Test Testson");
await page.fill('[name="email"]', "test@example.com");
await page.press('[name="email"]', "Enter");
// --- check that webhook was called
await waitFor(() => {
expect(webhookReceiver.requestList.length).toBe(1);
});
// --- check that webhook was called
await waitFor(() => {
expect(webhookReceiver.requestList.length).toBe(1);
});
const [request] = webhookReceiver.requestList;
const body = request.body as any;
const [request] = webhookReceiver.requestList;
const body = request.body as any;
// remove dynamic properties that differs depending on where you run the tests
const dynamic = "[redacted/dynamic]";
body.createdAt = dynamic;
body.payload.startTime = dynamic;
body.payload.endTime = dynamic;
body.payload.location = dynamic;
for (const attendee of body.payload.attendees) {
attendee.timeZone = dynamic;
attendee.language = dynamic;
}
body.payload.organizer.id = dynamic;
body.payload.organizer.email = dynamic;
body.payload.organizer.timeZone = dynamic;
body.payload.organizer.language = dynamic;
body.payload.uid = dynamic;
body.payload.bookingId = dynamic;
body.payload.additionalInformation = dynamic;
body.payload.requiresConfirmation = dynamic;
body.payload.eventTypeId = dynamic;
body.payload.videoCallData = dynamic;
body.payload.appsStatus = dynamic;
body.payload.metadata.videoCallUrl = dynamic;
// remove dynamic properties that differs depending on where you run the tests
const dynamic = "[redacted/dynamic]";
body.createdAt = dynamic;
body.payload.startTime = dynamic;
body.payload.endTime = dynamic;
body.payload.location = dynamic;
for (const attendee of body.payload.attendees) {
attendee.timeZone = dynamic;
attendee.language = dynamic;
}
body.payload.organizer.id = dynamic;
body.payload.organizer.email = dynamic;
body.payload.organizer.timeZone = dynamic;
body.payload.organizer.language = dynamic;
body.payload.uid = dynamic;
body.payload.bookingId = dynamic;
body.payload.additionalInformation = dynamic;
body.payload.requiresConfirmation = dynamic;
body.payload.eventTypeId = dynamic;
body.payload.videoCallData = dynamic;
body.payload.appsStatus = dynamic;
body.payload.metadata.videoCallUrl = dynamic;
expect(body).toMatchObject({
triggerEvent: "BOOKING_CREATED",
createdAt: "[redacted/dynamic]",
payload: {
type: "30 min",
title: "30 min between Nameless and Test Testson",
description: "",
additionalNotes: "",
customInputs: {},
startTime: "[redacted/dynamic]",
endTime: "[redacted/dynamic]",
organizer: {
id: "[redacted/dynamic]",
name: "Nameless",
email: "[redacted/dynamic]",
timeZone: "[redacted/dynamic]",
language: "[redacted/dynamic]",
},
responses: {
email: {
value: "test@example.com",
label: "email_address",
},
name: {
value: "Test Testson",
label: "your_name",
},
},
userFieldsResponses: {},
attendees: [
{
email: "test@example.com",
name: "Test Testson",
expect(body).toMatchObject({
triggerEvent: "BOOKING_CREATED",
createdAt: "[redacted/dynamic]",
payload: {
type: "30 min",
title: "30 min between Nameless and Test Testson",
description: "",
additionalNotes: "",
customInputs: {},
startTime: "[redacted/dynamic]",
endTime: "[redacted/dynamic]",
organizer: {
id: "[redacted/dynamic]",
name: "Nameless",
email: "[redacted/dynamic]",
timeZone: "[redacted/dynamic]",
language: "[redacted/dynamic]",
},
],
location: "[redacted/dynamic]",
destinationCalendar: null,
hideCalendarNotes: false,
requiresConfirmation: "[redacted/dynamic]",
eventTypeId: "[redacted/dynamic]",
seatsShowAttendees: true,
seatsPerTimeSlot: null,
uid: "[redacted/dynamic]",
eventTitle: "30 min",
eventDescription: null,
price: 0,
currency: "usd",
length: 30,
bookingId: "[redacted/dynamic]",
metadata: { videoCallUrl: "[redacted/dynamic]" },
status: "ACCEPTED",
additionalInformation: "[redacted/dynamic]",
},
});
responses: {
email: {
value: "test@example.com",
label: "email_address",
},
name: {
value: "Test Testson",
label: "your_name",
},
},
userFieldsResponses: {},
attendees: [
{
email: "test@example.com",
name: "Test Testson",
timeZone: "[redacted/dynamic]",
language: "[redacted/dynamic]",
},
],
location: "[redacted/dynamic]",
destinationCalendar: null,
hideCalendarNotes: false,
requiresConfirmation: "[redacted/dynamic]",
eventTypeId: "[redacted/dynamic]",
seatsShowAttendees: true,
seatsPerTimeSlot: null,
uid: "[redacted/dynamic]",
eventTitle: "30 min",
eventDescription: null,
price: 0,
currency: "usd",
length: 30,
bookingId: "[redacted/dynamic]",
metadata: { videoCallUrl: "[redacted/dynamic]" },
status: "ACCEPTED",
additionalInformation: "[redacted/dynamic]",
},
});
webhookReceiver.close();
webhookReceiver.close();
});
});
test.describe("BOOKING_REJECTED", async () => {
test("can book an event that requires confirmation and then that booking can be rejected by organizer", async ({
page,
users,
}) => {
const webhookReceiver = createHttpServer();
// --- create a user
const user = await users.create();
// --- visit user page
await page.goto(`/${user.username}`);
// --- book the user's event
await bookOptinEvent(page);
// --- login as that user
await user.login();
await page.goto(`/settings/developer/webhooks`);
// --- add webhook
await page.click('[data-testid="new_webhook"]');
await page.fill('[name="subscriberUrl"]', webhookReceiver.url);
await page.fill('[name="secret"]', "secret");
await Promise.all([
page.click("[type=submit]"),
page.waitForURL((url) => url.pathname.endsWith("/settings/developer/webhooks")),
]);
// page contains the url
expect(page.locator(`text='${webhookReceiver.url}'`)).toBeDefined();
await page.goto("/bookings/unconfirmed");
await page.click('[data-testid="reject"]');
await page.click('[data-testid="rejection-confirm"]');
await page.waitForResponse((response) => response.url().includes("/api/trpc/bookings/confirm"));
// --- check that webhook was called
await waitFor(() => {
expect(webhookReceiver.requestList.length).toBe(1);
});
const [request] = webhookReceiver.requestList;
const body = request.body as any;
// remove dynamic properties that differs depending on where you run the tests
const dynamic = "[redacted/dynamic]";
body.createdAt = dynamic;
body.payload.startTime = dynamic;
body.payload.endTime = dynamic;
body.payload.location = dynamic;
for (const attendee of body.payload.attendees) {
attendee.timeZone = dynamic;
attendee.language = dynamic;
}
body.payload.organizer.id = dynamic;
body.payload.organizer.email = dynamic;
body.payload.organizer.timeZone = dynamic;
body.payload.organizer.language = dynamic;
body.payload.uid = dynamic;
body.payload.bookingId = dynamic;
body.payload.additionalInformation = dynamic;
body.payload.requiresConfirmation = dynamic;
body.payload.eventTypeId = dynamic;
body.payload.videoCallData = dynamic;
body.payload.appsStatus = dynamic;
// body.payload.metadata.videoCallUrl = dynamic;
expect(body).toMatchObject({
triggerEvent: "BOOKING_REJECTED",
createdAt: "[redacted/dynamic]",
payload: {
type: "Opt in",
title: "Opt in between Nameless and Test Testson",
customInputs: {},
startTime: "[redacted/dynamic]",
endTime: "[redacted/dynamic]",
organizer: {
id: "[redacted/dynamic]",
name: "Unnamed",
email: "[redacted/dynamic]",
timeZone: "[redacted/dynamic]",
language: "[redacted/dynamic]",
},
responses: {
email: {
value: "test@example.com",
label: "email",
},
name: {
value: "Test Testson",
label: "name",
},
},
userFieldsResponses: {},
attendees: [
{
email: "test@example.com",
name: "Test Testson",
timeZone: "[redacted/dynamic]",
language: "[redacted/dynamic]",
},
],
location: "[redacted/dynamic]",
destinationCalendar: null,
// hideCalendarNotes: false,
requiresConfirmation: "[redacted/dynamic]",
eventTypeId: "[redacted/dynamic]",
uid: "[redacted/dynamic]",
eventTitle: "Opt in",
eventDescription: null,
price: 0,
currency: "usd",
length: 30,
bookingId: "[redacted/dynamic]",
// metadata: { videoCallUrl: "[redacted/dynamic]" },
status: "REJECTED",
additionalInformation: "[redacted/dynamic]",
},
});
webhookReceiver.close();
});
});
test.describe("BOOKING_REQUESTED", async () => {
test("can book an event that requires confirmation and get a booking requested event", async ({
page,
users,
}) => {
const webhookReceiver = createHttpServer();
// --- create a user
const user = await users.create();
// --- login as that user
await user.login();
await page.goto(`/settings/developer/webhooks`);
// --- add webhook
await page.click('[data-testid="new_webhook"]');
await page.fill('[name="subscriberUrl"]', webhookReceiver.url);
await page.fill('[name="secret"]', "secret");
await Promise.all([
page.click("[type=submit]"),
page.waitForURL((url) => url.pathname.endsWith("/settings/developer/webhooks")),
]);
// page contains the url
expect(page.locator(`text='${webhookReceiver.url}'`)).toBeDefined();
// --- visit user page
await page.goto(`/${user.username}`);
// --- book the user's opt in
await bookOptinEvent(page);
// --- check that webhook was called
await waitFor(() => {
expect(webhookReceiver.requestList.length).toBe(1);
});
const [request] = webhookReceiver.requestList;
const body = request.body as any;
// remove dynamic properties that differs depending on where you run the tests
const dynamic = "[redacted/dynamic]";
body.createdAt = dynamic;
body.payload.startTime = dynamic;
body.payload.endTime = dynamic;
body.payload.location = dynamic;
for (const attendee of body.payload.attendees) {
attendee.timeZone = dynamic;
attendee.language = dynamic;
}
body.payload.organizer.id = dynamic;
body.payload.organizer.email = dynamic;
body.payload.organizer.timeZone = dynamic;
body.payload.organizer.language = dynamic;
body.payload.uid = dynamic;
body.payload.bookingId = dynamic;
body.payload.additionalInformation = dynamic;
body.payload.requiresConfirmation = dynamic;
body.payload.eventTypeId = dynamic;
body.payload.videoCallData = dynamic;
body.payload.appsStatus = dynamic;
body.payload.metadata.videoCallUrl = dynamic;
expect(body).toMatchObject({
triggerEvent: "BOOKING_REQUESTED",
createdAt: "[redacted/dynamic]",
payload: {
type: "Opt in",
title: "Opt in between Nameless and Test Testson",
customInputs: {},
startTime: "[redacted/dynamic]",
endTime: "[redacted/dynamic]",
organizer: {
id: "[redacted/dynamic]",
name: "Nameless",
email: "[redacted/dynamic]",
timeZone: "[redacted/dynamic]",
language: "[redacted/dynamic]",
},
responses: {
email: {
value: "test@example.com",
label: "email_address",
},
name: {
value: "Test Testson",
label: "your_name",
},
},
userFieldsResponses: {},
attendees: [
{
email: "test@example.com",
name: "Test Testson",
timeZone: "[redacted/dynamic]",
language: "[redacted/dynamic]",
},
],
location: "[redacted/dynamic]",
destinationCalendar: null,
requiresConfirmation: "[redacted/dynamic]",
eventTypeId: "[redacted/dynamic]",
uid: "[redacted/dynamic]",
eventTitle: "Opt in",
eventDescription: null,
price: 0,
currency: "usd",
length: 30,
bookingId: "[redacted/dynamic]",
status: "PENDING",
additionalInformation: "[redacted/dynamic]",
metadata: { videoCallUrl: "[redacted/dynamic]" },
},
});
webhookReceiver.close();
});
});

View File

@ -2,7 +2,7 @@
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<square150x150logo src="/api/logo?type=mstile"/>
<TileColor>#ff0000</TileColor>
</tile>
</msapplication>

View File

@ -3,12 +3,12 @@
"short_name": "Cal.com",
"icons": [
{
"src": "/android-chrome-192x192.png",
"src": "/api/logo?type=android-chrome-192",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-256x256.png",
"src": "/api/logo?type=android-chrome-256",
"sizes": "256x256",
"type": "image/png"
}

View File

@ -408,7 +408,7 @@
"add_time_availability": "إضافة فتحة زمنية جديدة",
"add_an_extra_layer_of_security": "أضف إلى حسابك طبقة أمان إضافية للاحتياط من سرقة كلمة المرور الخاصة بك.",
"2fa": "المصادقة من عاملين",
"2fa_disabled": مكن تمكين المصادقة الثنائية فقط لمصادقة البريد الإلكتروني وكلمة المرور",
"2fa_disabled": تم تمكين المصادقة الثنائية فقط لمصادقة البريد الإلكتروني وكلمة المرور",
"enable_2fa": "تمكين المصادقة من عاملين",
"disable_2fa": "تعطيل المصادقة من عاملين",
"disable_2fa_recommendation": "إذا كنت بحاجة إلى تعطيل المصادقة من عاملين، فنوصيك بإعادة تمكينها في أقرب وقت ممكن.",
@ -589,17 +589,17 @@
"minutes": "الدقائق",
"round_robin": "الترتيب الدوري",
"round_robin_description": "نقل الاجتماعات بشكل دوري بين أعضاء الفريق المتعددين.",
"managed_event": "الحدث المدار",
"managed_event": "حدث تم إدارته",
"username_placeholder": "اسم المستخدم",
"managed_event_description": "إنشاء وتوزيع أنواع الأحداث بكميات كبيرة على أعضاء الفريق",
"managed_event_description": "إنشاء أنواع الأحداث بشكل مجمّع وتوزيعها على أعضاء الفريق",
"managed": "مدارة",
"managed_event_url_clarification": "سيتم ملء \"اسم المستخدم\" باسم المستخدم للأعضاء المعينين",
"assign_to": "تعيين إلى",
"add_members": "إضافة أعضاء...",
"count_members_one": "{{count}} عضو",
"count_members_other": "{{count}} أعضاء",
"count_members_other": "{{count}} من الأعضاء",
"no_assigned_members": "لا يوجد أعضاء معينين",
"assigned_to": "تم تعيينه إلى",
"assigned_to": "تم التعيين إلى",
"start_assigning_members_above": "بدء تعيين الأعضاء أعلاه",
"locked_fields_admin_description": "لن يتمكن الأعضاء من تعديل هذا",
"locked_fields_member_description": "قام مشرف الفريق بقفل هذا الخيار",
@ -754,10 +754,10 @@
"minimum_booking_notice": "الحد الأدنى من الوقت للحجز",
"slot_interval": "الفترات الزمنية بين عمليات الحجز",
"slot_interval_default": "استخدام طول الحدث (الوضع الافتراضي)",
"delete_event_type": "حذف نوع الحدث؟",
"delete_managed_event_type": "حذف نوع الحدث المُدار؟",
"delete_event_type_description": "لن يكون بإمكان أي شخص قمت بمشاركة الرابط معه الوصول إلى الرابط.",
"delete_managed_event_type_description": "<ul><li>سيتم أيضًا حذف أنواع الأحداث الخاصة بالأعضاء المعينين في هذا النوع من الأحداث.</li><li>لن يتمكن أي شخص شاركوا رابطهم معه من الحجز باستخدامه.</li></ul>",
"delete_event_type": "هل تريد حذف نوع الحدث؟",
"delete_managed_event_type": "هل تريد حذف نوع الحدث المُدار؟",
"delete_event_type_description": "لن يتمكن أي شخص قمت بمشاركة الرابط معه الججز باستخدامه.",
"delete_managed_event_type_description": "<ul><li>سيتم أيضًا حذف أنواع الأحداث الخاصة بالأعضاء المعينين في هذا النوع من الأحداث.</li><li>لن يتمكن أي شخص شاركوا الرابط معه من الحجز باستخدامه.</li></ul>",
"confirm_delete_event_type": "نعم، قم بالحذف",
"delete_account": "حذف الحساب",
"confirm_delete_account": "نعم، احذف الحساب",
@ -1177,7 +1177,7 @@
"event_advanced_tab_title": "متقدم",
"event_setup_multiple_duration_error": "إعداد الحدث: تستلزم فترات متعددة خيارًا واحدًا على الأقل.",
"event_setup_multiple_duration_default_error": "إعداد الحدث: الرجاء تحديد مدة افتراضية صالحة.",
"event_setup_booking_limits_error": "يجب أن تكون حدود الحجز بترتيب تصاعدي. [يوم،أسبوع،شهر،سنة]",
"event_setup_booking_limits_error": "يجب أن تكون حدود الحجز بترتيب تصاعدي. [يوم، أسبوع، شهر، سنة]",
"event_setup_duration_limits_error": "يجب أن تكون حدود المدة بترتيب تصاعدي. [يوم، أسبوع، شهر، سنة]",
"select_which_cal": "اختر أي رزنامة تريد إضافة الحجز إليها",
"custom_event_name": "اسم حدث مخصص",
@ -1317,7 +1317,7 @@
"exchange_authentication_standard": "المصادقة الأساسية",
"exchange_authentication_ntlm": "مصادقة NTLM",
"exchange_compression": "ضغط Gzip",
"exchange_version": "نسخة التبادل",
"exchange_version": "إصدار Exchange",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
@ -1395,7 +1395,7 @@
"billing_help_title": "هل تحتاج إلى أي شيء آخر؟",
"billing_help_description": "إذا كنت تحتاج إلى أي مساعدة إضافية بخصوص الفوترة، فإن فريق الدعم لدينا في انتظارك لتقديم المساعدة.",
"billing_help_cta": "الاتصال بالدعم",
"ignore_special_characters_booking_questions": "تجاهل المحارف الخاصة في معرّف سؤال الحجز لديك. استخدم فقط الأحرف والأرقام",
"ignore_special_characters_booking_questions": "تجاهل الأحرف الخاصة في معرف سؤال الحجز لديك. استخدم الأحرف والأرقام فقط",
"retry": "إعادة المحاولة",
"fetching_calendars_error": "حدثت مشكلة أثناء جلب التقويمات الخاصة بك. يرجى <1>إعادة المحاولة</1> أو الاتصال بدعم العملاء.",
"calendar_connection_fail": "فشل الاتصال بالتقويم",
@ -1485,10 +1485,10 @@
"admin_has_disabled": "قام مشرفًا بتعطيل {{appName}}",
"disabled_app_affects_event_type": "قام مشرفًا بتعطيل {{appName}} مما يؤثر على نوع الحدث {{eventType}} لديك",
"event_replaced_notice": "استبدل المشرف أحد أنواع الأحداث لديك",
"email_subject_slug_replacement": "استبدل مسؤول فريق الحدث لديك /{{slug}}",
"email_body_slug_replacement_notice": "استبدل مسؤول في فريق <strong>{{teamName}}</strong> نوع الحدث لديك<strong>/{{slug}}</strong> بنوع الحدث المُدار الذي يتحكم فيه.",
"email_body_slug_replacement_info": "سيستمر رابطك في العمل، ولكن بعض إعداداته قد تغيرت. يمكنك مراجعتها في أنواع الأحداث.",
"email_body_slug_replacement_suggestion": "يرجى الاتصال بالمسؤول إذا كان لديك أي أسئلة حول نوع الحدث.<br /><br />جدولة سعيدة، <br />فريق Cal.com",
"email_subject_slug_replacement": "استبدل مشرف في فريق الحدث لديك /{{slug}}",
"email_body_slug_replacement_notice": "استبدل مشرف في فريق <strong>{{teamName}}</strong> نوع الحدث لديك<strong>/{{slug}}</strong> بنوع الحدث المُدار الذي يتحكم فيه.",
"email_body_slug_replacement_info": "سيستمر الرابط في العمل، ولكن ربما تم تغيير بعض إعداداته. يمكنك مراجعتها في أنواع الأحداث.",
"email_body_slug_replacement_suggestion": "يرجى الاتصال بالمشرف إذا كان لديك أي أسئلة حول نوع الحدث.<br/><br/>جدولة سعيدة، <br/>فريق Cal.com",
"disable_payment_app": "قام المشرف بتعطيل {{appName}} الذي يؤثر على نوع الحدث {{title}} لديك. لا يزال بإمكان الحاضرين حجز هذا النوع من الأحداث، ولكن لن يُطالبوا بالدفع. يمكنك إخفاء نوع الحدث لمنع حدوث هذا إلى أن يقوم المشرف بتغيير طريقة الدفع لك.",
"payment_disabled_still_able_to_book": "لا يزال بإمكان الحاضرين حجز هذا النوع من الأحداث، ولكن لن يُطالبوا بالدفع. يمكنك إخفاء نوع الحدث لمنع حدوث هذا إلى أن يقوم المشرف بتغيير طريقة الدفع لك.",
"app_disabled_with_event_type": "عطّل المشرف {{appName}} مما يؤثر على نوع الحدث {{title}} لديك.",
@ -1551,7 +1551,7 @@
"create_your_first_team_webhook_description": "قم بإنشاء أول شبكة ويب هوك لهذا النوع من فعاليات الفريق",
"create_webhook_team_event_type": "قم بإنشاء ويب هوك لهذا النوع من فعاليات الفريق",
"disable_success_page": "تعطيل صفحة النجاح (يعمل فقط إذا كان لديك رابط إعادة توجيه)",
"invalid_admin_password": "تم تعيينك كمشرف ولكن ليس لديك كلمة مرور بطول 15 مِحرَفاً على الأقل",
"invalid_admin_password": "أنت مشرف ولكن ليس لديك كلمة مرور بطول 15 حرفًا على الأقل أو لا توجد مصادقة ثنائية حتى الآن",
"change_password_admin": "قم بتغيير كلمة المرور للحصول على وصول المشرف",
"username_already_taken": "اسم المستخدم هذا مستخدم مسبقًا",
"assignment": "تعيين",
@ -1685,14 +1685,14 @@
"add_1_option_per_line": "إضافة خيار واحد لكل سطر",
"select_a_router": "حدد مساراً",
"add_a_new_route": "إضافة مسار جديد",
"make_informed_decisions": "اتخاذ قرارات على اطّلاع باستخدام الرؤى",
"make_informed_decisions_description": قدّم لوحة الرؤى لدينا جميع الأنشطة لفريقك وتظهر لك الاتجاهات السائدة التي تمكّنك من جدولة الفريق واتخاذ القرار بشكل أفضل.",
"view_bookings_across": "عرض الحجز أمام جميع الأعضاء",
"view_bookings_across_description": "شاهد من يتلقى معظم الحجوزات وتأكد من إجراء أفضل عملية توزيع عبر فريقك",
"identify_booking_trends": "تحديد الاتجاهات السائدة للحجز",
"make_informed_decisions": "اتخذ قرارات مستنيرة باستخدام Insights",
"make_informed_decisions_description": ُظهر لوحة معلومات Insights جميع أنشطة فريقك وتعرض لك الاتجاهات الرائجة التي تتيح جدولة الفريق واتخاذ القرارات بشكل أفضل.",
"view_bookings_across": "عرض حجوزات جميع الأعضاء",
"view_bookings_across_description": "تعرف على من يتلقى أكبر عدد من الحجوزات وتأكد من التوزيع الأفضل بين أعضاء فريقك",
"identify_booking_trends": "تحديد اتجاهات الحجز الرائجة",
"identify_booking_trends_description": "شاهد أي الأوقات في الأسبوع وخلال اليوم تحظى بشعبية لدى من يقومون بالحجز لديك",
"spot_popular_event_types": "أنواع الأحداث الشائعة",
"spot_popular_event_types_description": "شاهد أي من نوع من الأحداث لديك يتلقى معظم النقرات والحجز",
"spot_popular_event_types": "اكتشف أنواع الأحداث الشائعة",
"spot_popular_event_types_description": "تعرف أي أنواع من الأحداث لديك تتلقى أكبر عدد من النقرات والحجوزات",
"no_responses_yet": "لا توجد ردود بعد",
"this_will_be_the_placeholder": "سيكون هذا هو العنصر النائب",
"this_meeting_has_not_started_yet": "لم يبدأ هذا الاجتماع بعد",
@ -1704,13 +1704,13 @@
"can_you_try_again": "هل يمكنك المحاولة مرة أخرى في وقت مختلف؟",
"verify": "التحقق",
"timezone_variable": "المنطقة الزمنية",
"timezone_info": "المنطقة الزمنية للشخص المتلقي",
"timezone_info": "المنطقة الزمنية للشخص الذي يتلقى الحجز",
"event_end_time_variable": "وقت انتهاء الحدث",
"event_end_time_info": "زمن نهاية الحدث",
"cancel_url_variable": "إلغاء عنوان URL",
"cancel_url_info": "عنوان URL لإلغاء الحجز",
"reschedule_url_variable": "إعادة جدولة عنوان URL",
"reschedule_url_info": "عنوان URL لإعادة جدولة الحجز",
"event_end_time_info": "وقت نهاية الحدث",
"cancel_url_variable": "رابط الإلغاء",
"cancel_url_info": "رابط إلغاء الحجز",
"reschedule_url_variable": "رابط إعادة الجدولة",
"reschedule_url_info": "رابط لإعادة جدولة الحجز",
"invalid_event_name_variables": "هناك متغيّر غير صالح في اسم الحدث",
"select_all": "تحديد الكل",
"default_conferencing_bulk_title": "التحديث الجماعي لمجموعة أنواع الأحداث الحالية",
@ -1720,65 +1720,65 @@
"members_default_schedule_description": "سنستخدم جدول الإتاحة الافتراضي لكل عضو، وسيكون بإمكانه تعديله أو تغييره.",
"requires_at_least_one_schedule": "يجب أن يكون لديك جدول واحد على الأقل",
"default_conferencing_bulk_description": "تحديث المواقع لأنواع الأحداث المحددة",
"locked_for_members": "مقفل أمام الأعضاء",
"locked_apps_description": "سيكون الأعضاء قادرين على رؤية التطبيقات النشطة، ولكن من دون القدرة على تعديل أي إعدادات للتطبيق",
"locked_webhooks_description": "سيكون الأعضاء قادرين على رؤية قوالب الويب النشطة، ولكن من دون القدرة على تعديل أي إعدادات للقوالب",
"locked_for_members": "مقفل للأعضاء",
"locked_apps_description": "سيتمكن الأعضاء من رؤية التطبيقات النشطة، ولكن لن يتمكنوا من تعديل أي إعدادات للتطبيق",
"locked_webhooks_description": "سيكون الأعضاء قادرين على رؤية webhooks النشطة، ولكن من دون القدرة على تعديل أي إعدادات Webhook",
"locked_workflows_description": "سيكون الأعضاء قادرين على رؤية مسارات العمل النشطة، ولكن من دون القدرة على تعديل أي إعدادات لمسار العمل",
"app_not_connected": "أنت غير متصل بحساب {{appName}}.",
"connect_now": "اتصل الآن",
"managed_event_dialog_confirm_button_one": "استبدال وإشعار العضو {{count}}",
"managed_event_dialog_confirm_button_other": "استبدال وإشعار الأعضاء {{count}}",
"managed_event_dialog_confirm_button_one": "الاستبدال وإخطار {{count}} عضو",
"managed_event_dialog_confirm_button_other": "الاستبدال وإخطار {{count}} من الأعضاء",
"managed_event_dialog_title_one": "عنوان url /{{slug}} موجود بالفعل من أجل {{count}} عضو. هل تريد استبداله؟",
"managed_event_dialog_title_other": "عنوان url /{{slug}} موجود بالفعل لـ {{count}} أعضاء. هل تريد استبداله؟",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> يستخدم بالفعل عنوان url <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> يستخدم بالفعل عنوان url <string>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "سنقوم بإعلامهم إذا اخترت استبداله. قم بالعودة وإزالتهم إذا كنت لا تريد الكتابة فوقها.",
"managed_event_dialog_clarification": "إذا اخترت استبداله، فسنخطرهم بذلك. ارجع وقم بإزالتهم إذا كنت لا تريد استبداله.",
"review_event_type": "مراجعة نوع الحدث",
"looking_for_more_analytics": "هل تبحث عن تحليلات إضافية؟",
"looking_for_more_insights": "هل تبحث عن رؤى أكثر؟",
"add_filter": "إضافة عامل فرز",
"select_user": "اختر مستخدم",
"select_event_type": "اختر نوع الحدث",
"select_date_range": "اختر نطاق التاريخ",
"looking_for_more_analytics": "هل تبحث عن المزيد من التحليلات؟",
"looking_for_more_insights": "هل تبحث عن المزيد من Insights؟",
"add_filter": "إضافة عامل تصفية",
"select_user": "اختر المستخدم",
"select_event_type": "حدد نوع الحدث",
"select_date_range": "حدد نطاق التاريخ",
"popular_events": "الأحداث الشائعة",
"no_event_types_found": "لم يتم العثور على أنواع الأحداث",
"no_event_types_found": "لم يتم العثور على أنواع للأحداث",
"average_event_duration": "متوسط مدة الحدث",
"most_booked_members": "أكثر الأعضاء حجزاً",
"least_booked_members": "أقل الأعضاء حجزاً",
"most_booked_members": "الأعضاء الأكثر حجزًا",
"least_booked_members": "الأعضاء الأقل حجزًا",
"events_created": "تم إنشاء الأحداث",
"events_completed": "تم اكتمال الأحداث",
"events_cancelled": "تم إلغاء الأحداث",
"events_rescheduled": "تم إعادة جدولة الأحداث",
"events_rescheduled": "تمت إعادة جدولة الأحداث",
"from_last_period": "من آخر فترة",
"from_to_date_period": "من: {{startDate}} إلى: {{endDate}}",
"analytics_for_organisation": "الرؤى",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "اعرف المزيد عن نشاط فريقك",
"redirect_url_warning": "سيؤدي إضافة إعادة توجيه إلى تعطيل صفحة النجاح. تأكد من ذكر \"تأكيد الحجز\" في صفحة النجاح المخصصة.",
"event_trends": "الاتجاهات السائدة للحدث",
"clear_filters": "مسح عوامل الفرز",
"event_trends": "الرائج في الأحداث",
"clear_filters": "مسح عوامل التصفية",
"hold": "تعليق",
"on_booking_option": "تحصيل الدفعة عن الحجز",
"hold_option": "فرض رسوم لقاء عدم الحضور",
"on_booking_option": "تحصيل الدفع عن الحجز",
"hold_option": "فرض رسوم عدم الحضور",
"card_held": "تم تعليق البطاقة",
"charge_card": "الدفع باستخدام البطاقة",
"card_charged": "تم استقطاع الدفعة من البطاقة",
"no_show_fee_amount": "رسم عدم الحضور {{amount, currency}}",
"no_show_fee": "رسم عدم الحضور",
"charge_card": "خصم الدفع من البطاقة",
"card_charged": "تم خصم الدفع من البطاقة",
"no_show_fee_amount": "رسوم عدم الحضور {{amount, currency}}",
"no_show_fee": "رسوم عدم الحضور",
"submit_card": "تقديم بطاقة",
"submit_payment_information": "تقديم معلومات الدفع",
"meeting_awaiting_payment_method": "اجتماعك في انتظار طريقة الدفع",
"no_show_fee_charged_email_subject": "تم تحصيل رسم عدم حضور مقداره {{amount, currency}} من أجل {{title}} في {{date}}",
"no_show_fee_charged_text_body": "تم تحصيل رسم عدم حضور",
"no_show_fee_charged_subtitle": "تم تحصيل رسم عدم حضور مقداره {{amount, currency}} من أجل الحدث التالي",
"error_charging_card": "حدثت مشكلة في استقطاع رسم عدم الحضور. يرجى المحاولة مرة أخرى لاحقاً.",
"collect_no_show_fee": "تحصيل رسم عدم الحضور",
"no_show_fee_charged": "لم يتم تحصيل رسوم عدم حضور",
"insights": "الرؤى",
"testing_workflow_info_message": "عند اختبار مسار العمل هذا، كن على علم بأنه يمكن جدولة رسائل البريد الإلكتروني والرسائل القصيرة فقط قبل ساعة واحدة على الأقل",
"insights_no_data_found_for_filter": "لم يتم العثور على بيانات لعامل الفرز المحدد أو التواريخ المحددة.",
"acknowledge_booking_no_show_fee": "أقر بأنه إذا لم أحضر هذا الحدث فإنه لن يتم استخدام بطاقتي للدقع لرسوم الحدث {{amount, currency}}.",
"no_show_fee_charged_email_subject": "تم تحصيل رسوم عدم حضور يبلغ {{amount, currency}} من أجل {{title}} في {{date}}",
"no_show_fee_charged_text_body": "تم تحصيل رسوم عدم حضور",
"no_show_fee_charged_subtitle": "تم تحصيل رسوم عدم حضور يبلغ {{amount, currency}} للحدث التالي",
"error_charging_card": "حدثت مشكلة في خصم رسوم عدم الحضور. يرجى المحاولة مرة أخرى لاحقًا.",
"collect_no_show_fee": "تحصيل رسوم عدم الحضور",
"no_show_fee_charged": "تم تحصيل رسوم عدم حضور",
"insights": "Insights",
"testing_workflow_info_message": "عند اختبار سير العمل هذا، يجب أن تدرك أنه لا يمكن جدولة رسائل البريد الإلكتروني والرسائل القصيرة إلا قبل ساعة واحدة على الأقل",
"insights_no_data_found_for_filter": "لم يتم العثور على بيانات لعامل التصفية المحدد أو التواريخ المحددة.",
"acknowledge_booking_no_show_fee": "أقر بأنه إذا لم أحضر هذا الحدث فسيتم سحب رسوم عدم حضور من بطاقتي تبلغ {{amount, currency}}.",
"card_details": "تفاصيل البطاقة",
"seats_and_no_show_fee_error": "لا يمكن حالياً تمكين المقاعد وفرض رسوم عدم الحضور",
"seats_and_no_show_fee_error": "لا يمكن حاليًا تمكين المقاعد وفرض رسوم عدم الحضور",
"complete_your_booking": "أكمل الحجز",
"complete_your_booking_subject": "أكمل الحجز: {{title}} في {{date}}",
"email_invite_team": "تم دعوة {{email}}"

View File

@ -757,7 +757,7 @@
"delete_event_type": "Odstranit typ události?",
"delete_managed_event_type": "Odstranit typ spravované události?",
"delete_event_type_description": "Každý, komu jste tento odkaz nasdíleli, pomocí něj již nebude moci provádět rezervace.",
"delete_managed_event_type_description": "<ul><li>Členům přiřazeným k tomuto typu události budou odstraněny i příslušné typy událostí.</li><li>Každý, komu jste tento odkaz nasdíleli, pomocí něj již ńebude moci moci provádět rezervace.</li></ul>",
"delete_managed_event_type_description": "<ul><li>Členům přiřazeným k tomuto typu události budou odstraněny i příslušné typy událostí.</li><li>Každý, komu jste tento odkaz nasdíleli, pomocí něj již nebude moci moci provádět rezervace.</li></ul>",
"confirm_delete_event_type": "Ano, odstranit",
"delete_account": "Smazat účet",
"confirm_delete_account": "Ano, smazat účet",
@ -1200,7 +1200,7 @@
"start_of_week": "Začátek týdne",
"recordings_title": "Nahrávky",
"recording": "Nahrávka",
"happy_scheduling": "Veselé plánování",
"happy_scheduling": "Hodně štěstí s plánováním",
"select_calendars": "Vyberte kalendáře, u kterých chcete kontrolovat konflikty v zájmu prevence dvojích rezervací.",
"check_for_conflicts": "Zkontrolovat konflikty",
"view_recordings": "Zobrazit nahrávky",
@ -1326,7 +1326,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Zde si můžete prohlédnout všechny vytvořené formuláře a trasy.",
"routing_forms_description": "Vytvořit formuláře pro přesměrování účastníků do správných destinací",
"routing_forms_send_email_owner": "Odeslat e-mail vlastníkovi",
"routing_forms_send_email_owner_description": "Po odeslání formuláře bude vlastníkovi odeslán e-mail",
"add_new_form": "Přidat nový formulář",
@ -1488,7 +1488,7 @@
"email_subject_slug_replacement": "Správce týmu nahradil vaši událost /{{slug}}",
"email_body_slug_replacement_notice": "Správce v týmu <strong>{{teamName}}</strong> nahradil váš typ události <strong>/{{slug}}</strong> spravovaným typem události, který ovládá.",
"email_body_slug_replacement_info": "Váš odkaz bude dále fungovat, ale některá příslušná nastavení se mohla změnit. Můžete si je prohlédnout v části Typy událostí.",
"email_body_slug_replacement_suggestion": "Pokud máte k typu události případné dotazy, obraťte se na svého správce.<br /><br />Veselé plánování, <br />tým Cal.com",
"email_body_slug_replacement_suggestion": "Pokud máte k typu události dotazy, obraťte se na svého správce.<br /><br />Hodně štěstí s plánováním. <br />tým Cal.com",
"disable_payment_app": "Administrátor zakázal {{appName}}, což ovlivňuje váš typ události {{title}}. Účastníci si stále mohou rezervovat tento typ události, ale nebudou vyzváni k platbě. Abyste tomu zabránili, můžete tento typ události skrýt, dokud správce tento způsob platby znovu nepovolí.",
"payment_disabled_still_able_to_book": "Účastníci si stále mohou rezervovat tento typ události, ale nebudou vyzváni k platbě. Abyste tomu zabránili, můžete tento typ události skrýt, dokud správce tento způsob platby znovu nepovolí.",
"app_disabled_with_event_type": "Administrátor zakázal {{appName}}, což ovlivňuje váš typ události {{title}}.",
@ -1691,7 +1691,7 @@
"view_bookings_across_description": "Podívejte se, kdo přijímá nejvíce rezervací, a zajistěte co nejlepší rozložení v rámci celého týmu",
"identify_booking_trends": "Identifikujte trendy v rezervacích",
"identify_booking_trends_description": "Zjistěte, které části týdne a které časy během dne jsou u vašich rezervací oblíbené",
"spot_popular_event_types": "Vytipujete si oblíbené typy událostí",
"spot_popular_event_types": "Identifikujte oblíbené typy událostí",
"spot_popular_event_types_description": "Zjistěte, které typy vašich událostí získávají nejvíce kliknutí a rezervací",
"no_responses_yet": "Zatím žádné odpovědi",
"this_will_be_the_placeholder": "Toto bude zástupný znak",
@ -1717,17 +1717,17 @@
"members_default_schedule": "Výchozí rozvrh člena",
"set_by_admin": "Nastaveno správcem týmu",
"members_default_location": "Výchozí umístění člena",
"members_default_schedule_description": "Použijeme výchozí rozvrh dostupnosti každého člena. Bude ho moct upravovat nebo měnit.",
"members_default_schedule_description": "Použijeme výchozí rozvrh dostupnosti každého člena. Bude ho moci upravovat nebo měnit.",
"requires_at_least_one_schedule": "Musíte mít alespoň jeden rozvrh",
"default_conferencing_bulk_description": "Aktualizujte místa pro vybrané typy událostí",
"locked_for_members": "Zamčeno pro členy",
"locked_apps_description": "Členové budou vidět aktivní aplikace, ale nastavení aplikací upravovat moci nebudou",
"locked_webhooks_description": "Členové budou vidět aktivní webhooky, ale nastavení webhooků upravovat moci nebudou",
"locked_workflows_description": "Členové budou vidět aktivní pracovní postupy, ale nastavení pracovních postupů upravovat moci nebudou",
"locked_apps_description": "Členové uvidí aktivní aplikace, ale nastavení aplikací upravovat nemohou",
"locked_webhooks_description": "Členové uvidí aktivní webhooky, ale nastavení webhooků upravovat nemohou",
"locked_workflows_description": "Členové uvidí aktivní pracovní postupy, ale nastavení pracovních postupů upravovat nemohou",
"app_not_connected": "Nemáte připojený účet {{appName}}.",
"connect_now": "Připojte se",
"managed_event_dialog_confirm_button_one": "Nahradit a upozornit {{count}} člena",
"managed_event_dialog_confirm_button_other": "Nahradit a upozornit členy ({{count}})",
"managed_event_dialog_confirm_button_other": "Nahradit a upozornit členy {{count}}",
"managed_event_dialog_title_one": "Adresa URL /{{slug}} již existuje pro {{count}} člena. Chcete ji nahradit?",
"managed_event_dialog_title_other": "Adresa URL /{{slug}} již existuje pro členy ({{count}}). Chcete ji nahradit?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> již používá adresa URL <strong>/{{slug}}</strong>.",
@ -1767,10 +1767,10 @@
"submit_card": "Předložit kartu",
"submit_payment_information": "Odeslat platební údaje",
"meeting_awaiting_payment_method": "Vaše schůzka čeká na způsob platby",
"no_show_fee_charged_email_subject": "Poplatek za nedostavení se ve výši {{amount, currency}} stržen za {{title} dne {{date}}.",
"no_show_fee_charged_email_subject": "Poplatek za nedostavení se ve výši {{amount, currency}} stržen za {{title}} dne {{date}}.",
"no_show_fee_charged_text_body": "Byl stržen poplatek za nedostavení se",
"no_show_fee_charged_subtitle": "V souvislosti s následující událostí byl stržen poplatek za nedostavení se ve výši {{amount, currency}}",
"error_charging_card": "Při strhávání poplatku za nedostavení se došlo k chybě. Zkuste to prosím později.",
"error_charging_card": "Při strhávání poplatku za nedostavení se došlo k chybě. Zkuste to později.",
"collect_no_show_fee": "Vybrat poplatek za nedostavení se",
"no_show_fee_charged": "Poplatek za nedostavení se stržen",
"insights": "Insights",

View File

@ -195,6 +195,7 @@
"page_doesnt_exist": "This page does not exist.",
"check_spelling_mistakes_or_go_back": "Check for spelling mistakes or go back to the previous page.",
"404_page_not_found": "404: This page could not be found.",
"booker_event_not_found": "We could not find the event you are trying to book.",
"getting_started": "Getting Started",
"15min_meeting": "15 Min Meeting",
"30min_meeting": "30 Min Meeting",
@ -364,6 +365,7 @@
"user_dynamic_booking_disabled": "Some of the users in the group have currently disabled dynamic group bookings",
"allow_dynamic_booking_tooltip": "Group booking links that can be created dynamically by adding multiple usernames with a '+'. example: '{{appName}}/bailey+peer'",
"allow_dynamic_booking": "Allow attendees to book you through dynamic group bookings",
"dynamic_booking": "Dynamic group links",
"email": "Email",
"email_placeholder": "jdoe@example.com",
"full_name": "Full name",
@ -374,6 +376,8 @@
"booking_rescheduled": "Booking Rescheduled",
"recording_ready":"Recording Download Link Ready",
"booking_created": "Booking Created",
"booking_rejected":"Booking Rejected",
"booking_requested":"Booking Requested",
"meeting_ended": "Meeting Ended",
"form_submitted": "Form Submitted",
"event_triggers": "Event Triggers",
@ -1816,6 +1820,7 @@
"email_invite_team_bulk": "{{userCount}} users have been invited",
"error_collecting_card": "Error collecting card",
"image_size_limit_exceed": "Uploaded image shouldn't exceed 5mb size limit",
"unauthorized_workflow_error_message": "{{errorCode}}: You are not authorized to enable or disable this workflow",
"inline_embed": "Inline Embed",
"load_inline_content": "Loads your event type directly inline with your other website content.",
"floating_pop_up_button": "Floating pop-up button",

View File

@ -26,6 +26,8 @@
"rejection_confirmation": "Rechazar la reserva",
"manage_this_event": "Administrar este evento",
"invite_team_member": "Invite a un miembro del equipo",
"invite_team_individual_segment": "Invitar individualmente",
"invite_team_bulk_segment": "Importar en masa",
"invite_team_notifcation_badge": "Inv.",
"your_event_has_been_scheduled": "Tu evento ha sido reprogramado",
"your_event_has_been_scheduled_recurring": "Su evento recurrente se ha programado",
@ -222,6 +224,7 @@
"go_back_login": "Volver a la página de inicio",
"error_during_login": "Se ha producido un error al iniciar sesión. Vuelve a la pantalla de inicio de sesión e inténtalo de nuevo.",
"request_password_reset": "Restablecer contraseña",
"send_invite": "Enviar invitación",
"forgot_password": "Olvidé la contraseña",
"forgot": "¿Olvidado?",
"done": "Hecho",
@ -237,6 +240,8 @@
"set_availability": "Establecer Disponibilidad",
"continue_without_calendar": "Continuar sin calendario",
"connect_your_calendar": "Conecta tu calendario",
"connect_your_video_app": "Conecte sus aplicaciones favoritas",
"connect_your_video_app_instructions": "Conecte sus aplicaciones de vídeo para usarlas en sus tipos de eventos.",
"connect_your_calendar_instructions": "Conecta tu calendario para comprobar automáticamente los horarios ocupados y los nuevos eventos a medida que se programan.",
"set_up_later": "Configurar más tarde",
"current_time": "Hora Actual",
@ -367,6 +372,7 @@
"create_webhook": "Crear Webhook",
"booking_cancelled": "Reserva Cancelada",
"booking_rescheduled": "Reserva habilitada",
"recording_ready": "Enlace de descarga de grabación listo",
"booking_created": "Reserva Creada",
"meeting_ended": "Reunión finalizada",
"form_submitted": "Formulario enviado",
@ -465,6 +471,7 @@
"friday": "Viernes",
"saturday": "Sábado",
"sunday": "Domingo",
"all_booked_today": "Todo reservado.",
"slots_load_fail": "No se pudo cargar el intervalo de tiempo disponible.",
"additional_guests": "Añadir invitados",
"your_name": "Tu Nombre",
@ -591,7 +598,7 @@
"round_robin_description": "Ciclo de reuniones entre varios miembros del equipo.",
"managed_event": "Evento gestionado",
"username_placeholder": "nombre de usuario",
"managed_event_description": "Cree distribuya tipos de eventos de forma masiva a los miembros del equipo",
"managed_event_description": "Cree y distribuya tipos de eventos de forma masiva a los miembros del equipo",
"managed": "Gestionado",
"managed_event_url_clarification": "El \"nombre de usuario\" se completará con el nombre de usuario de los miembros asignados",
"assign_to": "Asignar a",
@ -600,7 +607,7 @@
"count_members_other": "{{count}} miembros",
"no_assigned_members": "No hay miembros asignados",
"assigned_to": "Asignado a",
"start_assigning_members_above": "Empezar a asignar miembros arriba",
"start_assigning_members_above": "Empezar a asignar miembros más arriba",
"locked_fields_admin_description": "Los miembros no podrán editar esto",
"locked_fields_member_description": "El administrador del equipo bloqueó esta opción",
"url": "URL",
@ -752,12 +759,16 @@
"new_event_type_to_book_description": "Crea un nuevo tipo de evento para que las personas reserven horarios.",
"length": "Tamaño",
"minimum_booking_notice": "Aviso de Reserva",
"offset_toggle": "Horas de inicio desplazadas",
"offset_toggle_description": "Intervalos de tiempo desplazados que se muestran a los que reservan por un número específico de minutos",
"offset_start": "Desplazar por",
"offset_start_description": "por ejemplo esto mostrará los intervalos de tiempo a quienes reservan a las {{ adjustedTime }} en lugar de {{ originalTime }}",
"slot_interval": "Intervalos de tiempo",
"slot_interval_default": "Usar duración del evento (por defecto)",
"delete_event_type": "¿Eliminar tipo de evento?",
"delete_managed_event_type": "¿Eliminar tipo de evento administrado?",
"delete_event_type_description": "Cualquier persona con la que hayas compartido este enlace ya no podrá reservar con él.",
"delete_managed_event_type_description": "<ul><li>Los miembros asignados a este tipo de evento también verán eliminados sus tipos de evento.</li><li>Cualquier persona con la que hayan compartido su enlace ya no podrá reservar mediante su uso.</li> </ul>",
"delete_managed_event_type": "¿Eliminar tipo de evento gestionado?",
"delete_event_type_description": "Cualquier persona con la que haya compartido este enlace ya no podrá reservar con él.",
"delete_managed_event_type_description": "<ul><li>Los miembros asignados a este tipo de evento también verán eliminados sus tipos de evento.</li><li>Cualquier persona con la que hayan compartido su enlace ya no podrá reservar con él.</li> </ul>",
"confirm_delete_event_type": "Sí, eliminar",
"delete_account": "Eliminar cuenta",
"confirm_delete_account": "Sí, eliminar cuenta",
@ -904,6 +915,7 @@
"duplicate": "Duplicado",
"offer_seats": "Ofrecer plazas",
"offer_seats_description": "Ofrecer plazas para las reservas (desactiva las reservas de invitados y las optativas)",
"seats_available_one": "Plazas disponibles",
"seats_available_other": "Plazas disponibles",
"number_of_seats": "Número de plazas por reserva",
"enter_number_of_seats": "Introduzca el número de plazas",
@ -1038,6 +1050,7 @@
"event_cancelled_trigger": "cuando se cancela el evento",
"new_event_trigger": "cuando se reserva un nuevo evento",
"email_host_action": "enviar correo electrónico al anfitrión",
"email_attendee_action": "enviar correo electrónico a los asistentes",
"sms_attendee_action": "enviar SMS al asistente",
"sms_number_action": "enviar SMS a un número específico",
"workflows": "Flujos de trabajo",
@ -1190,6 +1203,7 @@
"create_workflow": "Crear un flujo de trabajo",
"do_this": "Hacer esto",
"turn_off": "Apagar",
"turn_on": "Activar",
"settings_updated_successfully": "Configuración actualizada correctamente",
"error_updating_settings": "Error al actualizar la configuración",
"personal_cal_url": "Mi URL personal de {{appName}}",
@ -1246,6 +1260,7 @@
"calendars_description": "Configura cómo interactúan tus tipos de eventos con tus calendarios",
"appearance_description": "Administra los ajustes para el aspecto de tu reserva",
"conferencing_description": "Añada sus aplicaciones de videoconferencia favoritas para sus reuniones",
"add_conferencing_app": "Añadir aplicación de conferencia",
"password_description": "Administra los ajustes para las contraseñas de tu cuenta",
"2fa_description": "Administra los ajustes para las contraseñas de tu cuenta",
"we_just_need_basic_info": "Solo necesitamos información básica para configurar tu perfil.",
@ -1326,7 +1341,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Aquí puedes ver todos los formularios y rutas que has creado.",
"routing_forms_description": "Crea formularios para dirigir a los asistentes a sus destinos correctos",
"routing_forms_send_email_owner": "Enviar correo electrónico al propietario",
"routing_forms_send_email_owner_description": "Mande un correo electrónico al propietario cuando se envía el formulario",
"add_new_form": "Añadir formulario nuevo",
@ -1380,7 +1395,7 @@
"add_limit": "Agregue un límite",
"team_name_required": "Nombre de equipo requerido",
"show_attendees": "Comparta información de los asistentes entre los invitados",
"how_booking_questions_as_variables": "¿Cómo se utilizan las preguntas de reserva como variables?",
"how_booking_questions_as_variables": "¿Cómo utilizar las preguntas de reserva como variables?",
"format": "Formato",
"uppercase_for_letters": "Use mayúsculas para todas las letras",
"replace_whitespaces_underscores": "Reemplace espacios en blanco con guiones bajos",
@ -1486,7 +1501,7 @@
"disabled_app_affects_event_type": "Un administrador desactivó {{appName}}, lo que afecta a su tipo de evento {{eventType}}",
"event_replaced_notice": "Un administrador ha reemplazado uno de sus tipos de eventos",
"email_subject_slug_replacement": "Un administrador del equipo ha reemplazado su evento /{{slug}}",
"email_body_slug_replacement_notice": "Un administrador del equipo <strong>{{teamName}}</strong> reemplazó su tipo de evento <strong>/{{slug}}</strong> con un tipo de evento administrado que él controla.",
"email_body_slug_replacement_notice": "Un administrador del equipo <strong>{{teamName}}</strong> reemplazó su tipo de evento <strong>/{{slug}}</strong> con un tipo de evento gestionado que él controla.",
"email_body_slug_replacement_info": "Su enlace seguirá funcionando, pero algunas configuraciones pueden haber cambiado. Puede revisarlo en tipos de eventos.",
"email_body_slug_replacement_suggestion": "Si tiene alguna pregunta sobre el tipo de evento, comuníquese con su administrador.<br /><br />Feliz programación, <br />El equipo de Cal.com",
"disable_payment_app": "El administrador ha deshabilitado {{appName}}, lo que afecta a su tipo de evento {{title}}. Los asistentes todavía pueden reservar este tipo de evento, pero no se les pedirá que paguen. Puede ocultar el tipo de evento para evitar esto hasta que su administrador habilite de nuevo su método de pago.",
@ -1551,7 +1566,7 @@
"create_your_first_team_webhook_description": "Cree su primer webhook para este tipo de evento de equipo",
"create_webhook_team_event_type": "Crear un webhook para este tipo de evento de equipo",
"disable_success_page": "Desactivar página de éxito (solo funciona si tiene una URL de redireccionamiento)",
"invalid_admin_password": "Usted es administrador pero no tiene una contraseña de al menos 15 caracteres o ni autenticación de 2 factores",
"invalid_admin_password": "Usted es administrador pero no tiene una contraseña de al menos 15 caracteres o una autenticación de 2 factores aún",
"change_password_admin": "Cambie la contraseña para obtener acceso de administrador",
"username_already_taken": "Este nombre de usuario ya está en uso",
"assignment": "Asignación",
@ -1620,6 +1635,7 @@
"email_user_cta": "Ver la invitación",
"email_no_user_invite_heading": "Lo han invitado a unirse a un equipo en {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} lo invitó a unirse a su equipo en {{appName}}. {{appName}} es el programador de eventos que les permite a usted y a su equipo programar reuniones sin necesidad de enviar correos electrónicos.",
"email_user_invite_subheading": "{{invitedBy}} lo ha invitado a unirse a su equipo \"{{teamName}}\" en {{appName}}. {{appName}} es el planificador de eventos que le permite a usted y a su equipo programar reuniones sin correos electrónicos de ida y vuelta.",
"email_no_user_invite_steps_intro": "Lo guiaremos a través de unos pocos pasos y disfrutará de una programación con su equipo sin estresarse y empleando muy poco tiempo.",
"email_no_user_step_one": "Elija su nombre de usuario",
"email_no_user_step_two": "Conecte su cuenta de calendario",
@ -1686,15 +1702,24 @@
"select_a_router": "Seleccione un enrutador",
"add_a_new_route": "Agregar una ruta nueva",
"make_informed_decisions": "Tome decisiones informadas con Insights",
"make_informed_decisions_description": "Nuestro panel de Insights muestra toda la actividad de su equipo y le muestra las tendencias que permiten una mejor programación y toma de decisiones del equipo.",
"view_bookings_across": "Ver reservas entre todos los miembros",
"make_informed_decisions_description": "Nuestro panel de Insights muestra toda la actividad de su equipo y las tendencias que permiten una mejor programación y toma de decisiones.",
"view_bookings_across": "Ver reservas de todos los miembros",
"view_bookings_across_description": "Vea quién recibe la mayor cantidad de reservas y garantice la mejor distribución en su equipo",
"identify_booking_trends": "Identificar tendencias de reserva",
"identify_booking_trends_description": "Consultar qué horas de la semana y qué horas durante el día son populares para sus reservas",
"identify_booking_trends_description": "Consultar cuáles son las horas de la semana y del día más populares para sus reservas",
"spot_popular_event_types": "Detectar tipos de eventos populares",
"spot_popular_event_types_description": "Consulte cuál de sus tipos de eventos están recibiendo más clics y reservas",
"no_responses_yet": "Aún no hay respuestas",
"this_will_be_the_placeholder": "Este será el marcador de posición",
"error_booking_event": "Ocurrió un error al reservar el evento, actualice la página e intente nuevamente",
"timeslot_missing_title": "No hay intervalo de tiempo seleccionado",
"timeslot_missing_description": "Seleccione un intervalo de tiempo para reservar el evento.",
"timeslot_missing_cta": "Seleccionar intervalo de tiempo",
"switch_monthly": "Cambiar a la vista mensual",
"switch_weekly": "Cambiar a la vista semanal",
"switch_multiday": "Cambiar a la vista diaria",
"num_locations": "{{num}} opciones de ubicación",
"select_on_next_step": "Seleccionar en el siguiente paso",
"this_meeting_has_not_started_yet": "Esta reunión aún no ha comenzado",
"this_app_requires_connected_account": "{{appName}} requiere una cuenta {{dependencyName}} conectada",
"connect_app": "Conectar {{dependencyName}}",
@ -1704,7 +1729,7 @@
"can_you_try_again": "¿Puede intentarlo de nuevo con una hora diferente?",
"verify": "Verificar",
"timezone_variable": "Zona Horaria",
"timezone_info": "La zona horaria de la persona que recibe",
"timezone_info": "Zona horaria de la persona que recibe",
"event_end_time_variable": "Hora de finalización del evento",
"event_end_time_info": "La hora de finalización del evento",
"cancel_url_variable": "URL de cancelación",
@ -1717,13 +1742,14 @@
"members_default_schedule": "Horario predeterminado del miembro",
"set_by_admin": "Establecido por el administrador del equipo",
"members_default_location": "Ubicación predeterminada del miembro",
"members_default_schedule_description": "Usaremos el horario de disponibilidad predeterminado de cada miembro. Podrán editarlo o cambiarlo.",
"members_default_schedule_description": "Usaremos el horario de disponibilidad predeterminado de cada miembro. Este se podrá editar o cambiar.",
"requires_at_least_one_schedule": "Es necesario tener al menos un horario",
"default_conferencing_bulk_description": "Actualizar las ubicaciones para los tipos de eventos seleccionados",
"locked_for_members": "Bloqueado para miembros",
"locked_apps_description": "Los miembros podrán ver las aplicaciones activas pero no podrán editar ninguna configuración de la aplicación",
"locked_apps_description": "Los miembros podrán ver las aplicaciones activas, pero no podrán editar ninguna configuración de la aplicación",
"locked_webhooks_description": "Los miembros podrán ver los webhooks activos, pero no podrán editar ninguna configuración de webhooks",
"locked_workflows_description": "Los miembros podrán ver los flujos de trabajo activos, pero no podrán editar ninguna configuración de flujo de trabajo",
"locked_by_admin": "Bloqueado por el administrador del equipo",
"app_not_connected": "No ha conectado una cuenta de {{appName}}.",
"connect_now": "Conectar ahora",
"managed_event_dialog_confirm_button_one": "Reemplazar y notificar a {{count}} miembro",
@ -1735,7 +1761,7 @@
"managed_event_dialog_clarification": "Si elige reemplazarlo, se lo notificaremos. Regrese y elimínelos si no desea sobrescribirlo.",
"review_event_type": "Revisar tipo de evento",
"looking_for_more_analytics": "¿Busca más datos de análisis?",
"looking_for_more_insights": "¿Busca más perspectivas?",
"looking_for_more_insights": "¿Quiere saber más sobre Insights?",
"add_filter": "Añadir filtro",
"select_user": "Seleccionar usuario",
"select_event_type": "Seleccionar tipo de evento",
@ -1751,7 +1777,7 @@
"events_rescheduled": "Eventos reprogramados",
"from_last_period": "desde el último período",
"from_to_date_period": "Desde: {{startDate}} Hasta: {{endDate}}",
"analytics_for_organisation": "Perspectivas",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "Obtenga más información sobre la actividad de su equipo",
"redirect_url_warning": "Agregar una redirección deshabilitará la página de éxito. Asegúrese de mencionar \"Reserva confirmada\" en su página de éxito personalizada.",
"event_trends": "Tendencias del evento",
@ -1776,10 +1802,39 @@
"insights": "Insights",
"testing_workflow_info_message": "Al probar este flujo de trabajo, tenga en cuenta que los correos electrónicos y los SMS solo se pueden programar con al menos 1 hora de anticipación",
"insights_no_data_found_for_filter": "No se encontraron datos para el filtro seleccionado o las fechas seleccionadas.",
"acknowledge_booking_no_show_fee": "Reconozco que si no asisto a este evento, se aplicará a mi tarjeta una tarifa de {{amount, currency}} por no presentarse.",
"acknowledge_booking_no_show_fee": "Reconozco que si no asisto a este evento, se aplicará a mi tarjeta una tarifa de {{amount, currency}} por no presentarme.",
"card_details": "Detalles de la tarjeta",
"seats_and_no_show_fee_error": "Actualmente no se pueden habilitar cupos ni cobrar una tarifa por no presentarse",
"seats_and_no_show_fee_error": "Actualmente, no se pueden habilitar cupos ni cobrar una tarifa por no presentarse",
"complete_your_booking": "Complete su reserva",
"complete_your_booking_subject": "Complete su reserva: {{title}} el {{date}}",
"email_invite_team": "Se ha invitado a {{email}}"
"confirm_your_details": "Confirme sus datos",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "Está a punto de cobrarle {{amount, currency}} al asistente. ¿Está seguro de que desea continuar?",
"charge_attendee": "Cobrarle al asistente {{amount, currency}}",
"payment_app_commission": "Solicitar pago ({{paymentFeePercentage}}% + {{fee, currency}} comisión por transacción)",
"email_invite_team": "Se ha invitado a {{email}}",
"email_invite_team_bulk": "Se han invitado {{userCount}} usuarios",
"error_collecting_card": "Error al recolectar la tarjeta",
"image_size_limit_exceed": "La imagen cargada no debe exceder el límite de tamaño de 5 Mb",
"inline_embed": "Incrustar en línea",
"load_inline_content": "Carga su tipo de evento directamente en línea con otro contenido de su sitio web.",
"floating_pop_up_button": "Botón emergente flotante",
"floating_button_trigger_modal": "Pone un botón flotante en su sitio que activa un modal con su tipo de evento.",
"pop_up_element_click": "Aparece mediante un clic en el elemento",
"open_dialog_with_element_click": "Abre su cuadro de diálogo Cal cuando alguien hace clic en un elemento.",
"need_help_embedding": "Necesita ayuda? Consulte nuestras guías para incrustar Cal en Wix, Squarespace o WordPress, consulte nuestras preguntas comunes o explore las opciones avanzadas de incrustación.",
"book_my_cal": "Reservar mi Cal",
"invite_as": "Invitar como",
"form_updated_successfully": "Formulario actualizado con éxito.",
"email_not_cal_member_cta": "Únase a su equipo",
"disable_attendees_confirmation_emails": "Desactivar los correos electrónicos de confirmación predeterminados para los asistentes",
"disable_attendees_confirmation_emails_description": "Al menos un flujo de trabajo está activo en este tipo de evento que envía un correo electrónico a los asistentes cuando se reserva el evento.",
"disable_host_confirmation_emails": "Desactivar los correos electrónicos de confirmación predeterminados para el anfitrión",
"disable_host_confirmation_emails_description": "Al menos un flujo de trabajo está activo en este tipo de evento que envía un correo electrónico al anfitrión cuando se reserva el evento.",
"add_an_override": "Agregar una anulación",
"import_from_google_workspace": "Importar usuarios de Google Workspace",
"connect_google_workspace": "Conectar Google Workspace",
"google_workspace_admin_tooltip": "Debe ser administrador del espacio de trabajo para usar esta función",
"first_event_type_webhook_description": "Cree su primer webhook para este tipo de evento",
"create_for": "Crear para"
}

View File

@ -1807,6 +1807,7 @@
"email_invite_team": "{{email}} a été invité",
"error_collecting_card": "Erreur lors de la collecte de la carte",
"image_size_limit_exceed": "L'image téléchargée ne doit pas dépasser 5 Mo",
"unauthorized_workflow_error_message": "{{errorCode}} : Vous n'êtes pas autorisé à activer ou désactiver ce workflow",
"inline_embed": "Intégration en ligne",
"load_inline_content": "Charge votre type d'événement directement en ligne avec le contenu de votre site web.",
"floating_pop_up_button": "Bouton pop-up flottant",

View File

@ -601,7 +601,7 @@
"no_assigned_members": "Nessun membro assegnato",
"assigned_to": "Assegnato a",
"start_assigning_members_above": "Inizia ad assegnare membri in alto",
"locked_fields_admin_description": "I membri non saranno in grado di apportare modifiche qui",
"locked_fields_admin_description": "I membri non potranno fare modifiche",
"locked_fields_member_description": "Questa opzione è stata bloccata dall'amministratore del team",
"url": "URL",
"hidden": "Nascosto",
@ -757,7 +757,7 @@
"delete_event_type": "Eliminare il tipo di evento?",
"delete_managed_event_type": "Eliminare il tipo di evento gestito?",
"delete_event_type_description": "Gli utenti con cui hai condiviso il link non saranno più in grado di usarlo per prenotare.",
"delete_managed_event_type_description": "<ul><li>Questo tipo di evento sarà eliminato anche ai membri a esso assegnati.</li><li>Gli utenti con cui hai condiviso il link non saranno più in grado di usarlo per prenotare.</li></ul>",
"delete_managed_event_type_description": "<ul><li>Verranno eliminati anche i tipi di evento dei membri assegnati a questo evento.</li><li>Gli utenti con cui hanno condiviso il link non saranno più in grado di usarlo per prenotare.</li></ul>",
"confirm_delete_event_type": "Sì, elimina",
"delete_account": "Elimina account",
"confirm_delete_account": "Sì, elimina account",
@ -1148,7 +1148,7 @@
"current_username": "Nome utente corrente",
"example_1": "Esempio 1",
"example_2": "Esempio 2",
"booking_question_identifier": "Identificatore domanda alla prenotazione",
"booking_question_identifier": "Identificatore della domanda posta in fase di prenotazione",
"company_size": "Dimensione dell'azienda",
"what_help_needed": "Per cosa ti serve assistenza?",
"variable_format": "Formato variabile",
@ -1326,7 +1326,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Qui puoi vedere tutti i moduli e tutti i percorsi che hai creato.",
"routing_forms_description": "Crea moduli per indirizzare i partecipanti alle destinazioni corrette",
"routing_forms_send_email_owner": "Invia e-mail al proprietario",
"routing_forms_send_email_owner_description": "Invia un'e-mail al proprietario quando il modulo viene inviato",
"add_new_form": "Aggiungi nuovo modulo",
@ -1395,7 +1395,7 @@
"billing_help_title": "Hai bisogno di altro?",
"billing_help_description": "Se hai bisogno di ulteriore aiuto per la fatturazione, il nostro team di supporto è qui per aiutarti.",
"billing_help_cta": "Contatta l'assistenza",
"ignore_special_characters_booking_questions": "Ignora i caratteri speciali nell'identificatore della domanda da porre nella pagina di prenotazione. Usa solo lettere e numeri",
"ignore_special_characters_booking_questions": "Ignora i caratteri speciali nell'identificatore della domanda posta in fase di prenotazione. Usa solo lettere e numeri",
"retry": "Riprova",
"fetching_calendars_error": "Si è verificato un problema durante il recupero dei calendari. <1>Riprova</1> o contatta l'assistenza clienti.",
"calendar_connection_fail": "Impossibile connettersi al calendario",
@ -1488,7 +1488,7 @@
"email_subject_slug_replacement": "Un amministratore di team ha sostituito il tuo evento /{{slug}}",
"email_body_slug_replacement_notice": "Un amministratore del team <strong>{{teamName}}</strong> ha sostituito il tuo tipo di evento <strong>/{{slug}}</strong> con un tipo di evento gestito da lui controllato.",
"email_body_slug_replacement_info": "Il tuo link continuerà a funzionare, ma alcune delle sue impostazioni potrebbero essere state cambiate. Puoi verificarlo nella sezione Tipi di evento.",
"email_body_slug_replacement_suggestion": "Per qualsiasi domanda sui tipi di evento, contatta il nostro amministratore.<br /><br />Ti auguriamo una piacevole esperienza di pianificazione, <br />Il team Cal.com",
"email_body_slug_replacement_suggestion": "Per qualsiasi domanda sul tipo di evento, contatta il tuo amministratore.<br /><br />Ti auguriamo una piacevole esperienza di pianificazione, <br />Il team Cal.com",
"disable_payment_app": "L'amministratore ha disabilitato {{appName}}, il che ha effetto sul tuo tipo di evento {{title}}. I partecipanti sono ancora in grado di prenotare questo tipo di evento ma non gli verrà richiesto di pagare. Per evitarlo, è possibile nascondere questo tipo di evento fino a che l'amministratore non riattivi il tuo metodo di pagamento.",
"payment_disabled_still_able_to_book": "I partecipanti sono ancora in grado di prenotare questo tipo di evento ma non gli verrà richiesto di pagare. Per evitarlo, è possibile nascondere questo tipo di evento fino a che l'amministratore non riattivi il tuo metodo di pagamento.",
"app_disabled_with_event_type": "L'amministratore ha disabilitato {{appName}}, il che ha effetto sul tuo tipo di evento {{title}}.",
@ -1551,7 +1551,7 @@
"create_your_first_team_webhook_description": "Crea il primo webhook per questo tipo di evento del team",
"create_webhook_team_event_type": "Crea un webhook per questo tipo di evento del team",
"disable_success_page": "Disabilita pagina di conferma dell'esito (funziona solo se si dispone di un URL di reindirizzamento)",
"invalid_admin_password": "Sei un amministratore, ma la tua password non ha la lunghezza minima di 15 caratteri, né utilizzi l'autenticazione a due fattori",
"invalid_admin_password": "Sei un amministratore, ma la tua password non ha la lunghezza minima di 15 caratteri, oppure non utilizzi ancora l'autenticazione a due fattori",
"change_password_admin": "Cambia password per ottenere i diritti di accesso come amministratore",
"username_already_taken": "Nome utente già in uso",
"assignment": "Assegnazione",
@ -1705,8 +1705,8 @@
"verify": "Verifica",
"timezone_variable": "Timezone",
"timezone_info": "Il fuso orario della persona che riceve la prenotazione",
"event_end_time_variable": "Ora di fine evento",
"event_end_time_info": "Ora di fine dell'evento",
"event_end_time_variable": "Ora di conclusione dell'evento",
"event_end_time_info": "Ora di conclusione dell'evento",
"cancel_url_variable": "URL di annullamento",
"cancel_url_info": "URL per annullare la prenotazione",
"reschedule_url_variable": "URL di riprogrammazione",
@ -1717,13 +1717,13 @@
"members_default_schedule": "Pianificazione predefinita membro",
"set_by_admin": "Impostato dall'amministratore del team",
"members_default_location": "Posizione predefinita del membro",
"members_default_schedule_description": "Useremo il programma di disponibilità predefinito di ciascun membro. I membri saranno in grado di modificarlo.",
"members_default_schedule_description": "Useremo il programma di disponibilità predefinito di ciascun membro. I membri potranno modificarlo.",
"requires_at_least_one_schedule": "È necessario avere almeno un programma",
"default_conferencing_bulk_description": "Aggiorna le posizioni per i tipi di eventi selezionati",
"locked_for_members": "Bloccato per i membri",
"locked_apps_description": "I membri saranno in grado di vedere le app attive, ma non saranno in grado di modificare le impostazioni delle app",
"locked_webhooks_description": "I membri saranno in grado di vedere i webhook attivi, ma non saranno in grado di modificare le impostazioni dei webhook",
"locked_workflows_description": "I membri saranno in grado di vedere i flussi di lavoro attivi, ma non saranno in grado di modificare le impostazioni dei flussi di lavoro",
"locked_apps_description": "I membri potranno vedere le app attive, ma non potranno modificare le impostazioni delle app",
"locked_webhooks_description": "I membri potranno vedere i webhook attivi, ma non potranno modificare le impostazioni dei webhook",
"locked_workflows_description": "I membri potranno vedere i flussi di lavoro attivi, ma non potranno modificare le impostazioni dei flussi di lavoro",
"app_not_connected": "Non è stato connesso un account di {{appName}}.",
"connect_now": "Connetti ora",
"managed_event_dialog_confirm_button_one": "Sostituisci e invia notifica a {{count}} membro",
@ -1732,8 +1732,8 @@
"managed_event_dialog_title_other": "L'URL /{{slug}} esiste già per {{count}} membri. Sostituirlo?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> utilizza già l'URL <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> utilizzano già l'URL <strong>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "Se si decide di sostituirlo, ai membri ne verrà inviata una notifica. Tornare indietro e rimuoverli se non si desidera sovrascriverlo.",
"review_event_type": "Controlla tipo di evento",
"managed_event_dialog_clarification": "Se decidi di sostituirlo, i membri ne saranno avvisati. Torna indietro e rimuovili se non desideri sovrascriverlo.",
"review_event_type": "Rivedi tipo di evento",
"looking_for_more_analytics": "Hai bisogno di più dati analitici?",
"looking_for_more_insights": "Hai bisogno di maggiori approfondimenti?",
"add_filter": "Aggiungi filtro",
@ -1774,7 +1774,7 @@
"collect_no_show_fee": "Riscuoti penale per mancata presentazione",
"no_show_fee_charged": "Penale per mancata presentazione addebitata",
"insights": "Insights",
"testing_workflow_info_message": "Durante il test di questo flusso di lavoro, tieni presente che le e-mail e i messaggi SMS possono essere programmati con almeno 1 ora di anticipo",
"testing_workflow_info_message": "Durante il test di questo flusso di lavoro, tieni presente che le e-mail e i messaggi SMS devono essere programmati con almeno 1 ora di anticipo",
"insights_no_data_found_for_filter": "Nessun dato trovato per il filtro selezionato o le date selezionate.",
"acknowledge_booking_no_show_fee": "Confermo che in caso di mia mancata partecipazione a questo evento, una penale per mancata presentazione di {{amount, currency}} verrà addebitata sulla mia carta.",
"card_details": "Dati della carta",

View File

@ -408,7 +408,7 @@
"add_time_availability": "新しい時間帯を追加",
"add_an_extra_layer_of_security": "パスワードが盗まれる場合に備えて、アカウントのセキュリティを強化します。",
"2fa": "二要素認証",
"2fa_disabled": "二要素認証はメールとパスワード認証にのみ有効化できます",
"2fa_disabled": "二要素認証はメール認証とパスワード認証に対してのみ有効化できます",
"enable_2fa": "二要素認証を有効にする",
"disable_2fa": "二要素認証を無効にする",
"disable_2fa_recommendation": "2FA を無効にする必要がある場合は、その必要がなくなった後すぐに有効にしなおすことをおすすめします。",
@ -589,20 +589,20 @@
"minutes": "分",
"round_robin": "ラウンドロビン",
"round_robin_description": "複数のチームメンバー間のミーティングを定期化する。",
"managed_event": "管理イベント",
"managed_event": "管理済みのイベント",
"username_placeholder": "ユーザー名",
"managed_event_description": "イベントタイプを一括して作成し、チームメンバーに割り当てる",
"managed": "管理",
"managed_event_url_clarification": "「ユーザー名」には、割り当てられたメンバーのユーザー名が入ります",
"managed_event_description": "イベントの種類を作成し、チームメンバーに一括配布する",
"managed": "管理済み",
"managed_event_url_clarification": "\"ユーザー名\" には割り当てられたメンバーのユーザー名が入ります",
"assign_to": "割り当て先",
"add_members": "メンバーを追加…",
"count_members_one": "{{count}} 人のメンバー",
"count_members_other": "{{count}} 人のメンバー",
"no_assigned_members": "割り当てられたメンバーはいません",
"assigned_to": "割り当て先",
"start_assigning_members_above": "上記のメンバーへの割り当てを開始する",
"locked_fields_admin_description": "メンバーはこれを編集できません",
"locked_fields_member_description": "このオプションはチーム管理者によってロックされました",
"start_assigning_members_above": "上記のメンバーに対する割り当てを開始する",
"locked_fields_admin_description": "メンバーがこれを編集することはできません",
"locked_fields_member_description": "このオプションはチーム管理者によってロックされました",
"url": "URL",
"hidden": "隠れている",
"readonly": "読み込み専用",
@ -754,10 +754,10 @@
"minimum_booking_notice": "最低頻度の通知",
"slot_interval": "時間帯の間隔",
"slot_interval_default": "イベントの長さを使用する (デフォルト)",
"delete_event_type": "イベントタイプを削除しますか?",
"delete_managed_event_type": "管理イベントタイプを削除しますか?",
"delete_event_type_description": "これまでにこのリンクを共有された人は、リンクを使って予約することができなくなります。",
"delete_managed_event_type_description": "<ul><li>このイベントタイプを割り当てられたメンバーも、イベントタイプが削除されます。</li><li>これまでにこのリンクを共有された人は皆、このリンクを使った予約ができなくなります。</li></ul>",
"delete_event_type": "イベントの種類を削除しますか?",
"delete_managed_event_type": "管理済みのイベントの種類を削除しますか?",
"delete_event_type_description": "これまでにこのリンクを共有したことがあるユーザーは、このリンクを使用して予約することができなくなります。",
"delete_managed_event_type_description": "<ul><li>このイベントの種類に割り当てられているメンバーは、そのイベントの種類も削除されます。</li><li>リンクを共有したことがあるユーザーは、そのリンクを使用して予約することができなくなります。</li></ul>",
"confirm_delete_event_type": "はい、削除します",
"delete_account": "アカウントを削除する",
"confirm_delete_account": "はい。アカウントを削除します",
@ -1148,13 +1148,13 @@
"current_username": "現在のユーザー名",
"example_1": "例 1",
"example_2": "例 2",
"booking_question_identifier": "予約時質問識別子",
"booking_question_identifier": "予約時質問識別子",
"company_size": "会社の規模",
"what_help_needed": "何かお困りですか?",
"variable_format": "変数の形式",
"webhook_subscriber_url_reserved": "ウェブフック購読者 URL は既に定義されています",
"custom_input_as_variable_info": "追加の入力ラベルに含まれている特殊文字はすべて無視し (アルファベットと数字のみを使用)、アルファベットをすべて大文字に、そして空白をアンダースコアへと変換します。",
"using_booking_questions_as_variables": "予約時の質問を変数として使う方法は",
"using_booking_questions_as_variables": "予約時の質問を変数として使うにはどうすればいいですか",
"download_desktop_app": "デスクトップアプリをダウンロード",
"set_ping_link": "Ping リンクを設定",
"rate_limit_exceeded": "試行回数の上限を超えました",
@ -1177,7 +1177,7 @@
"event_advanced_tab_title": "詳細設定",
"event_setup_multiple_duration_error": "イベント設定複数の期間には少なくとも1つのオプションが必要です。",
"event_setup_multiple_duration_default_error": "イベント設定:有効なデフォルト期間を選択してください。",
"event_setup_booking_limits_error": "予約の上限の日時表記は昇順にする必要があります。[日、週、月、年]",
"event_setup_booking_limits_error": "予約制限の日時表記は、昇順にする必要があります。[日、週、月、年]",
"event_setup_duration_limits_error": "期間の上限は昇順にする必要があります。[日、週、月、年]",
"select_which_cal": "予約を追加するカレンダーを選択してください",
"custom_event_name": "カスタムイベント名",
@ -1326,7 +1326,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "作成したすべてのフォームとルートをここで確認できます",
"routing_forms_description": "作成したすべてのフォームとルートをここで確認できます",
"routing_forms_send_email_owner": "所有者にメールを送信",
"routing_forms_send_email_owner_description": "フォームの送信時に所有者にメールを送信します",
"add_new_form": "新しいフォームを追加",
@ -1380,7 +1380,7 @@
"add_limit": "上限を追加する",
"team_name_required": "チーム名が必要です",
"show_attendees": "ゲスト間で出席者情報を共有する",
"how_booking_questions_as_variables": "予約時の質問を変数として使う方法は",
"how_booking_questions_as_variables": "予約時の質問を変数として使うにはどうすればいいですか",
"format": "書式",
"uppercase_for_letters": "すべての文字に大文字を使用する",
"replace_whitespaces_underscores": "空白をアンダーバー「 _ 」に置き換える",
@ -1395,7 +1395,7 @@
"billing_help_title": "他にもお手伝いできることはありませんか?",
"billing_help_description": "請求に関してサポートが必要な場合には、サポートチームがお手伝いさせていただきます。",
"billing_help_cta": "サポートに問い合わせる",
"ignore_special_characters_booking_questions": "予約時質問識別子に含まれている特殊文字はすべて無視し、アルファベットと数字のみを使用してください",
"ignore_special_characters_booking_questions": "予約時質問識別子に含まれている特殊文字はすべて無視し、アルファベットと数字のみを使用してください",
"retry": "再試行",
"fetching_calendars_error": "カレンダーの取得中にエラーが発生しました。<1>もう一度お試しいただく</1>か、カスタマーサポートまでお問い合わせください。",
"calendar_connection_fail": "カレンダーの接続に失敗しました",
@ -1484,11 +1484,11 @@
"duration_limit_reached": "このイベントの種類の期間の上限に達しました",
"admin_has_disabled": "管理者が {{appName}} を無効にしています",
"disabled_app_affects_event_type": "管理者が {{appName}} を無効にしているため、あなたのイベントの種類 {{eventType}} に影響を与える可能性があります",
"event_replaced_notice": "管理者があなたのイベントタイプの1つを置き換えました",
"email_subject_slug_replacement": "チーム管理者があなたのイベント /{{slug}} を置き換えました",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong>チームの管理者が、あなたのイベントタイプの <strong>/{{slug}}</strong> を彼らが管理する管理イベントタイプに置き換えました。",
"email_body_slug_replacement_info": "あなたのリンクは引き続き機能しますが、リンクの設定の一部が変更された可能性があります。変更はイベントタイプで確認できます。",
"email_body_slug_replacement_suggestion": "イベントタイプについてご質問がある場合は、管理者までお問合せください。<br /><br />スケジュール設定をお楽しみください、<br />Cal.comチーム",
"event_replaced_notice": "管理者があなたのイベント種類の 1 つを置き換えました",
"email_subject_slug_replacement": "チーム管理者があなたのイベント /{{slug}} を置き換えました",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong> チームの管理者が、あなたのイベントの種類 <strong>/{{slug}}</strong> を彼らが管理する管理済みのイベントの種類へと置き換えました。",
"email_body_slug_replacement_info": "あなたのリンクは引き続き機能しますが、リンクの設定の一部が変更された可能性があります。変更内容はイベントの種類で確認できます。",
"email_body_slug_replacement_suggestion": "イベントの種類について質問がある場合には、管理者までお問合せください。<br /><br />それでは、スケジュール設定をお楽しみください。<br />Cal.com チーム",
"disable_payment_app": "管理者が {{appName}} を無効にしたため、イベントの種類 {{title}} に影響を与える可能性があります。出席者がこの種類のイベントを予約することは可能ですが、支払いを促されることはありません。管理者が支払い方法を再度有効にするまでの間これを防ぐために、イベントの種類を非表示にすることができます。",
"payment_disabled_still_able_to_book": "出席者がこの種類のイベントを予約することは可能ですが、支払いを促されることはありません。管理者が支払い方法を再度有効にするまでの間これを防ぐために、イベントの種類を非表示にすることができます。",
"app_disabled_with_event_type": "管理者が {{appName}} を無効にしているため、あなたのイベントの種類 {{title}} に影響を与える可能性があります.",
@ -1537,7 +1537,7 @@
"date_overrides_update_btn": "上書きを更新",
"event_type_duplicate_copy_text": "{{slug}}-copy",
"set_as_default": "デフォルトとして設定",
"hide_eventtype_details": "イベントタイプの詳細を非表示にする",
"hide_eventtype_details": "イベントの種類の詳細を非表示にする",
"show_navigation": "ナビゲーションを表示",
"hide_navigation": "ナビゲーションを非表示にする",
"verification_code_sent": "確認コードが送信されました",
@ -1551,7 +1551,7 @@
"create_your_first_team_webhook_description": "このチームイベントの種類の初めての webhook を作成します",
"create_webhook_team_event_type": "このチームイベントの種類の webhook を作成します",
"disable_success_page": "予約完了ページを無効化する (リダイレクト URL がある場合にのみ有効)",
"invalid_admin_password": "あなたは管理者ですが、パスワードの長さが足りないか15文字以上必要です、まだ二要素認証をしていません",
"invalid_admin_password": "あなたは管理者ですが、パスワードの長さが 15 文字以上になっていないか、二要素認証がまだ完了していません",
"change_password_admin": "パスワードを変更して管理者アクセス権を取得する",
"username_already_taken": "ユーザー名が既に使用されています",
"assignment": "割り当て",
@ -1584,7 +1584,7 @@
"ee_enterprise_license": "\"/ee\" Enterprise ライセンス",
"enterprise_booking_fee": "{{enterprise_booking_fee}}/月で開始する",
"enterprise_license_includes": "商用ユースケースで必要となるすべてのもの",
"no_need_to_keep_your_code_open_source": "コードをオープンソースにしておく必要はありません",
"no_need_to_keep_your_code_open_source": "コードをオープンソースのままにしておく必要はありません",
"repackage_rebrand_resell": "再パッケージ、リブランディング、再販売が簡単になります",
"a_vast_suite_of_enterprise_features": "膨大な量の企業向け機能パッケージ",
"free_license_fee": "0.00 ドル/月",
@ -1646,7 +1646,7 @@
"default_app_link_title": "デフォルトのアプリリンクを設定",
"default_app_link_description": "デフォルトのアプリリンクを設定することで、新たに作成するすべてのイベントの種類が設定したアプリリンクを使用できるようになります。",
"change_default_conferencing_app": "デフォルトとして設定",
"organizer_default_conferencing_app": "主催者のデフォルトアプリ",
"organizer_default_conferencing_app": "主催者のデフォルトアプリ",
"under_maintenance": "メンテナンスのため停止中",
"under_maintenance_description": "{{appName}} チームが定期メンテナンスを行っています。質問がある場合には、サポートへとお問い合わせください。",
"event_type_seats": "{{numberOfSeats}} 席",
@ -1685,14 +1685,14 @@
"add_1_option_per_line": "1 行に 1 つのオプションを追加する",
"select_a_router": "ルーターを選択",
"add_a_new_route": "新しいルートを追加",
"make_informed_decisions": "Insights を使って情報に基づいた決定をする",
"make_informed_decisions_description": "Insights ダッシュボードではチーム全体のアクティビティがひと目でわかります。傾向もわかるので、チームはより良いスケジューリングと決定ができます。",
"make_informed_decisions": "Insights を使って情報に基づいた決定を行う",
"make_informed_decisions_description": "Insights ダッシュボードには、チーム内のすべてのアクティビティが表示され、チームのスケジュール設定や意思決定をより良いものにするための傾向が示されます。",
"view_bookings_across": "メンバー全体の予約を表示",
"view_bookings_across_description": "誰が最も予約されているか確認し、チーム全体で最適な配分ができるようにします",
"view_bookings_across_description": "誰が最も予約されているかを確認し、チーム全体で最適な配分が行われるようにします",
"identify_booking_trends": "予約の傾向を明らかにする",
"identify_booking_trends_description": "週のどの期間と1日のどの時間帯が予約者に人気か確認します",
"spot_popular_event_types": "人気のイベントタイプを見つける",
"spot_popular_event_types_description": "どのイベントタイプが最もクリックされ、予約されているのか確認します",
"identify_booking_trends_description": "1 週間の内のどの時間帯が、そして 1 日の内のどの時間帯が予約するユーザーに人気があるかを確認します",
"spot_popular_event_types": "人気のあるイベントの種類を見つける",
"spot_popular_event_types_description": "どのイベントの種類が最もクリックされ、予約されているのか確認します",
"no_responses_yet": "回答はまだありません",
"this_will_be_the_placeholder": "これがプレースホルダーになります",
"this_meeting_has_not_started_yet": "このミーティングはまだ開始されていません",
@ -1704,23 +1704,23 @@
"can_you_try_again": "別の時間帯でもう 1 度お試しください",
"verify": "確認する",
"timezone_variable": "タイムゾーン",
"timezone_info": "受け取る人のタイムゾーン",
"event_end_time_variable": "イベント終了時刻",
"event_end_time_info": "イベント終了時刻",
"timezone_info": "受信するユーザーのタイムゾーン",
"event_end_time_variable": "イベント終了時刻",
"event_end_time_info": "イベント終了時刻",
"cancel_url_variable": "キャンセル URL",
"cancel_url_info": "予約をキャンセルするための URL",
"reschedule_url_variable": "スケジュール変更 URL",
"reschedule_url_info": "予約をスケジュール変更するための URL",
"reschedule_url_info": "予約のスケジュールを変更するための URL",
"invalid_event_name_variables": "イベント名に無効な変数があります",
"select_all": "すべて選択",
"default_conferencing_bulk_title": "既存のイベントの種類を一括更新する",
"members_default_schedule": "メンバーのデフォルトスケジュール",
"set_by_admin": "チーム管理者により設定",
"members_default_schedule": "メンバーのデフォルトスケジュール",
"set_by_admin": "チームの管理者による設定",
"members_default_location": "メンバーのデフォルトの場所",
"members_default_schedule_description": "各メンバーのデフォルトの空き状況スケジュールを使用します。メンバーはスケジュールを編集したり、変更したりできます。",
"requires_at_least_one_schedule": "少なくとも 1 のスケジュールが必要です",
"members_default_schedule_description": "各メンバーのデフォルトの空きスケジュールを使用します。メンバーはこのスケジュールを編集したり、変更したりできます。",
"requires_at_least_one_schedule": "少なくとも 1 のスケジュールが必要です",
"default_conferencing_bulk_description": "選択したイベントの種類の場所を更新します",
"locked_for_members": "メンバーにロックされています",
"locked_for_members": "メンバーに対してロックされています",
"locked_apps_description": "メンバーは有効なアプリを確認できますが、アプリの設定を編集することはできません",
"locked_webhooks_description": "メンバーは有効なウェブフックを確認できますが、ウェブフックの設定を編集することはできません",
"locked_workflows_description": "メンバーは有効なワークフローを確認できますが、ワークフローの設定を編集することはできません",
@ -1732,54 +1732,54 @@
"managed_event_dialog_title_other": "{{count}} 人のメンバーには url/{{slug}} が既に存在します。置き換えますか?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong>は既に <strong>/{{slug}}</strong> url を使用しています。",
"managed_event_dialog_information_other": "<strong>{{names}}</strong>は既に <string>/{{slug}}</strong> url を使用しています。",
"managed_event_dialog_clarification": "置き換えを選択すると、通知が送られます。上書きしたくない場合は、戻って削除してください。",
"review_event_type": "イベントタイプを確認",
"looking_for_more_analytics": "詳しい分析をお探しですか?",
"looking_for_more_insights": "詳しい Insights をお探しですか?",
"managed_event_dialog_clarification": "置き換えを選択すると、通知が送られます。上書きしたくない場合は、戻って削除してください。",
"review_event_type": "イベントの種類を確認",
"looking_for_more_analytics": "詳しい分析情報をお探しですか?",
"looking_for_more_insights": "Insights をさらにお探しですか?",
"add_filter": "フィルターを追加",
"select_user": "ユーザーを選択",
"select_event_type": "イベントタイプを選択",
"select_date_range": "日付範囲を選択",
"select_event_type": "イベントの種類を選択",
"select_date_range": "日付範囲を選択",
"popular_events": "人気のイベント",
"no_event_types_found": "イベントタイプが見つかりません",
"no_event_types_found": "イベントの種類が見つかりません",
"average_event_duration": "イベントの平均時間",
"most_booked_members": "最も予約が多いメンバー",
"least_booked_members": "最も予約が少ないメンバー",
"most_booked_members": "最も予約が多いメンバー",
"least_booked_members": "最も予約が少ないメンバー",
"events_created": "イベントが作成されました",
"events_completed": "イベントが完了しました",
"events_cancelled": "イベントがキャンセルされました",
"events_rescheduled": "イベントがスケジュール変更されました",
"events_rescheduled": "イベントのスケジュールが変更されました",
"from_last_period": "最後の期間から",
"from_to_date_period": "開始{{startDate}} 終了:{{endDate}}",
"from_to_date_period": "開始: {{startDate}} 終了: {{endDate}}",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "チームのアクティビティについてさらに詳しく知る",
"redirect_url_warning": "リダイレクトを追加すると予約完了ページが無効化されます。必ずカスタムの予約完了ページで「予約が確認されました」と伝えてください。",
"event_trends": "イベントのトレンド",
"redirect_url_warning": "リダイレクトを追加すると、予約完了ページが無効化されます。カスタム予約完了ページには、必ず \"予約が完了しました\" と記載してください。",
"event_trends": "イベントの傾向",
"clear_filters": "フィルターをクリア",
"hold": "保留",
"on_booking_option": "予約の支払いを受け取る",
"hold_option": "予約不参加料金を請求",
"card_held": "カードを保留",
"charge_card": "カードに請求",
"card_charged": "カードに請求れました",
"no_show_fee_amount": "{{amount, currency}} の予約不参加料金",
"no_show_fee": "予約不参加料金",
"on_booking_option": "予約時に料金を徴収する",
"hold_option": "不参加費用を請求する",
"card_held": "カードを保留",
"charge_card": "カードに請求する",
"card_charged": "カードに請求が行われました",
"no_show_fee_amount": "不参加費用 {{amount, currency}}",
"no_show_fee": "不参加費用",
"submit_card": "カードを送信",
"submit_payment_information": "支払い情報を送信",
"meeting_awaiting_payment_method": "会議は支払い方法待ちです",
"no_show_fee_charged_email_subject": "{{date}} の {{title}} に {{amount, currency}} の予約不参加料金が請求されました",
"no_show_fee_charged_text_body": "予約不参加料金が請求されました",
"no_show_fee_charged_subtitle": "次のイベントに {{amount, currency}} の予約不参加料金が請求されました",
"error_charging_card": "予約不参加料金の請求に問題が発生しました。後でもう一度お試しください。",
"collect_no_show_fee": "予約不参加料金を受け取る",
"no_show_fee_charged": "予約不参加料金が請求されました",
"submit_payment_information": "支払い情報を送信",
"meeting_awaiting_payment_method": "会議がお支払い方法の確定を待機しています",
"no_show_fee_charged_email_subject": "{{date}} の {{title}} について不参加費用 {{amount, currency}} が請求されました",
"no_show_fee_charged_text_body": "不参加費用が請求されました",
"no_show_fee_charged_subtitle": "次のイベントについて不参加費用 {{amount, currency}} が請求されました",
"error_charging_card": "不参加費用の請求時にエラーが発生しました。後でもう一度お試しください。",
"collect_no_show_fee": "不参加費用を徴収する",
"no_show_fee_charged": "不参加費用が請求されました",
"insights": "Insights",
"testing_workflow_info_message": "このワークフローをテストする際は、少なくとも1時間前でないとメールとSMSをスケジュール設定できないことにご注意ください",
"insights_no_data_found_for_filter": "選択したフィルターまたは選択した日付のデータが見つかりません。",
"acknowledge_booking_no_show_fee": "このイベントに参加しない場合、{{amount, currency}} の予約不参加料金が私のカードに請求されることに同意します。",
"testing_workflow_info_message": "このワークフローをテストする場合、少なくとも 1 時間前でなければメールと SMS のスケジュール設定ができないことにご注意ください",
"insights_no_data_found_for_filter": "選択したフィルターまたは日付のデータが見つかりませんでした。",
"acknowledge_booking_no_show_fee": "このイベントに出席しなかった場合、不参加費用として {{amount, currency}} が私のカードに請求されることに同意します。",
"card_details": "カードの詳細",
"seats_and_no_show_fee_error": "現在、座席の有効化と予約不参加料金の請求はできません",
"seats_and_no_show_fee_error": "現在、座席の有効化と不参加費用の請求はできません",
"complete_your_booking": "予約を完了する",
"complete_your_booking_subject": "次の予約を完了する{{date}} の {{title}}",
"email_invite_team": "{{email}} 招待されました"
"complete_your_booking_subject": "次の予約を完了する: {{date}} の {{title}}",
"email_invite_team": "{{email}} 招待されました"
}

View File

@ -26,6 +26,8 @@
"rejection_confirmation": "예약 취소",
"manage_this_event": "이 이벤트 관리",
"invite_team_member": "팀원 초대",
"invite_team_individual_segment": "개인 초대",
"invite_team_bulk_segment": "일괄 가져오기",
"invite_team_notifcation_badge": "초대",
"your_event_has_been_scheduled": "귀하의 이벤트가 예약되었습니다.",
"your_event_has_been_scheduled_recurring": "되풀이 이벤트가 예약되었습니다",
@ -222,6 +224,7 @@
"go_back_login": "로그인 페이지로 돌아가기",
"error_during_login": "로그인하는 과정에서 오류가 발생했습니다. 로그인 화면으로 돌아가서 다시 한 번 시도해 보세요.",
"request_password_reset": "재설정 이메일 보내기",
"send_invite": "초대장 보내기",
"forgot_password": "비밀번호를 잊었을 경우",
"forgot": "잊어버리셨나요?",
"done": "완료",
@ -237,6 +240,7 @@
"set_availability": "언제 여유가 있는지 설정하세요.",
"continue_without_calendar": "캘린더 없이 계속하기",
"connect_your_calendar": "캘린더 연결하기",
"connect_your_video_app": "비디오 앱 연결",
"connect_your_video_app_instructions": "이벤트 타입에서 사용하기 위한 비디오 앱을 연결해주세요.",
"connect_your_calendar_instructions": "바쁜 시간과 새 이벤트 일정을 자동으로 확인할 수 있도록 캘린더 연결",
"set_up_later": "나중에 하기",
@ -368,6 +372,7 @@
"create_webhook": "웹훅 만들기",
"booking_cancelled": "예약 취소",
"booking_rescheduled": "예약 변경",
"recording_ready": "녹화 다운로드 링크 준비됨",
"booking_created": "예약 생성",
"meeting_ended": "회의 종료됨",
"form_submitted": "양식 제출됨",
@ -409,7 +414,7 @@
"add_time_availability": "새 타임 슬롯 추가",
"add_an_extra_layer_of_security": "비밀번호가 도용될 경우에 대비하여 계정에 보안방법을 추가하십시오.",
"2fa": "이중 인증",
"2fa_disabled": "이중 인증은 이메일 및 비밀번호 인증에만 사용할 수 있습니다.",
"2fa_disabled": "2단계 인증은 이메일 및 비밀번호 인증에만 사용할 수 있습니다.",
"enable_2fa": "이중 인증 활성화",
"disable_2fa": "이중 인증 비활성화",
"disable_2fa_recommendation": "2FA를 비활성화해야 하는 경우, 가능한 한 빨리 다시 활성화하십시오.",
@ -593,17 +598,17 @@
"round_robin_description": "여러 팀 구성원 간의 주기적인 회의",
"managed_event": "관리형 이벤트",
"username_placeholder": "username",
"managed_event_description": "팀원들에게 대량으로 이벤트 유형 생성 및 배포",
"managed": "관리",
"managed_event_description": "팀원들에게 대량으로 이벤트 타입 생성 및 배포",
"managed": "관리",
"managed_event_url_clarification": "\"username\"은 할당된 회원의 사용자 이름으로 채워집니다",
"assign_to": "할당:",
"add_members": "회원 추가:",
"assign_to": "할당 대상",
"add_members": "회원 추가...",
"count_members_one": "회원 {{count}}명",
"count_members_other": "회원 {{count}}명",
"no_assigned_members": "할당된 회원 없음",
"assigned_to": "할당된 이벤트 유형:",
"assigned_to": "할당된 이벤트 유형",
"start_assigning_members_above": "위에서 회원 할당 시작",
"locked_fields_admin_description": "회원 이 내용을 수정할 수 없게 됩니다",
"locked_fields_admin_description": "회원 이 내용을 수정할 수 없게 됩니다",
"locked_fields_member_description": "이 옵션은 팀 관리자에 의해 잠겼습니다",
"url": "링크",
"hidden": "숨기기",
@ -754,12 +759,16 @@
"new_event_type_to_book_description": "사람들이 시간을 예약할 수 있는 새 이벤트 타입을 만듭니다.",
"length": "길이",
"minimum_booking_notice": "최소 고지",
"offset_toggle": "오프셋 시작 시간",
"offset_toggle_description": "지정된 시간(분)으로 예약자에게 표시되는 오프셋 시간 슬롯",
"offset_start": "오프셋 기준",
"offset_start_description": "예: 이렇게 하면 예약자에게 {{ adjustedTime }}에 {{ originalTime }} 대신 시간 슬롯이 표시됨",
"slot_interval": "시간 슬롯 간격",
"slot_interval_default": "이벤트 길이 사용(기본값)",
"delete_event_type": "이벤트 타입을 삭제하시겠습니까?",
"delete_managed_event_type": "관리 이벤트 유형을 삭제하시겠습니까?",
"delete_event_type_description": "링크를 공유한 회원은 더 이상 링크를 사용하여 예약할 수 없게 됩니다.",
"delete_managed_event_type_description": "<ul><li>이 이벤트 유형에 할당된 회원은 이벤트 유형도 삭제됩니다.</li><li>링크를 공유한 회원은 더 이상 링크를 사용하여 예약할 수 없게 됩니다.</li> </ul>",
"delete_managed_event_type": "관리형 이벤트 타입을 삭제하시겠습니까?",
"delete_event_type_description": "이 링크를 공유한 회원이 더 이상 링크를 사용하여 예약할 수 없게 됩니다.",
"delete_managed_event_type_description": "<ul><li>이 이벤트 타입에 할당된 회원은 이벤트 타입도 삭제됩니다.</li><li>이 링크를 공유한 회원이 더 이상 링크를 사용하여 예약할 수 없게 됩니다.</li> </ul>",
"confirm_delete_event_type": "네, 삭제합니다",
"delete_account": "계정 삭제",
"confirm_delete_account": "예, 계정을 삭제합니다",
@ -906,6 +915,7 @@
"duplicate": "복제",
"offer_seats": "좌석 제공",
"offer_seats_description": "예약에 좌석 제공(게스트를 비활성화하고 예약을 선택함)",
"seats_available_one": "사용 가능한 좌석",
"seats_available_other": "사용 가능한 좌석",
"number_of_seats": "예약당 좌석 수",
"enter_number_of_seats": "좌석 수 입력",
@ -1157,7 +1167,7 @@
"variable_format": "변수 형식",
"webhook_subscriber_url_reserved": "웹훅 구독자 URL이 이미 정의되었습니다",
"custom_input_as_variable_info": "추가 입력 레이블의 모든 특수 문자는 무시하고(문자와 숫자만 사용) 모든 문자에 대문자를 사용하며 공백은 밑줄로 대체합니다.",
"using_booking_questions_as_variables": "예약 질문을 변수로 어떻게 사용합니까?",
"using_booking_questions_as_variables": "예약 질문을 어떻게 변수로 사용합니까?",
"download_desktop_app": "데스크탑 앱 다운로드",
"set_ping_link": "Ping 링크 설정",
"rate_limit_exceeded": "요금 한도 초과됨",
@ -1180,7 +1190,7 @@
"event_advanced_tab_title": "고급",
"event_setup_multiple_duration_error": "이벤트 설정: 복수 기간에는 최소 1개의 옵션이 필요합니다.",
"event_setup_multiple_duration_default_error": "이벤트 설정: 유효한 기본 기간을 선택하십시오.",
"event_setup_booking_limits_error": "예약 한도는 오름차순이어야 합니다. [일,주,월,년]",
"event_setup_booking_limits_error": "예약 한도는 오름차순이어야 합니다. [일, 주, 월, 년]",
"event_setup_duration_limits_error": "기간 한도는 오름차순이어야 합니다. [일, 주, 월, 년]",
"select_which_cal": "예약을 추가할 캘린더 선택",
"custom_event_name": "사용자 정의 이벤트 이름",
@ -1193,6 +1203,7 @@
"create_workflow": "워크플로를 만듭니다",
"do_this": "이렇게 하세요",
"turn_off": "끄기",
"turn_on": "켜기",
"settings_updated_successfully": "설정이 업데이트되었습니다",
"error_updating_settings": "설정 업데이트 중 오류 발생",
"personal_cal_url": "내 개인 {{appName}} URL",
@ -1203,7 +1214,7 @@
"start_of_week": "주의 시작",
"recordings_title": "녹음",
"recording": "녹음",
"happy_scheduling": "즐거운 일정 관리 되세요",
"happy_scheduling": "즐겁게 일정 관리하세요",
"select_calendars": "중복 예약을 방지하기 위해 충돌을 확인하려는 캘린더를 선택합니다.",
"check_for_conflicts": "충돌 확인",
"view_recordings": "녹음 보기",
@ -1280,11 +1291,11 @@
"attendee_name_info": "예약자 이름",
"to": "대상",
"workflow_turned_on_successfully": "{{workflowName}} 워크플로 {{offOn}} 설정 완료",
"download_responses": "다운로드 응답",
"download_responses": "응답 다운로드",
"download_responses_description": "양식에 대한 모든 응답을 CSV 형식으로 다운로드합니다.",
"download": "다운로드",
"download_recording": "기록 다운로드",
"recording_from_your_recent_call": "Cal.com에서 최근 통화 내용 녹음 파일을 다운로드 할 준비가 되었습니다",
"recording_from_your_recent_call": "Cal.com에서 이루어진 최근 통화 녹음을 지금 바로 다운로드할 수 있습니다",
"create_your_first_form": "첫 양식 작성",
"create_your_first_form_description": "라우팅 양식을 사용하면 적격성 질문을 올리고 올바른 사람 또는 이벤트 유형으로 라우팅할 수 있습니다.",
"create_your_first_webhook": "첫 웹훅 생성",
@ -1330,7 +1341,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "여기에서 생성했던 모든 양식과 경로를 볼 수 있습니다.",
"routing_forms_description": "참석자를 올바른 대상으로 안내하는 양식 만들기",
"routing_forms_send_email_owner": "소유자에게 이메일 보내기",
"routing_forms_send_email_owner_description": "양식이 제출되면 소유자에게 이메일을 발송합니다",
"add_new_form": "새 양식 추가",
@ -1384,7 +1395,7 @@
"add_limit": "제한 추가",
"team_name_required": "팀 이름 필수",
"show_attendees": "게스트 간에 참석자 정보 공유",
"how_booking_questions_as_variables": "예약 질문을 변수로 어떻게 사용합니까?",
"how_booking_questions_as_variables": "예약 질문을 어떻게 변수로 사용합니까?",
"format": "형식",
"uppercase_for_letters": "모든 문자에 대문자 사용",
"replace_whitespaces_underscores": "공백을 밑줄로 바꾸기",
@ -1399,7 +1410,7 @@
"billing_help_title": "또 필요한 것이 있나요?",
"billing_help_description": "청구와 관련하여 추가적인 도움이 필요한 경우 지원 팀이 도와드리겠습니다.",
"billing_help_cta": "지원 문의",
"ignore_special_characters_booking_questions": "예약 질문 ID의 특수 문자는 무시하십시오. 문자와 숫자만 사용하십시오",
"ignore_special_characters_booking_questions": "예약 질문 ID의 특수 문자는 무시합니다. 문자와 숫자만 사용하십시오",
"retry": "재시도",
"fetching_calendars_error": "캘린더를 가져오는 중 문제가 발생했습니다. <1>다시 시도</1>하거나 고객 지원에 문의하십시오.",
"calendar_connection_fail": "캘린더 연결 실패",
@ -1482,17 +1493,17 @@
"fixed_round_robin": "고정 라운드 로빈",
"add_one_fixed_attendee": "한 명의 고정 참석자를 추가하고 여러 참석자를 라운드 로빈 방식으로 순환합니다.",
"calcom_is_better_with_team": "Cal.com이 팀 기능으로 더욱 좋아졌습니다",
"the_calcom_team": "Cal.com 팀",
"the_calcom_team": "Cal.com 팀 드림",
"add_your_team_members": "이벤트 타입에 팀원을 추가하세요. 집단 일정 관리를 사용해 모든 사람을 포함하거나 라운드 로빈 일정 관리로 가장 적합한 인원을 찾으세요.",
"booking_limit_reached": "이 이벤트 타입에 대한 예약 한도에 도달했습니다",
"duration_limit_reached": "이 이벤트 타입에 대한 기간 한도에 도달했습니다",
"admin_has_disabled": "관리자가 {{appName}} 앱을 비활성화했습니다",
"disabled_app_affects_event_type": "관리자가 이벤트 타입 {{eventType}}에 영향을 미치는 {{appName}} 앱을 비활성화했습니다",
"event_replaced_notice": "관리자가 이벤트 유형 중 하나를 바꿨습니다",
"email_subject_slug_replacement": "팀 관리자가 당신의 이벤트 /{{slug}}를 변경하였습니다",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong> 팀의 관리자가 귀하의 이벤트 유형 <strong>/{{slug}}</strong>을(를) 관리 이벤트 유형으로 바꿨습니다.",
"event_replaced_notice": "관리자가 이벤트 타입 중 하나를 교체했습니다",
"email_subject_slug_replacement": "팀 관리자가 귀하의 이벤트 /{{slug}}를 교체했습니다",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong> 팀의 관리자가 귀하의 이벤트 타입 <strong>/{{slug}}</strong>을(를) 제어 대상인 관리형 이벤트 타입으로 교체했습니다.",
"email_body_slug_replacement_info": "링크는 계속 유효하지만 일부 설정이 변경될 수 있습니다. 이벤트 타입에서 이를 검토할 수 있습니다.",
"email_body_slug_replacement_suggestion": "이벤트 유형에 대해 질문이 있는 경우 관리자에게 문의하십시오.<br /><br />즐거운 일정 되시기 바랍니다. <br />Cal.com 팀",
"email_body_slug_replacement_suggestion": "이벤트 타입에 대한 질문이 있는 경우, 관리자에게 문의하십시오.<br /><br />즐겁게 일정 관리하세요! <br />Cal.com 팀 드림",
"disable_payment_app": "관리자가 이벤트 타입 {{title}}에 영향을 미치는 {{appName}} 앱을 비활성화했습니다. 참석자는 여전히 이러한 타입의 이벤트를 예약할 수 있지만 결제하라는 메시지는 표시되지 않습니다. 관리자가 결제 수단을 다시 활성화할 때까지 이를 방지하기 위해 이벤트 타입을 숨길 수 있습니다.",
"payment_disabled_still_able_to_book": "참석자는 여전히 이러한 타입의 이벤트를 예약할 수 있지만 결제하라는 메시지는 표시되지 않습니다. 관리자가 결제 수단을 다시 활성화할 때까지 이를 방지하기 위해 이벤트 타입을 숨길 수 있습니다.",
"app_disabled_with_event_type": "관리자가 이벤트 타입 {{title}}에 영향을 미치는 {{appName}} 앱을 비활성화했습니다.",
@ -1541,7 +1552,7 @@
"date_overrides_update_btn": "재정의 업데이트",
"event_type_duplicate_copy_text": "{{slug}}-카피",
"set_as_default": "기본값으로 설정",
"hide_eventtype_details": "이벤트 타입 세부 정보 숨기기",
"hide_eventtype_details": "이벤트 타입 세부정보 숨기기",
"show_navigation": "탐색 표시",
"hide_navigation": "탐색 숨기기",
"verification_code_sent": "인증 코드 발송됨",
@ -1555,7 +1566,7 @@
"create_your_first_team_webhook_description": "이 팀 이벤트 유형에 대한 첫 번째 웹훅 만들기",
"create_webhook_team_event_type": "이 팀 이벤트 유형에 대한 웹훅 만들기",
"disable_success_page": "예약 성공 페이지 비활성화(리디렉션 URL이 있는 경우에만 작동)",
"invalid_admin_password": "관리자이지만 비밀번호 길이가 15자 이상이 아니거나, 이중 인증이 설정되지 않았습니다",
"invalid_admin_password": "관리자이지만 비밀번호 길이가 15자 이상이 아니거나, 2단계 인증이 설정되지 않았습니다",
"change_password_admin": "관리자 액세스를 위해 비밀번호 변경",
"username_already_taken": "이미 사용 중인 사용자 이름입니다",
"assignment": "할당",
@ -1690,14 +1701,14 @@
"add_1_option_per_line": "한 줄에 옵션 1개 추가",
"select_a_router": "라우터 선택",
"add_a_new_route": "새 경로 추가",
"make_informed_decisions": "인사이트를 활용하여 정보를 바탕으로 합리적인 결정을 내려보세요",
"make_informed_decisions_description": "Insights 대시보드는 팀의 모든 활동들을 보여주고, 일정 및 의사 결정을 개선하기 위한 트렌드를 보여줍니다.",
"view_bookings_across": "모든 멤버들의 예약 내역을 조회해보세요",
"view_bookings_across_description": "가장 많은 예약을 받고 있는 멤버를 확인하고, 멤버들 간 공정한 예약 분배가 이루어지도록 해보세요",
"identify_booking_trends": "예약 트렌드 파악해보세요",
"identify_booking_trends_description": "예약자에게 인기 있는 요일 및 시간을 확인해보세요",
"spot_popular_event_types": "인기 있는 이벤트 타입을 찾아보세요",
"spot_popular_event_types_description": "어떤 이벤트 타입이 가장 많은 클릭을 받고 예약이 되고 있는지 확인해보세요",
"make_informed_decisions": "Insights를 이용해 정확한 정보에 입각한 의사 결정 내리기",
"make_informed_decisions_description": "Insights 대시보드는 팀의 모든 활동을 드러내고, 팀의 일정 관리와 의사 결정을 개선하기 위한 트렌드를 보여줍니다.",
"view_bookings_across": "모든 회원의 예약 내용 보기",
"view_bookings_across_description": "가장 많은 예약을 받고 있는 회원을 확인하고, 전체 회원 사이에 최선의 분배가 이루어지도록 보장",
"identify_booking_trends": "예약 트렌드 파악",
"identify_booking_trends_description": "예약자에게 인기 있는 요일과 시간 확인",
"spot_popular_event_types": "인기 있는 이벤트 타입 찾기",
"spot_popular_event_types_description": "어떤 이벤트 타입이 가장 많은 클릭과 예약을 받고 있는지 확인",
"no_responses_yet": "아직 응답 없음",
"this_will_be_the_placeholder": "이것은 자리 표시자가 됩니다",
"error_booking_event": "이벤트를 예약하는 도중 오류가 발생했습니다. 페이지를 새로고침한 후 다시 시도해주세요.",
@ -1708,6 +1719,7 @@
"switch_weekly": "주간 보기로 전환",
"switch_multiday": "일간 보기로 전환",
"num_locations": "{{num}}개의 위치 옵션",
"select_on_next_step": "다음 단계에 대해 선택",
"this_meeting_has_not_started_yet": "이 회의는 아직 시작되지 않았습니다",
"this_app_requires_connected_account": "{{appName}}에 연결된 {{dependencyName}} 계정이 필요합니다",
"connect_app": "{{dependencyName}} 연결",
@ -1719,25 +1731,26 @@
"timezone_variable": "시간대",
"timezone_info": "예약 수신자의 시간대",
"event_end_time_variable": "이벤트 종료 시간",
"event_end_time_info": "이벤트 종료 시간",
"event_end_time_info": "이벤트 종료되는 시간",
"cancel_url_variable": "취소 URL",
"cancel_url_info": "예약 취소 URL",
"cancel_url_info": "예약 취소를 위한 URL",
"reschedule_url_variable": "일정 변경 URL",
"reschedule_url_info": "예약 일정 변경 URL",
"reschedule_url_info": "예약 일정 변경하기 위한 URL",
"invalid_event_name_variables": "이벤트 이름에 유효하지 않은 변수가 있습니다",
"select_all": "모두 선택",
"default_conferencing_bulk_title": "기존 이벤트 타입을 일괄 업데이트",
"members_default_schedule": "회원의 기본 일정",
"set_by_admin": "팀 관리자에 의해 설정됨",
"members_default_location": "회원의 기본 위치",
"members_default_schedule_description": "각 회원의 기본 사용 가능 일정을 사용합니다. 편집 또는 변경할 수 있습니다.",
"requires_at_least_one_schedule": "적어도 한 개 이상의 스케줄이 필요합니다",
"members_default_schedule_description": "각 회원의 기본 가용성 일정을 사용합니다. 편집 또는 변경할 수 있습니다.",
"requires_at_least_one_schedule": "적어도 하나 이상의 일정이 필요합니다",
"default_conferencing_bulk_description": "선택한 이벤트 타입의 위치 업데이트",
"locked_for_members": "회원에 대해 잠김",
"locked_apps_description": "회원은 활성 앱을 볼 수 있지만 앱 설정을 편집할 수는 없습니다",
"locked_webhooks_description": "회원은 활성 웹훅을 볼 수 있지만 웹훅 설정을 편집할 수는 없습니다",
"locked_workflows_description": "회원은 활성 워크플로를 볼 수 있지만 워크플로 설정을 편집할 수는 없습니다",
"app_not_connected": "{{appName}} 계정을 연결하지 않으셨습니다.",
"locked_by_admin": "팀 관리자에 의해 잠김",
"app_not_connected": "{{appName}} 계정을 연결하지 않았습니다.",
"connect_now": "지금 연결",
"managed_event_dialog_confirm_button_one": "회원 {{count}}명 바꾸기 및 알림",
"managed_event_dialog_confirm_button_other": "회원 {{count}}명 바꾸기 및 알림",
@ -1747,8 +1760,8 @@
"managed_event_dialog_information_other": "<strong>{{names}}</strong> 님이 이미 <string>/{{slug}}</strong> url을 사용하는 중입니다.",
"managed_event_dialog_clarification": "URL 바꾸기를 선택하면 회원에게 알려드립니다. 덮어쓰지 않으려면 돌아가서 제거하십시오.",
"review_event_type": "이벤트 타입 검토",
"looking_for_more_analytics": "추가적인 분석을 원하시나요?",
"looking_for_more_insights": "더 많은 인사이트를 찾고계신가요?",
"looking_for_more_analytics": "더 많은 분석 정보를 원합니까?",
"looking_for_more_insights": "더 많은 인사이트를 찾고 있습니까?",
"add_filter": "필터 추가",
"select_user": "사용자 선택",
"select_event_type": "이벤트 타입 선택",
@ -1756,37 +1769,37 @@
"popular_events": "인기 이벤트",
"no_event_types_found": "이벤트 타입을 찾을 수 없습니다",
"average_event_duration": "평균 이벤트 기간",
"most_booked_members": "가장 많이 예약한 회원",
"least_booked_members": "가장 적게 예약한 회원",
"most_booked_members": "예약이 가장 많은 회원",
"least_booked_members": "예약이 가장 적은 회원",
"events_created": "생성된 이벤트",
"events_completed": "완료된 이벤트",
"events_cancelled": "취소된 이벤트",
"events_rescheduled": "일정이 변경된 이벤트",
"from_last_period": "마지막 기간부터",
"from_to_date_period": "시작일: {{startDate}} 종료일: {{endDate}}",
"analytics_for_organisation": "인사이트",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "팀 활동에 대해 자세히 알아보기",
"redirect_url_warning": "리디렉션을 추가하면 성공 페이지가 비활성화됩니다. 사용자 지정 성공 페이지에 \"예약 확인됨\"을 언급해야 합니다.",
"redirect_url_warning": "리디렉션을 추가하면 성공 페이지가 비활성화됩니다. 사용자 지정 성공 페이지에 \"예약 확\"을 언급해야 합니다.",
"event_trends": "이벤트 트렌드",
"clear_filters": "필터 삭제",
"clear_filters": "필터 지우기",
"hold": "보류",
"on_booking_option": "예약 시 결제 징수",
"hold_option": "노쇼 수수료 부과",
"card_held": "카드 보류됨",
"charge_card": "카드 부과",
"card_charged": "카드 부과됨",
"charge_card": "카드에 요금 부과",
"card_charged": "카드에 요금 부과됨",
"no_show_fee_amount": "{{amount, currency}} 노쇼 수수료",
"no_show_fee": "No-show 수수료",
"no_show_fee": "노쇼 수수료",
"submit_card": "카드 제출",
"submit_payment_information": "결제 정보 제출",
"meeting_awaiting_payment_method": "회의에 대한 결제 수단을 기다리는 중입니다",
"no_show_fee_charged_email_subject": "{{amount, currency}}에 대한 노쇼 수수료 부과됨: {{title}} 날짜 {{date}}",
"no_show_fee_charged_text_body": "No-show 수수료가 부과되었습니다",
"no_show_fee_charged_text_body": "노쇼 수수료가 부과되었습니다",
"no_show_fee_charged_subtitle": "다음 이벤트에 대해 {{amount, currency}}에 대한 노쇼 수수료가 부과되었습니다",
"error_charging_card": "No-show 수수료 청구 중 문제가 발생했습니다. 나중에 다시 시도해주세요.",
"collect_no_show_fee": "No-show 수수료를 청구하세요",
"no_show_fee_charged": "No-show 수수료가 부과됩니다",
"insights": "인사이트",
"error_charging_card": "노쇼 수수료를 부과하는 중 문제가 발생했습니다. 나중에 다시 시도해주세요.",
"collect_no_show_fee": "노쇼 수수료 청구",
"no_show_fee_charged": "노쇼 수수료 부과됨",
"insights": "Insights",
"testing_workflow_info_message": "이 워크플로를 테스트할 때 이메일 및 SMS는 최소 1시간 전에만 예약할 수 있다는 점에 유의하세요",
"insights_no_data_found_for_filter": "선택한 필터 또는 날짜에 대한 데이터를 찾을 수 없습니다.",
"acknowledge_booking_no_show_fee": "본인은 이 이벤트에 참석하지 않을 경우 {{amount, currency}}에 대한 노쇼 수수료가 내 카드에 부과됨을 인정합니다.",
@ -1794,15 +1807,34 @@
"seats_and_no_show_fee_error": "현재 좌석을 활성화할 수 없으므로 노쇼 수수료를 부과할 수 없습니다",
"complete_your_booking": "예약을 완료하세요",
"complete_your_booking_subject": "예약 완료: {{title}} 날짜 {{date}}",
"confirm_your_details": "세부 정보 확인",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "참석자에게 {{amount, currency}}을 청구하려고 합니다. 계속 진행하시겠습니까?",
"charge_attendee": "참석자에게 {{amount, currency}}을 청구합니다.",
"payment_app_commission": "결제가 필요합니다 (건당 수수료 {{paymentFeePercentage}}% + {{fee, currency}})",
"email_invite_team": "{{email}} 이 초대되었습니다.",
"email_invite_team": "{{email}}이(가) 초대되었습니다",
"email_invite_team_bulk": "사용자 {{userCount}}명 초대됨",
"error_collecting_card": "카드 수집 중 오류 발생",
"image_size_limit_exceed": "업로드되는 이미지의 크기는 5MB를 초과하면 안 됩니다.",
"inline_embed": "인라인 임베드",
"load_inline_content": "다른 웹 사이트 콘텐츠와 함께 이벤트 유형을 인라인으로 직접 로드합니다.",
"floating_pop_up_button": "플로팅 팝업 버튼",
"floating_button_trigger_modal": "이벤트 유형으로 모달을 트리거하는 플로팅 버튼을 사이트에 배치합니다.",
"pop_up_element_click": "요소 클릭을 통한 팝업",
"open_dialog_with_element_click": "누군가 요소를 클릭하면 Cal 대화 상자를 엽니다.",
"need_help_embedding": "도움이 필요하신가요? Wix, Squarespace, 또는 WordPress에서 Cal을 임베드하는 가이드를 참조하거나, 자주 묻는 질문을 확인하거나, 고급 임베드 옵션을 살펴보세요.",
"book_my_cal": "내 Cal 예약",
"invite_as": "다른 이름으로 초대",
"form_updated_successfully": "양식이 성공적으로 업데이트되었습니다.",
"email_not_cal_member_cta": "팀 합류",
"disable_attendees_confirmation_emails": "참석자에 대한 기본 확인 이메일 비활성화",
"disable_attendees_confirmation_emails_description": "이 이벤트 유형에는 이벤트가 예약되었을 때 참석자들에게 이메일을 보내는 최소한 하나의 워크플로가 활성화되어 있습니다.",
"disable_host_confirmation_emails": "호스트에 대한 기본 확인 이메일 비활성화",
"disable_host_confirmation_emails_description": "이 이벤트 유형에는 이벤트가 예약될 때 호스트에게 이메일을 보내는 최소한 하나의 워크플로가 활성화되어 있습니다."
"disable_host_confirmation_emails_description": "이 이벤트 유형에는 이벤트가 예약될 때 호스트에게 이메일을 보내는 최소한 하나의 워크플로가 활성화되어 있습니다.",
"add_an_override": "재정의 추가",
"import_from_google_workspace": "Google Workspace에서 사용자 가져오기",
"connect_google_workspace": "Google Workspace 연결",
"google_workspace_admin_tooltip": "이 기능을 사용하려면 Workspace 관리자여야 합니다",
"first_event_type_webhook_description": "이 이벤트 유형에 대한 첫 번째 웹훅 만들기",
"create_for": "작성 대상"
}

View File

@ -755,7 +755,7 @@
"slot_interval": "Tijdslot intervallen",
"slot_interval_default": "Gebruik evenement lengte (standaard)",
"delete_event_type": "Gebeurtenistype verwijderen?",
"delete_managed_event_type": "Beheerd gebeurtenistype verwijderen?",
"delete_managed_event_type": "Type beheerde gebeurtenis verwijderen?",
"delete_event_type_description": "Iedereen met wie u deze link hebt gedeeld, kan niet meer boeken via deze link.",
"delete_managed_event_type_description": "<ul><li>De gebeurtenistypen van leden die aan dit gebeurtenistype zijn toegewezen, worden ook verwijderd.</li><li>Iedereen met wie zij hun link hebben gedeeld, kan niet meer boeken via deze link.</li></ul>",
"confirm_delete_event_type": "Ja, verwijderen",
@ -1148,7 +1148,7 @@
"current_username": "Huidige gebruikersnaam",
"example_1": "Voorbeeld 1",
"example_2": "Voorbeeld 2",
"booking_question_identifier": "Boekingsvraagidentificatiecode",
"booking_question_identifier": "Boekingsvraag-ID",
"company_size": "Bedrijfsgrootte",
"what_help_needed": "Waar heeft u hulp bij nodig?",
"variable_format": "Variabele indeling",
@ -1280,7 +1280,7 @@
"download_responses_description": "Download alle reacties op uw formulier in CSV-indeling.",
"download": "Downloaden",
"download_recording": "Opname downloaden",
"recording_from_your_recent_call": "Een opname van uw recente gesprek op Cal.com is klaar voor download",
"recording_from_your_recent_call": "Een opname van uw recente gesprek op Cal.com is klaar om te downloaden",
"create_your_first_form": "Maak uw eerste formulier",
"create_your_first_form_description": "Met routeringsformulieren kunt u kwalificerende vragen stellen en doorverwijzen naar de juiste persoon of het juiste type gebeurtenis.",
"create_your_first_webhook": "Maak uw eerste webhook",
@ -1326,7 +1326,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "U kunt hier alle formulieren en routes zien die u heeft gemaakt.",
"routing_forms_description": "Maak formulieren om deelnemers naar de juiste bestemmingen te verwijzen",
"routing_forms_send_email_owner": "E-mail naar eigenaar versturen",
"routing_forms_send_email_owner_description": "Verstuurt een e-mail naar de eigenaar wanneer het formulier is verzonden",
"add_new_form": "Nieuw formulier toevoegen",
@ -1395,7 +1395,7 @@
"billing_help_title": "Nog iets nodig?",
"billing_help_description": "Als u verder nog hulp nodig heeft bij de facturering, is ons ondersteuningsteam er om u te helpen.",
"billing_help_cta": "Contact opnemen met de ondersteuning",
"ignore_special_characters_booking_questions": "Negeer speciale tekens in uw boekingsvraagidentificatiecode. Gebruik alleen letters en cijfers",
"ignore_special_characters_booking_questions": "Negeer speciale tekens in uw boekingsvraag-ID. Gebruik alleen letters en cijfers",
"retry": "Opnieuw proberen",
"fetching_calendars_error": "Er is een probleem opgetreden bij het ophalen van uw agenda's. <1>Probeer het opnieuw</1> of neem contact op met de klantenservice.",
"calendar_connection_fail": "Agendaverbinding mislukt",
@ -1486,9 +1486,9 @@
"disabled_app_affects_event_type": "Een beheerder heeft {{appName}} uitgeschakeld die van invloed is op uw gebeurtenistype {{eventType}}",
"event_replaced_notice": "Een beheerder heeft een van uw gebeurtenistypen vervangen",
"email_subject_slug_replacement": "Een teambeheerder heeft uw gebeurtenis vervangen /{{slug}}",
"email_body_slug_replacement_notice": "Een beheerder van het team <strong>{{teamName}}</strong> heeft uw gebeurtenistype <strong>/{{slug}}</strong> vervangen door een beheerd gebeurtenistype dat de beheerder beheert.",
"email_body_slug_replacement_notice": "Een beheerder van het team <strong>{{teamName}}</strong> heeft uw gebeurtenistype <strong>/{{slug}}</strong> vervangen door een type beheerde gebeurtenis dat deze beheert.",
"email_body_slug_replacement_info": "Uw link blijft werken, maar sommige instellingen ervoor kunnen gewijzigd zijn. U kunt deze bekijken in gebeurtenistypen.",
"email_body_slug_replacement_suggestion": "Neem contact op met uw beheerder als u vragen heeft over het gebeurtenistype.<br /><br />Veel plezier met plannen, <br />Het Cal.com-team",
"email_body_slug_replacement_suggestion": "Neem contact op met uw beheerder als u vragen hebt over het gebeurtenistype.<br /><br />Veel plezier met plannen, <br />Het Cal.com-team",
"disable_payment_app": "De beheerder heeft {{appName}} uitgeschakeld die van invloed is op uw gebeurtenistype {{title}}. Deelnemers kunnen dit tyoe gebeurtenissen nog steeds boeken, maar worden niet gevraagd te betalen. U kunt het gebeurtenistype verbergen om dit te voorkomen totdat uw beheerde de betaalmethode opnieuw inschakelt.",
"payment_disabled_still_able_to_book": "Deelnemers kunnen dit type gebeurtenis nog steeds boeken, maar worden niet gevraagd te betalen. U kunt het gebeurtenistype verbergen om dit te voorkomen totdat uw beheerde de betaalmethode opnieuw inschakelt.",
"app_disabled_with_event_type": "De beheerder heeft {{appName}} uitgeschakeld die van invloed is op uw gebeurtenistype {{title}}.",
@ -1551,7 +1551,7 @@
"create_your_first_team_webhook_description": "Maak uw eerste webhook voor dit teamgebeurtenistype",
"create_webhook_team_event_type": "Maak een webhook voor dit teamgebeurtenistype",
"disable_success_page": "Succespagina uitschakelen (werkt alleen als u een omleidings-URL heeft)",
"invalid_admin_password": "U bent beheerder, maar u heeft geen wachtwoord van minimaal 15 tekens of nog geen tweestapsverificatie",
"invalid_admin_password": "U bent beheerder, maar u hebt geen wachtwoord van minimaal 15 tekens of nog geen tweestapsverificatie",
"change_password_admin": "Wijzig het wachtwoord om beheerderstoegang te krijgen",
"username_already_taken": "De gebruikersnaam is al in gebruik",
"assignment": "Toewijzing",
@ -1661,7 +1661,7 @@
"not_enough_seats": "Onvoldoende plaatsen",
"form_builder_field_already_exists": "Een veld met deze naam bestaat al",
"form_builder_field_add_subtitle": "Pas de gestelde vragen op de boekingspagina aan",
"show_on_booking_page": "Op boekingspagina weergeven",
"show_on_booking_page": "Weergeven op boekingspagina",
"get_started_zapier_templates": "Aan de slag met Zapier-sjablonen",
"team_is_unpublished": "{{team}} is niet gepubliceerd",
"team_is_unpublished_description": "Deze teamlink is momenteel niet beschikbaar. Neem contact op met de teameigenaar of vraag hem het te publiceren.",
@ -1685,13 +1685,13 @@
"add_1_option_per_line": "Voeg 1 optie per regel toe",
"select_a_router": "Selecteer een router",
"add_a_new_route": "Voeg een nieuwe route toe",
"make_informed_decisions": "Maak geïnformeerde beslissingen met Insights",
"make_informed_decisions": "Neem geïnformeerde beslissingen met Insights",
"make_informed_decisions_description": "Ons Insights-dashboard geeft alle activiteiten in uw team weer en toont u trends die betere teamplanning en besluitvorming mogelijk maken.",
"view_bookings_across": "Boekingen van alle leden weergeven",
"view_bookings_across": "Geef boekingen van alle leden weer",
"view_bookings_across_description": "Bekijk wie het meest geboekt wordt en zorg voor de beste verdeling over uw team",
"identify_booking_trends": "Boekingstrends identificeren",
"identify_booking_trends": "Identificeer boekingstrends",
"identify_booking_trends_description": "Bekijk welke tijden van de week en welke tijden overdag populair zijn voor uw boekers",
"spot_popular_event_types": "Populaire gebeurtenistypen spotten",
"spot_popular_event_types": "Spot populaire gebeurtenistypen",
"spot_popular_event_types_description": "Bekijk welke van uw gebeurtenistypen de meeste kliks en boekingen ontvangen",
"no_responses_yet": "Nog geen reacties",
"this_will_be_the_placeholder": "Dit wordt de plaatshouder",
@ -1717,14 +1717,14 @@
"members_default_schedule": "Standaardschema lid",
"set_by_admin": "Ingesteld door teambeheerder",
"members_default_location": "Standaardlocatie lid",
"members_default_schedule_description": "Wij gebruiken de standaard beschikbaarheidsplanning van elk lid. Ze kunnen dit bewerken of wijzigen.",
"members_default_schedule_description": "Wij gebruiken de standaard beschikbaarheidsplanning van elk lid. Leden kunnen dit bewerken of wijzigen.",
"requires_at_least_one_schedule": "U moet ten minste één planning hebben",
"default_conferencing_bulk_description": "Werk de locaties voor de geselecteerde gebeurtenistypen bij",
"locked_for_members": "Vergrendeld voor leden",
"locked_apps_description": "Leden kunnen de actieve apps zien, maar kunnen geen appinstellingen bewerken",
"locked_webhooks_description": "Leden kunnen de actieve webhooks zien, maar kunnen geen webhookinstellingen bewerken",
"locked_workflows_description": "Leden kunnen de actieve werkstromen zien, maar kunnen geen werkstroominstellingen bewerken",
"app_not_connected": "U heeft geen {{appName}}-account gekoppeld.",
"app_not_connected": "U hebt geen {{appName}}-account gekoppeld.",
"connect_now": "Nu koppelen",
"managed_event_dialog_confirm_button_one": "{{count}} lid vervangen en informeren",
"managed_event_dialog_confirm_button_other": "{{count}} leden vervangen en informeren",
@ -1732,20 +1732,20 @@
"managed_event_dialog_title_other": "De URL /{{slug}} bestaat al voor {{count}} leden. Wilt u deze vervangen?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> gebruikt al de URL <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> gebruiken al de URL <string>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "Als u ervoor kiest om het te vervangen, informeren wij hen daar over. Ga terug en verwijder ze als u ze niet wilt overschrijven.",
"managed_event_dialog_clarification": "Als u ervoor kiest om de URL te vervangen, informeren wij de leden daarover. Ga terug en verwijder ze als u de URL niet wilt overschrijven.",
"review_event_type": "Gebeurtenistype bekijken",
"looking_for_more_analytics": "Op zoek naar meer analyses?",
"looking_for_more_insights": "Op zoek naar meer Insights?",
"add_filter": "Filter toevoegen",
"select_user": "Gebruiker selecteren",
"select_event_type": "Gebeurtenistype selecteren",
"select_date_range": "Datumbereik selecteren",
"select_user": "Selecteer gebruiker",
"select_event_type": "Selecteer gebeurtenistype",
"select_date_range": "Selecteer datumbereik",
"popular_events": "Populaire gebeurtenissen",
"no_event_types_found": "Geen gebeurtenistypen gevonden",
"average_event_duration": "Gemiddelde gebeurtenisduur",
"most_booked_members": "Meest geboekte leden",
"least_booked_members": "Minst geboekte leden",
"events_created": "Gemaakt gebeurtenissen",
"events_created": "Gemaakte gebeurtenissen",
"events_completed": "Voltooide gebeurtenissen",
"events_cancelled": "Geannuleerde gebeurtenissen",
"events_rescheduled": "Verplaatste gebeurtenissen",
@ -1757,21 +1757,21 @@
"event_trends": "Gebeurtenistrends",
"clear_filters": "Filters wissen",
"hold": "Vasthouden",
"on_booking_option": "Ontvang betaling bij boeking",
"on_booking_option": "Betaling ontvangen bij boeken",
"hold_option": "Afwezigheidsvergoeding in rekening brengen",
"card_held": "Kaart vastgehouden",
"card_held": "Kaartbetaling vastgehouden",
"charge_card": "In rekening brengen op kaart",
"card_charged": "In rekening gebracht op kaart",
"no_show_fee_amount": "{{amount, currency}} afwezigheidsvergoeding",
"no_show_fee": "Afwezigheidsvergoeding",
"submit_card": "Kaart versturen",
"submit_payment_information": "Betaalgegevens versturen",
"submit_card": "Kaart verzenden",
"submit_payment_information": "Betaalgegevens verzenden",
"meeting_awaiting_payment_method": "Uw vergadering wacht op een betaalmethode",
"no_show_fee_charged_email_subject": "Afwezigheidsvergoeding van {{amount, currency}} in rekening gebracht voor {{title}} om {{date}}",
"no_show_fee_charged_text_body": "Afwezigheidsvergoeding is in rekening gebracht",
"no_show_fee_charged_subtitle": "Er is een afwezigheidsvergoeding van {{amount, currency}} in rekening gebracht voor de volgende gebeurtenis",
"error_charging_card": "Er is iets misgegaan met het in rekening brengen van de afwezigheidsvergoeding. Probeer het later opnieuw.",
"collect_no_show_fee": "Afwezigheidsvergoeding ontvangen",
"collect_no_show_fee": "Afwezigheidsvergoeding innen",
"no_show_fee_charged": "Afwezigheidsvergoeding in rekening gebracht",
"insights": "Insights",
"testing_workflow_info_message": "Let er bij het testen van deze werkstroom op dat e-mails en sms minimaal 1 uur van tevoren kunnen gepland moeten worden",

View File

@ -26,6 +26,7 @@
"rejection_confirmation": "Odrzuć prośbę o rezerwację",
"manage_this_event": "Zarządzaj wydarzeniem",
"invite_team_member": "Zaproś członka zespołu",
"invite_team_bulk_segment": "Import zbiorczy",
"invite_team_notifcation_badge": "Zap.",
"your_event_has_been_scheduled": "Zaplanowano wydarzenie",
"your_event_has_been_scheduled_recurring": "Twoje wydarzenie cykliczne zostało zaplanowane",
@ -222,6 +223,7 @@
"go_back_login": "Wróć na stronę logowania",
"error_during_login": "Wystąpił błąd podczas logowania. Wróć do ekranu logowania i spróbuj ponownie.",
"request_password_reset": "Wyślij wiadomość e-mail umożliwiającą zresetowanie",
"send_invite": "Wyślij zaproszenie",
"forgot_password": "Nie pamiętasz hasła?",
"forgot": "Nie pamiętasz?",
"done": "Gotowe",
@ -237,6 +239,8 @@
"set_availability": "Ustaw swoją dostępność",
"continue_without_calendar": "Kontynuuj bez kalendarza",
"connect_your_calendar": "Połącz swój kalendarz",
"connect_your_video_app": "Połącz aplikacje wideo",
"connect_your_video_app_instructions": "Podłącz aplikacje wideo, aby korzystać z ich w swoich typach wydarzeń.",
"connect_your_calendar_instructions": "Podłącz swój kalendarz do automatycznego sprawdzania dostępności i nowych wydarzeń, zgodnie z planem.",
"set_up_later": "Skonfiguruj później",
"current_time": "Aktualny czas",
@ -367,6 +371,7 @@
"create_webhook": "Utwórz Webhook",
"booking_cancelled": "Rezerwacja anulowana",
"booking_rescheduled": "Rezerwacja Przełożona",
"recording_ready": "Link do pobrania nagrania gotowy",
"booking_created": "Rezerwacja Utworzona",
"meeting_ended": "Spotkanie zakończone",
"form_submitted": "Przesłano formularz",
@ -465,6 +470,7 @@
"friday": "Piątek",
"saturday": "Sobota",
"sunday": "Niedziela",
"all_booked_today": "Wszystko zarezerwowane.",
"slots_load_fail": "Nie można załadować dostępnych przedziałów czasu.",
"additional_guests": "Dodaj gości",
"your_name": "Twoje imię",
@ -752,6 +758,9 @@
"new_event_type_to_book_description": "Utwórz nowy typ wydarzenia, z którym ludzie mogą rezerwować czasy.",
"length": "Długość",
"minimum_booking_notice": "Minimalne powiadomienie",
"offset_toggle": "Opóźnij czasy rozpoczęcia",
"offset_toggle_description": "Przesuń przedziały czasowe wyświetlane rezerwującym o określoną liczbę minut",
"offset_start": "Przesuń o",
"slot_interval": "Przedziały czasowe",
"slot_interval_default": "Użyj długości zdarzenia (domyślnie)",
"delete_event_type": "Usunąć typ wydarzenia?",
@ -904,6 +913,7 @@
"duplicate": "Duplikat",
"offer_seats": "Zaproponuj miejsca",
"offer_seats_description": "Zaoferuj miejsca do zarezerwowania. To automatycznie wyłącza rezerwacje gości i rezerwacje wstępne.",
"seats_available_one": "Dostępne miejsce",
"seats_available_other": "Dostępne miejsca",
"number_of_seats": "Liczba miejsc na rezerwację",
"enter_number_of_seats": "Wprowadź liczbę miejsc",
@ -1038,6 +1048,7 @@
"event_cancelled_trigger": "gdy wydarzenie zostanie odwołane",
"new_event_trigger": "gdy nowe wydarzenie zostanie zarezerwowane",
"email_host_action": "wyślij wiadomość e-mail do hosta",
"email_attendee_action": "wyślij wiadomość e-mail do uczestników",
"sms_attendee_action": "wyślij SMS do uczestnika",
"sms_number_action": "wyślij wiadomość SMS na określony numer",
"workflows": "Przepływy pracy",
@ -1190,6 +1201,7 @@
"create_workflow": "Utwórz przepływ pracy",
"do_this": "Zrób to",
"turn_off": "Wyłącz",
"turn_on": "Włącz",
"settings_updated_successfully": "Ustawienia zaktualizowane pomyślnie",
"error_updating_settings": "Błąd podczas aktualizacji ustawień",
"personal_cal_url": "Mój osobisty adres URL aplikacji {{appName}}",
@ -1246,6 +1258,7 @@
"calendars_description": "Skonfiguruj sposoby interakcji typów wydarzeń z kalendarzami",
"appearance_description": "Zarządzaj ustawieniami wyglądu rezerwacji",
"conferencing_description": "Dodaj ulubione aplikacje do wideokonferencji, aby umożliwić korzystanie z nich podczas spotkań",
"add_conferencing_app": "Dodaj aplikację konferencyjną",
"password_description": "Zarządzaj ustawieniami haseł do kont",
"2fa_description": "Zarządzaj ustawieniami haseł do kont",
"we_just_need_basic_info": "Potrzebujemy podstawowych informacji, aby skonfigurować Twój profil.",
@ -1695,6 +1708,14 @@
"spot_popular_event_types_description": "Zobacz, które typy wydarzeń są najczęściej klikane i rezerwowane",
"no_responses_yet": "Nie ma jeszcze odpowiedzi",
"this_will_be_the_placeholder": "To będzie symbol zastępczy",
"timeslot_missing_title": "Nie wybrano przedziału czasowego",
"timeslot_missing_description": "Wybierz przedział czasowy, aby zarezerwować wydarzenie.",
"timeslot_missing_cta": "Wybierz przedział czasowy",
"switch_monthly": "Przełącz na widok miesięczny",
"switch_weekly": "Przełącz na widok tygodniowy",
"switch_multiday": "Przełącz na widok dzienny",
"num_locations": "Lokalizacje do wyboru: {{num}}",
"select_on_next_step": "Wybierz następny krok",
"this_meeting_has_not_started_yet": "To spotkanie jeszcze się nie rozpoczęło",
"this_app_requires_connected_account": "Aplikacja {{appName}} wymaga podłączonego konta {{dependencyName}}",
"connect_app": "Podłącz {{dependencyName}}",
@ -1724,6 +1745,7 @@
"locked_apps_description": "Członkowie będą mogli sprawdzić aktywne aplikacje, ale nie będą mogli edytować ich ustawień",
"locked_webhooks_description": "Członkowie będą mogli sprawdzić aktywne webhooki, ale nie będą mogli edytować ich ustawień",
"locked_workflows_description": "Członkowie będą mogli sprawdzić aktywne przepływy pracy, ale nie będą mogli edytować ich ustawień",
"locked_by_admin": "Zablokowane przez administratora zespołu",
"app_not_connected": "Nie podłączono konta {{appName}}.",
"connect_now": "Podłącz teraz",
"managed_event_dialog_confirm_button_one": "Zastąp i poinformuj {{count}} członka",
@ -1781,5 +1803,20 @@
"seats_and_no_show_fee_error": "Obecnie nie można udostępnić miejsc ani naliczyć opłaty za niestawienie się.",
"complete_your_booking": "Ukończ rezerwację",
"complete_your_booking_subject": "Ukończ rezerwację: {{title}} dnia {{date}}",
"email_invite_team": "Zaproszono {{email}}"
"confirm_your_details": "Potwierdź swoje dane",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "Zamierzasz obciążyć uczestnika kwotą {{amount, currency}}. Czy na pewno chcesz kontynuować?",
"charge_attendee": "Pobierz od uczestnika opłatę w wysokości {{amount, currency}}",
"payment_app_commission": "Wymagaj płatności ({{paymentFeePercentage}}% + {{fee, currency}} prowizji od transakcji)",
"email_invite_team": "Zaproszono {{email}}",
"email_invite_team_bulk": "Zaproszono {{userCount}} użytkowników",
"error_collecting_card": "Błąd podczas pobierania karty",
"image_size_limit_exceed": "Przesłany obraz nie powinien być większy niż 5 MB.",
"floating_pop_up_button": "Pływający przycisk wyskakujący",
"invite_as": "Zaproś jako",
"form_updated_successfully": "Formularz zaktualizowany pomyślnie.",
"email_not_cal_member_cta": "Dołącz do zespołu",
"add_an_override": "Dodaj zastąpienie",
"import_from_google_workspace": "Importuj użytkowników z usługi Google Workspace",
"create_for": "Utwórz dla"
}

View File

@ -1326,7 +1326,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Você pode ver todos os formulários e rotas que criou aqui.",
"routing_forms_description": "Você pode ver todos os formulários e rotas que criou aqui",
"routing_forms_send_email_owner": "Enviar e-mail ao proprietário",
"routing_forms_send_email_owner_description": "Envia um e-mail ao proprietário após o envio do formulário",
"add_new_form": "Adicionar novo formulário",
@ -1686,7 +1686,7 @@
"select_a_router": "Selecione um formulário de roteamento",
"add_a_new_route": "Adicione uma nova Rota",
"make_informed_decisions": "Tome decisões conscientes com o Insights",
"make_informed_decisions_description": "Nosso painel de informações do Insights traz à tona todas as atividades da sua equipe e mostra as tendências que permitem melhor tomada de decisão e agendamento da equipe.",
"make_informed_decisions_description": "Nosso painel de informações do Insights apresenta todas as atividades da sua equipe e mostra as tendências que permitem melhor tomada de decisão e agendamento da equipe.",
"view_bookings_across": "Ver reservas em todos os membros",
"view_bookings_across_description": "Veja quem está recebendo a maioria das reservas e garanta a melhor distribuição para a sua equipe",
"identify_booking_trends": "Identificar tendências de reserva",
@ -1708,9 +1708,9 @@
"event_end_time_variable": "Horário de término do evento",
"event_end_time_info": "O horário de término do evento",
"cancel_url_variable": "Cancelar URL",
"cancel_url_info": "A URL para cancelar a reserva",
"cancel_url_info": "O URL para cancelar a reserva",
"reschedule_url_variable": "URL de reagendamento",
"reschedule_url_info": "A URL para reagendar a reserva",
"reschedule_url_info": "O URL para reagendar a reserva",
"invalid_event_name_variables": "Há uma variável inválida no seu nome do evento",
"select_all": "Selecionar tudo",
"default_conferencing_bulk_title": "Atualize em massa os tipos de evento existentes",

View File

@ -26,6 +26,8 @@
"rejection_confirmation": "Rejeitar a reserva",
"manage_this_event": "Gerir este evento",
"invite_team_member": "Convidar membro da equipa",
"invite_team_individual_segment": "Convidar indivíduo",
"invite_team_bulk_segment": "Importação em conjunto",
"invite_team_notifcation_badge": "Conv.",
"your_event_has_been_scheduled": "O seu evento foi agendado",
"your_event_has_been_scheduled_recurring": "O seu evento recorrente foi agendado",
@ -222,6 +224,7 @@
"go_back_login": "Voltar à página de início de sessão",
"error_during_login": "Ocorreu um erro ao iniciar sessão. Volte ao ecrã de início de sessão e tente de novo.",
"request_password_reset": "Pedir restauro da palavra-passe",
"send_invite": "Enviar convite",
"forgot_password": "Esqueceu a palavra-passe?",
"forgot": "Esqueceu-se?",
"done": "Concluído",
@ -237,6 +240,8 @@
"set_availability": "Definir disponibilidade",
"continue_without_calendar": "Continuar sem calendário",
"connect_your_calendar": "Ligar o seu calendário",
"connect_your_video_app": "Associar as suas aplicações de vídeo",
"connect_your_video_app_instructions": "Associe as suas aplicações de vídeo para utilizar as mesmas nos tipos de eventos.",
"connect_your_calendar_instructions": "Ligue o seu calendário para verificar automaticamente as horas ocupadas e os novos eventos à medida que são agendados.",
"set_up_later": "Configurar mais tarde",
"current_time": "Hora atual",
@ -367,6 +372,7 @@
"create_webhook": "Criar Webhook",
"booking_cancelled": "Reserva Cancelada",
"booking_rescheduled": "Reserva Reagendada",
"recording_ready": "Ligação de transferência da gravação pronta",
"booking_created": "Reserva Criada",
"meeting_ended": "A reunião terminou",
"form_submitted": "Formulário enviado",
@ -465,6 +471,7 @@
"friday": "Sexta-Feira",
"saturday": "Sábado",
"sunday": "Domingo",
"all_booked_today": "Tudo reservado.",
"slots_load_fail": "Não foi possível carregar os horários disponíveis.",
"additional_guests": "+ Convidados Adicionais",
"your_name": "O seu nome",
@ -752,6 +759,10 @@
"new_event_type_to_book_description": "Crie um novo tipo de evento para as pessoas reservarem uma hora.",
"length": "Comprimento",
"minimum_booking_notice": "Aviso de mínimo",
"offset_toggle": "Desfasamento dos horários de início",
"offset_toggle_description": "Desfasar janelas horárias por um determinado número de minutos na apresentação das mesmas aos responsáveis pela reserva",
"offset_start": "Desfasamento de",
"offset_start_description": "por exemplo, irá mostrar as janelas horárias aos responsáveis pelas reservas às {{ adjustedTime }} em vez de {{ originalTime }}",
"slot_interval": "Intervalos do horário",
"slot_interval_default": "Usar duração do evento (por omissão)",
"delete_event_type": "Eliminar tipo de evento?",
@ -904,6 +915,7 @@
"duplicate": "Duplicar",
"offer_seats": "Oferecer lugares",
"offer_seats_description": "Oferecer lugares para reservas (isto desactiva os convidados e confirmações nas reservas)",
"seats_available_one": "Lugar disponível",
"seats_available_other": "Lugares disponíveis",
"number_of_seats": "Número de lugares por reserva",
"enter_number_of_seats": "Digite um número de lugares",
@ -1038,6 +1050,7 @@
"event_cancelled_trigger": "quando o evento for cancelado",
"new_event_trigger": "quando um novo evento for reservado",
"email_host_action": "enviar email ao anfitrião",
"email_attendee_action": "enviar e-mail aos participantes",
"sms_attendee_action": "enviar SMS ao participante",
"sms_number_action": "enviar SMS para um número específico",
"workflows": "Fluxos de trabalho",
@ -1190,6 +1203,7 @@
"create_workflow": "Criar um fluxo de trabalho",
"do_this": "Fazer isto",
"turn_off": "Desligar",
"turn_on": "Ativar",
"settings_updated_successfully": "Definições atualizadas com sucesso",
"error_updating_settings": "Erro ao atualizar as definições",
"personal_cal_url": "O meu endereço pessoal do {{appName}}",
@ -1246,6 +1260,7 @@
"calendars_description": "Configure como os tipos de evento devem interagir com os seus calendários",
"appearance_description": "Faça a gestão das definições de aparência da sua reserva",
"conferencing_description": "Adicione as suas aplicações de videoconferência para reuniões",
"add_conferencing_app": "Adicionar aplicação de conferência",
"password_description": "Faça a gestão das definições para as palavras-passe da sua conta",
"2fa_description": "Faça a gestão das definições para as palavras-passe da sua conta",
"we_just_need_basic_info": "Precisamos apenas de algumas informações básicas para configurar o seu perfil.",
@ -1620,6 +1635,7 @@
"email_user_cta": "Ver convite",
"email_no_user_invite_heading": "Recebeu um convite para fazer parte de uma equipa em {{appName}}",
"email_no_user_invite_subheading": "Recebeu um convite de {{invitedBy}} para fazer parte da respetiva equipa em {{appName}}. {{appName}} é um ferramenta de conciliação e agendamento de eventos que lhe permite a si e à sua equipa agendar reuniões sem o pingue-pongue de e-mails.",
"email_user_invite_subheading": "Recebeu um convite de {{invitedBy}} para fazer parte da equipa `{{teamName}}` em {{appName}}. {{appName}} é uma ferramenta de conciliação e agendamento de eventos que lhe permite a si e à sua equipa agendar reuniões sem o pingue-pongue de mensagens eletrónicas.",
"email_no_user_invite_steps_intro": "Vamos ajudar com alguns pequenos passos para que você e a sua equipa possam desfrutar rapidamente de uma gestão de agendamentos sem complicações.",
"email_no_user_step_one": "Escolha o seu nome de utilizador",
"email_no_user_step_two": "Associe a sua conta de calendário",
@ -1695,6 +1711,15 @@
"spot_popular_event_types_description": "Veja quais os tipos de eventos que estão a receber mais cliques e reservas",
"no_responses_yet": "Ainda sem respostas",
"this_will_be_the_placeholder": "Isto será o marcador de posição",
"error_booking_event": "Ocorreu um erro ao reservar o evento. Atualize a página e tente novamente",
"timeslot_missing_title": "Nenhuma janela horária selecionada",
"timeslot_missing_description": "Selecione uma janela horária para reservar o evento.",
"timeslot_missing_cta": "Selecionar janela horária",
"switch_monthly": "Mudar para a vista mensal",
"switch_weekly": "Mudar para a vista semanal",
"switch_multiday": "Mudar para a vista diária",
"num_locations": "{{num}} opções de localização",
"select_on_next_step": "Selecione no próximo passo",
"this_meeting_has_not_started_yet": "Esta reunião ainda não começou",
"this_app_requires_connected_account": "{{appName}} requer a associação de uma conta {{dependencyName}}",
"connect_app": "Associar {{dependencyName}}",
@ -1724,6 +1749,7 @@
"locked_apps_description": "Os membros poderão ver as aplicações ativas, mas não poderão editar quaisquer configurações das aplicações",
"locked_webhooks_description": "Os membros poderão ver os webhooks ativos, mas não poderão editar quaisquer configurações dos webhooks",
"locked_workflows_description": "Os membros poderão ver os fluxos de trabalho ativos, mas não poderão editar quaisquer configurações dos fluxos de trabalho",
"locked_by_admin": "Bloqueado pelo administrador da equipa",
"app_not_connected": "Não associou uma conta {{appName}}.",
"connect_now": "Associar agora",
"managed_event_dialog_confirm_button_one": "Substituir e notificar {{count}} membro",
@ -1781,5 +1807,34 @@
"seats_and_no_show_fee_error": "Atualmente, não é possível ativar lugares e cobrar uma taxa de não-comparência",
"complete_your_booking": "Concluir a sua reserva",
"complete_your_booking_subject": "Concluir a sua reserva: {{title}} a {{date}}",
"email_invite_team": "{{email}} foi convidado/a"
"confirm_your_details": "Confirme os seus dados",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "Está em vias de cobrar {{amount, currency}} ao participante. Tem a certeza que pretende continuar?",
"charge_attendee": "Cobrar {{amount, currency}} ao participante",
"payment_app_commission": "Exigir pagamento ({{paymentFeePercentage}}% + {{fee, currency}} de comissão por transação)",
"email_invite_team": "{{email}} foi convidado/a",
"email_invite_team_bulk": "Foram convidados {{userCount}} utilizadores",
"error_collecting_card": "Erro ao recolher o cartão",
"image_size_limit_exceed": "A imagem enviada não deve exceder o limite de tamanho de 5 mb",
"inline_embed": "Incorporação em linha",
"load_inline_content": "Carrega o seu tipo de evento diretamente e em linha, em conjunto com os conteúdos do seu outro site.",
"floating_pop_up_button": "Botão pop-up flutuante",
"floating_button_trigger_modal": "Coloca um botão flutuante no seu site que ativa uma modal com o seu tipo de evento.",
"pop_up_element_click": "Pop-up via clique no elemento",
"open_dialog_with_element_click": "Abra a sua janela do Cal quando alguém clicar num elemento.",
"need_help_embedding": "Precisa de ajuda? Consulte os nossos guias para incorporar o Cal no Wix, Squarespace, ou WordPress. Consulte ainda as nossas perguntas frequentes ou explore opções avançadas de incorporação.",
"book_my_cal": "Reservar o meu Cal",
"invite_as": "Convidar como",
"form_updated_successfully": "Formulário atualizado com sucesso.",
"email_not_cal_member_cta": "Inscreva a sua equipa",
"disable_attendees_confirmation_emails": "Desativar mensagens eletrónicas de confirmação predefinidas para participantes",
"disable_attendees_confirmation_emails_description": "Está ativo pelo menos um fluxo de trabalho neste tipo de evento que envia um e-mail para os participantes quando o evento é reservado.",
"disable_host_confirmation_emails": "Desativar mensagens eletrónicas de confirmação predefinidas para o anfitrião",
"disable_host_confirmation_emails_description": "Está ativo pelo menos um fluxo de trabalho neste tipo de evento que envia um e-mail para o anfitrião quando o evento é reservado.",
"add_an_override": "Adicionar uma sobreposição",
"import_from_google_workspace": "Importar utilizadores do Google Workspace",
"connect_google_workspace": "Associar o Google Workspace",
"google_workspace_admin_tooltip": "Deve ser um Administrador do Workspace para utilizar esta funcionalidade",
"first_event_type_webhook_description": "Crie o seu primeiro webhook para este tipo de evento",
"create_for": "Criar para"
}

View File

@ -70,7 +70,7 @@
"event_awaiting_approval_subject": "Ожидает подтверждения: {{title}} на {{date}}",
"event_still_awaiting_approval": "Событие все еще ждет вашего подтверждения",
"booking_submitted_subject": "Бронирование отправлено: {{title}}, {{date}}",
"download_recording_subject": "Скачать запись: {{title}} от {{date}}",
"download_recording_subject": "Скачайте запись: {{title}}, {{date}}",
"download_your_recording": "Скачать запись",
"your_meeting_has_been_booked": "Ваша встреча была забронирована",
"event_type_has_been_rescheduled_on_time_date": "Ваше {{title}} было перенесено на {{date}}.",
@ -408,7 +408,7 @@
"add_time_availability": "Добавить новый интервал времени",
"add_an_extra_layer_of_security": "Добавьте дополнительный уровень безопасности в свою учетную запись на случай кражи пароля.",
"2fa": "Двухфакторная авторизация",
"2fa_disabled": "Двухфакторную аутентификацию можно включить только для аутентификации по электронной почте и паролю",
"2fa_disabled": "Двухфакторную авторизацию можно включить только при использовании авторизации по электронной почте и паролю",
"enable_2fa": "Включить двухфакторную авторизацию",
"disable_2fa": "Отключить двухфакторную авторизацию",
"disable_2fa_recommendation": "Если вам нужно отключить двухфакторную авторизацию, мы рекомендуем включить её как можно скорее.",
@ -591,15 +591,15 @@
"round_robin_description": "Цикл встреч между несколькими членами команды.",
"managed_event": "Управляемое событие",
"username_placeholder": "имя пользователя",
"managed_event_description": "Создавайте пакеты типов событий и рассылайте их участнкиам команды",
"managed": "Управляемые",
"managed_event_url_clarification": \"username\" указывается имя пользователя, присвоенное участнику",
"assign_to": "Назначить",
"managed_event_description": "Создавайте типы событий и массово рассылайте их участникам команды",
"managed": "Управляемое",
"managed_event_url_clarification": «username» указываются имена пользователей, которым будет назначен тип события",
"assign_to": "Назначить участнику",
"add_members": "Добавить участников...",
"count_members_one": "{{count}} участник",
"count_members_other": "{{count}} участника(ов)",
"count_members_one": "Участники: {{count}}",
"count_members_other": "Участники: {{count}}",
"no_assigned_members": "Нет назначенных участников",
"assigned_to": "Назначено",
"assigned_to": "Назначено участнику",
"start_assigning_members_above": "Начните назначать участников",
"locked_fields_admin_description": "Участники не смогут это редактировать",
"locked_fields_member_description": "Эта опция заблокирована администратором команды",
@ -755,9 +755,9 @@
"slot_interval": "Интервалы времени",
"slot_interval_default": "Использовать длину события (по умолчанию)",
"delete_event_type": "Удалить тип события?",
"delete_managed_event_type": "Удалить тип управляемого события?",
"delete_event_type_description": "Если вы поделились с кем-то ссылкой, с ее помощью больше нельзя оформлять бронирование.",
"delete_managed_event_type_description": "<ul><li>У участников, назначенных для этого типа события, будут удалены их типы событий.</li><li>Если они поделились с кем-то ссылкой, с ее помощью больше нельзя будет оформлять бронирование.</li></ul>",
"delete_managed_event_type": "Удалить управляемый тип события?",
"delete_event_type_description": "Пользователи, с которыми вы поделились этой ссылкой, больше не смогут оформлять бронирование с ее помощью.",
"delete_managed_event_type_description": "<ul><li>После того как вы назначите участникам данный тип события, их прежние типы событий будут удалены.</li><li>Пользователи, с которыми участники поделились своей ссылкой, больше не смогут оформлять бронирование с ее помощью.</li></ul>",
"confirm_delete_event_type": "Да, удалить",
"delete_account": "Удалить аккаунт",
"confirm_delete_account": "Да, удалить аккаунт",
@ -1177,7 +1177,7 @@
"event_advanced_tab_title": "Расширенные",
"event_setup_multiple_duration_error": "Настройка события: чтобы выбрать несколько вариантов продолжительности, требуется как минимум 1 параметр.",
"event_setup_multiple_duration_default_error": "Настройка события: выберите допустимую продолжительность по умолчанию.",
"event_setup_booking_limits_error": "Лимиты бронирования должны указываться по возрастанию [день, неделя, месяц, год].",
"event_setup_booking_limits_error": "Лимиты бронирования должны указываться от меньшей единицы к большей [день, неделя, месяц, год]",
"event_setup_duration_limits_error": "Продолжительность бронирования должна указываться от меньшей единицы к большей [день, неделя, месяц, год]",
"select_which_cal": "Выберите, в какой календарь добавить бронирование",
"custom_event_name": "Пользовательское имя события",
@ -1276,11 +1276,11 @@
"attendee_name_info": "Участник, на которого оформляется бронирование",
"to": "Кому",
"workflow_turned_on_successfully": "Состояние рабочего процесса «{{workflowName}}» изменено на «{{offOn}}»",
"download_responses": "Скачивайте ответы",
"download_responses_description": "Скачивайте все ответы пользователей, заполнивших форму, в формате CSV.",
"download_responses": "Скачать ответы",
"download_responses_description": "Скачать все ответы пользователей, заполнивших форму, в формате CSV.",
"download": "Скачать",
"download_recording": "Скачать запись",
"recording_from_your_recent_call": "Запись вашего недавнего звонка на Cal.com готова для загрузки",
"recording_from_your_recent_call": "Запись вашего недавнего звонка на Cal.com готова для скачивания",
"create_your_first_form": "Создайте первую форму",
"create_your_first_form_description": "Формы маршрутизации позволяют задавать пользователям уточняющие вопросы, чтобы перенаправлять их к соответствующему лицу или типу события.",
"create_your_first_webhook": "Создайте свой первый вебхук",
@ -1326,7 +1326,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Здесь показываются все созданные вами формы и маршруты.",
"routing_forms_description": "Создавайте формы, чтобы направлять участников к нужному сотруднику",
"routing_forms_send_email_owner": "Отправляйте письма владельцу",
"routing_forms_send_email_owner_description": "Отправляйте владельцу формы электронное письмо, когда пользователь ее заполняет",
"add_new_form": "Добавить новую форму",
@ -1395,7 +1395,7 @@
"billing_help_title": "Нужно что-нибудь еще?",
"billing_help_description": "Если вам нужна дальнейшая помощь с оплатой счета, наша служба поддержки готова помочь.",
"billing_help_cta": "Обратиться в службу поддержки",
"ignore_special_characters_booking_questions": "Не используйте специальные символы в идентификаторе вопроса о бронировании. Используйте только буквы и цифры",
"ignore_special_characters_booking_questions": "Не используйте в идентификаторе вопроса о бронировании специальные символы. Используйте только буквы и цифры",
"retry": "Повторить",
"fetching_calendars_error": "Ошибка при загрузке календарей. <1>Попробуйте еще раз</1> или обратитесь в службу поддержки.",
"calendar_connection_fail": "Не удалось подключиться к календарю",
@ -1484,11 +1484,11 @@
"duration_limit_reached": "Достигнут лимит продолжительности бронирования для этого типа события",
"admin_has_disabled": "Администратор отключил {{appName}}",
"disabled_app_affects_event_type": "Администратор отключил {{appName}}, которое влияет на тип мероприятия {{eventType}}",
"event_replaced_notice": "Администратор заменил вам один из типов событий",
"email_subject_slug_replacement": "Администратор команды заменил вам событие /{{slug}}",
"email_body_slug_replacement_notice": "Администратор команды <strong>{{teamName}}</strong> заменил вам тип события <strong>/{{slug}}</strong> на тип управляемого им события.",
"email_body_slug_replacement_info": "Ваша ссылка работает, но, возможно, для нее изменились некоторые настройки. Вы можете просмотреть ее в типах событий.",
"email_body_slug_replacement_suggestion": "Если у вас есть вопросы о типе события, свяжитесь с администратором.<br /><br />Счастливого планирования, <br />команда Cal.com",
"event_replaced_notice": "Администратор заменил один из ваших типов событий",
"email_subject_slug_replacement": "Администратор команды заменил ваше событие /{{slug}}",
"email_body_slug_replacement_notice": "Администратор команды <strong>{{teamName}}</strong> заменил ваш тип события <strong>/{{slug}}</strong> на управляемый им тип события.",
"email_body_slug_replacement_info": "Ссылка по-прежнему будет работать, но некоторые настройки могли измениться. Вы можете просмотреть их в списке типов событий.",
"email_body_slug_replacement_suggestion": "Если у вас есть вопросы о данном типе события, свяжитесь с администратором.<br /><br />Счастливого планирования! <br />Команда Cal.com",
"disable_payment_app": "Приложение {{appName}}, используемое для событий типа «{{title}}», отключено администратором. Участники по-прежнему могут бронировать данный тип событий, но не будут получать сообщение о необходимости произвести оплату. Чтобы этого избежать, вы можете скрыть тип событий до тех пор, пока администратор снова не активирует способ оплаты.",
"payment_disabled_still_able_to_book": "Участники все еще могут забронировать этот тип мероприятия, но они не получат сообщение о том, что нужно произвести оплату. Чтобы этого избежать, можно скрыть тип мероприятия, пока администратор не активирует способ оплаты снова.",
"app_disabled_with_event_type": "Администратор отключил {{appName}}, которое влияет на тип мероприятия {{title}}.",
@ -1551,7 +1551,7 @@
"create_your_first_team_webhook_description": "Создайте первый вебхук для этого командного типа событий",
"create_webhook_team_event_type": "Создать вебхук для этого командного типа событий",
"disable_success_page": "Отключить страницу успешного бронирования (работает, только если у вас есть URL-адрес перенаправления)",
"invalid_admin_password": "У вас есть права администратора, но ваш пароль короче 15 символов, либо у вас еще нет 2FA",
"invalid_admin_password": "У вас есть права администратора, но ваш пароль короче 15 символов или вы не настроили двухфакторную авторизацию",
"change_password_admin": "Измените пароль, чтобы получить административный доступ",
"username_already_taken": "Имя пользователя уже занято",
"assignment": "Назначение",
@ -1584,7 +1584,7 @@
"ee_enterprise_license": "Enterprise-лицензия «/ee»",
"enterprise_booking_fee": "От {{enterprise_booking_fee}}/месяц",
"enterprise_license_includes": "Всё для коммерческого использования",
"no_need_to_keep_your_code_open_source": "Необязательно оставлять исходный код открытым",
"no_need_to_keep_your_code_open_source": "Нет необходимости оставлять исходный код открытым",
"repackage_rebrand_resell": "Простая переупаковка, ребрендинг и перепродажа",
"a_vast_suite_of_enterprise_features": "Множество функций для предприятий",
"free_license_fee": "0,00 $/месяц",
@ -1686,12 +1686,12 @@
"select_a_router": "Выбрать форму маршрутизации",
"add_a_new_route": "Добавить новый маршрут",
"make_informed_decisions": "Принимайте обоснованные решения с помощью Insights",
"make_informed_decisions_description": "На нашей панели мониторинга Insights видна вся работа вашей команды, а выявленные ею тенденции позволяют лучше планировать и принимать решения.",
"view_bookings_across": "Просмотреть бронирования для всех участников",
"view_bookings_across_description": "Выясните, кто участвует в мероприятиях больше всех, и обеспечьте оптимальное распределение задач в команде",
"identify_booking_trends": "Определяйте тренды бронирования",
"identify_booking_trends_description": "Посмотрите, в какое время и в какие дни бронирование оформляют чаще всего",
"spot_popular_event_types": "Находите популярные типы событий",
"make_informed_decisions_description": "На нашей панели мониторинга Insights видна вся работа вашей команды, а выявляемые ею тенденции позволяют лучше планировать и принимать решения.",
"view_bookings_across": "Просматривайте бронирования для всех участников",
"view_bookings_across_description": "Узнайте, кто участвует в мероприятиях больше всех, и обеспечьте оптимальное распределение задач в команде",
"identify_booking_trends": "Выявляйте тренды бронирования",
"identify_booking_trends_description": "Следите за тем, в какое время и в какие дни бронирование оформляют чаще всего",
"spot_popular_event_types": "Определяйте наиболее популярные типы событий",
"spot_popular_event_types_description": "Узнайте, какие типы событий собирают больше всего кликов и бронирований",
"no_responses_yet": "Ответов пока нет",
"this_will_be_the_placeholder": "Это текст-заполнитель",
@ -1717,7 +1717,7 @@
"members_default_schedule": "Расписание участника по умолчанию",
"set_by_admin": "Устанавливается администратором команды",
"members_default_location": "Местоположение участника по умолчанию",
"members_default_schedule_description": "Для каждого участника мы используем установленный по умолчанию график доступности. Пользователи могут редактировать или менять его.",
"members_default_schedule_description": "Для каждого участника будет использоваться его график доступности по умолчанию. Участники смогут редактировать или менять его.",
"requires_at_least_one_schedule": "У вас должно быть по крайней мере одно расписание",
"default_conferencing_bulk_description": "Обновить местоположение для выбранных типов событий",
"locked_for_members": "Заблокировано для участников",
@ -1725,14 +1725,14 @@
"locked_webhooks_description": "Участники смогут видеть активные вебхуки, но не смогут редактировать их настройки",
"locked_workflows_description": "Участники смогут видеть активные рабочие процессы, но не смогут редактировать их настройки",
"app_not_connected": "Вы не подключили аккаунт {{appName}}.",
"connect_now": "Подключить сейчас",
"connect_now": "Подключить",
"managed_event_dialog_confirm_button_one": "Заменить и уведомить {{count}} участника",
"managed_event_dialog_confirm_button_other": "Заменить и уведомить {{count}} участников",
"managed_event_dialog_confirm_button_other": "Заменить и уведомить участников ({{count}})",
"managed_event_dialog_title_one": "URL /{{slug}} для {{count}} участника уже существует. Заменить?",
"managed_event_dialog_title_other": "URL /{{slug}} для {{count}} участников уже существует. Заменить?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> уже используют <strong>/{{slug}}</strong> url.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> уже используют <string>/{{slug}}</strong> url.",
"managed_event_dialog_clarification": "В случае замены мы уведомим пользователей. Чтобы не выполнять перезапись, вернитесь назад и удалите их.",
"managed_event_dialog_clarification": "В случае замены мы уведомим пользователей. Если вы не хотите выполнять перезапись, вернитесь назад и удалите типы событий.",
"review_event_type": "Пересмотреть тип события",
"looking_for_more_analytics": "Нужно больше аналитики?",
"looking_for_more_insights": "Нужно больше Insights?",
@ -1743,43 +1743,43 @@
"popular_events": "Популярные события",
"no_event_types_found": "Типы событий не найдены",
"average_event_duration": "Средняя продолжительность события",
"most_booked_members": "Участники с максимальным числом бронирований",
"least_booked_members": "Участники с минимальным числом бронирований",
"most_booked_members": "Участники с наибольшим числом бронирований",
"least_booked_members": "Участники с наименьшим числом бронирований",
"events_created": "Созданные события",
"events_completed": "Завершенные события",
"events_cancelled": "Отмененные события",
"events_rescheduled": "Перенесенные события",
"from_last_period": "с последнего периода",
"from_to_date_period": "С: {{startDate}} До: {{endDate}}",
"from_to_date_period": "С: {{startDate}} По: {{endDate}}",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "Узнайте больше о работе команды",
"redirect_url_warning": "При добавлении перенаправления страница успешного бронирования будет отключена. Не забудьте упомянуть «Бронирование подтверждено» на пользовательской странице успешного бронирования.",
"redirect_url_warning": "При использовании перенаправления страница успешного бронирования будет отключена. Не забудьте упомянуть «Бронирование подтверждено» на собственной странице оповещения об успешном бронировании.",
"event_trends": "Тренды событий",
"clear_filters": "Очистить фильтры",
"hold": "Подождите",
"on_booking_option": "Получить оплату при бронировании",
"hold_option": "Взимать комиссию за отсутствие на событии",
"card_held": "Карта сохранена",
"charge_card": "Изменить карту",
"card_charged": "Оплата с карты списана",
"no_show_fee_amount": "{{amount, currency}} комиссия за отсутствие на событии",
"no_show_fee": "Комиссия за отсутствие на событии",
"clear_filters": "Сбросить фильтры",
"hold": "Заморозить",
"on_booking_option": "Списывать оплату при бронировании",
"hold_option": "Взимать комиссию за неявку",
"card_held": "Сумма заморожена",
"charge_card": "Списать оплату с карты",
"card_charged": "Оплата списана с карты",
"no_show_fee_amount": "{{amount, currency}} комиссия за неявку",
"no_show_fee": "Комиссия за неявку",
"submit_card": "Ввести карту",
"submit_payment_information": "Отправить платежную информацию",
"meeting_awaiting_payment_method": "Выберите способ оплаты для встречи",
"no_show_fee_charged_email_subject": "Комиссия за отсутствие на событии {{amount, currency}} списана с {{title}} от {{date}}",
"no_show_fee_charged_text_body": "Комиссия за отсутствие на событии зачислена",
"no_show_fee_charged_subtitle": "Комиссия за отсутствие на следующем событии зачислена в размере {{amount, currency}}",
"error_charging_card": "Не удалось зачислить комиссию за отсутствие на событии. Повторите попытку позже.",
"collect_no_show_fee": "Получить комиссию за отсуствие на событии",
"no_show_fee_charged": "Зачислена комиссия за отсутствие на событии",
"no_show_fee_charged_email_subject": "Списание комиссии за неявку на событие {{title}} {{date}} в размере {{amount, currency}}",
"no_show_fee_charged_text_body": "Комиссия за неявку списана",
"no_show_fee_charged_subtitle": "Списана комиссия в размере {{amount, currency}} за неявку на следующее событие",
"error_charging_card": "Не удалось списать комиссию за неявку. Повторите попытку позже.",
"collect_no_show_fee": "Списать комиссию за неявку",
"no_show_fee_charged": "Комиссия за неявку списана",
"insights": "Insights",
"testing_workflow_info_message": "При тестировании этого рабочего процесса помните, что отправку писем и SMS можно запланировать только за 1 час до начала",
"insights_no_data_found_for_filter": "Не найдены данные для выбранного фильтра или выбранных дат.",
"acknowledge_booking_no_show_fee": "Я понимаю, что в случае моего отказа посетить это мероприятие с моей карты будет списана комиссия за отсутствие на мероприятии в размере {{amount, currency}}.",
"testing_workflow_info_message": "При тестировании этого рабочего процесса помните, что отправку писем и SMS можно запланировать не менее чем за 1 час до начала",
"insights_no_data_found_for_filter": "Данные, соответствующие выбранному фильтру или диапазону дат, не найдены.",
"acknowledge_booking_no_show_fee": "Я подтверждаю, что в случае моей неявки на событие с моей карты будет списана комиссия в размере {{amount, currency}}.",
"card_details": "Реквизиты карты",
"seats_and_no_show_fee_error": "В данный момент не удается активировать места и зачислить комиссию за отсутствие на событии",
"complete_your_booking": "Завершите бронирование",
"complete_your_booking_subject": "Завершите бронирование: {{title}} от {{date}}",
"email_invite_team": "{{email}} приглашен(а)"
"seats_and_no_show_fee_error": "Списание платы за неявку при использовании выбора места в настоящее время не поддерживается",
"complete_your_booking": "Завершить бронирование",
"complete_your_booking_subject": "Завершите бронирование: {{title}}, {{date}}",
"email_invite_team": "Участник {{email}} приглашен(а)"
}

View File

@ -26,6 +26,8 @@
"rejection_confirmation": "Odbij rezervaciju",
"manage_this_event": "Upravljaj ovim dogadjajem",
"invite_team_member": "Pozovite člana tima",
"invite_team_individual_segment": "Pozovite pojedinačno",
"invite_team_bulk_segment": "Pozovite grupno",
"invite_team_notifcation_badge": "Poz.",
"your_event_has_been_scheduled": "Vaš dogadjaj je odložen",
"your_event_has_been_scheduled_recurring": "Vaš ponavljajući događaj je zakazan",
@ -222,6 +224,7 @@
"go_back_login": "Idite nazad na stranicu za prijavu",
"error_during_login": "Došlo je do greške pri prijavi. Idite nazad na stranicu za prijavu i pokušajte ponovo.",
"request_password_reset": "Zatražite imejl za ponovno postavljanje lozinke",
"send_invite": "Pošaljite pozivnicu",
"forgot_password": "Zaboravili ste lozinku?",
"forgot": "Zaboravili ste?",
"done": "Urađeno",
@ -237,6 +240,8 @@
"set_availability": "Podesite svoju dostupnost",
"continue_without_calendar": "Nastavite bez kalendara",
"connect_your_calendar": "Povežite vaš kalendar",
"connect_your_video_app": "Povežite svoje video aplikacije",
"connect_your_video_app_instructions": "Povežite svoje video aplikacije da biste ih koristili u vašim tipovima događaja.",
"connect_your_calendar_instructions": "Povežite vaš kalendar da automatski radi proveru zauzetih vremena i vidi nove dogadjaje kad se zakažu.",
"set_up_later": "Postavi kasnije",
"current_time": "Trenutno vreme",
@ -367,6 +372,7 @@
"create_webhook": "Napravite Webhook",
"booking_cancelled": "Rezervacija Otkazana",
"booking_rescheduled": "Rezervacija Odložena",
"recording_ready": "Link za preuzimanje snimka je spreman",
"booking_created": "Rezervacija Napravljena",
"meeting_ended": "Sastanak se završio",
"form_submitted": "Formular poslat",
@ -408,7 +414,7 @@
"add_time_availability": "Dodaj novi vremenski interval",
"add_an_extra_layer_of_security": "Dodajte dodatni nivo sigurnosti svom nalogu u slučaju da vam je lozinka ukradena.",
"2fa": "Dvofaktorska Autentikacija",
"2fa_disabled": "Dvostruka potvrda identiteta pože biti omogućena samo za potvrdu identiteta putem imejla i lozinke",
"2fa_disabled": "Dvostruka potvrda identiteta može biti omogućena samo za potvrdu identiteta putem imejla i lozinke",
"enable_2fa": "Omogući dvofaktorsku autentikaciju",
"disable_2fa": "Onemogući dvofaktorsku autentikaciju",
"disable_2fa_recommendation": "Ako morate da onemogućite 2FA, predlažemo da je omogućite što pre.",
@ -465,6 +471,7 @@
"friday": "Petak",
"saturday": "Subota",
"sunday": "Nedelja",
"all_booked_today": "Sve je zakazano.",
"slots_load_fail": "Problem pri učitavanju dostupnih termina.",
"additional_guests": "+ Dodatni Gosti",
"your_name": "Vaše ime",
@ -600,7 +607,7 @@
"count_members_other": "{{count}} članova",
"no_assigned_members": "Nema dodeljenih članova",
"assigned_to": "Dodeljeno",
"start_assigning_members_above": "Počnite da dodeljujete korisnicima iznad",
"start_assigning_members_above": "Počnite da dodeljujete članove iznad",
"locked_fields_admin_description": "Članovi neće moći da uređuju ovo",
"locked_fields_member_description": "Ova opcija je zaključana od strane administratora tima",
"url": "URL",
@ -752,12 +759,16 @@
"new_event_type_to_book_description": "Napravi novi tip događaja preko koga će ljudi moći da naprave rezervacije.",
"length": "Dužina",
"minimum_booking_notice": "Minimalni rok za najavu sastanka",
"offset_toggle": "Pomeri vremena početka",
"offset_toggle_description": "Pomeri vremena termina prikazana polaznicima za određeni broj minuta",
"offset_start": "Pomeri za",
"offset_start_description": "npr. ovo će prikazati vremena termina vašim polaznicima u {{ adjustedTime }} umesto {{ originalTime }}",
"slot_interval": "Intervali vremenskih slotova",
"slot_interval_default": "Koristi dužinu događaja (uobičajeno podešavanje)",
"delete_event_type": "Izbriši tip događaja?",
"delete_managed_event_type": "Izbriši upravljani tip događaja?",
"delete_event_type_description": "Niko sa kime ste podelili link neće više moći da rezerviše pomoću njega.",
"delete_managed_event_type_description": "<ul><li>Članovima dodeljenim ovom tipu događaja će takođe biti obrisani njihovi tipovi događaja.</li><li>Niko sa kim su podelili svoj link neće više moći da zakaže pomoću njega.</li></ul>",
"delete_managed_event_type_description": "<ul><li>Članovima dodeljenim ovom tipu događaja će takođe biti izbrisani njihovi tipovi događaja.</li><li>Niko sa kim su podelili svoj link neće više moći da rezerviše pomoću njega.</li></ul>",
"confirm_delete_event_type": "Da, izbriši",
"delete_account": "Izbriši nalog",
"confirm_delete_account": "Da, izbriši nalog",
@ -904,6 +915,7 @@
"duplicate": "Dupliraj",
"offer_seats": "Ponudi mesta",
"offer_seats_description": "Ponudite mesta za zakazivanje. Ovo automatski onemogućava gostujuća i opciona zakazivanja.",
"seats_available_one": "Dostupno mesto",
"seats_available_other": "Slobodnih mesta",
"number_of_seats": "Broj mesta po zakazivanju",
"enter_number_of_seats": "Unesite broj slobodnih mesta",
@ -1038,6 +1050,7 @@
"event_cancelled_trigger": "kada je događaj otkazan",
"new_event_trigger": "kada je zakazan novi događaj",
"email_host_action": "pošalji imejl domaćinu",
"email_attendee_action": "pošalji imejl polaznicima",
"sms_attendee_action": "pošalji SMS polazniku",
"sms_number_action": "pošalji SMS na određeni broj",
"workflows": "Radni tokovi",
@ -1190,6 +1203,7 @@
"create_workflow": "Kreirajte radni tok",
"do_this": "Uradi ovo",
"turn_off": "Isključi",
"turn_on": "Uključi",
"settings_updated_successfully": "Podešavanja su uspešno ažurirana",
"error_updating_settings": "Greška pri ažuriranju podešavanja",
"personal_cal_url": "Moj lični {{appName}} URL",
@ -1246,6 +1260,7 @@
"calendars_description": "Konfigurišite način na koji tipovi događaja vrše interakciju sa vašim kalendarima",
"appearance_description": "Upravljajte podešavanjima za izgled vaše rezervacije",
"conferencing_description": "Dodajte svoje omiljene aplikacije za video konferencije za vaše sastanke",
"add_conferencing_app": "Dodaj aplikaciju za konferenciju",
"password_description": "Upravljajte podešavanjima za lozinke vašeg naloga",
"2fa_description": "Upravljajte podešavanjima za lozinke vašeg naloga",
"we_just_need_basic_info": "Trebaju nam neke osnovne informacije da bismo podesili vaš profil.",
@ -1318,15 +1333,15 @@
"exchange_authentication_ntlm": "NTLM potvrda identiteta",
"exchange_compression": "GZip kompresija",
"exchange_version": "Exchange verzija",
"exchange_version_2007_SP1": "2007. SP1",
"exchange_version_2010": "2010.",
"exchange_version_2010_SP1": "2010. SP1",
"exchange_version_2010_SP2": "2010. SP2",
"exchange_version_2013": "2013.",
"exchange_version_2013_SP1": "2013. SP1",
"exchange_version_2015": "2015.",
"exchange_version_2016": "2016.",
"routing_forms_description": "Možete da vidite sve formulare i rute koje ste kreirali ovde.",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Kreirajte formulare da biste uputili učesnike na ispravna odredišta",
"routing_forms_send_email_owner": "Pošaljite imejl vlasniku",
"routing_forms_send_email_owner_description": "Pošaljite imejl vlasniku kada pošaljete obrazac",
"add_new_form": "Dodaj novi formular",
@ -1486,7 +1501,7 @@
"disabled_app_affects_event_type": "Administrator je onemogućio {{appName}}, što utiče na vaš tip događaja {{eventType}}",
"event_replaced_notice": "Administrator je zamenio jedan od vaših tipova događaja",
"email_subject_slug_replacement": "Administrator tima je zamenio vaš događaj /{{slug}}",
"email_body_slug_replacement_notice": "Administrator iz <strong>{{teamName}}</strong> tima je zamenio vaš tip događaja <strong>{{slug}}</strong> upravljanim tipom događaja koji oni kontrolišu.",
"email_body_slug_replacement_notice": "Administrator iz <strong>{{teamName}}</strong> tima je zamenio vaš tip događaja <strong>{{slug}}</strong> tipom događaja kojim on upravlja.",
"email_body_slug_replacement_info": "Vaš link će nastaviti da funkcioniše, ali neka od njegovih podešavanja su se možda promenila. Možete da ih pregledate u tipovima događaja.",
"email_body_slug_replacement_suggestion": "Ako imate bilo kakvih pitanja u vezi sa tipom događaja, obratite se svom administratoru.<br /><br />Srećno planiranje, <br />Cal.com tim",
"disable_payment_app": "Administrator je onemogućio {{appName}}, što utiče na vaš tip događaja {{title}}. Učesnici još uvek mogu da zakažu ovaj tip događaja, ali od njih neće biti zatraženo da plate. Možete da sakrijete ovaj tip događaja da biste to sprečili dok vaš administrator ponovo ne omogući vaš način plaćanja.",
@ -1620,6 +1635,7 @@
"email_user_cta": "Prikaži pozivnicu",
"email_no_user_invite_heading": "Pozvani ste da se pridružite timu u {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} vas je pozvao/la da se pridružite njihovom timu u {{appName}}. {{appName}} je planer za koordinaciju događaja koji omogućava vama i vašem timu da zakazujete sastanke bez dopisivanja imejlovima.",
"email_user_invite_subheading": "{{invitedBy}} vas je pozvao/la da se pridružite njihovom timu `{{teamName}}` u {{appName}}. {{appName}} je planer za koordinaciju događaja koji omogućava vama i vašem timu da zakazujete sastanke bez dopisivanja imejlovima.",
"email_no_user_invite_steps_intro": "Provešćemo vas kroz nekoliko kratkih koraka, i za tren oka ćete uživati u zakazivanju bez stresa sa svojim timom.",
"email_no_user_step_one": "Izaberite korisničko ime",
"email_no_user_step_two": "Povežite se sa nalogom kalendara",
@ -1685,7 +1701,7 @@
"add_1_option_per_line": "Dodajte 1 opciju za svaku liniju",
"select_a_router": "Izaberite ruter",
"add_a_new_route": "Dodaj novo preusmeravanje",
"make_informed_decisions": "Donesite informisane odluke uz Insights",
"make_informed_decisions": "Donosite pravilne odluke pomoću Insights",
"make_informed_decisions_description": "Kontrolna tabla Insights prikazuje sve aktivnosti vašeg tima i prikazuje trendove koji omogućavaju bolje timsko zakazivanje i odlučivanje.",
"view_bookings_across": "Pogledajte rezervacije za sve članove",
"view_bookings_across_description": "Pogledajte ko je dobio najviše rezervacija i uverite se da su najbolje podeljene u timu",
@ -1695,6 +1711,15 @@
"spot_popular_event_types_description": "Pogledajte koji tipovi događaja dobijaju najviše klikova i zakazivanja",
"no_responses_yet": "Još uvek nema odgovora",
"this_will_be_the_placeholder": "Ovo će biti čuvar mesta",
"error_booking_event": "Došlo je do greške prilikom zakazivanja događaja, osvežite stranicu i pokušajte ponovo",
"timeslot_missing_title": "Nisu izabrani termini",
"timeslot_missing_description": "Izaberite termin da biste zakazali događaj.",
"timeslot_missing_cta": "Izaberite termin",
"switch_monthly": "Pređite na mesečni pregled",
"switch_weekly": "Pređite na nedeljni pregled",
"switch_multiday": "Pređite na dnevni pregled",
"num_locations": "{{num}} opcija lokacije",
"select_on_next_step": "Izaberite na sledećem koraku",
"this_meeting_has_not_started_yet": "Ovaj sastanak još nije počeo",
"this_app_requires_connected_account": "{{appName}} zahteva povezani {{dependencyName}} nalog",
"connect_app": "Povežite {{dependencyName}}",
@ -1710,20 +1735,21 @@
"cancel_url_variable": "URL za otkazivanje",
"cancel_url_info": "URL za otkazivanje zakazivanja",
"reschedule_url_variable": "URL za promenu termina",
"reschedule_url_info": "URL za promenu termina",
"reschedule_url_info": "URL za promenu zakazanog termina",
"invalid_event_name_variables": "U nazivu vašeg događaja se nalazi nevažeća promenljiva",
"select_all": "Izaberi sve",
"default_conferencing_bulk_title": "Masovno ažuriranje postojećih tipova događaja",
"members_default_schedule": "Podrazumevani raspored članova",
"members_default_schedule": "Podrazumevani raspored člana",
"set_by_admin": "Postavio administrator tima",
"members_default_location": "Podrazumevana lokacija članova",
"members_default_location": "Podrazumevana lokacija člana",
"members_default_schedule_description": "Koristićemo podrazumevani raspored dostupnosti za svakog člana. Oni će moći da ga uređuju ili promene.",
"requires_at_least_one_schedule": "Potrebno je da imate barem jedan raspored",
"default_conferencing_bulk_description": "Ažuriranje lokacija za izabrane tipove događaja",
"locked_for_members": "Zaključano za članove",
"locked_apps_description": "Članovi će moći da vide aktivne aplikacije, ali neće moći da uređuju bilo kakva podešavanja aplikacije",
"locked_webhooks_description": "Članovi će moći da vide aktivne webhook-ove, ali neće moći da uređuju bilo kakva podešavanja webhook-ova",
"locked_workflows_description": "Članovi će moći da vide aktivne radne tokove, ali neće moći da uređuju bilo kakva podešavanja radnih tokova",
"locked_apps_description": "Članovi će moći da vide aktivne aplikacije, ali neće moći da uređuju podešavanja aplikacije",
"locked_webhooks_description": "Članovi će moći da vide aktivne webhook-ove, ali neće moći da uređuju podešavanja webhook-ova",
"locked_workflows_description": "Članovi će moći da vide aktivne radne tokove, ali neće moći da uređuju podešavanja radnih tokova",
"locked_by_admin": "Zaključao administrator tima",
"app_not_connected": "Niste povezali {{appName}} nalog.",
"connect_now": "Povežite odmah",
"managed_event_dialog_confirm_button_one": "Zameni i obavesti {{count}} člana",
@ -1733,9 +1759,9 @@
"managed_event_dialog_information_one": "<strong>{{names}}</strong> već koristi <strong>/{{slug}}</strong> URL.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> već koriste <string>/{{slug}}</strong> URL.",
"managed_event_dialog_clarification": "Ako izaberete da ga zamenite, obavestićemo ih. Vratite se i uklonite ih ako ne želite da zamenite postojeće.",
"review_event_type": "Pregledajte tip događaja",
"review_event_type": "Pregledaj tip događaja",
"looking_for_more_analytics": "Tražite još analitike?",
"looking_for_more_insights": "Tražite još uvida?",
"looking_for_more_insights": "Tražite još Insights podataka?",
"add_filter": "Dodajte filter",
"select_user": "Izaberite korisnika",
"select_event_type": "Izaberite tip događaja",
@ -1751,40 +1777,64 @@
"events_rescheduled": "Pomereni događaji",
"from_last_period": "iz prošlog perioda",
"from_to_date_period": "Od: {{startDate}} Do: {{endDate}}",
"analytics_for_organisation": "Uvidi",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "Saznajte više o aktivnosti vašeg tima",
"redirect_url_warning": "Dodavanje preusmeravanja će onemogućiti stranicu uspeha. Uverite se da spomenete „Zakazivanje potvrđeno“ na vašoj prilagođenoj stranici uspeha.",
"redirect_url_warning": "Dodavanje preusmeravanja će onemogućiti stranicu uspeha. Obavezno navedite „Zakazivanje potvrđeno“ na vašoj prilagođenoj stranici uspeha.",
"event_trends": "Trendovi događaja",
"clear_filters": "Izbriši filtere",
"hold": "Zadrži",
"on_booking_option": "Sakupite plaćanje za zakazivanje",
"hold_option": "Naplatite nadoknadu za izostanak",
"card_held": "Karta zadržana",
"charge_card": "Naplati karticu",
"card_charged": "Kartica naplaćena",
"no_show_fee_amount": "{{amount, currency}} nadoknada za izostanak",
"no_show_fee": "Nadoknada za izostanak",
"submit_card": "Pošaljite karticu",
"submit_payment_information": "Pošaljite informacije o plaćanju",
"on_booking_option": "Prikupi uplatu za zakazivanje",
"hold_option": "Naplati naknadu za izostanak",
"card_held": "Rezervisana sredstva na kartici",
"charge_card": "Naplati sa kartice",
"card_charged": "Naplaćeno sa kartice",
"no_show_fee_amount": "{{amount, currency}} naknada za izostanak",
"no_show_fee": "Naknada za izostanak",
"submit_card": "Pošalji karticu",
"submit_payment_information": "Pošalji informacije o plaćanju",
"meeting_awaiting_payment_method": "Vaš sastanak čeka na način plaćanja",
"no_show_fee_charged_email_subject": "Nadoknada za izostanak u iznosu od {{amount, currency}} je naplaćena za {{title}} dana {{date}}",
"no_show_fee_charged_email_subject": "Naknada za izostanak u iznosu od {{amount, currency}} je naplaćena za {{title}} dana {{date}}",
"no_show_fee_charged_text_body": "Naplaćena je naknada za izostanak",
"no_show_fee_charged_subtitle": "Naknada za izostanak u iznosu od {{amount, currency}} je naplaćena za sledeći događaj",
"error_charging_card": "Došlo je do greške prilikom naplate naknade za izostanak. Pokušajte ponovo kasnije.",
"collect_no_show_fee": "Sakupite naknadu za izostanak",
"collect_no_show_fee": "Prikupi naknadu za izostanak",
"no_show_fee_charged": "Naplaćena je naknada za izostanak",
"insights": "Uvidi",
"insights": "Insights",
"testing_workflow_info_message": "Kada testirate ovaj radni tok, imajte na umu da imejlovi i SMS-ovi mogu da budu zakazani najmanje 1 sat unapred",
"insights_no_data_found_for_filter": "Nisu pronađeni podaci za izabrani filter ili izabrane datume.",
"acknowledge_booking_no_show_fee": "Jasno mi je da će mi biti naplaćena naknada za izostanak putem kartice u iznosu od {{amount, currency}} ukoliko ne dođem na ovaj događaj.",
"acknowledge_booking_no_show_fee": "Jasno mi je da će mi biti naplaćena naknada za izostanak putem kartice u iznosu od {{amount, currency}} ukoliko ne prisustvujem ovom događaju.",
"card_details": "Informacije o kartici",
"seats_and_no_show_fee_error": "Omogućavanje mesta i naplata naknade za izostanak trenutno nije moguće",
"seats_and_no_show_fee_error": "Trenutno nije moguće aktiviranje mesta i naplata naknade za izostanak",
"complete_your_booking": "Završite svoje zakazivanje",
"complete_your_booking_subject": "Završite svoje zakazivanje: {{title}} dana {{date}}",
"confirm_your_details": "Potvrdite svoje podatke",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "Upravo ćete naplatiti polazniku {{amount, currency}}. Jeste li sigurni da želite da nastavite?",
"charge_attendee": "Naplatite polazniku {{amount, currency}}",
"payment_app_commission": "Zahtevajte plaćanje ({{paymentFeePercentage}}% + {{fee, currency}} provizija po transakciji)",
"email_invite_team": "{{email}} je pozvan",
"image_size_limit_exceed": "Otpremljena slika ne sme da prevazilazi ograničenje od 5mb"
"email_invite_team": "{{email}} je pozvan/a",
"email_invite_team_bulk": "Pozvano je {{userCount}} korisnika",
"error_collecting_card": "Greška u sakupljanju kartice",
"image_size_limit_exceed": "Otpremljena slika ne sme da prevazilazi ograničenje od 5mb",
"inline_embed": "Ugradi neposredno",
"load_inline_content": "Direktno učitava vaš tip događaja neposredno sa vašim ostalim sadržajem na veb sajtu.",
"floating_pop_up_button": "Plutajuće iskačuće dugme",
"floating_button_trigger_modal": "Postavlja plutajuće dugme na vaš sajt koje pokreće modal sa vašim tipom događaja.",
"pop_up_element_click": "Iskačući prozor preko klika na element",
"open_dialog_with_element_click": "Otvara Cal dijalog prozor kada neko klikne na element.",
"need_help_embedding": "Potrebna vam je pomoć? Pogledajte naše vodiče za ugrađivanje Cal-a na Wix, Squarespace ili WordPress, pogledajte naša često postavljana pitanja, ili istražite napredne opcije za ugrađivanje.",
"book_my_cal": "Zakaži moj Cal",
"invite_as": "Pozovi kao",
"form_updated_successfully": "Formular je uspešno ažuriran.",
"email_not_cal_member_cta": "Pridružite se našem timu",
"disable_attendees_confirmation_emails": "Onemogući podrazumevane imejlove za potvrdu za polaznike",
"disable_attendees_confirmation_emails_description": "Najmanje jedan radni tok je aktivan na ovom tipu događaja koji šalje imejl polaznicima kada je događaj zakazan.",
"disable_host_confirmation_emails": "Onemogući podrazumevane imejlove za potvrdu za domaćina",
"disable_host_confirmation_emails_description": "Najmanje jedan radni tok je aktivan na ovom tipu događaja koji šalje imejl domaćinima kada je događaj zakazan.",
"add_an_override": "Dodaj zamenu",
"import_from_google_workspace": "Uvezi korisnike sa Google Workspace",
"connect_google_workspace": "Poveži Google Workspace",
"google_workspace_admin_tooltip": "Morate da budete Workspace administrator da biste koristili ovu opciju",
"first_event_type_webhook_description": "Napravite svoj prvi webhook za ovaj tip događaja",
"create_for": "Napravi za"
}

View File

@ -26,6 +26,8 @@
"rejection_confirmation": "Avböj bokningen",
"manage_this_event": "Hantera denna bokning",
"invite_team_member": "Bjud in teammedlem",
"invite_team_individual_segment": "Bjud in individ",
"invite_team_bulk_segment": "Importera i bulk",
"invite_team_notifcation_badge": "Inbj.",
"your_event_has_been_scheduled": "Din bokning har schemalagts",
"your_event_has_been_scheduled_recurring": "Din återkommande händelseförfrågan har schemalagts",
@ -222,6 +224,7 @@
"go_back_login": "Gå tillbaka till inloggningssidan",
"error_during_login": "Ett fel inträffade när du loggade in. Gå tillbaka till inloggningsskärmen och försök igen.",
"request_password_reset": "Skicka e-postmeddelande om återställning",
"send_invite": "Skicka inbjudan",
"forgot_password": "Glömt lösenordet?",
"forgot": "Glömt?",
"done": "Klar",
@ -237,6 +240,8 @@
"set_availability": "Ställ in din tillgänglighet",
"continue_without_calendar": "Fortsätt utan kalender",
"connect_your_calendar": "Anslut din kalender",
"connect_your_video_app": "Anslut dina videoappar",
"connect_your_video_app_instructions": "Anslut dina videoappar för att använda dem på dina evenemangstyper.",
"connect_your_calendar_instructions": "Anslut din kalender för att automatiskt upptäcka uppbokade tider samt fylla på med nya bokningar.",
"set_up_later": "Konfigurera senare",
"current_time": "Aktuell tid",
@ -367,6 +372,7 @@
"create_webhook": "Skapa webhook",
"booking_cancelled": "Bokning inställd",
"booking_rescheduled": "Bokning ombokad",
"recording_ready": "Länk för nedladdning av inspelning klar",
"booking_created": "Bokning skapad",
"meeting_ended": "Mötet avslutat",
"form_submitted": "Formulär skickat",
@ -465,6 +471,7 @@
"friday": "Fredag",
"saturday": "Lördag",
"sunday": "Söndag",
"all_booked_today": "Alla bokade.",
"slots_load_fail": "Det gick inte att ladda tillgängliga tidsluckor.",
"additional_guests": "Lägg till gäster",
"your_name": "Ditt namn",
@ -593,7 +600,7 @@
"username_placeholder": "användarnamn",
"managed_event_description": "Skapa och distribuera evenemangstyper i bulk till teammedlemmar",
"managed": "Hanterad",
"managed_event_url_clarification": "\"användarnamn\" kommer att fyllas i med användarnamnet för de medlemmar som tilldelats",
"managed_event_url_clarification": "\"användarnamn\" fylls i med användarnamnet för de medlemmar som tilldelats",
"assign_to": "Tilldela till",
"add_members": "Lägg till medlemmar ...",
"count_members_one": "{{count}} medlem",
@ -752,12 +759,16 @@
"new_event_type_to_book_description": "Skapa en ny händelsetyp som personer kan boka tider med.",
"length": "Längd",
"minimum_booking_notice": "Senaste tid för att boka",
"offset_toggle": "Förskjutna starttider",
"offset_toggle_description": "Förskjutning av tidsluckor som visas för bokare med ett angivet antal minuter",
"offset_start": "Förskjutning av",
"offset_start_description": "detta visar t.ex. tidsluckor för dina bokare vid {{ adjustedTime }} istället för {{ originalTime }}",
"slot_interval": "Tid mellan bokningar",
"slot_interval_default": "Använd händelsens längd (standard)",
"delete_event_type": "Radera händelsetyp?",
"delete_managed_event_type": "Radera hanterad händelsetyp?",
"delete_event_type_description": "Alla som du har delat den här länken med kommer inte längre att kunna boka med hjälp av den.",
"delete_managed_event_type_description": "<ul><li>Medlemmar som tilldelats denna händelsetyp kommer också att få sina händelsetyper raderade.</li><li>Alla som de har delat sin länk med kommer inte längre att kunna boka med den.</li></ul>",
"delete_event_type_description": "Alla som du delat den här länken med kan inte längre boka med den.",
"delete_managed_event_type_description": "<ul><li>Händelsetyper raderas även för medlemmar som tilldelats denna händelsetyp.</li><li>Alla som de delat sin länk med kan inte längre boka med den.</li></ul>",
"confirm_delete_event_type": "Ja, radera",
"delete_account": "Radera konto",
"confirm_delete_account": "Ja, radera konto",
@ -904,6 +915,7 @@
"duplicate": "Duplicera",
"offer_seats": "Erbjud platser",
"offer_seats_description": "Erbjud platser till bokningar. Detta inaktiverar gäster och bokningar.",
"seats_available_one": "Tillgänglig plats",
"seats_available_other": "Tillgängliga platser",
"number_of_seats": "Antal platser per bokning",
"enter_number_of_seats": "Ange antal platser",
@ -1038,6 +1050,7 @@
"event_cancelled_trigger": "när händelsen ställs in",
"new_event_trigger": "när ny händelse bokas",
"email_host_action": "skicka e-post till värd",
"email_attendee_action": "skicka e-post till deltagare",
"sms_attendee_action": "skicka SMS till deltagare",
"sms_number_action": "skicka SMS till ett specifikt nummer",
"workflows": "Arbetsflöden",
@ -1190,6 +1203,7 @@
"create_workflow": "Skapa ett arbetsflöde",
"do_this": "Gör detta",
"turn_off": "Stäng av",
"turn_on": "Slå på",
"settings_updated_successfully": "Inställningar har uppdaterats",
"error_updating_settings": "Fel vid uppdatering av inställningar",
"personal_cal_url": "Min personliga {{appName}}-URL",
@ -1200,7 +1214,7 @@
"start_of_week": "Början av veckan",
"recordings_title": "Inspelningar",
"recording": "Inspelning",
"happy_scheduling": "Glad schemaläggning",
"happy_scheduling": "Lycka till med schemaläggningen",
"select_calendars": "Välj vilka kalendrar du vill kontrollera för konflikter för att förhindra dubbelbokningar.",
"check_for_conflicts": "Kontrollera om konflikter",
"view_recordings": "Visa inspelningar",
@ -1246,6 +1260,7 @@
"calendars_description": "Ställ in hur dina händelsetyper interagerar med dina kalendrar",
"appearance_description": "Hantera inställningar för ditt bokningsutseende",
"conferencing_description": "Lägg till dina favoritappar för videokonferenser för möten",
"add_conferencing_app": "Lägg till konferensapp",
"password_description": "Hantera inställningar för dina kontolösenord",
"2fa_description": "Hantera inställningar för dina kontolösenord",
"we_just_need_basic_info": "Vi behöver bara lite grundläggande information för att ställa in din profil.",
@ -1326,7 +1341,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Du kan se alla former och rutter som du har skapat här.",
"routing_forms_description": "Skapa formulär för att dirigera deltagare till rätt mål",
"routing_forms_send_email_owner": "Skicka e-post till ägare",
"routing_forms_send_email_owner_description": "Skickar ett e-postmeddelande till ägaren när formuläret skickas",
"add_new_form": "Lägg till nytt formulär",
@ -1486,9 +1501,9 @@
"disabled_app_affects_event_type": "En administratör har inaktiverat {{appName}} vilket påverkar din händelsetyp {{eventType}}",
"event_replaced_notice": "En administratör har ersatt en av dina händelsetyper",
"email_subject_slug_replacement": "En teamadministratör har ersatt din händelse /{{slug}}",
"email_body_slug_replacement_notice": "En administratör i <strong>{{teamName}}</strong>-teamet har ersatt din händelsetyp <strong>/{{slug}}</strong> med en hanterad händelsetyp som de kontrollerar.",
"email_body_slug_replacement_info": "Din länk kommer att fortsätta fungera, men vissa inställningar för den kan ha ändrats. Du kan granska den i händelsetyper.",
"email_body_slug_replacement_suggestion": "Om du har några frågor om händelsetypen, kontakta din administratör.<br /><br />Glad schemaläggning, <br />Cal.com-teamet",
"email_body_slug_replacement_notice": "En administratör i <strong>{{teamName}}</strong>-teamet har ersatt din händelsetyp <strong>/{{slug}}</strong> med en hanterad händelsetyp som hen kontrollerar.",
"email_body_slug_replacement_info": "Din länk fortsätter att fungera, men vissa inställningar för den kan ha ändrats. Du kan granska den i händelsetyper.",
"email_body_slug_replacement_suggestion": "Kontakta din administratör om du har några frågor om händelsetypen.<br /><br />Lycka till med schemaläggningen! <br />Cal.com-teamet",
"disable_payment_app": "Administratören har inaktiverat {{appName}} vilket påverkar din händelsetyp {{title}}. Deltagarna kan fortfarande boka den här händelsetypen, men de uppmanas inte att betala. Du kan dölja händelsetypen för att förhindra detta tills din administratör återaktiverar betalningsmetoden.",
"payment_disabled_still_able_to_book": "Deltagarna kan fortfarande boka den här händelsetypen, men de uppmanas inte att betala. Du kan dölja händelsetypen för att förhindra detta tills din administratör återaktiverar betalningsmetoden.",
"app_disabled_with_event_type": "Administratören har inaktiverat {{appName}} vilket påverkar din händelsetyp {{title}}.",
@ -1551,7 +1566,7 @@
"create_your_first_team_webhook_description": "Skapa din första webhook för denna teamhändelsetyp",
"create_webhook_team_event_type": "Skapa en webhook för denna teamhändelsetyp",
"disable_success_page": "Inaktivera framgångssida (fungerar bara om du har en omdirigerings-URL)",
"invalid_admin_password": "Du är administratör men du har inte ett lösenord med minst 15 tecken eller ingen 2FA än",
"invalid_admin_password": "Du är administratör men ditt lösenord har färre än 15 tecken eller ingen 2FA än",
"change_password_admin": "Ändra lösenord för att få administratörsåtkomst",
"username_already_taken": "Användarnamnet används redan",
"assignment": "Tilldelning",
@ -1620,6 +1635,7 @@
"email_user_cta": "Visa inbjudan",
"email_no_user_invite_heading": "Du är inbjuden att gå med i ett team på {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} har bjudit in dig att gå med i sitt team på {{appName}}. {{appName}} är en händelsejonglerande schemaläggare som du och ditt team kan använda för att planera möten utan att skicka e-post fram och tillbaka.",
"email_user_invite_subheading": "{{invitedBy}} har bjudit in dig att gå med i sitt team {{teamName}} den {{appName}}. {{appName}} är en händelsejonglerande schemaläggare som du och ditt team kan använda för att planera möten utan att skicka e-post fram och tillbaka.",
"email_no_user_invite_steps_intro": "Vi går igenom några enkla steg så att du kan schemalägga utan stress med ditt team på nolltid.",
"email_no_user_step_one": "Välj ditt användarnamn",
"email_no_user_step_two": "Anslut ditt kalenderkonto",
@ -1685,16 +1701,25 @@
"add_1_option_per_line": "Lägg till ett alternativ per rad",
"select_a_router": "Välj en omdirigering",
"add_a_new_route": "Lägg till ny omdirigering",
"make_informed_decisions": "Ta välgrundade beslut med Insights",
"make_informed_decisions_description": "Vår instrumentpanel i Insights visar all aktivitet i ditt team och visar trender som gör det möjligt att schemalägga teamet och fatta beslut på ett bättre sätt.",
"make_informed_decisions": "Fatta välgrundade beslut med Insights",
"make_informed_decisions_description": "Vår instrumentpanel i Insights visar alla aktiviteter för ditt team och visar trender så att du kan schemalägga teamet och fatta beslut på ett bättre sätt.",
"view_bookings_across": "Visa bokningar för alla medlemmar",
"view_bookings_across_description": "Se vem som får flest bokningar och se till att du får den bästa fördelningen i ditt team",
"view_bookings_across_description": "Se vem som får flest bokningar och se till att teamet får den bästa fördelningen",
"identify_booking_trends": "Identifiera bokningstrender",
"identify_booking_trends_description": "Se vilka tider i veckan och vilka tider under dagen som är populära för dina bokare",
"identify_booking_trends_description": "Se vilka tider i veckan och under dagen som är populära för dina bokare",
"spot_popular_event_types": "Hitta populära händelsetyper",
"spot_popular_event_types_description": "Se vilka av dina händelsetyper som får flest klick och bokningar",
"no_responses_yet": "Inga svar ännu",
"this_will_be_the_placeholder": "Det här blir platshållaren",
"error_booking_event": "Ett fel uppstod när du bokade evenemanget, uppdatera sidan och försök igen",
"timeslot_missing_title": "Ingen tidslucka vald",
"timeslot_missing_description": "Välj en tidslucka för att boka evenemanget.",
"timeslot_missing_cta": "Välj tidslucka",
"switch_monthly": "Växla till månatlig vy",
"switch_weekly": "Växla till veckovis vy",
"switch_multiday": "Växla till dagvy",
"num_locations": "{{num}} platsalternativ",
"select_on_next_step": "Välj i nästa steg",
"this_meeting_has_not_started_yet": "Mötet har inte startat än",
"this_app_requires_connected_account": "{{appName}} kräver ett anslutet {{dependencyName}}-konto",
"connect_app": "Anslut {{dependencyName}}",
@ -1717,13 +1742,14 @@
"members_default_schedule": "Medlemmens standardschema",
"set_by_admin": "Ställs in av teamadministratör",
"members_default_location": "Medlemmens förvalda plats",
"members_default_schedule_description": "Vi kommer att använda varje medlems standardschema för tillgänglighet. De kommer att kunna redigera eller ändra det.",
"members_default_schedule_description": "Vi kommer att använda varje medlems standardschema för tillgänglighet. De kan redigera eller ändra det.",
"requires_at_least_one_schedule": "Du måste ha minst ett schema",
"default_conferencing_bulk_description": "Uppdatera platserna för de valda händelsetyperna",
"locked_for_members": "Låst för medlemmar",
"locked_apps_description": "Medlemmarna kommer att kunna se de aktiva apparna, men de kommer inte att kunna ändra appinställningarna",
"locked_webhooks_description": "Medlemmarna kommer att kunna se aktiva webhooks men inte kunna redigera inställningar för webhooks",
"locked_workflows_description": "Medlemmarna kommer att kunna se de aktiva arbetsflödena, men de kommer inte att kunna ändra några arbetsflödesinställningar",
"locked_apps_description": "Medlemmarna kan se de aktiva apparna men kan inte ändra appinställningarna",
"locked_webhooks_description": "Medlemmarna kan se aktiva webhooks men kan inte redigera inställningar för webhooks",
"locked_workflows_description": "Medlemmarna kan se aktiva arbetsflöden men kan inte ändra några arbetsflödesinställningar",
"locked_by_admin": "Låst av teamadministratör",
"app_not_connected": "Du har inte anslutit ett {{appName}}-konto.",
"connect_now": "Anslut nu",
"managed_event_dialog_confirm_button_one": "Ersätt och meddela {{count}} medlem",
@ -1732,10 +1758,10 @@
"managed_event_dialog_title_other": "Webbadressen /{{slug}} finns redan för {{count}} medlemmar. Vill du ersätta den?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> använder redan webbadressen <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> använder redan webbadressen <string>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "Om du väljer att byta ut den kommer vi att meddela dem. Gå tillbaka och ta bort dem om du inte vill skriva över den.",
"managed_event_dialog_clarification": "Vi meddelar dem om du byter ut den. Gå tillbaka och ta bort dem om du inte vill skriva över den.",
"review_event_type": "Granska händelsetyp",
"looking_for_more_analytics": "Vill du ha fler analyser?",
"looking_for_more_insights": "Vill du ha fler insikter?",
"looking_for_more_analytics": "Vill du ha mer analys?",
"looking_for_more_insights": "Vill du ha mer Insights?",
"add_filter": "Lägg till filter",
"select_user": "Välj användare",
"select_event_type": "Välj händelsetyp",
@ -1747,39 +1773,68 @@
"least_booked_members": "Minst bokade medlemmar",
"events_created": "Skapade händelser",
"events_completed": "Slutförda händelser",
"events_cancelled": "Händelser avbrutna",
"events_rescheduled": "Händelser ombokade",
"events_cancelled": "Avbrutna händelser",
"events_rescheduled": "Ombokade händelser",
"from_last_period": "från senaste perioden",
"from_to_date_period": "Från: {{startDate}} till: {{endDate}}",
"analytics_for_organisation": "Insikter",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "Läs mer om ditt teams aktivitet",
"redirect_url_warning": "Att lägga till en omdirigering kommer att inaktivera framgångssidan. Se till att nämna \"Bokning bekräftad\" på din anpassade framgångssida.",
"redirect_url_warning": "Framgångssidan inaktiveras om du lägger till en omdirigering. Nämn \"Bokning bekräftad\" på din anpassade framgångssida.",
"event_trends": "Händelsetrender",
"clear_filters": "Rensa filter",
"hold": "Vänta",
"hold": "Spärr",
"on_booking_option": "Samla in betalning vid bokning",
"hold_option": "Ta ut en avgift för utebliven ankomst",
"card_held": "Kort som innehas",
"hold_option": "Avgift för utebliven närvaro",
"card_held": "Kort spärrat",
"charge_card": "Debitera kort",
"card_charged": "Kort debiterat",
"no_show_fee_amount": "{{amount, currency}} i avgift för utebliven ankomst",
"no_show_fee": "Avgift för utebliven ankomst",
"no_show_fee_amount": "Avgift på {{amount, currency}} för utebliven närvaro",
"no_show_fee": "Avgift för utebliven närvaro",
"submit_card": "Använd kort",
"submit_payment_information": "Ange betalningsinformation",
"meeting_awaiting_payment_method": "Ditt möte väntar på en betalningsmetod",
"no_show_fee_charged_email_subject": "Avgift för utebliven ankomst på {{amount, currency}} debiteras för {{title}} {{date}}",
"no_show_fee_charged_text_body": "Avgift för utebliven ankomst debiterades",
"no_show_fee_charged_subtitle": "Avgift för utebliven ankomst på {{amount, currency}} debiterades för följande händelse",
"error_charging_card": "Något gick fel när avgiften för utebliven ankomst debiterades. Försök igen senare.",
"collect_no_show_fee": "Samla in avgift för utebliven ankomst",
"no_show_fee_charged": "Avgift för utebliven ankomst debiterades",
"insights": "Insikter",
"testing_workflow_info_message": "När det här arbetsflödet testas, var medveten om att e-postmeddelanden och SMS endast kan schemaläggas minst en timme i förväg",
"insights_no_data_found_for_filter": "Inga data hittades för valda filter eller valda datum.",
"acknowledge_booking_no_show_fee": "Jag bekräftar att om jag inte deltar i händelsen kommer en avgift på {{amount, currency}} för utebliven ankomst att debiteras mitt kort.",
"no_show_fee_charged_email_subject": "Avgift på {{amount, currency}} för utebliven närvaro debiteras för {{title}} {{date}}",
"no_show_fee_charged_text_body": "Avgift för utebliven närvaro har debiterats",
"no_show_fee_charged_subtitle": "Avgift på {{amount, currency}} för utebliven närvaro har debiterats för följande händelse",
"error_charging_card": "Något gick fel när avgiften för utebliven närvaro debiterades. Försök igen senare.",
"collect_no_show_fee": "Samla in avgift för utebliven närvaro",
"no_show_fee_charged": "Avgift för utebliven närvaro har debiterats",
"insights": "Insights",
"testing_workflow_info_message": "När det här arbetsflödet testas ska du vara medveten om att e-postmeddelanden och SMS endast kan schemaläggas minst en timme i förväg",
"insights_no_data_found_for_filter": "Inga data hittades för valt filter eller valda datum.",
"acknowledge_booking_no_show_fee": "Jag bekräftar att en avgift på {{amount, currency}} för utebliven närvaro debiteras mitt kort om jag inte deltar i händelsen.",
"card_details": "Kortuppgifter",
"seats_and_no_show_fee_error": "För närvarande går det inte att aktivera platser och ta ut en avgift för utebliven ankomst",
"seats_and_no_show_fee_error": "För närvarande går det inte att aktivera platser och ta ut en avgift för utebliven närvaro",
"complete_your_booking": "Slutför din bokning",
"complete_your_booking_subject": "Slutför din bokning: {{title}} {{date}}",
"email_invite_team": "{{email}} har bjudits in"
"confirm_your_details": "Bekräfta dina uppgifter",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "Du är på väg att debitera deltagaren {{amount, currency}}. Är du säker på att du vill fortsätta?",
"charge_attendee": "Debitera deltagare {{amount, currency}}",
"payment_app_commission": "Kräv betalning ({{paymentFeePercentage}}% + {{fee, currency}} provision per transaktion)",
"email_invite_team": "{{email}} har bjudits in",
"email_invite_team_bulk": "{{userCount}} användare har blivit inbjudna",
"error_collecting_card": "Fel vid insamling av kort",
"image_size_limit_exceed": "Uppladdad bild bör inte överstiga 5 MB storleksgräns",
"inline_embed": "Inline Embed",
"load_inline_content": "Laddar din evenemangstyp direkt i linje med ditt övriga webbplatsinnehåll.",
"floating_pop_up_button": "Flytande popup-knapp",
"floating_button_trigger_modal": "Sätter en flytande knapp på din webbplats som utlöser en modal med din evenemangstyp.",
"pop_up_element_click": "Pop up via elementklick",
"open_dialog_with_element_click": "Öppna din Cal-dialogruta när någon klickar på ett element.",
"need_help_embedding": "Behöver du hjälp? Se våra guider för inbäddning av Cal på Wix, Squarespace eller WordPress, kolla våra vanliga frågor eller utforska avancerade inbäddningsalternativ.",
"book_my_cal": "Boka min Cal",
"invite_as": "Bjud in som",
"form_updated_successfully": "Formuläret har uppdaterats.",
"email_not_cal_member_cta": "Gå med i teamet",
"disable_attendees_confirmation_emails": "Inaktivera e-postbekräftelse som standard för deltagare",
"disable_attendees_confirmation_emails_description": "Minst ett arbetsflöde är aktivt på denna evenemangstyp som skickar ett e-postmeddelande till deltagarna när evenemanget är bokat.",
"disable_host_confirmation_emails": "Inaktivera e-postbekräftelse som standard för värdar",
"disable_host_confirmation_emails_description": "Minst ett arbetsflöde är aktivt för denna evenemangstyp som skickar ett e-postmeddelande till värden när evenemanget är bokat.",
"add_an_override": "Lägg till åsidosättning",
"import_from_google_workspace": "Importera användare från Google Workspace",
"connect_google_workspace": "Anslut Google Workspace",
"google_workspace_admin_tooltip": "Du måste vara Workspace-administratör för att kunna använda denna funktion",
"first_event_type_webhook_description": "Skapa din första webhook för denna evenemangstyp",
"create_for": "Skapa för"
}

View File

@ -26,6 +26,8 @@
"rejection_confirmation": "Rezervasyonu reddet",
"manage_this_event": "Bu etkinliği yönet",
"invite_team_member": "Ekip üyesi davet et",
"invite_team_individual_segment": "Kişiyi davet et",
"invite_team_bulk_segment": "Toplu içe aktarma",
"invite_team_notifcation_badge": "Dvt.",
"your_event_has_been_scheduled": "Etkinliğiniz planlandı",
"your_event_has_been_scheduled_recurring": "Yinelenen etkinliğiniz planlandı",
@ -222,6 +224,7 @@
"go_back_login": "Giriş sayfasına geri dön",
"error_during_login": "Giriş yapılırken bir hata oluştu. Giriş ekranına geri dönün ve tekrar deneyin.",
"request_password_reset": "Sıfırlama e-postası gönder",
"send_invite": "Davet gönder",
"forgot_password": "Şifremi Unuttum",
"forgot": "Unuttunuz mu?",
"done": "Tamam",
@ -237,6 +240,8 @@
"set_availability": "Müsaitlik durumunuzu ayarlayın",
"continue_without_calendar": "Takvim olmadan devam et",
"connect_your_calendar": "Takviminizi bağlayın",
"connect_your_video_app": "Video uygulamalarınızı bağlayın",
"connect_your_video_app_instructions": "Etkinlik türlerinizde kullanmak için video uygulamalarınızı bağlayın.",
"connect_your_calendar_instructions": "Yeni etkinlikler planlanırken dolu zamanları otomatik olarak kontrol etmek için takviminizi bağlayın.",
"set_up_later": "Daha sonra ayarla",
"current_time": "Geçerli saat",
@ -367,6 +372,7 @@
"create_webhook": "Web kancası oluştur",
"booking_cancelled": "Rezervasyon İptal Edildi",
"booking_rescheduled": "Rezervasyon Yeniden Planlandı",
"recording_ready": "Kayıt İndirme Bağlantısı Hazır",
"booking_created": "Rezervasyon Oluşturuldu",
"meeting_ended": "Toplantı Sona Erdi",
"form_submitted": "Form Gönderildi",
@ -465,6 +471,7 @@
"friday": "Cuma",
"saturday": "Cumartesi",
"sunday": "Pazar",
"all_booked_today": "Tümü rezerve edildi.",
"slots_load_fail": "Kullanılabilir zaman aralıkları yüklenemedi.",
"additional_guests": "Misafir ekle",
"your_name": "Adınız",
@ -752,6 +759,9 @@
"new_event_type_to_book_description": "İnsanların rezervasyon yapabileceği yeni bir etkinlik türü oluşturun.",
"length": "Uzunluk",
"minimum_booking_notice": "Minimum Bildirim",
"offset_toggle": "Ofset başlangıç saatleri",
"offset_toggle_description": "Belirli bir dakika sayısına göre rezervasyon yapanlara gösterilen ofset zaman aralıkları",
"offset_start_description": "örneğin; bu işlem rezervasyon yapan kişinin zaman aralıklarını {{ originalTime }} yerine {{ adjustedTime }} olarak görmesine neden olur",
"slot_interval": "Zaman dilimi aralıkları",
"slot_interval_default": "Etkinlik uzunluğunu kullan (varsayılan)",
"delete_event_type": "Etkinlik türü silinsin mi?",
@ -904,6 +914,7 @@
"duplicate": "Çoğalt",
"offer_seats": "Yer teklif et",
"offer_seats_description": "Rezervasyonlar için yer teklif edin. Bu işlem, misafirleri ve rezervasyon onaylarını devre dışı bırakır.",
"seats_available_one": "Koltuk mevcut",
"seats_available_other": "Yer mevcut",
"number_of_seats": "Rezervasyon başına yer sayısı",
"enter_number_of_seats": "Yer sayısını girin",
@ -1038,6 +1049,7 @@
"event_cancelled_trigger": "etkinlik iptal edildiğinde",
"new_event_trigger": "yeni bir etkinlik için rezervasyon yapıldığında",
"email_host_action": "organizatöre e-posta gönder",
"email_attendee_action": "katılımcılara e-posta gönder",
"sms_attendee_action": "katılımcıya SMS gönder",
"sms_number_action": "belirli bir numaraya SMS gönder",
"workflows": "İş akışları",
@ -1190,6 +1202,7 @@
"create_workflow": "Bir iş akışı oluşturun",
"do_this": "Bunu yap",
"turn_off": "Kapat",
"turn_on": "Aç",
"settings_updated_successfully": "Ayarlar başarıyla güncellendi",
"error_updating_settings": "Ayarlar güncellenirken bir hata oluştu",
"personal_cal_url": "Kişisel {{appName}} URL'm",
@ -1246,6 +1259,7 @@
"calendars_description": "Etkinlik türlerinizin takvimlerinizle nasıl etkileşimde bulunacağını yapılandırın",
"appearance_description": "Rezervasyon görünümünüz için ayarları yönetin",
"conferencing_description": "Toplantılarınız için favori video konferans uygulamalarınızı yönetin",
"add_conferencing_app": "Konferans Uygulaması Ekle",
"password_description": "Hesap şifreleriniz için ayarları yönetin",
"2fa_description": "Hesap şifreleriniz için ayarları yönetin",
"we_just_need_basic_info": "Profil kurulumunuzu almak için sadece bazı temel bilgilere ihtiyacımız var.",
@ -1620,6 +1634,7 @@
"email_user_cta": "Daveti görüntüle",
"email_no_user_invite_heading": "{{appName}} uygulamasındaki bir ekibe katılmaya davet edildiniz",
"email_no_user_invite_subheading": "{{invitedBy}}, sizi {{appName}} ekibine katılmaya davet etti. {{appName}}, size ve ekibinize e-posta iletişimine ihtiyaç duymadan toplantı planlama yapma olanağı sağlayan bir etkinlik planlayıcıdır.",
"email_user_invite_subheading": "{{invitedBy}}, sizi {{appName}} uygulamasındaki `{{teamName}}` ekibine katılmaya davet etti. {{appName}}, size ve ekibinize e-posta iletişimine ihtiyaç duymadan toplantı planlama yapma olanağı sağlayan bir etkinlik planlayıcıdır.",
"email_no_user_invite_steps_intro": "Ekibinizle birlikte kısa sürede ve sorunsuz planlama yapmanın keyfini çıkarmanız için birkaç adımda size rehberlik edeceğiz.",
"email_no_user_step_one": "Kullanıcı adınızı seçin",
"email_no_user_step_two": "Takvim hesabınızı bağlayın",
@ -1695,6 +1710,15 @@
"spot_popular_event_types_description": "Hangi etkinlik türünüzün en çok tıklandığını ve rezervasyon aldığını görün",
"no_responses_yet": "Henüz yanıt yok",
"this_will_be_the_placeholder": "Bu, yer tutucu olacak",
"error_booking_event": "Etkinlik rezervasyonu yapılırken bir hata oluştu, lütfen sayfayı yenileyerek tekrar deneyin",
"timeslot_missing_title": "Zaman aralığı seçilmedi",
"timeslot_missing_description": "Etkinlik rezervasyonu için lütfen bir zaman aralığı seçin.",
"timeslot_missing_cta": "Zaman aralığını seçin",
"switch_monthly": "Aylık görünüme geç",
"switch_weekly": "Haftalık görünüme geç",
"switch_multiday": "Günlük görünüme geç",
"num_locations": "{{num}} konum seçenekleri",
"select_on_next_step": "Bir sonraki adımda seç",
"this_meeting_has_not_started_yet": "Bu toplantı henüz başlamadı",
"this_app_requires_connected_account": "{{appName}} bağlı bir {{dependencyName}} hesabı gerektirir",
"connect_app": "{{dependencyName}} hesabını bağla",
@ -1724,6 +1748,7 @@
"locked_apps_description": "Üyeler aktif uygulamaları görebilir, ancak hiçbir uygulama ayarını düzenleyemez",
"locked_webhooks_description": "Üyeler aktif web kancalarını görebilir, ancak hiçbir web kancası ayarını düzenleyemez",
"locked_workflows_description": "Üyeler aktif iş akışlarını görebilir, ancak hiçbir iş akışı ayarını düzenleyemez",
"locked_by_admin": "Ekip yöneticisi tarafından kilitlendi",
"app_not_connected": "Bir {{appName}} hesabı bağlamadınız.",
"connect_now": "Hemen bağlan",
"managed_event_dialog_confirm_button_one": "{{count}} üyeyi değiştirin ve bilgilendirin",
@ -1781,5 +1806,22 @@
"seats_and_no_show_fee_error": "Şu anda koltuklar etkinleştirilemiyor ve katılmama ücreti tahsil edilemiyor",
"complete_your_booking": "Rezervasyonunuzu tamamlayın",
"complete_your_booking_subject": "Rezervasyonunuzu tamamlayın: {{title}}, {{date}}",
"email_invite_team": "{{email}} davet edildi"
"confirm_your_details": "Bilgilerinizi onaylayın",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "Katılımcıdan {{amount, currency}} tahsil etmek üzeresiniz. Devam etmek istediğinizden emin misiniz?",
"charge_attendee": "Katılımcıdan {{amount, currency}} ücret tahsil edin",
"payment_app_commission": "Ödeme talep edin (işlem başına %{{paymentFeePercentage}} + {{fee, currency}} komisyon)",
"email_invite_team": "{{email}} davet edildi",
"email_invite_team_bulk": "{{userCount}} kullanıcı davet edildi",
"image_size_limit_exceed": "Yüklenen resim boyutu 5 MB boyut sınırını aşmamalıdır",
"need_help_embedding": "Yardıma mı ihtiyacınız var? Cal'ı Wix, Squarespace veya WordPress'e yerleştirmek için kılavuzlarımıza göz atın. Ayrıca Sıkça Sorulan Sorular bölümümüze göz atın veya gelişmiş yerleştirme seçeneklerini keşfedin.",
"book_my_cal": "Cal'ımı rezerve et",
"form_updated_successfully": "Form başarıyla güncellendi.",
"disable_attendees_confirmation_emails": "Katılımcılar için varsayılan onay e-postalarını devre dışı bırakın",
"disable_attendees_confirmation_emails_description": "Bu etkinlik türünde etkinlik rezerve edildiğinde katılımcılara bir e-posta gönderen en az bir iş akışı etkin.",
"disable_host_confirmation_emails": "Organizatörler için varsayılan onay e-postalarını devre dışı bırakın",
"disable_host_confirmation_emails_description": "Bu etkinlik türündeki bir etkinlik rezerve edildiğinde organizatörlere e-posta gönderen en az bir iş akışı etkin.",
"connect_google_workspace": "Google Workspace'i bağlayın",
"google_workspace_admin_tooltip": "Bu özelliği kullanmak için Çalışma Alanı Yöneticisi olmalısınız",
"first_event_type_webhook_description": "Bu etkinlik türü için ilk web kancanızı oluşturun"
}

View File

@ -26,6 +26,8 @@
"rejection_confirmation": "Відмовити в бронюванні",
"manage_this_event": "Керувати цим заходом",
"invite_team_member": "Запросити учасника команди",
"invite_team_individual_segment": "Запросити фізичну особу",
"invite_team_bulk_segment": "Пакетний імпорт",
"invite_team_notifcation_badge": "Запр.",
"your_event_has_been_scheduled": "Захід заплановано",
"your_event_has_been_scheduled_recurring": "Періодичний захід заплановано",
@ -222,6 +224,7 @@
"go_back_login": "Повернутися на сторінку входу",
"error_during_login": "Сталася помилка під час входу в систему. Поверніться на екран входу та повторіть спробу.",
"request_password_reset": "Надіслати лист для скидання",
"send_invite": "Надіслати запрошення",
"forgot_password": "Не пам’ятаєте пароль?",
"forgot": "Забули?",
"done": "Готово",
@ -237,6 +240,8 @@
"set_availability": "Укажіть, коли ви доступні",
"continue_without_calendar": "Продовжити без календаря",
"connect_your_calendar": "Підключити календар",
"connect_your_video_app": "Підключайте улюблені відеозастосунки",
"connect_your_video_app_instructions": "Підключайте свої відеозастосунки, щоб використовувати їх у своїх типах заходів.",
"connect_your_calendar_instructions": "Підключіть свій календар, щоб автоматично перевіряти, коли ви зайняті, і стежити за новими запланованими заходами.",
"set_up_later": "Налаштувати пізніше",
"current_time": "Поточний час",
@ -367,6 +372,7 @@
"create_webhook": "Створити вебгук",
"booking_cancelled": "Бронювання скасовано",
"booking_rescheduled": "Бронювання перенесено",
"recording_ready": "Посилання для завантаження запису готове",
"booking_created": "Бронювання створено",
"meeting_ended": "Нарада завершилася",
"form_submitted": "Форму надіслано",
@ -465,6 +471,7 @@
"friday": "П’ятниця",
"saturday": "Субота",
"sunday": "Неділя",
"all_booked_today": "Усі заброньовані.",
"slots_load_fail": "Не вдалося завантажити доступні часові вікна.",
"additional_guests": "Додати гостей",
"your_name": "Ваше ім’я",
@ -752,6 +759,10 @@
"new_event_type_to_book_description": "Створіть новий тип заходу, на який люди зможуть бронювати час.",
"length": "Тривалість",
"minimum_booking_notice": "Мінімальний час до наступного заходу",
"offset_toggle": "Змістити час початку",
"offset_toggle_description": "Проміжки часу для зміщення (у хвилинах), показані користувачам, які здійснюють бронювання",
"offset_start": "Зміщення на",
"offset_start_description": "наприклад, вони бачитимуть часові проміжки о {{ adjustedTime }} замість {{ originalTime }}",
"slot_interval": "Інтервали між бронюваннями",
"slot_interval_default": "Використовувати тривалість заходу (за замовчуванням)",
"delete_event_type": "Видалити тип заходу?",
@ -904,6 +915,7 @@
"duplicate": "Дублювати",
"offer_seats": "Запропонувати місця",
"offer_seats_description": "Пропонуйте місця під час бронювання (при цьому вимикається гостьовий режим і бронювання з підтвердженням).",
"seats_available_one": "Доступне місце",
"seats_available_other": "Доступні місця",
"number_of_seats": "Кількість місць на одне бронювання",
"enter_number_of_seats": "Введіть кількість місць",
@ -1038,6 +1050,7 @@
"event_cancelled_trigger": "у момент скасування заходу",
"new_event_trigger": "у момент бронювання нового заходу",
"email_host_action": "надсилати електронний лист ведучому",
"email_attendee_action": "надсилати ел. лист учасникам",
"sms_attendee_action": "надсилати SMS учаснику",
"sms_number_action": "надсилати SMS на певний номер",
"workflows": "Робочі процеси",
@ -1190,6 +1203,7 @@
"create_workflow": "Створити робочий процес",
"do_this": "Зробити це",
"turn_off": "Вимкнути",
"turn_on": "Увімкнути",
"settings_updated_successfully": "Параметри оновлено",
"error_updating_settings": "Помилка оновлення параметрів",
"personal_cal_url": "Моя персональна URL-адреса {{appName}}",
@ -1246,6 +1260,7 @@
"calendars_description": "Налаштуйте, як типи заходів мають взаємодіяти з вашими календарями",
"appearance_description": "Налаштуйте варіанти оформлення свого бронювання",
"conferencing_description": "Керуйте додатками для відеоконференцій і нарад",
"add_conferencing_app": "Додати застосунок Conferencing",
"password_description": "Налаштуйте параметри паролів облікових записів",
"2fa_description": "Налаштуйте параметри паролів облікових записів",
"we_just_need_basic_info": "Щоб налаштувати ваш профіль, нам потрібні базові дані.",
@ -1620,6 +1635,7 @@
"email_user_cta": "Переглянути запрошення",
"email_no_user_invite_heading": "Вас запрошено приєднатися до команди в {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} запрошує вас приєднатися до команди в {{appName}}. {{appName}} — планувальник подій, який дає змогу вам і вашій команді планувати зустрічі без тривалої переписки електронною поштою.",
"email_user_invite_subheading": "{{invitedBy}} запрошує вас приєднатися до команди «{{teamName}}» в {{appName}}. {{appName}} — планувальник подій, який дає змогу вам і вашій команді планувати зустрічі без тривалої переписки електронною поштою.",
"email_no_user_invite_steps_intro": "Ми ознайомимо вас із додатком, і вже скоро ви насолоджуватиметесь плануванням зі своєю командою без жодного клопоту.",
"email_no_user_step_one": "Виберіть ім’я користувача",
"email_no_user_step_two": "Підключіть обліковий запис календаря",
@ -1695,6 +1711,15 @@
"spot_popular_event_types_description": "Дізнайтеся, які типи заходів мають найбільшу кількість переходів і бронювань",
"no_responses_yet": "Поки немає відповідей",
"this_will_be_the_placeholder": "Це заповнювач",
"error_booking_event": "Сталася помилка під час бронювання заходу, оновіть сторінку й повторіть спробу",
"timeslot_missing_title": "Не вибрано проміжок часу",
"timeslot_missing_description": "Виберіть проміжок часу для бронювання заходу.",
"timeslot_missing_cta": "Вибрати проміжок часу",
"switch_monthly": "Переключитися на перегляд місяця",
"switch_weekly": "Переключитися на перегляд тижня",
"switch_multiday": "Переключитися на перегляд дня",
"num_locations": "Варіантів розташування: {{num}}",
"select_on_next_step": "Вибрати на наступному кроці",
"this_meeting_has_not_started_yet": "Ця нарада ще не почалася",
"this_app_requires_connected_account": "Щоб використовувати {{appName}}, потрібно підключити обліковий запис {{dependencyName}}",
"connect_app": "Підключити {{dependencyName}}",
@ -1724,6 +1749,7 @@
"locked_apps_description": "Учасники бачитимуть активні додатки, але не зможуть змінювати їх налаштування",
"locked_webhooks_description": "Учасники бачитимуть активні вебгуки, але не зможуть змінювати їх налаштування",
"locked_workflows_description": "Учасники бачитимуть активні робочі процеси, але не зможуть змінювати їх налаштування",
"locked_by_admin": "Заблоковано адміністратором команди",
"app_not_connected": "Ви не під’єднали обліковий запис {{appName}}.",
"connect_now": "Під’єднати",
"managed_event_dialog_confirm_button_one": "Замінити й повідомити {{count}} учасника",
@ -1781,5 +1807,34 @@
"seats_and_no_show_fee_error": "Зараз неможливо активувати місця і стягнути плату за відсутність",
"complete_your_booking": "Завершіть бронювання",
"complete_your_booking_subject": "Завершіть бронювання: {{title}} від {{date}}",
"email_invite_team": "{{email}} запрошено"
"confirm_your_details": "Підтвердьте ваші дані",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "Ви збираєтеся списати кошти з рахунку учасника: {{amount, currency}}. Бажаєте продовжити?",
"charge_attendee": "Списати з учасника {{amount, currency}}",
"payment_app_commission": "Потрібна оплата ({{paymentFeePercentage}}% + {{fee, currency}} комісія за транзакцію)",
"email_invite_team": "{{email}} запрошено",
"email_invite_team_bulk": "Запрошено стільки користувачів: {{userCount}}",
"error_collecting_card": "Не вдалося забрати картку",
"image_size_limit_exceed": "Розмір переданого зображення не повинен перевищувати 5 МБ",
"inline_embed": "Вбудовування",
"load_inline_content": "Завантажує ваш тип заходу, вбудовуючи його у ваш інший контент на вебсайті.",
"floating_pop_up_button": "Спливаюча кнопка",
"floating_button_trigger_modal": "Додає спливаючу кнопку на ваш сайт, яка викликає модальне вікно з вашим типом заходу.",
"pop_up_element_click": "Спливаюче вікно після натискання на елемент",
"open_dialog_with_element_click": "Відкриває ваш діалог з Cal, коли хтось натискає елемент.",
"need_help_embedding": "Потрібна допомога? Перегляньте наші посібники з вбудовування Cal на Wix, Squarespace або WordPress, ознайомтеся з поширеними запитаннями або розширеними параметрами вбудовування.",
"book_my_cal": "Забронювати мій Cal",
"invite_as": "Запросити як",
"form_updated_successfully": "Форму оновлено.",
"email_not_cal_member_cta": "Приєднатися до команди",
"disable_attendees_confirmation_emails": "Вимкнути листи підтвердження за замовчуванням для учасників",
"disable_attendees_confirmation_emails_description": "Принаймні один робочий процес активний у цьому типі заходів, який надсилає лист учасникам у разі бронювання події.",
"disable_host_confirmation_emails": "Вимкнути листи підтвердження за замовчуванням для ведучого",
"disable_host_confirmation_emails_description": "Принаймні один робочий процес активний у цьому типі заходів, який надсилає лист ведучому в разі бронювання події.",
"add_an_override": "Додати перевизначення",
"import_from_google_workspace": "Імпортувати користувачів із Google Workspace",
"connect_google_workspace": "Підключити Google Workspace",
"google_workspace_admin_tooltip": "Ви повинні бути адміністратором Workspace, щоб використовувати цю функцію",
"first_event_type_webhook_description": "Створіть свій перший вебгук для цього типу заходу",
"create_for": "Створити для"
}

View File

@ -1,5 +1,5 @@
{
"identity_provider": "Nhà cung cấp danh tính",
"identity_provider": "Đơn vị cung cấp danh tính",
"trial_days_left": "Bạn có $t(day, {\"count\": {{days}} }) còn lại trên bản thử nghiệm PRO",
"day_one": "{{count}} ngày",
"day_other": "{{count}} ngày",
@ -26,6 +26,8 @@
"rejection_confirmation": "Từ chối lịch hẹn",
"manage_this_event": "Quản lý sự kiện này",
"invite_team_member": "Mời thành viên nhóm",
"invite_team_individual_segment": "Mời cá nhân",
"invite_team_bulk_segment": "Nhập hàng loạt",
"invite_team_notifcation_badge": "Mời",
"your_event_has_been_scheduled": "Sự kiện của bạn đã được lên lịch",
"your_event_has_been_scheduled_recurring": "Sự kiện định kỳ của bạn đã được lên lịch",
@ -70,7 +72,7 @@
"event_awaiting_approval_subject": "Đang chờ phê duyệt: {{title}} lúc {{date}}",
"event_still_awaiting_approval": "Một sự kiện vẫn đang chờ bạn phê duyệt",
"booking_submitted_subject": "Lịch hẹn đã được gửi: {{title}} lúc {{date}}",
"download_recording_subject": "Tải xuống bản ghi: {{title}} vào ngày {{date}}",
"download_recording_subject": "Tải xuống bản ghi âm: {{title}} vào ngày {{date}}",
"download_your_recording": "Tải xuống bản ghi âm của bạn",
"your_meeting_has_been_booked": "Cuộc họp của bạn đã được đặt",
"event_type_has_been_rescheduled_on_time_date": "{{title}} của bạn đã được chuyển sang ngày {{date}}.",
@ -222,6 +224,7 @@
"go_back_login": "Quay lại trang đăng nhập",
"error_during_login": "Đã xảy ra lỗi khi đăng nhập. Bạn hãy quay lại màn hình đăng nhập và thử lại.",
"request_password_reset": "Gửi email đặt lại",
"send_invite": "Gửi lời mời",
"forgot_password": "Quên mật khẩu?",
"forgot": "Quên?",
"done": "Xong",
@ -237,6 +240,8 @@
"set_availability": "Đặt lịch khả dụng của bạn",
"continue_without_calendar": "Tiếp tục mà không có lịch",
"connect_your_calendar": "Kết nối lịch của bạn",
"connect_your_video_app": "Kết nối các video yêu thích của bạn",
"connect_your_video_app_instructions": "Kết nối những ứng dụng video để dùng chúng ở những loại sự kiện của bạn.",
"connect_your_calendar_instructions": "Kết nối lịch của bạn để tự động kiểm tra thời gian bận và các sự kiện mới khi chúng được lên lịch.",
"set_up_later": "Thiết lập sau",
"current_time": "Thời gian hiện tại",
@ -408,7 +413,7 @@
"add_time_availability": "Thêm khoảng thời gian mới",
"add_an_extra_layer_of_security": "Thêm một lớp bảo mật bổ sung cho tài khoản của bạn trong trường hợp mật khẩu của bạn bị đánh cắp.",
"2fa": "Xác thực hai yếu tố",
"2fa_disabled": "Xác thực đa yếu tố chỉ được bật cho chức năng xác thực qua email và mật khẩu",
"2fa_disabled": "Xác thực hai yếu tố chỉ được bật cho chức năng xác thực qua email và mật khẩu",
"enable_2fa": "Bật xác thực hai yếu tố",
"disable_2fa": "Tắt xác thực hai yếu tố",
"disable_2fa_recommendation": "Nếu bạn cần tắt xác thực hai yếu tố, chúng tôi khuyên bạn nên bật lại nó càng sớm càng tốt.",
@ -591,9 +596,9 @@
"round_robin_description": "Luân phiên những cuộc họp giữa các thành viên trong nhóm.",
"managed_event": "Sự kiện được quản lý",
"username_placeholder": "tên người dùng",
"managed_event_description": "Tạo & phân phối cả cụm nhiều loại sự kiện đến các thành viên nhóm",
"managed_event_description": "Tạo & phân phối hàng loạt nhiều loại sự kiện cho các thành viên nhóm",
"managed": "Được quản lý",
"managed_event_url_clarification": "\"tên người dùng\" sẽ được điền vào theo tên người dùng của những thành viên được phân công",
"managed_event_url_clarification": "\"username\" sẽ được điền vào theo tên người dùng của những thành viên được phân công",
"assign_to": "Phân công cho",
"add_members": "Thêm thành viên...",
"count_members_one": "{{count}} thành viên",
@ -602,7 +607,7 @@
"assigned_to": "Được phân công cho",
"start_assigning_members_above": "Bắt đầu phân công những thành viên bên trên",
"locked_fields_admin_description": "Các thành viên sẽ không sửa được phần này",
"locked_fields_member_description": "Tuỳ chọn này do quản trị nhóm kh lại",
"locked_fields_member_description": "Tuỳ chọn này do quản trị nhóm khóa lại",
"url": "URL",
"hidden": "Ẩn giấu",
"readonly": "Chỉ đọc",
@ -754,11 +759,11 @@
"minimum_booking_notice": "Thời gian đệm tối thiểu",
"slot_interval": "Khoảng thời gian giữa các lịch hẹn",
"slot_interval_default": "Sử dụng độ dài sự kiện (mặc định)",
"delete_event_type": "X loại sự kiện?",
"delete_managed_event_type": "X loại sự kiện được quản lý?",
"delete_event_type": "Xóa loại sự kiện?",
"delete_managed_event_type": "Xóa loại sự kiện được quản lý?",
"delete_event_type_description": "Đối với những người mà bạn chia sẻ liên kết này, họ sẽ không thể đặt lịch hẹn bằng liên kết đó được nữa.",
"delete_managed_event_type_description": "<ul><li>Những thành viên được phân công cho loại sự kiện này cũng sẽ khiến cho loại sự kiện của họ được x đi.</li><li>Đối với những người mà bạn chia sẻ liên kết này, họ sẽ không thể đặt lịch hẹn bằng liên kết đó được nữa.</li></ul>",
"confirm_delete_event_type": "Có, hãy x",
"delete_managed_event_type_description": "<ul><li>Những thành viên được phân công cho loại sự kiện này cũng sẽ khiến cho loại sự kiện của họ được xóa đi.</li><li>Đối với những người mà bạn chia sẻ liên kết này, họ sẽ không thể đặt lịch hẹn bằng liên kết đó được nữa.</li></ul>",
"confirm_delete_event_type": "Có, hãy xóa",
"delete_account": "Xóa tài khoản",
"confirm_delete_account": "Có, xóa tài khoản",
"delete_account_confirmation_message": "Bạn có chắc chắn muốn xóa tài khoản {{appName}} của mình không? Bất kỳ ai mà bạn đã chia sẻ liên kết tài khoản của mình sẽ không thể đặt trước bằng liên kết đó nữa và mọi tùy chọn bạn đã lưu sẽ bị mất.",
@ -1154,7 +1159,7 @@
"variable_format": "Định dạng biến số",
"webhook_subscriber_url_reserved": "Url ghi danh Webhook đã được lập định",
"custom_input_as_variable_info": "Bỏ qua tất cả các ký tự đặc biệt của nhãn thông tin đầu vào bổ sung (chỉ dùng chữ cái và con số), dùng chữ in hoa cho tất cả các chữ cái và thay thế khoảng trắng bằng dấu gạch dưới.",
"using_booking_questions_as_variables": "Làm cách nào tôi dùng những câu hỏi lịch hẹn ở dạng tham số?",
"using_booking_questions_as_variables": "Làm thế nào để tôi có thể dùng những câu hỏi lịch hẹn ở dạng tham số?",
"download_desktop_app": "Tải ứng dụng trên máy tính bàn",
"set_ping_link": "Đặt liên kết Ping",
"rate_limit_exceeded": "Đã vượt quá giới hạn đăng nhập",
@ -1177,7 +1182,7 @@
"event_advanced_tab_title": "Nâng cao",
"event_setup_multiple_duration_error": "Thiết lập sự kiện: Nhiều khoảng thời gian cần ít nhất 1 tuỳ chọn.",
"event_setup_multiple_duration_default_error": "Thiết lập sự kiện: Vui lòng chọn một khoảng thời gian mặc định hợp lệ.",
"event_setup_booking_limits_error": "Giới hạn lịch hẹn phải theo thứ tự tăng dần. [ngày,tuần,tháng,năm]",
"event_setup_booking_limits_error": "Giới hạn lịch hẹn phải theo thứ tự tăng dần. [ngày, tuần, tháng, năm]",
"event_setup_duration_limits_error": "Giới hạn thời gian phải được đặt theo thứ tự tăng dần. [ngày, tuần, tháng, năm]",
"select_which_cal": "Chọn lịch nào cần thêm lịch hẹn vào",
"custom_event_name": "Tên sự kiện tuỳ chỉnh",
@ -1200,7 +1205,7 @@
"start_of_week": "Khởi đầu tuần",
"recordings_title": "Bản ghi âm",
"recording": "Bản ghi âm",
"happy_scheduling": "Đặt lịch vui",
"happy_scheduling": "Chúc bạn đặt lịch vui vẻ",
"select_calendars": "Chọn lịch nào mà bạn muốn kiểm tra xung đột nhằm tránh đặt lịch hẹn trùng.",
"check_for_conflicts": "Kiểm tra xung đột",
"view_recordings": "Xem các bản ghi âm",
@ -1276,7 +1281,7 @@
"attendee_name_info": "Tên người tham gia lịch hẹn",
"to": "Đến",
"workflow_turned_on_successfully": "Đã {{offOn}} thành công dòng công việc {{workflowName}}",
"download_responses": "Tải xuống Phản hồi",
"download_responses": "Tải xuống phản hồi",
"download_responses_description": "Tải xuống tất cả phản hồi vào biểu mẫu của bạn ở định dạng CSV.",
"download": "Tải về",
"download_recording": "Tải xuống bản ghi âm",
@ -1326,7 +1331,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Bạn có thể thấy tất cả các biểu mẫu và định hướng mà bạn đã tạo ra ở đây.",
"routing_forms_description": "Tạo các biểu mẫu để chuyển hướng người tham dự đến đúng địa điểm",
"routing_forms_send_email_owner": "Gửi email đến chủ sở hữu",
"routing_forms_send_email_owner_description": "Gửi một email đến chủ sở hữu khi biểu mẫu được gửi đi",
"add_new_form": "Thêm biểu mẫu mới",
@ -1380,7 +1385,7 @@
"add_limit": "Thêm giới hạn",
"team_name_required": "Cần có tên nhóm",
"show_attendees": "Chia sẻ thông tin người tham gia cho khách",
"how_booking_questions_as_variables": "Làm cách nào dùng những câu hỏi lịch hẹn ở dạng tham số?",
"how_booking_questions_as_variables": "Làm thế nào để dùng những câu hỏi lịch hẹn ở dạng tham số?",
"format": "Định dạng",
"uppercase_for_letters": "In hoa hết tất cả các chữ cái",
"replace_whitespaces_underscores": "Thay thế khoảng trắng bằng dấu gạch dưới",
@ -1395,7 +1400,7 @@
"billing_help_title": "Cần gì nữa không?",
"billing_help_description": "Nếu bạn cần thêm bất kỳ trợ giúp nào về thanh toán, nhóm hỗ trợ của chúng tôi luôn sẵn sàng trợ giúp.",
"billing_help_cta": "Liên hệ với bộ phận hỗ trợ",
"ignore_special_characters_booking_questions": "Bỏ qua những kí tự đặc biệt trong mã định danh câu hỏi lịch hẹn. Chỉ dùng chữ cái và số",
"ignore_special_characters_booking_questions": "Bỏ qua những ký tự đặc biệt trong mã định danh câu hỏi lịch hẹn. Chỉ dùng chữ cái và số",
"retry": "Thử lại",
"fetching_calendars_error": "Có vấn đề khi tìm dữ liệu của bạn. Vui lòng <1>thử lại</1> hoặc liên hệ với bộ phận hỗ trợ khách hàng.",
"calendar_connection_fail": "Kết nối lịch bất thành",
@ -1488,7 +1493,7 @@
"email_subject_slug_replacement": "Một quản trị viên của nhóm đã thay thế sự kiện của bạn /{{slug}}",
"email_body_slug_replacement_notice": "Một quản trị viên trên nhóm <strong>{{teamName}}</strong> đã thay thế loại sự kiện của bạn <strong>/{{slug}}</strong> bằng một loại sự kiện được quản lý mà họ kiểm soát.",
"email_body_slug_replacement_info": "Liên kết của bạn sẽ tiếp tục hoạt động nhưng một số thiết lập cho nó có thể thay đổi. Bạn có thể xem lại nó trong những loại sự kiện.",
"email_body_slug_replacement_suggestion": "Nếu bạn có thắc mắc gì về loại sự kiện này, vui lòng liên lạc với quản trị viên của bạn. <br /><br />Đặt lịch vui,<br /> Nhóm Cal.com",
"email_body_slug_replacement_suggestion": "Nếu bạn có thắc mắc gì về loại sự kiện này, vui lòng liên lạc với quản trị viên của bạn. <br /><br />Chúc bạn đặt lịch vui vẻ,<br /> Nhóm Cal.com",
"disable_payment_app": "Một quản trị viên đã tắt {{appName}} vốn có ảnh hưởng đến loại sự kiện {{title}}. Người tham dự vẫn có thể đặt hẹn cho loại sự kiện này nhưng sẽ được nhắc trả phí. Bạn có thể ẩn loại sự kiện này để tránh điều này cho đến khi quản trị viên kích hoạt lại phương thức thanh toán của bạn.",
"payment_disabled_still_able_to_book": "Người tham dự vẫn có thể đặt hẹn cho loại sự kiện này nhưng sẽ được nhắc trả phí. Bạn có thể ẩn loại sự kiện này để tránh điều này cho đến khi quản trị viên kích hoạt lại phương thức thanh toán của bạn.",
"app_disabled_with_event_type": "Quản trị viên đã tắt {{appName}} vốn có ảnh hưởng đến loại sự kiện {{title}}.",
@ -1687,9 +1692,9 @@
"add_a_new_route": "Thêm một Định hướng mới",
"make_informed_decisions": "Đưa ra những quyết định sáng suốt với Insights",
"make_informed_decisions_description": "Bảng điều khiển Insights của chúng tôi nằm ở bề mặt xuyên suốt nhóm bạn và hiển thị cho bạn thấy những xu hướng giúp đặt lịch nhóm và ra quyết định tốt hơn.",
"view_bookings_across": "Xem lịch hẹn mọi thành viên",
"view_bookings_across": "Xem lịch hẹn cho mọi thành viên",
"view_bookings_across_description": "Xem ai nhận được nhiều lịch hẹn nhất và bảo đảm việc phân phối tốt nhất cho khắp nhóm",
"identify_booking_trends": "Nhận diện xu hướng lịch hẹn",
"identify_booking_trends": "Xác định xu hướng lịch hẹn",
"identify_booking_trends_description": "Xem thời điểm nào trong tuần và thời điểm nào trong ngày là thời điểm phổ biến cho người đặt lịch hẹn bên bạn",
"spot_popular_event_types": "Nhận ra các loại sự kiện phổ biến",
"spot_popular_event_types_description": "Xem loại sự kiện nào của bạn nhận được nhiều lần nhấp chuột và nhiều lịch hẹn nhất",
@ -1707,8 +1712,8 @@
"timezone_info": "Múi giờ của người nhận",
"event_end_time_variable": "Thời gian kết thúc sự kiện",
"event_end_time_info": "Thời gian kết thúc sự kiện",
"cancel_url_variable": "URL huỷ lịch",
"cancel_url_info": "URL để huỷ lịch hẹn",
"cancel_url_variable": "URL hủy lịch",
"cancel_url_info": "URL để hủy lịch hẹn",
"reschedule_url_variable": "URL đặt lịch lại",
"reschedule_url_info": "URL để đặt lịch hẹn lại",
"invalid_event_name_variables": "Có biến số không hợp lệ trong tên sự kiện của bạn",
@ -1732,10 +1737,10 @@
"managed_event_dialog_title_other": "URL /{{slug}} đã có sẵn cho {{count}} thành viên. Bạn có muốn thay thế nó?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> đã dùng URL <strong>/{{slug}}</strong> rồi.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> đã dùng URL <string>/{{slug}}</strong> rồi.",
"managed_event_dialog_clarification": "Nếu bạn chọn phương án thay thế nó, chúng tôi sẽ thông báo cho họ biết. Hãy quay lại và x bỏ họ nếu bạn không muốn ghi đè nó.",
"managed_event_dialog_clarification": "Nếu bạn chọn phương án thay thế nó, chúng tôi sẽ thông báo cho họ biết. Hãy quay lại và xóa bỏ họ nếu bạn không muốn ghi đè nó.",
"review_event_type": "Xem lại loại sự kiện",
"looking_for_more_analytics": "Đang tìm thêm công cụ phân tích?",
"looking_for_more_insights": "Đang tìm thêm Insights?",
"looking_for_more_analytics": "Bạn muốn có thêm thông tin phân tích?",
"looking_for_more_insights": "Bạn muốn có thêm Insights?",
"add_filter": "Thêm bộ lọc",
"select_user": "Chọn người dùng",
"select_event_type": "Chọn loại sự kiện",
@ -1747,7 +1752,7 @@
"least_booked_members": "Thành viên được đặt lịch hẹn ít nhất",
"events_created": "Những sự kiện đã tạo",
"events_completed": "Những sự kiện đã hoàn thành",
"events_cancelled": "Những sự kiện đã huỷ",
"events_cancelled": "Những sự kiện đã hủy",
"events_rescheduled": "Những sự kiện đã đặt lịch lại",
"from_last_period": "từ thời gian gần nhất",
"from_to_date_period": "Từ: {{startDate}} Đến: {{endDate}}",
@ -1755,11 +1760,11 @@
"subtitle_analytics": "Tìm hiểu thêm về hoạt động của nhóm bạn",
"redirect_url_warning": "Thêm mục chuyển hướng sẽ tắt đi trang thành công. Hãy bảo đảm có đề cập \"Lịch hẹn đã xác nhận\" trên trang thành công tuỳ chỉnh riêng của bạn.",
"event_trends": "Xu hướng sự kiện",
"clear_filters": "X bộ lọc",
"hold": "Giữ đó",
"clear_filters": "Xóa bộ lọc",
"hold": "Tạm giữ",
"on_booking_option": "Thu tiền thanh toán cho lịch hẹn",
"hold_option": "Tính phí vắng mặt",
"card_held": "Thẻ đã được giữ",
"card_held": "Thẻ đã được tạm giữ",
"charge_card": "Tính phí cho thẻ",
"card_charged": "Thẻ đã thu phí",
"no_show_fee_amount": "Phí vắng mặt {{amount, currency}}",
@ -1776,7 +1781,7 @@
"insights": "Insights",
"testing_workflow_info_message": "Khi kiểm tra tiến độ công việc này, hãy để ý rằng Email và SMS chỉ có thể được đặt lịch trước ít nhất 1 giờ",
"insights_no_data_found_for_filter": "Không tìm thấy dữ liệu cho bộ lọc hay ngày đã chọn.",
"acknowledge_booking_no_show_fee": "Tôi công nhận là nếu tôi không tham dự sự kiện này thì một khoản phí vắng mặt gồm {{amount, currency}} sẽ được áp dụng cho thẻ của tôi.",
"acknowledge_booking_no_show_fee": "Tôi công nhận là nếu tôi không tham dự sự kiện này thì một khoản phí vắng mặt {{amount, currency}} sẽ được áp dụng cho thẻ của tôi.",
"card_details": "Chi tiết thẻ",
"seats_and_no_show_fee_error": "Hiện không thể kích hoạt chỗ ngồi và tính khoản phí vắng mặt",
"complete_your_booking": "Hoàn thành lịch hẹn của bạn",

View File

@ -26,6 +26,8 @@
"rejection_confirmation": "拒绝预约",
"manage_this_event": "管理此活动",
"invite_team_member": "邀请团队成员",
"invite_team_individual_segment": "邀请个人",
"invite_team_bulk_segment": "批量导入",
"invite_team_notifcation_badge": "邀请",
"your_event_has_been_scheduled": "您的活动已预约",
"your_event_has_been_scheduled_recurring": "您的定期活动已安排",
@ -222,6 +224,7 @@
"go_back_login": "返回登录页面",
"error_during_login": "登录时发生错误,请返回登录界面,然后重试。",
"request_password_reset": "请求重置电子邮件",
"send_invite": "发送邀请",
"forgot_password": "忘记密码?",
"forgot": "忘记了?",
"done": "完成",
@ -237,6 +240,8 @@
"set_availability": "设置您的可预约状态",
"continue_without_calendar": "无日历继续",
"connect_your_calendar": "连接您的日历",
"connect_your_video_app": "连接您的视频应用",
"connect_your_video_app_instructions": "连接您的视频应用,以将它们用于您的活动类型。",
"connect_your_calendar_instructions": "连接您的日历以自动检查您繁忙的时间和同步新活动的预约。",
"set_up_later": "稍后设置",
"current_time": "当前时间",
@ -367,6 +372,7 @@
"create_webhook": "创建 Webhook",
"booking_cancelled": "预约已取消",
"booking_rescheduled": "预约已重新安排",
"recording_ready": "录制内容下载链接就绪",
"booking_created": "预约已创建",
"meeting_ended": "会议已结束",
"form_submitted": "表格已提交",
@ -408,7 +414,7 @@
"add_time_availability": "添加新的时间段",
"add_an_extra_layer_of_security": "在您的密码被盗时,能给您的账户添加一层额外的安全保护",
"2fa": "两步验证",
"2fa_disabled": "只能为电子邮件和密码身份验证启用双因素身份验证",
"2fa_disabled": "只能为电子邮件和密码身份验证启用两步验证",
"enable_2fa": "启用两步验证",
"disable_2fa": "禁用两步验证",
"disable_2fa_recommendation": "如果您需要临时禁用两步验证,我们建议尽快重新启用它。",
@ -465,6 +471,7 @@
"friday": "周五",
"saturday": "周六",
"sunday": "周日",
"all_booked_today": "全部已预约。",
"slots_load_fail": "无法加载可用的时间段。",
"additional_guests": "添加访客",
"your_name": "您的姓名",
@ -591,7 +598,7 @@
"round_robin_description": "和多个团队成员之间轮流举行会议。",
"managed_event": "托管活动",
"username_placeholder": "用户名",
"managed_event_description": "批量创建事件类型并分发给团队成员",
"managed_event_description": "批量创建活动类型并分发给团队成员",
"managed": "托管",
"managed_event_url_clarification": "“用户名”将填写所分配成员的用户名",
"assign_to": "分配给",
@ -600,7 +607,7 @@
"count_members_other": "{{count}} 个成员",
"no_assigned_members": "没有已分配的成员",
"assigned_to": "已分配给",
"start_assigning_members_above": "开始分配面的成员",
"start_assigning_members_above": "开始分配上成员",
"locked_fields_admin_description": "成员将无法编辑此内容",
"locked_fields_member_description": "此选项已被团队管理员锁定",
"url": "链接",
@ -752,12 +759,16 @@
"new_event_type_to_book_description": "新建一个活动类型以让他人预约。",
"length": "时长",
"minimum_booking_notice": "最小预约通知提前时间",
"offset_toggle": "偏移开始时间",
"offset_toggle_description": "将显示给预约者的时间段偏移指定的分钟数",
"offset_start": "偏移量",
"offset_start_description": "例如,这将向您的预约者显示时间段 {{ adjustedTime }},而不是 {{ originalTime }}",
"slot_interval": "时间段间隔",
"slot_interval_default": "使用活动时长 (默认)",
"delete_event_type": "删除活动类型?",
"delete_managed_event_type": "创建托管活动类型?",
"delete_managed_event_type": "删除托管活动类型?",
"delete_event_type_description": "您将此链接共享给的任何人都将无法再使用它进行预约。",
"delete_managed_event_type_description": "<ul><li>分配给此活动类型的成员也将删除其活动类型。</li><li>他们将链接共享给的任何人都将无法再使用它进行预约。</li></ul>",
"delete_managed_event_type_description": "<ul><li>分配给此活动类型的成员其活动类型也将被删除。</li><li>如果他们将自己的链接共享给其他人,这些人也都将无法再使用该链接进行预约。</li></ul>",
"confirm_delete_event_type": "是,删除",
"delete_account": "删除账户",
"confirm_delete_account": "是,删除账户",
@ -1179,7 +1190,7 @@
"event_advanced_tab_title": "高级",
"event_setup_multiple_duration_error": "活动设置: 多个时长需要至少 1 个选项。",
"event_setup_multiple_duration_default_error": "活动设置: 请选择有效的默认时长。",
"event_setup_booking_limits_error": "预约限制必须按升序排列。[日,周,月,年]",
"event_setup_booking_limits_error": "预约限制必须按升序排列[日、周、月、年]",
"event_setup_duration_limits_error": "时长限制必须按升序排列。[日, 周, 月, 年]",
"select_which_cal": "选择要添加预约的日历",
"custom_event_name": "自定义活动名称",
@ -1280,7 +1291,7 @@
"attendee_name_info": "预约人的姓名",
"to": "至",
"workflow_turned_on_successfully": "{{workflowName}} 工作流程已成功{{offOn}}",
"download_responses": "下载回",
"download_responses": "下载回",
"download_responses_description": "以 CSV 格式下载对表格的所有回复。",
"download": "下载",
"download_recording": "下载录制内容",
@ -1330,7 +1341,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "您可以在此处看到您创建的所有表格和途径。",
"routing_forms_description": "创建表格以将参与者引导到正确的目的地",
"routing_forms_send_email_owner": "向所有者发送电子邮件",
"routing_forms_send_email_owner_description": "提交表单后向所有者发送电子邮件",
"add_new_form": "添加新表格",
@ -1399,7 +1410,7 @@
"billing_help_title": "还有其他需要?",
"billing_help_description": "如果您在支付帐单时需要任何进一步的帮助,我们的支持团队随时为您提供。",
"billing_help_cta": "联系支持",
"ignore_special_characters_booking_questions": "忽略预约问题标识符中的特殊字符。仅使用字母和数字",
"ignore_special_characters_booking_questions": "忽略您的预约问题标识符中的特殊字符。仅使用字母和数字",
"retry": "重试",
"fetching_calendars_error": "获取您的日历时出现问题。请<1>重试</1>或联系客户支持。",
"calendar_connection_fail": "日历连接失败",
@ -1488,10 +1499,10 @@
"duration_limit_reached": "已达到此活动类型的时长限制",
"admin_has_disabled": "管理员已禁用 {{appName}}",
"disabled_app_affects_event_type": "管理员已禁用会影响活动类型 {{eventType}} 的 {{appName}}",
"event_replaced_notice": "管理员已替换您的一个活动类型",
"email_subject_slug_replacement": "团队管理员已替换您的活动/{{slug}}",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong> 团队的管理员已将您的活动类型 <strong>{{slug}}</strong> 替换为他们控制的托管活动类型。",
"email_body_slug_replacement_info": "您的链接将继续有效,但其某些设置可能已更改。您可以在活动类型中查看。",
"event_replaced_notice": "一位管理员已替换您的其中一个活动类型",
"email_subject_slug_replacement": "一位团队管理员已替换您的活动/{{slug}}",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong> 团队的一位管理员已将您的活动类型 <strong>{{slug}}</strong> 替换为他们控制的托管活动类型。",
"email_body_slug_replacement_info": "您的链接将继续有效,但其某些设置可能已更改。您可以在活动类型中进行查看。",
"email_body_slug_replacement_suggestion": "如果您对活动类型有任何疑问,请联系您的管理员。<br /><br />祝日程安排愉快,<br />Cal.com 团队",
"disable_payment_app": "管理员已禁用会影响活动类型 {{title}} 的 {{appName}}。参与者仍然能预约此类型的活动,但不会被提示付款。您可以隐藏该活动类型来防止出现这种情况,直到管理员重新启用您的支付方式。",
"payment_disabled_still_able_to_book": "参与者仍然能预约此类型的活动,但不会被提示付款。您可以隐藏该活动类型来防止出现这种情况,直到管理员重新启用您的支付方式。",
@ -1624,6 +1635,7 @@
"email_user_cta": "查看邀请",
"email_no_user_invite_heading": "您已被邀请在 {{appName}} 加入一个团队",
"email_no_user_invite_subheading": "{{invitedBy}} 已邀请您加入他们在 {{appName}} 上的团队。{{appName}} 是一个活动安排调度程序,让您和您的团队无需通过电子邮件沟通即可安排会议。",
"email_user_invite_subheading": "{{invitedBy}} 已邀请您加入他们在 {{appName}} 上的团队“{{teamName}}”。{{appName}} 是一个活动安排调度程序,让您和您的团队无需通过电子邮件沟通即可安排会议。",
"email_no_user_invite_steps_intro": "我们将引导您完成几个简短步骤,您将立即与您的团队一起享受无压力的日程安排。",
"email_no_user_step_one": "选择您的用户名",
"email_no_user_step_two": "连接您的日历账户",
@ -1690,15 +1702,24 @@
"select_a_router": "选择途径",
"add_a_new_route": "添加新途径",
"make_informed_decisions": "使用 Insights 做出明智的决策",
"make_informed_decisions_description": "我们的 Insights 仪表板会显示您团队的所有活动,并向您展示趋势,以便更好地进行团队日程安排和制定决策。",
"make_informed_decisions_description": "我们的 Insights 仪表板会显示您团队的所有活动,并向您展示趋势,以便更好地进行团队日程安排和制定决策。",
"view_bookings_across": "查看所有成员的预约",
"view_bookings_across_description": "查看谁收到的预约最多,并确保在团队中实现最佳分配",
"identify_booking_trends": "确定预约趋势",
"identify_booking_trends_description": "查看一周中的哪些时间和一天中的哪些时间受预约者欢迎",
"identify_booking_trends_description": "查看一周中和一天中最受预约者欢迎的时段",
"spot_popular_event_types": "发现热门的活动类型",
"spot_popular_event_types_description": "查看哪些活动类型获得最多点击和预约",
"spot_popular_event_types_description": "查看获得最多点击和预约的活动类型",
"no_responses_yet": "尚无回复",
"this_will_be_the_placeholder": "这将是占位符",
"error_booking_event": "预订活动时发生错误,请刷新页面并重试",
"timeslot_missing_title": "未选择时间段",
"timeslot_missing_description": "请选择要预约活动的时间段。",
"timeslot_missing_cta": "选择时间段",
"switch_monthly": "切换到每月视图",
"switch_weekly": "切换到每周视图",
"switch_multiday": "切换到日视图",
"num_locations": "{{num}} 个位置选项",
"select_on_next_step": "在下一步选择",
"this_meeting_has_not_started_yet": "此会议尚未开始",
"this_app_requires_connected_account": "{{appName}} 需要已连接的 {{dependencyName}} 账户",
"connect_app": "连接 {{dependencyName}}",
@ -1718,18 +1739,18 @@
"invalid_event_name_variables": "活动名称中存在无效变量",
"select_all": "全选",
"default_conferencing_bulk_title": "批量更新现有活动类型",
"members_default_schedule": "成员的默认时间表",
"members_default_schedule": "成员的默认日程安排",
"set_by_admin": "由团队管理员设置",
"members_default_location": "成员的默认位置",
"members_default_schedule_description": "我们将使用每个成员的默认可预约时间表。他们将能够编辑或更改它。",
"requires_at_least_one_schedule": "您需要至少有一个时间表",
"members_default_schedule_description": "我们将使用每位成员的默认可用日程安排。他们可对其进行编辑或更改。",
"requires_at_least_one_schedule": "您需要至少有一个日程安排",
"default_conferencing_bulk_description": "更新选定活动类型的位置",
"locked_for_members": "为成员锁定",
"locked_for_members": "为成员锁定",
"locked_apps_description": "成员将能够查看活动的应用,但不能编辑任何应用设置",
"locked_webhooks_description": "成员将能够查看活动的 Webhook但不能编辑任何 Webhook 设置",
"locked_workflows_description": "成员将能够查看活动的工作流程,但不能编辑任何工作流程设置",
"locked_by_admin": "被团队管理员锁定",
"app_not_connected": "您尚未连接 {{appName}} 户。",
"app_not_connected": "您尚未连接 {{appName}} 户。",
"connect_now": "立即连接",
"managed_event_dialog_confirm_button_one": "替换并通知 {{count}} 个成员",
"managed_event_dialog_confirm_button_other": "替换并通知 {{count}} 个成员",
@ -1739,8 +1760,8 @@
"managed_event_dialog_information_other": "<strong>{{names}}</strong> 已经在使用 <string>/{{slug}}</strong> 链接。",
"managed_event_dialog_clarification": "如果您选择将其替换,我们会通知他们。如果您不想将其覆盖,请返回并移除。",
"review_event_type": "查看活动类型",
"looking_for_more_analytics": "寻找更多分析?",
"looking_for_more_insights": "寻找更多洞察?",
"looking_for_more_analytics": "寻找更多分析?",
"looking_for_more_insights": "寻找更多的 Insights?",
"add_filter": "添加筛选器",
"select_user": "选择用户",
"select_event_type": "选择活动类型",
@ -1750,11 +1771,11 @@
"average_event_duration": "平均活动持续时间",
"most_booked_members": "预约最多的成员",
"least_booked_members": "预约最少的成员",
"events_created": "创建的活动",
"events_completed": "完成的活动",
"events_cancelled": "取消的活动",
"events_rescheduled": "重新安排的活动",
"from_last_period": "从上一期间",
"events_created": "创建的活动",
"events_completed": "完成的活动",
"events_cancelled": "取消的活动",
"events_rescheduled": "重新安排的活动",
"from_last_period": "从上一时段开始",
"from_to_date_period": "开始日期: {{startDate}} 结束日期: {{endDate}}",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "详细了解团队的活动",
@ -1772,26 +1793,45 @@
"submit_card": "提交卡",
"submit_payment_information": "提交付款信息",
"meeting_awaiting_payment_method": "您的会议正在等待付款方式",
"no_show_fee_charged_email_subject": "已 {{date}} 的 {{title}} 收取 {{amount, currency}} 的失约费",
"no_show_fee_charged_email_subject": "已针对 {{date}} 的 {{title}} 收取 {{amount, currency}} 的失约费",
"no_show_fee_charged_text_body": "已收取失约费",
"no_show_fee_charged_subtitle": "已以下活动收取 {{amount, currency}} 的失约费",
"no_show_fee_charged_subtitle": "已针对以下活动收取 {{amount, currency}} 的失约费",
"error_charging_card": "收取失约费时出错。请稍后再试。",
"collect_no_show_fee": "收取失约费",
"no_show_fee_charged": "已收取失约费",
"insights": "Insights",
"testing_workflow_info_message": "测试此工作流程时请注意,电子邮件和短信只能提前至少 1 小时安排",
"testing_workflow_info_message": "测试此工作流程时请注意,电子邮件和短信必须提前至少 1 小时安排",
"insights_no_data_found_for_filter": "未找到所选筛选器或所选日期的数据。",
"acknowledge_booking_no_show_fee": "我确认,如果我不参加此活动,我的卡将被收取 {{amount, currency}} 的失约费。",
"acknowledge_booking_no_show_fee": "我同意,如果我不参加此活动,将从我的卡中收取 {{amount, currency}} 的失约费。",
"card_details": "卡详细信息",
"seats_and_no_show_fee_error": "当前无法启用位置和收取失约费",
"complete_your_booking": "完成您的预约",
"complete_your_booking_subject": "完成您的预约: {{date}} 的 {{title}}",
"confirm_your_details": "确认您的详细信息",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "您即将向参与者收取费用 {{amount, currency}}。您确定要继续吗?",
"charge_attendee": "向参与者收取费用 {{amount, currency}}",
"payment_app_commission": "需要付款({{paymentFeePercentage}}% + 每笔交易 {{fee, currency}} 佣金)",
"email_invite_team": "{{email}} 已被邀请",
"email_invite_team_bulk": "{{userCount}} 名用户已被邀请",
"error_collecting_card": "收集卡时出错",
"image_size_limit_exceed": "上传的图像不应超过 5mb 大小限制",
"inline_embed": "内联嵌入",
"floating_pop_up_button": "浮动弹出式按钮",
"pop_up_element_click": "通过点击元素弹出",
"open_dialog_with_element_click": "当有人点击元素时,打开您的 Cal 对话框。",
"book_my_cal": "预约我的 Cal",
"invite_as": "邀请为",
"form_updated_successfully": "表单更新成功。",
"email_not_cal_member_cta": "加入您的团队",
"disable_attendees_confirmation_emails": "禁用参与者的默认确认电子邮件",
"disable_attendees_confirmation_emails_description": "该活动类型中至少有一个工作流程处于活动状态,当该活动被预约时,将向参与者发送电子邮件。",
"disable_host_confirmation_emails": "禁用主持人的默认确认电子邮件",
"disable_host_confirmation_emails_description": "该活动类型中至少有一个工作流程处于活动状态,当该活动被预约时,将向主持人发送电子邮件。",
"add_an_override": "添加替代",
"import_from_google_workspace": "从 Google Workspace 导入用户",
"connect_google_workspace": "连接 Google Workspace",
"google_workspace_admin_tooltip": "您必须是 Workspace 管理员才能使用此功能",
"first_event_type_webhook_description": "为此活动类型创建第一个 Webhook",
"create_for": "创建"
}

View File

@ -593,12 +593,12 @@
"username_placeholder": "使用者名稱",
"managed_event_description": "大量建立並分配活動類型給團隊成員",
"managed": "受管",
"managed_event_url_clarification": "「使用者名稱」會填入指派成員的使用者名稱",
"managed_event_url_clarification": "「使用者名稱」會填入指派成員的使用者名稱",
"assign_to": "指派給",
"add_members": "新增成員…",
"add_members": "新增成員…",
"count_members_one": "{{count}} 名成員",
"count_members_other": "{{count}} 名成員",
"no_assigned_members": "指派成員",
"no_assigned_members": "無已指派成員",
"assigned_to": "已指派給",
"start_assigning_members_above": "開始指派以上成員",
"locked_fields_admin_description": "成員將無法編輯此欄位",
@ -756,8 +756,8 @@
"slot_interval_default": "使用活動長度(預設)",
"delete_event_type": "要刪除活動類型嗎?",
"delete_managed_event_type": "要刪除受管活動類型嗎?",
"delete_event_type_description": "與您共用此連結的任何使用者將無法再使用此連結預約。",
"delete_managed_event_type_description": "<ul><li>對於獲指派此活動類型的成員,他們的活動類型也將遭到刪除。</li><li>與他們共用此連結的任何使用者將無法再使用此連結預約。</li></ul>",
"delete_event_type_description": "和您共用此連結的任何使用者都無法再使用此連結預約。",
"delete_managed_event_type_description": "<ul><li>對於獲指派此活動類型的成員,其活動類型也將被刪除。</li><li>和他們共用此連結的任何使用者都無法再使用此連結預約。</li></ul>",
"confirm_delete_event_type": "是,刪除",
"delete_account": "刪除帳號",
"confirm_delete_account": "是,刪除帳號",
@ -1154,7 +1154,7 @@
"variable_format": "變數格式",
"webhook_subscriber_url_reserved": "已定義 Webhook 訂閱者網址",
"custom_input_as_variable_info": "忽略額外輸入標籤的所有特殊字元 (只使用字母和數字),所有字母一律使用大寫,並以底線取代空格。",
"using_booking_questions_as_variables": "如何將預約問題當作變數?",
"using_booking_questions_as_variables": "如何將預約問題當作變數?",
"download_desktop_app": "下載桌面版應用程式",
"set_ping_link": "設定 Ping 連結",
"rate_limit_exceeded": "已超過限速",
@ -1326,7 +1326,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "您可以在這裡查看您已建立的所有表單和引導路徑。",
"routing_forms_description": "建立表單以將參與者引導到正確的目的地",
"routing_forms_send_email_owner": "傳送電子郵件給擁有者",
"routing_forms_send_email_owner_description": "表單提交後傳送電子郵件給擁有者",
"add_new_form": "新增新表單",
@ -1487,7 +1487,7 @@
"event_replaced_notice": "管理員已取代您其中一個活動類型",
"email_subject_slug_replacement": "團隊管理員已取代您的活動/{{slug}}",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong> 團隊管理員已使用其所控管的受管活動類型來取代您的活動類型<strong>/{{slug}}</strong>。",
"email_body_slug_replacement_info": "您的連結會繼續正常運作,但該連結的部分設定可能已變更。您可以在活動類型中檢閱相關設定。",
"email_body_slug_replacement_info": "您的連結會繼續正常運作,但該連結的某些設定可能已變更。您可以在活動類型中查看。",
"email_body_slug_replacement_suggestion": "若您對於活動類型有任何疑問,請聯絡您的管理員。<br /><br />祝排程愉快。<br />Cal.com 團隊",
"disable_payment_app": "管理員已停用會影響 {{title}} 活動類型的 {{appName}}。與會者仍可預約此類型活動,但不會收到付費提示。您也可以隱藏此活動類型來避免這種情況,直到管理員再次啟用您的付款方式為止。",
"payment_disabled_still_able_to_book": "與會者仍可預約此類型活動,但不會收到付費提示。您也可以隱藏此活動類型來避免這種情況,直到管理員再次啟用您的付款方式。",
@ -1551,7 +1551,7 @@
"create_your_first_team_webhook_description": "為此團隊活動類型建立第一個 Webhook",
"create_webhook_team_event_type": "為此團隊活動類型建立 Webhook",
"disable_success_page": "停用「成功」頁面 (只適用於您有重新導向網址時)",
"invalid_admin_password": "您是管理員,但您的密碼長度未符合至少 15 個字元的限制,或未啟用兩階段驗證",
"invalid_admin_password": "您是管理員,但您的密碼長度未符合至少 15 個字元的限制,或是尚未啟用兩階段驗證",
"change_password_admin": "變更密碼以獲得管理員存取權",
"username_already_taken": "已有人使用此使用者名稱",
"assignment": "指派",
@ -1689,10 +1689,10 @@
"make_informed_decisions_description": "我們的 Insights 儀表版會顯示您團隊內部的所有活動,並顯示有助於團隊排程和決策的趨勢。",
"view_bookings_across": "查看所有成員的預約",
"view_bookings_across_description": "查看誰收到最多預約,並確保預約妥善分配給所有團隊成員",
"identify_booking_trends": "判斷出預約趨勢",
"identify_booking_trends_description": "查看當週和當天最受預約者青睞的時段",
"spot_popular_event_types": "探索熱門活動類型",
"spot_popular_event_types_description": "查看您哪個活動類型的點閱次數和預約次數最多",
"identify_booking_trends": "出預約趨勢",
"identify_booking_trends_description": "查看當週和當天最受預約者歡迎的時段",
"spot_popular_event_types": "找出熱門活動類型",
"spot_popular_event_types_description": "查看哪種活動類型的點閱次數及預約次數最多",
"no_responses_yet": "還沒有回應",
"this_will_be_the_placeholder": "此處會是佔位符",
"this_meeting_has_not_started_yet": "此會議尚未開始",
@ -1709,16 +1709,16 @@
"event_end_time_info": "活動結束時間",
"cancel_url_variable": "取消網址",
"cancel_url_info": "取消此預約的網址",
"reschedule_url_variable": "重新預定網址",
"reschedule_url_info": "重新預定此預約的網址",
"reschedule_url_variable": "重新安排網址",
"reschedule_url_info": "重新安排此預約的網址",
"invalid_event_name_variables": "您的活動名稱包含無效的變數",
"select_all": "全部選擇",
"default_conferencing_bulk_title": "大量更新現有活動類型",
"members_default_schedule": "成員的預設行程表",
"set_by_admin": "由團隊管理員設定",
"members_default_location": "成員的預設位置",
"members_default_schedule_description": "我們會使用每位成員的預設開放時間行程表。他們將能編輯或變更該行程表。",
"requires_at_least_one_schedule": "您需要擁有至少一個行程表",
"members_default_schedule_description": "我們會使用每位成員的預設開放時間行程表。他們可以編輯或變更該行程表。",
"requires_at_least_one_schedule": "您必須擁有至少一個行程表",
"default_conferencing_bulk_description": "更新所選活動類型的地點",
"locked_for_members": "已為成員鎖定",
"locked_apps_description": "成員將能查看啟用的應用程式,但無法編輯任何應用程式設定",
@ -1733,7 +1733,7 @@
"managed_event_dialog_information_one": "<strong>{{names}}</strong> 已在使用 <strong>/{{slug}}</strong> 網址。",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> 已在使用 <string>/{{slug}}</strong> 網址。",
"managed_event_dialog_clarification": "如果您選擇取代,我們會通知他們;如果不想覆寫既有網址,請返回並移除。",
"review_event_type": "檢閱活動類型",
"review_event_type": "查看活動類型",
"looking_for_more_analytics": "在找更多分析嗎?",
"looking_for_more_insights": "在找更多 Insights 嗎?",
"add_filter": "新增篩選條件",
@ -1749,7 +1749,7 @@
"events_completed": "已完成的活動",
"events_cancelled": "已取消的活動",
"events_rescheduled": "已重新預定的活動",
"from_last_period": "從最後一個時期",
"from_last_period": "從上一個時段",
"from_to_date_period": "開始:{{startDate}} 結束:{{endDate}}",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "進一步瞭解您的團隊活動",

View File

@ -179,7 +179,7 @@ html.todesktop-platform-darwin.light main.bg-default{
background: rgba(255,255,255,0.8) !important
}
/*
/*
html.todesktop aside a {
height: 28px;
padding: 0px 8px;
@ -497,4 +497,16 @@ select:focus {
-webkit-appearance: none;
}
.react-tel-input .country-list .country:hover,
.react-tel-input .country-list .country.highlight {
@apply !bg-emphasis;
}
.react-tel-input .flag-dropdown .selected-flag,
.react-tel-input .flag-dropdown.open .selected-flag {
@apply !bg-default;
}
.react-tel-input .flag-dropdown {
@apply !border-r-default !border-y-0 !border-l-0 left-0.5;
}

View File

@ -77,5 +77,5 @@ it("should render city name as option label if cityData is not empty", () => {
});
it("should return timezone as option label if cityData is empty", () => {
expect(handleOptionLabel(option, [])).toMatchInlineSnapshot(`"America/Los_Angeles GMT -8:00"`);
expect(handleOptionLabel(option, [])).toMatchInlineSnapshot(`"America/Los Angeles GMT -8:00"`);
});

View File

@ -1,3 +1,5 @@
import { z } from "zod";
import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData";
import { getAppFromSlug } from "@calcom/app-store/utils";
import prisma, { safeAppSelect, safeCredentialSelect } from "@calcom/prisma";
@ -35,6 +37,7 @@ export async function getAppRegistry() {
select: { dirName: true, slug: true, categories: true, enabled: true },
});
const apps = [] as App[];
const mostPopularApps = await getMostPopularApps();
for await (const dbapp of dbApps) {
const app = await getAppWithMetadata(dbapp);
if (!app) continue;
@ -47,6 +50,7 @@ export async function getAppRegistry() {
category: app.category || "other",
installed:
true /* All apps from DB are considered installed by default. @TODO: Add and filter our by `enabled` property */,
installCount: mostPopularApps[dbapp.slug] || 0,
});
}
return apps;
@ -82,6 +86,7 @@ export async function getAppRegistryWithCredentials(userId: number) {
credentials: Credential[];
isDefault?: boolean;
})[];
const mostPopularApps = await getMostPopularApps();
for await (const dbapp of dbApps) {
const app = await getAppWithMetadata(dbapp);
if (!app) continue;
@ -108,6 +113,7 @@ export async function getAppRegistryWithCredentials(userId: number) {
categories: dbapp.categories,
credentials: dbapp.credentials,
installed: true,
installCount: mostPopularApps[dbapp.slug] || 0,
isDefault: usersDefaultApp === dbapp.slug,
...(app.dependencies && { dependencyData }),
});
@ -115,3 +121,25 @@ export async function getAppRegistryWithCredentials(userId: number) {
return apps;
}
async function getMostPopularApps() {
const mostPopularApps = z.array(z.object({ appId: z.string(), installCount: z.number() })).parse(
await prisma.$queryRaw`
SELECT
c."appId",
COUNT(*)::integer AS "installCount"
FROM
"Credential" c
WHERE
c."appId" IS NOT NULL
GROUP BY
c."appId"
ORDER BY
"installCount" DESC
`
);
return mostPopularApps.reduce((acc, { appId, installCount }) => {
acc[appId] = installCount;
return acc;
}, {} as Record<string, number>);
}

View File

@ -4,7 +4,7 @@
"slug": "amie",
"type": "amie_other",
"logo": "icon.svg",
"url": "https://cal.com/apps/amie",
"url": "https://cal.com",
"variant": "other",
"categories": ["calendar"],
"publisher": "Cal.com, Inc.",

View File

@ -5,7 +5,7 @@
"slug": "around",
"type": "around_video",
"logo": "icon.svg",
"url": "https://cal.com/apps/around",
"url": "https://cal.com/",
"variant": "conferencing",
"categories": ["video"],
"publisher": "Cal.com",

View File

@ -4,7 +4,7 @@
"slug": "campfire",
"type": "campfire_video",
"logo": "icon.svg",
"url": "https://cal.com/apps/campfire",
"url": "https://cal.com/",
"variant": "conferencing",
"categories": ["video"],
"publisher": "Cal.com, Inc.",

View File

@ -5,10 +5,10 @@
"slug": "closecom",
"type": "closecom_other_calendar",
"logo": "icon.svg",
"url": "https://cal.com/apps/closecom",
"url": "https://cal.com/",
"variant": "other",
"categories": ["other"],
"publisher": "Cal.com",
"publisher": "Cal.com, Inc.",
"email": "help@cal.com",
"description": "Close is the inside sales CRM of choice for startups and SMBs. Make more calls, send more emails and close more deals starting today.",
"__createdUsingCli": true

View File

@ -4,10 +4,10 @@
"slug": "cron",
"type": "cron_other",
"logo": "logo.png",
"url": "https://cal.com/apps/cron",
"url": "https://github.com/miguelnietoa",
"variant": "other",
"categories": ["calendar"],
"publisher": "miguelnietoa",
"publisher": "Miguel Nieto",
"email": "support@cal.com",
"description": "Cron is the next-generation calendar for professionals and teams.",
"isTemplate": false,

View File

@ -4,12 +4,10 @@
"slug": "eightxeight",
"type": "eightxeight_video",
"logo": "icon.svg",
"url": "https://cal.com/apps/eightxeight",
"url": "https://github.com/shivamklr",
"variant": "conferencing",
"categories": [
"video"
],
"publisher": "shivamklr",
"categories": ["video"],
"publisher": "Shivam Kalra",
"email": "shivamkalra98@gmail.com",
"appData": {
"location": {
@ -25,4 +23,4 @@
"__createdUsingCli": true,
"__template": "event-type-location-video-static",
"dirName": "eightxeight"
}
}

View File

@ -6,7 +6,7 @@
"dirName": "exchangecalendar",
"type": "exchange_calendar",
"logo": "icon.svg",
"url": "https://cal.com/apps/exchange",
"url": "https://cal.com",
"variant": "calendar",
"categories": ["calendar"],
"publisher": "Cal.com",

View File

@ -5,10 +5,10 @@
"slug": "facetime",
"type": "facetime_video",
"logo": "icon.svg",
"url": "https://cal.com/apps/facetime",
"url": "https://github.com/Mythie",
"variant": "conferencing",
"categories": ["video"],
"publisher": "Mythie",
"publisher": "Lucas Smith",
"email": "help@cal.com",
"description": "Facetime makes it super simple for collaborating teams to jump on a video call.",
"__createdUsingCli": true,

View File

@ -4,7 +4,7 @@
"slug": "fathom",
"type": "fathom_analytics",
"logo": "icon.svg",
"url": "https://cal.com/apps/fathom",
"url": "https://cal.com",
"variant": "analytics",
"categories": ["analytics"],
"publisher": "Cal.com, Inc.",

View File

@ -14,7 +14,7 @@
"tag": {
"scripts": [
{
"content": "(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-{TRACKING_ID}');"
"content": "(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','{TRACKING_ID}');"
}
]
}

View File

@ -4,7 +4,12 @@ import { eventTypeAppCardZod } from "@calcom/app-store/eventTypeAppCardZod";
export const appDataSchema = eventTypeAppCardZod.merge(
z.object({
trackingId: z.string(),
trackingId: z.string().transform((val) => {
let trackingId = val.trim();
// Ensure that trackingId is transformed if needed to begin with "GTM-" always
trackingId = !trackingId.startsWith("GTM-") ? `GTM-${trackingId}` : trackingId;
return trackingId;
}),
})
);

View File

@ -3,10 +3,10 @@
"slug": "metapixel",
"type": "metapixel_analytics",
"logo": "icon.svg",
"url": "https://developers.facebook.com/docs/metapixel/",
"url": "https://github.com/regexyl",
"variant": "analytics",
"categories": ["analytics"],
"publisher": "regexyl",
"publisher": "Regina Liu",
"email": "info@regexyl.com",
"description": "Add Meta Pixel to your bookings page to measure, optimize and build audiences for your ad campaigns.",
"extendsFeature": "EventType",

View File

@ -4,7 +4,7 @@
"slug": "mirotalk",
"type": "mirotalk_video",
"logo": "icon.svg",
"url": "https://cal.com/apps/mirotalk",
"url": "https://cal.com/",
"variant": "conferencing",
"categories": ["video"],
"publisher": "Cal.com, Inc.",

View File

@ -4,7 +4,7 @@
"slug": "n8n",
"type": "n8n_automation",
"logo": "icon.svg",
"url": "https://cal.com/apps/n8n",
"url": "https://cal.com/",
"variant": "automation",
"categories": ["automation"],
"publisher": "Cal.com, Inc.",

View File

@ -4,7 +4,7 @@
"slug": "plausible",
"type": "plausible_analytics",
"logo": "icon.svg",
"url": "https://cal.com/apps/plausible",
"url": "https://cal.com/",
"variant": "analytics",
"categories": ["analytics"],
"publisher": "Cal.com, Inc.",

View File

@ -4,7 +4,7 @@
"slug": "qr_code",
"type": "qr_code_other",
"logo": "icon.svg",
"url": "https://cal.com/apps/qr_code",
"url": "https://cal.com/",
"variant": "other",
"categories": ["other"],
"extendsFeature": "EventType",

View File

@ -4,7 +4,7 @@
"slug": "rainbow",
"type": "rainbow_web3",
"logo": "icon.svg",
"url": "https://cal.com/apps/rainbow",
"url": "https://github.com/hexcowboy",
"variant": "web3",
"categories": ["web3"],
"extendsFeature": "EventType",

View File

@ -4,10 +4,10 @@
"slug": "raycast",
"type": "raycast_other",
"logo": "icon.svg",
"url": "https://cal.com/apps/raycast",
"url": "https://github.com/eluce2",
"variant": "other",
"categories": ["other"],
"publisher": "eluce2",
"publisher": "Eric Luce",
"email": "info@restlessmindstech.com",
"description": "Quickly share your Cal.com meeting links with Raycast",
"__createdUsingCli": true

View File

@ -4,10 +4,10 @@
"slug": "riverside",
"type": "riverside_video",
"logo": "icon-dark.svg",
"url": "https://cal.com/apps/riverside",
"url": "https://cal.com/",
"variant": "conferencing",
"categories": ["video"],
"publisher": "Cal.com",
"publisher": "Cal.com, Inc.",
"email": "help@cal.com",
"description": "Your online recording studio. The easiest way to record podcasts and videos in studio quality from anywhere. All from the browser.",
"__createdUsingCli": true,

View File

@ -331,7 +331,7 @@ function SingleForm({ form, appUrl, Page }: SingleFormComponentProps) {
{form.routers.map((router) => {
return (
<div key={router.id} className="mr-2">
<Link href={`/${appUrl}/route-builder/${router.id}`}>
<Link href={`${appUrl}/route-builder/${router.id}`}>
<Badge variant="gray">{router.name}</Badge>
</Link>
</div>
@ -353,7 +353,7 @@ function SingleForm({ form, appUrl, Page }: SingleFormComponentProps) {
{connectedForms.map((router) => {
return (
<div key={router.id} className="mr-2">
<Link href={`/${appUrl}/route-builder/${router.id}`}>
<Link href={`${appUrl}/route-builder/${router.id}`}>
<Badge variant="default">{router.name}</Badge>
</Link>
</div>

View File

@ -129,7 +129,7 @@ function NumberWidget({ value, setValue, ...remainingProps }: TextLikeComponentP
type="number"
labelSrOnly={remainingProps.noLabel}
containerClassName="w-full"
className="focus:border-brand-default bg-default dark:bg-muted border-default disabled:bg-emphasis focus:ring-brand block w-full rounded-md text-sm disabled:hover:cursor-not-allowed"
className="bg-default border-default disabled:bg-emphasis focus:ring-brand-default dark:focus:border-emphasis block w-full rounded-md text-sm focus:border-neutral-300 disabled:hover:cursor-not-allowed"
value={value}
onChange={(e) => {
setValue(e.target.value);

View File

@ -5,15 +5,15 @@
"slug": "routing-forms",
"type": "routing-forms_other",
"logo": "icon-dark.svg",
"url": "https://cal.com/apps/routing-forms",
"url": "https://cal.com/resources/feature/routing-forms",
"variant": "other",
"categories": ["other"],
"publisher": "Cal.com",
"publisher": "Cal.com, Inc.",
"email": "help@cal.com",
"licenseRequired": true,
"teamsPlanRequired": {
"upgradeUrl": "/apps/routing-forms/forms"
},
},
"description": "It would allow a booker to connect with the right person or choose the right event, faster. It would work by taking inputs from the booker and using that data to route to the correct booker/event as configured by Cal user",
"__createdUsingCli": true
}

View File

@ -0,0 +1,53 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import jsonLogic from "json-logic-js";
// converts input to lowercase if string
function normalize<T extends string | string[]>(input: T): T {
if (typeof input === "string") {
return input.toLowerCase() as T;
}
if (input instanceof Array) {
return input.map((item) => {
if (typeof item === "string") {
return item.toLowerCase();
}
// if array item is not a string, return it as is
return item;
}) as T;
}
return input;
}
/**
* Single Select equals and not equals uses it
* Short Text equals and not equals uses it
*/
jsonLogic.add_operation("==", function (a: any, b: any) {
return normalize(a) == normalize(b);
});
jsonLogic.add_operation("===", function (a: any, b: any) {
return normalize(a) === normalize(b);
});
jsonLogic.add_operation("!==", function (a: any, b: any) {
return normalize(a) !== normalize(b);
});
jsonLogic.add_operation("!=", function (a: any, b: any) {
return normalize(a) != normalize(b);
});
/**
* Multiselect "equals" and "not equals" uses it
* Singleselect "any in" and "not in" uses it
* Long Text/Short Text/Email/Phone "contains" also uses it.
*/
jsonLogic.add_operation("in", function (a: string, b: string | string[]) {
const first = normalize(a);
const second = normalize(b);
if (!second) return false;
return second.indexOf(first) !== -1;
});
export default jsonLogic;

Some files were not shown because too many files have changed in this diff Show More