Merge branch 'main' into monorepo/app-store

This commit is contained in:
zomars 2022-02-28 10:19:52 -07:00
commit 3643d62ce6
49 changed files with 1625 additions and 251 deletions

3
.gitignore vendored
View File

@ -65,3 +65,6 @@ tsconfig.tsbuildinfo
# Prisma-Zod
packages/prisma/zod/*.ts
# Builds
dist

6
.gitmodules vendored Normal file
View File

@ -0,0 +1,6 @@
[submodule "apps/api"]
path = apps/api
url = git@github.com:calcom/api.git
[submodule "apps/website"]
path = apps/website
url = git@github.com:calcom/website.git

6
.husky/post-receive Executable file
View File

@ -0,0 +1,6 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
echo "Updating submodules recursively"
pwd
git submodule update --init --recursive

View File

@ -1 +0,0 @@
.github

View File

@ -124,6 +124,14 @@ Here is what you need to be able to run Cal.
yarn dx
```
#### Development tip
> Add `NEXT_PUBLIC_DEBUG=1` anywhere in your `apps/web/.env` to get logging information for all the queries and mutations driven by **trpc**.
```sh
echo 'NEXT_PUBLIC_DEBUG=1' >> apps/web/.env
```
#### Manual setup
1. Configure environment variables in the .env file. Replace `<user>`, `<pass>`, `<db-host>`, `<db-port>` with their applicable values

1
apps/api Submodule

@ -0,0 +1 @@
Subproject commit 378cbf8f3a67ea7877296f1da02edb2b6e3efbce

View File

@ -22,7 +22,7 @@ import TrialBanner from "@ee/components/TrialBanner";
import HelpMenuItemDynamic from "@ee/lib/intercom/HelpMenuItemDynamic";
import classNames from "@lib/classNames";
import { BASE_URL } from "@lib/config/constants";
import { NEXT_PUBLIC_BASE_URL } from "@lib/config/constants";
import { shouldShowOnboarding } from "@lib/getting-started";
import { useLocale } from "@lib/hooks/useLocale";
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry";
@ -66,7 +66,7 @@ function useRedirectToLoginIfUnauthenticated() {
router.replace({
pathname: "/auth/login",
query: {
callbackUrl: `${BASE_URL}/${location.pathname}${location.search}`,
callbackUrl: `${NEXT_PUBLIC_BASE_URL}/${location.pathname}${location.search}`,
},
});
}
@ -431,7 +431,7 @@ function UserDropdown({ small }: { small?: boolean }) {
<img
className="rounded-full"
src={
(process.env.NEXT_PUBLIC_APP_URL || process.env.BASE_URL) +
(process.env.NEXT_PUBLIC_APP_URL || process.env.NEXT_PUBLIC_BASE_URL) +
"/" +
user?.username +
"/avatar.png"

View File

@ -9,6 +9,7 @@ import { useLocale } from "@lib/hooks/useLocale";
import { inferQueryOutput, trpc } from "@lib/trpc";
import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader } from "@components/Dialog";
import { useMeQuery } from "@components/Shell";
import { TextArea } from "@components/form/fields";
import Button from "@components/ui/Button";
import TableActions, { ActionType } from "@components/ui/TableActions";
@ -16,6 +17,9 @@ import TableActions, { ActionType } from "@components/ui/TableActions";
type BookingItem = inferQueryOutput<"viewer.bookings">["bookings"][number];
function BookingListItem(booking: BookingItem) {
// Get user so we can determine 12/24 hour format preferences
const query = useMeQuery();
const user = query.data;
const { t, i18n } = useLocale();
const utils = trpc.useContext();
const [rejectionReason, setRejectionReason] = useState<string>("");
@ -120,7 +124,8 @@ function BookingListItem(booking: BookingItem) {
<td className="hidden whitespace-nowrap py-4 align-top ltr:pl-6 rtl:pr-6 sm:table-cell">
<div className="text-sm leading-6 text-gray-900">{startTime}</div>
<div className="text-sm text-gray-500">
{dayjs(booking.startTime).format("HH:mm")} - {dayjs(booking.endTime).format("HH:mm")}
{dayjs(booking.startTime).format(user && user.timeFormat === 12 ? "h:mma" : "HH:mm")} -{" "}
{dayjs(booking.endTime).format(user && user.timeFormat === 12 ? "h:mma" : "HH:mm")}
</div>
</td>
<td className={"flex-1 py-4 ltr:pl-4 rtl:pr-4" + (booking.rejected ? " line-through" : "")}>

View File

@ -4,11 +4,13 @@ import dayjs, { Dayjs } from "dayjs";
import dayjsBusinessTime from "dayjs-business-time";
import timezone from "dayjs/plugin/timezone";
import utc from "dayjs/plugin/utc";
import { useEffect, useMemo, useState } from "react";
import { memoize } from "lodash";
import { useEffect, useMemo, useRef, useState } from "react";
import classNames from "@lib/classNames";
import { timeZone } from "@lib/clock";
import { weekdayNames } from "@lib/core/i18n/weekday";
import { doWorkAsync } from "@lib/doWorkAsync";
import { useLocale } from "@lib/hooks/useLocale";
import getSlots from "@lib/slots";
import { WorkingHours } from "@lib/types/schedule";
@ -87,7 +89,13 @@ function DatePicker({
const [month, setMonth] = useState<string>("");
const [year, setYear] = useState<string>("");
const [isFirstMonth, setIsFirstMonth] = useState<boolean>(false);
const [daysFromState, setDays] = useState<
| {
disabled: Boolean;
date: number;
}[]
| null
>(null);
useEffect(() => {
if (!browsingDate || (date && browsingDate.utcOffset() !== date?.utcOffset())) {
setBrowsingDate(date || dayjs().tz(timeZone()));
@ -99,13 +107,56 @@ function DatePicker({
setMonth(browsingDate.toDate().toLocaleString(i18n.language, { month: "long" }));
setYear(browsingDate.format("YYYY"));
setIsFirstMonth(browsingDate.startOf("month").isBefore(dayjs()));
setDays(null);
}
}, [browsingDate, i18n.language]);
const days = useMemo(() => {
const isDisabled = (
day: number,
{
browsingDate,
periodType,
periodStartDate,
periodEndDate,
periodCountCalendarDays,
periodDays,
eventLength,
minimumBookingNotice,
workingHours,
}
) => {
const date = browsingDate.startOf("day").date(day);
return (
isOutOfBounds(date, {
periodType,
periodStartDate,
periodEndDate,
periodCountCalendarDays,
periodDays,
}) ||
!getSlots({
inviteeDate: date,
frequency: eventLength,
minimumBookingNotice,
workingHours,
}).length
);
};
const isDisabledRef = useRef(
memoize(isDisabled, (day, { browsingDate }) => {
// Make a composite cache key
return day + "_" + browsingDate.toString();
})
);
const days = (() => {
if (!browsingDate) {
return [];
}
if (daysFromState) {
return daysFromState;
}
// Create placeholder elements for empty days in first week
let weekdayOfFirst = browsingDate.date(1).day();
if (weekStart === "Monday") {
@ -115,33 +166,49 @@ function DatePicker({
const days = Array(weekdayOfFirst).fill(null);
const isDisabled = (day: number) => {
const date = browsingDate.startOf("day").date(day);
return (
isOutOfBounds(date, {
periodType,
periodStartDate,
periodEndDate,
periodCountCalendarDays,
periodDays,
}) ||
!getSlots({
inviteeDate: date,
frequency: eventLength,
minimumBookingNotice,
workingHours,
}).length
);
};
const isDisabledMemoized = isDisabledRef.current;
const daysInMonth = browsingDate.daysInMonth();
const daysInitialOffset = days.length;
// Build UI with All dates disabled
for (let i = 1; i <= daysInMonth; i++) {
days.push({ disabled: isDisabled(i), date: i });
days.push({
disabled: true,
date: i,
});
}
// Update dates with their availability
doWorkAsync({
batch: 1,
name: "DatePicker",
length: daysInMonth,
callback: (i: number, isLast) => {
let day = i + 1;
days[daysInitialOffset + i] = {
disabled: isDisabledMemoized(day, {
browsingDate,
periodType,
periodStartDate,
periodEndDate,
periodCountCalendarDays,
periodDays,
eventLength,
minimumBookingNotice,
workingHours,
}),
date: day,
};
},
batchDone: () => {
setDays([...days]);
},
});
return days;
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [browsingDate]);
})();
if (!browsingDate) {
return <Loader />;

View File

@ -123,7 +123,7 @@ const AvailabilityPage = ({ profile, eventType, workingHours }: Props) => {
<div className="block p-4 sm:p-8 md:hidden">
<div className="flex items-center">
<AvatarGroup
border="dark:border-gray-900 border-white"
border="border-2 dark:border-gray-900 border-white"
items={
[
{ image: profile.image, alt: profile.name, title: profile.name },
@ -172,7 +172,7 @@ const AvailabilityPage = ({ profile, eventType, workingHours }: Props) => {
(selectedDate ? "sm:w-1/3" : "sm:w-1/2")
}>
<AvatarGroup
border="dark:border-gray-900 border-white"
border="border-2 dark:border-gray-900 border-white"
items={
[
{ image: profile.image, alt: profile.name, title: profile.name },

View File

@ -288,7 +288,7 @@ const BookingPage = (props: BookingPageProps) => {
<div className="px-4 py-5 sm:flex sm:p-4">
<div className="sm:w-1/2 sm:border-r sm:dark:border-gray-800">
<AvatarGroup
border="border-white dark:border-gray-900"
border="border-2 border-white dark:border-gray-900"
size={14}
items={[{ image: props.profile.image || "", alt: props.profile.name || "" }].concat(
props.eventType.users

View File

@ -60,7 +60,7 @@ export default function ConfirmationDialogContent(props: PropsWithChildren<Confi
</DialogPrimitive.Description>
</div>
</div>
<div className="mt-5 gap-x-2 sm:mt-8 sm:flex sm:flex-row-reverse">
<div className="mt-5 flex flex-row-reverse gap-x-2 sm:mt-8">
<DialogClose onClick={onConfirm} asChild>
{confirmBtn || <Button color="primary">{confirmBtnText}</Button>}
</DialogClose>

View File

@ -2,7 +2,7 @@ import type { IntegrationOAuthCallbackState } from "pages/api/integrations/types
import { useState } from "react";
import { useMutation } from "react-query";
import { BASE_URL } from "@lib/config/constants";
import { NEXT_PUBLIC_BASE_URL } from "@lib/config/constants";
import { ButtonBaseProps } from "@components/ui/Button";
@ -19,7 +19,7 @@ export default function ConnectIntegration(props: {
const mutation = useMutation(async () => {
const state: IntegrationOAuthCallbackState = {
returnTo: BASE_URL + location.pathname + location.search,
returnTo: NEXT_PUBLIC_BASE_URL + location.pathname + location.search,
};
const stateStr = encodeURIComponent(JSON.stringify(state));
const searchParams = `?state=${stateStr}`;

View File

@ -120,11 +120,11 @@ const CustomInputTypeForm: FC<Props> = (props) => {
value={selectedCustomInput?.id || -1}
{...register("id", { valueAsNumber: true })}
/>
<div className="mt-5 sm:mt-4 sm:flex sm:flex-row-reverse">
<Button type="submit">{t("save")}</Button>
<div className="mt-5 flex space-x-2 sm:mt-4">
<Button onClick={onCancel} type="button" color="secondary" className="ltr:mr-2">
{t("cancel")}
</Button>
<Button type="submit">{t("save")}</Button>
</div>
</form>
);

View File

@ -76,7 +76,7 @@ export default function TeamCreate(props: Props) {
/>
</div>
{errorMessage && <Alert severity="error" title={errorMessage} />}
<div className="mt-5 sm:mt-4 sm:flex sm:flex-row-reverse">
<div className="mt-5 flex flex-row-reverse sm:mt-4">
<button type="submit" className="btn btn-primary">
{t("create_team")}
</button>

View File

@ -22,8 +22,14 @@ export const AvatarGroup = function AvatarGroup(props: AvatarGroupProps) {
{props.items.slice(0, props.truncateAfter).map((item, idx) => {
if (item.image != null) {
return (
<li key={idx} className={classNames("-mr-2 inline-block border-2", props.border)}>
<Avatar imageSrc={item.image} title={item.title} alt={item.alt || ""} size={props.size} />
<li key={idx} className="-mr-2 inline-block">
<Avatar
className={props.border}
imageSrc={item.image}
title={item.title}
alt={item.alt || ""}
size={props.size}
/>
</li>
);
}

View File

@ -10,6 +10,7 @@ import { weekdayNames } from "@lib/core/i18n/weekday";
import { useLocale } from "@lib/hooks/useLocale";
import { TimeRange } from "@lib/types/schedule";
import { useMeQuery } from "@components/Shell";
import Button from "@components/ui/Button";
import Select from "@components/ui/form/Select";
@ -46,6 +47,10 @@ type TimeRangeFieldProps = {
};
const TimeRangeField = ({ name }: TimeRangeFieldProps) => {
// Get user so we can determine 12/24 hour format preferences
const query = useMeQuery();
const user = query.data;
// Lazy-loaded options, otherwise adding a field has a noticable redraw delay.
const [options, setOptions] = useState<Option[]>([]);
const [selected, setSelected] = useState<number | undefined>();
@ -57,7 +62,9 @@ const TimeRangeField = ({ name }: TimeRangeFieldProps) => {
const getOption = (time: ConfigType) => ({
value: dayjs(time).toDate().valueOf(),
label: dayjs(time).utc().format("HH:mm"),
label: dayjs(time)
.utc()
.format(user && user.timeFormat === 12 ? "h:mma" : "HH:mm"),
// .toLocaleTimeString(i18n.language, { minute: "numeric", hour: "numeric" }),
});
@ -82,7 +89,7 @@ const TimeRangeField = ({ name }: TimeRangeFieldProps) => {
handleSelected(value);
return (
<Select
className="w-[6rem]"
className="w-30"
options={options}
onFocus={() => setOptions(timeOptions())}
onBlur={() => setOptions([])}
@ -100,7 +107,7 @@ const TimeRangeField = ({ name }: TimeRangeFieldProps) => {
name={`${name}.end`}
render={({ field: { onChange, value } }) => (
<Select
className="w-[6rem]"
className="w-30"
options={options}
onFocus={() => setOptions(timeOptions({ selected }))}
onBlur={() => setOptions([])}

View File

@ -59,8 +59,8 @@ export default function SetTimesModal(props: SetTimesModalProps) {
let endMinute = parseInt(endMinsRef.current.value);
//convert to dayjs object
const startTime = dayjs(`${startHour}-${startMinute}`, "hh:mm");
const endTime = dayjs(`${endHour}-${endMinute}`, "hh:mm");
const startTime = dayjs(`${startHour}:${startMinute}`, "hh:mm");
const endTime = dayjs(`${endHour}:${endMinute}`, "hh:mm");
//compute minimin and maximum allowed
const maximumStartTime = endTime.subtract(step, "minute");

View File

@ -46,7 +46,23 @@ export async function getStripeCustomerId(user: UserType): Promise<string | null
});
if (customersResponse.data[0]?.id) {
customerId = customersResponse.data[0].id;
} else {
/* Creating customer on Stripe and saving it on prisma */
const customer = await stripe.customers.create({ email: user.email });
customerId = customer.id;
}
await prisma.user.update({
where: {
email: user.email,
},
data: {
metadata: {
...(user.metadata as Prisma.JsonObject),
stripeCustomerId: customerId,
},
},
});
}
return customerId;

View File

@ -3,3 +3,4 @@ export const WEBSITE_URL = process.env.NEXT_PUBLIC_APP_URL || "https://cal.com";
export const IS_PRODUCTION = process.env.NODE_ENV === "production";
export const TRIAL_LIMIT_DAYS = 14;
export const HOSTED_CAL_FEATURES = process.env.HOSTED_CAL_FEATURES || BASE_URL === "https://app.cal.com";
export const NEXT_PUBLIC_BASE_URL = process.env.NEXT_PUBLIC_BASE_URL || `https://${process.env.VERCEL_URL}`;

View File

@ -20,8 +20,8 @@ export const seoConfig: {
},
defaultNextSeo: {
twitter: {
handle: "@calendso",
site: "@Calendso",
handle: "@calcom",
site: "@calcom",
cardType: "summary_large_image",
},
},

View File

@ -0,0 +1,65 @@
const data = {};
/**
* Starts an iteration from `0` to `length - 1` with batch size `batch`
*
* `callback` is called per iteration
*
* `done` is called when all iterations are done
*
* `name` is a unique identifier for the work. It allows the work that is not required to be dropped.
*/
export const doWorkAsync = ({
length,
name,
callback,
done,
batch,
offsetStart,
batchDone,
__pending,
}: {
name: string;
length: number;
callback: Function;
done?: Function;
batchDone?: Function;
batch: number;
offsetStart?: number;
__pending?: boolean;
}) => {
offsetStart = offsetStart || 0;
const stepLength = batch;
const lastIndex = length - 1;
const offsetEndExclusive = offsetStart + stepLength;
batchDone = batchDone || (() => {});
done = done || (() => {});
if (!__pending && data[name]) {
cancelAnimationFrame(data[name]);
}
if (offsetStart >= length) {
done();
return;
}
for (let i = offsetStart; i < offsetEndExclusive && i < length; i++) {
callback(i, offsetEndExclusive > lastIndex);
}
batchDone();
data[name] = requestAnimationFrame(() => {
doWorkAsync({
length,
callback,
batchDone,
name,
batch,
done,
offsetStart: offsetEndExclusive,
__pending: true,
});
});
};

View File

@ -16,17 +16,29 @@ export type GetSlots = {
workingHours: WorkingHours[];
minimumBookingNotice: number;
};
export type WorkingHoursTimeFrame = { startTime: number; endTime: number };
const getMinuteOffset = (date: Dayjs, frequency: number) => {
// Diffs the current time with the given date and iff same day; (handled by 1440) - return difference; otherwise 0
const minuteOffset = Math.min(date.diff(dayjs().utc(), "minute"), 1440) % 1440;
// round down to nearest step
return Math.ceil(minuteOffset / frequency) * frequency;
const splitAvailableTime = (
startTimeMinutes: number,
endTimeMinutes: number,
frequency: number
): Array<WorkingHoursTimeFrame> => {
let initialTime = startTimeMinutes;
const finalizationTime = endTimeMinutes;
const result = [] as Array<WorkingHoursTimeFrame>;
while (initialTime < finalizationTime) {
const periodTime = initialTime + frequency;
result.push({ startTime: initialTime, endTime: periodTime });
initialTime += frequency;
}
return result;
};
const getSlots = ({ inviteeDate, frequency, minimumBookingNotice, workingHours }: GetSlots) => {
// current date in invitee tz
const startDate = dayjs().add(minimumBookingNotice, "minute");
const startOfDay = dayjs.utc().startOf("day");
const startOfInviteeDay = inviteeDate.startOf("day");
// checks if the start date is in the past
if (inviteeDate.isBefore(startDate, "day")) {
return [];
@ -36,33 +48,27 @@ const getSlots = ({ inviteeDate, frequency, minimumBookingNotice, workingHours }
{ utcOffset: -inviteeDate.utcOffset() },
workingHours.map((schedule) => ({
days: schedule.days,
startTime: dayjs.utc().startOf("day").add(schedule.startTime, "minute"),
endTime: dayjs.utc().startOf("day").add(schedule.endTime, "minute"),
startTime: startOfDay.add(schedule.startTime, "minute"),
endTime: startOfDay.add(schedule.endTime, "minute"),
}))
).filter((hours) => hours.days.includes(inviteeDate.day()));
const slots: Dayjs[] = [];
for (let minutes = getMinuteOffset(inviteeDate, frequency); minutes < 1440; minutes += frequency) {
const slot = dayjs(inviteeDate).startOf("day").add(minutes, "minute");
// check if slot happened already
if (slot.isBefore(startDate)) {
continue;
}
// add slots to available slots if it is found to be between the start and end time of the checked working hours.
if (
localWorkingHours.some((hours) =>
slot.isBetween(
inviteeDate.startOf("day").add(hours.startTime, "minute"),
inviteeDate.startOf("day").add(hours.endTime, "minute"),
null,
"[)"
)
)
) {
const slotsTimeFrameAvailable = [] as Array<WorkingHoursTimeFrame>;
// Here we split working hour in chunks for every frequency available that can fit in whole working hour
localWorkingHours.forEach((item, index) => {
slotsTimeFrameAvailable.push(...splitAvailableTime(item.startTime, item.endTime, frequency));
});
slotsTimeFrameAvailable.forEach((item) => {
const slot = startOfInviteeDay.add(item.startTime, "minute");
// Validating slot its not on the past
if (!slot.isBefore(startDate)) {
slots.push(slot);
}
}
});
return slots;
};

View File

@ -45,8 +45,7 @@ export default withTRPC<AppRouter>({
// adds pretty logs to your console in development and logs errors in production
loggerLink({
enabled: (opts) =>
process.env.NODE_ENV === "development" ||
(opts.direction === "down" && opts.result instanceof Error),
!!process.env.NEXT_PUBLIC_DEBUG || (opts.direction === "down" && opts.result instanceof Error),
}),
httpBatchLink({
url: `/api/trpc`,

View File

@ -4,7 +4,7 @@ import { useRouter } from "next/router";
import { FormProvider, SubmitHandler, useForm } from "react-hook-form";
import { asStringOrNull } from "@lib/asStringOrNull";
import { BASE_URL } from "@lib/config/constants";
import { NEXT_PUBLIC_BASE_URL } from "@lib/config/constants";
import { useLocale } from "@lib/hooks/useLocale";
import prisma from "@lib/prisma";
import { isSAMLLoginEnabled } from "@lib/saml";
@ -60,7 +60,7 @@ export default function Signup({ email }: Props) {
.then(
async () =>
await signIn("Cal.com", {
callbackUrl: (`${BASE_URL}/${router.query.callbackUrl}` || "") as string,
callbackUrl: (`${NEXT_PUBLIC_BASE_URL}/${router.query.callbackUrl}` || "") as string,
})
)
.catch((err) => {
@ -130,7 +130,7 @@ export default function Signup({ email }: Props) {
className="w-5/12 justify-center"
onClick={() =>
signIn("Cal.com", {
callbackUrl: (`${BASE_URL}/${router.query.callbackUrl}` || "") as string,
callbackUrl: (`${NEXT_PUBLIC_BASE_URL}/${router.query.callbackUrl}` || "") as string,
})
}>
{t("login_instead")}
@ -184,7 +184,7 @@ export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
return {
redirect: {
permanent: false,
destination: "/auth/login?callbackUrl=" + `${BASE_URL}/${ctx.query.callbackUrl}`,
destination: "/auth/login?callbackUrl=" + `${NEXT_PUBLIC_BASE_URL}/${ctx.query.callbackUrl}`,
},
};
}

View File

@ -22,9 +22,9 @@ const AvailabilityView = ({ user }: { user: User }) => {
function convertMinsToHrsMins(mins: number) {
let h = Math.floor(mins / 60);
let m = mins % 60;
h = h < 10 ? 0 + h : h;
m = m < 10 ? 0 + m : m;
return `${h}:${m}`;
let hs = h < 10 ? "0" + h : h;
let ms = m < 10 ? "0" + m : m;
return `${hs}:${ms}`;
}
useEffect(() => {

View File

@ -100,8 +100,10 @@ export default function Type(props: inferSSRProps<typeof getServerSideProps>) {
className="mb-5 sm:mb-6"
/>
<div className="space-x-2 text-center rtl:space-x-reverse">
<Button color="secondary" onClick={() => router.push("/reschedule/" + uid)}>
{t("reschedule_this")}
</Button>
<Button
color="secondary"
data-testid="cancel"
onClick={async () => {
setLoading(true);
@ -141,9 +143,8 @@ export default function Type(props: inferSSRProps<typeof getServerSideProps>) {
}
}}
loading={loading}>
{t("cancel")}
{t("cancel_event")}
</Button>
<Button onClick={() => router.push("/reschedule/" + uid)}>{t("reschedule")}</Button>
</div>
</div>
)}

View File

@ -159,7 +159,7 @@ const EventTypeList = ({ readOnly, types, profile }: EventTypeListProps): JSX.El
<div className="flex items-center space-x-2 overflow-hidden rtl:space-x-reverse">
{type.users?.length > 1 && (
<AvatarGroup
border="border-white"
border="border-2 border-white"
size={8}
truncateAfter={4}
items={type.users.map((organizer) => ({

View File

@ -146,6 +146,11 @@ function SettingsView(props: ComponentProps<typeof Settings> & { localeProp: str
{ value: "light", label: t("light") },
{ value: "dark", label: t("dark") },
];
const timeFormatOptions = [
{ value: 12, label: t("12_hour") },
{ value: 24, label: t("24_hour") },
];
const usernameRef = useRef<HTMLInputElement>(null!);
const nameRef = useRef<HTMLInputElement>(null!);
const emailRef = useRef<HTMLInputElement>(null!);
@ -153,6 +158,10 @@ function SettingsView(props: ComponentProps<typeof Settings> & { localeProp: str
const avatarRef = useRef<HTMLInputElement>(null!);
const hideBrandingRef = useRef<HTMLInputElement>(null!);
const [selectedTheme, setSelectedTheme] = useState<typeof themeOptions[number] | undefined>();
const [selectedTimeFormat, setSelectedTimeFormat] = useState({
value: props.user.timeFormat || 12,
label: timeFormatOptions.find((option) => option.value === props.user.timeFormat)?.label || 12,
});
const [selectedTimeZone, setSelectedTimeZone] = useState<ITimezone>(props.user.timeZone);
const [selectedWeekStartDay, setSelectedWeekStartDay] = useState({
value: props.user.weekStart,
@ -189,6 +198,7 @@ function SettingsView(props: ComponentProps<typeof Settings> & { localeProp: str
const enteredWeekStartDay = selectedWeekStartDay.value;
const enteredHideBranding = hideBrandingRef.current.checked;
const enteredLanguage = selectedLanguage.value;
const enteredTimeFormat = selectedTimeFormat.value;
// TODO: Add validation
@ -204,6 +214,7 @@ function SettingsView(props: ComponentProps<typeof Settings> & { localeProp: str
theme: asStringOrNull(selectedTheme?.value),
brandColor: enteredBrandColor,
locale: enteredLanguage,
timeFormat: enteredTimeFormat,
});
}
@ -347,6 +358,21 @@ function SettingsView(props: ComponentProps<typeof Settings> & { localeProp: str
/>
</div>
</div>
<div>
<label htmlFor="timeFormat" className="block text-sm font-medium text-gray-700">
{t("time_format")}
</label>
<div className="mt-1">
<Select
id="timeFormatSelect"
value={selectedTimeFormat || props.user.timeFormat}
onChange={(v) => v && setSelectedTimeFormat(v)}
classNamePrefix="react-select"
className="react-select-container mt-1 block w-full rounded-sm border border-gray-300 capitalize shadow-sm focus:border-neutral-800 focus:ring-neutral-800 sm:text-sm"
options={timeFormatOptions}
/>
</div>
</div>
<div>
<label htmlFor="weekStart" className="block text-sm font-medium text-gray-700">
{t("first_day_of_week")}
@ -499,6 +525,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
plan: true,
brandColor: true,
metadata: true,
timeFormat: true,
},
});

View File

@ -42,7 +42,7 @@ function TeamPage({ team }: TeamPageProps) {
</div>
<div className="mt-1">
<AvatarGroup
border="border-white"
border="border-2 border-white"
truncateAfter={4}
className="flex-shrink-0"
size={10}

View File

@ -1,51 +1,106 @@
{
"trial_days_left": "يتبقى لديك $t(day, {\"count\": {{days}} }) في الفترة التجريبية من PRO",
"day": "{{count}} أيام",
"day_plural": "{{count}} أيام",
"upgrade_now": "تحديث الآن",
"accept_invitation": "اقبل الدعوة",
"calcom_explained": "Cal.com هو بديل Calendly مفتوح المصدر الذي يتيح لك التحكم في بياناتك وسير عملك ومظهرك.",
"have_any_questions": "هل لديك أسئلة؟ نحن هنا للمساعدة.",
"reset_password_subject": "Cal.com: إرشادات إعادة تعيين كلمة المرور",
"event_declined_subject": "تم الرفض: {{eventType}} مع {{name}} في {{date}}",
"event_cancelled_subject": "تم الإلغاء: {{eventType}} مع {{name}} في {{date}}",
"event_request_declined": "تم رفض طلب الحدث الخاص بك",
"event_request_cancelled": "تم إلغاء الحدث المجدول",
"organizer": "المنظِّم",
"need_to_reschedule_or_cancel": "هل تحتاج إلى إعادة جدولة أو إلغاء؟",
"cancellation_reason": "سبب الإلغاء",
"cancellation_reason_placeholder": "ما سبب الإلغاء؟ (اختياري)",
"rejection_reason": "سبب الرفض",
"rejection_reason_title": "رفض طلب الحجز؟",
"rejection_reason_description": "هل أنت متأكد من رغبتك في رفض الحجز؟ سنقوم بإبلاغ الشخص الذي حاول الحجز. يمكنك تقديم سبب أدناه.",
"rejection_confirmation": "رفض الحجز",
"manage_this_event": "قم بإدارة هذا الحدث",
"your_event_has_been_scheduled": "تم جدولة الحدث الخاص بك",
"accept_our_license": "اقبل ترخيصنا من خلال تغيير المتغير .env <1>NEXT_PUBLIC_LICENSE_CONSENT</1> إلى '{{agree}}'.",
"remove_banner_instructions": "لإزالة هذا الشعار، يُرجى فتح ملف .env وتغيير متغير <1>NEXT_PUBLIC_LICENSE_CONSENT</1> إلى '{{agree}}'.",
"error_message": "كانت رسالة الخطأ: '{{errorMessage}}'",
"refund_failed_subject": "فشل الاسترداد: {{name}} - {{date}} - {{eventType}}",
"refund_failed": "فشل استرداد مقابل الحدث {{eventType}} مع {{userName}} في {{date}}.",
"check_with_provider_and_user": "يُرجى التحقق مع مزود الدفع و{{user}} بشأن كيفية التعامل مع هذا.",
"a_refund_failed": "فشل الاسترداد",
"awaiting_payment_subject": "في انتظار الدفع: {{eventType}} مع {{name}} في {{date}}",
"meeting_awaiting_payment": "اجتماعك في انتظار الدفع",
"help": "المساعدة",
"price": "السعر",
"paid": "مدفوعة",
"refunded": "تم الاسترداد",
"pay_later_instructions": "لقد تلقيت أيضا رسالة بريد إلكتروني مع هذا الرابط، إذا كنت ترغب في الدفع لاحقاً.",
"payment": "الدفعات",
"missing_card_fields": "حقول البطاقة المفقودة",
"pay_now": "ادفع الآن",
"codebase_has_to_stay_opensource": "يجب أن يظل مصدر البرنامج مفتوح المصدر، سواء تم تعديله أم لا",
"cannot_repackage_codebase": "لا يمكنك إعادة حزم مصدر البيانات أو بيعه",
"acquire_license": "احصل على ترخيص تجاري لإزالة هذه الشروط عن طريق البريد الإلكتروني",
"terms_summary": "ملخص الشروط",
"open_env": "افتح .env ووافق على الترخيص",
"env_changed": "لقد قمت بتغيير .env",
"accept_license": "اقبل الترخيص",
"still_waiting_for_approval": "لا يزال يوجد حدث في انتظار الموافقة",
"event_is_still_waiting": "لا يزال طلب الحدث في انتظار الموافقة: {{attendeeName}} - {{date}} - {{eventType}}",
"no_more_results": "لا يوجد مزيد من النتائج",
"load_more_results": "تحميل المزيد من النتائج",
"integration_meeting_id": "مُعرّف اجتماع {{integrationName}}: {{meetingId}}",
"confirmed_event_type_subject": "تم التأكيد: {{eventType}} مع {{name}} في {{date}}",
"new_event_request": "طلب الحدث الجديد: {{attendeeName}} - {{date}} - {{eventType}}",
"confirm_or_reject_request": "تأكيد الطلب أو رفضه",
"check_bookings_page_to_confirm_or_reject": "تحقق من صفحة الحجوزات لتأكيد الحجز أو رفضه.",
"event_awaiting_approval": "الحدث في انتظار موافقتك",
"someone_requested_an_event": "طلب شخص ما جدولة حدث في تقويمك.",
"someone_requested_password_reset": "طلب شخص ما رابطا لتغيير كلمة المرور الخاصة بك.",
"password_reset_instructions": "إذا لم تطلب هذا، يمكنك تجاهل هذا البريد الإلكتروني بأمان ولن يتم تغيير كلمة المرور الخاصة بك.",
"event_awaiting_approval_subject": "في انتظار الموافقة: {{eventType}} مع {{name}} في {{date}}",
"event_still_awaiting_approval": "الحدث لا يزال في انتظار موافقتك",
"your_meeting_has_been_booked": "لقد تم حجز الاجتماع الخاص بك",
"event_type_has_been_rescheduled_on_time_date": "تمت إعادة جدولة {{eventType}} مع {{name}} إلى {{time}} ({{timeZone}}) في {{date}}.",
"event_has_been_rescheduled": "تم التحديث - تم إعادة جدولة الحدث الخاص بك",
"hi_user_name": "مرحبا {{name}}",
"ics_event_title": "{{eventType}} مع {{name}}",
"new_event_subject": "حدث جديد: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "انضمام بواسطة {{entryPoint}}",
"notes": "ملاحظات",
"manage_my_bookings": "إدارة الحجوزات الخاصة بي",
"need_to_make_a_change": "هل تحتاج لإجراء تغيير؟",
"new_event_scheduled": "تم جدولة حدث جديد.",
"invitee_email": "البريد الإلكتروني للشخص المدعو",
"invitee_timezone": "المنطقة الزمنية للشخص المدعو",
"event_type": "نوع الحدث",
"enter_meeting": "ادخل الاجتماع",
"video_call_provider": "مزود مكالمة الفيديو",
"meeting_id": "رقم تعريف الاجتماع",
"meeting_password": "كلمة سر الاجتماع",
"meeting_url": "رابط الاجتماع",
"meeting_request_rejected": "تم رفض طلبك للاجتماع",
"rescheduled_event_type_subject": "إعادة جدولة: {{eventType}} مع {{name}} في {{date}}",
"rejected_event_type_with_organizer": "تم الرفض: {{eventType}} مع {{organizer}} في {{date}}",
"hi": "مرحبا",
"join_team": "انضم إلى للفريق",
"manage_this_team": "إدارة هذا الفريق",
"team_info": "معلومات الفريق",
"request_another_invitation_email": "إذا كنت تفضل عدم استخدام {{toEmail}} كبريدك الإلكتروني Cal.com أو لديك بالفعل حساب Cal.com ، يرجى طلب دعوة أخرى إلى ذلك البريد الإلكتروني.",
"you_have_been_invited": "تم دعوتك للانضمام إلى الفريق {{teamName}}",
"user_invited_you": "قام {{user}} بدعوتك للانضمام إلى فريق {{team}} على Cal.com",
"hidden_team_member_title": "أنت في الوضع الخفي في هذا الفريق",
"hidden_team_member_message": "لم يتم الدفع مقابل مقعدك، قم إما بالترقية إلى Pro أو بالسماح لمالك الفريق بمعرفة أنه بإمكانه الدفع مقابل مقعدك.",
"hidden_team_owner_message": "تحتاج إلى حساب pro لاستخدام الفرق، أنت في الوضع الخفي حتى تقوم بالترقية.",
"link_expires": "ملاحظة: تنتهي الصلاحية في غضون {{expiresIn}} من الساعات.",
"upgrade_to_per_seat": "الترقية إلى كل مقعد",
"team_upgrade_seats_details": "من بين {{memberCount}} من الأعضاء في فريقك، لم يتم الدفع مقابل {{unpaidCount}} مقعد (مقاعد). عندما يكون السعر ${{seatPrice}} شهريًا لكل مقعد، تبلغ التكلفة الإجمالية المقدرة لعضويتك ${{totalCost}} شهريًا.",
"team_upgraded_successfully": "تمت ترقية فريقك بنجاح!",
"use_link_to_reset_password": "استخدم الرابط أدناه لإعادة تعيين كلمة المرور",
"hey_there": "مرحبًا،",
"forgot_your_password_calcom": "نسيت كلمة المرور الخاصة بك؟ - Cal.com",
"event_type_title": "{{eventTypeTitle}} | نوع الحدث",
"delete_webhook_confirmation_message": "هل تريد بالتأكيد حذف الويبهوك هذا؟ لن تتلقى بيانات اجتماع Cal.com بعد الآن على عنوان URL محدد، في الوقت الفعلي، عندما تتم جدولة حدث أو إلغاؤه.",
"confirm_delete_webhook": "نعم، قم بحذف الويبهوك",
"edit_webhook": "تعديل الويبهوك",
"delete_webhook": "حذف الويب هوك",
@ -57,5 +112,550 @@
"manage_your_webhook": "إدارة الويبهوك الخاص بك",
"webhook_created_successfully": "تم إنشاء الويبهوك بنجاح!",
"webhook_updated_successfully": "تم تحديث الويبهوك بنجاح!",
"webhook_removed_successfully": "تمت إزالة الويبهوك بنجاح!"
"webhook_removed_successfully": "تمت إزالة الويبهوك بنجاح!",
"payload_template": "قالب الحمولة",
"dismiss": "تجاهل",
"no_data_yet": "لا توجد بيانات حتى الآن",
"ping_test": "اختبار الاتصال",
"add_to_homescreen": "أضف هذا التطبيق إلى الشاشة الرئيسية للوصول بصورة أسرع وتحسين التجربة.",
"upcoming": "القادم",
"past": "السابق",
"choose_a_file": "اختر ملفًا...",
"upload_image": "تحميل صورة",
"upload_target": "تحميل {{target}}",
"no_target": "لا يوجد {{target}}",
"slide_zoom_drag_instructions": "قم بالتمرير للتكبير واسحب لتغيير الموضع",
"view_notifications": "عرض الإشعارات",
"view_public_page": "عرض الصفحة العامة",
"sign_out": "تسجيل الخروج",
"add_another": "أضف واحدًا آخر",
"until": "حتى",
"powered_by": "التشغيل بواسطة",
"unavailable": "غير متاح",
"set_work_schedule": "ضع جدول عملك",
"change_bookings_availability": "قم بتغيير الوقت الذي تكون فيه متاحًا للحجوزات",
"select": "حدد...",
"2fa_confirm_current_password": "قم بتأكيد كلمة المرور الحالية للبدء.",
"2fa_scan_image_or_use_code": "امسح الصورة أدناه ضوئيًا باستخدام تطبيق المصادقة على هاتفك أو أدخل رمز النص يدويًا بدلاً من ذلك.",
"text": "النص",
"multiline_text": "النص متعدد السطور",
"number": "الرقم",
"checkbox": "مربع الاختيار",
"is_required": "مطلوب",
"required": "مطلوب",
"input_type": "نوع الإدخال",
"rejected": "تم الرفض",
"unconfirmed": "غير مؤكد",
"guests": "الضيوف",
"guest": "الضيف",
"web_conferencing_details_to_follow": "تفاصيل مؤتمرات الويب للمتابعة.",
"the_username": "اسم المستخدم",
"username": "اسم المستخدم",
"is_still_available": "لا يزال متاحًا.",
"documentation": "المستندات",
"documentation_description": "تعرف على كيفية دمج أدواتنا مع تطبيقك",
"api_reference": "مرجع واجهة برمجة التطبيقات",
"api_reference_description": "مرجع واجهة برمجة تطبيقات كامل لمكتبتنا",
"blog": "المدونة",
"blog_description": "اقرأ أحدث أخبارنا ومقالاتنا",
"join_our_community": "انضم إلى مجتمعنا",
"join_our_slack": "انضم إلى فترة السماح لدينا",
"claim_username_and_schedule_events": "طالب باسم المستخدم وجدولة الأحداث",
"popular_pages": "الصفحات الشائعة",
"register_now": "تسجيل الآن",
"register": "تسجيل",
"page_doesnt_exist": "هذه الصفحة غير موجودة.",
"check_spelling_mistakes_or_go_back": "تحقق من الأخطاء الإملائية أو ارجع إلى الصفحة السابقة.",
"404_page_not_found": "404: تعذر العثور على هذه الصفحة.",
"getting_started": "البدء",
"15min_meeting": "اجتماع لمدة 15 دقيقة",
"30min_meeting": "اجتماع لمدة 30 دقيقة",
"secret_meeting": "اجتماع سري",
"login_instead": "تسجيل الدخول بدلاً من ذلك",
"already_have_an_account": "هل لديك حساب بالفعل؟",
"create_account": "إنشاء حساب",
"confirm_password": "تأكيد كلمة المرور",
"create_your_account": "إنشاء حساب",
"sign_up": "تسجيل الاشتراك",
"youve_been_logged_out": "لقد قمت بتسجيل الخروج",
"hope_to_see_you_soon": "نأمل أن نراك قريبًا مجددًا!",
"logged_out": "تم تسجيل الخروج",
"please_try_again_and_contact_us": "يُرجى المحاولة مجددًا والاتصال بنا إذا استمرت المشكلة.",
"incorrect_2fa_code": "الرمز المكون من عاملين غير صحيح.",
"no_account_exists": "لا يوجد حساب مطابق لعنوان البريد الإلكتروني هذا.",
"2fa_enabled_instructions": "تم تمكين المصادقة من عاملين. يُرجى إدخال الرمز المكون من ستة أرقام من تطبيق المصادقة لديك.",
"2fa_enter_six_digit_code": "أدخل الرمز المكون من ستة أرقام من تطبيق المصادقة أدناه.",
"create_an_account": "إنشاء حساب",
"dont_have_an_account": "أليس لديك حساب؟",
"2fa_code": "الرمز المكون من عاملين",
"sign_in_account": "تسجيل الدخول إلى حسابك",
"sign_in": "تسجيل الدخول",
"go_back_login": "العودة إلى صفحة تسجيل الدخول",
"error_during_login": "حدث خطأ ما أثناء تسجيل الدخول. ارجع إلى شاشة تسجيل الدخول وحاول مجددًا.",
"request_password_reset": "اطلب إعادة تعيين كلمة المرور",
"forgot_password": "نسيت كلمة المرور",
"forgot": "هل نسيت؟",
"done": "تم",
"check_email_reset_password": "تحقق من البريد الإلكتروني. لقد أرسلنا رابطًا لإعادة تعيين كلمة المرور.",
"finish": "إنهاء",
"few_sentences_about_yourself": "اكتب بضع جمل عن نفسك. سيظهر هذا على صفحة عنوان url الشخصية لديك.",
"nearly_there": "على وشك الانتهاء",
"nearly_there_instructions": "آخر شيء، تساعدك كتابة وصف موجز عنك ووضع صورة على الحصول على الحجوزات وإعلام الأشخاص بمَن سيحجزون معه حقًا.",
"set_availability_instructions": "حدد نطاقات الوقت عندما تكون متاحًا على أساس متكرر. يمكنك إنشاء المزيد منها لاحقًا وتعيينها لتقويمات مختلفة.",
"set_availability": "تحديد الوقت الذي تكون فيه متاحًا",
"continue_without_calendar": "المتابعة من دون تقويم",
"connect_your_calendar": "توصيل التقويم لديك",
"connect_your_calendar_instructions": "قم بتوصيل التقويم لديك للتحقق تلقائيًا من الأوقات المشغولة والأحداث الجديدة أثناء جدولتها.",
"set_up_later": "الإعداد لاحقًا",
"current_time": "الوقت الحالي",
"welcome": "مرحبًا",
"welcome_to_calcom": "مرحبًا بك في Cal.com",
"welcome_instructions": "أخبرنا باسمك وبالمنطقة الزمنية التي توجد فيها. ستتمكن من تحرير هذا لاحقًا.",
"connect_caldav": "الاتصال بخادم CalDav",
"credentials_stored_and_encrypted": "سيتم تخزين بيانات الاعتماد الخاصة بك وتشفيرها.",
"connect": "اتصال",
"try_for_free": "جرّبه مجانًا",
"create_booking_link_with_calcom": "أنشئ رابط الحجز الخاص بك باستخدام Cal.com",
"who": "مَن",
"what": "ماذا",
"when": "متى",
"where": "أين",
"add_to_calendar": "إضافة إلى التقويم",
"other": "آخر",
"emailed_you_and_attendees": "لقد أرسلنا إليك وإلى الحضور الآخرين دعوة تتضمن كل التفاصيل عبر البريد الإلكتروني.",
"emailed_you_and_any_other_attendees": "تم إرسال هذه المعلومات إليك وإلى الحضور الآخرين عبر البريد الإلكتروني.",
"needs_to_be_confirmed_or_rejected": "لا يزال الحجز الخاص بك يحتاج إلى التأكيد أو الرفض.",
"user_needs_to_confirm_or_reject_booking": "لا يزال {{user}} يحتاج إلى تأكيد الحجز أو رفضه.",
"meeting_is_scheduled": "تمت جدولة هذا الاجتماع",
"submitted": "تم إرسال الحجز الخاص بك",
"booking_submitted": "تم إرسال الحجز الخاص بك",
"booking_confirmed": "تم تأكيد الحجز الخاص بك",
"enter_new_password": "أدخل كلمة المرور الجديدة التي ترغب في تعيينها لحسابك.",
"reset_password": "إعادة تعيين كلمة المرور",
"change_your_password": "تغيير كلمة المرور",
"try_again": "حاول مجددًا",
"request_is_expired": "انتهت صلاحية هذا الطلب.",
"reset_instructions": "أدخل عنوان البريد الإلكتروني المرتبط بحسابك وسنرسل إليك رابطًا لإعادة تعيين كلمة المرور.",
"request_is_expired_instructions": "انتهت صلاحية هذا الطلب. قم بالعودة وأدخل البريد الإلكتروني المرتبط بحسابك وسنرسل إليك رابطًا آخر لإعادة تعيين كلمة المرور.",
"whoops": "عذرًا",
"login": "تسجيل الدخول",
"success": "تم بنجاح",
"failed": "فشل",
"password_has_been_reset_login": "تمت إعادة تعيين كلمة المرور الخاصة بك. يمكنك الآن تسجيل الدخول باستخدام كلمة المرور التي تم إنشاؤها حديثًا.",
"unexpected_error_try_again": "حدث خطأ غير متوقع. حاول مجددًا.",
"sunday_time_error": "وقت غير صالح يوم الأحد",
"monday_time_error": "وقت غير صالح يوم الاثنين",
"tuesday_time_error": "وقت غير صالح يوم الثلاثاء",
"wednesday_time_error": "وقت غير صالح يوم الأربعاء",
"thursday_time_error": "وقت غير صالح يوم الخميس",
"friday_time_error": "وقت غير صالح يوم الجمعة",
"saturday_time_error": "وقت غير صالح يوم السبت",
"error_end_time_before_start_time": "لا يمكن أن يكون وقت الانتهاء قبل وقت البدء",
"error_end_time_next_day": "لا يمكن أن يكون وقت الانتهاء أكبر من 24 ساعة",
"back_to_bookings": "العودة إلى الحجوزات",
"free_to_pick_another_event_type": "لا تتردد في اختيار حدث آخر في أي وقت.",
"cancelled": "تم الإلغاء",
"cancellation_successful": "تم الإلغاء بنجاح",
"really_cancel_booking": "هل تريد حقًا إلغاء الحجز؟",
"cannot_cancel_booking": "لا يمكنك إلغاء هذا الحجز",
"reschedule_instead": "بدلاً من ذلك، يمكنك أيضًا إعادة جدولته.",
"event_is_in_the_past": "الحدث في الماضي",
"error_with_status_code_occured": "حدث خطأ في رمز الحالة {{status}}.",
"booking_already_cancelled": "تم إلغاء هذا الحجز بالفعل",
"go_back_home": "العودة إلى الشاشة الرئيسية",
"or_go_back_home": "أو العودة إلى الشاشة الرئيسية",
"no_availability": "غير متاح",
"no_meeting_found": "لم يتم العثور على اجتماعات",
"no_meeting_found_description": "هذا الاجتماع غير موجود. اتصل بمالك الاجتماع للحصول على الرابط المُحدَّث.",
"no_status_bookings_yet": "لا توجد حجوزات {{status}} حتى الآن",
"no_status_bookings_yet_description": "ليست لديك حجوزات {{status}}. {{description}}",
"event_between_users": "{{eventName}} بين {{host}} و{{attendeeName}}",
"bookings": "الحجوزات",
"bookings_description": "اطلع على الأحداث القادمة والسابقة المحجوزة من خلال روابط نوع الحدث.",
"upcoming_bookings": "بمجرد أن يحجز شخص ما موعدًا معك، سيظهر هنا.",
"past_bookings": "ستظهر حجوزاتك السابقة هنا.",
"cancelled_bookings": "ستظهر حجوزاتك التي تم إلغاؤها هنا.",
"on": "في",
"and": "و",
"calendar_shows_busy_between": "يظهر التقويم أنك مشغول بين",
"troubleshoot": "استكشاف الأخطاء وإصلاحها",
"troubleshoot_description": "فهم سبب توفر أوقات معينة وحظر أوقات أخرى.",
"overview_of_day": "إليك نظرة عامة على يومك في",
"hover_over_bold_times_tip": "نصيحة: قم بالمرور فوق الأوقات المكتوبة بخط غامق للحصول على طابع زمني كامل",
"start_time": "وقت البدء",
"end_time": "وقت الانتهاء",
"buffer": "المخزن المؤقت",
"your_day_starts_at": "يبدأ يومك في",
"your_day_ends_at": "ينتهي يومك في",
"launch_troubleshooter": "تشغيل مستكشف الأخطاء وإصلاحها",
"troubleshoot_availability": "استكشف الأخطاء المتعلقة بأوقات إتاحتك وأصلحها لمعرفة السبب وراء ظهور أوقاتك كما هي.",
"change_available_times": "تغيير الأوقات المتاحة",
"change_your_available_times": "قم بتغيير الأوقات المتاحة",
"change_start_end": "قم بتغيير أوقات البدء والانتهاء في يومك",
"change_start_end_buffer": "قم بتعيين وقت البدء ووقت الانتهاء ليومك والحد الأدنى للوقت الاحتياطي بين اجتماعاتك.",
"current_start_date": "حاليًا، تم تعيين وقت بدء يومك في",
"start_end_changed_successfully": "تم تغيير أوقات البدء والانتهاء في يومك بنجاح.",
"and_end_at": "وينتهي في",
"light": "فاتح",
"dark": "داكن",
"automatically_adjust_theme": "ضبط السمة تلقائيًا استنادًا إلى تفضيلات المدعوين",
"email": "البريد الإلكتروني",
"email_placeholder": "jdoe@example.com",
"full_name": "الاسم بالكامل",
"browse_api_documentation": "استعراض مستندات واجهة برمجة التطبيقات",
"leverage_our_api": "استفد من واجهة برمجة التطبيقات لدينا للتحكم والتخصيص بالكامل.",
"create_webhook": "إنشاء ويبهوك",
"booking_cancelled": "تم إلغاء الحجز",
"booking_rescheduled": "تمت إعادة جدولة الحجز",
"booking_created": "تم إنشاء الحجز",
"event_triggers": "مشغلات الحدث",
"subscriber_url": "عنوان Url للمشترك",
"create_new_webhook": "إنشاء ويبهوك جديد",
"create_new_webhook_to_account": "إنشاء ويبهوك جديد لحسابك",
"new_webhook": "ويبهوك جديد",
"receive_cal_meeting_data": "تلقَّ بيانات اجتماع Cal على عنوان URL محدد، في الوقت الفعلي، عندما تتم إعادة جدولة حدث ما أو يتم إلغاؤه.",
"responsive_fullscreen_iframe": "إطار iframe سريع الاستجابة بكامل الشاشة",
"loading": "جارٍ التحميل...",
"standard_iframe": "إطار iframe القياسي",
"iframe_embed": "تضمين إطار iframe",
"embed_calcom": "أسهل طريقة لتضمين Cal.com على موقع الويب لديك.",
"integrate_using_embed_or_webhooks": "تكامل مع موقع الويب لديك باستخدام خيارات التضمين لدينا أو احصل على معلومات الحجز في الوقت الفعلي باستخدام روابط ويبهوك المخصصة.",
"schedule_a_meeting": "جدولة اجتماع",
"view_and_manage_billing_details": "عرض تفاصيل الفوترة وإدارتها",
"view_and_edit_billing_details": "عرض تفاصيل الفوترة وتحريرها، بالإضافة إلى إلغاء الاشتراك.",
"go_to_billing_portal": "انتقل إلى بوابة الفوترة",
"need_anything_else": "هل تحتاج إلى أي شيء آخر؟",
"further_billing_help": "إذا كنت تحتاج إلى أي مساعدة إضافية في الفوترة، فإن فريق الدعم لدينا في انتظارك لتقديم المساعدة.",
"contact_our_support_team": "الاتصال بفريق الدعم لدينا",
"uh_oh": "عذرًا!",
"no_event_types_have_been_setup": "لم يقم هذا المستخدم بإعداد أي أنواع للحدث حتى الآن.",
"edit_logo": "تحرير الشعار",
"upload_a_logo": "تحميل شعار",
"remove_logo": "إزالة الشعار",
"enable": "تمكين",
"code": "الرمز",
"code_is_incorrect": "الرمز غير صحيح.",
"add_an_extra_layer_of_security": "أضف طبقة أمان إضافية إلى حسابك في حال سرقة كلمة المرور الخاصة بك.",
"2fa": "المصادقة المكونة من عاملين",
"enable_2fa": "تمكين المصادقة المكونة من عاملين",
"disable_2fa": "تعطيل المصادقة المكونة من عاملين",
"disable_2fa_recommendation": "إذا كنت بحاجة إلى تعطيل المصادقة المكونة من عاملين، فنوصيك بإعادة تمكينها في أقرب وقت ممكن.",
"error_disabling_2fa": "خطأ في تعطيل المصادقة المكونة من عاملين",
"error_enabling_2fa": "خطأ في إعداد المصادقة المكونة من عاملين",
"security": "الأمان",
"manage_account_security": "إدارة أمان حسابك.",
"password": "كلمة المرور",
"password_updated_successfully": "تم تحديث كلمة المرور بنجاح",
"password_has_been_changed": "تم تغيير كلمة المرور بنجاح.",
"error_changing_password": "خطأ في تغيير كلمة المرور",
"something_went_wrong": "حدث خطأ ما.",
"something_doesnt_look_right": "هل ثمة شيء لا يبدو صحيحًا؟",
"please_try_again": "يُرجى المحاولة مجددًا.",
"super_secure_new_password": "كلمة المرور الجديدة ذات الأمان الممتاز",
"new_password": "كلمة المرور الجديدة",
"your_old_password": "كلمة المرور القديمة",
"current_password": "كلمة المرور الحالية",
"change_password": "تغيير كلمة المرور",
"new_password_matches_old_password": "تتطابق كلمة المرور الجديدة مع كلمة المرور القديمة. يُرجى اختيار كلمة مرور مختلفة.",
"current_incorrect_password": "كلمة المرور الحالية غير صحيحة",
"incorrect_password": "كلمة المرور غير صحيحة.",
"1_on_1": "فردي",
"24_h": "24 ساعة",
"use_setting": "استخدام الإعدادات",
"am_pm": "صباحًا/مساءً",
"time_options": "خيارات الوقت",
"january": "يناير",
"february": "فبراير",
"march": "مارس",
"april": "إبريل",
"may": "مايو",
"june": "يونيو",
"july": "يوليو",
"august": "أغسطس",
"september": "سبتمبر",
"october": "أكتوبر",
"november": "نوفمبر",
"december": "ديسمبر",
"monday": "الاثنين",
"tuesday": "الثلاثاء",
"wednesday": "الأربعاء",
"thursday": "الخميس",
"friday": "الجمعة",
"saturday": "السبت",
"sunday": "الأحد",
"all_booked_today": "تم حجز الكل اليوم.",
"slots_load_fail": "تعذر تحميل الفترات الزمنية المتاحة.",
"additional_guests": "مزيد من الضيوف الإضافيين",
"your_name": "اسمك",
"email_address": "عنوان البريد الإلكتروني",
"location": "الموقع",
"yes": "نعم",
"no": "لا",
"additional_notes": "ملاحظات إضافية",
"booking_fail": "تعذر حجز الاجتماع.",
"reschedule_fail": "تعذرت إعادة جدولة الاجتماع.",
"share_additional_notes": "يُرجى مشاركة أي شيء من شأنه المساعدة على التحضير لاجتماعنا.",
"booking_confirmation": "قم بتأكيد {{eventTypeTitle}} مع {{profileName}}",
"booking_reschedule_confirmation": "أعد جدولة {{eventTypeTitle}} مع {{profileName}}",
"in_person_meeting": "الرابط أو الاجتماع الشخصي",
"phone_call": "المكالمة الهاتفية",
"phone_number": "رقم الهاتف",
"enter_phone_number": "أدخل رقم الهاتف",
"reschedule": "إعادة الجدولة",
"book_a_team_member": "حجز عضو في الفريق بدلاً من ذلك",
"or": "أو",
"go_back": "العودة",
"email_or_username": "البريد الإلكتروني أو اسم المستخدم",
"send_invite_email": "إرسال دعوة عبر البريد الإلكتروني",
"role": "الدور",
"edit_role": "تحرير الدور",
"edit_team": "تحرير الفريق",
"reject": "رفض",
"accept": "قبول",
"leave": "خروج",
"profile": "الملف الشخصي",
"my_team_url": "عنوان URL الخاص بفريقي",
"team_name": "اسم الفريق",
"your_team_name": "اسم فريقك",
"team_updated_successfully": "تم تحديث الفريق بنجاح",
"your_team_updated_successfully": "تم تحديث فريقك بنجاح.",
"about": "حول",
"team_description": "اكتب بضع جمل عن فريقك. سيظهر هذا على صفحة عنوان URL الخاصة بفريقك.",
"members": "الأعضاء",
"member": "العضو",
"owner": "المالك",
"admin": "المسؤول",
"new_member": "العضو الجديد",
"invite": "دعوة",
"invite_new_member": "دعوة عضو جديد",
"invite_new_team_member": "دعوة شخص ما إلى فريقك.",
"change_member_role": "تغيير دور العضو في الفريق",
"disable_cal_branding": "تعطيل علامة Cal.com التجارية",
"disable_cal_branding_description": "إخفاء كل علامات Cal.com التجارية من الصفحات العامة.",
"danger_zone": "منطقة الخطر",
"back": "عودة",
"cancel": "إلغاء",
"continue": "تابع",
"confirm": "تأكيد",
"disband_team": "حل الفريق",
"disband_team_confirmation_message": "هل تريد بالتأكيد حل هذا الفريق؟ لن يتمكن أي شخص قمت بمشاركة رابط هذا الفريق معه من الحجز باستخدامه بعد الآن.",
"remove_member_confirmation_message": "هل تريد بالتأكيد إزالة هذا العضو من الفريق؟",
"confirm_disband_team": "نعم، حل الفريق",
"confirm_remove_member": "نعم، إزالة العضو",
"remove_member": "إزالة العضو",
"manage_your_team": "إدارة الفريق",
"no_teams": "ليس لديك أي فرق حتى الآن.",
"no_teams_description": "تسمح الفرق للآخرين بحجز الأحداث المشتركة بين زملائك في العمل.",
"submit": "إرسال",
"delete": "حذف",
"update": "تحديث",
"save": "حفظ",
"pending": "معلّق",
"open_options": "فتح الخيارات",
"copy_link": "نسخ الرابط إلى الحدث",
"share": "مشاركة",
"share_event": "هل تمانع في حجز cal أو إرسال الرابط إليّ؟",
"copy_link_team": "نسخ الرابط إلى الفريق",
"leave_team": "الخروج من الفريق",
"confirm_leave_team": "نعم، الخروج من الفريق",
"leave_team_confirmation_message": "هل تريد بالتأكيد الخروج من هذا الفريق؟ لن تتمكن بعد الآن من الحجز باستخدامه.",
"user_from_team": "{{user}} من {{team}}",
"preview": "معاينة",
"link_copied": "تم نسخ الرابط!",
"link_shared": "تمت مشاركة الرابط!",
"title": "العنوان",
"description": "الوصف",
"quick_video_meeting": "اجتماع سريع عبر الفيديو.",
"scheduling_type": "نوع الجدولة",
"preview_team": "معاينة الفريق",
"collective": "جماعي",
"collective_description": "جدولة الاجتماعات عندما يكون جميع أعضاء الفريق المحددين متاحين.",
"duration": "المدة",
"minutes": "الدقائق",
"round_robin": "الترتيب الدوري",
"round_robin_description": "انتقل عبر الاجتماعات بين أعضاء الفريق المتعددين.",
"url": "عنوان URL",
"hidden": "مخفي",
"readonly": "للقراءة فقط",
"plan_description": "أنت حاليًا في خطة {{plan}}.",
"plan_upgrade_invitation": "قم بترقية حسابك إلى خطة pro لفتح كل الميزات التي نقدمها.",
"plan_upgrade": "تحتاج إلى ترقية خطتك للحصول على أكثر من نوع حدث واحد نشط.",
"plan_upgrade_teams": "تحتاج إلى ترقية خطتك لإنشاء فريق.",
"plan_upgrade_instructions": "يمكنك <1>الترقية هنا</1>.",
"event_types_page_title": "أنواع الحدث",
"event_types_page_subtitle": "قم بإنشاء أحداث لمشاركتها حتى يتسنى للأشخاص الحجز في التقويم الخاص بك.",
"new_event_type_btn": "نوع حدث جديد",
"new_event_type_heading": "إنشاء نوع الحدث الأول لديك",
"new_event_type_description": "تتيح لك أنواع الأحداث مشاركة الروابط التي تعرض الأوقات المتاحة في تقويمك وتسمح للأشخاص بإجراء حجوزات معك.",
"new_event_title": "إضافة نوع حدث جديد",
"new_event_subtitle": "قم بإنشاء نوع حدث يندرج تحت اسمك أو أحد الفرق.",
"new_team_event": "إضافة نوع حدث لفريق جديد",
"new_event_description": "قم بإنشاء نوع حدث جديد للأشخاص لحجز أوقات معهم.",
"event_type_created_successfully": "تم إنشاء نوع الحدث {{eventTypeTitle}} بنجاح",
"event_type_updated_successfully": "تم تحديث نوع الحدث {{eventTypeTitle}} بنجاح",
"event_type_deleted_successfully": "تم حذف نوع الحدث بنجاح",
"web3_metamask_added": "تمت إضافة Metamask بنجاح",
"web3_metamask_disconnected": "تم فصل Metamask بنجاح",
"hours": "ساعات",
"your_email": "بريدك الإلكتروني",
"change_avatar": "تغيير الصورة الرمزية",
"language": "اللغة",
"timezone": "المنطقة الزمنية",
"first_day_of_week": "أول يوم في الأسبوع",
"single_theme": "موضوع واحد",
"brand_color": "لون العلامة التجارية",
"file_not_named": "لم تتم تسمية الملف [idOrSlug]/[user]",
"create_team": "إنشاء فريق",
"name": "الاسم",
"create_new_team_description": "قم بإنشاء فريق جديد للتعاون مع المستخدمين.",
"create_new_team": "إنشاء فريق جديد",
"open_invitations": "فتح الدعوات",
"new_team": "فريق جديد",
"create_first_team_and_invite_others": "قم بإنشاء فريقك الأول ودعوة المستخدمين الآخرين للعمل معك.",
"create_team_to_get_started": "إنشاء فريق للبدء",
"teams": "الفرق",
"team_billing": "الفوترة الخاصة بالفريق",
"upgrade_to_flexible_pro_title": "لقد قمنا بتغيير الفوترة الخاصة بالفرق",
"upgrade_to_flexible_pro_message": "ثمة أعضاء في فريق لا يملكون مقعدًا. قم بترقية خطتك الاحترافية لتوفير المقاعد المفقودة.",
"changed_team_billing_info": "بدءًا من يناير 2022، سنفرض رسومًا على كل مقعد لأعضاء الفريق. يتمتع أعضاء فريقك الذين لديهم خطة Pro مجانًا الآن بفترة تجريبية مدتها 14 يومًا. بمجرد انتهاء الفترة التجريبية الخاصة بهم، سيتم إخفاء هؤلاء الأعضاء من فريقك ما لم تقم بالترقية الآن.",
"create_manage_teams_collaborative": "قم بإنشاء الفرق وإدارتها لاستخدام الميزات المساعدة.",
"only_available_on_pro_plan": "لا تتوفر هذه الميزة إلا في خطة Pro",
"remove_cal_branding_description": "لإزالة العلامة التجارية لخدمة Cal من صفحات الحجوزات، تجب ترقية حسابك إلى حساب Pro.",
"edit_profile_info_description": "قم بتعديل معلومات ملفك الشخصي التي يتم عرضها على رابط الجدولة.",
"change_email_tip": "قد تحتاج إلى تسجيل الخروج والعودة مجددًا لرؤية التغييرات التي تم تنفيذها.",
"little_something_about": "نبذة عن نفسك.",
"profile_updated_successfully": "تم تحديث الملف الشخصي بنجاح",
"your_user_profile_updated_successfully": "تم تحديث الملف الشخصي للمستخدم الخاص بك بنجاح.",
"user_cannot_found_db": "يبدو أن المستخدم قد سجل الدخول ولكن لا يمكن العثور عليه في قاعدة البيانات",
"embed_and_webhooks": "التضمين والإخطارات على الويب",
"enabled": "تم التمكين",
"disabled": "تم التعطيل",
"disable": "تعطيل",
"billing": "الفوترة",
"manage_your_billing_info": "قم بإدارة معلومات الفوترة لديك وإلغاء اشتراكك.",
"availability": "التوفر",
"availability_updated_successfully": "تم تحديث التوفر بنجاح",
"configure_availability": "قم بتكوين الأوقات التي تتوفر فيها خدماتك للحجز.",
"change_weekly_schedule": "قم بتغيير جدولك الأسبوعي",
"logo": "الشعار",
"error": "خطأ",
"team_logo": "شعار الفريق",
"add_location": "إضافة موقع",
"attendees": "الحاضرون",
"add_attendees": "إضافة الحاضرين",
"show_advanced_settings": "عرض الإعدادات المتقدمة",
"event_name": "اسم الحدث",
"event_name_tooltip": "الاسم الذي سيظهر في التقويمات",
"meeting_with_user": "الاجتماع مع {USER}",
"additional_inputs": "إدخالات إضافية",
"label": "التسمية",
"placeholder": "العنصر النائب",
"type": "النوع",
"edit": "تعديل",
"add_input": "إضافة إدخال",
"opt_in_booking": "حجز الاشتراك",
"opt_in_booking_description": "يجب التأكيد على الحجز يدويًا قبل دفعه إلى التكاملات وإرسال رسالة تأكيد عبر البريد الإلكتروني.",
"disable_guests": "تعطيل خاصية الضيوف",
"disable_guests_description": "قم بتعطيل إضافة مزيد من الضيوف أثناء الحجز.",
"invitees_can_schedule": "يمكن جدولة أوقات المدعوين",
"date_range": "النطاق الزمني",
"calendar_days": "أيام التقويم",
"business_days": "أيام العمل",
"set_address_place": "تعيين عنوان أو مكان",
"cal_invitee_phone_number_scheduling": "سيطلب Cal من المدعو لديك إدخال رقم الهاتف قبل الجدولة.",
"cal_provide_google_meet_location": "سيوفر Cal موقعًا لخدمة Google Meet.",
"cal_provide_zoom_meeting_url": "سيوفر Cal رابطًا للاجتماع عبر Zoom.",
"cal_provide_tandem_meeting_url": "سيوفر Cal رابطًا للاجتماع عبر Tandem.",
"cal_provide_video_meeting_url": "سيوفر Cal رابطًا للاجتماع عبر الفيديو على Daily.",
"cal_provide_jitsi_meeting_url": "سنقوم بإنشاء رابط إلى Jitsi Meet من أجلك.",
"cal_provide_huddle01_meeting_url": "سيوفر Cal رابطًا للاجتماع عبر الفيديو على Huddle01 web3.",
"require_payment": "يلزم الدفع",
"commission_per_transaction": "عمولة لكل معاملة",
"event_type_updated_successfully_description": "تم تحديث نوع الحدث لديك بنجاح.",
"hide_event_type": "إخفاء نوع الحدث",
"edit_location": "تعديل الموقع",
"into_the_future": "في المستقبل",
"within_date_range": "ضمن نطاق زمني",
"indefinitely_into_future": "إلى أجل غير مسمى في المستقبل",
"this_input_will_shown_booking_this_event": "سيتم عرض هذا الإدخال عند حجز هذا الحدث",
"add_new_custom_input_field": "إضافة مجال إدخال مخصص جديد",
"quick_chat": "أداة الدردشة السريعة",
"add_new_team_event_type": "إضافة نوع حدث لفريق جديد",
"add_new_event_type": "إضافة نوع حدث جديد",
"new_event_type_to_book_description": "قم بإنشاء نوع حدث جديد للأشخاص لحجز أوقات معهم.",
"length": "الطول",
"minimum_booking_notice": "الحد الأدنى من إشعار الحجز",
"slot_interval": "فواصل الفترات الزمنية",
"slot_interval_default": "استخدام طول الحدث (الوضع الافتراضي)",
"delete_event_type_description": "هل تريد بالتأكيد حذف هذا النوع من الأحداث؟ لن يتمكن أي شخص قمت بمشاركة هذا الرابط معه من الحجز باستخدامه بعد الآن.",
"delete_event_type": "حذف نوع الحدث",
"confirm_delete_event_type": "نعم، احذف نوع الحدث",
"delete_account": "حذف الحساب",
"confirm_delete_account": "نعم، احذف الحساب",
"delete_account_confirmation_message": "هل تريد بالتأكيد حذف حساب Cal.com؟ لن يتمكن أي شخص قمت بمشاركة رابط حسابك معه من الحجز باستخدامه وسيتم فقدان أي تفضيلات قمت بحفظها.",
"integrations": "التكاملات",
"settings": "الإعدادات",
"event_type_moved_successfully": "تم نقل نوع الحدث بنجاح",
"next_step": "تخطي الخطوة",
"prev_step": "الخطوة السابقة",
"installed": "تم التثبيت",
"disconnect": "فصل",
"embed_your_calendar": "تضمين تقويمك في صفحة الويب لديك",
"connect_your_favourite_apps": "قم بتوصيل تطبيقاتك المفضلة.",
"automation": "الأتمتة",
"configure_how_your_event_types_interact": "قم بتكوين كيفية تفاعل نوع الأحداث مع تقويماتك.",
"select_destination_calendar": "إنشاء أحداث في",
"connect_an_additional_calendar": "توصيل تقويم إضافي",
"conferencing": "المؤتمرات",
"calendar": "التقويم",
"not_installed": "لم يتم التثبيت",
"error_password_mismatch": "كلمات المرور غير متطابقة.",
"error_required_field": "هذا الحقل مطلوب.",
"status": "الحالة",
"team_view_user_availability": "عرض توفر المستخدم",
"team_view_user_availability_disabled": "يحتاج المستخدم إلى قبول الدعوة لعرض التوفر",
"set_as_away": "تعيين حالتك على بالخارج",
"set_as_free": "تعطيل حالة بالخارج",
"user_away": "هذا المستخدم في حالة بالخارج حاليًا.",
"user_away_description": "الشخص الذي تحاول حجز خدماته قام بتعيين حالته على بالخارج، ومن ثم لا يقبل حجوزات جديدة.",
"meet_people_with_the_same_tokens": "الاجتماع مع الأشخاص باستخدام الرموز المميزة نفسها",
"only_book_people_and_allow": "ما عليك سوى إجراء حجز والسماح بالحجوزات التي تتم من قِبل الأشخاص الذين يشاركون الرموز المميزة نفسها أو DAOs أو NFTs.",
"saml_config_deleted_successfully": "تم حذف عملية تكوين SAML بنجاح",
"account_created_with_identity_provider": "تم إنشاء حسابك باستخدام موفر هوية.",
"account_managed_by_identity_provider": "تتم إدارة حسابك بواسطة {{provider}}",
"account_managed_by_identity_provider_description": "لتغيير بريدك الإلكتروني وكلمة المرور وتمكين المصادقة ثنائية العوامل والمزيد، يُرجى زيارة إعدادات حساب {{provider}} لديك.",
"signin_with_google": "تسجيل الدخول إلى Google",
"signin_with_saml": "تسجيل الدخول إلى SAML",
"saml_configuration": "تكوين SAML",
"delete_saml_configuration": "حذف تكوين SAML",
"delete_saml_configuration_confirmation_message": "هل تريد بالتأكيد حذف تكوين SAML؟ لن يتمكن أعضاء فريقك الذين يستخدمون تسجيل الدخول إلى SAML من الوصول إلى Cal.com بعد الآن.",
"confirm_delete_saml_configuration": "نعم، احذف تكوين SAML",
"saml_not_configured_yet": "لم يتم تكوين SAML حتى الآن",
"saml_configuration_description": "يُرجى لصق بيانات تعريف SAML المقدمة من موفر الهوية في مربع النص أدناه لتحديث تكوين SAML.",
"saml_configuration_placeholder": "يُرجى لصق بيانات تعريف SAML المقدمة من موفر الهوية هنا",
"saml_configuration_update_failed": "فشل تحديث تكوين SAML",
"saml_configuration_delete_failed": "فشل حذف تكوين SAML",
"saml_email_required": "يُرجى إدخال بريد إلكتروني حتى نتمكن من العثور على موفر هوية SAML لديك",
"you_will_need_to_generate": "ستحتاج إلى إنشاء رمز مميز للوصول من خلال أداة الجدولة القديمة.",
"import": "استيراد",
"import_from": "استيراد من",
"access_token": "الرمز المميز الخاص بالوصول",
"visit_roadmap": "المخطط",
"remove": "إزالة",
"add": "إضافة",
"verify_wallet": "التحقق من المحفظة",
"connect_metamask": "توصيل Metamask",
"create_events_on": "إنشاء أحداث في:",
"missing_license": "الترخيص مفقود",
"signup_requires": "يلزم تقديم ترخيص تجاري",
"signup_requires_description": "لا تقدم شركة Cal.com, Inc. حاليًا إصدارًا مجانيًا مفتوح المصدر لصفحة التسجيل. للحصول على حق الوصول الكامل إلى مكونات الاشتراك، يجب أن تحصل على ترخيص تجاري. للاستخدام الشخصي، نوصي باستخدام منصة Prisma Data أو أي واجهة أخرى من واجهات Postgres لإنشاء حسابات.",
"next_steps": "الخطوات التالية",
"acquire_commercial_license": "تتطلب ترخيصًا تجاريًا",
"the_infrastructure_plan": "تعتمد خطة البنية التحتية على الاستخدام وتتضمن خصومات مناسبة لبدء التشغيل.",
"prisma_studio_tip": "إنشاء حساب عبر Prisma Studio",
"prisma_studio_tip_description": "تعرّف على كيفية إعداد مستخدمك الأول",
"contact_sales": "تواصل مع قسم المبيعات",
"error_404": "خطأ 404",
"requires_ownership_of_a_token": "يتطلب امتلاك رمز مميز يعود إلى العنوان التالي:",
"example_name": "أسامة منصور"
}

View File

@ -402,6 +402,7 @@
"phone_number": "Phone Number",
"enter_phone_number": "Enter phone number",
"reschedule": "Reschedule",
"reschedule_this": "Reschedule instead",
"book_a_team_member": "Book a team member instead",
"or": "OR",
"go_back": "Go back",
@ -435,6 +436,7 @@
"danger_zone": "Danger Zone",
"back": "Back",
"cancel": "Cancel",
"cancel_event": "Cancel this event",
"continue": "Continue",
"confirm": "Confirm",
"disband_team": "Disband Team",
@ -678,5 +680,8 @@
"contact_sales": "Contact Sales",
"error_404": "Error 404",
"requires_ownership_of_a_token": "Requires ownership of a token belonging to the following address:",
"example_name": "John Doe"
"example_name": "John Doe",
"time_format": "Time format",
"12_hour": "12 hour",
"24_hour": "24 hour"
}

View File

@ -1,4 +1,8 @@
{
"trial_days_left": "Tienes $t(day, {\"count\": {{days}} }) restantes en tu prueba PRO",
"day": "{{count}} día",
"day_plural": "{{count}} días",
"upgrade_now": "Actualizar ahora",
"accept_invitation": "Aceptar invitación",
"calcom_explained": "Cal.com es la alternativa de código abierto de Calendly poniéndole en control de sus propios datos, flujo de trabajo y apariencia.",
"have_any_questions": "¿Tienes preguntas? Estamos aquí para ayudar.",
@ -9,6 +13,12 @@
"event_request_cancelled": "Tu evento programado fue cancelado",
"organizer": "Organizador",
"need_to_reschedule_or_cancel": "¿Necesita reprogramar o cancelar?",
"cancellation_reason": "Motivo de la cancelación",
"cancellation_reason_placeholder": "¿Por qué razón estás cancelando? (opcional)",
"rejection_reason": "Motivo del rechazo",
"rejection_reason_title": "¿Rechazar la solicitud de reserva?",
"rejection_reason_description": "¿Estás seguro de que deseas rechazar la reserva? Le haremos saber a la persona que ha intentado reservar. Puedes indicar una razón a continuación.",
"rejection_confirmation": "Rechazar la reserva",
"manage_this_event": "Administrar este evento",
"your_event_has_been_scheduled": "Tu evento ha sido reprogramado",
"accept_our_license": "Acepte nuestra licencia cambiando la variable .env <1>NEXT_PUBLIC_LICENSE_CONSENT</1> a '{{agree}}'.",
@ -74,10 +84,18 @@
"rejected_event_type_with_organizer": "Rechazado: {{eventType}} con {{organizer}} en {{date}}",
"hi": "Hola",
"join_team": "Unirse al Equipo",
"manage_this_team": "Administrar este equipo",
"team_info": "Información del equipo",
"request_another_invitation_email": "Si prefiere no utilizar {{toEmail}} como su correo electrónico de Cal.com o ya tiene una cuenta de Cal.com, por favor solicite otra invitación a ese email.",
"you_have_been_invited": "Has sido invitado a unirte al equipo {{teamName}}",
"user_invited_you": "{{user}} te invitó a unirte al equipo {{teamName}}",
"hidden_team_member_title": "Estás oculto en este equipo",
"hidden_team_member_message": "No está pago tu asiento, actualiza a Pro o infórmale al propietario del equipo para que pague tu asiento.",
"hidden_team_owner_message": "Necesitas una cuenta Pro para gestionar equipos, permanecerás oculto hasta que se realice la mejora.",
"link_expires": "p.s. Expira en {{expiresIn}} horas.",
"upgrade_to_per_seat": "Actualiza a Por-Asiento",
"team_upgrade_seats_details": "De los {{memberCount}} miembros de tu equipo, {{unpaidCount}} asiento(s) no se ha(n) pagado. A ${{seatPrice}}/m por asiento, el costo total estimado de tu membresía es de ${{totalCost}}/m.",
"team_upgraded_successfully": "¡Tu equipo se actualizó con éxito!",
"use_link_to_reset_password": "Utilice el enlace de abajo para restablecer su contraseña",
"hey_there": "Hola,",
"forgot_your_password_calcom": "¿Has olvidado tu contraseña? - Cal.com",
@ -154,6 +172,7 @@
"30min_meeting": "Reunión de 30 min",
"secret_meeting": "Reunión Secreta",
"login_instead": "Iniciar Sesión en su lugar",
"already_have_an_account": "¿Ya tienes una cuenta?",
"create_account": "Crear Cuenta",
"confirm_password": "Confirmar Contraseña",
"create_your_account": "Crea tu Cuenta",
@ -208,9 +227,9 @@
"needs_to_be_confirmed_or_rejected": "Su reserva todavía necesita ser confirmada o rechazada.",
"user_needs_to_confirm_or_reject_booking": "{{user}} aún necesita confirmar o rechazar la reserva.",
"meeting_is_scheduled": "Esta reunión está programada",
"submitted": "Enviada",
"booking_submitted": "Reserva Enviada",
"booking_confirmed": "Reserva Confirmada",
"submitted": "Reserva enviada",
"booking_submitted": "Reserva enviada",
"booking_confirmed": "Reserva confirmada",
"enter_new_password": "Introduce la nueva contraseña que te gustaría para tu cuenta.",
"reset_password": "Restablecer Contraseña",
"change_your_password": "Cambiar Contraseña",
@ -224,6 +243,15 @@
"failed": "Falló",
"password_has_been_reset_login": "Su contraseña ha sido restablecida. Ahora puede iniciar sesión con su nueva contraseña.",
"unexpected_error_try_again": "Ocurrió un error inesperado. Inténtelo de nuevo.",
"sunday_time_error": "Hora inválida del domingo",
"monday_time_error": "Hora inválida del lunes",
"tuesday_time_error": "Hora inválida del martes",
"wednesday_time_error": "Hora inválida del miércoles",
"thursday_time_error": "Hora inválida del jueves",
"friday_time_error": "Hora inválida del viernes",
"saturday_time_error": "Hora inválida del sábado",
"error_end_time_before_start_time": "La hora final no puede ser anterior a la hora de inicio",
"error_end_time_next_day": "La hora final no puede ser mayor de 24 horas",
"back_to_bookings": "Volver a Reservas",
"free_to_pick_another_event_type": "No dude en elegir otro evento en cualquier momento.",
"cancelled": "Cancelado",
@ -416,6 +444,8 @@
"confirm_remove_member": "Sí, Eliminar Miembro",
"remove_member": "Eliminar Miembro",
"manage_your_team": "Administra tu Equipo",
"no_teams": "Todavía no tienes ningún equipo.",
"no_teams_description": "Los equipos permiten que otros reserven eventos compartidos entre tus compañeros de trabajo.",
"submit": "Enviar",
"delete": "Eliminar",
"update": "Actualizar",
@ -423,6 +453,8 @@
"pending": "Pendiente",
"open_options": "Abrir Opciones",
"copy_link": "Copiar Enlace",
"share": "Compartir",
"share_event": "¿Quieres reservar mi Cal o enviarme tu enlace?",
"copy_link_team": "Copiar enlace al equipo",
"leave_team": "Abandonar equipo",
"confirm_leave_team": "Sí, abandonar equipo",
@ -430,6 +462,7 @@
"user_from_team": "{{user}} de {{team}}",
"preview": "Vista Previa",
"link_copied": "¡Enlace Copiado!",
"link_shared": "¡Enlace compartido!",
"title": "Título",
"description": "Descripción",
"quick_video_meeting": "Reunión de Vídeo Rápida.",
@ -444,8 +477,11 @@
"url": "URL",
"hidden": "Oculto",
"readonly": "Sólo Lectura",
"plan_description": "Actualmente estás en el plan {{plan}}.",
"plan_upgrade_invitation": "Actualiza tu cuenta al plan Pro para poder utilizar todas las funciones que ofrecemos.",
"plan_upgrade": "Necesitas actualizar tu plan para tener más de un tipo de evento activo.",
"plan_upgrade_teams": "Necesita actualizar su plan para crear un equipo.",
"plan_upgrade_instructions": "Puedes <1>actualizar aquí</1>.",
"event_types_page_title": "Tipos de Evento",
"event_types_page_subtitle": "Crea eventos para que la gente que invites reserve en tu calendario.",
"new_event_type_btn": "Nuevo Tipo de Evento",
@ -478,10 +514,15 @@
"create_first_team_and_invite_others": "Crea tu primer equipo e invita a otros usuarios a trabajar contigo.",
"create_team_to_get_started": "Crea un equipo para empezar",
"teams": "Equipos",
"team_billing": "Facturación del equipo",
"upgrade_to_flexible_pro_title": "Hemos cambiado la facturación de los equipos",
"upgrade_to_flexible_pro_message": "Hay miembros en tu equipo sin asiento. Actualiza al plan Pro para cubrir los asientos restantes.",
"changed_team_billing_info": "A partir de enero de 2022 cobramos por asiento para los miembros del equipo. Los miembros de tu equipo que tenían el plan Pro de forma gratuita están ahora en una prueba de 14 días. Una vez que caduque su prueba, estos miembros estarán ocultos para tu equipo a menos que actualices ahora.",
"create_manage_teams_collaborative": "Cree y gestiona equipos para utilizar las funciones colaborativas.",
"only_available_on_pro_plan": "Esta función solo está disponible en el plan Pro",
"remove_cal_branding_description": "Para eliminar la marca Cal de sus páginas de reserva, debe actualizar a una cuenta Pro.",
"edit_profile_info_description": "Edite la información de su perfil, que se muestra en su enlace de programación.",
"change_email_tip": "Es posible que tengas que cerrar sesión y volver a entrar para ver el cambio realizado.",
"little_something_about": "Algo sobre ti.",
"profile_updated_successfully": "Perfil Actualizado con Éxito",
"your_user_profile_updated_successfully": "Su perfil de usuario se ha actualizado correctamente.",
@ -504,6 +545,7 @@
"add_attendees": "Añadir Asistentes",
"show_advanced_settings": "Mostrar Opciones Avanzadas",
"event_name": "Nombre del Evento",
"event_name_tooltip": "Nombre que aparecerá en los calendarios",
"meeting_with_user": "Reunión con {USER}",
"additional_inputs": "Campos Adicionales",
"label": "Etiqueta",
@ -548,6 +590,9 @@
"delete_event_type_description": "¿Está seguro de que desea eliminar este tipo de evento? Cualquiera con quien hayas compartido este enlace ya no podrá reservar con él.",
"delete_event_type": "Eliminar Tipo de Evento",
"confirm_delete_event_type": "Sí, Eliminar Tipo de Evento",
"delete_account": "Eliminar cuenta",
"confirm_delete_account": "Sí, eliminar cuenta",
"delete_account_confirmation_message": "¿Estás seguro de que quieres eliminar tu cuenta de Cal.com? Cualquier persona con la que hayas compartido el enlace de tu cuenta ya no podrá reservar con ella y cualquier preferencia que hayas guardado se perderá.",
"integrations": "Integraciones",
"settings": "Ajustes",
"event_type_moved_successfully": "El tipo de evento se ha movido correctamente",
@ -566,6 +611,51 @@
"not_installed": "No instalado",
"error_password_mismatch": "Las contraseñas no coinciden.",
"error_required_field": "Este campo es requerido.",
"status": "Estado",
"team_view_user_availability": "Ver disponibilidad de usuario",
"team_view_user_availability_disabled": "El usuario necesita aceptar la invitación para ver su disponibilidad"
"team_view_user_availability_disabled": "El usuario necesita aceptar la invitación para ver su disponibilidad",
"set_as_away": "Activar estado Ausente",
"set_as_free": "Desactivar estado Ausente",
"user_away": "Este usuario se encuentra Ausente.",
"user_away_description": "La persona a la que estás intentando reservar se ha marcado a sí misma como Ausente, por lo tanto, no acepta nuevas reservas por ahora.",
"meet_people_with_the_same_tokens": "Conoce personas con los mismos tokens",
"only_book_people_and_allow": "Solo reservar y permitir reservas de personas que compartan los mismos tokens, DAO o NFT.",
"saml_config_deleted_successfully": "Configuración SAML eliminada correctamente",
"account_created_with_identity_provider": "Tu cuenta se creó mediante un Proveedor de Identidad.",
"account_managed_by_identity_provider": "Tu cuenta es administrada por {{provider}}",
"account_managed_by_identity_provider_description": "Para cambiar tu correo electrónico, contraseña, habilitar la autenticación de doble factor y más, por favor visita la configuración de tu cuenta de {{provider}}.",
"signin_with_google": "Iniciar sesión con Google",
"signin_with_saml": "Iniciar sesión con SAML",
"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.",
"confirm_delete_saml_configuration": "Sí, eliminar la configuración SAML",
"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_configuration_update_failed": "Error al actualizar la configuración SAML",
"saml_configuration_delete_failed": "Error al eliminar la configuración SAML",
"saml_email_required": "Por favor, introduce un correo electrónico para que podamos encontrar tu Proveedor de Identidad SAML",
"you_will_need_to_generate": "Necesitarás generar un token de acceso desde tu antigua herramienta de programación.",
"import": "Importar",
"import_from": "Importar desde",
"access_token": "Token de acceso",
"visit_roadmap": "Hoja de ruta",
"remove": "Eliminar",
"add": "Añadir",
"verify_wallet": "Verificar billetera",
"connect_metamask": "Conectar Metamask",
"create_events_on": "Crear eventos en:",
"missing_license": "Falta la licencia",
"signup_requires": "Licencia comercial requerida",
"signup_requires_description": "Actualmente, Cal.com, Inc. no ofrece una versión gratuita de código abierto de la página de registro. Para recibir acceso completo a los componentes de registro es necesario adquirir una licencia comercial. Para uso personal, recomendamos la Plataforma de Datos Prisma o cualquier otra interfaz Postgres para crear cuentas.",
"next_steps": "Pasos siguientes",
"acquire_commercial_license": "Adquirir una licencia comercial",
"the_infrastructure_plan": "El plan de infraestructura está basado en el uso y tiene descuentos favorables para empresas emergentes.",
"prisma_studio_tip": "Crea una cuenta a través de Prisma Studio",
"prisma_studio_tip_description": "Aprende cómo configurar tu primer usuario",
"contact_sales": "Contactar con Ventas",
"error_404": "Error 404",
"requires_ownership_of_a_token": "Requiere la propiedad de un token perteneciente a la siguiente dirección:",
"example_name": "Juan Pérez"
}

View File

@ -1,4 +1,26 @@
{
"trial_days_left": "Il vous reste $t(day, {\"count\": {{days}} }) pour votre essai PRO",
"day": "{{count}} jour",
"day_plural": "{{count}} jours",
"upgrade_now": "Mettre à niveau maintenant",
"accept_invitation": "Accepter l'invitation",
"calcom_explained": "Cal.com est lalternative open source à Calendly vous permettant de contrôler vos propres données, votre flux de travail, et l'apparence.",
"have_any_questions": "Vous avez des questions ? Nous sommes là pour vous aider.",
"reset_password_subject": "Cal.com : Instructions pour réinitialiser le mot de passe",
"event_declined_subject": "Refusé : {{eventType}} avec {{name}} le {{date}}",
"event_cancelled_subject": "Annulé : {{eventType}} avec {{name}} le {{date}}",
"event_request_declined": "Votre demande d'événement a été refusée",
"event_request_cancelled": "Votre événement programmé a été annulé",
"organizer": "Organisateur",
"need_to_reschedule_or_cancel": "Besoin de reprogrammer ou d'annuler ?",
"cancellation_reason": "Motif de l'annulation",
"cancellation_reason_placeholder": "Pourquoi annulez-vous ? (facultatif)",
"rejection_reason": "Motif de rejet",
"rejection_reason_title": "Rejeter la demande de réservation ?",
"rejection_reason_description": "Êtes-vous sûr de vouloir rejeter la réservation ? Nous informerons la personne qui a essayé de réserver. Vous pouvez fournir une raison ci-dessous.",
"rejection_confirmation": "Rejeter la réservation",
"manage_this_event": "Gérer cet événement",
"your_event_has_been_scheduled": "Votre événement a été programmé",
"accept_our_license": "Acceptez notre licence en changeant la variable .env <1>NEXT_PUBLIC_LICENSE_CONSENT</1> en '{{agree}}'.",
"remove_banner_instructions": "Pour supprimer cette bannière, veuillez ouvrir votre fichier .env et changer la variable <1>NEXT_PUBLIC_LICENSE_CONSENT</1> en '{{agree}}'.",
"error_message": "Le message d'erreur était : '{{errorMessage}}'",
@ -6,6 +28,7 @@
"refund_failed": "Le remboursement de l'événement {{eventType}} avec {{userName}} le {{date}} a échoué.",
"check_with_provider_and_user": "Merci de vérifier avec votre intermédiaire de paiement et {{userName}} comment corriger ceci.",
"a_refund_failed": "Un remboursement a échoué",
"awaiting_payment_subject": "En attente de paiement : {{eventType}} avec {{name}} le {{date}}",
"meeting_awaiting_payment": "Votre réunion est en attente de paiement",
"help": "Aide",
"price": "Prix",
@ -29,12 +52,19 @@
"integration_meeting_id": "Identifiant de la réunion {{integrationName}} : {{meetingId}}",
"confirmed_event_type_subject": "Confirmé : {{eventType}} avec {{name}} le {{date}}",
"new_event_request": "Nouvelle demande d'événement: {{attendeeName}} - {{date}} - {{eventType}}",
"confirm_or_reject_request": "Confirmer ou refuser la demande",
"check_bookings_page_to_confirm_or_reject": "Consultez votre page de réservation pour confirmer ou refuser la réservation.",
"event_awaiting_approval": "Un nouvel évènement attend votre validation",
"someone_requested_an_event": "Quelqu'un a demandé à programmer un événement sur votre calendrier.",
"someone_requested_password_reset": "Quelqu'un a demandé un lien pour modifier votre mot de passe.",
"password_reset_instructions": "Si vous n'avez pas effectué cette demande, vous pouvez ignorer cet e-mail en toute sécurité et votre mot de passe ne sera pas modifié.",
"event_awaiting_approval_subject": "En attente d'approbation : {{eventType}} avec {{name}} à {{date}}",
"event_still_awaiting_approval": "Un événement attend toujours votre approbation",
"your_meeting_has_been_booked": "Votre réunion a été réservée",
"event_type_has_been_rescheduled_on_time_date": "Votre {{eventType}} avec {{name}} a été reporté à {{time}} ({{timeZone}}) le {{date}}.",
"event_has_been_rescheduled": "Votre évènement a été reprogrammé.",
"hi_user_name": "Bonjour {{userName}}",
"ics_event_title": "{{eventType}} avec {{name}}",
"new_event_subject": "Nouvel événement : {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Rejoindre par {{entryPoint}}",
"notes": "Notes",
@ -50,13 +80,22 @@
"meeting_password": "Mot de passe de la réunion",
"meeting_url": "URL de la réunion",
"meeting_request_rejected": "Votre demande de réunion a été refusée",
"rescheduled_event_type_subject": "Reporté : {{eventType}} avec {{name}} le {{date}}",
"rejected_event_type_with_organizer": "Refusé : {{eventType}} avec {{organizer}} le {{date}}",
"hi": "Bonjour",
"join_team": "Rejoindre l'équipe",
"manage_this_team": "Gérer cette équipe",
"team_info": "Informations sur l'équipe",
"request_another_invitation_email": "Si vous préférez ne pas utiliser {{toEmail}} comme votre adresse e-mail Cal.com ou si vous avez déjà un compte Cal.com, veuillez demander une autre invitation à cette adresse.",
"you_have_been_invited": "Vous avez été invité à rejoindre l'équipe {{teamName}}",
"user_invited_you": "{{user}} vous a invité à rejoindre l'équipe {{teamName}}",
"hidden_team_member_title": "Vous êtes caché dans cette équipe",
"hidden_team_member_message": "Votre place n'est pas payée, passez à la version Pro ou faites savoir au propriétaire de l'équipe qu'il peut payer votre place.",
"hidden_team_owner_message": "Vous avez besoin d'un compte pro pour utiliser les équipes, vous êtes caché jusqu'à ce que vous mettiez à niveau.",
"link_expires": "p.s. Il expire dans {{expiresIn}} heures.",
"upgrade_to_per_seat": "Mise à niveau vers la place",
"team_upgrade_seats_details": "Parmi les {{memberCount}} membres de votre équipe, {{unpaidCount}} place(s) sont non payées. À {{seatPrice}}$/m par place, le coût total estimé de votre adhésion est de {{totalCost}}$/m.",
"team_upgraded_successfully": "Votre équipe a été mise à niveau avec succès !",
"use_link_to_reset_password": "Utilisez le lien ci-dessous pour réinitialiser votre mot de passe",
"hey_there": "Salut,",
"forgot_your_password_calcom": "Mot de passe oublié ? - Cal.com",
@ -108,6 +147,7 @@
"rejected": "Refusé",
"unconfirmed": "Non confirmé",
"guests": "Invités",
"guest": "Invité",
"web_conferencing_details_to_follow": "Les détails de la conférence Web à suivre.",
"the_username": "Le nom d'utilisateur",
"username": "Nom d'utilisateur",
@ -132,6 +172,7 @@
"30min_meeting": "Réunion de 30 min",
"secret_meeting": "Réunion secrète",
"login_instead": "Se connecter à la place",
"already_have_an_account": "Vous avez déjà un compte ?",
"create_account": "Créer un compte",
"confirm_password": "Confirmer le mot de passe",
"create_your_account": "Créez votre compte",
@ -202,6 +243,15 @@
"failed": "Échoué",
"password_has_been_reset_login": "Votre mot de passe a été réinitialisé. Vous pouvez désormais vous connecter avec votre nouveau mot de passe.",
"unexpected_error_try_again": "Une erreur inattendue s'est produite. Veuillez réessayer.",
"sunday_time_error": "Heure non valide le dimanche",
"monday_time_error": "Heure non valide le lundi",
"tuesday_time_error": "Heure non valide le mardi",
"wednesday_time_error": "Heure non valide le mercredi",
"thursday_time_error": "Heure non valide le jeudi",
"friday_time_error": "Heure non valide le vendredi",
"saturday_time_error": "Heure non valide le samedi",
"error_end_time_before_start_time": "L'heure de fin ne peut être antérieure à l'heure de début",
"error_end_time_next_day": "La date de fin ne peut pas être supérieure à 24 heures",
"back_to_bookings": "Retour aux réservations",
"free_to_pick_another_event_type": "N'hésitez pas à choisir un autre événement à tout moment.",
"cancelled": "Annulé",
@ -281,6 +331,7 @@
"no_event_types_have_been_setup": "Cet utilisateur n'a pas encore configuré de types d'événements.",
"edit_logo": "Modifier le logo",
"upload_a_logo": "Soumettre un logo",
"remove_logo": "Supprimer le logo",
"enable": "Activer",
"code": "Code",
"code_is_incorrect": "Code incorrect.",
@ -357,6 +408,7 @@
"email_or_username": "E-mail ou identifiant",
"send_invite_email": "Envoyer un e-mail d'invitation",
"role": "Rôle",
"edit_role": "Modifier le rôle",
"edit_team": "Modifier l'équipe",
"reject": "Refuser",
"accept": "Accepter",
@ -372,10 +424,12 @@
"members": "Membres",
"member": "Membre",
"owner": "Propriétaire",
"admin": "Admin.",
"new_member": "Nouveau membre",
"invite": "Inviter",
"invite_new_member": "Inviter un nouveau membre",
"invite_new_team_member": "Invitez quelqu'un à rejoindre votre équipe.",
"change_member_role": "Changer le rôle du membre de l'équipe",
"disable_cal_branding": "Désactiver l'image de marque de Cal.com",
"disable_cal_branding_description": "Masquer toutes les marques de Cal.com de vos pages publiques.",
"danger_zone": "Zone dangereuse",
@ -390,6 +444,8 @@
"confirm_remove_member": "Oui, retirer le membre",
"remove_member": "Supprimer le membre",
"manage_your_team": "Gérez votre équipe",
"no_teams": "Vous n'avez pas encore d'équipe.",
"no_teams_description": "Les équipes permettent aux autres de réserver des événements partagés entre vos collègues.",
"submit": "Envoyer",
"delete": "Supprimer",
"update": "Mettre à jour",
@ -397,8 +453,16 @@
"pending": "En attente",
"open_options": "Ouvrir les options",
"copy_link": "Copier le lien vers l'événement",
"share": "Partager",
"share_event": "Voulez-vous réserver mon cal ou m'envoyer votre lien ?",
"copy_link_team": "Copier le lien vers l'équipe",
"leave_team": "Quitter l'équipe",
"confirm_leave_team": "Oui, quitter l'équipe",
"leave_team_confirmation_message": "Voulez-vous vraiment quitter cette équipe ? Vous ne pourrez plus l'utiliser pour réserver.",
"user_from_team": "{{user}} de {{team}}",
"preview": "Aperçu",
"link_copied": "Le lien a été copié !",
"link_shared": "Lien partagé !",
"title": "Titre",
"description": "Description",
"quick_video_meeting": "Une courte réunion vidéo.",
@ -413,7 +477,11 @@
"url": "URL",
"hidden": "Caché",
"readonly": "Lire seulement",
"plan_description": "Vous disposez actuellement de la formule {{plan}}.",
"plan_upgrade_invitation": "Mettez à niveau votre compte vers l'offre pro pour débloquer toutes les fonctionnalités que nous avons à proposer.",
"plan_upgrade": "Vous devez mettre à niveau votre plan pour avoir plus d'un type d'événement actif.",
"plan_upgrade_teams": "Vous devez mettre à niveau votre formule pour créer une équipe.",
"plan_upgrade_instructions": "Vous pouvez <1>mettre à niveau ici</1>.",
"event_types_page_title": "Types dévénement",
"event_types_page_subtitle": "Créez des événements à partager pour que les gens puissent les réserver sur votre calendrier.",
"new_event_type_btn": "Nouveau type d'événement",
@ -426,6 +494,8 @@
"event_type_created_successfully": "Type d'événement {{eventTypeTitle}} créé avec succès",
"event_type_updated_successfully": "Type d'événement {{eventTypeTitle}} mis à jour avec succès",
"event_type_deleted_successfully": "Type d'événement supprimé avec succès",
"web3_metamask_added": "Metamask ajouté avec succès",
"web3_metamask_disconnected": "Metamask déconnecté avec succès",
"hours": "Heures",
"your_email": "Votre adresse e-mail",
"change_avatar": "Changer d'avatar",
@ -444,10 +514,15 @@
"create_first_team_and_invite_others": "Créez votre première équipe et invitez d'autres utilisateurs à travailler avec vous.",
"create_team_to_get_started": "Créer une équipe pour commencer",
"teams": "Équipes",
"team_billing": "Facturation d'équipe",
"upgrade_to_flexible_pro_title": "Nous avons modifié la facturation pour les équipes",
"upgrade_to_flexible_pro_message": "Des membres dans votre équipe n'ont pas de place. Mettez à niveau votre offre pro pour couvrir les places manquantes.",
"changed_team_billing_info": "Depuis janvier 2022, nous facturons chaque place aux membres de l'équipe. Les membres de votre équipe qui ont eu la version Pro gratuitement disposent maintenant d'un essai de 14 jours. Une fois leur période d'essai expirée, ces membres seront cachés pour votre équipe, sauf si vous mettez à niveau maintenant.",
"create_manage_teams_collaborative": "Créer et gérer des équipes pour utiliser les fonctionnalités de collaboration.",
"only_available_on_pro_plan": "Cette fonctionnalité n'est disponible que dans l'offre Pro",
"remove_cal_branding_description": "Pour retirer l'image de marque de Cal de vos pages de réservation, vous devez passer à un compte Pro.",
"edit_profile_info_description": "Modifiez les informations de votre profil, qui apparaissent sur votre lien de réservation.",
"change_email_tip": "Vous devrez peut-être vous déconnecter et vous reconnecter pour que le changement prenne effet.",
"little_something_about": "Quelque chose à propos de vous.",
"profile_updated_successfully": "Profil mis à jour avec succès",
"your_user_profile_updated_successfully": "Votre profil d'utilisateur a été mis à jour avec succès.",
@ -470,6 +545,7 @@
"add_attendees": "Ajouter des participant·es",
"show_advanced_settings": "Afficher les paramètres avancés",
"event_name": "Nom de l'événement",
"event_name_tooltip": "Le nom qui apparaîtra dans les calendriers",
"meeting_with_user": "Rendez-vous avec {USER}",
"additional_inputs": "Entrées additionnelles",
"label": "Libellé",
@ -509,9 +585,14 @@
"new_event_type_to_book_description": "Créer un nouveau type dévénement pour que les personnes puisse réserver des créneaux.",
"length": "Durée",
"minimum_booking_notice": "Avis de réservation minimum",
"slot_interval": "Intervalles de créneaux horaires",
"slot_interval_default": "Utiliser la durée de l'événement (par défaut)",
"delete_event_type_description": "Voulez-vous vraiment supprimer ce type d'événement ? Toute personne avec qui vous avez partagé ce lien ne pourra plus réserver en l'utilisant.",
"delete_event_type": "Supprimer le type d'événement",
"confirm_delete_event_type": "Oui, supprimer le type d'événement",
"delete_account": "Supprimer le compte",
"confirm_delete_account": "Oui, supprimer le compte",
"delete_account_confirmation_message": "Êtes-vous sûr de vouloir supprimer votre compte Cal.com ? Toute personne avec qui vous avez partagé le lien de votre compte ne pourra plus réserver en utilisant ce lien et toutes les préférences que vous avez enregistrées seront perdues.",
"integrations": "Intégrations",
"settings": "Paramètres",
"event_type_moved_successfully": "Le type d'évènement a été déplacé avec succès",
@ -523,11 +604,58 @@
"connect_your_favourite_apps": "Connectez vos applications favorites.",
"automation": "Automatisation",
"configure_how_your_event_types_interact": "Configurez la manière dont vos types d'événements doivent interagir avec vos calendriers.",
"select_destination_calendar": "Créer des événements le",
"connect_an_additional_calendar": "Connecter un calendrier supplémentaire",
"conferencing": "Conférence",
"calendar": "Calendrier",
"not_installed": "Non installé",
"error_password_mismatch": "Les mots de passe ne correspondent pas.",
"error_required_field": "Ce champ est requis.",
"status": "Statut"
"status": "Statut",
"team_view_user_availability": "Voir la disponibilité de l'utilisateur",
"team_view_user_availability_disabled": "L'utilisateur doit accepter une invitation pour voir la disponibilité",
"set_as_away": "Se définir comme absent",
"set_as_free": "Désactiver le statut absent",
"user_away": "Cet utilisateur est actuellement absent.",
"user_away_description": "La personne pour laquelle vous essayez de réserver est absente, et n'accepte donc pas de nouvelles réservations.",
"meet_people_with_the_same_tokens": "Rencontrez des personnes avec les mêmes jetons",
"only_book_people_and_allow": "Réservez et autorisez uniquement les réservations de personnes qui partagent les mêmes jetons, DAO ou NFT.",
"saml_config_deleted_successfully": "Configuration SAML supprimée avec succès",
"account_created_with_identity_provider": "Votre compte a été créé à l'aide d'un fournisseur d'identité.",
"account_managed_by_identity_provider": "Votre compte est géré par {{provider}}",
"account_managed_by_identity_provider_description": "Pour modifier votre adresse e-mail et/ou votre mot de passe, activez l'authentification à deux facteurs et plus, veuillez consulter les paramètres de votre compte {{provider}}.",
"signin_with_google": "Se connecter avec Google",
"signin_with_saml": "Se connecter avec SAML",
"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.",
"confirm_delete_saml_configuration": "Oui, supprimer la configuration SAML",
"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_configuration_update_failed": "La mise à jour de la configuration SAML a échoué",
"saml_configuration_delete_failed": "La suppression de la configuration SAML a échoué",
"saml_email_required": "Veuillez saisir une adresse e-mail pour que nous puissions trouver votre fournisseur d'identité SAML",
"you_will_need_to_generate": "Vous devrez générer un jeton d'accès à partir de votre ancien outil de planification.",
"import": "Importer",
"import_from": "Importer depuis",
"access_token": "Jeton d'accès",
"visit_roadmap": "Feuille de route",
"remove": "Supprimer",
"add": "Ajouter",
"verify_wallet": "Vérifier le portefeuille",
"connect_metamask": "Connecter Metamask",
"create_events_on": "Créer des événements le :",
"missing_license": "Licence manquante",
"signup_requires": "Licence commerciale requise",
"signup_requires_description": "Cal.com, Inc. ne propose pas actuellement de version open source gratuite de la page d'inscription. Pour obtenir un accès complet aux composants d'inscription, vous devez acquérir une licence commerciale. Pour une utilisation personnelle, nous recommandons la Plateforme de Données Prisma ou toute autre interface Postgres pour créer des comptes.",
"next_steps": "Prochaines étapes",
"acquire_commercial_license": "Obtenir une licence commerciale",
"the_infrastructure_plan": "L'offre d'infrastructure est basée sur l'utilisation et comporte des rabais favorables aux start-ups.",
"prisma_studio_tip": "Créer un compte via Prisma Studio",
"prisma_studio_tip_description": "Apprenez comment configurer votre premier utilisateur",
"contact_sales": "Contacter les ventes",
"error_404": "Erreur 404",
"requires_ownership_of_a_token": "Nécessite la propriété d'un jeton appartenant à l'adresse suivante :",
"example_name": "Jean Dupont"
}

View File

@ -1,6 +1,6 @@
{
"trial_days_left": "Hai solo $t(day, {\"count\": {{days}} }) rimasti al piano PRO",
"day": "{{count}} giorni",
"trial_days_left": "Ti rimangono $t(day, {\"count\": {{days}} }) di prova con il piano PRO",
"day": "{{count}} giorno",
"day_plural": "{{count}} giorni",
"upgrade_now": "Cambia piano",
"accept_invitation": "Accetta Invito",
@ -13,11 +13,11 @@
"event_request_cancelled": "Il tuo evento programmato è stato cancellato",
"organizer": "Organizzatore",
"need_to_reschedule_or_cancel": "È necessario riprogrammare o annullare?",
"cancellation_reason": "Motivo della cancellazione",
"cancellation_reason_placeholder": "Perché stai cancellando? (opzionale)",
"cancellation_reason": "Motivo dell'annullamento",
"cancellation_reason_placeholder": "Perché stai annullando? (facoltativo)",
"rejection_reason": "Motivo del rifiuto",
"rejection_reason_title": "Rifiutare la richiesta di prenotazione?",
"rejection_reason_description": "Sei sicuro di voler rifiutare la prenotazione? Faremo sapere alla persona che ha cercato di prenotare. Puoi fornire un motivo qui sotto.",
"rejection_reason_description": "Sei sicuro di voler rifiutare la prenotazione? Informeremo la persona che ha cercato di prenotare. Puoi indicare il motivo qui sotto.",
"rejection_confirmation": "Rifiuta la prenotazione",
"manage_this_event": "Gestisci questo evento",
"your_event_has_been_scheduled": "Il tuo evento è stato programmato",
@ -89,13 +89,13 @@
"request_another_invitation_email": "Se preferisci non usare {{toEmail}} come email Cal.com o già hai un account Cal.com, per favore richiedi un altro invito a quella email.",
"you_have_been_invited": "Sei stato invitato ad unirti al team {{teamName}}",
"user_invited_you": "{{user}} ti ha invitato a unirti alla squadra {{team}} su Cal.com",
"hidden_team_member_title": "Sei nascosto da questo team",
"hidden_team_member_message": "Il tuo posto non è pagato, passa a Pro o fai sapere al proprietario del team che può pagare per il tuo posto.",
"hidden_team_owner_message": "Hai bisogno di un account pro per utilizzare i team, sei nascosto fino a quando non si aggiorna.",
"hidden_team_member_title": "Sei nascosto in questo team",
"hidden_team_member_message": "Il tuo posto non è pagato. Passa a Pro oppure informa il proprietario del team che può pagare il tuo posto.",
"hidden_team_owner_message": "Per utilizzare i team ti occorre un account Pro. Sarai nascosto finché non cambierai piano.",
"link_expires": "p.s. Scade tra {{expiresIn}} ore.",
"upgrade_to_per_seat": "Passa a Per-Post",
"team_upgrade_seats_details": "Dei {{memberCount}} membri del tuo team, {{unpaidCount}} posti non sono stati pagati. A ${{seatPrice}}/m per posto il costo totale stimato della tua adesione è di ${{totalCost}}/m.",
"team_upgraded_successfully": "Il tuo team è stato aggiornato con successo!",
"upgrade_to_per_seat": "Passa al piano Per-posto",
"team_upgrade_seats_details": "Per i {{memberCount}} membri del tuo team, {{unpaidCount}} posti non sono pagati. A € {{seatPrice}}/m per posto, il costo totale stimato della tua adesione è di € {{totalCost}}/m.",
"team_upgraded_successfully": "Il tuo team è stato aggiornato!",
"use_link_to_reset_password": "Usa il link qui sotto per reimpostare la tua password",
"hey_there": "Ciao,",
"forgot_your_password_calcom": "Hai dimenticato la password? - Cal.com",
@ -113,7 +113,7 @@
"webhook_created_successfully": "Webhook creato con successo!",
"webhook_updated_successfully": "Webhook aggiornato con successo!",
"webhook_removed_successfully": "Webhook rimosso con successo!",
"payload_template": "Template Di Payload",
"payload_template": "Modello di Payload",
"dismiss": "Ignora",
"no_data_yet": "Ancora nessun dato",
"ping_test": "Test Ping",
@ -250,8 +250,8 @@
"thursday_time_error": "Ora non valida il giovedì",
"friday_time_error": "Ora non valida il venerdì",
"saturday_time_error": "Ora non valida il sabato",
"error_end_time_before_start_time": "L'ora di fine non può essere prima dell'orario di inizio",
"error_end_time_next_day": "L'ora di fine non può essere maggiore di 24 ore",
"error_end_time_before_start_time": "L'ora di conclusione non può precedere l'ora di inizio",
"error_end_time_next_day": "L'ora di conclusione non può essere maggiore di 24 ore",
"back_to_bookings": "Torna alle prenotazioni",
"free_to_pick_another_event_type": "Sentiti libero di scegliere un altro evento in qualsiasi momento.",
"cancelled": "Annullato",
@ -444,8 +444,8 @@
"confirm_remove_member": "Sì, rimuovi membro",
"remove_member": "Rimuovi membro",
"manage_your_team": "Gestisci il tuo team",
"no_teams": "Non hai ancora nessun team.",
"no_teams_description": "I team permettono ad altri di prenotare eventi condivisi tra i tuoi collaboratori.",
"no_teams": "Non hai ancora alcun team.",
"no_teams_description": "I team permettono ad altri di prenotare eventi in condivisione con i tuoi collaboratori.",
"submit": "Invia",
"delete": "Elimina",
"update": "Aggiorna",
@ -454,7 +454,7 @@
"open_options": "Apri opzioni",
"copy_link": "Copia link all'evento",
"share": "Condividi",
"share_event": "Ti dispiacerebbe prenotare il mio cal o inviarmi il tuo link?",
"share_event": "Ti dispiacerebbe prenotare sul mio calendario o inviarmi il tuo link?",
"copy_link_team": "Copia il link al team",
"leave_team": "Lascia il team",
"confirm_leave_team": "Sì, lascio il team",
@ -477,11 +477,11 @@
"url": "URL",
"hidden": "Nascosto",
"readonly": "Sola lettura",
"plan_description": "Al momento sei sul piano {{plan}}.",
"plan_upgrade_invitation": "Aggiorna il tuo account al piano pro per sbloccare tutte le funzionalità che abbiamo da offrire.",
"plan_description": "Al momento sei nel piano {{plan}}.",
"plan_upgrade_invitation": "Passa al piano Pro per sbloccare tutte le funzionalità che abbiamo da offrire.",
"plan_upgrade": "È necessario aggiornare il piano per avere più di un tipo di evento attivo.",
"plan_upgrade_teams": "Devi aggiornare il tuo piano per creare un team.",
"plan_upgrade_instructions": "Puoi aggiornare <1>qui</1>.",
"plan_upgrade_instructions": "Puoi <1>cambiare piano qui</1>.",
"event_types_page_title": "Tipo di Evento",
"event_types_page_subtitle": "Crea eventi da condividere per le persone che prenotano sul tuo calendario.",
"new_event_type_btn": "Nuovo tipo di evento",
@ -494,8 +494,8 @@
"event_type_created_successfully": "{{eventTypeTitle}} tipo di evento creato con successo",
"event_type_updated_successfully": "{{eventTypeTitle}} tipo di evento aggiornato con successo",
"event_type_deleted_successfully": "Tipo di evento eliminato con successo",
"web3_metamask_added": "Metamask aggiunto con successo",
"web3_metamask_disconnected": "Metamask disconnesso con successo",
"web3_metamask_added": "Metamask aggiunto",
"web3_metamask_disconnected": "Metamask disconnesso",
"hours": "Ore",
"your_email": "La Tua Email",
"change_avatar": "Cambia Avatar",
@ -514,15 +514,15 @@
"create_first_team_and_invite_others": "Crea il tuo primo team e invita altri utenti a lavorare insieme a te.",
"create_team_to_get_started": "Crea una squadra per iniziare",
"teams": "Team",
"team_billing": "Fatturazione Team",
"team_billing": "Fatturazione team",
"upgrade_to_flexible_pro_title": "Abbiamo cambiato la fatturazione per i team",
"upgrade_to_flexible_pro_message": "Ci sono membri del tuo team senza posto. Aggiorna il tuo piano pro per coprire i posti mancanti.",
"changed_team_billing_info": "A partire da gennaio 2022 ci addebitiamo su base per posto per i membri del team. I membri del tuo team che hanno avuto Pro gratis sono ora in una prova di 14 giorni. Una volta scaduta la loro prova, questi membri saranno nascosti dal tuo team a meno che tu non aggiorni ora.",
"upgrade_to_flexible_pro_message": "Alcuni membri del tuo team non hanno un posto. Aggiorna il tuo piano Pro per coprire i posti mancanti.",
"changed_team_billing_info": "A partire da gennaio 2022, applichiamo una tariffazione in base ai posti per i membri dei team. I membri del tuo team che utilizzavano Pro gratuitamente dispongono ora di un periodo di prova di 14 giorni. Terminata la prova, questi membri saranno nascosti dal tuo team, se non aggiornerai il piano.",
"create_manage_teams_collaborative": "Crea e gestisci team per utilizzare funzionalità di collaborazione.",
"only_available_on_pro_plan": "Questa funzione è disponibile solo nel piano Pro",
"remove_cal_branding_description": "Al fine di rimuovere il marchio Cal dalle pagine di prenotazione, è necessario acquistare un account Pro.",
"edit_profile_info_description": "Modifica le informazioni del tuo profilo, che verranno visualizzate sul tuo link di pianificazione.",
"change_email_tip": "Potrebbe essere necessario disconnettersi e tornare per vedere se il cambiamento ha effetto.",
"change_email_tip": "Perché la modifica abbia effetto, potrebbe essere necessario disconnettersi e accedere nuovamente.",
"little_something_about": "Qualcosa su di te.",
"profile_updated_successfully": "Profilo aggiornato con successo",
"your_user_profile_updated_successfully": "Il tuo profilo utente è stato aggiornato con successo.",
@ -592,7 +592,7 @@
"confirm_delete_event_type": "Sì, elimina tipo evento",
"delete_account": "Elimina account",
"confirm_delete_account": "Sì, elimina account",
"delete_account_confirmation_message": "Sei sicuro di voler eliminare il tuo account Cal.com? Chiunque abbia condiviso il link del tuo account non sarà più in grado di prenotare utilizzandolo e le preferenze che hai salvato andranno perse.",
"delete_account_confirmation_message": "Sei sicuro di voler eliminare il tuo account Cal.com? Chiunque abbia il link del tuo account non potrà più utilizzarlo per prenotare e le preferenze che hai salvato andranno perse.",
"integrations": "Integrazioni",
"settings": "Impostazioni",
"event_type_moved_successfully": "Il tipo di evento è stato spostato con successo",
@ -614,29 +614,29 @@
"status": "Stato",
"team_view_user_availability": "Visualizza la disponibilità degli utenti",
"team_view_user_availability_disabled": "L'utente deve accettare l'invito per visualizzare la disponibilità",
"set_as_away": "Mettiti via come assente",
"set_as_free": "Disabilita lo stato assente",
"set_as_away": "Segnalati assente",
"set_as_free": "Disabilita lo stato \"assente\"",
"user_away": "Questo utente è attualmente assente.",
"user_away_description": "La persona che stai cercando di prenotare si è messa assente, e quindi non sta accettando nuove prenotazioni.",
"user_away_description": "La persona che stai cercando di prenotare si è segnalata assente, quindi non accetta nuove prenotazioni.",
"meet_people_with_the_same_tokens": "Incontra persone con gli stessi token",
"only_book_people_and_allow": "Prenota e consenti le prenotazioni solo da persone che condividono gli stessi token, DAO o NFT.",
"saml_config_deleted_successfully": "Configurazione SAML eliminata con successo",
"account_created_with_identity_provider": "Il tuo account è stato creato utilizzando un Identity Provider.",
"only_book_people_and_allow": "Prenota e accetta prenotazioni solo con persone che condividono gli stessi token, DAO o NFT.",
"saml_config_deleted_successfully": "Configurazione SAML eliminata",
"account_created_with_identity_provider": "Il tuo account è stato creato utilizzando un provider di identità.",
"account_managed_by_identity_provider": "Il tuo account è gestito da {{provider}}",
"account_managed_by_identity_provider_description": "Per modificare la tua email, password, abilita l'autenticazione a due fattori e altro, visita le impostazioni dell'account {{provider}}.",
"account_managed_by_identity_provider_description": "Per modificare la tua email o la tua password, per abilitare l'autenticazione a due fattori e altro ancora, consulta le impostazioni del tuo account {{provider}}.",
"signin_with_google": "Accedi con Google",
"signin_with_saml": "Accedi con SAML",
"saml_configuration": "Configurazione SAML",
"delete_saml_configuration": "Elimina configurazione SAML",
"delete_saml_configuration_confirmation_message": "Sei sicuro di voler eliminare la configurazione SAML? I membri del tuo team che utilizzano l'accesso SAML non saranno più in grado di accedere a Cal.com.",
"confirm_delete_saml_configuration": "Elimina configurazione SAML",
"confirm_delete_saml_configuration": "Sì, elimina configurazione SAML",
"saml_not_configured_yet": "SAML non ancora configurato",
"saml_configuration_description": "Per favore incolla i metadata SAML dal tuo Identity Provider nella casella di testo qui sotto per aggiornare la configurazione SAML.",
"saml_configuration_placeholder": "Per favore incolla i metadata SAML dal tuo Identity Provider qui",
"saml_configuration_description": "Per aggiornare la configurazione SAML, incolla nella casella sottostante i metadati SAML forniti dal tuo provider di identità.",
"saml_configuration_placeholder": "Incolla qui i metadati SAML forniti dal tuo provider di identità",
"saml_configuration_update_failed": "Aggiornamento configurazione SAML non riuscito",
"saml_configuration_delete_failed": "Aggiornamento configurazione SAML non riuscito",
"saml_email_required": "Inserisci un'email in modo da poter trovare il tuo provider di identità SAML",
"you_will_need_to_generate": "Dovrai generare un token di accesso dal tuo vecchio strumento di pianificazione.",
"saml_configuration_delete_failed": "Eliminazione configurazione SAML non riuscita",
"saml_email_required": "Inserisci un indirizzo email che consenta di individuare il tuo provider di identità SAML",
"you_will_need_to_generate": "Dovrai generare un token di accesso con il tuo vecchio strumento di pianificazione.",
"import": "Importa",
"import_from": "Importa da",
"access_token": "Token di accesso",
@ -646,16 +646,16 @@
"verify_wallet": "Verifica Wallet",
"connect_metamask": "Connetti Metamask",
"create_events_on": "Crea eventi su:",
"missing_license": "Licenza Mancante",
"signup_requires": "Licenza commerciale richiesta",
"signup_requires_description": "Cal.com, Inc. attualmente non offre una versione open source gratuita nella pagina di iscrizione. Per ricevere l'accesso completo ai componenti di registrazione è necessario acquisire una licenza commerciale. Per uso personale consigliamo la Piattaforma dati Prisma o qualsiasi altra interfaccia Postgres per creare account.",
"missing_license": "Licenza mancante",
"signup_requires": "È necessaria una licenza commerciale",
"signup_requires_description": "Cal.com attualmente non offre una versione open source gratuita della pagina di registrazione. Per avere accesso completo ai componenti di registrazione è necessario acquisire una licenza commerciale. Per un uso personale consigliamo Prisma Data Platform o qualsiasi altra interfaccia Postgres per creare account.",
"next_steps": "Prossimi Passi",
"acquire_commercial_license": "Acquista una licenza commerciale",
"the_infrastructure_plan": "Il piano infrastrutturale è basato sull'utilizzo e ha sconti favorevoli per le startup.",
"the_infrastructure_plan": "Il piano infrastrutturale è basato sull'utilizzo e ha sconti rivolti alle startup.",
"prisma_studio_tip": "Crea un account tramite Prisma Studio",
"prisma_studio_tip_description": "Scopri come configurare il tuo primo utente",
"contact_sales": "Contatta Vendite",
"contact_sales": "Contatta reparto commerciale",
"error_404": "Errore 404",
"requires_ownership_of_a_token": "Richiede la proprietà di un token appartenente al seguente indirizzo:",
"requires_ownership_of_a_token": "Richiede il possesso di un token appartenente al seguente indirizzo:",
"example_name": "Paolo Rossi"
}

View File

@ -1,26 +1,26 @@
{
"trial_days_left": "PROトライアル版に $t(day, {\"count\": {{days}} }) があります",
"trial_days_left": "PRO トライアル版は残り $t(day, {\"count\": {{days}} }) です",
"day": "{{count}} 日",
"day_plural": "{{count}} 日間",
"upgrade_now": "今すぐアップグレード",
"accept_invitation": "招待を承",
"calcom_explained": "カレンダーの代わりとして、Cal.comは、所有するデータ、ワークフロー、イベントへの出席状況などを管理できます。",
"have_any_questions": "ご不明な点がございますか?お気軽にお問い合わせください",
"reset_password_subject": "Cal.com: パスワードリセット手順",
"event_declined_subject": "拒否: {{date}} 、{{name}} による{{eventType}}",
"event_cancelled_subject": "キャンセルしました: {{date}}、 {{name}} による {{eventType}}",
"event_request_declined": "イベントリクエストが却下されました",
"event_request_cancelled": "予定がキャンセルになりました",
"accept_invitation": "招待を承諾する",
"calcom_explained": "Cal.com は、Calendly の代替となるオープンソースのツールです。データ、ワークフロー、外観などを自分自身の手でコントロールすることができます。",
"have_any_questions": "ご不明な点があれば、お気軽にお問い合わせください。",
"reset_password_subject": "Cal.com: パスワードリセット手順",
"event_declined_subject": "拒否されました: {{name}} による {{eventType}}、{{date}}",
"event_cancelled_subject": "キャンセルされました: {{name}} による {{eventType}}、{{date}}",
"event_request_declined": "イベントのリクエストが拒否されました",
"event_request_cancelled": "スケジュールされていた予定がキャンセルされました",
"organizer": "主催者",
"need_to_reschedule_or_cancel": "スケジュール変更またはキャンセルが必要ですか?",
"cancellation_reason": "キャンセル理由",
"cancellation_reason_placeholder": "キャンセルする理由 (オプション)",
"rejection_reason": "却下の理由",
"rejection_reason_title": "予約リクエストを却下しますか?",
"rejection_reason_description": "この予約を却下してもよろしいですか?予約しようとした人に、以下の理由を提供できます。",
"rejection_confirmation": "予約を却下する",
"manage_this_event": "このイベントを管理",
"your_event_has_been_scheduled": "イベントが予定されています",
"need_to_reschedule_or_cancel": "スケジュールまたはキャンセルが必要ですか?",
"cancellation_reason": "キャンセル理由",
"cancellation_reason_placeholder": "なぜキャンセルが必要なのですか?(オプション)",
"rejection_reason": "拒否の理由",
"rejection_reason_title": "予約のリクエストを拒否しますか?",
"rejection_reason_description": "この予約を本当に拒否してよろしいですか?予約を試みたユーザーに対して通知を行います。以下に理由をご記入いただけます。",
"rejection_confirmation": "予約を拒否する",
"manage_this_event": "このイベントを管理する",
"your_event_has_been_scheduled": "イベントがスケジュールされました",
"accept_our_license": ".env 変数 <1>NEXT_PUBLIC_LICENSE_CONSENT</1> を '{{agree}} ' に変更することで、ライセンスを承認します。",
"remove_banner_instructions": "このバナーを削除するには、.envファイルを開き、<1>NEXT_PUBLIC_LICENSE_CONSENT</1>変数を「{{agree}}」に変更してください",
"error_message": "エラーメッセージ: '{{errorMessage}}'",
@ -28,7 +28,7 @@
"refund_failed": "{{userName}} の {{date}} の {{eventType}} に関するイベントの返金に失敗しました。",
"check_with_provider_and_user": "支払い業者に確認し、 {{userName}} の処理方法をご確認ください。",
"a_refund_failed": "返金に失敗しました",
"awaiting_payment_subject": "お支払いを待っています: {{date}} に開催される {{name}} の {{eventType}}",
"awaiting_payment_subject": "お支払いを待機しています: {{name}} による {{eventType}}、{{date}}",
"meeting_awaiting_payment": "会議の支払いを待っています",
"help": "ヘルプ",
"price": "料金",
@ -52,19 +52,19 @@
"integration_meeting_id": "{{integrationName}} ミーティングID: {{meetingId}}",
"confirmed_event_type_subject": "確認済: {{name}} の {{date}} の {{eventType}}",
"new_event_request": "新しいイベントのリクエスト: {{attendeeName}} - {{date}} - {{eventType}}",
"confirm_or_reject_request": "リクエストを承認または却下する",
"confirm_or_reject_request": "リクエストを承認または拒否する",
"check_bookings_page_to_confirm_or_reject": "予約ページを確認し、予約を確認または拒否してください。",
"event_awaiting_approval": "新しいイベントがあなたの承認を待っています",
"someone_requested_an_event": "誰かがあなたのカレンダーにイベントの追加をリクエストしています。",
"someone_requested_password_reset": "誰かがあなたのパスワードを変更するためのリンクをリクエストしました。",
"password_reset_instructions": "このメールをリクエストしていない場合は、このメールを無視してもパスワードは変更されません。",
"event_awaiting_approval_subject": "承認待ち: {{date}} に開催される {{name}} による {{eventType}}",
"event_still_awaiting_approval": "イベントはあなたの承認を待っています",
"someone_requested_an_event": "別のユーザーがあなたのカレンダーへのイベントの追加をリクエストしています。",
"someone_requested_password_reset": "別のユーザーがあなたのパスワードを変更するためのリンクをリクエストしています。",
"password_reset_instructions": "リクエストしていない場合には、このメールを無視していただいて構いません。これによりあなたのパスワードが変更されることはありません。",
"event_awaiting_approval_subject": "承認を待機しています: {{name}} による {{eventType}}、{{date}}",
"event_still_awaiting_approval": "承認待機中のイベントがあります",
"your_meeting_has_been_booked": "ミーティングが予約されました",
"event_type_has_been_rescheduled_on_time_date": "{{name}} と出席する {{eventType}} は ({{timeZone}}) の {{date}} {{time}} にスケジュール変更されました",
"event_has_been_rescheduled": "イベントのスケジュールが変更されました",
"hi_user_name": "こんにちは、 {{userName}}",
"ics_event_title": "{{name}} との{{eventType}}",
"ics_event_title": "{{name}} による {{eventType}}",
"new_event_subject": "新規イベント: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "{{entryPoint}} に参加する",
"notes": "メモ",
@ -80,22 +80,22 @@
"meeting_password": "ミーティングパスワード",
"meeting_url": "ミーティングID",
"meeting_request_rejected": "ミーティングリクエストが拒否されました",
"rescheduled_event_type_subject": "変更日時: {{date}}、 {{name}} と {{eventType}}",
"rescheduled_event_type_subject": "再スケジュールされました: {{name}} による {{eventType}}、{{date}}",
"rejected_event_type_with_organizer": "拒否: {{date}} の{{organizer}} による{{eventType}}",
"hi": "こんにちは",
"join_team": "チームに参加",
"manage_this_team": "このチームを管理する",
"team_info": "チーム情報",
"team_info": "チーム情報",
"request_another_invitation_email": "{{toEmail}} を Cal.com のメールアドレスとして使用しない場合、または Cal.com アカウントをすでに持っている場合は、そのメールへの別の招待をリクエストしてください。",
"you_have_been_invited": "チーム {{teamName}} に招待されました。",
"user_invited_you": "{{user}} さんがあなたをチーム {{teamName}} に招待しました",
"hidden_team_member_title": "あなたはこのチームで非表示になっています",
"hidden_team_member_message": "あなたの座席は、支払いが完了していません。Proにアップグレードするか、チームオーナーにあなたの座席の支払いを知らせてください。",
"hidden_team_owner_message": "チームを使用するにはプロアカウントが必要です。アップグレードするまで非表示になります。",
"hidden_team_member_title": "あなたはこのチームで非表示にされています",
"hidden_team_member_message": "座席料の支払いが完了していません。Pro へとアップグレードするか、チームのオーナーにあなたの座席料の支払いをご依頼ください。",
"hidden_team_owner_message": "チームをご利用いただくためには、Pro アカウントが必要です。アップグレードするまでは非表示となります。",
"link_expires": "追記: {{expiresIn}} 時間後に有効期限が切れます。",
"upgrade_to_per_seat": "座席毎にアップグレード",
"team_upgrade_seats_details": "あなたのチームメンバー {{memberCount}} の内、 {{unpaidCount}} 名のお席のお支払いが完了していません。1席あたり ${{seatPrice}} 、全てのお席の金額は ${{totalCost}} です。",
"team_upgraded_successfully": "チームは正常にアップグレードされました!",
"upgrade_to_per_seat": "座席ごとにアップグレードする",
"team_upgrade_seats_details": "あなたのチームのメンバー {{memberCount}} 名の内 {{unpaidCount}} 名のユーザーの座席料の支払いが完了していません。1 座席あたりの金額は ${{seatPrice}}、すべての座席の合計金額は ${{totalCost}} です。",
"team_upgraded_successfully": "チームのアップグレードが正常に完了しました!",
"use_link_to_reset_password": "以下のリンクを使用してパスワードをリセットしてください",
"hey_there": "こんにちは!",
"forgot_your_password_calcom": "パスワードをお忘れですか? - Cal.com",
@ -243,15 +243,15 @@
"failed": "失敗",
"password_has_been_reset_login": "パスワードがリセットされました。新しく作成したパスワードでログインできるようになりました。",
"unexpected_error_try_again": "予期しないエラーが発生しました。再試行してください。",
"sunday_time_error": "日曜日の無効な時間",
"monday_time_error": "月曜日の無効な時間",
"tuesday_time_error": "火曜日の無効な時間",
"wednesday_time_error": "水曜日の無効な時間",
"thursday_time_error": "木曜日の無効な時間",
"friday_time_error": "金曜日の無効な時間",
"saturday_time_error": "土曜日の無効な時間",
"error_end_time_before_start_time": "終了時刻は開始時刻の前にすることはできません",
"error_end_time_next_day": "終了時刻は24時間以上にすることはできません",
"sunday_time_error": "日曜日の時間が無効です",
"monday_time_error": "月曜日の時間が無効です",
"tuesday_time_error": "火曜日の時間が無効です",
"wednesday_time_error": "水曜日の時間が無効です",
"thursday_time_error": "木曜日の時間が無効です",
"friday_time_error": "金曜日の時間が無効です",
"saturday_time_error": "土曜日の時間が無効です",
"error_end_time_before_start_time": "終了時刻を開始時刻よりも前の時刻に設定することはできません",
"error_end_time_next_day": "終了時刻に 24 時を超える時刻を設定することはできません",
"back_to_bookings": "予約に戻る",
"free_to_pick_another_event_type": "好きな他のイベントを選んでください。",
"cancelled": "キャンセルしました",
@ -408,7 +408,7 @@
"email_or_username": "メールアドレスまたはユーザー名",
"send_invite_email": "招待メールを送信",
"role": "権限",
"edit_role": "役割を編集",
"edit_role": "役割を編集する",
"edit_team": "チームを編集",
"reject": "拒否",
"accept": "許可",
@ -429,7 +429,7 @@
"invite": "招待する",
"invite_new_member": "新しいメンバーを招待する",
"invite_new_team_member": "チームに誰かを招待します。",
"change_member_role": "チームメンバーの役割を変更",
"change_member_role": "チームメンバーの役割を変更する",
"disable_cal_branding": "Cal.comのブランディングを無効にする",
"disable_cal_branding_description": "Cal.comのすべてのブランディングを公開ページから非表示にする。",
"danger_zone": "危険なエリア",
@ -445,7 +445,7 @@
"remove_member": "メンバーを削除",
"manage_your_team": "チームを管理",
"no_teams": "まだチームがありません。",
"no_teams_description": "チームを使用すると、同僚間で共有されたイベントを予約できます。",
"no_teams_description": "チームを使用することにより、同僚の間で共有されているイベントを予約できるようになります。",
"submit": "送信",
"delete": "削除",
"update": "更新",
@ -453,16 +453,16 @@
"pending": "保留中",
"open_options": "オプションを開く",
"copy_link": "イベントのリンクをコピー",
"share": "シェアする",
"share_event": "私のカルを予約もしくはリンクを送っていただけますか?",
"copy_link_team": "チームにリンクをコピー",
"leave_team": "チームから退する",
"confirm_leave_team": "はい、チームから退出します",
"leave_team_confirmation_message": "このチームから退してよろしいですか?チームを使用して予約することができなくなります。",
"user_from_team": "{{user}} からの {{team}}",
"share": "共有する",
"share_event": "私のカレンダーを予約するか、あなたのリンクを送っていただけませんか?",
"copy_link_team": "チームにリンクをコピーする",
"leave_team": "チームから退する",
"confirm_leave_team": "はい。チームから脱退します",
"leave_team_confirmation_message": "このチームから本当に脱退してよろしいですか?チームを使用して予約を行うことができなくなります。",
"user_from_team": "{{team}} の {{user}}",
"preview": "プレビュー",
"link_copied": "リンクをコピーしました!",
"link_shared": "リンクを共有",
"link_shared": "リンクを共有しました",
"title": "タイトル",
"description": "説明",
"quick_video_meeting": "短時間のビデオミーティング。",
@ -477,11 +477,11 @@
"url": "URL",
"hidden": "隠れている",
"readonly": "読み込み専用",
"plan_description": "あなたは現在 {{plan}} プランを利用中です。",
"plan_upgrade_invitation": "アカウントをプロプランにアップグレードすると、当社が提供するすべての機能が利用可能となります。",
"plan_description": "現在あなたは {{plan}} プランを利用しています。",
"plan_upgrade_invitation": "アカウントを Pro プランへとアップグレードすると、弊社が提供するすべての機能をご利用いただけるようになります。",
"plan_upgrade": "複数の有効なイベントタイプを持つには、プランをアップグレードする必要があります。",
"plan_upgrade_teams": "チームを作成するには、プランをアップグレードする必要があります。",
"plan_upgrade_instructions": "<1>ここでアップグレード</1>ができます。",
"plan_upgrade_teams": "チームを作成するためには、プランのアップグレードを行う必要があります。",
"plan_upgrade_instructions": "<1>こちらからアップグレード</1>を行うことができます。",
"event_types_page_title": "イベント種別",
"event_types_page_subtitle": "人々があなたのカレンダーを予約するために共有するイベントを作成します。",
"new_event_type_btn": "新しいイベントの種類",
@ -494,8 +494,8 @@
"event_type_created_successfully": "{{eventTypeTitle}} イベント種別が正常に作成されました",
"event_type_updated_successfully": "{{eventTypeTitle}} イベント種別が正常に更新されました",
"event_type_deleted_successfully": "イベント種別が正常に削除されました",
"web3_metamask_added": "メタマスクの追加に成功しました",
"web3_metamask_disconnected": "メタマスクの接続が解除されました",
"web3_metamask_added": "メタマスクが正常に追加されました",
"web3_metamask_disconnected": "メタマスクの接続が正常に解除されました",
"hours": "時間",
"your_email": "あなたのメールアドレス",
"change_avatar": "アバターを変更",
@ -514,15 +514,15 @@
"create_first_team_and_invite_others": "あなたの最初のチームを作成し、あなたと一緒に仕事をするために他のユーザーを招待してください。",
"create_team_to_get_started": "始めるためにチームを作成",
"teams": "チーム",
"team_billing": "チーム請求",
"upgrade_to_flexible_pro_title": "チームへの請求を変更しました",
"upgrade_to_flexible_pro_message": "あなたのチームには座席がないメンバーがいます。プロプランにアップグレードして不足している席を確保してください。",
"changed_team_billing_info": "2022年1月より、チームメンバーの座席単位で料金を請求します. Proを無料で利用したチームメンバーは、14日間の試用期間中です。 試用期間が終了すると、今すぐアップグレードしない限り、これらのメンバーはチームに表示されなくなります.",
"team_billing": "チーム請求",
"upgrade_to_flexible_pro_title": "チームへの請求内容を変更しました",
"upgrade_to_flexible_pro_message": "あなたのチームには座席がないメンバーがいます。Pro プランへとアップグレードし、不足している座席を確保してください。",
"changed_team_billing_info": "2022 年 1 月より、チームのメンバーには座席単位で料金が請求されます。Pro プランを無料でご利用いただいていたチームメンバーにつきましては、現在は 14 日間のトライアル期間中となっています。今すぐアップグレードしない限り、トライアル期間の終了とともにこれらのメンバーはあなたのチームにおいて非表示となります。",
"create_manage_teams_collaborative": "共同作業機能を使用するチームを作成および管理します。",
"only_available_on_pro_plan": "この機能はProプランでのみ利用できます。",
"remove_cal_branding_description": "予約ページからカルブランディングを削除するには、Proアカウントにアップグレードする必要があります。",
"edit_profile_info_description": "スケジューリングリンクに表示されるプロフィール情報を編集します。",
"change_email_tip": "変更を有効にするには、ログアウトして再度ログインする必要があります。",
"change_email_tip": "変更内容を有効にするには、一度ログアウトしてから再度ログインを行う必要があります。",
"little_something_about": "あなた自身につい何か少し。",
"profile_updated_successfully": "プロフィールが正常に更新されました",
"your_user_profile_updated_successfully": "ユーザープロフィールの更新が完了しました。",
@ -545,7 +545,7 @@
"add_attendees": "出席者を追加",
"show_advanced_settings": "詳細設定を表示",
"event_name": "イベント名",
"event_name_tooltip": "カレンダーに表示る名前",
"event_name_tooltip": "カレンダーに表示される名前",
"meeting_with_user": "{USER} とのミーティング",
"additional_inputs": "追加入力",
"label": "ラベル",
@ -586,16 +586,16 @@
"length": "長さ",
"minimum_booking_notice": "最低限の予約通知",
"slot_interval": "時間帯の間隔",
"slot_interval_default": "イベントの長さを使用 (デフォルト)",
"slot_interval_default": "イベントの長さを使用する (デフォルト)",
"delete_event_type_description": "このイベント種別を削除してもよろしいですか? あなた&apos;veがこのリンクを共有した人は、もはやそれを使用して予約することはできません。",
"delete_event_type": "イベント種別を削除",
"confirm_delete_event_type": "はい、イベント種別を削除します",
"delete_account": "アカウントを削除",
"confirm_delete_account": "はいアカウントを削除します",
"delete_account_confirmation_message": "本当にあなたのアカウントを削除してもよろしいですか?あなたのアカウントリンクを共有している人は、あなたのアカウントを使用して予約することができなくなり、保存した設定は失われます。",
"delete_account": "アカウントを削除する",
"confirm_delete_account": "はいアカウントを削除します",
"delete_account_confirmation_message": "あなたの Cal.com アカウントを本当に削除してもよろしいですか?あなたのアカウントリンクを共有しているユーザーは、そのアカウントを使用して予約を行うことができなくなり、保存していた設定も失われます。",
"integrations": "統合",
"settings": "設定",
"event_type_moved_successfully": "イベントタイプが正常に移動しました",
"event_type_moved_successfully": "イベントの種類が正常に移動されました",
"next_step": "手順をスキップ",
"prev_step": "前の手順",
"installed": "インストール済み",
@ -604,39 +604,39 @@
"connect_your_favourite_apps": "お気に入りのアプリを接続する",
"automation": "自動化",
"configure_how_your_event_types_interact": "イベント種別とカレンダーをどのように連携するかを設定します。",
"select_destination_calendar": "イベントを作成:",
"select_destination_calendar": "以下にイベントを作成する",
"connect_an_additional_calendar": "追加のカレンダーを接続する",
"conferencing": "ミーティング中",
"calendar": "カレンダー",
"not_installed": "インストールされていません",
"error_password_mismatch": "パスワードが一致しません。",
"error_required_field": "この項目は必須です。",
"status": "ステータス:",
"team_view_user_availability": "ユーザーの利用可否を表示",
"team_view_user_availability_disabled": "利用可否を確認するには招待を承認する必要があります",
"set_as_away": "自分自身を離れた状態に設定する",
"set_as_free": "離れた状態の無効化",
"user_away": "このユーザーは現在離れています。",
"user_away_description": "あなたが予約しようとしている人は離れています。そのため、新しい予約を受け入れていません.",
"meet_people_with_the_same_tokens": "同じトークンを持つ人に会いに行く",
"only_book_people_and_allow": "同じトークン、DAO、またはNFTを共有する人々からの予約のみ予約できます。",
"saml_config_deleted_successfully": "SAML設定を削除しました",
"account_created_with_identity_provider": "あなたのアカウントはIDプロバイダーを使用して作成されました。",
"status": "状態",
"team_view_user_availability": "ユーザーの状態を表示する",
"team_view_user_availability_disabled": "状態を表示するには、招待を承認する必要があります",
"set_as_away": "自分を離席中に設定する",
"set_as_free": "離席中状態を無効化する",
"user_away": "このユーザーは現在離席中です。",
"user_away_description": "あなたが予約しようとしているユーザーは離席中です。そのため、新しい予約を承認することができません。",
"meet_people_with_the_same_tokens": "同じトークンを持っているユーザーに会う",
"only_book_people_and_allow": "同じトークン、DAO、NFT を共有するユーザーからの予約や予約の許可のみが可能です。",
"saml_config_deleted_successfully": "SAML の構成が正常に削除されました",
"account_created_with_identity_provider": "あなたのアカウントは ID プロバイダーを使用して作成されました。",
"account_managed_by_identity_provider": "あなたのアカウントは {{provider}} によって管理されています",
"account_managed_by_identity_provider_description": "メールアドレスやパスワードの変更、二段階認証を有効にするには {{provider}} アカウント設定をご覧ください。",
"signin_with_google": "Googleアカウントでログイン",
"signin_with_saml": "SAMLでログイン",
"saml_configuration": "SAML設定",
"delete_saml_configuration": "SAMLの設定を削除",
"delete_saml_configuration_confirmation_message": "SAML設定を削除してもよろしいですか? SAMLでログインしているチームメンバーは、Cal.comにアクセスできなくなります。",
"confirm_delete_saml_configuration": "はい、SAML設定を削除します",
"saml_not_configured_yet": "SAMLが設定されていません",
"saml_configuration_description": "SAML設定を更新するには、以下のテキストボックスに、IDプロバイダーからSAML メタデータを貼り付けてください。",
"saml_configuration_placeholder": "IDプロバイダーからSAMLメタデータをここに貼り付けてください",
"saml_configuration_update_failed": "SAML設定の更新に失敗しました",
"saml_configuration_delete_failed": "SAML設定の削除に失敗しました",
"saml_email_required": "SAML IDプロバイダーを見つけるために、メールアドレスを入力してください",
"you_will_need_to_generate": "古いスケジュールツールからアクセストークンを生成する必要があります。",
"account_managed_by_identity_provider_description": "メールアドレスやパスワードを変更したり、二段階認証を有効にしたりするには、{{provider}} のアカウント設定をご確認ください。",
"signin_with_google": "Google アカウントを使用してサインイン",
"signin_with_saml": "SAML を使用してサインイン",
"saml_configuration": "SAML の構成",
"delete_saml_configuration": "SAML の構成を削除する",
"delete_saml_configuration_confirmation_message": "SAML の構成を本当に削除してよろしいですかSAML を使用してログインしているチームメンバーは、Cal.com にアクセスすることができなくなります。",
"confirm_delete_saml_configuration": "はい。SAML の構成を削除します",
"saml_not_configured_yet": "SAML がまだ構成されていません",
"saml_configuration_description": "SAML の構成を更新するには、以下のテキストボックスに ID プロバイダーから提供されている SAML のメタデータを貼り付けてください。",
"saml_configuration_placeholder": "ID プロバイダーから提供されている SAML のメタデータをこちらに貼り付けてください",
"saml_configuration_update_failed": "SAML の構成を更新することができませんでした",
"saml_configuration_delete_failed": "SAML の構成を削除することができませんでした",
"saml_email_required": "SAML ID プロバイダーを見つけるために、メールアドレスを入力してください",
"you_will_need_to_generate": "従来のスケジュールツールからアクセストークンを生成する必要があります。",
"import": "インポートする",
"import_from": "インポート元",
"access_token": "アクセストークン",
@ -644,18 +644,18 @@
"remove": "削除する",
"add": "追加する",
"verify_wallet": "ウォレットを確認する",
"connect_metamask": "メタマスク接続する",
"create_events_on": "イベントを作成:",
"missing_license": "ライセンスがりません",
"connect_metamask": "メタマスク接続する",
"create_events_on": "以下にイベントを作成する:",
"missing_license": "ライセンスが見つかりません",
"signup_requires": "商用ライセンスが必要です",
"signup_requires_description": "Cal.com, Inc.は現在、無料のオープンソース版のサインアップページを提供していません。 サインアップコンポーネントへのフルアクセスを受けるには、商用ライセンスを取得する必要があります。 個人的に使用するには、Prisma Data Platformまたは他のPostgresインターフェースを使用してアカウントを作成することをお勧めします。",
"signup_requires_description": "Cal.com, Inc. は、現時点ではサインアップページの無料のオープンソース版を提供しておりません。サインアップコンポーネントへのフルアクセスをご利用いただくためには、商用ライセンスを取得する必要があります。個人での利用につきましては、Prisma Data Platform またはその他の Postgres インターフェースを使用してアカウントの作成を行うことをお勧めしております。",
"next_steps": "次のステップ",
"acquire_commercial_license": "商用ライセンスを取得する",
"the_infrastructure_plan": "インフラストラクチャプランは、使用ベースとなっておりスタートアップには割引があります。",
"prisma_studio_tip": "Prisma Studio経由でアカウントを作成する",
"the_infrastructure_plan": "インフラストラクチャプランは使用量に応じて課金され、スタートアップに優しい割引制度もあります。",
"prisma_studio_tip": "Prisma Studio を介してアカウントを作成する",
"prisma_studio_tip_description": "最初のユーザーを設定する方法を学ぶ",
"contact_sales": "営業担当に問い合わせ",
"error_404": "エラー 404",
"requires_ownership_of_a_token": "次のアドレスに属するトークンの所有権が必要です:",
"contact_sales": "営業担当に問い合わせ",
"error_404": "404 エラー",
"requires_ownership_of_a_token": "次のアドレスに属するトークンの所有権が必要となります:",
"example_name": "山田太朗"
}

View File

@ -1,4 +1,8 @@
{
"trial_days_left": "PRO 평가판의 남은 기한 $t(day, {\"count\": {{days}} })",
"day": "{{count}}일",
"day_plural": "{{count}}일",
"upgrade_now": "지금 업그레이드",
"accept_invitation": "초대 수락",
"calcom_explained": "Cal.com은 오픈 소스 Calendly 대안으로 자신의 데이터, 워크플로 및 형태를 컨트롤할 수 있습니다.",
"have_any_questions": "질문이 있나요? 도와드릴게요.",
@ -9,6 +13,12 @@
"event_request_cancelled": "회의 일정이 취소되었습니다.",
"organizer": "주최자",
"need_to_reschedule_or_cancel": "다시 일정을 잡거나 취소하시겠습니까?",
"cancellation_reason": "취소 사유",
"cancellation_reason_placeholder": "왜 취소를 선택하셨나요? (선택사항)",
"rejection_reason": "거부 사유",
"rejection_reason_title": "예약 요청을 거부하시겠습니까?",
"rejection_reason_description": "예약을 거부하시겠습니까? 예약하려고 시도하셨던 다른 분께 알려드릴 것입니다. 해당 사유는 아래에서 제공하실 수 있습니다.",
"rejection_confirmation": "예약 취소",
"manage_this_event": "이 이벤트 관리",
"your_event_has_been_scheduled": "귀하의 이벤트가 예약되었습니다.",
"accept_our_license": "<1>NEXT_PUBLIC_LICENSE_CONSENT</1> 환경 변수를 '{{agree}}'로 바꾸어 라이선스를 허용해주십시오.",
@ -16,6 +26,7 @@
"error_message": "오류 메시지는: '{{errorMessage}}'",
"refund_failed_subject": "환불 실패: {{name}} - {{date}} - {{eventType}}",
"refund_failed": "{{date}} {{userName}} 의 {{eventType}} 이벤트에 대한 환불이 이루어지지 않았습니다.",
"check_with_provider_and_user": "이 문제의 처리 방법은 결제 제공업체 및 {{user}}에서 확인하십시오.",
"a_refund_failed": "환불이 이루어지지 않았습니다.",
"awaiting_payment_subject": "결제를 기다리고 있습니다: {{date}} {{name}} 의 {{eventType}}",
"meeting_awaiting_payment": "회의를 위해 결제해 주십시오.",
@ -73,10 +84,18 @@
"rejected_event_type_with_organizer": "거절됨: {{date}} {{organizer}} 의 {{eventType}}",
"hi": "안녕하세요",
"join_team": "팀에 합류하세요",
"manage_this_team": "이 팀 관리",
"team_info": "팀 정보",
"request_another_invitation_email": "{{toEmail}} 을 Cal.com 계정에 사용하고 싶지 않거나 이미 Cal.com 계정이 있는 경우, 그 메일로 초대를 요청하세요.",
"you_have_been_invited": "{{teamName}} 팀에 초대되셨습니다.",
"user_invited_you": "{{user}} 님께서 Cal.com의 {{team}} 으로 초대하셨습니다.",
"hidden_team_member_title": "귀하는 이 팀에서 숨겨졌습니다",
"hidden_team_member_message": "귀하의 시트 비용은 Pro로 업그레이드하든, 팀 소유자에게 그들이 귀하의 시트 비용을 지불할 수 있다고 알리든, 어떤 경우에도 지불되지 않습니다.",
"hidden_team_owner_message": "팀을 사용하려면 Pro 계정이 필요합니다. 귀하의 계정은 업그레이드할 때까지 숨겨졌습니다.",
"link_expires": "{{expiresIn}} 시간 안에 만료됩니다.",
"upgrade_to_per_seat": "시트 단위로 업그레이드",
"team_upgrade_seats_details": "귀하의 팀원 {{memberCount}}명 중 {{unpaidCount}}명의 시트 비용이 미지급되었습니다. 시트당 ${{seatPrice}}/m로 계산시, 예상 총 멤버십 비용은 ${{totalCost}}/m입니다.",
"team_upgraded_successfully": "팀이 성공적으로 업그레이드되었습니다!",
"use_link_to_reset_password": "비밀번호를 재설정하시려면 아래 링크를 사용하세요.",
"hey_there": "안녕하세요.",
"forgot_your_password_calcom": "비밀번호를 잊어버리셨나요? - Cal.com",
@ -153,6 +172,7 @@
"30min_meeting": "30분 회의",
"secret_meeting": "비밀 회의",
"login_instead": "로그인하십시오",
"already_have_an_account": "이미 계정이 있으신가요?",
"create_account": "계정 만들기",
"confirm_password": "비밀번호 확인",
"create_your_account": "계정 만들기",
@ -223,6 +243,15 @@
"failed": "실패",
"password_has_been_reset_login": "비밀번호가 초기화되었습니다. 이제 새로 생성한 비밀번호로 로그인할 수 있습니다.",
"unexpected_error_try_again": "예기치 않은 오류가 발생했습니다. 다시 시도하십시오.",
"sunday_time_error": "일요일 유효하지 않은 시간",
"monday_time_error": "월요일 유효하지 않은 시간",
"tuesday_time_error": "화요일 유효하지 않은 시간",
"wednesday_time_error": "수요일 유효하지 않은 시간",
"thursday_time_error": "목요일 유효하지 않은 시간",
"friday_time_error": "금요일 유효하지 않은 시간",
"saturday_time_error": "토요일 유효하지 않은 시간",
"error_end_time_before_start_time": "종료 시간은 시작 시간보다 이를 수 없습니다",
"error_end_time_next_day": "종료 시간은 24시간보다 클 수 없습니다",
"back_to_bookings": "예약으로 돌아가기",
"free_to_pick_another_event_type": "언제든지 다른 이벤트를 선택할 수 있습니다.",
"cancelled": "취소됨",
@ -246,6 +275,7 @@
"upcoming_bookings": "누군가 당신과 회의를 예약하는 즉시 여기에 표시됩니다.",
"past_bookings": "과거 예약이 여기에 표시됩니다.",
"cancelled_bookings": "취소된 예약이 여기에 표시됩니다.",
"on": "-",
"and": "그리고",
"calendar_shows_busy_between": "캘린더는 사이에 당신이 바쁘다고 표시합니다.",
"troubleshoot": "문제 해결",
@ -301,6 +331,7 @@
"no_event_types_have_been_setup": "사용자가 이벤트 타입을 설정하지 않았습니다.",
"edit_logo": "로고 수정하기",
"upload_a_logo": "로고 업로드",
"remove_logo": "로고 제거",
"enable": "활성화",
"code": "코드",
"code_is_incorrect": "코드가 잘못되었습니다.",
@ -377,6 +408,7 @@
"email_or_username": "이메일 혹은 사용자이름",
"send_invite_email": "초대 이메일 보내기",
"role": "역할",
"edit_role": "역할 편집",
"edit_team": "팀 수정",
"reject": "거부",
"accept": "수용하기",
@ -392,10 +424,12 @@
"members": "회원",
"member": "회원",
"owner": "소유자",
"admin": "관리",
"new_member": "새 회원",
"invite": "초대",
"invite_new_member": "새 멤버 초대",
"invite_new_team_member": "누군가를 팀에 초대하기",
"change_member_role": "팀원 역할 변경",
"disable_cal_branding": "Cal.com 브랜딩 비활성화",
"disable_cal_branding_description": "공개 페이지에서 모든 Cal.com 브랜딩 숨기기",
"danger_zone": "위험 구역",
@ -404,11 +438,14 @@
"continue": "계속하기",
"confirm": "확인",
"disband_team": "팀 해체",
"disband_team_confirmation_message": "이 팀을 해산하시겠습니까? 이 팀 링크를 공유한 모든 사람이 더 이상 이 링크를 사용하여 예약할 수 없습니다.",
"remove_member_confirmation_message": "이 멤버를 팀에서 제거하시겠습니까?",
"confirm_disband_team": "네, 팀을 해체합니다.",
"confirm_remove_member": "예, 회원을 제거합니다.",
"remove_member": "회원 삭제",
"manage_your_team": "팀 관리",
"no_teams": "아직 팀이 하나도 없습니다.",
"no_teams_description": "팀을 통해 다른 사람들이 동료 간 공유된 이벤트를 예약할 수 있습니다.",
"submit": "제출하기",
"delete": "지우기",
"update": "업데이트",
@ -416,9 +453,16 @@
"pending": "보류 중",
"open_options": "옵션 열기",
"copy_link": "이벤트 링크 복사",
"share": "공유",
"share_event": "내 Cal을 예약하거나 링크를 보내 주시겠습니까?",
"copy_link_team": "팀에 링크 복사",
"leave_team": "팀 떠나기",
"confirm_leave_team": "예, 팀을 떠납니다",
"leave_team_confirmation_message": "이 팀에서 나가시겠습니까? 더 이상 이 팀을 이용해 예약할 수 없습니다.",
"user_from_team": "{{team}}의 {{user}}",
"preview": "미리보기",
"link_copied": "링크가 복사되었습니다!",
"link_shared": "링크가 공유되었습니다!",
"title": "제목",
"description": "설명",
"quick_video_meeting": "빠른 화상 회의.",
@ -433,8 +477,11 @@
"url": "링크",
"hidden": "숨기기",
"readonly": "읽기 전용",
"plan_description": "현재 {{plan}} 요금제를 사용 중입니다.",
"plan_upgrade_invitation": "귀하의 계정을 Pro 플랜으로 업그레이드하여 저희가 제공하는 모든 기능을 잠금 해제하십시오.",
"plan_upgrade": "활성 이벤트 타입이 두 개 이상 있도록 요금제를 업그레이드해야 합니다.",
"plan_upgrade_teams": "팀을 만들려면 요금제를 업그레이드해야 합니다.",
"plan_upgrade_instructions": "<1>여기</1>에서 업그레이드할 수 있습니다.",
"event_types_page_title": "이벤트 타입",
"event_types_page_subtitle": "사람들이 캘린더에서 예약할 수 있도록 공유할 이벤트를 만드세요.",
"new_event_type_btn": "새 이벤트 타입",
@ -447,6 +494,8 @@
"event_type_created_successfully": "{{eventTypeTitle}} 이벤트 타입이 성공적으로 생성되었습니다.",
"event_type_updated_successfully": "{{eventTypeTitle}} 이벤트 타입이 성공적으로 업데이트되었습니다.",
"event_type_deleted_successfully": "이벤트 타입이 성공적으로 삭제되었습니다.",
"web3_metamask_added": "메타마스크가 성공적으로 추가되었습니다",
"web3_metamask_disconnected": "메타마스크가 성공적으로 연결 해제되었습니다",
"hours": "시간",
"your_email": "이메일 주소",
"change_avatar": "아바타 변경하기",
@ -465,10 +514,15 @@
"create_first_team_and_invite_others": "첫 번째 팀을 만들고 함께 작업할 다른 사용자를 초대합니다.",
"create_team_to_get_started": "시작하려면 팀을 만드세요.",
"teams": "팀",
"team_billing": "팀 비용 청구",
"upgrade_to_flexible_pro_title": "팀에 대한 청구를 변경했습니다",
"upgrade_to_flexible_pro_message": "팀에 시트가 없는 구성원이 있습니다. 누락된 시트를 보완하려면 Pro 플랜을 업그레이드하세요.",
"changed_team_billing_info": "2022년 1월부터 팀원에 대해 시트별로 요금을 부과합니다. 무료로 Pro를 사용하던 팀원은 이제 14일 평가판을 사용할 수 있습니다. 평가판 기한이 만료되고 업그레이드하지 않으면 이 팀원은 팀에서 숨겨집니다.",
"create_manage_teams_collaborative": "협업 기능을 사용할 팀을 만들고 관리합니다.",
"only_available_on_pro_plan": "이 기능은 Pro 요금제에서만 사용할 수 있습니다.",
"remove_cal_branding_description": "예약 페이지에서 Cal 브랜드를 제거하려면 Pro 계정으로 업그레이드해야 합니다.",
"edit_profile_info_description": "일정 링크에 표시되는 프로필 정보를 수정합니다.",
"change_email_tip": "변경 사항을 적용하려면 로그아웃했다가 다시 로그인해야 할 수 있습니다.",
"little_something_about": "자신에 대해 조금 알려주세요.",
"profile_updated_successfully": "프로필이 업데이트되었습니다.",
"your_user_profile_updated_successfully": "사용자 프로필이 성공적으로 업데이트되었습니다.",
@ -491,6 +545,7 @@
"add_attendees": "참석자 추가하기",
"show_advanced_settings": "고급 설정 표시",
"event_name": "이벤트 이름",
"event_name_tooltip": "캘린더에 표시될 이름",
"meeting_with_user": "{USER} 님과의 회의",
"additional_inputs": "추가 입력",
"label": "레이블",
@ -530,8 +585,14 @@
"new_event_type_to_book_description": "사람들이 시간을 예약할 수 있는 새 이벤트 타입을 만듭니다.",
"length": "길이",
"minimum_booking_notice": "최소 예약 공지",
"slot_interval": "시간 슬롯 간격",
"slot_interval_default": "이벤트 길이 사용(기본값)",
"delete_event_type_description": "이 이벤트 유형을 삭제하시겠습니까? 이 링크를 공유한 사람은 더 이상 이 링크를 사용하여 예약할 수 없습니다.",
"delete_event_type": "이벤트 타입 삭제",
"confirm_delete_event_type": "예, 이벤트 타입을 삭제합니다.",
"delete_account": "계정 삭제",
"confirm_delete_account": "예, 계정을 삭제합니다",
"delete_account_confirmation_message": "Cal.com 계정을 삭제하시겠습니까? 계정 링크를 공유한 사람은 더 이상 이 링크를 사용하여 예약할 수 없으며 저장한 모든 기본 설정이 손실됩니다.",
"integrations": "통합",
"settings": "설정",
"event_type_moved_successfully": "이벤트 타입이 성공적으로 이동되었습니다.",
@ -543,10 +604,58 @@
"connect_your_favourite_apps": "좋아하는 앱을 연결하세요.",
"automation": "자동화",
"configure_how_your_event_types_interact": "이벤트 타입이 캘린더와 상호 작용하는 방식을 구성합니다.",
"select_destination_calendar": "이벤트 작성일",
"connect_an_additional_calendar": "추가 캘린더 연결",
"conferencing": "회의",
"calendar": "달력",
"not_installed": "설치되지 않음",
"error_password_mismatch": "비밀번호가 일치하지 않습니다.",
"error_required_field": "이 필드는 필수입니다."
"error_required_field": "이 필드는 필수입니다.",
"status": "상태",
"team_view_user_availability": "사용자 여유 보기",
"team_view_user_availability_disabled": "사용 가능 여부를 보려면 사용자가 초대를 수락해야 합니다",
"set_as_away": "본인을 공석으로 설정",
"set_as_free": "공석 상태 비활성화",
"user_away": "이 사용자는 현재 자리를 비웠습니다.",
"user_away_description": "예약하려는 사람이 자신을 공석으로 설정했기 때문에 새 예약을 받고 있지 않습니다.",
"meet_people_with_the_same_tokens": "같은 토큰을 가진 사람들을 만나세요",
"only_book_people_and_allow": "동일 토큰, DAO 또는 NFT를 공유하는 사람들의 예약만 허용합니다.",
"saml_config_deleted_successfully": "SAML 구성이 성공적으로 삭제되었습니다",
"account_created_with_identity_provider": "귀하의 계정은 ID 제공자를 사용하여 생성되었습니다.",
"account_managed_by_identity_provider": "귀하의 계정 관리자는 {{provider}}입니다",
"account_managed_by_identity_provider_description": "이메일, 비밀번호를 변경하고 이중 인증을 활성화하려면 {{provider}} 계정 설정을 방문하세요.",
"signin_with_google": "Google로 로그인",
"signin_with_saml": "SAML로 로그인",
"saml_configuration": "SAML 구성",
"delete_saml_configuration": "SAML 구성 삭제",
"delete_saml_configuration_confirmation_message": "SAML 구성을 삭제하시겠습니까? SAML 로그인을 사용하는 팀원은 더 이상 Cal.com에 액세스할 수 없습니다.",
"confirm_delete_saml_configuration": "예, SAML 구성을 삭제합니다",
"saml_not_configured_yet": "SAML이 아직 구성되지 않았습니다",
"saml_configuration_description": "SAML 구성을 업데이트하려면 ID 제공자의 SAML 메타데이터를 아래 텍스트 상자에 붙여넣으세요.",
"saml_configuration_placeholder": "여기에 ID 제공자의 SAML 메타데이터를 붙여넣으세요.",
"saml_configuration_update_failed": "SAML 구성 업데이트 실패",
"saml_configuration_delete_failed": "SAML 구성 삭제 실패",
"saml_email_required": "SAML ID 제공자를 찾을 수 있도록 이메일을 입력하세요.",
"you_will_need_to_generate": "이전 일정 관리 도구에서 액세스 토큰을 생성해야 합니다.",
"import": "가져오기",
"import_from": "가져오기 위치",
"access_token": "토큰 액세스",
"visit_roadmap": "로드맵",
"remove": "제거",
"add": "추가",
"verify_wallet": "지갑 인증",
"connect_metamask": "메타마스크 연결",
"create_events_on": "이벤트 작성일:",
"missing_license": "라이선스 없음",
"signup_requires": "상용 라이선스 필요",
"signup_requires_description": "지금은 Cal.com, Inc.에서 가입 페이지의 무료 오픈 소스 버전을 제공하지 않습니다. 가입 구성 요소에 대한 정식 액세스 권한을 받으려면 상용 라이선스를 취득해야 합니다. 개인 용도의 경우 Prisma Data Platform 또는 기타 Postgres 인터페이스를 사용하여 계정을 생성하는 것이 좋습니다.",
"next_steps": "다음 단계",
"acquire_commercial_license": "상용 라이선스 취득하기",
"the_infrastructure_plan": "인프라 플랜은 사용량 기반이고 스타트업 위주의 할인을 제공합니다.",
"prisma_studio_tip": "Prisma Studio를 통해 계정 생성",
"prisma_studio_tip_description": "첫 사용자 설정 방법 알아보기",
"contact_sales": "영업팀에 문의",
"error_404": "오류 404",
"requires_ownership_of_a_token": "다음 주소에 속한 토큰의 소유권이 필요합니다:",
"example_name": "홍길동"
}

View File

@ -13,6 +13,12 @@
"event_request_cancelled": "Ваша запланированная встреча была отменена",
"organizer": "Организатор",
"need_to_reschedule_or_cancel": "Хотите перенести или отменить?",
"cancellation_reason": "Причина отмены",
"cancellation_reason_placeholder": "Укажите причину отмены (необязательное поле)",
"rejection_reason": "Причина отказа",
"rejection_reason_title": "Отказаться от бронирования?",
"rejection_reason_description": "Отказаться от брони? Мы сообщим пользователю, который пытался оформить бронь. Вы можете указать причину отказа ниже.",
"rejection_confirmation": "Отказаться от бронирования",
"manage_this_event": "Управление этой встречей",
"your_event_has_been_scheduled": "Запланирована новая встреча",
"accept_our_license": "Примите нашу лицензию, изменив переменную окружения <1>NEXT_PUBLIC_LICENSE_CONSENT</1> на '{{agree}}'.",
@ -78,10 +84,18 @@
"rejected_event_type_with_organizer": "Отклонено: {{eventType}} с {{organizer}} на {{date}}",
"hi": "Привет",
"join_team": "Вступить в команду",
"manage_this_team": "Управление этой командой",
"team_info": "Информация о команде",
"request_another_invitation_email": "Если вы не хотите использовать {{toEmail}} как ваш Cal.com адрес электронной почты или уже есть аккаунт Cal.com, пожалуйста, запросите другое приглашение на это письмо.",
"you_have_been_invited": "Вас пригласили присоединиться к команде {{teamName}}",
"user_invited_you": "{{user}} приглашает вас присоединиться к команде {{teamName}}",
"hidden_team_member_title": "В этой команде вы скрытый пользователь",
"hidden_team_member_message": "Ваше место не оплачено. Перейдите на аккаунт Pro или свяжитесь с руководителем команды, который сможет произвести оплату.",
"hidden_team_owner_message": "Чтобы работать с командами, необходим аккаунт Pro. До перехода на этот тариф Вы остаетесь скрытым пользователем.",
"link_expires": "p.s. Это истекает через {{expiresIn}} часов.",
"upgrade_to_per_seat": "Перейти на оплату из расчета за количество мест",
"team_upgrade_seats_details": "В вашей команде {{memberCount}} пользователей; из них не оплачено еще {{unpaidCount}} мест. При оплате ${{seatPrice}} в месяц за место общая сумма к оплате составляет ${{totalCost}} в месяц.",
"team_upgraded_successfully": "Вы успешно перешли на новый тариф для своей команды!",
"use_link_to_reset_password": "Используйте ссылку ниже, чтобы сбросить пароль",
"hey_there": "Привет,",
"forgot_your_password_calcom": "Забыли пароль? - Cal.com",
@ -158,6 +172,7 @@
"30min_meeting": "Встреча на 30 минут",
"secret_meeting": "Секретная встреча",
"login_instead": "Вход",
"already_have_an_account": "Уже есть аккаунт?",
"create_account": "Создать аккаунт",
"confirm_password": "Подтвердите пароль",
"create_your_account": "Создайте аккаунт",
@ -228,6 +243,15 @@
"failed": "Ошибка",
"password_has_been_reset_login": "Ваш пароль был сброшен. Теперь вы можете войти с новым паролем.",
"unexpected_error_try_again": "Произошла непредвиденная ошибка. Попробуйте еще раз.",
"sunday_time_error": "Недопустимое время в воскресенье",
"monday_time_error": "Недопустимое время в понедельник",
"tuesday_time_error": "Недопустимое время во вторник",
"wednesday_time_error": "Недопустимое время в среду",
"thursday_time_error": "Недопустимое время в четверг",
"friday_time_error": "Недопустимое время в пятницу",
"saturday_time_error": "Недопустимое время в субботу",
"error_end_time_before_start_time": "Время окончания не может быть ранее времени начала",
"error_end_time_next_day": "Время окончания не может позже 24 часов",
"back_to_bookings": "Вернуться к списку бронирований",
"free_to_pick_another_event_type": "Вы можете выбрать любое другое событие.",
"cancelled": "Отменено",
@ -420,6 +444,8 @@
"confirm_remove_member": "Да, удалить участника",
"remove_member": "Удалить участника",
"manage_your_team": "Управление вашей командой",
"no_teams": "У вас пока нет команд.",
"no_teams_description": "В команде другие пользователи могут бронировать совместные мероприятия с сотрудниками.",
"submit": "Отправить",
"delete": "Удалить",
"update": "Обновить",
@ -427,6 +453,8 @@
"pending": "В ожидании",
"open_options": "Открыть настройки",
"copy_link": "Скопировать ссылку на событие",
"share": "Поделиться",
"share_event": "Не могли бы вы забронировать нам встречу в Cal или отправить мне свою ссылку?",
"copy_link_team": "Скопировать ссылку на команду",
"leave_team": "Выйти из команды",
"confirm_leave_team": "Да, выйти из команды",
@ -434,6 +462,7 @@
"user_from_team": "{{user}} из {{team}}",
"preview": "Предпросмотр",
"link_copied": "Ссылка скопирована!",
"link_shared": "Ссылка отправлена!",
"title": "Заголовок",
"description": "Описание",
"quick_video_meeting": "Быстрая видео-встреча.",
@ -448,8 +477,11 @@
"url": "URL",
"hidden": "Скрытый",
"readonly": "Только для чтения",
"plan_description": "В настоящее время вы используете план {{plan}}.",
"plan_upgrade_invitation": "Перейдите на тарифный план Pro, чтобы воспользоваться всеми доступными функциями.",
"plan_upgrade": "Необходимо обновить тарифный план, чтобы иметь более одного активного типа события.",
"plan_upgrade_teams": "Вам нужно обновить тарифный план для создания команды.",
"plan_upgrade_instructions": "<1>Перейти на новый тарифный план</1>.",
"event_types_page_title": "Типы мероприятий",
"event_types_page_subtitle": "Создайте мероприятие, чтобы поделиться с людьми для бронирования в вашем календаре.",
"new_event_type_btn": "Новый тип мероприятия",
@ -462,6 +494,8 @@
"event_type_created_successfully": "{{eventTypeTitle}} тип мероприятия успешно создан",
"event_type_updated_successfully": "Шаблон события успешно обновлён",
"event_type_deleted_successfully": "Тип события успешно удален",
"web3_metamask_added": "Metamask успешно добавлен",
"web3_metamask_disconnected": "Metamask успешно отключен",
"hours": "Часы",
"your_email": "Ваш адрес электронной почты",
"change_avatar": "Изменить аватар",
@ -480,6 +514,10 @@
"create_first_team_and_invite_others": "Создайте свою первую команду и пригласите других пользователей работать вместе с вами.",
"create_team_to_get_started": "Создайте команду, чтобы начать работу",
"teams": "Команды",
"team_billing": "Условия расчета для команд",
"upgrade_to_flexible_pro_title": "Мы изменили условия расчета для команд",
"upgrade_to_flexible_pro_message": "В вашей команде есть пользователи без места. Перейдите на тарифный план Pro, чтобы получить недостающие места.",
"changed_team_billing_info": "С января 2022 года мы взимаем плату с членов команды за каждое место. Членам вашей команды, которые пользовались тарифным планом Pro бесплатно, теперь будет предоставлена 14-дневная пробная версия. Если вы не перейдете на тарифный план Pro сейчас, по истечении этого периода такие члены команды будут скрыты.",
"create_manage_teams_collaborative": "Создавайте и управляйте командами для использования совместных функций.",
"only_available_on_pro_plan": "Эта функция доступна только в Pro тарифе",
"remove_cal_branding_description": "Чтобы удалить брендинг Cal со страниц бронирования, необходимо перейти на Pro аккаунт.",
@ -580,6 +618,8 @@
"set_as_free": "Отключить статус \"отошел\"",
"user_away": "Этот пользователь в настоящее время отсутствует.",
"user_away_description": "Человек, с которым вы пытаетесь забронировать встречу - недоступен, поэтому он не принимает новых записей.",
"meet_people_with_the_same_tokens": "Проводите встречи с пользователями с такими же токенами",
"only_book_people_and_allow": "Теперь можно бронировать встречи и разрешить бронирование встреч только с пользователями, которые используют одинаковые токены, DAO или NFT.",
"saml_config_deleted_successfully": "Конфигурация SAML удалена",
"account_created_with_identity_provider": "Ваша учетная запись была создана с помощью идентификатора провайдера.",
"account_managed_by_identity_provider": "Ваш аккаунт управляется {{provider}}",
@ -600,5 +640,22 @@
"import": "Импорт",
"import_from": "Импортировать из",
"access_token": "Токен доступа",
"visit_roadmap": "План действий"
"visit_roadmap": "План действий",
"remove": "Удалить",
"add": "Добавить",
"verify_wallet": "Подтвердить кошелек",
"connect_metamask": "Подключить Metamask",
"create_events_on": "Создать мероприятия на:",
"missing_license": "Отсутствует лицензия",
"signup_requires": "Требуется коммерческая лицензия",
"signup_requires_description": "В настоящее время компания Cal.com, Inc. не предлагает бесплатную версию страницы регистрации с открытым исходным кодом. Чтобы получить полный доступ к компонентам входа в систему, необходимо приобрести коммерческую лицензию. Для личного пользования мы рекомендуем Prisma Data Platform или любой другой интерфейс Postgres для создания учетных записей.",
"next_steps": "Следующие шаги",
"acquire_commercial_license": "Приобрести коммерческую лицензию",
"the_infrastructure_plan": "Стоимость тарифного плана по развертыванию инфраструктуры зависит от вариантов использования; стартапам предоставляются скидки.",
"prisma_studio_tip": "Создать учетную запись через Prisma Studio",
"prisma_studio_tip_description": "Узнайте, как настроить первого пользователя",
"contact_sales": "Связаться с отделом продаж",
"error_404": "Ошибка 404",
"requires_ownership_of_a_token": "Нужно быть владельцем токена, относящегося к следующему адресу:",
"example_name": "Джон Доу"
}

View File

@ -66,6 +66,7 @@ async function getUserFromSession({
completedOnboarding: true,
destinationCalendar: true,
locale: true,
timeFormat: true,
},
});

View File

@ -75,6 +75,7 @@ const loggedInViewerRouter = createProtectedRouter()
endTime: user.endTime,
bufferTime: user.bufferTime,
locale: user.locale,
timeFormat: user.timeFormat,
avatar: user.avatar,
createdDate: user.createdDate,
completedOnboarding: user.completedOnboarding,
@ -612,6 +613,7 @@ const loggedInViewerRouter = createProtectedRouter()
theme: z.string().optional().nullable(),
completedOnboarding: z.boolean().optional(),
locale: z.string().optional(),
timeFormat: z.number().optional(),
}),
async resolve({ input, ctx }) {
const { user, prisma } = ctx;

View File

@ -0,0 +1,73 @@
import { expect, it } from "@jest/globals";
import dayjs from "dayjs";
import customParseFormat from "dayjs/plugin/customParseFormat";
import MockDate from "mockdate";
import { Availability } from "@calcom/prisma/client";
import { getAvailabilityFromSchedule } from "@lib/availability";
dayjs.extend(customParseFormat);
MockDate.set("2021-06-20T11:59:59Z");
//parse "hh:mm-hh:mm" into <Availability> object
const parseWorkingHours = (workingHours: string) => {
const times = workingHours.split("-").map((time) => dayjs(time, "hh:mm").toDate());
return { start: times[0], end: times[1] };
};
const p = parseWorkingHours;
// mocked working hours
const fulltimeWH = p("09:00-17:00");
const morningWH = p("09:00-12:00");
const afternoonWH = p("13:00-17:00");
it("should return an empty availability array when received an empty schedule", async () => {
const schedule = [[]];
expect(getAvailabilityFromSchedule(schedule)).toStrictEqual([]);
});
it("should return availability for all workable days from 9:00 to 17:00", async () => {
const schedule = [[], [fulltimeWH], [fulltimeWH], [fulltimeWH], [fulltimeWH], [fulltimeWH], []];
const expected = [
{
days: [1, 2, 3, 4, 5],
startTime: fulltimeWH.start,
endTime: fulltimeWH.end,
},
] as Availability[];
expect(getAvailabilityFromSchedule(schedule)).toStrictEqual(expected);
});
it("should return the available days grouped by the available time slots", async () => {
const schedule = [
[],
[afternoonWH],
[afternoonWH],
[morningWH, afternoonWH],
[fulltimeWH],
[morningWH],
[],
];
const expected = [
{
days: [1, 2, 3],
startTime: afternoonWH.start,
endTime: afternoonWH.end,
},
{
days: [3, 5],
startTime: morningWH.start,
endTime: morningWH.end,
},
{
days: [4],
startTime: fulltimeWH.start,
endTime: fulltimeWH.end,
},
] as Availability[];
expect(getAvailabilityFromSchedule(schedule)).toStrictEqual(expected);
});

1
apps/website Submodule

@ -0,0 +1 @@
Subproject commit aac908d6405603d2ef0554e5c43a55d4b7eb025c

View File

@ -12,7 +12,7 @@
"clean": "turbo run clean && rm -rf node_modules",
"db-deploy": "turbo run db-deploy",
"db-seed": "turbo run db-seed",
"db-studio": "yarn workspace @calcom/prisma db-view",
"db-studio": "yarn workspace @calcom/prisma db-studio",
"deploy": "turbo run deploy",
"dev": "turbo run dev --scope=\"@calcom/web\"",
"docs-dev": "turbo run dev --scope=\"@calcom/docs\"",
@ -53,7 +53,7 @@
]
},
"engines": {
"node": ">=14.x",
"node": ">=14.x <15",
"npm": ">=7.0.0",
"yarn": ">=1.19.0 < 2.0.0"
},

View File

@ -1,5 +1,9 @@
import { PrismaClient } from "@prisma/client";
declare global {
var prisma: PrismaClient;
}
export const prisma =
globalThis.prisma ||
new PrismaClient({

View File

@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "users" ADD COLUMN "timeFormat" INTEGER DEFAULT 12;

View File

@ -128,6 +128,7 @@ model User {
selectedCalendars SelectedCalendar[]
completedOnboarding Boolean @default(false)
locale String?
timeFormat Int? @default(12)
twoFactorSecret String?
twoFactorEnabled Boolean @default(false)
identityProvider IdentityProvider @default(CAL)

15
scripts/staging-deploy.sh Executable file
View File

@ -0,0 +1,15 @@
#!/bin/bash
echo "VERCEL_GIT_COMMIT_REF: $VERCEL_GIT_COMMIT_REF"
if [[ "$VERCEL_GIT_COMMIT_REF" == "staging" ]] ; then
# Proceed with the build
echo "✅ - Build can proceed"
./vercel.sh
exit 1;
else
# Don't build
echo "🛑 - Build cancelled"
exit 0;
fi

View File

@ -3,6 +3,10 @@
"baseBranch": "origin/main",
"globalDependencies": ["apps/web/.env", "packages/prisma/.env"],
"pipeline": {
"@calcom/prisma#build": {
"dependsOn": ["$DATABASE_URL"],
"outputs": ["zod/**"]
},
"@calcom/prisma#db-deploy": {},
"@calcom/prisma#db-reset": {
"cache": false
@ -81,11 +85,11 @@
},
"start": {},
"test": {
"dependsOn": ["@calcom/web#build", "@calcom/prisma#db-reset"]
"dependsOn": []
},
"test-e2e": {
"cache": false,
"dependsOn": ["^test"],
"dependsOn": ["^test", "@calcom/web#build", "@calcom/prisma#db-reset"],
"outputs": ["playwright", "test-results"]
},
"type-check": {

59
vercel.sh Executable file
View File

@ -0,0 +1,59 @@
# github submodule repo addresses without https:// prefix
# This didn't work ¯\_(ツ)_/¯
# declare -A remotes=(
# ["apps/website"]="github.com/calcom/website"
# ["apps/api"]="github.com/calcom/api"
# )
# github access token is necessary
# add it to Environment Variables on Vercel
if [ "$GITHUB_ACCESS_TOKEN" == "" ]; then
echo "Error: GITHUB_ACCESS_TOKEN is empty"
exit 1
fi
# stop execution on error - don't let it build if something goes wrong
set -e
# get submodule commit
output=$(git submodule status --recursive) # get submodule info
# Extract each submodule commit hash and path
submodules=$(echo $output | sed "s/ -/__/g" | sed "s/ /=/g" | sed "s/-//g" | tr "__" "\n")
git config --global init.defaultBranch main
git config --global advice.detachedHead false
for submodule in $submodules; do
IFS="=" read COMMIT SUBMODULE_PATH <<<"$submodule"
# This should be a hash table but couldn't make it work ¯\_(ツ)_/¯
# SUBMODULE_GITHUB=$remotes[$SUBMODULE_PATH]
if [ "$SUBMODULE_PATH" == "apps/website" ]; then
SUBMODULE_GITHUB=github.com/calcom/website
fi
if [ "$SUBMODULE_PATH" == "apps/api" ]; then
SUBMODULE_GITHUB=github.com/calcom/api
fi
# set up an empty temporary work directory
rm -rf tmp || true # remove the tmp folder if exists
mkdir tmp # create the tmp folder
cd tmp # go into the tmp folder
# checkout the current submodule commit
git init # initialise empty repo
git remote add $SUBMODULE_PATH https://$GITHUB_ACCESS_TOKEN@$SUBMODULE_GITHUB # add origin of the submodule
git fetch --depth=1 $SUBMODULE_PATH $COMMIT # fetch only the required version
git checkout $COMMIT # checkout on the right commit
# move the submodule from tmp to the submodule path
cd .. # go folder up
rm -rf tmp/.git # remove .git
mv tmp/* $SUBMODULE_PATH/ # move the submodule to the submodule path
# clean up
rm -rf tmp # remove the tmp folder
done