merge with main

This commit is contained in:
Alan 2023-09-18 16:42:39 -07:00
commit 1166948016
192 changed files with 4339 additions and 1022 deletions

View File

@ -213,6 +213,10 @@ NEXT_PUBLIC_MINUTES_TO_BOOK=5 # Minutes
# use organizations
ORGANIZATIONS_ENABLED=
# This variable should only be set to 1 or true if you want to autolink external provider sing-ups with
# existing organizations based on email domain address
ORGANIZATIONS_AUTOLINK=
# Vercel Config to create subdomains for organizations
# Get it from https://vercel.com/<TEAM_OR_USER_NAME>/<PROJECT_SLUG>/settings
PROJECT_ID_VERCEL=
@ -225,3 +229,18 @@ AUTH_BEARER_TOKEN_VERCEL=
# Used for E2E tests on Apple Calendar
E2E_TEST_APPLE_CALENDAR_EMAIL=""
E2E_TEST_APPLE_CALENDAR_PASSWORD=""
# - OIDC E2E TEST *******************************************************************************************
# Ensure this ADMIN EMAIL is present in the SAML_ADMINS list
E2E_TEST_SAML_ADMIN_EMAIL=
E2E_TEST_SAML_ADMIN_PASSWORD=
E2E_TEST_OIDC_CLIENT_ID=
E2E_TEST_OIDC_CLIENT_SECRET=
E2E_TEST_OIDC_PROVIDER_DOMAIN=
E2E_TEST_OIDC_USER_EMAIL=
E2E_TEST_OIDC_USER_PASSWORD=
# ***********************************************************************************************************

View File

@ -19,7 +19,7 @@ jobs:
token: ${{ secrets.GH_ACCESS_TOKEN }}
- name: crowdin action
uses: crowdin/github-action@1.5.1
uses: crowdin/github-action@v1.13.0
with:
upload_sources: true
upload_translations: true

18
.github/workflows/merge-conflict vendored Normal file
View File

@ -0,0 +1,18 @@
name: Auto Comment Merge Conflicts
on: push
permissions:
pull-requests: write
jobs:
auto-comment-merge-conflicts:
runs-on: ubuntu-latest
steps:
- uses: codytseng/auto-comment-merge-conflicts@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
comment-body: "Hey there, there is a merge conflict, can you take a look?"
wait-ms: 3000
max-retries: 5
label-name: "🚨 merge conflict"
ignore-authors: dependabot,otherAuthor

View File

@ -7,7 +7,6 @@ public
*.lock
*.log
*.test.ts
.gitignore
.npmignore

View File

@ -135,3 +135,4 @@ If you get errors, be sure to fix them before committing.
- Be sure to [check the "Allow edits from maintainers" option](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork) while creating your PR.
- If your PR refers to or fixes an issue, be sure to add `refs #XXX` or `fixes #XXX` to the PR description. Replacing `XXX` with the respective issue number. See more about [Linking a pull request to an issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue).
- Be sure to fill the PR Template accordingly.
- Review [App Contribution Guidelines](./packages/app-store/CONTRIBUTING.md) when building integrations

View File

@ -526,7 +526,7 @@ For example, `Cal.com (support@cal.com)`.
3. Copy Account SID to your `.env` file into the `TWILIO_SID` field
4. Copy Auth Token to your `.env` file into the `TWILIO_TOKEN` field
5. Copy your Twilio phone number to your `.env` file into the `TWILIO_PHONE_NUMBER` field
6. Add your own sender id to the `.env` file into the `NEXT_PUBLIC_SENDER_ID` field (fallback is Cal.com)
6. Add your own sender ID to the `.env` file into the `NEXT_PUBLIC_SENDER_ID` field (fallback is Cal.com)
7. Create a messaging service (Develop -> Messaging -> Services)
8. Choose any name for the messaging service
9. Click 'Add Senders'

View File

@ -1,2 +1 @@
public/embed
*.test.ts
public/embed

View File

@ -116,6 +116,7 @@ function ConnectedCalendarsList(props: Props) {
type={item.integration.type}
isChecked={cal.isSelected}
destination={cal.externalId === props.destinationCalendarId}
credentialId={cal.credentialId}
/>
))}
</ul>

View File

@ -53,6 +53,7 @@ const ConnectedCalendarItem = (prop: IConnectedCalendarItem) => {
<ul className="p-4">
{calendars?.map((calendar, i) => (
<CalendarSwitch
credentialId={calendar.credentialId}
key={calendar.externalId}
externalId={calendar.externalId}
title={calendar.name || "Nameless Calendar"}

View File

@ -173,7 +173,6 @@ const EnableTwoFactorModal = ({ onEnable, onCancel, open, onOpenChange }: Enable
<div className="mb-4">
<PasswordField
label={t("password")}
type="password"
name="password"
id="password"
required

View File

@ -9,7 +9,7 @@ import { Avatar } from "@calcom/ui";
type TeamType = Omit<NonNullable<TeamWithMembers>, "inviteToken">;
type MembersType = TeamType["members"];
type MemberType = MembersType[number] & { safeBio: string | null };
type MemberType = Pick<MembersType[number], "id" | "name" | "bio" | "username"> & { safeBio: string | null };
type TeamTypeWithSafeHtml = Omit<TeamType, "members" | "inviteToken"> & { members: MemberType[] };
const Member = ({ member, teamName }: { member: MemberType; teamName: string | null }) => {

View File

@ -1,6 +1,6 @@
{
"name": "@calcom/web",
"version": "3.2.9",
"version": "3.3.1",
"private": true,
"scripts": {
"analyze": "ANALYZE=true next build",

View File

@ -154,7 +154,7 @@ export function UserPage(props: InferGetServerSidePropsType<typeof getServerSide
<div className="flex flex-wrap items-center">
<h2 className=" text-default pr-2 text-sm font-semibold">{type.title}</h2>
</div>
<EventTypeDescription eventType={type} isPublic={true} />
<EventTypeDescription eventType={type} isPublic={true} shortenDescription />
</Link>
</div>
</div>

View File

@ -5,10 +5,12 @@ import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/Cale
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
import notEmpty from "@calcom/lib/notEmpty";
import prisma from "@calcom/prisma";
import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential";
const selectedCalendarSelectSchema = z.object({
integration: z.string(),
externalId: z.string(),
credentialId: z.number().optional(),
});
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
@ -24,7 +26,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
id: session.user.id,
},
select: {
credentials: true,
credentials: {
select: credentialForCalendarServiceSelect,
},
timeZone: true,
id: true,
selectedCalendars: true,
@ -37,7 +41,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
const { credentials, ...user } = userWithCredentials;
if (req.method === "POST") {
const { integration, externalId } = selectedCalendarSelectSchema.parse(req.body);
const { integration, externalId, credentialId } = selectedCalendarSelectSchema.parse(req.body);
await prisma.selectedCalendar.upsert({
where: {
userId_integration_externalId: {
@ -50,6 +54,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
userId: user.id,
integration,
externalId,
credentialId,
},
// already exists
update: {},

View File

@ -0,0 +1,16 @@
import type { NextApiRequest, NextApiResponse } from "next";
import prisma from "@calcom/prisma";
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const deleted = await prisma.calendarCache.deleteMany({
where: {
// Delete all cache entries that expired before now
expiresAt: {
lte: new Date(Date.now()),
},
},
});
res.json({ ok: true, count: deleted.count });
}

View File

@ -52,8 +52,6 @@ export default function Login({
totpEmail,
}: inferSSRProps<typeof _getServerSideProps> & WithNonceProps) {
const searchParams = useSearchParams();
const isTeamInvite = searchParams.get("teamInvite");
const { t } = useLocale();
const router = useRouter();
const formSchema = z
@ -97,9 +95,7 @@ export default function Login({
callbackUrl = safeCallbackUrl || "";
const LoginFooter = (
<a
href={callbackUrl !== "" ? `${WEBSITE_URL}/signup?callbackUrl=${callbackUrl}` : `${WEBSITE_URL}/signup`}
className="text-brand-500 font-medium">
<a href={`${WEBSITE_URL}/signup`} className="text-brand-500 font-medium">
{t("dont_have_an_account")}
</a>
);
@ -188,9 +184,6 @@ export default function Login({
? LoginFooter
: null
}>
{isTeamInvite && (
<Alert severity="info" message={t("signin_or_signup_to_accept_invite")} className="mb-4 mt-4" />
)}
<FormProvider {...methods}>
<form onSubmit={methods.handleSubmit(onSubmit)} noValidate data-testid="login-form">
<div>

View File

@ -7,13 +7,8 @@ import { getPremiumMonthlyPlanPriceId } from "@calcom/app-store/stripepayment/li
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
import stripe from "@calcom/features/ee/payments/server/stripe";
import {
hostedCal,
isSAMLLoginEnabled,
samlProductID,
samlTenantID,
samlTenantProduct,
} from "@calcom/features/ee/sso/lib/saml";
import { hostedCal, isSAMLLoginEnabled, samlProductID, samlTenantID } from "@calcom/features/ee/sso/lib/saml";
import { ssoTenantProduct } from "@calcom/features/ee/sso/lib/sso";
import { checkUsername } from "@calcom/lib/server/checkUsername";
import prisma from "@calcom/prisma";
@ -111,7 +106,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
error = "Email not provided";
} else {
try {
const ret = await samlTenantProduct(prisma, emailParam);
const ret = await ssoTenantProduct(prisma, emailParam);
tenant = ret.tenant;
product = ret.product;
} catch (e) {

View File

@ -461,7 +461,7 @@ export default function Success(props: SuccessProps) {
{locationToDisplay && !isCancelled && (
<>
<div className="mt-3 font-medium">{t("where")}</div>
<div className="col-span-2 mt-3">
<div className="col-span-2 mt-3" data-testid="where">
{locationToDisplay.startsWith("http") ? (
<a
href={locationToDisplay}

View File

@ -57,7 +57,7 @@ export default function InsightsPage() {
return (
<div>
<ShellMain hideHeadingOnMobile>
<ShellMain heading="Insights" subtitle={t("insights_subtitle")}>
<UpgradeTip
title={t("make_informed_decisions")}
description={t("make_informed_decisions_description")}

View File

@ -182,6 +182,7 @@ const CalendarsView = () => {
{item.calendars.map((cal) => (
<CalendarSwitch
key={cal.externalId}
credentialId={cal.credentialId}
externalId={cal.externalId}
title={cal.name || "Nameless calendar"}
name={cal.name || "Nameless calendar"}

View File

@ -13,7 +13,6 @@ import { isSAMLLoginEnabled } from "@calcom/features/ee/sso/lib/saml";
import { useFlagMap } from "@calcom/features/flags/context/provider";
import { getFeatureFlagMap } from "@calcom/features/flags/server/utils";
import { IS_SELF_HOSTED, WEBAPP_URL } from "@calcom/lib/constants";
import { getSafeRedirectUrl } from "@calcom/lib/getSafeRedirectUrl";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import slugify from "@calcom/lib/slugify";
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
@ -35,23 +34,6 @@ type FormValues = z.infer<typeof signupSchema>;
type SignupProps = inferSSRProps<typeof getServerSideProps>;
const getSafeCallbackUrl = (url: string | null) => {
if (!url) return null;
let callbackUrl = url;
if (/"\//.test(callbackUrl)) callbackUrl = callbackUrl.substring(1);
// If not absolute URL, make it absolute
if (!/^https?:\/\//.test(callbackUrl)) {
callbackUrl = `${WEBAPP_URL}/${callbackUrl}`;
}
const safeCallbackUrl = getSafeRedirectUrl(callbackUrl);
return safeCallbackUrl;
};
export default function Signup({ prepopulateFormValues, token, orgSlug }: SignupProps) {
const searchParams = useSearchParams();
const telemetry = useTelemetry();
@ -73,7 +55,6 @@ export default function Signup({ prepopulateFormValues, token, orgSlug }: Signup
throw new Error(err.message);
}
};
const callbackUrl = getSafeCallbackUrl(searchParams.get("callbackUrl"));
const signUp: SubmitHandler<FormValues> = async (data) => {
await fetch("/api/auth/signup", {
@ -91,10 +72,13 @@ export default function Signup({ prepopulateFormValues, token, orgSlug }: Signup
.then(async () => {
telemetry.event(telemetryEventTypes.signup, collectPageParameters());
const verifyOrGettingStarted = flags["email-verification"] ? "auth/verify-email" : "getting-started";
await signIn<"credentials">("credentials", {
...data,
callbackUrl: `${callbackUrl ? callbackUrl : `${WEBAPP_URL}/${verifyOrGettingStarted}`}?from=signup`,
callbackUrl: `${
searchParams?.get("callbackUrl")
? `${WEBAPP_URL}/${searchParams.get("callbackUrl")}`
: `${WEBAPP_URL}/${verifyOrGettingStarted}`
}?from=signup`,
});
})
.catch((err) => {
@ -173,7 +157,9 @@ export default function Signup({ prepopulateFormValues, token, orgSlug }: Signup
className="w-full justify-center"
onClick={() =>
signIn("Cal.com", {
callbackUrl: callbackUrl ? callbackUrl : `${WEBAPP_URL}/getting-started`,
callbackUrl: searchParams?.get("callbackUrl")
? `${WEBAPP_URL}/${searchParams.get("callbackUrl")}`
: `${WEBAPP_URL}/getting-started`,
})
}>
{t("login_instead")}

View File

@ -153,11 +153,9 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio, isValidOrgDomain }
) : (
<div className="space-y-6" data-testid="event-types">
<div className="overflow-hidden rounded-sm border dark:border-gray-900">
<div className="text-muted dark:text-inverted p-8 text-center">
<h2 className="font-cal dark:text-inverted text-emphasis600 mb-2 text-3xl">
{" " + t("org_no_teams_yet")}
</h2>
<p className="mx-auto max-w-md">{t("org_no_teams_yet_description")}</p>
<div className="text-muted p-8 text-center">
<h2 className="font-cal text-emphasis mb-2 text-3xl">{" " + t("org_no_teams_yet")}</h2>
<p className="text-emphasis mx-auto max-w-md">{t("org_no_teams_yet_description")}</p>
</div>
</div>
</div>
@ -212,7 +210,7 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio, isValidOrgDomain }
<EventTypes />
{/* Hide "Book a team member button when team is private or hideBookATeamMember is true" */}
{(!team.hideBookATeamMember || team.isPrivate) && (
{!team.hideBookATeamMember && !team.isPrivate && (
<div>
<div className="relative mt-12">
<div className="absolute inset-0 flex items-center" aria-hidden="true">
@ -314,7 +312,13 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
const safeBio = markdownToSafeHTML(team.bio) || "";
const members = team.members.map((member) => {
return { ...member, safeBio: markdownToSafeHTML(member.bio || "") };
return {
name: member.name,
id: member.id,
bio: member.bio,
username: member.username,
safeBio: markdownToSafeHTML(member.bio || ""),
};
});
const markdownStrippedBio = stripMarkdown(team?.bio || "");

View File

@ -1,11 +1,9 @@
import type { GetServerSidePropsContext } from "next";
import { getLayout } from "@calcom/features/MainLayout";
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
import { TeamsListing } from "@calcom/features/ee/teams/components";
import { ShellMain } from "@calcom/features/shell/Shell";
import { WEBAPP_URL } from "@calcom/lib/constants";
import { getSafeRedirectUrl } from "@calcom/lib/getSafeRedirectUrl";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc/react";
import { Button } from "@calcom/ui";
@ -43,21 +41,6 @@ function Teams() {
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
const ssr = await ssrInit(context);
await ssr.viewer.me.prefetch();
const session = await getServerSession({ req: context.req, res: context.res });
const token = context.query?.token;
const resolvedUrl = context.resolvedUrl;
const callbackUrl = token ? getSafeRedirectUrl(`${WEBAPP_URL}${resolvedUrl}`) : null;
if (!session) {
return {
redirect: {
destination: callbackUrl ? `/auth/login?callbackUrl=${callbackUrl}&teamInvite=true` : "/auth/login",
permanent: false,
},
props: {},
};
}
return { props: { trpcState: ssr.dehydrate() } };
};

View File

@ -142,17 +142,25 @@ test.describe("Event Types tests", () => {
.first()
.getAttribute("href");
/**
* Verify first organizer address
*/
await page.goto(previewLink ?? "");
await selectFirstAvailableTimeSlotNextMonth(page);
for (const location of locationData) {
await page.locator(`span:has-text("${location}")`).click();
}
await page.locator(`span:has-text("${locationData[0]}")`).click();
await bookTimeSlot(page);
await expect(page.locator("[data-testid=success-page]")).toBeVisible();
await expect(page.locator(`[data-testid="where"]`)).toHaveText(locationData[0]);
/**
* Verify second organizer address
*/
await page.goto(previewLink ?? "");
await selectFirstAvailableTimeSlotNextMonth(page);
await page.locator(`span:has-text("${locationData[1]}")`).click();
await bookTimeSlot(page);
await expect(page.locator("[data-testid=success-page]")).toBeVisible();
await expect(page.locator(`[data-testid="where"]`)).toHaveText(locationData[1]);
});
test.describe("Different Locations Tests", () => {

View File

@ -438,7 +438,7 @@ const createUserFixture = (user: UserWithIncludes, page: Page) => {
type SupportedTestEventTypes = PrismaType.EventTypeCreateInput & {
_bookings?: PrismaType.BookingCreateInput[];
};
type CustomUserOptsKeys = "username" | "password" | "completedOnboarding" | "locale" | "name";
type CustomUserOptsKeys = "username" | "password" | "completedOnboarding" | "locale" | "name" | "email";
type CustomUserOpts = Partial<Pick<Prisma.User, CustomUserOptsKeys>> & {
timeZone?: TimeZoneEnum;
eventTypes?: SupportedTestEventTypes[];
@ -457,7 +457,7 @@ const createUser = (workerInfo: WorkerInfo, opts?: CustomUserOpts | null): Prism
return {
username: uname,
name: opts?.name,
email: `${uname}@example.com`,
email: opts?.email ?? `${uname}@example.com`,
password: hashPassword(uname),
emailVerified: new Date(),
completedOnboarding: opts?.completedOnboarding ?? true,

View File

@ -4,6 +4,7 @@ import { authenticator } from "otplib";
import { symmetricDecrypt } from "@calcom/lib/crypto";
import { totpAuthenticatorCheck } from "@calcom/lib/totp";
import { prisma } from "@calcom/prisma";
import { test } from "./lib/fixtures";
@ -61,7 +62,7 @@ test.describe("2FA Tests", async () => {
await test.step("Login with 2FA enabled", async () => {
await user.login();
const userWith2FaSecret = await prisma?.user.findFirst({
const userWith2FaSecret = await prisma.user.findFirst({
where: {
id: user.id,
},
@ -138,7 +139,7 @@ test.describe("2FA Tests", async () => {
await page.click(`[data-testid=two-factor-switch][data-state="checked"]`);
await page.fill('input[name="password"]', userPassword);
const userWith2FaSecret = await prisma?.user.findFirst({
const userWith2FaSecret = await prisma.user.findFirst({
where: {
id: user.id,
},

View File

@ -135,6 +135,43 @@ test.describe("Manage Booking Questions", () => {
});
});
});
await test.step("Verify that we can prefill name field with no lastname", async () => {
const searchParams = new URLSearchParams();
searchParams.append("name", "FirstName");
await doOnFreshPreviewWithSearchParams(searchParams, page, context, async (page) => {
await selectFirstAvailableTimeSlotNextMonth(page);
await expectSystemFieldsToBeThereOnBookingPage({
page,
isFirstAndLastNameVariant: true,
values: {
name: {
firstName: "FirstName",
lastName: "",
},
},
});
});
});
await test.step("Verify that we can prefill name field with firstName,lastName query params", async () => {
const searchParams = new URLSearchParams();
searchParams.append("firstName", "John");
searchParams.append("lastName", "Doe");
await doOnFreshPreviewWithSearchParams(searchParams, page, context, async (page) => {
await selectFirstAvailableTimeSlotNextMonth(page);
await expectSystemFieldsToBeThereOnBookingPage({
page,
isFirstAndLastNameVariant: true,
values: {
name: {
firstName: "John",
lastName: "Doe",
},
},
});
});
});
});
});
@ -506,6 +543,27 @@ async function doOnFreshPreview(
return previewTabPage;
}
async function doOnFreshPreviewWithSearchParams(
searchParams: URLSearchParams,
page: Page,
context: PlaywrightTestArgs["context"],
callback: (page: Page) => Promise<void>,
persistTab = false
) {
const previewUrl = (await page.locator('[data-testid="preview-button"]').getAttribute("href")) || "";
const previewUrlObj = new URL(previewUrl);
searchParams.forEach((value, key) => {
previewUrlObj.searchParams.append(key, value);
});
const previewTabPage = await context.newPage();
await previewTabPage.goto(previewUrlObj.toString());
await callback(previewTabPage);
if (!persistTab) {
await previewTabPage.close();
}
return previewTabPage;
}
async function toggleQuestionAndSave({ name, page }: { name: string; page: Page }) {
await page.locator(`[data-testid="field-${name}"]`).locator('[data-testid="toggle-field"]').click();
await saveEventType(page);

View File

@ -0,0 +1,71 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { test } from "./lib/fixtures";
const SAML_DATABASE_URL = process.env.SAML_DATABASE_URL!;
const SAML_ADMINS = process.env.SAML_ADMINS!;
const SAML_ADMIN_EMAIL = process.env.E2E_TEST_SAML_ADMIN_EMAIL!;
const SAML_ADMIN_PASSWORD = process.env.E2E_TEST_SAML_ADMIN_PASSWORD!;
const OIDC_CLIENT_ID = process.env.E2E_TEST_OIDC_CLIENT_ID!;
const OIDC_CLIENT_SECRET = process.env.E2E_TEST_OIDC_CLIENT_SECRET!;
const OIDC_PROVIDER_DOMAIN = process.env.E2E_TEST_OIDC_PROVIDER_DOMAIN!;
const OIDC_USER_EMAIL = process.env.E2E_TEST_OIDC_USER_EMAIL!;
const OIDC_USER_PASSWORD = process.env.E2E_TEST_OIDC_USER_PASSWORD!;
const SHOULD_SKIP_TESTS =
!SAML_DATABASE_URL ||
!SAML_ADMINS ||
!SAML_ADMIN_EMAIL ||
!SAML_ADMIN_PASSWORD ||
!OIDC_CLIENT_ID ||
!OIDC_CLIENT_SECRET ||
!OIDC_PROVIDER_DOMAIN ||
!OIDC_USER_EMAIL ||
!OIDC_USER_PASSWORD;
test.afterEach(({ users }) => users.deleteAll());
// TODO: Cleanup the OIDC connection after the tests with fixtures
test.describe("OIDC", () => {
// eslint-disable-next-line playwright/no-skipped-test
test.skip(SHOULD_SKIP_TESTS, "Skipping due to missing the testing variables");
test("Setup with SAML admin and login", async ({ page, users }) => {
// Add the admin user provided in the environment variables to the db
const samlAdminUser = await users.create({ email: SAML_ADMIN_EMAIL, password: SAML_ADMIN_PASSWORD });
await samlAdminUser.apiLogin();
await test.step("Connect with OIDC Provider", async () => {
await page.goto("/settings/security/sso");
await page.click('[data-testid="sso-oidc-configure"]');
await page.fill('[data-testid="sso-oidc-client-id"]', OIDC_CLIENT_ID);
await page.fill('[data-testid="sso-oidc-client-secret"]', OIDC_CLIENT_SECRET);
await page.fill(
'[data-testid="sso-oidc-well-known-url"]',
`https://${OIDC_PROVIDER_DOMAIN}/.well-known/openid-configuration`
);
await page.click('[data-testid="sso-oidc-save"]');
await page.waitForSelector('[data-testid="toast-success"]');
});
// Logout the SAML Admin
await samlAdminUser.logout();
await test.step("Login using the OIDC provider", async () => {
// Login a user using the OIDC provider.
// The credentials are handled by the provider, so we don't need to create a user in the db.
await page.goto("/auth/login");
await page.click('[data-testid="saml"]');
// Redirected outide of the app, the user would be redirected to the OIDC provider.
await page.waitForURL(/https:\/\/[^/]+\/oauth2\/v1\/authorize\?.*/);
await page.getByRole("textbox", { name: "Username" }).fill(OIDC_USER_EMAIL);
await page.getByRole("textbox", { name: "Password" }).fill(OIDC_USER_PASSWORD);
await page.getByRole("button", { name: "Sign in" }).click();
// The user is redirected back to the app.
await page.waitForURL("getting-started", { waitUntil: "load" });
});
// Logout the user.
await page.goto("/auth/logout");
await test.step("Disconnect OIDC Provider", async () => {
samlAdminUser.apiLogin();
await page.goto("/settings/security/sso", { waitUntil: "load" });
await page.getByTestId("delete-oidc-sso-connection").click();
await page.getByRole("button", { name: "Yes, delete OIDC configuration" }).click();
await page.waitForSelector('[data-testid="toast-success"]');
});
});
});

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "قم بتأكيد عنوان بريدك الإلكتروني لضمان أفضل تسليم للبريد الإلكتروني والتقويم",
"verify_email_email_header": "تأكيد عنوان بريدك الإلكتروني",
"verify_email_email_button": "تأكيد البريد الإلكتروني",
"copy_somewhere_safe": "احتفظ بمفتاح API هذا في مكانٍ آمن، لأنك لن تتمكن من الاطلاع عليه هنا ثانيةً.",
"verify_email_email_body": "الرجاء تأكيد عنوان بريدك الإلكتروني بالنقر فوق الزر أدناه.",
"verify_email_by_code_email_body": "الرجاء تأكيد عنوان بريدك الإلكتروني عبر استخدام الرمز أدناه.",
"verify_email_email_link_text": "إليك الرابط في حال لم تكن ترغب بالنقر فوق أي أزرار:",
"email_verification_code": "الرجاء إدخال رمز التأكيد",
"email_verification_code_placeholder": "الرجاء إدخال رمز التأكيد الذي أُرسل إلى بريدك الإلكتروني",
"incorrect_email_verification_code": "رمز التأكيد غير صحيح.",
"email_sent": "تم إرسال الرسالة الإلكترونية بنجاح",
"email_not_sent": "حدث خطأ أثناء إرسال الرسالة الإلكترونية",
"event_declined_subject": "تم الرفض: {{title}} في {{date}}",
"event_cancelled_subject": "تم الإلغاء: {{title}} في {{date}}",
"event_request_declined": "تم رفض طلب الحدث الخاص بك",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "الحدث المتكرر في انتظار موافقتك",
"someone_requested_an_event": "طلب شخص ما جدولة حدث في تقويمك.",
"someone_requested_password_reset": "طلب شخص ما رابطا لتغيير كلمة المرور الخاصة بك.",
"password_reset_email_sent": "يجب أن تتلقى رسالة إلكترونية حول إعادة التعيين على هذا البريد الإلكتروني إذا كان موجوداً في نظامنا.",
"password_reset_instructions": "إذا لم تطلب هذا، يمكنك تجاهل هذا البريد الإلكتروني بأمان ولن يتم تغيير كلمة المرور الخاصة بك.",
"event_awaiting_approval_subject": "في انتظار الموافقة: {{title}} في {{date}}",
"event_still_awaiting_approval": "الحدث لا يزال في انتظار موافقتك",
@ -217,6 +224,10 @@
"already_have_an_account": "هل لديك حساب بالفعل؟",
"create_account": "إنشاء حساب",
"confirm_password": "تأكيد كلمة المرور",
"confirm_auth_change": "سيتسبب هذا في تغيير طريقة تسجيلك للدخول",
"confirm_auth_email_change": "سيتسبب تغيير عنوان بريدك الإلكتروني في إنهاء طريقة المصادقة الحالية لتسجيل الدخول إلى Cal.com. وسنطلب منك تأكيد عنوان بريدك الإلكتروني الجديد، ثم سيتم تسجيل الخروج وسيتوجب عليك استخدام عنوان البريد الإلكتروني الجديد لتسجيل الدخول بدلاً من طريقة المصادقة الحالية بعد إعادة ضبط كلمة المرور لديك باتباع التعليمات التي ستُرسل إلى بريدك الإلكتروني.",
"reset_your_password": "عيّن كلمة المرور الجديدة متبعاً الإرشادات المرسلة إلى عنوان بريدك الإلكتروني.",
"email_change": "سجّل الدخول ثانيةً باستخدام عنوان بريدك الإلكتروني الجديد وكلمة مرور.",
"create_your_account": "إنشاء حسابك",
"sign_up": "تسجيل الاشتراك",
"youve_been_logged_out": "لقد قمت بتسجيل الخروج",
@ -243,6 +254,10 @@
"all": "الكل",
"yours": "حسابك",
"available_apps": "التطبيقات المتوفرة",
"available_apps_lower_case": "التطبيقات المتوفرة",
"available_apps_desc": "ليس لديك تطبيقات مثبّتة. تصفّح التطبيقات ذات الشعبية أدناه واستكشف المزيد في <1>متجر التطبيقات</1>",
"fixed_host_helper": "أضف أي شخص بحاجة إلى ارتياد الفعالية. <1>اعرف المزيد</1>",
"round_robin_helper": "سيتناوب الأشخاص ضمن المجموعة على الحضور بحيث سيحضر شخص واحد الفعالية في كل مرة.",
"check_email_reset_password": "تحقق من البريد الإلكتروني. لقد أرسلنا رابطًا لإعادة تعيين كلمة المرور.",
"finish": "إنهاء",
"organization_general_description": "إدارة الإعدادات للغة فريقك ومنطقته الزمنية",
@ -251,6 +266,7 @@
"nearly_there_instructions": "وأخيرًا، يساعدك الوصف الموجز عنك والصورة في الحصول على الحجوزات والسماح للأشخاص بمعرفة الشخص الذين يحجزون معه.",
"set_availability_instructions": "حدد الفترات الزمنية التي تكون متاحًا فيها بشكل متكرر. يمكنك لاحقًا تحديد المزيد منها وربطها مع تقاويم مختلفة.",
"set_availability": "تحديد الوقت الذي تكون فيه متاحًا",
"availability_settings": "إعدادات التوافرية",
"continue_without_calendar": "المتابعة من دون تقويم",
"connect_your_calendar": "ربط التقويم لديك",
"connect_your_video_app": "اربط تطبيقات الفيديو لديك",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "روابط الحجز الجماعية التي يمكن إنشاؤها ديناميكيًا عن طريق إضافة أسماء مستخدمين متعددة باستخدام \"+\". مثال: \"{{appName}}/bailey+peer\"",
"allow_dynamic_booking": "السماح للحضور بالحجز لك عن طريق حجز المجموعات الديناميكي",
"dynamic_booking": "روابط المجموعة الديناميكية",
"allow_seo_indexing": "السماح لمحركات البحث بالوصول إلى المحتوى العام لديك",
"seo_indexing": "السماح بالفهرسة وفق SEO",
"email": "البريد الإلكتروني",
"email_placeholder": "name@example.com",
"full_name": "الاسم بالكامل",
@ -406,6 +424,7 @@
"booking_requested": "تم طلب الحجز",
"meeting_ended": "انتهى الاجتماع",
"form_submitted": "تم إرسال النموذج",
"booking_paid": "تم الدفع لقاء الحجز",
"event_triggers": "مشغلات الحدث",
"subscriber_url": "رابط المشترك",
"create_new_webhook": "إنشاء ويب هوك جديد",
@ -477,6 +496,7 @@
"max_limit_allowed_hint": "يجب أن يكون عدد الأحرف {{limit}} أو أقل",
"invalid_password_hint": "يجب أن تتألف كلمة المرور على الأقل من {{passwordLength}} أحرف، ورقم واحد على الأقل، ومزيج من الحروف الكبيرة والصغيرة",
"incorrect_password": "كلمة المرور غير صحيحة.",
"incorrect_email_password": "اسم المستخدم أو كلمة المرور غير صحيحين.",
"use_setting": "استخدام الإعداد",
"am_pm": "صباحًا/مساءً",
"time_options": "خيارات الوقت",
@ -505,6 +525,7 @@
"your_name": "اسمك",
"your_full_name": "اسمك الكامل",
"no_name": "لا يوجد اسم",
"enter_number_between_range": "الرجاء إدخال رقم بين 1 و {{maxOccurences}}",
"email_address": "عنوان البريد الإلكتروني",
"enter_valid_email": "يرجى إدخال بريد إلكتروني صالح",
"location": "الموقع",
@ -542,6 +563,7 @@
"leave": "خروج",
"profile": "الملف الشخصي",
"my_team_url": "عنوان URL الخاص بفريقي",
"my_teams": "فِرَقي",
"team_name": "اسم الفريق",
"your_team_name": "اسم فريقك",
"team_updated_successfully": "تم تحديث الفريق بنجاح",
@ -569,6 +591,8 @@
"invite_new_member": "دعوة عضو جديد في الفريق",
"invite_new_member_description": "ملاحظة: سيكلّف هذا <1>مقعداً إضافياً (15 دولاراً شهرياً)</1> زيادةً على اشتراكك.",
"invite_new_team_member": "دعوة شخص ما إلى فريقك.",
"upload_csv_file": "تحميل ملف بصيغة .csv",
"invite_via_email": "الدعوة عبر البريد الإلكتروني",
"change_member_role": "تغيير دور العضو في الفريق",
"disable_cal_branding": "تعطيل علامات {{appName}} التجارية",
"disable_cal_branding_description": "إخفاء كل علامات {{appName}} التجارية من الصفحات العامة لديك.",
@ -841,6 +865,7 @@
"team_view_user_availability_disabled": "يحتاج المستخدم إلى قبول الدعوة لعرض الأوقات المتاحة",
"set_as_away": "تغيير حالتك إلى \"ليس موجودًا\"",
"set_as_free": "تعطيل حالة \"ليس موجودًا\"",
"toggle_away_error": "حديث خطأ في تحديث الحالة إلى \"بعيد\"",
"user_away": "هذا المستخدم ليس موجودًا حاليًا.",
"user_away_description": "حالة الشخص الذي تحاول حجز خدماته \"ليس موجودًا\"، ولذا فهو لا يقبل عمليات حجز جديدة.",
"meet_people_with_the_same_tokens": "الاجتماع مع أشخاص بنفس ال tokens",
@ -850,6 +875,7 @@
"account_managed_by_identity_provider_description": "لتغيير بريدك الإلكتروني وكلمة المرور وتمكين المصادقة من عاملين والمزيد، يُرجى زيارة إعدادات حساب {{provider}} لديك.",
"signin_with_google": "تسجيل الدخول عبر Google",
"signin_with_saml": "تسجيل الدخول عبر SAML",
"signin_with_saml_oidc": "تسجيل الدخول عبر SAML/OIDC",
"you_will_need_to_generate": "ستحتاج إلى إنشاء access token من أداة الجدولة القديمة لديك.",
"import": "استيراد",
"import_from": "الاستيراد من",
@ -949,6 +975,8 @@
"offer_seats_description": "عرض مقاعد للحجز. هذا يعطل تلقائياً حجز الضيوف وحجز الاشتراك.",
"seats_available_one": "المقاعد المتاحة",
"seats_available_other": "المقاعد المتاحة",
"seats_nearly_full": "المقاعد ممتلئة تقريباً",
"seats_half_full": "المقاعد تُشغل بسرعة",
"number_of_seats": "عدد المقاعد لكل حجز",
"enter_number_of_seats": "أدخل عدد المقاعد",
"you_can_manage_your_schedules": "يمكنك إدارة الجداول الخاصة بك في صفحة الأوقات المتاحة.",
@ -1029,12 +1057,15 @@
"how_you_want_add_cal_site": "كيف تريد إضافة {{appName}} إلى موقعك الإلكتروني؟",
"choose_ways_put_cal_site": "اختر واحدة من الطرق التالية لوضع {{appName}} على موقعك الإلكتروني.",
"setting_up_zapier": "إعداد دمج Zapier الخاص بك",
"setting_up_make": "إعداد دمج Make لديك",
"generate_api_key": "إنشاء مفتاح API",
"generate_api_key_description": "إنشاء مفتاح API لاستخدامه مع {{appName}} على",
"your_unique_api_key": "مفتاح API الفريد الخاص بك",
"copy_safe_api_key": "انسخ مفتاح API هذا واحفظه في مكان آمن. إذا فقدت هذا المفتاح، يتوجب عليك إنشاء مفتاح جديد.",
"zapier_setup_instructions": "<0>سجل الدخول إلى حساب Zapier الخاص بك وأنشئ Zap جديد.</0><1>حدد Cal.com كتطبيق Trigger لديك. اختر أيضًا حدث Trigger.</1><2>اختر حسابك ثم أدخل مفتاح API الفريد الخاص بك.</2><3>اختبر Trigger الخاص بك.</3><4>أنت جاهز!</4>",
"make_setup_instructions": "<0>انتقل إلى <1><0>إنشاء رابط دعوة</0></1> وقم بتثبيت تطبيق Cal.com </0><1> ثم سجّل الدخول إلى حسابك وقم بإنشاء \"سيناريو جديد\".</1><2>اختر Cal.com على أنه أحد تطبيقات \"التشغيل\" لديك. اختر أيضا حدث تشغيل. </2><3>اختر حسابك ثم ادخل مفتاح API الفريد الخاص بك.</3><4>اختبر المشغل لديك.</4><5>لقد أتممت الأمر!</5>",
"install_zapier_app": "يرجى تثبيت تطبيق Zapier من App Store أولًا.",
"install_make_app": "يرجى تثبيت تطبيق Make من متجر التطبيقات أولًا.",
"connect_apple_server": "الاتصال بخادم Apple",
"calendar_url": "رابط التقويم",
"apple_server_generate_password": "أنشئ كلمة مرور خاصة بالتطبيق لاستخدامها مع {{appName}} على",
@ -1084,6 +1115,9 @@
"email_attendee_action": "إرسال رسالة إلكترونية إلى الحضور",
"sms_attendee_action": "إرسال رسالة نصية قصيرة إلى أحد الحضور",
"sms_number_action": "إرسال رسالة نصية قصيرة إلى رقم محدد",
"send_reminder_sms": "إرسال تذكيرات بالاجتماعات إلى الحاضرين بيُسر عبر الرسائل النصية القصيرة",
"whatsapp_number_action": "إرسال رسالة WhatsApp إلى رقم محدد",
"whatsapp_attendee_action": "إرسال رسالة عبر WhatsApp إلى أحد الحاضرين",
"workflows": "سير العمل",
"new_workflow_btn": "سير عمل جديد",
"add_new_workflow": "إضافة سير عمل جديد",
@ -1147,6 +1181,8 @@
"choose_template": "اختيار قالب",
"custom": "مخصص",
"reminder": "تذكير",
"rescheduled": "تمت إعادة الجدولة",
"completed": "تمّ",
"reminder_email": "تذكر {{eventType}} مع {{name}} في {{date}}",
"not_triggering_existing_bookings": "لن يتم تشغيل الحجوزات الموجودة مسبقاً حيث سيتم طلب رقم الهاتف عند حجز الحدث.",
"minute_one": "{{count}} دقيقة",
@ -1239,6 +1275,7 @@
"error_updating_settings": "خطأ في تحديث الإعدادات",
"personal_cal_url": "عنوان {{appName}} URL الخاص بي",
"bio_hint": "اكتب بضع جمل عن نفسك، والتي ستظهر على صفحة عنوان Url الشخصية لديك.",
"user_has_no_bio": "لم يُضف هذا المستخدم لمحة عنه بعد.",
"delete_account_modal_title": "حذف الحساب",
"confirm_delete_account_modal": "هل أنت متأكد من أنك تريد حذف حساب {{appName}} الخاص بك؟",
"delete_my_account": "حذف حسابي",
@ -1421,6 +1458,7 @@
"add_limit": "إضافة حد",
"team_name_required": "اسم الفريق مطلوب",
"show_attendees": "مشاركة معلومات الحضور مع الضيوف",
"show_available_seats_count": "إظهار عدد المقاعد المتاحة",
"how_booking_questions_as_variables": "كيف يمكن استخدام أسئلة الحجز كمتغيرات؟",
"format": "التنسيق",
"uppercase_for_letters": "استخدم الحروف الكبيرة لجميع الأحرف",
@ -1489,7 +1527,9 @@
"must_enter_team_name": "يجب إدخال اسم فريق",
"team_url_required": "يجب إدخال عنوان URL للفريق",
"url_taken": "عنوان URL هذا مأخوذ بالفعل",
"problem_registering_domain": "حدثت مشكلة في تسجيل المجال الفرعي، يُرجى المحاولة لاحقاً أو الاتصال بالمشرف",
"team_publish": "نشر فريق",
"number_text_notifications": "رقم الهاتف (إشعارات الرسائل النصية)",
"attendee_email_variable": "اسم الحاضر",
"attendee_email_info": "البريد الإلكتروني للشخص الحجز",
"kbar_search_placeholder": "اكتب أمرًا أو بحثًا...",
@ -1652,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "هل تريد بالتأكيد حذف تكوين {{connectionType}}؟ لن يتمكن أعضاء فريقك الذين يستخدمون معلومات تسجيل الدخول إلى {{connectionType}} من الوصول إلى Cal.com بعد الآن.",
"organizer_timezone": "منظم المناطق الزمنية",
"email_user_cta": "عرض الدعوة",
"email_no_user_invite_heading_team": "تمت دعوتك للانضمام إلى فريق {{appName}}",
"email_no_user_invite_heading_org": "تمت دعوتك للانضمام إلى منظمة {{appName}}",
"email_no_user_invite_subheading": "دعاك {{invitedBy}} للانضمام إلى فريقه على {{appName}}. إن {{appName}} هو برنامج جدولة الأحداث الذي يمكّنك أنت وفريقك من جدولة الاجتماعات دون الحاجة إلى المراسلة عبر البريد الإلكتروني.",
"email_user_invite_subheading_team": "دعاك {{invitedBy}} للانضمام إلى فريقه {{teamName}} على {{appName}}. إن {{appName}} هو برنامج جدولة الأحداث الذي يمكّنك أنت وفريقك من جدولة الاجتماعات دون الحاجة إلى المراسلة عبر البريد الإلكتروني.",
"email_user_invite_subheading_org": "لقد دعاك {{invitedBy}} للانضمام إلى فريق {{teamName}} التابع لمنظمتهم على {{appName}}. إن {{appName}} هو برنامج جدولة للفعاليات يمنحك القدرة أنت ومؤسستك على جدولة الاجتماعات من دون الحاجة إلى التراسل الكثيف عبر البريد الإلكتروني.",
"email_no_user_invite_steps_intro": "سنرشدك خلال بضع خطوات قصيرة وستستمتع بجدول زمني خالٍ من التوتر مع {{entity}} في لمح البصر.",
"email_no_user_step_one": "اختر اسم المستخدم الخاص بك",
"email_no_user_step_two": "ربط حساب التقويم الخاص بك",
@ -1824,6 +1867,8 @@
"insights_no_data_found_for_filter": "لم يتم العثور على بيانات لعامل التصفية المحدد أو التواريخ المحددة.",
"acknowledge_booking_no_show_fee": "أقر بأنه إذا لم أحضر هذا الحدث فسيتم سحب رسوم عدم حضور من بطاقتي تبلغ {{amount, currency}}.",
"card_details": "تفاصيل البطاقة",
"something_went_wrong_on_our_end": "حدث خطأ ما من طرفنا. اتصل بفريق الدعم لدينا، وسنُصلحه لك فوراً.",
"please_provide_following_text_to_suppport": "يرجى تقديم النص التالي عند الاتصال بالدعم لمساعدتك بشكل أفضل",
"seats_and_no_show_fee_error": "لا يمكن حاليًا تمكين المقاعد وفرض رسوم عدم الحضور",
"complete_your_booking": "أكمل الحجز",
"complete_your_booking_subject": "أكمل الحجز: {{title}} في {{date}}",
@ -1857,6 +1902,9 @@
"open_dialog_with_element_click": "فتح مربع حوار Cal عندما ينقر شخص فوق عنصر ما.",
"need_help_embedding": "هل أنت بحاجة إلى مساعدة؟ راجع أدلتنا لتضمين Cal على Wix، أو Squarespace، أو WordPress، راجع أسئلتنا الشائعة، أو استكشف خيارات التضمين المتقدمة.",
"book_my_cal": "تثبيت الحجز في Cal",
"first_name": "الاسم الأول",
"last_name": "اسم العائلة",
"first_last_name": "الاسم الأول، اسم العائلة",
"invite_as": "دعوة باسم",
"form_updated_successfully": "تم تحديث النموذج بنجاح.",
"disable_attendees_confirmation_emails": "تعطيل رسائل التأكيد الافتراضية للحضور",
@ -1870,6 +1918,7 @@
"first_event_type_webhook_description": "قم بإنشاء أول شبكة ويب هوك لهذا النوع من الأحداث",
"install_app_on": "تثبيت التطبيق على",
"create_for": "إنشاء من أجل",
"currency": "العملة",
"organization_banner_description": "إنشاء بيئات حيث يمكن لفرقك إنشاء تطبيقات مشتركة ومهام سير العمل وأنواع الأحداث باستخدام الجدولة الدوارة والجماعية.",
"organization_banner_title": "إدارة المنظمات ذات الفرق المتعددة",
"set_up_your_organization": "إعداد منظمتك",
@ -1930,5 +1979,79 @@
"insights_team_filter": "الفريق: {{teamName}}",
"insights_user_filter": "المستخدم: {{userName}}",
"insights_subtitle": "عرض Insights الحجز عبر أحداثك",
"location_options": "خيارات الموقع {{locationCount}}",
"custom_plan": "الخطة المخصصة",
"email_embed": "البريد الإلكتروني المضمن",
"add_times_to_your_email": "حدّد بعض الفترات المتاحة وأدرجها في رسالتك الإلكترونية",
"select_time": "اختيار الوقت",
"select_date": "اختيار التاريخ",
"see_all_available_times": "رؤية كل الأوقات المتاحة",
"org_team_names_example": "مثال، فريق التسويق",
"org_team_names_example_1": "مثال، فريق التسويق",
"org_team_names_example_2": "مثال، فريق المبيعات",
"org_team_names_example_3": "مثال، فريق التصميم",
"org_team_names_example_4": "مثال، الفريق الهندسي",
"org_team_names_example_5": "مثال، فريق تحليل البيانات",
"org_max_team_warnings": "ستكون قادراً على إضافة فرق إضافية في وقت لاحق.",
"what_is_this_meeting_about": "عمَّ تدور هذه الجلسة؟",
"add_to_team": "إضافة إلى الفريق",
"remove_users_from_org": "إزالة مستخدمين من مؤسسة",
"remove_users_from_org_confirm": "هل أنت متأكد من أنك تريد إزالة هذا العدد من المستخدمين {{userCount}} من هذه المؤسسة؟",
"user_has_no_schedules": "لم يقم هذا المستخدم بإعداد بأي جدولة حتى الآن",
"user_isnt_in_any_teams": "هذا المستخدم ليس في أي فريق",
"requires_booker_email_verification": "يتطلب ذلك تأكيد البريد الإلكتروني لمن يقوم بالحجز",
"description_requires_booker_email_verification": "لضمان تأكيد البريد الإلكتروني لمن يقوم بالحجز قبل جدولة الفعاليات",
"requires_confirmation_mandatory": "يمكن إرسال رسائل نصية فقط للحاضرين عندما يتطلب نوع الفعالية تأكيداً.",
"kyc_verification_information": "يجب عليك إثبات صحة {{teamOrAccount}} لديك قبل إرسال رسائل نصية للحضور بهدف ضمان الأمان. يرجى الاتصال بنا عبر البريد الإلكتروني <a>{{supportEmail}}</a> وتقديم المعلومات التالية:",
"kyc_verification_documents": "<ul><li> {{teamOrUser}}</li><li>للأعمال التجارية: إرفاق مستندات تأكيد الأعمال</li><li>للأفراد: إرفاق بطاقة تعريفية صادرة من جهة حكومية</li></ul>",
"verify_team_or_account": "تأكيد {{teamOrAccount}}",
"verify_account": "تأكيد الحساب",
"kyc_verification": "تأكيد KYC",
"organizations": "المؤسسات",
"org_admin_other_teams": "فرق أخرى",
"org_admin_other_teams_description": "يمكنك هنا رؤية الفرق ضمن مؤسستك والتي أنت لست جزءاً منها؛ ويمكنك إضافة نفسك إليها عند الحاجة.",
"no_other_teams_found": "لم يتم العثور على فرق أخرى",
"no_other_teams_found_description": "لا توجد فرق أخرى في هذه المؤسسة.",
"attendee_first_name_variable": "الاسم الأول للحاضر",
"attendee_last_name_variable": "اسم العائلة للحاضر",
"attendee_first_name_info": "الاسم الأول للشخص صاحب الحجز",
"attendee_last_name_info": "اسم العائلة للشخص صاحب الحجز",
"me": "أنا",
"verify_team_tooltip": "تأكيد فريقك لتمكين إرسال الرسائل إلى الحاضرين",
"member_removed": "تمت إزالة العضو",
"my_availability": "أوقاتي المتاحة",
"team_availability": "أوقات الفريق المتاحة",
"backup_code": "الرمز الاحتياطي",
"backup_codes": "الرموز الاحتياطية",
"backup_code_instructions": "يمكن استخدام كل رمز احتياطي لمرة واحدة فقط لمنح حق الوصول بدون مصادقة منك.",
"backup_codes_copied": "تم نسخ الرموز الاحتياطية!",
"incorrect_backup_code": "الرمز الاحتياطي غير صحيح.",
"lost_access": "فُقد الوصول",
"missing_backup_codes": "لم يُعثر على رموز احتياطية. الرجاء إنشاؤها في الإعدادات لديك.",
"admin_org_notification_email_subject": "تم إنشاء منظمة جديدة: في انتظار العمل",
"hi_admin": "مرحباً حضرة المشرف",
"admin_org_notification_email_title": "تحتاج منظمة إلى إعداد DNS",
"admin_org_notification_email_body_part1": "تم إنشاء منظمة بعيار \"{{orgSlug}}\".<br /><br />يرجى التأكد من تكوين سجل DNS الخاص بك لتحديد النطاق الفرعي المقابل للمنظمة الجديدة إلى حيث يعمل التطبيق الرئيسي. وإلا فلن تعمل المنظمة.<br /><br />هنا لديك فقط الخيارات الأساسية لتكوين نطاق فرعي للإشارة إلى تطبيقهم حتى يُحمّل صفحة الملف الشخصي للمنظمة.<br /><br />يمكنك القيام بذلك إما بواسطة السجل A:",
"admin_org_notification_email_body_part2": "أو سجل CNAME:",
"admin_org_notification_email_body_part3": "بمجرد تكوين النطاق الفرعي، يرجى وضع علامة على تكوين DNS كما تم في إعدادات مشرف المنظمات.",
"admin_org_notification_email_cta": "الذهاب إلى إعدادات مشرف المؤسسات",
"org_has_been_processed": "تم تجهيز المؤسسة",
"org_error_processing": "حدث خطأ أثناء تجهيز هذه المؤسسة",
"orgs_page_description": "قائمة بجميع المؤسسات. سيسمح قبول مؤسسة ما لجميع المستخدمين الذين لديهم عناوين بريد إلكتروني تنتهي بنطاق المؤسسة بالتسجيل من دون الحاجة إلى تأكيد بريدهم الإلكتروني.",
"unverified": "لم تتم عملية التأكيد",
"dns_missing": "DNS مفقود",
"mark_dns_configured": "وضع إشارة تكوين على DNS",
"value": "القيمة",
"your_organization_updated_sucessfully": "تم تحديث منظمتك بنجاح",
"team_no_event_types": "ليس لدى هذا الفريق أنواع من الفعاليات",
"seat_options_doesnt_multiple_durations": "لا يدعم خيار المقعد فترات متعددة",
"include_calendar_event": "إدراج فعاليات في التقويم",
"recently_added": "تمت الإضافة مؤخراً",
"no_members_found": "لم يُعثر على أعضاء",
"event_setup_length_error": "إعداد الفعالية: يجب أن تكون المدة لدقيقة على الأقل.",
"availability_schedules": "جدولة التوافر",
"view_only_edit_availability_not_onboarded": "لم يكمل هذا المستخدم عملية الانضمام. لن تتمكن من تعيين توافره حتى يكتمل انضمامه.",
"view_only_edit_availability": "أنت تشاهد توافر هذا المستخدم. يمكنك تعديل توافرك فقط.",
"edit_users_availability": "تعديل توافر المستخدم: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ أضف السلاسل الجديدة أعلاه هنا ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -136,7 +136,7 @@
"team_upgrade_banner_description": "Vielen Dank, dass Sie unseren neuen Teamplan getestet haben. Wir haben festgestellt, dass Ihr Team „{{teamName}}“ aktualisiert werden muss.",
"upgrade_banner_action": "Hier aufrüsten",
"team_upgraded_successfully": "Das Update für Ihr Team war erfolgreich!",
"org_upgrade_banner_description": "Vielen Dank, dass Sie unseren neuen Organisationsplan getestet haben. Wir haben festgestellt, dass Ihre Organisation „{{teamName}}“ ein Upgrade benötigt.",
"org_upgrade_banner_description": "Vielen Dank, dass Sie unseren neuen Tarif „Organization“ getestet haben. Wir haben festgestellt, dass Ihre Organization „{{teamName}}“ ein Upgrade benötigt.",
"org_upgraded_successfully": "Das Upgrade für Ihre Organization war erfolgreich!",
"use_link_to_reset_password": "Benutzen Sie den Link, um Ihr Passwort zurückzusetzen",
"hey_there": "Hallo,",
@ -257,6 +257,7 @@
"available_apps_lower_case": "Verfügbare Apps",
"available_apps_desc": "Sie haben keine Apps installiert. Sehen Sie sich beliebte Apps unten an und entdecken Sie noch mehr in unserem <1>App Store</1>",
"fixed_host_helper": "Füge jeden hinzu, der an der Veranstaltung teilnehmen muss. <1>Mehr erfahren</1>",
"round_robin_helper": "Die Leute in der Gruppe wechseln sich ab und nur eine Person wird für die Veranstaltung erscheinen.",
"check_email_reset_password": "Überprüfen Sie Ihre E-Mail. Wir haben Ihnen einen Link zum Zurücksetzen Ihres Passworts gesendet.",
"finish": "Fertig",
"organization_general_description": "Einstellungen für die Sprache und Zeitzone Ihres Teams verwalten",
@ -265,6 +266,7 @@
"nearly_there_instructions": "Zu guter Letzt: Ein Foto und eine Kurzbeschreibung zu Ihnen helfen, öfter gebucht zu werden, da Kunden dann genauer wissen, bei wem sie einen Termin buchen.",
"set_availability_instructions": "Definieren Sie Zeiträume, wenn Sie wiederkehrend verfügbar sind. Sie können später weitere Zeiträume erstellen und verschiedenen Kalendern zuordnen.",
"set_availability": "Verfügbarkeit festlegen",
"availability_settings": "Verfügbarkeitseinstellungen",
"continue_without_calendar": "Ohne Kalender fortfahren",
"connect_your_calendar": "Kalender verbinden",
"connect_your_video_app": "Verbinden Sie Ihre Video-Apps",
@ -589,6 +591,8 @@
"invite_new_member": "Ein neues Mitglied einladen",
"invite_new_member_description": "Hinweis: Dies wird <1>einen zusätzlichen Platz(15 $/m)</1> in Ihrem Abonnement kosten.",
"invite_new_team_member": "Laden Sie jemanden in Ihr Team ein.",
"upload_csv_file": "Eine .csv-Datei hochladen",
"invite_via_email": "Per E-Mail einladen",
"change_member_role": "Rolle des Teammitglieds ändern",
"disable_cal_branding": "{{appName}}-Branding deaktivieren",
"disable_cal_branding_description": "Blendet alle {{appName}}-Werbung auf Ihren öffentlichen Seiten aus.",
@ -871,6 +875,7 @@
"account_managed_by_identity_provider_description": "Um Ihre E-Mail-Adresse, Ihr Passwort, die Zwei-Faktor-Authentifizierung und sonstiges zu ändern, besuchen Sie bitte Ihre {{provider}} -Kontoeinstellungen.",
"signin_with_google": "Mit Google anmelden",
"signin_with_saml": "Anmelden mit SAML",
"signin_with_saml_oidc": "Anmelden mit SAML/OIDC",
"you_will_need_to_generate": "Sie müssen ein Zugriffstoken in ihrem alten Kalender-Tool erzeugen.",
"import": "Importieren",
"import_from": "Importieren von",
@ -970,6 +975,8 @@
"offer_seats_description": "Bieten Sie Plätze für Buchungen an (dies deaktiviert Gäste & Opt-in-Buchungen)",
"seats_available_one": "Verfügbarer Platz",
"seats_available_other": "Verfügbare Plätze",
"seats_nearly_full": "Plätze fast voll",
"seats_half_full": "Plätze werden schnell belegt",
"number_of_seats": "Anzahl der Plätze pro Termin",
"enter_number_of_seats": "Anzahl der Plätze eingeben",
"you_can_manage_your_schedules": "Sie können Ihren Verfügbarkeitsplan bei Ihren Verfügbarkeiten ändern.",
@ -1050,12 +1057,15 @@
"how_you_want_add_cal_site": "Wie möchten Sie {{appName}} zu Ihrer Website hinzufügen?",
"choose_ways_put_cal_site": "Wählen Sie eine der folgenden Möglichkeiten, um {{appName}} in Ihre Website zu integrieren.",
"setting_up_zapier": "Einrichtung Ihrer Zapier-Integration",
"setting_up_make": "Einrichtung Ihrer Make-Integration",
"generate_api_key": "Api Key generieren",
"generate_api_key_description": "Generieren Sie einen API-Schlüssel für {{appName}} unter",
"your_unique_api_key": "Ihr eindeutiger API-Key",
"copy_safe_api_key": "Kopieren Sie diesen API-Schlüssel und speichern Sie ihn an einem sicheren Ort. Wenn Sie diesen Schlüssel verlieren, müssen Sie einen neuen generieren.",
"zapier_setup_instructions": "<0>Loggen Sie sich in Ihr Zapier-Konto ein und erstelle einen neuen Zap.</0><1>Wählen Sie Cal.com als ihre Trigger-App aus. Wählen Sie auch ein Auslöserereignis.</0><1>Wählen Sie ihr Konto aus und geben dann ihren eindeutigen API-Key ein.</2><3>Testen Sie den Trigger.</3><4>Alles fertig!</4>",
"make_setup_instructions": "<0>Gehen Sie zu: <1><0>Make-Einladungs-Link</0></1>und installieren Sie die Cal.com-App.</0><1> Loggen Sie sich in Ihr Make-Konto ein und erstellen Sie ein neues Szenario.</1><2>Wählen Sie Cal.com als ihre Auslöser-App aus. Wählen Sie auch ein Auslöserereignis aus.</2><3>Wählen Sie ihr Konto aus und geben Sie dann Ihren eindeutigen API-Key ein.</3><4>Probierne Sie den Auslöser aus.</4><5>Und fertig!</5>",
"install_zapier_app": "Bitte installieren Sie zuerst die Zapier-App im App Store.",
"install_make_app": "Bitte installieren Sie zuerst die Make-App im App Store.",
"connect_apple_server": "Mit Apple-Server verbinden",
"calendar_url": "Kalender-URL",
"apple_server_generate_password": "Generieren Sie ein App-spezifisches Passwort für {{appName}} unter",
@ -1105,6 +1115,7 @@
"email_attendee_action": "E-Mail an Teilnehmende senden",
"sms_attendee_action": "SMS an Teilnehmende senden",
"sms_number_action": "SMS an eine bestimmte Nummer senden",
"send_reminder_sms": "Senden Sie Meeting-Erinnerungen einfach per SMS an Ihre Teilnehmer",
"whatsapp_number_action": "WhatsApp-Nachricht an eine bestimmte Nummer senden",
"whatsapp_attendee_action": "WhatsApp-Nachricht an Teilnehmer senden",
"workflows": "Workflows",
@ -1446,6 +1457,7 @@
"add_limit": "Begrenzung hinzufügen",
"team_name_required": "Teamname erforderlich",
"show_attendees": "Teilnehmerinformationen zwischen Gästen teilen",
"show_available_seats_count": "Anzahl der verfügbaren Plätze anzeigen",
"how_booking_questions_as_variables": "Wie verwendet man Buchungsfragen als Variablen?",
"format": "Format",
"uppercase_for_letters": "Großbuchstaben für alle Buchstaben verwenden",
@ -1679,9 +1691,10 @@
"delete_sso_configuration_confirmation_description": "Sind Sie sicher, dass Sie die {{connectionType}}-Konfiguration löschen möchten? Ihre Teammitglieder, die sich über {{connectionType}} anmelden, werden keinen Zugriff mehr auf Cal.com haben.",
"organizer_timezone": "Zeitzone des Veranstalters",
"email_user_cta": "Einladung anzeigen",
"email_no_user_invite_heading_team": "Sie wurden eingeladen, einem {{appName}}-Team beizutreten",
"email_no_user_invite_subheading": "{{invitedBy}} hat Sie eingeladen, dem Team in {{appName}} beizutreten. {{appName}} ist der Event-Planer, der es Ihnen und Ihrem Team ermöglicht, Meetings ohne ständiges hin und her zu planen.",
"email_user_invite_subheading_team": "{{invitedBy}} hat Sie eingeladen, dem Team „{{teamName}}“ beizutreten. {{appName}} ist der Event-Planer, der es Ihnen und Ihrem Team ermöglicht, Meetings ohne Hin und Her zu planen.",
"email_no_user_invite_steps_intro": "Wir begleiten Sie durch ein paar Schritte, danach können Sie in kürzester Zeit stressfreie Planung mit Ihrem {{entity}} genießen.",
"email_no_user_invite_steps_intro": "Wir begleiten Sie durch ein paar Schritte, danach können Sie in kürzester Zeit stressfreie Planung mit Ihrer {{entity}} genießen.",
"email_no_user_step_one": "Wählen Sie Ihren Benutzernamen",
"email_no_user_step_two": "Verbinden Sie Ihr Kalenderkonto",
"email_no_user_step_three": "Legen Sie Ihre Verfügbarkeit fest",
@ -1961,6 +1974,7 @@
"insights_team_filter": "Team: {{teamName}}",
"insights_user_filter": "Benutzer: {{userName}}",
"insights_subtitle": "Sehen Sie sich Buchungs-Insights zu Ihren Termine an",
"location_options": "{{locationCount}} Veranstaltungsort-Optionen",
"custom_plan": "Maßgeschneiderter Tarif",
"email_embed": "E-Mail Einbettung",
"add_times_to_your_email": "Zeiten zur E-Mail hinzufügen",
@ -1976,14 +1990,21 @@
"org_max_team_warnings": "Weitere Teams können Sie zu einem späteren Zeitpunkt hinzufügen.",
"what_is_this_meeting_about": "Worum geht es in diesem Termin?",
"add_to_team": "Zum Team hinzufügen",
"user_has_no_schedules": "Dieser Benutzer hat noch keine Verfügbarkeitspläne eingerichtet",
"user_isnt_in_any_teams": "Dieser Benutzer ist in keinem Team",
"kyc_verification_information": "Aus Sicherheitsgründen müssen Sie Ihren {{teamOrAccount}} verifizieren, bevor Sie Textnachrichten an die Teilnehmer senden können. Bitte kontaktieren Sie uns unter <a>{{supportEmail}}</a> und geben Sie folgende Informationen an:",
"kyc_verification": "KYC-Verifizierung",
"org_admin_other_teams": "Weitere Teams",
"no_other_teams_found": "Keine weiteren Teams gefunden",
"no_other_teams_found_description": "Es gibt keine weiteren Teams in dieser Organisation.",
"attendee_first_name_variable": "Vorname des Teilnehmers",
"attendee_last_name_variable": "Nachname des Teilnehmers",
"me": "Ich",
"verify_team_tooltip": "Verifizieren Sie Ihr Team, um das Senden von Nachrichten an Teilnehmer zu aktivieren",
"member_removed": "Mitglied entfernt",
"my_availability": "Meine Verfügbarkeit",
"team_availability": "Teamverfügbarkeit",
"lost_access": "Zugriff verloren",
"hi_admin": "Hallo, Administrator",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Fügen Sie Ihre neuen Code-Zeilen über dieser hinzu ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -45,7 +45,6 @@
"invite_team_individual_segment": "Invite individual",
"invite_team_bulk_segment": "Bulk import",
"invite_team_notifcation_badge": "Inv.",
"signin_or_signup_to_accept_invite": "You need to Sign in or Sign up to see team invitation.",
"your_event_has_been_scheduled": "Your event has been scheduled",
"your_event_has_been_scheduled_recurring": "Your recurring event has been scheduled",
"accept_our_license": "Accept our license by changing the .env variable <1>NEXT_PUBLIC_LICENSE_CONSENT</1> to '{{agree}}'.",
@ -592,6 +591,8 @@
"invite_new_member": "Invite a new team member",
"invite_new_member_description": "Note: This will <1>cost an extra seat ($15/m)</1> on your subscription.",
"invite_new_team_member": "Invite someone to your team.",
"upload_csv_file": "Upload a .csv file",
"invite_via_email": "Invite via email",
"change_member_role": "Change team member role",
"disable_cal_branding": "Disable {{appName}} branding",
"disable_cal_branding_description": "Hide all {{appName}} branding from your public pages.",
@ -2049,5 +2050,8 @@
"no_members_found": "No members found",
"event_setup_length_error":"Event Setup: The duration must be at least 1 minute.",
"availability_schedules":"Availability Schedules",
"view_only_edit_availability_not_onboarded":"This user has not completed onboarding. You will not be able to set their availability until they have completed onboarding.",
"view_only_edit_availability":"You are viewing this user's availability. You can only edit your own availability.",
"edit_users_availability":"Edit user's availability: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -45,7 +45,6 @@
"invite_team_individual_segment": "Inviter une personne",
"invite_team_bulk_segment": "Importation multiple",
"invite_team_notifcation_badge": "Inv.",
"signin_or_signup_to_accept_invite": "Vous devez vous connecter ou vous inscrire pour voir l'invitation d'équipe.",
"your_event_has_been_scheduled": "Votre événement a été planifié",
"your_event_has_been_scheduled_recurring": "Votre événement récurrent a été planifié",
"accept_our_license": "Acceptez notre licence en changeant la variable .env <1>NEXT_PUBLIC_LICENSE_CONSENT</1> en « {{agree}} ».",
@ -292,9 +291,9 @@
"add_another_calendar": "Ajouter un autre calendrier",
"other": "Autre",
"email_sign_in_subject": "Votre lien de connexion pour {{appName}}",
"emailed_you_and_attendees": "Vous et tous les autres participants avez reçu ces informations par e-mail.",
"emailed_you_and_attendees_recurring": "Vous et tous les autres participants avez reçu par e-mail les informations pour le premier de ces événements récurrents.",
"emailed_you_and_any_other_attendees": "Vous et tous les autres participants avez reçu ces informations par e-mail.",
"emailed_you_and_attendees": "Nous avons envoyé un e-mail avec une invitation de calendrier comprenant les détails à tout le monde.",
"emailed_you_and_attendees_recurring": "Nous avons envoyé un e-mail avec une invitation de calendrier comprenant les détails à tout le monde pour le premier de ces événements récurrents.",
"emailed_you_and_any_other_attendees": "Nous avons envoyé cette information à tout le monde par e-mail.",
"needs_to_be_confirmed_or_rejected": "Votre réservation doit encore être confirmée ou refusée.",
"needs_to_be_confirmed_or_rejected_recurring": "Votre rendez-vous récurrent doit encore être confirmé ou refusé.",
"user_needs_to_confirm_or_reject_booking": "{{user}} doit encore confirmer ou refuser la réservation.",
@ -592,6 +591,8 @@
"invite_new_member": "Inviter un nouveau membre d'équipe",
"invite_new_member_description": "Remarque : cela <1>coûtera une place supplémentaire (15 $/mois)</1> sur votre abonnement.",
"invite_new_team_member": "Invitez quelqu'un à rejoindre votre équipe.",
"upload_csv_file": "Télécharger un fichier .csv",
"invite_via_email": "Inviter par e-mail",
"change_member_role": "Changer le rôle du membre de l'équipe",
"disable_cal_branding": "Désactiver les références à la marque {{appName}}",
"disable_cal_branding_description": "Supprimez toutes les références à la marque {{appName}} de vos pages publiques.",
@ -1102,7 +1103,7 @@
"reschedule_optional": "Raison de la replanification (facultatif)",
"reschedule_placeholder": "Faites savoir aux autres pourquoi vous devez replanifier le rendez-vous.",
"event_cancelled": "Cet événement est annulé",
"emailed_information_about_cancelled_event": "Nous vous avons envoyé un e-mail à vous et aux autres participants pour les en informer.",
"emailed_information_about_cancelled_event": "Nous avons envoyé un e-mail à tout le monde pour les en informer.",
"this_input_will_shown_booking_this_event": "Ce champ sera affiché lors de la réservation de cet événement.",
"meeting_url_in_confirmation_email": "Le lien du rendez-vous est dans l'e-mail de confirmation",
"url_start_with_https": "Le lien doit commencer par http:// ou https://",

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "Verifica il tuo indirizzo e-mail per garantire la consegna delle e-mail e delle notifiche del calendario",
"verify_email_email_header": "Verifica il tuo indirizzo e-mail",
"verify_email_email_button": "Verifica l'e-mail",
"copy_somewhere_safe": "Salva questa chiave API in un posto sicuro. Non potrai visualizzarla in seguito.",
"verify_email_email_body": "Verifica il tuo indirizzo e-mail facendo clic sul pulsante qui sotto.",
"verify_email_by_code_email_body": "Verifica il tuo indirizzo e-mail utilizzando il codice sottostante.",
"verify_email_email_link_text": "Se non ti piacciono i pulsanti, puoi usare questo link:",
"email_verification_code": "Inserisci il codice di verifica",
"email_verification_code_placeholder": "Inserisci il codice di verifica che hai ricevuto via e-mail",
"incorrect_email_verification_code": "Il codice di verifica è errato.",
"email_sent": "Email inviata",
"email_not_sent": "Si è verificato un errore durante l'invito dell'e-mail",
"event_declined_subject": "Rifiutato: {{title}} il {{date}}",
"event_cancelled_subject": "Cancellato: {{title}} il {{date}}",
"event_request_declined": "La tua richiesta per l'evento è stata rifiutata",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "Un evento ricorrente è in attesa della tua approvazione",
"someone_requested_an_event": "Qualcuno ha richiesto di programmare un evento sul tuo calendario.",
"someone_requested_password_reset": "Qualcuno ha richiesto un link per cambiare la tua password.",
"password_reset_email_sent": "Se questo indirizzo e-mail esiste nel nostro sistema, riceverai un'e-mail per la reimpostazione.",
"password_reset_instructions": "Se non l'hai richiesto, puoi tranquillamente ignorare questa email e la tua password non verrà modificata.",
"event_awaiting_approval_subject": "In attesa di approvazione: {{title}} il {{date}}",
"event_still_awaiting_approval": "Un evento è ancora in attesa della tua approvazione",
@ -217,6 +224,10 @@
"already_have_an_account": "Hai già un account?",
"create_account": "Crea Account",
"confirm_password": "Conferma password",
"confirm_auth_change": "Questo cambierà il modo il cui effettui l'accesso",
"confirm_auth_email_change": "Cambiando l'indirizzo e-mail disconnetterai il tuo metodo di autenticazione attuale che utilizzi per accedere a Cal.com. Ti verrà chiesto di verificare il tuo nuovo indirizzo e-mail. Continuando, verrai disconnesso e dovrai usare il nuovo indirizzo e-mail per accedere, al posto del tuo metodo di autenticazione attuale, dopo aver impostato la password seguendo le istruzioni che ti invieremo al tuo indirizzo e-mail.",
"reset_your_password": "Imposta la nuova password seguendo le istruzioni che ti sono state inviate via e-mail.",
"email_change": "Accedi di nuovo con il nuovo indirizzo e-mail e la nuova password.",
"create_your_account": "Crea il tuo account",
"sign_up": "Registrati",
"youve_been_logged_out": "Hai fatto il log out",
@ -243,6 +254,10 @@
"all": "Tutte le app",
"yours": "Il tuo account",
"available_apps": "Applicazioni disponibili",
"available_apps_lower_case": "Applicazioni disponibili",
"available_apps_desc": "Non hai nessuna applicazione installata. Visualizza le applicazioni popolari qui sotto ed esplorane altre nel nostro <1>App Store</1>",
"fixed_host_helper": "Aggiungi chiunque abbia bisogno di partecipare all'evento. <1>Per saperne di più</1>",
"round_robin_helper": "Le persone nel gruppo fanno a turno e una sola persona si presenterà all'evento.",
"check_email_reset_password": "Controlla la tua email. Ti abbiamo inviato un link per reimpostare la password.",
"finish": "Fine",
"organization_general_description": "Gestisci le impostazioni della lingua e del fuso orario per il tuo team",
@ -251,6 +266,7 @@
"nearly_there_instructions": "Infine: qualche informazione su di te e una foto sono utili per ottenere prenotazioni e per far capire alle persone con chi stanno prenotando.",
"set_availability_instructions": "Definisci intervalli di tempo di quando sei disponibile su una base ricorrente. Puoi crearne di più in seguito e assegnarli a calendari diversi.",
"set_availability": "Imposta la tua disponibilità",
"availability_settings": "Impostazioni di disponibilità",
"continue_without_calendar": "Continua senza calendario",
"connect_your_calendar": "Collega il tuo calendario",
"connect_your_video_app": "Collega le tue applicazioni video",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "È possibile creare dinamicamente collegamenti a prenotazioni di gruppo inserendo più nomi utente separati da '+'. Esempio: '{{appName}}/bailey+peer'",
"allow_dynamic_booking": "Consenti ai partecipanti di prenotare per te utilizzando le prenotazioni di gruppo dinamiche",
"dynamic_booking": "Collegamenti dinamici di gruppo",
"allow_seo_indexing": "Consenti ai motori di ricerca di accedere ai tuoi contenuti pubblici",
"seo_indexing": "Consenti l'indicizzazione SEO",
"email": "Email",
"email_placeholder": "jdoe@example.com",
"full_name": "Nome completo",
@ -406,6 +424,7 @@
"booking_requested": "Richiesta di prenotazione inviata",
"meeting_ended": "Riunione terminata",
"form_submitted": "Modulo inviato",
"booking_paid": "Prenotazione pagata",
"event_triggers": "Attivatori Evento",
"subscriber_url": "URL abbonato",
"create_new_webhook": "Crea un nuovo webhook",
@ -506,6 +525,7 @@
"your_name": "Il tuo nome",
"your_full_name": "Nome completo",
"no_name": "Nessun nome",
"enter_number_between_range": "Insrisci un numero compreso tra 1 e {{maxOccurences}}",
"email_address": "Indirizzo email",
"enter_valid_email": "Immettere un indirizzo e-mail valido",
"location": "Luogo",
@ -543,6 +563,7 @@
"leave": "Abbandona",
"profile": "Profilo",
"my_team_url": "Url del mio team",
"my_teams": "I miei team",
"team_name": "Nome del team",
"your_team_name": "Nome del tuo team",
"team_updated_successfully": "Team aggiornato con successo",
@ -570,6 +591,8 @@
"invite_new_member": "Invita un nuovo membro",
"invite_new_member_description": "Nota: Sul tuo abbonamento verrà addebitato <1>un posto aggiuntivo (15$/m)</1>.",
"invite_new_team_member": "Invita qualcuno nel tuo team.",
"upload_csv_file": "Carica un file .csv",
"invite_via_email": "Invita via e-mail",
"change_member_role": "Cambia il ruolo del membro del team",
"disable_cal_branding": "Disabilita il branding {{appName}}",
"disable_cal_branding_description": "Nascondi tutti i brand {{appName}} dalle tue pagine pubbliche.",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "L'utente deve accettare l'invito per visualizzare la disponibilità",
"set_as_away": "Segnalati assente",
"set_as_free": "Disabilita lo stato \"assente\"",
"toggle_away_error": "Errore durante l'aggiornamento dello stato \"assente\"",
"user_away": "Questo utente è attualmente assente.",
"user_away_description": "La persona che stai cercando di prenotare si è segnalata assente, quindi non accetta nuove prenotazioni.",
"meet_people_with_the_same_tokens": "Incontra persone con gli stessi token",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "Per modificare la tua email o la tua password, per abilitare l'autenticazione a due fattori e altro ancora, consulta le impostazioni del tuo account {{provider}}.",
"signin_with_google": "Accedi con Google",
"signin_with_saml": "Accedi con SAML",
"signin_with_saml_oidc": "Accedi con SAML/OIDC",
"you_will_need_to_generate": "Dovrai generare un token di accesso con il tuo vecchio strumento di pianificazione.",
"import": "Importa",
"import_from": "Importa da",
@ -950,6 +975,8 @@
"offer_seats_description": "Indica i posti disponibili (ciò disabiliterà le prenotazioni ospite e le prenotazioni opt-in).",
"seats_available_one": "Posto disponibile",
"seats_available_other": "Posti disponibili",
"seats_nearly_full": "Quasi tutti i posti sono al completo",
"seats_half_full": "I posti si esauriscono in fretta",
"number_of_seats": "Numero di posti per prenotazione",
"enter_number_of_seats": "Immettere il numero di posti",
"you_can_manage_your_schedules": "Puoi gestire i tuoi programmi dalla pagina Disponibilità.",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "Come desideri aggiungere {{appName}} al tuo sito?",
"choose_ways_put_cal_site": "Scegli uno dei seguenti modi per inserire {{appName}} nel tuo sito.",
"setting_up_zapier": "Configurare l'integrazione con Zapier",
"setting_up_make": "Configurare l'integrazione con Make",
"generate_api_key": "Genera una chiave API",
"generate_api_key_description": "Genera una chiave API da usare con {{appName}} su",
"your_unique_api_key": "La tua chiave API univoca",
"copy_safe_api_key": "Copia questa chiave API e conservala in un posto sicuro. Se perdi la chiave, dovrai generarne una nuova.",
"zapier_setup_instructions": "<0>Accedi al tuo account Zapier e crea un nuovo Zap.</0><1>Seleziona Cal.com come app trigger. Scegli l'evento trigger.</1><2>Seleziona il tuo account e immetti la tua chiave API univoca.</2><3>Fai una prova del tuo trigger.</3><4>Fatto!</4>",
"make_setup_instructions": "<0>Segui il <1><0>link di invito Make</0></1> e installa l'applicazione Cal.com.</0><1>Accedi al tuo account Make e crea un nuovo Scenario.</1><2>Seleziona Cal.com come app trigger. Scegli l'evento trigger.</2><3>Seleziona il tuo account e immetti la tua chiave API unica.</3><4>Fai una prova del tuo trigger.</4><5>Fatto!</5>",
"install_zapier_app": "Prima è necessario installare l'app Zapier, disponibile nell'App Store.",
"install_make_app": "Prima è necessario installare l'applicazione Make, disponibile nell'App Store.",
"connect_apple_server": "Connetti al server Apple",
"calendar_url": "URL del calendario",
"apple_server_generate_password": "Genera una password specifica dell'app da usare con {{appName}} presso",
@ -1085,6 +1115,7 @@
"email_attendee_action": "invia e-mail ai partecipanti",
"sms_attendee_action": "Invia SMS al partecipante",
"sms_number_action": "invia SMS a un numero specifico",
"send_reminder_sms": "Invia facilmente dei promemoria di riunioni via SMS ai partecipanti",
"whatsapp_number_action": "invia un messaggio Whatsapp a un numero specifico",
"whatsapp_attendee_action": "invia un messaggio Whatsapp al partecipante",
"workflows": "Flussi di lavoro",
@ -1244,6 +1275,7 @@
"error_updating_settings": "Errore durante l'aggiornamento delle impostazioni",
"personal_cal_url": "Il mio URL personale di {{appName}}",
"bio_hint": "Scrivi qualcosa di te. Queste informazioni appariranno nella tua pagina personale.",
"user_has_no_bio": "Questo utente non ha ancora aggiunto una biografia.",
"delete_account_modal_title": "Elimina account",
"confirm_delete_account_modal": "Eliminare il tuo account {{appName}}?",
"delete_my_account": "Elimina il mio account",
@ -1426,6 +1458,7 @@
"add_limit": "Aggiungi limite",
"team_name_required": "Nome del team richiesto",
"show_attendees": "Condividi le informazioni dei partecipanti tra gli ospiti",
"show_available_seats_count": "Mostra il numero di posti disponibili",
"how_booking_questions_as_variables": "Come utilizzare le domande poste nella pagina di prenotazione come variabili?",
"format": "Formato",
"uppercase_for_letters": "Usa tutte lettere maiuscole",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Eliminare la configurazione {{connectionType}}? I membri del tuo team che utilizzano l'accesso {{connectionType}} non saranno più in grado di accedere a Cal.com.",
"organizer_timezone": "Fuso orario organizzatore",
"email_user_cta": "Visualizza invito",
"email_no_user_invite_heading_team": "Hai ricevuto un invito a entrare a far parte del team di {{appName}}",
"email_no_user_invite_heading_org": "Hai ricevuto un invito a entrare a far parte dell'organizzazione {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} ti ha invitato a unirti al suo team su {{appName}}. {{appName}} è uno strumento di pianificazione di eventi che permette al tuo team di pianificare le riunioni senza scambiare decine di e-mail.",
"email_user_invite_subheading_team": "{{invitedBy}} ti ha invitato a unirti al suo team `{{teamName}}` su {{appName}}. {{appName}} è uno strumento di pianificazione di eventi che permette a te e al tuo team di pianificare le riunioni senza scambiare decine di e-mail.",
"email_user_invite_subheading_org": "{{invitedBy}} ti ha invitato a unirti alla sua organizzazione `{{teamName}}` su {{appName}}. {{appName}} è uno strumento di pianificazione di eventi che permette a te e alla tua organizzazione di pianificare le riunioni senza scambiare decine di e-mail.",
"email_no_user_invite_steps_intro": "Ti assisteremo nei passaggi iniziali e potrai rapidamente pianificare eventi per il/la {{entity}} senza fatica.",
"email_no_user_step_one": "Scegli il tuo nome utente",
"email_no_user_step_two": "Collega il tuo account di calendario",
@ -1831,6 +1867,8 @@
"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",
"something_went_wrong_on_our_end": "Si è verificato un problema dal lato nostro. Contatta il nostro team di supporto e provvederemo subito a risolverlo.",
"please_provide_following_text_to_suppport": "Fornisci il seguente testo quando contatterai il team di supporto per permeterci di aiutarti meglio",
"seats_and_no_show_fee_error": "Attualmente non è possibile abilitare i posti e addebitare la penale per mancata presentazione",
"complete_your_booking": "Completa la prenotazione",
"complete_your_booking_subject": "Completa la prenotazione: {{title}} del {{date}}",
@ -1864,6 +1902,9 @@
"open_dialog_with_element_click": "Apre la finestra di dialogo di Cal quando un utente fa clic su un elemento.",
"need_help_embedding": "Hai bisogno di aiuto? Consulta le nostre guide per integrare Cal su Wix, Squarespace o WordPress, leggi le risposte alle domande più frequenti o esplora le opzioni di incorporamento avanzate.",
"book_my_cal": "Prenota su Cal",
"first_name": "Nome",
"last_name": "Cognome",
"first_last_name": "Nome, cognome",
"invite_as": "Invita come",
"form_updated_successfully": "Modulo aggiornato correttamente.",
"disable_attendees_confirmation_emails": "Disabilita le e-mail di conferma predefinite per i partecipanti",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "Crea il primo webhook per questo tipo di evento",
"install_app_on": "Installa l'app su",
"create_for": "Crea per",
"currency": "Valuta",
"organization_banner_description": "Crea ambienti dove i tuoi team potranno creare e condividere applicazioni, flussi di lavoro e tipi di eventi con pianificazioni di gruppo e round robin.",
"organization_banner_title": "Gestisci organizzazioni con più team",
"set_up_your_organization": "Imposta la tua organizzazione",
@ -1937,6 +1979,79 @@
"insights_team_filter": "Team: {{teamName}}",
"insights_user_filter": "Utente: {{userName}}",
"insights_subtitle": "Visualizza insight sulle prenotazioni per tutti i tuoi eventi",
"location_options": "{{locationCount}} opzioni di luogo",
"custom_plan": "Piano personalizzato",
"email_embed": "Incorporamento nell'e-mail",
"add_times_to_your_email": "Seleziona alcuni orari disponibili e incorporali nella tua e-mail",
"select_time": "Seleziona l'ora",
"select_date": "Seleziona la data",
"see_all_available_times": "Vedi tutti gli orari disponibili",
"org_team_names_example": "ad es., team di marketing",
"org_team_names_example_1": "ad es., Team di marketing",
"org_team_names_example_2": "ad es., team vendite",
"org_team_names_example_3": "ad es., team di progettazione",
"org_team_names_example_4": "ad es., team di ingegneria",
"org_team_names_example_5": "ad es., team di analisi dei dati",
"org_max_team_warnings": "Sarà possibile aggiungere altri team in un secondo momento.",
"what_is_this_meeting_about": "Qual è l'oggetto della riunione?",
"add_to_team": "Aggiungi al team",
"remove_users_from_org": "Rimuovi utenti dall'organizzazione",
"remove_users_from_org_confirm": "Rimuovere {{userCount}} utenti da questa organizzazione?",
"user_has_no_schedules": "Questo utente non ha ancora impostato alcuna pianificazione",
"user_isnt_in_any_teams": "Questo utente non fa parte di nessun team",
"requires_booker_email_verification": "Richiede la verifica dell'indirizzo e-mail della persona che prenota",
"description_requires_booker_email_verification": "Per garantire la verifica dell'indirizzo e-mail della persona che prenota prima di panificare eventi",
"requires_confirmation_mandatory": "I messaggi di testo possono solo essere inviati ai partecipanti quando il tipo di evento richiede una conferma.",
"kyc_verification_information": "Per garantire la sicurezza, è necessario verificare {{teamOrAccount}} prima di inviare messaggi di testo ai partecipanti. Contattaci all'indirizzo <a>{{supportEmail}}</a> fornendo le seguenti informazioni:",
"kyc_verification_documents": "<ul><li>Il tuo {{teamOrUser}}</li><li>Per le aziende: allegare la documentazione di verifica aziendale</li><li>Per gli utenti privati: allegare un documento di identità rilasciato dal governo</li></ul>",
"verify_team_or_account": "Verifica {{teamOrAccount}}",
"verify_account": "Verifica account",
"kyc_verification": "Verifica KYC",
"organizations": "Organizzazioni",
"org_admin_other_teams": "Atri team",
"org_admin_other_teams_description": "Qui puoi vedere i team di cui non fai parte all'interno della tua organizzazione. Puoi entrare a far parte di tali team se necessario.",
"no_other_teams_found": "Nessun altro team trovato",
"no_other_teams_found_description": "Non ci sono altri team in questa organizzazione.",
"attendee_first_name_variable": "Nome del partecipante",
"attendee_last_name_variable": "Cognome del partecipante",
"attendee_first_name_info": "Nome della persona che prenota",
"attendee_last_name_info": "Cognome della persona che prenota",
"me": "Io",
"verify_team_tooltip": "Effettua la verifica del tuo team per abilitare l'invio di messaggi ai partecipanti",
"member_removed": "Membro rimosso",
"my_availability": "La mia disponibilità",
"team_availability": "La disponibilità del team",
"backup_code": "Codice di backup",
"backup_codes": "Codici di backup",
"backup_code_instructions": "Ogni codice di backup può essere utilizzato soltanto una volta per concedere l'accesso senza l'autenticatore.",
"backup_codes_copied": "Codici di backup copiati!",
"incorrect_backup_code": "Il codice di backup è errato.",
"lost_access": "Accesso perso",
"missing_backup_codes": "Nessun codice di backup trovato. Puoi generarli nelle impostazioni.",
"admin_org_notification_email_subject": "Nuova organizzazione creata: azione in sospeso",
"hi_admin": "Ciao amministratore",
"admin_org_notification_email_title": "Un'organizzazione richiede la configurazione DNS",
"admin_org_notification_email_body_part1": "È stata creata un'organizzazione con lo slug \"{{orgSlug}}\".<br /><br />Assicurati di configurare il registro DNS in modo che il sottodominio corrispondente alla nuova organizzazione punti verso dov'è eseguita l'applicazione principale, altrimenti l'organizzazione non funzionerà.<br /><br />Ecco solo alcune opzioni molto basilari per configurare un sottodominio in modo che punti alla propria app e carichi la pagina del profilo dell'organizzazione.<br /><br />È possibile farlo utilizzando il record A:",
"admin_org_notification_email_body_part2": "O il record CNAME:",
"admin_org_notification_email_body_part3": "Dopo aver configurato il sottodominio, contrassegnare la configurazione del DNS come completata nelle impostazioni di amministrazione dell'organizzazione.",
"admin_org_notification_email_cta": "Vai alle impostazioni di amministrazione dell'organizzazione",
"org_has_been_processed": "Organizzazione elaborata",
"org_error_processing": "Si è verificato un errore durante l'elaborazione di questa organizzazione",
"orgs_page_description": "Un elenco di tutte le organizzazioni. Accettando un'organizzazione, tutti gli utenti con il rispettivo dominio e-mail potranno registrarsi SENZA verificare l'indirizzo e-mail.",
"unverified": "Non verificato",
"dns_missing": "DNS mancante",
"mark_dns_configured": "Contrassegna DNS come configurato",
"value": "Valore",
"your_organization_updated_sucessfully": "L'organizzazione è stata aggiornata correttamente",
"team_no_event_types": "Questo team non ha nessun tipo di evento",
"seat_options_doesnt_multiple_durations": "L'opzione di prenotazione dei posti non supporta durate multiple",
"include_calendar_event": "Includi evento del calendario",
"recently_added": "Aggiunti di recente",
"no_members_found": "Nessun membro trovato",
"event_setup_length_error": "Impostazione evento: la durata deve essere di almeno 1 minuto.",
"availability_schedules": "Calendario disponibilità",
"view_only_edit_availability_not_onboarded": "Questo utente non ha completato l'onboarding. Non sarai in grado di impostare la sua disponibilità fino a quando non avrà completato l'onboarding.",
"view_only_edit_availability": "Stai visualizzando la disponibilità di questo utente. Puoi solo modificare la tua disponibilità.",
"edit_users_availability": "Modifica la disponibilità dell'utente: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Aggiungi le tue nuove stringhe qui sopra ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "이메일 및 일정을 가능한 한 차질 없이 보내드릴 수 있도록 이메일 주소를 인증하세요.",
"verify_email_email_header": "이메일 주소 인증",
"verify_email_email_button": "이메일 인증",
"copy_somewhere_safe": "이 API 키를 안전한 곳에 보관하세요. 이 키는 다시 볼 수 없게 됩니다.",
"verify_email_email_body": "아래 버튼을 클릭하여 이메일 주소를 인증하세요.",
"verify_email_by_code_email_body": "아래 코드를 사용하여 이메일 주소를 인증하세요.",
"verify_email_email_link_text": "버튼 클릭이 마음에 들지 않는 경우 다음 링크를 사용하세요.",
"email_verification_code": "인증 코드 입력",
"email_verification_code_placeholder": "메일로 전송된 인증번호를 입력하세요",
"incorrect_email_verification_code": "인증 코드가 올바르지 않습니다.",
"email_sent": "이메일이 성공적으로 전송되었습니다",
"email_not_sent": "이메일을 보내는 중 오류가 발생했습니다",
"event_declined_subject": "거절됨: {{date}} {{title}}",
"event_cancelled_subject": "취소됨: {{title}}, 날짜 {{date}}",
"event_request_declined": "회의 요청이 거절되었습니다.",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "되풀이 이벤트가 승인을 기다리고 있습니다",
"someone_requested_an_event": "누군가 귀하의 캘린더에 일정을 예약하도록 요청했습니다.",
"someone_requested_password_reset": "누군가 귀하의 비밀번호 변경을 위한 링크를 요청했습니다.",
"password_reset_email_sent": "이 이메일이 당사 시스템에 존재하는 경우, 재설정 이메일을 받게 됩니다.",
"password_reset_instructions": "요청하지 않으셨다면 이 이메일을 무시하십시오. 비밀번호는 변경되지 않습니다.",
"event_awaiting_approval_subject": "승인을 기다리고 있습니다: {{date}} {{title}}",
"event_still_awaiting_approval": "이벤트가 아직 승인을 기다리고 있습니다.",
@ -217,6 +224,10 @@
"already_have_an_account": "이미 계정이 있으신가요?",
"create_account": "계정 만들기",
"confirm_password": "비밀번호 확인",
"confirm_auth_change": "이것으로 로그인 방식이 변경됩니다",
"confirm_auth_email_change": "이메일 주소를 변경하면 Cal.com에 로그인하는 기존 인증 방법이 연결 해제됩니다. 새 이메일 주소를 인증하라는 메시지가 표시됩니다. 앞으로는 메일로 전송되는 지침에 따라 비밀번호를 설정한 후 로그아웃하고 기존 인증 방법 대신 새 이메일 주소를 사용하여 로그인하게 됩니다.",
"reset_your_password": "이메일 주소로 전송된 지침에 따라 새 비밀번호를 설정하십시오.",
"email_change": "새 이메일 주소와 비밀번호로 다시 로그인하십시오.",
"create_your_account": "계정 만들기",
"sign_up": "가입하기",
"youve_been_logged_out": "로그아웃 되었습니다.",
@ -243,6 +254,10 @@
"all": "모두",
"yours": "사용자 계정",
"available_apps": "사용 가능한 앱",
"available_apps_lower_case": "사용 가능한 앱",
"available_apps_desc": "설치된 앱이 없습니다. 아래에서 인기 앱을 확인하고 <1>App Store</1>에서 더 많은 앱을 탐색해 보세요",
"fixed_host_helper": "이벤트에 참석해야 하는 인원을 추가하세요. <1>자세히 알아보기</1>",
"round_robin_helper": "그룹의 인원들은 차례로 돌아가며 한 명만 이벤트에 참석하게 됩니다.",
"check_email_reset_password": "이메일을 확인하세요. 비밀번호 재설정을 위한 링크를 보냈습니다.",
"finish": "끝",
"organization_general_description": "팀 언어 및 시간대 설정 관리",
@ -251,6 +266,7 @@
"nearly_there_instructions": "마지막으로, 예약에 도움이 되고 사람들이 본인에 대해 알 수 있도록 본인에 대한 간단한 소개와 사진을 올려주세요.",
"set_availability_instructions": "주기적으로 시간이 되는 때가 언제인지 알려주세요. 나중에 더 추가할 수 있습니다.",
"set_availability": "언제 여유가 있는지 설정하세요.",
"availability_settings": "사용 가능한 설정",
"continue_without_calendar": "캘린더 없이 계속하기",
"connect_your_calendar": "캘린더 연결하기",
"connect_your_video_app": "비디오 앱 연결",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "'+' 기호로 여러 사용자 이름을 추가하여 동적으로 생성할 수 있는 그룹 예약 링크. 예: '{{appName}}/bailey+peer'",
"allow_dynamic_booking": "참석자가 동적 그룹 예약을 통해 귀하를 예약하도록 허용",
"dynamic_booking": "동적 그룹 링크",
"allow_seo_indexing": "검색 엔진이 공개 콘텐츠에 액세스하도록 허용",
"seo_indexing": "SEO 인덱싱 허용",
"email": "이메일",
"email_placeholder": "jdoe@example.com",
"full_name": "이름",
@ -406,6 +424,7 @@
"booking_requested": "예약 요청됨",
"meeting_ended": "회의 종료됨",
"form_submitted": "양식 제출됨",
"booking_paid": "예약 결제됨",
"event_triggers": "이벤트 트리거",
"subscriber_url": "구독자 URL",
"create_new_webhook": "새 웹훅 만들기",
@ -506,6 +525,7 @@
"your_name": "당신의 이름",
"your_full_name": "전체 이름",
"no_name": "이름 없음",
"enter_number_between_range": "1에서 {{maxOccurences}} 사이의 숫자를 입력하세요",
"email_address": "이메일 주소",
"enter_valid_email": "유효한 이메일을 입력하세요",
"location": "위치",
@ -543,6 +563,7 @@
"leave": "떠나기",
"profile": "프로필",
"my_team_url": "우리팀 URL",
"my_teams": "내 팀",
"team_name": "팀 이름",
"your_team_name": "팀 이름",
"team_updated_successfully": "팀이 성공적으로 업데이트되었습니다.",
@ -570,6 +591,8 @@
"invite_new_member": "새 팀원 초대",
"invite_new_member_description": "참고: 이로 인해 해당 구독에 <1>추가 시트 비용($15/m)</1>이 발생합니다.",
"invite_new_team_member": "누군가를 팀에 초대하기",
"upload_csv_file": ".csv 파일 업로드",
"invite_via_email": "이메일을 통한 초대",
"change_member_role": "팀원 역할 변경",
"disable_cal_branding": "{{appName}} 브랜딩 비활성화",
"disable_cal_branding_description": "공개 페이지에서 모든 {{appName}} 브랜딩 숨기기",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "사용 가능 여부를 보려면 사용자가 초대를 수락해야 합니다",
"set_as_away": "본인을 공석으로 설정",
"set_as_free": "공석 상태 비활성화",
"toggle_away_error": "부재중 상태를 업데이트하는 중 오류가 발생했습니다",
"user_away": "이 사용자는 현재 자리를 비웠습니다.",
"user_away_description": "예약하려는 사람이 자신을 공석으로 설정했기 때문에 새 예약을 받고 있지 않습니다.",
"meet_people_with_the_same_tokens": "같은 토큰을 가진 사람들을 만나세요",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "이메일, 비밀번호를 변경하고 이중 인증을 활성화하려면 {{provider}} 계정 설정을 방문하세요.",
"signin_with_google": "Google로 로그인",
"signin_with_saml": "SAML로 로그인",
"signin_with_saml_oidc": "SAML/OIDC로 로그인",
"you_will_need_to_generate": "이전 일정 관리 도구에서 액세스 토큰을 생성해야 합니다.",
"import": "가져오기",
"import_from": "가져오기 위치",
@ -950,6 +975,8 @@
"offer_seats_description": "예약에 좌석 제공(게스트를 비활성화하고 예약을 선택함)",
"seats_available_one": "사용 가능한 좌석",
"seats_available_other": "사용 가능한 좌석",
"seats_nearly_full": "좌석이 거의 꽉 찼습니다",
"seats_half_full": "좌석이 빠르게 채워지는 중",
"number_of_seats": "예약당 좌석 수",
"enter_number_of_seats": "좌석 수 입력",
"you_can_manage_your_schedules": "가용성 페이지에서 자신의 일정을 관리할 수 있습니다.",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "귀하의 사이트에 {{appName}}을 어떻게 추가하시겠습니까?",
"choose_ways_put_cal_site": "귀하의 사이트에 {{appName}}을 추가하는 다음 방법 중 하나를 선택하십시오.",
"setting_up_zapier": "Zapier 통합을 설정하는 중",
"setting_up_make": "Make 통합을 설정하는 중",
"generate_api_key": "API 키 생성",
"generate_api_key_description": "{{appName}}에서 사용할 API 키 생성 위치",
"your_unique_api_key": "귀하의 고유 API 키",
"copy_safe_api_key": "이 API 키를 복사하여 안전한 곳에 보관하십시오. 이 키를 분실한 경우 새 키를 생성해야 합니다.",
"zapier_setup_instructions": "<0>Zapier 계정에 로그인하고 새 Zap을 만듭니다.</0><1>Cal.com을 트리거 앱으로 선택합니다. 또한 트리거 이벤트를 선택합니다.</1><2>계정을 선택한 후 고유 API 키를 입력합니다.</2><3>트리거를 테스트합니다.</3><4>설정이 완료되었습니다!</4 >",
"make_setup_instructions": "<0><1><0>초대 링크 만들기</0></1>로 이동하여 Cal.com 앱을 설치합니다.</0><1>Make 계정에 로그인하고 새 시나리오를 만듭니다.</1><2>Cal.com을 Trigger 앱으로 선택합니다. 트리거 이벤트도 선택합니다.</2><3>계정을 선택한 후 고유 API 키를 입력합니다.</3><4>트리거를 테스트합니다.</4><5>이제 준비되었습니다!</5 >",
"install_zapier_app": "먼저 앱 스토어에서 Zapier 앱을 설치하십시오.",
"install_make_app": "먼저 앱 스토어에서 Make 앱을 설치하십시오.",
"connect_apple_server": "Apple 서버에 연결하기",
"calendar_url": "캘린더 URL",
"apple_server_generate_password": "{{appName}}에서 사용할 앱 비밀번호 생성:",
@ -1085,6 +1115,7 @@
"email_attendee_action": "참석자들에게 이메일 전송",
"sms_attendee_action": "참석자에게 SMS 발송",
"sms_number_action": "특정 번호로 SMS 발송",
"send_reminder_sms": "SMS를 통해 참석자에게 회의 알림을 쉽게 보낼 수 있습니다",
"whatsapp_number_action": "특정 번호로 Whatsapp 발송",
"whatsapp_attendee_action": "참석자에게 Whatsapp 발송",
"workflows": "워크플로",
@ -1244,6 +1275,7 @@
"error_updating_settings": "설정 업데이트 중 오류 발생",
"personal_cal_url": "내 개인 {{appName}} URL",
"bio_hint": "자신에 대해 몇 마디를 써보세요. 개인 URL 페이지에 보이는 내용입니다.",
"user_has_no_bio": "이 사용자는 아직 사용자 정보를 추가하지 않았습니다.",
"delete_account_modal_title": "계정 삭제",
"confirm_delete_account_modal": "{{appName}} 계정을 삭제하시겠습니까?",
"delete_my_account": "내 계정 삭제",
@ -1426,6 +1458,7 @@
"add_limit": "제한 추가",
"team_name_required": "팀 이름 필수",
"show_attendees": "게스트 간에 참석자 정보 공유",
"show_available_seats_count": "사용 가능한 좌석 수 표시",
"how_booking_questions_as_variables": "예약 질문을 어떻게 변수로 사용합니까?",
"format": "형식",
"uppercase_for_letters": "모든 문자에 대문자 사용",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "{{connectionType}} 구성을 삭제하시겠습니까? {{connectionType}} 로그인을 사용하는 팀원은 더 이상 Cal.com에 액세스할 수 없습니다.",
"organizer_timezone": "주최자 시간대",
"email_user_cta": "초대 보기",
"email_no_user_invite_heading_team": "{{appName}} 팀에 참여 초대를 받으셨습니다",
"email_no_user_invite_heading_org": "{{appName}} 조직에 참여 초대를 받으셨습니다",
"email_no_user_invite_subheading": "{{invitedBy}} 님이 귀하를 {{appName}}에서 자신의 팀에 초대했습니다. {{appName}} 앱은 귀하와 귀하의 팀이 이메일을 주고 받지 않고 회의 일정을 잡을 수 있게 해주는 이벤트 정리 스케줄러입니다.",
"email_user_invite_subheading_team": "{{invitedBy}}님이 {{appName}}에서 자신의 `{{teamName}}` 팀에 가입하도록 당신을 초대했습니다. {{appName}}은 유저와 팀이 이메일을 주고 받지 않고도 회의 일정을 잡을 수 있게 하는 이벤트 조율 스케줄러입니다.",
"email_user_invite_subheading_org": "{{invitedBy}} 님이 {{appName}}에서 자신의 조직의 `{{teamName}}`에 귀하의 참여를 초대했습니다. {{appName}}은(는) 사용자와 조직이 이메일을 주고 받지 않고도 회의 일정을 잡을 수 있게 해주는 이벤트 조정 스케줄러입니다.",
"email_no_user_invite_steps_intro": "안내해 드릴 몇 가지 간단한 단계만 거치면 곧 스트레스 없이 편리하게 {{entity}} 일정을 관리할 수 있게 될 것입니다.",
"email_no_user_step_one": "사용자 이름 선택",
"email_no_user_step_two": "캘린더 계정 연결",
@ -1831,6 +1867,8 @@
"insights_no_data_found_for_filter": "선택한 필터 또는 날짜에 대한 데이터를 찾을 수 없습니다.",
"acknowledge_booking_no_show_fee": "본인은 이 이벤트에 참석하지 않을 경우 {{amount, currency}}에 대한 노쇼 수수료가 내 카드에 부과됨을 인정합니다.",
"card_details": "카드 세부정보",
"something_went_wrong_on_our_end": "문제가 발생했습니다. 지원팀에 연락하시면 즉시 문제를 해결해 드리겠습니다.",
"please_provide_following_text_to_suppport": "더 나은 도움을 받으려면 지원팀에 문의할 때 다음 텍스트를 제공해 주세요",
"seats_and_no_show_fee_error": "현재 좌석을 활성화할 수 없으므로 노쇼 수수료를 부과할 수 없습니다",
"complete_your_booking": "예약을 완료하세요",
"complete_your_booking_subject": "예약 완료: {{title}} 날짜 {{date}}",
@ -1864,6 +1902,9 @@
"open_dialog_with_element_click": "누군가 요소를 클릭하면 Cal 대화 상자를 엽니다.",
"need_help_embedding": "도움이 필요하신가요? Wix, Squarespace, 또는 WordPress에서 Cal을 임베드하기 위한 가이드를 참조하거나, 자주 묻는 질문을 확인하거나, 고급 임베드 옵션을 살펴보세요.",
"book_my_cal": "내 Cal 예약",
"first_name": "이름",
"last_name": "성",
"first_last_name": "이름, 성",
"invite_as": "다른 이름으로 초대",
"form_updated_successfully": "양식이 성공적으로 업데이트되었습니다.",
"disable_attendees_confirmation_emails": "참석자에 대한 기본 확인 이메일 사용 안 함",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "이 이벤트 유형에 대한 첫 번째 웹훅 만들기",
"install_app_on": "앱 설치 대상",
"create_for": "작성 대상",
"currency": "통화",
"organization_banner_description": "팀이 라운드 로빈 및 공동 예약을 통해 공유 앱, 워크플로 및 이벤트 유형을 생성할 수 있는 환경을 만듭니다.",
"organization_banner_title": "여러 팀으로 조직 관리",
"set_up_your_organization": "조직 설정",
@ -1937,6 +1979,79 @@
"insights_team_filter": "팀: {{teamName}}",
"insights_user_filter": "사용자: {{userName}}",
"insights_subtitle": "이벤트 전반에 걸친 예약 Insights 보기",
"location_options": "{{locationCount}}개의 위치 옵션",
"custom_plan": "사용자 정의 플랜",
"email_embed": "이메일 포함",
"add_times_to_your_email": "사용 가능한 시간을 몇 개 선택하여 이메일에 포함시키세요",
"select_time": "시간 선택",
"select_date": "날짜 선택",
"see_all_available_times": "모든 사용 가능한 시간 보기",
"org_team_names_example": "예: 마케팅 팀",
"org_team_names_example_1": "예: 마케팅 팀",
"org_team_names_example_2": "예: 세일즈 팀",
"org_team_names_example_3": "예: 디자인 팀",
"org_team_names_example_4": "예: 엔지니어링 팀",
"org_team_names_example_5": "예: 데이터 분석 팀",
"org_max_team_warnings": "나중에 더 많은 팀을 추가할 수 있습니다.",
"what_is_this_meeting_about": "이 회의는 어떤 주제를 다루나요?",
"add_to_team": "팀에 추가",
"remove_users_from_org": "조직에서 사용자 제거",
"remove_users_from_org_confirm": "이 조직에서 {{userCount}}명의 사용자를 제거하시겠습니까?",
"user_has_no_schedules": "이 사용자는 아직 일정을 설정하지 않았습니다",
"user_isnt_in_any_teams": "이 사용자는 어떤 팀의 소속도 아닙니다",
"requires_booker_email_verification": "예약자 이메일 인증이 필요합니다",
"description_requires_booker_email_verification": "이벤트를 예약하기 전 예약자의 이메일 인증하기",
"requires_confirmation_mandatory": "문자 메시지는 이벤트 유형에 확인이 필요한 경우에만 참석자에게 보낼 수 있습니다.",
"kyc_verification_information": "보안이 되게 하려면 참석자에게 문자 메시지를 보내기 전에 {{teamOrAccount}} 인증은 필수입니다. <a>{{supportEmail}}</a>에 연락하여 다음 정보를 제공해 주시기 바랍니다.",
"kyc_verification_documents": "<ul><li>귀하의 {{teamOrUser}}</li><li>기업의 경우: 비즈니스 확인 서류 첨부</li><li>개인의 경우: 정부 발급 신분증 첨부</li></ul >",
"verify_team_or_account": "{{teamOrAccount}} 인증",
"verify_account": "계정 인증",
"kyc_verification": "KYC 인증",
"organizations": "조직",
"org_admin_other_teams": "다른 팀",
"org_admin_other_teams_description": "여기에서 귀하의 소속이 아닌 조직 내부의 팀을 볼 수 있습니다. 필요한 경우 여기에 자신을 추가할 수 있습니다.",
"no_other_teams_found": "다른 팀 없음",
"no_other_teams_found_description": "이 조직에는 다른 팀이 없습니다.",
"attendee_first_name_variable": "참석자 이름",
"attendee_last_name_variable": "참석자 성",
"attendee_first_name_info": "예약자 이름",
"attendee_last_name_info": "예약자 성",
"me": "나",
"verify_team_tooltip": "참석자에게 메시지를 보낼 수 있도록 팀을 인증하세요",
"member_removed": "구성원 제거됨",
"my_availability": "내 가용성",
"team_availability": "팀 가용성",
"backup_code": "백업 코드",
"backup_codes": "백업 코드",
"backup_code_instructions": "각 백업 코드는 인증자 없이 액세스 권한을 부여하기 위해 정확히 한 번만 사용할 수 있습니다.",
"backup_codes_copied": "백업 코드가 복사되었습니다!",
"incorrect_backup_code": "백업 코드가 올바르지 않습니다.",
"lost_access": "액세스 상실",
"missing_backup_codes": "백업 코드를 찾을 수 없습니다. 설정에서 생성하세요.",
"admin_org_notification_email_subject": "새 조직 생성됨: 작업 대기 중",
"hi_admin": "안녕하세요 관리자 님",
"admin_org_notification_email_title": "조직에 DNS 설정이 필요합니다",
"admin_org_notification_email_body_part1": "슬러그 \"{{orgSlug}}\" 있는 조직이 생성되었습니다.<br /><br />새 조직에 해당하는 하위 도메인이 기본 앱이 실행되는 위치를 가리키도록 DNS 레지스트리를 구성하십시오. 구성하지 않으면 조직은 작동하지 않습니다.<br /><br />다음은 하위 도메인이 앱을 가리키도록 구성하여 조직 프로필 페이지를 로드하는 매우 기본적인 옵션입니다.<br /><br />할 수 있는 작업은 A 레코드를 사용하는 것입니다:",
"admin_org_notification_email_body_part2": "또는 CNAME 레코드를 사용하는 것입니다:",
"admin_org_notification_email_body_part3": "하위 도메인을 구성한 후 조직 관리 설정에서 DNS 구성을 완료로 표시하십시오.",
"admin_org_notification_email_cta": "조직 관리자 설정으로 이동",
"org_has_been_processed": "조직이 처리되었습니다",
"org_error_processing": "이 조직을 처리하는 중 오류가 발생했습니다",
"orgs_page_description": "모든 조직의 목록입니다. 조직을 수락하면 해당 이메일 도메인을 가진 모든 사용자가 이메일 인증 없이 가입할 수 있습니다.",
"unverified": "미인증됨",
"dns_missing": "DNS 없음",
"mark_dns_configured": "DNS 구성됨으로 표시",
"value": "값",
"your_organization_updated_sucessfully": "조직이 업데이트되었습니다",
"team_no_event_types": "이 팀에는 이벤트 유형이 없습니다",
"seat_options_doesnt_multiple_durations": "좌석 옵션은 여러 기간을 지원하지 않습니다",
"include_calendar_event": "캘린더 이벤트 포함",
"recently_added": "최근 추가됨",
"no_members_found": "구성원 없음",
"event_setup_length_error": "이벤트 설정: 지속 시간은 1분 이상이어야 합니다.",
"availability_schedules": "사용 가능한 일정",
"view_only_edit_availability_not_onboarded": "이 사용자는 온보딩을 완료하지 않았습니다. 온보딩이 완료될 때까지는 가용성을 설정할 수 없습니다.",
"view_only_edit_availability": "이 사용자의 가용성을 보고 계십니다. 본인의 가용성만 편집할 수 있습니다.",
"edit_users_availability": "사용자 가용성 편집: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 여기에 새 문자열을 추가하세요 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,11 +17,15 @@
"verify_email_banner_body": "Verifieer uw e-mailadres om de beste bezorgbaarheid van e-mails en agenda's te garanderen",
"verify_email_email_header": "Verifieer uw e-mailadres",
"verify_email_email_button": "E-mailadres verifiëren",
"copy_somewhere_safe": "Sla deze API-sleutel ergens veilig op. U kunt deze niet opnieuw bekijken.",
"verify_email_email_body": "Verifieer uw e-mailadres door op de onderstaande knop te klikken.",
"verify_email_by_code_email_body": "Verifieer je e-mailadres door onderstaande code te gebruiken.",
"verify_email_email_link_text": "Hier is de link voor het geval u niet graag op knoppen klikt:",
"email_verification_code": "Voer verificatiecode in",
"email_verification_code_placeholder": "Voer de verificatiecode in die u per e-mail is toegestuurd",
"incorrect_email_verification_code": "Verificatiecode is onjuist.",
"email_sent": "E-mail verzonden",
"email_not_sent": "Fout opgetreden tijdens het versturen van e-mail",
"event_declined_subject": "Afgewezen: {{title}}",
"event_cancelled_subject": "Geannuleerd: {{title}} op {{date}}",
"event_request_declined": "Uw gebeurtenisverzoek is geweigerd",
@ -80,6 +84,7 @@
"event_awaiting_approval_recurring": "Een terugkerende gebeurtenis wacht op uw goedkeuring",
"someone_requested_an_event": "Iemand heeft verzocht om een gebeurtenis op uw kalender te plannen.",
"someone_requested_password_reset": "Iemand heeft een link verzocht om uw wachtwoord te wijzigen.",
"password_reset_email_sent": "Als dit e-mailadres in ons systeem bestaat, zou u een e-mail voor het opnieuw instellen van uw wachtwoord moeten ontvangen.",
"password_reset_instructions": "Als dit niet heeft verzocht, kunt u deze e-mail gerust negeren en wordt uw wachtwoord niet gewijzigd.",
"event_awaiting_approval_subject": "In afwachting van goedkeuring: {{title}} om {{date}}",
"event_still_awaiting_approval": "Een gebeurtenis wacht nog op uw goedkeuring",
@ -219,6 +224,10 @@
"already_have_an_account": "Heeft u al een account?",
"create_account": "Account Aanmaken",
"confirm_password": "Wachtwoord bevestigen",
"confirm_auth_change": "Dit wijzigt de manier waarop u inlogt",
"confirm_auth_email_change": "Als u het e-mailadres wijzigt, wordt uw huidige verificatiemethode om in te loggen op Cal.com ontkoppeld. We vragen u om uw nieuwe e-mailadres te verifiëren. In de toekomst wordt u uitgelogd en gebruikt u uw nieuwe e-mailadres om in te loggen in plaats van uw huidige verificatiemethode nadat u uw wachtwoord heeft ingesteld door de instructies te volgen die u oer e-mail worden toegestuurd.",
"reset_your_password": "Stel uw nieuwe wachtwoord in met de instructies die u per e-mail zijn toegestuurd.",
"email_change": "Log opnieuw in met uw nieuwe e-mailadres en wachtwoord.",
"create_your_account": "Uw account aanmaken",
"sign_up": "Registreer nu",
"youve_been_logged_out": "U bent uitgelogd",
@ -246,6 +255,9 @@
"yours": "Uw account",
"available_apps": "Beschikbare apps",
"available_apps_lower_case": "Beschikbare apps",
"available_apps_desc": "U heeft geen apps geïnstalleerd. Bekijk hieronder populaire apps en ontdek meer in onze <1>appstore</1>",
"fixed_host_helper": "Voeg iedereen toe die de gebeurtenis moet bijwonen. <1>Meer informatie</1>",
"round_robin_helper": "Mensen in de groep wisselen elkaar af en er komt maar één persoon opdagen voor de gebeurtenis.",
"check_email_reset_password": "Controleer uw e-mail. We hebben u een link gestuurd om uw wachtwoord opnieuw in te stellen.",
"finish": "Voltooien",
"organization_general_description": "Beheer de instellingen voor de taal en tijdzone van uw team",
@ -254,6 +266,7 @@
"nearly_there_instructions": "Tot slot, een korte beschrijving van u en een foto helpt u echt boekingen te krijgen en laat iedereen weten bij wie ze boeken.",
"set_availability_instructions": "Bepaal tijdbereiken waarin u periodiek beschikbaar bent. U kunt op een later tijdstip terugkomen en hier meer van aanmaken en toewijzen aan verschillende kalenders.",
"set_availability": "Beschikbaarheid bepalen",
"availability_settings": "Beschikbaarheidsinstellingen",
"continue_without_calendar": "Doorgaan zonder kalender",
"connect_your_calendar": "Koppel uw agenda",
"connect_your_video_app": "Koppel uw videoapps",
@ -395,6 +408,8 @@
"allow_dynamic_booking_tooltip": "Groepsboekingslinks die dynamisch kunnen worden aangemaakt door meerdere gebruikersnamen toe te voegen met een \"+\", bijvoorbeeld: \"{{appName}}/bailey+peer",
"allow_dynamic_booking": "Sta deelnemers toe om u te boeken via dynamische groepsboekingen",
"dynamic_booking": "Dynamische groepslinks",
"allow_seo_indexing": "Geef zoekmachines toegang tot uw openbare content",
"seo_indexing": "Sta SEO-indexering toe",
"email": "E-mailadres",
"email_placeholder": "jjansen@voorbeeld.nl",
"full_name": "Volledige naam",
@ -510,6 +525,7 @@
"your_name": "Uw naam",
"your_full_name": "Uw volledige naam",
"no_name": "Geen naam",
"enter_number_between_range": "Voer een getal in tussen 1 en {{maxOccurences}}",
"email_address": "E-mail adres",
"enter_valid_email": "Voer een geldig e-mailadres in",
"location": "Locatie",
@ -547,6 +563,7 @@
"leave": "Verlaat",
"profile": "Profiel",
"my_team_url": "Mijn team URL",
"my_teams": "Mijn teams",
"team_name": "Teamnaam",
"your_team_name": "Naam van uw team",
"team_updated_successfully": "Team bijgewerkt",
@ -574,6 +591,8 @@
"invite_new_member": "Nieuw teamlid uitnodigen",
"invite_new_member_description": "Opmerking: dit <1>kost een extra plaats ($ 15/maand)</1> op uw abonnement.",
"invite_new_team_member": "Nodig iemand uit tot uw team.",
"upload_csv_file": "Upload een .csv-bestand",
"invite_via_email": "Uitnodigen via e-mail",
"change_member_role": "Rol teamlid wijzigen",
"disable_cal_branding": "{{appName}}-merk uitschakelen",
"disable_cal_branding_description": "Verberg alle {{appName}} branding op uw openbare pagina's.",
@ -846,6 +865,7 @@
"team_view_user_availability_disabled": "Gebruiker moet de uitnodiging accepteren om beschikbaarheid weer te geven",
"set_as_away": "Zet uzelf op afwezig",
"set_as_free": "Status afwezig uitschakelen",
"toggle_away_error": "Fout bij het bijwerken van de status afwezig",
"user_away": "Deze gebruiker is momenteel afwezig.",
"user_away_description": "De persoon die u probeert te boeken heeft zichzelf op afwezig gezet en accepteert dus geen nieuwe boekingen.",
"meet_people_with_the_same_tokens": "Ontmoet mensen met dezelfde tokens",
@ -855,6 +875,7 @@
"account_managed_by_identity_provider_description": "Ga naar uw accountinstellingen bij {{provider}} om uw e-mailadres en wachtwoord te wijzigen, tweestapsverificatie in te schakelen en meer.",
"signin_with_google": "Aanmelden met Google",
"signin_with_saml": "Aanmelden met SAML",
"signin_with_saml_oidc": "Aanmelden met SAML/OIDC",
"you_will_need_to_generate": "U moet een toegangstoken genereren van uw oude planningstool.",
"import": "Importeren",
"import_from": "Importeren van",
@ -954,6 +975,8 @@
"offer_seats_description": "Bied beschikbare plaatsen aan voor boekingen. Hiermee worden gastboekingen en aanmeldingsboekingen automatisch uitgeschakeld.",
"seats_available_one": "Plaats beschikbaar",
"seats_available_other": "Beschikbare zitplaatsen",
"seats_nearly_full": "Plaatsen bijna vol",
"seats_half_full": "Plaatsen raken snel vol",
"number_of_seats": "Aantal zitplaatsen per boeking",
"enter_number_of_seats": "Voer het aantal zitplaatsen in",
"you_can_manage_your_schedules": "U kunt uw schema's beheren op de beschikbaarheidspagina.",
@ -1034,12 +1057,15 @@
"how_you_want_add_cal_site": "Hoe wilt u {{appName}} aan uw website toevoegen?",
"choose_ways_put_cal_site": "Kies een van de volgende manieren om {{appName}} op uw website te plaatsen.",
"setting_up_zapier": "Uw Zapier-integratie configureren",
"setting_up_make": "Uw Make-integratie configureren",
"generate_api_key": "API-sleutel genereren",
"generate_api_key_description": "Genereer een API-sleutel die gebruikt moet worden met {{appName}} op",
"your_unique_api_key": "Uw unieke API-sleutel",
"copy_safe_api_key": "Kopieer deze API-sleutel en sla deze ergens veilig op. Als u deze sleutel verliest, moet u een nieuwe genereren.",
"zapier_setup_instructions": "<0>Meld u aan op uw Zapier-account en maak een nieuwe Zap.</0><1>Selecteer {{appName}} als uw activatie-app. Kies ook een activatiegebeurtenis.</1><2>Kies uw account en voer vervolgens uw unieke API-sleutel in.</2><3>Test uw activatie.</3><4>U bent er klaar voor!</4>",
"make_setup_instructions": "<0>Ga naar <1><0>Make-uitnodigingslink</0></1> en installeer de Cal.com-app.</0><1>Log in bij uw Make-account en maak een nieuw scenario.</1><2>Selecteer Cal.com als uw activatie-app. Kies ook een activatiegebeurtenis.</2><3>Kies uw account en voer uw unieke API-sleutel in.</3><4>Test uw activatie.</4><5>U bent er klaar voor!</5>",
"install_zapier_app": "Installeer eerst de Zapier-app in de App Store.",
"install_make_app": "Installeer eerst de Make-app uit de appstore.",
"connect_apple_server": "Verbinding maken met Apple Server",
"calendar_url": "Agenda-URL",
"apple_server_generate_password": "Genereer een appspecifiek wachtwoord voor gebruik met {{appName}} op",
@ -1089,6 +1115,7 @@
"email_attendee_action": "e-mail naar deelnemers versturen",
"sms_attendee_action": "Sms verzenden naar deelnemer",
"sms_number_action": "sms naar een specifiek nummer sturen",
"send_reminder_sms": "Stuur eenvoudig vergaderherinneringen via sms naar uw deelnemers",
"whatsapp_number_action": "WhatsApp-bericht naar een specifiek nummer versturen",
"whatsapp_attendee_action": "WhatsApp-bericht naar deelnemer versturen",
"workflows": "Werkstromen",
@ -1248,6 +1275,7 @@
"error_updating_settings": "Fout bij het bijwerken van de instellingen",
"personal_cal_url": "Mijn persoonlijke {{appName}}-URL",
"bio_hint": "Een korte introductie over uzelf. Dit wordt weergegeven op uw persoonlijke pagina.",
"user_has_no_bio": "Deze gebruiker heeft nog geen bio toegevoegd.",
"delete_account_modal_title": "Account verwijderen",
"confirm_delete_account_modal": "Weet u zeker dat u uw {{appName}}-account wilt verwijderen?",
"delete_my_account": "Verwijder mijn account",
@ -1430,6 +1458,7 @@
"add_limit": "Voeg een limiet toe",
"team_name_required": "Teamnaam verplicht",
"show_attendees": "Deel de deelnemersinformatie met de gasten",
"show_available_seats_count": "Aantal beschikbare plaatsen weergeven",
"how_booking_questions_as_variables": "Hoe gebruik ik boekingsvragen als variabelen?",
"format": "Formatteren",
"uppercase_for_letters": "Gebruik hoofdletters voor alle letters",
@ -1663,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Weet u zeker dat u de {{connectionType}}-configuratie wilt verwijderen? Uw teamleden die {{connectionType}}-aanmelding gebruiken hebben niet langer toegang tot Cal.com.",
"organizer_timezone": "Tijdzone organisator",
"email_user_cta": "Uitnodiging weergeven",
"email_no_user_invite_heading_team": "U bent uitgenodigd om lid te worden van een {{appName}}-team",
"email_no_user_invite_heading_org": "U bent uitgenodigd om lid te worden van de {{appName}}-organisatie",
"email_no_user_invite_subheading": "{{invitedBy}} heeft u uitgenodigd om lid te worden van zijn team op {{appName}}. {{appName}} is de gebeurtenissenplanner die u en uw team in staat stelt vergaderingen te plannen zonder heen en weer te e-mailen.",
"email_user_invite_subheading_team": "{{invitedBy}} heeft u uitgenodigd om lid te worden van zijn team '{{teamName}}' op {{appName}}. {{appName}} is de gebeurtenissenplanner die u en uw team in staat stelt afspraken te plannen zonder heen en weer te e-mailen.",
"email_user_invite_subheading_org": "{{invitedBy}} heeft u uitgenodigd om lid te worden van zijn organisatie '{{teamName}}' op {{appName}}. {{appName}} is de gebeurtenissenplanner die u en uw organisatie in staat stelt afspraken te plannen zonder heen en weer te e-mailen.",
"email_no_user_invite_steps_intro": "We doorlopen samen een paar korte stappen en in een mum van tijd kunt u genieten van een stressvrije planning met uw {{entity}}.",
"email_no_user_step_one": "Kies uw gebruikersnaam",
"email_no_user_step_two": "Koppel uw agenda-account",
@ -1835,6 +1867,8 @@
"insights_no_data_found_for_filter": "Geen gegevens gevonden voor het geselecteerde filter of de geselecteerde datums.",
"acknowledge_booking_no_show_fee": "Ik erken dat als ik deze gebeurtenis niet bijwoon, er {{amount, currency}} aan afwezigheidsvergoeding van mijn kaart worden afgeschreven.",
"card_details": "Kaartgegevens",
"something_went_wrong_on_our_end": "Er is iets misgegaan aan onze kant. Neem contact op met ons ondersteuningsteam en we lossen het meteen voor u op.",
"please_provide_following_text_to_suppport": "Vermeld de volgende tekst wanneer u contact opneemt met ondersteuning, zodat we u beter kunnen helpen",
"seats_and_no_show_fee_error": "Kan op dit moment geen plaatsen inschakelen en afwezigheidsvergoeding in rekening brengen",
"complete_your_booking": "Voltooi uw boeking",
"complete_your_booking_subject": "Voltooi uw boeking: {{title}} op {{date}}",
@ -1884,6 +1918,7 @@
"first_event_type_webhook_description": "Maak uw eerste webhook voor dit gebeurtenistype",
"install_app_on": "App installeren op",
"create_for": "Maken voor",
"currency": "Valuta",
"organization_banner_description": "Maak een omgeving waarin uw teams gedeelde apps, werkstromen en gebeurtenistypen kunnen maken met round-robin en collectieve planning.",
"organization_banner_title": "Beheer organisaties met meerdere teams",
"set_up_your_organization": "Stel uw organisatie in",
@ -1944,11 +1979,79 @@
"insights_team_filter": "Team: {{teamName}}",
"insights_user_filter": "Gebruiker: {{userName}}",
"insights_subtitle": "Bekijk boekingsinsights voor al uw gebeurtenissen",
"location_options": "{{locationCount}} locatieopties",
"custom_plan": "Aangepast abonnement",
"email_embed": "E-mail insluiten",
"add_times_to_your_email": "Selecteer enkele beschikbare tijden en voeg ze toe aan uw e-mail",
"select_time": "Tijd selecteren",
"select_date": "Datum selecteren",
"see_all_available_times": "Bekijk alle beschikbare tijden",
"org_team_names_example": "bijvoorbeeld Marketingteam",
"org_team_names_example_1": "bijvoorbeeld Marketingteam",
"org_team_names_example_2": "bijvoorbeeld Verkoopteam",
"org_team_names_example_3": "bijvoorbeeld Ontwerpteam",
"org_team_names_example_4": "bijvoorbeeld Engineeringteam",
"org_team_names_example_5": "bijvoorbeeld Gegevensanalyseteam",
"org_max_team_warnings": "U kunt later meer teams toevoegen.",
"what_is_this_meeting_about": "Waar gaat deze afspraak over?",
"add_to_team": "Voeg toe aan team",
"remove_users_from_org": "Gebruikers verwijderen uit organisatie",
"remove_users_from_org_confirm": "Weet u zeker dat u {{userCount}} gebruikers uit deze organisatie wilt verwijderen?",
"user_has_no_schedules": "Deze gebruiker heeft nog geen planningen ingesteld",
"user_isnt_in_any_teams": "Deze gebruiker zit niet in een team",
"requires_booker_email_verification": "E-mailverificatie door boeker vereist",
"description_requires_booker_email_verification": "Om te zorgen voor de e-mailverificatie door de boeker voordat gebeurtenissen worden gepland",
"requires_confirmation_mandatory": "Sms-berichten kunnen alleen naar deelnemers worden verzonden als het gebeurtenistype bevestiging vereist.",
"kyc_verification_information": "Om de veiligheid te garanderen, moet u uw {{teamOrAccount}} verifiëren voordat u sms-berichten naar deelnemers verstuurd. Neem contact met ons op via <a>{{supportEmail}}</a> en verstrek de volgende gegevens:",
"kyc_verification_documents": "<ul><li>Uw {{teamOrUser}}</li><li>Voor bedrijven: voeg uw bedrijfsverificatiedocumentatie bij</li><li>Voor particulieren: voeg een door de overheid uitgegeven identiteitsbewijs bij</li></ul>",
"verify_team_or_account": "{{teamOrAccount}} verifiëren",
"verify_account": "Account verifiëren",
"kyc_verification": "KYC-verificatie",
"organizations": "Organisaties",
"org_admin_other_teams": "Andere teams",
"org_admin_other_teams_description": "Hier kunt u teams binnen uw organisatie zien waar u geen deel van uitmaakt. U kunt uzelf aan hen toevoegen indien nodig.",
"no_other_teams_found": "Geen andere teams gevonden",
"no_other_teams_found_description": "Er zijn geen andere teams binnen deze organisatie.",
"attendee_first_name_variable": "Voornaam deelnemer",
"attendee_last_name_variable": "Achternaam deelnemer",
"attendee_first_name_info": "De voornaam van de persoon die boekt",
"attendee_last_name_info": "De achternaam van de persoon die boekt",
"me": "Ik",
"verify_team_tooltip": "Verifieer uw team om het versturen van berichten naar deelnemers in te schakelen",
"member_removed": "Lid verwijderd",
"my_availability": "Mijn beschikbaarheid",
"team_availability": "Beschikbaarheid team",
"backup_code": "Back-upcode",
"backup_codes": "Back-upcodes",
"backup_code_instructions": "Elke back-upcode kan slechts één keer gebruikt worden om toegang te verlenen zonder uw authenticator.",
"backup_codes_copied": "Back-upcodes gekopieerd!",
"incorrect_backup_code": "De back-upcode is onjuist.",
"lost_access": "Toegang verloren",
"missing_backup_codes": "Geen back-upcodes gevonden. Genereer ze in uw instellingen.",
"admin_org_notification_email_subject": "Nieuwe organisatie gemaakt: in afwachting van actie",
"hi_admin": "Hallo beheerder",
"admin_org_notification_email_title": "Een organisatie vereist DNS-configuratie",
"admin_org_notification_email_body_part1": "Een organisatie met de slug \"{{orgSlug}}\" is gemaakt.<br /><br />Zorg ervoor dat u uw DNS-register configureert om het subdomein dat overeenkomt met de nieuwe organisatie te verwijzen naar waar de hoofd-app draait. Anders werkt de organisatie niet.<br /><br />Hier zijn slechts de basisopties om een subdomein te laten verwijzen naar de app, zodat de organisatieprofielpagina wordt geladen.<br /><br />U kunt dit doen met het A-record:",
"admin_org_notification_email_body_part2": "Of het CNAME-record:",
"admin_org_notification_email_body_part3": "Zodra u het subdomein heeft geconfigureerd, markeert u de DNS-configuratie als voltooid in Beheerdersinstellingen voor organisaties.",
"admin_org_notification_email_cta": "Naar Beheerdersinstellingen voor organisaties",
"org_has_been_processed": "Organisatie is verwerkt",
"org_error_processing": "Er is een fout opgetreden bij het verwerken van deze organisatie",
"orgs_page_description": "Een lijst met alle organisaties. Als u een organisatie accepteert, kunnen alle gebruikers met dat e-maildomein zich aanmelden ZONDER e-mailverificatie.",
"unverified": "Niet-geverifieerd",
"dns_missing": "DNS ontbreekt",
"mark_dns_configured": "Markeer als DNS geconfigureerd",
"value": "Waarde",
"your_organization_updated_sucessfully": "Uw organisatie is bijgewerkt",
"team_no_event_types": "Dit team heeft geen gebeurtenistypes",
"seat_options_doesnt_multiple_durations": "De plaatsoptie ondersteunt geen meerdere duren",
"include_calendar_event": "Agendagebeurtenis opnemen",
"recently_added": "Recent toegevoegd",
"no_members_found": "Geen leden gevonden",
"event_setup_length_error": "Gebeurtenisconfiguratie: de duur moet minimaal 1 minuut zijn.",
"availability_schedules": "Beschikbaarheidsschema's",
"view_only_edit_availability_not_onboarded": "Deze gebruiker heeft de onboarding nog niet voltooid. U kunt diens beschikbaarheid pas instellen nadat ze men de onboarding heeft voltooid.",
"view_only_edit_availability": "U bekijkt de beschikbaarheid van deze gebruiker. U kunt alleen uw eigen beschikbaarheid bewerken.",
"edit_users_availability": "Beschikbaarheid van gebruiker bewerken: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Voeg uw nieuwe strings hierboven toe ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "Potwierdź adres e-mail, aby upewnić się, że wiadomości e-mail i powiadomienia z kalendarza będą do Ciebie docierać.",
"verify_email_email_header": "Zweryfikuj swój adres e-mail",
"verify_email_email_button": "Zweryfikuj adres e-mail",
"copy_somewhere_safe": "Zapisz ten klucz API w bezpiecznym miejscu. Nie będzie można wyświetlić go ponownie.",
"verify_email_email_body": "Zweryfikuj swój adres e-mail, klikając poniższy przycisk.",
"verify_email_by_code_email_body": "Zweryfikuj swój adres e-mail, używając kodu poniżej.",
"verify_email_email_link_text": "Oto link, jeśli nie lubisz klikać przycisków:",
"email_verification_code": "Wprowadź kod weryfikacyjny",
"email_verification_code_placeholder": "Wprowadź kod weryfikacyjny wysłany na Twój adres e-mail",
"incorrect_email_verification_code": "Kod weryfikacyjny jest nieprawidłowy.",
"email_sent": "Wysłano wiadomość e-mail",
"email_not_sent": "Podczas wysyłania wiadomości e-mail wystąpił błąd.",
"event_declined_subject": "Odrzucono: {{title}} w dniu {{date}}",
"event_cancelled_subject": "Anulowano: {{title}}, {{date}}",
"event_request_declined": "Twoja prośba o wydarzenie została odrzucona",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "Wydarzenie cykliczne oczekuje na Twoje zatwierdzenie",
"someone_requested_an_event": "Ktoś poprosił o zaplanowanie wydarzenia w Twoim kalendarzu.",
"someone_requested_password_reset": "Ktoś poprosił o link do zmiany Twojego hasła.",
"password_reset_email_sent": "Jeśli ten adres e-mail istnieje w naszym systemie, otrzymasz wiadomość e-mail do zresetowania hasła.",
"password_reset_instructions": "Jeśli nie poprosiłeś o to, możesz bezpiecznie zignorować ten e-mail, a Twoje hasło nie zostanie zmienione.",
"event_awaiting_approval_subject": "Oczekiwanie na zatwierdzenie: {{title}} w {{date}}",
"event_still_awaiting_approval": "Wydarzenie nadal oczekuje na Twoje zatwierdzenie",
@ -217,6 +224,10 @@
"already_have_an_account": "Masz już konto?",
"create_account": "Utwórz Konto",
"confirm_password": "Potwierdź hasło",
"confirm_auth_change": "Spowoduje to zmianę sposobu logowania.",
"confirm_auth_email_change": "Zmiana adresu e-mail spowoduje odłączenie bieżącej metody uwierzytelnienia używanej do logowania do Cal.com. Poprosimy Cię o zweryfikowanie nowego adresu e-mail. Następnie wylogujemy Cię, a po skonfigurowaniu hasła zgodnie z instrukcjami, które otrzymasz w wiadomości e-mail, poprosimy Cię o zalogowanie się nowym adresem e-mail zamiast bieżącej metody uwierzytelnienia.",
"reset_your_password": "Ustaw nowe hasło zgodnie z instrukcjami wysłanymi na Twój adres e-mail.",
"email_change": "Zaloguj się ponownie za pomocą nowego adresu e-mail i hasła.",
"create_your_account": "Załóż swoje konto",
"sign_up": "Zarejestruj",
"youve_been_logged_out": "Zostałeś wylogowany",
@ -243,6 +254,10 @@
"all": "Wszystkie",
"yours": "Twoje konto",
"available_apps": "Dostępne aplikacje",
"available_apps_lower_case": "Dostępne aplikacje",
"available_apps_desc": "Nie masz zainstalowanych aplikacji. Zobacz popularne aplikacje poniżej i odkryj ich więcej w naszym sklepie <1>App Store</1>.",
"fixed_host_helper": "Dodaj każdego, kto powinien wziąć udział w wydarzeniu. <1>Dowiedz się więcej</1>",
"round_robin_helper": "Osoby należące do grupy pracują na zmianę i w wydarzeniu weźmie udział tylko jedna z nich.",
"check_email_reset_password": "Sprawdź swój e-mail. Wysłaliśmy Ci link do zresetowania hasła.",
"finish": "Ukończ",
"organization_general_description": "Zarządzaj ustawieniami języka i strefy czasowej Twojego zespołu.",
@ -251,6 +266,7 @@
"nearly_there_instructions": "Ostatnia wskazówka — krótka informacja na Twój temat i zdjęcie naprawdę pomogą Ci zwiększyć liczbę rezerwacji i ułatwią rezerwującym upewnienie się, u kogo dokonują rezerwacji.",
"set_availability_instructions": "Określ zakresy czasu, kiedy jesteś generalnie dostępny/a. Możesz utworzyć ich więcej później i przypisać je do różnych kalendarzy.",
"set_availability": "Ustaw swoją dostępność",
"availability_settings": "Ustawienia dostępności",
"continue_without_calendar": "Kontynuuj bez kalendarza",
"connect_your_calendar": "Połącz swój kalendarz",
"connect_your_video_app": "Podłącz aplikacje wideo",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "Grupuj linki do rezerwacji, które mogą być tworzone dynamicznie przez dodanie wielu nazw użytkowników z '+'. przykład: '{{appName}}/bailey+peer'",
"allow_dynamic_booking": "Pozwól uczestnikom rezerwować cię przez dynamiczne rezerwacje grupowe",
"dynamic_booking": "Dynamiczne linki grup",
"allow_seo_indexing": "Zezwól wyszukiwarkom na dostęp do Twoich publicznych treści",
"seo_indexing": "Zezwalaj na indeksowanie SEO",
"email": "E-mail",
"email_placeholder": "jkowalski@przyklad.com",
"full_name": "Imię i nazwisko",
@ -406,6 +424,7 @@
"booking_requested": "Poproszono o rezerwację",
"meeting_ended": "Spotkanie zakończone",
"form_submitted": "Przesłano formularz",
"booking_paid": "Rezerwacja opłacona",
"event_triggers": "Wyzwalacze Zdarzeń",
"subscriber_url": "Adres URL subskrybenta",
"create_new_webhook": "Utwórz nowy webhook",
@ -506,6 +525,7 @@
"your_name": "Twoje imię",
"your_full_name": "Twoje imię i nazwisko",
"no_name": "Bez nazwy",
"enter_number_between_range": "Wprowadź liczbę od 1 do {{maxOccurences}}",
"email_address": "Adres e-mail",
"enter_valid_email": "Wprowadź prawidłowy adres e-mail",
"location": "Lokalizacja",
@ -543,6 +563,7 @@
"leave": "Opuść",
"profile": "Profil",
"my_team_url": "Adres URL mojej drużyny",
"my_teams": "Moje zespoły",
"team_name": "Nazwa zespołu",
"your_team_name": "Nazwa Twojego zespołu",
"team_updated_successfully": "Zespół został pomyślnie zaktualizowany",
@ -570,6 +591,8 @@
"invite_new_member": "Zaproś nowego członka zespołu",
"invite_new_member_description": "Uwaga: będzie to <1>kosztowało dodatkowe miejsce (15 USD/miesiąc)</1>, które doliczymy do Twojej subskrypcji.",
"invite_new_team_member": "Zaproś kogoś do twojego zespołu.",
"upload_csv_file": "Prześlij plik .csv",
"invite_via_email": "Zaproś przez e-mail",
"change_member_role": "Zmień rolę członka zespołu",
"disable_cal_branding": "Wyłącz branding {{appName}}",
"disable_cal_branding_description": "Ukryj wszystkie marki {{appName}} na swoich stronach publicznych.",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "Użytkownik musi zaakceptować zaproszenie, aby wyświetlić dostępność",
"set_as_away": "Ustaw się jako nieobecny",
"set_as_free": "Wyłącz status Nieobecny",
"toggle_away_error": "Błąd podczas aktualizacji niedostępności",
"user_away": "Ten użytkownik jest obecnie nieobecny.",
"user_away_description": "Osoba, którą próbujesz zarezerwować, jest teraz nieobecna i dlatego nie akceptuje nowych rezerwacji.",
"meet_people_with_the_same_tokens": "Poznaj ludzi z tymi samymi tokenami",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "Aby zmienić swój adres e-mail, hasło, włącz uwierzytelnianie dwuetapowe i więcej, odwiedź swoje ustawienia konta {{provider}}.",
"signin_with_google": "Zaloguj się przez Google",
"signin_with_saml": "Zaloguj się za pomocą SAML",
"signin_with_saml_oidc": "Zaloguj się za pomocą SAML/OIDC",
"you_will_need_to_generate": "Będziesz musiał wygenerować token dostępu ze strony integracji.",
"import": "Importuj",
"import_from": "Importuj z",
@ -950,6 +975,8 @@
"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",
"seats_nearly_full": "Prawie wszystkie miejsca zajęte",
"seats_half_full": "Miejsca szybko znikają",
"number_of_seats": "Liczba miejsc na rezerwację",
"enter_number_of_seats": "Wprowadź liczbę miejsc",
"you_can_manage_your_schedules": "Możesz zarządzać swoimi harmonogramami na stronie Dostępności.",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "Jak chcesz dodać aplikację {{appName}} do swojej witryny?",
"choose_ways_put_cal_site": "Wybierz jeden z następujących sposobów, aby umieścić aplikację {{appName}} w swojej witrynie.",
"setting_up_zapier": "Konfiguracja integracji z Zapier",
"setting_up_make": "Konfiguracja integracji z Make",
"generate_api_key": "Wygeneruj klucz interfejsu API",
"generate_api_key_description": "Wygeneruj klucz interfejsu API do użycia z aplikacją {{appName}} na",
"your_unique_api_key": "Twój niepowtarzalny klucz API",
"copy_safe_api_key": "Skopiuj ten klucz API i zapisz go w bezpiecznym miejscu. Jeśli stracisz ten klucz, trzeba będzie wygenerować nowy.",
"zapier_setup_instructions": "<0>Zaloguj się do swojego konta Zapier i utwórz nowy Zap.</0><1>Wybierz Cal.com jako aplikację wyzwalającą. Wybierz również wydarzenie wyzwalające. </1><2>Wybierz konto, a następnie wprowadź niepowtarzalny klucz interfejsu API.</2><3>Przetestuj wyzwalanie.</3><4>Wszystko gotowe!</4>",
"make_setup_instructions": "<0>Przejdź do sekcji <1><0>Link z zaproszeniem Make</0></1> i zainstaluj aplikację Cal.com.</0><1><0>Zaloguj się do swojego konta Make i utwórz nowy Scenariusz (Scenario).</1><2>Wybierz Cal.com jako aplikację wyzwalającą. Wybierz również wydarzenie wyzwalające. </2></2>Wybierz konto, a następnie wprowadź niepowtarzalny klucz interfejsu API.</3><4>Przetestuj wyzwalanie.</4><5>Wszystko gotowe!</5>",
"install_zapier_app": "Najpierw zainstaluj aplikację Zapier pobraną ze sklepu App Store.",
"install_make_app": "Najpierw zainstaluj aplikację Make pobraną ze sklepu App Store.",
"connect_apple_server": "Połącz z serwerem Apple",
"calendar_url": "Adres URL kalendarza",
"apple_server_generate_password": "Wygeneruj hasło aplikacji do użycia z {{appName}} w witrynie",
@ -1085,6 +1115,7 @@
"email_attendee_action": "wyślij wiadomość e-mail do uczestników",
"sms_attendee_action": "Wyślij wiadomość SMS do uczestnika",
"sms_number_action": "wyślij wiadomość SMS na określony numer",
"send_reminder_sms": "Łatwo wysyłaj uczestnikom przypomnienia SMS o spotkaniu",
"whatsapp_number_action": "wyślij wiadomość w aplikacji Whatsapp na określony numer",
"whatsapp_attendee_action": "wyślij wiadomość w aplikacji Whatsapp do uczestnika",
"workflows": "Przepływy pracy",
@ -1244,6 +1275,7 @@
"error_updating_settings": "Błąd podczas aktualizacji ustawień",
"personal_cal_url": "Mój osobisty adres URL aplikacji {{appName}}",
"bio_hint": "Kilka zdań o Tobie. Pojawią się one na Twojej osobistej stronie URL.",
"user_has_no_bio": "Ten użytkownik nie dodał jeszcze biogramu.",
"delete_account_modal_title": "Usuń konto",
"confirm_delete_account_modal": "Czy na pewno chcesz usunąć swoje konto {{appName}}?",
"delete_my_account": "Usuń konto",
@ -1426,6 +1458,7 @@
"add_limit": "Dodaj limit",
"team_name_required": "Wymagana nazwa zespołu",
"show_attendees": "Udostępniaj gościom informacje o uczestnikach",
"show_available_seats_count": "Pokaż liczbę dostępnych miejsc",
"how_booking_questions_as_variables": "Jak używać pytań dotyczących rezerwacji jako zmiennych?",
"format": "Formatowanie",
"uppercase_for_letters": "Użyj wielkich liter w przypadku wszystkich liter",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Czy na pewno chcesz usunąć konfigurację {{connectionType}}? Członkowie zespołu, którzy używają logowania {{connectionType}} nie będą już mogli uzyskać dostępu do Cal.com.",
"organizer_timezone": "Strefa czasowa organizatora",
"email_user_cta": "Wyświetl zaproszenie",
"email_no_user_invite_heading_team": "Zaproszono Cię do dołączenia do zespołu {{appName}}",
"email_no_user_invite_heading_org": "Zaproszono Cię do dołączenia do organizacji {{appName}}",
"email_no_user_invite_subheading": "Użytkownik {{invitedBy}} zaprasza Cię do dołączenia do jego zespołu w aplikacji {{appName}}. Aplikacja {{appName}} to terminarz do planowania wydarzeń, który umożliwi Tobie i Twojemu zespołowi planowanie spotkań bez czasochłonnej wymiany wiadomości e-mail.",
"email_user_invite_subheading_team": "Użytkownik {{invitedBy}} zaprasza Cię do dołączenia do jego zespołu „{{teamName}}” w aplikacji {{appName}}. Aplikacja {{appName}} to terminarz do planowania wydarzeń, który umożliwi Tobie i Twojemu zespołowi planowanie spotkań bez czasochłonnej wymiany wiadomości e-mail.",
"email_user_invite_subheading_org": "{{invitedBy}} zaprasza Cię do dołączenia do organizacji „{{teamName}}” w aplikacji {{appName}}. Aplikacja {{appName}} to terminarz do planowania wydarzeń, który umożliwi Tobie i Twojej organizacji planowanie spotkań bez czasochłonnej wymiany wiadomości e-mail.",
"email_no_user_invite_steps_intro": "Przeprowadzimy Cię przez kilka krótkich kroków i wkrótce w ramach {{entity}} zaczniesz z przyjemnością korzystać z bezstresowego planowania.",
"email_no_user_step_one": "Wybierz nazwę użytkownika",
"email_no_user_step_two": "Połącz swoje konto kalendarza",
@ -1831,6 +1867,8 @@
"insights_no_data_found_for_filter": "Nie znaleziono danych dotyczących wybranego filtru lub wskazanych dat.",
"acknowledge_booking_no_show_fee": "Rozumiem, że jeśli nie wezmę udziału w wydarzeniu, z mojej karty pobrana zostanie opłata za niestawienie się w wysokości {{amount, currency}}.",
"card_details": "Dane karty",
"something_went_wrong_on_our_end": "Coś poszło nie tak po naszej stronie. Skontaktuj się z naszym zespołem pomocy technicznej, a zaraz rozwiążemy ten problem.",
"please_provide_following_text_to_suppport": "W razie kontaktu z pomocą techniczną podaj następujący tekst, abyśmy mogli lepiej Ci pomóc.",
"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}}",
@ -1864,6 +1902,9 @@
"open_dialog_with_element_click": "Otwiera okno dialogowe Cal, gdy użytkownik kliknie odpowiedni element.",
"need_help_embedding": "Potrzebujesz pomocy? Zapoznaj się z naszymi instrukcjami osadzania narzędzi Cal w stronach utworzonych w usługach Wix, Squarespace lub WordPress, sprawdź często zadawane pytania lub poznaj zaawansowane opcje osadzania.",
"book_my_cal": "Zarezerwuj za pośrednictwem Cal",
"first_name": "Imię",
"last_name": "Nazwisko",
"first_last_name": "Imię, nazwisko",
"invite_as": "Zaproś jako",
"form_updated_successfully": "Formularz został zaktualizowany.",
"disable_attendees_confirmation_emails": "Wyłącz domyślne wiadomości e-mail z potwierdzeniem dla uczestników",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "Utwórz swój pierwszy element webhook dla tego typu wydarzenia",
"install_app_on": "Zainstaluj aplikację na koncie",
"create_for": "Utwórz dla",
"currency": "Waluta",
"organization_banner_description": "Utwórz środowisko, w którym zespoły będą mogły tworzyć wspólne aplikacje, przepływy pracy i typy wydarzeń przy użyciu algorytmu karuzelowego lub zbiorowego ustalania harmonogramu.",
"organization_banner_title": "Zarządzaj organizacjami z wieloma zespołami",
"set_up_your_organization": "Skonfiguruj swoją organizację",
@ -1937,6 +1979,14 @@
"insights_team_filter": "Zespół: {{teamName}}",
"insights_user_filter": "Użytkownik: {{userName}}",
"insights_subtitle": "Wyświetl wskaźniki Insights rezerwacji z różnych wydarzeń",
"location_options": "Lokalizacje do wyboru: {{locationCount}}",
"custom_plan": "Plan niestandardowy",
"email_embed": "Osadź w wiadomości e-mail",
"add_times_to_your_email": "Wybierz kilka dostępnych terminów i osadź je w wiadomości e-mail",
"select_time": "Wybierz godzinę",
"select_date": "Wybierz datę",
"see_all_available_times": "Zobacz wszystkie dostępne godziny",
"org_team_names_example": "np. zespół marketingowy",
"org_team_names_example_1": "np. zespół marketingowy",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Dodaj nowe ciągi powyżej ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -225,6 +225,7 @@
"create_account": "Criar Conta",
"confirm_password": "Confirmar senha",
"confirm_auth_change": "Isso alterará a forma como você faz login",
"confirm_auth_email_change": "Ao alterar o endereço de e-mail, seu método de autenticação atual será desconectado para entrar no Cal.com. Será solicitado que você verifique seu novo endereço de e-mail. Em seguida, você sairá e seu novo endereço de e-mail será usado para entrar em vez do seu método de autenticação atual, depois que sua senha for definida segundo as instruções enviadas por e-mail.",
"reset_your_password": "Defina sua nova senha com as instruções enviadas para seu endereço de e-mail.",
"email_change": "Volte a entrar com seu novo endereço de e-mail e senha.",
"create_your_account": "Criar sua conta",
@ -256,6 +257,7 @@
"available_apps_lower_case": "Aplicativos disponíveis",
"available_apps_desc": "Você não tem nenhum aplicativo instalado. Veja apps populares abaixo e explore mais em nossa <1>App Store</1>",
"fixed_host_helper": "Adicione qualquer pessoa que precise participar do evento. <1>Saiba mais</1>",
"round_robin_helper": "As pessoas do grupo se revezam, e apenas uma aparecerá para o evento.",
"check_email_reset_password": "Verifique o seu email. Enviamos um link para redefinir a sua senha.",
"finish": "Finalizar",
"organization_general_description": "Gerencie as configurações para o idioma e o fuso horário da sua equipe",
@ -264,6 +266,7 @@
"nearly_there_instructions": "Por último, uma breve descrição de você mesmo e uma foto ajudam a conseguir agendamentos e a mostrar às pessoas com quem elas estão agendando.",
"set_availability_instructions": "Definir períodos em que você está disponível de forma recorrente. Mais tarde você poderá criar outros períodos e atribuí-los a diferentes calendários.",
"set_availability": "Definir disponibilidade",
"availability_settings": "Configurações de disponibilidade",
"continue_without_calendar": "Continuar sem calendário",
"connect_your_calendar": "Conectar seu calendário",
"connect_your_video_app": "Conecte seus aplicativos de vídeo",
@ -405,6 +408,8 @@
"allow_dynamic_booking_tooltip": "Agrupe links de reserva que podem ser criados dinamicamente ao adicionar vários nomes de usuário com \"+\", por exemplo: \"{{appName}}/bailey+peer\"",
"allow_dynamic_booking": "Permita que os participantes façam reservas com as reservas de grupo dinâmicas",
"dynamic_booking": "Links de grupo dinâmicos",
"allow_seo_indexing": "Permitir que mecanismos de busca acessem seu conteúdo público",
"seo_indexing": "Pemitir indexação em SEO",
"email": "Email",
"email_placeholder": "nome@exemplo.com",
"full_name": "Nome Completo",
@ -558,6 +563,7 @@
"leave": "Sair",
"profile": "Perfil",
"my_team_url": "URL do meu time",
"my_teams": "Meus times",
"team_name": "Nome do time",
"your_team_name": "Nome do seu time",
"team_updated_successfully": "Time atualizado com sucesso",
@ -585,6 +591,8 @@
"invite_new_member": "Convidar um novo membro",
"invite_new_member_description": "Observação: isso <1>custará um lugar extra ($15/m)</1> na sua assinatura.",
"invite_new_team_member": "Convidar alguém para seu time.",
"upload_csv_file": "Carregar arquivo .csv",
"invite_via_email": "Convidar via e-mail",
"change_member_role": "Alterar função de membro da equipe",
"disable_cal_branding": "Remover a marca {{appName}}",
"disable_cal_branding_description": "Ocultar todas as marcas de {{appName}} de suas páginas públicas.",
@ -867,6 +875,7 @@
"account_managed_by_identity_provider_description": "Para alterar o seu endereço de email, senha, ativar a autenticação de dois fatores e outras alterações, por favor utilize as configurações de seu provedor de identidade {{provider}}.",
"signin_with_google": "Entrar com Google",
"signin_with_saml": "Entrar com SAML",
"signin_with_saml_oidc": "Entrar com SAML/OIDC",
"you_will_need_to_generate": "Você precisa gerar um token de acesso na ferramenta de agendamento antiga.",
"import": "Importar",
"import_from": "Importar de",
@ -966,6 +975,8 @@
"offer_seats_description": "Oferecer assentos para reserva. Isto desativa automaticamente reservas de convidados e confirmações.",
"seats_available_one": "Assento disponível",
"seats_available_other": "Assentos disponíveis",
"seats_nearly_full": "Assentos quase preenchidos",
"seats_half_full": "Assentos sendo preenchidos rapidamente",
"number_of_seats": "Número de assentos por reserva",
"enter_number_of_seats": "Insira a quantidade de assentos",
"you_can_manage_your_schedules": "Você pode gerenciar suas agendas na página de Disponibilidade.",
@ -1046,12 +1057,15 @@
"how_you_want_add_cal_site": "Como deseja adicionar o {{appName}} ao seu site?",
"choose_ways_put_cal_site": "Escolha uma das maneiras a seguir para colocar o {{appName}} no seu site.",
"setting_up_zapier": "Configurando a sua integração com o Zapier",
"setting_up_make": "Configurando a sua integração com o Make",
"generate_api_key": "Gerar chave de API",
"generate_api_key_description": "Gerar uma chave de API para usar com o {{appName}} em",
"your_unique_api_key": "Sua chave de API única",
"copy_safe_api_key": "Copie esta chave de API e salve em um local seguro. Se perder a chave, será preciso gerar uma nova.",
"zapier_setup_instructions": "<0>Entre na conta do Zapier e crie um novo Zap.</0><1>Selecione {{appName}} como seu app de gatilho. Escolha também um evento de gatilho.</1><2>Escolha sua conta e insira sua chave de API única.</2><3>Teste seu gatilho.</3><4>Tudo pronto!</4>",
"make_setup_instructions": "<0>Vá para <1><0>Vincular convite do Make</0></1> e instale o aplicativo do Cal.com.</0><1>Entre na conta do Make e crie um novo Cenário.</1><2>Selecione Cal.com como seu aplicativo de gatilho. Escolha também um evento de gatilho.</2><3>Escolha sua conta e insira sua chave de API única.</3><4>Teste seu gatilho.</4><5>Tudo pronto!</5>",
"install_zapier_app": "Instale primeiro o app do Zapier na loja de apps.",
"install_make_app": "Instale primeiro o aplicativo do Make na loja de aplicativos.",
"connect_apple_server": "Conectar com o servidor da Apple",
"calendar_url": "URL do calendário",
"apple_server_generate_password": "Gerar uma senha específica de app para usar com o {{appName}} em",
@ -1101,6 +1115,7 @@
"email_attendee_action": "enviar e-mail aos participantes",
"sms_attendee_action": "Enviar SMS para participante",
"sms_number_action": "enviar SMS para um número específico",
"send_reminder_sms": "Envie lembretes de reuniões facilmente aos participantes por SMS",
"whatsapp_number_action": "enviar mensagem por WhatsApp para um número específico",
"whatsapp_attendee_action": "enviar mensagem por WhatsApp para participante",
"workflows": "Fluxos de trabalho",
@ -1260,6 +1275,7 @@
"error_updating_settings": "Erro ao atualizar configurações",
"personal_cal_url": "Meu URL pessoal da {{appName}}",
"bio_hint": "Escreva algumas frases sobre você. Isso aparecerá no URL da sua página pessoal.",
"user_has_no_bio": "Este usuário ainda não adicionou uma biografia.",
"delete_account_modal_title": "Excluir conta",
"confirm_delete_account_modal": "Tem certeza de que deseja excluir sua conta {{appName}}?",
"delete_my_account": "Excluir minha conta",
@ -1442,6 +1458,7 @@
"add_limit": "Adicione limite",
"team_name_required": "Nome da equipe obrigatório",
"show_attendees": "Compartilhe informações do participante entre convidados",
"show_available_seats_count": "Mostrar a quantidade de assentos disponíveis",
"how_booking_questions_as_variables": "Como usar perguntas de reserva como variáveis?",
"format": "Formato",
"uppercase_for_letters": "Use letras maiúsculas para todas as letras",
@ -1675,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Você tem certeza que deseja remover a configuração de {{connectionType}}? Os membros do seu time que utilizam {{connectionType}} para fazer login não conseguirão acessar o Cal.com.",
"organizer_timezone": "Fuso horário do organizador",
"email_user_cta": "Ver convite",
"email_no_user_invite_heading_team": "Você recebeu um convite para ingressar em um time do {{appName}}",
"email_no_user_invite_heading_org": "Você recebeu um convite para ingressar em uma organização do {{appName}}",
"email_no_user_invite_subheading": "Você recebeu um convite de {{invitedBy}} para ingressar em sua equipe em {{appName}}. {{appName}} é um agendador que concilia eventos e permite que sua equipe agende reuniões sem precisar trocar e-mails.",
"email_user_invite_subheading_team": "Você recebeu um convite de {{invitedBy}} para ingressar na equipe \"{{teamName}}\" em {{appName}}. {{appName}} é um agendador que concilia eventos e permite que sua equipe agende reuniões sem precisar trocar e-mails.",
"email_user_invite_subheading_org": "Você recebeu um convite de {{invitedBy}} para ingressar na organização \"{{teamName}}\" em {{appName}}. {{appName}} é um agendador que concilia eventos e permite que sua organização agende reuniões sem precisar trocar e-mails.",
"email_no_user_invite_steps_intro": "Orientaremos ao longo de alguns passos rápidos para que você comece logo a agendar eventos com {{entity}} sem preocupação.",
"email_no_user_step_one": "Escolha seu nome de usuário",
"email_no_user_step_two": "Conecte com sua conta de calendário",
@ -1847,6 +1867,8 @@
"insights_no_data_found_for_filter": "Nenhum dado encontrado para o filtro ou dados selecionados.",
"acknowledge_booking_no_show_fee": "Estou ciente de que, se eu não comparecer a este evento, será cobrada no meu cartão uma taxa de não comparecimento de {{amount, currency}}.",
"card_details": "Detalhes do cartão",
"something_went_wrong_on_our_end": "Algo deu errado da nossa parte. Entre em contato com a equipe de suporte, solucionaremos o problema imediatamente.",
"please_provide_following_text_to_suppport": "Para obter mais ajuda, insira o texto a seguir ao entrar em contato com o suporte",
"seats_and_no_show_fee_error": "Neste momento, não é possível habilitar assentos e cobrar taxa de não comparecimento",
"complete_your_booking": "Conclua sua reserva",
"complete_your_booking_subject": "Conclua sua reserva: {{title}} à(s) {{date}}",
@ -1957,7 +1979,10 @@
"insights_team_filter": "Equipe: {{teamName}}",
"insights_user_filter": "Usuário: {{userName}}",
"insights_subtitle": "Veja insights de reserva em seus eventos",
"location_options": "{{locationCount}} opções de local",
"custom_plan": "Plano personalizado",
"email_embed": "Incorporação de e-mail",
"add_times_to_your_email": "Selecione alguns horários disponíveis e incorpore-os no seu e-mail",
"select_time": "Selecione o horário",
"select_date": "Selecione a data",
"see_all_available_times": "Veja todos os horários disponíveis",
@ -1967,9 +1992,66 @@
"org_team_names_example_3": "ex: Time de Design",
"org_team_names_example_4": "ex: Time de Engenharia",
"org_team_names_example_5": "ex: Time de Análise de Dados",
"org_max_team_warnings": "Você poderá adicionar mais equipes depois.",
"what_is_this_meeting_about": "De que se trata esta reunião?",
"add_to_team": "Adicionar à equipe",
"remove_users_from_org": "Remover usuários da organização",
"remove_users_from_org_confirm": "Tem certeza de que deseja remover {{userCount}} usuários desta organização?",
"user_has_no_schedules": "Este usuário ainda não definiu nenhuma agenda",
"user_isnt_in_any_teams": "Este usuário não está em nenhuma equipe",
"requires_booker_email_verification": "Requer verificação de e-mail do reservante",
"description_requires_booker_email_verification": "Para assegurar a verificação do e-mail do reservante antes de agendar eventos",
"requires_confirmation_mandatory": "Mensagens de texto só podem ser enviadas a participantes quando este tipo de evento exigir confirmação.",
"kyc_verification_information": "Para assegurar a segurança, é preciso verificar {{teamOrAccount}} antes de enviar mensagens de texto aos participantes. Fale conosco via <a>{{supportEmail}}</a> e envie as seguintes informações:",
"kyc_verification_documents": "<ul><li>{{teamOrUser}}</li><li>para empresas: anexe a documentação de verificação da sua empresa</li><li>Para pessoas físicas: anexe um documento de identidade emitido pelo governo</li></ul>",
"verify_team_or_account": "Verificar {{teamOrAccount}}",
"verify_account": "Verificar Conta",
"kyc_verification": "Verificação \"conheça seu cliente\"",
"organizations": "Organizações",
"org_admin_other_teams": "Outros times",
"org_admin_other_teams_description": "Aqui você pode conferir os times da sua organização dos quais você não faz parte. Se necessário, você pode se adicionar a eles.",
"no_other_teams_found": "Nenhum outro time encontrado",
"no_other_teams_found_description": "Não há outros times nesta organização.",
"attendee_first_name_variable": "Nome do participante",
"attendee_last_name_variable": "Sobrenome do participante",
"attendee_first_name_info": "Nome da pessoa que fez a reserva",
"attendee_last_name_info": "O sobrenome da pessoa que fez a reserva",
"me": "Eu",
"verify_team_tooltip": "Verifique seu time para habilitar o envio de mensagens aos participantes",
"member_removed": "Membro removido",
"my_availability": "Minha disponibilidade",
"team_availability": "Disponibilidade da equipe",
"backup_code": "Código de reserva",
"backup_codes": "Códigos de reserva",
"backup_code_instructions": "Cada código de reserva pode ser usado exatamente uma vez para conceder acesso sem seu autenticador.",
"backup_codes_copied": "Códigos de reserva copiados!",
"incorrect_backup_code": "O código de reserva está incorreto.",
"lost_access": "Acesso perdido",
"missing_backup_codes": "Nenhum código de reserva encontrado. Gere nas suas configurações.",
"admin_org_notification_email_subject": "Nova organização criada: ação pendente",
"hi_admin": "Olá, administrador",
"admin_org_notification_email_title": "A organização exige uma configuração de DNS",
"admin_org_notification_email_body_part1": "Foi criada uma organização com um campo de dados dinâmicos \"{{orgSlug}}\".<br /><br />Configure seu registro de DNS para apontar o subdomínio correspondente da nova organização para onde o aplicativo principal está sendo executado. Se não fizer isso, a organização não funcionará.<br /><br />Confira algumas opções muito básicas de configuração para que o subdomínio aponte para seu aplicativo e a página do perfil da organização seja carregada.<br /><br />É possível fazer isso com um registro de endereço:",
"admin_org_notification_email_body_part2": "Ou o registro CNAME:",
"admin_org_notification_email_body_part3": "Após configurar o subdomínio, marque a configuração do DNS com concluída nas Configurações de administrador das organizações.",
"admin_org_notification_email_cta": "Ir para Configurações de administrador das organizações",
"org_has_been_processed": "A organização foi processada",
"org_error_processing": "Ocorreu um erro ao processar esta organização",
"orgs_page_description": "Uma lista de todas as organizações. Ao aceitar uma organização, todos os usuários com aquele domínio de e-mail poderão entrar SEM a verificação do e-mail.",
"unverified": "Sem verificação",
"dns_missing": "DNS ausente",
"mark_dns_configured": "Marcar como DNS configurado",
"value": "Valor",
"your_organization_updated_sucessfully": "Sua organização foi atualizada com êxito",
"team_no_event_types": "Sua equipe não tem tipos de evento",
"seat_options_doesnt_multiple_durations": "A opção de assento não é compatível com múltiplas durações",
"include_calendar_event": "Incluir evento do calendário",
"recently_added": "Adicionou recentemente",
"no_members_found": "Nenhum membro encontrado",
"event_setup_length_error": "Configuração do evento: deve ter pelo menos 1 minuto de duração.",
"availability_schedules": "Agendamentos de disponibilidade",
"view_only_edit_availability_not_onboarded": "Este usuário não concluiu a integração. Não será possível definir a disponibilidade antes de concluir a integração.",
"view_only_edit_availability": "Você está vendo a disponibilidade deste usuário. Você só pode editar sua disponibilidade.",
"edit_users_availability": "Editar disponibilidade do usuário: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Adicione suas novas strings aqui em cima ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "Confirme o seu endereço de e-mail para garantir a melhor entrega possível de e-mail e de agenda",
"verify_email_email_header": "Confirme o seu endereço de e-mail",
"verify_email_email_button": "Confirmar o seu e-mail",
"copy_somewhere_safe": "Guarde esta chave da API num local seguro. Não poderá consultar a mesma novamente.",
"verify_email_email_body": "Confirme o seu endereço de e-mail clicando no botão abaixo.",
"verify_email_by_code_email_body": "Confirme o seu endereço de e-mail utilizando o código abaixo.",
"verify_email_email_link_text": "Aqui está a ligação caso não goste de clicar em botões:",
"email_verification_code": "Introduza o código de verificação",
"email_verification_code_placeholder": "Introduza o código de verificação enviado para o seu e-mail",
"incorrect_email_verification_code": "O código de verificação está incorreto.",
"email_sent": "E-mail enviado com sucesso",
"email_not_sent": "Ocorreu um erro ao enviar o e-mail",
"event_declined_subject": "Declinado: {{title}} em {{date}}",
"event_cancelled_subject": "Cancelado: {{title}} a {{date}}",
"event_request_declined": "O seu pedido de evento foi declinado",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "Um evento recorrente aguarda a sua aprovação",
"someone_requested_an_event": "Alguém pediu para agendar um evento no seu calendário.",
"someone_requested_password_reset": "Alguém pediu uma ligação para alterar a sua senha.",
"password_reset_email_sent": "Se este e-mail existir no nosso sistema, deverá receber uma mensagem de redefinição.",
"password_reset_instructions": "Se não fez este pedido, pode ignorar este email com segurança e a sua senha não será alterada.",
"event_awaiting_approval_subject": "A aguardar aprovação: {{title}} em {{date}}",
"event_still_awaiting_approval": "Um evento ainda aguarda a sua aprovação",
@ -217,6 +224,10 @@
"already_have_an_account": "Já tem uma conta?",
"create_account": "Criar Conta",
"confirm_password": "Confirmar senha",
"confirm_auth_change": "Isto irá alterar a forma como inicia sessão",
"confirm_auth_email_change": "A alteração do endereço de e-mail irá desassociar o seu método de autenticação atual para iniciar sessão no Cal.com. Vamos solicitar que confirme o seu novo endereço de e-mail. Ao continuar, a sua sessão será terminada e vai utilizar o seu novo endereço de e-mail para iniciar sessão em vez do seu método de autenticação atual, depois de definir a sua palavra-passe, de acordo com as instruções que serão enviadas para o seu e-mail.",
"reset_your_password": "Defina a sua nova palavra-passe seguindo as instruções enviadas para o seu endereço de e-mail.",
"email_change": "Inicie sessão novamente com o seu novo endereço de e-mail e palavra-passe.",
"create_your_account": "Crie a sua conta",
"sign_up": "Registar",
"youve_been_logged_out": "A sessão foi encerrada",
@ -243,6 +254,10 @@
"all": "Todos as aplicações",
"yours": "A sua conta",
"available_apps": "Aplicações disponíveis",
"available_apps_lower_case": "Aplicações disponíveis",
"available_apps_desc": "Não tem aplicações instaladas. Consulte as aplicações mais populares abaixo e explore mais na nossa <1>App Store</1>",
"fixed_host_helper": "Adicione qualquer pessoa que precise de participar no evento. <1>Saiba mais</1>",
"round_robin_helper": "As pessoas no grupo revezam-se e apenas uma pessoa aparecerá no evento.",
"check_email_reset_password": "Verifique o seu email. Enviámos uma ligação para redefinir a sua senha.",
"finish": "Terminar",
"organization_general_description": "Faça a gestão das definições do idioma e fuso horário da sua equipa",
@ -251,6 +266,7 @@
"nearly_there_instructions": "Por último, uma breve descrição sobre si e uma fotografia ajudam a obter reservas e a mostrar às pessoas com quem estão a reservar.",
"set_availability_instructions": "Definir períodos em que está disponível numa base recorrente. Mais tarde poderá criar mais destes, e atribuí-los a diferentes calendários.",
"set_availability": "Definir disponibilidade",
"availability_settings": "Configurações de 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",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "As ligações de reservas dinâmicas de grupos podem ser criadas dinamicamente ao adicionar múltiplos nomes de utilizador com um '+'. Por exemplo: '{{appName}}/duarte+marta'",
"allow_dynamic_booking": "Permitir que os participantes façam reservas consigo através de reservas dinâmicas de grupos",
"dynamic_booking": "Ligações dinâmicas de grupos",
"allow_seo_indexing": "Permitir que os motores de pesquisa acedam ao seu conteúdo público",
"seo_indexing": "Permitir indexação para SEO",
"email": "Email",
"email_placeholder": "nome@exemplo.com",
"full_name": "Nome Completo",
@ -406,6 +424,7 @@
"booking_requested": "Reserva solicitada",
"meeting_ended": "A reunião terminou",
"form_submitted": "Formulário enviado",
"booking_paid": "Reserva paga",
"event_triggers": "Causadores de eventos",
"subscriber_url": "URL do assinante",
"create_new_webhook": "Criar um novo webhook",
@ -506,6 +525,7 @@
"your_name": "O seu nome",
"your_full_name": "O seu nome completo",
"no_name": "Sem nome",
"enter_number_between_range": "Introduza um número entre 1 e {{maxOccurences}}",
"email_address": "Endereço de email",
"enter_valid_email": "Insira um e-mail válido",
"location": "Localização",
@ -543,6 +563,7 @@
"leave": "Sair",
"profile": "Perfil",
"my_team_url": "URL da Minha Equipa",
"my_teams": "As minhas equipas",
"team_name": "Nome da Equipa",
"your_team_name": "Nome da sua equipa",
"team_updated_successfully": "Equipa atualizada com sucesso",
@ -570,6 +591,8 @@
"invite_new_member": "Convidar um Novo Membro",
"invite_new_member_description": "Nota: isto vai ter o <1>custo de um lugar adicional ($15/m)</1> na sua subscrição.",
"invite_new_team_member": "Convide alguém para a sua equipa.",
"upload_csv_file": "Carregar um ficheiro .csv",
"invite_via_email": "Convidar por e-mail",
"change_member_role": "Alterar função de membro da equipa",
"disable_cal_branding": "Desativar a marca {{appName}}",
"disable_cal_branding_description": "Ocultar todas as marcas de {{appName}} das suas páginas públicas.",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "O utilizador tem de aceitar o convite para ver a disponibilidade",
"set_as_away": "Defina o seu estado como ausente",
"set_as_free": "Desactivar estado de ausência",
"toggle_away_error": "Erro ao atualizar o estado de ausência",
"user_away": "Este utilizador está ausente de momento.",
"user_away_description": "A pessoa com quem está a tentar fazer uma reserva está ausente, pelo que não está a aceitar novas reservas.",
"meet_people_with_the_same_tokens": "Conheça pessoas com os mesmos tokens",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "Para alterar o seu email ou a sua senha, para ativar a autenticação de dois fatores ou outras opções, vá às definições da sua conta {{provider}}.",
"signin_with_google": "Iniciar sessão com o Google",
"signin_with_saml": "Iniciar sessão com SAML",
"signin_with_saml_oidc": "Iniciar sessão com SAML/OIDC",
"you_will_need_to_generate": "Precisará de gerar um token de acesso na página das integrações.",
"import": "Importar",
"import_from": "Importar de",
@ -950,6 +975,8 @@
"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",
"seats_nearly_full": "Lugares quase esgotados",
"seats_half_full": "Lugares rapidamente ocupados",
"number_of_seats": "Número de lugares por reserva",
"enter_number_of_seats": "Digite um número de lugares",
"you_can_manage_your_schedules": "Pode gerir os seus horários na página de Disponibilidade.",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "Como deseja adicionar o {{appName}} ao seu site?",
"choose_ways_put_cal_site": "Escolha uma das seguintes formas de colocar o {{appName}} no seu site.",
"setting_up_zapier": "A configurar a sua integração com Zapier",
"setting_up_make": "A configurar a sua integração com Make",
"generate_api_key": "Gerar chave de API",
"generate_api_key_description": "Gerar uma chave da API para utilizar com {{appName}} em",
"your_unique_api_key": "A sua chave de API única",
"copy_safe_api_key": "Copie esta chave da API e guarde-a num lugar seguro. Se perder esta chave, terá de gerar uma nova.",
"zapier_setup_instructions": "<0>Inicie sessão na sua conta Zapier e crie um novo Zap.</0><1>Seleccione {{appName}} como aplicação acionadora. Selecione também um evento acionador.</1><2>Seleccione a sua conta e insira a sua chave de API única.</2><3>Teste o seu accionador.</3><4>Está configurado!</4>",
"make_setup_instructions": "<0>Aceda a <1><0>Criar ligação de convite</0></1> e instale a aplicação Cal.com.</0><1>Inicie sessão na sua conta Make e crie um novo Cenário.</1><2>Selecione Cal.com como a sua aplicação de Trigger. Escolha também um evento de Trigger.</2><3>Escolha a sua conta e depois introduza a sua Chave da API Única.</3><4>Teste o seu Trigger.</4><5>Está pronto!</5>",
"install_zapier_app": "Por favor, primeiro instale a aplicação Zapier da App Store.",
"install_make_app": "Instale primeiro a aplicação Make na app store.",
"connect_apple_server": "Ligar a Apple Server",
"calendar_url": "URL do calendário",
"apple_server_generate_password": "Crie uma palavra-passe de aplicação específica para utilizar com {{appName}} em",
@ -1085,6 +1115,7 @@
"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",
"send_reminder_sms": "Envie com facilidade lembretes de reunião via SMS aos seus participantes",
"whatsapp_number_action": "enviar Whatsapp para um número específico",
"whatsapp_attendee_action": "enviar Whatsapp ao participante",
"workflows": "Fluxos de trabalho",
@ -1244,6 +1275,7 @@
"error_updating_settings": "Erro ao atualizar as definições",
"personal_cal_url": "O meu endereço pessoal do {{appName}}",
"bio_hint": "Algumas frases sobre si. Isto irá ser mostrado no endereço da sua página pessoal.",
"user_has_no_bio": "Este utilizador ainda não adicionou uma biografia.",
"delete_account_modal_title": "Eliminar conta",
"confirm_delete_account_modal": "Tem a certeza que pretende eliminar a sua conta {{appName}}?",
"delete_my_account": "Eliminar a minha conta",
@ -1426,6 +1458,7 @@
"add_limit": "Adicionar limite",
"team_name_required": "É necessário um nome para a equipa",
"show_attendees": "Partilhar informações dos participantes entre os convidados",
"show_available_seats_count": "Mostrar o número de lugares disponíveis",
"how_booking_questions_as_variables": "Como utilizar perguntas de agendamento como variáveis?",
"format": "Formato",
"uppercase_for_letters": "Utilize letras maiúsculas para todas as letras",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Tem a certeza que pretende eliminar a configuração {{connectionType}}? Os membros da sua equipa que utilizem {{connectionType}} para o início de sessão deixarão de poder aceder a Cal.com.",
"organizer_timezone": "Fuso horário do organizador",
"email_user_cta": "Ver convite",
"email_no_user_invite_heading_team": "Recebeu um convite para fazer parte de uma equipa {{appName}}",
"email_no_user_invite_heading_org": "Recebeu um convite para fazer parte de uma organização {{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_team": "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_user_invite_subheading_org": "Recebeu um convite de {{invitedBy}} para fazer parte de {{teamName}} da sua organização em {{appName}}. {{appName}} é a solução de agendamento de eventos que lhe permite a si e à sua organização agendar reuniões sem o pingue-pongue de e-mails.",
"email_no_user_invite_steps_intro": "Vamos ajudar com alguns pequenos passos para que você e a sua {{entity}} 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",
@ -1831,6 +1867,8 @@
"insights_no_data_found_for_filter": "Não foram encontrados dados para as datas ou filtros selecionados.",
"acknowledge_booking_no_show_fee": "Eu aceito que caso eu não compareça a este evento, será cobrada uma taxa de não-comparência de {{amount, currency}} no meu cartão.",
"card_details": "Detalhes do cartão",
"something_went_wrong_on_our_end": "Algo correu mal do nosso lado. Entre em contacto com a nossa equipa de apoio e resolveremos o problema imediatamente para si.",
"please_provide_following_text_to_suppport": "Forneça o seguinte texto ao contactar o apoio para conseguirmos prestar um melhor apoio",
"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}}",
@ -1864,6 +1902,9 @@
"open_dialog_with_element_click": "Abrir 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",
"first_name": "Primeiro nome",
"last_name": "Último nome",
"first_last_name": "Primeiro nome, Último nome",
"invite_as": "Convidar como",
"form_updated_successfully": "Formulário atualizado com sucesso.",
"disable_attendees_confirmation_emails": "Desativar mensagens eletrónicas de confirmação predefinidas para participantes",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "Crie o seu primeiro webhook para este tipo de evento",
"install_app_on": "Instalar aplicação em",
"create_for": "Criar para",
"currency": "Moeda",
"organization_banner_description": "Crie um ambiente onde as suas equipas possam criar aplicações partilhadas, fluxos de trabalho e tipos de eventos com distribuição equilibrada e agendamento coletivo.",
"organization_banner_title": "Faça a gestão de múltiplas organizações com múltiplas equipas",
"set_up_your_organization": "Configurar a sua organização",
@ -1937,6 +1979,79 @@
"insights_team_filter": "Equipa: {{teamName}}",
"insights_user_filter": "Utilizador: {{userName}}",
"insights_subtitle": "Ver informações sobre reservas nos seus eventos",
"location_options": "{{locationCount}} opções de localização",
"custom_plan": "Plano personalizado",
"email_embed": "Incorporação de e-mail",
"add_times_to_your_email": "Selecione alguns horários disponíveis e incorpore-os no seu E-mail",
"select_time": "Selecionar horário",
"select_date": "Selecionar data",
"see_all_available_times": "Ver todos os horários disponíveis",
"org_team_names_example": "Por exemplo, Equipa de Marketing",
"org_team_names_example_1": "Por exemplo, Equipa de Marketing",
"org_team_names_example_2": "Por exemplo, Equipa de Vendas",
"org_team_names_example_3": "Por exemplo, Equipa de Design",
"org_team_names_example_4": "Por exemplo, Equipa de Engenharia",
"org_team_names_example_5": "Por exemplo, Equipa de Análise de Dados",
"org_max_team_warnings": "Poderá adicionar mais equipas mais tarde.",
"what_is_this_meeting_about": "Sobre o que é esta reunião?",
"add_to_team": "Adicionar à equipa",
"remove_users_from_org": "Remover utilizadores da organização",
"remove_users_from_org_confirm": "Tem a certeza de que deseja remover {{userCount}} utilizadores desta organização?",
"user_has_no_schedules": "Este utilizador ainda não definiu nenhum horário",
"user_isnt_in_any_teams": "Este utilizador não está em nenhuma equipa",
"requires_booker_email_verification": "Requer a confirmação do e-mail do responsável pela reserva",
"description_requires_booker_email_verification": "Para garantir a confirmação do e-mail do responsável pela reserva antes de agendar eventos",
"requires_confirmation_mandatory": "As mensagens de texto só podem ser enviadas aos participantes quando o tipo de evento requerer confirmação.",
"kyc_verification_information": "Para garantir a segurança, tem de verificar {{teamOrAccount}} antes de enviar mensagens de texto aos participantes. Contacte-nos em <a>{{supportEmail}}</a> e forneça as seguintes informações:",
"kyc_verification_documents": "<ul><li>{{teamOrUser}}</li><li>Para empresas: anexe a sua documentação de verificação empresarial</li><li>Para indivíduos: anexe um documento de identificação emitido pelo governo</li></ul>",
"verify_team_or_account": "Verificar {{teamOrAccount}}",
"verify_account": "Verificar conta",
"kyc_verification": "Verificação KYC",
"organizations": "Organizações",
"org_admin_other_teams": "Outras equipas",
"org_admin_other_teams_description": "Aqui pode ver equipas dentro da sua organização e das quais não faz parte. Pode adicionar-se às mesmas, se necessário.",
"no_other_teams_found": "Não foram encontradas outras equipas",
"no_other_teams_found_description": "Não há outras equipas nesta organização.",
"attendee_first_name_variable": "Primeiro nome do participante",
"attendee_last_name_variable": "Último nome do participante",
"attendee_first_name_info": "Primeiro nome da pessoa da reserva",
"attendee_last_name_info": "Último nome da pessoa da reserva",
"me": "Eu",
"verify_team_tooltip": "Verifique a sua equipa para poder enviar mensagens aos participantes",
"member_removed": "Membro removido",
"my_availability": "A minha disponibilidade",
"team_availability": "Disponibilidade da equipa",
"backup_code": "Código alternativo",
"backup_codes": "Códigos alternativos",
"backup_code_instructions": "Cada código alternativo pode ser utilizado exatamente uma vez para conceder acesso sem o seu autenticador.",
"backup_codes_copied": "Códigos alternativos copiados!",
"incorrect_backup_code": "O código alternativo está incorreto.",
"lost_access": "Acesso perdido",
"missing_backup_codes": "Não foram encontrados códigos alternativos. Faça a gestão dos mesmos nas suas definições.",
"admin_org_notification_email_subject": "Nova organização criada: ação pendente",
"hi_admin": "Olá Administrador(a)",
"admin_org_notification_email_title": "Uma organização requer a configuração do DNS",
"admin_org_notification_email_body_part1": "Foi criada uma organização com o slug \"{{orgSlug}}\".<br /><br />Certifique-se que configura o seu registo de DNS, para apontar o subdomínio correspondente à nova organização para onde a aplicação principal está a funcionar. Caso contrário, a organização não vai funcionar.<br /><br />Aqui estão apenas as opções muito básicas para configurar um subdomínio, para que o mesmo aponte para a sua aplicação e para que esta carregue a página de perfil da organização.<br /><br />Pode fazer isto com o A Record:",
"admin_org_notification_email_body_part2": "Ou o registo CNAME:",
"admin_org_notification_email_body_part3": "Depois de configurar o subdomínio, marque a configuração DNS como concluída nas Definições de Administração de Organizações.",
"admin_org_notification_email_cta": "Ir para as Definições de Administração de Organizações",
"org_has_been_processed": "A organização foi processada",
"org_error_processing": "Ocorreu um erro ao processar esta organização",
"orgs_page_description": "Uma lista de todas as organizações. Aceitar uma organização permitirá que todos os utilizadores com esse domínio de e-mail se registem SEM a verificação de e-mail.",
"unverified": "Não verificada",
"dns_missing": "DNS em falta",
"mark_dns_configured": "Marcar como o DNS configurado",
"value": "Valor",
"your_organization_updated_sucessfully": "A sua organização foi atualizada com sucesso",
"team_no_event_types": "Esta equipa não tem tipos de evento",
"seat_options_doesnt_multiple_durations": "A opção lugar não suporta múltiplas durações",
"include_calendar_event": "Incluir evento no calendário",
"recently_added": "Adicionados recentemente",
"no_members_found": "Nenhum membro encontrado",
"event_setup_length_error": "Configuração do Evento: a duração deve ser de, pelo menos, 1 minuto.",
"availability_schedules": "Horários de Disponibilidade",
"view_only_edit_availability_not_onboarded": "Este utilizador ainda não completou o processo de integração. Não poderá definir a respetiva disponibilidade até que este procedimento esteja concluído para este utilizador.",
"view_only_edit_availability": "Está a visualizar a disponibilidade deste utilizador. Só pode editar a sua própria disponibilidade.",
"edit_users_availability": "Editar a disponibilidade do utilizador: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "Verificați-vă adresa de e-mail pentru a garanta cea mai bună furnizare a e-mailurilor și datelor de calendar",
"verify_email_email_header": "Verificați-vă adresa de e-mail",
"verify_email_email_button": "Verificare e-mail",
"copy_somewhere_safe": "Salvați această cheie API într-un loc sigur. Nu o veți mai putea vedea din nou.",
"verify_email_email_body": "Verificați-vă adresa de e-mail făcând clic pe butonul de mai jos.",
"verify_email_by_code_email_body": "Verificați-vă adresa de e-mail utilizând codul de mai jos.",
"verify_email_email_link_text": "Iată linkul, în caz că nu vă place să apăsați butoane:",
"email_verification_code": "Introduceți codul de verificare",
"email_verification_code_placeholder": "Introduceți codul de verificare trimis la adresa dvs. de e-mail",
"incorrect_email_verification_code": "Codul de verificare este incorect.",
"email_sent": "E-mail trimis cu succes",
"email_not_sent": "A survenit o eroare la trimiterea e-mailului",
"event_declined_subject": "Refuzat: {{title}} în {{date}}",
"event_cancelled_subject": "Anulat: {{title}} pe {{date}}",
"event_request_declined": "Solicitarea pentru eveniment a fost refuzată",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "Un eveniment recurent așteaptă aprobarea dvs.",
"someone_requested_an_event": "Cineva a solicitat să programeze un eveniment în calendar.",
"someone_requested_password_reset": "Cineva a solicitat un link pentru a vă schimba parola.",
"password_reset_email_sent": "Dacă această adresă există în sistemul nostru, ar trebui să primiți un e-mail de resetare.",
"password_reset_instructions": "Dacă nu ați solicitat acest lucru, puteți ignora acest e-mail, iar parola nu va fi schimbată.",
"event_awaiting_approval_subject": "Se așteaptă aprobarea: {{title}} în {{date}}",
"event_still_awaiting_approval": "Un eveniment încă așteaptă aprobarea dvs.",
@ -217,6 +224,10 @@
"already_have_an_account": "Aveți deja un cont?",
"create_account": "Creează un cont",
"confirm_password": "Confirmă parola",
"confirm_auth_change": "Acest lucru va schimba modul în care vă conectați",
"confirm_auth_email_change": "Schimbarea adresei de e-mail va deconecta metoda actuală de conectare la Cal.com. Vă vom solicita să vă verificați noua adresă de e-mail. În continuare, veți fi deconectat și veți folosi noua dvs. adresă de e-mail pentru a vă conecta în locul metodei actuale de autentificare după setarea parolei, urmând instrucțiunile care vor fi trimise pe adresa dvs. de e-mail.",
"reset_your_password": "Setați noua parolă cu instrucțiunile trimise la adresa dvs. de e-mail.",
"email_change": "Conectați-vă din nou cu noua adresă de e-mail și parolă.",
"create_your_account": "Creează-ți contul",
"sign_up": "Înregistrează-te",
"youve_been_logged_out": "Ai fost delogat",
@ -243,6 +254,10 @@
"all": "Toate aplicațiile",
"yours": "Contul dvs.",
"available_apps": "Aplicații disponibile",
"available_apps_lower_case": "Aplicații disponibile",
"available_apps_desc": "Nu aveți nicio aplicație instalată. Vizualizați aplicațiile populare de mai jos și explorați mai multe în <1>App Store</1>",
"fixed_host_helper": "Adăugați pe oricine trebuie să participe la eveniment. <1>Aflați mai multe</1>",
"round_robin_helper": "Persoanele din grup participă pe rând și doar o singură persoană va fi prezentă pentru eveniment.",
"check_email_reset_password": "Verificați adresa de e-mail. V-am trimis un link pentru resetarea parolei.",
"finish": "Finalizeaza",
"organization_general_description": "Gestionați setările echipei pentru limbă și fus orar",
@ -251,6 +266,7 @@
"nearly_there_instructions": "Nu în ultimul rând, o scurtă descriere despre dvs. și o fotografie vă ajută să obțineți rezervări și să le arătați celorlalți cu cine fac rezervarea.",
"set_availability_instructions": "Definiți intervalele de timp atunci când sunteți disponibil în mod recurent. Puteți crea mai multe dintre acestea mai târziu și atribuiți-le calendarelor diferite.",
"set_availability": "Setează-ți disponibilitatea",
"availability_settings": "Setări de disponibilitate",
"continue_without_calendar": "Continuă fără calendar",
"connect_your_calendar": "Conectează-ți calendarul",
"connect_your_video_app": "Conectați-vă aplicațiile video",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "Linkuri de rezervare în grup care pot fi create dinamic prin adăugarea mai multor nume de utilizator cu „+”. Exemplu: „{{appName}}/bailey+peer”",
"allow_dynamic_booking": "Permiteți participanților să vă efectueze rezervări dinamice în grup",
"dynamic_booking": "Linkuri de grup dinamice",
"allow_seo_indexing": "Permiteți motoarelor de căutare să acceseze conținutul dvs. public",
"seo_indexing": "Permiteți indexarea SEO",
"email": "E-mail",
"email_placeholder": "jdoe@exemplu.com",
"full_name": "Numele complet",
@ -406,6 +424,7 @@
"booking_requested": "Rezervare solicitată",
"meeting_ended": "Ședință încheiată",
"form_submitted": "Formular trimis",
"booking_paid": "Rezervare plătită",
"event_triggers": "Declanșatoare eveniment",
"subscriber_url": "URL abonat",
"create_new_webhook": "Creează un nou webhook",
@ -506,6 +525,7 @@
"your_name": "Numele tău",
"your_full_name": "Numele dvs. complet",
"no_name": "Niciun nume",
"enter_number_between_range": "Introduceți un număr între 1 și {{maxOccurences}}",
"email_address": "Adresa de e-mail",
"enter_valid_email": "Introduceți un e-mail valid",
"location": "Locaţie",
@ -543,6 +563,7 @@
"leave": "Părăsește",
"profile": "Profil",
"my_team_url": "URL-ul echipei mele",
"my_teams": "Echipele mele",
"team_name": "Denumirea echipei",
"your_team_name": "Numele echipei tale",
"team_updated_successfully": "Echipă actualizată cu succes",
@ -570,6 +591,8 @@
"invite_new_member": "Invitați un nou membru în echipă",
"invite_new_member_description": "Notă: acest lucru va <1>adăuga un loc suplimentar (15 USD/lună)</1> la abonamentul dvs.",
"invite_new_team_member": "Invită pe cineva în echipa ta.",
"upload_csv_file": "Încărcați un fișier .csv",
"invite_via_email": "Invitați prin e-mail",
"change_member_role": "Schimbați rolul de membru al echipei",
"disable_cal_branding": "Dezactivare branding {{appName}}",
"disable_cal_branding_description": "Ascunde tot branding-ul {{appName}} din paginile tale publice.",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "Utilizatorul trebuie să accepte invitația pentru a vizualiza disponibilitatea",
"set_as_away": "Setați starea la Plecat",
"set_as_free": "Dezactivați starea Plecat",
"toggle_away_error": "Eroare la actualizarea stării Plecat",
"user_away": "Acest utilizator nu este momentan disponibil.",
"user_away_description": "Persoana pentru care încercați să efectuați rezervare și-a setat starea la Plecat, prin urmare, nu acceptă rezervări noi.",
"meet_people_with_the_same_tokens": "Cunoașteți persoane cu aceleași tokenuri",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "Pentru a vă schimba adresa de e-mail sau parola, a activa autentificarea în doi pași și multe altele, accesați setările contului {{provider}}.",
"signin_with_google": "Conectați-vă cu Google",
"signin_with_saml": "Conectați-vă cu SAML",
"signin_with_saml_oidc": "Conectați-vă cu SAML/OIDC",
"you_will_need_to_generate": "Va trebui să generați un token de acces din vechiul instrument de programare.",
"import": "Importare",
"import_from": "Importați din",
@ -950,6 +975,8 @@
"offer_seats_description": "Opțiunea oferă locuri pentru rezervare și dezactivează automat rezervările pentru oaspeți și cele la alegere.",
"seats_available_one": "Loc disponibil",
"seats_available_other": "Locuri disponibile",
"seats_nearly_full": "Locuri aproape ocupate",
"seats_half_full": "Locurile se ocupă repede",
"number_of_seats": "Numărul de locuri per rezervare",
"enter_number_of_seats": "Introduceți numărul de locuri",
"you_can_manage_your_schedules": "Vă puteți gestiona programările pe pagina Disponibilitate.",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "Cum doriți să adăugați {{appName}} pe site-ul dvs.?",
"choose_ways_put_cal_site": "Alegeți una dintre următoarele modalități de a include {{appName}} pe site-ul dvs.",
"setting_up_zapier": "Configurarea integrării dvs. Zapier",
"setting_up_make": "Configurarea integrării dvs. Make",
"generate_api_key": "Generare cheie API",
"generate_api_key_description": "Generați o cheie API pentru utilizare cu {{appName}} pe",
"your_unique_api_key": "Cheia dvs. API unică",
"copy_safe_api_key": "Copiați această cheie API și salvați-o într-un loc sigur. Dacă pierdeți această cheie, va trebui să generați una nouă.",
"zapier_setup_instructions": "<0>Conectează-te la contul Zapier și creează un Zap nou.</0><1>Selectează Cal.com ca aplicație Trigger. Alege și un eveniment Trigger.</1><2>Alege contul, apoi introdu cheia API unică.</2><3>Testează Trigger-ul.</3><4>Ai terminat!</4>",
"make_setup_instructions": "<0>Mergeți la <1><0>linkul de invitație Make</0></1> și instalați aplicația Cal.com.</0><1>Conectați-vă la contul dvs. Make și creați un scenariu nou.</1><2>Selectați Cal.com ca aplicație declanșatoare. De asemenea, alegeți un eveniment de declanșare.</2><3>Selectați contul dvs. și introduceți cheia dvs. API unică.</3><4>Testați declanșatorul.</4><5>Sunteți gata!</5>",
"install_zapier_app": "Instalați mai întâi aplicația Zapier din App Store.",
"install_make_app": "Instalați mai întâi aplicația Make din App Store.",
"connect_apple_server": "Conectați-vă la serverul Apple",
"calendar_url": "URL calendar",
"apple_server_generate_password": "Generați o parolă specifică aplicației, pe care o veți utiliza cu {{appName}} la",
@ -1085,6 +1115,7 @@
"email_attendee_action": "trimiteți e-mail participanților",
"sms_attendee_action": "Trimiteți SMS către participant",
"sms_number_action": "trimiteți SMS la un anumit număr",
"send_reminder_sms": "Trimiteți-le cu ușurință participanților mementouri pentru ședințe prin SMS",
"whatsapp_number_action": "trimiteți mesaj WhatsApp la un anumit număr",
"whatsapp_attendee_action": "trimiteți mesaj WhatsApp căte participant",
"workflows": "Fluxuri de lucru",
@ -1244,6 +1275,7 @@
"error_updating_settings": "Eroare la actualizarea setărilor",
"personal_cal_url": "URL-ul meu personal {{appName}}",
"bio_hint": "Câteva propoziții despre dvs. Acestea vor apărea pe pagina URL-ului dvs. personal.",
"user_has_no_bio": "Acest utilizator nu a adăugat încă o biografie.",
"delete_account_modal_title": "Ștergeți contul",
"confirm_delete_account_modal": "Sigur doriți să vă ștergeți contul {{appName}}?",
"delete_my_account": "Ștergeți contul meu",
@ -1426,6 +1458,7 @@
"add_limit": "Adăugați o limită",
"team_name_required": "Este necesar numele echipei",
"show_attendees": "Distribuiți informațiile despre participanți între invitați",
"show_available_seats_count": "Afișați numărul de locuri disponibile",
"how_booking_questions_as_variables": "Cum puteți utiliza ca variabile întrebările despre rezervare?",
"format": "Format",
"uppercase_for_letters": "Utilizați majuscule pentru toate literele",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Sigur doriți să ștergeți configurația {{connectionType}}? Membrii echipei dvs. care utilizează conectarea prin {{connectionType}} nu vor mai putea accesa Cal.com.",
"organizer_timezone": "Fusul orar al organizatorului",
"email_user_cta": "Vizualizare invitație",
"email_no_user_invite_heading_team": "Ați fost invitat să faceți parte dintr-o echipă {{appName}}",
"email_no_user_invite_heading_org": "Ați fost invitat să faceți parte dintr-o organizație {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} v-a invitat să faceți parte din echipa sa de pe {{appName}}. {{appName}} este un instrument de planificare a evenimentelor, care vă permite dvs. și echipei dvs. să programați ședințe fără a face ping-pong prin e-mail.",
"email_user_invite_subheading_team": "{{invitedBy}} v-a invitat să faceți parte din echipa sa „{{teamName}}” de pe {{appName}}. {{appName}} este un instrument de planificare a evenimentelor, care vă permite dvs. și echipei dvs. să programați ședințe fără a face ping-pong prin e-mail.",
"email_user_invite_subheading_org": "{{invitedBy}} v-a invitat să faceți parte din organizația sa „{{teamName}}” de pe {{appName}}. {{appName}} este un instrument de planificare a evenimentelor, prin care dvs. și organizația dvs. puteți să programați ședințe fără a face ping-pong prin e-mail.",
"email_no_user_invite_steps_intro": "Vom parcurge împreună câțiva pași simpli și vă veți bucura alături de {{entity}} dvs. de programări fără probleme, în cel mai scurt timp.",
"email_no_user_step_one": "Alegeți-vă numele de utilizator",
"email_no_user_step_two": "Conectați-vă contul de calendar",
@ -1831,6 +1867,8 @@
"insights_no_data_found_for_filter": "Nu s-au găsit date pentru filtrul selectat sau pentru datele selectate.",
"acknowledge_booking_no_show_fee": "Dacă nu particip la acest eveniment, accept să mi se perceapă de pe card o taxă de neprezentare în valoare de {{amount, currency}}.",
"card_details": "Detalii card",
"something_went_wrong_on_our_end": "A survenit o eroare de partea noastră. Contactați echipa de asistență și vom soluționa imediat problema.",
"please_provide_following_text_to_suppport": "Furnizați următorul text atunci când contactați echipa de asistență pentru a vă putea ajuta mai bine",
"seats_and_no_show_fee_error": "Momentan, nu se pot elibera locuri și nici nu se poate percepe o taxă de neprezentare",
"complete_your_booking": "Finalizați rezervarea",
"complete_your_booking_subject": "Finalizați rezervarea: {{title}}, pe {{date}}",
@ -1864,6 +1902,9 @@
"open_dialog_with_element_click": "Deschide o fereastră de dialog Cal atunci când cineva face clic pe un element.",
"need_help_embedding": "Aveți nevoie de ajutor? Consultați ghidurile noastre pentru încorporarea Cal pe Wix, Squarespace sau WordPress, citiți răspunsurile la întrebările noastre frecvente sau descoperiți opțiunile de încorporare avansate.",
"book_my_cal": "Rezervare în Cal",
"first_name": "Prenume",
"last_name": "Nume de familie",
"first_last_name": "Prenume, nume de familie",
"invite_as": "Invitare ca",
"form_updated_successfully": "Formular actualizat cu succes.",
"disable_attendees_confirmation_emails": "Dezactivare e-mailuri de confirmare implicite pentru participanți",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "Creați primul dvs. webhook pentru acest tip de eveniment",
"install_app_on": "Instalați aplicația în",
"create_for": "Creare pentru",
"currency": "Monedă",
"organization_banner_description": "Dezvoltați medii în care echipele dvs. să poată crea aplicații, fluxuri de lucru și tipuri de evenimente comune, folosind programarea colectivă sau cu alocare prin rotație.",
"organization_banner_title": "Gestionați organizații cu mai multe echipe",
"set_up_your_organization": "Configurați organizația",
@ -1937,6 +1979,79 @@
"insights_team_filter": "Echipă: {{teamName}}",
"insights_user_filter": "Utilizator: {{userName}}",
"insights_subtitle": "Vizualizați date Insights cu privire la rezervări pentru toate evenimentele dvs.",
"location_options": "{{locationCount}} (de) opțiuni privind locul",
"custom_plan": "Plan personalizat",
"email_embed": "Încorporare în e-mail",
"add_times_to_your_email": "Selectați câteva date disponibile și încorporați-le în e-mailul dvs.",
"select_time": "Selectați ora",
"select_date": "Selectați data",
"see_all_available_times": "Vedeți toate orele disponibile",
"org_team_names_example": "de ex. echipa de marketing",
"org_team_names_example_1": "de ex. echipa de marketing",
"org_team_names_example_2": "de ex. echipa de vânzări",
"org_team_names_example_3": "de ex. echipa de design",
"org_team_names_example_4": "de ex. echipa de inginerie",
"org_team_names_example_5": "de ex. echipa de analiză a datelor",
"org_max_team_warnings": "Veți putea adăuga mai multe echipe ulterior.",
"what_is_this_meeting_about": "Despre ce este vorba în această ședință?",
"add_to_team": "Adăugați la echipă",
"remove_users_from_org": "Eliminați utilizatori din organizație",
"remove_users_from_org_confirm": "Sigur doriți să eliminați {{userCount}} utilizatori din această organizație?",
"user_has_no_schedules": "Acest utilizator nu a configurat încă niciun program",
"user_isnt_in_any_teams": "Acest utilizator nu este în nicio echipă",
"requires_booker_email_verification": "Necesită verificarea e-mailului persoanei care efectuează rezervarea",
"description_requires_booker_email_verification": "Pentru a asigura verificarea de e-mailului persoanei care efectuează rezervarea înainte de programarea evenimentelor",
"requires_confirmation_mandatory": "Mesajele text pot fi trimise participanților doar atunci când tipul de eveniment necesită confirmare.",
"kyc_verification_information": "Din motive de securitate, trebuie să verificați {{teamOrAccount}} înainte de a trimite mesaje text participanților. Contactați-ne la <a>{{supportEmail}}</a> și furnizați următoarele informații:",
"kyc_verification_documents": "<ul><li>{{teamOrUser}} dvs.</li><li>Pentru companii: atașați documentele de verificare a companiei</li><li>Pentru persoane fizice: atașați un act de identitate emis de autorități</li></ul>",
"verify_team_or_account": "Verificați {{teamOrAccount}}",
"verify_account": "Verificați contul",
"kyc_verification": "Verificare KYC",
"organizations": "Organizații",
"org_admin_other_teams": "Alte echipe",
"org_admin_other_teams_description": "Aici puteți vedea echipe din cadrul organizației dvs. din care nu faceți parte. Vă puteți adăuga la acestea dacă este cazul.",
"no_other_teams_found": "Nu au fost găsite alte echipe",
"no_other_teams_found_description": "Nu există alte echipe în această organizație.",
"attendee_first_name_variable": "Prenumele participantului",
"attendee_last_name_variable": "Numele de familie al participantului",
"attendee_first_name_info": "Prenumele persoanei care efectuează rezervarea",
"attendee_last_name_info": "Numele de familie al persoanei care efectuează rezervarea",
"me": "Eu",
"verify_team_tooltip": "Verificați-vă echipa pentru a permite trimiterea de mesaje către participanți",
"member_removed": "Membru eliminat",
"my_availability": "Disponibilitatea mea",
"team_availability": "Disponibilitatea echipei",
"backup_code": "Cod de rezervă",
"backup_codes": "Coduri de rezervă",
"backup_code_instructions": "Fiecare cod de rezervă poate fi folosit exact o singură dată pentru a permite accesul fără autentificator.",
"backup_codes_copied": "Coduri de rezervă copiate!",
"incorrect_backup_code": "Codul de rezervă este incorect.",
"lost_access": "Acces pierdut",
"missing_backup_codes": "Nu s-a găsit niciun cod de rezervă. Generați-le din setări.",
"admin_org_notification_email_subject": "Organizație nouă creată: acțiune în așteptare",
"hi_admin": "Bună ziua, administrator",
"admin_org_notification_email_title": "O organizație necesită configurarea DNS",
"admin_org_notification_email_body_part1": "A fost creată o organizație cu slugul „{{orgSlug}}”.<br /><br />Aveți grijă să vă configurați registrul DNS astfel încât să indice subdomeniul aferent noii organizații pe care rulează aplicația principală. În caz contrar, organizația nu va funcționa.<br /><br />Aici găsiți doar opțiunile de bază pentru a configura unui subdomeniu să direcționeze către aplicația sa astfel încât să încarce pagina de profil a organizației.<br /><br />Puteți realiza acest lucru fie cu înregistrarea A:",
"admin_org_notification_email_body_part2": "Fie cu înregistrarea CNAME:",
"admin_org_notification_email_body_part3": "După ce configurați subdomeniul, marcați configurarea DNS ca finalizată în setările de administrare a organizațiilor.",
"admin_org_notification_email_cta": "Mergeți la Setări administrare organizații",
"org_has_been_processed": "Organizația a fost procesată",
"org_error_processing": "A survenit o eroare la procesarea organizației",
"orgs_page_description": "O listă cu toate organizațiile. Acceptarea unei organizații va permite tuturor utilizatorilor cu acel domeniu de e-mail să se înregistreze fără verificarea adresei de e-mail.",
"unverified": "Neverificat",
"dns_missing": "DNS lipsă",
"mark_dns_configured": "Marcați ca DNS configurat",
"value": "Valoare",
"your_organization_updated_sucessfully": "Organizația dvs. a fost actualizată cu succes",
"team_no_event_types": "Această echipă nu are niciun tip de eveniment",
"seat_options_doesnt_multiple_durations": "Opțiunea de loc nu acceptă mai multe durate",
"include_calendar_event": "Includeți eveniment din calendar",
"recently_added": "Adăugate recent",
"no_members_found": "Nu s-a găsit niciun membru",
"event_setup_length_error": "Configurare eveniment: Durata trebuie să fie de cel puțin 1 minut.",
"availability_schedules": "Programe de disponibilitate",
"view_only_edit_availability_not_onboarded": "Acest utilizator nu a finalizat integrarea. Nu-i veți putea seta disponibilitatea până când nu finalizează integrarea.",
"view_only_edit_availability": "Vizualizați disponibilitatea acestui utilizator. Nu puteți edita decât disponibilitatea dvs. personală.",
"edit_users_availability": "Editați disponibilitatea utilizatorului: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Adăugați stringurile noi deasupra acestui rând ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "Подтвердите адрес электронной почты для обеспечения гарантированной доставки уведомлений по электронной почте и в календаре",
"verify_email_email_header": "Подтвердите свой адрес электронной почты",
"verify_email_email_button": "Подтвердить эл. почту",
"copy_somewhere_safe": "Сохраните этот ключ API в надежном месте, сервис показывает его только один раз.",
"verify_email_email_body": "Подтвердите адрес электронной почты, нажав кнопку ниже.",
"verify_email_by_code_email_body": "Подтвердите адрес электронной почты с помощью приведенного ниже кода.",
"verify_email_email_link_text": "Вы также можете вручную перейти по следующей ссылке:",
"email_verification_code": "Введите код подтверждения",
"email_verification_code_placeholder": "Введите код подтверждения, отправленный на ваш адрес электронной почты",
"incorrect_email_verification_code": "Неверный код подтверждения.",
"email_sent": "Письмо успешно отправлено",
"email_not_sent": "При отправке письма произошла ошибка",
"event_declined_subject": "Отклонено: {{title}} {{date}}",
"event_cancelled_subject": "Отмена: {{title}} {{date}}",
"event_request_declined": "Ваш запрос на встречу отклонен",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "Повторяющееся событие ждет вашего одобрения",
"someone_requested_an_event": "Кто-то записался на встречу в вашем календаре.",
"someone_requested_password_reset": "Кто-то запросил ссылку для изменения вашего пароля.",
"password_reset_email_sent": "Если этот адрес электронной почты зарегистрирован в нашей системе, вы получите письмо с инструкциями для сброса пароля.",
"password_reset_instructions": "Если вы не запрашивали это, проигнорируйте это письмо и пароль не будет изменен.",
"event_awaiting_approval_subject": "Ожидает подтверждения: {{title}} на {{date}}",
"event_still_awaiting_approval": "Событие все еще ждет вашего подтверждения",
@ -217,6 +224,10 @@
"already_have_an_account": "Уже есть аккаунт?",
"create_account": "Создать аккаунт",
"confirm_password": "Подтвердите пароль",
"confirm_auth_change": "После этого изменится способ авторизации",
"confirm_auth_email_change": "При изменении адреса электронной почты используемый способ авторизации для входа на Cal.com перестанет работать. Мы попросим вас подтвердить новый адрес электронной почты. Будет выполнен выход из вашего аккаунта. Затем вместо предыдущего способа авторизации вы войдете в Cal.com с помощью нового адреса электронной почты. Для этого нужно задать пароль. Инструкция о том, как это сделать, придет к вам на почту.",
"reset_your_password": "Задайте новый пароль. Инструкции о том, как это сделать, мы отправили на ваш адрес электронной почты.",
"email_change": "Войдите, используя новый адрес электронной почты и пароль.",
"create_your_account": "Создайте аккаунт",
"sign_up": "Регистрация",
"youve_been_logged_out": "Вы вышли из аккаунта",
@ -243,6 +254,10 @@
"all": "Все приложения",
"yours": "Ваш аккаунт",
"available_apps": "Доступные приложения",
"available_apps_lower_case": "Доступные приложения",
"available_apps_desc": "У вас нет установленных приложений. Просмотрите популярные приложения ниже или найдите нужные вам приложения в нашем <1>App Store</1>",
"fixed_host_helper": "Добавьте любого пользователя, которому нужно принять участие в событии. <1>Подробнее</1>",
"round_robin_helper": "Участники группы действуют по очереди: только один пользователь посетит событие.",
"check_email_reset_password": "Проверьте вашу электронную почту, мы отправили вам ссылку для сброса пароля.",
"finish": "Завершить",
"organization_general_description": "Настройте язык и часовой пояс для своей команды",
@ -251,6 +266,7 @@
"nearly_there_instructions": "И последнее: добавьте краткую информацию о себе и свою фотографию; так людям будет проще понять, с кем они бронируют встречу.",
"set_availability_instructions": "Определите диапазон времени, в который вы обычно доступны. В дальнейшем можно будет добавить ещё диапазоны и назначить их разным календарям.",
"set_availability": "Задайте время в которое вы доступны",
"availability_settings": "Настройки доступности",
"continue_without_calendar": "Продолжить без подключения календаря",
"connect_your_calendar": "Подключите календарь",
"connect_your_video_app": "Подключите приложения для видеосвязи",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "Ссылки для группового бронирования, которые можно создавать динамически, указывая несколько имен пользователей при помощи знака «+». Пример: «{{appName}}/bailey+peer»",
"allow_dynamic_booking": "Разрешить участникам бронировать встречи с вами при помощи динамического группового бронирования",
"dynamic_booking": "Динамические ссылки для групп",
"allow_seo_indexing": "Разрешить поисковым системам доступ к публичному контенту",
"seo_indexing": "Разрешить SEO- индексацию",
"email": "Адрес электронной почты",
"email_placeholder": "jdoe@example.com",
"full_name": "Имя",
@ -406,6 +424,7 @@
"booking_requested": "Запрос на бронирование отправлен",
"meeting_ended": "Встреча завершилась",
"form_submitted": "Форма отправлена",
"booking_paid": "Бронирование оплачено",
"event_triggers": "Триггеры событий",
"subscriber_url": "URL-адрес подписчика",
"create_new_webhook": "Создать новый веб-хук",
@ -506,6 +525,7 @@
"your_name": "Ваше имя",
"your_full_name": "ФИО",
"no_name": "Нет названия",
"enter_number_between_range": "Введите число от 1 до {{maxOccurences}}",
"email_address": "Адрес электронной почты",
"enter_valid_email": "Укажите допустимый адрес электронной почты",
"location": "Местоположение",
@ -543,6 +563,7 @@
"leave": "Покинуть",
"profile": "Профиль",
"my_team_url": "URL-адрес моей команды",
"my_teams": "Мои команды",
"team_name": "Название команды",
"your_team_name": "Название вашей команды",
"team_updated_successfully": "Команда успешно обновлена",
@ -570,6 +591,8 @@
"invite_new_member": "Пригласить нового участника команды",
"invite_new_member_description": "Примечание: стоимость подписки увеличится на <1>15 $/месяц за дополнительное место</1>.",
"invite_new_team_member": "Пригласите кого-нибудь в вашу команду.",
"upload_csv_file": "Загрузить файл .csv",
"invite_via_email": "Пригласить по электронной почте",
"change_member_role": "Изменить роль члена команды",
"disable_cal_branding": "Отключить брендинг {{appName}}",
"disable_cal_branding_description": "Скрыть весь брендинг {{appName}} с ваших публичных страниц.",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "Пользователь должен принять приглашение для просмотра доступности",
"set_as_away": "Установить статус «отошел»",
"set_as_free": "Отключить статус «отошел»",
"toggle_away_error": "Ошибка при обновлении статуса «отошел»",
"user_away": "Этот пользователь в настоящее время отсутствует.",
"user_away_description": "Человек, с которым вы пытаетесь забронировать встречу - недоступен, поэтому он не принимает новых записей.",
"meet_people_with_the_same_tokens": "Проводите встречи с пользователями с такими же токенами",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "Чтобы изменить адрес электронной почты, пароль, включить двухфакторную авторизацию, пожалуйста, посетите настройки учетной записи {{provider}}.",
"signin_with_google": "Войти через Google",
"signin_with_saml": "Войти с помощью SAML",
"signin_with_saml_oidc": "Войти с помощью SAML/OIDC",
"you_will_need_to_generate": "Вам нужно сгенерировать токен доступа на странице интеграции.",
"import": "Импорт",
"import_from": "Импортировать из",
@ -950,6 +975,8 @@
"offer_seats_description": "Предлагать места при бронировании (данная настройка автоматически отключает гостевой режим и бронирование с подтверждением).",
"seats_available_one": "Доступное место",
"seats_available_other": "Доступные места",
"seats_nearly_full": "Свободных мест почти не осталось",
"seats_half_full": "Свободные места быстро разбирают",
"number_of_seats": "Количество мест на одну бронь",
"enter_number_of_seats": "Укажите количество мест",
"you_can_manage_your_schedules": "Расписаниями можно управлять на странице «Доступность».",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "Как вы хотите добавить {{appName}} на сайт?",
"choose_ways_put_cal_site": "Выберите способ размещения {{appName}} на сайте.",
"setting_up_zapier": "Настройка интеграции с Zapier",
"setting_up_make": "Настройка интеграции с Make",
"generate_api_key": "Сгенерировать ключ API",
"generate_api_key_description": "Сгенерируйте ключ API, чтобы использовать его в {{appName}}, по адресу",
"your_unique_api_key": "Ваш уникальный ключ API",
"copy_safe_api_key": "Скопируйте этот ключ API и сохраните его в надежном месте. Если ключ потеряется, вам придется создать новый.",
"zapier_setup_instructions": "<0>Войдите в свой аккаунт Zapier и создайте новый Zap.</0><1>Выберите в качестве приложения-триггера Cal.com. Также выберите событие-триггер.</1><2>Выберите свою учетную запись и введите уникальный ключ API.</2><3>Проверьте триггер.</3><4>Готово!</4>",
"make_setup_instructions": "<0>Перейдите по <1><0>пригласительной ссылке Make</0></1> и установите приложение Cal.com.</0><1>Войдите в аккаунт Make и создайте новый сценарий.</1><2>Выберите Cal.com в качестве приложения-триггера. Также выберите событие-триггер.</2><3>Выберите свою учетную запись и введите уникальный ключ API.</3><4>Проверьте триггер.</4><5>Готово!</5>",
"install_zapier_app": "Сначала установите приложение Zapier из App Store.",
"install_make_app": "Сначала установите приложение Make из App Store.",
"connect_apple_server": "Подключиться к серверу Apple",
"calendar_url": "URL-адрес календаря",
"apple_server_generate_password": "Сгенерируйте пароль для программы, чтобы использовать его в {{appName}}, по адресу",
@ -1085,6 +1115,7 @@
"email_attendee_action": "отправить письмо участникам",
"sms_attendee_action": "Отправить SMS-сообщение участнику",
"sms_number_action": "отправка SMS-сообщение на указанный номер",
"send_reminder_sms": "Отправляйте участникам напоминания о встрече по SMS",
"whatsapp_number_action": "отправка сообщение в Whatsapp на указанный номер",
"whatsapp_attendee_action": "отправить участнику сообщение в Whatsapp",
"workflows": "Рабочие процессы",
@ -1244,6 +1275,7 @@
"error_updating_settings": "Ошибка при обновлении настроек",
"personal_cal_url": "URL-адрес моего персонального {{appName}}",
"bio_hint": "Несколько предложений о себе. Они будут отображаться на вашей персональной странице.",
"user_has_no_bio": "Пользователь еще не указал данные о себе.",
"delete_account_modal_title": "Удалить аккаунт",
"confirm_delete_account_modal": "Удалить аккаунт {{appName}}?",
"delete_my_account": "Удалить мой аккаунт",
@ -1426,6 +1458,7 @@
"add_limit": "Добавить ограничение",
"team_name_required": "Требуется название команды",
"show_attendees": "Предоставлять гостям информацию об участниках",
"show_available_seats_count": "Показать количество доступных мест",
"how_booking_questions_as_variables": "Как использовать вопросы о бронировании в качестве переменных?",
"format": "Формат",
"uppercase_for_letters": "Использовать только прописные буквы",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Удалить конфигурацию {{connectionType}}? Участники команды, входящие в Cal.com через {{connectionType}}, больше не смогут получить к нему доступ.",
"organizer_timezone": "Часовой пояс организатора",
"email_user_cta": "Посмотреть приглашение",
"email_no_user_invite_heading_team": "Вас пригласили в команду {{appName}}",
"email_no_user_invite_heading_org": "Вас пригласили в организацию {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} пригласил(-а) вас в команду в {{appName}}. {{appName}} — это гибкий планировщик событий, с помощью которого пользователи и целые команды могут планировать встречи без утомительной переписки по электронной почте.",
"email_user_invite_subheading_team": "{{invitedBy}} пригласил(а) вас в команду в `{{teamName}}` в приложении {{appName}}. {{appName}} — это гибкий планировщик событий, с помощью которого пользователи и целые команды могут планировать встречи без утомительной переписки по электронной почте.",
"email_user_invite_subheading_org": "{{invitedBy}} пригласил(а) вас в организацию `{{teamName}}` в {{appName}}. {{appName}} — это гибкий планировщик событий, с помощью которого вы и ваша организация можете планировать встречи без утомительной переписки по электронной почте.",
"email_no_user_invite_steps_intro": "Всего несколько шагов — и вы сможете оперативно и без стресса планировать встречи в рамках вашей {{entity}}.",
"email_no_user_step_one": "Выберите имя пользователя",
"email_no_user_step_two": "Подключите аккаунт календаря",
@ -1831,6 +1867,8 @@
"insights_no_data_found_for_filter": "Данные, соответствующие выбранному фильтру или диапазону дат, не найдены.",
"acknowledge_booking_no_show_fee": "Я подтверждаю, что в случае моей неявки на событие с моей карты будет списана комиссия в размере {{amount, currency}}.",
"card_details": "Реквизиты карты",
"something_went_wrong_on_our_end": "Что-то пошло не так. Свяжитесь с нашей службой поддержки, и мы быстро устраним проблему.",
"please_provide_following_text_to_suppport": "Чтобы специалисты техподдержки могли быстрее вам помочь, укажите следующую информацию",
"seats_and_no_show_fee_error": "Списание платы за неявку при использовании выбора места в настоящее время не поддерживается",
"complete_your_booking": "Завершить бронирование",
"complete_your_booking_subject": "Завершите бронирование: {{title}}, {{date}}",
@ -1864,6 +1902,9 @@
"open_dialog_with_element_click": "Открыть диалог Cal при нажатии на элемент.",
"need_help_embedding": "Нужна помощь? Ознакомьтесь с нашими руководствами по встраиванию Cal на Wix, Squarespace или WordPress, списком часто встречающих вопросов, а также информацией о расширенных возможностях встраивания.",
"book_my_cal": "Забронировать в Cal",
"first_name": "Имя",
"last_name": "Фамилия",
"first_last_name": "Имя, фамилия",
"invite_as": "Пригласить в качестве",
"form_updated_successfully": "Форма успешно обновлена.",
"disable_attendees_confirmation_emails": "Отключить стандартное подтверждение по электронной почте для участников",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "Создайте первый вебхук для этого типа событий",
"install_app_on": "Установить приложение в",
"create_for": "Создать для",
"currency": "Валюта",
"organization_banner_description": "Создавайте рабочие среды, в рамках которых ваши команды смогут создавать общие приложения, рабочие процессы и типы событий с назначением участников по очереди и коллективным планированием.",
"organization_banner_title": "Управляйте организациями с несколькими командами",
"set_up_your_organization": "Настройка профиля организации",
@ -1937,6 +1979,79 @@
"insights_team_filter": "Команда: {{teamName}}",
"insights_user_filter": "Пользователь: {{userName}}",
"insights_subtitle": "Insights: просматривайте информацию о бронировании по всем вашим событиям",
"location_options": "Параметры местоположения {{locationCount}}",
"custom_plan": "Пользовательский тариф",
"email_embed": "Встроить электронную почту",
"add_times_to_your_email": "Выберите доступные промежутки времени и вставьте их в письмо",
"select_time": "Выбрать время",
"select_date": "Выбрать дату",
"see_all_available_times": "Посмотреть все доступные интервалы времени",
"org_team_names_example": "например, команда по маркетингу",
"org_team_names_example_1": "например, команда по маркетингу",
"org_team_names_example_2": "например, Отдел продаж",
"org_team_names_example_3": "например, отдел дизайна",
"org_team_names_example_4": "например, технический отдел",
"org_team_names_example_5": "например, отдел анализа данных",
"org_max_team_warnings": "Позже можно добавить другие команды.",
"what_is_this_meeting_about": "Чему посвязена эта встреча?",
"add_to_team": "Добавить в команду",
"remove_users_from_org": "Удалить пользователей из организации",
"remove_users_from_org_confirm": "Удалить {{userCount}} пользователей из этой организации?",
"user_has_no_schedules": "Этот пользователь еще не настроил ни одного расписания",
"user_isnt_in_any_teams": "Этот пользователь не относится ни к одной команде",
"requires_booker_email_verification": "Требуется подтверждение электронной почты пользователя, оформляющего бронирование",
"description_requires_booker_email_verification": "Чтобы подтвердить электронную почту пользователя, оформляющего бронирование, до планирования событий",
"requires_confirmation_mandatory": "Участникам можно отправлять сообщения, только если тип события предполагает подтверждение.",
"kyc_verification_information": "Из соображений безопасности вы сможете отправлять текстовые сообщения участникам только после верификации {{teamOrAccount}}. Свяжитесь с нами по <a>{{supportEmail}}</a> и предоставьте следующую информацию:",
"kyc_verification_documents": "<ul><li>{{teamOrUser}}</li><li>Для юридических лиц: Предоставьте документы о верификации компании</li><li>Для физических лиц: Предоставьте официальное удостоверение личности</li></ul>",
"verify_team_or_account": "Подтвердить {{teamOrAccount}}",
"verify_account": "Подтвердить аккаунт",
"kyc_verification": "Верификация KYC",
"organizations": "Организации",
"org_admin_other_teams": "Другие команды",
"org_admin_other_teams_description": "Это перечень команд вашей организации, в которые вы не входите. При необходимости можно добавить себя в эти команды.",
"no_other_teams_found": "Другие команды не найдены",
"no_other_teams_found_description": "В этой организации нет других команд.",
"attendee_first_name_variable": "Имя участника",
"attendee_last_name_variable": "Фамилия участника",
"attendee_first_name_info": "Имя участника, который оформляет бронирование",
"attendee_last_name_info": "Фамилия участника, который оформляет бронирование",
"me": "Я",
"verify_team_tooltip": "Подтвердите свою команду, чтобы отправлять участникам сообщения",
"member_removed": "Участник удален",
"my_availability": "Моя доступность",
"team_availability": "Доступность команды",
"backup_code": "Код бэкапа",
"backup_codes": "Коды бэкапа",
"backup_code_instructions": "Каждый код бэкапа можно использовать только один раз, чтобы предоставить доступ без аутентификатора.",
"backup_codes_copied": "Коды бэкапа скопированы!",
"incorrect_backup_code": "Неверный код бэкапа.",
"lost_access": "Доступ потерян",
"missing_backup_codes": "Коды бэкапа не найдены. Сгенерируйте их в настройках.",
"admin_org_notification_email_subject": "Создана новая организация: ожидается действие",
"hi_admin": "Привет, администратор",
"admin_org_notification_email_title": "Для организации требуется установка DNS",
"admin_org_notification_email_body_part1": "Создана организация со слагом \"{{orgSlug}}\".<br /><br />Обязательно настройте реестр DNS, указав поддомен, соответствующий новой организации, в котором выполняется основное приложение. В противном случае организация не сможет работать.<br /><br />Вот несколько базовых параметров для настройки поддомена, указывающих на приложение и позволяющих ему загрузить страницу профиля организации.<br /><br />Это также можно сделать с помощью записи A:",
"admin_org_notification_email_body_part2": "Или запись CNAME:",
"admin_org_notification_email_body_part3": "Настроив поддомен, в настройках администратора организаций поставьте «готово» рядом с конфигурацией DNS.",
"admin_org_notification_email_cta": "Перейти в настройки администратора организаций",
"org_has_been_processed": "Обработка для организации завершена",
"org_error_processing": "При обработке этой организации произошла ошибка",
"orgs_page_description": "Список всех организаций. При приеме организации все пользователи с этим доменом электронной почты смогут регистрироваться БЕЗ подтверждения электронной почты.",
"unverified": "Не подтверждено",
"dns_missing": "Отсутствует DNS",
"mark_dns_configured": "Отметить как \"конфигурация DNS завершена\"",
"value": "Значение",
"your_organization_updated_sucessfully": "Данные об организации успешно обновлены",
"team_no_event_types": "У этой команды нет типов событий",
"seat_options_doesnt_multiple_durations": "Параметр «место» не поддерживает несколько вариантов продолжительности",
"include_calendar_event": "Включить событие календаря",
"recently_added": "Недавно добавленные",
"no_members_found": "Участники не найдены",
"event_setup_length_error": "Настройка события: продолжительность должна быть не менее 1 минуты.",
"availability_schedules": "График с информацией о доступности",
"view_only_edit_availability_not_onboarded": "Этот пользователь не прошел онбординг. Вы сможете настроить для него информацию о доступность, только когда он пройдет онбординг.",
"view_only_edit_availability": "Вы просматриваете информацию о доступности этого пользователя. Вы можете редактировать только информацию о собственной доступности.",
"edit_users_availability": "Редактировать данные о доступности пользователя: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Добавьте строки выше ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -19,8 +19,13 @@
"verify_email_email_button": "Potvrdi adresu e-pošte",
"copy_somewhere_safe": "Čuvajte ovaj API ključ na bezbednom mestu. Nećete moći da ga ponovo vidite.",
"verify_email_email_body": "Potvrdite svoju adresu e-pošte klikom na dugme ispod.",
"verify_email_by_code_email_body": "Potvrdite svoju imejl adresu korišćenjem kôda u nastavku.",
"verify_email_email_link_text": "U slučaju da ne volite da klikćete na dugmad, evo linka:",
"email_verification_code": "Unesite kôd za verifikaciju",
"email_verification_code_placeholder": "Unesite kôd za verifikaciju koji vam je poslat imejlom",
"incorrect_email_verification_code": "Verifikacioni kôd nije tačan.",
"email_sent": "Imejl je uspešno poslat",
"email_not_sent": "Desila se greška prilikom slanja imejla",
"event_declined_subject": "Odbijeno: {{title}} datuma {{date}}",
"event_cancelled_subject": "Otkazano: {{title}} dana {{date}}",
"event_request_declined": "Vaš zahtev za događaj je odbijen",
@ -79,6 +84,7 @@
"event_awaiting_approval_recurring": "Ponavljajući događaj čeka na vaše odobrenje",
"someone_requested_an_event": "Neko zahteva da rezerviše dogadjaj na vašem kalendaru.",
"someone_requested_password_reset": "Neko zahteva link da promeni vašu lozinku.",
"password_reset_email_sent": "Ako ovaj imejl postoji našem sistemu, trebalo bi da primite imejl za resetovanje.",
"password_reset_instructions": "Ako niste pokrenuli ovaj zahtev, slobodno ignorišite ovu e-poštu i vaša lozinka se neće promeniti.",
"event_awaiting_approval_subject": "Čeka na odobrenje: {{title}} datuma {{date}}",
"event_still_awaiting_approval": "Događaj još čeka na vaše odobrenje",
@ -218,6 +224,10 @@
"already_have_an_account": "Već imate nalog?",
"create_account": "Napravite Nalog",
"confirm_password": "Potvrdite lozinku",
"confirm_auth_change": "To će promeniti način na koji se prijavljujete",
"confirm_auth_email_change": "Promena imejl adrese će prekinuti trenutni način autentifikacije za prijavljivanje na Cal.com. Zatražićemo da verifikujete svoju novu imejl adresu. Nakon toga, bićete odjavljeni, i koristićete novu imejl adresu za prijavljivanje umesto trenutnog načina autentifikacije nakon što podesite lozinku prateći uputstva koja će vam biti poslata imejlom.",
"reset_your_password": "Podesite novu lozinku pomoću uputstva poslatim na vašu imejl adresu.",
"email_change": "Prijavite se ponovo sa novom imejl adresom i lozinkom.",
"create_your_account": "Napravite svoj nalog",
"sign_up": "Prijavite se",
"youve_been_logged_out": "Odjavili ste se",
@ -244,6 +254,10 @@
"all": "Sve aplikacije",
"yours": "Vaš nalog",
"available_apps": "Dostupne aplikacije",
"available_apps_lower_case": "Dostupne aplikacije",
"available_apps_desc": "Nemate instaliranih aplikacija. Pogledajte popularne aplikacije ispod i dodatno istražite na našem <1>App Store-u</1>",
"fixed_host_helper": "Dodajte bilo koga ko treba da prisustvuje događaju. <1>Saznajte više</1>",
"round_robin_helper": "Ljudi u grupi se smenjuju i samo jedna osoba će doći na događaj.",
"check_email_reset_password": "Proverite vašu e-poštu. Poslali smo vam link za resetovanje lozinke.",
"finish": "Završi",
"organization_general_description": "Upravljajte podešavanjima tima za jezik i vremensku zonu",
@ -252,6 +266,7 @@
"nearly_there_instructions": "Na kraju, kratak opis o vama i slika mogu vam pomoći oko rezervacija i da obavestite druge s kim zapravo rezervišu.",
"set_availability_instructions": "Definišite periode kad ste stalno dostupni. Kasnije možete kreirati više njih i dodeliti ih različitim kalendarima.",
"set_availability": "Podesite svoju dostupnost",
"availability_settings": "Podešavanja dostuposti",
"continue_without_calendar": "Nastavite bez kalendara",
"connect_your_calendar": "Povežite vaš kalendar",
"connect_your_video_app": "Povežite svoje video aplikacije",
@ -393,6 +408,8 @@
"allow_dynamic_booking_tooltip": "Moguće je dinamičko kreiranje linkova za grupne rezervacije navođenjem više korisničkih imena sa znakom „+”. Na primer: „{{appName}}/bailey+peer”",
"allow_dynamic_booking": "Dozvolite učesnicima da rezervišu termin sa vama putem dinamičkih grupnih rezervacija",
"dynamic_booking": "Dinamični linkovi grupa",
"allow_seo_indexing": "Dozvolite pretraživačima da pristupe vašem javnom sadržaju",
"seo_indexing": "Dozvolite SEO indeksiranje",
"email": "E-pošta",
"email_placeholder": "ppetrovic@example.com",
"full_name": "Ime i prezime",
@ -407,6 +424,7 @@
"booking_requested": "Zahtev za rezervaciju je poslat",
"meeting_ended": "Sastanak se završio",
"form_submitted": "Formular poslat",
"booking_paid": "Rezervacija je plaćena",
"event_triggers": "Okidači Dogadjaja",
"subscriber_url": "URL pretplatnika",
"create_new_webhook": "Napravite novi webhook",
@ -507,6 +525,7 @@
"your_name": "Vaše ime",
"your_full_name": "Ime i prezime",
"no_name": "Bez imena",
"enter_number_between_range": "Unesite broj između 1 i {{maxOccurences}}",
"email_address": "E-pošta",
"enter_valid_email": "Unesite važeću imejl adresu",
"location": "Lokacija",
@ -544,6 +563,7 @@
"leave": "Napusti",
"profile": "Profil",
"my_team_url": "URL mog tima",
"my_teams": "Moji timovi",
"team_name": "Ime tima",
"your_team_name": "Ime vašeg tima",
"team_updated_successfully": "Tim uspešno ažuriran",
@ -571,6 +591,8 @@
"invite_new_member": "Pozovite novog člana",
"invite_new_member_description": "</1>Napomena: Ovo će <1>povećati vašu pretplatu za dodatno mesto (15 $/mesečno)</1>.",
"invite_new_team_member": "Pozovite nekog u vaš tim.",
"upload_csv_file": "Otpremite .csv datoteku",
"invite_via_email": "Pozovite putem imejla",
"change_member_role": "Promenite ulogu članu tima",
"disable_cal_branding": "Onemogući brendiranje {{appName}}",
"disable_cal_branding_description": "Skrijte svako {{appName}} brendiranje sa svojih javnih stranica.",
@ -843,6 +865,7 @@
"team_view_user_availability_disabled": "Korisnik mora da prihvati poziv da bi video dostupnost",
"set_as_away": "Postavite se da niste prisutni",
"set_as_free": "Deaktiviraj status prisutnosti",
"toggle_away_error": "Greška pri ažuriranju statusa odsutan",
"user_away": "Ovaj korisnink nije prisutan.",
"user_away_description": "Osoba sa kojom želite da rezervišete sastanak je postavila status da nije prisutna, tako da ne prihvata nove rezervacije.",
"meet_people_with_the_same_tokens": "Upoznajte ljude sa istim tokenima",
@ -852,6 +875,7 @@
"account_managed_by_identity_provider_description": "Da biste promenili svoju adresu e-pošte, lozinku, omogućili dvofaktorsku autentifikaciju itd., molimo vas posetite vaša {{provider}} podešavanja naloga.",
"signin_with_google": "Ulogujte sa pomoću Google-a",
"signin_with_saml": "Ulogujte se pomoću SAML",
"signin_with_saml_oidc": "Prijavite se pomoću SAML/OIDC",
"you_will_need_to_generate": "Morate generisati token pristupnosti iz svog prošlog softvera za zakazivanje.",
"import": "Importuj",
"import_from": "Importuj iz",
@ -951,6 +975,8 @@
"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",
"seats_nearly_full": "Mesta su skoro zauzeta",
"seats_half_full": "Mesta se brzo popunjavaju",
"number_of_seats": "Broj mesta po zakazivanju",
"enter_number_of_seats": "Unesite broj slobodnih mesta",
"you_can_manage_your_schedules": "Svojim rasporedima možete upravljati na stranici Dostupnost.",
@ -1031,12 +1057,15 @@
"how_you_want_add_cal_site": "Kako želite da dodate {{appName}} na vaš sajt?",
"choose_ways_put_cal_site": "Izaberite jedan od sledećih načina za postavljanje {{appName}}-a na vaš sajt.",
"setting_up_zapier": "Podešavanje vaše Zapier integracije",
"setting_up_make": "Podešavanje vaše Make integracije",
"generate_api_key": "Generiši API ključ",
"generate_api_key_description": "Generišite API ključ za upotrebu sa {{appName}} na",
"your_unique_api_key": "Vaš jedinstveni API ključ",
"copy_safe_api_key": "Kopirajte ovaj API ključ i sačuvajte ga na bezbednom mestu. Ako izgubite ovaj ključ, moraćete da generište novi.",
"zapier_setup_instructions": "<0>Prijavite se na vaš Zapier nalog i kreirajte novi Zap.</0><1>Izaberite Cal.com kao vašu Trigger aplikaciju. Takođe izaberite i Trigger događaj.</1><2>Izaberite svoj nalog i unesite vaš jedinstveni API ključ.</2><3>Testirajte svoj Trigger.</3><4>Završili ste!</4>",
"make_setup_instructions": "<0>Idite na <1><0>link Napravi pozivnicu</0></1> i instalirajte aplikaciju Cal.com.</0><1>Prijavite se u Napravi nalog i kreirajte novi Scenario.</1><2>Izaberite Cal.com kao vašu applikaciju Okidač. Takođe odaberite okidač događaja.</2><3>Izaberite svoj nalog i unesite svoj jedinstveni API ključ.</3><4>Testirajte svoj okidač.</4><5>Spremni ste!</5>",
"install_zapier_app": "Prvo instalirajte aplikaciju Zapier iz App Store.",
"install_make_app": "Prvo instalirajte aplikaciju Make iz App Store-a.",
"connect_apple_server": "Poveži se sa Apple serverom",
"calendar_url": "URL kalendara",
"apple_server_generate_password": "Generišite posebnu lozinku aplikacije za korišćenje sa {{appName}} na",
@ -1086,6 +1115,7 @@
"email_attendee_action": "pošalji imejl učesnicima",
"sms_attendee_action": "Pošalji SMS učesniku",
"sms_number_action": "pošalji SMS na određeni broj",
"send_reminder_sms": "Učesnicima lako pošaljite podsetnike za sastanak putem poruke",
"whatsapp_number_action": "pošaljite Whatsapp poruku na određeni broj",
"whatsapp_attendee_action": "pošaljite Whatsapp poruku učesniku",
"workflows": "Radni tokovi",
@ -1245,6 +1275,7 @@
"error_updating_settings": "Greška pri ažuriranju podešavanja",
"personal_cal_url": "Moj lični {{appName}} URL",
"bio_hint": "Par rečenica o vama. Ovo će se pojaviti na vašoj ličnoj url stranici.",
"user_has_no_bio": "Ovaj korisnik još nije dodao svoju biografiju.",
"delete_account_modal_title": "Izbriši nalog",
"confirm_delete_account_modal": "Jeste li sigurni da želite da izbrišete vaš {{appName}} nalog?",
"delete_my_account": "Izbriši moj nalog",
@ -1427,6 +1458,7 @@
"add_limit": "Dodajte ograničenje",
"team_name_required": "Ime tima je potrebno",
"show_attendees": "Podelite informacije o učesnicima između gostiju",
"show_available_seats_count": "Prikaži broj dostupnih mesta",
"how_booking_questions_as_variables": "Kako da koristite pitanja o zakazivanju kao promenljivu?",
"format": "Format",
"uppercase_for_letters": "Koristite velika slova za sva slova",
@ -1660,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Da li ste sigurni da želite da izbrišete {{connectionType}} konfiguraciju? Članovi vašeg tima koji koriste {{connectionType}} prijavljivanje više neće moći da pristupe Cal.com-u.",
"organizer_timezone": "Vremenska zona organizatora",
"email_user_cta": "Prikaži pozivnicu",
"email_no_user_invite_heading_team": "Pozvani ste da se pridružite timu {{appName}}",
"email_no_user_invite_heading_org": "Pozvani ste da se pridružite organizaciji {{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_team": "{{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_user_invite_subheading_org": "{{invitedBy}} vas je pozvao da se pridružite njihovoj organizaciji „{{teamName}}” na {{appName}}. {{appName}} je planer za zakazivanje događaja koji omogućava vama i vašoj organizaciji da zakažete sastanke bez dopisivanja imejlom.",
"email_no_user_invite_steps_intro": "Provešćemo vas u nekoliko kratkiih koraka i za tren ćete uživati u zakazivanju bez stresa sa vašim {{entity}}.",
"email_no_user_step_one": "Izaberite korisničko ime",
"email_no_user_step_two": "Povežite se sa nalogom kalendara",
@ -1832,6 +1867,8 @@
"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 prisustvujem ovom događaju.",
"card_details": "Informacije o kartici",
"something_went_wrong_on_our_end": "Nešto kod nas nije u redu. Obratite se korisničkoj podršci i mi ćemo to odmah popraviti za vas.",
"please_provide_following_text_to_suppport": "Prilikom kontaktiranja sa korisničkom službom, dostavite sledeći tekst kako bi vam bolje pomogli",
"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}}",
@ -1865,6 +1902,9 @@
"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",
"first_name": "Ime",
"last_name": "Prezime",
"first_last_name": "Ime, prezime",
"invite_as": "Pozovi kao",
"form_updated_successfully": "Formular je uspešno ažuriran.",
"disable_attendees_confirmation_emails": "Onemogući podrazumevane imejlove za potvrdu za učesnike",
@ -1878,6 +1918,7 @@
"first_event_type_webhook_description": "Napravite svoj prvi webhook za ovaj tip događaja",
"install_app_on": "Instaliraj aplikaciju za",
"create_for": "Napravi za",
"currency": "Valuta",
"organization_banner_description": "Kreirajte okruženja gde vaši timovi mogu da postave deljene aplikacije, radne tokove i vrste događaja sa kružnom dodelom i zajedničko zakazivanje.",
"organization_banner_title": "Upravljajte organizacijama sa više timova",
"set_up_your_organization": "Konfigurisanje profila organizacije",
@ -1938,6 +1979,79 @@
"insights_team_filter": "Tim: {{teamName}}",
"insights_user_filter": "Korisnik: {{userName}}",
"insights_subtitle": "Pogledajte insights rezervacije za vaše događaje",
"location_options": "{{locationCount}} opcije lokacije",
"custom_plan": "Prilagođeni plan",
"email_embed": "Ugradi u imejl",
"add_times_to_your_email": "Izaberite nekoliko dostupnih termina i ugradite ih u svoj imejl",
"select_time": "Izaberite vreme",
"select_date": "Izaberite datum",
"see_all_available_times": "Pogledajte sva dostupna vremena",
"org_team_names_example": "npr. Marketing tim",
"org_team_names_example_1": "npr. Marketing tim",
"org_team_names_example_2": "npr. Prodajni tim",
"org_team_names_example_3": "npr. Dizajnerski tim",
"org_team_names_example_4": "npr. Inženjerski tim",
"org_team_names_example_5": "npr. Tim analize podataka",
"org_max_team_warnings": "Kasnije ćete moći da dodate još timova.",
"what_is_this_meeting_about": "O čemu je sastanak?",
"add_to_team": "Dodajte timu",
"remove_users_from_org": "Uklonite korisnike iz organizacije",
"remove_users_from_org_confirm": "Da li ste sigurni da želite da uklonite {{userCount}} korisnika iz organizacije?",
"user_has_no_schedules": "Ovaj korisnik još uvek nije podesio nijedan raspored",
"user_isnt_in_any_teams": "Ovaj korisnik nije ni u jednom timu",
"requires_booker_email_verification": "Zahteva imejl verifikaciju rezervacije",
"description_requires_booker_email_verification": "Da biste obezbedili verifikaciju imejla osobe koja rezerviše pre zakazivanja događaja",
"requires_confirmation_mandatory": "Poruke mogu da se šalju samo učesnicima kada tip događaja zahteva potvrdu.",
"kyc_verification_information": "Da bi osigurali bezbednost, morate da verifikujete svoj {{teamOrAccount}} pre slanja poruka učesnicima. Obratite nam se putem <a>{{supportEmail}}</a> i dostavite sledeće podatke:",
"kyc_verification_documents": "<ul><li>Vaš {{teamOrUser}}</li><li> za firme: Priložite dokumentaciju za poslovnu verifikaciju</li><li>Za pojedince: Priložite zvaničnu ličnu ispravu</li></ul>",
"verify_team_or_account": "Verifikuj {{teamOrAccount}}",
"verify_account": "Verifikuj nalog",
"kyc_verification": "KYC verifikacija",
"organizations": "Organizacije",
"org_admin_other_teams": "Drugi timovi",
"org_admin_other_teams_description": "Ovde možete da vidite timove u vašoj organizaciji gde niste član. Možete da se dodate ako je potrebno.",
"no_other_teams_found": "Nisu pronađeni drugi timovi",
"no_other_teams_found_description": "U ovoj organizaciji nema drugih timova.",
"attendee_first_name_variable": "Ime učesnika",
"attendee_last_name_variable": "Prezime učesnika",
"attendee_first_name_info": "Ime osobe koja rezerviše",
"attendee_last_name_info": "Prezime osobe koja rezerviše",
"me": "Ja",
"verify_team_tooltip": "Verifikujte svoj tim da biste omogućili slanje poruka učesnicima",
"member_removed": "Član je uklonjen",
"my_availability": "Moja dostupnost",
"team_availability": "Dostupnost tima",
"backup_code": "Rezervna kopija kôda",
"backup_codes": "Kodovi za rezervnu kopiju",
"backup_code_instructions": "Svaki kôd za rezervnu kopiju može biti korišćen samo jednom da bi se obezbedio pristup bez vašeg autentifikatora.",
"backup_codes_copied": "Kopirani su kodovi za rezervnu kopiju!",
"incorrect_backup_code": "Kôd za rezervnu kopiju je netačan.",
"lost_access": "Izgubljen pristup",
"missing_backup_codes": "Nisu pronađeni kodovi za rezervnu kopiju. Generišite ih u svojim podešavanjima.",
"admin_org_notification_email_subject": "Kreirana je nova organizacija: čeka se radnja",
"hi_admin": "Zdravo administratore,",
"admin_org_notification_email_title": "Organizacija zahteva DNS podešavanja",
"admin_org_notification_email_body_part1": "Organizacija sa slug-om „{{orgSlug}}” je kreirana. <br /><br />Uverite se da je konfigurisan DNS registar koji vodi ka poddomenu koji odgovara novoj organizaciji kada je pokrenuta glavna aplikacija. U suprotnom organizacija neće raditi.<br /><br /> Ovo su osnovne mogućnosti za konfigurisanje poddomena koji vodi ka njihovoj aplikaciji da bi se učitala profilna strana organizacije.<br /><br />To možete takođe da uradite sa A zapisom:",
"admin_org_notification_email_body_part2": "Ili sa CNAME zapisom:",
"admin_org_notification_email_body_part3": "Kada konfigurišete poddomen, označite DNS konfiguraciju kao završenu u Podešavanjima administratora organizacije.",
"admin_org_notification_email_cta": "Idite na Podešavanja administratora organizacije",
"org_has_been_processed": "Org je obrađena",
"org_error_processing": "Desila se greška u obradi ove organizacije",
"orgs_page_description": "Spisak svih organzacija. Prihvatanjem organizacije omogućiće svim korisnicima sa tim imejl domenom da se prijave BEZ verifikacije imejlom.",
"unverified": "Neverifikovano",
"dns_missing": "Nedostaje DNS",
"mark_dns_configured": "Označite da je DNS konfigurisan",
"value": "Vrednost",
"your_organization_updated_sucessfully": "Vaša ogranizacija je uspešno ažurirana",
"team_no_event_types": "Ovaj tim nema tipove događaja",
"seat_options_doesnt_multiple_durations": "Opcije za mesta ne podržavaju višestruko trajanje",
"include_calendar_event": "Uključite događaj u kalendaru",
"recently_added": "Nedavno dodato",
"no_members_found": "Članovi nisu pronađeni",
"event_setup_length_error": "Podešavanje događaja: Trajanje mora da bude barem 1 minut.",
"availability_schedules": "Raspored dostupnosti",
"view_only_edit_availability_not_onboarded": "Ovaj korisnik nije završio uvodnu obuku. Nećete moći da podesite dostupnost dok ne dovrši uvodnu obuku.",
"view_only_edit_availability": "Pregledate dostupnost ovog korisnika. Možete da uredite samo svoju dostupnost.",
"edit_users_availability": "Uredi dostupnost korisnika: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Dodajte svoje nove stringove iznad ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "Verifiera din e-postadress för att garantera bästa e-post- och kalenderleverans",
"verify_email_email_header": "Verifiera din e-postadress",
"verify_email_email_button": "Verifiera e-post",
"copy_somewhere_safe": "Spara denna API-nyckel någonstans säkert. Du kommer inte att kunna visa den igen.",
"verify_email_email_body": "Verifiera din e-postadress genom att klicka på knappen nedan.",
"verify_email_by_code_email_body": "Verifiera din e-postadress genom att använda nedanstående kod.",
"verify_email_email_link_text": "Här är länken om du inte gillar att klicka på knappar:",
"email_verification_code": "Ange verifieringskod",
"email_verification_code_placeholder": "Ange verifieringskoden som skickats till din e-post",
"incorrect_email_verification_code": "Vertifieringskoden är felaktig.",
"email_sent": "E-postmeddelandet har skickats",
"email_not_sent": "Ett fel uppstod när e-post skulle skickas",
"event_declined_subject": "Avvisades: {{title}} kl. {{date}}",
"event_cancelled_subject": "Avbokad: {{title}} {{date}}",
"event_request_declined": "Din bokningsförfrågan har avbjöts",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "En återkommande händelse väntar på ditt godkännande",
"someone_requested_an_event": "Någon har begärt att schemalägga en händelse i din kalender.",
"someone_requested_password_reset": "Någon har begärt en länk för att ändra ditt lösenord.",
"password_reset_email_sent": "Om denna e-postadress finns i vårt system bör du få ett återställningsmeddelande.",
"password_reset_instructions": "Om du inte begärde detta kan du ignorera detta e-postmeddelande och ditt lösenord kommer inte att ändras.",
"event_awaiting_approval_subject": "Inväntar godkännande: {{title}} den {{date}}",
"event_still_awaiting_approval": "En bokning väntar fortfarande på ditt godkännande",
@ -217,6 +224,10 @@
"already_have_an_account": "Har du redan ett konto?",
"create_account": "Skapa konto",
"confirm_password": "Bekräfta lösenord",
"confirm_auth_change": "Detta kommer att ändra hur du loggar in",
"confirm_auth_email_change": "Att ändra e-postadressen kommer att koppla bort din nuvarande autentiseringsmetod för att logga in på Cal.com. Vi kommer att be dig verifiera din nya e-postadress. Framå kommer du att loggas ut och använda din nya e-postadress för att logga in istället för din nuvarande autentiseringsmetod efter att du ställt in ditt lösenord genom att följa instruktionerna som kommer att skickas till din e-post.",
"reset_your_password": "Konfigurera ditt nya lösenord med instruktionerna som skickas till din e-postadress.",
"email_change": "Logga in igen med din nya e-postadress och lösenord.",
"create_your_account": "Skapa ditt konto",
"sign_up": "Registrera dig",
"youve_been_logged_out": "Du har loggats ut",
@ -243,6 +254,10 @@
"all": "Alla",
"yours": "Ditt konto",
"available_apps": "Tillgängliga appar",
"available_apps_lower_case": "Tillgängliga appar",
"available_apps_desc": "Du har inga appar installerade. Visa populära appar nedan och utforska mer i vår <1>App Store</1>",
"fixed_host_helper": "Lägg till alla som behöver delta i evenemanget. <1>Läs mer</1>",
"round_robin_helper": "Personer i gruppen turas om och endast en person kommer att dyka upp för evenemanget.",
"check_email_reset_password": "Kolla din e-post. Vi har skickat en länk till dig för att återställa ditt lösenord.",
"finish": "Slutför",
"organization_general_description": "Hantera inställningar för ditt teams språk och tidszon",
@ -251,6 +266,7 @@
"nearly_there_instructions": "Till sist så hjälper en kort beskrivning om dig själv och ett foto dig verkligen att få bokningar och andra kan veta vem de bokar med.",
"set_availability_instructions": "Definiera tidsintervall när du är tillgänglig på en återkommande basis. Du kan skapa fler av dessa senare och tilldela dem till olika kalendrar.",
"set_availability": "Ställ in din tillgänglighet",
"availability_settings": "Tillgänglighetsinställningar",
"continue_without_calendar": "Fortsätt utan kalender",
"connect_your_calendar": "Anslut din kalender",
"connect_your_video_app": "Anslut dina videoappar",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "Gruppbokningslänkar som kan skapas dynamiskt genom att lägga till flera användarnamn med ett '+'. Exempel: '{{appName}}/bailey+peer'",
"allow_dynamic_booking": "Tillåt deltagare att boka dig via dynamiska gruppbokningar",
"dynamic_booking": "Dynamiska grupplänkar",
"allow_seo_indexing": "Tillåt sökmotorer att komma åt ditt publika innehåll",
"seo_indexing": "Tillåt SEO-indexering",
"email": "E-post",
"email_placeholder": "jdoe@exempel.se",
"full_name": "Fullständigt namn",
@ -406,6 +424,7 @@
"booking_requested": "Bokning begärd",
"meeting_ended": "Mötet avslutat",
"form_submitted": "Formulär skickat",
"booking_paid": "Bokning betald",
"event_triggers": "Händelseutlösare",
"subscriber_url": "Prenumerantens URL",
"create_new_webhook": "Skapa en ny webhook",
@ -506,6 +525,7 @@
"your_name": "Ditt namn",
"your_full_name": "Ditt fullständiga namn",
"no_name": "Inget namn",
"enter_number_between_range": "Ange ett tal mellan 1 och {{maxOccurences}}",
"email_address": "E-postadress",
"enter_valid_email": "Ange en giltig e-postadress",
"location": "Plats",
@ -543,6 +563,7 @@
"leave": "Lämna",
"profile": "Profil",
"my_team_url": "Min team-URL",
"my_teams": "Mina team",
"team_name": "Teamnamn",
"your_team_name": "Ditt team-namn",
"team_updated_successfully": "Teamet har uppdaterats",
@ -570,6 +591,8 @@
"invite_new_member": "Bjud in en ny teammedlem",
"invite_new_member_description": "Obs! Detta kommer att <1>kosta en extra plats (150 kr/mån)</1> i din prenumeration.",
"invite_new_team_member": "Bjud in någon till ditt team.",
"upload_csv_file": "Ladda upp en .csv-fil",
"invite_via_email": "Bjud in via e-post",
"change_member_role": "Ändra teammedlemmens roll",
"disable_cal_branding": "Inaktivera {{appName}}-varumärke",
"disable_cal_branding_description": "Dölj all {{appName}} reklam från dina offentliga sidor.",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "Användaren måste acceptera inbjudan för att visa tillgängligheten",
"set_as_away": "Ställ in dig själv som inte tillgänglig",
"set_as_free": "Ställ av din status som inte tillgänglig",
"toggle_away_error": "Fel vid uppdatering av frånvarostatus",
"user_away": "Den här användaren är för inte tillgänglig.",
"user_away_description": "Personen du försöker boka har satt sig som inte tillgänglig och accepterar därför inte nya bokningar.",
"meet_people_with_the_same_tokens": "Träffa personer med samma tokens",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "Besök dina {{provider}} -kontoinställningar för att ändra din e-post, lösenord, aktivera tvåfaktorsautentisering mm.",
"signin_with_google": "Logga in med Google",
"signin_with_saml": "Logga in med SAML",
"signin_with_saml_oidc": "Logga in med SAML/OIDC",
"you_will_need_to_generate": "Du måste generera en åtkomsttoken från ditt gamla schemaläggningsverktyg.",
"import": "Importera",
"import_from": "Importera från",
@ -950,6 +975,8 @@
"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",
"seats_nearly_full": "Sittplatser nästan fulla",
"seats_half_full": "Sittplatser fylls snabbt",
"number_of_seats": "Antal platser per bokning",
"enter_number_of_seats": "Ange antal platser",
"you_can_manage_your_schedules": "Du kan hantera dina scheman på sidan Tillgänglighet.",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "Hur vill du lägga till {{appName}} till din webbplats?",
"choose_ways_put_cal_site": "Välj ett av följande sätt att lägga {{appName}} på din webbplats.",
"setting_up_zapier": "Ställa in din Zapier-integration",
"setting_up_make": "Konfigurera din Make-integration",
"generate_api_key": "Generera API-nyckel",
"generate_api_key_description": "Skapa en API-nyckel att använda med {{appName}} på",
"your_unique_api_key": "Din unika API-nyckel",
"copy_safe_api_key": "Kopiera denna API-nyckel och spara den någonstans säkert. Om du förlorar denna nyckel måste du skapa en ny.",
"zapier_setup_instructions": "<0>Logga in på ditt Zapier-konto och skapa en ny Zap.</0><1>Välj {{appName}} som din Trigger-app. Välj också en Trigger-händelse. /1><2>Välj ditt konto och ange sedan din unika API-nyckel.</2><3>Testa din Trigger.</3><4>Du är klar!</4>",
"make_setup_instructions": "<0>Gå till <1><0>Skapa inbjudningslänk</0></1> och installera Cal.com-appen.</0><1>Logga in på ditt Make-konto och skapa ett nytt Scenario.</1><2>Välj Cal.com som din Trigger-app. Välj också en triggerhändelse.</2><3>Välj ditt konto och ange sedan din unika API-nyckel.</3><4>Testa din trigger.</4><5>Du är redo!</5>",
"install_zapier_app": "Installera först Zapier-appen i appbutiken.",
"install_make_app": "Installera först Make-appen i appbutiken.",
"connect_apple_server": "Anslut till Apple Server",
"calendar_url": "Kalender-URL",
"apple_server_generate_password": "Skapa ett appspecifikt lösenord som du kan använda med {{appName}} på",
@ -1085,6 +1115,7 @@
"email_attendee_action": "skicka e-post till deltagare",
"sms_attendee_action": "Skicka SMS till deltagare",
"sms_number_action": "skicka SMS till ett specifikt nummer",
"send_reminder_sms": "Skicka enkelt mötespåminnelser via SMS till dina deltagare",
"whatsapp_number_action": "skicka Whatsapp till ett specifikt nummer",
"whatsapp_attendee_action": "skicka Whatsapp till deltagare",
"workflows": "Arbetsflöden",
@ -1244,6 +1275,7 @@
"error_updating_settings": "Fel vid uppdatering av inställningar",
"personal_cal_url": "Min personliga {{appName}}-URL",
"bio_hint": "Några meningar om dig själv. Detta kommer att visas på din personliga webbsida.",
"user_has_no_bio": "Den här användaren har inte lagt till en biografi ännu.",
"delete_account_modal_title": "Radera konto",
"confirm_delete_account_modal": "Är du säker på att du vill radera ditt {{appName}}-konto?",
"delete_my_account": "Radera mitt konto",
@ -1426,6 +1458,7 @@
"add_limit": "Lägg till gräns",
"team_name_required": "Teamnamn krävs",
"show_attendees": "Dela deltagarinformation mellan gäster",
"show_available_seats_count": "Visa antalet lediga platser",
"how_booking_questions_as_variables": "Hur används bokningsfrågor som variabler?",
"format": "Formatera",
"uppercase_for_letters": "Använd versaler för alla bokstäver",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Vill du verkligen ta bort {{connectionType}}-konfigurationen? Dina teammedlemmar som använder {{connectionType}}-inloggning kan inte längre komma åt Cal.com.",
"organizer_timezone": "Organisatörens tidszon",
"email_user_cta": "Visa inbjudan",
"email_no_user_invite_heading_team": "Du har blivit inbjuden att gå med i ett {{appName}}-team",
"email_no_user_invite_heading_org": "Du har blivit inbjuden att gå med i en {{appName}}-organisation",
"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_team": "{{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_user_invite_subheading_org": "{{invitedBy}} har bjudit in dig att gå med i deras organisation \"{{teamName}}\" på {{appName}}. {{appName}} är schemaläggaren som gör det möjligt för dig och din organisation att schemalägga möten utan e-posttennis.",
"email_no_user_invite_steps_intro": "Vi guidar dig genom några korta steg och du kommer att kunna schemalägga med din/ditt {{entity}} på nolltid utan stress.",
"email_no_user_step_one": "Välj ditt användarnamn",
"email_no_user_step_two": "Anslut ditt kalenderkonto",
@ -1831,6 +1867,8 @@
"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",
"something_went_wrong_on_our_end": "Något gick fel från vår sida. Kontakta vårt supportteam så fixar vi det åt dig direkt.",
"please_provide_following_text_to_suppport": "Ange följande text när du kontaktar supporten så att vi kan hjälpa dig bättre",
"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}}",
@ -1864,6 +1902,9 @@
"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 in våra vanliga frågor eller utforska avancerade inbäddningsalternativ.",
"book_my_cal": "Boka i min Cal",
"first_name": "Förnamn",
"last_name": "Efternamn",
"first_last_name": "Förnamn, Efternamn",
"invite_as": "Bjud in som",
"form_updated_successfully": "Formuläret har uppdaterats.",
"disable_attendees_confirmation_emails": "Inaktivera förinställda e-postbekräftelser för deltagare",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "Skapa din första webhook för denna händelsetyp",
"install_app_on": "Installera appen på",
"create_for": "Skapa för",
"currency": "Valuta",
"organization_banner_description": "Skapa miljöer där dina team kan skapa delade appar, arbetsflöden och händelsetyper med round-robin och kollektiv schemaläggning.",
"organization_banner_title": "Hantera organisationer med flera team",
"set_up_your_organization": "Konfigurera din organisation",
@ -1937,6 +1979,79 @@
"insights_team_filter": "Team: {{teamName}}",
"insights_user_filter": "Användare: {{userName}}",
"insights_subtitle": "Visa Insights-bokningar för dina händelser",
"location_options": "{{locationCount}} platsalternativ",
"custom_plan": "Anpassad plan",
"email_embed": "E-post inbäddad",
"add_times_to_your_email": "Välj några tillgängliga tider och bädda in dem i din e-post",
"select_time": "Välj tid",
"select_date": "Välj datum",
"see_all_available_times": "Se alla tillgängliga tider",
"org_team_names_example": "t.ex. marknadsföringsteam",
"org_team_names_example_1": "t.ex. marknadsföringsteam",
"org_team_names_example_2": "t.ex. säljteam",
"org_team_names_example_3": "t.ex. designteam",
"org_team_names_example_4": "t.ex. ingenjörsteam",
"org_team_names_example_5": "t.ex. dataanalytikerteam",
"org_max_team_warnings": "Du kommer att kunna lägga till fler team senare.",
"what_is_this_meeting_about": "Vad handlar det här mötet om?",
"add_to_team": "Lägg till i teamet",
"remove_users_from_org": "Ta bort användare från organisationen",
"remove_users_from_org_confirm": "Är du säker på att du vill ta bort {{userCount}} användare från denna organisation?",
"user_has_no_schedules": "Den här användaren har inte skapat några scheman ännu",
"user_isnt_in_any_teams": "Den här användaren är inte med i något team",
"requires_booker_email_verification": "Kräver e-postverifiering för bokare",
"description_requires_booker_email_verification": "För att säkerställa bokarens e-postverifiering före schemaläggning av evenemang",
"requires_confirmation_mandatory": "Textmeddelanden kan endast skickas till deltagare när evenemangstypen kräver bekräftelse.",
"kyc_verification_information": "För att garantera säkerheten måste du verifiera ditt {{teamOrAccount}} innan du skickar textmeddelanden till deltagare. Kontakta oss på <a>{{supportEmail}}</a> och ange följande information:",
"kyc_verification_documents": "<ul><li>Din {{teamOrUser}}</li><li>För företag: Bifoga din dokumentation för verifiering av företag</li><li>För privatpersoner: Bifoga ett statligt utfärdat ID-kort</li></ul>",
"verify_team_or_account": "Verifiera {{teamOrAccount}}",
"verify_account": "Verifiera konto",
"kyc_verification": "KYC-verifiering",
"organizations": "Organisationer",
"org_admin_other_teams": "Andra team",
"org_admin_other_teams_description": "Här kan du se team i din organisation som du inte är en del av. Du kan lägga till dem om det behövs.",
"no_other_teams_found": "Inga andra team hittades",
"no_other_teams_found_description": "Det finns inga andra team i denna organisation.",
"attendee_first_name_variable": "Deltagarens förnamn",
"attendee_last_name_variable": "Deltagarens efternamn",
"attendee_first_name_info": "Förnamnet på personen som bokat",
"attendee_last_name_info": "Efternamnet på personen som bokat",
"me": "Jag",
"verify_team_tooltip": "Verifiera ditt team för att aktivera att skicka meddelanden till deltagare",
"member_removed": "Medlem borttagen",
"my_availability": "Min tillgänglighet",
"team_availability": "Teamets tillgänglighet",
"backup_code": "Säkerhetskopiera kod",
"backup_codes": "Säkerhetskopiera koder",
"backup_code_instructions": "Varje säkerhetskopierad kod kan användas exakt en gång för att ge åtkomst utan din autentiserare.",
"backup_codes_copied": "Säkerhetskopierade koder kopierade!",
"incorrect_backup_code": "Den säkerhetskopierade koden är felaktig.",
"lost_access": "Förlorad åtkomst",
"missing_backup_codes": "Inga säkerhetskopieringskoder hittades. Generera dem i dina inställningar.",
"admin_org_notification_email_subject": "Ny organisation skapad: väntande åtgärd",
"hi_admin": "Hej administratör",
"admin_org_notification_email_title": "En organisation kräver DNS-inställning",
"admin_org_notification_email_body_part1": "En organisation med slug \"{{orgSlug}}\" skapades.<br /><br />Se till att konfigurera ditt DNS-register så att underdomänen motsvarar den nya organisationen där huvudappen körs. Annars kommer organisationen inte att fungera.<br /><br />Här är bara de allra grundläggande alternativen för att konfigurera en underdomän för att peka på deras app så den laddar organisationens profilsida.<br /><br />Du kan göra det antingen med A-posten:",
"admin_org_notification_email_body_part2": "Eller CNAME-posten:",
"admin_org_notification_email_body_part3": "När du har konfigurerat underdomänen, markera DNS-konfigurationen som gjort i organisationens admin-inställningar.",
"admin_org_notification_email_cta": "Gå till organisationens admin-inställningar",
"org_has_been_processed": "Org har behandlats",
"org_error_processing": "Det har uppstått ett fel vid behandlingen av denna organisation",
"orgs_page_description": "En lista över alla organisationer. Genom att acceptera en organisation kan alla användare med den e-postdomänen registrera sig UTAN e-postverifiering.",
"unverified": "Overifierad",
"dns_missing": "DNS saknas",
"mark_dns_configured": "Markera som DNS konfigurerad",
"value": "Värde",
"your_organization_updated_sucessfully": "Din organisation har uppdaterats",
"team_no_event_types": "Detta team har inga händelsetyper",
"seat_options_doesnt_multiple_durations": "Platsalternativet stöder inte flera varaktigheter",
"include_calendar_event": "Inkludera kalenderhändelse",
"recently_added": "Nyligen tillagda",
"no_members_found": "Inga medlemmar hittades",
"event_setup_length_error": "Konfigurering av evenemang: Längden måste vara minst 1 minut.",
"availability_schedules": "Scheman för tillgänglighet",
"view_only_edit_availability_not_onboarded": "Den här användaren har inte slutfört introduktionen. Du kommer inte att kunna ange deras tillgänglighet förrän de har slutfört introduktionen.",
"view_only_edit_availability": "Du tittar på användarens tillgänglighet. Du kan bara redigera din egen tillgänglighet.",
"edit_users_availability": "Redigera användarens tillgänglighet: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "Підтвердьте свою електронну адресу, щоб уникнути проблем із доставкою листів і даних календаря",
"verify_email_email_header": "Підтвердьте свою електронну адресу",
"verify_email_email_button": "Підтвердити ел. адресу",
"copy_somewhere_safe": "Збережіть цей ключ API у надійному місці. Ви не зможете знову його переглянути.",
"verify_email_email_body": "Підтвердьте свою електронну адресу, натиснувши кнопку нижче.",
"verify_email_by_code_email_body": "Підтвердьте свою електронну адресу, використавши нижчезазначений код.",
"verify_email_email_link_text": "Можете скористатися цим посиланням, якщо не любите натискати кнопки:",
"email_verification_code": "Ведіть код перевірки",
"email_verification_code_placeholder": "Введіть код перевірки, надісланий на вашу пошту",
"incorrect_email_verification_code": "Код перевірки неправильний.",
"email_sent": "Лист надіслано",
"email_not_sent": "Під час надсилання електронного листа сталася помилка",
"event_declined_subject": "Відхилено: {{title}}, {{date}}",
"event_cancelled_subject": "Скасовано: {{title}}, {{date}}",
"event_request_declined": "Ваш запит на захід відхилено",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "Періодичний захід чекає на ваше схвалення",
"someone_requested_an_event": "Хтось хоче запланувати захід у вашому календарі.",
"someone_requested_password_reset": "Хтось хоче змінити ваш пароль.",
"password_reset_email_sent": "Якщо ця електронна адреса є в нашій системі, ви отримаєте електронний лист для скидання.",
"password_reset_instructions": "Якщо ви не надсилали цього запиту, можете не звертати уваги на цей лист. Пароль не зміниться.",
"event_awaiting_approval_subject": "Очікування на схвалення: {{title}}, {{date}}",
"event_still_awaiting_approval": "Захід досі чекає на ваше схвалення",
@ -217,6 +224,10 @@
"already_have_an_account": "Уже маєте обліковий запис?",
"create_account": "Створити обліковий запис",
"confirm_password": "Підтвердити пароль",
"confirm_auth_change": "Це змінить спосіб входу",
"confirm_auth_email_change": "У результаті зміни електронної адреси буде від’єднано ваш поточний метод автентифікації для входу на Cal.com. Ми попросимо вас підтвердити вашу нову електронну адресу. Після налаштування пароля відповідно до інструкцій надісланих вам поштою вам потрібно буде вийти із системи й увійти за допомогою нової електронної адреси замість вашого поточного методу автентифікації.",
"reset_your_password": "Установіть новий пароль, дотримуючись інструкцій, надісланих на вашу електронну адресу.",
"email_change": "Увійдіть у систему за допомогою нової електронної адреси й пароля.",
"create_your_account": "Створіть власний обліковий запис",
"sign_up": "Реєстрація",
"youve_been_logged_out": "Ви вийшли із системи",
@ -243,6 +254,10 @@
"all": "Усі",
"yours": "Ваш обліковий запис",
"available_apps": "Доступні додатки",
"available_apps_lower_case": "Доступні додатки",
"available_apps_desc": "У вас немає встановлених додатків. Перегляньте популярні додатки нижче й дізнайтеся більше в <1>App Store</1>",
"fixed_host_helper": "Додайте осіб, які повинні бути присутніми на заході. <1>Докладніше</1>",
"round_robin_helper": "Учасники групи беруть участь по черзі, і на заході буде присутньою лише одна особа.",
"check_email_reset_password": "Перевірте електронну пошту. Ми надіслали вам посилання для скидання пароля.",
"finish": "Готово",
"organization_general_description": "Налаштуйте параметри мови й часового поясу для своєї команди",
@ -251,6 +266,7 @@
"nearly_there_instructions": "І останнє: стислі відомості про вас і ваше фото заохочуватимуть інших бронюванювати ваш час, адже вони бачитимуть, з ким домовляються.",
"set_availability_instructions": "Визначте повторювані діапазони часу, у які ви доступні. Ви зможете додати більше таких діапазонів пізніше та призначити їх різним календарям.",
"set_availability": "Укажіть, коли ви доступні",
"availability_settings": "Налаштування доступності",
"continue_without_calendar": "Продовжити без календаря",
"connect_your_calendar": "Підключити календар",
"connect_your_video_app": "Підключіть улюблені відеозастосунки",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "Посилання для групового бронювання, які можна створювати динамічно, додаючи кілька імен користувачів за допомогою «+». Приклад: «{{appName}}/bailey+peer»",
"allow_dynamic_booking": "Дозволити учасникам бронювати ваш час за допомогою динамічних групових бронювань",
"dynamic_booking": "Динамічні групові посилання",
"allow_seo_indexing": "Надати пошуковим системам доступ до вашого загальнодоступного вмісту",
"seo_indexing": "Дозволити SEO індексування",
"email": "Ел. адреса",
"email_placeholder": "vpetrenko@zrazok.com",
"full_name": "Ім’я і прізвище",
@ -406,6 +424,7 @@
"booking_requested": "Запит на бронювання надіслано",
"meeting_ended": "Нарада завершилася",
"form_submitted": "Форму надіслано",
"booking_paid": "Бронювання оплачено",
"event_triggers": "Тригери заходів",
"subscriber_url": "URL-адреса підписника",
"create_new_webhook": "Створити новий вебгук",
@ -506,6 +525,7 @@
"your_name": "Ваше ім’я",
"your_full_name": "Ваше повне ім’я",
"no_name": "Немає імені",
"enter_number_between_range": "Введіть число від 1 до {{maxOccurences}}",
"email_address": "Електронна адреса",
"enter_valid_email": "Введіть дійсну адресу електронної пошти",
"location": "Розташування",
@ -543,6 +563,7 @@
"leave": "Вийти",
"profile": "Профіль",
"my_team_url": "URL моєї команди",
"my_teams": "Мої команди",
"team_name": "Назва команди",
"your_team_name": "Назва вашої команди",
"team_updated_successfully": "Відомості про команду оновлено",
@ -570,6 +591,8 @@
"invite_new_member": "Запросити нового учасника команди",
"invite_new_member_description": "Зверніть увагу: у вашій підписці потрібно буде оплатити <1>одне додаткове місце (15 дол. США)</1>.",
"invite_new_team_member": "Запросіть когось у свою команду.",
"upload_csv_file": "Передати CSV-файл",
"invite_via_email": "Запросити електронною поштою",
"change_member_role": "Змініть роль учасника команди",
"disable_cal_branding": "Вимкнути фірмове оформлення {{appName}}",
"disable_cal_branding_description": "Приховайте весь брендинг {{appName}} зі своїх загальнодоступних сторінок.",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "Користувач має прийняти запрошення, щоб переглядати відомості про доступність команди",
"set_as_away": "Установити для себе стан «Не на місці»",
"set_as_free": "Вимкнути стан «Не на місці»",
"toggle_away_error": "Помилка оновлення стану «Не на місці»",
"user_away": "Цей користувач зараз не на місці.",
"user_away_description": "Користувач, час якого ви намагаєтеся забронювати, указав, що він зараз не на місці. Через це він не приймає нові бронювання.",
"meet_people_with_the_same_tokens": "Зустрічі з користувачами, у яких такі самі токени",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "Щоб змінити електронну адресу чи пароль, увімкнути двоетапну автентифікацію тощо, перейдіть до налаштувань свого облікового запису {{provider}}.",
"signin_with_google": "Увійдіть через Google",
"signin_with_saml": "Увійдіть через SAML",
"signin_with_saml_oidc": "Увійдіть через SAML/OIDC",
"you_will_need_to_generate": "Вам потрібно буде згенерувати токен доступу зі старого інструменту планування.",
"import": "Імпорт",
"import_from": "Імпортувати з",
@ -950,6 +975,8 @@
"offer_seats_description": "Пропонуйте місця під час бронювання (при цьому вимикається гостьовий режим і бронювання з підтвердженням).",
"seats_available_one": "Є доступне місце",
"seats_available_other": "Доступні місця",
"seats_nearly_full": "Місць майже не залишилось",
"seats_half_full": "Місця швидко займають",
"number_of_seats": "Кількість місць на одне бронювання",
"enter_number_of_seats": "Введіть кількість місць",
"you_can_manage_your_schedules": "Керувати розкладами можна на сторінці «Доступність».",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "Як саме ви хочете додати {{appName}} на свій сайт?",
"choose_ways_put_cal_site": "Виберіть один із наведених нижче способів розмістити {{appName}} на сайті.",
"setting_up_zapier": "Налаштування інтеграції із Zapier",
"setting_up_make": "Налаштування інтеграції з Make",
"generate_api_key": "Створити ключ API",
"generate_api_key_description": "Створіть ключ API для використання з {{appName}} на сайті",
"your_unique_api_key": "Ваш унікальний ключ API",
"copy_safe_api_key": "Скопіюйте цей ключ API і збережіть його в надійному місці. Якщо ви втратите цей ключ, потрібно буде створити новий.",
"zapier_setup_instructions": "<0>Увійдіть в обліковий запис Zapier та створіть Zap.</0><1>Виберіть Cal.com як додаток Trigger, а також укажіть подію Trigger.</1><2>Виберіть свій обліковий запис і введіть унікальний ключ API.</2><3>Перевірте тригер.</3><4>Усе готово!</4>",
"make_setup_instructions": "<0>Перейдіть<1><0>за посиланням у запрошенні Make</0></1> і встановіть додаток Cal.com.</0><1>Увійдіть у свій обліковий запис Make і створіть новий сценарій.</1><2>Виберіть Cal.com як додаток Trigger, а також укажіть подію Trigger.</2><3>Виберіть свій обліковий запис і введіть унікальний ключ API.</3><4>Перевірте Trigger.</4><5>Усе готово!</5>",
"install_zapier_app": "Спочатку встановіть додаток Zapier з App Store.",
"install_make_app": "Спочатку встановіть додаток Make з App Store.",
"connect_apple_server": "Підключитися до сервера Apple",
"calendar_url": "URL-адреса календаря",
"apple_server_generate_password": "Згенеруйте спеціальний пароль додатка для використання з {{appName}} за адресою",
@ -1085,6 +1115,7 @@
"email_attendee_action": "надіслати ел. лист учасникам",
"sms_attendee_action": "Надіслати SMS учаснику",
"sms_number_action": "надсилати SMS на певний номер",
"send_reminder_sms": "Легко відправляйте нагадування про зустріч в SMS вашим відвідувачам",
"whatsapp_number_action": "надсилати повідомлення у Whatsapp на певний номер",
"whatsapp_attendee_action": "надсилати повідомлення у Whatsapp учаснику",
"workflows": "Робочі процеси",
@ -1244,6 +1275,7 @@
"error_updating_settings": "Помилка оновлення параметрів",
"personal_cal_url": "Моя персональна URL-адреса {{appName}}",
"bio_hint": "Кілька речень про вас. Ця інформація з’явиться на сторінці за вашою URL-адресою.",
"user_has_no_bio": "Цей користувач ще не додав біографію.",
"delete_account_modal_title": "Видалення облікового запису",
"confirm_delete_account_modal": "Справді видалити свій обліковий запис {{appName}}?",
"delete_my_account": "Видалити мій обліковий запис",
@ -1426,6 +1458,7 @@
"add_limit": "Додати ліміт",
"team_name_required": "Назва команди обов’язкова",
"show_attendees": "Поширювати інформацію про учасників серед гостей",
"show_available_seats_count": "Показати кількість доступних місць",
"how_booking_questions_as_variables": "Як використовувати запитання про бронювання як змінні?",
"format": "Формат",
"uppercase_for_letters": "Використовувати всі великі літери",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Справді видалити конфігурацію {{connectionType}}? Учасники вашої команди, які входять через {{connectionType}}, не зможуть ввійти в Cal.com.",
"organizer_timezone": "Часовий пояс організатора",
"email_user_cta": "Переглянути запрошення",
"email_no_user_invite_heading_team": "Вас запрошено приєднатися до команди в застосунку {{appName}}",
"email_no_user_invite_heading_org": "Вас запрошено приєднатися до організації в застосунку {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} запрошує вас приєднатися до команди в {{appName}}. {{appName}} — планувальник подій, який дає змогу вам і вашій команді планувати зустрічі без тривалої переписки електронною поштою.",
"email_user_invite_subheading_team": "{{invitedBy}} запрошує вас приєднатися до команди «{{teamName}}» в {{appName}}. {{appName}} — планувальник подій, який дає змогу вам і вашій команді планувати зустрічі без тривалої переписки електронною поштою.",
"email_user_invite_subheading_org": "{{invitedBy}} запрошує вас приєднатися до організації «{{teamName}}» в застосунку {{appName}}. {{appName}} — планувальник подій, завдяки якому ви й ваша організація можете планувати наради без довгого листування.",
"email_no_user_invite_steps_intro": "Ми ознайомимо вас із застосунком, і вже скоро ви й ваша {{entity}} насолоджуватиметеся плануванням без жодного клопоту.",
"email_no_user_step_one": "Виберіть ім’я користувача",
"email_no_user_step_two": "Підключіть обліковий запис календаря",
@ -1831,6 +1867,8 @@
"insights_no_data_found_for_filter": "Не знайдено жодних даних для вибраного фільтра або вибраних дат.",
"acknowledge_booking_no_show_fee": "Я усвідомлюю, що в разі моєї відсутності на цьому заході з моєї картки буде стягнуто плату в розмірі {{amount, currency}}.",
"card_details": "Карткові реквізити",
"something_went_wrong_on_our_end": "Щось пішло не так на нашому боці. Зв’яжіться з нашою службою підтримки й ми одразу все виправимо.",
"please_provide_following_text_to_suppport": "Надайте нижчезазначений текст, звертаючись до служби підтримки, щоб нам було легше допомогти вам",
"seats_and_no_show_fee_error": "Зараз неможливо активувати місця і стягнути плату за відсутність",
"complete_your_booking": "Завершіть бронювання",
"complete_your_booking_subject": "Завершіть бронювання: {{title}} від {{date}}",
@ -1864,6 +1902,9 @@
"open_dialog_with_element_click": "Відкриває діалогове вікно з Cal у разі натискання елемента.",
"need_help_embedding": "Потрібна допомога? Перегляньте наші посібники з вбудовування Cal на Wix, Squarespace чи WordPress і ознайомтеся з поширеними запитаннями або розширеними параметрами вбудовування.",
"book_my_cal": "Забронювати на Cal.com",
"first_name": "Ім’я",
"last_name": "Прізвище",
"first_last_name": "Ім’я, прізвище",
"invite_as": "Запросити як",
"form_updated_successfully": "Форму оновлено.",
"disable_attendees_confirmation_emails": "Вимкнути листи підтвердження за замовчуванням для учасників",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "Створіть свій перший вебгук для цього типу заходів",
"install_app_on": "Установити застосунок у",
"create_for": "Створити для",
"currency": "Валюта",
"organization_banner_description": "Підготуйте середовища, де ваші команди можуть створювати спільні застосунки, робочі процеси й типи заходів із циклічним і колективним плануванням.",
"organization_banner_title": "Керування організаціями з кількома командами",
"set_up_your_organization": "Налаштуйте свою організацію",
@ -1937,6 +1979,79 @@
"insights_team_filter": "Команда: {{teamName}}",
"insights_user_filter": "Користувач: {{userName}}",
"insights_subtitle": "Переглядайте дані Insights про бронювання для своїх заходів",
"location_options": "Варіантів місць проведення: {{locationCount}}",
"custom_plan": "Користувацький план",
"email_embed": "Вбудовування в ел. пошту",
"add_times_to_your_email": "Виберіть кілька доступних часових проміжків і вбудуйте їх в електронний лист",
"select_time": "Виберіть час",
"select_date": "Виберіть дату",
"see_all_available_times": "Переглянути доступні часові проміжки",
"org_team_names_example": "напр. команда маркетингу",
"org_team_names_example_1": "напр. маркетинговий відділ",
"org_team_names_example_2": "напр. відділ продажів",
"org_team_names_example_3": "напр. дизайнерський відділ",
"org_team_names_example_4": "e.g. інженерний відділ",
"org_team_names_example_5": "e.g. відділ аналітики даних",
"org_max_team_warnings": "Ви зможете додати більше команд пізніше.",
"what_is_this_meeting_about": "Про що ця зустріч?",
"add_to_team": "Додати в команду",
"remove_users_from_org": "Видалити користувачів з організації",
"remove_users_from_org_confirm": "Справді видалити користувачів ({{userCount}}) із цієї організації?",
"user_has_no_schedules": "Цей користувач ще не налаштував розкладу",
"user_isnt_in_any_teams": "Цей користувач не входить до жодної команди",
"requires_booker_email_verification": "Потрібно підтвердження ел. адреси особи, які здійснює бронювання",
"description_requires_booker_email_verification": "Щоб забезпечити підтвердження ел. адреси особи, яка здійснює бронювання, до планування заходів",
"requires_confirmation_mandatory": "Текстові повідомлення можна надсилати лише учасникам, коли тип події вимагає підтвердження.",
"kyc_verification_information": "З міркувань безпеки потрібно підтвердити {{teamOrAccount}}, перш ніж надсилати текстові повідомлення учасникам. Зверніться до нас за адресою <a>{{supportEmail}}</a> і надайте таку інформацію:",
"kyc_verification_documents": "<ul><li>{{teamOrUser}}</li><li>Для бізнесу: надайте документи для перевірки бізнесу</li><li>Для фізичних осіб: надайте посвідчення особи державного зразка</li></ul>",
"verify_team_or_account": "Підтвердити {{teamOrAccount}}",
"verify_account": "Підтвердити обліковий запис",
"kyc_verification": "Перевірка KYC",
"organizations": "Організації",
"org_admin_other_teams": "Інші команди",
"org_admin_other_teams_description": "Тут ви можете побачити команди у вашій організації, до яких ви не приєдналися. За потреби ви можете приєднатися до них.",
"no_other_teams_found": "Не знайдено інших команд",
"no_other_teams_found_description": "У цій організації немає інших команд.",
"attendee_first_name_variable": "Ім’я учасника",
"attendee_last_name_variable": "Прізвище учасника",
"attendee_first_name_info": "Ім’я особи, яка бронює",
"attendee_last_name_info": "Прізвище особи, яка бронює",
"me": "Я",
"verify_team_tooltip": "Верифікуйте свою команду, щоб увімкнути надсилання повідомлень відвідувачам",
"member_removed": "Учасника вилучено",
"my_availability": "Моя доступність",
"team_availability": "Доступність команди",
"backup_code": "Резервний код",
"backup_codes": "Резервні коди",
"backup_code_instructions": "Кожен резервний код можна використовувати один раз, щоб надати доступ без автентифікатора.",
"backup_codes_copied": "Резервні коди скопійовані!",
"incorrect_backup_code": "Неправильний резервний код.",
"lost_access": "Втрачено доступ",
"missing_backup_codes": "Не знайдено резервних кодів. Створіть їх у налаштуваннях.",
"admin_org_notification_email_subject": "Створено нову організацію: очікується дія",
"hi_admin": "Вітаємо, адміністраторе",
"admin_org_notification_email_title": "Організації потрібно налаштувати DNS",
"admin_org_notification_email_body_part1": "Створено організацію з URL-адресою «{{orgSlug}}».<br /><br />Налаштуйте реєстр DNS, щоб піддомен, який відповідає новій організації, указував на те місце, де запущено основний застосунок. Інакше організація не працюватиме.<br /><br />Ось кілька базових варіантів того, як налаштувати, щоб піддомен вказував на відповідний застосунок і завантажував сторінку профілю організації.<br /><br />Це можна зробити за допомогою запису А:",
"admin_org_notification_email_body_part2": "Або запису CNAME:",
"admin_org_notification_email_body_part3": "Щойно ви налаштуєте піддомен, вкажіть в налаштуваннях адміністратора організації, що налаштування DNS виконано.",
"admin_org_notification_email_cta": "Перейти до налаштувань адміністратора організації",
"org_has_been_processed": "Організація обробляється",
"org_error_processing": "Під час обробки цієї організації сталася помилка",
"orgs_page_description": "Список всіх організацій. Після прийняття організації всі користувачі із цим доменом електронної пошти зможуть зареєструватися без підтвердження електронної адреси.",
"unverified": "Не підтверджено",
"dns_missing": "Відсутній DNS",
"mark_dns_configured": "Позначити DNS налаштованим",
"value": "Значення",
"your_organization_updated_sucessfully": "Організацію оновлено",
"team_no_event_types": "У цієї команди немає типів заходів",
"seat_options_doesnt_multiple_durations": "Параметр «Місця» не підтримує декілька варіантів тривалості",
"include_calendar_event": "Включити календарний захід",
"recently_added": "Нещодавно додані",
"no_members_found": "Учасників не знайдено",
"event_setup_length_error": "Налаштування заходу: мінімальна тривалість — 1 хвилина.",
"availability_schedules": "Розклад доступності",
"view_only_edit_availability_not_onboarded": "Цей користувач не завершив ознайомлення. Доки він не зробить цього, ви не зможете налаштувати доступність для нього.",
"view_only_edit_availability": "Ви переглядаєте доступність цього користувача. Ви можете редагувати лише свою доступність.",
"edit_users_availability": "Редагувати доступність користувача: {{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "Xác minh địa chỉ email của bạn nhằm bảo đảm khả năng gửi email và lịch hẹn tốt nhất",
"verify_email_email_header": "Xác minh địa chỉ email của bạn",
"verify_email_email_button": "Xác minh email",
"copy_somewhere_safe": "Lưu khoá API này ở nơi an toàn. Bạn sẽ không thể xem nó lại.",
"verify_email_email_body": "Vui lòng xác minh địa chỉ email của bạn bằng cách nhấp vào nút bên dưới.",
"verify_email_by_code_email_body": "Vui lòng xác minh địa chỉ email của bạn bằng cách sử dụng mã bên dưới.",
"verify_email_email_link_text": "Đây là liên kết phòng trường hợp bạn không thích nhấp vào nút:",
"email_verification_code": "Nhập mã xác minh",
"email_verification_code_placeholder": "Nhập mã xác minh được gửi đến hộp thư của bạn",
"incorrect_email_verification_code": "Mã xác minh sai.",
"email_sent": "Email đã gửi thành công",
"email_not_sent": "Có lỗi trong lúc gửi email",
"event_declined_subject": "Đã từ chối: {{title}} tại {{date}}",
"event_cancelled_subject": "Đã hủy: {{title}} vào {{date}}",
"event_request_declined": "Lời mời sự kiện của bạn đã bị từ chối",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "Một sự kiện định kỳ đang chờ sự chấp thuận của bạn",
"someone_requested_an_event": "Ai đó đã yêu cầu đặt sự kiện trên lịch của bạn.",
"someone_requested_password_reset": "Ai đó đã yêu cầu link để đổi mật khẩu của bạn.",
"password_reset_email_sent": "Nếu email này tồn tại trong hệ thống của bạn, bạn nên nhận một email đặt lại.",
"password_reset_instructions": "Nếu bạn không yêu cầu link này, bạn có thể yên tâm bỏ qua email này và mật khẩu của bạn sẽ không bị đổi.",
"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",
@ -217,6 +224,10 @@
"already_have_an_account": "Bạn đã có sẵn tài khoản?",
"create_account": "Tạo tài khoản",
"confirm_password": "Xác nhận mật khẩu",
"confirm_auth_change": "Thao tác này sẽ thay đổi cách thức bạn đăng nhập",
"confirm_auth_email_change": "Việc thay đổi địa chỉ email sẽ gây ngắt kết nối cho phương thức xác thực hiện tại mà bạn dùng để đăng nhập Cal.com. Chúng tôi sẽ yêu cầu bạn xác minh địa chỉ email mới. Sau đó, bạn sẽ được đăng xuất và sử dụng địa chỉ email mới để đăng nhập thay cho phương thức xác thực hiện tại sau khi thiết lập mật khẩu bằng cách làm theo các chỉ dẫn được gủi đến hộp thư của bạn.",
"reset_your_password": "Thiết lập mật khẩu mới bằng những chỉ dẫn được gửi đến địa chỉ email của bạn.",
"email_change": "Đăng nhập trở lại bằng địa chỉ email và mật khẩu mới.",
"create_your_account": "Tạo tài khoản của bạn",
"sign_up": "Đăng ký",
"youve_been_logged_out": "Bạn đã đăng xuất",
@ -243,6 +254,10 @@
"all": "Tất cả",
"yours": "Tài khoản của bạn",
"available_apps": "Ứng dụng hiện có",
"available_apps_lower_case": "Ứng dụng hiện có",
"available_apps_desc": "Bạn chưa cài đặt ứng dụng nào. Xem những ứng dụng được chuộng bên dưới và khám phá thêm trong <1>App Store</1>",
"fixed_host_helper": "Thêm bất kì ai cần tham dự sự kiện. <1>Tìm hiểu thêm</1>",
"round_robin_helper": "Những người trong nhóm thay phiên và chỉ một người xuất hiện cho sự kiện này.",
"check_email_reset_password": "Kiểm tra hộp thư điện tử của bạn. Chúng tôi đã gửi cho bạn một liên kết để đặt lại mật khẩu của bạn.",
"finish": "Hoàn thành",
"organization_general_description": "Quản lí cài đặt cho ngôn ngữ và múi giờ của nhóm bạn",
@ -251,6 +266,7 @@
"nearly_there_instructions": "Điều cuối cùng, mô tả ngắn gọn về bạn và một bức ảnh để giúp bạn nhận lịch hẹn dễ hơn và cho mọi người biết họ đang đặt lịch hẹn với ai.",
"set_availability_instructions": "Xác định những phạm vi thời gian bạn có thể chấp nhận lịch hẹn định kỳ. Bạn có thể tạo thêm phạm vi thời gian này sau và gán chúng vào các lịch khác nhau.",
"set_availability": "Đặt lịch khả dụng của bạn",
"availability_settings": "Thiết lập tình trạng trống lịch",
"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 ứng dụng video của bạn",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "Những liên kết đặt chỗ nhóm vốn có thể được tạo linh động bằng cách thêm nhiều tên người dùng bằng một dấu '+'. Ví dụ như '{{appName}}/bailey+peer'",
"allow_dynamic_booking": "Cho phép người tham gia đặt chỗ cho bạn thông qua chức năng đặt chỗ động cho nhóm",
"dynamic_booking": "Liên kết động cho nhóm",
"allow_seo_indexing": "Cho phép các công cụ tìm kiếm truy cập nội dung công cộng của bạn",
"seo_indexing": "Cho phép lập chỉ mục SEO",
"email": "Email",
"email_placeholder": "nvana@vidu.com",
"full_name": "Họ và tên",
@ -406,6 +424,7 @@
"booking_requested": "Lịch hẹn đã được yêu cầu",
"meeting_ended": "Cuộc họp đã kết thúc",
"form_submitted": "Biểu mẫu đã được gửi",
"booking_paid": "Lịch hẹn đã thanh toán",
"event_triggers": "Sự kiện kích hoạt",
"subscriber_url": "URL người đăng ký",
"create_new_webhook": "Tạo một webhook mới",
@ -506,6 +525,7 @@
"your_name": "Tên của bạn",
"your_full_name": "Tên đầy đủ của bạn",
"no_name": "Không tên",
"enter_number_between_range": "Vui lòng nhập một số từ 1 đến {{maxOccurences}}",
"email_address": "Địa chỉ email",
"enter_valid_email": "Vui lòng điền vào email hợp lệ",
"location": "Vị trí",
@ -543,6 +563,7 @@
"leave": "Rời bỏ",
"profile": "Hồ sơ",
"my_team_url": "URL nhóm của tôi",
"my_teams": "Nhóm của tôi",
"team_name": "Tên nhóm",
"your_team_name": "Tên nhóm của bạn",
"team_updated_successfully": "Đã cập nhật nhóm thành công",
@ -570,6 +591,8 @@
"invite_new_member": "Mời một thành viên mới",
"invite_new_member_description": "Lưu ý: Việc này sẽ <1>mất phí bổ sung chỗ ngồi (15$/tháng)</1> cho gói đăng ký của bạn.",
"invite_new_team_member": "Mời ai đó vào nhóm của bạn.",
"upload_csv_file": "Tải lên một file .csv",
"invite_via_email": "Mời qua email",
"change_member_role": "Thay đổi vai trò thành viên trong nhóm",
"disable_cal_branding": "Tắt thương hiệu {{appName}}",
"disable_cal_branding_description": "Ẩn tất cả thương hiệu {{appName}} khỏi các trang công khai của bạn.",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "Người dùng cần chấp nhận lời mời để xem lịch khả dụng",
"set_as_away": "Đặt trạng thái đi vắng",
"set_as_free": "Tắt trạng thái đi vắng",
"toggle_away_error": "Lỗi khi cập nhật trạng thái đi vắng",
"user_away": "Người dùng này hiện đang đi vắng.",
"user_away_description": "Người mà bạn đang cố gắng đặt lịch hẹn đã đặt trạng thái đi vắng, và do đó không chấp nhận các lịch hẹn mới.",
"meet_people_with_the_same_tokens": "Gặp gỡ những người có cùng mã token",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "Để thay đổi email, mật khẩu, bật xác thực hai yếu tố và những thứ khác, vui lòng truy cập cài đặt tài khoản {{provider}} của bạn.",
"signin_with_google": "Đăng nhập bằng Google",
"signin_with_saml": "Đăng nhập bằng SAML",
"signin_with_saml_oidc": "Đăng nhập bằng SAML/OIDC",
"you_will_need_to_generate": "Bạn sẽ cần tạo mã access token từ công cụ lập lịch cũ của mình.",
"import": "Nhập",
"import_from": "Nhập từ",
@ -950,6 +975,8 @@
"offer_seats_description": "Cung cấp ghế để đặt lịch. Việc này sẽ tự động vô hiệu hoá đặt lịch của khách & đặt lịch tham gia.",
"seats_available_one": "Số ghế trống",
"seats_available_other": "Số ghế trống",
"seats_nearly_full": "Gần hết chỗ ngồi",
"seats_half_full": "Chỗ ngồi sắp hết",
"number_of_seats": "Số ghế cho mỗi lần đặt",
"enter_number_of_seats": "Điền vào số lượng ghế",
"you_can_manage_your_schedules": "Bạn có thể quản lý lịch biểu của mình trên trang \bLịch khả dụng.",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "Bạn muốn thêm {{appName}} vào website của mình bằng cách nào?",
"choose_ways_put_cal_site": "Chọn một trong những cách sau để đặt {{appName}} trên website.",
"setting_up_zapier": "Thiết lập tích hợp Zapier của bạn",
"setting_up_make": "Thiết lập tích hợp Make của bạn",
"generate_api_key": "Tạo khoá API",
"generate_api_key_description": "Tạo một khoá API để sử dụng với {{appName}} tại",
"your_unique_api_key": "Khoá API đặc trưng của bạn",
"copy_safe_api_key": "Sao chép khoá API này và lưu nó ở nơi an toàn. Nếu bạn làm mất khoá này, bạn phải tạo khoá mới.",
"zapier_setup_instructions": "<0>Đăng nhập vào tài khoản Zapier của bạn và tạo một Zap mới.</0><1>Chọn {{appName}} làm ứng dụng Trigger của bạn. Đồng thời chọn một sự kiện Trigger.</1><2>Chọn tài khoản của bạn và sau đó điền vào Khoá API đặc trưng.</2><3>Thử nghiệm Trigger của bạn.</3><4>Bạn đã xong!</4>",
"make_setup_instructions": "<0>Đến <1><0>Liên kết mời Make</0></1> và cài đặt ứng dụng Cal.com.</0><1>Đăng nhập vào tài khoản Make của bạn và tạo một Scenario mới.</1><2>Chọn Cal.com làm ứng dụng Trigger của bạn. Đồng thời chọn một sự kiện Trigger.</2><3>Chọn tài khoản của bạn và sau đó điền vào Khoá API đặc trưng.</3><4>Thử nghiệm Trigger của bạn.</4><5>Bạn đã xong!</5>",
"install_zapier_app": "Trước tiên hãy cài đặt ứng dụng Zapier trong App Store.",
"install_make_app": "Trước tiên hãy cài đặt ứng dụng Make trong App Store.",
"connect_apple_server": "Kết nối với Máy chủ Apple",
"calendar_url": "URL lịch",
"apple_server_generate_password": "Tạo một mật khẩu chuyên dùng cho ứng dụng để sử dụng với {{appName}} tại",
@ -1085,6 +1115,7 @@
"email_attendee_action": "gửi email đến người tham gia",
"sms_attendee_action": "Gửi SMS đến người tham gia",
"sms_number_action": "gửi SMS đến một số cụ thể",
"send_reminder_sms": "Dễ dàng gửi lời nhắc họp qua SMS đến người tham dự",
"whatsapp_number_action": "gửi WhatsApp đến một số cụ thể",
"whatsapp_attendee_action": "gửi WhatsApp đến người tham gia",
"workflows": "Tiến độ công việc",
@ -1244,6 +1275,7 @@
"error_updating_settings": "Lỗi khi cập nhật cài đặt",
"personal_cal_url": "URL {{appName}} cá nhân của tôi",
"bio_hint": "Nói mấy lời về bản thân. Thông tin này sẽ xuất hiện trên trang url cá nhân của bạn.",
"user_has_no_bio": "Người dùng này chưa thêm vào tiểu sử.",
"delete_account_modal_title": "Xoá tài khoản",
"confirm_delete_account_modal": "Bạn có chắc chắn muốn xoá tài khoản {{appName}}?",
"delete_my_account": "Xoá tài khoản của tôi",
@ -1426,6 +1458,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",
"show_available_seats_count": "Hiện số ghế ngồi còn trống",
"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",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "Bạn có chắc chắn muốn xóa cấu hình {{connectionType}} không? Các thành viên trong nhóm của bạn sử dụng thông tin đăng nhập {{connectionType}} sẽ không thể truy cập vào Cal.com được nữa.",
"organizer_timezone": "Múi giờ của người tổ chức",
"email_user_cta": "Xem lời mời",
"email_no_user_invite_heading_team": "Bạn đã được mời gia nhập nhóm {{appName}}",
"email_no_user_invite_heading_org": "Bạn đã được mời gia nhập tổ chức {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} đã mời bạn gia nhập nhóm của họ trên {{appName}}. {{appName}} là công cụ lên lịch sắp xếp sự kiện cho phép bạn và nhóm bạn lên lịch các cuộc gặp mà không cần trao đổi email nhiều.",
"email_user_invite_subheading_team": "{{invitedBy}} đã mời bạn gia nhập nhóm '{{teamName}}' của họ trên {{appName}}. {{appName}} là công cụ lên lịch sắp xếp sự kiện cho phép bạn và nhóm bạn lên lịch các cuộc gặp mà không cần trao đổi email nhiều.",
"email_user_invite_subheading_org": "{{invitedBy}} đã mời bạn gia nhập tổ chức '{{teamName}}' của họ trên {{appName}}. {{appName}} là công cụ lên lịch sắp xếp sự kiện cho phép bạn và tổ chức của bạn lên lịch các cuộc gặp mà không cần trao đổi email nhiều.",
"email_no_user_invite_steps_intro": "Chúng tôi sẽ hướng dẫn cho bạn qua vài bước nhỏ và bạn sẽ tận hưởng được ngay cảm giác thoải mái không căng thẳng trong việc lên lịch cùng {{entity}} của mình.",
"email_no_user_step_one": "Chọn tên người dùng của bạn",
"email_no_user_step_two": "Kết nối tài khoản lịch của bạn",
@ -1831,6 +1867,8 @@
"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 là {{amount, currency}} sẽ được áp dụng cho thẻ của tôi.",
"card_details": "Chi tiết thẻ",
"something_went_wrong_on_our_end": "Bên chúng tôi có sự cố. Hãy liên lạc với nhóm hỗ trợ của chúng tôi, và chúng tôi sẽ cho khắc phục ngay cho bạn.",
"please_provide_following_text_to_suppport": "Vui lòng cung cấp tin nhắn sau khi liên lạc bộ phận hỗ trợ để được trợ giúp tốt hơn",
"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",
"complete_your_booking_subject": "Hoàn thành lịch hẹn của bạn: {{title}} vào {{date}}",
@ -1864,6 +1902,9 @@
"open_dialog_with_element_click": "Mở hộp thoại Cal khi ai đó nhấp vào một phần tử.",
"need_help_embedding": "Cần trợ giúp? Xem hướng dẫn của chúng tôi dành cho việc nhúng Cal trên Wix, Squarespace hoặc WordPress, xem qua những câu hỏi thường gặp của chúng tôi, hoặc khám phá thêm các tuỳ chọn nhúng nâng cao.",
"book_my_cal": "Đặt lịch Cal của tôi",
"first_name": "Tên",
"last_name": "Họ",
"first_last_name": "Tên, Họ",
"invite_as": "Mời ở vai trò",
"form_updated_successfully": "Đã cập nhật biểu mẫu thành công.",
"disable_attendees_confirmation_emails": "Vô hiệu hoá những email xác nhận mặc định dành cho người tham dự",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "Tạo webhook đầu tiên của bạn cho loại sự kiện này",
"install_app_on": "Cài đặt ứng dụng cho",
"create_for": "Tạo cho",
"currency": "Tiền tệ",
"organization_banner_description": "Tạo môi trường tại đó các nhóm của bạn có thể tạo những ứng dụng, tiến độ công việc và loại sự kiện mà có thể chia sẻ được, với chức năng đặt lịch dạng round-robin và tập thể.",
"organization_banner_title": "Quản lý các tổ chức có nhiều nhóm",
"set_up_your_organization": "Thiết lập tổ chức của bạn",
@ -1937,6 +1979,22 @@
"insights_team_filter": "Nhóm: {{teamName}}",
"insights_user_filter": "Người dùng: {{userName}}",
"insights_subtitle": "Xem insights của đặt lịch ở mọi sự kiện của bạn",
"location_options": "{{locationCount}} lựa chọn vị trí",
"custom_plan": "Gói Tuỳ chỉnh",
"email_embed": "Email đã nhúng",
"add_times_to_your_email": "Chọn một số thời gian trống và nhúng chúng vào trong Email của bạn",
"select_time": "Chọn thời gian",
"select_date": "Chọn ngày",
"see_all_available_times": "Xem tất cả những thời gian trống",
"org_team_names_example": "ví dụ Nhóm Tiếp thị",
"org_team_names_example_1": "ví dụ Nhóm Tiếp thị",
"org_team_names_example_2": "ví dụ Nhóm Kinh doanh",
"org_team_names_example_3": "ví dụ Nhóm Thiết kế",
"org_team_names_example_4": "ví dụ Nhóm Kỹ thuật",
"org_team_names_example_5": "ví dụ Nhóm Phân tích dữ liệu",
"org_max_team_warnings": "Bạn sẽ có thể thêm vào nhiều nhóm nữa sau này.",
"what_is_this_meeting_about": "Cuộc họp này về điều gì?",
"add_to_team": "Thêm vào nhóm",
"remove_users_from_org": "Xoá bỏ người dùng khỏi tổ chức",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -19,8 +19,13 @@
"verify_email_email_button": "验证电子邮件",
"copy_somewhere_safe": "将此 API 密钥保存在安全的地方。您将无法再次查看它。",
"verify_email_email_body": "请点击下面的按钮来验证您的电子邮件地址。",
"verify_email_by_code_email_body": "请使用下面的代码验证您的电子邮件地址。",
"verify_email_email_link_text": "如果您不喜欢点击按钮,请点击以下链接:",
"email_verification_code": "输入验证码",
"email_verification_code_placeholder": "输入发送到您邮箱的验证码",
"incorrect_email_verification_code": "验证码不正确。",
"email_sent": "电子邮件已成功发送",
"email_not_sent": "发送电子邮件时出错",
"event_declined_subject": "拒绝:{{title}} 在 {{date}}",
"event_cancelled_subject": "已取消:{{date}} 的 {{title}}",
"event_request_declined": "您的活动预约请求已被拒绝",
@ -79,6 +84,7 @@
"event_awaiting_approval_recurring": "有定期活动正在等待您的批准",
"someone_requested_an_event": "有人请求在您的日历上安排一个活动。",
"someone_requested_password_reset": "有人请求了更改密码链接。",
"password_reset_email_sent": "如果我们的系统中存在此邮箱,您应该会收到一封重置电子邮件。",
"password_reset_instructions": "如果您没有这样请求,您可以安全地忽略此邮件,您的密码将不会被更改。",
"event_awaiting_approval_subject": "等待批准:{{date}} 的 {{title}}",
"event_still_awaiting_approval": "有活动仍在等待您的批准",
@ -218,6 +224,10 @@
"already_have_an_account": "已经有帐号?",
"create_account": "创建账户",
"confirm_password": "确认密码",
"confirm_auth_change": "这将更改您的登录方式",
"confirm_auth_email_change": "更改电子邮件地址将断开您当前登录 Cal.com 的身份验证方法。我们将要求您验证您的新电子邮件地址。接下来,在按照发送到您邮箱的说明设置密码后,您将被注销并使用新的电子邮件地址登录,而不是当前的身份验证方法。",
"reset_your_password": "按照发送到您的电子邮件地址的说明设置新密码。",
"email_change": "使用您的新电子邮件地址和密码重新登录。",
"create_your_account": "创建您的账户",
"sign_up": "注册",
"youve_been_logged_out": "您已登出",
@ -246,6 +256,8 @@
"available_apps": "可用应用",
"available_apps_lower_case": "可用的应用",
"available_apps_desc": "您尚未安装任何应用。在我们的<1>应用商店</1>中查看热门应用,并探索更多内容。",
"fixed_host_helper": "添加任何需要参加活动的人。<1>了解更多</1>",
"round_robin_helper": "组中的人员轮流参加,只有一个人将出席活动。",
"check_email_reset_password": "请检查您的邮箱,我们向您发送了一个重置密码的链接。",
"finish": "完成",
"organization_general_description": "管理您的团队语言和时区的设置",
@ -254,6 +266,7 @@
"nearly_there_instructions": "最后,您的个人简介和照片有助于您获得预约,并让人们了解他们的预约对象。",
"set_availability_instructions": "设置您通常可预约的时间范围。您可以稍后创建更多时间范围并将其分配到不同的日历。",
"set_availability": "设置您的可预约状态",
"availability_settings": "可预约时间设置",
"continue_without_calendar": "无日历继续",
"connect_your_calendar": "连接您的日历",
"connect_your_video_app": "连接您的视频应用",
@ -395,6 +408,8 @@
"allow_dynamic_booking_tooltip": "可以动态创建组预约链接,方法为使用 '+' 来添加多个用户名。例如: '{{appName}}/bailey+peer'",
"allow_dynamic_booking": "允许参与者通过动态组预约来向您预约",
"dynamic_booking": "动态组链接",
"allow_seo_indexing": "允许搜索引擎访问您的公开内容",
"seo_indexing": "允许 SEO 索引",
"email": "邮箱地址",
"email_placeholder": "jdoe@example.com",
"full_name": "全名",
@ -510,6 +525,7 @@
"your_name": "您的姓名",
"your_full_name": "您的全名",
"no_name": "无名称",
"enter_number_between_range": "请输入一个介于 1 和 {{maxOccurences}} 之间的数字",
"email_address": "邮箱地址",
"enter_valid_email": "请输入有效的电子邮件",
"location": "位置",
@ -547,6 +563,7 @@
"leave": "退出",
"profile": "个人资料",
"my_team_url": "我的团队链接",
"my_teams": "我的团队",
"team_name": "团队名称",
"your_team_name": "您的团队名称",
"team_updated_successfully": "团队更新成功",
@ -574,6 +591,8 @@
"invite_new_member": "邀请新的团队成员",
"invite_new_member_description": "注意:这将在您订阅的基础上<1>收取一个额外位置的费用(15 美元/月)</1>",
"invite_new_team_member": "邀请某人加入您的团队。",
"upload_csv_file": "上传 .csv 文件",
"invite_via_email": "通过电子邮件邀请",
"change_member_role": "更改团队成员角色",
"disable_cal_branding": "禁用 {{appName}} 品牌标志",
"disable_cal_branding_description": "隐藏您的公共页面中所有 {{appName}} 品牌标志。",
@ -846,6 +865,7 @@
"team_view_user_availability_disabled": "用户需要接受邀请以查看可预约时间",
"set_as_away": "将自己设置为离开",
"set_as_free": "关闭离开状态",
"toggle_away_error": "更新离开状态时出错",
"user_away": "此用户目前处于离开状态。",
"user_away_description": "您试图预约的人已将自己置于离开状态,因此不接受新预约。",
"meet_people_with_the_same_tokens": "会见使用相同令牌的人",
@ -855,6 +875,7 @@
"account_managed_by_identity_provider_description": "要更改您的电子邮件,密码,启用两步验证及更多功能,请访问您的 {{provider}} 账户设置。",
"signin_with_google": "使用Google登录",
"signin_with_saml": "使用 SAML 登录",
"signin_with_saml_oidc": "使用 SAML/OIDC 登录",
"you_will_need_to_generate": "您需要从从您的旧工具上生成访问令牌",
"import": "导入",
"import_from": "导入自",
@ -954,6 +975,8 @@
"offer_seats_description": "提供位置以供预约 (这将自动禁止访客和选择加入预约)。",
"seats_available_one": "可用位置",
"seats_available_other": "可用位置",
"seats_nearly_full": "位置几乎已满",
"seats_half_full": "位置迅速填满",
"number_of_seats": "每个预约的位置数目",
"enter_number_of_seats": "输入位置数目",
"you_can_manage_your_schedules": "您可以在“可预约时间”页面管理您的时间表。",
@ -1034,12 +1057,15 @@
"how_you_want_add_cal_site": "您希望如何将 {{appName}} 添加到您的网站?",
"choose_ways_put_cal_site": "选择下列方式之一将 {{appName}} 放到您的网站上。",
"setting_up_zapier": "设置您的 Zapier 集成",
"setting_up_make": "设置您的 Make 集成",
"generate_api_key": "生成 API 密钥",
"generate_api_key_description": "生成 API 密钥以将 {{appName}} 配合用于",
"your_unique_api_key": "您的唯一 API 密钥",
"copy_safe_api_key": "复制此 API 密钥并将其保存在安全的位置。如果丢失此密钥,则必须生成新的密钥。",
"zapier_setup_instructions": "<0>登录您的 Zapier 帐户并创建新的 Zap。</0><1>将 Cal.com 选择为 Trigger 应用。同时选择一个 Trigger 事件。</1><2>选择您的帐户,然后输入您的唯一 API 密钥。</2><3>测试您的 Trigger。</3><4>设置完毕!</4>",
"make_setup_instructions": "<0>转到 <1><0>Make 邀请链接</0></1>并安装 Cal.com 应用。</0><1>登录您的 Make 账户并创建一个新 Scenario。</1><2>选择 Cal.com 作为您的 Trigger 应用。同时选择一个 Trigger 事件。</2><3>选择您的账户,然后输入您的唯一 API 密钥。</3><4>测试您的 Trigger。</4><5>设置完毕!</5>",
"install_zapier_app": "请首先从 App Store 安装 Zapier 应用。",
"install_make_app": "请先在 App Store 安装 Make 应用。",
"connect_apple_server": "连接到 Apple 服务器",
"calendar_url": "日历链接",
"apple_server_generate_password": "生成应用特定的密码以将 {{appName}} 配合用于",
@ -1089,6 +1115,7 @@
"email_attendee_action": "向参与者发送电子邮件",
"sms_attendee_action": "向参与者发送短信",
"sms_number_action": "向特定号码发送短信",
"send_reminder_sms": "通过短信轻松向参与者发送会议提醒",
"whatsapp_number_action": "向特定号码发送 Whatsapp",
"whatsapp_attendee_action": "向参与者发送 Whatsapp",
"workflows": "工作流程",
@ -1248,6 +1275,7 @@
"error_updating_settings": "更新设置时出错",
"personal_cal_url": "我的个人 {{appName}} URL",
"bio_hint": "请写一段简单的自我介绍,该介绍将会展示在您的个人 url 页面上。",
"user_has_no_bio": "此用户尚未添加个人简历。",
"delete_account_modal_title": "删除账户",
"confirm_delete_account_modal": "您确定要删除您的 {{appName}} 账户吗?",
"delete_my_account": "删除我的账户",
@ -1430,6 +1458,7 @@
"add_limit": "添加限制",
"team_name_required": "需要团队名称",
"show_attendees": "在访客之间共享参与者信息",
"show_available_seats_count": "显示可用位置数",
"how_booking_questions_as_variables": "如何将预约问题用作变量?",
"format": "格式",
"uppercase_for_letters": "所有字母均使用大写",
@ -1663,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "确定要删除 {{connectionType}} 配置吗?使用 {{connectionType}} 登录的团队成员将无法再访问 Cal.com。",
"organizer_timezone": "组织者时区",
"email_user_cta": "查看邀请",
"email_no_user_invite_heading_team": "您已被邀请加入 {{appName}} 团队",
"email_no_user_invite_heading_org": "您已被邀请加入 {{appName}} 组织",
"email_no_user_invite_subheading": "{{invitedBy}} 已邀请您加入他们在 {{appName}} 上的团队。{{appName}} 是一个活动安排调度程序,让您和您的团队无需通过电子邮件沟通即可安排会议。",
"email_user_invite_subheading_team": "{{invitedBy}} 已邀请您加入他们在 {{appName}} 上的团队“{{teamName}}”。{{appName}} 是一个活动安排调度程序,让您和您的团队无需通过电子邮件沟通即可安排会议。",
"email_user_invite_subheading_org": "{{invitedBy}} 已邀请您加入他们在 {{appName}} 上的组织“{{teamName}}”。{{appName}} 是一个活动日程安排程序,让您和您的组织无需通过电子邮件沟通即可安排会议。",
"email_no_user_invite_steps_intro": "我们将引导您完成几个简短步骤,您将立即与您的 {{entity}} 一起享受无压力的日程安排。",
"email_no_user_step_one": "选择您的用户名",
"email_no_user_step_two": "连接您的日历账户",
@ -1835,6 +1867,8 @@
"insights_no_data_found_for_filter": "未找到所选筛选器或所选日期的数据。",
"acknowledge_booking_no_show_fee": "我同意,如果我不参加此活动,将从我的卡中收取 {{amount, currency}} 的失约费。",
"card_details": "卡详细信息",
"something_went_wrong_on_our_end": "我们这边出了点问题。请联系我们的支持团队,我们将立即为您解决。",
"please_provide_following_text_to_suppport": "联系支持时请提供以下文本,以便更好地帮助您",
"seats_and_no_show_fee_error": "当前无法启用位置和收取失约费",
"complete_your_booking": "完成您的预约",
"complete_your_booking_subject": "完成您的预约: {{date}} 的 {{title}}",
@ -1868,6 +1902,9 @@
"open_dialog_with_element_click": "当有人点击某个元素时,打开您的 Cal 对话框。",
"need_help_embedding": "需要帮助?请参阅我们关于在 Wix、Squarespace 或 WordPress 上嵌入 Cal 的指南,请查看常见问题,或浏览高级嵌入选项。",
"book_my_cal": "预约我的 Cal",
"first_name": "名字",
"last_name": "姓氏",
"first_last_name": "名字,姓氏",
"invite_as": "邀请作为",
"form_updated_successfully": "成功更新表单。",
"disable_attendees_confirmation_emails": "禁用参与者的默认确认电子邮件",
@ -1881,6 +1918,7 @@
"first_event_type_webhook_description": "为此活动类型创建第一个 Webhook",
"install_app_on": "安装应用的账户",
"create_for": "创建",
"currency": "货币",
"organization_banner_description": "创建环境,以便让您的团队可以在其中通过轮流和集体日程安排来创建共享的应用、工作流程和活动类型。",
"organization_banner_title": "管理具有多个团队的组织",
"set_up_your_organization": "设置您的组织",
@ -1941,8 +1979,79 @@
"insights_team_filter": "团队:{{teamName}}",
"insights_user_filter": "用户:{{userName}}",
"insights_subtitle": "查看您活动的预约 insights",
"location_options": "{{locationCount}} 个位置选项",
"custom_plan": "自定义计划",
"email_embed": "电子邮件已嵌入",
"add_times_to_your_email": "选择几个可预约时间并将它们嵌入到您的电子邮件",
"select_time": "选择时间",
"select_date": "选择日期",
"see_all_available_times": "查看所有可预约时间",
"org_team_names_example": "例如,营销团队",
"org_team_names_example_1": "例如,营销团队",
"org_team_names_example_2": "例如,销售团队",
"org_team_names_example_3": "例如,设计团队",
"org_team_names_example_4": "例如,工程团队",
"org_team_names_example_5": "例如,数据分析团队",
"org_max_team_warnings": "您稍后将能够添加更多团队。",
"what_is_this_meeting_about": "此会议是关于什么的?",
"add_to_team": "添加到团队",
"remove_users_from_org": "从组织中移除用户",
"remove_users_from_org_confirm": "您确定要从该组织中移除 {{userCount}} 个用户吗?",
"user_has_no_schedules": "此用户尚未设置任何计划。",
"user_isnt_in_any_teams": "此用户不在任何团队中",
"requires_booker_email_verification": "需要预约者电子邮件验证",
"description_requires_booker_email_verification": "确保在安排活动前验证预约者的电子邮件",
"requires_confirmation_mandatory": "仅当活动类型需要确认时,才能向参与者发送短信。",
"kyc_verification_information": "为了确保安全,您在向参与者发送短信之前必须验证您的 {{teamOrAccount}}。请通过 <a>{{supportEmail}}</a> 联系我们并提供以下信息:",
"kyc_verification_documents": "<ul><li>您的 {{teamOrUser}}</li><li>对于企业:附上您的企业验证文件</li><li>对于个人:附上政府颁发的 ID</li></ul>",
"verify_team_or_account": "验证 {{teamOrAccount}}",
"verify_account": "验证账户",
"kyc_verification": "KYC 验证",
"organizations": "组织",
"org_admin_other_teams": "其他团队",
"org_admin_other_teams_description": "在此处可以看到您的组织内您不属于的团队。如果需要,您可以将自己添加到这些团队中。",
"no_other_teams_found": "未找到其他团队",
"no_other_teams_found_description": "该组织中没有其他团队。",
"attendee_first_name_variable": "参与者名字",
"attendee_last_name_variable": "参与者姓氏",
"attendee_first_name_info": "预约人的名字",
"attendee_last_name_info": "预约人的姓氏",
"me": "我",
"verify_team_tooltip": "验证您的团队以允许向参与者发送消息",
"member_removed": "成员已移除",
"my_availability": "我的可预约时间",
"team_availability": "团队可预约时间",
"backup_code": "备份代码",
"backup_codes": "备份代码",
"backup_code_instructions": "每个备份代码只能使用一次,用于在没有验证器的情况下授予访问权限。",
"backup_codes_copied": "备份代码已复制!",
"incorrect_backup_code": "备份代码不正确。",
"lost_access": "失去访问权限",
"missing_backup_codes": "未找到备份代码。请在您的设置中生成备份代码。",
"admin_org_notification_email_subject": "新组织已创建:待操作",
"hi_admin": "你好,管理员",
"admin_org_notification_email_title": "组织需要 DNS 设置",
"admin_org_notification_email_body_part1": "已创建一个具有“{{orgSlug}}”slug 的组织。<br /><br />请确保将 DNS 注册表配置为将与新组织对应的子域指向正在运行主应用的位置。否则组织将无法运作。<br /><br />以下是几个非常基本的选项,用于将一个子域配置为指向其应用,以便加载组织资料页面。<br /><br />您可以使用 A 记录执行此操作:",
"admin_org_notification_email_body_part2": "或者 CNAME 记录:",
"admin_org_notification_email_body_part3": "配置子域后,请在组织管理员设置中将 DNS 配置标记为已完成。",
"admin_org_notification_email_cta": "转到组织管理员设置",
"org_has_been_processed": "组织已处理",
"org_error_processing": "处理此组织时出错",
"orgs_page_description": "所有组织的列表。接受某个组织将允许拥有该电子邮件域的所有用户无需电子邮件验证即可注册。",
"unverified": "未验证",
"dns_missing": "DNS 缺失",
"mark_dns_configured": "标记为 DNS 已配置",
"value": "值",
"your_organization_updated_sucessfully": "您的组织已成功更新",
"team_no_event_types": "此团队没有任何活动类型",
"seat_options_doesnt_multiple_durations": "位置选项不支持多个持续时间",
"include_calendar_event": "包括日历活动",
"recently_added": "最近添加",
"no_members_found": "未找到成员",
"event_setup_length_error": "获得设置:持续时间必须至少为 1 分钟。",
"availability_schedules": "可预约时间表",
"view_only_edit_availability_not_onboarded": "此用户尚未完成入门流程。在他们完成入门流程之前,您将无法设置他们的可预约时间。",
"view_only_edit_availability": "您正在查看此用户的可预约时间。您只能编辑您自己的可预约时间。",
"edit_users_availability": "编辑用户的可预约时间:{{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 在此上方添加您的新字符串 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -17,9 +17,15 @@
"verify_email_banner_body": "驗證您的電子郵件地址,以確保能準確收到遞送的電子郵件和行事曆",
"verify_email_email_header": "驗證您的電子郵件地址",
"verify_email_email_button": "驗證電子郵件",
"copy_somewhere_safe": "請將此 API 金鑰記在安全的地方。您之後將無法再次查看此金鑰。",
"verify_email_email_body": "請按一下下方的按鈕來驗證電子郵件地址。",
"verify_email_by_code_email_body": "請使用下方驗證碼來驗證電子郵件地址。",
"verify_email_email_link_text": "若您不喜歡點擊按鈕,也可以使用以下連結:",
"email_verification_code": "輸入驗證碼",
"email_verification_code_placeholder": "輸入傳送至您電子郵件地址的驗證碼",
"incorrect_email_verification_code": "驗證碼不正確。",
"email_sent": "電子郵件已成功傳送",
"email_not_sent": "傳送此電子郵件時發生錯誤",
"event_declined_subject": "已拒絕:{{date}} 與 {{title}}",
"event_cancelled_subject": "已取消:{{date}} 的 {{title}}",
"event_request_declined": "活動請求遭到拒絕",
@ -78,6 +84,7 @@
"event_awaiting_approval_recurring": "定期活動正等待您的核准",
"someone_requested_an_event": "有人在行事曆上要求預定活動。",
"someone_requested_password_reset": "有人索取變更密碼的連結。",
"password_reset_email_sent": "若我們的系統也登錄了此電子郵件地址,您應該就會收到重設電子郵件。",
"password_reset_instructions": "如果沒有索取的話,忽略這封電子郵件是安全的,密碼也不會變更。",
"event_awaiting_approval_subject": "等待核准:{{date}} 與 {{title}}",
"event_still_awaiting_approval": "活動還在等待核准",
@ -217,6 +224,10 @@
"already_have_an_account": "已經有帳號嗎?",
"create_account": "新增帳號",
"confirm_password": "確認密碼",
"confirm_auth_change": "這會變更您登入的方式",
"confirm_auth_email_change": "變更電子郵件地址會使您目前登入 Cal.com 的驗證方式斷線。我們會要求您驗證新的電子郵件地址。接下來系統會將重設密碼的指示傳送至您的電子郵件地址,按照相關指示操作後您就會登出並使用新的電子郵件地址登入,而不是目前的驗證方法。",
"reset_your_password": "按照傳送至您電子郵件地址的指示來重設密碼。",
"email_change": "使用您的新電子郵件地址和密碼重新登入。",
"create_your_account": "新增帳號",
"sign_up": "註冊",
"youve_been_logged_out": "已經登出",
@ -243,6 +254,10 @@
"all": "所有應用程式",
"yours": "您的帳號",
"available_apps": "可用的應用程式",
"available_apps_lower_case": "可用的應用程式",
"available_apps_desc": "您尚未安裝任何應用程式。到我們的 <1>App Store</1> 查看以下的熱門應用程式,並探索更多內容",
"fixed_host_helper": "加入須參加此活動的所有人員。<1>深入瞭解</1>",
"round_robin_helper": "此群組成員將輪流出席,只有一人會出席此活動。",
"check_email_reset_password": "請檢查信箱。已經把重設密碼的連結寄出。",
"finish": "結束",
"organization_general_description": "管理團隊的語言和時區設定",
@ -251,6 +266,7 @@
"nearly_there_instructions": "最後,簡單的個人簡介和照片能幫助您獲得預約,也能讓人們知道目前預約的對象是誰。",
"set_availability_instructions": "以定期的方式設定開放時間範圍。之後還可以繼續設定,並且歸類到各個行事曆。",
"set_availability": "設定開放時間",
"availability_settings": "可預約時間設定",
"continue_without_calendar": "在沒有行事曆的情況下繼續",
"connect_your_calendar": "連結行事曆",
"connect_your_video_app": "連接視訊應用程式",
@ -392,6 +408,8 @@
"allow_dynamic_booking_tooltip": "使用 '+' 新增多個使用者名稱,以動態建立群組預約連結。例如:'{{appName}}/bailey+peer'",
"allow_dynamic_booking": "允許與會者透過動態群組向您預約",
"dynamic_booking": "動態群組連結",
"allow_seo_indexing": "允許搜尋引擎存取您的公開內容",
"seo_indexing": "允許 SEO 編纂索引",
"email": "電子郵件",
"email_placeholder": "jdoe@example.com",
"full_name": "完整姓名",
@ -406,6 +424,7 @@
"booking_requested": "預約已提出",
"meeting_ended": "會議已結束",
"form_submitted": "表單已提交",
"booking_paid": "預約已付款",
"event_triggers": "事件發動條件",
"subscriber_url": "訂閱者網址",
"create_new_webhook": "建立新的 Webhook",
@ -506,6 +525,7 @@
"your_name": "名字",
"your_full_name": "您的全名",
"no_name": "沒有名稱",
"enter_number_between_range": "請輸入介於 1 到 {{maxOccurences}} 的數字",
"email_address": "電子郵件位址",
"enter_valid_email": "請輸入有效的電子郵件",
"location": "地點",
@ -543,6 +563,7 @@
"leave": "離開",
"profile": "個人資料",
"my_team_url": "團隊網址",
"my_teams": "我的團隊",
"team_name": "團隊名稱",
"your_team_name": "取團隊名稱",
"team_updated_successfully": "成功更新團隊",
@ -570,6 +591,8 @@
"invite_new_member": "邀請新成員",
"invite_new_member_description": "注意:您的訂閱會因此<1>加收一個座位費 ($15 美元/月)</1>。",
"invite_new_team_member": "邀至團隊裡。",
"upload_csv_file": "上傳 .csv 檔案",
"invite_via_email": "透過電子郵件邀請",
"change_member_role": "改變團隊成員角色",
"disable_cal_branding": "關閉 {{appName}} 品牌識別",
"disable_cal_branding_description": "在公開頁面隱藏所有 {{appName}} 品牌識別。",
@ -842,6 +865,7 @@
"team_view_user_availability_disabled": "使用者必須接受邀請,才可以查看開放的時間",
"set_as_away": "設定為離開狀態",
"set_as_free": "關閉離開狀態",
"toggle_away_error": "更新離開狀態時發生錯誤",
"user_away": "這位使用者目前是離開狀態。",
"user_away_description": "試圖預約的人已經設定為離開狀態,因此不接受新預約。",
"meet_people_with_the_same_tokens": "認識有相同 Token 的人",
@ -851,6 +875,7 @@
"account_managed_by_identity_provider_description": "要更改電子郵件、密碼、兩階段認證⋯⋯等,請造訪 {{provider}} 的帳號設定。",
"signin_with_google": "透過 Google 登入",
"signin_with_saml": "透過 SAML 登入",
"signin_with_saml_oidc": "透過 SAML/OIDC 登入",
"you_will_need_to_generate": "得要從先前的預定工具產生連結 Token。",
"import": "輸入",
"import_from": "輸入自",
@ -950,6 +975,8 @@
"offer_seats_description": "為預約提供座位 (這將停用賓客和選擇加入的預約)",
"seats_available_one": "可用座位",
"seats_available_other": "尚有座位",
"seats_nearly_full": "快額滿了",
"seats_half_full": "預約踴躍",
"number_of_seats": "每次預約的座位數",
"enter_number_of_seats": "輸入座位數",
"you_can_manage_your_schedules": "在開放時間頁面可以管理行程表。",
@ -1030,12 +1057,15 @@
"how_you_want_add_cal_site": "您希望以何種方式將 {{appName}} 加入您的網站?",
"choose_ways_put_cal_site": "選擇下列其中一種方式將 {{appName}} 放到您的網站。",
"setting_up_zapier": "正在設定您的 Zapier 整合",
"setting_up_make": "正在設定您的 Make 整合",
"generate_api_key": "產生 API 金鑰",
"generate_api_key_description": "產生 API 金鑰以在下列位置使用 {{appName}}",
"your_unique_api_key": "您的唯一 API 金鑰",
"copy_safe_api_key": "複製此 API 金鑰並存在安全的地方。如果您遺失此金鑰,就必須產生新的金鑰。",
"zapier_setup_instructions": "<0>登入您的 Zapier 帳號並建立新的 Zap。</0><1>選取 {{appName}} 作為您的 Trigger 應用程式,也請一併選擇 Trigger 事件。</1><2>選擇您的帳號,然後輸入您的唯一 API 金鑰。</2><3>測試您的 Trigger。</3><4>一切就大功告成了!</4>",
"make_setup_instructions": "<0>前往 <1><0>Make Invite Link</0></1>,然後安裝 Cal.com 應用程式。</0><1>登入您的 Make 帳號並建立新的 Scenario。</1><2>選取 Cal.com 作為您的 Trigger 應用程式,也請一併選擇 Trigger 事件。</2><3>選擇您的帳號,然後輸入您的唯一 API 金鑰。</3><4>測試您的 Trigger。</4><5>一切就大功告成了!</5>",
"install_zapier_app": "請先到 App Store 安裝 Zapier 應用程式。",
"install_make_app": "請先到 App Store 安裝 Make 應用程式。",
"connect_apple_server": "連結到 Apple 伺服器",
"calendar_url": "行事曆 URL",
"apple_server_generate_password": "請前往下列位置產生搭配 {{appName}} 使用的應用程式專用密碼",
@ -1085,6 +1115,7 @@
"email_attendee_action": "傳送電子郵件給與會者",
"sms_attendee_action": "傳送簡訊給與會者",
"sms_number_action": "傳送簡訊至特定號碼",
"send_reminder_sms": "透過簡訊輕鬆傳送會議提醒給您的與會者",
"whatsapp_number_action": "傳送 Whatsapp 至特定號碼",
"whatsapp_attendee_action": "傳送 Whatsapp 給與會者",
"workflows": "工作流程",
@ -1244,6 +1275,7 @@
"error_updating_settings": "更新設定時發生錯誤",
"personal_cal_url": "我的個人 {{appName}} 網址",
"bio_hint": "一些關於自己的句子,會顯示在個人網址頁面。",
"user_has_no_bio": "此使用者尚未新增個人資料。",
"delete_account_modal_title": "刪除帳號",
"confirm_delete_account_modal": "確定要刪除您的 {{appName}} 的帳號嗎?",
"delete_my_account": "刪除我的帳號",
@ -1426,6 +1458,7 @@
"add_limit": "新增限制",
"team_name_required": "需提供團隊名稱",
"show_attendees": "和賓客分享與會者資訊",
"show_available_seats_count": "顯示可用座位的數量。",
"how_booking_questions_as_variables": "如何將預約問題當作變數?",
"format": "格式",
"uppercase_for_letters": "一律使用大寫字母",
@ -1659,8 +1692,11 @@
"delete_sso_configuration_confirmation_description": "確定要刪除 {{connectionType}} 設定?使用 {{connectionType}} 登入的團隊成員將再也無法存取 Cal.com。",
"organizer_timezone": "主辦者時區",
"email_user_cta": "檢視邀請",
"email_no_user_invite_heading_team": "您已獲邀加入 {{appName}} 團隊",
"email_no_user_invite_heading_org": "您已獲邀加入 {{appName}} 組織",
"email_no_user_invite_subheading": "{{invitedBy}} 已邀請您加入對方在 {{appName}} 上的團隊。{{appName}} 是活動多工排程工具,可讓您和您的團隊無須透過繁複的電子郵件往來就能輕鬆預定會議。",
"email_user_invite_subheading_team": "{{invitedBy}} 已邀請您加入對方在 {{appName}} 上的「{{teamName}}」團隊。{{appName}} 為一款活動多功能排程工具,可讓您和團隊無須透過繁複的電子郵件往來,就能輕鬆預定會議。",
"email_user_invite_subheading_org": "{{invitedBy}} 已邀請您加入對方在 {{appName}} 上的「{{teamName}}」團隊。{{appName}} 為一款活動多功能排程工具,可讓您和組織無須透過繁複的電子郵件往來,就能輕鬆預定會議。",
"email_no_user_invite_steps_intro": "我們會逐步引導您完成幾個簡短的步驟,然後您就能馬上與 {{entity}} 享受沒有壓力的排程預定功能。",
"email_no_user_step_one": "選擇使用者名稱",
"email_no_user_step_two": "連結行事曆帳號",
@ -1831,6 +1867,8 @@
"insights_no_data_found_for_filter": "找不到所選篩選條件或日期的資料。",
"acknowledge_booking_no_show_fee": "我同意若我未出席此活動,將從我的卡片收取 {{amount, currency}} 的缺席費。",
"card_details": "卡片詳細資料",
"something_went_wrong_on_our_end": "我們的系統發生了一點問題。請與支援團隊聯絡,我們會盡快為您修復。",
"please_provide_following_text_to_suppport": "聯絡支援團隊時,請提供下列資訊,以便我們進一步協助您",
"seats_and_no_show_fee_error": "目前無法啟用座位並收取缺席費",
"complete_your_booking": "完成您的預約",
"complete_your_booking_subject": "完成您的預約:{{date}} 的 {{title}}",
@ -1864,6 +1902,9 @@
"open_dialog_with_element_click": "有人按一下元素即開啟 Cal 對話方塊。",
"need_help_embedding": "需要協助嗎?歡迎查看我們的指南了解如何在 Wix、Squarespace 或 WordPress 上嵌入 Cal也歡迎參閱我們的常見問題或深入了解進階嵌入選項。",
"book_my_cal": "預約我的 Cal",
"first_name": "名字",
"last_name": "姓氏",
"first_last_name": "名字,姓氏",
"invite_as": "邀請為",
"form_updated_successfully": "表單更新成功。",
"disable_attendees_confirmation_emails": "為與會者停用預設確認電子郵件",
@ -1877,6 +1918,7 @@
"first_event_type_webhook_description": "為此活動類型建立第一個 Webhook",
"install_app_on": "應用程式安裝帳號",
"create_for": "建立",
"currency": "貨幣",
"organization_banner_description": "建立環境,供團隊利用輪流制和全體預定功能建立共用的應用程式、工作流程和活動類型。",
"organization_banner_title": "管理有多個團隊的組織",
"set_up_your_organization": "設定組織",
@ -1937,6 +1979,79 @@
"insights_team_filter": "團隊:{{teamName}}",
"insights_user_filter": "使用者:{{userName}}",
"insights_subtitle": "查看所有活動的預約 Insight",
"location_options": "{{locationCount}} 個地點選項",
"custom_plan": "自訂方案",
"email_embed": "嵌入的電子郵件",
"add_times_to_your_email": "選取幾個開放預約的時段,然後嵌入您的電子郵件",
"select_time": "選取時間",
"select_date": "選取日期",
"see_all_available_times": "查看所有可預約時段",
"org_team_names_example": "例如行銷團隊",
"org_team_names_example_1": "例如行銷團隊",
"org_team_names_example_2": "例如銷售團隊",
"org_team_names_example_3": "例如設計團隊",
"org_team_names_example_4": "例如工程團隊",
"org_team_names_example_5": "例如資料分析團隊",
"org_max_team_warnings": "您之後將可新增更多團隊。",
"what_is_this_meeting_about": "此會議的主題是什麼?",
"add_to_team": "新增至團隊",
"remove_users_from_org": "從組織中移除使用者",
"remove_users_from_org_confirm": "確定要從此組織移除 {{userCount}} 使用者嗎?",
"user_has_no_schedules": "此使用者尚未設定任何行程表。",
"user_isnt_in_any_teams": "此使用者未加入任何團隊",
"requires_booker_email_verification": "需要預約者電子郵件驗證",
"description_requires_booker_email_verification": "如要在預定活動之前先確保預約者的電子郵件驗證",
"requires_confirmation_mandatory": "簡訊只會在活動類型需要確認時傳送給與會者。",
"kyc_verification_information": "為確保安全,您必須先驗證您的 {{teamOrAccount}},再傳送簡訊給與會者。請透過 <a>{{supportEmail}}</a> 聯絡我們,並提供下列資訊:",
"kyc_verification_documents": "<ul><li>您的 {{teamOrUser}}</li><li>若是企業組織:請附上您的企業驗證文件</li><li>若是個人:請附上政府核發的身分證件</li></ul>",
"verify_team_or_account": "驗證 {{teamOrAccount}}",
"verify_account": "驗證帳號",
"kyc_verification": "KYC 驗證",
"organizations": "組織",
"org_admin_other_teams": "其他團隊",
"org_admin_other_teams_description": "您可查看貴組織內您未加入的團隊。您可視需要自行加入其中的團隊。",
"no_other_teams_found": "找不到其他團隊",
"no_other_teams_found_description": "此組織內沒有其他團隊。",
"attendee_first_name_variable": "與會者名字",
"attendee_last_name_variable": "與會者姓氏",
"attendee_first_name_info": "預約人名字",
"attendee_last_name_info": "預約人姓氏",
"me": "我",
"verify_team_tooltip": "驗證您的團隊,已啟用傳送訊息給與會者的訊息",
"member_removed": "成員已移除",
"my_availability": "我的可預約時間",
"team_availability": "團隊可預約時間",
"backup_code": "支援代碼",
"backup_codes": "支援代碼",
"backup_code_instructions": "每個支援代碼都只能用一次,以在未使用驗證者的情況下授予存取權。",
"backup_codes_copied": "已複製支援代碼!",
"incorrect_backup_code": "支援代碼不正確。",
"lost_access": "失去存取權",
"missing_backup_codes": "找不到支援代碼。請前往設定產生代碼。",
"admin_org_notification_email_subject": "已建立新的組織:待完成的動作",
"hi_admin": "管理員,您好",
"admin_org_notification_email_title": "組織需要設定 DNS",
"admin_org_notification_email_body_part1": "已建立 slug 為「{{orgSlug}}」的組織。<br /><br />請務必設定您的 DNS 登錄,以指向對應至主要應用程式運作位置的新組織子網域,否則組織將無法運作。<br /><br />以下是指向應用程式的子網域基本設定選項,如此一來系統才能載入組織設定檔案頁面。<br /><br />您可以也可以使用 A 記錄完成:",
"admin_org_notification_email_body_part2": "或 CNAME 記錄:",
"admin_org_notification_email_body_part3": "設定子網域後,請在組織管理設定中將 DNS 設定標記為已完成。",
"admin_org_notification_email_cta": "前往組織管理設定",
"org_has_been_processed": "已處理完成組織",
"org_error_processing": "處理此組織時發生錯誤",
"orgs_page_description": "所有組織的清單。接受組織可讓擁有該電子郵件網域的使用者無需電子郵件驗證就進行註冊。",
"unverified": "未經驗證",
"dns_missing": "DNS 遺失",
"mark_dns_configured": "標示為已設定 DNS",
"value": "價值",
"your_organization_updated_sucessfully": "您的組織成功更新",
"team_no_event_types": "此團隊沒有任何活動類型",
"seat_options_doesnt_multiple_durations": "座位選項不支援多個持續時間",
"include_calendar_event": "包含行事曆活動",
"recently_added": "最近新增",
"no_members_found": "找不到成員",
"event_setup_length_error": "活動設定:持續時間至少必須為 1 分鐘。",
"availability_schedules": "可預約時間行程表",
"view_only_edit_availability_not_onboarded": "此使用者尚未完成入門導覽。在對方完成入門導覽前,您將無法設定對方的可預約時間。",
"view_only_edit_availability": "您正在查看此使用者的可預約時間。您只能編輯自己的可預約時間。",
"edit_users_availability": "編輯使用者的可預約時間:{{username}}",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 請在此處新增您的字串 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -109,6 +109,10 @@
background: var(--cal-brand);
}
html {
scrollbar-gutter: stable;
}
body  {
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;

View File

@ -11,18 +11,17 @@ it("correctly handles 1 day", async () => {
startTime: new Date(Date.UTC(1970, 1, 1, 9, 0, 0, 0)),
endTime: new Date(Date.UTC(1970, 1, 1, 17, 0, 0, 0)),
date: null,
scheduleId: 1
scheduleId: 1,
};
const result = availabilityAsString(availability, {
locale: 'en',
hour12: true
locale: "en",
hour12: true,
});
expect(replaceUnicodeSpace(result)).toBe("Mon, 9:00 AM - 5:00 PM");
});
it("correctly handles all days", async () => {
const availability = {
id: 1,
@ -32,12 +31,12 @@ it("correctly handles all days", async () => {
startTime: new Date(Date.UTC(1970, 1, 1, 9, 0, 0, 0)),
endTime: new Date(Date.UTC(1970, 1, 1, 17, 0, 0, 0)),
date: null,
scheduleId: 1
scheduleId: 1,
};
const result = availabilityAsString(availability, {
locale: 'en',
hour12: true
locale: "en",
hour12: true,
});
expect(replaceUnicodeSpace(result)).toBe("Mon - Sun, 9:00 AM - 5:00 PM");
@ -52,12 +51,12 @@ it("correctly handles staggered days", async () => {
startTime: new Date(Date.UTC(1970, 1, 1, 9, 0, 0, 0)),
endTime: new Date(Date.UTC(1970, 1, 1, 17, 0, 0, 0)),
date: null,
scheduleId: 1
scheduleId: 1,
};
const result = availabilityAsString(availability, {
locale: 'en',
hour12: true
locale: "en",
hour12: true,
});
expect(replaceUnicodeSpace(result)).toBe("Mon, Wed, Fri, Sun, 9:00 AM - 5:00 PM");
@ -72,12 +71,12 @@ it("correctly produces days and times - 12 hours", async () => {
startTime: new Date(Date.UTC(1970, 1, 1, 9, 0, 0, 0)),
endTime: new Date(Date.UTC(1970, 1, 1, 17, 0, 0, 0)),
date: null,
scheduleId: 1
scheduleId: 1,
};
const result = availabilityAsString(availability, {
locale: 'en',
hour12: true
locale: "en",
hour12: true,
});
expect(replaceUnicodeSpace(result)).toBe("Mon - Wed, 9:00 AM - 5:00 PM");
@ -92,12 +91,12 @@ it("correctly produces days and times - 24 hours", async () => {
startTime: new Date(Date.UTC(1970, 1, 1, 9, 0, 0, 0)),
endTime: new Date(Date.UTC(1970, 1, 1, 17, 0, 0, 0)),
date: null,
scheduleId: 1
scheduleId: 1,
};
const result = availabilityAsString(availability, {
locale: 'en',
hour12: false
locale: "en",
hour12: false,
});
expect(replaceUnicodeSpace(result)).toBe("Mon - Wed, 09:00 - 17:00");
@ -107,5 +106,5 @@ it("correctly produces days and times - 24 hours", async () => {
// produces Unicode characters. Instead of using line for line code from the
// availability.ts file, opted for this instead.
const replaceUnicodeSpace = (string: string) => {
return string.replace(/\u202f/g, ' ');
}
return string.replace(/\u202f/g, " ");
};

View File

@ -1,6 +1,7 @@
import { describe, expect, it } from "vitest";
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
import { describe, expect, it } from "vitest";
import dayjs from "@calcom/dayjs";
import { validateIntervalLimitOrder } from "@calcom/lib";
import { checkBookingLimits, checkBookingLimit } from "@calcom/lib/server";

View File

@ -1,11 +1,11 @@
import { describe, expect, it } from "vitest";
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
import { describe, expect, it } from "vitest";
import dayjs from "@calcom/dayjs";
import { validateIntervalLimitOrder } from "@calcom/lib";
import { checkDurationLimit, checkDurationLimits } from "@calcom/lib/server";
type MockData = {
id: number;
startDate: Date;

View File

@ -2,10 +2,9 @@ import { expect, it, beforeAll, vi } from "vitest";
import { getAggregateWorkingHours } from "@calcom/core/getAggregateWorkingHours";
beforeAll(() => {
vi.setSystemTime(new Date("2021-06-20T11:59:59Z"));
})
});
const HAWAII_AND_NEWYORK_TEAM = [
{

View File

@ -4,10 +4,9 @@ import { expect, it, beforeAll, vi } from "vitest";
import dayjs from "@calcom/dayjs";
import { getAvailabilityFromSchedule } from "@calcom/lib/availability";
beforeAll(() => {
vi.setSystemTime(new Date("2021-06-20T11:59:59Z"));
})
});
//parse "hh:mm-hh:mm" into <Availability> object
const parseWorkingHours = (workingHours: string) => {

View File

@ -8,7 +8,8 @@ import prisma from "@calcom/prisma";
import type { BookingStatus } from "@calcom/prisma/enums";
import type { Slot } from "@calcom/trpc/server/routers/viewer/slots/types";
import { getAvailableSlots as getSchedule } from "@calcom/trpc/server/routers/viewer/slots/util";
import { getDate, getGoogleCalendarCredential, createBookingScenario} from "../utils/bookingScenario";
import { getDate, getGoogleCalendarCredential, createBookingScenario } from "../utils/bookingScenario";
// TODO: Mock properly
prismaMock.eventType.findUnique.mockResolvedValue(null);
@ -16,7 +17,7 @@ prismaMock.user.findMany.mockResolvedValue([]);
vi.mock("@calcom/lib/constants", () => ({
IS_PRODUCTION: true,
WEBAPP_URL: "http://localhost:3000"
WEBAPP_URL: "http://localhost:3000",
}));
declare global {
@ -143,7 +144,6 @@ const TestData = {
},
};
const cleanup = async () => {
await prisma.eventType.deleteMany();
await prisma.user.deleteMany();
@ -296,7 +296,7 @@ describe("getSchedule", () => {
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
// getSchedule returns timeslots in GMT
@ -328,7 +328,7 @@ describe("getSchedule", () => {
endTime: `${plus3DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
expect(scheduleForDayWithOneBooking).toHaveTimeSlots(
@ -393,7 +393,7 @@ describe("getSchedule", () => {
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
expect(scheduleForEventWith30Length).toHaveTimeSlots(
@ -429,7 +429,7 @@ describe("getSchedule", () => {
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
// `slotInterval` takes precedence over `length`
// 4:30 is utc so it is 10:00 in IST
@ -493,7 +493,7 @@ describe("getSchedule", () => {
endTime: `${todayDateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
expect(scheduleForEventWithBookingNotice13Hrs).toHaveTimeSlots(
[
@ -514,7 +514,7 @@ describe("getSchedule", () => {
endTime: `${todayDateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
expect(scheduleForEventWithBookingNotice10Hrs).toHaveTimeSlots(
[
@ -578,7 +578,7 @@ describe("getSchedule", () => {
endTime: `${plus3DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
expect(scheduleForEventOnADayWithNonCalBooking).toHaveTimeSlots(
@ -652,7 +652,7 @@ describe("getSchedule", () => {
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
expect(scheduleForEventOnADayWithCalBooking).toHaveTimeSlots(
@ -710,7 +710,7 @@ describe("getSchedule", () => {
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
expect(schedule).toHaveTimeSlots(
@ -774,7 +774,7 @@ describe("getSchedule", () => {
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
expect(scheduleForEventOnADayWithDateOverride).toHaveTimeSlots(
@ -852,7 +852,7 @@ describe("getSchedule", () => {
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: false,
}
},
});
expect(thisUserAvailability).toHaveTimeSlots(
@ -950,7 +950,7 @@ describe("getSchedule", () => {
endTime: `${plus1DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: true,
}
},
});
expect(scheduleForTeamEventOnADayWithNoBooking).toHaveTimeSlots(
@ -980,7 +980,7 @@ describe("getSchedule", () => {
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: true,
}
},
});
// A user with blocked time in another event, still affects Team Event availability
@ -1088,7 +1088,7 @@ describe("getSchedule", () => {
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: true,
}
},
});
// A user with blocked time in another event, still affects Team Event availability
expect(scheduleForTeamEventOnADayWithOneBookingForEachUserButOnDifferentTimeslots).toHaveTimeSlots(
@ -1116,7 +1116,7 @@ describe("getSchedule", () => {
endTime: `${plus3DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: true,
}
},
});
// A user with blocked time in another event, still affects Team Event availability
expect(scheduleForTeamEventOnADayWithOneBookingForEachUserOnSameTimeSlot).toHaveTimeSlots(
@ -1139,4 +1139,3 @@ describe("getSchedule", () => {
});
});
});

View File

@ -5,7 +5,7 @@ import { getWorkingHours } from "@calcom/lib/availability";
beforeAll(() => {
vi.setSystemTime(new Date("2021-06-20T11:59:59Z"));
})
});
it("correctly translates Availability (UTC+0) to UTC workingHours", async () => {
expect(

View File

@ -1,3 +1,5 @@
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
import type { EventType } from "@prisma/client";
import { describe, expect, it, vi } from "vitest";
@ -6,8 +8,6 @@ import { buildEventType } from "@calcom/lib/test/builder";
import type { Prisma } from "@calcom/prisma/client";
import type { CompleteEventType, CompleteWorkflowsOnEventTypes } from "@calcom/prisma/zod";
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
const mockFindFirstEventType = (data?: Partial<CompleteEventType>) => {
const eventType = buildEventType(data as Partial<EventType>);
prismaMock.eventType.findFirst.mockResolvedValue(eventType as EventType);
@ -97,11 +97,12 @@ describe("handleChildrenEventTypes", () => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// eslint-disable-next-line
const { schedulingType, id, teamId, timeZone, users,requiresBookerEmailVerification, ...evType } = mockFindFirstEventType({
id: 123,
metadata: { managedEventConfig: {} },
locations: [],
});
const { schedulingType, id, teamId, timeZone, users, requiresBookerEmailVerification, ...evType } =
mockFindFirstEventType({
id: 123,
metadata: { managedEventConfig: {} },
locations: [],
});
const result = await updateChildrenEventTypes({
eventTypeId: 1,
oldEventType: { children: [], team: { name: "" } },
@ -133,11 +134,21 @@ describe("handleChildrenEventTypes", () => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// eslint-disable-next-line
const { schedulingType, id, teamId, timeZone, locations, parentId, userId, scheduleId,requiresBookerEmailVerification, ...evType } =
mockFindFirstEventType({
metadata: { managedEventConfig: {} },
locations: [],
});
const {
schedulingType,
id,
teamId,
timeZone,
locations,
parentId,
userId,
scheduleId,
requiresBookerEmailVerification,
...evType
} = mockFindFirstEventType({
metadata: { managedEventConfig: {} },
locations: [],
});
const result = await updateChildrenEventTypes({
eventTypeId: 1,
oldEventType: { children: [{ userId: 4 }], team: { name: "" } },
@ -218,11 +229,12 @@ describe("handleChildrenEventTypes", () => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// eslint-disable-next-line
const { schedulingType, id, teamId, timeZone, users,requiresBookerEmailVerification, ...evType } = mockFindFirstEventType({
id: 123,
metadata: { managedEventConfig: {} },
locations: [],
});
const { schedulingType, id, teamId, timeZone, users, requiresBookerEmailVerification, ...evType } =
mockFindFirstEventType({
id: 123,
metadata: { managedEventConfig: {} },
locations: [],
});
prismaMock.eventType.deleteMany.mockResolvedValue([123] as unknown as Prisma.BatchPayload);
const result = await updateChildrenEventTypes({
eventTypeId: 1,
@ -255,11 +267,20 @@ describe("handleChildrenEventTypes", () => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// eslint-disable-next-line
const { schedulingType, id, teamId, timeZone, users, locations, parentId, userId,requiresBookerEmailVerification, ...evType } =
mockFindFirstEventType({
metadata: { managedEventConfig: {} },
locations: [],
});
const {
schedulingType,
id,
teamId,
timeZone,
locations,
parentId,
userId,
requiresBookerEmailVerification,
...evType
} = mockFindFirstEventType({
metadata: { managedEventConfig: {} },
locations: [],
});
prismaMock.eventType.deleteMany.mockResolvedValue([123] as unknown as Prisma.BatchPayload);
const result = await updateChildrenEventTypes({
eventTypeId: 1,

View File

@ -1,4 +1,5 @@
import { it, expect, describe, beforeAll } from "vitest";
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { getSubdomainRegExp } = require("../../getSubdomainRegExp");
// eslint-disable-next-line @typescript-eslint/no-var-requires
@ -30,67 +31,50 @@ beforeAll(async () => {
describe("next.config.js - Org Rewrite", () => {
const orgHostRegExp = (subdomainRegExp: string) =>
// RegExp copied from pagesAndRewritePaths.js orgHostPath. Do make the change there as well.
// RegExp copied from pagesAndRewritePaths.js orgHostPath. Do make the change there as well.
new RegExp(`^(?<orgSlug>${subdomainRegExp})\\.(?!vercel\.app).*`);
describe("Host matching based on NEXT_PUBLIC_WEBAPP_URL", () => {
it("https://app.cal.com", () => {
const subdomainRegExp = getSubdomainRegExp("https://app.cal.com");
expect(orgHostRegExp(subdomainRegExp).exec("app.cal.com")).toEqual(null);
expect(
orgHostRegExp(subdomainRegExp).exec("company.app.cal.com")?.groups
?.orgSlug
).toEqual("company");
expect(
orgHostRegExp(subdomainRegExp).exec("org.cal.com")?.groups?.orgSlug
).toEqual("org");
expect(orgHostRegExp(subdomainRegExp).exec("company.app.cal.com")?.groups?.orgSlug).toEqual("company");
expect(orgHostRegExp(subdomainRegExp).exec("org.cal.com")?.groups?.orgSlug).toEqual("org");
expect(
orgHostRegExp(subdomainRegExp).exec("localhost:3000")
).toEqual(null);
expect(orgHostRegExp(subdomainRegExp).exec("localhost:3000")).toEqual(null);
});
it("app.cal.com", () => {
const subdomainRegExp = getSubdomainRegExp("app.cal.com");
expect(orgHostRegExp(subdomainRegExp).exec("app.cal.com")).toEqual(null);
expect(
orgHostRegExp(subdomainRegExp).exec("company.app.cal.com")?.groups
?.orgSlug
).toEqual("company");
expect(orgHostRegExp(subdomainRegExp).exec("company.app.cal.com")?.groups?.orgSlug).toEqual("company");
});
it("https://calcom.app.company.com", () => {
const subdomainRegExp = getSubdomainRegExp(
"https://calcom.app.company.com"
const subdomainRegExp = getSubdomainRegExp("https://calcom.app.company.com");
expect(orgHostRegExp(subdomainRegExp).exec("calcom.app.company.com")).toEqual(null);
expect(orgHostRegExp(subdomainRegExp).exec("acme.calcom.app.company.com")?.groups?.orgSlug).toEqual(
"acme"
);
expect(
orgHostRegExp(subdomainRegExp).exec("calcom.app.company.com")
).toEqual(null);
expect(
orgHostRegExp(subdomainRegExp).exec("acme.calcom.app.company.com")
?.groups?.orgSlug
).toEqual("acme");
});
it("https://calcom.example.com", () => {
const subdomainRegExp = getSubdomainRegExp("https://calcom.example.com");
expect(orgHostRegExp(subdomainRegExp).exec("calcom.example.com")).toEqual(
null
);
expect(
orgHostRegExp(subdomainRegExp).exec("acme.calcom.example.com")?.groups
?.orgSlug
).toEqual("acme");
expect(orgHostRegExp(subdomainRegExp).exec("calcom.example.com")).toEqual(null);
expect(orgHostRegExp(subdomainRegExp).exec("acme.calcom.example.com")?.groups?.orgSlug).toEqual("acme");
// The following also matches which causes anything other than the domain in NEXT_PUBLIC_WEBAPP_URL to give 404
expect(
orgHostRegExp(subdomainRegExp).exec("some-other.company.com")?.groups
?.orgSlug
).toEqual("some-other");
expect(orgHostRegExp(subdomainRegExp).exec("some-other.company.com")?.groups?.orgSlug).toEqual(
"some-other"
);
});
it("Should ignore Vercel preview URLs", () => {
const subdomainRegExp = getSubdomainRegExp("https://cal-xxxxxxxx-cal.vercel.app");
expect(orgHostRegExp(subdomainRegExp).exec("https://cal-xxxxxxxx-cal.vercel.app")).toMatchInlineSnapshot('null')
expect(orgHostRegExp(subdomainRegExp).exec("cal-xxxxxxxx-cal.vercel.app")).toMatchInlineSnapshot('null')
expect(
orgHostRegExp(subdomainRegExp).exec("https://cal-xxxxxxxx-cal.vercel.app")
).toMatchInlineSnapshot("null");
expect(orgHostRegExp(subdomainRegExp).exec("cal-xxxxxxxx-cal.vercel.app")).toMatchInlineSnapshot(
"null"
);
});
});

View File

@ -1,7 +1,7 @@
import { expect, it } from "vitest";
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
import { expect, it } from "vitest";
import { getLuckyUser } from "@calcom/lib/server";
import { buildUser } from "@calcom/lib/test/builder";

View File

@ -1,3 +1,7 @@
import appStoreMock from "../../../../tests/libs/__mocks__/app-store";
import i18nMock from "../../../../tests/libs/__mocks__/libServerI18n";
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
import type {
EventType as PrismaEventType,
User as PrismaUser,
@ -17,10 +21,6 @@ import type { BookingStatus } from "@calcom/prisma/enums";
import type { EventBusyDate } from "@calcom/types/Calendar";
import type { Fixtures } from "@calcom/web/test/fixtures/fixtures";
import appStoreMock from "../../../../tests/libs/__mocks__/app-store";
import i18nMock from "../../../../tests/libs/__mocks__/libServerI18n";
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
type App = {
slug: string;
dirName: string;
@ -194,10 +194,17 @@ async function addBookings(bookings: InputBooking[], eventTypes: InputEventType[
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const statusIn = where.OR[0].status?.in || [];
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const userIdIn = where.OR[0].userId?.in || [];
const firstConditionMatches =
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
statusIn.includes(booking.status) && booking.userId === where.OR[0].userId;
statusIn.includes(booking.status) &&
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
(booking.userId === where.OR[0].userId || userIdIn.includes(booking.userId));
// We return this booking if either condition is met
return firstConditionMatches;

8
apps/web/vercel.json Normal file
View File

@ -0,0 +1,8 @@
{
"crons": [
{
"path": "/api/cron/calendar-cache-cleanup",
"schedule": "0 5 * * *"
}
]
}

View File

@ -8,4 +8,4 @@ Refer to https://developer.cal.com/guides/how-to-build-an-app
- An app created through CLI should be able to completely skip API validation for testing purposes. Credentials should be created with no API specified specific to the app. It would allow us to test any app end to end not worrying about the corresponding API endpoint.
- Someone can add wrong directory name(which doesn't satisfy slug requirements) manually. How to handle it.
- Allow editing and updating app from the cal app itself - including assets uploading when developing locally.
- Use AppDeclarativeHandler across all apps. Whatever isn't supported in it, support that.
- Follow the [App Contribution Guidelines](../app-store/CONTRIBUTING.md)

View File

@ -0,0 +1,22 @@
## App Contribution Guidelines
#### `DESCRIPTION.md`
1. images - include atleast 4 images (do we have a recommended size here?). Can show app in use and/or installation steps
2. add only file name for images, path not required. i.e. `1.jpeg`, not `/app-store/zohocalendar/1.jpeg`
3. description should include what the integration with Cal allows the user to do e.g. `Allows you to sync Cal bookings with your Zoho Calendar`
#### `README.md`
1. Include installation instructions and links to the app's website.
2. For url use `<baseUrl>/api/integrations`, rather than `<Cal.com>/api/integrations`
#### `config.json`
1. set `"logo": "icon.svg"` and save icon in `/static`. Don't use paths here.
2. description here should not exceed 10 words (this is arbitrary, but should not be long otherwise it's truncated in the app store)
#### Others
1. Add API documentation links in comments for files `api`, `lib` and `types`
2. Use [`AppDeclarativeHandler`](../types/AppHandler.d.ts) across all apps. Whatever isn't supported in it, support that.
3. README should be added in the respective app and can be linked in main README [like this](https://github.com/calcom/cal.com/pull/10429/files/155ac84537d12026f595551fe3542e810b029714#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5R509)
4. Also, no env variables should be added by an app. They should be [added in `zod.ts`](https://github.com/calcom/cal.com/blob/main/packages/app-store/jitsivideo/zod.ts) and then they would be automatically available to be modified by the cal.com app admin.

View File

@ -0,0 +1,8 @@
---
items:
- iframe: { src: https://www.youtube.com/embed/tExtOJqnI0Q }
- 1.jpg
- 2.png
---
{DESCRIPTION}

View File

@ -0,0 +1,16 @@
import { createDefaultInstallation } from "@calcom/app-store/_utils/installation";
import type { AppDeclarativeHandler } from "@calcom/types/AppHandler";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
supportsMultipleInstalls: false,
handlerType: "add",
createCredential: ({ appType, user, slug, teamId }) =>
createDefaultInstallation({ appType, userId: user.id, slug, key: {}, teamId }),
};
export default handler;

View File

@ -0,0 +1 @@
export { default as add } from "./add";

View File

@ -0,0 +1,17 @@
{
"/*": "Don't modify slug - If required, do it using cli edit command",
"name": "Alby",
"slug": "alby",
"type": "alby_payment",
"logo": "icon.svg",
"url": "https://example.com/link",
"variant": "payment",
"categories": ["payment"],
"publisher": "Alby",
"email": "support@getalby.com",
"description": "Your Bitcoin & Nostr companion for the web. Use Alby to charge Satoshi for your Cal.com meetings.\r",
"isTemplate": false,
"__createdUsingCli": true,
"__template": "basic",
"dirName": "alby"
}

View File

@ -0,0 +1 @@
export * as api from "./api";

View File

@ -0,0 +1,14 @@
{
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"name": "@calcom/alby",
"version": "0.0.0",
"main": "./index.ts",
"dependencies": {
"@calcom/lib": "*"
},
"devDependencies": {
"@calcom/types": "*"
},
"description": "Your Bitcoin & Nostr companion for the web. Use Alby to charge Satoshi for your Cal.com meetings.\r"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

View File

@ -0,0 +1,12 @@
<svg width="554" height="554" viewBox="0 0 554 554" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="554" height="554" rx="64" fill="white"/>
<path d="M127.7 202.4C107.431 202.4 90.9999 185.969 90.9999 165.7C90.9999 145.431 107.431 129 127.7 129C147.969 129 164.4 145.431 164.4 165.7C164.4 185.969 147.969 202.4 127.7 202.4Z" fill="black"/>
<path d="M121.6 160.2L190.1 228.7" stroke="black" stroke-width="18.3"/>
<path d="M427.2 202.4C447.469 202.4 463.9 185.969 463.9 165.7C463.9 145.431 447.469 129 427.2 129C406.931 129 390.5 145.431 390.5 165.7C390.5 185.969 406.931 202.4 427.2 202.4Z" fill="black"/>
<path d="M434 160.2L365.5 228.7" stroke="black" stroke-width="18.3"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M138.1 384.6C128.451 380.122 120.543 372.597 115.592 363.182C110.641 353.768 108.922 342.987 110.7 332.5C127.3 240 196.2 170.6 278.7 170.6C361.4 170.6 430.5 240.3 446.8 333.2C448.539 343.695 446.779 354.47 441.792 363.867C436.805 373.263 428.866 380.759 419.2 385.2C375.441 405.799 327.664 416.454 279.3 416.4C228.8 416.4 180.9 405 138.1 384.6Z" fill="#FFDF6F"/>
<path d="M119.8 334.2C135.8 244.7 201.8 179.8 278.8 179.8V161.5C190.6 161.5 118.8 235.3 101.7 330.9L119.7 334.1L119.8 334.2ZM278.8 179.8C355.8 179.8 422 245.1 437.8 334.8L455.8 331.6C439 235.6 367 161.5 278.8 161.5V179.8ZM415.3 376.9C372.76 396.917 326.314 407.265 279.3 407.2V425.5C330.7 425.5 379.4 414 423.1 393.5L415.3 376.9ZM279.3 407.2C230.2 407.2 183.7 396.1 142.1 376.3L134.2 392.9C178.2 413.9 227.4 425.5 279.3 425.5V407.2ZM437.8 334.8C440.8 352.1 431.6 369.3 415.3 376.9L423.1 393.5C446.5 382.5 460.4 357.5 455.8 331.5L437.8 334.8ZM101.7 330.8C99.5558 343.269 101.577 356.098 107.451 367.303C113.325 378.509 122.725 387.47 134.2 392.8L142.1 376.3C134.267 372.688 127.84 366.599 123.81 358.973C119.78 351.347 118.371 342.606 119.8 334.1L101.6 330.9L101.7 330.8Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M173.4 361.6C157.5 355.1 148.1 338.2 153.6 321.9C170.6 271.7 220.2 235.4 278.7 235.4C337.2 235.4 386.8 271.7 403.8 321.9C409.4 338.2 399.9 355.1 384 361.6C350.559 375.19 314.796 382.153 278.7 382.1C241.5 382.1 205.9 374.8 173.4 361.6Z" fill="black"/>
<path d="M320.9 338.1C337.8 338.1 351.5 327.176 351.5 313.7C351.5 300.224 337.8 289.3 320.9 289.3C304 289.3 290.3 300.224 290.3 313.7C290.3 327.176 304 338.1 320.9 338.1Z" fill="white"/>
<path d="M233.4 338.1C250.3 338.1 264 327.176 264 313.7C264 300.224 250.3 289.3 233.4 289.3C216.5 289.3 202.8 300.224 202.8 313.7C202.8 327.176 216.5 338.1 233.4 338.1Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -16,6 +16,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
id: req.session?.user?.id,
},
select: {
email: true,
id: true,
},
});
@ -36,6 +37,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
const dav = new CalendarService({
id: 0,
...data,
user: { email: user.email },
});
await dav?.listCalendars();
await prisma.credential.create({

View File

@ -2,6 +2,7 @@
This file is autogenerated using the command `yarn app-store:build --watch`.
Don't modify this file manually.
**/
import alby_config_json from "./alby/config.json";
import amie_config_json from "./amie/config.json";
import { metadata as applecalendar__metadata_ts } from "./applecalendar/_metadata";
import around_config_json from "./around/config.json";
@ -73,6 +74,7 @@ import zohocrm_config_json from "./zohocrm/config.json";
import { metadata as zoomvideo__metadata_ts } from "./zoomvideo/_metadata";
export const appStoreMetadata = {
alby: alby_config_json,
amie: amie_config_json,
applecalendar: applecalendar__metadata_ts,
around: around_config_json,

View File

@ -3,6 +3,7 @@
Don't modify this file manually.
**/
export const apiHandlers = {
alby: import("./alby/api"),
amie: import("./amie/api"),
applecalendar: import("./applecalendar/api"),
around: import("./around/api"),

View File

@ -1,4 +1,5 @@
import type { PrismaClient } from "@calcom/prisma/client";
import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential";
import { TRPCError } from "@calcom/trpc/server";
import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
@ -24,6 +25,7 @@ export const projectMutationHandler = async ({ ctx, input }: ProjectMutationHand
where: {
userId: user?.id,
},
select: credentialForCalendarServiceSelect,
});
if (!credential) {

View File

@ -1,4 +1,5 @@
import type { PrismaClient } from "@calcom/prisma/client";
import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential";
import { TRPCError } from "@calcom/trpc/server";
import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
@ -20,6 +21,7 @@ export const projectHandler = async ({ ctx }: ProjectsHandlerOptions) => {
where: {
userId: user?.id,
},
select: credentialForCalendarServiceSelect,
});
if (!credential) {
throw new TRPCError({ code: "FORBIDDEN", message: "No credential found for user" });

View File

@ -17,6 +17,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
},
select: {
id: true,
email: true,
},
});
@ -36,6 +37,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
const dav = new CalendarService({
id: 0,
...data,
user: { email: user.email },
});
await dav?.listCalendars();
await prisma.credential.create({

View File

@ -60,6 +60,7 @@ export const FAKE_DAILY_CREDENTIAL: CredentialPayload & { invalid: boolean } = {
type: "daily_video",
key: { apikey: process.env.DAILY_API_KEY },
userId: 0,
user: { email: "" },
appId: "daily-video",
invalid: false,
teamId: null,

View File

@ -26,6 +26,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) {
},
select: {
id: true,
email: true,
},
});
@ -42,6 +43,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) {
const dav = new CalendarService({
id: 0,
...data,
user: { email: user.email },
});
await dav?.listCalendars();
await prisma.credential.create({

View File

@ -26,6 +26,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) {
},
select: {
id: true,
email: true,
},
});
@ -41,6 +42,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) {
try {
const dav = new CalendarService({
id: 0,
user: { email: user.email },
...data,
});
await dav?.listCalendars();

View File

@ -36,7 +36,7 @@ export async function getHandler(req: NextApiRequest, res: NextApiResponse) {
};
try {
const service = new CalendarService({ id: 0, ...data });
const service = new CalendarService({ id: 0, user: { email: session.user.email || "" }, ...data });
await service?.listCalendars();
await prisma.credential.create({ data });
} catch (reason) {

View File

@ -0,0 +1,101 @@
import prismaMock from "../../../../tests/libs/__mocks__/prisma";
import { afterEach, expect, test, vi } from "vitest";
import CalendarService from "./CalendarService";
afterEach(() => {
vi.resetAllMocks();
});
vi.mock("@calcom/features/flags/server/utils", () => ({
getFeatureFlagMap: vi.fn().mockResolvedValue({
"calendar-cache": true,
}),
}));
vi.mock("./getGoogleAppKeys", () => ({
getGoogleAppKeys: vi.fn().mockResolvedValue({
client_id: "xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
client_secret: "xxxxxxxxxxxxxxxxxx",
redirect_uris: ["http://localhost:3000/api/integrations/googlecalendar/callback"],
}),
}));
const googleTestCredential = {
scope: "https://www.googleapis.com/auth/calendar.events",
token_type: "Bearer",
expiry_date: 1625097600000,
access_token: "",
refresh_token: "",
};
const testCredential = {
appId: "test",
id: 1,
invalid: false,
key: googleTestCredential,
type: "test",
userId: 1,
user: { email: "example@cal.com" },
teamId: 1,
};
const testSelectedCalendar = {
userId: 1,
integration: "google_calendar",
externalId: "example@cal.com",
};
const testFreeBusyResponse = {
kind: "calendar#freeBusy",
timeMax: "2024-01-01T20:59:59.000Z",
timeMin: "2023-11-30T20:00:00.000Z",
calendars: {
"example@cal.com": {
busy: [
{ end: "2023-12-01T19:00:00Z", start: "2023-12-01T18:00:00Z" },
{ end: "2023-12-04T19:00:00Z", start: "2023-12-04T18:00:00Z" },
],
},
"xxxxxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com": { busy: [] },
},
};
const calendarCacheResponse = {
key: "dummy",
expiresAt: new Date(),
credentialId: 1,
value: testFreeBusyResponse,
};
test("Calendar Cache is being called", async () => {
prismaMock.calendarCache.findUnique
// First call won't have a cache
.mockResolvedValueOnce(null)
// Second call will have a cache
.mockResolvedValueOnce(calendarCacheResponse);
// prismaMock.calendarCache.create.mock.
const calendarService = new CalendarService(testCredential);
// @ts-expect-error authedCalendar is a private method, hence the TS error
vi.spyOn(calendarService, "authedCalendar").mockReturnValue(
// @ts-expect-error trust me bro
{
freebusy: {
query: vi.fn().mockReturnValue({
data: testFreeBusyResponse,
}),
},
}
);
await calendarService.getAvailability(new Date().toISOString(), new Date().toISOString(), [
testSelectedCalendar,
]);
await calendarService.getAvailability(new Date().toISOString(), new Date().toISOString(), [
testSelectedCalendar,
]);
expect(prismaMock.calendarCache.findUnique).toHaveBeenCalled();
expect(prismaMock.calendarCache.upsert).toHaveBeenCalledOnce();
});

View File

@ -4,6 +4,7 @@ import type { calendar_v3 } from "googleapis";
import { google } from "googleapis";
import { MeetLocationType } from "@calcom/app-store/locations";
import { getFeatureFlagMap } from "@calcom/features/flags/server/utils";
import { getLocation, getRichDescription } from "@calcom/lib/CalEventParser";
import type CalendarService from "@calcom/lib/CalendarService";
import logger from "@calcom/lib/logger";
@ -24,15 +25,48 @@ interface GoogleCalError extends Error {
code?: number;
}
const ONE_MINUTE_MS = 60 * 1000;
const CACHING_TIME = ONE_MINUTE_MS;
/** Expand the start date to the start of the month */
function getTimeMin(timeMin: string) {
const dateMin = new Date(timeMin);
return new Date(dateMin.getFullYear(), dateMin.getMonth(), 1, 0, 0, 0, 0).toISOString();
}
/** Expand the end date to the end of the month */
function getTimeMax(timeMax: string) {
const dateMax = new Date(timeMax);
return new Date(dateMax.getFullYear(), dateMax.getMonth() + 1, 0, 0, 0, 0, 0).toISOString();
}
/**
* Enable or disable the expanded cache
* TODO: Make this configurable
* */
const ENABLE_EXPANDED_CACHE = true;
/**
* By expanding the cache to whole months, we can save round trips to the third party APIs.
* In this case we already have the data in the database, so we can just return it.
*/
function handleMinMax(min: string, max: string) {
if (!ENABLE_EXPANDED_CACHE) return { timeMin: min, timeMax: max };
return { timeMin: getTimeMin(min), timeMax: getTimeMax(max) };
}
export default class GoogleCalendarService implements Calendar {
private integrationName = "";
private auth: { getToken: () => Promise<MyGoogleAuth> };
private log: typeof logger;
private credential: CredentialPayload;
constructor(credential: CredentialPayload) {
this.integrationName = "google_calendar";
this.credential = credential;
this.auth = this.googleAuth(credential);
this.log = logger.getChildLogger({ prefix: [`[[lib] ${this.integrationName}`] });
this.credential = credential;
}
private googleAuth = (credential: CredentialPayload) => {
@ -84,260 +118,288 @@ export default class GoogleCalendarService implements Calendar {
};
};
async createEvent(calEventRaw: CalendarEvent, credentialId: number): Promise<NewCalendarEventType> {
const eventAttendees = calEventRaw.attendees.map(({ id: _id, ...rest }) => ({
private authedCalendar = async () => {
const myGoogleAuth = await this.auth.getToken();
const calendar = google.calendar({
version: "v3",
auth: myGoogleAuth,
});
return calendar;
};
private getAttendees = (event: CalendarEvent) => {
// When rescheduling events we know the external id of the calendar so we can just look for it in the destinationCalendar array.
const selectedHostDestinationCalendar = event.destinationCalendar?.find(
(cal) => cal.credentialId === this.credential.id
);
const eventAttendees = event.attendees.map(({ id: _id, ...rest }) => ({
...rest,
responseStatus: "accepted",
}));
// TODO: Check every other CalendarService for team members
const teamMembers =
calEventRaw.team?.members.map((m) => ({
email: m.email,
displayName: m.name,
const attendees: calendar_v3.Schema$EventAttendee[] = [
{
...event.organizer,
id: String(event.organizer.id),
responseStatus: "accepted",
})) || [];
return new Promise(async (resolve, reject) => {
const selectedHostDestinationCalendar = calEventRaw.destinationCalendar?.find(
(cal) => cal.credentialId === credentialId
);
const myGoogleAuth = await this.auth.getToken();
const payload: calendar_v3.Schema$Event = {
summary: calEventRaw.title,
description: getRichDescription(calEventRaw),
start: {
dateTime: calEventRaw.startTime,
timeZone: calEventRaw.organizer.timeZone,
},
end: {
dateTime: calEventRaw.endTime,
timeZone: calEventRaw.organizer.timeZone,
},
attendees: [
{
...calEventRaw.organizer,
id: String(calEventRaw.organizer.id),
organizer: true,
// Tried changing the display name to the user but GCal will not let you do that. It will only display the name of the external calendar. Leaving this in just incase it works in the future.
displayName: event.organizer.name,
email: selectedHostDestinationCalendar?.externalId ?? event.organizer.email,
},
...eventAttendees,
];
if (event.team?.members) {
// TODO: Check every other CalendarService for team members
const teamAttendeesWithoutCurrentUser = event.team.members
.filter((member) => member.email !== this.credential.user?.email)
.map((m) => {
const teamMemberDestinationCalendar = event.destinationCalendar?.find(
(calendar) => calendar.integration === "google_calendar" && calendar.userId === m.id
);
return {
email: teamMemberDestinationCalendar?.externalId ?? m.email,
displayName: m.name,
responseStatus: "accepted",
organizer: true,
email: selectedHostDestinationCalendar?.externalId
? selectedHostDestinationCalendar.externalId
: calEventRaw.organizer.email,
},
...eventAttendees,
...teamMembers,
],
reminders: {
useDefault: true,
},
guestsCanSeeOtherGuests: !!calEventRaw.seatsPerTimeSlot ? calEventRaw.seatsShowAttendees : true,
};
};
});
attendees.push(...teamAttendeesWithoutCurrentUser);
}
if (calEventRaw.location) {
payload["location"] = getLocation(calEventRaw);
}
return attendees;
};
if (calEventRaw.conferenceData && calEventRaw.location === MeetLocationType) {
payload["conferenceData"] = calEventRaw.conferenceData;
}
const calendar = google.calendar({
version: "v3",
async createEvent(calEventRaw: CalendarEvent, credentialId: number): Promise<NewCalendarEventType> {
const payload: calendar_v3.Schema$Event = {
summary: calEventRaw.title,
description: getRichDescription(calEventRaw),
start: {
dateTime: calEventRaw.startTime,
timeZone: calEventRaw.organizer.timeZone,
},
end: {
dateTime: calEventRaw.endTime,
timeZone: calEventRaw.organizer.timeZone,
},
attendees: this.getAttendees(calEventRaw),
reminders: {
useDefault: true,
},
guestsCanSeeOtherGuests: !!calEventRaw.seatsPerTimeSlot ? calEventRaw.seatsShowAttendees : true,
};
if (calEventRaw.location) {
payload["location"] = getLocation(calEventRaw);
}
if (calEventRaw.conferenceData && calEventRaw.location === MeetLocationType) {
payload["conferenceData"] = calEventRaw.conferenceData;
}
const calendar = await this.authedCalendar();
// Find in calEventRaw.destinationCalendar the one with the same credentialId
const selectedCalendar =
calEventRaw.destinationCalendar?.find((cal) => cal.credentialId === credentialId)?.externalId ||
"primary";
try {
const event = await calendar.events.insert({
calendarId: selectedCalendar,
requestBody: payload,
conferenceDataVersion: 1,
sendUpdates: "none",
});
// Find in calEventRaw.destinationCalendar the one with the same credentialId
const selectedCalendar =
calEventRaw.destinationCalendar?.find((cal) => cal.credentialId === credentialId)?.externalId ||
"primary";
calendar.events.insert(
{
auth: myGoogleAuth,
if (event && event.data.id && event.data.hangoutLink) {
await calendar.events.patch({
// Update the same event but this time we know the hangout link
calendarId: selectedCalendar,
requestBody: payload,
conferenceDataVersion: 1,
sendUpdates: "none",
},
function (error, event) {
if (error || !event?.data) {
console.error("There was an error contacting google calendar service: ", error);
return reject(error);
}
eventId: event.data.id || "",
requestBody: {
description: getRichDescription({
...calEventRaw,
additionalInformation: { hangoutLink: event.data.hangoutLink },
}),
},
});
}
if (event && event.data.id && event.data.hangoutLink) {
calendar.events.patch({
// Update the same event but this time we know the hangout link
calendarId: selectedCalendar,
auth: myGoogleAuth,
eventId: event.data.id || "",
requestBody: {
description: getRichDescription({
...calEventRaw,
additionalInformation: { hangoutLink: event.data.hangoutLink },
}),
},
});
}
return resolve({
uid: "",
...event.data,
id: event.data.id || "",
additionalInfo: {
hangoutLink: event.data.hangoutLink || "",
},
type: "google_calendar",
password: "",
url: "",
iCalUID: event.data.iCalUID,
});
}
);
});
return {
uid: "",
...event.data,
id: event.data.id || "",
additionalInfo: {
hangoutLink: event.data.hangoutLink || "",
},
type: "google_calendar",
password: "",
url: "",
iCalUID: event.data.iCalUID,
};
} catch (error) {
console.error("There was an error contacting google calendar service: ", error);
throw error;
}
}
async updateEvent(uid: string, event: CalendarEvent, externalCalendarId: string): Promise<any> {
return new Promise(async (resolve, reject) => {
const [mainHostDestinationCalendar] =
event?.destinationCalendar && event?.destinationCalendar.length > 0 ? event.destinationCalendar : [];
const myGoogleAuth = await this.auth.getToken();
const eventAttendees = event.attendees.map(({ ...rest }) => ({
...rest,
responseStatus: "accepted",
}));
const teamMembers =
event.team?.members.map((m) => ({
email: m.email,
displayName: m.name,
responseStatus: "accepted",
})) || [];
const payload: calendar_v3.Schema$Event = {
summary: event.title,
description: getRichDescription(event),
start: {
dateTime: event.startTime,
timeZone: event.organizer.timeZone,
},
end: {
dateTime: event.endTime,
timeZone: event.organizer.timeZone,
},
attendees: [
{
...event.organizer,
id: String(event.organizer.id),
organizer: true,
responseStatus: "accepted",
email: mainHostDestinationCalendar?.externalId
? mainHostDestinationCalendar.externalId
: event.organizer.email,
},
...(eventAttendees as any),
...(teamMembers as any),
],
reminders: {
useDefault: true,
},
guestsCanSeeOtherGuests: !!event.seatsPerTimeSlot ? event.seatsShowAttendees : true,
};
const payload: calendar_v3.Schema$Event = {
summary: event.title,
description: getRichDescription(event),
start: {
dateTime: event.startTime,
timeZone: event.organizer.timeZone,
},
end: {
dateTime: event.endTime,
timeZone: event.organizer.timeZone,
},
attendees: this.getAttendees(event),
reminders: {
useDefault: true,
},
guestsCanSeeOtherGuests: !!event.seatsPerTimeSlot ? event.seatsShowAttendees : true,
};
if (event.location) {
payload["location"] = getLocation(event);
}
if (event.location) {
payload["location"] = getLocation(event);
}
if (event.conferenceData && event.location === MeetLocationType) {
payload["conferenceData"] = event.conferenceData;
}
if (event.conferenceData && event.location === MeetLocationType) {
payload["conferenceData"] = event.conferenceData;
}
const calendar = google.calendar({
version: "v3",
auth: myGoogleAuth,
const calendar = await this.authedCalendar();
const selectedCalendar = externalCalendarId
? externalCalendarId
: event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId;
try {
const evt = await calendar.events.update({
calendarId: selectedCalendar,
eventId: uid,
sendNotifications: true,
sendUpdates: "none",
requestBody: payload,
conferenceDataVersion: 1,
});
const selectedCalendar = externalCalendarId
? externalCalendarId
: event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId;
calendar.events.update(
{
auth: myGoogleAuth,
if (evt && evt.data.id && evt.data.hangoutLink && event.location === MeetLocationType) {
calendar.events.patch({
// Update the same event but this time we know the hangout link
calendarId: selectedCalendar,
eventId: uid,
sendNotifications: true,
sendUpdates: "none",
requestBody: payload,
conferenceDataVersion: 1,
},
function (err, evt) {
if (err) {
console.error("There was an error contacting google calendar service: ", err);
return reject(err);
}
if (evt && evt.data.id && evt.data.hangoutLink && event.location === MeetLocationType) {
calendar.events.patch({
// Update the same event but this time we know the hangout link
calendarId: selectedCalendar,
auth: myGoogleAuth,
eventId: evt.data.id || "",
requestBody: {
description: getRichDescription({
...event,
additionalInformation: { hangoutLink: evt.data.hangoutLink },
}),
},
});
return resolve({
uid: "",
...evt.data,
id: evt.data.id || "",
additionalInfo: {
hangoutLink: evt.data.hangoutLink || "",
},
type: "google_calendar",
password: "",
url: "",
iCalUID: evt.data.iCalUID,
});
}
return resolve(evt?.data);
}
);
});
eventId: evt.data.id || "",
requestBody: {
description: getRichDescription({
...event,
additionalInformation: { hangoutLink: evt.data.hangoutLink },
}),
},
});
return {
uid: "",
...evt.data,
id: evt.data.id || "",
additionalInfo: {
hangoutLink: evt.data.hangoutLink || "",
},
type: "google_calendar",
password: "",
url: "",
iCalUID: evt.data.iCalUID,
};
}
return evt?.data;
} catch (error) {
console.error("There was an error contacting google calendar service: ", error);
throw error;
}
}
async deleteEvent(uid: string, event: CalendarEvent, externalCalendarId?: string | null): Promise<void> {
return new Promise(async (resolve, reject) => {
const myGoogleAuth = await this.auth.getToken();
const calendar = google.calendar({
version: "v3",
auth: myGoogleAuth,
const calendar = await this.authedCalendar();
const defaultCalendarId = "primary";
const calendarId = externalCalendarId
? externalCalendarId
: event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId;
try {
const event = await calendar.events.delete({
calendarId: calendarId ? calendarId : defaultCalendarId,
eventId: uid,
sendNotifications: false,
sendUpdates: "none",
});
return event?.data;
} catch (error) {
const err = error as GoogleCalError;
/**
* 410 is when an event is already deleted on the Google cal before on cal.com
* 404 is when the event is on a different calendar
*/
if (err.code === 410) return;
console.error("There was an error contacting google calendar service: ", err);
if (err.code === 404) return;
throw err;
}
}
const defaultCalendarId = "primary";
const calendarId = externalCalendarId
? externalCalendarId
: event.destinationCalendar?.find((cal) => cal.externalId === externalCalendarId)?.externalId;
calendar.events.delete(
{
auth: myGoogleAuth,
calendarId: calendarId ? calendarId : defaultCalendarId,
eventId: uid,
sendNotifications: false,
sendUpdates: "none",
async getCacheOrFetchAvailability(args: {
timeMin: string;
timeMax: string;
items: { id: string }[];
}): Promise<calendar_v3.Schema$FreeBusyResponse> {
const calendar = await this.authedCalendar();
const flags = await getFeatureFlagMap(prisma);
if (!flags["calendar-cache"]) {
this.log.warn("Calendar Cache is disabled - Skipping");
const { timeMin, timeMax, items } = args;
const apires = await calendar.freebusy.query({
requestBody: { timeMin, timeMax, items },
});
return apires.data;
}
const { timeMin: _timeMin, timeMax: _timeMax, items } = args;
const { timeMin, timeMax } = handleMinMax(_timeMin, _timeMax);
const key = JSON.stringify({ timeMin, timeMax, items });
const cached = await prisma.calendarCache.findUnique({
where: {
credentialId_key: {
credentialId: this.credential.id,
key,
},
function (err: GoogleCalError | null, event) {
if (err) {
/**
* 410 is when an event is already deleted on the Google cal before on cal.com
* 404 is when the event is on a different calendar
*/
if (err.code === 410) return resolve();
console.error("There was an error contacting google calendar service: ", err);
if (err.code === 404) return resolve();
return reject(err);
}
return resolve(event?.data);
}
);
expiresAt: { gte: new Date(Date.now()) },
},
});
if (cached) return cached.value as unknown as calendar_v3.Schema$FreeBusyResponse;
const apires = await calendar.freebusy.query({
requestBody: { timeMin, timeMax, items },
});
// Skipping await to respond faster
await prisma.calendarCache.upsert({
where: {
credentialId_key: {
credentialId: this.credential.id,
key,
},
},
update: {
value: JSON.parse(JSON.stringify(apires.data)),
expiresAt: new Date(Date.now() + CACHING_TIME),
},
create: {
value: JSON.parse(JSON.stringify(apires.data)),
credentialId: this.credential.id,
key,
expiresAt: new Date(Date.now() + CACHING_TIME),
},
});
return apires.data;
}
async getAvailability(
@ -345,96 +407,65 @@ export default class GoogleCalendarService implements Calendar {
dateTo: string,
selectedCalendars: IntegrationCalendar[]
): Promise<EventBusyDate[]> {
return new Promise(async (resolve, reject) => {
const myGoogleAuth = await this.auth.getToken();
const calendar = google.calendar({
version: "v3",
auth: myGoogleAuth,
const calendar = await this.authedCalendar();
const selectedCalendarIds = selectedCalendars
.filter((e) => e.integration === this.integrationName)
.map((e) => e.externalId);
if (selectedCalendarIds.length === 0 && selectedCalendars.length > 0) {
// Only calendars of other integrations selected
return [];
}
async function getCalIds() {
if (selectedCalendarIds.length !== 0) return selectedCalendarIds;
const cals = await calendar.calendarList.list({ fields: "items(id)" });
if (!cals.data.items) return [];
return cals.data.items.reduce((c, cal) => (cal.id ? [...c, cal.id] : c), [] as string[]);
}
try {
const calsIds = await getCalIds();
const freeBusyData = await this.getCacheOrFetchAvailability({
timeMin: dateFrom,
timeMax: dateTo,
items: calsIds.map((id) => ({ id })),
});
const selectedCalendarIds = selectedCalendars
.filter((e) => e.integration === this.integrationName)
.map((e) => e.externalId);
if (selectedCalendarIds.length === 0 && selectedCalendars.length > 0) {
// Only calendars of other integrations selected
resolve([]);
return;
}
(selectedCalendarIds.length === 0
? calendar.calendarList
.list({
fields: "items(id)",
})
.then((cals) => cals.data.items?.map((cal) => cal.id).filter(Boolean) || [])
: Promise.resolve(selectedCalendarIds)
)
.then((calsIds) => {
calendar.freebusy.query(
{
requestBody: {
timeMin: dateFrom,
timeMax: dateTo,
items: calsIds.map((id) => ({ id: id })),
},
},
(err, apires) => {
if (err) return reject(err);
// If there's no calendar we just skip
if (!apires?.data.calendars) return resolve([]);
const result = Object.values(apires.data.calendars).reduce((c, i) => {
i.busy?.forEach((busyTime) => {
c.push({
start: busyTime.start || "",
end: busyTime.end || "",
});
});
return c;
}, [] as Prisma.PromiseReturnType<CalendarService["getAvailability"]>);
resolve(result);
}
);
})
.catch((err) => {
this.log.error("There was an error contacting google calendar service: ", err);
reject(err);
if (!freeBusyData?.calendars) throw new Error("No response from google calendar");
const result = Object.values(freeBusyData.calendars).reduce((c, i) => {
i.busy?.forEach((busyTime) => {
c.push({
start: busyTime.start || "",
end: busyTime.end || "",
});
});
});
return c;
}, [] as Prisma.PromiseReturnType<CalendarService["getAvailability"]>);
return result;
} catch (error) {
this.log.error("There was an error contacting google calendar service: ", error);
throw error;
}
}
async listCalendars(): Promise<IntegrationCalendar[]> {
return new Promise(async (resolve, reject) => {
const myGoogleAuth = await this.auth.getToken();
const calendar = google.calendar({
version: "v3",
auth: myGoogleAuth,
});
calendar.calendarList
.list({
fields: "items(id,summary,primary,accessRole)",
})
.then((cals) => {
resolve(
cals.data.items?.map((cal) => {
const calendar: IntegrationCalendar = {
externalId: cal.id ?? "No id",
integration: this.integrationName,
name: cal.summary ?? "No name",
primary: cal.primary ?? false,
readOnly: !(cal.accessRole === "writer" || cal.accessRole === "owner") && true,
email: cal.id ?? "",
};
return calendar;
}) || []
);
})
.catch((err: Error) => {
this.log.error("There was an error contacting google calendar service: ", err);
reject(err);
});
});
const calendar = await this.authedCalendar();
try {
const cals = await calendar.calendarList.list({ fields: "items(id,summary,primary,accessRole)" });
if (!cals.data.items) return [];
return cals.data.items.map(
(cal) =>
({
externalId: cal.id ?? "No id",
integration: this.integrationName,
name: cal.summary ?? "No name",
primary: cal.primary ?? false,
readOnly: !(cal.accessRole === "writer" || cal.accessRole === "owner") && true,
email: cal.id ?? "",
} satisfies IntegrationCalendar)
);
} catch (error) {
this.log.error("There was an error contacting google calendar service: ", error);
throw error;
}
}
}

View File

@ -34,11 +34,13 @@ export default class LarkCalendarService implements Calendar {
private integrationName = "";
private log: typeof logger;
auth: { getToken: () => Promise<string> };
private credential: CredentialPayload;
constructor(credential: CredentialPayload) {
this.integrationName = "lark_calendar";
this.auth = this.larkAuth(credential);
this.log = logger.getChildLogger({ prefix: [`[[lib] ${this.integrationName}`] });
this.credential = credential;
}
private larkAuth = (credential: CredentialPayload) => {
@ -122,10 +124,13 @@ export default class LarkCalendarService implements Calendar {
});
};
async createEvent(event: CalendarEvent): Promise<NewCalendarEventType> {
async createEvent(event: CalendarEvent, credentialId: number): Promise<NewCalendarEventType> {
let eventId = "";
let eventRespData;
const [mainHostDestinationCalendar] = event.destinationCalendar ?? [];
const mainHostDestinationCalendar = event.destinationCalendar
? event.destinationCalendar.find((cal) => cal.credentialId === this.credential.id) ??
event.destinationCalendar[0]
: undefined;
const calendarId = mainHostDestinationCalendar?.externalId;
if (!calendarId) {
throw new Error("no calendar id");
@ -143,7 +148,7 @@ export default class LarkCalendarService implements Calendar {
}
try {
await this.createAttendees(event, eventId);
await this.createAttendees(event, eventId, credentialId);
return {
...eventRespData,
uid: eventRespData.data.event.event_id as string,
@ -160,8 +165,11 @@ export default class LarkCalendarService implements Calendar {
}
}
private createAttendees = async (event: CalendarEvent, eventId: string) => {
const [mainHostDestinationCalendar] = event.destinationCalendar ?? [];
private createAttendees = async (event: CalendarEvent, eventId: string, credentialId: number) => {
const mainHostDestinationCalendar = event.destinationCalendar
? event.destinationCalendar.find((cal) => cal.credentialId === credentialId) ??
event.destinationCalendar[0]
: undefined;
const calendarId = mainHostDestinationCalendar?.externalId;
if (!calendarId) {
this.log.error("no calendar id provided in createAttendees");
@ -189,7 +197,9 @@ export default class LarkCalendarService implements Calendar {
async updateEvent(uid: string, event: CalendarEvent, externalCalendarId?: string) {
const eventId = uid;
let eventRespData;
const [mainHostDestinationCalendar] = event.destinationCalendar ?? [];
const mainHostDestinationCalendar = event.destinationCalendar?.find(
(cal) => cal.externalId === externalCalendarId
);
const calendarId = externalCalendarId || mainHostDestinationCalendar?.externalId;
if (!calendarId) {
this.log.error("no calendar id provided in updateEvent");
@ -234,7 +244,9 @@ export default class LarkCalendarService implements Calendar {
* @returns
*/
async deleteEvent(uid: string, event: CalendarEvent, externalCalendarId?: string) {
const [mainHostDestinationCalendar] = event.destinationCalendar ?? [];
const mainHostDestinationCalendar = event.destinationCalendar?.find(
(cal) => cal.externalId === externalCalendarId
);
const calendarId = externalCalendarId || mainHostDestinationCalendar?.externalId;
if (!calendarId) {
this.log.error("no calendar id provided in deleteEvent");
@ -393,13 +405,16 @@ export default class LarkCalendarService implements Calendar {
attendeeArray.push(attendee);
});
event.team?.members.forEach((member) => {
const attendee: LarkEventAttendee = {
type: "third_party",
is_optional: false,
third_party_email: member.email,
};
attendeeArray.push(attendee);
if (member.email !== this.credential.user?.email) {
const attendee: LarkEventAttendee = {
type: "third_party",
is_optional: false,
third_party_email: member.email,
};
attendeeArray.push(attendee);
}
});
return attendeeArray;
};
}

View File

@ -61,16 +61,20 @@ export default class Office365CalendarService implements Calendar {
private accessToken: string | null = null;
auth: { getToken: () => Promise<string> };
private apiGraphUrl = "https://graph.microsoft.com/v1.0";
private credential: CredentialPayload;
constructor(credential: CredentialPayload) {
this.integrationName = "office365_calendar";
this.auth = this.o365Auth(credential);
this.credential = credential;
this.log = logger.getChildLogger({ prefix: [`[[lib] ${this.integrationName}`] });
}
async createEvent(event: CalendarEvent): Promise<NewCalendarEventType> {
const [mainHostDestinationCalendar] = event.destinationCalendar ?? [];
async createEvent(event: CalendarEvent, credentialId: number): Promise<NewCalendarEventType> {
const mainHostDestinationCalendar = event.destinationCalendar
? event.destinationCalendar.find((cal) => cal.credentialId === credentialId) ??
event.destinationCalendar[0]
: undefined;
try {
const eventsUrl = mainHostDestinationCalendar?.externalId
? `/me/calendars/${mainHostDestinationCalendar?.externalId}/events`
@ -295,6 +299,16 @@ export default class Office365CalendarService implements Calendar {
timeZone: event.organizer.timeZone,
},
attendees: [
// Add the calEvent organizer
{
emailAddress: {
address: event.destinationCalendar
? event.destinationCalendar.find((cal) => cal.userId === event.organizer.id)?.externalId ??
event.organizer.email
: event.organizer.email,
name: event.organizer.name,
},
},
...event.attendees.map((attendee) => ({
emailAddress: {
address: attendee.email,
@ -303,13 +317,20 @@ export default class Office365CalendarService implements Calendar {
type: "required",
})),
...(event.team?.members
? event.team?.members.map((member) => ({
emailAddress: {
address: member.email,
name: member.name,
},
type: "required",
}))
? event.team?.members
.filter((member) => member.email !== this.credential.user?.email)
.map((member) => {
const destinationCalendar =
event.destinationCalendar &&
event.destinationCalendar.find((cal) => cal.userId === member.id);
return {
emailAddress: {
address: destinationCalendar?.externalId ?? member.email,
name: member.name,
},
type: "required",
};
})
: []),
],
location: event.location ? { displayName: getLocation(event) } : undefined,
@ -454,12 +475,13 @@ export default class Office365CalendarService implements Calendar {
(acc: BufferedBusyTime[], subResponse: { body: { value?: BodyValue[]; error?: Error[] } }) => {
if (!subResponse.body?.value) return acc;
return acc.concat(
subResponse.body.value
.filter((evt) => evt.showAs !== "free" && evt.showAs !== "workingElsewhere")
.map((evt) => ({
subResponse.body.value.reduce((acc: BufferedBusyTime[], evt: BodyValue) => {
if (evt.showAs === "free" || evt.showAs === "workingElsewhere") return acc;
return acc.concat({
start: evt.start.dateTime + "Z",
end: evt.end.dateTime + "Z",
}))
});
}, [])
);
},
[]

View File

@ -53,7 +53,7 @@ class Paypal {
const { access_token, expires_in } = await response.json();
this.accessToken = access_token;
this.expiresAt = Date.now() + expires_in;
} else {
} else if (response?.status) {
console.error(`Request failed with status ${response.status}`);
}
} catch (error) {
@ -127,7 +127,7 @@ class Paypal {
});
if (captureResult.ok) {
const result = await captureResult.json();
if (result.body.status === "COMPLETED") {
if (result?.status === "COMPLETED") {
// Get payment reference id
const payment = await prisma.payment.findFirst({
@ -153,7 +153,7 @@ class Paypal {
success: true,
data: Object.assign(
{},
{ ...(payment?.data as Record<string, string | number>), capture: result.body.id }
{ ...(payment?.data as Record<string, string | number>), capture: result.id }
) as unknown as Prisma.InputJsonValue,
},
});

View File

@ -1,3 +1,4 @@
import { AlertCircleIcon } from "lucide-react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useState } from "react";
@ -79,29 +80,76 @@ export default function PayPalSetup() {
</div>
</form>
<div>
<p className="text-lgf text-default mt-5 font-bold">Setup instructions</p>
<p className="text-lgf text-default mt-5 font-bold">Getting started with Paypal APP</p>
<p className="text-default font-semi mt-2">
Here in Cal.com we offer Paypal as one of our payment gateway. You can use your own Paypal
Business account to receive payments from your customers enabling and setting up price and
currency for each of your event types.
</p>
<ol className="text-default ml-1 list-decimal pl-2">
<p className="text-lgf text-default mt-5 inline-flex font-bold">
<AlertCircleIcon className="mr-2 mt-1 h-4 w-4" /> Important requirements:
</p>
<ul className="text-default ml-1 mt-2 list-disc pl-2">
<li>Paypal Business account</li>
<li>Paypal Developer account</li>
</ul>
<p className="text-default mb-2 mt-5 font-bold">Resources:</p>
<a
className="text-orange-600 underline"
target="_blank"
href="https://developer.paypal.com/api/rest/#link-getclientidandclientsecret">
Link to Paypal developer API REST Setup Guide:
https://developer.paypal.com/api/rest/#link-getclientidandclientsecret
</a>
<p className="text-lgf text-default mt-5 font-bold">Setup instructions</p>
<p className="text-default font-semi mt-2">
Remember to only proceed with the following steps if your account has already been upgraded to
a business account. Also keep in mind that some of the following steps might be different
since Paypal offers different experiences based on your country.
</p>
<ol className="text-default ml-1 mt-5 list-decimal pl-2">
{/* @TODO: translate */}
<li>
Log into your Paypal Developer account and create a new app{" "}
<a
target="_blank"
href="https://developer.paypal.com/dashboard/applications/"
href="https://developer.paypal.com/dashboard/applications/live"
className="text-orange-600 underline">
{t("here")}
</a>
.
</li>
<li>Choose a name for your application.</li>
<li>Select Online payments solution.</li>
<li>Choose &quot;No&quot; for &quot;Using online platform&quot;.</li>
<li>CheckoutAPI as integration product.</li>
<li>Accept terms and Create APP.</li>
<li>Go back to dashboard, click on new app and copy the credentials.</li>
<li>Click on the Create App button</li>
<li>
Go back to{" "}
<a
className="text-orange-600 underline"
href="https://developer.paypal.com/dashboard/applications/live">
dashboard
</a>
, click on new app created.
</li>
<li>Copy the Client ID and Secret Key using copy buttons one by one.</li>
<li>Paste them on the required field and save them.</li>
<li>You&apos;re all setup.</li>
<li>You should be all setup after this.</li>
</ol>
<p className="text-default mt-5 inline-flex font-bold">
<AlertCircleIcon className="mr-2 mt-1 h-4 w-4" />
Reminder:
</p>
<p className="text-default mt-2">
Our integration creates a specific webhook on your Paypal account that we use to report back
transactions to our system. If you delete this webhook, we will not be able to report back and
you should Uninstall and Install the app again for this to work again. Uninstalling the app
won&apos;t delete your current event type price/currency configuration but you would not be
able to receive bookings.
</p>
</div>
</div>
</div>

View File

@ -1,9 +1,11 @@
import Head from "next/head";
import { stringify } from "querystring";
import z from "zod";
import { getSlugOrRequestedSlug } from "@calcom/features/ee/organizations/lib/orgDomains";
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
import logger from "@calcom/lib/logger";
import { TRPCError } from "@calcom/trpc";
import type { AppGetServerSidePropsContext, AppPrisma } from "@calcom/types/AppGetServerSideProps";
import type { inferSSRProps } from "@calcom/types/inferSSRProps";
@ -92,11 +94,22 @@ export const getServerSideProps = async function getServerSideProps(
const { default: trpcRouter } = await import("@calcom/app-store/routing-forms/trpc/_router");
const caller = trpcRouter.createCaller(ctx);
const { v4: uuidv4 } = await import("uuid");
await caller.public.response({
formId: form.id,
formFillerId: uuidv4(),
response: response,
});
try {
await caller.public.response({
formId: form.id,
formFillerId: uuidv4(),
response: response,
});
} catch (e) {
if (e instanceof TRPCError) {
return {
props: {
form: serializableForm,
message: e.message,
},
};
}
}
//TODO: Maybe take action after successful mutation
if (decidedAction.type === "customPageMessage") {
@ -109,14 +122,14 @@ export const getServerSideProps = async function getServerSideProps(
} else if (decidedAction.type === "eventTypeRedirectUrl") {
return {
redirect: {
destination: `/${decidedAction.value}`,
destination: `/${decidedAction.value}?${stringify(context.query)}`,
permanent: false,
},
};
} else if (decidedAction.type === "externalRedirectUrl") {
return {
redirect: {
destination: `${decidedAction.value}`,
destination: `${decidedAction.value}?${stringify(context.query)}`,
permanent: false,
},
};

View File

@ -304,12 +304,14 @@ test.describe("Routing Forms", () => {
await users.logout();
page.goto(`/router?form=${routingForm.id}&Test field=event-routing`);
await page.waitForURL((url) => {
return url.pathname.endsWith("/pro/30min");
return url.pathname.endsWith("/pro/30min") && url.searchParams.get("Test field") === "event-routing";
});
page.goto(`/router?form=${routingForm.id}&Test field=external-redirect`);
await page.waitForURL((url) => {
return url.hostname.includes("google.com");
return (
url.hostname.includes("google.com") && url.searchParams.get("Test field") === "external-redirect"
);
});
await page.goto(`/router?form=${routingForm.id}&Test field=custom-page`);

View File

@ -73,12 +73,14 @@ export const responseHandler = async ({ ctx, input }: ResponseHandlerOptions) =>
}
return !schema.safeParse(fieldValue).success;
})
.map((f) => ({ label: f.label, type: f.type }));
.map((f) => ({ label: f.label, type: f.type, value: response[f.id]?.value }));
if (invalidFields.length) {
throw new TRPCError({
code: "BAD_REQUEST",
message: `Invalid fields ${invalidFields.map((f) => `${f.label}: ${f.type}`)}`,
message: `Invalid value for fields ${invalidFields
.map((f) => `'${f.label}' with value '${f.value}' should be valid ${f.type}`)
.join(", ")}`,
});
}

View File

@ -196,7 +196,6 @@ export default class SalesforceCalendarService implements Calendar {
}
async createEvent(event: CalendarEvent): Promise<NewCalendarEventType> {
debugger;
const contacts = await this.salesforceContactSearch(event);
if (contacts.length) {
if (contacts.length == event.attendees.length) {

View File

@ -5,6 +5,7 @@ import { defaultVideoAppCategories } from "@calcom/app-store/utils";
import getEnabledAppsFromCredentials from "@calcom/lib/apps/getEnabledAppsFromCredentials";
import { prisma } from "@calcom/prisma";
import { AppCategories } from "@calcom/prisma/enums";
import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential";
import { defaultLocations } from "./locations";
@ -62,13 +63,7 @@ export async function getLocationGroupedOptions(
},
},
select: {
id: true,
type: true,
key: true,
userId: true,
teamId: true,
appId: true,
invalid: true,
...credentialForCalendarServiceSelect,
team: {
select: {
name: true,

View File

@ -5,7 +5,7 @@
"type": "signal_video",
"logo": "icon.svg",
"url": "https://cal.com/",
"variant": "conferencing",
"variant": "messaging",
"categories": ["messaging"],
"publisher": "Cal.com, Inc.",
"email": "support@cal.com",

View File

@ -49,9 +49,13 @@ export class PaymentService implements IAbstractPaymentService {
async create(
payment: Pick<Prisma.PaymentUncheckedCreateInput, "amount" | "currency">,
bookingId: Booking["id"],
userId: Booking["userId"],
username: string | null,
bookerName: string,
bookerEmail: string,
paymentOption: PaymentOption,
eventTitle?: string
eventTitle?: string,
bookingTitle?: string
) {
try {
// Ensure that the payment service can support the passed payment option
@ -82,8 +86,12 @@ export class PaymentService implements IAbstractPaymentService {
metadata: {
identifier: "cal.com",
bookingId,
calAccountId: userId,
calUsername: username,
bookerName,
bookerEmail,
eventName: eventTitle || "",
eventTitle: eventTitle || "",
bookingTitle: bookingTitle || "",
},
};

View File

@ -5,7 +5,7 @@
"type": "telegram_video",
"logo": "icon.svg",
"url": "https://cal.com/",
"variant": "conferencing",
"variant": "messaging",
"categories": ["messaging"],
"publisher": "Cal.com, Inc.",
"email": "support@cal.com",

View File

@ -1,11 +1,11 @@
import type { AppCategories } from "@prisma/client";
import { Prisma } from "@prisma/client";
// If you import this file on any app it should produce circular dependency
// import appStore from "./index";
import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData";
import type { EventLocationType } from "@calcom/app-store/locations";
import type { App, AppMeta } from "@calcom/types/App";
import type { CredentialPayload } from "@calcom/types/Credential";
export * from "./_utils/getEventTypeAppData";
@ -30,13 +30,7 @@ const ALL_APPS_MAP = Object.keys(appStoreMetadata).reduce((store, key) => {
return store;
}, {} as Record<string, AppMeta>);
const credentialData = Prisma.validator<Prisma.CredentialArgs>()({
select: { id: true, type: true, key: true, userId: true, teamId: true, appId: true, invalid: true },
});
export type CredentialData = Prisma.CredentialGetPayload<typeof credentialData>;
export type CredentialDataWithTeamName = CredentialData & {
export type CredentialDataWithTeamName = CredentialPayload & {
team?: {
name: string;
} | null;
@ -64,6 +58,7 @@ function getApps(credentials: CredentialDataWithTeamName[], filterOnCredentials?
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
key: appMeta.key!,
userId: 0,
user: { email: "" },
teamId: null,
appId: appMeta.slug,
invalid: false,

View File

@ -5,7 +5,7 @@
"type": "whatsapp_video",
"logo": "icon.svg",
"url": "https://cal.com/",
"variant": "conferencing",
"variant": "messaging",
"categories": ["messaging"],
"publisher": "Cal.com, Inc.",
"email": "support@cal.com",

View File

@ -8,6 +8,9 @@ module.exports = {
printWidth: 110,
arrowParens: "always",
importOrder: [
// Mocks must be at the top as they contain vi.mock calls
"(.*)/__mocks__/(.*)",
"<THIRD_PARTY_MODULES>",
"^@(calcom|ee)/(.*)$",
"^@lib/(.*)$",
"^@components/(.*)$",

View File

@ -14,7 +14,7 @@ import type {
IntegrationCalendar,
NewCalendarEventType,
} from "@calcom/types/Calendar";
import type { CredentialPayload, CredentialWithAppName } from "@calcom/types/Credential";
import type { CredentialPayload } from "@calcom/types/Credential";
import type { EventResult } from "@calcom/types/EventManager";
import getCalendarsEvents from "./getCalendarsEvents";
@ -216,7 +216,7 @@ export const getBusyCalendarTimes = async (
};
export const createEvent = async (
credential: CredentialWithAppName,
credential: CredentialPayload,
calEvent: CalendarEvent,
externalId?: string
): Promise<EventResult<NewCalendarEventType>> => {
@ -255,7 +255,7 @@ export const createEvent = async (
: undefined;
return {
appName: credential.appName,
appName: credential.appId || "",
type: credential.type,
success,
uid,
@ -270,7 +270,7 @@ export const createEvent = async (
};
export const updateEvent = async (
credential: CredentialWithAppName,
credential: CredentialPayload,
calEvent: CalendarEvent,
bookingRefUid: string | null,
externalCalendarId: string | null
@ -311,7 +311,7 @@ export const updateEvent = async (
}
return {
appName: credential.appName,
appName: credential.appId || "",
type: credential.type,
success,
uid,

View File

@ -1,4 +1,4 @@
import type { DestinationCalendar, Booking } from "@prisma/client";
import type { Booking, DestinationCalendar } from "@prisma/client";
// eslint-disable-next-line no-restricted-imports
import { cloneDeep, merge } from "lodash";
import { v5 as uuidv5 } from "uuid";
@ -7,18 +7,21 @@ import type { z } from "zod";
import { getCalendar } from "@calcom/app-store/_utils/getCalendar";
import { FAKE_DAILY_CREDENTIAL } from "@calcom/app-store/dailyvideo/lib/VideoApiAdapter";
import { appKeysSchema as calVideoKeysSchema } from "@calcom/app-store/dailyvideo/zod";
import { getEventLocationTypeFromApp } from "@calcom/app-store/locations";
import { MeetLocationType } from "@calcom/app-store/locations";
import { getEventLocationTypeFromApp, MeetLocationType } from "@calcom/app-store/locations";
import getApps from "@calcom/app-store/utils";
import logger from "@calcom/lib/logger";
import prisma from "@calcom/prisma";
import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential";
import { createdEventSchema } from "@calcom/prisma/zod-utils";
import type { NewCalendarEventType } from "@calcom/types/Calendar";
import type { AdditionalInformation, CalendarEvent } from "@calcom/types/Calendar";
import type { CredentialPayload, CredentialWithAppName } from "@calcom/types/Credential";
import type { AdditionalInformation, CalendarEvent, NewCalendarEventType } from "@calcom/types/Calendar";
import type { CredentialPayload } from "@calcom/types/Credential";
import type { Event } from "@calcom/types/Event";
import type { EventResult } from "@calcom/types/EventManager";
import type { CreateUpdateResult, PartialBooking, PartialReference } from "@calcom/types/EventManager";
import type {
CreateUpdateResult,
EventResult,
PartialBooking,
PartialReference,
} from "@calcom/types/EventManager";
import { createEvent, updateEvent } from "./CalendarManager";
import { createMeeting, updateMeeting } from "./videoClient";
@ -68,8 +71,8 @@ export type EventManagerUser = {
type createdEventSchema = z.infer<typeof createdEventSchema>;
export default class EventManager {
calendarCredentials: CredentialWithAppName[];
videoCredentials: CredentialWithAppName[];
calendarCredentials: CredentialPayload[];
videoCredentials: CredentialPayload[];
/**
* Takes an array of credentials and initializes a new instance of the EventManager.
@ -338,26 +341,37 @@ export default class EventManager {
private async createAllCalendarEvents(event: CalendarEvent) {
let createdEvents: EventResult<NewCalendarEventType>[] = [];
if (event.destinationCalendar && event.destinationCalendar.length > 0) {
for (const destination of event.destinationCalendar) {
// Since GCal pushes events to multiple calendars we only want to create one event per booking
let gCalAdded = false;
const destinationCalendars: DestinationCalendar[] = event.destinationCalendar.reduce(
(destinationCals, cal) => {
if (cal.integration === "google_calendar") {
if (gCalAdded) {
return destinationCals;
} else {
gCalAdded = true;
destinationCals.push(cal);
}
} else {
destinationCals.push(cal);
}
return destinationCals;
},
[] as DestinationCalendar[]
);
for (const destination of destinationCalendars) {
if (destination.credentialId) {
let credential = this.calendarCredentials.find((c) => c.id === destination.credentialId);
if (!credential) {
// Fetch credential from DB
const credentialFromDB = await prisma.credential.findUnique({
include: {
app: {
select: {
slug: true,
},
},
},
where: {
id: destination.credentialId,
},
select: credentialForCalendarServiceSelect,
});
if (credentialFromDB && credentialFromDB.app?.slug) {
if (credentialFromDB && credentialFromDB.appId) {
credential = {
appName: credentialFromDB?.app.slug ?? "",
id: credentialFromDB.id,
type: credentialFromDB.type,
key: credentialFromDB.key,
@ -365,6 +379,7 @@ export default class EventManager {
teamId: credentialFromDB.teamId,
invalid: credentialFromDB.invalid,
appId: credentialFromDB.appId,
user: credentialFromDB.user,
};
}
}
@ -416,7 +431,7 @@ export default class EventManager {
* @private
*/
private getVideoCredential(event: CalendarEvent): CredentialWithAppName | undefined {
private getVideoCredential(event: CalendarEvent): CredentialPayload | undefined {
if (!event.location) {
return undefined;
}
@ -444,7 +459,7 @@ export default class EventManager {
event.location +
" because credential is missing for the app"
);
videoCredential = { ...FAKE_DAILY_CREDENTIAL, appName: "FAKE" };
videoCredential = { ...FAKE_DAILY_CREDENTIAL };
}
return videoCredential;
@ -524,20 +539,13 @@ export default class EventManager {
if (!credential) {
// Fetch credential from DB
const credentialFromDB = await prisma.credential.findUnique({
include: {
app: {
select: {
slug: true,
},
},
},
where: {
id: reference.credentialId,
},
select: credentialForCalendarServiceSelect,
});
if (credentialFromDB && credentialFromDB.app?.slug) {
if (credentialFromDB && credentialFromDB.appId) {
credential = {
appName: credentialFromDB?.app.slug ?? "",
id: credentialFromDB.id,
type: credentialFromDB.type,
key: credentialFromDB.key,
@ -545,6 +553,7 @@ export default class EventManager {
teamId: credentialFromDB.teamId,
invalid: credentialFromDB.invalid,
appId: credentialFromDB.appId,
user: credentialFromDB.user,
};
}
}
@ -567,6 +576,7 @@ export default class EventManager {
where: {
id: oldCalendarEvent.credentialId,
},
select: credentialForCalendarServiceSelect,
});
const calendar = await getCalendar(calendarCredential);
await calendar?.deleteEvent(oldCalendarEvent.uid, event, oldCalendarEvent.externalCalendarId);
@ -582,7 +592,7 @@ export default class EventManager {
if (!calendarReference) {
return {
appName: cred.appName,
appName: cred.appId || "",
type: cred.type,
success: false,
uid: "",

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