Merge branch 'main' into v2/teams-billing

This commit is contained in:
Joe Au-Yeung 2022-10-25 10:20:49 -04:00 committed by GitHub
commit f6dbd0fff2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
65 changed files with 1919 additions and 810 deletions

View File

@ -324,7 +324,7 @@ We have a list of [help wanted](https://github.com/orgs/calcom/projects/1/views/
6. In the third page (Test Users), add the Google account(s) you'll using. Make sure the details are correct on the last page of the wizard and your consent screen will be configured.
7. Now select [Credentials](https://console.cloud.google.com/apis/credentials) from the side pane and then select Create Credentials. Select the OAuth Client ID option.
8. Select Web Application as the Application Type.
9. Under Authorized redirect URI's, select Add URI and then add the URI `<Cal.com URL>/api/integrations/googlecalendar/callback` replacing Cal.com URL with the URI at which your application runs.
9. Under Authorized redirect URI's, select Add URI and then add the URI `<Cal.com URL>/api/integrations/googlecalendar/callback` and `<Cal.com URL>/api/auth/callback/google` replacing Cal.com URL with the URI at which your application runs.
10. The key will be created and you will be redirected back to the Credentials page. Select the newly generated client ID under OAuth 2.0 Client IDs.
11. Select Download JSON. Copy the contents of this file and paste the entire JSON string in the .env file as the value for GOOGLE_API_CREDENTIALS key.

View File

@ -0,0 +1,20 @@
import { ComponentMeta } from "@storybook/react";
import { ToggleGroup } from "@calcom/ui/v2/core/form/ToggleGroup";
export default {
title: "Toggle Group",
component: ToggleGroup,
} as ComponentMeta<typeof ToggleGroup>;
export const Default = () => {
return (
<ToggleGroup
defaultValue="12"
options={[
{ value: "12", label: "12h" },
{ value: "24", label: "24h" },
]}
/>
);
};

View File

@ -4,15 +4,18 @@ import { FC, useEffect, useState } from "react";
import dayjs, { Dayjs } from "@calcom/dayjs";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { TimeFormat } from "@calcom/lib/timeFormat";
import { nameOfDay } from "@calcom/lib/weekday";
import type { Slot } from "@calcom/trpc/server/routers/viewer/slots";
import { SkeletonContainer, SkeletonText } from "@calcom/ui";
import { ToggleGroup } from "@calcom/ui/v2/core/form/ToggleGroup";
import classNames from "@lib/classNames";
import { timeZone } from "@lib/clock";
type AvailableTimesProps = {
timeFormat: string;
timeFormat: TimeFormat;
onTimeFormatChange: (is24Hour: boolean) => void;
eventTypeId: number;
recurringCount: number | undefined;
eventTypeSlug: string;
@ -31,6 +34,7 @@ const AvailableTimes: FC<AvailableTimesProps> = ({
eventTypeSlug,
recurringCount,
timeFormat,
onTimeFormatChange,
seatsPerTimeSlot,
ethSignature,
}) => {
@ -48,14 +52,25 @@ const AvailableTimes: FC<AvailableTimesProps> = ({
return (
<div className="dark:bg-darkgray-100 mt-8 flex h-full w-full flex-col px-4 text-center sm:mt-0 sm:p-5 md:-mb-5 md:min-w-[200px] lg:min-w-[300px]">
<div className="mb-4 text-left text-base">
<span className="text-bookingdarker dark:text-darkgray-800 mb-8 w-1/2 break-words font-semibold text-gray-900">
{nameOfDay(i18n.language, Number(date.format("d")))}
</span>
<span className="text-bookinglight font-medium">
{date.format(", D ")}
{date.toDate().toLocaleString(i18n.language, { month: "long" })}
</span>
<div className="mb-6 flex items-center text-left text-base">
<div className="mr-4">
<span className="text-bookingdarker dark:text-darkgray-800 font-semibold text-gray-900">
{nameOfDay(i18n.language, Number(date.format("d")), "short")}
</span>
<span className="text-bookinglight font-medium">
, {date.toDate().toLocaleString(i18n.language, { month: "long", day: "numeric" })}
</span>
</div>
<div className="ml-auto">
<ToggleGroup
onValueChange={(timeFormat) => onTimeFormatChange(timeFormat === "24")}
defaultValue={timeFormat === TimeFormat.TWELVE_HOUR ? "12" : "24"}
options={[
{ value: "12", label: t("12_hour_short") },
{ value: "24", label: t("24_hour_short") },
]}
/>
</div>
</div>
<div className="-mb-5 grid flex-grow grid-cols-1 gap-x-2 overflow-y-auto sm:block md:h-[364px]">
{slots.length > 0 &&

View File

@ -1,25 +1,19 @@
import { FC, useEffect, useState } from "react";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Switch } from "@calcom/ui/v2";
import TimezoneSelect, { ITimezoneOption } from "@calcom/ui/v2/core/TimezoneSelect";
import { is24h, timeZone } from "../../lib/clock";
import { timeZone } from "../../lib/clock";
type Props = {
onSelectTimeZone: (selectedTimeZone: string) => void;
onToggle24hClock: (is24hClock: boolean) => void;
timeFormat: string;
hideTimeFormatToggle?: boolean;
};
const TimeOptions: FC<Props> = ({ onToggle24hClock, onSelectTimeZone, timeFormat, hideTimeFormatToggle }) => {
const TimeOptions: FC<Props> = ({ onSelectTimeZone }) => {
const [selectedTimeZone, setSelectedTimeZone] = useState("");
const [is24hClock, setIs24hClock] = useState(timeFormat === "HH:mm" && true);
const { t } = useLocale();
useEffect(() => {
setIs24hClock(is24h());
setSelectedTimeZone(timeZone());
}, []);
@ -29,28 +23,10 @@ const TimeOptions: FC<Props> = ({ onToggle24hClock, onSelectTimeZone, timeFormat
}
}, [selectedTimeZone, onSelectTimeZone]);
const handle24hClockToggle = (is24hClock: boolean) => {
setIs24hClock(is24hClock);
onToggle24hClock(is24h(is24hClock));
};
return selectedTimeZone !== "" ? (
<div className="dark:border-darkgray-300 dark:bg-darkgray-200 rounded-sm border border-gray-200 bg-white px-4 pt-4 pb-3 shadow-sm">
<div className="mb-4 flex">
<div className="text-sm font-medium text-gray-600 dark:text-white">{t("time_options")}</div>
{!hideTimeFormatToggle && (
<div className="ml-auto flex items-center">
<label className="ltl:mr-3 mr-2 align-text-top text-sm font-medium text-neutral-700 ltr:ml-3 rtl:mr-3 dark:text-white">
{t("am_pm")}
</label>
<Switch
name="24hClock"
label={t("24_h")}
defaultChecked={is24hClock}
onCheckedChange={handle24hClockToggle}
/>
</div>
)}
</div>
<TimezoneSelect
id="timeZone"

View File

@ -26,7 +26,7 @@ import useTheme from "@calcom/lib/hooks/useTheme";
import notEmpty from "@calcom/lib/notEmpty";
import { getRecurringFreq } from "@calcom/lib/recurringStrings";
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
import { detectBrowserTimeFormat, getIs24hClockFromLocalStorage } from "@calcom/lib/timeFormat";
import { detectBrowserTimeFormat, setIs24hClockInLocalStorage, TimeFormat } from "@calcom/lib/timeFormat";
import { trpc } from "@calcom/trpc/react";
import { Icon } from "@calcom/ui/Icon";
import DatePicker from "@calcom/ui/v2/modules/booker/DatePicker";
@ -48,7 +48,6 @@ import type { DynamicAvailabilityPageProps } from "../../../pages/d/[link]/[slug
import type { AvailabilityTeamPageProps } from "../../../pages/team/[slug]/[type]";
// Get router variables
const GoBackToPreviousPage = ({ t }: { t: TFunction }) => {
const router = useRouter();
const path = router.asPath.split("/");
@ -109,6 +108,7 @@ const useSlots = ({
const SlotPicker = ({
eventType,
timeFormat,
onTimeFormatChange,
timeZone,
recurringEventCount,
users,
@ -117,7 +117,8 @@ const SlotPicker = ({
ethSignature,
}: {
eventType: Pick<EventType, "id" | "schedulingType" | "slug">;
timeFormat: string;
timeFormat: TimeFormat;
onTimeFormatChange: (is24Hour: boolean) => void;
timeZone?: string;
seatsPerTimeSlot?: number;
recurringEventCount?: number;
@ -201,6 +202,7 @@ const SlotPicker = ({
slots={selectedDate && slots[selectedDate.format("YYYY-MM-DD")]}
date={selectedDate}
timeFormat={timeFormat}
onTimeFormatChange={onTimeFormatChange}
eventTypeId={eventType.id}
eventTypeSlug={eventType.slug}
seatsPerTimeSlot={seatsPerTimeSlot}
@ -213,35 +215,20 @@ const SlotPicker = ({
};
function TimezoneDropdown({
onChangeTimeFormat,
onChangeTimeZone,
timeZone,
timeFormat,
hideTimeFormatToggle,
}: {
onChangeTimeFormat: (newTimeFormat: string) => void;
onChangeTimeZone: (newTimeZone: string) => void;
timeZone?: string;
timeFormat: string;
hideTimeFormatToggle?: boolean;
}) {
const [isTimeOptionsOpen, setIsTimeOptionsOpen] = useState(false);
useEffect(() => {
handleToggle24hClock(!!getIs24hClockFromLocalStorage());
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const handleSelectTimeZone = (newTimeZone: string) => {
onChangeTimeZone(newTimeZone);
localStorageTimeZone(newTimeZone);
setIsTimeOptionsOpen(false);
};
const handleToggle24hClock = (is24hClock: boolean) => {
onChangeTimeFormat(is24hClock ? "HH:mm" : "h:mma");
};
return (
<Popover.Root open={isTimeOptionsOpen} onOpenChange={setIsTimeOptionsOpen}>
<Popover.Trigger className="min-w-32 dark:text-darkgray-600 radix-state-open:bg-gray-200 dark:radix-state-open:bg-darkgray-200 group relative mb-2 -ml-2 inline-block rounded-md px-2 py-2 text-left text-gray-600">
@ -260,12 +247,7 @@ function TimezoneDropdown({
hideWhenDetached
align="start"
className="animate-fade-in-up absolute left-0 top-2 w-80 max-w-[calc(100vw_-_1.5rem)]">
<TimeOptions
onSelectTimeZone={handleSelectTimeZone}
onToggle24hClock={handleToggle24hClock}
timeFormat={timeFormat}
hideTimeFormatToggle={hideTimeFormatToggle}
/>
<TimeOptions onSelectTimeZone={handleSelectTimeZone} />
</Popover.Content>
</Popover.Portal>
</Popover.Root>
@ -297,14 +279,7 @@ const useRouterQuery = <T extends string>(name: T) => {
export type Props = AvailabilityTeamPageProps | AvailabilityPageProps | DynamicAvailabilityPageProps;
const timeFormatTotimeFormatString = (timeFormat?: number | null) => {
if (!timeFormat) return null;
return timeFormat === 24 ? "HH:mm" : "h:mma";
};
const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
const { data: user } = trpc.useQuery(["viewer.me"]);
const timeFormatFromProfile = timeFormatTotimeFormatString(user?.timeFormat);
const router = useRouter();
const isEmbed = useIsEmbed(restProps.isEmbed);
const query = dateQuerySchema.parse(router.query);
@ -317,7 +292,12 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
const isBackgroundTransparent = useIsBackgroundTransparent();
const [timeZone, setTimeZone] = useState<string>();
const [timeFormat, setTimeFormat] = useState<string>("HH:mm");
const [timeFormat, setTimeFormat] = useState<TimeFormat>(detectBrowserTimeFormat);
const onTimeFormatChange = (is24Hours: boolean) => {
setTimeFormat(is24Hours ? TimeFormat.TWENTY_FOUR_HOUR : TimeFormat.TWELVE_HOUR);
setIs24hClockInLocalStorage(is24Hours);
};
const [gateState, gateDispatcher] = useReducer(
(state: GateState, newState: Partial<GateState>) => ({
@ -329,8 +309,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
useEffect(() => {
setTimeZone(localStorageTimeZone() || dayjs.tz.guess());
setTimeFormat(timeFormatFromProfile || detectBrowserTimeFormat);
}, [timeFormatFromProfile]);
}, []);
// TODO: Improve this;
useExposePlanGlobally(eventType.users.length === 1 ? eventType.users[0].plan : "PRO");
@ -352,18 +331,8 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
const userList = eventType.users ? eventType.users.map((user) => user.username).filter(notEmpty) : [];
const timezoneDropdown = useMemo(
() => (
<TimezoneDropdown
timeFormat={timeFormat}
onChangeTimeFormat={setTimeFormat}
timeZone={timeZone}
onChangeTimeZone={setTimeZone}
// Currently we don't allow the user to change the timeformat when they're logged in,
// the only way to change it is if they go to their profile.
hideTimeFormatToggle={!!timeFormatFromProfile}
/>
),
[timeZone, timeFormat, timeFormatFromProfile]
() => <TimezoneDropdown timeZone={timeZone} onChangeTimeZone={setTimeZone} />,
[timeZone]
);
const stripeAppData = getStripeAppData(eventType);
const rainbowAppData = getEventTypeAppData(eventType, "rainbow") || {};
@ -421,7 +390,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
<div
className={classNames(
"sm:dark:border-darkgray-200 flex flex-col border-gray-200 p-5 sm:border-r",
"min-w-full md:w-[280px] md:min-w-[280px]",
"min-w-full md:w-[230px] md:min-w-[230px]",
recurringEventCount && "xl:w-[380px] xl:min-w-[380px]"
)}>
<BookingDescription profile={profile} eventType={eventType} rescheduleUid={rescheduleUid}>
@ -501,6 +470,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
}
eventType={eventType}
timeFormat={timeFormat}
onTimeFormatChange={onTimeFormatChange}
timeZone={timeZone}
users={userList}
seatsPerTimeSlot={eventType.seatsPerTimeSlot || undefined}

View File

@ -1,5 +1,6 @@
import { FormValues } from "pages/event-types/[type]";
import { Controller, useFormContext } from "react-hook-form";
import { SingleValueProps, OptionProps, components } from "react-select";
import dayjs from "@calcom/dayjs";
import classNames from "@calcom/lib/classNames";
@ -7,6 +8,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale";
import { weekdayNames } from "@calcom/lib/weekday";
import { trpc } from "@calcom/trpc/react";
import { Icon } from "@calcom/ui";
import { Badge } from "@calcom/ui/v2";
import Button from "@calcom/ui/v2/core/Button";
import Select from "@calcom/ui/v2/core/form/select";
import { SkeletonText } from "@calcom/ui/v2/core/skeleton";
@ -16,6 +18,35 @@ import { SelectSkeletonLoader } from "@components/v2/availability/SkeletonLoader
type AvailabilityOption = {
label: string;
value: number;
isDefault: boolean;
};
const Option = ({ ...props }: OptionProps<AvailabilityOption>) => {
const { label, isDefault } = props.data;
return (
<components.Option {...props}>
<span>{label}</span>
{isDefault && (
<Badge variant="blue" className="ml-2">
Default
</Badge>
)}
</components.Option>
);
};
const SingleValue = ({ ...props }: SingleValueProps<AvailabilityOption>) => {
const { label, isDefault } = props.data;
return (
<components.SingleValue {...props}>
<span>{label}</span>
{isDefault && (
<Badge variant="blue" className="ml-2">
Default
</Badge>
)}
</components.SingleValue>
);
};
const AvailabilitySelect = ({
@ -38,6 +69,7 @@ const AvailabilitySelect = ({
const options = schedules.map((schedule) => ({
value: schedule.id,
label: schedule.name,
isDefault: schedule.isDefault,
}));
const value = options.find((option) =>
@ -53,6 +85,8 @@ const AvailabilitySelect = ({
onChange={props.onChange}
className={classNames("block w-full min-w-0 flex-1 rounded-sm text-sm", className)}
value={value}
components={{ Option, SingleValue }}
isMulti={false}
/>
);
};
@ -130,7 +164,7 @@ export const AvailabilityTab = () => {
{schedule?.timeZone || <SkeletonText className="block h-5 w-32" />}
</span>
<Button
href={`/availability/${scheduleId}`}
href={`/availability/${schedule?.schedule.id}`}
color="minimal"
EndIcon={Icon.FiExternalLink}
target="_blank"

View File

@ -18,6 +18,7 @@ import {
Dialog,
DialogContent,
Label,
SettingsToggle,
showToast,
Skeleton,
Switch,
@ -43,7 +44,6 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
const [hashedLinkVisible, setHashedLinkVisible] = useState(!!eventType.hashedLink);
const [redirectUrlVisible, setRedirectUrlVisible] = useState(!!eventType.successRedirectUrl);
const [hashedUrl, setHashedUrl] = useState(eventType.hashedLink?.link);
const [seatsInputVisible, setSeatsInputVisible] = useState(!!eventType.seatsPerTimeSlot);
const [customInputs, setCustomInputs] = useState<EventTypeCustomInput[]>(
eventType.customInputs.sort((a, b) => a.id - b.id) || []
);
@ -53,8 +53,6 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
const seatsEnabled = formMethods.getValues("seatsPerTimeSlotEnabled");
const [animationRef] = useAutoAnimate<HTMLUListElement>();
const removeCustom = (index: number) => {
formMethods.getValues("customInputs").splice(index, 1);
customInputs.splice(index, 1);
@ -120,80 +118,61 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
</div>
<hr />
<div className="">
<div className="flex space-x-3 ">
<Switch
checked={customInputs.length > 0}
fitToHeight={true}
onCheckedChange={(e) => {
if (e && customInputs.length === 0) {
// Push a placeholders
setSelectedCustomInput(undefined);
setSelectedCustomInputModalOpen(true);
} else if (!e) {
setCustomInputs([]);
formMethods.setValue("customInputs", []);
}
}}
/>
<div className="flex flex-col">
<Skeleton as={Label} className="text-sm font-semibold leading-none text-black">
{t("additional_inputs")}
</Skeleton>
<Skeleton as="p" className="-mt-2 text-sm leading-normal text-gray-600">
{t("additional_input_description")}
</Skeleton>
</div>
</div>
<ul className="my-4" ref={animationRef}>
{customInputs.map((customInput: EventTypeCustomInput, idx: number) => (
<CustomInputItem
key={idx}
question={customInput.label}
type={customInput.type}
required={customInput.required}
editOnClick={() => {
setSelectedCustomInput(customInput);
setSelectedCustomInputModalOpen(true);
}}
deleteOnClick={() => removeCustom(idx)}
/>
))}
</ul>
{customInputs.length > 0 && (
<Button
StartIcon={Icon.FiPlus}
color="minimal"
type="button"
onClick={() => {
<SettingsToggle
title={t("additional_inputs")}
description={t("additional_input_description")}
checked={customInputs.length > 0}
onCheckedChange={(e) => {
if (e && customInputs.length === 0) {
// Push a placeholders
setSelectedCustomInput(undefined);
setSelectedCustomInputModalOpen(true);
}}>
Add an input
</Button>
)}
} else if (!e) {
setCustomInputs([]);
formMethods.setValue("customInputs", []);
}
}}>
<ul className="my-4">
{customInputs.map((customInput: EventTypeCustomInput, idx: number) => (
<CustomInputItem
key={idx}
question={customInput.label}
type={customInput.type}
required={customInput.required}
editOnClick={() => {
setSelectedCustomInput(customInput);
setSelectedCustomInputModalOpen(true);
}}
deleteOnClick={() => removeCustom(idx)}
/>
))}
</ul>
{customInputs.length > 0 && (
<Button
StartIcon={Icon.FiPlus}
color="minimal"
type="button"
onClick={() => {
setSelectedCustomInput(undefined);
setSelectedCustomInputModalOpen(true);
}}>
Add an input
</Button>
)}
</SettingsToggle>
</div>
<hr />
<Controller
name="requiresConfirmation"
defaultValue={eventType.requiresConfirmation}
render={({ field: { value, onChange } }) => (
<div className="flex space-x-3">
<Switch
name="requireConfirmation"
checked={value}
onCheckedChange={(e) => onChange(e)}
disabled={seatsEnabled}
fitToHeight={true}
/>
<div className="flex flex-col">
<Skeleton as={Label} className="text-sm font-semibold leading-none text-black">
{t("requires_confirmation")}
</Skeleton>
<Skeleton as="p" className="-mt-2 text-sm leading-normal text-gray-600">
{t("requires_confirmation_description")}
</Skeleton>
</div>
</div>
<SettingsToggle
title={t("requires_confirmation")}
description={t("requires_confirmation_description")}
checked={value}
onCheckedChange={(e) => onChange(e)}
disabled={seatsEnabled}
/>
)}
/>
<hr />
@ -202,23 +181,13 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
control={formMethods.control}
defaultValue={eventType.disableGuests}
render={({ field: { value, onChange } }) => (
<div className="flex space-x-3 ">
<Switch
name="disableGuests"
fitToHeight={true}
checked={value}
onCheckedChange={(e) => onChange(e)}
disabled={seatsEnabled}
/>
<div className="flex flex-col">
<Skeleton as={Label} className="text-sm font-semibold leading-none text-black">
{t("disable_guests")}
</Skeleton>
<Skeleton as="p" className="-mt-2 text-sm leading-normal text-gray-600">
{t("disable_guests_description")}
</Skeleton>
</div>
</div>
<SettingsToggle
title={t("disable_guests")}
description={t("disable_guests_description")}
checked={value}
onCheckedChange={(e) => onChange(e)}
disabled={seatsEnabled}
/>
)}
/>
@ -228,22 +197,12 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
control={formMethods.control}
defaultValue={eventType.hideCalendarNotes}
render={({ field: { value, onChange } }) => (
<div className="flex space-x-3 ">
<Switch
name="hideCalendarNotes"
fitToHeight={true}
checked={value}
onCheckedChange={(e) => onChange(e)}
/>
<div className="flex flex-col">
<Skeleton as={Label} className="text-sm font-semibold leading-none text-black">
{t("disable_notes")}
</Skeleton>
<Skeleton as="p" className="-mt-2 text-sm leading-normal text-gray-600">
{t("disable_notes_description")}
</Skeleton>
</div>
</div>
<SettingsToggle
title={t("disable_notes")}
description={t("disable_notes_description")}
checked={value}
onCheckedChange={(e) => onChange(e)}
/>
)}
/>
<hr />
@ -253,20 +212,12 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
defaultValue={!!eventType.metadata.additionalNotesRequired}
render={({ field: { value, onChange } }) => (
<div className="flex space-x-3 ">
<Switch
name="additionalNotesRequired"
fitToHeight={true}
checked={value}
<SettingsToggle
title={t("require_additional_notes")}
description={t("require_additional_notes_description")}
checked={!!value}
onCheckedChange={(e) => onChange(e)}
/>
<div className="flex flex-col">
<Skeleton as={Label} className="text-sm font-semibold leading-none text-black">
{t("require_additional_notes")}
</Skeleton>
<Skeleton as="p" className="-mt-2 text-sm leading-normal text-gray-600">
{t("require_additional_notes_description")}
</Skeleton>
</div>
</div>
)}
/>
@ -276,29 +227,19 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
control={formMethods.control}
render={({ field: { value, onChange } }) => (
<>
<div className="flex space-x-3 ">
<Switch
name="successRedirectUrlCheck"
fitToHeight={true}
defaultChecked={redirectUrlVisible}
onCheckedChange={(e) => {
setRedirectUrlVisible(e);
onChange(e ? value : "");
}}
/>
<div className="flex flex-col">
<Skeleton as={Label} className="text-sm font-semibold leading-none text-black">
{t("redirect_success_booking")}
</Skeleton>
<Skeleton as="p" className="-mt-2 text-sm leading-normal text-gray-600">
{t("redirect_url_description")}
</Skeleton>
</div>
</div>
{redirectUrlVisible && (
<div className="">
<SettingsToggle
title={t("redirect_success_booking")}
description={t("redirect_url_description")}
checked={redirectUrlVisible}
onCheckedChange={(e) => {
setRedirectUrlVisible(e);
onChange(e ? value : "");
}}>
{/* Textfield has some margin by default we remove that so we can keep consitant aligment */}
<div className="lg:-ml-2">
<TextField
label={t("redirect_success_booking")}
labelSrOnly
placeholder={t("external_redirect_url")}
required={redirectUrlVisible}
type="text"
@ -306,137 +247,107 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupInfered
{...formMethods.register("successRedirectUrl")}
/>
</div>
)}
</SettingsToggle>
</>
)}
/>
<hr />
<Controller
name="hashedLink"
control={formMethods.control}
defaultValue={hashedUrl}
render={({ field: { value, onChange } }) => (
<>
<div className="flex space-x-3 ">
<Switch
data-testid="hashedLinkCheck"
name="hashedLinkCheck"
fitToHeight={true}
defaultChecked={!!value}
onCheckedChange={(e) => {
setHashedLinkVisible(e);
onChange(e ? hashedUrl : undefined);
}}
/>
<div className="flex flex-col">
<Skeleton as={Label} className="text-sm font-semibold leading-none text-black">
{t("private_link")}
</Skeleton>
<Skeleton as="p" className="-mt-2 text-sm leading-normal text-gray-600">
{t("private_link_description")}
</Skeleton>
</div>
</div>
{hashedLinkVisible && (
<div className="">
<TextField
disabled
name="hashedLink"
label={t("private_link_label")}
data-testid="generated-hash-url"
type="text"
hint={t("private_link_hint")}
defaultValue={placeholderHashedLink}
addOnSuffix={
<Tooltip
content={eventType.hashedLink ? t("copy_to_clipboard") : t("enabled_after_update")}>
<Button
color="minimal"
onClick={() => {
navigator.clipboard.writeText(placeholderHashedLink);
if (eventType.hashedLink) {
showToast(t("private_link_copied"), "success");
} else {
showToast(t("enabled_after_update_description"), "warning");
}
}}
className="hover:stroke-3 hover:bg-transparent hover:text-black"
type="button">
<Icon.FiCopy />
</Button>
</Tooltip>
}
/>
</div>
)}
</>
)}
/>
<SettingsToggle
data-testid="hashedLinkCheck"
title={t("private_link")}
description={t("private_link_description")}
checked={hashedLinkVisible}
onCheckedChange={(e) => {
formMethods.setValue("hashedLink", e ? hashedUrl : undefined);
setHashedLinkVisible(e);
}}>
{/* Textfield has some margin by default we remove that so we can keep consitant aligment */}
<div className="lg:-ml-2">
<TextField
disabled
name="hashedLink"
label={t("private_link_label")}
data-testid="generated-hash-url"
labelSrOnly
type="text"
hint={t("private_link_hint")}
defaultValue={placeholderHashedLink}
addOnSuffix={
<Tooltip content={eventType.hashedLink ? t("copy_to_clipboard") : t("enabled_after_update")}>
<Button
color="minimal"
onClick={() => {
navigator.clipboard.writeText(placeholderHashedLink);
if (eventType.hashedLink) {
showToast(t("private_link_copied"), "success");
} else {
showToast(t("enabled_after_update_description"), "warning");
}
}}
className="hover:stroke-3 hover:bg-transparent hover:text-black"
type="button">
<Icon.FiCopy />
</Button>
</Tooltip>
}
/>
</div>
</SettingsToggle>
<hr />
<Controller
name="seatsPerTimeSlotEnabled"
control={formMethods.control}
defaultValue={!!eventType.seatsPerTimeSlot}
render={({ field: { value, onChange } }) => (
<div className="flex space-x-3">
<Switch
name="seatsPerTimeSlotEnabled"
checked={value}
onCheckedChange={(e) => {
setSeatsInputVisible(e);
// Enabling seats will disable guests and requiring confimation until fully supported
if (e) {
formMethods.setValue("disableGuests", true);
formMethods.setValue("requiresConfirmation", false);
formMethods.setValue("seatsPerTimeSlot", 2);
} else {
formMethods.setValue("seatsPerTimeSlot", null);
}
onChange(e);
}}
fitToHeight={true}
<SettingsToggle
title={t("offer_seats")}
description={t("offer_seats_description")}
checked={value}
onCheckedChange={(e) => {
// Enabling seats will disable guests and requiring confimation until fully supported
if (e) {
formMethods.setValue("disableGuests", true);
formMethods.setValue("requiresConfirmation", false);
formMethods.setValue("seatsPerTimeSlot", 2);
} else {
formMethods.setValue("seatsPerTimeSlot", null);
formMethods.setValue("disableGuests", false);
}
onChange(e);
}}>
<Controller
name="seatsPerTimeSlot"
control={formMethods.control}
defaultValue={eventType.seatsPerTimeSlot}
render={({ field: { value, onChange } }) => (
<div className="lg:-ml-2">
<TextField
required
name="seatsPerTimeSlot"
labelSrOnly
label={t("number_of_seats")}
type="number"
defaultValue={value || 2}
addOnSuffix={<>{t("seats")}</>}
onChange={(e) => {
onChange(Number(e.target.value));
}}
/>
<div className="mt-2">
<CheckboxField
description={t("show_attendees")}
onChange={(e) => formMethods.setValue("seatsShowAttendees", e.target.checked)}
defaultChecked={!!eventType.seatsShowAttendees}
/>
</div>
</div>
)}
/>
<div className="flex flex-col">
<Skeleton as={Label} className="text-sm font-semibold leading-none text-black">
{t("offer_seats")}
</Skeleton>
<Skeleton as="p" className="-mt-2 text-sm leading-normal text-gray-600">
{t("offer_seats_description")}
</Skeleton>
</div>
</div>
</SettingsToggle>
)}
/>
{seatsInputVisible && (
<Controller
name="seatsPerTimeSlot"
control={formMethods.control}
defaultValue={eventType.seatsPerTimeSlot}
render={({ field: { value, onChange } }) => (
<div className="">
<TextField
required
name="seatsPerTimeSlot"
label={t("number_of_seats")}
type="number"
defaultValue={value || 2}
addOnSuffix={<>{t("seats")}</>}
onChange={(e) => {
onChange(Number(e.target.value));
}}
/>
<div className="mt-6">
<CheckboxField
description={t("show_attendees")}
onChange={(e) => formMethods.setValue("seatsShowAttendees", e.target.checked)}
defaultChecked={!!eventType.seatsShowAttendees}
/>
</div>
</div>
)}
/>
)}
{showEventNameTip && (
<Dialog open={showEventNameTip} onOpenChange={setShowEventNameTip}>
<DialogContent

View File

@ -9,7 +9,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale";
import { PeriodType } from "@calcom/prisma/client";
import type { BookingLimit } from "@calcom/types/Calendar";
import { Icon } from "@calcom/ui";
import { Select, Switch, Label, Input, MinutesField, Button } from "@calcom/ui/v2";
import { Select, Switch, Label, Input, MinutesField, Button, SettingsToggle } from "@calcom/ui/v2";
import DateRangePicker from "@calcom/ui/v2/core/form/date-range-picker/DateRangePicker";
export const EventLimitsTab = (props: Pick<EventTypeSetupInfered, "eventType">) => {
@ -159,149 +159,106 @@ export const EventLimitsTab = (props: Pick<EventTypeSetupInfered, "eventType">)
<hr className="my-8" />
<div className="flex flex-col space-y-4 lg:flex-row lg:space-y-0 lg:space-x-4">
<fieldset className="block flex-col sm:flex">
<div className="flex space-x-3">
<Controller
name="bookingLimits"
control={formMethods.control}
render={({ field: { value } }) => (
<Switch
fitToHeight={true}
checked={Object.keys(value ?? {}).length > 0}
onCheckedChange={(active) => {
if (active) {
formMethods.setValue("bookingLimits", {
PER_DAY: 1,
});
} else {
formMethods.setValue("bookingLimits", undefined);
}
}}
/>
)}
/>
<div className="">
<Label className="text-sm font-semibold leading-none text-black">
{t("limit_booking_frequency")}
</Label>
<p className="-mt-2 text-sm leading-normal text-gray-600">
{t("limit_booking_frequency_description")}
</p>
</div>
</div>
<div className="mt-4 lg:ml-14">
<Controller
name="bookingLimits"
control={formMethods.control}
render={({ field: { value } }) => (
<SettingsToggle
title={t("limit_booking_frequency")}
description={t("limit_booking_frequency_description")}
checked={Object.keys(value ?? {}).length > 0}
onCheckedChange={(active) => {
if (active) {
formMethods.setValue("bookingLimits", {
PER_DAY: 1,
});
} else {
formMethods.setValue("bookingLimits", {});
}
}}>
<BookingLimits />
</div>
</fieldset>
</div>
</SettingsToggle>
)}
/>
<hr className="my-8" />
<div className="flex flex-col space-y-4 lg:flex-row lg:space-y-0 lg:space-x-4">
<fieldset className="block flex-col sm:flex">
<div className="flex space-x-3">
<Controller
name="periodType"
control={formMethods.control}
defaultValue={periodType?.type !== "UNLIMITED" ? "ROLLING" : "UNLIMITED"}
render={({ field: { value } }) => (
<Switch
fitToHeight={true}
checked={value !== "UNLIMITED"}
onCheckedChange={(bool) =>
formMethods.setValue("periodType", bool ? "ROLLING" : "UNLIMITED")
}
/>
)}
/>
<div className="">
<Label className="text-sm font-semibold leading-none text-black">Limit Future Bookings</Label>
<p className="-mt-2 text-sm leading-normal text-gray-600">
Limit how far in the future people can book a time
</p>
</div>
</div>
<div className="mt-4 lg:ml-14">
<Controller
name="periodType"
control={formMethods.control}
defaultValue={periodType?.type}
render={() => (
<RadioGroup.Root
defaultValue={watchPeriodType}
value={watchPeriodType}
onValueChange={(val) => formMethods.setValue("periodType", val as PeriodType)}>
{PERIOD_TYPES.map((period) => {
if (period.type === "UNLIMITED") return null;
return (
<div
className={classNames(
"mb-2 flex flex-wrap items-center text-sm",
watchPeriodType === "UNLIMITED" && "pointer-events-none opacity-30"
)}
key={period.type}>
<RadioGroup.Item
id={period.type}
value={period.type}
className="min-w-4 flex h-4 w-4 cursor-pointer items-center rounded-full border border-black bg-white focus:border-2 focus:outline-none ltr:mr-2 rtl:ml-2">
<RadioGroup.Indicator className="relative flex h-4 w-4 items-center justify-center after:block after:h-2 after:w-2 after:rounded-full after:bg-black" />
</RadioGroup.Item>
{period.prefix ? <span>{period.prefix}&nbsp;</span> : null}
{period.type === "ROLLING" && (
<div className="flex h-9">
<Input
type="number"
className="block w-16 rounded-md border-gray-300 py-3 text-sm [appearance:textfield] ltr:mr-2 rtl:ml-2"
placeholder="30"
{...formMethods.register("periodDays", { valueAsNumber: true })}
defaultValue={eventType.periodDays || 30}
/>
<select
id=""
className="block h-9 w-full rounded-md border-gray-300 py-2 pl-3 pr-10 text-sm focus:outline-none"
{...formMethods.register("periodCountCalendarDays")}
defaultValue={eventType.periodCountCalendarDays ? "1" : "0"}>
<option value="1">{t("calendar_days")}</option>
<option value="0">{t("business_days")}</option>
</select>
</div>
)}
{period.type === "RANGE" && (
<div className="inline-flex space-x-2 ltr:ml-2 rtl:mr-2 rtl:space-x-reverse">
<Controller
name="periodDates"
control={formMethods.control}
defaultValue={periodDates}
render={() => (
<DateRangePicker
startDate={formMethods.getValues("periodDates").startDate}
endDate={formMethods.getValues("periodDates").endDate}
onDatesChange={({ startDate, endDate }) => {
formMethods.setValue("periodDates", {
startDate,
endDate,
});
}}
/>
)}
/>
</div>
)}
{period.suffix ? (
<span className="ltr:ml-2 rtl:mr-2">&nbsp;{period.suffix}</span>
) : null}
<Controller
name="periodType"
control={formMethods.control}
render={({ field: { value } }) => (
<SettingsToggle
title={t("limit_future_bookings")}
description={t("limit_future_bookings_description")}
checked={value !== "UNLIMITED"}
onCheckedChange={(bool) => formMethods.setValue("periodType", bool ? "ROLLING" : "UNLIMITED")}>
<RadioGroup.Root
defaultValue={watchPeriodType}
value={watchPeriodType}
onValueChange={(val) => formMethods.setValue("periodType", val as PeriodType)}>
{PERIOD_TYPES.map((period) => {
if (period.type === "UNLIMITED") return null;
return (
<div
className={classNames(
"mb-2 flex flex-wrap items-center text-sm",
watchPeriodType === "UNLIMITED" && "pointer-events-none opacity-30"
)}
key={period.type}>
<RadioGroup.Item
id={period.type}
value={period.type}
className="min-w-4 flex h-4 w-4 cursor-pointer items-center rounded-full border border-black bg-white focus:border-2 focus:outline-none ltr:mr-2 rtl:ml-2">
<RadioGroup.Indicator className="relative flex h-4 w-4 items-center justify-center after:block after:h-2 after:w-2 after:rounded-full after:bg-black" />
</RadioGroup.Item>
{period.prefix ? <span>{period.prefix}&nbsp;</span> : null}
{period.type === "ROLLING" && (
<div className="flex h-9">
<Input
type="number"
className="block w-16 rounded-md border-gray-300 py-3 text-sm [appearance:textfield] ltr:mr-2 rtl:ml-2"
placeholder="30"
{...formMethods.register("periodDays", { valueAsNumber: true })}
defaultValue={eventType.periodDays || 30}
/>
<select
id=""
className="block h-9 w-full rounded-md border-gray-300 py-2 pl-3 pr-10 text-sm focus:outline-none"
{...formMethods.register("periodCountCalendarDays")}
defaultValue={eventType.periodCountCalendarDays ? "1" : "0"}>
<option value="1">{t("calendar_days")}</option>
<option value="0">{t("business_days")}</option>
</select>
</div>
);
})}
</RadioGroup.Root>
)}
/>
</div>
</fieldset>
</div>
)}
{period.type === "RANGE" && (
<div className="inline-flex space-x-2 ltr:ml-2 rtl:mr-2 rtl:space-x-reverse">
<Controller
name="periodDates"
control={formMethods.control}
defaultValue={periodDates}
render={() => (
<DateRangePicker
startDate={formMethods.getValues("periodDates").startDate}
endDate={formMethods.getValues("periodDates").endDate}
onDatesChange={({ startDate, endDate }) => {
formMethods.setValue("periodDates", {
startDate,
endDate,
});
}}
/>
)}
/>
</div>
)}
{period.suffix ? <span className="ltr:ml-2 rtl:mr-2">&nbsp;{period.suffix}</span> : null}
</div>
);
})}
</RadioGroup.Root>
</SettingsToggle>
)}
/>
</div>
);
};

View File

@ -6,7 +6,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Frequency } from "@calcom/prisma/zod-utils";
import type { RecurringEvent } from "@calcom/types/Calendar";
import { Alert } from "@calcom/ui/Alert";
import { Label, Select, Switch } from "@calcom/ui/v2";
import { Label, Select, Switch, SettingsToggle } from "@calcom/ui/v2";
type RecurringEventControllerProps = {
recurringEvent: RecurringEvent | null;
@ -36,95 +36,85 @@ export default function RecurringEventController({
<Alert severity="warning" title={t("warning_payment_recurring_event")} />
) : (
<>
<div className="flex space-x-3 ">
<Switch
name="requireConfirmation"
data-testid="recurring-event-check"
fitToHeight={true}
checked={recurringEventState !== null}
onCheckedChange={(e) => {
if (!e) {
formMethods.setValue("recurringEvent", null);
setRecurringEventState(null);
} else {
const newVal = recurringEvent || {
interval: 1,
count: 12,
freq: Frequency.WEEKLY,
};
formMethods.setValue("recurringEvent", newVal);
setRecurringEventState(newVal);
}
}}
/>
<div className="flex flex-col">
<Label className="text-sm font-semibold leading-none text-black">
{t("recurring_event")}
</Label>
<p className="-mt-2 text-sm leading-normal text-gray-600">
{t("recurring_event_description")}
</p>
{recurringEventState && (
<div data-testid="recurring-event-collapsible" className="mt-4 text-sm">
<div className="flex items-center">
<p className="mr-2 text-neutral-900">{t("repeats_every")}</p>
<input
type="number"
min="1"
max="20"
className="block h-[36px] w-16 rounded-md border-gray-300 text-sm [appearance:textfield] ltr:mr-2 rtl:ml-2"
defaultValue={recurringEventState.interval}
onChange={(event) => {
const newVal = {
...recurringEventState,
interval: parseInt(event?.target.value),
};
formMethods.setValue("recurringEvent", newVal);
setRecurringEventState(newVal);
}}
/>
<Select
options={recurringEventFreqOptions}
value={recurringEventFreqOptions[recurringEventState.freq]}
isSearchable={false}
className="w-18 block h-[36px] min-w-0 rounded-md text-sm"
onChange={(event) => {
const newVal = {
...recurringEventState,
freq: parseInt(event?.value || `${Frequency.WEEKLY}`),
};
formMethods.setValue("recurringEvent", newVal);
setRecurringEventState(newVal);
}}
/>
</div>
<div className="mt-4 flex items-center">
<p className="mr-2 text-neutral-900">{t("for_a_maximum_of")}</p>
<input
type="number"
min="1"
max="20"
className="block h-[36px] w-16 rounded-md border-gray-300 text-sm [appearance:textfield] ltr:mr-2 rtl:ml-2"
defaultValue={recurringEventState.count}
onChange={(event) => {
const newVal = {
...recurringEventState,
count: parseInt(event?.target.value),
};
formMethods.setValue("recurringEvent", newVal);
setRecurringEventState(newVal);
}}
/>
<p className="mr-2 text-neutral-900">
{t("events", {
count: recurringEventState.count,
})}
</p>
</div>
<SettingsToggle
title={t("recurring_event")}
description={t("recurring_event_description")}
checked={recurringEventState !== null}
data-testid="recurring-event-check"
onCheckedChange={(e) => {
if (!e) {
formMethods.setValue("recurringEvent", null);
setRecurringEventState(null);
} else {
const newVal = recurringEvent || {
interval: 1,
count: 12,
freq: Frequency.WEEKLY,
};
formMethods.setValue("recurringEvent", newVal);
setRecurringEventState(newVal);
}
}}>
{recurringEventState && (
<div data-testid="recurring-event-collapsible" className="text-sm">
<div className="flex items-center">
<p className="mr-2 text-neutral-900">{t("repeats_every")}</p>
<input
type="number"
min="1"
max="20"
className="block h-[36px] w-16 rounded-md border-gray-300 text-sm [appearance:textfield] ltr:mr-2 rtl:ml-2"
defaultValue={recurringEventState.interval}
onChange={(event) => {
const newVal = {
...recurringEventState,
interval: parseInt(event?.target.value),
};
formMethods.setValue("recurringEvent", newVal);
setRecurringEventState(newVal);
}}
/>
<Select
options={recurringEventFreqOptions}
value={recurringEventFreqOptions[recurringEventState.freq]}
isSearchable={false}
className="w-18 block h-[36px] min-w-0 rounded-md text-sm"
onChange={(event) => {
const newVal = {
...recurringEventState,
freq: parseInt(event?.value || `${Frequency.WEEKLY}`),
};
formMethods.setValue("recurringEvent", newVal);
setRecurringEventState(newVal);
}}
/>
</div>
)}
</div>
</div>
<div className="mt-4 flex items-center">
<p className="mr-2 text-neutral-900">{t("for_a_maximum_of")}</p>
<input
type="number"
min="1"
max="20"
className="block h-[36px] w-16 rounded-md border-gray-300 text-sm [appearance:textfield] ltr:mr-2 rtl:ml-2"
defaultValue={recurringEventState.count}
onChange={(event) => {
const newVal = {
...recurringEventState,
count: parseInt(event?.target.value),
};
formMethods.setValue("recurringEvent", newVal);
setRecurringEventState(newVal);
}}
/>
<p className="mr-2 text-neutral-900">
{t("events", {
count: recurringEventState.count,
})}
</p>
</div>
</div>
)}
</SettingsToggle>
</>
)}
</div>

View File

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

View File

@ -51,6 +51,7 @@ export default async function handler(req: NextApiRequest) {
{ name: "inter", data: interFontData, weight: 400 },
{ name: "inter", data: interFontMediumData, weight: 500 },
{ name: "cal", data: calFontData, weight: 400 },
{ name: "cal", data: calFontData, weight: 600 },
] as SatoriOptions["fonts"],
};

View File

@ -162,7 +162,7 @@ export default function Availability({ schedule }: { schedule: number }) {
</div>
</div>
<div className="min-w-40 col-span-3 space-y-2 lg:col-span-1">
<div className="xl:max-w-80 w-full pr-4 sm:p-0">
<div className="xl:max-w-80 mt-4 w-full pr-4 sm:p-0">
<div>
<label htmlFor="timeZone" className="block text-sm font-medium text-gray-700">
{t("timezone")}

View File

@ -1,6 +1,7 @@
import React from "react";
import { Label, Input, TextField } from "@calcom/ui/form/fields";
import { Segment, SegmentOption } from "@calcom/ui/v2/core";
import { sandboxPage } from ".";
@ -14,6 +15,17 @@ const page = sandboxPage(() => (
</div>
<div>
<TextField name="test-02" label="TextField" placeholder="it has an input baked in" />
{/* Adding to sandbox cause storybook doesnt like radix tailwind :S */}
<div className="pt-4">
<Segment label="Test" value="Test">
<SegmentOption value="Test">One</SegmentOption>
<SegmentOption value="2">Two</SegmentOption>
<SegmentOption value="3">Three</SegmentOption>
<SegmentOption value="4" disabled>
Four
</SegmentOption>
</Segment>
</div>
</div>
</div>
));

View File

@ -3,7 +3,6 @@ import { useMemo } from "react";
import { useForm, Controller } from "react-hook-form";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { setIs24hClockInLocalStorage } from "@calcom/lib/timeFormat";
import { inferQueryOutput, trpc } from "@calcom/trpc/react";
import { Button } from "@calcom/ui/v2/core/Button";
import Meta from "@calcom/ui/v2/core/Meta";
@ -116,8 +115,6 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
<Form
form={formMethods}
handleSubmit={(values) => {
setIs24hClockInLocalStorage(values.timeFormat.value === 24);
mutation.mutate({
...values,
locale: values.locale.value,
@ -178,6 +175,9 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
</>
)}
/>
<div className="text-gray mt-2 flex items-center text-sm text-gray-700">
{t("timeformat_profile_hint")}
</div>
<Controller
name="weekStart"
control={formMethods.control}

View File

@ -1,3 +1,4 @@
import { IdentityProvider } from "@prisma/client";
import crypto from "crypto";
import { signOut } from "next-auth/react";
import { useRef, useState, BaseSyntheticEvent, useEffect } from "react";
@ -111,23 +112,41 @@ const ProfileView = () => {
await utils.invalidateQueries(["viewer.me"]);
},
});
const deleteMeWithoutPasswordMutation = trpc.useMutation("viewer.deleteMeWithoutPassword", {
onSuccess: onDeleteMeSuccessMutation,
onError: onDeleteMeErrorMutation,
async onSettled() {
await utils.invalidateQueries(["viewer.me"]);
},
});
const isCALIdentityProviver = user?.identityProvider === IdentityProvider.CAL;
const onConfirmPassword = (e: Event | React.MouseEvent<HTMLElement, MouseEvent>) => {
e.preventDefault();
const password = passwordRef.current.value;
confirmPasswordMutation.mutate({ passwordInput: password });
};
const onConfirmButton = (e: Event | React.MouseEvent<HTMLElement, MouseEvent>) => {
e.preventDefault();
const totpCode = form.getValues("totpCode");
const password = passwordRef.current.value;
deleteMeMutation.mutate({ password, totpCode });
if (isCALIdentityProviver) {
const totpCode = form.getValues("totpCode");
const password = passwordRef.current.value;
deleteMeMutation.mutate({ password, totpCode });
} else {
deleteMeWithoutPasswordMutation.mutate();
}
};
const onConfirm = ({ totpCode }: DeleteAccountValues, e: BaseSyntheticEvent | undefined) => {
e?.preventDefault();
const password = passwordRef.current.value;
deleteMeMutation.mutate({ password, totpCode });
if (isCALIdentityProviver) {
const password = passwordRef.current.value;
deleteMeMutation.mutate({ password, totpCode });
} else {
deleteMeWithoutPasswordMutation.mutate();
}
};
const formMethods = useForm<{
@ -178,7 +197,7 @@ const ProfileView = () => {
<Form
form={formMethods}
handleSubmit={(values) => {
if (values.email !== user?.email) {
if (values.email !== user?.email && isCALIdentityProviver) {
setConfirmPasswordOpen(true);
} else {
mutation.mutate(values);
@ -260,18 +279,20 @@ const ProfileView = () => {
actionOnClick={(e) => e && onConfirmButton(e)}>
<>
<p className="mb-7">{t("delete_account_confirmation_message")}</p>
<PasswordField
data-testid="password"
name="password"
id="password"
type="password"
autoComplete="current-password"
required
label="Password"
ref={passwordRef}
/>
{isCALIdentityProviver && (
<PasswordField
data-testid="password"
name="password"
id="password"
type="password"
autoComplete="current-password"
required
label="Password"
ref={passwordRef}
/>
)}
{user?.twoFactorEnabled && (
{user?.twoFactorEnabled && isCALIdentityProviver && (
<Form handleSubmit={onConfirm} className="pb-4" form={form}>
<TwoFactor center={false} />
</Form>

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

View File

@ -313,6 +313,7 @@
"past_bookings": "ستظهر هنا عمليات حجزك السابقة.",
"cancelled_bookings": "ستظهر هنا عمليات حجزك التي تم إلغاؤها.",
"unconfirmed_bookings": "ستظهر هنا كل حجوزات غير المؤكدة بعد.",
"unconfirmed_bookings_tooltip": "حجز غير مؤكد",
"on": "في",
"and": "و",
"calendar_shows_busy_between": "يظهر التقويم أنك مشغول بين",
@ -542,6 +543,7 @@
"link_shared": "تمت مشاركة الرابط!",
"title": "العنوان",
"description": "الوصف",
"apps_status": "حالة التطبيقات",
"quick_video_meeting": "اجتماع سريع عبر الفيديو.",
"scheduling_type": "نوع الجدولة",
"preview_team": "معاينة الفريق",
@ -766,11 +768,16 @@
"no_category_apps_description_calendar": "إضافة تطبيق تقويم للتحقق من أي تضارب لمنع أي حجوزات مزدوجة",
"no_category_apps_description_conferencing": "جرب إضافة تطبيق مؤتمرات لإنشاء مكالمات فيديو مع عملائك",
"no_category_apps_description_payment": "أضف تطبيق دفع لتسهيل التعاملات المالية بينك وبين عملائك",
"no_category_apps_description_analytics": "إضافة تطبيق تحليلي لصفحات الحجز الخاصة بك",
"no_category_apps_description_automation": "إضافة تطبيق أتمتة للاستخدام",
"no_category_apps_description_other": "أضف أي نوع آخر من التطبيقات للقيام بأي شيء",
"installed_app_calendar_description": "قم بتعيين التقويم (التقويمات) للتحقق من أي تضارب لمنع الحجوزات المزدوجة.",
"installed_app_conferencing_description": "أضف تطبيقات مؤتمرات الفيديو المفضلة لديك لاجتماعاتك",
"installed_app_payment_description": "قم بإعداد أي خدمات معالجة دفع تود استخدامها عند التحصيل من العملاء.",
"installed_app_analytics_description": "تكوين أي تطبيقات لاستخدامها مع صفحات الحجز لديك",
"installed_app_other_description": "جميع تطبيقاتك المثبتة من الفئات الأخرى.",
"installed_app_automation_description": "تكوين تطبيقات الأتمتة التي ستُستخدم",
"analytics": "التحليلات",
"empty_installed_apps_headline": "لم يتم تثبيت أي تطبيق",
"empty_installed_apps_description": "تعطيك التطبيقات القدرة على تعزيز سير عملك وتحسين الجدولة في حياتك بشدة.",
"empty_installed_apps_button": "استكشف متجر التطبيقات (App Store)",
@ -823,6 +830,7 @@
"time_format": "تنسيق الوقت",
"12_hour": "12 ساعة",
"24_hour": "24 ساعة",
"24_hour_short": "24 ساعة",
"redirect_success_booking": "إعادة التوجيه عند الحجز ",
"you_are_being_redirected": "ستتم إعادة توجيهك إلى {{ url }} خلال $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
@ -1157,6 +1165,8 @@
"connect_conference_apps": "ربط تطبيقات المؤتمرات",
"connect_calendar_apps": "ربط تطبيقات التقويم",
"connect_payment_apps": "ربط تطبيقات الدفع",
"connect_automation_apps": "توصيل تطبيقات الأتمتة",
"connect_analytics_apps": "توصيل تطبيقات التحليلات",
"connect_other_apps": "ربط تطبيقات أخرى",
"current_step_of_total": "الخطوة {{currentStep}} من {{maxSteps}}",
"add_variable": "إضافة متغير",
@ -1254,7 +1264,11 @@
"seats": "مقاعد",
"every_app_published": "كل تطبيق منشور على Cal.com App Store مفتوح المصدر ويتم اختباره بدقة من خلال مراجعات الأقران. ومع ذلك، فإن شركة Cal.com لا تدعم هذه التطبيقات أو تصرح بها ما لم يتم نشرها بواسطة Cal.com. إذا واجهت محتوى أو سلوكًا غير لائق، فيرجى الإبلاغ عنه.",
"report_app": "الإبلاغ عن تطبيق",
"limit_booking_frequency": "الحد من تواتر الحجز",
"limit_booking_frequency_description": "الحد من عدد مرات حجز هذا الحدث",
"add_limit": "إضافة حد",
"team_name_required": "اسم الفريق مطلوب",
"show_attendees": "مشاركة معلومات الحضور مع الضيوف",
"how_additional_inputs_as_variables": "كيفية استخدام مدخلات إضافية كمتغيرات",
"format": "التنسيق",
"uppercase_for_letters": "استخدم الحروف الكبيرة لجميع الأحرف",
@ -1283,8 +1297,20 @@
"update_timezone_question": "هل تريد تحديث المنطقة الزمنية؟",
"update_timezone_description": "يبدو أن منطقتك الزمنية المحلية قد تغيرت إلى {{formattedCurrentTz}}. من المهم جداً تحديد المنطقة الزمنية المناسبة لمنع الحجز في أوقات غير مرغوب فيها. هل تريد تحديثها؟",
"dont_update": "لا تقم بالتحديث",
"require_additional_notes": "يتطلب ملاحظات إضافية",
"require_additional_notes_description": "يتطلب ملء ملاحظات إضافية عند الحجز",
"email_address_action": "إرسال بريد إلكتروني إلى عنوان بريد إلكتروني محدد",
"after_event_trigger": "بعد انتهاء الحدث",
"how_long_after": "كم من الوقت بعد انتهاء الحدث؟",
"no_available_slots": "لا تتوفر شواغر",
"time_available": "الوقت المتاح",
"install_new_calendar_app": "تثبيت تطبيق تقويم جديد",
"make_phone_number_required": "جعل رقم الهاتف مطلوب لحجز الحدث",
"dont_have_permission": "لا صلاحيات كافية لديك للوصول إلى هذا المصدر.",
"saml_config": "تهيئة SAML",
"saml_description": "السماح لأعضاء الفريق بتسجيل الدخول باستخدام موفر الهوية",
"saml_config_deleted_successfully": "تم حذف تكوين SAML بنجاح",
"saml_config_updated_successfully": "تم تحديث تكوين SAML بنجاح",
"saml_configuration": "تكوين SAML",
"delete_saml_configuration": "حذف تكوين SAML",
"delete_saml_configuration_confirmation_message": "هل تريد بالتأكيد حذف تكوين SAML؟ لن يتمكن بعد الآن أعضاء فريقك الذين يستخدمون تسجيل الدخول عبر SAML من الوصول إلى Cal.com.",
@ -1292,5 +1318,13 @@
"saml_not_configured_yet": "لم يتم تكوين SAML حتى الآن",
"saml_configuration_description": "يُرجى لصق بيانات تعريف SAML المقدمة من مزود الهوية في مربع النص أدناه لتحديث تكوين SAML.",
"saml_configuration_placeholder": "يُرجى لصق بيانات تعريف SAML المقدمة من مزود الهوية هنا",
"saml_email_required": "يُرجى إدخال بريد إلكتروني حتى نتمكن من العثور على مزود هوية SAML الخاص بك"
"saml_email_required": "يُرجى إدخال بريد إلكتروني حتى نتمكن من العثور على مزود هوية SAML الخاص بك",
"saml_sp_title": "تفاصيل موفر الخدمة",
"saml_sp_description": "سيطلب منك موفر الهوية (IdP) التفاصيل التالية لإكمال تكوين تطبيق SAML.",
"saml_sp_acs_url": "رابط ACS",
"saml_sp_entity_id": "معرف الكيان SP",
"saml_sp_acs_url_copied": "تم نسخ رابط ACS!",
"saml_sp_entity_id_copied": "تم نسخ معرف كيان SP!",
"saml_btn_configure": "تكوين",
"add_calendar": "إضافة تقويم"
}

View File

@ -543,6 +543,7 @@
"link_shared": "Odkaz nasdílen!",
"title": "Název",
"description": "Popis",
"apps_status": "Stav aplikace",
"quick_video_meeting": "Rychlá schůzka přes video.",
"scheduling_type": "Typ plánování",
"preview_team": "Náhled týmu",
@ -768,11 +769,15 @@
"no_category_apps_description_conferencing": "Zkuste přidat aplikaci pro konference, která umožní propojit videohovory s vašimi klienty",
"no_category_apps_description_payment": "Přidejte platební aplikaci, která usnadní provádění transakcí mezi vámi a vašimi klienty",
"no_category_apps_description_analytics": "Přidejte analytickou aplikaci pro vaše rezervační stránky",
"no_category_apps_description_automation": "Přidat automatickou aplikaci k použití",
"no_category_apps_description_other": "Přidejte jakýkoli jiný typ aplikace pro nejrůznější činnosti",
"installed_app_calendar_description": "Nastavte si kalendáře, ať můžete kontrolovat konflikty a zabránit tak dvojím rezervacím.",
"installed_app_conferencing_description": "Přidejte své oblíbené aplikace pro videokonference pro vaše schůzky",
"installed_app_payment_description": "Nakonfigurujte služby zpracování plateb, které se mají používat při strhávání plateb od klientů.",
"installed_app_analytics_description": "Nakonfigurujte aplikace, které chcete použít pro své rezervační stránky",
"installed_app_other_description": "Všechny vaše nainstalované aplikace z ostatních kategorií.",
"installed_app_automation_description": "Konfigurovat aplikace pro automatizaci",
"analytics": "Analytici",
"empty_installed_apps_headline": "Nenainstalovány žádné aplikace",
"empty_installed_apps_description": "Aplikace vám umožní zlepšit pracovní postupy a výrazně zkvalitnit plánování.",
"empty_installed_apps_button": "Prozkoumejte App Store",
@ -825,9 +830,11 @@
"time_format": "Formát času",
"12_hour": "12hodinový",
"24_hour": "24hodinový",
"24_hour_short": "24h",
"redirect_success_booking": "Přesměrovat při rezervaci ",
"you_are_being_redirected": "Budete přesměrováni na {{ url }} za $t(s, {\"count\": {{s}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "Přesměrovat na vlastní adresu URL po úspěšné objednávce",
"duplicate": "Duplikovat",
"offer_seats": "Nabídka míst",
"offer_seats_description": "Nabídnout místa k rezervaci. Tím se vypnou rezervace hostů a volitelné rezervace.",
@ -1158,6 +1165,8 @@
"connect_conference_apps": "Propojit konferenční aplikace",
"connect_calendar_apps": "Propojit kalendářové aplikace",
"connect_payment_apps": "Propojit platební aplikace",
"connect_automation_apps": "Připojit automatizační aplikace",
"connect_analytics_apps": "Připojit analytické aplikace",
"connect_other_apps": "Propojit další aplikace",
"current_step_of_total": "Krok {{currentStep}} / {{maxSteps}}",
"add_variable": "Přidat proměnnou",
@ -1242,6 +1251,7 @@
"back_to_signin": "Zpět na přihlášení",
"reset_link_sent": "Odkaz pro obnovení byl odeslán",
"password_reset_email": "E-mail s pokyny k obnovení hesla byl zaslán na adresu {{email}}.",
"password_reset_leading": "Pokud brzy neobdržíte e-mail, zkontrolujte, zda je zadaná e-mailová adresa správná, dále složku nevyžádané pošty nebo se obraťte na podporu, pokud problém přetrvává.",
"password_updated": "Heslo bylo úspěšně změněno!",
"pending_payment": "Čeká se na platbu",
"confirmation_page_rainbow": "Zamkněte svoji událost pomocí tokenů nebo NFT na platformách Ethereum, Polygon a dalších.",
@ -1254,12 +1264,54 @@
"seats": "míst",
"every_app_published": "Každá aplikace zveřejněná v obchodě s aplikacemi na Cal.com má otevřený zdrojový kód a je důkladně testována prostřednictvím vzájemného hodnocení. Společnost Cal.com, Inc. nicméně tyto aplikace neschvaluje ani necertifikuje, pokud nejsou zveřejněny přímo společností Cal.com. Pokud se setkáte s nevhodným obsahem nebo chováním, nahlaste to.",
"report_app": "Nahlásit aplikaci",
"limit_booking_frequency": "Omezit četnost rezervací",
"limit_booking_frequency_description": "Omezit, kolikrát lze tuto událost rezervovat",
"add_limit": "Přidat limit",
"team_name_required": "Je vyžadován název týmu",
"show_attendees": "Sdílet informace o účastnících",
"how_additional_inputs_as_variables": "Jak používat doplňkové vstupy jako proměnné",
"format": "Formát",
"uppercase_for_letters": "Použít velká písmena pro všechna písmena",
"replace_whitespaces_underscores": "Nahradit mezery podtržítky",
"manage_billing": "Spravovat fakturaci",
"manage_billing_description": "Spravovat vše ohledně fakturace",
"billing_freeplan_title": "Momentálně používáte tarif ZDARMA",
"billing_freeplan_description": "Pracujeme lépe v týmech. Rozšiřte své pracovní postupy s oběžníky a kolektivními událostmi a vytvořte pokročilé směrovací formuláře",
"billing_freeplan_cta": "Vyzkoušet nyní",
"billing_manage_details_title": "Zobrazit a spravovat fakturační údaje",
"billing_manage_details_description": "Zobrazit a spravovat fakturační údaje, možnost zrušit předplatné.",
"billing_portal": "Fakturační portál",
"billing_help_title": "Potřebujete ještě něco?",
"billing_help_description": "Pokud potřebujete jakoukoliv pomoc s fakturací, náš tým zákaznické podpory je tu pro Vás.",
"billing_help_cta": "Kontaktovat podporu",
"ignore_special_characters": "Ignorovat speciální znaky ve štítku Dodatečný vstup. Použijte pouze písmena a čísla",
"retry": "Opakovat",
"fetching_calendars_error": "Při ukládání vašich údajů došlo k problému. Zkuste to znovu, <1>případně</1> se obraťte na zákaznickou podporu.",
"calendar_connection_fail": "Připojení kalendáře se nezdařilo",
"booking_confirmation_success": "Potvrzení rezervace bylo úspěšné",
"booking_confirmation_fail": "Potvrzení rezervace se nezdařilo",
"we_wont_show_again": "Znovu toto nezobrazovat",
"couldnt_update_timezone": "Časové pásmo nelze aktualizovat",
"updated_timezone_to": "Časové pásmo aktualizováno na {{formattedCurrentTz}}",
"update_timezone": "Aktualizovat časové pásmo",
"update_timezone_question": "Aktualizovat časové pásmo?",
"update_timezone_description": "Zdá se, že se místní časové pásmo změnilo na {{formattedCurrentTz}}. Je velmi důležité mít správné časové pásmo, aby se zabránilo rezervacím v nežádoucích časech. Chcete jej aktualizovat?",
"dont_update": "Neaktualizovat",
"require_additional_notes": "Požadovat další poznámky",
"require_additional_notes_description": "Požadovat vyplnění doplňujících poznámek při rezervaci",
"email_address_action": "odeslat e-mail na specifickou e-mailovou adresu",
"after_event_trigger": "po ukončení události",
"how_long_after": "Jak dlouho po ukončení události?",
"no_available_slots": "Žádné dostupné sloty",
"time_available": "Dostupný čas",
"cant_find_the_right_video_app_visit_our_app_store": "Nemůžete najít správnou video aplikaci? Navštivte náš <1>App Store</1>.",
"install_new_calendar_app": "Nainstalovat novou aplikaci kalendáře",
"make_phone_number_required": "Požadovat telefonní číslo pro událost rezervace",
"dont_have_permission": "Nemáte oprávnění k přístupu k tomuto dokumentu.",
"saml_config": "Konfigurace SAML",
"saml_description": "Povolit členům týmu přihlásit se pomocí poskytovatele identity",
"saml_config_deleted_successfully": "SAML konfigurace byla úspěšně smazána",
"saml_config_updated_successfully": "Konfigurace SAML byla úspěšně aktualizována",
"saml_configuration": "Konfigurace SAML",
"delete_saml_configuration": "Smazat konfiguraci SAML",
"delete_saml_configuration_confirmation_message": "Opravdu chcete smazat konfiguraci SAML? Vaši členové týmu, kteří využívají přihlašování přes SAML, přijdou o přístup ke Cal.com.",
@ -1267,5 +1319,13 @@
"saml_not_configured_yet": "SAML zatím není nakonfigurován",
"saml_configuration_description": "Pro aktualizaci SAML vložte prosím metadata SAML od poskytovatele vaší identity do textového pole níže.",
"saml_configuration_placeholder": "Vložte sem SAML metadata vašeho Identity Providera",
"saml_email_required": "Zadejte prosím e-mail, abychom mohli určit vašeho SAML Identity Providera"
"saml_email_required": "Zadejte prosím e-mail, abychom mohli určit vašeho SAML Identity Providera",
"saml_sp_title": "Podrobnosti poskytovatele služby",
"saml_sp_description": "Váš poskytovatel identity (IdP) vás požádá, abyste dokončili konfiguraci SAML aplikace.",
"saml_sp_acs_url": "Adresa URL ACS",
"saml_sp_entity_id": "ID entity SP",
"saml_sp_acs_url_copied": "URL adresa ACS zkopírována!",
"saml_sp_entity_id_copied": "ID entity SP zkopírováno!",
"saml_btn_configure": "Konfigurovat",
"add_calendar": "Přidat kalendář"
}

View File

@ -313,6 +313,7 @@
"past_bookings": "Ihre früheren Buchungen werden hier angezeigt.",
"cancelled_bookings": "Ihre stornierten Buchungen werden hier angezeigt.",
"unconfirmed_bookings": "Ihre unbestätigten Buchungen werden hier angezeigt.",
"unconfirmed_bookings_tooltip": "Unbestätigte Buchungen",
"on": "auf",
"and": "und",
"calendar_shows_busy_between": "Ihr Kalender ist belegt zwischen",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "Fügen Sie eine Kalender-App hinzu, in der nach Konflikten gesucht werden soll, um Doppelbuchungen zu vermeiden",
"no_category_apps_description_conferencing": "Versuchen Sie, eine Konferenz-App hinzuzufügen, um Videoanrufe mit Ihren Kunden zu integrieren",
"no_category_apps_description_payment": "Fügen Sie eine Zahlungs-App hinzu, um die Transaktion zwischen Ihnen und Ihren Kunden zu erleichtern",
"no_category_apps_description_analytics": "Fügen Sie eine Analyse-App für Ihre Buchungsseiten hinzu",
"no_category_apps_description_automation": "Fügen Sie eine Automatisierungs-App hinzu, die verwendet werden soll",
"no_category_apps_description_other": "Füge jede beliebige andere Art von App hinzu, um alle möglichen Dinge zu tun",
"installed_app_calendar_description": "Legen Sie den/die Kalender in denen nach Konflikten gesucht werden sollen fest, um Doppelbuchungen zu vermeiden.",
"installed_app_conferencing_description": "Fügen Sie Ihre liebsten Videokonferenz-Apps für Ihre Meetings hinzu",
"installed_app_payment_description": "Konfigurieren Sie die Zahlungsdienstleister, welcher bei der Belastung Ihrer Kunden verwendet werden sollen.",
"installed_app_analytics_description": "Konfigurieren Sie, welche Analyse-Apps für Ihre Buchungsseiten verwendet werden sollen",
"installed_app_other_description": "Alle von Ihnen installierten Apps aus anderen Kategorien.",
"installed_app_automation_description": "Konfigurieren Sie, welche Automatisierungs-Apps verwendet werden sollen",
"analytics": "Analyse",
"empty_installed_apps_headline": "Keine Apps installiert",
"empty_installed_apps_description": "Apps erlauben es Ihnen, Ihren Arbeitsfluss zu verbessern und Ihre Planung viel besser zu gestalten.",
"empty_installed_apps_button": "Entdecken Sie den App Store",
@ -823,9 +829,11 @@
"time_format": "Zeitformat",
"12_hour": "12 Stunden",
"24_hour": "24 Stunden",
"24_hour_short": "24 Std",
"redirect_success_booking": "Weiterleitung bei Buchung ",
"you_are_being_redirected": "Sie werden in $t(second, {\"count\": {{seconds}} }) auf {{ url }} weitergeleitet.",
"external_redirect_url": "Externe Umleitungs-URL - Beginnt mit https://",
"redirect_url_description": "Nach erfolgreicher Buchung auf eine benutzerdefinierte URL weiterleiten",
"duplicate": "Duplizieren",
"offer_seats": "Plätze anbieten",
"offer_seats_description": "Bieten Sie Plätze für Buchungen an (dies deaktiviert Gäste & Opt-in-Buchungen)",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "Konferenz-Apps verbinden",
"connect_calendar_apps": "Kalender-Apps verbinden",
"connect_payment_apps": "Zahlungs-Apps verbinden",
"connect_automation_apps": "Automatisierungs-Apps verbinden",
"connect_analytics_apps": "Analyse-Apps verbinden",
"connect_other_apps": "Andere Apps verbinden",
"current_step_of_total": "Schritt {{currentStep}} von {{maxSteps}}",
"add_variable": "Variable hinzufügen",
@ -1240,6 +1250,7 @@
"back_to_signin": "Zurück zur Anmeldung",
"reset_link_sent": "Zurücksetzungslink gesendet",
"password_reset_email": "Eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts ist auf dem Weg zu {{email}}.",
"password_reset_leading": "Falls Sie nicht bald eine E-Mail erhalten, überprüfen Sie, ob die eingegebene E-Mail-Adresse korrekt ist. Überprüfen Sie außerdem Ihren Spam-Ordner oder wenden Sie sich an den Support, wenn das Problem weiterhin besteht.",
"password_updated": "Passwort aktualisiert!",
"pending_payment": "Zahlung ausstehend",
"confirmation_page_rainbow": "Sperren Sie Ihr Ereignis hinter Tokens oder NFTs auf Ethereum, Polygon und mehr.",
@ -1252,11 +1263,51 @@
"seats": "Plätze",
"every_app_published": "Jede App, die im Cal.com App Store veröffentlicht wird, ist Open Source und gründlich durch Peer Reviews getestet. Cal.com, Inc. unterstützt oder zertifiziert diese Apps jedoch nicht, es sei denn, sie werden von Cal.com veröffentlicht. Wenn Sie auf unangemessene Inhalte oder Verhaltensweisen stoßen, melden Sie diese bitte.",
"report_app": "App melden",
"limit_booking_frequency": "Buchungsfrequenz begrenzen",
"limit_booking_frequency_description": "Begrenzen, wie oft dieses Ereignis gebucht werden kann",
"add_limit": "Begrenzung hinzufügen",
"team_name_required": "Teamname erforderlich",
"show_attendees": "Teilnehmerinformationen zwischen Gästen teilen",
"how_additional_inputs_as_variables": "Wie man zusätzliche Eingaben als Variablen verwendet",
"format": "Format",
"uppercase_for_letters": "Großbuchstaben für alle Buchstaben verwenden",
"replace_whitespaces_underscores": "Leerzeichen durch Unterstriche ersetzen",
"manage_billing": "Abrechnung verwalten",
"manage_billing_description": "Alles zur Abrechnung verwalten",
"billing_freeplan_title": "Sie verwenden derzeit den KOSTENLOSEN Plan",
"billing_freeplan_description": "In Teams arbeitet man am Besten. Erweitern Sie Ihre Arbeitsabläufe mit Rundlauf und kollektiven Veranstaltungen und erstellen Sie erweiterte Leitungsformulare",
"billing_freeplan_cta": "Jetzt ausprobieren",
"billing_manage_details_title": "Ihre Rechnungsdetails ansehen und verwalten",
"billing_manage_details_description": "Rechnungsdaten ansehen, bearbeiten oder Abonnement kündigen.",
"billing_portal": "Abrechnungsportal",
"billing_help_title": "Brauchen Sie etwas anderes?",
"billing_help_description": "Wenn Sie weitere Hilfe bei der Rechnungsstellung benötigen, hilft Ihnen unser Support-Team gerne weiter.",
"billing_help_cta": "Support kontaktieren",
"ignore_special_characters": "Ignorieren Sie Sonderzeichen in Ihrer zusätzlichen Eingabebezeichnung. Verwenden Sie nur Buchstaben und Zahlen",
"retry": "Erneut versuchen",
"fetching_calendars_error": "Beim Abrufen Ihrer Kalender ist ein Problem aufgetreten. Bitte <1>versuchen Sie es erneut</1> oder wenden Sie sich an den Support.",
"calendar_connection_fail": "Kalenderverbindung fehlgeschlagen",
"booking_confirmation_success": "Buchungsbestätigung erfolgreich",
"booking_confirmation_fail": "Buchungsbestätigung fehlgeschlagen",
"we_wont_show_again": "Wir werden dies nicht erneut anzeigen",
"couldnt_update_timezone": "Die Zeitzone konnte nicht aktualisiert werden",
"updated_timezone_to": "Zeitzone auf {{formattedCurrentTz}} aktualisiert",
"update_timezone": "Zeitzone aktualisieren",
"update_timezone_question": "Zeitzone aktualisieren?",
"update_timezone_description": "Ihre lokale Zeitzone scheint sich zu {{formattedCurrentTz}} geändert zu haben. Es ist sehr wichtig, die richtige Zeitzone zu haben, um Buchungen zu unerwünschten Zeiten zu verhindern. Möchten Sie sie aktualisieren?",
"dont_update": "Nicht aktualisieren",
"require_additional_notes": "Zusätzliche Notizen erforderlich",
"require_additional_notes_description": "Zusätzliche Notizen bei der Buchung erforderlich machen",
"email_address_action": "eine E-Mail an eine bestimmte E-Mail-Adresse senden",
"after_event_trigger": "nach Ende des Ereignisses",
"how_long_after": "Wie lange nach Ende des Ereignisses?",
"no_available_slots": "Keine verfügbaren Plätze",
"time_available": "Zeit verfügbar",
"install_new_calendar_app": "Neue Kalender-App installieren",
"make_phone_number_required": "Telefonnummer für die Buchung des Ereignisses erforderlich machen",
"dont_have_permission": "Ihnen fehlt die Berechtigung, auf diese Ressource zuzugreifen.",
"saml_config": "SAML-Konfiguration",
"saml_description": "Teammitgliedern erlauben, sich mit einem Identitäts-Anbieter anzumelden",
"saml_config_deleted_successfully": "SAML-Konfiguration wurde erfolgreich gelöscht",
"saml_config_updated_successfully": "SAML-Konfiguration erfolgreich aktualisiert",
"saml_configuration": "SAML-Einstellungen",
@ -1266,5 +1317,12 @@
"saml_not_configured_yet": "SAML wurde noch nicht konfiguriert",
"saml_configuration_description": "Bitte fügen Sie die SAML-Metadaten Ihres SAML-Anbieters in die Textbox ein, um Ihre SAML-Konfiguration zu aktualisieren.",
"saml_configuration_placeholder": "Bitte fügen Sie die SAML-Metadaten von Ihrem SAML-Anbieter hier ein",
"saml_email_required": "Bitte geben Sie eine E-Mail ein, damit wir Ihren SAML Anbieter finden können"
"saml_email_required": "Bitte geben Sie eine E-Mail ein, damit wir Ihren SAML Anbieter finden können",
"saml_sp_title": "Einzelheiten zum Dienstanbieter",
"saml_sp_description": "Ihr Identitätsanbieter (IdP) bittet Sie um die folgenden Details, um die Konfiguration der SAML Anwendung abzuschließen.",
"saml_sp_acs_url": "ACS-URL",
"saml_sp_entity_id": "SP-Entitäts-ID",
"saml_sp_acs_url_copied": "ACS-URL kopiert!",
"saml_sp_entity_id_copied": "SP-Entitäts-ID kopiert!",
"saml_btn_configure": "Konfigurieren"
}

View File

@ -830,6 +830,8 @@
"time_format": "Time format",
"12_hour": "12 hour",
"24_hour": "24 hour",
"12_hour_short": "12h",
"24_hour_short": "24h",
"redirect_success_booking": "Redirect on booking ",
"you_are_being_redirected": "You are being redirected to {{ url }} in $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
@ -1110,6 +1112,7 @@
"error_updating_settings": "Error updating settings",
"personal_cal_url": "My personal Cal URL",
"bio_hint": "A few sentences about yourself. this will appear on your personal url page.",
"timeformat_profile_hint": "This is an internal setting and will not affect how times are displayed on public booking pages for you or anyone booking you.",
"delete_account_modal_title": "Delete Account",
"confirm_delete_account_modal": "Are you sure you want to delete your Cal.com account?",
"delete_my_account": "Delete my account",
@ -1306,6 +1309,8 @@
"cant_find_the_right_video_app_visit_our_app_store": "Can't find the right video app? Visit our <1>App Store</1>.",
"install_new_calendar_app": "Install new calendar app",
"make_phone_number_required": "Make phone number required for booking event",
"new_event_type_availability": "{{eventTypeTitle}} Availability",
"error_editing_availability": "Error editing availability",
"dont_have_permission": "You don't have permission to access this resource.",
"saml_config": "Single Sign-On",
"saml_description": "Allow team members to login using an Identity Provider",
@ -1327,6 +1332,8 @@
"saml_sp_entity_id_copied": "SP Entity ID copied!",
"saml_btn_configure": "Configure",
"add_calendar": "Add Calendar",
"limit_future_bookings":"Limit future bookings",
"limit_future_bookings_description":"Limit how far in the future this event can be booked",
"no_event_types": "No event types setup",
"no_event_types_description": "{{name}} has not setup any event types for you to book.",
"billing_frequency": "Billing Frequency",

View File

@ -313,6 +313,7 @@
"past_bookings": "Sus reservas pasadas aparecerán aquí.",
"cancelled_bookings": "Las reservas canceladas aparecerán aquí.",
"unconfirmed_bookings": "Las reservas sin confirmar aparecerán aquí.",
"unconfirmed_bookings_tooltip": "Reservas sin confirmar",
"on": "en",
"and": "y",
"calendar_shows_busy_between": "Tu calendario te muestra como ocupado entre",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "Añade una aplicación de calendario para comprobar si hay conflictos y evitar reservas duplicadas",
"no_category_apps_description_conferencing": "Intenta añadir una aplicación de conferencias para integrar las videollamadas con tus clientes",
"no_category_apps_description_payment": "Añade una aplicación de pagos para facilitar las transacciones con tus clientes",
"no_category_apps_description_analytics": "Añada una aplicación de análisis para sus páginas de reserva",
"no_category_apps_description_automation": "Añada una aplicación de automatización para usar",
"no_category_apps_description_other": "Añade cualquier otro tipo de aplicación para hacer todo tipo de tareas",
"installed_app_calendar_description": "Configura el(los) calendario(s) para comprobar conflictos y evitar reservas duplicadas.",
"installed_app_conferencing_description": "Añade tus aplicaciones de videoconferencia favoritas para las reuniones",
"installed_app_payment_description": "Configura los servicios de procesamiento de pagos que vas a utilizar para cobrar a tus clientes.",
"installed_app_analytics_description": "Configure qué aplicaciones de análisis utilizar para sus páginas de reserva",
"installed_app_other_description": "Todas tus aplicaciones instaladas de otras categorías.",
"installed_app_automation_description": "Configure qué aplicaciones de automatización usar",
"analytics": "Análisis",
"empty_installed_apps_headline": "No hay aplicaciones instaladas",
"empty_installed_apps_description": "Las aplicaciones le permiten mejorar su flujo de trabajo y mejorar su tiempo calendario de forma significativa.",
"empty_installed_apps_button": "Explore la tienda de aplicaciones",
@ -823,9 +829,11 @@
"time_format": "Formato de hora",
"12_hour": "12 horas",
"24_hour": "24 horas",
"24_hour_short": "24hs",
"redirect_success_booking": "Redirigir al reservar ",
"you_are_being_redirected": "Serás redirigido a {{ url }} en $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "Redirija a una URL personalizada después de una reserva exitosa",
"duplicate": "Duplicar",
"offer_seats": "Ofrecer plazas",
"offer_seats_description": "Ofrecer plazas para las reservas (desactiva las reservas de invitados y las optativas)",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "Conectar aplicaciones de conferencia",
"connect_calendar_apps": "Conectar aplicaciones de calendario",
"connect_payment_apps": "Conectar aplicaciones de pago",
"connect_automation_apps": "Conecte aplicaciones de automatización",
"connect_analytics_apps": "Conecte aplicaciones de análisis",
"connect_other_apps": "Conectar otras aplicaciones",
"current_step_of_total": "Paso {{currentStep}} de {{maxSteps}}",
"add_variable": "Añadir variable",
@ -1240,6 +1250,7 @@
"back_to_signin": "Volver a iniciar sesión",
"reset_link_sent": "Enlace de restablecimiento enviado",
"password_reset_email": "Se envió un correo electrónico a {{email}} con instrucciones para restablecer tu contraseña.",
"password_reset_leading": "Si no recibe un correo electrónico pronto, compruebe que la dirección de correo que ha introducido sea correcta, revise su carpeta de correo no deseado o comuníquese con el equipo de soporte si el problema persiste.",
"password_updated": "¡Contraseña actualizada!",
"pending_payment": "Pago pendiente",
"confirmation_page_rainbow": "Cierra el acceso a tu evento con tokens o NFTs en Ethereum, Polygon, etc.",
@ -1252,12 +1263,53 @@
"seats": "plazas",
"every_app_published": "Todas las aplicaciones publicadas en la tienda de aplicaciones de Cal.com son de código abierto y han sido probadas exhaustivamente mediante revisiones por parte de los usuarios. Sin embargo, Cal.com, Inc. no respalda ni certifica estas aplicaciones a menos que sean publicadas por Cal.com. Si encuentras contenidos o comportamientos inapropiados, notifícalos.",
"report_app": "Denunciar aplicación",
"limit_booking_frequency": "Limite la frecuencia de reserva",
"limit_booking_frequency_description": "Limite cuántas veces se puede reservar este evento",
"add_limit": "Agregue un límite",
"team_name_required": "Nombre de equipo requerido",
"show_attendees": "Comparta información de los asistentes entre los invitados",
"how_additional_inputs_as_variables": "Cómo usar entradas adicionales como variables",
"format": "Formato",
"uppercase_for_letters": "Use mayúsculas para todas las letras",
"replace_whitespaces_underscores": "Reemplace espacios en blanco con guiones bajos",
"manage_billing": "Gestione la facturación",
"manage_billing_description": "Gestione todo lo relacionado con las facturas",
"billing_freeplan_title": "Actualmente está en el plan GRATUITO",
"billing_freeplan_description": "Trabajamos mejor en equipo. Amplíe sus flujos de trabajo con eventos colectivos y rotativos y cree formularios de enrutamiento avanzados",
"billing_freeplan_cta": "Pruebe ahora",
"billing_manage_details_title": "Ver y administrar tus datos de facturación",
"billing_manage_details_description": "Ver y editar tus datos de facturación, así como cancelar tu suscripción.",
"billing_portal": "Portal de facturación",
"billing_help_title": "¿Necesitas algo más?",
"billing_help_description": "Si necesitas más ayuda con la facturación, nuestro equipo de soporte está a tu disposición.",
"billing_help_cta": "Contacte con soporte",
"ignore_special_characters": "Ignore caracteres especiales en su etiqueta de entrada adicional. Use solo letras y números",
"retry": "Reintentar",
"fetching_calendars_error": "Se produjo un problema al recuperar sus calendarios. <1>Inténtelo de nuevo</1> o contacte con el servicio de atención al cliente.",
"calendar_connection_fail": "Conexión fallida con el calendario",
"booking_confirmation_success": "Confirmación de reserva exitosa",
"booking_confirmation_fail": "Confirmación de reserva fallida",
"we_wont_show_again": "No mostraremos esto de nuevo",
"couldnt_update_timezone": "No pudimos actualizar la zona horaria",
"updated_timezone_to": "Zona horaria actualizada a {{formattedCurrentTz}}",
"update_timezone": "Actualizar zona horaria",
"update_timezone_question": "¿Actualizar zona horaria?",
"update_timezone_description": "Parece que su zona horaria local ha cambiado a {{formattedCurrentTz}}. Es muy importante tener la zona horaria correcta para evitar reservas en tiempos no deseados. ¿Quiere actualizarla?",
"dont_update": "No actualizar",
"require_additional_notes": "Requerir notas adicionales",
"require_additional_notes_description": "Requiere que se llenen las notas adicionales al reservar",
"email_address_action": "enviar correo a una dirección de correo electrónico específica",
"after_event_trigger": "después de que el evento termine",
"how_long_after": "¿Cuánto tiempo después de que termina el evento?",
"no_available_slots": "No hay espacios disponibles",
"time_available": "Tiempo disponible",
"install_new_calendar_app": "Instalar nueva aplicación de calendario",
"make_phone_number_required": "Hacer que se requiera el número de teléfono para reservar el evento",
"dont_have_permission": "No tiene permiso para acceder a este recurso.",
"saml_config": "Configuración de SAML",
"saml_description": "Permita que los miembros del equipo inicen sesión mediante un proveedor de identidad",
"saml_config_deleted_successfully": "Configuración SAML eliminada correctamente",
"saml_config_updated_successfully": "Configuración SAML actualizada correctamente",
"saml_configuration": "Configuración SAML",
"delete_saml_configuration": "Eliminar configuración SAML",
"delete_saml_configuration_confirmation_message": "¿Estás seguro de que deseas eliminar la configuración SAML? Los miembros de tu equipo que utilicen el inicio de sesión SAML ya no podrán acceder a Cal.com.",
@ -1265,5 +1317,12 @@
"saml_not_configured_yet": "SAML no está configurado aún",
"saml_configuration_description": "Pega los metadatos SAML de tu Proveedor de Identidad en el cuadro de texto de abajo para actualizar tu configuración SAML.",
"saml_configuration_placeholder": "Pega los metadatos SAML de tu Proveedor de Identidad aquí",
"saml_email_required": "Por favor, introduce un correo electrónico para que podamos encontrar tu Proveedor de Identidad SAML"
"saml_email_required": "Por favor, introduce un correo electrónico para que podamos encontrar tu Proveedor de Identidad SAML",
"saml_sp_title": "Detalles del proveedor de servicios",
"saml_sp_description": "Su proveedor de identidad (IdP) le pedirá los siguientes detalles para completar la configuración de la aplicación SAML.",
"saml_sp_acs_url": "URL ACS",
"saml_sp_entity_id": "ID de entidad SP",
"saml_sp_acs_url_copied": "¡URL ACS copiada!",
"saml_sp_entity_id_copied": "¡ID de entidad SP copiado!",
"saml_btn_configure": "Configurar"
}

View File

@ -313,6 +313,7 @@
"past_bookings": "Vos réservations passées apparaîtront ici.",
"cancelled_bookings": "Vos réservations annulées apparaîtront ici.",
"unconfirmed_bookings": "Vos réservations non confirmées apparaîtront ici.",
"unconfirmed_bookings_tooltip": "Réservations non confirmées",
"on": "le",
"and": "et",
"calendar_shows_busy_between": "Votre calendrier vous montre comme étant occupé entre",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "Ajouter une application de calendrier pour vérifier les conflits et éviter les doubles réservations",
"no_category_apps_description_conferencing": "Essayez d'ajouter une application de conférence pour interconnecter les appels vidéo avec vos clients",
"no_category_apps_description_payment": "Ajouter une application de paiement pour faciliter les transactions entre vous et vos clients",
"no_category_apps_description_analytics": "Ajouter une application d'analyse pour vos pages de réservation",
"no_category_apps_description_automation": "Ajouter une application d'automatisation à utiliser",
"no_category_apps_description_other": "Ajouter n'importe quel autre type d'application pour faire toutes sortes de choses",
"installed_app_calendar_description": "Définir le ou les calendriers pour vérifier les conflits pour éviter les doubles réservations.",
"installed_app_conferencing_description": "Ajoutez vos applications de vidéoconférence préférées pour vos réunions",
"installed_app_payment_description": "Configurez les services de traitement de paiement à utiliser lors de la facturation de vos clients.",
"installed_app_analytics_description": "Configurer les applications d'analyse à utiliser pour vos pages de réservation",
"installed_app_other_description": "Toutes vos applications installées à partir d'autres catégories.",
"installed_app_automation_description": "Configurer les applications d'automatisation à utiliser",
"analytics": "Analytiques",
"empty_installed_apps_headline": "Aucune application installée",
"empty_installed_apps_description": "Les applications vous permettent d'améliorer votre flux de travail et votre processus de planification de façon significative.",
"empty_installed_apps_button": "Explorer l'App Store",
@ -823,9 +829,11 @@
"time_format": "Format horaire",
"12_hour": "12 heures",
"24_hour": "24 heures",
"24_hour_short": "24h",
"redirect_success_booking": "Rediriger vers la réservation ",
"you_are_being_redirected": "Vous êtes redirigé vers {{ url }} dans $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://exemple.com/redirect-to-my-success-page",
"redirect_url_description": "Rediriger vers une URL personnalisée après une réservation réussie",
"duplicate": "Dupliquer",
"offer_seats": "Offrir des places",
"offer_seats_description": "Offrez des places pour réservations (cela désactive les invités et active les réservations)",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "Connecter les applications de conférence",
"connect_calendar_apps": "Connecter les applications de calendrier",
"connect_payment_apps": "Connecter les applications de paiement",
"connect_automation_apps": "Connecter les applications d'automatisation",
"connect_analytics_apps": "Connecter les applications analytiques",
"connect_other_apps": "Connecter d'autres applications",
"current_step_of_total": "Étape {{currentStep}} sur {{maxSteps}}",
"add_variable": "Ajouter une variable",
@ -1240,6 +1250,7 @@
"back_to_signin": "Retour à la connexion",
"reset_link_sent": "Lien de réinitialisation envoyé",
"password_reset_email": "Un e-mail est transmis vers {{email}} avec les instructions pour réinitialiser votre mot de passe.",
"password_reset_leading": "Si vous ne recevez pas de courriel bientôt, vérifiez que l'adresse e-mail que vous avez saisie est correcte, vérifiez votre dossier spam ou contactez le support si le problème persiste.",
"password_updated": "Mot de passe mis à jour !",
"pending_payment": "Paiement en attente",
"confirmation_page_rainbow": "Le jeton porte votre événement avec des jetons ou des NFT sur Ethereum, Polygone et plus encore.",
@ -1252,12 +1263,53 @@
"seats": "places",
"every_app_published": "Chaque application publiée sur l'App Store de Cal.com est open source et soigneusement testée via les évaluations par les pairs. Néanmoins, Cal.com, Inc. n'approuve pas ou ne certifie pas ces applications à moins qu'elles ne soient publiées par Cal.com. Si vous rencontrez un contenu ou un comportement inapproprié, veuillez le signaler.",
"report_app": "Signaler une application",
"limit_booking_frequency": "Limiter la fréquence de réservation",
"limit_booking_frequency_description": "Limite combien de fois cet événement peut être réservé",
"add_limit": "Ajouter une limite",
"team_name_required": "Nom d'équipe requis",
"show_attendees": "Partager les informations des participants entre les invités",
"how_additional_inputs_as_variables": "Comment utiliser des entrées supplémentaires en tant que variables",
"format": "Format",
"uppercase_for_letters": "Utiliser des majuscules pour toutes les lettres",
"replace_whitespaces_underscores": "Remplacer les espaces par des tirets bas",
"manage_billing": "Gérer la facturation",
"manage_billing_description": "Gérer toute la facturation",
"billing_freeplan_title": "Vous êtes actuellement sur le forfait GRATUIT",
"billing_freeplan_description": "Nous travaillons mieux en équipe. Élargissez vos workflows avec rond-robin et événements collectifs et faites des formulaires de routage avancés",
"billing_freeplan_cta": "Essayer maintenant",
"billing_manage_details_title": "Affichez et gérez vos informations de facturation",
"billing_manage_details_description": "Affichez et modifiez vos informations de facturation, et annulez votre abonnement.",
"billing_portal": "Portail de facturation",
"billing_help_title": "Besoin d'autre chose ?",
"billing_help_description": "Si vous avez besoin d'aide pour la facturation, notre équipe d'assistance est là pour vous aider.",
"billing_help_cta": "Contacter le support",
"ignore_special_characters": "Ignorer les caractères spéciaux dans votre étiquette de saisie supplémentaire. Utilisez uniquement des lettres et des chiffres",
"retry": "Réessayer",
"fetching_calendars_error": "Un problème est survenu lors de la récupération de vos calendriers. Veuillez <1>réessayer</1> ou contacter le service client.",
"calendar_connection_fail": "Échec de la connexion au calendrier",
"booking_confirmation_success": "Confirmation de réservation réussie",
"booking_confirmation_fail": "Échec de la confirmation de la réservation",
"we_wont_show_again": "Nous n'afficherons plus ceci",
"couldnt_update_timezone": "Nous n'avons pas pu mettre à jour le fuseau horaire",
"updated_timezone_to": "Fuseau horaire mis à jour vers {{formattedCurrentTz}}",
"update_timezone": "Mettre à jour le fuseau horaire",
"update_timezone_question": "Mettre à jour le fuseau horaire ?",
"update_timezone_description": "Il semble que votre fuseau horaire local soit passé à {{formattedCurrentTz}}. Il est très important d'avoir le fuseau horaire correct pour éviter les réservations à des heures indésirables. Voulez-vous le mettre à jour ?",
"dont_update": "Ne pas mettre à jour",
"require_additional_notes": "Nécessite des notes supplémentaires",
"require_additional_notes_description": "Nécessite des notes supplémentaires à remplir lors de la réservation",
"email_address_action": "envoyer un e-mail à une adresse e-mail spécifique",
"after_event_trigger": "après la fin de l'événement",
"how_long_after": "Combien de temps après la fin de l'événement ?",
"no_available_slots": "Pas de créneaux disponibles",
"time_available": "Heure disponible",
"install_new_calendar_app": "Installer une nouvelle application de calendrier",
"make_phone_number_required": "Rendre le numéro de téléphone nécessaire pour la réservation de l'événement",
"dont_have_permission": "Vous n'avez pas la permission d'accéder à cette ressource.",
"saml_config": "Configuration SAML",
"saml_description": "Autoriser les membres de l'équipe à se connecter à l'aide d'un fournisseur d'identité",
"saml_config_deleted_successfully": "Configuration SAML supprimée avec succès",
"saml_config_updated_successfully": "Configuration SAML mise à jour avec succès",
"saml_configuration": "Configuration SAML",
"delete_saml_configuration": "Supprimer la configuration SAML",
"delete_saml_configuration_confirmation_message": "Êtes-vous sûr de vouloir supprimer la configuration SAML ? Les membres de votre équipe qui utilisent la connexion SAML ne pourront plus accéder à Cal.com.",
@ -1265,5 +1317,12 @@
"saml_not_configured_yet": "SAML non configuré pour l'instant",
"saml_configuration_description": "Veuillez coller les métadonnées SAML de votre fournisseur d'identité dans la zone de texte ci-dessous pour mettre à jour votre configuration SAML.",
"saml_configuration_placeholder": "Veuillez coller les métadonnées SAML de votre fournisseur d'identité ici",
"saml_email_required": "Veuillez saisir une adresse e-mail pour que nous puissions trouver votre fournisseur d'identité SAML"
"saml_email_required": "Veuillez saisir une adresse e-mail pour que nous puissions trouver votre fournisseur d'identité SAML",
"saml_sp_title": "Informations sur le fournisseur de services",
"saml_sp_description": "Votre fournisseur d'identité (IdP) vous demandera les détails suivants pour compléter la configuration de l'application SAML.",
"saml_sp_acs_url": "URL ACS",
"saml_sp_entity_id": "Identifiant SP Entity",
"saml_sp_acs_url_copied": "URL ACS copiée !",
"saml_sp_entity_id_copied": "Identifiant SP Entity copié !",
"saml_btn_configure": "Configurer"
}

View File

@ -313,6 +313,7 @@
"past_bookings": "ההזמנות הקודמות שלך יוצגו כאן.",
"cancelled_bookings": "ההזמנות המבוטלות שלך יוצגו כאן.",
"unconfirmed_bookings": "ההזמנות שלך שלא אושרו יוצגו כאן.",
"unconfirmed_bookings_tooltip": "הזמנות שלא אושרו",
"on": "בתאריך",
"and": "וגם",
"calendar_shows_busy_between": "בלוח השנה מוצג כי אתה עסוק בין",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "הוסף/י אפליקציית לוח שנה כדי לבדוק אם יש התנגשויות על מנת למנוע כפל הזמנות",
"no_category_apps_description_conferencing": "נסה/י להוסיף אפליקציית שיחות ועידה כדי לשלב שיחות וידאו עם הלקוחות",
"no_category_apps_description_payment": "הוסף/י אפליקציית תשלומים על מנת להפוך את ביצוע העסקאות בינך לבין הלקוחות לפשוט יותר",
"no_category_apps_description_analytics": "הוספת אפליקציה לניתוח נתונים עבור דפי ההזמנות שלך",
"no_category_apps_description_automation": "הוספת אפליקציית אוטומציה לשימוש",
"no_category_apps_description_other": "הוסף/הוסיפי אפליקציה מכל סוג אחר לביצוע פעולות שונות",
"installed_app_calendar_description": "הגדר/י את לוח(ות) השנה כדי לבדוק אם יש התנגשויות על מנת למנוע כפל הזמנות.",
"installed_app_conferencing_description": "הוסף/הוסיפי את האפליקציות האהובות עליך לשיחות ועידה לשימוש בפגישות שלך",
"installed_app_payment_description": "הגדר/הגידירי את השירותים לעיבוד תשלומים שבהם יש להשתמש לחיוב הלקוחות.",
"installed_app_analytics_description": "הגדרת האפליקציות לניתוח נתונים שבהן יש להשתמש עבור דפי ההזמנות שלך",
"installed_app_other_description": "כל האפליקציות המותקנות שלך מקטגוריות אחרות.",
"installed_app_automation_description": "הגדרת אפליקציות האוטומציה שבהן יש להשתמש",
"analytics": "ניתוח נתונים",
"empty_installed_apps_headline": "אין אפליקציות מותקנות",
"empty_installed_apps_description": "אפליקציות מאפשרות לך לשפר משמעותית את תהליכי העבודה שלך ואת תהליך קביעת המועדים.",
"empty_installed_apps_button": "נא לעיין ב-App Store",
@ -823,9 +829,11 @@
"time_format": "פורמט תצוגת זמן",
"12_hour": "12 שעות",
"24_hour": "24 שעות",
"24_hour_short": "24 שעות",
"redirect_success_booking": "הפניה מחדש בעת הזמנה ",
"you_are_being_redirected": "אנחנו ננתב אותך אל {{ url }} בעוד $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "הפניה לכתובת URL מותאמת אישית לאחר ביצוע הזמנה בהצלחה",
"duplicate": "כפילות",
"offer_seats": "הצעת מקומות",
"offer_seats_description": "הצעת מקומות להזמנות (אפשרות זו משביתה באופן אוטומטי אישורי הזמנות ואורחים).",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "חיבור אפליקציות של שיחות ועידה",
"connect_calendar_apps": "חיבור אפליקציות של לוחות שנה",
"connect_payment_apps": "חיבור אפליקציות של תשלומים",
"connect_automation_apps": "קישור אפליקציות אוטומציה",
"connect_analytics_apps": "קישור אפליקציות ניתוח נתונים",
"connect_other_apps": "חיבור אפליקציות אחרות",
"current_step_of_total": "שלב {{currentStep}} מתוך {{maxSteps}}",
"add_variable": "להוסיף משתנה",
@ -1240,6 +1250,7 @@
"back_to_signin": "חזרה לדף הכניסה",
"reset_link_sent": "נשלח קישור לאיפוס",
"password_reset_email": "שלחנו לך הודעת דוא\"ל עם הוראות לאיפוס הסיסמה לכתובת {{email}}.",
"password_reset_leading": "אם הודעת הדוא\"ל לא תגיע בקרוב, ודא/י שכתובת הדוא\"ל שהזנת נכונה, בדוק/י אם ההודעה הגיעה לתיקיית דואר הזבל או פנה/י לתמיכה אם הבעיה נמשכת.",
"password_updated": "הסיסמה עודכנה!",
"pending_payment": "המתנה לתשלום",
"confirmation_page_rainbow": "הגן/י על האירוע שלך באמצעות טוקנים או אסימוני NFT במטבע Ethereum, Polygon ועוד.",
@ -1252,12 +1263,53 @@
"seats": "מקומות",
"every_app_published": "כל אפליקציה שמתפרסמת ב-App Store של Cal.com היא בעלת קוד מקור פתוח. כל אפליקציה כזו נבדקת בקפידה על ידי עמיתים. עם זאת, Cal.com, Inc. אינה מעודדת את השימוש באף אפליקציה כזו ואינה מעניקה אישור לאפליקציות כאלה, אלא אם מדובר באפליקציות שפורסמו על ידי Cal.com. אם נתקלת בהתנהגות או בתכנים בלתי הולמים, עליך לדווח על כך.",
"report_app": "דיווח על האפליקציה",
"limit_booking_frequency": "הגבלת תדירות ההזמנות",
"limit_booking_frequency_description": "הגבלת מספר הפעמים שבהן ניתן להזמין את האירוע הזה",
"add_limit": "הוספת הגבלה",
"team_name_required": "שם הצוות נדרש",
"show_attendees": "שיתוף האורחים בפרטי המשתתפים",
"how_additional_inputs_as_variables": "איך ניתן להשתמש בסוגי קלט נוספים כמשתנים",
"format": "פורמט",
"uppercase_for_letters": "שימוש באותיות רישיות עבור כל האותיות",
"replace_whitespaces_underscores": "החלפת רווחים במקפים תחתונים",
"manage_billing": "ניהול החיוב",
"manage_billing_description": "ניהול כל מה שקשור לחיובים",
"billing_freeplan_title": "החבילה הנוכחית שלך היא החבילה החינמית",
"billing_freeplan_description": "אנחנו עובדים טוב יותר בצוותים. הרחב/י את תהליכי העבודה שלך באמצעות סבבים ואירועים שיתופיים וצור/י טפסי ניתוב מתקדמים",
"billing_freeplan_cta": "נסה/י כעת",
"billing_manage_details_title": "צפייה בפרטי החיוב שלך וניהולם",
"billing_manage_details_description": "צפה/י בפרטי החיוב שלך וערוך/ערכי אותם, וכן בטל/י את המינוי שלך.",
"billing_portal": "פורטל החיוב",
"billing_help_title": "צריך/ה משהו נוסף?",
"billing_help_description": "אם דרוש לך סיוע נוסף בענייני חיוב, צוות התמיכה שלנו כאן כדי לעזור.",
"billing_help_cta": "פנייה לתמיכה",
"ignore_special_characters": "התעלמות מתווים מיוחדים בתווית הקלט הנוספת. שימוש באותיות ובספרות בלבד",
"retry": "ניסיון נוסף",
"fetching_calendars_error": "אירעה בעיה בטעינת לוחות השנה שלך. <1>נסה/י שוב</1> או פנה/י למחלקת תמיכת לקוחות.",
"calendar_connection_fail": "החיבור ללוח השנה נכשל",
"booking_confirmation_success": "אישור ההזמנה בוצע בהצלחה",
"booking_confirmation_fail": "אישור ההזמנה נכשל",
"we_wont_show_again": "לא נציג זאת שוב",
"couldnt_update_timezone": "לא הצלחנו לעדכן את אזור הזמן",
"updated_timezone_to": "אזור הזמן עודכן ל-{{formattedCurrentTz}}",
"update_timezone": "עדכון אזור הזמן",
"update_timezone_question": "לעדכן את אזור הזמן?",
"update_timezone_description": "נראה שאזור הזמן המקומי שלך השתנה ל-{{formattedCurrentTz}}. מאוד חשוב שאזור הזמן המוגדר יהיה נכון על מנת למנוע הזמנות בשעות לא רצויות. האם ברצונך לעדכן את אזור הזמן?",
"dont_update": "לא לעדכן",
"require_additional_notes": "דרוש הערות נוספות",
"require_additional_notes_description": "דרישה למילוי הערות נוספות בעת ביצוע הזמנה",
"email_address_action": "שליחת דוא\"ל לכתובת מסוימת",
"after_event_trigger": "לאחר סיום האירוע",
"how_long_after": "כמה זמן לאחר סיום האירוע?",
"no_available_slots": "אין חלונות זמן זמינים",
"time_available": "זמן זמין",
"install_new_calendar_app": "התקנת האפליקציה החדשה של לוחות שנה",
"make_phone_number_required": "הגדרת מספר טלפון כפרט נדרש עבור סוג האירוע הזה",
"dont_have_permission": "אין לך הרשאת גישה אל המשאב הזה.",
"saml_config": "תצורת SAML",
"saml_description": "אפשר/י לחברי הצוות להתחבר באמצעות ספק זהויות",
"saml_config_deleted_successfully": "תצורת SAML נמחקה בהצלחה",
"saml_config_updated_successfully": "תצורת SAML עודכנה בהצלחה",
"saml_configuration": "תצורת SAML",
"delete_saml_configuration": "מחיקת תצורת SAML",
"delete_saml_configuration_confirmation_message": "בטוח שברצונך למחוק את תצורת SAML? חברי הצוות שלך שנכנסים אמצעות SAML לא יוכלו יותר לגשת ל-Cal.com.",
@ -1265,5 +1317,12 @@
"saml_not_configured_yet": "SAML עדיין לא הוגדר",
"saml_configuration_description": "יש להדביק את המטא-נתונים של SAML מספק הזהויות בתיבת הטקסט הבאה כדי לעדכן את תצורת SAML.",
"saml_configuration_placeholder": "יש להדביק את המטא-נתונים של SAML מספק הזהויות כאן",
"saml_email_required": "הזן כתובת דוא\"ל כדי שנוכל למצוא את ספק זהויות SAML שלך"
"saml_email_required": "הזן כתובת דוא\"ל כדי שנוכל למצוא את ספק זהויות SAML שלך",
"saml_sp_title": "פרטי ספק השירות",
"saml_sp_description": "ספק הזהויות (IdP) שלך יבקש את הפרטים הבאים כדי להשלים את ההגדרה של אפליקציית SAML.",
"saml_sp_acs_url": "כתובת URL של ACS",
"saml_sp_entity_id": "מזהה ישות SP",
"saml_sp_acs_url_copied": "כתובת ה-URL של ACS הועתקה!",
"saml_sp_entity_id_copied": "המזהה של ישות SP הועתק!",
"saml_btn_configure": "הגדרה"
}

View File

@ -192,6 +192,7 @@
"connect_metamask": "Metamask csatlakoztatása",
"error_404": "404-es hiba",
"default": "Alapértelmezett",
"24_hour_short": "0-24",
"api_keys": "API kulcsok",
"create_api_key": "API kulcs létrehozása",
"edit_api_key": "API kulcs szerkesztése",

View File

@ -829,6 +829,7 @@
"time_format": "Formato dell'orario",
"12_hour": "12 ore",
"24_hour": "24 ore",
"24_hour_short": "24 ore",
"redirect_success_booking": "Reindirizza su prenotazione ",
"you_are_being_redirected": "Verrai reindirizzato a {{ url }} tra $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",

View File

@ -313,6 +313,7 @@
"past_bookings": "過去の予約はここに表示されます。",
"cancelled_bookings": "キャンセルされた予約はここに表示されます。",
"unconfirmed_bookings": "未確認の予約はここに表示されます。",
"unconfirmed_bookings_tooltip": "未確認の予約",
"on": "上",
"and": "と",
"calendar_shows_busy_between": "カレンダーは、次の間で忙しいことを示します:",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "ダブルブッキングを防ぐために、スケジュールの重複をチェックするカレンダーアプリを追加しましょう",
"no_category_apps_description_conferencing": "会議アプリを追加して、顧客とのビデオ通話を統合しましょう",
"no_category_apps_description_payment": "決済アプリを追加して、顧客との取引を容易にしましょう",
"no_category_apps_description_analytics": "予約ページに分析アプリを追加します",
"no_category_apps_description_automation": "使用する自動化アプリを追加します",
"no_category_apps_description_other": "その他のアプリを追加して、様々なことを実現しましょう",
"installed_app_calendar_description": "ダブルブッキングを防ぐために、スケジュールの重複をチェックするカレンダーアプリを設定しましょう。",
"installed_app_conferencing_description": "会議用にお気に入りのビデオ会議アプリを追加しましょう",
"installed_app_payment_description": "顧客に請求をする際に使用する決済処理サービスを設定しましょう。",
"installed_app_analytics_description": "予約ページでどの分析アプリを使用するかを設定します",
"installed_app_other_description": "他のカテゴリーからインストールしたすべてのアプリ。",
"installed_app_automation_description": "どの自動化アプリを使用するかを設定します",
"analytics": "分析",
"empty_installed_apps_headline": "アプリがインストールされていません",
"empty_installed_apps_description": "アプリを使えば、ワークフローの質を高め、スケジュールライフを大幅に改善することができます。",
"empty_installed_apps_button": "App Storeで探す",
@ -823,9 +829,11 @@
"time_format": "時間の形式",
"12_hour": "12 時間",
"24_hour": "24 時間",
"24_hour_short": "24時間",
"redirect_success_booking": "予約時にリダイレクト",
"you_are_being_redirected": "$t(second, {\"count\": {{seconds}} }) で {{ url }} にリダイレクトします",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "予約成功後、カスタム URL にリダイレクトします",
"duplicate": "複製",
"offer_seats": "座席を提供",
"offer_seats_description": "予約に座席を提供します。これにより、ゲストとオプトイン予約は自動的に無効化されます。",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "会議アプリを接続",
"connect_calendar_apps": "カレンダーアプリを接続",
"connect_payment_apps": "決済アプリを接続",
"connect_automation_apps": "自動化アプリに接続する",
"connect_analytics_apps": "分析アプリに接続する",
"connect_other_apps": "その他のアプリを接続",
"current_step_of_total": "ステップ {{currentStep}}/{{maxSteps}}",
"add_variable": "変数を追加",
@ -1240,6 +1250,7 @@
"back_to_signin": "サインインに戻る",
"reset_link_sent": "リセットリンクが送信されました",
"password_reset_email": "パスワードのリセット方法を記載したメールを {{email}} 宛に送信しました。",
"password_reset_leading": "すぐにメールが届かない場合は、入力したメールアドレスが正しいかや迷惑メールフォルダを確認し、それでも問題が解決しない場合はサポートにご連絡ください。",
"password_updated": "パスワードが更新されました!",
"pending_payment": "保留中の支払い",
"confirmation_page_rainbow": "Ethereum や Polygon などのトークンや NFT を使用してイベントに参加しましょう。",
@ -1252,12 +1263,53 @@
"seats": "座席",
"every_app_published": "Cal.com の App Store で公開されているすべてのアプリはオープンソースであり、ピアレビューを介して入念なテストが実施されています。しかしながら、Cal.com, Inc. はこれらのアプリが Cal.com で公開されていない限りは推奨または認証を行っていません。不適切なコンテンツまたは行為を発見した場合には、ぜひご一報ください。",
"report_app": "アプリを報告",
"limit_booking_frequency": "予約頻度を制限する",
"limit_booking_frequency_description": "このイベントを予約できる回数を制限します",
"add_limit": "上限を追加",
"team_name_required": "チーム名が必要です",
"show_attendees": "ゲスト間で出席者情報を共有",
"how_additional_inputs_as_variables": "変数として追加の入力を使用する方法は?",
"format": "書式",
"uppercase_for_letters": "すべての文字に大文字を使用する",
"replace_whitespaces_underscores": "空白をアンダーバー「 _ 」に置き換える",
"manage_billing": "請求を管理する",
"manage_billing_description": "請求についてのあらゆることを管理する",
"billing_freeplan_title": "あなたは現在、無料プランを利用しています",
"billing_freeplan_description": "チームだとより良い仕事ができます。ラウンドロビンや集合イベントでワークフローを拡張し、高度なルーティングフォームを作成しましょう",
"billing_freeplan_cta": "今すぐ試す",
"billing_manage_details_title": "請求情報の詳細を表示・管理する",
"billing_manage_details_description": "請求情報の詳細の表示や編集、サブスクリプションのキャンセルを行います。",
"billing_portal": "請求ポータル",
"billing_help_title": "他にもお手伝いできることはありませんか?",
"billing_help_description": "請求に関してサポートが必要な場合には、サポートチームがお手伝いさせていただきます。",
"billing_help_cta": "サポートに連絡する",
"ignore_special_characters": "追加の入力ラベルに含まれている特殊文字はすべて無視し、アルファベットと数字のみを使用します",
"retry": "再試行",
"fetching_calendars_error": "カレンダーの取得中に問題が発生しました。<1>もう一度試す</1>か、カスタマーサポートにご連絡ください。",
"calendar_connection_fail": "カレンダーの接続に失敗しました",
"booking_confirmation_success": "予約の確認に成功しました",
"booking_confirmation_fail": "予約の確認に失敗しました",
"we_wont_show_again": "次回から表示しません",
"couldnt_update_timezone": "タイムゾーンを更新できませんでした",
"updated_timezone_to": "タイムゾーンを {{formattedCurrentTz}} に更新しました",
"update_timezone": "タイムゾーンを更新する",
"update_timezone_question": "タイムゾーンを更新しますか?",
"update_timezone_description": "あなたのローカルタイムゾーンが {{formattedCurrentTz}} に変更されたようです。希望しない時間に予約しないよう、タイムゾーンを正しく設定しておくことは非常に重要です。更新しますか?",
"dont_update": "更新しない",
"require_additional_notes": "追加メモが必要です",
"require_additional_notes_description": "予約時には追加メモを記入する必要があります",
"email_address_action": "特定のメールアドレスにメールを送信",
"after_event_trigger": "イベント終了後",
"how_long_after": "イベント終了のどのくらい後に?",
"no_available_slots": "利用可能な時間帯がありません",
"time_available": "利用可能な時間帯",
"install_new_calendar_app": "新しいカレンダーアプリをインストール",
"make_phone_number_required": "イベントの予約に必要な電話番号を作成",
"dont_have_permission": "この資料へのアクセスが許可されていません。",
"saml_config": "SAML 設定",
"saml_description": "チームメンバーが ID プロバイダーを使用してログインすることを許可します",
"saml_config_deleted_successfully": "SAML の構成が正常に削除されました",
"saml_config_updated_successfully": "SAML の構成が正常に更新されました",
"saml_configuration": "SAML の構成",
"delete_saml_configuration": "SAML の構成を削除する",
"delete_saml_configuration_confirmation_message": "SAML の構成を本当に削除してよろしいですかSAML を使用してログインしているチームメンバーは、Cal.com にアクセスすることができなくなります。",
@ -1265,5 +1317,12 @@
"saml_not_configured_yet": "SAML がまだ構成されていません",
"saml_configuration_description": "SAML の構成を更新するには、以下のテキストボックスに ID プロバイダーから提供されている SAML のメタデータを貼り付けてください。",
"saml_configuration_placeholder": "ID プロバイダーから提供されている SAML のメタデータをこちらに貼り付けてください",
"saml_email_required": "SAML ID プロバイダーを見つけるために、メールアドレスを入力してください"
"saml_email_required": "SAML ID プロバイダーを見つけるために、メールアドレスを入力してください",
"saml_sp_title": "サービスプロバイダーの詳細",
"saml_sp_description": "ID プロバイダーIdPは、SAML アプリケーションの構成を完了するために、次の詳細情報を要求します。",
"saml_sp_acs_url": "ACS URL",
"saml_sp_entity_id": "SP エンティティ ID",
"saml_sp_acs_url_copied": "ACS URLをコピーしました",
"saml_sp_entity_id_copied": "SP エンティティ ID をコピーしました!",
"saml_btn_configure": "設定する"
}

View File

@ -829,6 +829,7 @@
"time_format": "시간 형식",
"12_hour": "12시간",
"24_hour": "24시간",
"24_hour_short": "24시간",
"redirect_success_booking": "예약 시 리디렉션",
"you_are_being_redirected": "$t(second, {\"count\": {{seconds}} }) 후에 {{ url }}(으)로 리디렉션됩니다.",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",

View File

@ -313,6 +313,7 @@
"past_bookings": "Uw oude afspraken zullen hier verschijnen.",
"cancelled_bookings": "Uw geannuleerde afspraken zullen hier verschijnen.",
"unconfirmed_bookings": "Uw niet-bevestigde afspraken zullen hier verschijnen.",
"unconfirmed_bookings_tooltip": "Niet-bevestigde boekingen",
"on": "aan",
"and": "en",
"calendar_shows_busy_between": "Uw agenda toont u als bezig tussen",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "Voeg een agenda-app toe om te controleren op conflicten om dubbele boekingen te voorkomen",
"no_category_apps_description_conferencing": "Probeer een conferentieapp toe te voegen om videogesprekken met uw klanten te integreren",
"no_category_apps_description_payment": "Voeg een betaalapp toe om transacties tussen u en uw klanten te vergemakkelijken",
"no_category_apps_description_analytics": "Voeg een analyse-app toe aan uw boekingspagina's",
"no_category_apps_description_automation": "Voeg een automatiseringsapp toe om te gebruiken",
"no_category_apps_description_other": "Voeg een ander type app toe om allerlei soorten dingen te doen",
"installed_app_calendar_description": "Stel de agenda('s) in om te controleren op conflicten om dubbele boekingen te voorkomen.",
"installed_app_conferencing_description": "Voeg uw favoriete apps voor videoconferenties toe voor uw vergaderingen",
"installed_app_payment_description": "Configureer welke betalingsverwerkingsdiensten u wilt gebruiken bij het factureren aan uw klanten.",
"installed_app_analytics_description": "Configureer welke analyse-apps moeten worden gebruikt voor uw boekingspagina's",
"installed_app_other_description": "Alle geïnstalleerde apps uit andere categorieën.",
"installed_app_automation_description": "Configureer welke automatiseringsapps moeten worden gebruikt",
"analytics": "Analyse",
"empty_installed_apps_headline": "Geen apps geïnstalleerd",
"empty_installed_apps_description": "Met apps kunt u uw workflow en uw planning aanzienlijk verbeteren.",
"empty_installed_apps_button": "Ontdek de App Store",
@ -823,9 +829,11 @@
"time_format": "Tijdnotatie",
"12_hour": "12 uur",
"24_hour": "24 uur",
"24_hour_short": "24u",
"redirect_success_booking": "Omleiding bij boeking ",
"you_are_being_redirected": "U wordt omgeleid naar {{ url }} over $t(seconde, {\"count\": {{seconden}} }).",
"external_redirect_url": "https://voorbeeld.com/omleiding-naar-mijn-succespagina",
"redirect_url_description": "Leid om naar een aangepaste URL na een gelukte boeking",
"duplicate": "Dupliceren",
"offer_seats": "Zitplaatsen aanbieden",
"offer_seats_description": "Bied zitplaatsen aan voor boekingen. Hiermee worden gastboekingen en aanmeldingsboekingen automatisch uitgeschakeld.",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "Conferentieapps koppelen",
"connect_calendar_apps": "Agenda-apps koppelen",
"connect_payment_apps": "Betaalapps koppelen",
"connect_automation_apps": "Automatiseringsapps verbinden",
"connect_analytics_apps": "Analyse-apps verbinden",
"connect_other_apps": "Andere apps koppelen",
"current_step_of_total": "Stap {{currentStep}} van {{maxSteps}}",
"add_variable": "Variabele toevoegen",
@ -1240,6 +1250,7 @@
"back_to_signin": "Terug naar aanmelden",
"reset_link_sent": "Link om opnieuw in te stellen is verzonden",
"password_reset_email": "Een e-mail is onderweg naar {{email}} met instructies om uw wachtwoord opnieuw in te stellen.",
"password_reset_leading": "Als u niet spoedig een e-mail ontvangt, controleer dan of het ingevoerde e-mailadres correct is, controleer uw spamfolder of neem contact op met de ondersteuning als het probleem zich blijft voordoen.",
"password_updated": "Wachtwoord bijgewerkt!",
"pending_payment": "In afwachting van betaling",
"confirmation_page_rainbow": "Scherm uw gebeurtenis af met tokens of NFT's op Ethereum, Polygon en meer.",
@ -1252,12 +1263,53 @@
"seats": "plaatsen",
"every_app_published": "Elke app die in de App Store van Cal.com wordt gepubliceerd is open source en grondig getest via beoordelingen van collega's. Desondanks onderschrijft of certificeert Cal.com, Inc. deze apps niet, tenzij ze zijn gepubliceerd door Cal.com. Meld het als u ongepaste inhoud of gedrag tegenkomt.",
"report_app": "App melden",
"limit_booking_frequency": "Boekingsfrequentie beperken",
"limit_booking_frequency_description": "Beperk hoe vaak deze gebeurtenis kan worden geboekt",
"add_limit": "Beperking toevoegen",
"team_name_required": "Teamnaam verplicht",
"show_attendees": "Deelnemersinformatie delen tussen gasten",
"how_additional_inputs_as_variables": "Extra invoeren als variabelen gebruiken",
"format": "Formatteren",
"uppercase_for_letters": "Gebruik hoofdletters voor alle letters",
"replace_whitespaces_underscores": "Vervang spaties door onderstrepingstekens",
"manage_billing": "Facturatie beheren",
"manage_billing_description": "Beheren van alles wat met facturatie te maken heeft",
"billing_freeplan_title": "U heeft momenteel het GRATIS abonnement",
"billing_freeplan_description": "We werken beter in teams. Breid uw werkstromen uit met Round Robin en collectieve gebeurtenissen en maak geavanceerde routeringsformulieren",
"billing_freeplan_cta": "Nu proberen",
"billing_manage_details_title": "Uw factureringsgegevens bekijken en beheren",
"billing_manage_details_description": "Bekijk en bewerk uw factureringsgegevens of zeg uw abonnement op.",
"billing_portal": "Facturatieportaal",
"billing_help_title": "Nog iets nodig?",
"billing_help_description": "Als u verder nog hulp nodig heeft bij de facturering, is ons ondersteuningsteam er om u te helpen.",
"billing_help_cta": "Contact opnemen met de ondersteuning",
"ignore_special_characters": "Negeer speciale tekens in uw label Extra invoer. Gebruik alleen letters en cijfers",
"retry": "Opnieuw proberen",
"fetching_calendars_error": "Er is een probleem opgetreden bij het ophalen van uw agenda's. <1>Probeer het opnieuw</1> of neem contact op met de klantenservice.",
"calendar_connection_fail": "Agendaverbinding mislukt",
"booking_confirmation_success": "Boekingsbevestiging gelukt",
"booking_confirmation_fail": "Boekingsbevestiging mislukt",
"we_wont_show_again": "We zullen dit niet opnieuw weergeven",
"couldnt_update_timezone": "We konden de tijdzone niet bijwerken",
"updated_timezone_to": "Tijdzone bijgewerkt naar {{formattedCurrentTz}}",
"update_timezone": "Tijdzone bijwerken",
"update_timezone_question": "Tijdzone bijwerken?",
"update_timezone_description": "Het lijkt erop dat uw lokale tijdzone is gewijzigd in {{formattedCurrentTz}}. Het is erg belangrijk dat de juiste tijdzone is ingesteld om boekingen op ongewenste tijden te voorkomen. Wilt u het bijwerken?",
"dont_update": "Niet bijwerken",
"require_additional_notes": "Aanvullende opmerkingen vereisen",
"require_additional_notes_description": "Vereisen dat extra opmerkingen worden ingevuld tijdens het boeken",
"email_address_action": "e-mail versturen naar een specifiek e-mailadres",
"after_event_trigger": "na afloop van gebeurtenis",
"how_long_after": "Hoelang na afloop van de gebeurtenis?",
"no_available_slots": "Geen beschikbare tijdvakken",
"time_available": "Tijd beschikbaar",
"install_new_calendar_app": "Nieuwe agenda-app installeren",
"make_phone_number_required": "Maak een telefoonnummer verplicht voor het boeken van een gebeurtenis",
"dont_have_permission": "U hewdt geen machtingen voor toegang tot dit hulpmiddel.",
"saml_config": "SAML-configuratie",
"saml_description": "Teamleden toestaan in te loggen met behulp van een identiteitsprovider",
"saml_config_deleted_successfully": "SAML-configuratie verwijderd",
"saml_config_updated_successfully": "SAML-configuratie bijgewerkt",
"saml_configuration": "SAML-configuratie",
"delete_saml_configuration": "SAML-configuratie verwijderen",
"delete_saml_configuration_confirmation_message": "Weet u zeker dat u de SAML-configuratie wilt verwijderen? Uw teamleden die SAML-aanmelding gebruiken hebben niet langer toegang tot Cal.com.",
@ -1265,5 +1317,12 @@
"saml_not_configured_yet": "SAML nog niet geconfigureerd",
"saml_configuration_description": "Plak de SAML-metagegevens van uw identiteitsprovider in het tekstvak hieronder om uw SAML-configuratie bij te werken.",
"saml_configuration_placeholder": "Plak de SAML-metagegevens van uw identiteitsprovider hier",
"saml_email_required": "Voer een e-mailadres in zodat we uw SAML-identiteitsprovider kunnen vinden"
"saml_email_required": "Voer een e-mailadres in zodat we uw SAML-identiteitsprovider kunnen vinden",
"saml_sp_title": "Serviceprovidergegevens",
"saml_sp_description": "Uw identiteitsprovider (IdP) zal u om de volgende gegevens vragen om de configuratie van de SAML-applicatie te voltooien.",
"saml_sp_acs_url": "ACS-URL",
"saml_sp_entity_id": "SP-entiteits-ID",
"saml_sp_acs_url_copied": "ACS-URL gekopieerd!",
"saml_sp_entity_id_copied": "SP-entiteits-ID gekopieerd!",
"saml_btn_configure": "Configureren"
}

View File

@ -313,6 +313,7 @@
"past_bookings": "Twoje zarchiwizowane rezerwacje pojawią się tutaj.",
"cancelled_bookings": "Twoje anulowane rezerwacje pojawią się tutaj.",
"unconfirmed_bookings": "Twoje niepotwierdzone rezerwacje pojawią się tutaj.",
"unconfirmed_bookings_tooltip": "Niepotwierdzone rezerwacje",
"on": "na",
"and": "oraz",
"calendar_shows_busy_between": "Twój kalendarz pokazuje Cię jako zajęty między",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "Dodaj aplikację kalendarza, aby wykrywać konflikty i unikać podwójnych rezerwacji",
"no_category_apps_description_conferencing": "Dodaj aplikację konferencyjną, aby uzyskać możliwość nawiązywania połączeń wideo z klientami.",
"no_category_apps_description_payment": "Dodaj aplikację płatniczą, aby ułatwić transakcje z klientami.",
"no_category_apps_description_analytics": "Dodaj aplikację analityczną do stron rezerwacji",
"no_category_apps_description_automation": "Dodaj aplikację automatyzującą, która ma być używana",
"no_category_apps_description_other": "Dodaj dowolny typ aplikacji, aby uzyskać dostęp do różnych innych funkcji",
"installed_app_calendar_description": "Ustaw kalendarze, aby wykrywać konflikty i unikać podwójnych rezerwacji.",
"installed_app_conferencing_description": "Dodaj ulubione aplikacje do wideokonferencji, aby umożliwić korzystanie z nich podczas spotkań",
"installed_app_payment_description": "Skonfiguruj usługi przetwarzania płatności, których chcesz używać do pobierania opłat od klientów.",
"installed_app_analytics_description": "Skonfiguruj, które aplikacje analityczne mają być używane na stronach rezerwacji",
"installed_app_other_description": "Wszystkie zainstalowane aplikacje z innych kategorii.",
"installed_app_automation_description": "Skonfiguruj, które aplikacje automatyzujące mają być używane",
"analytics": "Analityka",
"empty_installed_apps_headline": "Brak zainstalowanych aplikacji",
"empty_installed_apps_description": "Aplikacje umożliwiają znaczne usprawnienie przebiegu pracy i uproszczenie planowania.",
"empty_installed_apps_button": "Przeglądaj sklep App Store",
@ -823,9 +829,11 @@
"time_format": "Format czasu",
"12_hour": "12 godzin",
"24_hour": "24 godzin",
"24_hour_short": "24 godz.",
"redirect_success_booking": "Przekieruj przy rezerwacji ",
"you_are_being_redirected": "Zostałeś przekierowany do {{ url }} w $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/przekieruj-do-moja-strona",
"redirect_url_description": "Przekieruj na niestandardowy adres URL po udanej rezerwacji",
"duplicate": "Duplikat",
"offer_seats": "Zaproponuj miejsca",
"offer_seats_description": "Zaoferuj miejsca do zarezerwowania. To automatycznie wyłącza rezerwacje gości i rezerwacje wstępne.",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "Połącz aplikacje konferencyjne",
"connect_calendar_apps": "Połącz aplikacje kalendarza",
"connect_payment_apps": "Połącz aplikacje płatnicze",
"connect_automation_apps": "Połącz aplikacje automatyzujące",
"connect_analytics_apps": "Połącz aplikacje analityczne",
"connect_other_apps": "Połącz inne aplikacje",
"current_step_of_total": "Krok {{currentStep}} z {{maxSteps}}",
"add_variable": "Dodaj zmienną",
@ -1240,6 +1250,7 @@
"back_to_signin": "Powrót do logowania",
"reset_link_sent": "Wysłano link do resetowania",
"password_reset_email": "Wiadomość e-mail z instrukcjami resetowania hasła została wysłana na adres {{email}}.",
"password_reset_leading": "Jeśli wkrótce nie otrzymasz wiadomości e-mail, sprawdź, czy wprowadzony adres e-mail jest poprawny, sprawdź folder ze spamem lub skontaktuj się z pomocą, jeśli problem będzie się powtarzał.",
"password_updated": "Hasło zostało zaktualizowane!",
"pending_payment": "Płatność w toku",
"confirmation_page_rainbow": "Udostępnij Twoje wydarzenie tylko posiadaczom tokenów lub NFT w blockchainach Ethereum, Polygon i innych.",
@ -1252,11 +1263,51 @@
"seats": "miejsca",
"every_app_published": "Każda aplikacja opublikowana w sklepie App Store serwisu Cal.com jest otwartym oprogramowaniem i jest dokładnie testowana przez innych użytkowników. Niemniej jednak, Cal.com, Inc. nie odpowiada za aplikacje ani nie certyfikuje ich, chyba że są one publikowane przez Cal.com. Jeśli natrafisz na nieodpowiednie treści lub zachowanie, zgłoś je.",
"report_app": "Zgłoś aplikację",
"limit_booking_frequency": "Ogranicz częstotliwość rezerwacji",
"limit_booking_frequency_description": "Ogranicz liczbę rezerwacji tego wydarzenia",
"add_limit": "Dodaj limit",
"team_name_required": "Wymagana nazwa zespołu",
"show_attendees": "Udostępniaj gościom informacje o uczestnikach",
"how_additional_inputs_as_variables": "Jak wykorzystać dodatkowe dane wejściowe jako zmienne?",
"format": "Formatowanie",
"uppercase_for_letters": "Użyj wielkich liter w przypadku wszystkich liter",
"replace_whitespaces_underscores": "Zastąp spacje podkreśleniami",
"manage_billing": "Zarządzaj płatnościami",
"manage_billing_description": "Zarządzaj wszystkimi kwestiami dotyczącymi płatności",
"billing_freeplan_title": "Obecnie korzystasz z planu BEZPŁATNEGO",
"billing_freeplan_description": "Lepiej pracujemy zespołowo. Rozbuduj przepływy pracy o działania okrężne i wydarzenia zbiorowe, a także twórz zaawansowane formularze przekierowujące",
"billing_freeplan_cta": "Spróbuj teraz",
"billing_manage_details_title": "Wyświetl swoje dane rozliczeniowe i zarządzaj nimi",
"billing_manage_details_description": "Wyświetl swoje dane rozliczeniowe i edytuj je, jak również anuluj subskrypcję.",
"billing_portal": "Portal rozliczeniowy",
"billing_help_title": "Potrzebujesz czegoś innego?",
"billing_help_description": "Jeśli potrzebujesz dodatkowej pomocy w rozliczaniu, nasz zespół pomocy technicznej chętnie jej udzieli.",
"billing_help_cta": "Skontaktuj się z pomocą techniczną",
"ignore_special_characters": "Ignoruj znaki specjalne w dodatkowej etykiecie wejściowej. Używaj tylko liter i cyfr",
"retry": "Spróbuj ponownie",
"fetching_calendars_error": "Podczas pobierania kalendarzy wystąpił problem. <1>Spróbuj ponownie</1> lub skontaktuj się z pomocą techniczną.",
"calendar_connection_fail": "Połączenie z kalendarzem nie powiodło się",
"booking_confirmation_success": "Potwierdzenie rezerwacji powiodło się",
"booking_confirmation_fail": "Potwierdzenie rezerwacji nie powiodło się",
"we_wont_show_again": "Nie będziemy tego ponownie pokazywać",
"couldnt_update_timezone": "Nie udało się zaktualizować strefy czasowej",
"updated_timezone_to": "Zmieniono strefę czasową na {{formattedCurrentTz}}",
"update_timezone": "Zmień strefę czasową",
"update_timezone_question": "Zmienić strefę czasową?",
"update_timezone_description": "Wygląda na to, że Twoja lokalna strefa czasowa zmieniła się na {{formattedCurrentTz}}. Ustawienie prawidłowej strefy czasowej jest bardzo ważne, aby zapobiegać rezerwacjom o nieprawidłowych godzinach. Czy chcesz ją zmienić?",
"dont_update": "Nie zmieniaj",
"require_additional_notes": "Wymagaj dodatkowych uwag",
"require_additional_notes_description": "Wymagaj wypełnienia dodatkowych uwag przy rezerwacji",
"email_address_action": "wyślij wiadomość e-mail na określony adres e-mail",
"after_event_trigger": "po zakończeniu wydarzenia",
"how_long_after": "Jak długo po zakończeniu wydarzenia?",
"no_available_slots": "Brak dostępnych miejsc",
"time_available": "Dostępne godziny",
"install_new_calendar_app": "Zainstaluj nową aplikację kalendarza",
"make_phone_number_required": "Ustaw wymóg podania numeru telefonu w celu rezerwacji wydarzenia",
"dont_have_permission": "Nie masz uprawnień dostępu do tego zasobu.",
"saml_config": "Konfiguracja SAML",
"saml_description": "Zezwalaj członkom zespołu na logowanie za pomocą dostawcy tożsamości",
"saml_config_deleted_successfully": "Konfiguracja SAML usunięta pomyślnie",
"saml_config_updated_successfully": "Konfiguracja SAML została zaktualizowana",
"saml_configuration": "Konfiguracja SAML",
@ -1266,5 +1317,12 @@
"saml_not_configured_yet": "SAML nie jest jeszcze skonfigurowany",
"saml_configuration_description": "Wklej metadane SAML od dostawcy tożsamości w polu tekstowym poniżej, aby zaktualizować konfigurację SAML.",
"saml_configuration_placeholder": "Wklej tutaj metadane SAML od dostawcy tożsamości",
"saml_email_required": "Wprowadź e-mail, abyśmy mogli znaleźć dostawcę tożsamości SAML"
"saml_email_required": "Wprowadź e-mail, abyśmy mogli znaleźć dostawcę tożsamości SAML",
"saml_sp_title": "Szczegóły dostawcy usług",
"saml_sp_description": "Twój dostawca tożsamości poprosi Cię o podanie następujących danych w celu dokończenia konfiguracji aplikacji SAML.",
"saml_sp_acs_url": "Adres URL usług kontroli dostępu",
"saml_sp_entity_id": "Identyfikator SP obiektu",
"saml_sp_acs_url_copied": "Skopiowano adres URL usług kontroli dostępu!",
"saml_sp_entity_id_copied": "Identyfikator obiektu SP skopiowany!",
"saml_btn_configure": "Konfiguruj"
}

View File

@ -313,6 +313,7 @@
"past_bookings": "As suas reservas anteriores aparecerão aqui.",
"cancelled_bookings": "As suas reservas canceladas aparecerão aqui.",
"unconfirmed_bookings": "Suas reservas não confirmadas aparecerão aqui.",
"unconfirmed_bookings_tooltip": "Reservas não confirmadas",
"on": "em",
"and": "e",
"calendar_shows_busy_between": "O seu calendário mostra que você está ocupado entre",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "Adicione um aplicativo de calendário para verificar se há conflitos para evitar agendamentos duplos",
"no_category_apps_description_conferencing": "Tente adicionar um aplicativo de conferência para integrar chamadas de vídeo com seus clientes",
"no_category_apps_description_payment": "Adicione um aplicativo de pagamento para facilitar a transação entre você e seus clientes",
"no_category_apps_description_analytics": "Adicione um aplicativo de análise às suas páginas de reservas",
"no_category_apps_description_automation": "Adicione um aplicativo de automação para usar",
"no_category_apps_description_other": "Adicione qualquer outro tipo de aplicativo para fazer todos os tipos de coisas",
"installed_app_calendar_description": "Defina o(s) calendário(s) para verificar se há conflitos e evitar reservas duplas.",
"installed_app_conferencing_description": "Adicione seus aplicativos favoritos de videoconferência para suas reuniões",
"installed_app_payment_description": "Configure quais serviços de processamento de pagamento serão usados no carregamento de seus clientes.",
"installed_app_analytics_description": "Configure quais aplicativos de análise serão usados nas suas páginas de reservas",
"installed_app_other_description": "Todos os seus aplicativos instalados de outras categorias.",
"installed_app_automation_description": "Configure quais aplicativos de automação serão usados",
"analytics": "Análise",
"empty_installed_apps_headline": "Nenhum app instalado",
"empty_installed_apps_description": "Os aplicativos permitem que você melhore o fluxo de trabalho e melhore significativamente sua vida de agendamento.",
"empty_installed_apps_button": "Explore a App Store",
@ -823,9 +829,11 @@
"time_format": "Formato de hora",
"12_hour": "12 horas",
"24_hour": "24 horas",
"24_hour_short": "24h",
"redirect_success_booking": "Redirecionar após a reserva ",
"you_are_being_redirected": "Você está sendo redirecionado para {{ url }} em $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "Redirecione para uma URL personalizada após realizar uma reserva",
"duplicate": "Duplicar",
"offer_seats": "Oferecer assentos",
"offer_seats_description": "Oferecer assentos para reserva. Isto desativa automaticamente reservas de convidados e opt-in.",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "Conectar aplicativos de conferência",
"connect_calendar_apps": "Conectar aplicativos de calendário",
"connect_payment_apps": "Conectar aplicativos de pagamento",
"connect_automation_apps": "Conecte aplicativos de automação",
"connect_analytics_apps": "Conecte aplicativos de análise",
"connect_other_apps": "Conectar outros aplicativos",
"current_step_of_total": "Passo {{currentStep}} de {{maxSteps}}",
"add_variable": "Adicionar variável",
@ -1253,11 +1263,51 @@
"seats": "assentos",
"every_app_published": "Todos os aplicativos publicados na App Store da Cal.com são de código aberto e testados minuciosamente por meio de avaliações por pares. No entanto, a Cal.com, Inc. não endossa ou certifica esses aplicativos a não ser que sejam publicados pela Cal.com. Se você encontrar conteúdo ou comportamento inadequado, denuncie.",
"report_app": "Denunciar aplicativo",
"limit_booking_frequency": "Limitar frequência de reserva",
"limit_booking_frequency_description": "Limite quantas vezes este evento pode ser reservado",
"add_limit": "Adicionar limite",
"team_name_required": "Nome da equipe obrigatório",
"show_attendees": "Compartilhe informações do participante entre convidados",
"how_additional_inputs_as_variables": "Como usar Dados Adicionais como variáveis",
"format": "Formato",
"uppercase_for_letters": "Use letras maiúsculas para todas as letras",
"replace_whitespaces_underscores": "Substituir espaços em branco com sublinhados",
"manage_billing": "Gerenciar faturamento",
"manage_billing_description": "Gerenciar todo o faturamento",
"billing_freeplan_title": "No momento, você está no plano GRÁTIS",
"billing_freeplan_description": "Trabalhamos melhor em equipe. Amplie seus fluxos de trabalho com eventos circulares e coletivos e faça formulários avançados de roteamento",
"billing_freeplan_cta": "Tentar agora",
"billing_manage_details_title": "Visualizar e gerenciar os seus detalhes de faturamento",
"billing_manage_details_description": "Ver e editar os seus dados de faturamento, bem como cancelar a sua assinatura.",
"billing_portal": "Portal de Cobrança",
"billing_help_title": "Precisa de algo mais?",
"billing_help_description": "Se precisar de mais ajuda com o faturamento, o nosso time de suporte está aqui para ajudar.",
"billing_help_cta": "Contatar o suporte",
"ignore_special_characters": "Ignorar caracteres especiais no seu rótulo adicional de entrada. Use apenas letras e números",
"retry": "Repetir",
"fetching_calendars_error": "Houve um problema ao buscar suas agendas. <1>Tente novamente</1> ou entre em contato com o suporte ao cliente.",
"calendar_connection_fail": "Falha na conexão com a agenda",
"booking_confirmation_success": "Reserva confirmada com sucesso",
"booking_confirmation_fail": "Falhar ao confirmar reserva",
"we_wont_show_again": "Não exibiremos isso novamente",
"couldnt_update_timezone": "Não foi possível atualizar o fuso horário",
"updated_timezone_to": "Fuso horário atualizado para {{formattedCurrentTz}}",
"update_timezone": "Atualizar fuso horário",
"update_timezone_question": "Atualizar fuso horário?",
"update_timezone_description": "Parece que seu fuso horário local mudou para {{formattedCurrentTz}}. É muito importante ter o fuso horário correto para evitar reservas em horários indesejados. Você deseja atualizá-lo?",
"dont_update": "Não atualizar",
"require_additional_notes": "Solicitar notas adicionais",
"require_additional_notes_description": "Solicitar que as notas adicionais sejam preenchidas no momento da reserva",
"email_address_action": "enviar e-mail para um endereço de e-mail específico",
"after_event_trigger": "após o término do evento",
"how_long_after": "Quanto tempo após o término do evento?",
"no_available_slots": "Não há espaços disponíveis",
"time_available": "Tempo disponível",
"install_new_calendar_app": "Instalar novo aplicativo de calendário",
"make_phone_number_required": "Tornar o número de telefone necessário para o evento de reserva",
"dont_have_permission": "Você não tem permissão para acessar este recurso.",
"saml_config": "Configuração SAML",
"saml_description": "Permitir que os membros da equipe façam login usando um Provedor de Identidade",
"saml_config_deleted_successfully": "Configuração do SAML removida com sucesso",
"saml_config_updated_successfully": "Configuração do SAML atualizada com sucesso",
"saml_configuration": "Configuração do SAML",
@ -1267,5 +1317,12 @@
"saml_not_configured_yet": "O SAML ainda não está configurado",
"saml_configuration_description": "Por favor cole o SAML metadata obtido de seu Provedor de Identidade na caixa de texto a seguir para atualizar sua configuração do SAML.",
"saml_configuration_placeholder": "Por favor cole o SAML metadata do seu Provedor de Identidade aqui",
"saml_email_required": "Por favor insira um endereço de e-mail para que possamos encontrar o seu Provedor de Identidade"
"saml_email_required": "Por favor insira um endereço de e-mail para que possamos encontrar o seu Provedor de Identidade",
"saml_sp_title": "Detalhes do Provedor de Serviços",
"saml_sp_description": "Seu Provedor de Identidade (IdP) solicitará os seguintes detalhes para concluir a configuração da aplicação SAML.",
"saml_sp_acs_url": "URL do ACS",
"saml_sp_entity_id": "ID da Entidade SP",
"saml_sp_acs_url_copied": "URL do ACS copiada!",
"saml_sp_entity_id_copied": "ID da Entidade SP copiada!",
"saml_btn_configure": "Configurar"
}

View File

@ -313,6 +313,7 @@
"past_bookings": "As suas reservas anteriores aparecerão aqui.",
"cancelled_bookings": "As suas reservas canceladas aparecerão aqui.",
"unconfirmed_bookings": "As suas marcações não confirmadas irão aparecer aqui.",
"unconfirmed_bookings_tooltip": "Reservas não confirmadas",
"on": "em",
"and": "e",
"calendar_shows_busy_between": "O seu calendário mostra se está ocupado entre",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "Adicione uma aplicação de calendário para verificar se existem conflitos e assim evitar sobreposição de marcações",
"no_category_apps_description_conferencing": "Experimente adicionar uma aplicação de conferência para integrar chamadas de vídeo com os seus clientes",
"no_category_apps_description_payment": "Adicione uma aplicação de pagamentos para facilitar a transação entre si e os seus clientes",
"no_category_apps_description_analytics": "Adicionar uma aplicação de análise para as suas páginas de reservas",
"no_category_apps_description_automation": "Adicionar uma aplicação de automatização a utilizar",
"no_category_apps_description_other": "Adicione qualquer outro tipo de aplicações para fazer todos os tipos de coisas",
"installed_app_calendar_description": "Defina o(s) calendário(s) para verificar se existem conflitos e assim evitar marcações sobrepostas.",
"installed_app_conferencing_description": "Adicione as aplicações de videoconferência que prefere para as suas reuniões",
"installed_app_payment_description": "Configure os serviços de processamento de pagamentos que serão utilizados nas cobranças aos seus clientes.",
"installed_app_analytics_description": "Configurar quais as aplicações de análise a serem utilizadas nas suas páginas de reservas",
"installed_app_other_description": "Todas as aplicações instaladas de outras categorias.",
"installed_app_automation_description": "Configurar quais as aplicações de automatização a utilizar",
"analytics": "Análise",
"empty_installed_apps_headline": "Nenhuma aplicação instalada",
"empty_installed_apps_description": "As aplicações permitem-lhe melhorar o seu fluxo de trabalho e os seus agendamentos, significativamente.",
"empty_installed_apps_button": "Explore a aplicação",
@ -823,9 +829,11 @@
"time_format": "Formato da hora",
"12_hour": "12 horas",
"24_hour": "24 horas",
"24_hour_short": "24h",
"redirect_success_booking": "Redireccionar ao reservar ",
"you_are_being_redirected": "Está a ser redireccionado para {{ url }} em $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://exemplo.com/redireccionar-para-pagina-de-sucesso",
"redirect_url_description": "Redirecionar para um endereço personalizado após uma reserva ser concluída com sucesso",
"duplicate": "Duplicar",
"offer_seats": "Oferecer lugares",
"offer_seats_description": "Oferecer lugares para reservas. Isto desativa automaticamente os convidados e confirmações nas reservas.",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "Associe aplicações de conferência",
"connect_calendar_apps": "Associe aplicações de calendário",
"connect_payment_apps": "Associe aplicações de pagamento",
"connect_automation_apps": "Associar aplicações de automatização",
"connect_analytics_apps": "Associar aplicações de análise",
"connect_other_apps": "Associe outras aplicações",
"current_step_of_total": "Passo {{currentStep}} de {{maxSteps}}",
"add_variable": "Adicionar variável",
@ -1240,6 +1250,7 @@
"back_to_signin": "Voltar para o início de sessão",
"reset_link_sent": "Ligação de reposição enviada",
"password_reset_email": "Um e-mail está a caminho de {{email}} com instruções para redefinir a sua palavra-passe.",
"password_reset_leading": "Se não receber um e-mail em breve, confirme se o endereço de e-mail especificado está correto, verifique a sua pasta de SPAM ou contacte o apoio se o problema persistir.",
"password_updated": "Palavra-passe atualizada!",
"pending_payment": "Pagamento pendente",
"confirmation_page_rainbow": "Controle o acesso ao seu evento com tokens ou NFT na Ethereum, Polygon e muito mais.",
@ -1252,11 +1263,51 @@
"seats": "lugares",
"every_app_published": "Todas as aplicações publicadas na loja de aplicações Cal.com são de código aberto e minuciosamente testadas através da avaliação por pares. No entanto, Cal.com, Inc. não apoia ou certifica estas aplicações a não ser que sejam publicadas pela Cal.com. Se encontrar conteúdos ou comportamentos inadequados, por favor, reporte a situação.",
"report_app": "Reportar aplicação",
"limit_booking_frequency": "Limitar a frequência das reservas",
"limit_booking_frequency_description": "Limitar o número de vezes que este evento pode ser reservado",
"add_limit": "Adicionar limite",
"team_name_required": "É necessário um nome para a equipa",
"show_attendees": "Partilhar informações dos participantes entre os convidados",
"how_additional_inputs_as_variables": "Como utilizar as Entradas adicionais como Variáveis",
"format": "Formato",
"uppercase_for_letters": "Utilize letras maiúsculas para todas as letras",
"replace_whitespaces_underscores": "Substituir espaços em branco com carateres de sublinhado",
"manage_billing": "Gerir faturação",
"manage_billing_description": "Gerir tudo o que esteja relacionado com a faturação",
"billing_freeplan_title": "Atualmente está a utilizar o plano GRATUITO",
"billing_freeplan_description": "Trabalhamos melhor em equipa. Estenda os seus fluxos de trabalho com eventos em grupo e com uma distribuição equilibrada, e faça formulários avançados de encaminhamento",
"billing_freeplan_cta": "Experimentar agora",
"billing_manage_details_title": "Ver e gerir os seus detalhes de faturação",
"billing_manage_details_description": "Ver e editar os seus dados de faturação, bem como cancelar a sua assinatura.",
"billing_portal": "Portal de faturação",
"billing_help_title": "Precisa de outra coisa?",
"billing_help_description": "Se precisar de mais ajuda com a faturação, a nossa equipa de apoio está aqui para ajudar.",
"billing_help_cta": "Contactar o apoio",
"ignore_special_characters": "Ignorar caracteres especiais na sua etiqueta de Campo adicional. Utilizar apenas letras e números",
"retry": "Repetir",
"fetching_calendars_error": "Ocorreu um problema ao obter os seus calendários. Por favor, <1>tente novamente</1> ou contacte o apoio ao cliente.",
"calendar_connection_fail": "A ligação ao calendário falhou",
"booking_confirmation_success": "Confirmação da reserva bem-sucedida",
"booking_confirmation_fail": "A confirmação da reserva falhou",
"we_wont_show_again": "Não vamos mostrar isto novamente",
"couldnt_update_timezone": "Não foi possível atualizar o fuso horário",
"updated_timezone_to": "Fuso horário atualizado para {{formattedCurrentTz}}",
"update_timezone": "Atualizar fuso horário",
"update_timezone_question": "Atualizar fuso horário?",
"update_timezone_description": "Parece que o seu fuso horário local mudou para {{formattedCurrentTz}}. É muito importante ter o fuso horário correto para evitar reservas em horários indesejados. Gostaria de atualizar o seu fuso horário?",
"dont_update": "Não atualizar",
"require_additional_notes": "Requerer notas adicionais",
"require_additional_notes_description": "Requerer que as notas adicionais sejam preenchidas na reserva",
"email_address_action": "enviar e-mail para um endereço de e-mail específico",
"after_event_trigger": "depois do fim do evento",
"how_long_after": "Quanto tempo após o fim do evento?",
"no_available_slots": "Sem vagas disponíveis",
"time_available": "Tempo disponível",
"install_new_calendar_app": "Instalar a nova aplicação de calendário",
"make_phone_number_required": "Tornar o número de telefone obrigatório para a reserva de um evento",
"dont_have_permission": "Não tem permissão para aceder a este recurso.",
"saml_config": "Configuração SAML",
"saml_description": "Permitir que os membros da equipa iniciem sessão com recurso a um Fornecedor de identidade",
"saml_config_deleted_successfully": "Configuração de SAML eliminada com sucesso",
"saml_config_updated_successfully": "Configuração de SAML atualizada com sucesso",
"saml_configuration": "Configuração de SAML",
@ -1266,5 +1317,12 @@
"saml_not_configured_yet": "SAML ainda não configurado",
"saml_configuration_description": "Cole os metadados de SAML do seu fornecedor de identidade na caixa de texto abaixo para atualizar a sua configuração de SAML.",
"saml_configuration_placeholder": "Cole aqui os metadados de SAML do seu fornecedor de identidade",
"saml_email_required": "Por favor insira um email para que seja possível encontrar o seu fornecedor de identidade de SAML"
"saml_email_required": "Por favor insira um email para que seja possível encontrar o seu fornecedor de identidade de SAML",
"saml_sp_title": "Detalhes do Fornecedor do serviço",
"saml_sp_description": "O seu Fornecedor de identidade (IdP) irá solicitar os seguintes detalhes para concluir a configuração da aplicação SAML.",
"saml_sp_acs_url": "Endereço do ACS",
"saml_sp_entity_id": "ID da entidade do SP",
"saml_sp_acs_url_copied": "Endereço do ACS copiado!",
"saml_sp_entity_id_copied": "ID da entidade do SP copiada!",
"saml_btn_configure": "Configurar"
}

View File

@ -67,7 +67,7 @@
"event_still_awaiting_approval": "Un eveniment încă așteaptă aprobarea dvs.",
"booking_submitted_subject": "Rezervare transmisă: {{eventType}} cu {{name}} în {{date}}",
"your_meeting_has_been_booked": "Întâlnirea dvs. a fost programată",
"event_type_has_been_rescheduled_on_time_date": "{{eventType}} cu {{name}} a fost reprogramat la {{time}} ({{timeZone}}) pe {{date}}.",
"event_type_has_been_rescheduled_on_time_date": "{{eventType}} cu {{name}} a fost reprogramat pe {{date}}.",
"event_has_been_rescheduled": "Evenimentul dvs. a fost reprogramat.",
"request_reschedule_title_attendee": "Solicitați reprogramarea rezervării",
"request_reschedule_subtitle": "{{organizer}} a anulat rezervarea și v-a cerut să alegeți o altă dată.",
@ -210,7 +210,7 @@
"sign_in": "Autentifică-te",
"go_back_login": "Mergi înapoi la pagina de autentificare",
"error_during_login": "A apărut o eroare la autentificare. Mergi înapoi la ecranul de autentificare și încearcă din nou.",
"request_password_reset": "Solicită resetarea parolei",
"request_password_reset": "Trimitere e-mail de resetare",
"forgot_password": "Ați uitat parola?",
"forgot": "Ai uitat?",
"done": "Adoptat",
@ -219,7 +219,7 @@
"check_email_reset_password": "Verificați adresa de e-mail. V-am trimis un link pentru resetarea parolei.",
"finish": "Finalizeaza",
"few_sentences_about_yourself": "Câteva propoziții despre tine. Aceasta va apărea pe pagina de url personală.",
"nearly_there": "Mai ai un pic",
"nearly_there": "Încă puțin!",
"nearly_there_instructions": "În ultimul rând, o scurtă descriere despre tine și o fotografie te ajută să obții rezervări și să spui 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",
@ -233,7 +233,7 @@
"welcome_back": "Bine ați revenit",
"welcome_to_calcom": "Bine ați venit la Cal.com",
"welcome_instructions": "Spune-ne ce să te sune și spune-ne în ce fus orar. Vei putea edita mai târziu.",
"connect_caldav": "Conectează-te la serverul CalDav",
"connect_caldav": "Conectați-vă la serverul CalDav (Beta)",
"credentials_stored_and_encrypted": "Acreditările dvs. vor fi stocate și criptate.",
"connect": "Conectează-te",
"try_for_free": "Încearcă gratuit",
@ -265,8 +265,8 @@
"enter_new_password": "Introduceți noua parolă pe care ați dori pentru contul dvs.",
"reset_password": "Resetează parola",
"change_your_password": "Schimbă-ți parola",
"show_password": "Arată parola",
"hide_password": "Ascunde parola",
"show_password": "Afișare parolă",
"hide_password": "Ascundere parolă",
"try_again": "Încercați din nou",
"request_is_expired": "Acea solicitare a expirat.",
"reset_instructions": "Introduceți adresa de e-mail asociată contului dvs. și vă vom trimite un link pentru a vă reseta parola.",
@ -303,7 +303,7 @@
"no_availability": "Indisponibil",
"no_meeting_found": "Nu a fost găsită nicio ședință",
"no_meeting_found_description": "Această ședință nu există. Contactați proprietarul ședinței pentru un link actualizat.",
"no_status_bookings_yet": "Nicio rezervare în {{status}} încă",
"no_status_bookings_yet": "Nicio rezervare {{status}}",
"no_status_bookings_yet_description": "Nu ai nicio rezervare în {{status}}. {{description}}",
"event_between_users": "{{eventName}} între {{host}} și {{attendeeName}}",
"bookings": "Rezervări",
@ -313,6 +313,7 @@
"past_bookings": "Rezervările anterioare vor apărea aici.",
"cancelled_bookings": "Rezervările tale anulate vor apărea aici.",
"unconfirmed_bookings": "Rezervările dvs. neconfirmate vor apărea aici.",
"unconfirmed_bookings_tooltip": "Rezervări neconfirmate",
"on": "pe",
"and": "şi",
"calendar_shows_busy_between": "Calendarul vă arată ca ocupat între",
@ -356,7 +357,7 @@
"meeting_ended": "Ședință încheiată",
"form_submitted": "Formular trimis",
"event_triggers": "Declanșatoare eveniment",
"subscriber_url": "Url Abonat",
"subscriber_url": "URL abonat",
"create_new_webhook": "Creează un nou webhook",
"webhooks": "Webhooks",
"team_webhooks": "Webhooks de echipă",
@ -445,7 +446,7 @@
"sunday": "Duminică",
"all_booked_today": "Azi e totul rezervat.",
"slots_load_fail": "Nu s-au putut încărca intervalele de timp disponibile.",
"additional_guests": "+ Oaspeți suplimentari",
"additional_guests": "Adăugați vizitatori",
"your_name": "Numele tău",
"email_address": "Adresa de e-mail",
"enter_valid_email": "Introduceți un e-mail valid",
@ -482,12 +483,12 @@
"leave": "Părăsește",
"profile": "Profil",
"my_team_url": "URL-ul echipei mele",
"team_name": "Numele echipei",
"team_name": "Denumirea echipei",
"your_team_name": "Numele echipei tale",
"team_updated_successfully": "Echipă actualizată cu succes",
"your_team_updated_successfully": "Echipa ta a fost actualizată cu succes.",
"about": "Despre",
"team_description": "Câteva propoziții despre echipa ta. Acest lucru va apărea pe pagina de URL a echipei tale.",
"team_description": "Câteva propoziții despre echipa dvs. Aceste informații vor apărea pe pagina de URL a echipei dvs.",
"members": "Membri",
"member": "Membru",
"owner": "Proprietar",
@ -497,14 +498,14 @@
"new_member": "Membru Nou",
"invite": "Invită",
"add_team_members": "Adăugați membri în echipă",
"add_team_members_description": "Invită alte persoane să se alăture echipei tale",
"add_team_member": "Adăugați membru al echipei",
"invite_new_member": "Invită un membru nou",
"add_team_members_description": "Invitați și alte persoane în echipa dvs.",
"add_team_member": "Adăugați un membru al echipei",
"invite_new_member": "Invitați un nou membru în echipă",
"invite_new_team_member": "Invită pe cineva în echipa ta.",
"change_member_role": "Schimbați rolul de membru al echipei",
"disable_cal_branding": "Dezactivează branding Cal.com",
"disable_cal_branding": "Dezactivare branding Cal",
"disable_cal_branding_description": "Ascunde tot branding-ul Cal.com din paginile tale publice.",
"danger_zone": "Zonă de pericol",
"danger_zone": "Zonă periculoasă",
"back": "Înapoi",
"cancel": "Anulează",
"cancel_all_remaining": "Anulați toate pozițiile rămase",
@ -632,9 +633,9 @@
"billing": "Facturare",
"manage_your_billing_info": "Gestionați informațiile de facturare și anulați abonamentul.",
"availability": "Disponibilitate",
"edit_availability": "Editați disponibilitatea",
"edit_availability": "Modificați disponibilitatea",
"configure_availability": "Configurați orele când sunteți disponibil pentru rezervări.",
"copy_times_to": "Copiați orele la",
"copy_times_to": "Copiați orele în",
"change_weekly_schedule": "Modificaţi schema săptămânală",
"logo": "Logo",
"error": "Eroare",
@ -758,19 +759,24 @@
"featured_categories": "Categorii recomandate",
"popular_categories": "Categorii populare",
"number_apps_one": "{{count}} aplicație",
"number_apps_other": "{{count}} aplicații",
"number_apps_other": "{{count}} (de) aplicații",
"trending_apps": "Aplicații populare",
"explore_apps": "Aplicații {{category}}",
"installed_apps": "Aplicații instalate",
"no_category_apps": "Nicio aplicație {{category}}",
"no_category_apps_description_calendar": "Adăugați o aplicație calendar pentru a verifica dacă există conflicte și a preveni rezervări suprapuse",
"no_category_apps_description_calendar": "Adăugați o aplicație calendar pentru a verifica dacă există conflicte și a evita rezervările suprapuse",
"no_category_apps_description_conferencing": "Încercați să adăugați o aplicație de conferință pentru a integra apelul video cu clienții dvs.",
"no_category_apps_description_payment": "Adăugați o aplicație de plată pentru a facilita tranzacția între dvs. și clienții dvs.",
"no_category_apps_description_other": "Adăugați orice alt tip de aplicație pentru a face tot felul de lucruri",
"installed_app_calendar_description": "Setați calendarele să verifice dacă există conflicte, pentru a preveni rezervările suprapuse.",
"installed_app_conferencing_description": "Adăugați aplicațiile dvs. preferate de conferințe video pentru ședințele dvs.",
"no_category_apps_description_analytics": "Adăugați o aplicație de analiză pentru paginile dvs. de rezervări",
"no_category_apps_description_automation": "Adăugați o aplicație de automatizare de utilizat",
"no_category_apps_description_other": "Adăugați orice alt tip de aplicație pentru a întreprinde diverse acțiuni",
"installed_app_calendar_description": "Pentru a evita rezervările suprapuse, configurați calendarele astfel încât să poată verifica existența conflictelor.",
"installed_app_conferencing_description": "Adăugați aplicațiile preferate de conferințe video pentru ședințele dvs.",
"installed_app_payment_description": "Configurați serviciile de procesare a plăților care vor fi utilizate la taxarea clienților.",
"installed_app_analytics_description": "Configurați care aplicații de analiză vor fi utilizate pentru paginile dvs. de rezervări",
"installed_app_other_description": "Toate aplicațiile instalate din alte categorii.",
"installed_app_automation_description": "Configurați care aplicații de automatizare vor fi utilizate",
"analytics": "Analiză",
"empty_installed_apps_headline": "Nicio aplicație instalată",
"empty_installed_apps_description": "Aplicațiile vă permit să vă îmbunătățiți în mod semnificativ fluxul de lucru și activitățile legate de programări.",
"empty_installed_apps_button": "Explorați App Store",
@ -791,10 +797,10 @@
"remove": "Eliminați",
"add": "Adăugați",
"installed_one": "Instalat",
"installed_other": "{{count}} instalate",
"installed_other": "{{count}} instalată/instalate",
"verify_wallet": "Verificați portofelul",
"connect_metamask": "Conectați Metamask",
"create_events_on": "Creați evenimente pe:",
"create_events_on": "Creați evenimente pe",
"missing_license": "Licență lipsă",
"signup_requires": "Licență comercială necesară",
"signup_requires_description": "În prezent, Cal.com, Inc. nu oferă o versiune open-source gratuită a paginii de înscriere. Pentru a primi acces deplin la componentele de înscriere, trebuie să obțineți o licență comercială. Pentru uz personal, recomandăm Prisma Data Platform sau orice altă interfață Postgres pentru a crea conturi.",
@ -810,7 +816,7 @@
"new_schedule_btn": "Program nou",
"add_new_schedule": "Adăugați un program nou",
"add_new_calendar": "Adăugați un calendar nou",
"set_calendar": "Setați unde să adăugați evenimente noi când sunteți rezervat.",
"set_calendar": "Specificați unde se pot adăuga evenimente noi atunci când aveți rezervări.",
"delete_schedule": "Ștergeți programul",
"schedule_created_successfully": "Programul {{scheduleName}} a fost creat cu succes",
"availability_updated_successfully": "Disponibilitatea actualizată cu succes",
@ -823,12 +829,14 @@
"time_format": "Format oră",
"12_hour": "12 ore",
"24_hour": "24 de ore",
"24_hour_short": "24h",
"redirect_success_booking": "Redirecționare la rezervare ",
"you_are_being_redirected": "Sunteți redirecționat către {{ url }} în $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "Redirecționați către un URL personalizat după o rezervare reușită",
"duplicate": "Duplicare",
"offer_seats": "Oferiți locuri",
"offer_seats_description": "Oferiți locuri pentru rezervări (se dezactivează astfel oaspeții și rezervările la alegere)",
"offer_seats_description": "Opțiunea oferă locuri pentru rezervare și dezactivează automat rezervările pentru oaspeți și cele la alegere.",
"seats_available": "Locuri disponibile",
"number_of_seats": "Numărul de locuri per rezervare",
"enter_number_of_seats": "Introduceți numărul de locuri",
@ -882,7 +890,7 @@
"impersonate": "Reprezentare",
"user_impersonation_heading": "Reprezentare utilizator",
"user_impersonation_description": "Permite echipei noastre de asistență să se conecteze temporar în locul dvs. pentru a ne ajuta să rezolvăm orice probleme pe care ni le raportați.",
"team_impersonation_description": "Permite administratorilor echipei dvs. să se conecteze temporar din contul dvs.",
"team_impersonation_description": "Permite membrilor echipei să se conecteze temporar din contul dvs.",
"impersonate_user_tip": "Toate utilizările acestei caracteristici sunt verificate.",
"impersonating_user_warning": "Reprezentare nume de utilizator „{{user}}”.",
"impersonating_stop_instructions": "<0>Faceți clic aici pentru a înceta</0>.",
@ -910,13 +918,13 @@
"zapier_setup_instructions": "<0>Conectați-vă la contul Zapier și creați un Zap nou.</0><1>Selectați Cal.com ca aplicație Trigger. Alegeți și un eveniment Trigger.</1><2>Alegeți-vă contul, apoi introduceți cheia API unică.</2><3>Testați Trigger.</3><4>Sunteți gata!</4>",
"install_zapier_app": "Instalați mai întâi aplicația Zapier din App Store.",
"connect_apple_server": "Conectați-vă la serverul Apple",
"connect_caldav_server": "Conectați-vă la serverul CalDav",
"connect_caldav_server": "Conectați-vă la serverul CalDav (Beta)",
"calendar_url": "URL calendar",
"apple_server_generate_password": "Generați o parolă specifică aplicației, pe care o veți utiliza cu Cal.com la",
"credentials_stored_encrypted": "Datele dvs. de autentificare vor fi stocate și criptate.",
"it_stored_encrypted": "Aceasta va fi stocată și criptată.",
"go_to_app_store": "Accesați App Store",
"calendar_error": "A apărut o eroare. Încercați să reconectați calendarul cu toate permisiunile necesare",
"calendar_error": "Încercați să reconectați calendarul cu toate permisiunile necesare",
"set_your_phone_number": "Setați un număr de telefon pentru întâlnire",
"calendar_no_busy_slots": "Nu există intervale ocupate",
"display_location_label": "Afișare pe pagina de rezervare",
@ -963,7 +971,7 @@
"workflows": "Fluxuri de lucru",
"new_workflow_btn": "Flux de lucru nou",
"add_new_workflow": "Adăugați un flux de lucru nou",
"reschedule_event_trigger": "când evenimentul este reprogramat",
"reschedule_event_trigger": "atunci când evenimentul este reprogramat",
"trigger": "Declanșator",
"triggers": "Declanșatoare",
"action": "Acțiune",
@ -1015,7 +1023,7 @@
"add_exchange2016": "Conectare server Exchange 2016",
"custom_template": "Șablon personalizat",
"email_body": "Corp mesaj de e-mail",
"subject": "Subiect",
"subject": "Subiect e-mail",
"text_message": "Mesaj text",
"specific_issue": "Aveți o problemă specifică?",
"browse_our_docs": "răsfoiți documentele noastre",
@ -1053,8 +1061,8 @@
"navigate": "Navigare",
"open": "Deschidere",
"close": "Închidere",
"team_feature_teams": "Aceasta este o caracteristică a echipei. Upgradați la Echipă pentru a vedea disponibilitatea echipei dvs.",
"team_feature_workflows": "Aceasta este o caracteristică a echipei. Upgradați la Echipă pentru a automatiza notificările evenimentului și mementourile cu fluxuri de lucru.",
"team_feature_teams": "Aceasta este o caracteristică Team. Faceți upgrade la planul Team pentru a vedea disponibilitatea echipei dvs.",
"team_feature_workflows": "Aceasta este o caracteristică Team. Faceți upgrade la planul Team pentru a automatiza notificările și reamintirile pentru evenimente cu fluxuri de lucru.",
"show_eventtype_on_profile": "Arată pe profil",
"embed": "Încorporare",
"new_username": "Nume de utilizator nou",
@ -1114,10 +1122,10 @@
"customize_your_brand_colors": "Personalizați-vă pagina de rezervare folosind culoarea mărcii dvs.",
"pro": "Pro",
"removes_cal_branding": "Eliminați orice mărci de tip Cal, și anume „Powered by Cal”.",
"profile_picture": "Poză de profil",
"upload": "Încărcați",
"profile_picture": "Fotografie de profil",
"upload": "Încărcare",
"web3": "Web3",
"rainbow_token_gated": "Accesul la acest tip de eveniment se face pe baza tokenului.",
"rainbow_token_gated": "Accesul la acest tip de eveniment este posibil cu tokenuri.",
"rainbow_connect_wallet_gate": "Conectați-vă portofelul dacă dețineți <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Portofelul dvs. conectat nu conține suficient <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Semnați solicitarea de mesaj în portofel.",
@ -1141,123 +1149,167 @@
"impersonation": "Reprezentare",
"users": "Utilizatori",
"profile_description": "Gestionați setările profilului dvs. Cal",
"general_description": "Gestionați setările pentru limba și fusul orar",
"calendars_description": "Configurați cum interacționează tipurile de evenimente cu calendarele dvs.",
"general_description": "Gestionați setările pentru limbă și fus orar",
"calendars_description": "Configurați modul în care interacționează tipurile de evenimente cu calendarele dvs.",
"appearance_description": "Gestionați setările pentru aspectul rezervărilor dvs.",
"conferencing_description": "Gestionează aplicațiile de conferințe video pentru ședințele tale",
"conferencing_description": "Gestionați aplicațiile de conferințe video pentru ședințele dvs.",
"password_description": "Gestionați setările pentru parolele contului dvs.",
"2fa_description": "Gestionați setările pentru parolele contului dvs.",
"we_just_need_basic_info": "Avem nevoie doar de câteva informații de bază pentru configurarea profilului dvs.",
"skip": "Omiteți",
"do_this_later": "Mai târziu",
"do_this_later": "Reveniți mai târziu",
"set_availability_getting_started_subtitle_1": "Definiți intervalele de timp pentru disponibilitatea dvs.",
"set_availability_getting_started_subtitle_2": "Puteți personaliza toate acestea mai târziu în pagina de disponibilitate.",
"connect_calendars_from_app_store": "Puteți adăuga mai multe calendare din magazinul de aplicații",
"set_availability_getting_started_subtitle_2": "Puteți personaliza toate aceste caracteristici mai târziu, pe pagina dedicată disponibilității.",
"connect_calendars_from_app_store": "Puteți adăuga mai multe calendare din App Store",
"connect_conference_apps": "Conectați aplicațiile de conferință",
"connect_calendar_apps": "Conectați aplicații calendar",
"connect_payment_apps": "Conectați aplicații de plată",
"connect_calendar_apps": "Conectați aplicațiile calendar",
"connect_payment_apps": "Conectați aplicațiile de plată",
"connect_automation_apps": "Conectează aplicații automate",
"connect_analytics_apps": "Conectează aplicații pentru analiză",
"connect_other_apps": "Conectați alte aplicații",
"current_step_of_total": "Pasul {{currentStep}} din {{maxSteps}}",
"add_variable": "Adăugați variabilă",
"add_variable": "Adăugare variabilă",
"custom_phone_number": "Număr de telefon personalizat",
"message_template": "Șablon mesaj",
"message_template": "Șablon pentru mesaj",
"email_subject": "Subiect e-mail",
"add_dynamic_variables": "Adăugați variabile text dinamice",
"event_name_info": "Numele tipului de eveniment",
"add_dynamic_variables": "Adăugați variabile de text dinamic",
"event_name_info": "Denumirea tipului de eveniment",
"event_date_info": "Data evenimentului",
"event_time_info": "Ora începerii evenimentului",
"location_info": "Locația evenimentului",
"organizer_name_info": "Numele tău",
"additional_notes_info": "Note suplimentare privind rezervarea",
"attendee_name_info": "Numele rezervării persoanei",
"to": "La",
"workflow_turned_on_successfully": "Fluxul de lucru {{workflowName}} s-a {{offOn}} cu succes",
"download_responses": "Răspunsuri la descărcare",
"location_info": "Locul de desfășurare a evenimentului",
"organizer_name_info": "Numele dvs.",
"additional_notes_info": "Observații suplimentare privind rezervarea",
"attendee_name_info": "Numele persoanei care efectuează rezervarea",
"to": "Către",
"workflow_turned_on_successfully": "Fluxul de lucru {{workflowName}} a fost {{offOn}} cu succes",
"download_responses": "Descărcați răspunsurile",
"create_your_first_form": "Creați primul dvs. formular",
"create_your_first_form_description": "Cu ajutorul formularelor de direcționare puteți adresa întrebări de calificare şi direcționa către persoana sau tipul de eveniment corect.",
"create_your_first_webhook": "Creați primul dvs. Webhook",
"create_your_first_webhook_description": "Cu Webhook-urile, puteți primi date despre ședințe în timp real atunci când se întâmplă ceva pe Cal.com.",
"create_your_first_form_description": "Cu ajutorul formularelor de direcționare, puteți adresa întrebări de calificare și le puteți redirecționa persoanei sau tipului de eveniment potrivit.",
"create_your_first_webhook": "Creați primul dvs. webhook",
"create_your_first_webhook_description": "Webhookurile vă permit să primiți date despre ședințe în timp real atunci când se întâmplă ceva pe Cal.com.",
"for_a_maximum_of": "Pentru maximum",
"event_one": "eveniment",
"event_other": "evenimente",
"profile_team_description": "Gestionați setările profilului echipei dvs.",
"profile_team_description": "Gestionați setările pentru profilul echipei dvs.",
"members_team_description": "Utilizatori care sunt în grup",
"team_url": "URL-ul echipei",
"delete_team": "Ștergeți echipa",
"team_members": "Membrii echipei",
"more": "Mai mult",
"more_page_footer": "Considerăm că aplicația mobilă este o extensie a aplicației web. Dacă efectuați orice acțiuni complicate, vă rugăm să consultați aplicația web.",
"more_page_footer": "Considerăm că aplicația mobilă este o extensie a aplicației web. Dacă efectuați orice acțiuni complicate, reveniți la aplicația web.",
"workflow_example_1": "Trimiteți participantului un memento prin SMS cu 24 de ore înainte de începerea evenimentului",
"workflow_example_2": "Trimiteți participantului un SMS personalizat atunci când evenimentul este reprogramat",
"workflow_example_3": "Trimiteți gazdei un e-mail personalizat atunci când evenimentul nou este rezervat",
"workflow_example_4": "Trimiteți participantului un memento prin e-mail cu 1 oră înainte de începerea evenimentului",
"workflow_example_5": "Trimiteți gazdei un e-mail personalizat atunci când evenimentul nou este reprogramat",
"workflow_example_6": "Trimiteți gazdei un SMS personalizat atunci când evenimentul nou este rezervat",
"welcome_to_cal_header": "Bun venit la Cal.com!",
"edit_form_later_subtitle": "Veți putea să editați mai târziu.",
"welcome_to_cal_header": "Bun venit pe Cal.com!",
"edit_form_later_subtitle": "Veți putea efectua modificări mai târziu.",
"connect_calendar_later": "Îmi voi conecta calendarul mai târziu",
"set_my_availability_later": "Îmi voi seta disponibilitatea mai târziu",
"problem_saving_user_profile": "A apărut o problemă la salvarea datelor dvs. Încercați din nou sau contactați serviciul de asistență pentru clienți.",
"purchase_missing_seats": "Cumpărați locuri lipsă",
"slot_length": "Lungime interval",
"slot_length": "Durată interval",
"booking_appearance": "Aspectul rezervării",
"appearance_team_description": "Gestionați setările pentru aspectul rezervărilor echipei dvs.",
"only_owner_change": "Doar proprietarul acestei echipe poate schimba rezervarea echipei ",
"team_disable_cal_branding_description": "Eliminați orice mărci de tip Cal, și anume „Powered by Cal”",
"invited_by_team": "{{teamName}} v-a invitat să vă alăturați echipei sale ca {{role}}",
"team_disable_cal_branding_description": "Elimină toate mărcile asociate denumirii Cal, și anume „Powered by Cal”",
"invited_by_team": "{{teamName}} v-a invitat să faceți parte din echipa sa în calitate de {{role}}",
"token_invalid_expired": "Tokenul este nevalid sau expirat.",
"exchange_add": "Conectați-vă la Microsoft Exchange",
"exchange_authentication": "Metodă de autentificare",
"exchange_authentication_standard": "Autentificare de bază",
"exchange_authentication_ntlm": "Autentificare NTLM",
"exchange_compression": "Compresie GZip",
"routing_forms_description": "Aici puteți vedea toate formularele și direcțioările pe care le-ati creat.",
"add_new_form": "Adăugați formular nou",
"routing_forms_description": "Puteți vedea aici toate formularele și parcursurile pe care le-ați creat.",
"add_new_form": "Adăugați un formular nou",
"form_description": "Creați formularul pentru direcționarea unei persoane care face rezervare",
"copy_link_to_form": "Copiați linkul la formular",
"copy_link_to_form": "Copiați linkul în formular",
"theme": "Temă",
"theme_applies_note": "Acest lucru se aplică numai paginilor dvs. de rezervare publice",
"theme_light": "Lumină",
"theme_applies_note": "Acest aspect se aplică numai paginilor dvs. de rezervare publice",
"theme_light": "Luminos",
"theme_dark": "Întunecat",
"theme_system": "Implicit sistem",
"theme_system": "Setări implicite sistem",
"add_a_team": "Adăugați o echipă",
"add_webhook_description": "Primiți datele ședințelor în timp real atunci când se întâmplă ceva pe Cal.com",
"triggers_when": "Se declanșează când",
"test_webhook": "Testați ping-ul înainte de creare.",
"enable_webhook": "Activați Webhook",
"add_webhook": "Adăugați Webhook",
"triggers_when": "Se declanșează atunci când",
"test_webhook": "Efectuați un test ping înainte de creare.",
"enable_webhook": "Activați webhook",
"add_webhook": "Adăugați webhook",
"webhook_edited_successfully": "Webhook salvat",
"webhooks_description": "Primiți datele ședințelor în timp real atunci când se întâmplă ceva pe Cal.com",
"api_keys_description": "Generați chei API pentru accesarea propriului dvs. cont",
"api_keys_description": "Generați chei API pentru accesarea propriului cont",
"new_api_key": "Cheie API nouă",
"active": "Activ",
"api_key_updated": "Nume cheie API actualizat",
"api_key_update_failed": "Eroare la actualizarea numelui cheii API",
"embeds_title": "Încorporare HTML iframe",
"embeds_description": "Încorporați toate tipurile de evenimente pe site-ul dvs.",
"api_key_updated": "Denumire actualizată a cheii API",
"api_key_update_failed": "Eroare la actualizarea denumirii cheii API",
"embeds_title": "Încorporare iframe HTML",
"embeds_description": "Încorporați toate tipurile de evenimente pe site-ul dvs. web",
"create_first_api_key": "Creați prima dvs. cheie API",
"create_first_api_key_description": "Cheile API permit altor aplicații să comunice cu Cal.com",
"back_to_signin": "Înapoi la autentificare",
"back_to_signin": "Înapoi la conectare",
"reset_link_sent": "Link de resetare trimis",
"password_reset_email": "Veți primi în curând un e-mail la {{email}} cu instrucțiuni de resetare a parolei.",
"password_reset_email": "Veți primi în curând un e-mail la adresa {{email}}, cu instrucțiuni de resetare a parolei.",
"password_reset_leading": "Dacă nu primiți un e-mail în curând, verificați dacă adresa de e-mail pe care ați introdus-o este corectă, verificați folderul de mesaje nedorite sau contactați serviciul de asistență dacă problema persistă.",
"password_updated": "Parolă actualizată!",
"pending_payment": "Plată în așteptare",
"confirmation_page_rainbow": "Restricționați accesul la evenimentul dvs. cu tokeni sau NFT-uri pe Ethereum, Polygon și altele.",
"not_on_cal": "Nu pe Cal.com",
"confirmation_page_rainbow": "Restricționați accesul la evenimentul dvs. cu tokenuri sau NFT-uri pe Ethereum, Polygon și altele.",
"not_on_cal": "Nu este pe Cal.com",
"no_calendar_installed": "Niciun calendar instalat",
"no_calendar_installed_description": "Încă nu ați conectat niciunul dintre calendarele dvs.",
"no_calendar_installed_description": "Încă nu v-ați conectat niciunul dintre calendare",
"add_a_calendar": "Adăugați un calendar",
"change_email_hint": "S-ar putea să fie nevoie să vă deconectați și să vă reconectați pentru aplicarea oricăror modificări",
"confirm_password_change_email": "Vă rugăm să confirmați parola înainte de a vă schimba adresa de e-mail",
"change_email_hint": "Pentru implementarea modificărilor, ar putea fi necesar să vă deconectați și să vă reconectați",
"confirm_password_change_email": "Confirmați-vă parola înainte de a vă schimba adresa de e-mail",
"seats": "locuri",
"every_app_published": "Fiecare aplicație publicată pe Cal.com App Store este open source și testată temeinic prin evaluări inter pares. Cu toate acestea, Cal.com, Inc. nu susține sau certifică aceste aplicații decât dacă sunt publicate de Cal.com. Dacă întâmpinați un conținut sau un comportament necorespunzător, vă rugăm să îl raportați.",
"every_app_published": "Fiecare aplicație publicată în magazinul de aplicații Cal.com este open-source și testată temeinic prin evaluări inter pares. Cu toate acestea, Cal.com, Inc. nu susține sau certifică aceste aplicații decât dacă sunt publicate de Cal.com. Dacă descoperiți conținut sau comportament necorespunzător, vă încurajăm să îl raportați.",
"report_app": "Raportați aplicația",
"limit_booking_frequency": "Limitați frecvența de rezervare",
"limit_booking_frequency_description": "Limitați de câte ori poate fi rezervat acest eveniment",
"add_limit": "Adăugați o limită",
"team_name_required": "Este necesar numele echipei",
"show_attendees": "Partajați informațiile despre participanți între invitați",
"how_additional_inputs_as_variables": "Cum se utilizează intrările suplimentare ca variabile",
"format": "Format",
"uppercase_for_letters": "Utilizați majuscule pentru toate literele",
"replace_whitespaces_underscores": "Înlocuiți spațiile cu caractere de subliniere",
"manage_billing": "Gestionați facturarea",
"manage_billing_description": "Gestionați toate aspectele legate de facturare",
"billing_freeplan_title": "Momentan utilizați planul GRATUIT",
"billing_freeplan_description": "Lucrăm mai bine în echipe. Extindeți-vă fluxurile de lucru cu evenimente colective și cu alocare prin rotație și realizați formulare de rutare avansate",
"billing_freeplan_cta": "Încercați acum",
"billing_manage_details_title": "Vizualizați și gestionați detaliile de facturare",
"billing_manage_details_description": "Vizualizați și editați detaliile de facturare, precum și anulați abonarea.",
"billing_manage_details_description": "Vizualizați și modificați detaliile de facturare. Ca alternativă, vă puteți anula abonamentul.",
"billing_portal": "Portal de facturare",
"billing_help_title": "Aveți nevoie de altceva?",
"billing_help_description": "Dacă ai nevoie de ajutor suplimentar pentru facturare, echipa noastră de asistență este aici pentru a te ajuta.",
"billing_help_description": "Dacă aveți nevoie de ajutor suplimentar pentru facturare, echipa noastră de asistență este aici pentru a vă ajuta.",
"billing_help_cta": "Contactați serviciul de asistență",
"ignore_special_characters": "Ignorați caracterele speciale din eticheta Intrări suplimentare. Utilizați doar litere și cifre",
"retry": "Reîncercați",
"fetching_calendars_error": "A survenit o problemă la obținerea calendarelor dvs. Vă rugăm să <1>reîncercați</1> sau să contactați serviciul de asistență.",
"calendar_connection_fail": "Conexiune calendar nereușită",
"booking_confirmation_success": "Confirmare rezervare reușită",
"booking_confirmation_fail": "Confirmare rezervare nereușită",
"we_wont_show_again": "Nu vom mai arăta acest mesaj",
"couldnt_update_timezone": "Nu am putut actualiza fusul orar",
"updated_timezone_to": "Fusul orar a fost actualizat la {{formattedCurrentTz}}",
"update_timezone": "Actualizare fus orar",
"update_timezone_question": "Actualizați fusul orar?",
"update_timezone_description": "Se pare că fusul dvs. orar local a fost schimbat la {{formattedCurrentTz}}. Este foarte important să aveți fusul orar corect pentru a preveni rezervările efectuate la ore nedorite. Doriți să îl actualizați?",
"dont_update": "Nu actualizați",
"require_additional_notes": "Solicitați note suplimentare",
"require_additional_notes_description": "Solicitați completarea unor note suplimentare la rezervare",
"email_address_action": "trimiteți e-mail către o anumită adresă de e-mail",
"after_event_trigger": "după finalul evenimentului",
"how_long_after": "La cât timp după finalul evenimentului?",
"no_available_slots": "Niciun interval disponibil",
"time_available": "Oră disponibilă",
"install_new_calendar_app": "Instalați aplicația nouă pentru calendar",
"make_phone_number_required": "Setați numărul de telefon ca fiind obligatoriu pentru rezervarea evenimentului",
"dont_have_permission": "Nu aveți permisiunea să accesați această resursă.",
"saml_config": "Configurare SAML",
"saml_description": "Permiteți membrilor echipei să se conecteze utilizând un furnizor de identitate",
"saml_config_deleted_successfully": "Configurația SAML a fost ștearsă cu succes",
"saml_config_updated_successfully": "Configurație SAML actualizată cu succes",
"saml_configuration": "Configurație SAML",
"delete_saml_configuration": "Ștergeți configurația SAML",
"delete_saml_configuration_confirmation_message": "Sigur doriți să ștergeți configurația SAML? Membrii echipei dvs. care utilizează conectarea prin SAML nu vor mai putea accesa Cal.com.",
@ -1265,5 +1317,12 @@
"saml_not_configured_yet": "SAML nu este configurat încă",
"saml_configuration_description": "Pentru a actualiza configurația SAML, inserați metadatele SAML generate de furnizorul dvs. de identitate în caseta de text de mai jos.",
"saml_configuration_placeholder": "Inserați aici metadatele SAML generate de furnizorul dvs. de identitate",
"saml_email_required": "Introduceți un e-mail pentru a vă putea găsi furnizorul de identitate SAML"
"saml_email_required": "Introduceți un e-mail pentru a vă putea găsi furnizorul de identitate SAML",
"saml_sp_title": "Detaliile furnizorului de servicii",
"saml_sp_description": "Furnizorul dvs. de identitate (IdP) vă va solicita următoarele detalii pentru a finaliza configurarea aplicației SAML.",
"saml_sp_acs_url": "URL ACS",
"saml_sp_entity_id": "ID entitate SP",
"saml_sp_acs_url_copied": "URL ACS copiat!",
"saml_sp_entity_id_copied": "SP Entitate ID copiat!",
"saml_btn_configure": "Configurare"
}

View File

@ -766,11 +766,15 @@
"no_category_apps_description_calendar": "Добавьте приложение календаря, чтобы проверять наличие конфликтов для избежания двойного бронирования",
"no_category_apps_description_conferencing": "Попробуйте добавить приложение конференц-связи для интеграции видеозвонков с клиентами",
"no_category_apps_description_payment": "Добавьте платежное приложение, чтобы упростить транзакции с клиентами",
"no_category_apps_description_analytics": "Добавить на страницы бронирования аналитическое приложение",
"no_category_apps_description_automation": "Добавить приложение для автоматизации",
"no_category_apps_description_other": "Добавляйте всевозможные приложения для решения своих задач",
"installed_app_calendar_description": "Настройте проверку календарей на предмет конфликтов для избежания двойного бронирования.",
"installed_app_conferencing_description": "Добавьте приложения для видеоконференций, используемые для проведения онлайн-встреч",
"installed_app_payment_description": "Выберите службы обработки платежей для получения оплаты от клиентов.",
"installed_app_analytics_description": "Выбрать аналитические приложения для страниц бронирования",
"installed_app_other_description": "Все установленные приложения из других категорий.",
"installed_app_automation_description": "Выбрать приложения для автоматизации",
"empty_installed_apps_headline": "Нет установленных приложений",
"empty_installed_apps_description": "Приложения позволяют значительно улучшить рабочий процесс и жить по расписанию.",
"empty_installed_apps_button": "Перейти в App Store",
@ -823,9 +827,11 @@
"time_format": "Формат времени",
"12_hour": "12-часовой",
"24_hour": "24-часовой",
"24_hour_short": "24 часа",
"redirect_success_booking": "Перенаправление при бронировании ",
"you_are_being_redirected": "Перенаправление на {{ url }} произойдет через $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "Перенаправить на пользовательский URL после успешного оформления бронирования",
"duplicate": "Создать копию",
"offer_seats": "Предложить места",
"offer_seats_description": "Предлагать места при бронировании (данная настройка автоматически отключает гостевой режим и бронирование с подтверждением).",
@ -1156,6 +1162,8 @@
"connect_conference_apps": "Подключить приложения для конференций",
"connect_calendar_apps": "Подключить приложения календаря",
"connect_payment_apps": "Подключить платежные приложения",
"connect_automation_apps": "Подключить приложения для автоматизации",
"connect_analytics_apps": "Подключить аналитические приложения",
"connect_other_apps": "Подключить другие приложения",
"current_step_of_total": "Шаг {{currentStep}} из {{maxSteps}}",
"add_variable": "Добавить переменную",
@ -1252,11 +1260,28 @@
"seats": "места",
"every_app_published": "Все приложения на Cal.com App Store имеют открытый исходный код и тщательно тестируются другими разработчиками. Тем не менее Cal.com, Inc. не дает гарантий в отношении приложений, которые не опубликованы Cal.com. Если вы обнаружите неприемлемое содержание или поведение, просим сообщать о нем.",
"report_app": "Пожаловаться на приложение",
"limit_booking_frequency": "Ограничить периодичность бронирования",
"limit_booking_frequency_description": "Ограничить количество бронирований этого события",
"add_limit": "Добавить ограничение",
"show_attendees": "Предоставить гостям информацию об участнике",
"format": "Формат",
"uppercase_for_letters": "Использовать только прописные буквы",
"replace_whitespaces_underscores": "Заменить пробелы подчеркиванием",
"manage_billing": "Управление расчетами",
"manage_billing_description": "Управление всеми расчетами",
"billing_freeplan_description": "В командах работается лучше. Добавьте в рабочие процессы циклические и коллективные события и создайте расширенные формы маршрутизации",
"billing_manage_details_title": "Просмотр и управление платежными данными",
"billing_manage_details_description": "Просмотр и редактирование платежных реквизитов, а также отмена подписки.",
"billing_help_title": "Нужно что-нибудь еще?",
"billing_help_description": "Если вам нужна дальнейшая помощь с оплатой счета, наша служба поддержки готова помочь.",
"ignore_special_characters": "Игнорируйте специальные символы в метке дополнительной информации. Используйте только буквы и цифры",
"update_timezone": "Обновить часовой пояс",
"require_additional_notes": "Запросить дополнительные примечания",
"no_available_slots": "Нет доступных слотов",
"install_new_calendar_app": "Установить новое приложение календаря",
"make_phone_number_required": "Сделать номер телефона обязательным для бронирования",
"saml_config": "Конфигурация SAML",
"saml_description": "Разрешить членам команды вход с помощью поставщика удостоверений",
"saml_config_deleted_successfully": "Конфигурация SAML удалена",
"saml_config_updated_successfully": "Конфигурация SAML успешно обновлена",
"saml_configuration": "Конфигурация SAML",
@ -1266,5 +1291,6 @@
"saml_not_configured_yet": "SAML еще не настроен",
"saml_configuration_description": "Пожалуйста, вставьте метаданные SAML из вашего провайдера в текстовое поле ниже, чтобы обновить конфигурацию SAML.",
"saml_configuration_placeholder": "Пожалуйста, вставьте здесь метаданные SAML от вашего провайдера",
"saml_email_required": "Пожалуйста, введите адрес электронной почты, чтобы мы могли найти ваш SAML идентификатор провайдера"
"saml_email_required": "Пожалуйста, введите адрес электронной почты, чтобы мы могли найти ваш SAML идентификатор провайдера",
"saml_sp_acs_url": "ACS URL"
}

View File

@ -830,6 +830,7 @@
"time_format": "Format vremena",
"12_hour": "12 sati",
"24_hour": "24 sata",
"24_hour_short": "24 sata",
"redirect_success_booking": "Preusmeri na rezervaciju ",
"you_are_being_redirected": "Preusmeravamo vas na {{ url }} za $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
@ -1324,5 +1325,6 @@
"saml_sp_entity_id": "SP entitet ID",
"saml_sp_acs_url_copied": "ACS URL je kopiran!",
"saml_sp_entity_id_copied": "SP entitet ID je kopiran!",
"saml_btn_configure": "Konfiguracija"
"saml_btn_configure": "Konfiguracija",
"add_calendar": "Dodajte kalendar"
}

View File

@ -829,6 +829,7 @@
"time_format": "Tidsformat",
"12_hour": "12 timmar",
"24_hour": "24 timmar",
"24_hour_short": "24 timmar",
"redirect_success_booking": "Omdirigera vid bokning ",
"you_are_being_redirected": "Du omdirigeras till {{ url }} om $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",

View File

@ -830,6 +830,7 @@
"time_format": "Saat biçimi",
"12_hour": "12 saat",
"24_hour": "24 saat",
"24_hour_short": "24 sa",
"redirect_success_booking": "Rezervasyonu yönlendir ",
"you_are_being_redirected": "$t(second, {\"count\": {{seconds}} }) içinde {{ url }} adresine yönlendirileceksiniz.",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",

View File

@ -313,6 +313,7 @@
"past_bookings": "Тут з’являтимуться ваші минулі бронювання.",
"cancelled_bookings": "Тут з’являтимуться ваші скасовані бронювання.",
"unconfirmed_bookings": "Тут з’являтимуться ваші непідтверджені бронювання.",
"unconfirmed_bookings_tooltip": "Непідтверджені бронювання",
"on": "дата:",
"and": "і",
"calendar_shows_busy_between": "Згідно з вашим календарем, ви зайняті в період між",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "Додайте додаток для календаря, щоб перевіряти, чи немає конфліктів у розкладі, і уникати подвійних бронювань",
"no_category_apps_description_conferencing": "Спробуйте додати додаток для конференцій, щоб інтегрувати можливість відеорозмов зі своїми клієнтами",
"no_category_apps_description_payment": "Додайте платіжний додаток, щоб спростити трансакції між вами й вашими клієнтами",
"no_category_apps_description_analytics": "Включіть аналітичний додаток для своїх сторінок бронювання",
"no_category_apps_description_automation": "Включіть додаток для автоматизації",
"no_category_apps_description_other": "Додавайте інші додатки з різноманітними функціями",
"installed_app_calendar_description": "Налаштуйте календар, щоб перевіряти, чи немає конфліктів у розкладі, і уникати подвійних бронювань.",
"installed_app_conferencing_description": "Додавайте улюблені додатки для відеоконференцій, щоб проводити наради",
"installed_app_payment_description": "Укажіть, які служби обробки платежів використовувати, коли клієнти вам платять.",
"installed_app_analytics_description": "Укажіть, які аналітичні додатки використовувати на сторінках бронювання",
"installed_app_other_description": "Усі ваші встановлені додатки з інших категорій.",
"installed_app_automation_description": "Укажіть, які додатки для автоматизації використовувати",
"analytics": "Аналітика",
"empty_installed_apps_headline": "Не встановлено жодних додатків",
"empty_installed_apps_description": "Додатки дають змогу оптимізувати робочий процес і спростити роботу з графіком.",
"empty_installed_apps_button": "Переглянути магазин додатків",
@ -823,9 +829,11 @@
"time_format": "Формат часу",
"12_hour": "12-годинний",
"24_hour": "24-годинний",
"24_hour_short": "24 год",
"redirect_success_booking": "Перенаправляти під час бронювання ",
"you_are_being_redirected": "Ви перейдете за адресою {{ url }} через $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "Після успішного бронювання переспрямовувати за спеціальною URL-адресою",
"duplicate": "Дублювати",
"offer_seats": "Запропонувати місця",
"offer_seats_description": "Пропонуйте місця під час бронювання (при цьому вимикається гостьовий режим і бронювання з підтвердженням).",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "Підключити додатки для конференцій",
"connect_calendar_apps": "Підключити додатки для календаря",
"connect_payment_apps": "Підключити платіжні додатки",
"connect_automation_apps": "Підключити додатки для автоматизації",
"connect_analytics_apps": "Підключити аналітичні додатки",
"connect_other_apps": "Підключити інші додатки",
"current_step_of_total": "Крок {{currentStep}} із {{maxSteps}}",
"add_variable": "Додати змінну",
@ -1240,6 +1250,7 @@
"back_to_signin": "Повернутися до входу",
"reset_link_sent": "Посилання для скидання надіслано",
"password_reset_email": "Електронний лист з інструкціями зі скидання пароля надіслано на {{email}}.",
"password_reset_leading": "Якщо ви не отримаєте електронний лист найближчим часом, перевірте, чи правильну адресу електронної пошти введено та перевірте папку спаму. Якщо проблема не зникне, зверніться в нашу службу підтримки.",
"password_updated": "Пароль оновлено!",
"pending_payment": "Очікується оплата",
"confirmation_page_rainbow": "Увімкніть доступ до свого заходу тільки для власників звичайних або невзаємозамінних токенів Ethereum, Polygon тощо.",
@ -1252,12 +1263,53 @@
"seats": "місця",
"every_app_published": "Усі додатки, опубліковані в магазині Cal.com, мають відкритий код і ретельно перевіряються учасниками спільноти. Утім Cal.com, Inc. рекомендує та сертифікує лише додатки, опубліковані компанією Cal.com. Якщо ви натрапили на неприйнятний вміст або поведінку, надішліть нам скаргу.",
"report_app": "Поскаржитися на додаток",
"limit_booking_frequency": "Обмежити кількість бронювань",
"limit_booking_frequency_description": "Укажіть, яку максимальну кількість разів можна забронювати цей захід",
"add_limit": "Додати ліміт",
"team_name_required": "Назва команди обов’язкова",
"show_attendees": "Поширювати інформацією про учасників серед гостей",
"how_additional_inputs_as_variables": "Як використовувати додаткові поля введення як змінні",
"format": "Формат",
"uppercase_for_letters": "Використовувати всі великі літери",
"replace_whitespaces_underscores": "Заміняти пробіли підкресленнями",
"manage_billing": "Керування виставленням рахунків",
"manage_billing_description": "Керування всіма аспектами виставлення рахунків",
"billing_freeplan_title": "Зараз ви використовуєте БЕЗКОШТОВНИЙ план",
"billing_freeplan_description": "Ми краще працюємо в команді. Розширте свої робочі процеси за допомогою ротацій і колективних заходів та створюйте складніші форми переспрямовування",
"billing_freeplan_cta": "Спробуйте зараз",
"billing_manage_details_title": "Переглядайте свої дані для виставлення рахунків і керуйте ними",
"billing_manage_details_description": "Тут ви можете переглянути й відредагувати свої дані для виставлення рахунків, а також скасувати підписку.",
"billing_portal": "Портал виставлення рахунків",
"billing_help_title": "Потрібно щось інше?",
"billing_help_description": "Якщо вам потрібна додаткова допомога з виставленням рахунків, наша служба підтримки готова її надати.",
"billing_help_cta": "Служба підтримки",
"ignore_special_characters": "Пропускати спеціальні символи в мітці додаткового поля. Використовувати лише літери та цифри",
"retry": "Повторити спробу",
"fetching_calendars_error": "Під час отримання календарів виникла проблема. <1>Повторіть спробу</1> або зверніться в службу підтримки.",
"calendar_connection_fail": "Не вдалося підключитися до календаря",
"booking_confirmation_success": "Бронювання підтверджено",
"booking_confirmation_fail": "Не вдалося підтвердити бронювання",
"we_wont_show_again": "Ми більше не показуватимемо це повідомлення",
"couldnt_update_timezone": "Не вдалось оновити відомості про часовий пояс",
"updated_timezone_to": "Часовий пояс змінено на {{formattedCurrentTz}}",
"update_timezone": "Оновити часовий пояс",
"update_timezone_question": "Оновити часовий пояс?",
"update_timezone_description": "Схоже, ваш місцевий часовий пояс змінено на {{formattedCurrentTz}}. Щоб бронювання не випадали на небажаний час, дуже важливо вказати правильний часовий пояс. Змінити ці відомості?",
"dont_update": "Не змінювати",
"require_additional_notes": "Вимагати додаткових нотаток",
"require_additional_notes_description": "Під час бронювання потрібно обов’язково ввести додаткові нотатки",
"email_address_action": "надсилати електронний лист на певну адресу",
"after_event_trigger": "після завершення заходу",
"how_long_after": "За який час після завершення заходу?",
"no_available_slots": "Немає доступних вікон",
"time_available": "Доступний час",
"install_new_calendar_app": "Установити новий додаток календаря",
"make_phone_number_required": "Зробити введення телефонного номера обов’язковим для бронювання заходу",
"dont_have_permission": "У вас немає дозволів на доступ до цього ресурсу.",
"saml_config": "Конфігурація SAML",
"saml_description": "Дозволити учасникам команди входити за допомогою постачальника посвідчень",
"saml_config_deleted_successfully": "Конфігурацію SAML видалено",
"saml_config_updated_successfully": "Конфігурацію SAML оновлено",
"saml_configuration": "Конфігурація SAML",
"delete_saml_configuration": "Видаліть конфігурацію SAML",
"delete_saml_configuration_confirmation_message": "Справді конфігурацію SAML? Учасники вашої команди, які використовують вхід через SAML, утратять доступ до Cal.com.",
@ -1265,5 +1317,12 @@
"saml_not_configured_yet": "SAML ще не налаштовано",
"saml_configuration_description": "Вставте метадані SAML від свого постачальника посвідчень у текстове поле нижче, щоб оновити конфігурацію SAML.",
"saml_configuration_placeholder": "Вставте тут метадані SAML від свого постачальника посвідчень",
"saml_email_required": "Введіть електронну адресу, щоб ми могли знайти вашого постачальника посвідчень SAML"
"saml_email_required": "Введіть електронну адресу, щоб ми могли знайти вашого постачальника посвідчень SAML",
"saml_sp_title": "Дані постачальника послуг",
"saml_sp_description": "Ваш постачальник посвідчень попросить вас надати наведені далі відомості, щоб завершити налаштування додатку SAML.",
"saml_sp_acs_url": "URL-адреса ACS",
"saml_sp_entity_id": "Ідентифікатор сутності постачальника послуг",
"saml_sp_acs_url_copied": "URL-адресу ACS скопійовано!",
"saml_sp_entity_id_copied": "Ідентифікатор сутності постачальника послуг скопійовано!",
"saml_btn_configure": "Налаштувати"
}

View File

@ -829,6 +829,7 @@
"time_format": "Định dạng thời gian",
"12_hour": "12 tiếng",
"24_hour": "24 tiếng",
"24_hour_short": "24h",
"redirect_success_booking": "Chuyển hướng khi đặt lịch hẹn ",
"you_are_being_redirected": "Bạn sẽ được chuyển hướng đến {{ url }} sau $t(second, {\"count\": {{seconds}} }).",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
@ -1282,8 +1283,33 @@
"billing_help_title": "Cần gì nữa không?",
"billing_help_description": "Nếu bạn cần thêm bất kỳ trợ giúp nào về thanh toán, nhóm hỗ trợ của chúng tôi luôn sẵn sàng trợ giúp.",
"billing_help_cta": "Liên hệ với bộ phận hỗ trợ",
"ignore_special_characters": "Bỏ qua những kí tự đặc biệt trong Nhãn đầu vào bổ sung. Chỉ dùng chữ cái và số",
"retry": "Thử lại",
"fetching_calendars_error": "Có vấn đề khi tìm dữ liệu của bạn. Vui lòng <1>thử lại</1> hoặc liên hệ với bộ phận hỗ trợ khách hàng.",
"calendar_connection_fail": "Kết nối lịch bất thành",
"booking_confirmation_success": "Xác nhận lịch hẹn thành công",
"booking_confirmation_fail": "Xác nhận lịch hẹn bất thành",
"we_wont_show_again": "Chúng tôi sẽ không hiển thị cái này nữa",
"couldnt_update_timezone": "Chúng tôi không thể cập nhật múi giờ",
"updated_timezone_to": "Múi giờ được cập nhật sang {{formattedCurrentTz}}",
"update_timezone": "Cập nhật múi giờ",
"update_timezone_question": "Cập nhật múi giờ?",
"update_timezone_description": "Có vẻ như múi giờ địa phương của bạn đã đổi sang {{formattedCurrentTz}}. Điều quan trọng là có múi giờ chính xác để ngăn lịch hẹn ở giờ không mong muốn. Bạn có muốn cập nhật múi giờ?",
"dont_update": "Không cập nhật",
"require_additional_notes": "Cần ghi chú thêm",
"require_additional_notes_description": "Cần điền vào ghi chú thêm khi đặt lịch hẹn",
"email_address_action": "gửi email đến một địa chỉ email cụ thể",
"after_event_trigger": "sau khi sự kiện kết thúc",
"how_long_after": "Bao lâu sau khi sự kiện kết thúc?",
"no_available_slots": "Không còn khoảng thời gian trống",
"time_available": "Thời gian trống",
"install_new_calendar_app": "Cài ứng dụng lịch mới",
"make_phone_number_required": "Đặt số điện thoại là điều kiện bắt buộc khi đặt lịch hẹn sự kiện",
"dont_have_permission": "Bạn không có quyền truy cập tài nguyên này.",
"saml_config": "Cấu hình SAML",
"saml_description": "Cho phép thành viên nhóm đăng nhập bằng một Nhà cung cấp danh tính",
"saml_config_deleted_successfully": "Đã xóa cấu hình SAML thành công",
"saml_config_updated_successfully": "Đã cập nhật cấu hình SAML thành công",
"saml_configuration": "Cấu hình SAML",
"delete_saml_configuration": "Xóa cấu hình SAML",
"delete_saml_configuration_confirmation_message": "Bạn có chắc chắn muốn xóa cấu hình SAML không? Các thành viên trong nhóm của bạn sử dụng thông tin đăng nhập SAML sẽ không thể truy cập vào Cal.com được nữa.",
@ -1291,5 +1317,12 @@
"saml_not_configured_yet": "SAML chưa được định cấu hình",
"saml_configuration_description": "Vui lòng dán metadata SAML từ Nhà cung cấp danh tính của bạn vào hộp văn bản bên dưới để cập nhật cấu hình SAML của bạn.",
"saml_configuration_placeholder": "Vui lòng dán metadata SAML từ Nhà cung cấp danh tính của bạn tại đây",
"saml_email_required": "Vui lòng nhập email để chúng tôi có thể tìm thấy Nhà cung cấp danh tính SAML của bạn"
"saml_email_required": "Vui lòng nhập email để chúng tôi có thể tìm thấy Nhà cung cấp danh tính SAML của bạn",
"saml_sp_title": "Chi tiết nhà cung cấp dịch vụ",
"saml_sp_description": "Nhà cung cấp danh tính (IdP) của bạn sẽ hỏi bạn một số chi tiết sau để hoàn thành việc cấu hình ứng dụng SAML.",
"saml_sp_acs_url": "URL ACS",
"saml_sp_entity_id": "ID của thực thể SP",
"saml_sp_acs_url_copied": "URL ACS đã sao chép!",
"saml_sp_entity_id_copied": "ID của thực thể SP đã sao chép!",
"saml_btn_configure": "Cấu hình"
}

View File

@ -313,6 +313,7 @@
"past_bookings": "您过去的预约将显示在这里。",
"cancelled_bookings": "您已取消的预约将显示在这里。",
"unconfirmed_bookings": "您的未确认的预约将显示在这里。",
"unconfirmed_bookings_tooltip": "未确认的预约",
"on": "在",
"and": "与",
"calendar_shows_busy_between": "您的日历将显示繁忙于",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "添加日历应用以检查冲突,防止重复预约",
"no_category_apps_description_conferencing": "尝试添加会议应用以整合与客户的视频通话",
"no_category_apps_description_payment": "添加支付应用以简化您和客户之间的交易",
"no_category_apps_description_analytics": "为您的预约页面添加分析应用",
"no_category_apps_description_automation": "添加要使用的自动化应用",
"no_category_apps_description_other": "添加任何其他类型的应用以执行各种操作",
"installed_app_calendar_description": "设置日历以检查冲突,防止重复预约。",
"installed_app_conferencing_description": "添加您喜欢的视频会议应用以用于开会",
"installed_app_payment_description": "配置向客户收费时要使用的支付处理服务。",
"installed_app_analytics_description": "配置将用于您的预约页面的分析应用",
"installed_app_other_description": "所有属于其他类别的已安装应用。",
"installed_app_automation_description": "配置要使用的自动化应用",
"analytics": "分析",
"empty_installed_apps_headline": "未安装任何应用",
"empty_installed_apps_description": "通过应用可以显著增强工作流程和改善日程安排生活。",
"empty_installed_apps_button": "浏览 App Store",
@ -823,9 +829,11 @@
"time_format": "时间格式",
"12_hour": "12 小时",
"24_hour": "24 小时",
"24_hour_short": "24 小时制",
"redirect_success_booking": "预约时重定向",
"you_are_being_redirected": "您将在 $t(second, {\"count\": {{seconds}} }) 秒后重定向到 {{ url }}。",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "成功预约后重定向到自定义 URL",
"duplicate": "复制",
"offer_seats": "提供位置",
"offer_seats_description": "提供位置以供预约 (这将自动禁止访客和选择加入预约)。",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "连接会议应用",
"connect_calendar_apps": "连接日历应用",
"connect_payment_apps": "连接付款应用",
"connect_automation_apps": "连接自动化应用",
"connect_analytics_apps": "连接分析应用",
"connect_other_apps": "连接其他应用",
"current_step_of_total": "第 {{currentStep}} 步,共 {{maxSteps}} 步",
"add_variable": "添加变量",
@ -1240,6 +1250,7 @@
"back_to_signin": "返回以登录",
"reset_link_sent": "重置链接已发送",
"password_reset_email": "正在将包含重设密码说明的电子邮件发送至 {{email}}。",
"password_reset_leading": "如果您没有很快收到该电子邮件,请检查您输入的电子邮件地址是否正确,如果问题仍然存在,请检查垃圾邮件文件夹或联系支持。",
"password_updated": "密码已更新!",
"pending_payment": "待付款",
"confirmation_page_rainbow": "在 Ethereum、Polygon 等平台上使用代币或 NFT 对您的活动进行代币门控。",
@ -1252,11 +1263,51 @@
"seats": "位置",
"every_app_published": "Cal.com 应用商店上发布的每个应用都是开源的,并通过同行评审进行了全面测试。尽管如此,除非应用是由 Cal.com 发布,否则 Cal.com, Inc. 不认可或认证这些应用。如果您遇到不当内容或行为,请举报。",
"report_app": "报告应用",
"limit_booking_frequency": "限制预约频率",
"limit_booking_frequency_description": "限制可以预约此活动的次数",
"add_limit": "添加限制",
"team_name_required": "需要团队名称",
"show_attendees": "在访客之间共享参与者信息",
"how_additional_inputs_as_variables": "如何将附加输入用作变量",
"format": "格式",
"uppercase_for_letters": "所有字母均使用大写",
"replace_whitespaces_underscores": "将空格替换为下划线",
"manage_billing": "管理计费",
"manage_billing_description": "管理所有计费事项",
"billing_freeplan_title": "您目前正在使用免费计划",
"billing_freeplan_description": "我们在团队中可以更好地工作。通过轮流模式和集体活动扩展工作流程,并制作高级途径表格",
"billing_freeplan_cta": "立即试用",
"billing_manage_details_title": "查看和管理您的账单详情",
"billing_manage_details_description": "查看和编辑您的账单详情,以及取消您的订阅。",
"billing_portal": "计费门户",
"billing_help_title": "还有其他需要?",
"billing_help_description": "如果您在支付帐单时需要任何进一步的帮助,我们的支持团队随时为您提供。",
"billing_help_cta": "联系支持",
"ignore_special_characters": "忽略附加输入标签中的特殊字符。仅使用字母和数字",
"retry": "重试",
"fetching_calendars_error": "获取您的日历时出现问题。请<1>重试</1>或联系客户支持。",
"calendar_connection_fail": "日历连接失败",
"booking_confirmation_success": "预约确认成功",
"booking_confirmation_fail": "预约确认失败",
"we_wont_show_again": "我们不会再显示此内容",
"couldnt_update_timezone": "我们无法更新时区",
"updated_timezone_to": "将时区更新为 {{formattedCurrentTz}}",
"update_timezone": "更新时区",
"update_timezone_question": "更新时区?",
"update_timezone_description": "似乎您的本地时区已更改为 {{formattedCurrentTz}}。设置正确的时区以防止时间不当的预约非常重要。您是否要更新?",
"dont_update": "不更新",
"require_additional_notes": "需要附加备注",
"require_additional_notes_description": "预约时需要填写附加备注",
"email_address_action": "发送电子邮件到指定的电子邮件地址",
"after_event_trigger": "活动结束后",
"how_long_after": "活动结束后多久?",
"no_available_slots": "没有可用的时间段",
"time_available": "可用时间",
"install_new_calendar_app": "安装新的日历应用",
"make_phone_number_required": "使电话号码成为预约活动时的必需项",
"dont_have_permission": "您无权访问此资源。",
"saml_config": "SAML 配置",
"saml_description": "允许团队成员使用身份提供程序登录",
"saml_config_deleted_successfully": "SAML 配置删除成功",
"saml_config_updated_successfully": "SAML 配置更新成功",
"saml_configuration": "SAML 配置",
@ -1266,5 +1317,12 @@
"saml_not_configured_yet": "SAML 尚未配置",
"saml_configuration_description": "请将从您身份提供商获取的 SAML metadata 粘贴到下面的文本框中,以更新您的 SAML 配置。",
"saml_configuration_placeholder": "请将从身份提供商获取的 SAML metadata 粘贴到这里",
"saml_email_required": "请输入您的邮箱,以便我们找到您的 SAML 身份提供商"
"saml_email_required": "请输入您的邮箱,以便我们找到您的 SAML 身份提供商",
"saml_sp_title": "服务提供商详细信息",
"saml_sp_description": "您的身份提供程序 (IdP) 将要求您提供以下详细信息以完成 SAML 应用程序配置。",
"saml_sp_acs_url": "ACS URL",
"saml_sp_entity_id": "SP 实体 ID",
"saml_sp_acs_url_copied": "ACS URL 已复制!",
"saml_sp_entity_id_copied": "SP 实体 ID 已复制!",
"saml_btn_configure": "配置"
}

View File

@ -313,6 +313,7 @@
"past_bookings": "這裡會顯示之前的預約。",
"cancelled_bookings": "這裡會顯示取消的預約。",
"unconfirmed_bookings": "您未確認的預約會顯示在這裡。",
"unconfirmed_bookings_tooltip": "未確認的預約",
"on": "在",
"and": "與",
"calendar_shows_busy_between": "行事曆顯示忙碌時段",
@ -766,11 +767,16 @@
"no_category_apps_description_calendar": "新增行事曆應用程式來檢查衝突,以避免重複預約",
"no_category_apps_description_conferencing": "嘗試新增會議應用程式,以整合與客戶的視訊通話",
"no_category_apps_description_payment": "新增付款應用程式,簡化您和您客戶之間的交易",
"no_category_apps_description_analytics": "為您的預約頁面加入分析應用程式",
"no_category_apps_description_automation": "加入自動化應用程式來使用",
"no_category_apps_description_other": "新增任何其他類型的應用程式以完成各種操作",
"installed_app_calendar_description": "設定行事曆來檢查衝突,以避免重複預約。",
"installed_app_conferencing_description": "新增您愛用的視訊會議應用程式",
"installed_app_payment_description": "設定向客戶收費時要使用的付款處理服務。",
"installed_app_analytics_description": "設定要為您的預約頁面使用哪些分析應用程式",
"installed_app_other_description": "其他類別的所有已安裝應用程式。",
"installed_app_automation_description": "設定要使用哪些自動化應用程式",
"analytics": "分析",
"empty_installed_apps_headline": "沒有已安裝的應用程式",
"empty_installed_apps_description": "應用程式使您能夠增強您的工作流程並顯著改善您的日程安排。",
"empty_installed_apps_button": "探索應用商店",
@ -823,9 +829,11 @@
"time_format": "時間格式",
"12_hour": "12 小時",
"24_hour": "24 小時",
"24_hour_short": "24 小時",
"redirect_success_booking": "在預約時重新導向 ",
"you_are_being_redirected": "將於 $t(second, {\"count\": {{seconds}} }) 秒後將您重新導向至 {{ url }}。",
"external_redirect_url": "https://example.com/redirect-to-my-success-page",
"redirect_url_description": "成功預約後重新導向至自訂網址",
"duplicate": "複製",
"offer_seats": "提供座位",
"offer_seats_description": "為預約提供席次 (這將停用賓客和主動加入的預約)",
@ -1156,6 +1164,8 @@
"connect_conference_apps": "連接會議應用程式",
"connect_calendar_apps": "連接行事曆應用程式",
"connect_payment_apps": "連接付款應用程式",
"connect_automation_apps": "連結自動化應用程式",
"connect_analytics_apps": "連結分析應用程式",
"connect_other_apps": "連接其他應用程式",
"current_step_of_total": "第 {{currentStep}} 步,共 {{maxSteps}} 步",
"add_variable": "新增變數",
@ -1240,6 +1250,7 @@
"back_to_signin": "返回登入",
"reset_link_sent": "重設連結已傳送",
"password_reset_email": "含有密碼重設說明的電子郵件已在前往 {{email}} 的路上。",
"password_reset_leading": "如果您稍後還是沒有收到電子郵件,請檢查您輸入的電子郵件地址是否正確,並查看您的垃圾郵件資料夾;若問題持續發生,請聯絡支援團隊。",
"password_updated": "密碼已更新!",
"pending_payment": "待付款",
"confirmation_page_rainbow": "使用 Ethereum、Polygon 等的 Token 或 NFT 來以代幣管制您的活動。",
@ -1252,12 +1263,53 @@
"seats": "座位",
"every_app_published": "Cal.com App Store 上發佈的每個應用程式皆為開放原始碼,並經過同業審查仔細測試過。不過除了 Cal.com 發佈的應用程式外Cal.com, Inc. 無法為其他應用程式背書或提出擔保。若您發現這些應用程式有不當內容或行為,請立即回報。",
"report_app": "回報應用程式",
"limit_booking_frequency": "限制預約頻率",
"limit_booking_frequency_description": "限制此活動可預約的次數",
"add_limit": "新增限制",
"team_name_required": "需提供團隊名稱",
"show_attendees": "和賓客分享與會者資訊",
"how_additional_inputs_as_variables": "如何將額外輸入內容作為變數使用",
"format": "格式",
"uppercase_for_letters": "一律使用大寫字母",
"replace_whitespaces_underscores": "以底線取代空格",
"manage_billing": "管理帳單",
"manage_billing_description": "管理全部帳單",
"billing_freeplan_title": "您目前使用的是免費方案",
"billing_freeplan_description": "團隊合作效率佳。使用循環制和集體活動來擴充您的工作流程,並製作進階版引導表單",
"billing_freeplan_cta": "立即試用",
"billing_manage_details_title": "檢視與管理付費細節",
"billing_manage_details_description": "檢視與編輯付費細節,以及取消訂閱。",
"billing_portal": "帳單入口網站",
"billing_help_title": "還需要什麼嗎?",
"billing_help_description": "若您需要關於付費的進一步協助,我們的支援團隊會隨時幫助您。",
"billing_help_cta": "聯絡支援",
"ignore_special_characters": "忽略額外輸入標籤中的所有特殊字元。只使用字母和數字",
"retry": "重試",
"fetching_calendars_error": "擷取行事曆時發生問題。請<1>再試一次</1>,或聯絡客服支援團隊。",
"calendar_connection_fail": "行事曆連結失敗",
"booking_confirmation_success": "預約確認成功",
"booking_confirmation_fail": "預約確認失敗",
"we_wont_show_again": "我們不會再顯示此訊息",
"couldnt_update_timezone": "我們無法更新時區",
"updated_timezone_to": "已將時區更新為{{formattedCurrentTz}}",
"update_timezone": "更新時區",
"update_timezone_question": "更新時區?",
"update_timezone_description": "您的當地時區似乎已變更為{{formattedCurrentTz}}。請務必設定正確的時區,才能避免預約錯誤的時間。您要更新時區嗎?",
"dont_update": "不要更新",
"require_additional_notes": "需要額外備註",
"require_additional_notes_description": "預約時需填寫額外備註",
"email_address_action": "傳送電子郵件給特定的電子郵件地址",
"after_event_trigger": "活動結束過後",
"how_long_after": "活動結束過後多久?",
"no_available_slots": "沒有可用的時段",
"time_available": "開放時間",
"install_new_calendar_app": "安裝新的行事歷應用程式",
"make_phone_number_required": "預約活動時需提供電話號碼",
"dont_have_permission": "您沒有權限存取此資源。",
"saml_config": "SAML 設定",
"saml_description": "允許團隊成員使用 Identity Provider 登入",
"saml_config_deleted_successfully": "成功刪除 SAML 設定",
"saml_config_updated_successfully": "成功更新 SAML 設定",
"saml_configuration": "SAML 設定",
"delete_saml_configuration": "刪除 SAML 設定",
"delete_saml_configuration_confirmation_message": "確定要刪除 SAML 設定?使用 SAML 登入的團隊成員會再也無法進入 Cal.com。",
@ -1265,5 +1317,12 @@
"saml_not_configured_yet": "還未設定 SAML",
"saml_configuration_description": "如果要更新 SAML 設定,請從 Identity Provider 貼 SAML Metadata 到以下文字框。",
"saml_configuration_placeholder": "請把 Identity Provider 的 SAML Metadata 貼到這裡。",
"saml_email_required": "請輸入讓我們可以找到 SAML Identity Provider 的電子郵件"
"saml_email_required": "請輸入讓我們可以找到 SAML Identity Provider 的電子郵件",
"saml_sp_title": "服務供應方詳情",
"saml_sp_description": "您的 Identity Provider (IdP) 會要求您提供下列詳細資料,以完成 SAML 應用程式設定。",
"saml_sp_acs_url": "ACS 網址",
"saml_sp_entity_id": "SP 實體 ID",
"saml_sp_acs_url_copied": "ACS 網址已複製!",
"saml_sp_entity_id_copied": "已複製 SP 實體 ID",
"saml_btn_configure": "設定"
}

View File

@ -44,10 +44,13 @@ function useAddAppMutation(_type: App["type"] | null, options?: Parameters<typeo
window.location.href = json.url;
return;
}
// Skip redirection only if it is an OmniInstall and redirect URL isn't of some other origin
// This allows installation of apps like Stripe to still redirect to their authentication pages.
// TODO: For Omni installation to authenticate and come back to the page where installation was initiated, some changes need to be done in all apps' add callbacks
if (!json.url.startsWith(window.location.origin)) {
// Check first that the URL is absolute, then check that it is of different origin from the current.
if (/https?:\/\//.test(json.url) && !json.url.startsWith(window.location.origin)) {
// TODO: For Omni installation to authenticate and come back to the page where installation was initiated, some changes need to be done in all apps' add callbacks
window.location.href = json.url;
}
}, options);

View File

@ -90,7 +90,7 @@ export default class GoogleCalendarService implements Calendar {
},
// eslint-disable-next-line
...calEventRaw.attendees.map(({ id, ...rest }) => ({
rest,
...rest,
responseStatus: "accepted",
})),
],
@ -179,7 +179,7 @@ export default class GoogleCalendarService implements Calendar {
},
// eslint-disable-next-line
...event.attendees.map(({ id, ...rest }) => ({
rest,
...rest,
responseStatus: "accepted",
})),
],

View File

@ -3,8 +3,8 @@
"name": "Riverside",
"slug": "riverside",
"type": "riverside_video",
"imageSrc": "/api/app-store/riverside/icon.svg",
"logo": "/api/app-store/riverside/icon.svg",
"imageSrc": "/api/app-store/riverside/icon-dark.svg",
"logo": "/api/app-store/riverside/icon-dark.svg",
"url": "https://cal.com/apps/riverside",
"variant": "conferencing",
"categories": ["video"],

View File

Before

Width:  |  Height:  |  Size: 761 B

After

Width:  |  Height:  |  Size: 761 B

View File

@ -8,8 +8,8 @@ export const metadata = {
installed: true,
category: "other",
// If using static next public folder, can then be referenced from the base URL (/).
imageSrc: "/api/app-store/wipemycalother/icon.svg",
logo: "/api/app-store/wipemycalother/icon.svg",
imageSrc: "/api/app-store/wipemycalother/icon-dark.svg",
logo: "/api/app-store/wipemycalother/icon-dark.svg",
publisher: "Cal.com",
rating: 0,
reviews: 0,

View File

Before

Width:  |  Height:  |  Size: 806 B

After

Width:  |  Height:  |  Size: 806 B

View File

@ -18,7 +18,7 @@ export default class AttendeeRequestEmail extends AttendeeScheduledEmail {
to: toAddresses.join(","),
subject: `${this.calEvent.organizer.language.translate("booking_submitted_subject", {
eventType: this.calEvent.type,
name: this.calEvent.attendees[0].name,
name: this.calEvent.team?.name || this.calEvent.organizer.name,
date: this.getFormattedDate(),
})}`,
html: renderEmail("AttendeeRequestEmail", {

View File

@ -882,85 +882,108 @@ async function handler(req: NextApiRequest & { userId?: number | undefined }) {
triggerEvent: WebhookTriggerEvents.MEETING_ENDED,
};
const subscribersMeetingEnded = await getWebhooks(subscriberOptionsMeetingEnded);
try {
const subscribersMeetingEnded = await getWebhooks(subscriberOptionsMeetingEnded);
subscribersMeetingEnded.forEach((subscriber) => {
if (rescheduleUid && originalRescheduledBooking) {
cancelScheduledJobs(originalRescheduledBooking);
}
if (booking && booking.status === BookingStatus.ACCEPTED) {
scheduleTrigger(booking, subscriber.subscriberUrl, subscriber);
}
});
subscribersMeetingEnded.forEach((subscriber) => {
if (rescheduleUid && originalRescheduledBooking) {
cancelScheduledJobs(originalRescheduledBooking);
}
if (booking && booking.status === BookingStatus.ACCEPTED) {
scheduleTrigger(booking, subscriber.subscriberUrl, subscriber);
}
});
} catch (error) {
log.error("Error while running scheduledJobs for booking", error);
}
// Send Webhook call if hooked to BOOKING_CREATED & BOOKING_RESCHEDULED
const subscribers = await getWebhooks(subscriberOptions);
console.log("evt:", {
...evt,
metadata: reqBody.metadata,
});
const bookingId = booking?.id;
const eventTypeInfo: EventTypeInfo = {
eventTitle: eventType.title,
eventDescription: eventType.description,
requiresConfirmation: eventType.requiresConfirmation || null,
price: stripeAppData.price,
currency: eventType.currency,
length: eventType.length,
};
const promises = subscribers.map((sub) =>
sendPayload(sub.secret, eventTrigger, new Date().toISOString(), sub, {
try {
// Send Webhook call if hooked to BOOKING_CREATED & BOOKING_RESCHEDULED
const subscribers = await getWebhooks(subscriberOptions);
console.log("evt:", {
...evt,
...eventTypeInfo,
bookingId,
rescheduleUid,
metadata: reqBody.metadata,
eventTypeId,
//FIXME: FOr consistency b/w webhook and actual DB state, it should use isConfirmedByDefault here
status: eventType.requiresConfirmation ? "PENDING" : "ACCEPTED",
}).catch((e) => {
console.error(`Error executing webhook for event: ${eventTrigger}, URL: ${sub.subscriberUrl}`, e);
})
);
await Promise.all(promises);
});
const bookingId = booking?.id;
const eventTypeInfo: EventTypeInfo = {
eventTitle: eventType.title,
eventDescription: eventType.description,
requiresConfirmation: eventType.requiresConfirmation || null,
price: stripeAppData.price,
currency: eventType.currency,
length: eventType.length,
};
const promises = subscribers.map((sub) =>
sendPayload(sub.secret, eventTrigger, new Date().toISOString(), sub, {
...evt,
...eventTypeInfo,
bookingId,
rescheduleUid,
metadata: reqBody.metadata,
eventTypeId,
//FIXME: FOr consistency b/w webhook and actual DB state, it should use isConfirmedByDefault here
status: eventType.requiresConfirmation ? "PENDING" : "ACCEPTED",
}).catch((e) => {
console.error(`Error executing webhook for event: ${eventTrigger}, URL: ${sub.subscriberUrl}`, e);
})
);
await Promise.all(promises);
} catch (error) {
log.error("Error while sending webhook", error);
}
// Avoid passing referencesToCreate with id unique constrain values
// refresh hashed link if used
const urlSeed = `${organizerUser.username}:${dayjs(reqBody.start).utc().format()}`;
const hashedUid = translator.fromUUID(uuidv5(urlSeed, uuidv5.URL));
if (hasHashedBookingLink) {
await prisma.hashedLink.update({
try {
if (hasHashedBookingLink) {
await prisma.hashedLink.update({
where: {
link: reqBody.hashedLink as string,
},
data: {
link: hashedUid,
},
});
}
} catch (error) {
log.error("Error while updating hashed link", error);
}
if (!booking) throw new HttpError({ statusCode: 400, message: "Booking failed" });
try {
await prisma.booking.update({
where: {
link: reqBody.hashedLink as string,
uid: booking.uid,
},
data: {
link: hashedUid,
},
});
}
if (!booking) throw new HttpError({ statusCode: 400, message: "Booking failed" });
await prisma.booking.update({
where: {
uid: booking.uid,
},
data: {
references: {
createMany: {
data: referencesToCreate,
references: {
createMany: {
data: referencesToCreate,
},
},
},
},
});
});
} catch (error) {
log.error("Error while creating booking references", error);
}
try {
await scheduleWorkflowReminders(
eventType.workflows,
reqBody.smsReminderNumber as string | null,
evt,
evt.requiresConfirmation || false,
rescheduleUid ? true : false
);
} catch (error) {
log.error("Error while scheduling workflow reminders", error);
}
await scheduleWorkflowReminders(
eventType.workflows,
reqBody.smsReminderNumber as string | null,
evt,
evt.requiresConfirmation || false,
rescheduleUid ? true : false
);
// booking successful
req.statusCode = 201;
return booking;

View File

@ -70,10 +70,10 @@ const Wrapper = ({
<div tw="flex w-full h-full">
<img
tw="flex absolute left-0 top-0 w-full h-[110%]"
src={`${CAL_URL}/social-bg-${variant}.jpg`}
src={`${CAL_URL}/social-bg-${variant}-lines.jpg`}
alt="background"
width="1200"
height="300"
height="600"
/>
<div tw="flex flex-col w-full h-full px-[80px] py-[70px] items-start justify-center">{children}</div>
</div>
@ -102,15 +102,15 @@ export const Meeting = ({ title, users = [], profile }: MeetingImageProps) => {
const names = attendees.length > 0 ? attendees.map((user) => user.name) : [profile.name];
return (
<Wrapper>
<Wrapper variant="dark">
<div tw="h-full flex flex-col justify-start">
<div tw="flex items-center justify-center" style={{ fontFamily: "cal", fontWeight: "300" }}>
<div tw="flex items-center justify-center" style={{ fontFamily: "cal", fontWeight: 300 }}>
<img src={`${CAL_URL}/cal-logo-word-black.svg`} width="350" alt="Logo" />
{avatars.length > 0 && <div tw="font-bold text-black text-[92px] mx-8 bottom-2">/</div>}
<div tw="flex flex-row">
{avatars.slice(0, 3).map((avatar) => (
<img
tw="rounded-full mr-[-36px] border-[6px] border-black"
tw="rounded-full mr-[-36px] border-[6px] border-[#CDCED2]"
key={avatar}
src={avatar}
alt="Profile picture"
@ -118,55 +118,84 @@ export const Meeting = ({ title, users = [], profile }: MeetingImageProps) => {
/>
))}
{avatars.length > 3 && (
<div
tw="flex items-center top-[50%] justify-center w-32 h-32 rounded-full bg-black text-white text-4xl font-bold"
style={{ transform: "translateY(-50%)" }}>
+{avatars.length - 3}
<div tw="flex items-center justify-center w-[160px] h-[160px] rounded-full bg-black text-white text-[54px] font-bold">
<span tw="flex top-[-5px] left-[-5px]">+{avatars.length - 3}</span>
</div>
)}
</div>
</div>
<div tw="relative flex text-[54px] w-full flex-col text-black mt-auto">
<div tw="flex">
Meet{" "}
<strong tw="flex ml-4 font-medium" style={{ whiteSpace: "nowrap" }}>
{joinMultipleNames(names)}
</strong>
<div
tw="flex w-[1040px] overflow-hidden"
style={{ whiteSpace: "nowrap", fontFamily: "cal", textOverflow: "ellipsis" }}>
Meet {joinMultipleNames(names)}
</div>
<div tw="flex mt-2" style={{ whiteSpace: "nowrap" }}>
<div
tw="flex mt-3 w-[1040px] overflow-hidden"
style={{ whiteSpace: "nowrap", fontFamily: "inter", textOverflow: "ellipsis" }}>
{title}
</div>
{/* Adds overlay gradient for long text */}
<div
tw="absolute flex w-[200px] h-full left-[920px] top-0"
style={{
background: "linear-gradient(90deg, rgba(198,203,212,0) 0px, rgba(198,203,212,1) 120px)",
}}
/>
</div>
</div>
</Wrapper>
);
};
const VisualBlur = ({ visualSlug }: { visualSlug: string }) => {
// Making a blur of a dark logo is very ugly. We use the filename to indicate,
// when we don't want to render these blurry blob backgrounds.
if (visualSlug.indexOf("dark") > -1) return null;
return (
<div tw="flex relative">
{/* Blob top left */}
<div
tw="flex absolute top-[-100px] left-[-100px] w-[400px] h-[400px] opacity-80"
style={{
filter: "blur(98px)",
backgroundColor: "rgba(255, 255, 255, 0.7)",
backgroundImage: `url(${CAL_URL}${visualSlug})`,
backgroundSize: "400px 400px",
}}
/>
{/* Blob bottom right */}
<div
tw="flex absolute top-[230px] left-[660px] w-[630px] h-[630px] opacity-80"
style={{
filter: "blur(150px)",
backgroundColor: "rgba(255, 255, 255, 0.7)",
backgroundImage: `url(${CAL_URL}${visualSlug})`,
backgroundSize: "630px 630px",
}}
/>
</div>
);
};
export const App = ({ name, description, slug }: AppImageProps) => (
<Wrapper variant="dark">
<Wrapper>
<img
src={`${CAL_URL}/cal-logo-word-dark.svg`}
src={`${CAL_URL}/cal-logo-word-black.svg`}
width="150"
alt="Logo"
tw="absolute right-[48px] top-[32px]"
tw="absolute right-[48px] top-[48px]"
/>
<div tw="flex items-center justify-center w-full">
<div tw="flex items-center justify-center flex-row-reverse bg-[rgba(255,255,255,0.7)] p-8 rounded-lg w-[172px] h-[172px]">
<img src={`${CAL_URL}${slug}`} alt="App icon" width="125" />
<VisualBlur visualSlug={slug} />
<div tw="flex items-center w-full">
<div tw="flex">
<img src={`${CAL_URL}${slug}`} alt="App icon" width="172" />
</div>
</div>
<div tw="flex mt-7 text-center items-center justify-center w-full flex-col text-[#f9fafb]">
<div tw="flex text-[56px] mb-7" style={{ fontFamily: "cal", fontWeight: "300" }}>
<div tw="flex mt-auto w-full flex-col text-black">
<div tw="flex text-[64px] mb-7" style={{ fontFamily: "cal", fontWeight: 600 }}>
{name}
</div>
<div tw="flex text-[40px]">{description}</div>
<div tw="flex text-[36px]" style={{ fontFamily: "inter" }}>
{description}
</div>
</div>
</Wrapper>
);

View File

@ -75,6 +75,7 @@ export enum ErrorCode {
NewPasswordMatchesOld = "new-password-matches-old",
ThirdPartyIdentityProviderEnabled = "third-party-identity-provider-enabled",
RateLimitExceeded = "rate-limit-exceeded",
SocialIdentityProviderRequired = "social-identity-provider-required",
}
export const identityProviderNameMap: { [key in IdentityProvider]: string } = {

View File

@ -8,6 +8,11 @@ import { localStorage } from "@calcom/lib/webstorage";
const is24hLocalstorageKey = "timeOption.is24hClock";
export enum TimeFormat {
TWELVE_HOUR = "h:mma",
TWENTY_FOUR_HOUR = "HH:mm",
}
export const setIs24hClockInLocalStorage = (is24h: boolean) =>
localStorage.setItem(is24hLocalstorageKey, is24h.toString());
@ -41,4 +46,6 @@ export const isBrowserLocale24h = () => {
}
};
export const detectBrowserTimeFormat = isBrowserLocale24h() ? "HH:mm" : "h:mma";
export const detectBrowserTimeFormat = isBrowserLocale24h()
? TimeFormat.TWENTY_FOUR_HOUR
: TimeFormat.TWELVE_HOUR;

View File

@ -246,6 +246,40 @@ const loggedInViewerRouter = createProtectedRouter()
return;
},
})
.mutation("deleteMeWithoutPassword", {
async resolve({ ctx }) {
const user = await prisma.user.findUnique({
where: {
email: ctx.user.email.toLowerCase(),
},
});
if (!user) {
throw new Error(ErrorCode.UserNotFound);
}
if (user.identityProvider === IdentityProvider.CAL) {
throw new Error(ErrorCode.SocialIdentityProviderRequired);
}
if (user.twoFactorEnabled) {
throw new Error(ErrorCode.SocialIdentityProviderRequired);
}
// Remove me from Stripe
await deleteStripeCustomer(user).catch(console.warn);
// Remove my account
const deletedUser = await ctx.prisma.user.delete({
where: {
id: ctx.user.id,
},
});
// Sync Services
syncServicesDeleteWebUser(deletedUser);
return;
},
})
.mutation("away", {
input: z.object({
away: z.boolean(),

View File

@ -15,6 +15,7 @@ export const availabilityRouter = createProtectedRouter()
.query("list", {
async resolve({ ctx }) {
const { prisma, user } = ctx;
const schedules = await prisma.schedule.findMany({
where: {
userId: user.id,
@ -29,10 +30,13 @@ export const availabilityRouter = createProtectedRouter()
id: "asc",
},
});
const defaultScheduleId = await getDefaultScheduleId(user.id, prisma);
return {
schedules: schedules.map((schedule) => ({
...schedule,
isDefault: user.defaultScheduleId === schedule.id || schedules.length === 1,
isDefault: schedule.id === defaultScheduleId,
})),
};
},
@ -102,6 +106,7 @@ export const availabilityRouter = createProtectedRouter()
)
)
.optional(),
eventTypeId: z.number().optional(),
}),
async resolve({ input, ctx }) {
const { user, prisma } = ctx;
@ -112,6 +117,8 @@ export const availabilityRouter = createProtectedRouter()
id: user.id,
},
},
// If an eventTypeId is provided then connect the new schedule to that event type
...(input.eventTypeId && { eventType: { connect: { id: input.eventTypeId } } }),
};
const availability = getAvailabilityFromSchedule(input.schedule || DEFAULT_SCHEDULE);

View File

@ -441,6 +441,7 @@ export const bookingsRouter = createProtectedRouter()
select: {
id: true,
recurringEvent: true,
title: true,
requiresConfirmation: true,
workflows: {
include: {
@ -525,7 +526,7 @@ export const bookingsRouter = createProtectedRouter()
const attendeesList = await Promise.all(attendeesListPromises);
const evt: CalendarEvent = {
type: booking.title,
type: booking.eventType?.title || booking.title,
title: booking.title,
description: booking.description,
customInputs: isPrismaObjOrUndefined(booking.customInputs),

View File

@ -23,6 +23,7 @@
"react": "^18.2.0",
"react-colorful": "^5.6.0",
"react-feather": "^2.0.10",
"@formkit/auto-animate": "^1.0.0-beta.1",
"react-hook-form": "^7.34.2",
"react-icons": "^4.4.0",
"react-select": "^5.4.0"

View File

@ -0,0 +1,36 @@
import * as RadioGroup from "@radix-ui/react-radio-group";
import React from "react";
import { Label } from "./form";
type SegmentProps = {
label: string;
children: React.ReactNode;
} & RadioGroup.RadioGroupProps;
export function Segment({ label, children, ...rest }: SegmentProps) {
return (
<div>
<div className="inline-flex flex-col">
{label && <Label>{label}</Label>}
<RadioGroup.Root
className="flex space-x-1 rounded-md border-gray-200 bg-white p-[2px] text-sm font-medium leading-5 "
{...rest}>
{children}
</RadioGroup.Root>
</div>
</div>
);
}
type SegmentOptionProps = { value: string; children: React.ReactNode } & RadioGroup.RadioGroupItemProps;
export function SegmentOption({ value, children, ...rest }: SegmentOptionProps) {
return (
<RadioGroup.Item
value={value}
className="radix-disabled:opacity-40 radix-state-checked:bg-gray-200 radix-state-checked:hover:bg-gray-200 rounded-[4px] py-[6px] px-3 hover:bg-gray-100"
{...rest}>
{children}
</RadioGroup.Item>
);
}

View File

@ -0,0 +1,57 @@
import { useAutoAnimate } from "@formkit/auto-animate/react";
import React, { ReactNode } from "react";
import Switch from "./Switch";
import { Label } from "./form";
type Props = {
children?: ReactNode;
title: string;
description?: string;
checked: boolean;
disabled?: boolean;
onCheckedChange?: (checked: boolean) => void;
"data-testid"?: string;
};
function SettingsToggle({
checked,
onCheckedChange,
description,
title,
children,
disabled,
...rest
}: Props) {
const [animateRef] = useAutoAnimate<HTMLDivElement>();
return (
<>
<div className="flex w-full flex-col space-y-4 lg:flex-row lg:space-y-0 lg:space-x-4">
<fieldset className="block w-full flex-col sm:flex">
<div className="flex space-x-3">
<Switch
data-testid={rest["data-testid"]}
fitToHeight={true}
checked={checked}
onCheckedChange={onCheckedChange}
disabled={disabled}
/>
<div className="">
<Label className="text-sm font-semibold leading-none text-black">{title}</Label>
{description && <p className="-mt-2 text-sm leading-normal text-gray-600">{description}</p>}
</div>
</div>
{children && (
<div className="mt-4 lg:ml-14" ref={animateRef}>
{checked && children}
</div>
)}
</fieldset>
</div>
</>
);
}
export default SettingsToggle;

View File

@ -170,7 +170,7 @@ type LayoutProps = {
TopNavContainer?: ReactNode;
drawerState?: DrawerState;
HeadingLeftIcon?: ReactNode;
backPath?: string; // renders back button to specified path
backPath?: string | boolean; // renders back button to specified path
// use when content needs to expand with flex
flexChildrenContainer?: boolean;
isPublic?: boolean;
@ -773,7 +773,9 @@ export function ShellMain(props: LayoutProps) {
<Button
size="icon"
color="minimal"
onClick={() => router.push(props.backPath as string)}
onClick={() =>
typeof props.backPath === "string" ? router.push(props.backPath as string) : router.back()
}
StartIcon={Icon.FiArrowLeft}
aria-label="Go Back"
className="ltr:mr-2 rtl:ml-2"
@ -783,12 +785,12 @@ export function ShellMain(props: LayoutProps) {
<header
className={classNames(
props.large && "py-8",
"mb-4 flex w-full items-center pt-4 md:p-0 lg:mb-10"
"mb-4 flex w-full items-start pt-4 pb-2 md:p-0 lg:mb-10"
)}>
{props.HeadingLeftIcon && <div className="ltr:mr-4">{props.HeadingLeftIcon}</div>}
<div className="w-full ltr:mr-4 rtl:ml-4 sm:block">
{props.heading && (
<h1 className="font-cal mb-1 text-xl font-bold tracking-wide text-black">
<h1 className="font-cal text-xl font-bold tracking-wide text-black">
{!isLocaleReady ? <SkeletonText invisible /> : props.heading}
</h1>
)}
@ -802,7 +804,7 @@ export function ShellMain(props: LayoutProps) {
<div
className={classNames(
props.backPath ? "relative" : "fixed right-4 bottom-[75px] z-40 ",
"cta mb-4 flex-shrink-0 sm:relative sm:bottom-auto sm:right-auto"
"flex-shrink-0 sm:relative sm:bottom-auto sm:right-auto"
)}>
{props.CTA}
</div>

View File

@ -0,0 +1,53 @@
import * as RadixToggleGroup from "@radix-ui/react-toggle-group";
import { useEffect, useState } from "react";
import { classNames } from "@calcom/lib";
export const ToggleGroupItem = () => <div>hi</div>;
interface ToggleGroupProps extends Omit<RadixToggleGroup.ToggleGroupSingleProps, "type"> {
options: { value: string; label: string }[];
}
export const ToggleGroup = ({ options, onValueChange, ...props }: ToggleGroupProps) => {
const [value, setValue] = useState<string | undefined>(props.defaultValue);
const [activeToggleElement, setActiveToggleElement] = useState<null | HTMLButtonElement>(null);
useEffect(() => {
if (value && onValueChange) onValueChange(value);
}, [value, onValueChange]);
return (
<>
<RadixToggleGroup.Root
type="single"
{...props}
onValueChange={setValue}
className={classNames(
"dark:border-darkgray-200 relative inline-flex rounded-md border border-gray-200 p-1",
props.className
)}>
{/* Active toggle. It's a separate element so we can animate it nicely. */}
<span
aria-hidden
className="dark:bg-darkgray-200 absolute top-[4px] bottom-[4px] left-0 z-[0] rounded-[4px] bg-gray-200 transition-all"
style={{ left: activeToggleElement?.offsetLeft, width: activeToggleElement?.offsetWidth }}
/>
{options.map((option) => (
<RadixToggleGroup.Item
key={option.value}
value={option.value}
className="relative rounded-[4px] px-3 py-1 text-sm dark:text-neutral-200 [&[aria-checked='false']]:hover:font-medium"
ref={(node) => {
if (node && value === option.value) {
setActiveToggleElement(node);
}
return node;
}}>
{option.label}
</RadixToggleGroup.Item>
))}
</RadixToggleGroup.Root>
</>
);
};

View File

@ -71,7 +71,24 @@ const Select = <
return getReactSelectProps<Option, IsMulti, Group>({ className, components: components || {} });
}, [className, components]);
return <ReactSelect {...reactSelectProps} {...props} />;
return (
<ReactSelect
{...reactSelectProps}
{...props}
styles={{
option: (defaultStyles, state) => ({
...defaultStyles,
backgroundColor: state.isSelected
? state.isFocused
? "var(--brand-color)"
: "var(--brand-color)"
: state.isFocused
? "var(--brand-color-dark-mode)"
: "var(--brand-text-color)",
}),
}}
/>
);
};
export const SelectField = function SelectField<

View File

@ -31,3 +31,6 @@ export { default as HorizontalTabs, HorizontalTabItem } from "./navigation/tabs/
export type { VerticalTabItemProps } from "./navigation/tabs/VerticalTabItem";
export type { HorizontalTabItemProps } from "./navigation/tabs/HorizontalTabItem";
export * from "./Portal";
export * from "./Segment";
export { default as SettingsToggle } from "./SettingsToggle";

View File

@ -15,7 +15,7 @@ type Props = {
function CustomInputItem({ required, deleteOnClick, editOnClick, type, question }: Props) {
const { t } = useLocale();
return (
<li className="border-1 flex border border-gray-200 bg-white px-6 py-4 first:rounded-t-md last:rounded-b-md only:rounded-md xl:ml-7 ">
<li className="border-1 flex border border-gray-200 bg-white px-6 py-4 first:rounded-t-md last:rounded-b-md only:rounded-md">
<div className="flex flex-col">
<div className="flex items-center">
<span className="pr-2 text-sm font-semibold leading-none text-black">{question}</span>