Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ac19e8307 | ||
|
|
344241cfbf | ||
|
|
66ebf18fa9 | ||
|
|
e6d6f3317e | ||
|
|
55f66e6bcd | ||
|
|
22e2b0a6a9 | ||
|
|
e24f3828cb | ||
|
|
70f5bdc499 | ||
|
|
8731a39c3c | ||
|
|
e2d9e75475 | ||
|
|
55c7707b94 | ||
|
|
98944d4815 | ||
|
|
faba25acbd | ||
|
|
aab5ee344c | ||
|
|
6880f88dbe | ||
|
|
9177fe86dc | ||
|
|
bf3f8acbc0 | ||
|
|
b4fa9826f2 | ||
|
|
955de3133c | ||
|
|
faac3d0f57 | ||
|
|
3fb1ede770 | ||
|
|
53224886e3 | ||
|
|
e513180d7e | ||
|
|
3116d6df1a | ||
|
|
4284a4d16d | ||
|
|
eadca3b2c0 | ||
|
|
68125af29f | ||
|
|
d436e628fe | ||
|
|
c5483c81de | ||
|
|
9db4a04cd9 | ||
|
|
8943e8c2f6 | ||
|
|
f17fa55426 | ||
|
|
9ff83075d6 | ||
|
|
6b6043afdc | ||
|
|
fd9162e70f | ||
|
|
8331059b7c | ||
|
|
f0992b4914 | ||
|
|
e081a4cfc2 | ||
|
|
895b3ca7c9 | ||
|
|
4d30264950 | ||
|
|
3a352a94f6 | ||
|
|
8623175612 | ||
|
|
ea531777c4 | ||
|
|
2639ef7e13 | ||
|
|
0e76a19c96 | ||
|
|
3ec9eb377d | ||
|
|
44b7000509 | ||
|
|
251307f1e6 | ||
|
|
75e638ec4d | ||
|
|
443ccdd6c0 | ||
|
|
dbf11cc04b | ||
|
|
a5c9729f5f | ||
|
|
a6e2983a22 | ||
|
|
a21f0c46c7 | ||
|
|
ed4a81e852 | ||
|
|
9231218350 | ||
|
|
7d1ea4ee2b | ||
|
|
0c68e51930 |
@@ -5,6 +5,7 @@
|
||||
# - SHARED
|
||||
# - NEXTAUTH
|
||||
# - E-MAIL SETTINGS
|
||||
# - ORGANIZATIONS
|
||||
|
||||
# - LICENSE (DEPRECATED) ************************************************************************************
|
||||
# https://github.com/calcom/cal.com/blob/main/LICENSE
|
||||
@@ -32,6 +33,8 @@ PRISMA_GENERATE_DATAPROXY=
|
||||
# ***********************************************************************************************************
|
||||
|
||||
# - SHARED **************************************************************************************************
|
||||
# Set this to http://app.cal.local:3000 if you want to enable organizations, and
|
||||
# check variable ORGANIZATIONS_ENABLED at the bottom of this file
|
||||
NEXT_PUBLIC_WEBAPP_URL='http://localhost:3000'
|
||||
# Change to 'http://localhost:3001' if running the website simultaneously
|
||||
NEXT_PUBLIC_WEBSITE_URL='http://localhost:3000'
|
||||
@@ -183,3 +186,26 @@ CSP_POLICY=
|
||||
EDGE_CONFIG=
|
||||
|
||||
NEXT_PUBLIC_MINUTES_TO_BOOK=5 # Minutes
|
||||
|
||||
# - ORGANIZATIONS *******************************************************************************************
|
||||
# Enable Organizations non-prod domain setup, works in combination with organizations feature flag
|
||||
# This is mainly needed locally, because for orgs to work a full domain name needs to point
|
||||
# to the app, i.e. app.cal.local instead of using localhost, which is very disruptive
|
||||
#
|
||||
# This variable should only be set to 1 or true if you are in a non-prod environment and you want to
|
||||
# use organizations
|
||||
ORGANIZATIONS_ENABLED=
|
||||
|
||||
# Vercel Config to create subdomains for organizations
|
||||
# Get it from https://vercel.com/<TEAM_OR_USER_NAME>/<PROJECT_SLUG>/settings
|
||||
PROJECT_ID_VERCEL=
|
||||
# Get it from: https://vercel.com/teams/<TEAM_SLUG>/settings
|
||||
TEAM_ID_VERCEL=
|
||||
# Get it from: https://vercel.com/account/tokens
|
||||
AUTH_BEARER_TOKEN_VERCEL=
|
||||
|
||||
#Enables New booker for Embed only
|
||||
NEW_BOOKER_ENABLED_FOR_EMBED=0
|
||||
|
||||
#Enables New booker for All but Embed requests
|
||||
NEW_BOOKER_ENABLED_FOR_NON_EMBED=0
|
||||
@@ -40,6 +40,14 @@ runs:
|
||||
restore-keys: |
|
||||
yarn-download-cache-
|
||||
|
||||
# Invalidated on yarn.lock changes
|
||||
- name: Restore node_modules
|
||||
id: yarn-nm-cache
|
||||
uses: buildjet/cache@v3
|
||||
with:
|
||||
path: "**/node_modules/"
|
||||
key: ${{ runner.os }}-yarn-nm-cache-${{ hashFiles('yarn.lock', '.yarnrc.yml') }}
|
||||
|
||||
# Invalidated on yarn.lock changes
|
||||
- name: Restore yarn install state
|
||||
id: yarn-install-state-cache
|
||||
@@ -58,5 +66,6 @@ runs:
|
||||
YARN_ENABLE_IMMUTABLE_INSTALLS: "false" # So it doesn't try to remove our private submodule deps
|
||||
YARN_ENABLE_GLOBAL_CACHE: "false" # Use local cache folder to keep downloaded archives
|
||||
YARN_INSTALL_STATE_PATH: .yarn/ci-cache/install-state.gz # Very small speedup when lock does not change
|
||||
YARN_NM_MODE: "hardlinks-local" # Reduce node_modules size
|
||||
# Other environment variables
|
||||
HUSKY: "0" # By default do not run HUSKY install
|
||||
|
||||
@@ -9,7 +9,7 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: ./.github/actions/dangerous-git-checkout
|
||||
- uses: ./.github/actions/yarn-install
|
||||
- name: Save Code Linting Reports
|
||||
- name: Run Linting with Reports
|
||||
run: yarn lint:report
|
||||
continue-on-error: true
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
changes:
|
||||
name: Detect changes
|
||||
runs-on: buildjet-4vcpu-ubuntu-2204
|
||||
permissions:
|
||||
pull-requests: read
|
||||
|
||||
@@ -201,6 +201,14 @@ echo 'NEXT_PUBLIC_DEBUG=1' >> .env
|
||||
1. Set a 32 character random string in your `.env` file for the `CALENDSO_ENCRYPTION_KEY` (You can use a command like `openssl rand -base64 24` to generate one).
|
||||
1. Set up the database using the Prisma schema (found in `packages/prisma/schema.prisma`)
|
||||
|
||||
In a development environment, run:
|
||||
|
||||
```sh
|
||||
yarn workspace @calcom/prisma db-migrate
|
||||
```
|
||||
|
||||
In a production environment, run:
|
||||
|
||||
```sh
|
||||
yarn workspace @calcom/prisma db-deploy
|
||||
```
|
||||
|
||||
@@ -2,6 +2,7 @@ import type { NextApiRequest } from "next";
|
||||
import { z } from "zod";
|
||||
|
||||
import { getUserAvailability } from "@calcom/core/getUserAvailability";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { HttpError } from "@calcom/lib/http-error";
|
||||
import { defaultResponder } from "@calcom/lib/server";
|
||||
import { availabilityUserSelect } from "@calcom/prisma";
|
||||
@@ -119,8 +120,10 @@ const availabilitySchema = z
|
||||
async function handler(req: NextApiRequest) {
|
||||
const { prisma, isAdmin, userId: reqUserId } = req;
|
||||
const { username, userId, eventTypeId, dateTo, dateFrom, teamId } = availabilitySchema.parse(req.query);
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(req.headers.host ?? "");
|
||||
if (!teamId)
|
||||
return getUserAvailability({
|
||||
orgSlug: isValidOrgDomain ? currentOrgDomain || undefined : undefined,
|
||||
username,
|
||||
dateFrom,
|
||||
dateTo,
|
||||
|
||||
@@ -50,6 +50,6 @@
|
||||
"storybook-react-i18next": "^1.1.2",
|
||||
"tailwindcss": "^3.2.1",
|
||||
"typescript": "^4.9.4",
|
||||
"vite": "^2.9.15"
|
||||
"vite": "^4.1.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,8 +8,11 @@ import { createRef, forwardRef, useRef, useState } from "react";
|
||||
import type { ControlProps } from "react-select";
|
||||
import { components } from "react-select";
|
||||
|
||||
import type { BookerLayout } from "@calcom/features/bookings/Booker/types";
|
||||
import { useFlagMap } from "@calcom/features/flags/context/provider";
|
||||
import { APP_NAME, EMBED_LIB_URL, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { BookerLayouts } from "@calcom/prisma/zod-utils";
|
||||
import {
|
||||
Button,
|
||||
Dialog,
|
||||
@@ -41,12 +44,13 @@ type PreviewState = {
|
||||
height: string;
|
||||
};
|
||||
theme: Theme;
|
||||
floatingPopup: Record<string, string>;
|
||||
floatingPopup: Record<string, string | boolean | undefined>;
|
||||
elementClick: Record<string, string>;
|
||||
palette: {
|
||||
brandColor: string;
|
||||
};
|
||||
hideEventTypeDetails: boolean;
|
||||
layout: BookerLayouts;
|
||||
};
|
||||
const queryParamsForDialog = ["embedType", "embedTabName", "embedUrl"];
|
||||
|
||||
@@ -129,11 +133,13 @@ const getEmbedUIInstructionString = ({
|
||||
theme,
|
||||
brandColor,
|
||||
hideEventTypeDetails,
|
||||
layout,
|
||||
}: {
|
||||
apiName: string;
|
||||
theme?: string;
|
||||
brandColor: string;
|
||||
hideEventTypeDetails: boolean;
|
||||
layout?: string;
|
||||
}) => {
|
||||
theme = theme !== "auto" ? theme : undefined;
|
||||
return getInstructionString({
|
||||
@@ -147,6 +153,7 @@ const getEmbedUIInstructionString = ({
|
||||
},
|
||||
},
|
||||
hideEventTypeDetails: hideEventTypeDetails,
|
||||
layout,
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -260,6 +267,7 @@ const getEmbedTypeSpecificString = ({
|
||||
theme: PreviewState["theme"];
|
||||
brandColor: string;
|
||||
hideEventTypeDetails: boolean;
|
||||
layout?: BookerLayout;
|
||||
};
|
||||
if (embedFramework === "react") {
|
||||
uiInstructionStringArg = {
|
||||
@@ -267,6 +275,7 @@ const getEmbedTypeSpecificString = ({
|
||||
theme: previewState.theme,
|
||||
brandColor: previewState.palette.brandColor,
|
||||
hideEventTypeDetails: previewState.hideEventTypeDetails,
|
||||
layout: previewState.layout,
|
||||
};
|
||||
} else {
|
||||
uiInstructionStringArg = {
|
||||
@@ -274,6 +283,7 @@ const getEmbedTypeSpecificString = ({
|
||||
theme: previewState.theme,
|
||||
brandColor: previewState.palette.brandColor,
|
||||
hideEventTypeDetails: previewState.hideEventTypeDetails,
|
||||
layout: previewState.layout,
|
||||
};
|
||||
}
|
||||
if (!frameworkCodes[embedType]) {
|
||||
@@ -626,6 +636,7 @@ const ThemeSelectControl = ({ children, ...props }: ControlProps<{ value: Theme;
|
||||
const ChooseEmbedTypesDialogContent = () => {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
|
||||
return (
|
||||
<DialogContent className="rounded-lg p-10" type="creation" size="lg">
|
||||
<div className="mb-2">
|
||||
@@ -671,6 +682,8 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
const router = useRouter();
|
||||
const iframeRef = useRef<HTMLIFrameElement>(null);
|
||||
const dialogContentRef = useRef<HTMLDivElement>(null);
|
||||
const flags = useFlagMap();
|
||||
const isBookerLayoutsEnabled = flags["booker-layouts"] === true;
|
||||
|
||||
const s = (href: string) => {
|
||||
const searchParams = new URLSearchParams(router.asPath.split("?")[1] || "");
|
||||
@@ -691,7 +704,7 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
|
||||
const [isEmbedCustomizationOpen, setIsEmbedCustomizationOpen] = useState(true);
|
||||
const [isBookingCustomizationOpen, setIsBookingCustomizationOpen] = useState(true);
|
||||
const [previewState, setPreviewState] = useState({
|
||||
const [previewState, setPreviewState] = useState<PreviewState>({
|
||||
inline: {
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
@@ -703,6 +716,7 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
palette: {
|
||||
brandColor: "#000000",
|
||||
},
|
||||
layout: BookerLayouts.MONTH_VIEW,
|
||||
});
|
||||
|
||||
const close = () => {
|
||||
@@ -765,6 +779,7 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
arg: {
|
||||
theme: previewState.theme,
|
||||
hideEventTypeDetails: previewState.hideEventTypeDetails,
|
||||
layout: previewState.layout,
|
||||
styles: {
|
||||
branding: {
|
||||
...previewState.palette,
|
||||
@@ -798,6 +813,12 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
{ value: Theme.light, label: "Light Theme" },
|
||||
];
|
||||
|
||||
const layoutOptions = [
|
||||
{ value: BookerLayouts.MONTH_VIEW, label: t("bookerlayout_month_view") },
|
||||
{ value: BookerLayouts.WEEK_VIEW, label: t("bookerlayout_week_view") },
|
||||
{ value: BookerLayouts.COLUMN_VIEW, label: t("bookerlayout_column_view") },
|
||||
];
|
||||
|
||||
const FloatingPopupPositionOptions = [
|
||||
{
|
||||
value: "bottom-right",
|
||||
@@ -1070,6 +1091,27 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
</div>
|
||||
</Label>
|
||||
))}
|
||||
{isBookerLayoutsEnabled && (
|
||||
<Label className="mb-6">
|
||||
<div className="mb-2">{t("layout")}</div>
|
||||
<Select
|
||||
className="w-full"
|
||||
defaultValue={layoutOptions[0]}
|
||||
onChange={(option) => {
|
||||
if (!option) {
|
||||
return;
|
||||
}
|
||||
setPreviewState((previewState) => {
|
||||
return {
|
||||
...previewState,
|
||||
layout: option.value,
|
||||
};
|
||||
});
|
||||
}}
|
||||
options={layoutOptions}
|
||||
/>
|
||||
</Label>
|
||||
)}
|
||||
</div>
|
||||
</CollapsibleContent>
|
||||
</Collapsible>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { DefaultSeo } from "next-seo";
|
||||
import { Inter } from "next/font/google";
|
||||
import localFont from "next/font/local";
|
||||
import Head from "next/head";
|
||||
import Script from "next/script";
|
||||
|
||||
import "@calcom/embed-core/src/embed-iframe";
|
||||
@@ -60,6 +61,12 @@ function PageWrapper(props: AppProps) {
|
||||
|
||||
return (
|
||||
<AppProviders {...providerProps}>
|
||||
<Head>
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
|
||||
/>
|
||||
</Head>
|
||||
<DefaultSeo
|
||||
// Set canonical to https://cal.com or self-hosted URL
|
||||
canonical={
|
||||
|
||||
@@ -83,7 +83,9 @@ const BookingDescription: FC<Props> = (props) => {
|
||||
size="sm"
|
||||
truncateAfter={3}
|
||||
/>
|
||||
<h2 className="text-default mt-1 mb-2 break-words text-sm font-medium ">{profile.name}</h2>
|
||||
<h2 className="text-default mt-1 mb-2 break-words text-sm font-medium ">
|
||||
{eventType.team?.parent?.name} {profile.name}
|
||||
</h2>
|
||||
<h1 className="font-cal text-emphasis mb-6 break-words text-2xl font-semibold leading-none">
|
||||
{eventType.title}
|
||||
</h1>
|
||||
|
||||
@@ -57,12 +57,15 @@ const LocationInput = (props: {
|
||||
<Input {...locationFormMethods.register(eventLocationType.variable)} type="text" {...remainingProps} />
|
||||
);
|
||||
} else if (eventLocationType?.organizerInputType === "phone") {
|
||||
const { defaultValue, ...rest } = remainingProps;
|
||||
|
||||
return (
|
||||
<Controller
|
||||
name={eventLocationType.variable}
|
||||
control={control}
|
||||
defaultValue={defaultValue}
|
||||
render={({ field: { onChange, value } }) => {
|
||||
return <PhoneInput onChange={onChange} value={value} {...remainingProps} />;
|
||||
return <PhoneInput onChange={onChange} value={value} {...rest} />;
|
||||
}}
|
||||
/>
|
||||
);
|
||||
@@ -88,6 +91,9 @@ export const EditLocationDialog = (props: ISetLocationDialog) => {
|
||||
useEffect(() => {
|
||||
if (selection) {
|
||||
locationFormMethods.setValue("locationType", selection?.value);
|
||||
if (selection?.address) {
|
||||
locationFormMethods.setValue("locationAddress", selection?.address);
|
||||
}
|
||||
}
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [selection]);
|
||||
@@ -149,12 +155,25 @@ export const EditLocationDialog = (props: ISetLocationDialog) => {
|
||||
name: "locationType",
|
||||
});
|
||||
|
||||
const selectedAddrValue = useWatch({
|
||||
control: locationFormMethods.control,
|
||||
name: "locationAddress",
|
||||
});
|
||||
|
||||
const eventLocationType = getEventLocationType(selectedLocation);
|
||||
|
||||
const defaultLocation = defaultValues?.find(
|
||||
(location: { type: EventLocationType["type"] }) => location.type === eventLocationType?.type
|
||||
(location: { type: EventLocationType["type"]; address?: string }) => {
|
||||
if (location.type === LocationType.InPerson) {
|
||||
return location.type === eventLocationType?.type && location.address === selectedAddrValue;
|
||||
} else {
|
||||
return location.type === eventLocationType?.type;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
console.log(defaultLocation);
|
||||
|
||||
const LocationOptions = (() => {
|
||||
if (eventLocationType && eventLocationType.organizerInputType && LocationInput) {
|
||||
if (!eventLocationType.variable) {
|
||||
|
||||
@@ -136,9 +136,17 @@ export const EventSetupTab = (
|
||||
selectedMultipleDuration.find((opt) => opt.value === eventType.length) ?? null
|
||||
);
|
||||
|
||||
const openLocationModal = (type: EventLocationType["type"]) => {
|
||||
const openLocationModal = (type: EventLocationType["type"], address = "") => {
|
||||
const option = getLocationFromType(type, locationOptions);
|
||||
setSelectedLocation(option);
|
||||
if (option && option.value === LocationType.InPerson) {
|
||||
const inPersonOption = {
|
||||
...option,
|
||||
address,
|
||||
};
|
||||
setSelectedLocation(inPersonOption);
|
||||
} else {
|
||||
setSelectedLocation(option);
|
||||
}
|
||||
setShowLocationModal(true);
|
||||
};
|
||||
|
||||
@@ -298,10 +306,14 @@ export const EventSetupTab = (
|
||||
onClick={() => {
|
||||
locationFormMethods.setValue("locationType", location.type);
|
||||
locationFormMethods.unregister("locationLink");
|
||||
locationFormMethods.unregister("locationAddress");
|
||||
if (location.type === LocationType.InPerson) {
|
||||
locationFormMethods.setValue("locationAddress", location.address);
|
||||
} else {
|
||||
locationFormMethods.unregister("locationAddress");
|
||||
}
|
||||
locationFormMethods.unregister("locationPhoneNumber");
|
||||
setEditingLocationType(location.type);
|
||||
openLocationModal(location.type);
|
||||
openLocationModal(location.type, location.address);
|
||||
}}
|
||||
aria-label={t("edit")}
|
||||
className="hover:text-emphasis text-subtle mr-1 p-1">
|
||||
@@ -517,7 +529,18 @@ export const EventSetupTab = (
|
||||
defaultValues={formMethods.getValues("locations")}
|
||||
selection={
|
||||
selectedLocation
|
||||
? { value: selectedLocation.value, label: t(selectedLocation.label), icon: selectedLocation.icon }
|
||||
? selectedLocation.address
|
||||
? {
|
||||
value: selectedLocation.value,
|
||||
label: t(selectedLocation.label),
|
||||
icon: selectedLocation.icon,
|
||||
address: selectedLocation.address,
|
||||
}
|
||||
: {
|
||||
value: selectedLocation.value,
|
||||
label: t(selectedLocation.label),
|
||||
icon: selectedLocation.icon,
|
||||
}
|
||||
: undefined
|
||||
}
|
||||
setSelectedLocation={setSelectedLocation}
|
||||
|
||||
@@ -8,21 +8,15 @@ import { md } from "@calcom/lib/markdownIt";
|
||||
import { telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import turndown from "@calcom/lib/turndownService";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Button, Editor, ImageUploader, Label, showToast } from "@calcom/ui";
|
||||
import { Avatar } from "@calcom/ui";
|
||||
import { Avatar, Button, Editor, ImageUploader, Label, showToast } from "@calcom/ui";
|
||||
import { ArrowRight } from "@calcom/ui/components/icon";
|
||||
|
||||
import type { IOnboardingPageProps } from "../../../pages/getting-started/[[...step]]";
|
||||
|
||||
type FormData = {
|
||||
bio: string;
|
||||
};
|
||||
interface IUserProfileProps {
|
||||
user: IOnboardingPageProps["user"];
|
||||
}
|
||||
|
||||
const UserProfile = (props: IUserProfileProps) => {
|
||||
const { user } = props;
|
||||
const UserProfile = () => {
|
||||
const [user] = trpc.viewer.me.useSuspenseQuery();
|
||||
const { t } = useLocale();
|
||||
const avatarRef = useRef<HTMLInputElement>(null);
|
||||
const { setValue, handleSubmit, getValues } = useForm<FormData>({
|
||||
|
||||
@@ -13,15 +13,13 @@ import { ArrowRight } from "@calcom/ui/components/icon";
|
||||
|
||||
import { UsernameAvailabilityField } from "@components/ui/UsernameAvailability";
|
||||
|
||||
import type { IOnboardingPageProps } from "../../../pages/getting-started/[[...step]]";
|
||||
|
||||
interface IUserSettingsProps {
|
||||
user: IOnboardingPageProps["user"];
|
||||
nextStep: () => void;
|
||||
}
|
||||
|
||||
const UserSettings = (props: IUserSettingsProps) => {
|
||||
const { user, nextStep } = props;
|
||||
const { nextStep } = props;
|
||||
const [user] = trpc.viewer.me.useSuspenseQuery();
|
||||
const { t } = useLocale();
|
||||
const [selectedTimeZone, setSelectedTimeZone] = useState(dayjs.tz.guess());
|
||||
const telemetry = useTelemetry();
|
||||
@@ -69,7 +67,7 @@ const UserSettings = (props: IUserSettingsProps) => {
|
||||
<form onSubmit={onSubmit}>
|
||||
<div className="space-y-6">
|
||||
{/* Username textfield */}
|
||||
<UsernameAvailabilityField user={user} />
|
||||
<UsernameAvailabilityField />
|
||||
|
||||
{/* Full name textfield */}
|
||||
<div className="w-full">
|
||||
|
||||
@@ -8,14 +8,12 @@ import { getPremiumPlanPriceValue } from "@calcom/app-store/stripepayment/lib/ut
|
||||
import { fetchUsername } from "@calcom/lib/fetchUsername";
|
||||
import hasKeyInMetadata from "@calcom/lib/hasKeyInMetadata";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import type { User } from "@calcom/prisma/client";
|
||||
import type { TRPCClientErrorLike } from "@calcom/trpc/client";
|
||||
import type { RouterOutputs } from "@calcom/trpc/react";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import type { AppRouter } from "@calcom/trpc/server/routers/_app";
|
||||
import { Button, Dialog, DialogClose, DialogContent, Input, Label } from "@calcom/ui";
|
||||
import { Star as StarSolid } from "@calcom/ui/components/icon";
|
||||
import { Check, Edit2, ExternalLink } from "@calcom/ui/components/icon";
|
||||
import { Check, Edit2, ExternalLink, Star as StarSolid } from "@calcom/ui/components/icon";
|
||||
|
||||
export enum UsernameChangeStatusEnum {
|
||||
UPGRADE = "UPGRADE",
|
||||
@@ -29,7 +27,6 @@ interface ICustomUsernameProps {
|
||||
setInputUsernameValue: (value: string) => void;
|
||||
onSuccessMutation?: () => void;
|
||||
onErrorMutation?: (error: TRPCClientErrorLike<AppRouter>) => void;
|
||||
user: Pick<User, "username" | "metadata">;
|
||||
readonly?: boolean;
|
||||
}
|
||||
|
||||
@@ -57,8 +54,8 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
|
||||
onSuccessMutation,
|
||||
onErrorMutation,
|
||||
readonly: disabled,
|
||||
user,
|
||||
} = props;
|
||||
const [user] = trpc.viewer.me.useSuspenseQuery();
|
||||
const [usernameIsAvailable, setUsernameIsAvailable] = useState(false);
|
||||
const [markAsError, setMarkAsError] = useState(false);
|
||||
const router = useRouter();
|
||||
|
||||
@@ -21,7 +21,7 @@ interface ICustomUsernameProps {
|
||||
onErrorMutation?: (error: TRPCClientErrorLike<AppRouter>) => void;
|
||||
}
|
||||
|
||||
const UsernameTextfield = (props: ICustomUsernameProps) => {
|
||||
const UsernameTextfield = (props: ICustomUsernameProps & Partial<React.ComponentProps<typeof TextField>>) => {
|
||||
const { t } = useLocale();
|
||||
const {
|
||||
currentUsername,
|
||||
@@ -31,6 +31,7 @@ const UsernameTextfield = (props: ICustomUsernameProps) => {
|
||||
usernameRef,
|
||||
onSuccessMutation,
|
||||
onErrorMutation,
|
||||
...rest
|
||||
} = props;
|
||||
const [usernameIsAvailable, setUsernameIsAvailable] = useState(false);
|
||||
const [markAsError, setMarkAsError] = useState(false);
|
||||
@@ -116,9 +117,6 @@ const UsernameTextfield = (props: ICustomUsernameProps) => {
|
||||
ref={usernameRef}
|
||||
name="username"
|
||||
value={inputUsernameValue}
|
||||
addOnLeading={
|
||||
<>{process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "")}/</>
|
||||
}
|
||||
autoComplete="none"
|
||||
autoCapitalize="none"
|
||||
autoCorrect="none"
|
||||
@@ -133,6 +131,7 @@ const UsernameTextfield = (props: ICustomUsernameProps) => {
|
||||
setInputUsernameValue(event.target.value);
|
||||
}}
|
||||
data-testid="username-input"
|
||||
{...rest}
|
||||
/>
|
||||
{currentUsername !== inputUsernameValue && (
|
||||
<div className="absolute right-[2px] top-6 flex flex-row">
|
||||
|
||||
@@ -2,9 +2,11 @@ import { useRouter } from "next/router";
|
||||
import { useState } from "react";
|
||||
import { Controller, useForm } from "react-hook-form";
|
||||
|
||||
import { subdomainSuffix } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { IS_SELF_HOSTED } from "@calcom/lib/constants";
|
||||
import type { User } from "@calcom/prisma/client";
|
||||
import type { TRPCClientErrorLike } from "@calcom/trpc/client";
|
||||
import type { RouterOutputs } from "@calcom/trpc/react";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import type { AppRouter } from "@calcom/trpc/server/routers/_app";
|
||||
|
||||
import useRouterQuery from "@lib/hooks/useRouterQuery";
|
||||
@@ -17,14 +19,24 @@ export const UsernameAvailability = IS_SELF_HOSTED ? UsernameTextfield : Premium
|
||||
interface UsernameAvailabilityFieldProps {
|
||||
onSuccessMutation?: () => void;
|
||||
onErrorMutation?: (error: TRPCClientErrorLike<AppRouter>) => void;
|
||||
user: Pick<User, "username" | "metadata">;
|
||||
}
|
||||
|
||||
function useUserNamePrefix(organization: RouterOutputs["viewer"]["me"]["organization"]): string {
|
||||
return organization
|
||||
? organization.slug
|
||||
? `${organization.slug}.${subdomainSuffix()}`
|
||||
: organization.metadata && organization.metadata.requestedSlug
|
||||
? `${organization.metadata.requestedSlug}.${subdomainSuffix()}`
|
||||
: process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "")
|
||||
: process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "");
|
||||
}
|
||||
|
||||
export const UsernameAvailabilityField = ({
|
||||
onSuccessMutation,
|
||||
onErrorMutation,
|
||||
user,
|
||||
}: UsernameAvailabilityFieldProps) => {
|
||||
const router = useRouter();
|
||||
const [user] = trpc.viewer.me.useSuspenseQuery();
|
||||
const [currentUsernameState, setCurrentUsernameState] = useState(user.username || "");
|
||||
const { username: usernameFromQuery, setQuery: setUsernameFromQuery } = useRouterQuery("username");
|
||||
const { username: currentUsername, setQuery: setCurrentUsername } =
|
||||
@@ -37,6 +49,8 @@ export const UsernameAvailabilityField = ({
|
||||
},
|
||||
});
|
||||
|
||||
const usernamePrefix = useUserNamePrefix(user.organization);
|
||||
|
||||
return (
|
||||
<Controller
|
||||
control={formMethods.control}
|
||||
@@ -51,7 +65,7 @@ export const UsernameAvailabilityField = ({
|
||||
setInputUsernameValue={onChange}
|
||||
onSuccessMutation={onSuccessMutation}
|
||||
onErrorMutation={onErrorMutation}
|
||||
user={user}
|
||||
addOnLeading={usernamePrefix}
|
||||
/>
|
||||
);
|
||||
}}
|
||||
|
||||
@@ -11,6 +11,7 @@ export type LocationOption = {
|
||||
value: EventLocationType["type"];
|
||||
icon?: string;
|
||||
disabled?: boolean;
|
||||
address?: string;
|
||||
};
|
||||
|
||||
export type SingleValueLocationOption = SingleValue<LocationOption>;
|
||||
|
||||
@@ -9,6 +9,8 @@ import type { NextRouter } from "next/router";
|
||||
import { useRouter } from "next/router";
|
||||
import type { ComponentProps, PropsWithChildren, ReactNode } from "react";
|
||||
|
||||
import { OrgBrandingProvider } from "@calcom/features/ee/organizations/context/provider";
|
||||
import { useOrgBrandingValues } from "@calcom/features/ee/organizations/hooks";
|
||||
import DynamicHelpscoutProvider from "@calcom/features/ee/support/lib/helpscout/providerDynamic";
|
||||
import DynamicIntercomProvider from "@calcom/features/ee/support/lib/intercom/providerDynamic";
|
||||
import { FeatureProvider } from "@calcom/features/flags/context/provider";
|
||||
@@ -205,6 +207,11 @@ function FeatureFlagsProvider({ children }: { children: React.ReactNode }) {
|
||||
return <FeatureProvider value={flags}>{children}</FeatureProvider>;
|
||||
}
|
||||
|
||||
function OrgBrandProvider({ children }: { children: React.ReactNode }) {
|
||||
const orgBrand = useOrgBrandingValues();
|
||||
return <OrgBrandingProvider value={orgBrand}>{children}</OrgBrandingProvider>;
|
||||
}
|
||||
|
||||
const AppProviders = (props: AppPropsWithChildren) => {
|
||||
const session = trpc.viewer.public.session.useQuery().data;
|
||||
// No need to have intercom on public pages - Good for Page Performance
|
||||
@@ -222,7 +229,9 @@ const AppProviders = (props: AppPropsWithChildren) => {
|
||||
isThemeSupported={props.Component.isThemeSupported}
|
||||
isBookingPage={props.Component.isBookingPage}>
|
||||
<FeatureFlagsProvider>
|
||||
<MetaProvider>{props.children}</MetaProvider>
|
||||
<OrgBrandProvider>
|
||||
<MetaProvider>{props.children}</MetaProvider>
|
||||
</OrgBrandProvider>
|
||||
</FeatureFlagsProvider>
|
||||
</CalcomThemeProvider>
|
||||
</TooltipProvider>
|
||||
|
||||
@@ -8,6 +8,7 @@ export default function withEmbedSsr(getServerSideProps: GetServerSideProps) {
|
||||
return async (context: GetServerSidePropsContext): Promise<GetServerSidePropsResult<EmbedProps>> => {
|
||||
const ssrResponse = await getServerSideProps(context);
|
||||
const embed = context.query.embed;
|
||||
const layout = context.query.layout;
|
||||
|
||||
if ("redirect" in ssrResponse) {
|
||||
// Use a dummy URL https://base as the fallback base URL so that URL parsing works for relative URLs as well.
|
||||
@@ -18,6 +19,8 @@ export default function withEmbedSsr(getServerSideProps: GetServerSideProps) {
|
||||
destinationUrlObj.pathname +
|
||||
"/embed?" +
|
||||
destinationUrlObj.searchParams.toString() +
|
||||
"&layout=" +
|
||||
layout +
|
||||
"&embed=" +
|
||||
embed;
|
||||
|
||||
|
||||
+41
-7
@@ -3,6 +3,7 @@ import { collectEvents } from "next-collect/server";
|
||||
import type { NextMiddleware } from "next/server";
|
||||
import { NextResponse, userAgent } from "next/server";
|
||||
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { CONSOLE_URL, WEBAPP_URL, WEBSITE_URL } from "@calcom/lib/constants";
|
||||
import { isIpInBanlist } from "@calcom/lib/getIP";
|
||||
import { extendEventData, nextCollectBasicSettings } from "@calcom/lib/telemetry";
|
||||
@@ -10,6 +11,25 @@ import { extendEventData, nextCollectBasicSettings } from "@calcom/lib/telemetry
|
||||
const middleware: NextMiddleware = async (req) => {
|
||||
const url = req.nextUrl;
|
||||
const requestHeaders = new Headers(req.headers);
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(req.headers.get("host") ?? "");
|
||||
/**
|
||||
* We are using env variable to toggle new-booker because using flags would be an unnecessary delay for booking pages
|
||||
* Also, we can't easily identify the booker page requests here(to just fetch the flags for those requests)
|
||||
*/
|
||||
|
||||
// Make sure we are in the presence of an organization
|
||||
if (isValidOrgDomain && url.pathname === "/") {
|
||||
// In the presence of an organization, cover its profile page at "/"
|
||||
// rewrites for org profile page using team profile page
|
||||
url.pathname = `/org/${currentOrgDomain}`;
|
||||
return NextResponse.rewrite(url);
|
||||
}
|
||||
|
||||
if (isIpInBanlist(req) && url.pathname !== "/api/nope") {
|
||||
// DDOS Prevention: Immediately end request with no response - Avoids a redirect as well initiated by NextAuth on invalid callback
|
||||
req.nextUrl.pathname = "/api/nope";
|
||||
return NextResponse.redirect(req.nextUrl);
|
||||
}
|
||||
|
||||
if (!url.pathname.startsWith("/api")) {
|
||||
//
|
||||
@@ -48,13 +68,6 @@ const middleware: NextMiddleware = async (req) => {
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure that embed query param is there in when /embed is added.
|
||||
// query param is the way in which client side code knows that it is in embed mode.
|
||||
if (url.pathname.endsWith("/embed") && typeof url.searchParams.get("embed") !== "string") {
|
||||
url.searchParams.set("embed", "");
|
||||
return NextResponse.redirect(url);
|
||||
}
|
||||
|
||||
// Don't 404 old routing_forms links
|
||||
if (url.pathname.startsWith("/apps/routing_forms")) {
|
||||
url.pathname = url.pathname.replace("/apps/routing_forms", "/apps/routing-forms");
|
||||
@@ -70,6 +83,26 @@ const middleware: NextMiddleware = async (req) => {
|
||||
requestHeaders.set("x-csp-enforce", "true");
|
||||
}
|
||||
|
||||
if (isValidOrgDomain) {
|
||||
// Match /:slug to determine if it corresponds to org subteam slug or org user slug
|
||||
const slugs = /^\/([^/]+)(\/[^/]+)?$/.exec(url.pathname);
|
||||
// In the presence of an organization, if not team profile, a user or team is being accessed
|
||||
if (slugs) {
|
||||
const [_, teamName, eventType] = slugs;
|
||||
// Fetch the corresponding subteams for the entered organization
|
||||
const getSubteams = await fetch(`${WEBAPP_URL}/api/organizations/${currentOrgDomain}/subteams`);
|
||||
if (getSubteams.ok) {
|
||||
const data = await getSubteams.json();
|
||||
// Treat entered slug as a team if found in the subteams fetched
|
||||
if (data.slugs.includes(teamName)) {
|
||||
// Rewriting towards /team/:slug to bring up the team profile within the org
|
||||
url.pathname = `/team/${teamName}${eventType ?? ""}`;
|
||||
return NextResponse.rewrite(url);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NextResponse.next({
|
||||
request: {
|
||||
headers: requestHeaders,
|
||||
@@ -79,6 +112,7 @@ const middleware: NextMiddleware = async (req) => {
|
||||
|
||||
export const config = {
|
||||
matcher: [
|
||||
"/:path*",
|
||||
"/api/collect-events/:path*",
|
||||
"/api/auth/:path*",
|
||||
"/apps/routing_forms/:path*",
|
||||
|
||||
+89
-16
@@ -183,7 +183,16 @@ const nextConfig = {
|
||||
return config;
|
||||
},
|
||||
async rewrites() {
|
||||
return [
|
||||
// .* matches / as well(Note: *(i.e wildcard) doesn't match / but .*(i.e. RegExp) does)
|
||||
// It would match /free/30min but not /bookings/upcoming because 'bookings' is an item in pages
|
||||
// It would also not match /free/30min/embed because we are ensuring just two slashes
|
||||
const userTypeRouteRegExp = `/:user((?!${pages.join("|")})[^/]*)/:type`;
|
||||
|
||||
let rewrites = [
|
||||
{
|
||||
source: "/org/:slug",
|
||||
destination: "/team/:slug",
|
||||
},
|
||||
{
|
||||
source: "/:user/avatar.png",
|
||||
destination: "/api/user/avatar?username=:user",
|
||||
@@ -215,26 +224,85 @@ const nextConfig = {
|
||||
source: "/cancel/:path*",
|
||||
destination: "/booking/:path*",
|
||||
},
|
||||
// Keep cookie based booker enabled just in case we disable new-booker globally
|
||||
...[
|
||||
{
|
||||
source: userTypeRouteRegExp,
|
||||
destination: "/new-booker/:user/:type",
|
||||
has: [{ type: "cookie", key: "new-booker-enabled" }],
|
||||
},
|
||||
{
|
||||
source: "/team/:slug/:type",
|
||||
destination: "/new-booker/team/:slug/:type",
|
||||
has: [{ type: "cookie", key: "new-booker-enabled" }],
|
||||
},
|
||||
{
|
||||
source: "/d/:link/:slug",
|
||||
destination: "/new-booker/d/:link/:slug",
|
||||
has: [{ type: "cookie", key: "new-booker-enabled" }],
|
||||
},
|
||||
],
|
||||
// Keep cookie based booker enabled to test new-booker embed in production
|
||||
...[
|
||||
{
|
||||
source: `/:user((?!${pages.join("|")}).*)/:type/embed`,
|
||||
destination: "/new-booker/:user/:type/embed",
|
||||
has: [{ type: "cookie", key: "new-booker-enabled" }],
|
||||
},
|
||||
{
|
||||
source: "/team/:slug/:type/embed",
|
||||
destination: "/new-booker/team/:slug/:type/embed",
|
||||
has: [{ type: "cookie", key: "new-booker-enabled" }],
|
||||
},
|
||||
],
|
||||
/* TODO: have these files being served from another deployment or CDN {
|
||||
source: "/embed/embed.js",
|
||||
destination: process.env.NEXT_PUBLIC_EMBED_LIB_URL?,
|
||||
}, */
|
||||
{
|
||||
source: `/:user((?!${pages.join("|")}).*)/:type`,
|
||||
destination: "/new-booker/:user/:type",
|
||||
has: [{ type: "cookie", key: "new-booker-enabled" }],
|
||||
},
|
||||
{
|
||||
source: "/team/:slug/:type",
|
||||
destination: "/new-booker/team/:slug/:type",
|
||||
has: [{ type: "cookie", key: "new-booker-enabled" }],
|
||||
},
|
||||
{
|
||||
source: "/d/:link/:slug",
|
||||
destination: "/new-booker/d/:link/:slug",
|
||||
has: [{ type: "cookie", key: "new-booker-enabled" }],
|
||||
},
|
||||
|
||||
/**
|
||||
* Enables new booker using cookie. It works even if NEW_BOOKER_ENABLED_FOR_NON_EMBED, NEW_BOOKER_ENABLED_FOR_EMBED are disabled
|
||||
*/
|
||||
];
|
||||
|
||||
// Enable New Booker for all Embed Requests
|
||||
if (process.env.NEW_BOOKER_ENABLED_FOR_EMBED === "1") {
|
||||
console.log("Enabling New Booker for Embed");
|
||||
rewrites.push(
|
||||
...[
|
||||
{
|
||||
source: `/:user((?!${pages.join("|")}).*)/:type/embed`,
|
||||
destination: "/new-booker/:user/:type/embed",
|
||||
},
|
||||
{
|
||||
source: "/team/:slug/:type/embed",
|
||||
destination: "/new-booker/team/:slug/:type/embed",
|
||||
},
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
// Enable New Booker for All but embed Requests
|
||||
if (process.env.NEW_BOOKER_ENABLED_FOR_NON_EMBED === "1") {
|
||||
console.log("Enabling New Booker for Non-Embed");
|
||||
rewrites.push(
|
||||
...[
|
||||
{
|
||||
source: userTypeRouteRegExp,
|
||||
destination: "/new-booker/:user/:type",
|
||||
},
|
||||
{
|
||||
source: "/team/:slug/:type",
|
||||
destination: "/new-booker/team/:slug/:type",
|
||||
},
|
||||
{
|
||||
source: "/d/:link/:slug",
|
||||
destination: "/new-booker/d/:link/:slug",
|
||||
},
|
||||
]
|
||||
);
|
||||
}
|
||||
return rewrites;
|
||||
},
|
||||
async headers() {
|
||||
return [
|
||||
@@ -293,6 +361,11 @@ const nextConfig = {
|
||||
destination: "/teams",
|
||||
permanent: true,
|
||||
},
|
||||
{
|
||||
source: "/settings/admin",
|
||||
destination: "/settings/admin/flags",
|
||||
permanent: true,
|
||||
},
|
||||
/* V2 testers get redirected to the new settings */
|
||||
{
|
||||
source: "/settings/profile",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@calcom/web",
|
||||
"version": "2.9.8",
|
||||
"version": "3.0.0.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"analyze": "ANALYZE=true next build",
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
useEmbedStyles,
|
||||
useIsEmbed,
|
||||
} from "@calcom/embed-core/embed-iframe";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { EventTypeDescriptionLazy as EventTypeDescription } from "@calcom/features/eventtypes/components";
|
||||
import EmptyPage from "@calcom/features/eventtypes/components/EmptyPage";
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
@@ -255,6 +256,7 @@ const getEventTypesWithHiddenFromDB = async (userId: number) => {
|
||||
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
|
||||
const ssr = await ssrInit(context);
|
||||
const crypto = await import("crypto");
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req.headers.host ?? "");
|
||||
|
||||
const usernameList = getUsernameList(context.query.user as string);
|
||||
const dataFetchStart = Date.now();
|
||||
@@ -263,6 +265,11 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
username: {
|
||||
in: usernameList,
|
||||
},
|
||||
organization: isValidOrgDomain
|
||||
? {
|
||||
slug: currentOrgDomain,
|
||||
}
|
||||
: null,
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
@@ -272,6 +279,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
bio: true,
|
||||
brandColor: true,
|
||||
darkBrandColor: true,
|
||||
organizationId: true,
|
||||
theme: true,
|
||||
away: true,
|
||||
verified: true,
|
||||
@@ -284,7 +292,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
avatar: `${WEBAPP_URL}/${user.username}/avatar.png`,
|
||||
}));
|
||||
|
||||
if (!users.length) {
|
||||
if (!users.length || (!isValidOrgDomain && !users.some((user) => user.organizationId === null))) {
|
||||
return {
|
||||
notFound: true,
|
||||
} as {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import type { GetStaticPaths, GetStaticPropsContext } from "next";
|
||||
import type { GetServerSidePropsContext } from "next";
|
||||
import { z } from "zod";
|
||||
|
||||
import type { LocationObject } from "@calcom/app-store/locations";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { IS_TEAM_BILLING_ENABLED, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import hasKeyInMetadata from "@calcom/lib/hasKeyInMetadata";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
@@ -15,7 +16,9 @@ import type { EmbedProps } from "@lib/withEmbedSsr";
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
import AvailabilityPage from "@components/booking/pages/AvailabilityPage";
|
||||
|
||||
export type AvailabilityPageProps = inferSSRProps<typeof getStaticProps> & EmbedProps;
|
||||
import { ssrInit } from "@server/lib/ssr";
|
||||
|
||||
export type AvailabilityPageProps = inferSSRProps<typeof getServerSideProps> & EmbedProps;
|
||||
|
||||
export default function Type(props: AvailabilityPageProps) {
|
||||
const { t } = useLocale();
|
||||
@@ -50,6 +53,21 @@ export default function Type(props: AvailabilityPageProps) {
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
) : !props.isValidOrgDomain && props.organizationContext ? (
|
||||
<div className="dark:bg-darkgray-50 h-screen">
|
||||
<main className="mx-auto max-w-3xl px-4 py-24">
|
||||
<div className="space-y-6" data-testid="event-types">
|
||||
<div className="overflow-hidden rounded-sm border dark:border-gray-900">
|
||||
<div className="text-muted dark:text-inverted p-8 text-center">
|
||||
<h2 className="font-cal dark:text-inverted text-emphasis600 mb-2 text-3xl">
|
||||
{" " + t("unavailable")}
|
||||
</h2>
|
||||
<p className="mx-auto max-w-md">{t("user_belongs_organization")}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
) : (
|
||||
<AvailabilityPage {...props} />
|
||||
);
|
||||
@@ -59,21 +77,25 @@ Type.isBookingPage = true;
|
||||
Type.PageWrapper = PageWrapper;
|
||||
|
||||
const paramsSchema = z.object({ type: z.string(), user: z.string() });
|
||||
async function getUserPageProps(context: GetStaticPropsContext) {
|
||||
async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
// load server side dependencies
|
||||
const prisma = await import("@calcom/prisma").then((mod) => mod.default);
|
||||
const { privacyFilteredLocations } = await import("@calcom/app-store/locations");
|
||||
const { parseRecurringEvent } = await import("@calcom/lib/isRecurringEvent");
|
||||
const { EventTypeMetaDataSchema, teamMetadataSchema } = await import("@calcom/prisma/zod-utils");
|
||||
const { ssgInit } = await import("@server/lib/ssg");
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req.headers.host ?? "");
|
||||
const ssr = await ssrInit(context);
|
||||
const { type: slug, user: username } = paramsSchema.parse(context.query);
|
||||
|
||||
const { type: slug, user: username } = paramsSchema.parse(context.params);
|
||||
const ssg = await ssgInit(context);
|
||||
|
||||
const user = await prisma.user.findUnique({
|
||||
const user = await prisma.user.findFirst({
|
||||
where: {
|
||||
/** TODO: We should standarize this */
|
||||
username: username.toLowerCase().replace(/( |%20)/g, "+"),
|
||||
organization: isValidOrgDomain
|
||||
? {
|
||||
slug: currentOrgDomain,
|
||||
}
|
||||
: null,
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
@@ -87,6 +109,7 @@ async function getUserPageProps(context: GetStaticPropsContext) {
|
||||
brandColor: true,
|
||||
darkBrandColor: true,
|
||||
metadata: true,
|
||||
organizationId: true,
|
||||
eventTypes: {
|
||||
where: {
|
||||
// Many-to-many relationship causes inclusion of the team events - cool -
|
||||
@@ -108,6 +131,17 @@ async function getUserPageProps(context: GetStaticPropsContext) {
|
||||
schedulingType: true,
|
||||
metadata: true,
|
||||
seatsPerTimeSlot: true,
|
||||
team: {
|
||||
select: {
|
||||
logo: true,
|
||||
parent: {
|
||||
select: {
|
||||
logo: true,
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
orderBy: [
|
||||
{
|
||||
@@ -179,16 +213,17 @@ async function getUserPageProps(context: GetStaticPropsContext) {
|
||||
},
|
||||
// Dynamic group has no theme preference right now. It uses system theme.
|
||||
themeBasis: user.username,
|
||||
organizationContext: user?.organizationId !== null,
|
||||
away: user?.away,
|
||||
isDynamic: false,
|
||||
trpcState: ssg.dehydrate(),
|
||||
trpcState: ssr.dehydrate(),
|
||||
isValidOrgDomain: orgDomainConfig(context.req.headers.host ?? ""),
|
||||
isBrandingHidden: isBrandingHidden(user.hideBranding, hasActiveTeam || hasPremiumUserName),
|
||||
},
|
||||
revalidate: 10, // seconds
|
||||
};
|
||||
}
|
||||
|
||||
async function getDynamicGroupPageProps(context: GetStaticPropsContext) {
|
||||
async function getDynamicGroupPageProps(context: GetServerSidePropsContext) {
|
||||
// load server side dependencies
|
||||
const { getDefaultEvent, getGroupName, getUsernameList } = await import("@calcom/lib/defaultEvents");
|
||||
const { privacyFilteredLocations } = await import("@calcom/app-store/locations");
|
||||
@@ -197,11 +232,11 @@ async function getDynamicGroupPageProps(context: GetStaticPropsContext) {
|
||||
const { EventTypeMetaDataSchema, userMetadata: userMetadataSchema } = await import(
|
||||
"@calcom/prisma/zod-utils"
|
||||
);
|
||||
const { ssgInit } = await import("@server/lib/ssg");
|
||||
const ssr = await ssrInit(context);
|
||||
|
||||
const { getAppFromSlug } = await import("@calcom/app-store/utils");
|
||||
|
||||
const ssg = await ssgInit(context);
|
||||
const { type: typeParam, user: userParam } = paramsSchema.parse(context.params);
|
||||
const { type: typeParam, user: userParam } = paramsSchema.parse(context.query);
|
||||
const usernameList = getUsernameList(userParam);
|
||||
const length = parseInt(typeParam);
|
||||
const eventType = getDefaultEvent("" + length);
|
||||
@@ -230,6 +265,7 @@ async function getDynamicGroupPageProps(context: GetStaticPropsContext) {
|
||||
defaultScheduleId: true,
|
||||
allowDynamicBooking: true,
|
||||
metadata: true,
|
||||
organizationId: true,
|
||||
away: true,
|
||||
schedules: {
|
||||
select: {
|
||||
@@ -313,15 +349,16 @@ async function getDynamicGroupPageProps(context: GetStaticPropsContext) {
|
||||
themeBasis: null,
|
||||
isDynamic: true,
|
||||
away: false,
|
||||
trpcState: ssg.dehydrate(),
|
||||
organizationContext: !users.some((user) => user.organizationId === null),
|
||||
trpcState: ssr.dehydrate(),
|
||||
isValidOrgDomain: orgDomainConfig(context.req.headers.host ?? ""),
|
||||
isBrandingHidden: false, // I think we should always show branding for dynamic groups - saves us checking every single user
|
||||
},
|
||||
revalidate: 10, // seconds
|
||||
};
|
||||
}
|
||||
|
||||
export const getStaticProps = async (context: GetStaticPropsContext) => {
|
||||
const { user: userParam } = paramsSchema.parse(context.params);
|
||||
export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
const { user: userParam } = paramsSchema.parse(context.query);
|
||||
// dynamic groups are not generated at build time, but otherwise are probably cached until infinity.
|
||||
const isDynamicGroup = userParam.includes("+");
|
||||
if (isDynamicGroup) {
|
||||
@@ -329,8 +366,4 @@ export const getStaticProps = async (context: GetStaticPropsContext) => {
|
||||
} else {
|
||||
return await getUserPageProps(context);
|
||||
}
|
||||
};
|
||||
|
||||
export const getStaticPaths: GetStaticPaths = async () => {
|
||||
return { paths: [], fallback: "blocking" };
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,20 +1,18 @@
|
||||
import type { GetStaticPropsContext } from "next";
|
||||
import type { GetServerSidePropsContext } from "next";
|
||||
|
||||
import { getStaticProps as _getStaticProps } from "../[type]";
|
||||
|
||||
export { getStaticPaths } from "../[type]";
|
||||
import { getServerSideProps as _getServerSideProps } from "../[type]";
|
||||
|
||||
export { default } from "../[type]";
|
||||
|
||||
export const getStaticProps = async (context: GetStaticPropsContext) => {
|
||||
const staticResponse = await _getStaticProps(context);
|
||||
if (staticResponse.notFound) {
|
||||
return staticResponse;
|
||||
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
|
||||
const ssrResponse = await _getServerSideProps(context);
|
||||
if (ssrResponse.notFound) {
|
||||
return ssrResponse;
|
||||
}
|
||||
return {
|
||||
...staticResponse,
|
||||
...ssrResponse,
|
||||
props: {
|
||||
...staticResponse.props,
|
||||
...ssrResponse.props,
|
||||
isEmbed: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export { getStaticProps, getStaticPaths, default } from "./index";
|
||||
+1
-1
@@ -16,7 +16,7 @@ export const getStaticProps: GetStaticProps<
|
||||
{ user: string }
|
||||
> = async (context) => {
|
||||
const { user: username, month } = paramsSchema.parse(context.params);
|
||||
const userWithCredentials = await prisma.user.findUnique({
|
||||
const userWithCredentials = await prisma.user.findFirst({
|
||||
where: {
|
||||
username,
|
||||
},
|
||||
@@ -48,10 +48,6 @@ class MyDocument extends Document<Props> {
|
||||
<meta name="msapplication-TileColor" content="#ff0000" />
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f9fafb" />
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1C1C1C" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
|
||||
/>
|
||||
</Head>
|
||||
|
||||
<body
|
||||
|
||||
@@ -4,6 +4,7 @@ import { z } from "zod";
|
||||
import { symmetricDecrypt } from "@calcom/lib/crypto";
|
||||
import { defaultResponder } from "@calcom/lib/server";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { UserPermissionRole } from "@calcom/prisma/enums";
|
||||
import { TRPCError } from "@calcom/trpc/server";
|
||||
import { createContext } from "@calcom/trpc/server/createContext";
|
||||
import { viewerRouter } from "@calcom/trpc/server/routers/viewer/_router";
|
||||
@@ -38,9 +39,22 @@ async function handler(req: NextApiRequest, res: NextApiResponse<Response>) {
|
||||
where: { id: userId },
|
||||
});
|
||||
|
||||
/** We shape the session as required by tRPC router */
|
||||
async function sessionGetter() {
|
||||
return {
|
||||
user: {
|
||||
id: userId,
|
||||
username: "" /* Not used in this context */,
|
||||
role: UserPermissionRole.USER,
|
||||
},
|
||||
hasValidLicense: true,
|
||||
expires: "" /* Not used in this context */,
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
/** @see https://trpc.io/docs/server-side-calls */
|
||||
const ctx = await createContext({ req, res });
|
||||
const ctx = await createContext({ req, res }, sessionGetter);
|
||||
const caller = viewerRouter.createCaller({
|
||||
...ctx,
|
||||
req,
|
||||
@@ -55,7 +69,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse<Response>) {
|
||||
});
|
||||
} catch (e) {
|
||||
let message = "Error confirming booking";
|
||||
if (e instanceof TRPCError) message = e.message;
|
||||
if (e instanceof TRPCError) message = (e as TRPCError).message;
|
||||
res.redirect(`/booking/${bookingUid}?error=${encodeURIComponent(message)}`);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { z } from "zod";
|
||||
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import {
|
||||
ANDROID_CHROME_ICON_192,
|
||||
ANDROID_CHROME_ICON_256,
|
||||
@@ -104,7 +105,7 @@ function isValidLogoType(type: string): type is LogoType {
|
||||
return type in logoDefinitions;
|
||||
}
|
||||
|
||||
async function getTeamLogos(subdomain: string) {
|
||||
async function getTeamLogos(subdomain: string, isValidOrgDomain: boolean) {
|
||||
try {
|
||||
if (
|
||||
// if not cal.com
|
||||
@@ -118,9 +119,15 @@ async function getTeamLogos(subdomain: string) {
|
||||
}
|
||||
// load from DB
|
||||
const { default: prisma } = await import("@calcom/prisma");
|
||||
const team = await prisma.team.findUnique({
|
||||
const team = await prisma.team.findFirst({
|
||||
where: {
|
||||
slug: subdomain,
|
||||
...(isValidOrgDomain && {
|
||||
metadata: {
|
||||
path: ["isOrganization"],
|
||||
equals: true,
|
||||
},
|
||||
}),
|
||||
},
|
||||
select: {
|
||||
appLogo: true,
|
||||
@@ -147,6 +154,7 @@ async function getTeamLogos(subdomain: string) {
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
const { query } = req;
|
||||
const parsedQuery = logoApiSchema.parse(query);
|
||||
const { isValidOrgDomain } = orgDomainConfig(req.headers.host ?? "");
|
||||
|
||||
const hostname = req?.headers["host"];
|
||||
if (!hostname) throw new Error("No hostname");
|
||||
@@ -154,7 +162,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
if (!domains) throw new Error("No domains");
|
||||
|
||||
const [subdomain] = domains;
|
||||
const teamLogos = await getTeamLogos(subdomain);
|
||||
const teamLogos = await getTeamLogos(subdomain, isValidOrgDomain);
|
||||
|
||||
// Resolve all icon types to team logos, falling back to Cal.com defaults.
|
||||
const type: LogoType = parsedQuery?.type && isValidLogoType(parsedQuery.type) ? parsedQuery.type : "logo";
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export { default } from "@calcom/features/ee/organizations/api/subteams";
|
||||
@@ -0,0 +1,4 @@
|
||||
import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler";
|
||||
import { viewerOrganizationsRouter } from "@calcom/trpc/server/routers/viewer/organizations/_router";
|
||||
|
||||
export default createNextApiHandler(viewerOrganizationsRouter);
|
||||
@@ -2,6 +2,7 @@ import crypto from "crypto";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { z } from "zod";
|
||||
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { getPlaceholderAvatar } from "@calcom/lib/defaultAvatarImage";
|
||||
import prisma from "@calcom/prisma";
|
||||
|
||||
@@ -16,10 +17,18 @@ const querySchema = z
|
||||
|
||||
async function getIdentityData(req: NextApiRequest) {
|
||||
const { username, teamname } = querySchema.parse(req.query);
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(req.headers.host ?? "");
|
||||
|
||||
if (username) {
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { username },
|
||||
const user = await prisma.user.findFirst({
|
||||
where: {
|
||||
username,
|
||||
organization: isValidOrgDomain
|
||||
? {
|
||||
slug: currentOrgDomain,
|
||||
}
|
||||
: null,
|
||||
},
|
||||
select: { avatar: true, email: true },
|
||||
});
|
||||
return {
|
||||
@@ -29,8 +38,15 @@ async function getIdentityData(req: NextApiRequest) {
|
||||
};
|
||||
}
|
||||
if (teamname) {
|
||||
const team = await prisma.team.findUnique({
|
||||
where: { slug: teamname },
|
||||
const team = await prisma.team.findFirst({
|
||||
where: {
|
||||
slug: teamname,
|
||||
parent: isValidOrgDomain
|
||||
? {
|
||||
slug: currentOrgDomain,
|
||||
}
|
||||
: null,
|
||||
},
|
||||
select: { logo: true },
|
||||
});
|
||||
return {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { checkUsername } from "@calcom/lib/server/checkUsername";
|
||||
|
||||
type Response = {
|
||||
@@ -8,6 +9,7 @@ type Response = {
|
||||
};
|
||||
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse<Response>): Promise<void> {
|
||||
const result = await checkUsername(req.body.username);
|
||||
const { currentOrgDomain } = orgDomainConfig(req.headers.host ?? "");
|
||||
const result = await checkUsername(req.body.username, currentOrgDomain);
|
||||
return res.status(200).json(result);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import { useEffect } from "react";
|
||||
|
||||
import { getPremiumMonthlyPlanPriceId } from "@calcom/app-store/stripepayment/lib/utils";
|
||||
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import stripe from "@calcom/features/ee/payments/server/stripe";
|
||||
import {
|
||||
hostedCal,
|
||||
@@ -68,11 +69,12 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
|
||||
const session = await getServerSession({ req, res });
|
||||
const ssr = await ssrInit(context);
|
||||
const { currentOrgDomain } = orgDomainConfig(context.req.headers.host ?? "");
|
||||
|
||||
if (session) {
|
||||
// Validating if username is Premium, while this is true an email its required for stripe user confirmation
|
||||
if (usernameParam && session.user.email) {
|
||||
const availability = await checkUsername(usernameParam);
|
||||
const availability = await checkUsername(usernameParam, currentOrgDomain);
|
||||
if (availability.available && availability.premium) {
|
||||
const stripePremiumUrl = await getStripePremiumUsernameUrl({
|
||||
userEmail: session.user.email,
|
||||
|
||||
@@ -22,7 +22,7 @@ import SkeletonLoader from "@components/booking/SkeletonLoader";
|
||||
|
||||
import { ssgInit } from "@server/lib/ssg";
|
||||
|
||||
type BookingListingStatus = z.infer<typeof filterQuerySchema>["status"];
|
||||
type BookingListingStatus = z.infer<NonNullable<typeof filterQuerySchema>>["status"];
|
||||
type BookingOutput = RouterOutputs["viewer"]["bookings"]["get"]["bookings"][0];
|
||||
|
||||
type RecurringInfo = {
|
||||
@@ -34,7 +34,7 @@ type RecurringInfo = {
|
||||
|
||||
const validStatuses = ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] as const;
|
||||
|
||||
const descriptionByStatus: Record<BookingListingStatus, string> = {
|
||||
const descriptionByStatus: Record<NonNullable<BookingListingStatus>, string> = {
|
||||
upcoming: "upcoming_bookings",
|
||||
recurring: "recurring_bookings",
|
||||
past: "past_bookings",
|
||||
|
||||
@@ -7,10 +7,13 @@ import type { FC } from "react";
|
||||
import { useEffect, useState, memo } from "react";
|
||||
import { z } from "zod";
|
||||
|
||||
import { useOrgBrandingValues } from "@calcom/features/ee/organizations/hooks";
|
||||
import { subdomainSuffix } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import useIntercom from "@calcom/features/ee/support/lib/intercom/useIntercom";
|
||||
import { EventTypeDescriptionLazy as EventTypeDescription } from "@calcom/features/eventtypes/components";
|
||||
import CreateEventTypeDialog from "@calcom/features/eventtypes/components/CreateEventTypeDialog";
|
||||
import { DuplicateDialog } from "@calcom/features/eventtypes/components/DuplicateDialog";
|
||||
import { OrganizationEventTypeFilter } from "@calcom/features/eventtypes/components/OrganizationEventTypeFilter";
|
||||
import Shell from "@calcom/features/shell/Shell";
|
||||
import { APP_NAME, CAL_URL, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
@@ -44,6 +47,8 @@ import {
|
||||
HeadSeo,
|
||||
Skeleton,
|
||||
Label,
|
||||
VerticalDivider,
|
||||
Alert,
|
||||
} from "@calcom/ui";
|
||||
import {
|
||||
ArrowDown,
|
||||
@@ -59,9 +64,11 @@ import {
|
||||
Trash,
|
||||
Upload,
|
||||
Users,
|
||||
User as UserIcon,
|
||||
} from "@calcom/ui/components/icon";
|
||||
|
||||
import { withQuery } from "@lib/QueryCell";
|
||||
import useMeQuery from "@lib/hooks/useMeQuery";
|
||||
|
||||
import { EmbedButton, EmbedDialog } from "@components/Embed";
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
@@ -74,6 +81,7 @@ interface EventTypeListHeadingProps {
|
||||
profile: EventTypeGroupProfile;
|
||||
membershipCount: number;
|
||||
teamId?: number | null;
|
||||
orgSlug?: string;
|
||||
}
|
||||
|
||||
type EventTypeGroup = EventTypeGroups[number];
|
||||
@@ -194,6 +202,7 @@ const MemoizedItem = memo(Item);
|
||||
export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeListProps): JSX.Element => {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
const orgBranding = useOrgBrandingValues();
|
||||
const [parent] = useAutoAnimate<HTMLUListElement>();
|
||||
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
|
||||
const [deleteDialogTypeId, setDeleteDialogTypeId] = useState(0);
|
||||
@@ -362,7 +371,9 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
|
||||
<ul ref={parent} className="divide-subtle !static w-full divide-y" data-testid="event-types">
|
||||
{types.map((type, index) => {
|
||||
const embedLink = `${group.profile.slug}/${type.slug}`;
|
||||
const calLink = `${CAL_URL}/${embedLink}`;
|
||||
const calLink = `${
|
||||
orgBranding ? `${new URL(CAL_URL).protocol}//${orgBranding.slug}.${subdomainSuffix()}` : CAL_URL
|
||||
}/${embedLink}`;
|
||||
const isManagedEventType = type.schedulingType === SchedulingType.MANAGED;
|
||||
const isChildrenManagedEventType =
|
||||
type.metadata?.managedEventConfig !== undefined && type.schedulingType !== SchedulingType.MANAGED;
|
||||
@@ -687,6 +698,7 @@ const EventTypeListHeading = ({
|
||||
profile,
|
||||
membershipCount,
|
||||
teamId,
|
||||
orgSlug,
|
||||
}: EventTypeListHeadingProps): JSX.Element => {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
@@ -727,7 +739,9 @@ const EventTypeListHeading = ({
|
||||
)}
|
||||
{profile?.slug && (
|
||||
<Link href={`${CAL_URL}/${profile.slug}`} className="text-subtle block text-xs">
|
||||
{`${CAL_URL?.replace("https://", "")}/${profile.slug}`}
|
||||
{orgSlug
|
||||
? `${orgSlug}.${subdomainSuffix()}/${profile.slug}`
|
||||
: `${CAL_URL?.replace("https://", "")}/${profile.slug}`}
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
@@ -775,6 +789,7 @@ const CTA = () => {
|
||||
|
||||
return (
|
||||
<CreateButton
|
||||
data-testid="new-event-type"
|
||||
subtitle={t("create_event_on").toUpperCase()}
|
||||
options={profileOptions}
|
||||
createDialog={() => <CreateEventTypeDialog profileOptions={profileOptions} />}
|
||||
@@ -782,6 +797,43 @@ const CTA = () => {
|
||||
);
|
||||
};
|
||||
|
||||
const Actions = () => {
|
||||
return (
|
||||
<div className="flex items-center">
|
||||
<OrganizationEventTypeFilter />
|
||||
<VerticalDivider />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const SetupProfileBanner = ({ closeAction }: { closeAction: () => void }) => {
|
||||
const { t } = useLocale();
|
||||
const orgBranding = useOrgBrandingValues();
|
||||
|
||||
return (
|
||||
<Alert
|
||||
className="my-4"
|
||||
severity="info"
|
||||
title={t("set_up_your_profile")}
|
||||
message={t("set_up_your_profile_description", { orgName: orgBranding?.name })}
|
||||
CustomIcon={UserIcon}
|
||||
actions={
|
||||
<div className="flex gap-1">
|
||||
<Button color="minimal" className="text-sky-700 hover:bg-sky-100" onClick={closeAction}>
|
||||
{t("dismiss")}
|
||||
</Button>
|
||||
<Button
|
||||
color="secondary"
|
||||
className="border-sky-700 bg-sky-50 text-sky-700 hover:border-sky-900 hover:bg-sky-200"
|
||||
href="/getting-started">
|
||||
{t("set_up")}
|
||||
</Button>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const WithQuery = withQuery(trpc.viewer.eventTypes.getByViewer as any);
|
||||
|
||||
@@ -790,12 +842,24 @@ const EventTypesPage = () => {
|
||||
const router = useRouter();
|
||||
const { open } = useIntercom();
|
||||
const { query } = router;
|
||||
const { data: user } = useMeQuery();
|
||||
const isMobile = useMediaQuery("(max-width: 768px)");
|
||||
const [showProfileBanner, setShowProfileBanner] = useState(false);
|
||||
const orgBranding = useOrgBrandingValues();
|
||||
|
||||
function closeBanner() {
|
||||
setShowProfileBanner(false);
|
||||
document.cookie = `calcom-profile-banner=1;max-age=${60 * 60 * 24 * 90}`; // 3 months
|
||||
showToast(t("we_wont_show_again"), "success");
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (query?.openIntercom && query?.openIntercom === "true") {
|
||||
open();
|
||||
}
|
||||
setShowProfileBanner(
|
||||
!!orgBranding && !document.cookie.includes("calcom-profile-banner=1") && !user?.completedOnboarding
|
||||
);
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
|
||||
@@ -810,6 +874,8 @@ const EventTypesPage = () => {
|
||||
heading={t("event_types_page_title")}
|
||||
hideHeadingOnMobile
|
||||
subtitle={t("event_types_page_subtitle")}
|
||||
afterHeading={showProfileBanner && <SetupProfileBanner closeAction={closeBanner} />}
|
||||
beforeCTAactions={<Actions />}
|
||||
CTA={<CTA />}>
|
||||
<WithQuery
|
||||
customLoader={<SkeletonLoader />}
|
||||
@@ -826,6 +892,7 @@ const EventTypesPage = () => {
|
||||
profile={group.profile}
|
||||
membershipCount={group.metadata.membershipCount}
|
||||
teamId={group.teamId}
|
||||
orgSlug={orgBranding?.slug}
|
||||
/>
|
||||
|
||||
<EventTypeList
|
||||
|
||||
@@ -3,15 +3,16 @@ import { serverSideTranslations } from "next-i18next/serverSideTranslations";
|
||||
import Head from "next/head";
|
||||
import { useRouter } from "next/router";
|
||||
import type { CSSProperties } from "react";
|
||||
import { Suspense } from "react";
|
||||
import { z } from "zod";
|
||||
|
||||
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
|
||||
import { APP_NAME } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { trpc } from "@calcom/trpc";
|
||||
import { Button, StepCard, Steps } from "@calcom/ui";
|
||||
|
||||
import type { inferSSRProps } from "@lib/types/inferSSRProps";
|
||||
import { Loader } from "@calcom/ui/components/icon";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
import { ConnectedCalendars } from "@components/getting-started/steps-views/ConnectCalendars";
|
||||
@@ -20,7 +21,7 @@ import { SetupAvailability } from "@components/getting-started/steps-views/Setup
|
||||
import UserProfile from "@components/getting-started/steps-views/UserProfile";
|
||||
import { UserSettings } from "@components/getting-started/steps-views/UserSettings";
|
||||
|
||||
export type IOnboardingPageProps = inferSSRProps<typeof getServerSideProps>;
|
||||
import { ssrInit } from "@server/lib/ssr";
|
||||
|
||||
const INITIAL_STEP = "user-settings";
|
||||
const steps = [
|
||||
@@ -44,9 +45,9 @@ const stepRouteSchema = z.object({
|
||||
});
|
||||
|
||||
// TODO: Refactor how steps work to be contained in one array/object. Currently we have steps,initalsteps,headers etc. These can all be in one place
|
||||
const OnboardingPage = (props: IOnboardingPageProps) => {
|
||||
const OnboardingPage = () => {
|
||||
const router = useRouter();
|
||||
const { user } = props;
|
||||
const [user] = trpc.viewer.me.useSuspenseQuery();
|
||||
const { t } = useLocale();
|
||||
|
||||
const result = stepRouteSchema.safeParse(router.query);
|
||||
@@ -139,17 +140,20 @@ const OnboardingPage = (props: IOnboardingPageProps) => {
|
||||
<Steps maxSteps={steps.length} currentStep={currentStepIndex + 1} navigateToStep={goToIndex} />
|
||||
</div>
|
||||
<StepCard>
|
||||
{currentStep === "user-settings" && <UserSettings user={user} nextStep={() => goToIndex(1)} />}
|
||||
<Suspense fallback={<Loader />}>
|
||||
{currentStep === "user-settings" && <UserSettings nextStep={() => goToIndex(1)} />}
|
||||
{currentStep === "connected-calendar" && <ConnectedCalendars nextStep={() => goToIndex(2)} />}
|
||||
|
||||
{currentStep === "connected-calendar" && <ConnectedCalendars nextStep={() => goToIndex(2)} />}
|
||||
{currentStep === "connected-video" && <ConnectedVideoStep nextStep={() => goToIndex(3)} />}
|
||||
|
||||
{currentStep === "connected-video" && <ConnectedVideoStep nextStep={() => goToIndex(3)} />}
|
||||
|
||||
{currentStep === "setup-availability" && (
|
||||
<SetupAvailability nextStep={() => goToIndex(4)} defaultScheduleId={user.defaultScheduleId} />
|
||||
)}
|
||||
|
||||
{currentStep === "user-profile" && <UserProfile user={user} />}
|
||||
{currentStep === "setup-availability" && (
|
||||
<SetupAvailability
|
||||
nextStep={() => goToIndex(4)}
|
||||
defaultScheduleId={user.defaultScheduleId}
|
||||
/>
|
||||
)}
|
||||
{currentStep === "user-profile" && <UserProfile />}
|
||||
</Suspense>
|
||||
</StepCard>
|
||||
|
||||
{headers[currentStepIndex]?.skipText && (
|
||||
@@ -176,34 +180,21 @@ const OnboardingPage = (props: IOnboardingPageProps) => {
|
||||
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
|
||||
const { req, res } = context;
|
||||
|
||||
const crypto = await import("crypto");
|
||||
const session = await getServerSession({ req, res });
|
||||
|
||||
if (!session?.user?.id) {
|
||||
return { redirect: { permanent: false, destination: "/auth/login" } };
|
||||
}
|
||||
|
||||
const ssr = await ssrInit(context);
|
||||
|
||||
await ssr.viewer.me.prefetch();
|
||||
|
||||
const user = await prisma.user.findUnique({
|
||||
where: {
|
||||
id: session.user.id,
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
username: true,
|
||||
name: true,
|
||||
email: true,
|
||||
bio: true,
|
||||
avatar: true,
|
||||
timeZone: true,
|
||||
weekStart: true,
|
||||
hideBranding: true,
|
||||
theme: true,
|
||||
brandColor: true,
|
||||
darkBrandColor: true,
|
||||
metadata: true,
|
||||
timeFormat: true,
|
||||
allowDynamicBooking: true,
|
||||
defaultScheduleId: true,
|
||||
completedOnboarding: true,
|
||||
teams: {
|
||||
select: {
|
||||
@@ -231,10 +222,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
return {
|
||||
props: {
|
||||
...(await serverSideTranslations(context.locale ?? "", ["common"])),
|
||||
user: {
|
||||
...user,
|
||||
emailMd5: crypto.createHash("md5").update(user.email).digest("hex"),
|
||||
},
|
||||
trpcState: ssr.dehydrate(),
|
||||
hasPendingInvites: user.teams.find((team) => team.accepted === false) ?? false,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -5,6 +5,8 @@ import { Booker } from "@calcom/atoms";
|
||||
import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo";
|
||||
import { getBookingByUidOrRescheduleUid } from "@calcom/features/bookings/lib/get-booking";
|
||||
import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { classNames } from "@calcom/lib";
|
||||
import { getUsernameList } from "@calcom/lib/defaultEvents";
|
||||
import prisma from "@calcom/prisma";
|
||||
|
||||
@@ -15,8 +17,9 @@ import PageWrapper from "@components/PageWrapper";
|
||||
type PageProps = inferSSRProps<typeof getServerSideProps>;
|
||||
|
||||
export default function Type({ slug, user, booking, away, isBrandingHidden }: PageProps) {
|
||||
const isEmbed = typeof window !== "undefined" && window?.isEmbed?.();
|
||||
return (
|
||||
<main className="flex h-full min-h-[100dvh] items-center justify-center">
|
||||
<main className={classNames("flex h-full items-center justify-center", !isEmbed && "min-h-[100dvh]")}>
|
||||
<BookerSeo
|
||||
username={user}
|
||||
eventSlug={slug}
|
||||
@@ -84,6 +87,7 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) {
|
||||
away: false,
|
||||
trpcState: ssr.dehydrate(),
|
||||
isBrandingHidden: false,
|
||||
themeBasis: null,
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -91,12 +95,18 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) {
|
||||
async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
const { user: username, type: slug } = paramsSchema.parse(context.params);
|
||||
const { rescheduleUid } = context.query;
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req.headers.host ?? "");
|
||||
|
||||
const { ssrInit } = await import("@server/lib/ssr");
|
||||
const ssr = await ssrInit(context);
|
||||
const user = await prisma.user.findUnique({
|
||||
const user = await prisma.user.findFirst({
|
||||
where: {
|
||||
username,
|
||||
organization: isValidOrgDomain
|
||||
? {
|
||||
slug: currentOrgDomain,
|
||||
}
|
||||
: null,
|
||||
},
|
||||
select: {
|
||||
away: true,
|
||||
@@ -133,6 +143,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
slug,
|
||||
trpcState: ssr.dehydrate(),
|
||||
isBrandingHidden: user?.hideBranding,
|
||||
themeBasis: username,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
import withEmbedSsr from "@lib/withEmbedSsr";
|
||||
|
||||
import { getServerSideProps as _getServerSideProps } from "../[type]";
|
||||
|
||||
export { default } from "../[type]";
|
||||
|
||||
// Somehow these types don't accept the {notFound: true} return type.
|
||||
// Probably still need to fix this. I don't know why this isn't allowed yet.
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
export const getServerSideProps = withEmbedSsr(_getServerSideProps);
|
||||
@@ -0,0 +1,7 @@
|
||||
import withEmbedSsr from "@lib/withEmbedSsr";
|
||||
|
||||
import { getServerSideProps as _getServerSideProps } from "../../[user]";
|
||||
|
||||
export { default } from "../../[user]";
|
||||
|
||||
export const getServerSideProps = withEmbedSsr(_getServerSideProps);
|
||||
@@ -5,6 +5,7 @@ import { Booker } from "@calcom/atoms";
|
||||
import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo";
|
||||
import { getBookingByUidOrRescheduleUid } from "@calcom/features/bookings/lib/get-booking";
|
||||
import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import prisma from "@calcom/prisma";
|
||||
|
||||
import type { inferSSRProps } from "@lib/types/inferSSRProps";
|
||||
@@ -38,6 +39,7 @@ Type.PageWrapper = PageWrapper;
|
||||
async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
const { link, slug } = paramsSchema.parse(context.params);
|
||||
const { rescheduleUid } = context.query;
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req.headers.host ?? "");
|
||||
|
||||
const { ssrInit } = await import("@server/lib/ssr");
|
||||
const ssr = await ssrInit(context);
|
||||
@@ -68,9 +70,14 @@ async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
};
|
||||
}
|
||||
|
||||
const user = await prisma.user.findUnique({
|
||||
const user = await prisma.user.findFirst({
|
||||
where: {
|
||||
username,
|
||||
organization: isValidOrgDomain
|
||||
? {
|
||||
slug: currentOrgDomain,
|
||||
}
|
||||
: null,
|
||||
},
|
||||
select: {
|
||||
away: true,
|
||||
|
||||
@@ -5,6 +5,7 @@ import { Booker } from "@calcom/atoms";
|
||||
import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo";
|
||||
import { getBookingByUidOrRescheduleUid } from "@calcom/features/bookings/lib/get-booking";
|
||||
import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking";
|
||||
import { classNames } from "@calcom/lib";
|
||||
import prisma from "@calcom/prisma";
|
||||
|
||||
import type { inferSSRProps } from "@lib/types/inferSSRProps";
|
||||
@@ -14,8 +15,9 @@ import PageWrapper from "@components/PageWrapper";
|
||||
type PageProps = inferSSRProps<typeof getServerSideProps>;
|
||||
|
||||
export default function Type({ slug, user, booking, away, isBrandingHidden }: PageProps) {
|
||||
const isEmbed = typeof window !== "undefined" && window?.isEmbed?.();
|
||||
return (
|
||||
<main className="flex h-full min-h-[100dvh] items-center justify-center">
|
||||
<main className={classNames("flex h-full items-center justify-center", !isEmbed && "min-h-[100dvh]")}>
|
||||
<BookerSeo
|
||||
username={user}
|
||||
eventSlug={slug}
|
||||
@@ -85,6 +87,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
slug: meetingSlug,
|
||||
trpcState: ssr.dehydrate(),
|
||||
isBrandingHidden: team?.hideBranding,
|
||||
themeBasis: null,
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
import withEmbedSsr from "@lib/withEmbedSsr";
|
||||
|
||||
import { getServerSideProps as _getServerSideProps } from "../[type]";
|
||||
|
||||
export { default } from "../[type]";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
export const getServerSideProps = withEmbedSsr(_getServerSideProps);
|
||||
@@ -0,0 +1,7 @@
|
||||
import withEmbedSsr from "@lib/withEmbedSsr";
|
||||
|
||||
import { getServerSideProps as _getServerSideProps } from "../../../team/[slug]";
|
||||
|
||||
export { default } from "../../../team/[slug]";
|
||||
|
||||
export const getServerSideProps = withEmbedSsr(_getServerSideProps);
|
||||
@@ -263,7 +263,8 @@ const AppearanceView = () => {
|
||||
type="submit"
|
||||
loading={mutation.isLoading}
|
||||
color="primary"
|
||||
className="mt-8">
|
||||
className="mt-8"
|
||||
data-testid="update-theme-btn">
|
||||
{t("update")}
|
||||
</Button>
|
||||
</Form>
|
||||
|
||||
@@ -215,7 +215,6 @@ const ProfileView = () => {
|
||||
extraField={
|
||||
<div className="mt-8">
|
||||
<UsernameAvailabilityField
|
||||
user={user}
|
||||
onSuccessMutation={async () => {
|
||||
showToast(t("settings_updated_successfully"), "success");
|
||||
await utils.viewer.me.invalidate();
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import { useRouter } from "next/router";
|
||||
|
||||
import { AboutOrganizationForm } from "@calcom/features/ee/organizations/components";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { WizardLayout, Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const AboutOrganizationPage = () => {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
if (!router.isReady) return null;
|
||||
return (
|
||||
<>
|
||||
<Meta title={t("about_your_organization")} description={t("about_your_organization_description")} />
|
||||
<AboutOrganizationForm />
|
||||
</>
|
||||
);
|
||||
};
|
||||
const LayoutWrapper = (page: React.ReactElement) => {
|
||||
return (
|
||||
<WizardLayout currentStep={3} maxSteps={5}>
|
||||
{page}
|
||||
</WizardLayout>
|
||||
);
|
||||
};
|
||||
|
||||
AboutOrganizationPage.getLayout = LayoutWrapper;
|
||||
AboutOrganizationPage.PageWrapper = PageWrapper;
|
||||
|
||||
export default AboutOrganizationPage;
|
||||
@@ -0,0 +1,37 @@
|
||||
import type { NextRouter } from "next/router";
|
||||
import { useRouter } from "next/router";
|
||||
|
||||
import { AddNewTeamsForm } from "@calcom/features/ee/organizations/components";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { WizardLayout, Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const AddNewTeamsPage = () => {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
if (!router.isReady) return null;
|
||||
return (
|
||||
<>
|
||||
<Meta title={t("create_your_teams")} description={t("create_your_teams_description")} />
|
||||
<AddNewTeamsForm />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
AddNewTeamsPage.getLayout = (page: React.ReactElement, router: NextRouter) => (
|
||||
<>
|
||||
<WizardLayout
|
||||
currentStep={5}
|
||||
maxSteps={5}
|
||||
isOptionalCallback={() => {
|
||||
router.push(`/event-types`);
|
||||
}}>
|
||||
{page}
|
||||
</WizardLayout>
|
||||
</>
|
||||
);
|
||||
|
||||
AddNewTeamsPage.PageWrapper = PageWrapper;
|
||||
|
||||
export default AddNewTeamsPage;
|
||||
@@ -0,0 +1,38 @@
|
||||
import type { NextRouter } from "next/router";
|
||||
import { useRouter } from "next/router";
|
||||
|
||||
import { AddNewOrgAdminsForm } from "@calcom/features/ee/organizations/components";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { WizardLayout, Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const OnboardTeamMembersPage = () => {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
if (!router.isReady) return null;
|
||||
return (
|
||||
<>
|
||||
<Meta
|
||||
title={t("invite_organization_admins")}
|
||||
description={t("invite_organization_admins_description")}
|
||||
/>
|
||||
<AddNewOrgAdminsForm />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
OnboardTeamMembersPage.getLayout = (page: React.ReactElement, router: NextRouter) => (
|
||||
<WizardLayout
|
||||
currentStep={4}
|
||||
maxSteps={5}
|
||||
isOptionalCallback={() => {
|
||||
router.push(`/settings/organizations/${router.query.id}/add-teams`);
|
||||
}}>
|
||||
{page}
|
||||
</WizardLayout>
|
||||
);
|
||||
|
||||
OnboardTeamMembersPage.PageWrapper = PageWrapper;
|
||||
|
||||
export default OnboardTeamMembersPage;
|
||||
@@ -0,0 +1,31 @@
|
||||
import { useRouter } from "next/router";
|
||||
|
||||
import { SetPasswordForm } from "@calcom/features/ee/organizations/components";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { WizardLayout, Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const SetPasswordPage = () => {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
if (!router.isReady) return null;
|
||||
return (
|
||||
<>
|
||||
<Meta title={t("set_a_password")} description={t("set_a_password_description")} />
|
||||
<SetPasswordForm />
|
||||
</>
|
||||
);
|
||||
};
|
||||
const LayoutWrapper = (page: React.ReactElement) => {
|
||||
return (
|
||||
<WizardLayout currentStep={2} maxSteps={5}>
|
||||
{page}
|
||||
</WizardLayout>
|
||||
);
|
||||
};
|
||||
|
||||
SetPasswordPage.getLayout = LayoutWrapper;
|
||||
SetPasswordPage.PageWrapper = PageWrapper;
|
||||
|
||||
export default SetPasswordPage;
|
||||
@@ -0,0 +1,9 @@
|
||||
import OrgAppearanceView from "@calcom/features/ee/organizations/pages/settings/appearance";
|
||||
|
||||
import type { CalPageWrapper } from "@components/PageWrapper";
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const Page = OrgAppearanceView as CalPageWrapper;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -0,0 +1,9 @@
|
||||
import OrgGeneralView from "@calcom/features/ee/organizations/pages/settings/general";
|
||||
|
||||
import type { CalPageWrapper } from "@components/PageWrapper";
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const Page = OrgGeneralView as CalPageWrapper;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -0,0 +1,9 @@
|
||||
import MembersView from "@calcom/features/ee/organizations/pages/settings/members";
|
||||
|
||||
import type { CalPageWrapper } from "@components/PageWrapper";
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const Page = MembersView as CalPageWrapper;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -0,0 +1,27 @@
|
||||
import { CreateANewOrganizationForm } from "@calcom/features/ee/organizations/components";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { WizardLayout, Meta } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const CreateNewOrganizationPage = () => {
|
||||
const { t } = useLocale();
|
||||
return (
|
||||
<>
|
||||
<Meta title={t("set_up_your_organization")} description={t("organizations_description")} />
|
||||
<CreateANewOrganizationForm />
|
||||
</>
|
||||
);
|
||||
};
|
||||
const LayoutWrapper = (page: React.ReactElement) => {
|
||||
return (
|
||||
<WizardLayout currentStep={1} maxSteps={5}>
|
||||
{page}
|
||||
</WizardLayout>
|
||||
);
|
||||
};
|
||||
|
||||
CreateNewOrganizationPage.getLayout = LayoutWrapper;
|
||||
CreateNewOrganizationPage.PageWrapper = PageWrapper;
|
||||
|
||||
export default CreateNewOrganizationPage;
|
||||
@@ -0,0 +1,9 @@
|
||||
import OrgProfileView from "@calcom/features/ee/organizations/pages/settings/profile";
|
||||
|
||||
import type { CalPageWrapper } from "@components/PageWrapper";
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const Page = OrgProfileView as CalPageWrapper;
|
||||
Page.PageWrapper = PageWrapper;
|
||||
|
||||
export default Page;
|
||||
@@ -2,9 +2,9 @@ import Head from "next/head";
|
||||
|
||||
import AddNewTeamMembers from "@calcom/features/ee/teams/components/AddNewTeamMembers";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { WizardLayout } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
import WizardLayout from "@components/layouts/WizardLayout";
|
||||
|
||||
const OnboardTeamMembersPage = () => {
|
||||
const { t } = useLocale();
|
||||
|
||||
@@ -2,9 +2,9 @@ import Head from "next/head";
|
||||
|
||||
import { CreateANewTeamForm } from "@calcom/features/ee/teams/components";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { WizardLayout } from "@calcom/ui";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
import WizardLayout from "@components/layouts/WizardLayout";
|
||||
|
||||
const CreateNewTeamPage = () => {
|
||||
const { t } = useLocale();
|
||||
|
||||
+122
-41
@@ -5,8 +5,9 @@ import { useRouter } from "next/router";
|
||||
import { useEffect } from "react";
|
||||
|
||||
import { sdkActionManager, useIsEmbed } from "@calcom/embed-core/embed-iframe";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import EventTypeDescription from "@calcom/features/eventtypes/components/EventTypeDescription";
|
||||
import { CAL_URL } from "@calcom/lib/constants";
|
||||
import { CAL_URL, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { getPlaceholderAvatar } from "@calcom/lib/defaultAvatarImage";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import useTheme from "@calcom/lib/hooks/useTheme";
|
||||
@@ -15,6 +16,7 @@ import { getTeamWithMembers } from "@calcom/lib/server/queries/teams";
|
||||
import { stripMarkdown } from "@calcom/lib/stripMarkdown";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { teamMetadataSchema } from "@calcom/prisma/zod-utils";
|
||||
import { Avatar, AvatarGroup, Button, EmptyScreen, HeadSeo } from "@calcom/ui";
|
||||
import { ArrowRight } from "@calcom/ui/components/icon";
|
||||
|
||||
@@ -27,7 +29,7 @@ import Team from "@components/team/screens/Team";
|
||||
import { ssrInit } from "@server/lib/ssr";
|
||||
|
||||
export type TeamPageProps = inferSSRProps<typeof getServerSideProps>;
|
||||
function TeamPage({ team, isUnpublished, markdownStrippedBio }: TeamPageProps) {
|
||||
function TeamPage({ team, isUnpublished, markdownStrippedBio, isValidOrgDomain }: TeamPageProps) {
|
||||
useTheme(team.theme);
|
||||
const showMembers = useToggleQuery("members");
|
||||
const { t } = useLocale();
|
||||
@@ -36,6 +38,7 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio }: TeamPageProps) {
|
||||
const router = useRouter();
|
||||
const teamName = team.name || "Nameless Team";
|
||||
const isBioEmpty = !team.bio || !team.bio.replace("<p><br></p>", "").length;
|
||||
const metadata = teamMetadataSchema.parse(team.metadata);
|
||||
|
||||
useEffect(() => {
|
||||
telemetry.event(
|
||||
@@ -49,8 +52,12 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio }: TeamPageProps) {
|
||||
<div className="m-8 flex items-center justify-center">
|
||||
<EmptyScreen
|
||||
avatar={<Avatar alt={teamName} imageSrc={getPlaceholderAvatar(team.logo, team.name)} size="lg" />}
|
||||
headline={t("team_is_unpublished", { team: teamName })}
|
||||
description={t("team_is_unpublished_description")}
|
||||
headline={t("team_is_unpublished", {
|
||||
team: teamName,
|
||||
})}
|
||||
description={t("team_is_unpublished_description", {
|
||||
entity: metadata?.isOrganization ? t("organization").toLowerCase() : t("team").toLowerCase(),
|
||||
})}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
@@ -71,7 +78,7 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio }: TeamPageProps) {
|
||||
<div className="px-6 py-4 ">
|
||||
<Link
|
||||
href={{
|
||||
pathname: `/team/${team.slug}/${type.slug}`,
|
||||
pathname: `${isValidOrgDomain ? "" : "/team"}/${team.slug}/${type.slug}`,
|
||||
query: queryParamsToForward,
|
||||
}}
|
||||
onClick={async () => {
|
||||
@@ -106,6 +113,53 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio }: TeamPageProps) {
|
||||
</ul>
|
||||
);
|
||||
|
||||
const SubTeams = () =>
|
||||
team.children.length ? (
|
||||
<ul className="divide-subtle border-subtle bg-default !static w-full divide-y rounded-md border">
|
||||
{team.children.map((ch, i) => (
|
||||
<li key={i} className="hover:bg-muted w-full">
|
||||
<Link href={`/${ch.slug}`} className="flex items-center justify-between">
|
||||
<div className="flex items-center px-5 py-5">
|
||||
<Avatar
|
||||
size="md"
|
||||
imageSrc={getPlaceholderAvatar(ch?.logo, ch?.name as string)}
|
||||
alt="Team Logo"
|
||||
className="inline-flex justify-center"
|
||||
/>
|
||||
<div className="ms-3 inline-block truncate">
|
||||
<span className="text-default text-sm font-bold">{ch.name}</span>
|
||||
<span className="text-subtle block text-xs">
|
||||
{t("number_member", { count: ch.members.length })}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<AvatarGroup
|
||||
className="mr-6"
|
||||
size="sm"
|
||||
truncateAfter={4}
|
||||
items={ch.members.map(({ user: member }) => ({
|
||||
alt: member.name || "",
|
||||
image: `${WEBAPP_URL}/${member.username}/avatar.png`,
|
||||
title: member.name || "",
|
||||
}))}
|
||||
/>
|
||||
</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
) : (
|
||||
<div className="space-y-6" data-testid="event-types">
|
||||
<div className="overflow-hidden rounded-sm border dark:border-gray-900">
|
||||
<div className="text-muted dark:text-inverted p-8 text-center">
|
||||
<h2 className="font-cal dark:text-inverted text-emphasis600 mb-2 text-3xl">
|
||||
{" " + t("no_teams_yet")}
|
||||
</h2>
|
||||
<p className="mx-auto max-w-md">{t("no_teams_yet_description")}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
return (
|
||||
<>
|
||||
<HeadSeo
|
||||
@@ -118,8 +172,17 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio }: TeamPageProps) {
|
||||
/>
|
||||
<main className="dark:bg-darkgray-50 bg-subtle mx-auto max-w-3xl rounded-md px-4 pt-12 pb-12">
|
||||
<div className="mx-auto mb-8 max-w-3xl text-center">
|
||||
<Avatar alt={teamName} imageSrc={getPlaceholderAvatar(team.logo, team.name)} size="lg" />
|
||||
<p className="font-cal text-emphasis mb-2 text-2xl tracking-wider">{teamName}</p>
|
||||
<div className="relative">
|
||||
<Avatar
|
||||
alt={teamName}
|
||||
imageSrc={getPlaceholderAvatar(team.parent ? team.parent.logo : team.logo, team.name)}
|
||||
size="lg"
|
||||
/>
|
||||
</div>
|
||||
<p className="font-cal text-emphasis mb-2 text-2xl tracking-wider">
|
||||
{team.parent && `${team.parent.name} `}
|
||||
{teamName}
|
||||
</p>
|
||||
{!isBioEmpty && (
|
||||
<>
|
||||
<div
|
||||
@@ -129,43 +192,49 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio }: TeamPageProps) {
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
{(showMembers.isOn || !team.eventTypes.length) && <Team team={team} />}
|
||||
{!showMembers.isOn && team.eventTypes.length > 0 && (
|
||||
<div className="mx-auto max-w-3xl ">
|
||||
<EventTypes />
|
||||
{metadata?.isOrganization ? (
|
||||
<SubTeams />
|
||||
) : (
|
||||
<>
|
||||
{(showMembers.isOn || !team.eventTypes.length) && <Team team={team} />}
|
||||
{!showMembers.isOn && team.eventTypes.length > 0 && (
|
||||
<div className="mx-auto max-w-3xl ">
|
||||
<EventTypes />
|
||||
|
||||
{!team.hideBookATeamMember && (
|
||||
<div>
|
||||
<div className="relative mt-12">
|
||||
<div className="absolute inset-0 flex items-center" aria-hidden="true">
|
||||
<div className="border-subtle w-full border-t" />
|
||||
</div>
|
||||
<div className="relative flex justify-center">
|
||||
<span className="dark:bg-darkgray-50 bg-subtle text-subtle dark:text-inverted px-2 text-sm">
|
||||
{t("or")}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
{!team.hideBookATeamMember && (
|
||||
<div>
|
||||
<div className="relative mt-12">
|
||||
<div className="absolute inset-0 flex items-center" aria-hidden="true">
|
||||
<div className="border-subtle w-full border-t" />
|
||||
</div>
|
||||
<div className="relative flex justify-center">
|
||||
<span className="dark:bg-darkgray-50 bg-subtle text-subtle dark:text-inverted px-2 text-sm">
|
||||
{t("or")}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside className="dark:text-inverted mt-8 flex justify-center text-center">
|
||||
<Button
|
||||
color="minimal"
|
||||
EndIcon={ArrowRight}
|
||||
className="dark:hover:bg-darkgray-200"
|
||||
href={{
|
||||
pathname: `/team/${team.slug}`,
|
||||
query: {
|
||||
members: "1",
|
||||
...queryParamsToForward,
|
||||
},
|
||||
}}
|
||||
shallow={true}>
|
||||
{t("book_a_team_member")}
|
||||
</Button>
|
||||
</aside>
|
||||
<aside className="dark:text-inverted mt-8 flex justify-center text-center">
|
||||
<Button
|
||||
color="minimal"
|
||||
EndIcon={ArrowRight}
|
||||
className="dark:hover:bg-darkgray-200"
|
||||
href={{
|
||||
pathname: `${isValidOrgDomain ? "" : "/team"}/${team.slug}`,
|
||||
query: {
|
||||
members: "1",
|
||||
...queryParamsToForward,
|
||||
},
|
||||
}}
|
||||
shallow={true}>
|
||||
{t("book_a_team_member")}
|
||||
</Button>
|
||||
</aside>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</main>
|
||||
</>
|
||||
@@ -175,8 +244,19 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio }: TeamPageProps) {
|
||||
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
|
||||
const ssr = await ssrInit(context);
|
||||
const slug = Array.isArray(context.query?.slug) ? context.query.slug.pop() : context.query.slug;
|
||||
const { isValidOrgDomain } = orgDomainConfig(context.req.headers.host ?? "");
|
||||
|
||||
const team = await getTeamWithMembers(undefined, slug);
|
||||
const metadata = teamMetadataSchema.parse(team?.metadata ?? {});
|
||||
|
||||
// Taking care of sub-teams and orgs
|
||||
if (
|
||||
(isValidOrgDomain && team?.parent && !!metadata?.isOrganization) ||
|
||||
(!isValidOrgDomain && team?.parent) ||
|
||||
(!isValidOrgDomain && !!metadata?.isOrganization)
|
||||
) {
|
||||
return { notFound: true } as const;
|
||||
}
|
||||
|
||||
if (!team) {
|
||||
const unpublishedTeam = await prisma.team.findFirst({
|
||||
@@ -193,7 +273,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
return {
|
||||
props: {
|
||||
isUnpublished: true,
|
||||
team: unpublishedTeam,
|
||||
team: { ...unpublishedTeam, createdAt: null },
|
||||
trpcState: ssr.dehydrate(),
|
||||
},
|
||||
} as const;
|
||||
@@ -222,6 +302,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
themeBasis: team.slug,
|
||||
trpcState: ssr.dehydrate(),
|
||||
markdownStrippedBio,
|
||||
isValidOrgDomain,
|
||||
},
|
||||
} as const;
|
||||
};
|
||||
|
||||
@@ -76,7 +76,6 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
title: true,
|
||||
availability: true,
|
||||
description: true,
|
||||
@@ -132,6 +131,12 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
},
|
||||
},
|
||||
},
|
||||
parent: {
|
||||
select: {
|
||||
logo: true,
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -86,6 +86,12 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
theme: true,
|
||||
brandColor: true,
|
||||
darkBrandColor: true,
|
||||
parent: {
|
||||
select: {
|
||||
logo: true,
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
users: {
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
import { expect } from "@playwright/test";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
|
||||
test.describe("Change Theme Test", () => {
|
||||
test("change theme to dark", async ({ page, users }) => {
|
||||
const pro = await users.create();
|
||||
await pro.apiLogin();
|
||||
|
||||
await page.goto("/settings/my-account/appearance");
|
||||
|
||||
await page.waitForLoadState("networkidle");
|
||||
//Click the "Dark" theme label
|
||||
await page.click('[data-testid="theme-dark"]');
|
||||
//Click the update button
|
||||
await page.click('[data-testid="update-theme-btn"]');
|
||||
//Wait for the toast to appear
|
||||
const toast = await page.waitForSelector("div[class*='data-testid-toast-success']");
|
||||
expect(toast).toBeTruthy();
|
||||
//Go to the profile page and check if the theme is dark
|
||||
await page.goto(`/${pro.username}`);
|
||||
const darkModeClass = await page.getAttribute("html", "class");
|
||||
expect(darkModeClass).toContain("dark");
|
||||
});
|
||||
|
||||
test("change theme to light", async ({ page, users }) => {
|
||||
const pro = await users.create();
|
||||
await pro.apiLogin();
|
||||
|
||||
await page.goto("/settings/my-account/appearance");
|
||||
|
||||
await page.waitForLoadState("networkidle");
|
||||
//Click the "Light" theme label
|
||||
await page.click('[data-testid="theme-light"]');
|
||||
//Click the update theme button
|
||||
await page.click('[data-testid="update-theme-btn"]');
|
||||
//Wait for the toast to appear
|
||||
const toast = await page.waitForSelector("div[class*='data-testid-toast-success']");
|
||||
expect(toast).toBeTruthy();
|
||||
//Go to the profile page and check if the theme is light
|
||||
await page.goto(`/${pro.username}`);
|
||||
const darkModeClass = await page.getAttribute("html", "class");
|
||||
expect(darkModeClass).toContain("light");
|
||||
});
|
||||
});
|
||||
@@ -170,3 +170,30 @@ export const createNewSeatedEventType = async (page: Page, args: { eventTitle: s
|
||||
await page.locator('[data-testid="offer-seats-toggle"]').click();
|
||||
await page.locator('[data-testid="update-eventtype"]').click();
|
||||
};
|
||||
|
||||
export async function gotoRoutingLink({
|
||||
page,
|
||||
formId,
|
||||
queryString = "",
|
||||
}: {
|
||||
page: Page;
|
||||
formId?: string;
|
||||
queryString?: string;
|
||||
}) {
|
||||
let previewLink = null;
|
||||
if (!formId) {
|
||||
// Instead of clicking on the preview link, we are going to the preview link directly because the earlier opens a new tab which is a bit difficult to manage with Playwright
|
||||
const href = await page.locator('[data-testid="form-action-preview"]').getAttribute("href");
|
||||
if (!href) {
|
||||
throw new Error("Preview link not found");
|
||||
}
|
||||
previewLink = href;
|
||||
} else {
|
||||
previewLink = `/forms/${formId}`;
|
||||
}
|
||||
|
||||
await page.goto(`${previewLink}${queryString ? `?${queryString}` : ""}`);
|
||||
|
||||
// HACK: There seems to be some issue with the inputs to the form getting reset if we don't wait.
|
||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ test.describe("Managed Event Types tests", () => {
|
||||
await page.waitForURL("/settings/teams/**");
|
||||
// Going to create an event type
|
||||
await page.goto("/event-types");
|
||||
await page.getByTestId("new-event-type-dropdown").click();
|
||||
await page.getByTestId("new-event-type").click();
|
||||
await page.getByTestId("option-team-1").click();
|
||||
// Expecting we can add a managed event type as team owner
|
||||
await expect(page.locator('button[value="MANAGED"]')).toBeVisible();
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
createHttpServer,
|
||||
selectFirstAvailableTimeSlotNextMonth,
|
||||
waitFor,
|
||||
gotoRoutingLink,
|
||||
} from "./lib/testUtils";
|
||||
|
||||
test.afterEach(({ users }) => users.deleteAll());
|
||||
@@ -387,3 +388,62 @@ test.describe("BOOKING_REQUESTED", async () => {
|
||||
webhookReceiver.close();
|
||||
});
|
||||
});
|
||||
|
||||
test.describe("FORM_SUBMITTED", async () => {
|
||||
test("can submit a form and get a submission event", async ({ page, users }) => {
|
||||
const webhookReceiver = createHttpServer();
|
||||
const user = await users.create();
|
||||
|
||||
await user.apiLogin();
|
||||
|
||||
await page.goto("/settings/teams/new");
|
||||
await page.waitForLoadState("networkidle");
|
||||
const teamName = `${user.username}'s Team`;
|
||||
// Create a new team
|
||||
await page.locator('input[name="name"]').fill(teamName);
|
||||
await page.locator('input[name="slug"]').fill(teamName);
|
||||
await page.locator('button[type="submit"]').click();
|
||||
|
||||
await page.locator("text=Publish team").click();
|
||||
await page.waitForURL(/\/settings\/teams\/(\d+)\/profile$/i);
|
||||
|
||||
await page.waitForLoadState("networkidle");
|
||||
|
||||
// Install Routing Forms App
|
||||
await page.goto(`/apps/routing-forms`);
|
||||
// eslint-disable-next-line playwright/no-conditional-in-test
|
||||
|
||||
await page.click('[data-testid="install-app-button"]');
|
||||
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.goto(`/settings/developer/webhooks/new`);
|
||||
|
||||
// Add webhook
|
||||
await page.fill('[name="subscriberUrl"]', webhookReceiver.url);
|
||||
await page.fill('[name="secret"]', "secret");
|
||||
await Promise.all([page.click("[type=submit]"), page.goForward()]);
|
||||
|
||||
// Page contains the url
|
||||
expect(page.locator(`text='${webhookReceiver.url}'`)).toBeDefined();
|
||||
|
||||
await page.waitForLoadState("networkidle");
|
||||
await page.goto("/apps/routing-forms/forms");
|
||||
await page.click('[data-testid="new-routing-form"]');
|
||||
// Choose to create the Form for the user(which is the first option) and not the team
|
||||
await page.click('[data-testid="option-0"]');
|
||||
await page.fill("input[name]", "TEST FORM");
|
||||
await page.click('[data-testid="add-form"]');
|
||||
await page.waitForSelector('[data-testid="add-field"]');
|
||||
|
||||
const url = page.url();
|
||||
const formId = new URL(url).pathname.split("/").at(-1);
|
||||
|
||||
await gotoRoutingLink({ page, formId: formId });
|
||||
page.click('button[type="submit"]');
|
||||
|
||||
await waitFor(() => {
|
||||
expect(webhookReceiver.requestList.length).toBe(1);
|
||||
});
|
||||
webhookReceiver.close();
|
||||
});
|
||||
});
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "شكراً لك على تجربة خطة الفريق الجديدة التي نقدمها. لقد لاحظنا أن فريقك \"{{teamName}}\" بحاجة إلى الترقية.",
|
||||
"team_upgrade_banner_action": "قم بالترقية هنا",
|
||||
"team_upgraded_successfully": "تمت ترقية فريقك بنجاح!",
|
||||
"org_upgrade_banner_action": "قم بالترقية هنا",
|
||||
"use_link_to_reset_password": "استخدم الرابط أدناه لإعادة تعيين كلمة المرور",
|
||||
"hey_there": "مرحبًا،",
|
||||
"forgot_your_password_calcom": "نسيت كلمة المرور الخاصة بك؟ - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "تم",
|
||||
"all_done": "اكتمل كل شيء!",
|
||||
"all_apps": "الكل",
|
||||
"all": "الكل",
|
||||
"available_apps": "التطبيقات المتوفرة",
|
||||
"check_email_reset_password": "تحقق من البريد الإلكتروني. لقد أرسلنا رابطًا لإعادة تعيين كلمة المرور.",
|
||||
"finish": "إنهاء",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "بضع جمل عن فريقك. ستظهر على صفحة رابط فريقك.",
|
||||
"members": "الأعضاء",
|
||||
"member": "العضو",
|
||||
"number_member_one": "{{count}} عضو",
|
||||
"number_member_other": "{{count}} من الأعضاء",
|
||||
"owner": "المالك",
|
||||
"admin": "المشرف",
|
||||
"administrator_user": "المستخدم المسؤول",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "بداية الأسبوع",
|
||||
"recordings_title": "التسجيلات",
|
||||
"recording": "التسجيل",
|
||||
"happy_scheduling": "جدولة سعيدة",
|
||||
"select_calendars": "حدد الرزنامات التي تريد التحقق منها بحثًا عن تضاربات لمنع الحجوزات المزدوجة.",
|
||||
"check_for_conflicts": "التحقق من وجود تضاربات",
|
||||
"view_recordings": "عرض التسجيلات",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "هل تريد بالتأكيد حذف تكوين {{connectionType}}؟ لن يتمكن أعضاء فريقك الذين يستخدمون معلومات تسجيل الدخول إلى {{connectionType}} من الوصول إلى Cal.com بعد الآن.",
|
||||
"organizer_timezone": "منظم المناطق الزمنية",
|
||||
"email_user_cta": "عرض الدعوة",
|
||||
"email_no_user_invite_heading": "لقد تمت دعوتك للانضمام إلى فريق في {{appName}}",
|
||||
"email_no_user_invite_subheading": "دعاك {{invitedBy}} للانضمام إلى فريقه على {{appName}}. إن {{appName}} هو برنامج جدولة الأحداث الذي يمكّنك أنت وفريقك من جدولة الاجتماعات دون الحاجة إلى المراسلة عبر البريد الإلكتروني.",
|
||||
"email_user_invite_subheading": "دعاك {{invitedBy}} للانضمام إلى فريقه {{teamName}} على {{appName}}. إن {{appName}} هو برنامج جدولة الأحداث الذي يمكّنك أنت وفريقك من جدولة الاجتماعات دون الحاجة إلى المراسلة عبر البريد الإلكتروني.",
|
||||
"email_no_user_invite_steps_intro": "سنرشدك خلال بضع خطوات قصيرة وستستمتع بجدولة خالية من الإجهاد مع فريقك وسريعة.",
|
||||
"email_no_user_step_one": "اختر اسم المستخدم الخاص بك",
|
||||
"email_no_user_step_two": "ربط حساب التقويم الخاص بك",
|
||||
"email_no_user_step_three": "تعيين أوقاتك المتاحة",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "إظهار في صفحة الحجز",
|
||||
"get_started_zapier_templates": "البدء في استخدام قوالب Zapier",
|
||||
"team_is_unpublished": "لم يُنشر {{team}}",
|
||||
"team_is_unpublished_description": "رابط هذا الفريق غير متاح حاليًا. يرجى الاتصال بمالك الفريق أو طلب نشره منه.",
|
||||
"team_member": "عضو الفريق",
|
||||
"a_routing_form": "نموذج توجيه",
|
||||
"form_description_placeholder": "وصف النموذج",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "تعرف أي أنواع من الأحداث لديك تتلقى أكبر عدد من النقرات والحجوزات",
|
||||
"no_responses_yet": "لا توجد ردود بعد",
|
||||
"this_will_be_the_placeholder": "سيكون هذا هو العنصر النائب",
|
||||
"error_booking_event": "حدث خطأ عند حجز الحدث، الرجاء تحديث الصفحة والمحاولة ثانيةً",
|
||||
"timeslot_missing_title": "لم يتم تحديد مساحة زمنية",
|
||||
"timeslot_missing_description": "الرجاء تحديد فترة زمنية لحجز الحدث.",
|
||||
"timeslot_missing_cta": "حدد الوقت",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "ثبّت الحجز في رزنامتي",
|
||||
"invite_as": "دعوة باسم",
|
||||
"form_updated_successfully": "تم تحديث الاستمارة بنجاح.",
|
||||
"email_not_cal_member_cta": "انضم إلى فريقك",
|
||||
"disable_attendees_confirmation_emails": "تعطيل رسائل التأكيد الافتراضية للحضور",
|
||||
"disable_attendees_confirmation_emails_description": "يوجد مسار عمل واحد على الأقل نشط في هذا النوع من الأحداث يقوم بإرسال رسائل إلكترونية إلى الحاضرين عند حجز الحدث.",
|
||||
"disable_host_confirmation_emails": "تعطيل رسائل التأكيد الافتراضية لمضيف",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "ربط مساحة عمل Google",
|
||||
"google_workspace_admin_tooltip": "يجب أن تكون مشرفًا على مساحة العمل لاستخدام هذه الميزة",
|
||||
"first_event_type_webhook_description": "قم بإنشاء أول شبكة ويب هوك لهذا النوع من الفعاليات",
|
||||
"create_for": "إنشاء من أجل"
|
||||
"create_for": "إنشاء من أجل",
|
||||
"organization_url_taken": "عنوان URL هذا مأخوذ بالفعل"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Děkujeme vám za vyzkoušení našeho nového týmového plánu. Všimli jsme si, že váš tým „{{teamName}}“ je nutné upgradovat.",
|
||||
"team_upgrade_banner_action": "Upgradovat zde",
|
||||
"team_upgraded_successfully": "Váš tým byl úspěšně přešel na vyšší verzi!",
|
||||
"org_upgrade_banner_action": "Upgradovat zde",
|
||||
"use_link_to_reset_password": "Pro obnovení hesla použijte odkaz níž",
|
||||
"hey_there": "Zdravíme,",
|
||||
"forgot_your_password_calcom": "Zapomněli jste heslo? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Hotovo",
|
||||
"all_done": "Hotovo!",
|
||||
"all_apps": "Všechny aplikace",
|
||||
"all": "Všechny aplikace",
|
||||
"available_apps": "Dostupné aplikace",
|
||||
"check_email_reset_password": "Podívejte se do e-mailu. Poslali jsme vám odkaz pro obnovení hesla.",
|
||||
"finish": "Dokončit",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Pár vět o vašem týmu. Objeví se na URL stránce vašeho týmu.",
|
||||
"members": "Členové",
|
||||
"member": "Člen",
|
||||
"number_member_one": "Počet členů: {{count}}",
|
||||
"number_member_other": "Počet členů: {{count}}",
|
||||
"owner": "Vlastník",
|
||||
"admin": "Administrátor",
|
||||
"administrator_user": "Uživatel administrátor",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Začátek týdne",
|
||||
"recordings_title": "Nahrávky",
|
||||
"recording": "Nahrávka",
|
||||
"happy_scheduling": "Hodně štěstí s plánováním",
|
||||
"select_calendars": "Vyberte kalendáře, u kterých chcete kontrolovat konflikty v zájmu prevence dvojích rezervací.",
|
||||
"check_for_conflicts": "Zkontrolovat konflikty",
|
||||
"view_recordings": "Zobrazit nahrávky",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Opravdu chcete odstranit konfiguraci {{connectionType}}? Členové vašeho týmu, kteří používají přihlášení {{connectionType}}, ztratí přístup k webu Cal.com.",
|
||||
"organizer_timezone": "Časové pásmo organizátora",
|
||||
"email_user_cta": "Zobrazit pozvánku",
|
||||
"email_no_user_invite_heading": "Byli jste pozváni do týmu v aplikaci {{appName}}",
|
||||
"email_no_user_invite_subheading": "Uživatel {{invitedBy}} vás pozval, abyste se připojili k jeho týmu v aplikaci {{appName}}. {{appName}} je plánovač událostí, který vám a vašemu týmu umožňuje plánovat schůzky bez e-mailového ping-pongu.",
|
||||
"email_user_invite_subheading": "Uživatel {{invitedBy}} vás pozval, abyste se připojili k jeho týmu „{{teamName}}“ v aplikaci {{appName}}. {{appName}} je plánovač událostí, který vám a vašemu týmu umožňuje plánovat schůzky bez e-mailového pingpongu.",
|
||||
"email_no_user_invite_steps_intro": "Provedeme vás několika krátkými kroky a za malou chvíli si budete se svým týmem užívat plánování bez stresu.",
|
||||
"email_no_user_step_one": "Vyberte si uživatelské jméno",
|
||||
"email_no_user_step_two": "Připojte svůj účet kalendáře",
|
||||
"email_no_user_step_three": "Nastavte si dostupnost",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Zobrazit na stránce rezervace",
|
||||
"get_started_zapier_templates": "Začněte používat šablony Zapier",
|
||||
"team_is_unpublished": "Tým {{team}} není zveřejněn",
|
||||
"team_is_unpublished_description": "Tento týmový odkaz není v současné době k dispozici. Kontaktujte vlastníka týmu nebo ho požádejte o jeho zveřejnění.",
|
||||
"team_member": "Člen týmu",
|
||||
"a_routing_form": "Směrovací formulář",
|
||||
"form_description_placeholder": "Popis formuláře",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Zjistěte, které typy vašich událostí získávají nejvíce kliknutí a rezervací",
|
||||
"no_responses_yet": "Zatím žádné odpovědi",
|
||||
"this_will_be_the_placeholder": "Toto bude zástupný znak",
|
||||
"error_booking_event": "Při rezervaci události došlo k chybě, obnovte prosím stránku a zkuste to znovu",
|
||||
"timeslot_missing_title": "Nebyl vybrán žádný časový slot",
|
||||
"timeslot_missing_description": "Vyberte časový slot, aby mohla být událost zaregistrována.",
|
||||
"timeslot_missing_cta": "Vybrat časový slot",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Book my Cal",
|
||||
"invite_as": "Pozvat jako",
|
||||
"form_updated_successfully": "Formulář byl aktualizován.",
|
||||
"email_not_cal_member_cta": "Připojte se ke svému týmu",
|
||||
"disable_attendees_confirmation_emails": "Vypnutí výchozích potvrzovacích e-mailů pro účastníky",
|
||||
"disable_attendees_confirmation_emails_description": "U tohoto typu události je aktivní alespoň jeden pracovní postup, který po rezervaci události odešle účastníkům e-mail.",
|
||||
"disable_host_confirmation_emails": "Vypnutí výchozích potvrzovacích e-mailů pro hostitele",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Propojit s Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Používání této funkce vyžaduje, abyste byli administrátory Google Workspace",
|
||||
"first_event_type_webhook_description": "Vytvořte svůj první webhook pro tento typ události",
|
||||
"create_for": "Vytvořit pro"
|
||||
"create_for": "Vytvořit pro",
|
||||
"organization_url_taken": "Tato adresa URL je už obsazená"
|
||||
}
|
||||
|
||||
@@ -112,6 +112,7 @@
|
||||
"team_upgrade_banner_description": "Tak fordi du har prøvet vores nye teamplan. Vi har bemærket at dit team \"{{teamName}}\" skal opgraderes.",
|
||||
"team_upgrade_banner_action": "Opgradér her",
|
||||
"team_upgraded_successfully": "Dit team blev opgraderet!",
|
||||
"org_upgrade_banner_action": "Opgradér her",
|
||||
"use_link_to_reset_password": "Brug nedenstående link for at nulstille din adgangskode",
|
||||
"hey_there": "Hej,",
|
||||
"forgot_your_password_calcom": "Glemt din adgangskode? - {{appName}}",
|
||||
@@ -220,6 +221,7 @@
|
||||
"done": "Udført",
|
||||
"all_done": "Alt er klart!",
|
||||
"all_apps": "Alle",
|
||||
"all": "Alle",
|
||||
"check_email_reset_password": "Tjek din e-mail. Vi har sendt dig et link til at nulstille din adgangskode.",
|
||||
"finish": "Afslut",
|
||||
"few_sentences_about_yourself": "Et par sætninger om dig selv. Dette vil blive vist på din personlige url side.",
|
||||
@@ -1506,9 +1508,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Er du sikker på, at du vil slette {{connectionType}} konfigurationen? Dine teammedlemmer, der bruger {{connectionType}} login, vil ikke længere kunne få adgang til Cal.com.",
|
||||
"organizer_timezone": "Arrangørens tidszone",
|
||||
"email_user_cta": "Vis Invitation",
|
||||
"email_no_user_invite_heading": "Du er blevet inviteret til at deltage i et team den {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} har inviteret dig til at deltage i deres team på {{appName}}. {{appName}} er den begivenheds-jonglerende planlægger, der gør det muligt for dig og dit team at planlægge møder uden e-mail tennis.",
|
||||
"email_no_user_invite_steps_intro": "Vi fører dig gennem et par korte trin, og du vil kunne nyde stressfri planlægning med dit team på ingen tid.",
|
||||
"email_no_user_step_one": "Vælg dit brugernavn",
|
||||
"email_no_user_step_two": "Tilslut din kalender konto",
|
||||
"email_no_user_step_three": "Angiv din tilgængelighed",
|
||||
@@ -1558,5 +1558,6 @@
|
||||
"no_responses_yet": "Ingen svar endnu",
|
||||
"this_will_be_the_placeholder": "Dette vil være pladsholderen",
|
||||
"verification_code": "Bekræftelseskode",
|
||||
"verify": "Bekræft"
|
||||
"verify": "Bekræft",
|
||||
"organization_url_taken": "Denne URL er allerede i brug"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Vielen Dank, dass Sie unseren neuen Teamplan getestet haben. Wir haben festgestellt, dass Ihr Team „{{teamName}}“ aktualisiert werden muss.",
|
||||
"team_upgrade_banner_action": "Hier aufrüsten",
|
||||
"team_upgraded_successfully": "Das Update für Ihr Team war erfolgreich!",
|
||||
"org_upgrade_banner_action": "Hier aufrüsten",
|
||||
"use_link_to_reset_password": "Benutzen Sie den Link, um Ihr Passwort zurückzusetzen",
|
||||
"hey_there": "Hallo,",
|
||||
"forgot_your_password_calcom": "Passwort vergessen? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Erledigt",
|
||||
"all_done": "Erledigt!",
|
||||
"all_apps": "Alle Apps",
|
||||
"all": "Alle Apps",
|
||||
"available_apps": "Verfügbare Apps",
|
||||
"check_email_reset_password": "Überprüfen Sie Ihre E-Mail. Wir haben Ihnen einen Link zum Zurücksetzen Ihres Passworts gesendet.",
|
||||
"finish": "Fertig",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Ein paar Sätze über Ihr Team auf der öffentlichen Teamseite.",
|
||||
"members": "Mitglieder",
|
||||
"member": "Mitglied",
|
||||
"number_member_one": "{{count}} Mitglied",
|
||||
"number_member_other": "{{count}} Mitglieder",
|
||||
"owner": "Inhaber",
|
||||
"admin": "Administrator",
|
||||
"administrator_user": "Administrator Benutzer",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Wochenstart",
|
||||
"recordings_title": "Aufnahmen",
|
||||
"recording": "Aufnahme",
|
||||
"happy_scheduling": "Fröhliche Terminplanung",
|
||||
"select_calendars": "Wählen Sie aus, in welchen Kalendern Sie nach Konflikten suchen wollen, um Doppelbuchungen zu vermeiden.",
|
||||
"check_for_conflicts": "Auf Konflikte prüfen",
|
||||
"view_recordings": "Aufnahmen anzeigen",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Sind Sie sicher, dass Sie die {{connectionType}}-Konfiguration löschen möchten? Ihre Teammitglieder, die sich über {{connectionType}} anmelden, werden keinen Zugriff mehr auf Cal.com haben.",
|
||||
"organizer_timezone": "Zeitzone des Veranstalters",
|
||||
"email_user_cta": "Einladung anzeigen",
|
||||
"email_no_user_invite_heading": "Sie wurden eingeladen, dem Team in {{appName}} beizutreten",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} hat Sie eingeladen, dem Team in {{appName}} beizutreten. {{appName}} ist der Event-Planer, der es Ihnen und Ihrem Team ermöglicht, Meetings ohne ständiges hin und her zu planen.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} hat Sie eingeladen, dem Team „{{teamName}}“ beizutreten. {{appName}} ist der Event-Planer, der es Ihnen und Ihrem Team ermöglicht, Meetings ohne Hin und Her zu planen.",
|
||||
"email_no_user_invite_steps_intro": "Wir begleiten Sie durch ein paar Schritte, danach können Sie stressfreie Planung mit Ihrem Team in kürzester Zeit genießen.",
|
||||
"email_no_user_step_one": "Wählen Sie Ihren Benutzernamen",
|
||||
"email_no_user_step_two": "Verbinden Sie Ihr Kalenderkonto",
|
||||
"email_no_user_step_three": "Legen Sie Ihre Verfügbarkeit fest",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Auf der Buchungsseite anzeigen",
|
||||
"get_started_zapier_templates": "Legen Sie mit Zapier-Vorlagen los",
|
||||
"team_is_unpublished": "{{team}} ist unveröffentlicht",
|
||||
"team_is_unpublished_description": "Dieser Team-Link ist derzeit nicht verfügbar. Bitte kontaktieren Sie den Team-Besitzer oder fragen Sie ihn, ob er ihn veröffentlicht.",
|
||||
"team_member": "Teammitglied",
|
||||
"a_routing_form": "Ein Weiterleitungsformular",
|
||||
"form_description_placeholder": "Formularbeschreibung",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Sehen Sie, welche Ihrer Ereignistypen die meisten Klicks und Buchungen erhalten",
|
||||
"no_responses_yet": "Noch keine Antworten",
|
||||
"this_will_be_the_placeholder": "Dies wird der Platzhalter sein",
|
||||
"error_booking_event": "Bei der Buchung dieses Termins ist ein Fehler aufgetreten, bitte aktualisieren Sie die Seite und versuchen Sie es erneut",
|
||||
"timeslot_missing_title": "Kein Zeitfenster ausgewählt",
|
||||
"timeslot_missing_description": "Bitte wählen Sie einen Zeitraum aus, um den Termin zu buchen.",
|
||||
"timeslot_missing_cta": "Zeitfenster auswählen",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Mein Cal buchen",
|
||||
"invite_as": "Einladen als",
|
||||
"form_updated_successfully": "Formular erfolgreich aktualisiert.",
|
||||
"email_not_cal_member_cta": "Treten Sie Ihrem Team bei",
|
||||
"disable_attendees_confirmation_emails": "Standardmäßige Bestätigungs-E-Mails für Teilnehmer deaktivieren",
|
||||
"disable_attendees_confirmation_emails_description": "Mindestens ein Workflow ist für diesen Termintyp aktiv, welcher bei Buchung eine E-Mail an die Teilnehmer sendet.",
|
||||
"disable_host_confirmation_emails": "Standardmäßige Bestätigungs-E-Mails für Veranstalter deaktivieren",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Google Workspace verbinden",
|
||||
"google_workspace_admin_tooltip": "Sie müssen ein Workspace-Admin sein, um diese Funktion nutzen zu können",
|
||||
"first_event_type_webhook_description": "Erstellen Sie Ihren ersten Webhook für diesen Termintypen",
|
||||
"create_for": "Erstellen für"
|
||||
"create_for": "Erstellen für",
|
||||
"organization_url_taken": "Diese URL ist bereits vergeben"
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
"link_expires": "Υ.Γ. Λήγει σε {{expiresIn}} ώρες.",
|
||||
"team_upgrade_banner_action": "Αναβάθμισε εδώ",
|
||||
"team_upgraded_successfully": "Η ομάδα σας αναβαθμίστηκε επιτυχώς!",
|
||||
"org_upgrade_banner_action": "Αναβάθμισε εδώ",
|
||||
"use_link_to_reset_password": "Χρησιμοποιήστε τον παρακάτω σύνδεσμο για να επαναφέρετε τον κωδικό πρόσβασης",
|
||||
"hey_there": "Γεια σας,",
|
||||
"forgot_your_password_calcom": "Ξεχάσατε τον κωδικό πρόσβασης? - {{appName}}",
|
||||
@@ -117,6 +118,7 @@
|
||||
"request_password_reset": "Αποστολή email επαναφοράς",
|
||||
"forgot_password": "Ξεχάσατε τον κωδικό πρόσβασης?",
|
||||
"all_apps": "Όλα",
|
||||
"all": "Όλα",
|
||||
"check_email_reset_password": "Ελέγξτε το email σας. Σας στείλαμε ένα σύνδεσμο για να επαναφέρετε τον κωδικό πρόσβασής σας.",
|
||||
"few_sentences_about_yourself": "Μερικά λόγια για τον εσάς. Αυτό θα εμφανιστεί στην προσωπική σελίδα σας.",
|
||||
"set_availability": "Όρισε τη διαθεσιμότητά σου",
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"verify_email_email_header": "Verify your email address",
|
||||
"verify_email_email_button": "Verify email",
|
||||
"verify_email_email_body": "Please verify your email address by clicking the button below.",
|
||||
"verify_email_email_link_text": "Here's the link incase you don't like clicking buttons:",
|
||||
"verify_email_email_link_text": "Here's the link in case you don't like clicking buttons:",
|
||||
"email_sent": "Email sent successfully",
|
||||
"event_declined_subject": "Declined: {{title}} at {{date}}",
|
||||
"event_cancelled_subject": "Cancelled: {{title}} at {{date}}",
|
||||
@@ -128,6 +128,9 @@
|
||||
"team_upgrade_banner_description": "Thank you for trialing our new team plan. We noticed your team \"{{teamName}}\" needs to be upgraded.",
|
||||
"team_upgrade_banner_action": "Upgrade here",
|
||||
"team_upgraded_successfully": "Your team was upgraded successfully!",
|
||||
"org_upgrade_banner_description": "Thank you for trialing our Organization plan. We noticed your Organization \"{{teamName}}\" needs to be upgraded.",
|
||||
"org_upgrade_banner_action": "Upgrade here",
|
||||
"org_upgraded_successfully": "Your Organization was upgraded successfully!",
|
||||
"use_link_to_reset_password": "Use the link below to reset your password",
|
||||
"hey_there": "Hey there,",
|
||||
"forgot_your_password_calcom": "Forgot your password? - {{appName}}",
|
||||
@@ -238,9 +241,12 @@
|
||||
"done": "Done",
|
||||
"all_done": "All done!",
|
||||
"all_apps": "All",
|
||||
"all": "All",
|
||||
"yours": "Yours",
|
||||
"available_apps": "Available Apps",
|
||||
"check_email_reset_password": "Check your email. We sent you a link to reset your password.",
|
||||
"finish": "Finish",
|
||||
"organization_general_description":"Manage settings for your team language and timezone",
|
||||
"few_sentences_about_yourself": "A few sentences about yourself. This will appear on your personal url page.",
|
||||
"nearly_there": "Nearly there!",
|
||||
"nearly_there_instructions": "Last thing, a brief description about you and a photo really help you get bookings and let people know who they’re booking with.",
|
||||
@@ -248,8 +254,8 @@
|
||||
"set_availability": "Set your availability",
|
||||
"continue_without_calendar": "Continue without calendar",
|
||||
"connect_your_calendar": "Connect your calendar",
|
||||
"connect_your_video_app":"Connect your video apps",
|
||||
"connect_your_video_app_instructions":"Connect your video apps to use them on your event types.",
|
||||
"connect_your_video_app": "Connect your video apps",
|
||||
"connect_your_video_app_instructions": "Connect your video apps to use them on your event types.",
|
||||
"connect_your_calendar_instructions": "Connect your calendar to automatically check for busy times and new events as they’re scheduled.",
|
||||
"set_up_later": "Set up later",
|
||||
"current_time": "Current time",
|
||||
@@ -300,6 +306,7 @@
|
||||
"failed": "Failed",
|
||||
"password_has_been_reset_login": "Your password has been reset. You can now login with your newly created password.",
|
||||
"bookerlayout_title": "Layout",
|
||||
"layout": "Layout",
|
||||
"bookerlayout_default_title": "Default view",
|
||||
"bookerlayout_description": "You can select multiple and your bookers can switch views.",
|
||||
"bookerlayout_user_settings_title": "Booking layout",
|
||||
@@ -389,10 +396,10 @@
|
||||
"create_webhook": "Create Webhook",
|
||||
"booking_cancelled": "Booking Cancelled",
|
||||
"booking_rescheduled": "Booking Rescheduled",
|
||||
"recording_ready":"Recording Download Link Ready",
|
||||
"recording_ready": "Recording Download Link Ready",
|
||||
"booking_created": "Booking Created",
|
||||
"booking_rejected":"Booking Rejected",
|
||||
"booking_requested":"Booking Requested",
|
||||
"booking_rejected": "Booking Rejected",
|
||||
"booking_requested": "Booking Requested",
|
||||
"meeting_ended": "Meeting Ended",
|
||||
"form_submitted": "Form Submitted",
|
||||
"event_triggers": "Event Triggers",
|
||||
@@ -537,8 +544,12 @@
|
||||
"your_team_updated_successfully": "Your team has been updated successfully.",
|
||||
"about": "About",
|
||||
"team_description": "A few sentences about your team. This will appear on your team's url page.",
|
||||
"org_description": "A few sentances about your organization. This will appear on your organization's url page.",
|
||||
"members": "Members",
|
||||
"organization_members":"Organisation members",
|
||||
"member": "Member",
|
||||
"number_member_one": "{{count}} member",
|
||||
"number_member_other": "{{count}} members",
|
||||
"owner": "Owner",
|
||||
"admin": "Admin",
|
||||
"administrator_user": "Administrator user",
|
||||
@@ -569,6 +580,8 @@
|
||||
"confirm_all": "Confirm all",
|
||||
"disband_team": "Disband Team",
|
||||
"disband_team_confirmation_message": "Are you sure you want to disband this team? Anyone who you've shared this team link with will no longer be able to book using it.",
|
||||
"disband_org": "Disband Organization",
|
||||
"disband_org_confirmation_message": "Are you sure you want to disband this Org? All teams and members will be deleted.",
|
||||
"remove_member_confirmation_message": "Are you sure you want to remove this member from the team?",
|
||||
"confirm_disband_team": "Yes, disband team",
|
||||
"confirm_remove_member": "Yes, remove member",
|
||||
@@ -679,6 +692,7 @@
|
||||
"create_team_to_get_started": "Create a team to get started",
|
||||
"teams": "Teams",
|
||||
"team": "Team",
|
||||
"organization": "Organization",
|
||||
"team_billing": "Team Billing",
|
||||
"team_billing_description": "Manage billing for your team",
|
||||
"upgrade_to_flexible_pro_title": "We've changed billing for teams",
|
||||
@@ -854,6 +868,7 @@
|
||||
"installed_app_payment_description": "Configure which payment processing services to use when charging your clients.",
|
||||
"installed_app_analytics_description": "Configure which analytics apps to use for your booking pages",
|
||||
"installed_app_other_description": "All your installed apps from other categories.",
|
||||
"installed_app_conferencing_description": "Configure which conferencing apps to use",
|
||||
"installed_app_automation_description": "Configure which automation apps to use",
|
||||
"installed_app_web3_description": "Configure which web3 apps to use for your booking pages",
|
||||
"analytics": "Analytics",
|
||||
@@ -919,7 +934,7 @@
|
||||
"duplicate": "Duplicate",
|
||||
"offer_seats": "Offer seats",
|
||||
"offer_seats_description": "Offer seats for booking. This automatically disables guest & opt-in bookings.",
|
||||
"seats_available_one":"Seat available",
|
||||
"seats_available_one": "Seat available",
|
||||
"seats_available_other": "Seats available",
|
||||
"number_of_seats": "Number of seats per booking",
|
||||
"enter_number_of_seats": "Enter number of seats",
|
||||
@@ -1209,7 +1224,7 @@
|
||||
"start_of_week": "Start of week",
|
||||
"recordings_title": "Recordings",
|
||||
"recording": "Recording",
|
||||
"happy_scheduling": "Happy Scheduling",
|
||||
"happy_scheduling": "Happy scheduling",
|
||||
"select_calendars": "Select which calendars you want to check for conflicts to prevent double bookings.",
|
||||
"check_for_conflicts": "Check for conflicts",
|
||||
"view_recordings": "View recordings",
|
||||
@@ -1283,7 +1298,7 @@
|
||||
"download_responses_description": "Download all responses to your form in CSV format.",
|
||||
"download": "Download",
|
||||
"download_recording": "Download Recording",
|
||||
"recording_from_your_recent_call":"A recording from your recent call on {{appName}} is ready for download",
|
||||
"recording_from_your_recent_call": "A recording from your recent call on {{appName}} is ready for download",
|
||||
"create_your_first_form": "Create your first form",
|
||||
"create_your_first_form_description": "With Routing Forms you can ask qualifying questions and route to the correct person or event type.",
|
||||
"create_your_first_webhook": "Create your first Webhook",
|
||||
@@ -1292,7 +1307,9 @@
|
||||
"event_one": "event",
|
||||
"event_other": "events",
|
||||
"profile_team_description": "Manage settings for your team profile",
|
||||
"profile_org_description": "Manage settings for your organization profile",
|
||||
"members_team_description": "Users that are in the group",
|
||||
"organization_description": "Manage the admins and members in your organization",
|
||||
"team_url": "Team URL",
|
||||
"team_members": "Team members",
|
||||
"more": "More",
|
||||
@@ -1333,6 +1350,7 @@
|
||||
"routing_forms_send_email_owner": "Send Email to Owner",
|
||||
"routing_forms_send_email_owner_description": "Sends an email to the owner when the form is submitted",
|
||||
"add_new_form": "Add new form",
|
||||
"add_new_team_form": "Add new form to your team",
|
||||
"create_your_first_route": "Create your first route",
|
||||
"route_to_the_right_person": "Route to the right person based on the answers to your form",
|
||||
"form_description": "Create your form to route a booker",
|
||||
@@ -1436,6 +1454,7 @@
|
||||
"yearly": "Yearly",
|
||||
"checkout": "Checkout",
|
||||
"your_team_disbanded_successfully": "Your team has been disbanded successfully",
|
||||
"your_org_disbanded_successfully": "Your organization has been disbanded successfully",
|
||||
"error_creating_team": "Error creating team",
|
||||
"you": "You",
|
||||
"send_email": "Send email",
|
||||
@@ -1470,7 +1489,7 @@
|
||||
"fixed_round_robin": "Fixed round robin",
|
||||
"add_one_fixed_attendee": "Add one fixed attendee and round robin through a number of attendees.",
|
||||
"calcom_is_better_with_team": "{{appName}} is better with teams",
|
||||
"the_calcom_team":"The {{companyName}} team",
|
||||
"the_calcom_team": "The {{companyName}} team",
|
||||
"add_your_team_members": "Add your team members to your event types. Use collective scheduling to include everyone or find the most suitable person with round robin scheduling.",
|
||||
"booking_limit_reached": "Booking Limit for this event type has been reached",
|
||||
"duration_limit_reached": "Duration Limit for this event type has been reached",
|
||||
@@ -1609,10 +1628,10 @@
|
||||
"delete_sso_configuration_confirmation_description": "Are you sure you want to delete the {{connectionType}} configuration? Your team members who use {{connectionType}} login will no longer be able to access Cal.com.",
|
||||
"organizer_timezone": "Organizer timezone",
|
||||
"email_user_cta": "View Invitation",
|
||||
"email_no_user_invite_heading": "You’ve been invited to join a team on {{appName}}",
|
||||
"email_no_user_invite_heading": "You’ve been invited to join a {{appName}} {{entity}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} has invited you to join their team on {{appName}}. {{appName}} is the event-juggling scheduler that enables you and your team to schedule meetings without the email tennis.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} has invited you to join their team `{{teamName}}` on {{appName}}. {{appName}} is the event-juggling scheduler that enables you and your team to schedule meetings without the email tennis.",
|
||||
"email_no_user_invite_steps_intro": "We’ll walk you through a few short steps and you’ll be enjoying stress free scheduling with your team in no time.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} has invited you to join their {{entity}} `{{teamName}}` on {{appName}}. {{appName}} is the event-juggling scheduler that enables you and your {{entity}} to schedule meetings without the email tennis.",
|
||||
"email_no_user_invite_steps_intro": "We’ll walk you through a few short steps and you’ll be enjoying stress free scheduling with your {{entity}} in no time.",
|
||||
"email_no_user_step_one": "Choose your username",
|
||||
"email_no_user_step_two": "Connect your calendar account",
|
||||
"email_no_user_step_three": "Set your Availability",
|
||||
@@ -1623,6 +1642,8 @@
|
||||
"scheduler": "{Scheduler}",
|
||||
"no_workflows": "No workflows",
|
||||
"change_filter": "Change filter to see your personal and team workflows.",
|
||||
"change_filter_common":"Change filter to see the results.",
|
||||
"no_results_for_filter": "No results for the filter",
|
||||
"recommended_next_steps": "Recommended next steps",
|
||||
"create_a_managed_event": "Create a managed event type",
|
||||
"meetings_are_better_with_the_right": "Meetings are better with the right team members there. Invite them now.",
|
||||
@@ -1635,6 +1656,7 @@
|
||||
"attendee_no_longer_attending": "An attendee is no longer attending your event",
|
||||
"attendee_no_longer_attending_subtitle": "{{name}} has cancelled. This means a seat has opened up for this time slot",
|
||||
"create_event_on": "Create event on",
|
||||
"create_routing_form_on": "Create routing form on",
|
||||
"default_app_link_title": "Set a default app link",
|
||||
"default_app_link_description": "Setting a default app link allows all newly created event types to use the app link you set.",
|
||||
"organizer_default_conferencing_app": "Organizer's default app",
|
||||
@@ -1652,10 +1674,10 @@
|
||||
"booking_confirmation_failed": "Booking confirmation failed",
|
||||
"not_enough_seats": "Not enough seats",
|
||||
"form_builder_field_already_exists": "A field with this name already exists",
|
||||
"show_on_booking_page":"Show on booking page",
|
||||
"show_on_booking_page": "Show on booking page",
|
||||
"get_started_zapier_templates": "Get started with Zapier templates",
|
||||
"team_is_unpublished": "{{team}} is unpublished",
|
||||
"team_is_unpublished_description": "This team link is currently not available. Please contact the team owner or ask them publish it.",
|
||||
"team_is_unpublished_description": "This {{entity}} link is currently not available. Please contact the {{entity}} owner or ask them publish it.",
|
||||
"team_member": "Team member",
|
||||
"a_routing_form": "A Routing Form",
|
||||
"form_description_placeholder": "Form Description",
|
||||
@@ -1687,7 +1709,7 @@
|
||||
"no_responses_yet": "No responses yet",
|
||||
"no_routes_defined": "No routes defined",
|
||||
"this_will_be_the_placeholder": "This will be the placeholder",
|
||||
"error_booking_event": "An error occured when booking the event, please refresh the page and try again",
|
||||
"error_booking_event": "An error occurred when booking the event, please refresh the page and try again",
|
||||
"timeslot_missing_title": "No timeslot selected",
|
||||
"timeslot_missing_description": "Please select a timeslot to book the event.",
|
||||
"timeslot_missing_cta": "Select timeslot",
|
||||
@@ -1812,17 +1834,58 @@
|
||||
"book_my_cal": "Book my Cal",
|
||||
"invite_as":"Invite as",
|
||||
"form_updated_successfully":"Form updated successfully.",
|
||||
"email_not_cal_member_cta": "Join your team",
|
||||
"disable_attendees_confirmation_emails": "Disable default confirmation emails for attendees",
|
||||
"disable_attendees_confirmation_emails_description": "At least one workflow is active on this event type that sends an email to the attendees when the event is booked.",
|
||||
"disable_host_confirmation_emails": "Disable default confirmation emails for host",
|
||||
"disable_host_confirmation_emails_description": "At least one workflow is active on this event type that sends an email to the host when the event is booked.",
|
||||
"add_an_override": "Add an override",
|
||||
"import_from_google_workspace":"Import users from Google Workspace",
|
||||
"connect_google_workspace":"Connect Google Workspace",
|
||||
"google_workspace_admin_tooltip":"You must be a Workspace Admin to use this feature",
|
||||
"import_from_google_workspace": "Import users from Google Workspace",
|
||||
"connect_google_workspace": "Connect Google Workspace",
|
||||
"google_workspace_admin_tooltip": "You must be a Workspace Admin to use this feature",
|
||||
"first_event_type_webhook_description": "Create your first webhook for this event type",
|
||||
"create_for": "Create for",
|
||||
"setup_organization": "Setup an Organization",
|
||||
"organization_banner_description": "Create an environments where your teams can create shared apps, workflows and event types with round-robin and collective scheduling.",
|
||||
"organization_banner_title": "Manage organizations with multiple teams",
|
||||
"set_up_your_organization": "Set up your organization",
|
||||
"organizations_description": "Organizations are shared environments where teams can create shared event types, apps, workflows and more.",
|
||||
"organization_url_taken": "This URL is already taken",
|
||||
"must_enter_organization_name": "Must enter an organization name",
|
||||
"must_enter_organization_admin_email": "Must enter your organization email address",
|
||||
"admin_email": "Your organization email address",
|
||||
"admin_username": "Administrator's username",
|
||||
"organization_name": "Organization name",
|
||||
"organization_url": "Organization URL",
|
||||
"organization_verify_header" :"Verify your organization email",
|
||||
"organization_verify_email_body":"Please use the code below to verify your email address to continue setting up your organization.",
|
||||
"additional_url_parameters": "Additional URL parameters",
|
||||
"about_your_organization": "About your organization",
|
||||
"about_your_organization_description": "Organizations are shared environments where you can create multiple teams with shared members, event types, apps, workflows and more.",
|
||||
"create_your_teams": "Create your teams",
|
||||
"create_your_teams_description": "Start scheduling together by adding your team members to your organisation",
|
||||
"invite_organization_admins": "Invite your organization admins",
|
||||
"invite_organization_admins_description": "These admins will have access to all teams in your organization. You can add team admins and members later.",
|
||||
"set_a_password": "Set a password",
|
||||
"set_a_password_description": "This will create a new user account with your organization email and this password.",
|
||||
"organization_logo": "Organization Logo",
|
||||
"organization_about_description": "A few sentences about your organization. This will appear on your organization public profile page.",
|
||||
"ill_do_this_later": "I'll do this later",
|
||||
"verify_your_email": "Verify your email",
|
||||
"enter_digit_code": "Enter the 6 digit code we sent to {{email}}",
|
||||
"verify_email_organization": "Verify your email to create an organization",
|
||||
"code_provided_invalid": "The code provided is not valid, try again",
|
||||
"email_already_used": "Email already being used",
|
||||
"duplicated_slugs_warning": "The following teams couldn't be created due to duplicated slugs: {{slugs}}",
|
||||
"team_names_empty": "Team names can't be empty",
|
||||
"team_names_repeated": "Team names can't be repeated",
|
||||
"user_belongs_organization": "User belongs to an organization",
|
||||
"no_teams_yet": "This organization has no teams yet",
|
||||
"no_teams_yet_description": "if you are an administrator, be sure to create teams to be shown here.",
|
||||
"set_up": "Set up",
|
||||
"set_up_your_profile": "Set up your profile",
|
||||
"set_up_your_profile_description": "Let people know who you are within {{orgName}}, and when they engage with your public link.",
|
||||
"my_profile": "My Profile",
|
||||
"my_settings": "My Settings",
|
||||
"sender_id_info": "Name or number shown as the sender of an SMS (some countries do not allow alphanumeric sender IDs)",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Gracias por probar nuestro nuevo plan de equipo. Notamos que su equipo \"{{teamName}}\" necesita actualizarse.",
|
||||
"team_upgrade_banner_action": "Actualizar aquí",
|
||||
"team_upgraded_successfully": "¡Tu equipo se actualizó con éxito!",
|
||||
"org_upgrade_banner_action": "Actualizar aquí",
|
||||
"use_link_to_reset_password": "Utilice el enlace de abajo para restablecer su contraseña",
|
||||
"hey_there": "Hola,",
|
||||
"forgot_your_password_calcom": "¿Olvidaste tu contraseña? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Hecho",
|
||||
"all_done": "¡Todo listo!",
|
||||
"all_apps": "Todas las aplicaciones",
|
||||
"all": "Todas las aplicaciones",
|
||||
"available_apps": "Aplicaciones disponibles",
|
||||
"check_email_reset_password": "Revisa tu email. Te hemos enviado un enlace para restablecer tu contraseña.",
|
||||
"finish": "Terminar",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Comentarios sobre tu equipo. Esta información aparecerá en la página de la URL de tu equipo.",
|
||||
"members": "Miembros",
|
||||
"member": "Miembro",
|
||||
"number_member_one": "{{count}} miembro",
|
||||
"number_member_other": "{{count}} miembros",
|
||||
"owner": "Propietario",
|
||||
"admin": "Administrador",
|
||||
"administrator_user": "Usuario administrador",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Inicio de la semana",
|
||||
"recordings_title": "Grabaciones",
|
||||
"recording": "Grabación",
|
||||
"happy_scheduling": "Feliz programación",
|
||||
"select_calendars": "Seleccione los calendarios en los que desee comprobar conflictos para evitar reservas dobles.",
|
||||
"check_for_conflicts": "Comprobar conflictos",
|
||||
"view_recordings": "Ver grabaciones",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "¿Está seguro de que desea eliminar la configuración de {{connectionType}}? Los miembros de su equipo que utilicen el inicio de sesión {{connectionType}} ya no podrán acceder a Cal.com.",
|
||||
"organizer_timezone": "Zona horaria del organizador",
|
||||
"email_user_cta": "Ver la invitación",
|
||||
"email_no_user_invite_heading": "Lo han invitado a unirse a un equipo en {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} lo invitó a unirse a su equipo en {{appName}}. {{appName}} es el programador de eventos que les permite a usted y a su equipo programar reuniones sin necesidad de enviar correos electrónicos.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} lo ha invitado a unirse a su equipo \"{{teamName}}\" en {{appName}}. {{appName}} es el planificador de eventos que le permite a usted y a su equipo programar reuniones sin correos electrónicos de ida y vuelta.",
|
||||
"email_no_user_invite_steps_intro": "Lo guiaremos a través de unos pocos pasos y disfrutará de una programación con su equipo sin estresarse y empleando muy poco tiempo.",
|
||||
"email_no_user_step_one": "Elija su nombre de usuario",
|
||||
"email_no_user_step_two": "Conecte su cuenta de calendario",
|
||||
"email_no_user_step_three": "Establezca su disponibilidad",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Mostrar en la página de reserva",
|
||||
"get_started_zapier_templates": "Comience con las plantillas de Zapier",
|
||||
"team_is_unpublished": "{{team}} no está publicado",
|
||||
"team_is_unpublished_description": "Este enlace del equipo no está disponible actualmente. Póngase en contacto con el propietario del equipo o pídale que lo publique.",
|
||||
"team_member": "Miembro del equipo",
|
||||
"a_routing_form": "Un formulario de enrutamiento",
|
||||
"form_description_placeholder": "Descripción del formulario",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Consulte cuál de sus tipos de eventos están recibiendo más clics y reservas",
|
||||
"no_responses_yet": "Aún no hay respuestas",
|
||||
"this_will_be_the_placeholder": "Este será el marcador de posición",
|
||||
"error_booking_event": "Ocurrió un error al reservar el evento, actualice la página e intente nuevamente",
|
||||
"timeslot_missing_title": "No hay intervalo de tiempo seleccionado",
|
||||
"timeslot_missing_description": "Seleccione un intervalo de tiempo para reservar el evento.",
|
||||
"timeslot_missing_cta": "Seleccionar intervalo de tiempo",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Reservar mi Cal",
|
||||
"invite_as": "Invitar como",
|
||||
"form_updated_successfully": "Formulario actualizado con éxito.",
|
||||
"email_not_cal_member_cta": "Únase a su equipo",
|
||||
"disable_attendees_confirmation_emails": "Desactivar los correos electrónicos de confirmación predeterminados para los asistentes",
|
||||
"disable_attendees_confirmation_emails_description": "Al menos un flujo de trabajo está activo en este tipo de evento que envía un correo electrónico a los asistentes cuando se reserva el evento.",
|
||||
"disable_host_confirmation_emails": "Desactivar los correos electrónicos de confirmación predeterminados para el anfitrión",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Conectar Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Debe ser administrador del espacio de trabajo para usar esta función",
|
||||
"first_event_type_webhook_description": "Cree su primer webhook para este tipo de evento",
|
||||
"create_for": "Crear para"
|
||||
"create_for": "Crear para",
|
||||
"organization_url_taken": "Esta URL ya está en uso"
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
"team_info": "Informations sur l'équipe",
|
||||
"request_another_invitation_email": "Si vous préférez ne pas utiliser {{toEmail}} comme votre adresse e-mail {{appName}} ou si vous avez déjà un compte {{appName}}, veuillez demander une autre invitation à cette adresse.",
|
||||
"you_have_been_invited": "Vous avez été invité(e) à rejoindre l'équipe {{teamName}}",
|
||||
"user_invited_you": "{{user}} vous a invité(e) à rejoindre l'équipe {{team}} sur {{appName}}",
|
||||
"user_invited_you": "{{user}} vous a invité à rejoindre l'équipe {{team}} sur {{appName}}",
|
||||
"hidden_team_member_title": "Vous êtes masqué(e) dans cette équipe",
|
||||
"hidden_team_member_message": "Votre place n'est pas payée, passez au plan 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 masqué(e) jusqu'à ce que vous mettiez à niveau.",
|
||||
@@ -128,6 +128,9 @@
|
||||
"team_upgrade_banner_description": "Merci d'avoir essayé notre nouveau plan Équipes. Nous avons remarqué que votre équipe « {{teamName}} » doit être mise à niveau.",
|
||||
"team_upgrade_banner_action": "Mettre à niveau",
|
||||
"team_upgraded_successfully": "Votre équipe a été mise à niveau avec succès !",
|
||||
"org_upgrade_banner_description": "Merci d'avoir testé notre plan Organisation. Nous avons remarqué que votre organisation « {{teamName}} » doit être mise à niveau.",
|
||||
"org_upgrade_banner_action": "Mettre à niveau",
|
||||
"org_upgraded_successfully": "Votre organisation 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é ? - {{appName}}",
|
||||
@@ -238,9 +241,12 @@
|
||||
"done": "Terminé",
|
||||
"all_done": "Terminé !",
|
||||
"all_apps": "Toutes",
|
||||
"all": "Tous",
|
||||
"yours": "Les vôtres",
|
||||
"available_apps": "Applications disponibles",
|
||||
"check_email_reset_password": "Vérifiez vos e-mails. Nous vous avons envoyé un lien pour réinitialiser votre mot de passe.",
|
||||
"finish": "Terminer",
|
||||
"organization_general_description": "Gérez les paramètres de langue et de fuseau horaire de votre équipe.",
|
||||
"few_sentences_about_yourself": "Quelques mots à propos de vous. Ces informations apparaîtront sur votre page publique.",
|
||||
"nearly_there": "C'est bientôt terminé !",
|
||||
"nearly_there_instructions": "Pour finir, une brève description de vous et une photo vous aideront vraiment à obtenir des réservations et à faire savoir aux gens avec qui ils prennent rendez-vous.",
|
||||
@@ -300,6 +306,7 @@
|
||||
"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.",
|
||||
"bookerlayout_title": "Mise en page",
|
||||
"layout": "Mise en page",
|
||||
"bookerlayout_default_title": "Vue par défaut",
|
||||
"bookerlayout_description": "Vous pouvez en sélectionner plusieurs, vos utilisateurs peuvent basculer entre les vues.",
|
||||
"bookerlayout_user_settings_title": "Mise en page de réservation",
|
||||
@@ -537,8 +544,12 @@
|
||||
"your_team_updated_successfully": "Votre équipe a été mise à jour avec succès.",
|
||||
"about": "À propos",
|
||||
"team_description": "Quelques mots à propos de votre équipe. Ces informations apparaîtront sur la page publique de votre équipe.",
|
||||
"org_description": "Quelques phrases à propos de votre organisation. Elles apparaîtront sur la page de profil public de votre organisation.",
|
||||
"members": "Membres",
|
||||
"organization_members": "Membres de l'organisation",
|
||||
"member": "Membre",
|
||||
"number_member_one": "{{count}} membre",
|
||||
"number_member_other": "{{count}} membres",
|
||||
"owner": "Propriétaire",
|
||||
"admin": "Administrateur",
|
||||
"administrator_user": "Utilisateur administrateur",
|
||||
@@ -569,6 +580,8 @@
|
||||
"confirm_all": "Confirmer tout",
|
||||
"disband_team": "Dissoudre l'équipe",
|
||||
"disband_team_confirmation_message": "Voulez-vous vraiment dissoudre cette équipe ? Toute personne avec qui vous avez partagé ce lien d'équipe ne pourra plus faire de réservation en l'utilisant.",
|
||||
"disband_org": "Dissoudre l'organisation",
|
||||
"disband_org_confirmation_message": "Voulez-vous vraiment dissoudre cette organisation ? Toutes les équipes et tous les membres seront supprimés.",
|
||||
"remove_member_confirmation_message": "Voulez-vous vraiment supprimer ce membre de l'équipe ?",
|
||||
"confirm_disband_team": "Oui, dissoudre l'équipe",
|
||||
"confirm_remove_member": "Oui, retirer le membre",
|
||||
@@ -679,6 +692,7 @@
|
||||
"create_team_to_get_started": "Créez une équipe pour commencer",
|
||||
"teams": "Équipes",
|
||||
"team": "Équipe",
|
||||
"organization": "Organisation",
|
||||
"team_billing": "Facturation de l'équipe",
|
||||
"team_billing_description": "Gérez la facturation pour votre équipe.",
|
||||
"upgrade_to_flexible_pro_title": "Nous avons modifié la facturation pour les équipes",
|
||||
@@ -854,6 +868,7 @@
|
||||
"installed_app_payment_description": "Configurez les services de traitement de paiement à utiliser lors de la facturation de vos clients.",
|
||||
"installed_app_analytics_description": "Configurez les applications d'analyse à utiliser pour vos pages de réservation.",
|
||||
"installed_app_other_description": "Toutes vos applications installées à partir d'autres catégories.",
|
||||
"installed_app_conferencing_description": "Configurez les applications de conférence à utiliser.",
|
||||
"installed_app_automation_description": "Configurez les applications d'automatisation à utiliser.",
|
||||
"installed_app_web3_description": "Configurez les applications Web3 à utiliser pour vos pages de réservation.",
|
||||
"analytics": "Analytiques",
|
||||
@@ -889,7 +904,7 @@
|
||||
"the_infrastructure_plan": "Le plan d'infrastructure est basé sur l'utilisation et propose des réductions adaptées aux startups.",
|
||||
"prisma_studio_tip": "Créer un compte via Prisma Studio",
|
||||
"prisma_studio_tip_description": "Découvrez comment configurer votre premier utilisateur",
|
||||
"contact_sales": "Contacter les ventes",
|
||||
"contact_sales": "Contacter le service commercial",
|
||||
"error_404": "Erreur 404",
|
||||
"default": "Par défaut",
|
||||
"set_to_default": "Définir par défaut",
|
||||
@@ -1292,7 +1307,9 @@
|
||||
"event_one": "événement",
|
||||
"event_other": "événements",
|
||||
"profile_team_description": "Gérez les paramètres de votre profil d'équipe.",
|
||||
"profile_org_description": "Gérez les paramètres de votre profil d'organisation.",
|
||||
"members_team_description": "Utilisateurs présents dans le groupe.",
|
||||
"organization_description": "Gérez les administrateurs et les membres de votre organisation.",
|
||||
"team_url": "Lien de l'équipe",
|
||||
"team_members": "Membres de l'équipe",
|
||||
"more": "Plus",
|
||||
@@ -1333,6 +1350,7 @@
|
||||
"routing_forms_send_email_owner": "Envoyer un e-mail au propriétaire",
|
||||
"routing_forms_send_email_owner_description": "Envoie un e-mail au propriétaire lorsque le formulaire est soumis",
|
||||
"add_new_form": "Ajouter un nouveau formulaire",
|
||||
"add_new_team_form": "Ajouter un nouveau formulaire à votre équipe",
|
||||
"create_your_first_route": "Créez votre première route",
|
||||
"route_to_the_right_person": "Acheminez vers la bonne personne en fonction des réponses à votre formulaire.",
|
||||
"form_description": "Créez votre formulaire pour rediriger un utilisateur.",
|
||||
@@ -1436,6 +1454,7 @@
|
||||
"yearly": "Annuellement",
|
||||
"checkout": "Paiement",
|
||||
"your_team_disbanded_successfully": "Votre équipe a bien été dissoute",
|
||||
"your_org_disbanded_successfully": "Votre organisation a bien été dissoute",
|
||||
"error_creating_team": "Erreur lors de la création de l'équipe",
|
||||
"you": "Vous",
|
||||
"send_email": "Envoyer un e-mail",
|
||||
@@ -1510,7 +1529,7 @@
|
||||
"add_an_option": "Ajouter une option",
|
||||
"radio": "Radio",
|
||||
"google_meet_warning": "Pour utiliser Google Meet, vous devez définir votre calendrier de destination sur un calendrier Google",
|
||||
"individual": "Individuel",
|
||||
"individual": "Particulier",
|
||||
"all_bookings_filter_label": "Toutes les réservations",
|
||||
"all_users_filter_label": "Tous les utilisateurs",
|
||||
"your_bookings_filter_label": "Vos réservations",
|
||||
@@ -1609,10 +1628,10 @@
|
||||
"delete_sso_configuration_confirmation_description": "Voulez-vous vraiment supprimer la configuration {{connectionType}} ? Les membres de votre équipe utilisant la connexion {{connectionType}} ne pourront plus accéder à Cal.com.",
|
||||
"organizer_timezone": "Fuseau horaire de l'organisateur",
|
||||
"email_user_cta": "Voir l'invitation",
|
||||
"email_no_user_invite_heading": "Vous avez été invité(e) à rejoindre une équipe sur {{appName}}",
|
||||
"email_no_user_invite_heading": "Vous avez été invité à rejoindre une {{entity}} {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} vous a invité à rejoindre son équipe sur {{appName}}. {{appName}} est le planificateur d'événements qui vous permet à vous et à votre équipe d'organiser des rendez-vous sans échanges d'e-mails.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} vous a invité à rejoindre son équipe « {{teamName}} » sur {{appName}}. {{appName}} est le planificateur d'événements qui vous permet à vous et à votre équipe d'organiser des rendez-vous sans échanges d'e-mails.",
|
||||
"email_no_user_invite_steps_intro": "Nous vous guiderons à travers quelques étapes courtes et vous profiterez d'une planification sans stress avec votre équipe en un rien de temps.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} vous a invité à rejoindre son {{entity}} « {{teamName}} » sur {{appName}}. {{appName}} est le planificateur d'événements qui vous permet à vous et à votre {{entity}} d'organiser des rendez-vous sans échanges d'e-mails.",
|
||||
"email_no_user_invite_steps_intro": "Nous vous guiderons à travers quelques étapes courtes et vous profiterez d'une planification sans stress avec votre {{entity}} en un rien de temps.",
|
||||
"email_no_user_step_one": "Choisissez votre nom d'utilisateur",
|
||||
"email_no_user_step_two": "Connectez votre compte de calendrier",
|
||||
"email_no_user_step_three": "Définissez vos disponibilités",
|
||||
@@ -1623,6 +1642,8 @@
|
||||
"scheduler": "{Scheduler}",
|
||||
"no_workflows": "Aucun workflow",
|
||||
"change_filter": "Changez le filtre pour voir vos workflows personnels et d'équipe.",
|
||||
"change_filter_common": "Changez le filtre pour voir les résultats.",
|
||||
"no_results_for_filter": "Aucun résultat pour le filtre",
|
||||
"recommended_next_steps": "Étapes suivantes recommandées",
|
||||
"create_a_managed_event": "Créer un type d'événement géré",
|
||||
"meetings_are_better_with_the_right": "Les rendez-vous sont meilleurs avec les bons membres d'équipe. Invitez-les maintenant.",
|
||||
@@ -1635,6 +1656,7 @@
|
||||
"attendee_no_longer_attending": "Un participant ne participe plus à votre événement",
|
||||
"attendee_no_longer_attending_subtitle": "{{name}} a annulé. Cela signifie qu'une place s'est libérée pour ce créneau horaire",
|
||||
"create_event_on": "Créer un événement dans",
|
||||
"create_routing_form_on": "Créer un formulaire de routage sur",
|
||||
"default_app_link_title": "Définir un lien d'application par défaut",
|
||||
"default_app_link_description": "Définir un lien d'application par défaut permet à tous les nouveaux types d'événements d'utiliser le lien d'application que vous avez défini.",
|
||||
"organizer_default_conferencing_app": "Application par défaut de l'organisateur",
|
||||
@@ -1655,7 +1677,7 @@
|
||||
"show_on_booking_page": "Afficher sur la page de réservation",
|
||||
"get_started_zapier_templates": "Démarrer avec les modèles Zapier",
|
||||
"team_is_unpublished": "{{team}} n'est pas publiée",
|
||||
"team_is_unpublished_description": "Ce lien d'équipe n'est actuellement pas disponible. Veuillez contacter le propriétaire de l'équipe ou lui demander de le publier.",
|
||||
"team_is_unpublished_description": "Ce lien d'{{entity}} n'est actuellement pas disponible. Veuillez contacter le propriétaire de l'{{entity}} ou lui demander de le publier.",
|
||||
"team_member": "Membre d'équipe",
|
||||
"a_routing_form": "Un formulaire de routage",
|
||||
"form_description_placeholder": "Description du formulaire",
|
||||
@@ -1803,12 +1825,14 @@
|
||||
"image_size_limit_exceed": "L'image téléchargée ne doit pas dépasser 5 Mo",
|
||||
"unauthorized_workflow_error_message": "{{errorCode}} : Vous n'êtes pas autorisé à activer ou désactiver ce workflow",
|
||||
"inline_embed": "Intégration en ligne",
|
||||
"load_inline_content": "Charge votre type d'événement directement en ligne avec le contenu de votre site web.",
|
||||
"floating_pop_up_button": "Bouton pop-up flottant",
|
||||
"load_inline_content": "Charge votre type d'événement directement dans le contenu de votre site web.",
|
||||
"floating_pop_up_button": "Bouton flottant",
|
||||
"floating_button_trigger_modal": "Place un bouton flottant sur votre site qui déclenche une modale avec votre type d'événement.",
|
||||
"pop_up_element_click": "Clic sur un élément",
|
||||
"open_dialog_with_element_click": "Ouvre votre boîte de dialogue Cal lorsque quelqu'un clique sur un élément.",
|
||||
"need_help_embedding": "Besoin d'aide ? Consultez nos guides pour intégrer Cal sur Wix, Squarespace ou WordPress, consultez nos questions fréquentes ou explorez les options d'intégration avancées.",
|
||||
"invite_as": "Inviter en tant que",
|
||||
"form_updated_successfully": "Formulaire mis à jour avec succès.",
|
||||
"email_not_cal_member_cta": "Rejoignez votre équipe",
|
||||
"disable_attendees_confirmation_emails": "Désactiver les e-mails de confirmation par défaut pour les participants",
|
||||
"disable_attendees_confirmation_emails_description": "Au moins un workflow est actif sur ce type d'événement qui envoie un e-mail aux participants lorsque l'événement est réservé.",
|
||||
"disable_host_confirmation_emails": "Désactiver les e-mails de confirmation par défaut pour l'hôte",
|
||||
@@ -1816,8 +1840,51 @@
|
||||
"add_an_override": "Ajouter une superposition",
|
||||
"import_from_google_workspace": "Importer des utilisateurs depuis Google Workspace",
|
||||
"connect_google_workspace": "Connecter Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Vous devez être un administrateur d'espace de travail pour utiliser cette fonctionnalité",
|
||||
"first_event_type_webhook_description": "Créez votre premier webhook pour ce type d'événement",
|
||||
"create_for": "Créer pour",
|
||||
"setup_organization": "Configurer une organisation",
|
||||
"organization_banner_description": "Créez un environnement où vos équipes peuvent créer des applications partagées, des workflows et des types d'événements avec une planification Round-Robin et collective.",
|
||||
"organization_banner_title": "Gérer les organisations avec plusieurs équipes",
|
||||
"set_up_your_organization": "Configurer votre organisation",
|
||||
"organizations_description": "Les organisations sont des environnements partagés dans lesquels les équipes peuvent créer des types d'événements partagés, des applications, des workflows, etc.",
|
||||
"organization_url_taken": "Ce lien est déjà pris",
|
||||
"must_enter_organization_name": "Vous devez entrer un nom d'organisation",
|
||||
"must_enter_organization_admin_email": "Vous devez entrer l'adresse e-mail de votre organisation",
|
||||
"admin_email": "Adresse e-mail de votre organisation",
|
||||
"admin_username": "Nom d'utilisateur de l'administrateur",
|
||||
"organization_name": "Nom de l'organisation",
|
||||
"organization_url": "Lien de l'organisation",
|
||||
"organization_verify_header": "Vérifier l'adresse e-mail de votre organisation",
|
||||
"organization_verify_email_body": "Veuillez utiliser le code ci-dessous pour vérifier votre adresse e-mail et continuer à configurer votre organisation.",
|
||||
"additional_url_parameters": "Paramètres d'URL supplémentaires",
|
||||
"about_your_organization": "À propos de votre organisation",
|
||||
"about_your_organization_description": "Les organisations sont des environnements partagés dans lesquels vous pouvez créer plusieurs équipes avec des membres partagés, des types d'événements, des applications, des workflows, etc.",
|
||||
"create_your_teams": "Créer vos équipes",
|
||||
"create_your_teams_description": "Commencez à planifier ensemble en ajoutant les membres de votre équipe à votre organisation",
|
||||
"invite_organization_admins": "Inviter les administrateurs de votre organisation",
|
||||
"invite_organization_admins_description": "Ces administrateurs auront accès à toutes les équipes de votre organisation. Vous pouvez ajouter des administrateurs et des membres d'équipe plus tard.",
|
||||
"set_a_password": "Définir un mot de passe",
|
||||
"set_a_password_description": "Cela créera un nouveau compte utilisateur avec l'adresse e-mail de votre organisation et ce mot de passe.",
|
||||
"organization_logo": "Logo de l'organisation",
|
||||
"organization_about_description": "Quelques phrases à propos de votre organisation. Elles apparaîtront sur la page de profil public de votre organisation.",
|
||||
"ill_do_this_later": "Je le ferai plus tard",
|
||||
"verify_your_email": "Vérifier votre adresse e-mail",
|
||||
"enter_digit_code": "Entrez le code à 6 chiffres que nous avons envoyé à {{email}}",
|
||||
"verify_email_organization": "Vérifiez votre adresse e-mail pour créer une organisation",
|
||||
"code_provided_invalid": "Le code fourni n'est pas valide, veuillez réessayer",
|
||||
"email_already_used": "L'adresse e-mail est déjà utilisée",
|
||||
"duplicated_slugs_warning": "Les équipes suivantes n'ont pas pu être créées en raison de slugs identiques : {{slugs}}",
|
||||
"team_names_empty": "Les noms d'équipe ne peuvent pas être vides",
|
||||
"team_names_repeated": "Les noms d'équipe ne peuvent pas être répétés",
|
||||
"user_belongs_organization": "L'utilisateur appartient à une organisation",
|
||||
"no_teams_yet": "Cette organisation n'a pas encore d'équipe",
|
||||
"no_teams_yet_description": "si vous êtes administrateur, assurez-vous de créer des équipes à afficher ici.",
|
||||
"set_up": "Configurer",
|
||||
"set_up_your_profile": "Configurer votre profil",
|
||||
"set_up_your_profile_description": "Faites savoir aux gens qui vous êtes au sein de {{orgName}} et quand ils interagissent avec votre lien public.",
|
||||
"my_profile": "Mon profil",
|
||||
"my_settings": "Mes paramètres",
|
||||
"sender_id_info": "Nom ou numéro affiché comme expéditeur d'un SMS (certains pays n'autorisent pas les ID d'expéditeur alphanumériques)",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Ajoutez vos nouvelles chaînes ci-dessus ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"verify_email_email_header": "אמת את חשבון הדוא״ל שלך",
|
||||
"verify_email_email_button": "אמת דוא״ל",
|
||||
"verify_email_email_body": "אנא אמת את חשבון הדוא״ל שלך על ידי לחיצה על הכפתור מטה.",
|
||||
"verify_email_email_link_text": "הנה הקישור, אם אתה לא אוהב ללחוץ על כפתורים:",
|
||||
"email_sent": "מייל נשלח בהצלחה",
|
||||
"event_declined_subject": "נדחה: {{title}} ב- {{date}}",
|
||||
"event_cancelled_subject": "בוטל: {{title}} ב- {{date}}",
|
||||
@@ -128,6 +127,7 @@
|
||||
"team_upgrade_banner_description": "אנחנו מודים לך על כך שניסית את החבילה החדשה שלנו לצוותים. שמנו לב שהצוות שלך, \"{{teamName}}\", זקוק לשדרוג.",
|
||||
"team_upgrade_banner_action": "כאן משדרגים",
|
||||
"team_upgraded_successfully": "הצוות שלך שודרג בהצלחה!",
|
||||
"org_upgrade_banner_action": "כאן משדרגים",
|
||||
"use_link_to_reset_password": "נא להשתמש בקישור הבא כדי לאפס את הסיסמה",
|
||||
"hey_there": "שלום,",
|
||||
"forgot_your_password_calcom": "שכחתה את הסיסמה? - {{appName}}",
|
||||
@@ -238,6 +238,7 @@
|
||||
"done": "בוצע",
|
||||
"all_done": "זהו, סיימת!",
|
||||
"all_apps": "כל האפליקציות",
|
||||
"all": "כל האפליקציות",
|
||||
"available_apps": "אפליקציות זמינות",
|
||||
"check_email_reset_password": "בדוק/י בתיבת הדוא\"ל – שלחנו לך קישור לאיפוס הסיסמה.",
|
||||
"finish": "סיום",
|
||||
@@ -300,6 +301,7 @@
|
||||
"failed": "הפעולה נכשלה",
|
||||
"password_has_been_reset_login": "הסיסמה שלך אופסה. עכשיו ניתן להיכנס עם הסיסמה החדשה.",
|
||||
"bookerlayout_title": "פריסה",
|
||||
"layout": "פריסה",
|
||||
"bookerlayout_default_title": "תצוגת ברירת מחדל",
|
||||
"bookerlayout_description": "אתה יכול לבחור כמה והמתזמנים שלך יכולים לשנות תצוגות.",
|
||||
"bookerlayout_user_settings_title": "פריסת תזמון",
|
||||
@@ -528,6 +530,8 @@
|
||||
"team_description": "מספר משפטים אודות הצוות. המידע הזה יופיע בדף ה-URL של הצוות.",
|
||||
"members": "חברים",
|
||||
"member": "חבר/ת",
|
||||
"number_member_one": "חבר {{count}}",
|
||||
"number_member_other": "{{count}} חברים",
|
||||
"owner": "בעלים",
|
||||
"admin": "מנהל/ת מערכת",
|
||||
"administrator_user": "משתמש המוגדר כמנהל מערכת",
|
||||
@@ -1197,7 +1201,6 @@
|
||||
"start_of_week": "תחילת השבוע",
|
||||
"recordings_title": "הקלטות",
|
||||
"recording": "הקלטה",
|
||||
"happy_scheduling": "תזמון נעים!",
|
||||
"select_calendars": "בחר את לוחות השנה שבהם ברצונך לבדוק אם יש התנגשויות, כדי למנוע כפל הזמנות.",
|
||||
"check_for_conflicts": "בדיקת התנגשויות",
|
||||
"view_recordings": "צפייה בהקלטות",
|
||||
@@ -1592,10 +1595,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "אתה בטוח שאתה רוצה למחוק את הגדרות {{connectionType}}? חברי הצוות שלך שמשתמשים ב- {{connectionType}} להזדהות לא יוכלו להשתמש בו להכנס ל- Cal.com.",
|
||||
"organizer_timezone": "מארגן אזורי זמן",
|
||||
"email_user_cta": "צפה בהזמנה",
|
||||
"email_no_user_invite_heading": "הוזמנת להצטרף לצוות ב- {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} הזמין אותך להצטרף לצוות שלו ב- {{appName}}. {{appName}} הינה מתזמן זימונים שמאפשר לך ולצוות שלך לזמן פגישות בלי כל הפינג פונג במיילים.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} הזמין/ה אותך להצטרף לצוות שלו/ה בשם '{{teamName}}' באפליקציה {{appName}}. אפליקציית {{appName}} היא כלי לקביעת מועדים לאירועים שמאפשר לך ולצוות שלך לתזמן פגישות בלי כל הפינג פונג במיילים.",
|
||||
"email_no_user_invite_steps_intro": "אנחנו נדריך אותך במספר צעדים קצרים ואתה תהנה תזמון נטול מתח עם הצוות שלך כהרף עין.",
|
||||
"email_no_user_step_one": "בחר שם משתמש",
|
||||
"email_no_user_step_two": "קשר את לוח השנה שלך",
|
||||
"email_no_user_step_three": "הגדר את הזמינות שלך",
|
||||
@@ -1637,7 +1637,6 @@
|
||||
"show_on_booking_page": "להציג בדף ההזמנות",
|
||||
"get_started_zapier_templates": "התחל עם תבניות Zapier",
|
||||
"team_is_unpublished": "צוות {{team}} אינו מפורסם",
|
||||
"team_is_unpublished_description": "קישור הצוות הזה אינו זמין כעת. אנא צור קשר עם הבעלים של הצוות או בקש מהם לפרסם אותו.",
|
||||
"team_member": "חבר צוות",
|
||||
"a_routing_form": "טופס ניתוב",
|
||||
"form_description_placeholder": "תיאור הטופס",
|
||||
@@ -1668,7 +1667,6 @@
|
||||
"spot_popular_event_types_description": "צפה איזה ארועים מקבלים הכי הרבה גישות ותזמונים",
|
||||
"no_responses_yet": "אין עדיין תגובות",
|
||||
"this_will_be_the_placeholder": "זה יהיה הממלא מקום",
|
||||
"error_booking_event": "אירעה שגיאה בעת הזמנת האירוע, רענן/י את הדף ונסה/י שוב",
|
||||
"timeslot_missing_title": "לא נבחר חלון זמן",
|
||||
"timeslot_missing_description": "כדי להזמין את האירוע, יש לבחור חלון זמן.",
|
||||
"timeslot_missing_cta": "חלון הזמן שנבחר",
|
||||
@@ -1781,7 +1779,6 @@
|
||||
"book_my_cal": "הזמנה ביומן שלי",
|
||||
"invite_as": "הזמנה בְתור",
|
||||
"form_updated_successfully": "עדכון הטופס בוצע בהצלחה.",
|
||||
"email_not_cal_member_cta": "הצטרף/י לצוות שלך",
|
||||
"disable_attendees_confirmation_emails": "השבתת הודעות דוא\"ל לאישור שנשלחות כברירת מחדל עבור המשתתפים",
|
||||
"disable_attendees_confirmation_emails_description": "בסוג האירוע הזה פעיל לפחות תהליך עבודה אחד ששולח דוא\"ל למשתתפים כשהאירוע מוזמן.",
|
||||
"disable_host_confirmation_emails": "השבתת הודעות דוא\"ל לאישור שנשלחות כברירת מחדל עבור המארח/ת",
|
||||
@@ -1791,5 +1788,6 @@
|
||||
"connect_google_workspace": "חיבור Google Workspace",
|
||||
"google_workspace_admin_tooltip": "עליך להיות אדמין/ית ב-Workspace כדי להשתמש בתכונה הזו",
|
||||
"first_event_type_webhook_description": "צור/צרי את ה-Webhook הראשון שלך עבור סוג זה של אירוע",
|
||||
"create_for": "צור/צרי עבור"
|
||||
"create_for": "צור/צרי עבור",
|
||||
"organization_url_taken": "כתובת ה-URL הזו כבר תפוסה"
|
||||
}
|
||||
|
||||
@@ -108,6 +108,7 @@
|
||||
"team_upgrade_banner_description": "Hvala vam što isprobavate naš novi plan za timove. Primijetili smo da se vaš tim „{{teamName}}“ treba nadograditi.",
|
||||
"team_upgrade_banner_action": "Nadogradite ovdje",
|
||||
"team_upgraded_successfully": "Vaš tim je uspješno pretplaćen!",
|
||||
"org_upgrade_banner_action": "Nadogradite ovdje",
|
||||
"use_link_to_reset_password": "Resetirajte lozinku koristeći donji link",
|
||||
"hey_there": "Pozdrav,",
|
||||
"forgot_your_password_calcom": "Zaboravili ste lozinku? - {{appName}}",
|
||||
@@ -216,6 +217,7 @@
|
||||
"done": "Učinjeno",
|
||||
"all_done": "Završeno!",
|
||||
"all_apps": "Sve",
|
||||
"all": "Sve",
|
||||
"check_email_reset_password": "Provjerite svoju e-poštu. Poslali smo vam link za resetiranje lozinke.",
|
||||
"finish": "Završi",
|
||||
"few_sentences_about_yourself": "Nekoliko rečenica o sebi. Ovo će se pojaviti na vašoj osobnoj stranici.",
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
"forgot": "Elfelejtetted?",
|
||||
"done": "Kész",
|
||||
"all_apps": "Minden alkalmazás",
|
||||
"all": "Minden alkalmazás",
|
||||
"finish": "Befelyezés",
|
||||
"current_time": "Jelenlegi idő",
|
||||
"welcome": "Üdvözöljük",
|
||||
|
||||
@@ -88,6 +88,7 @@
|
||||
"team_upgrade_banner_description": "Terimakasih telah mencoba paket tim kami. Kami perhatikan tim kamu \"{{teamName}}\" perlu diupgrade.",
|
||||
"team_upgrade_banner_action": "Upgrade disini",
|
||||
"team_upgraded_successfully": "Tim kamu telah berhasil diupgrade!",
|
||||
"org_upgrade_banner_action": "Upgrade disini",
|
||||
"use_link_to_reset_password": "Gunakan link di bawah ini untuk mengatur ulang kata sandi kamu",
|
||||
"hey_there": "Halo,",
|
||||
"forgot_your_password_calcom": "Lupa kata sandi? - {{appName}}",
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
"verify_email_email_button": "Verifica l'e-mail",
|
||||
"verify_email_email_body": "Verifica il tuo indirizzo e-mail cliccando sul pulsante qui in basso.",
|
||||
"verify_email_email_link_text": "Ecco il link nel caso tu non voglia fare clic su pulsanti:",
|
||||
"email_sent": "Email inviata con successo",
|
||||
"event_declined_subject": "Rifiutato: {{title}} il {{date}}",
|
||||
"event_cancelled_subject": "Cancellato: {{title}} il {{date}}",
|
||||
"event_request_declined": "La tua richiesta per l'evento è stata rifiutata",
|
||||
@@ -127,6 +128,7 @@
|
||||
"team_upgrade_banner_description": "Grazie per aver provato il nostro piano team. Abbiamo notato che è necessario effettuare l'upgrade del tuo team \"{{teamName}}\".",
|
||||
"team_upgrade_banner_action": "Effettua l'upgrade",
|
||||
"team_upgraded_successfully": "Il tuo team è stato aggiornato!",
|
||||
"org_upgrade_banner_action": "Effettua l'upgrade",
|
||||
"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? - {{appName}}",
|
||||
@@ -201,6 +203,7 @@
|
||||
"page_doesnt_exist": "Questa pagina non esiste.",
|
||||
"check_spelling_mistakes_or_go_back": "Controlla gli errori di ortografia o torna alla pagina precedente.",
|
||||
"404_page_not_found": "404: Questa pagina non è stata trovata.",
|
||||
"booker_event_not_found": "Non siamo riusciti a trovare l'evento che stai cercando di fissare.",
|
||||
"getting_started": "Stiamo iniziando",
|
||||
"15min_meeting": "Meeting di 15 minuti",
|
||||
"30min_meeting": "Meeting di 30 minuti",
|
||||
@@ -236,6 +239,7 @@
|
||||
"done": "Fatto",
|
||||
"all_done": "Operazione completata!",
|
||||
"all_apps": "Tutte le app",
|
||||
"all": "Tutte le app",
|
||||
"available_apps": "Applicazioni disponibili",
|
||||
"check_email_reset_password": "Controlla la tua email. Ti abbiamo inviato un link per reimpostare la password.",
|
||||
"finish": "Fine",
|
||||
@@ -297,6 +301,19 @@
|
||||
"success": "Riuscito",
|
||||
"failed": "Fallito",
|
||||
"password_has_been_reset_login": "La tua password è stata reimpostata. Ora puoi accedere con la tua password appena creata.",
|
||||
"bookerlayout_title": "Layout",
|
||||
"layout": "Layout",
|
||||
"bookerlayout_default_title": "Vista predefinita",
|
||||
"bookerlayout_description": "È possibile selezionarne vari e chi fissa gli appuntamenti può cambiare visualizzazione.",
|
||||
"bookerlayout_user_settings_title": "Layout di programmazione appuntamenti",
|
||||
"bookerlayout_user_settings_description": "È possibile selezionare più librerie e chi fissa gli appuntamenti può cambiare vista. Il tutto può poi essere cambiato in base agli eventi.",
|
||||
"bookerlayout_month_view": "Mese",
|
||||
"bookerlayout_week_view": "Settimanale",
|
||||
"bookerlayout_column_view": "Colonna",
|
||||
"bookerlayout_error_min_one_enabled": "Deve essere abilitato almeno un layout.",
|
||||
"bookerlayout_error_default_not_enabled": "Il layout selezionato come vista predefinita non fa parte dei layout abilitati.",
|
||||
"bookerlayout_error_unknown_layout": "Il layout selezionato non è un layout valido.",
|
||||
"bookerlayout_override_global_settings": "Puoi gestirlo per tutti i tipi di eventi in <2>impostazioni / aspetto</2> o <6>sostituire solo per questo evento</6>.",
|
||||
"unexpected_error_try_again": "Si è verificato un errore imprevisto. Riprova.",
|
||||
"sunday_time_error": "Ora non valida la domenica",
|
||||
"monday_time_error": "Ora non valida il lunedì",
|
||||
@@ -366,6 +383,7 @@
|
||||
"user_dynamic_booking_disabled": "Alcuni degli utenti del gruppo hanno attualmente disabilitato le prenotazioni di gruppo dinamiche",
|
||||
"allow_dynamic_booking_tooltip": "È possibile creare dinamicamente collegamenti a prenotazioni di gruppo inserendo più nomi utente separati da '+'. Esempio: '{{appName}}/bailey+peer'",
|
||||
"allow_dynamic_booking": "Consenti ai partecipanti di prenotare per te utilizzando le prenotazioni di gruppo dinamiche",
|
||||
"dynamic_booking": "Collegamenti dinamici di gruppo",
|
||||
"email": "Email",
|
||||
"email_placeholder": "jdoe@example.com",
|
||||
"full_name": "Nome completo",
|
||||
@@ -376,6 +394,8 @@
|
||||
"booking_rescheduled": "Prenotazione Riprogrammata",
|
||||
"recording_ready": "Link per scaricare la registrazione pronto",
|
||||
"booking_created": "Prenotazione Creata",
|
||||
"booking_rejected": "Prenotazione Rifiutata",
|
||||
"booking_requested": "Prenotazione Richiesta",
|
||||
"meeting_ended": "Riunione terminata",
|
||||
"form_submitted": "Modulo inviato",
|
||||
"event_triggers": "Attivatori Evento",
|
||||
@@ -522,6 +542,8 @@
|
||||
"team_description": "Alcune frasi sul tuo team. Appariranno nella pagina URL del team.",
|
||||
"members": "Membri",
|
||||
"member": "Membri",
|
||||
"number_member_one": "{{count}} membro",
|
||||
"number_member_other": "{{count}} membri",
|
||||
"owner": "Proprietario",
|
||||
"admin": "Amministratore",
|
||||
"administrator_user": "Utente amministratore",
|
||||
@@ -837,6 +859,7 @@
|
||||
"installed_app_payment_description": "Configura quale servizio di elaborazione dei pagamenti usare per addebitare i clienti.",
|
||||
"installed_app_analytics_description": "Imposta quali app di analisi usare per le tue pagine di prenotazione",
|
||||
"installed_app_other_description": "Tutte le app installate appartenenti ad altre categorie.",
|
||||
"installed_app_conferencing_description": "Configura quali app di conferenza utilizzare",
|
||||
"installed_app_automation_description": "Imposta quali app di automazione usare",
|
||||
"installed_app_web3_description": "Imposta quali app Web3 usare per le tue pagine di prenotazione",
|
||||
"analytics": "Analisi",
|
||||
@@ -1033,6 +1056,7 @@
|
||||
"new_event_trigger": "quando viene prenotato un nuovo evento",
|
||||
"email_host_action": "invia e-mail all'organizzatore",
|
||||
"email_attendee_action": "invia e-mail ai partecipanti",
|
||||
"sms_attendee_action": "Invia SMS al partecipante",
|
||||
"sms_number_action": "invia SMS a un numero specifico",
|
||||
"workflows": "Flussi di lavoro",
|
||||
"new_workflow_btn": "Nuovo flusso di lavoro",
|
||||
@@ -1191,7 +1215,7 @@
|
||||
"start_of_week": "Inizio della settimana",
|
||||
"recordings_title": "Registrazioni",
|
||||
"recording": "Registrazione",
|
||||
"happy_scheduling": "Ti auguriamo una piacevole esperienza di pianificazione",
|
||||
"happy_scheduling": "Buona pianificazione",
|
||||
"select_calendars": "Seleziona su quali calendari desideri controllare i conflitti per evitare doppie prenotazioni.",
|
||||
"check_for_conflicts": "Controlla conflitti",
|
||||
"view_recordings": "Visualizza registrazioni",
|
||||
@@ -1233,6 +1257,7 @@
|
||||
"conferencing_description": "Aggiungi le tue app di videoconferenza preferite per le tue riunioni",
|
||||
"add_conferencing_app": "Aggiungi app di videoconferenza",
|
||||
"password_description": "Gestisci le impostazioni relative alle password del tuo account",
|
||||
"set_up_two_factor_authentication": "Imposta l'autenticazione a due fattori",
|
||||
"we_just_need_basic_info": "Abbiamo bisogno di alcune semplici informazioni per completare la configurazione del tuo profilo.",
|
||||
"skip": "Salta",
|
||||
"do_this_later": "Più tardi",
|
||||
@@ -1264,6 +1289,7 @@
|
||||
"download_responses_description": "Scarica tutte le risposte al tuo modulo in formato CSV.",
|
||||
"download": "Scarica",
|
||||
"download_recording": "Scarica registrazione",
|
||||
"recording_from_your_recent_call": "Una registrazione della tua recente chiamata su {{appName}} è pronta per il download",
|
||||
"create_your_first_form": "Crea il tuo primo modulo",
|
||||
"create_your_first_form_description": "I Moduli di instradamento consentono di porre domande qualificanti agli utenti per indirizzarli a persone o eventi pertinenti.",
|
||||
"create_your_first_webhook": "Crea il tuo primo Webhook",
|
||||
@@ -1449,6 +1475,8 @@
|
||||
"find_the_best_person": "Trova la persona più adatta disponibile e fai ruotare i membri del team.",
|
||||
"fixed_round_robin": "Round robin fisso",
|
||||
"add_one_fixed_attendee": "Aggiungi un partecipante fisso e fai intervenire a turno altri partecipanti.",
|
||||
"calcom_is_better_with_team": "{{appName}} funziona meglio in team",
|
||||
"the_calcom_team": "Il team {{companyName}}",
|
||||
"add_your_team_members": "Aggiungi i membri del tuo team ai tuoi tipi di eventi. Usa la pianificazione collettiva per includere tutti o trova la persona più adatta con la pianificazione round robin.",
|
||||
"booking_limit_reached": "È stato raggiunto il limite di prenotazione per questo tipo di evento",
|
||||
"duration_limit_reached": "È stato raggiunto il limite di durata per questo tipo di evento",
|
||||
@@ -1467,6 +1495,7 @@
|
||||
"navigate_installed_apps": "Vai alle app installate",
|
||||
"disabled_calendar": "Se hai un altro calendario installato, le nuove prenotazioni saranno aggiunte a quel calendario. Altrimenti, collega un nuovo calendario in modo da non perdere nessuna nuova prenotazione.",
|
||||
"enable_apps": "Abilita app",
|
||||
"enable_apps_description": "Abilita le app che gli utenti possono integrare con {{appName}}",
|
||||
"purchase_license": "Acquista una licenza",
|
||||
"already_have_key": "Ho già una chiave:",
|
||||
"already_have_key_suggestion": "Copia qui la variabile di ambiente CALCOM_LICENSE_KEY esistente.",
|
||||
@@ -1586,10 +1615,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Eliminare la configurazione {{connectionType}}? I membri del tuo team che utilizzano l'accesso {{connectionType}} non saranno più in grado di accedere a Cal.com.",
|
||||
"organizer_timezone": "Fuso orario organizzatore",
|
||||
"email_user_cta": "Visualizza invito",
|
||||
"email_no_user_invite_heading": "Sei stato invitato a unirti a un team su {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} ti ha invitato a unirti al suo team su {{appName}}. {{appName}} è uno strumento di pianificazione di eventi che permette al tuo team di pianificare le riunioni senza scambiare decine di e-mail.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} ti ha invitato a unirti al suo team `{{teamName}}` su {{appName}}. {{appName}} è uno strumento di pianificazione di eventi che permette a te e al tuo team di pianificare le riunioni senza scambiare decine di e-mail.",
|
||||
"email_no_user_invite_steps_intro": "Ti assisteremo nei passaggi iniziali in modo che tu possa pianificare eventi per il tuo team senza stress e in pochissimo tempo.",
|
||||
"email_no_user_step_one": "Scegli il tuo nome utente",
|
||||
"email_no_user_step_two": "Collega il tuo account di calendario",
|
||||
"email_no_user_step_three": "Imposta la tua disponibilità",
|
||||
@@ -1621,6 +1647,7 @@
|
||||
"booking_questions_title": "Domande per la prenotazione",
|
||||
"booking_questions_description": "Personalizza le domande poste nella pagina di prenotazione",
|
||||
"add_a_booking_question": "Aggiungi una domanda",
|
||||
"identifier": "Identificatore",
|
||||
"duplicate_email": "Indirizzo e-mail duplicato",
|
||||
"booking_with_payment_cancelled": "Non è più possibile pagare per questo evento",
|
||||
"booking_with_payment_cancelled_already_paid": "È in corso il rimborso del pagamento per questa prenotazione.",
|
||||
@@ -1631,7 +1658,6 @@
|
||||
"show_on_booking_page": "Mostra nella pagina di prenotazione",
|
||||
"get_started_zapier_templates": "Inizia con i modelli Zapier",
|
||||
"team_is_unpublished": "{{team}} non è pubblicato",
|
||||
"team_is_unpublished_description": "Questo link del team non è attualmente disponibile. Contattare il proprietario del team o chiedergli di pubblicarlo.",
|
||||
"team_member": "Membro del team",
|
||||
"a_routing_form": "Un modulo di instradamento",
|
||||
"form_description_placeholder": "Descrizione modulo",
|
||||
@@ -1661,14 +1687,15 @@
|
||||
"spot_popular_event_types": "Individua i tipi di evento popolari",
|
||||
"spot_popular_event_types_description": "Scopri quali tipi di evento ricevono più clic e prenotazioni",
|
||||
"no_responses_yet": "Per ora non ci sono risposte",
|
||||
"no_routes_defined": "Nessun percorso definito",
|
||||
"this_will_be_the_placeholder": "Questo sarà il segnaposto",
|
||||
"error_booking_event": "Si è verificato un errore durante la prenotazione dell'evento. Aggiornare la pagina e riprovare",
|
||||
"timeslot_missing_title": "Nessuna fascia oraria selezionata",
|
||||
"timeslot_missing_description": "Selezionare una fascia oraria per prenotare l'evento.",
|
||||
"timeslot_missing_cta": "Seleziona fascia oraria",
|
||||
"switch_monthly": "Passa alla vista mensile",
|
||||
"switch_weekly": "Passa alla vista settimanale",
|
||||
"switch_multiday": "Passa alla vista giornaliera",
|
||||
"switch_columnview": "Passa alla vista colonna",
|
||||
"num_locations": "{{num}} opzioni di luogo",
|
||||
"select_on_next_step": "Seleziona nel passaggio successivo",
|
||||
"this_meeting_has_not_started_yet": "Questa riunione non è ancora iniziata",
|
||||
@@ -1757,6 +1784,16 @@
|
||||
"complete_your_booking": "Completa la prenotazione",
|
||||
"complete_your_booking_subject": "Completa la prenotazione: {{title}} del {{date}}",
|
||||
"confirm_your_details": "Conferma i tuoi dati",
|
||||
"copy_invite_link": "Copia link d'invito",
|
||||
"edit_invite_link": "Modifica impostazioni link",
|
||||
"invite_link_copied": "Link d'invito copiato",
|
||||
"invite_link_deleted": "Link d'invito eliminato",
|
||||
"invite_link_updated": "Impostazioni link d'invito salvate",
|
||||
"link_expires_after": "La scadenza dei link è impostata dopo...",
|
||||
"one_day": "1 giorno",
|
||||
"seven_days": "7 giorni",
|
||||
"thirty_days": "30 giorni",
|
||||
"team_invite_received": "Hai ricevuto un invito a unirti al team {{teamName}}",
|
||||
"currency_string": "{{amount, currency}}",
|
||||
"charge_card_dialog_body": "Stai per addebitare {{amount, currency}} al partecipante. Continuare?",
|
||||
"charge_attendee": "Addebita {{amount, currency}} al partecipante",
|
||||
@@ -1765,6 +1802,7 @@
|
||||
"email_invite_team_bulk": "{{userCount}} utenti sono stati invitati",
|
||||
"error_collecting_card": "Errore durante la raccolta dei dati della carta",
|
||||
"image_size_limit_exceed": "Le dimensioni delle immagini caricate non devono superare il limite di 5 MB",
|
||||
"unauthorized_workflow_error_message": "{{errorCode}}: Non hai l'autorizzazione ad abilitare o disabilitare questo flusso di lavoro",
|
||||
"inline_embed": "Incorporamento inline",
|
||||
"load_inline_content": "Carica il tuo tipo di evento direttamente inline con altri contenuti del sito web.",
|
||||
"floating_pop_up_button": "Pulsante a comparsa mobile",
|
||||
@@ -1775,7 +1813,6 @@
|
||||
"book_my_cal": "Prenota il mio Cal",
|
||||
"invite_as": "Invita come",
|
||||
"form_updated_successfully": "Modulo aggiornato correttamente.",
|
||||
"email_not_cal_member_cta": "Unisciti al tuo team",
|
||||
"disable_attendees_confirmation_emails": "Disabilita le e-mail di conferma predefinite per i partecipanti",
|
||||
"disable_attendees_confirmation_emails_description": "Per questo tipo di evento è attivo almeno un flusso di lavoro che invia un'e-mail ai partecipanti quando l'evento viene prenotato.",
|
||||
"disable_host_confirmation_emails": "Disabilita le e-mail di conferma predefinite per gli organizzatori",
|
||||
@@ -1785,5 +1822,9 @@
|
||||
"connect_google_workspace": "Collega Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Per usare questa funzione è necessario essere un amministratore di Workspace",
|
||||
"first_event_type_webhook_description": "Crea il primo webhook per questo tipo di evento",
|
||||
"create_for": "Crea per"
|
||||
"create_for": "Crea per",
|
||||
"organization_url_taken": "URL già occupato",
|
||||
"additional_url_parameters": "Parametri URL aggiuntivi",
|
||||
"sender_id_info": "Nome o numero mostrato come mittente di un SMS (alcuni paesi non consentono ID alfanumerici dei mittenti)",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑↑ Aggiungi qui le tue nuove stringhe al di sopra di questa riga ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "新しいチームプランをお試しいただき、ありがとうございます。あなたのチーム「{{teamName}}」には、アップグレードが必要なようです。",
|
||||
"team_upgrade_banner_action": "アップグレードはこちら",
|
||||
"team_upgraded_successfully": "チームのアップグレードが正常に完了しました!",
|
||||
"org_upgrade_banner_action": "アップグレードはこちら",
|
||||
"use_link_to_reset_password": "以下のリンクを使用してパスワードをリセットしてください",
|
||||
"hey_there": "こんにちは!",
|
||||
"forgot_your_password_calcom": "パスワードをお忘れですか? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "完了",
|
||||
"all_done": "すべて完了!",
|
||||
"all_apps": "すべて",
|
||||
"all": "すべて",
|
||||
"available_apps": "利用可能なアプリ",
|
||||
"check_email_reset_password": "メールをご確認ください。パスワードをリセットするためのリンクを送信しました。",
|
||||
"finish": "完了",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "あなたのチームについての簡単な説明文です。あなたのチームの URL ページに表示されます。",
|
||||
"members": "メンバー",
|
||||
"member": "メンバー",
|
||||
"number_member_one": "{{count}} 人のメンバー",
|
||||
"number_member_other": "{{count}} 人のメンバー",
|
||||
"owner": "所有者",
|
||||
"admin": "管理者",
|
||||
"administrator_user": "管理者ユーザー",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "週の始まり",
|
||||
"recordings_title": "録音",
|
||||
"recording": "録音",
|
||||
"happy_scheduling": "スケジュール設定をお楽しみください",
|
||||
"select_calendars": "ダブルブッキングを防ぐために、スケジュールの重なりをチェックするカレンダーを選択してください。",
|
||||
"check_for_conflicts": "スケジュールの重なりをチェック",
|
||||
"view_recordings": "録音を表示",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "{{connectionType}} の構成を削除してもよろしいですか?{{connectionType}} でのログインを使用しているチームメンバーは、Cal.com にアクセスできなくなります。",
|
||||
"organizer_timezone": "主催者のタイムゾーン",
|
||||
"email_user_cta": "招待を表示",
|
||||
"email_no_user_invite_heading": "{{appName}} のチームに参加するよう招待されました",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} は {{appName}} のチームに参加するようあなたを招待しました。{{appName}} は、イベント調整スケジューラーです。チームと延々とメールのやりとりをすることなくミーティングのスケジュール設定を行うことができます。",
|
||||
"email_user_invite_subheading": "{{invitedBy}}から{{appName}}の「{{teamName}}」に参加するよう招待されました。{{appName}}はイベント調整スケジューラーで、チーム内で延々とメールのやりとりをすることなく、ミーティングのスケジュールを設定できます。",
|
||||
"email_no_user_invite_steps_intro": "いくつかの短い手順を踏むだけで、すぐにチームとの間のストレスフリーなスケジュール設定をお楽しみいただけます。",
|
||||
"email_no_user_step_one": "ユーザー名を選択",
|
||||
"email_no_user_step_two": "カレンダーアカウントを接続",
|
||||
"email_no_user_step_three": "空き状況を設定する",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "予約ページに表示",
|
||||
"get_started_zapier_templates": "Zapier テンプレートの使用を開始する",
|
||||
"team_is_unpublished": "{{team}} は公開されていません",
|
||||
"team_is_unpublished_description": "このチームのリンクは現在利用できません。チームの所有者に問い合わせるか、リンクを公開するように依頼してください。",
|
||||
"team_member": "チームメンバー",
|
||||
"a_routing_form": "ルーティングフォーム",
|
||||
"form_description_placeholder": "フォームの説明",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "どのイベントの種類が最もクリックされ、予約されているのかを確認します",
|
||||
"no_responses_yet": "回答はまだありません",
|
||||
"this_will_be_the_placeholder": "これがプレースホルダーになります",
|
||||
"error_booking_event": "イベントを予約する際にエラーが発生しました。ページを再読み込みして、もう一度お試しください",
|
||||
"timeslot_missing_title": "時間帯が選択されていません",
|
||||
"timeslot_missing_description": "イベントを予約するには時間帯を選んでください。",
|
||||
"timeslot_missing_cta": "時間帯を選ぶ",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Cal を予約",
|
||||
"invite_as": "次の役割で招待",
|
||||
"form_updated_successfully": "フォームは正常に更新されました。",
|
||||
"email_not_cal_member_cta": "チームに参加",
|
||||
"disable_attendees_confirmation_emails": "出席者へのデフォルトの確認メールを無効にする",
|
||||
"disable_attendees_confirmation_emails_description": "このイベントタイプでは少なくとも1つのワークフローがアクティブで、イベントが予約されると出席者にメールが送られます。",
|
||||
"disable_host_confirmation_emails": "ホストへのデフォルトの確認メールを無効にする",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Google Workspace を接続",
|
||||
"google_workspace_admin_tooltip": "この機能を使うには Workspace の管理者になる必要があります",
|
||||
"first_event_type_webhook_description": "このイベントタイプの最初のウェブフックを作成",
|
||||
"create_for": "作成対象"
|
||||
"create_for": "作成対象",
|
||||
"organization_url_taken": "この URL は既に使用されています"
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
"calcom_explained_new_user": "{{appName}} 계정 설정을 완료하세요! 몇 단계만 거치면 모든 일정 문제를 해결할 수 있습니다.",
|
||||
"have_any_questions": "질문이 있나요? 도와드릴게요.",
|
||||
"reset_password_subject": "{{appName}}: 비밀번호 재설정 방법",
|
||||
"email_sent": "이메일이 성공적으로 전송되었습니다",
|
||||
"event_declined_subject": "거절됨: {{date}} {{title}}",
|
||||
"event_cancelled_subject": "취소됨: {{date}} {{title}}",
|
||||
"event_request_declined": "회의 요청이 거절되었습니다.",
|
||||
@@ -119,6 +120,7 @@
|
||||
"team_upgrade_banner_description": "당사의 새로운 팀 플랜을 사용해 주셔서 감사합니다. 귀하의 \"{{teamName}}\" 팀에 업그레이드가 필요한 것으로 확인되었습니다.",
|
||||
"team_upgrade_banner_action": "여기서 업그레이드",
|
||||
"team_upgraded_successfully": "팀이 성공적으로 업그레이드되었습니다!",
|
||||
"org_upgrade_banner_action": "여기서 업그레이드",
|
||||
"use_link_to_reset_password": "비밀번호를 재설정하시려면 아래 링크를 사용하세요.",
|
||||
"hey_there": "안녕하세요.",
|
||||
"forgot_your_password_calcom": "비밀번호를 잊어버리셨나요? - {{appName}}",
|
||||
@@ -228,6 +230,7 @@
|
||||
"done": "완료",
|
||||
"all_done": "다 되었습니다!",
|
||||
"all_apps": "모두",
|
||||
"all": "모두",
|
||||
"available_apps": "사용 가능한 앱",
|
||||
"check_email_reset_password": "이메일을 확인하세요. 비밀번호 재설정을 위한 링크를 보냈습니다.",
|
||||
"finish": "끝",
|
||||
@@ -514,6 +517,8 @@
|
||||
"team_description": "팀 URL 페이지에 나타날 팀 소개를 해주세요.",
|
||||
"members": "회원",
|
||||
"member": "회원",
|
||||
"number_member_one": "회원 {{count}}명",
|
||||
"number_member_other": "회원 {{count}}명",
|
||||
"owner": "소유자",
|
||||
"admin": "관리",
|
||||
"administrator_user": "관리자 사용자",
|
||||
@@ -1183,7 +1188,6 @@
|
||||
"start_of_week": "주의 시작",
|
||||
"recordings_title": "녹음",
|
||||
"recording": "녹음",
|
||||
"happy_scheduling": "즐겁게 일정 관리하세요",
|
||||
"select_calendars": "중복 예약을 방지하기 위해 충돌을 확인하려는 캘린더를 선택합니다.",
|
||||
"check_for_conflicts": "충돌 확인",
|
||||
"view_recordings": "녹음 보기",
|
||||
@@ -1578,10 +1582,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "{{connectionType}} 구성을 삭제하시겠습니까? {{connectionType}} 로그인을 사용하는 팀원은 더 이상 Cal.com에 액세스할 수 없습니다.",
|
||||
"organizer_timezone": "주최자 시간대",
|
||||
"email_user_cta": "초대 보기",
|
||||
"email_no_user_invite_heading": "{{appName}} 팀에 초대되었습니다",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} 님이 귀하를 {{appName}}에서 자신의 팀에 초대했습니다. {{appName}} 앱은 귀하와 귀하의 팀이 이메일을 주고 받지 않고 회의 일정을 잡을 수 있게 해주는 이벤트 정리 스케줄러입니다.",
|
||||
"email_user_invite_subheading": "{{invitedBy}}님이 {{appName}}에서 자신의 `{{teamName}}` 팀에 가입하도록 당신을 초대했습니다. {{appName}}은 유저와 팀이 이메일을 주고 받지 않고도 회의 일정을 잡을 수 있게 하는 이벤트 조율 스케줄러입니다.",
|
||||
"email_no_user_invite_steps_intro": "안내해 드릴 몇 가지 간단한 단계만 거치면 곧 팀과 함께 스트레스 없이 편리하게 일정을 관리할 수 있게 될 것입니다.",
|
||||
"email_no_user_step_one": "사용자 이름 선택",
|
||||
"email_no_user_step_two": "캘린더 계정 연결",
|
||||
"email_no_user_step_three": "언제 여유가 있는지 설정하세요",
|
||||
@@ -1623,7 +1624,6 @@
|
||||
"show_on_booking_page": "예약 페이지에 표시",
|
||||
"get_started_zapier_templates": "Zapier 템플릿 시작하기",
|
||||
"team_is_unpublished": "{{team}} 팀은 게시되지 않았습니다",
|
||||
"team_is_unpublished_description": "이 팀 링크는 현재 사용할 수 없습니다. 팀 소유자에게 연락하거나 게시하라고 요청하십시오.",
|
||||
"team_member": "팀원",
|
||||
"a_routing_form": "라우팅 양식",
|
||||
"form_description_placeholder": "양식 설명",
|
||||
@@ -1654,7 +1654,6 @@
|
||||
"spot_popular_event_types_description": "어떤 이벤트 타입이 가장 많은 클릭과 예약을 받고 있는지 확인",
|
||||
"no_responses_yet": "아직 응답 없음",
|
||||
"this_will_be_the_placeholder": "이것은 자리 표시자가 됩니다",
|
||||
"error_booking_event": "이벤트를 예약하는 도중 오류가 발생했습니다. 페이지를 새로고침한 후 다시 시도해주세요.",
|
||||
"timeslot_missing_title": "시간대가 선택되지 않았습니다",
|
||||
"timeslot_missing_description": "이벤트를 예약 할 시간대를 선택해주세요.",
|
||||
"timeslot_missing_cta": "시간대 선택",
|
||||
@@ -1767,7 +1766,6 @@
|
||||
"book_my_cal": "내 Cal 예약",
|
||||
"invite_as": "다른 이름으로 초대",
|
||||
"form_updated_successfully": "양식이 성공적으로 업데이트되었습니다.",
|
||||
"email_not_cal_member_cta": "팀 합류",
|
||||
"disable_attendees_confirmation_emails": "참석자에 대한 기본 확인 이메일 비활성화",
|
||||
"disable_attendees_confirmation_emails_description": "이 이벤트 유형에는 이벤트가 예약되었을 때 참석자들에게 이메일을 보내는 최소한 하나의 워크플로가 활성화되어 있습니다.",
|
||||
"disable_host_confirmation_emails": "호스트에 대한 기본 확인 이메일 비활성화",
|
||||
@@ -1777,5 +1775,6 @@
|
||||
"connect_google_workspace": "Google Workspace 연결",
|
||||
"google_workspace_admin_tooltip": "이 기능을 사용하려면 Workspace 관리자여야 합니다",
|
||||
"first_event_type_webhook_description": "이 이벤트 유형에 대한 첫 번째 웹훅 만들기",
|
||||
"create_for": "작성 대상"
|
||||
"create_for": "작성 대상",
|
||||
"organization_url_taken": "이미 사용 중인 URL입니다"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Bedankt voor het testen van ons nieuwe teamabonnement. We hebben geconstateerd dat uw team \"{{teamName}}\" moet worden geüpgraded.",
|
||||
"team_upgrade_banner_action": "Hier upgraden",
|
||||
"team_upgraded_successfully": "Uw team is geüpgraded!",
|
||||
"org_upgrade_banner_action": "Hier upgraden",
|
||||
"use_link_to_reset_password": "Gebruik de onderstaande link om uw wachtwoord te resetten",
|
||||
"hey_there": "Hallo daar,",
|
||||
"forgot_your_password_calcom": "Wachtwoord vergeten? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Voltooid",
|
||||
"all_done": "Helemaal klaar!",
|
||||
"all_apps": "Alle apps",
|
||||
"all": "Alle apps",
|
||||
"available_apps": "Beschikbare apps",
|
||||
"check_email_reset_password": "Controleer uw e-mail. We hebben u een link gestuurd om uw wachtwoord opnieuw in te stellen.",
|
||||
"finish": "Voltooien",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Een paar zinnen over uw team. Dit is zichtbaar op uw teampagina.",
|
||||
"members": "Leden",
|
||||
"member": "Lid",
|
||||
"number_member_one": "{{count}} lid",
|
||||
"number_member_other": "{{count}} leden",
|
||||
"owner": "Eigenaar",
|
||||
"admin": "Beheerder",
|
||||
"administrator_user": "Beheerdersgebruiker",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Begin van de week",
|
||||
"recordings_title": "Opnames",
|
||||
"recording": "Opname",
|
||||
"happy_scheduling": "Veel plezier met plannen",
|
||||
"select_calendars": "Selecteer de agenda's die u wilt controleren op conflicten om dubbele boekingen te voorkomen.",
|
||||
"check_for_conflicts": "Controleer op conflicten",
|
||||
"view_recordings": "Opnames weergeven",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Weet u zeker dat u de {{connectionType}}-configuratie wilt verwijderen? Uw teamleden die {{connectionType}}-aanmelding gebruiken hebben niet langer toegang tot Cal.com.",
|
||||
"organizer_timezone": "Tijdzone organisator",
|
||||
"email_user_cta": "Uitnodiging weergeven",
|
||||
"email_no_user_invite_heading": "U bent uitgenodigd om lid te worden van een team op {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} heeft u uitgenodigd om lid te worden van zijn team op {{appName}}. {{appName}} is de gebeurtenissenplanner die u en uw team in staat stelt vergaderingen te plannen zonder heen en weer te e-mailen.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} heeft u uitgenodigd om lid te worden van zijn team '{{teamName}}' op {{appName}}. {{appName}} is de gebeurtenissenplanner die u en uw team in staat stelt afspraken te plannen zonder heen en weer te e-mailen.",
|
||||
"email_no_user_invite_steps_intro": "We doorlopen samen een paar korte stappen en in een mum van tijd kunt u genieten van een stressvrije planning met uw team.",
|
||||
"email_no_user_step_one": "Kies uw gebruikersnaam",
|
||||
"email_no_user_step_two": "Koppel uw agenda-account",
|
||||
"email_no_user_step_three": "Stel uw beschikbaarheid in",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Weergeven op boekingspagina",
|
||||
"get_started_zapier_templates": "Aan de slag met Zapier-sjablonen",
|
||||
"team_is_unpublished": "{{team}} is niet gepubliceerd",
|
||||
"team_is_unpublished_description": "Deze teamlink is momenteel niet beschikbaar. Neem contact op met de teameigenaar of vraag hem het te publiceren.",
|
||||
"team_member": "Teamlid",
|
||||
"a_routing_form": "Een routeringsformulier",
|
||||
"form_description_placeholder": "Formulierbeschrijving",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Bekijk welke van uw gebeurtenistypen de meeste kliks en boekingen ontvangen",
|
||||
"no_responses_yet": "Nog geen reacties",
|
||||
"this_will_be_the_placeholder": "Dit wordt de plaatshouder",
|
||||
"error_booking_event": "Er is een fout opgetreden bij het boeken van de gebeurtenis, vernieuw de pagina en probeer het opnieuw",
|
||||
"timeslot_missing_title": "Geen tijdslot geselecteerd",
|
||||
"timeslot_missing_description": "Selecteer een tijdslot om de gebeurtenis te boeken.",
|
||||
"timeslot_missing_cta": "Tijdslot selecteren",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Boek mijn Cal",
|
||||
"invite_as": "Uitnodigen als",
|
||||
"form_updated_successfully": "Formulier bijgewerkt.",
|
||||
"email_not_cal_member_cta": "Neem deel aan uw team",
|
||||
"disable_attendees_confirmation_emails": "Standaardbevestigings-e-mails voor deelnemers uitschakelen",
|
||||
"disable_attendees_confirmation_emails_description": "Er is minstens één werkstroom actief voor dit gebeurtenistype die een e-mail naar de deelnemers stuurt wanneer de gebeurtenis geboekt is.",
|
||||
"disable_host_confirmation_emails": "Standaardbevestigings-e-mails voor organisator uitschakelen",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Google Workspace koppelen",
|
||||
"google_workspace_admin_tooltip": "U moet een Google Workspace-beheerder zijn om deze functie te gebruiken",
|
||||
"first_event_type_webhook_description": "Maak uw eerste webhook voor dit gebeurtenistype",
|
||||
"create_for": "Maak voor"
|
||||
"create_for": "Maak voor",
|
||||
"organization_url_taken": "Deze URL is al in gebruik"
|
||||
}
|
||||
|
||||
@@ -109,6 +109,7 @@
|
||||
"team_upgrade_banner_description": "Takk for at du prøvde vår nye team-plan. Vi la merke til at teamet ditt \"{{teamName}}\" må oppgraderes.",
|
||||
"team_upgrade_banner_action": "Oppgrader her",
|
||||
"team_upgraded_successfully": "Teamet ditt ble oppgradert!",
|
||||
"org_upgrade_banner_action": "Oppgrader her",
|
||||
"use_link_to_reset_password": "Bruk lenken nedenfor for å tilbakestille passordet ditt",
|
||||
"hey_there": "Hei der,",
|
||||
"forgot_your_password_calcom": "Glemt passordet? - {{appName}}",
|
||||
@@ -217,6 +218,7 @@
|
||||
"done": "Ferdig",
|
||||
"all_done": "Alt klart!",
|
||||
"all_apps": "Alt",
|
||||
"all": "Alt",
|
||||
"check_email_reset_password": "Sjekk e-posten din. Vi har sendt deg en lenke for å tilbakestille passordet ditt.",
|
||||
"finish": "Fullfør",
|
||||
"few_sentences_about_yourself": "Noen setninger om deg selv. Dette vil vises på din personlige url-side.",
|
||||
@@ -1405,5 +1407,6 @@
|
||||
"install_google_calendar": "Installer Google Kalender",
|
||||
"configure": "Konfigurer",
|
||||
"sso_configuration": "Enkel Pålogging",
|
||||
"booking_confirmation_failed": "Booking-bekreftelse feilet"
|
||||
"booking_confirmation_failed": "Booking-bekreftelse feilet",
|
||||
"organization_url_taken": "Denne URL'en er allerede tatt"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Dziękujemy za wypróbowanie naszego nowego planu zespołowego. Zauważyliśmy, że Twój zespół „{{teamName}}” trzeba ulepszyć.",
|
||||
"team_upgrade_banner_action": "Ulepsz tutaj",
|
||||
"team_upgraded_successfully": "Twój zespół został pomyślnie zaktualizowany!",
|
||||
"org_upgrade_banner_action": "Ulepsz tutaj",
|
||||
"use_link_to_reset_password": "Użyj poniższego linku, aby zresetować swoje hasło",
|
||||
"hey_there": "Cześć,",
|
||||
"forgot_your_password_calcom": "Nie pamiętasz swojego hasła? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Gotowe",
|
||||
"all_done": "Wszystko gotowe!",
|
||||
"all_apps": "Wszystkie",
|
||||
"all": "Wszystkie",
|
||||
"available_apps": "Dostępne aplikacje",
|
||||
"check_email_reset_password": "Sprawdź swój e-mail. Wysłaliśmy Ci link do zresetowania hasła.",
|
||||
"finish": "Ukończ",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Kilka zdań na temat Twojego zespołu. Będą wyświetlane na stronie adresu URL Twojego zespołu.",
|
||||
"members": "Członkowie",
|
||||
"member": "Członek",
|
||||
"number_member_one": "{{count}} członek",
|
||||
"number_member_other": "{{count}} członków",
|
||||
"owner": "Właściciel",
|
||||
"admin": "Administrator",
|
||||
"administrator_user": "Użytkownik-administrator",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Początek tygodnia",
|
||||
"recordings_title": "Nagrania",
|
||||
"recording": "Nagranie",
|
||||
"happy_scheduling": "Miłego planowania",
|
||||
"select_calendars": "Wybierz kalendarze, które chcesz sprawdzić pod kątem konfliktów, aby uniknąć podwójnych rezerwacji.",
|
||||
"check_for_conflicts": "Sprawdź konflikty",
|
||||
"view_recordings": "Wyświetl nagrania",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Czy na pewno chcesz usunąć konfigurację {{connectionType}}? Członkowie zespołu, którzy używają logowania {{connectionType}} nie będą już mogli uzyskać dostępu do Cal.com.",
|
||||
"organizer_timezone": "Strefa czasowa organizatora",
|
||||
"email_user_cta": "Wyświetl zaproszenie",
|
||||
"email_no_user_invite_heading": "Zaproszono Cię do dołączenia do zespołu w aplikacji {{appName}}",
|
||||
"email_no_user_invite_subheading": "Użytkownik {{invitedBy}} zaprasza Cię do dołączenia do jego zespołu w aplikacji {{appName}}. Aplikacja {{appName}} to terminarz do planowania wydarzeń, który umożliwi Tobie i Twojemu zespołowi planowanie spotkań bez czasochłonnej wymiany wiadomości e-mail.",
|
||||
"email_user_invite_subheading": "Użytkownik {{invitedBy}} zaprasza Cię do dołączenia do jego zespołu „{{teamName}}” w aplikacji {{appName}}. Aplikacja {{appName}} to terminarz do planowania wydarzeń, który umożliwi Tobie i Twojemu zespołowi planowanie spotkań bez czasochłonnej wymiany wiadomości e-mail.",
|
||||
"email_no_user_invite_steps_intro": "Przeprowadzimy Cię przez kilka krótkich etapów i wkrótce zaczniesz z przyjemnością korzystać z bezstresowego narzędzia planowania.",
|
||||
"email_no_user_step_one": "Wybierz nazwę użytkownika",
|
||||
"email_no_user_step_two": "Połącz swoje konto kalendarza",
|
||||
"email_no_user_step_three": "Ustaw swoją dostępność",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Pokaż na stronie rezerwacji",
|
||||
"get_started_zapier_templates": "Zacznij korzystać z szablonów Zapier",
|
||||
"team_is_unpublished": "Zespół {{team}} nie został opublikowany",
|
||||
"team_is_unpublished_description": "Link tego zespołu jest obecnie niedostępny. Skontaktuj się z właścicielem zespołu lub poproś o jego opublikowanie.",
|
||||
"team_member": "Członek zespołu",
|
||||
"a_routing_form": "Formularz przekierowania",
|
||||
"form_description_placeholder": "Opis formularza",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Zobacz, które typy wydarzeń są najczęściej klikane i rezerwowane",
|
||||
"no_responses_yet": "Nie ma jeszcze odpowiedzi",
|
||||
"this_will_be_the_placeholder": "To będzie symbol zastępczy",
|
||||
"error_booking_event": "Podczas rezerwacji wydarzenia wystąpił błąd, odśwież stronę i spróbuj ponownie.",
|
||||
"timeslot_missing_title": "Nie wybrano przedziału czasowego",
|
||||
"timeslot_missing_description": "Wybierz przedział czasowy, aby zarezerwować wydarzenie.",
|
||||
"timeslot_missing_cta": "Wybierz przedział czasowy",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Zarezerwuj w moim kalendarzu",
|
||||
"invite_as": "Zaproś jako",
|
||||
"form_updated_successfully": "Formularz zaktualizowany pomyślnie.",
|
||||
"email_not_cal_member_cta": "Dołącz do zespołu",
|
||||
"disable_attendees_confirmation_emails": "Wyłącz domyślne wiadomości e-mail z potwierdzeniem dla uczestników",
|
||||
"disable_attendees_confirmation_emails_description": "W tym typie wydarzenia aktywny jest co najmniej jeden przepływ pracy, który wysyła wiadomość e-mail do uczestników, gdy wydarzenie zostanie zarezerwowane.",
|
||||
"disable_host_confirmation_emails": "Wyłącz domyślne wiadomości e-mail z potwierdzeniem dla gospodarza",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Połącz usługę Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Aby skorzystać z tej funkcji, musisz być administratorem usługi Workspace.",
|
||||
"first_event_type_webhook_description": "Utwórz swój pierwszy element webhook dla tego typu wydarzenia",
|
||||
"create_for": "Utwórz dla"
|
||||
"create_for": "Utwórz dla",
|
||||
"organization_url_taken": "Ten adres URL jest już zajęty"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Agradecemos por testar nosso novo plano de equipe. Notamos que a sua equipe \"{{teamName}}\" precisa ser atualizada.",
|
||||
"team_upgrade_banner_action": "Atualizar aqui",
|
||||
"team_upgraded_successfully": "Sua equipe foi atualizada com êxito!",
|
||||
"org_upgrade_banner_action": "Atualizar aqui",
|
||||
"use_link_to_reset_password": "Use o link abaixo para redefinir a sua senha",
|
||||
"hey_there": "Olá,",
|
||||
"forgot_your_password_calcom": "Esqueceu sua senha? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Concluído",
|
||||
"all_done": "Tudo pronto!",
|
||||
"all_apps": "Todos os apps",
|
||||
"all": "Todos os apps",
|
||||
"available_apps": "Aplicativos disponíveis",
|
||||
"check_email_reset_password": "Verifique o seu email. Enviamos um link para redefinir a sua senha.",
|
||||
"finish": "Finalizar",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Fale um pouco sobre seu time. Isso aparecerá na página pública do seu time.",
|
||||
"members": "Membros",
|
||||
"member": "Membro",
|
||||
"number_member_one": "{{count}} membro",
|
||||
"number_member_other": "{{count}} membros",
|
||||
"owner": "Proprietário",
|
||||
"admin": "Admin",
|
||||
"administrator_user": "Usuário administrador",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Início da semana",
|
||||
"recordings_title": "Gravações",
|
||||
"recording": "Gravação",
|
||||
"happy_scheduling": "Bom agendamento",
|
||||
"select_calendars": "Selecionar em quais calendários você deseja verificar se há conflitos para evitar dupla reserva.",
|
||||
"check_for_conflicts": "Verificar se há conflitos",
|
||||
"view_recordings": "Ver gravações",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Você tem certeza que deseja remover a configuração de {{connectionType}}? Os membros do seu time que utilizam {{connectionType}} para fazer login não conseguirão acessar o Cal.com.",
|
||||
"organizer_timezone": "Fuso horário do organizador",
|
||||
"email_user_cta": "Ver convite",
|
||||
"email_no_user_invite_heading": "Você precisa ter recebido um convite para ingressar em uma equipe de {{appName}}",
|
||||
"email_no_user_invite_subheading": "Você recebeu um convite de {{invitedBy}} para ingressar em sua equipe em {{appName}}. {{appName}} é um agendador que concilia eventos e permite que sua equipe agende reuniões sem precisar trocar e-mails.",
|
||||
"email_user_invite_subheading": "Você recebeu um convite de {{invitedBy}} para ingressar na equipe \"{{teamName}}\" em {{appName}}. {{appName}} é um agendador que concilia eventos e permite que sua equipe agende reuniões sem precisar trocar e-mails.",
|
||||
"email_no_user_invite_steps_intro": "Orientaremos ao longo de alguns passos rápidos para que você comece logo a agendar eventos com sua equipe sem preocupação.",
|
||||
"email_no_user_step_one": "Escolha seu nome de usuário",
|
||||
"email_no_user_step_two": "Conecte com sua conta de calendário",
|
||||
"email_no_user_step_three": "Defina sua disponibilidade",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Mostrar na página de reservas",
|
||||
"get_started_zapier_templates": "Comece agora com modelos do Zapier",
|
||||
"team_is_unpublished": "Publicação de {{team}} cancelada",
|
||||
"team_is_unpublished_description": "Este link de equipe não está disponível por enquanto. Fale com o proprietário da equipe ou peça que seja publicado.",
|
||||
"team_member": "Membro da equipe",
|
||||
"a_routing_form": "Formulário de roteamento",
|
||||
"form_description_placeholder": "Descrição do formulário",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Veja quais tipos de eventos estão recebendo a maioria dos cliques e reservas",
|
||||
"no_responses_yet": "Sem respostas por enquanto",
|
||||
"this_will_be_the_placeholder": "Este será o espaço reservado",
|
||||
"error_booking_event": "Ocorreu um erro ao reservar o evento, atualize a página e tente novamente",
|
||||
"timeslot_missing_title": "Nenhuma alocação de tempo selecionada",
|
||||
"timeslot_missing_description": "Selecione uma alocação de tempo para reservar o evento.",
|
||||
"timeslot_missing_cta": "Selecione a alocação de tempo",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Reservar meu Cal",
|
||||
"invite_as": "Convidar como",
|
||||
"form_updated_successfully": "Formulário atualizado com êxito.",
|
||||
"email_not_cal_member_cta": "Ingresse na sua equipe",
|
||||
"disable_attendees_confirmation_emails": "Desative os e-mails de confirmação padrão para participantes",
|
||||
"disable_attendees_confirmation_emails_description": "Pelo menos um fluxo de trabalho está ativo neste tipo de evento, que envia um e-mail aos participantes quando o evento for reservado.",
|
||||
"disable_host_confirmation_emails": "Desative e-mails de confirmação padrão para hosts",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Conectar com o Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Você deve ser administrador do Google Workspace para usar este recurso",
|
||||
"first_event_type_webhook_description": "Crie seu primeiro webhook para este tipo de evento",
|
||||
"create_for": "Criar para"
|
||||
"create_for": "Criar para",
|
||||
"organization_url_taken": "Este URL já está em uso"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Obrigado por experimentar o nosso novo plano de equipa. Verificámos que a sua equipa \"{{teamName}}\" necessita de ser atualizada.",
|
||||
"team_upgrade_banner_action": "Atualize aqui",
|
||||
"team_upgraded_successfully": "A sua equipa foi actualizada com sucesso!",
|
||||
"org_upgrade_banner_action": "Atualize aqui",
|
||||
"use_link_to_reset_password": "Use a ligação abaixo para redefinir a sua senha",
|
||||
"hey_there": "Olá,",
|
||||
"forgot_your_password_calcom": "Esqueceu-se da sua senha? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Concluído",
|
||||
"all_done": "Tudo pronto!",
|
||||
"all_apps": "Todos as aplicações",
|
||||
"all": "Todos as aplicações",
|
||||
"available_apps": "Aplicações disponíveis",
|
||||
"check_email_reset_password": "Verifique o seu email. Enviámos uma ligação para redefinir a sua senha.",
|
||||
"finish": "Terminar",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Algumas frases sobre a sua equipa. Isso aparecerá na página url da sua equipa.",
|
||||
"members": "Membros",
|
||||
"member": "Membro",
|
||||
"number_member_one": "{{count}} membro",
|
||||
"number_member_other": "{{count}} membros",
|
||||
"owner": "Proprietário",
|
||||
"admin": "Administrador",
|
||||
"administrator_user": "Administrador",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Início da semana",
|
||||
"recordings_title": "Gravações",
|
||||
"recording": "Gravação",
|
||||
"happy_scheduling": "Votos de bons agendamentos",
|
||||
"select_calendars": "Selecione os calendários nos quais pretende procurar por conflitos para evitar sobreposição de reservas.",
|
||||
"check_for_conflicts": "Verificar se existem conflitos",
|
||||
"view_recordings": "Ver gravações",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Tem a certeza que pretende eliminar a configuração {{connectionType}}? Os membros da sua equipa que utilizem {{connectionType}} para o início de sessão deixarão de poder aceder a Cal.com.",
|
||||
"organizer_timezone": "Fuso horário do organizador",
|
||||
"email_user_cta": "Ver convite",
|
||||
"email_no_user_invite_heading": "Recebeu um convite para fazer parte de uma equipa em {{appName}}",
|
||||
"email_no_user_invite_subheading": "Recebeu um convite de {{invitedBy}} para fazer parte da respetiva equipa em {{appName}}. {{appName}} é um ferramenta de conciliação e agendamento de eventos que lhe permite a si e à sua equipa agendar reuniões sem o pingue-pongue de e-mails.",
|
||||
"email_user_invite_subheading": "Recebeu um convite de {{invitedBy}} para fazer parte da equipa `{{teamName}}` em {{appName}}. {{appName}} é uma ferramenta de conciliação e agendamento de eventos que lhe permite a si e à sua equipa agendar reuniões sem o pingue-pongue de mensagens eletrónicas.",
|
||||
"email_no_user_invite_steps_intro": "Vamos ajudar com alguns pequenos passos para que você e a sua equipa possam desfrutar rapidamente de uma gestão de agendamentos sem complicações.",
|
||||
"email_no_user_step_one": "Escolha o seu nome de utilizador",
|
||||
"email_no_user_step_two": "Associe a sua conta de calendário",
|
||||
"email_no_user_step_three": "Defina a sua Disponibilidade",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Mostrar na página de reservas",
|
||||
"get_started_zapier_templates": "Comece a utilizar os modelos Zapier",
|
||||
"team_is_unpublished": "A equipa {{team}} ainda não está publicada",
|
||||
"team_is_unpublished_description": "Esta ligação de equipa não está disponível neste momento. Por favor, entre em contacto com o responsável pela equipa ou solicite-lhe a respetiva publicação.",
|
||||
"team_member": "Membro da equipa",
|
||||
"a_routing_form": "Um formulário de encaminhamento",
|
||||
"form_description_placeholder": "Descrição do formulário",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Veja quais os tipos de eventos que estão a receber mais cliques e reservas",
|
||||
"no_responses_yet": "Ainda sem respostas",
|
||||
"this_will_be_the_placeholder": "Isto será o marcador de posição",
|
||||
"error_booking_event": "Ocorreu um erro ao reservar o evento. Atualize a página e tente novamente",
|
||||
"timeslot_missing_title": "Nenhuma janela horária selecionada",
|
||||
"timeslot_missing_description": "Selecione uma janela horária para reservar o evento.",
|
||||
"timeslot_missing_cta": "Selecionar janela horária",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Reservar o meu Cal",
|
||||
"invite_as": "Convidar como",
|
||||
"form_updated_successfully": "Formulário atualizado com sucesso.",
|
||||
"email_not_cal_member_cta": "Inscreva a sua equipa",
|
||||
"disable_attendees_confirmation_emails": "Desativar mensagens eletrónicas de confirmação predefinidas para participantes",
|
||||
"disable_attendees_confirmation_emails_description": "Está ativo pelo menos um fluxo de trabalho neste tipo de evento que envia um e-mail para os participantes quando o evento é reservado.",
|
||||
"disable_host_confirmation_emails": "Desativar mensagens eletrónicas de confirmação predefinidas para o anfitrião",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Associar o Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Deve ser um Administrador do Workspace para utilizar esta funcionalidade",
|
||||
"first_event_type_webhook_description": "Crie o seu primeiro webhook para este tipo de evento",
|
||||
"create_for": "Criar para"
|
||||
"create_for": "Criar para",
|
||||
"organization_url_taken": "Este endereço já está a ser utilizado"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Vă mulțumim că ați încercat noul nostru plan pentru echipe. Am observat că planul echipei dvs. „{{teamName}}” necesită un upgrade.",
|
||||
"team_upgrade_banner_action": "Realizați upgrade aici",
|
||||
"team_upgraded_successfully": "Echipa dvs. a fost actualizată cu succes!",
|
||||
"org_upgrade_banner_action": "Realizați upgrade aici",
|
||||
"use_link_to_reset_password": "Utilizați linkul de mai jos pentru a vă reseta parola",
|
||||
"hey_there": "Bună,",
|
||||
"forgot_your_password_calcom": "Ți-ai uitat parola? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Adoptat",
|
||||
"all_done": "Gata!",
|
||||
"all_apps": "Toate aplicațiile",
|
||||
"all": "Toate aplicațiile",
|
||||
"available_apps": "Aplicații disponibile",
|
||||
"check_email_reset_password": "Verificați adresa de e-mail. V-am trimis un link pentru resetarea parolei.",
|
||||
"finish": "Finalizeaza",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Câteva propoziții despre echipa dvs. Aceste informații vor apărea pe pagina de URL a echipei dvs.",
|
||||
"members": "Membri",
|
||||
"member": "Membru",
|
||||
"number_member_one": "{{count}} membru",
|
||||
"number_member_other": "{{count}} (de) membri",
|
||||
"owner": "Proprietar",
|
||||
"admin": "Admin",
|
||||
"administrator_user": "Utilizator administrator",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Începutul săptămânii",
|
||||
"recordings_title": "Înregistrări",
|
||||
"recording": "Înregistrare",
|
||||
"happy_scheduling": "Programări cu spor",
|
||||
"select_calendars": "Selectați pe ce calendare vreți să verificați dacă există conflicte pentru a preveni rezervările suprapuse.",
|
||||
"check_for_conflicts": "Verifică dacă există conflicte",
|
||||
"view_recordings": "Vezi înregistrările",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Sigur doriți să ștergeți configurația {{connectionType}}? Membrii echipei dvs. care utilizează conectarea prin {{connectionType}} nu vor mai putea accesa Cal.com.",
|
||||
"organizer_timezone": "Fusul orar al organizatorului",
|
||||
"email_user_cta": "Vizualizare invitație",
|
||||
"email_no_user_invite_heading": "Ați fost invitat să faceți parte dintr-o echipă de pe {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} v-a invitat să faceți parte din echipa sa de pe {{appName}}. {{appName}} este un instrument de planificare a evenimentelor, care vă permite dvs. și echipei dvs. să programați ședințe fără a face ping-pong prin e-mail.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} v-a invitat să faceți parte din echipa sa „{{teamName}}” de pe {{appName}}. {{appName}} este un instrument de planificare a evenimentelor, care vă permite dvs. și echipei dvs. să programați ședințe fără a face ping-pong prin e-mail.",
|
||||
"email_no_user_invite_steps_intro": "Vom parcurge împreună câțiva pași simpli și vă veți bucura alături de echipa dvs. de programări fără probleme, în cel mai scurt timp.",
|
||||
"email_no_user_step_one": "Alegeți-vă numele de utilizator",
|
||||
"email_no_user_step_two": "Conectați-vă contul de calendar",
|
||||
"email_no_user_step_three": "Setați-vă disponibilitatea",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Afișare pe pagina de rezervare",
|
||||
"get_started_zapier_templates": "Faceți primii pași cu șabloanele Zapier",
|
||||
"team_is_unpublished": "Echipa {{team}} nu este publicată",
|
||||
"team_is_unpublished_description": "Acest link de echipă nu este disponibil momentan. Contactați proprietarul echipei sau rugați-l să îl publice.",
|
||||
"team_member": "Membru al echipei",
|
||||
"a_routing_form": "Un formular de parcurs",
|
||||
"form_description_placeholder": "Descriere formular",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Vedeți care dintre tipurile de evenimente primesc cele mai multe clicuri și rezervări",
|
||||
"no_responses_yet": "Nu există încă răspunsuri",
|
||||
"this_will_be_the_placeholder": "Acesta va fi substituentul",
|
||||
"error_booking_event": "A survenit o eroare la rezervarea evenimentului. Reîmprospătați pagina și încercați din nou",
|
||||
"timeslot_missing_title": "Nu există niciun interval de timp selectat",
|
||||
"timeslot_missing_description": "Selectați un interval de timp pentru a rezerva evenimentul.",
|
||||
"timeslot_missing_cta": "Selectare interval de timp",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Faceți o rezervare în Cal",
|
||||
"invite_as": "Invitare ca",
|
||||
"form_updated_successfully": "Formular actualizat cu succes.",
|
||||
"email_not_cal_member_cta": "Alăturați-vă echipei dvs.",
|
||||
"disable_attendees_confirmation_emails": "Dezactivare e-mailuri de confirmare implicite pentru participanți",
|
||||
"disable_attendees_confirmation_emails_description": "Există cel puțin un flux de lucru activ pentru acest tip de eveniment care trimite un e-mail către participanți la rezervarea evenimentului.",
|
||||
"disable_host_confirmation_emails": "Dezactivare e-mailuri de confirmare implicite pentru gazdă",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Conectare la Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Trebuie să fiți administrator Google Workspace pentru a putea utiliza această funcție",
|
||||
"first_event_type_webhook_description": "Creați primul dvs. webhook pentru acest tip de eveniment",
|
||||
"create_for": "Creare pentru"
|
||||
"create_for": "Creare pentru",
|
||||
"organization_url_taken": "Acest URL este folosit deja"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Спасибо, что попробовали наш новый тариф Team. Для работы с командой «{{teamName}}» необходимо изменить тариф.",
|
||||
"team_upgrade_banner_action": "Изменить",
|
||||
"team_upgraded_successfully": "Вы успешно перешли на новый тариф для своей команды!",
|
||||
"org_upgrade_banner_action": "Изменить",
|
||||
"use_link_to_reset_password": "Используйте ссылку ниже, чтобы сбросить пароль",
|
||||
"hey_there": "Привет,",
|
||||
"forgot_your_password_calcom": "Забыли пароль? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Готово",
|
||||
"all_done": "Готово!",
|
||||
"all_apps": "Все приложения",
|
||||
"all": "Все приложения",
|
||||
"available_apps": "Доступные приложения",
|
||||
"check_email_reset_password": "Проверьте вашу электронную почту, мы отправили вам ссылку для сброса пароля.",
|
||||
"finish": "Завершить",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Краткое описание вашей команды. Этот текст будет показываться на странице вашей команды.",
|
||||
"members": "Участники",
|
||||
"member": "Участник",
|
||||
"number_member_one": "Участники: {{count}}",
|
||||
"number_member_other": "Участники: {{count}}",
|
||||
"owner": "Владелец",
|
||||
"admin": "Админ",
|
||||
"administrator_user": "Администратор",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Начало недели",
|
||||
"recordings_title": "Записи",
|
||||
"recording": "Запись",
|
||||
"happy_scheduling": "Счастливого планирования",
|
||||
"select_calendars": "Выберите, в каких календарях нужно проверить наличие конфликтов и дублированного бронирования.",
|
||||
"check_for_conflicts": "Проверить наличие конфликтов",
|
||||
"view_recordings": "Просмотреть записи",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Удалить конфигурацию {{connectionType}}? Участники команды, входящие в Cal.com через {{connectionType}}, больше не смогут получить к нему доступ.",
|
||||
"organizer_timezone": "Часовой пояс организатора",
|
||||
"email_user_cta": "Посмотреть приглашение",
|
||||
"email_no_user_invite_heading": "Вас пригласили в команду {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} пригласил(-а) вас в команду в {{appName}}. {{appName}} — это гибкий планировщик событий, с помощью которого пользователи и целые команды могут планировать встречи без утомительной переписки по электронной почте.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} пригласил(а) вас в команду в `{{teamName}}` в приложении {{appName}}. {{appName}} — это гибкий планировщик событий, с помощью которого пользователи и целые команды могут планировать встречи без утомительной переписки по электронной почте.",
|
||||
"email_no_user_invite_steps_intro": "Всего несколько шагов — и вы сможете оперативно и без стресса планировать встречи с командой.",
|
||||
"email_no_user_step_one": "Выберите имя пользователя",
|
||||
"email_no_user_step_two": "Подключите аккаунт календаря",
|
||||
"email_no_user_step_three": "Задайте время, в которое вы доступны",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Показывать на странице бронирования",
|
||||
"get_started_zapier_templates": "Начать работу с шаблонами Zapier",
|
||||
"team_is_unpublished": "Команда {{team}} снята с публикации",
|
||||
"team_is_unpublished_description": "Ссылка на команду в настоящее время недоступна. Свяжитесь с владельцем команды и попросите его опубликовать ее.",
|
||||
"team_member": "Участник команды",
|
||||
"a_routing_form": "Форма маршрутизации",
|
||||
"form_description_placeholder": "Описание формы",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Узнайте, какие типы событий собирают больше всего кликов и бронирований",
|
||||
"no_responses_yet": "Ответов пока нет",
|
||||
"this_will_be_the_placeholder": "Это текст-заполнитель",
|
||||
"error_booking_event": "При бронировании события произошла ошибка. Обновите страницу и повторите попытку",
|
||||
"timeslot_missing_title": "Не выбран интервал времени",
|
||||
"timeslot_missing_description": "Чтобы забронировать событие, выберите интервал времени.",
|
||||
"timeslot_missing_cta": "Выбрать интервал времени",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Забронировать в Cal",
|
||||
"invite_as": "Пригласить как",
|
||||
"form_updated_successfully": "Форма успешно обновлена.",
|
||||
"email_not_cal_member_cta": "Присоединиться к команде",
|
||||
"disable_attendees_confirmation_emails": "Отключить для участников подтверждение по электронной почте по умолчанию",
|
||||
"disable_attendees_confirmation_emails_description": "В этом типе события активен по крайней мере один рабочий процесс, который при бронировании события отправляет участникам сообщение по электронной почте.",
|
||||
"disable_host_confirmation_emails": "Отключить для организатора подтверждение по электронной почте по умолчанию",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Подключить Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Эту функцию может использовать только администратор Workspace",
|
||||
"first_event_type_webhook_description": "Создайте первый вебхук для этого типа событий",
|
||||
"create_for": "Создать для"
|
||||
"create_for": "Создать для",
|
||||
"organization_url_taken": "Этот URL-адрес уже занят"
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"verify_email_email_header": "Potvrdite svoju imejl adresu",
|
||||
"verify_email_email_button": "Potvrdi imejl",
|
||||
"verify_email_email_body": "Potvrdite svoju imejl adresu klikom na dugme ispod.",
|
||||
"verify_email_email_link_text": "U slučaju da ne volite da klikćete na dugmad, evo linka:",
|
||||
"email_sent": "Imejl je uspešno poslat",
|
||||
"event_declined_subject": "Odbijeno: {{title}} datuma {{date}}",
|
||||
"event_cancelled_subject": "Otkazano: {{title}} datuma {{date}}",
|
||||
@@ -128,6 +127,7 @@
|
||||
"team_upgrade_banner_description": "Hvala vam što isprobavate naš novi plan za timove. Primetili smo da vaš tim „{{teamName}}“ treba da se nadogradi.",
|
||||
"team_upgrade_banner_action": "Nadogradite ovde",
|
||||
"team_upgraded_successfully": "Vaš tim je uspešno pretplaćen!",
|
||||
"org_upgrade_banner_action": "Nadogradite ovde",
|
||||
"use_link_to_reset_password": "Resetujte lozinku koristeći link ispod",
|
||||
"hey_there": "Zdravo,",
|
||||
"forgot_your_password_calcom": "Zaboravili ste lozinku? - {{appName}}",
|
||||
@@ -238,6 +238,7 @@
|
||||
"done": "Urađeno",
|
||||
"all_done": "Završeno!",
|
||||
"all_apps": "Sve aplikacije",
|
||||
"all": "Sve aplikacije",
|
||||
"available_apps": "Dostupne aplikacije",
|
||||
"check_email_reset_password": "Proverite vašu e-poštu. Poslali smo vam link za resetovanje lozinke.",
|
||||
"finish": "Završi",
|
||||
@@ -300,6 +301,7 @@
|
||||
"failed": "Neuspešno",
|
||||
"password_has_been_reset_login": "Vaša lozinka je resetovana. Sada možete da se ulogujete sa vašom novom lozinkom.",
|
||||
"bookerlayout_title": "Raspored",
|
||||
"layout": "Raspored",
|
||||
"bookerlayout_default_title": "Podrazumevani prikaz",
|
||||
"bookerlayout_description": "Možete da izaberete više njih, a vaši polaznici mogu da menjaju prikaze.",
|
||||
"bookerlayout_user_settings_title": "Raspored zakazivanja",
|
||||
@@ -539,6 +541,8 @@
|
||||
"team_description": "Par rečenica o vašem timu. Ovo će se pojaviti na stranici URL adrese vašeg tima.",
|
||||
"members": "Članovi",
|
||||
"member": "Član",
|
||||
"number_member_one": "{{count}} član",
|
||||
"number_member_other": "{{count}} članova",
|
||||
"owner": "Vlasnik",
|
||||
"admin": "Admin",
|
||||
"administrator_user": "Administrator",
|
||||
@@ -1209,7 +1213,6 @@
|
||||
"start_of_week": "Početak nedelje",
|
||||
"recordings_title": "Snimci",
|
||||
"recording": "Snimanje",
|
||||
"happy_scheduling": "Srećno planiranje",
|
||||
"select_calendars": "Izaberite kalendare koje želite da proverite da li imaju konflikta da biste sprečili dvostruka zakazivanja.",
|
||||
"check_for_conflicts": "Proverite konflikte",
|
||||
"view_recordings": "Pregledaj snimke",
|
||||
@@ -1609,10 +1612,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Da li ste sigurni da želite da izbrišete {{connectionType}} konfiguraciju? Članovi vašeg tima koji koriste {{connectionType}} prijavljivanje više neće moći da pristupe Cal.com-u.",
|
||||
"organizer_timezone": "Vremenska zona organizatora",
|
||||
"email_user_cta": "Prikaži pozivnicu",
|
||||
"email_no_user_invite_heading": "Pozvani ste da se pridružite timu u {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} vas je pozvao/la da se pridružite njihovom timu u {{appName}}. {{appName}} je planer za koordinaciju događaja koji omogućava vama i vašem timu da zakazujete sastanke bez dopisivanja imejlovima.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} vas je pozvao/la da se pridružite njihovom timu `{{teamName}}` u {{appName}}. {{appName}} je planer za koordinaciju događaja koji omogućava vama i vašem timu da zakazujete sastanke bez dopisivanja imejlovima.",
|
||||
"email_no_user_invite_steps_intro": "Provešćemo vas kroz nekoliko kratkih koraka, i za tren oka ćete uživati u zakazivanju bez stresa sa svojim timom.",
|
||||
"email_no_user_step_one": "Izaberite korisničko ime",
|
||||
"email_no_user_step_two": "Povežite se sa nalogom kalendara",
|
||||
"email_no_user_step_three": "Podesite svoju dostupnost",
|
||||
@@ -1655,7 +1655,6 @@
|
||||
"show_on_booking_page": "Prikaži na stranici zakazivanja",
|
||||
"get_started_zapier_templates": "Započnite sa Zapier predlošcima",
|
||||
"team_is_unpublished": "Opozvano je objavljivanje tima {{team}}",
|
||||
"team_is_unpublished_description": "Ova veza tima više nije dostupna. Obratite se vlasniku tima ili ga zamolite da je objave.",
|
||||
"team_member": "Član tima",
|
||||
"a_routing_form": "Obrazac za usmeravanje",
|
||||
"form_description_placeholder": "Opis formulara",
|
||||
@@ -1687,7 +1686,6 @@
|
||||
"no_responses_yet": "Još uvek nema odgovora",
|
||||
"no_routes_defined": "Nema definisanih ruta",
|
||||
"this_will_be_the_placeholder": "Ovo će biti čuvar mesta",
|
||||
"error_booking_event": "Došlo je do greške prilikom zakazivanja događaja, osvežite stranicu i pokušajte ponovo",
|
||||
"timeslot_missing_title": "Nisu izabrani termini",
|
||||
"timeslot_missing_description": "Izaberite termin da biste zakazali događaj.",
|
||||
"timeslot_missing_cta": "Izaberite termin",
|
||||
@@ -1811,7 +1809,6 @@
|
||||
"book_my_cal": "Zakaži moj Cal",
|
||||
"invite_as": "Pozovi kao",
|
||||
"form_updated_successfully": "Formular je uspešno ažuriran.",
|
||||
"email_not_cal_member_cta": "Pridružite se našem timu",
|
||||
"disable_attendees_confirmation_emails": "Onemogući podrazumevane imejlove za potvrdu za polaznike",
|
||||
"disable_attendees_confirmation_emails_description": "Najmanje jedan radni tok je aktivan na ovom tipu događaja koji šalje imejl polaznicima kada je događaj zakazan.",
|
||||
"disable_host_confirmation_emails": "Onemogući podrazumevane imejlove za potvrdu za domaćina",
|
||||
@@ -1822,6 +1819,7 @@
|
||||
"google_workspace_admin_tooltip": "Morate da budete Workspace administrator da biste koristili ovu opciju",
|
||||
"first_event_type_webhook_description": "Napravite svoj prvi webhook za ovaj tip događaja",
|
||||
"create_for": "Napravi za",
|
||||
"organization_url_taken": "Ovaj URL je zauzet",
|
||||
"additional_url_parameters": "Dodatni URL parametri",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Dodajte svoje nove stringove iznad ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Tack för att du testade vår nya teamplan. Vi märkte att ditt team \"{{teamName}}\" måste uppgraderas.",
|
||||
"team_upgrade_banner_action": "Uppgradera här",
|
||||
"team_upgraded_successfully": "Ditt team har uppgraderats!",
|
||||
"org_upgrade_banner_action": "Uppgradera här",
|
||||
"use_link_to_reset_password": "Använd länken nedan för att återställa ditt lösenord",
|
||||
"hey_there": "Hallå där,",
|
||||
"forgot_your_password_calcom": "Glömt ditt lösenord? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Klar",
|
||||
"all_done": "Allt klart!",
|
||||
"all_apps": "Alla",
|
||||
"all": "Alla",
|
||||
"available_apps": "Tillgängliga appar",
|
||||
"check_email_reset_password": "Kolla din e-post. Vi har skickat en länk till dig för att återställa ditt lösenord.",
|
||||
"finish": "Slutför",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Några meningar om ditt team. Detta visas på ditt teams URL-sida.",
|
||||
"members": "Medlemmar",
|
||||
"member": "Medlem",
|
||||
"number_member_one": "{{count}} medlem",
|
||||
"number_member_other": "{{count}} medlemmar",
|
||||
"owner": "Ägare",
|
||||
"admin": "Administratör",
|
||||
"administrator_user": "Administratörsanvändare",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Början av veckan",
|
||||
"recordings_title": "Inspelningar",
|
||||
"recording": "Inspelning",
|
||||
"happy_scheduling": "Lycka till med schemaläggningen",
|
||||
"select_calendars": "Välj vilka kalendrar du vill kontrollera för konflikter för att förhindra dubbelbokningar.",
|
||||
"check_for_conflicts": "Kontrollera om konflikter",
|
||||
"view_recordings": "Visa inspelningar",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Vill du verkligen ta bort {{connectionType}}-konfigurationen? Dina teammedlemmar som använder {{connectionType}}-inloggning kan inte längre komma åt Cal.com.",
|
||||
"organizer_timezone": "Organisatörens tidszon",
|
||||
"email_user_cta": "Visa inbjudan",
|
||||
"email_no_user_invite_heading": "Du är inbjuden att gå med i ett team på {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} har bjudit in dig att gå med i sitt team på {{appName}}. {{appName}} är en händelsejonglerande schemaläggare som du och ditt team kan använda för att planera möten utan att skicka e-post fram och tillbaka.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} har bjudit in dig att gå med i sitt team {{teamName}} den {{appName}}. {{appName}} är en händelsejonglerande schemaläggare som du och ditt team kan använda för att planera möten utan att skicka e-post fram och tillbaka.",
|
||||
"email_no_user_invite_steps_intro": "Vi går igenom några enkla steg så att du kan schemalägga utan stress med ditt team på nolltid.",
|
||||
"email_no_user_step_one": "Välj ditt användarnamn",
|
||||
"email_no_user_step_two": "Anslut ditt kalenderkonto",
|
||||
"email_no_user_step_three": "Ange din tillgänglighet",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Visa på bokningssidan",
|
||||
"get_started_zapier_templates": "Kom igång med Zapier-mallar",
|
||||
"team_is_unpublished": "{{team}} har avpublicerats",
|
||||
"team_is_unpublished_description": "Den här teamlänken är inte tillgänglig för närvarande. Kontakta teamets ägare eller be dem att publicera den.",
|
||||
"team_member": "Teammedlem",
|
||||
"a_routing_form": "Ett omdirigeringsformulär",
|
||||
"form_description_placeholder": "Formulärbeskrivning",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Se vilka av dina händelsetyper som får flest klick och bokningar",
|
||||
"no_responses_yet": "Inga svar ännu",
|
||||
"this_will_be_the_placeholder": "Det här blir platshållaren",
|
||||
"error_booking_event": "Ett fel uppstod när du bokade evenemanget, uppdatera sidan och försök igen",
|
||||
"timeslot_missing_title": "Ingen tidslucka vald",
|
||||
"timeslot_missing_description": "Välj en tidslucka för att boka evenemanget.",
|
||||
"timeslot_missing_cta": "Välj tidslucka",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Boka min Cal",
|
||||
"invite_as": "Bjud in som",
|
||||
"form_updated_successfully": "Formuläret har uppdaterats.",
|
||||
"email_not_cal_member_cta": "Gå med i teamet",
|
||||
"disable_attendees_confirmation_emails": "Inaktivera e-postbekräftelse som standard för deltagare",
|
||||
"disable_attendees_confirmation_emails_description": "Minst ett arbetsflöde är aktivt på denna evenemangstyp som skickar ett e-postmeddelande till deltagarna när evenemanget är bokat.",
|
||||
"disable_host_confirmation_emails": "Inaktivera e-postbekräftelse som standard för värdar",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Anslut Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Du måste vara Workspace-administratör för att kunna använda denna funktion",
|
||||
"first_event_type_webhook_description": "Skapa din första webhook för denna evenemangstyp",
|
||||
"create_for": "Skapa för"
|
||||
"create_for": "Skapa för",
|
||||
"organization_url_taken": "Denna URL används redan"
|
||||
}
|
||||
|
||||
@@ -80,9 +80,7 @@
|
||||
"requested_to_reschedule_subject_attendee": "மறுஅட்டவணை செயல் தேவை: {{eventType}} க்கு {{name}} உடன் புதிய நேரத்தை முன்பதிவு செய்யவும்",
|
||||
"hi_user_name": "வணக்கம் {{name}}",
|
||||
"turn_on": "இயக்கவும்",
|
||||
"email_no_user_invite_heading": "நீங்கள் {{appName}} குழுவில் சேர அழைக்கப்பட்டுள்ளீர்கள்",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} உங்களை {{appName}} குழுவில் சேர அழைத்துள்ளார். {{appName}} என்பது ஈமெயில் இல்லாமலேயே உங்களையும் உங்கள் குழுவையும் கூட்டங்களைத் திட்டமிடுவதற்கு உதவும் திட்டமிடல் பயன்பாடு.",
|
||||
"email_no_user_invite_steps_intro": "சில சிறிய முயர்ச்சித்தல் மூலம் நாங்கள் உங்களை அழைத்துச் செல்வோம், எந்த நேரத்திலும் உங்கள் குழுவுடன் மன அழுத்தமில்லாத திட்டமிடலை அனுபவிப்பீர்கள்.",
|
||||
"email_no_user_step_one": "உங்கள் பயனர்பெயரை தேர்வு செய்யவும்",
|
||||
"email_no_user_step_two": "உங்கள் காலெண்டர் கணக்கை இணைக்கவும்",
|
||||
"email_no_user_step_four": "{{teamName}} இல் சேரவும்",
|
||||
@@ -120,7 +118,6 @@
|
||||
"form_builder_field_already_exists": "இந்தப் பெயரில் ஒரு புலம் ஏற்கனவே உள்ளது",
|
||||
"get_started_zapier_templates": "ஜாப்பியர் டெம்ப்ளேட்களுடன் தொடங்கவும்",
|
||||
"team_is_unpublished": "{{team}} வெளியிடப்படவில்லை",
|
||||
"team_is_unpublished_description": "இந்தக் குழு இணைப்பு தற்போது கிடைக்கவில்லை. குழு உரிமையாளரைத் தொடர்பு கொண்டு இதை வெளியிடச் சொல்லவும்.",
|
||||
"team_member": "குழு உறுப்பினர்",
|
||||
"form_description_placeholder": "படிவ விளக்கம்",
|
||||
"keep_me_connected_with_form": "படிவத்துடன் என்னை இணைக்கவும்",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Yeni ekip planımızı denediğiniz için teşekkür ederiz. \"{{teamName}}\" adlı ekibinizin yükseltilmesi gerektiğini fark ettik.",
|
||||
"team_upgrade_banner_action": "Buradan yükseltin",
|
||||
"team_upgraded_successfully": "Ekibiniz başarıyla yükseltildi!",
|
||||
"org_upgrade_banner_action": "Buradan yükseltin",
|
||||
"use_link_to_reset_password": "Şifrenizi sıfırlamak için aşağıdaki bağlantıyı kullanın",
|
||||
"hey_there": "Selam,",
|
||||
"forgot_your_password_calcom": "Şifrenizi mi unuttunuz? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Tamam",
|
||||
"all_done": "Hepsi tamam!",
|
||||
"all_apps": "Tümü",
|
||||
"all": "Tümü",
|
||||
"available_apps": "Mevcut Uygulamalar",
|
||||
"check_email_reset_password": "E-posta adresinizi kontrol edin. Size şifrenizi sıfırlamanız için bir bağlantı göndereceğiz.",
|
||||
"finish": "Bitir",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Birkaç cümleyle ekibinizden bahsedin. Bu, ekibinizin URL sayfasında görünecektir.",
|
||||
"members": "Üyeler",
|
||||
"member": "Üye",
|
||||
"number_member_one": "{{count}} üye",
|
||||
"number_member_other": "{{count}} üye",
|
||||
"owner": "Sahibi",
|
||||
"admin": "Yönetici",
|
||||
"administrator_user": "Yönetici kullanıcı",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Haftanın başlangıcı",
|
||||
"recordings_title": "Kayıtlar",
|
||||
"recording": "Kayıt",
|
||||
"happy_scheduling": "İyi Planlamalar",
|
||||
"select_calendars": "Çifte rezervasyonu önlemek için çakışmaları kontrol etmek istediğiniz takvimleri seçin.",
|
||||
"check_for_conflicts": "Çakışmaları kontrol edin",
|
||||
"view_recordings": "Kayıtları görüntüle",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "{{connectionType}} yapılandırmasını silmek istediğinizden emin misiniz? {{connectionType}} girişini kullanan ekip üyeleriniz artık Cal.com'a erişemeyecek.",
|
||||
"organizer_timezone": "Organizatörün saat dilimi",
|
||||
"email_user_cta": "Daveti görüntüle",
|
||||
"email_no_user_invite_heading": "{{appName}} uygulamasındaki bir ekibe katılmaya davet edildiniz",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}}, sizi {{appName}} ekibine katılmaya davet etti. {{appName}}, size ve ekibinize e-posta iletişimine ihtiyaç duymadan toplantı planlama yapma olanağı sağlayan bir etkinlik planlayıcıdır.",
|
||||
"email_user_invite_subheading": "{{invitedBy}}, sizi {{appName}} uygulamasındaki `{{teamName}}` ekibine katılmaya davet etti. {{appName}}, size ve ekibinize e-posta iletişimine ihtiyaç duymadan toplantı planlama yapma olanağı sağlayan bir etkinlik planlayıcıdır.",
|
||||
"email_no_user_invite_steps_intro": "Ekibinizle birlikte kısa sürede ve sorunsuz planlama yapmanın keyfini çıkarmanız için birkaç adımda size rehberlik edeceğiz.",
|
||||
"email_no_user_step_one": "Kullanıcı adınızı seçin",
|
||||
"email_no_user_step_two": "Takvim hesabınızı bağlayın",
|
||||
"email_no_user_step_three": "Müsaitlik durumunuzu ayarlayın",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Rezervasyon sayfasında göster",
|
||||
"get_started_zapier_templates": "Zapier şablonlarını kullanmaya başlayın",
|
||||
"team_is_unpublished": "{{team}} paylaşılmadı",
|
||||
"team_is_unpublished_description": "Bu ekip bağlantısı şu anda kullanılamıyor. Lütfen ekip sahibiyle iletişime geçin veya ondan bir bağlantı paylaşmasını isteyin.",
|
||||
"team_member": "Ekip üyesi",
|
||||
"a_routing_form": "Yönlendirme Formu",
|
||||
"form_description_placeholder": "Form Açıklaması",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Hangi etkinlik türünüzün en çok tıklandığını ve rezervasyon aldığını görün",
|
||||
"no_responses_yet": "Henüz yanıt yok",
|
||||
"this_will_be_the_placeholder": "Bu, yer tutucu olacak",
|
||||
"error_booking_event": "Etkinlik rezervasyonu yapılırken bir hata oluştu, lütfen sayfayı yenileyerek tekrar deneyin",
|
||||
"timeslot_missing_title": "Zaman aralığı seçilmedi",
|
||||
"timeslot_missing_description": "Etkinlik rezervasyonu için lütfen bir zaman aralığı seçin.",
|
||||
"timeslot_missing_cta": "Zaman aralığını seçin",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Cal'ımı rezerve et",
|
||||
"invite_as": "Davet edin",
|
||||
"form_updated_successfully": "Form başarıyla güncellendi.",
|
||||
"email_not_cal_member_cta": "Ekibinize ekleyin",
|
||||
"disable_attendees_confirmation_emails": "Katılımcılar için varsayılan onay e-postalarını devre dışı bırakın",
|
||||
"disable_attendees_confirmation_emails_description": "Bu etkinlik türünde etkinlik rezerve edildiğinde katılımcılara bir e-posta gönderen en az bir iş akışı etkin.",
|
||||
"disable_host_confirmation_emails": "Organizatörler için varsayılan onay e-postalarını devre dışı bırakın",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Google Workspace'i bağlayın",
|
||||
"google_workspace_admin_tooltip": "Bu özelliği kullanmak için Çalışma Alanı Yöneticisi olmalısınız",
|
||||
"first_event_type_webhook_description": "Bu etkinlik türü için ilk web kancanızı oluşturun",
|
||||
"create_for": "Oluşturun"
|
||||
"create_for": "Oluşturun",
|
||||
"organization_url_taken": "Bu URL zaten kullanılıyor"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Дякуємо, що спробували наш новий план для команд! Ми помітили, що вашу команду «{{teamName}}» потрібно перевести на план вищого рівня.",
|
||||
"team_upgrade_banner_action": "Перейдіть на інший план",
|
||||
"team_upgraded_successfully": "Версію для вашої команди оновлено!",
|
||||
"org_upgrade_banner_action": "Перейдіть на інший план",
|
||||
"use_link_to_reset_password": "Скористайтеся посиланням нижче, щоб скинути пароль",
|
||||
"hey_there": "Привіт!",
|
||||
"forgot_your_password_calcom": "Забули пароль? – {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Готово",
|
||||
"all_done": "Усе готово!",
|
||||
"all_apps": "Усі",
|
||||
"all": "Усі",
|
||||
"available_apps": "Доступні додатки",
|
||||
"check_email_reset_password": "Перевірте електронну пошту. Ми надіслали вам посилання для скидання пароля.",
|
||||
"finish": "Готово",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Кілька речень про вашу команду. Ця інформація з’явиться на сторінці за URL-адресою вашої команди.",
|
||||
"members": "Учасники",
|
||||
"member": "Учасник",
|
||||
"number_member_one": "{{count}} учасник",
|
||||
"number_member_other": "Учасників: {{count}}",
|
||||
"owner": "Власник",
|
||||
"admin": "Адмін",
|
||||
"administrator_user": "Адміністратор",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Початок тижня",
|
||||
"recordings_title": "Записи",
|
||||
"recording": "Запис",
|
||||
"happy_scheduling": "Вдалого планування",
|
||||
"select_calendars": "Виберіть, які календарі потрібно перевірити на наявність конфліктів, щоб уникнути подвійних бронювань.",
|
||||
"check_for_conflicts": "Перевірка конфліктів",
|
||||
"view_recordings": "Переглянути записи",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Справді видалити конфігурацію {{connectionType}}? Учасники вашої команди, які входять через {{connectionType}}, не зможуть ввійти в Cal.com.",
|
||||
"organizer_timezone": "Часовий пояс організатора",
|
||||
"email_user_cta": "Переглянути запрошення",
|
||||
"email_no_user_invite_heading": "Вас запрошено приєднатися до команди в {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} запрошує вас приєднатися до команди в {{appName}}. {{appName}} — планувальник подій, який дає змогу вам і вашій команді планувати зустрічі без тривалої переписки електронною поштою.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} запрошує вас приєднатися до команди «{{teamName}}» в {{appName}}. {{appName}} — планувальник подій, який дає змогу вам і вашій команді планувати зустрічі без тривалої переписки електронною поштою.",
|
||||
"email_no_user_invite_steps_intro": "Ми ознайомимо вас із додатком, і вже скоро ви насолоджуватиметесь плануванням зі своєю командою без жодного клопоту.",
|
||||
"email_no_user_step_one": "Виберіть ім’я користувача",
|
||||
"email_no_user_step_two": "Підключіть обліковий запис календаря",
|
||||
"email_no_user_step_three": "Укажіть, коли ви доступні",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Показувати на сторінці бронювання",
|
||||
"get_started_zapier_templates": "Розпочніть роботу із шаблонами Zapier",
|
||||
"team_is_unpublished": "Публікацію команди «{{team}}» скасовано",
|
||||
"team_is_unpublished_description": "Посилання на команду зараз недоступне. Зверніться до власника команди або попросіть його опублікувати команду.",
|
||||
"team_member": "Учасник команди",
|
||||
"a_routing_form": "Форма переспрямування",
|
||||
"form_description_placeholder": "Опис форми",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Дізнайтеся, які типи заходів мають найбільшу кількість переходів і бронювань",
|
||||
"no_responses_yet": "Поки немає відповідей",
|
||||
"this_will_be_the_placeholder": "Це заповнювач",
|
||||
"error_booking_event": "Сталася помилка під час бронювання заходу, оновіть сторінку й повторіть спробу",
|
||||
"timeslot_missing_title": "Не вибрано проміжок часу",
|
||||
"timeslot_missing_description": "Виберіть проміжок часу для бронювання заходу.",
|
||||
"timeslot_missing_cta": "Вибрати проміжок часу",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Забронювати мій Cal",
|
||||
"invite_as": "Запросити як",
|
||||
"form_updated_successfully": "Форму оновлено.",
|
||||
"email_not_cal_member_cta": "Приєднатися до команди",
|
||||
"disable_attendees_confirmation_emails": "Вимкнути листи підтвердження за замовчуванням для учасників",
|
||||
"disable_attendees_confirmation_emails_description": "Принаймні один робочий процес активний у цьому типі заходів, який надсилає електронний лист учасникам у разі бронювання заходу.",
|
||||
"disable_host_confirmation_emails": "Вимкнути листи підтвердження за замовчуванням для ведучого",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Підключити Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Ви повинні бути адміністратором Workspace, щоб використовувати цю функцію",
|
||||
"first_event_type_webhook_description": "Створіть свій перший вебгук для цього типу заходів",
|
||||
"create_for": "Створити для"
|
||||
"create_for": "Створити для",
|
||||
"organization_url_taken": "Цю URL-адресу вже зайнято"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "Cám ơn bạn đã dùng thử gói kế hoạch mới dành cho nhóm. Chúng tôi để ý thấy nhóm \"{{teamName}}\" của bạn cần được nâng cấp.",
|
||||
"team_upgrade_banner_action": "Nâng cấp tại đây",
|
||||
"team_upgraded_successfully": "Nhóm bạn đã được nâng cấp thành công!",
|
||||
"org_upgrade_banner_action": "Nâng cấp tại đây",
|
||||
"use_link_to_reset_password": "Sử dụng đường link dưới đây để thay đổi mật khẩu của bạn",
|
||||
"hey_there": "Xin chào,",
|
||||
"forgot_your_password_calcom": "Quên mật khẩu của bạn? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "Xong",
|
||||
"all_done": "Đã xong hết!",
|
||||
"all_apps": "Tất cả",
|
||||
"all": "Tất cả",
|
||||
"available_apps": "Ứng dụng hiện có",
|
||||
"check_email_reset_password": "Kiểm tra hộp thư điện tử của bạn. Chúng tôi đã gửi cho bạn một liên kết để đặt lại mật khẩu của bạn.",
|
||||
"finish": "Hoàn thành",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "Một vài câu về nhóm của bạn. Thông tin này sẽ xuất hiện trên trang URL của nhóm của bạn.",
|
||||
"members": "Các thành viên",
|
||||
"member": "Thành viên",
|
||||
"number_member_one": "{{count}} thành viên",
|
||||
"number_member_other": "{{count}} thành viên",
|
||||
"owner": "Chủ nhóm",
|
||||
"admin": "Quản trị viên",
|
||||
"administrator_user": "Người dùng quản trị viên",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "Khởi đầu tuần",
|
||||
"recordings_title": "Bản ghi âm",
|
||||
"recording": "Bản ghi âm",
|
||||
"happy_scheduling": "Chúc bạn đặt lịch vui vẻ",
|
||||
"select_calendars": "Chọn lịch nào mà bạn muốn kiểm tra xung đột nhằm tránh đặt lịch hẹn trùng.",
|
||||
"check_for_conflicts": "Kiểm tra xung đột",
|
||||
"view_recordings": "Xem các bản ghi âm",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "Bạn có chắc chắn muốn xóa cấu hình {{connectionType}} không? Các thành viên trong nhóm của bạn sử dụng thông tin đăng nhập {{connectionType}} sẽ không thể truy cập vào Cal.com được nữa.",
|
||||
"organizer_timezone": "Múi giờ của người tổ chức",
|
||||
"email_user_cta": "Xem lời mời",
|
||||
"email_no_user_invite_heading": "Bạn đã được mời gia nhập nhóm trên {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} đã mời bạn gia nhập nhóm của họ trên {{appName}}. {{appName}} là công cụ lên lịch sắp xếp sự kiện cho phép bạn và nhóm bạn lên lịch các cuộc gặp mà không cần trao đổi email nhiều.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} đã mời bạn gia nhập nhóm '{{teamName}}' của họ trên {{appName}}. {{appName}} là công cụ lên lịch sắp xếp sự kiện cho phép bạn và nhóm bạn lên lịch các cuộc gặp mà không cần trao đổi email nhiều.",
|
||||
"email_no_user_invite_steps_intro": "Chúng tôi sẽ hướng dẫn cho bạn qua vài bước nhỏ và bạn sẽ tận hưởng được ngay cảm giác thoải mái không căng thẳng trong việc lên lịch cùng nhóm của mình.",
|
||||
"email_no_user_step_one": "Chọn tên người dùng của bạn",
|
||||
"email_no_user_step_two": "Kết nối tài khoản lịch của bạn",
|
||||
"email_no_user_step_three": "Đặt lịch khả dụng của bạn",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "Hiện trên trang lịch hẹn",
|
||||
"get_started_zapier_templates": "Bắt đầu với các mẫu Zapier",
|
||||
"team_is_unpublished": "{{team}} chưa được công bố",
|
||||
"team_is_unpublished_description": "Liên kết nhóm này hiện không khả dụng. Hãy liên lạc với chủ nhóm hoặc yêu cầu họ công bố liên kết đó.",
|
||||
"team_member": "Thành viên nhóm",
|
||||
"a_routing_form": "Một biểu mẫu định hướng",
|
||||
"form_description_placeholder": "Mô tả biểu mẫu",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "Xem loại sự kiện nào của bạn nhận được nhiều lần nhấp chuột và nhiều lịch hẹn nhất",
|
||||
"no_responses_yet": "Chưa có hồi đáp",
|
||||
"this_will_be_the_placeholder": "Đây sẽ là mã giữ chỗ",
|
||||
"error_booking_event": "Có lỗi khi đặt lịch sự kiện, hãy làm mới trang rồi thử lại",
|
||||
"timeslot_missing_title": "Chưa chọn suất thời gian nào",
|
||||
"timeslot_missing_description": "Vui lòng chọn một suất thời gian để đặt lịch sự kiện.",
|
||||
"timeslot_missing_cta": "Chọn suất thời gian",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "Đặt lịch Cal của tôi",
|
||||
"invite_as": "Mời ở vai trò",
|
||||
"form_updated_successfully": "Đã cập nhật biểu mẫu thành công.",
|
||||
"email_not_cal_member_cta": "Gia nhập nhóm của bạn",
|
||||
"disable_attendees_confirmation_emails": "Vô hiệu hoá những email xác nhận mặc định dành cho người tham dự",
|
||||
"disable_attendees_confirmation_emails_description": "Ít nhất một tiến độ công việc đang hoạt động ở loại sự kiện này, và tiến độ này sẽ gửi email đến những người tham dự khi sự kiện này được đặt lịch.",
|
||||
"disable_host_confirmation_emails": "Vô hiệu hoá những email xác nhận mặc định dành cho chủ toạ",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "Kết nối Google Workspace",
|
||||
"google_workspace_admin_tooltip": "Bạn phải là một Quản trị viên của Workspace mới dùng được tính năng này",
|
||||
"first_event_type_webhook_description": "Tạo webhook đầu tiên của bạn cho loại sự kiện này",
|
||||
"create_for": "Tạo cho"
|
||||
"create_for": "Tạo cho",
|
||||
"organization_url_taken": "URL này đã có người lấy rồi"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "感谢您试用我们的新团队计划。我们注意到您的团队“{{teamName}}”需要升级。",
|
||||
"team_upgrade_banner_action": "在此处升级",
|
||||
"team_upgraded_successfully": "您的团队升级成功!",
|
||||
"org_upgrade_banner_action": "在此处升级",
|
||||
"use_link_to_reset_password": "使用下面的链接重置您的密码",
|
||||
"hey_there": "嘿,您好!",
|
||||
"forgot_your_password_calcom": "忘记密码?- {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "完成",
|
||||
"all_done": "全部完成!",
|
||||
"all_apps": "所有应用",
|
||||
"all": "所有应用",
|
||||
"available_apps": "可用应用",
|
||||
"check_email_reset_password": "请检查您的邮箱,我们向您发送了一个重置密码的链接。",
|
||||
"finish": "完成",
|
||||
@@ -290,6 +292,7 @@
|
||||
"failed": "失败",
|
||||
"password_has_been_reset_login": "您的密码已重置。您现在可以使用您的新密码登录。",
|
||||
"bookerlayout_title": "布局",
|
||||
"layout": "布局",
|
||||
"bookerlayout_default_title": "默认视图",
|
||||
"bookerlayout_description": "您可以选择多个布局,这样预约者可以切换视图。",
|
||||
"bookerlayout_user_settings_title": "预约布局",
|
||||
@@ -526,6 +529,8 @@
|
||||
"team_description": "请写一段简单的团队介绍,该介绍将会显示在您的团队链接页面上。",
|
||||
"members": "成员",
|
||||
"member": "成员",
|
||||
"number_member_one": "{{count}} 个成员",
|
||||
"number_member_other": "{{count}} 个成员",
|
||||
"owner": "所有者",
|
||||
"admin": "管理员",
|
||||
"administrator_user": "管理员用户",
|
||||
@@ -1195,7 +1200,6 @@
|
||||
"start_of_week": "一周开始",
|
||||
"recordings_title": "录制",
|
||||
"recording": "录制",
|
||||
"happy_scheduling": "祝日程安排愉快",
|
||||
"select_calendars": "选择要检查冲突的日历,以防止重复预约。",
|
||||
"check_for_conflicts": "检查冲突",
|
||||
"view_recordings": "查看录制",
|
||||
@@ -1590,10 +1594,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "确定要删除 {{connectionType}} 配置吗?使用 {{connectionType}} 登录的团队成员将无法再访问 Cal.com。",
|
||||
"organizer_timezone": "组织者时区",
|
||||
"email_user_cta": "查看邀请",
|
||||
"email_no_user_invite_heading": "您已被邀请在 {{appName}} 加入一个团队",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} 已邀请您加入他们在 {{appName}} 上的团队。{{appName}} 是一个活动安排调度程序,让您和您的团队无需通过电子邮件沟通即可安排会议。",
|
||||
"email_user_invite_subheading": "{{invitedBy}} 已邀请您加入他们在 {{appName}} 上的团队“{{teamName}}”。{{appName}} 是一个活动安排调度程序,让您和您的团队无需通过电子邮件沟通即可安排会议。",
|
||||
"email_no_user_invite_steps_intro": "我们将引导您完成几个简短步骤,您将立即与您的团队一起享受无压力的日程安排。",
|
||||
"email_no_user_step_one": "选择您的用户名",
|
||||
"email_no_user_step_two": "连接您的日历账户",
|
||||
"email_no_user_step_three": "设置您的可预约时间",
|
||||
@@ -1636,7 +1637,6 @@
|
||||
"show_on_booking_page": "在预约页面上显示",
|
||||
"get_started_zapier_templates": "开始使用 Zapier 模板",
|
||||
"team_is_unpublished": "{{team}} 已被取消发布",
|
||||
"team_is_unpublished_description": "该团队链接当前不可用。请联系团队所有者或请他们发布。",
|
||||
"team_member": "团队成员",
|
||||
"a_routing_form": "途径表格",
|
||||
"form_description_placeholder": "表格描述",
|
||||
@@ -1667,7 +1667,6 @@
|
||||
"spot_popular_event_types_description": "查看获得最多点击和预约的活动类型",
|
||||
"no_responses_yet": "尚无回复",
|
||||
"this_will_be_the_placeholder": "这将是占位符",
|
||||
"error_booking_event": "预订活动时发生错误,请刷新页面并重试",
|
||||
"timeslot_missing_title": "未选择时间段",
|
||||
"timeslot_missing_description": "请选择要预约活动的时间段。",
|
||||
"timeslot_missing_cta": "选择时间段",
|
||||
@@ -1790,7 +1789,6 @@
|
||||
"book_my_cal": "预约我的 Cal",
|
||||
"invite_as": "邀请为",
|
||||
"form_updated_successfully": "表单更新成功。",
|
||||
"email_not_cal_member_cta": "加入您的团队",
|
||||
"disable_attendees_confirmation_emails": "禁用参与者的默认确认电子邮件",
|
||||
"disable_attendees_confirmation_emails_description": "该活动类型中至少有一个工作流程处于活动状态,当该活动被预约时,将向参与者发送电子邮件。",
|
||||
"disable_host_confirmation_emails": "禁用主持人的默认确认电子邮件",
|
||||
@@ -1801,5 +1799,6 @@
|
||||
"google_workspace_admin_tooltip": "您必须是 Workspace 管理员才能使用此功能",
|
||||
"first_event_type_webhook_description": "为此活动类型创建第一个 Webhook",
|
||||
"create_for": "创建",
|
||||
"organization_url_taken": "此链接已被占用",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 在上面这里添加新的字符串 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"team_upgrade_banner_description": "謝謝您試用我們新的團隊方案。我們注意到您的團隊「{{teamName}}」需要升級。",
|
||||
"team_upgrade_banner_action": "在此處升級",
|
||||
"team_upgraded_successfully": "團隊成功升級!",
|
||||
"org_upgrade_banner_action": "在此處升級",
|
||||
"use_link_to_reset_password": "使用以下連結重置密碼",
|
||||
"hey_there": "哈囉,",
|
||||
"forgot_your_password_calcom": "忘記密碼了? - {{appName}}",
|
||||
@@ -228,6 +229,7 @@
|
||||
"done": "完成",
|
||||
"all_done": "大功告成!",
|
||||
"all_apps": "所有應用程式",
|
||||
"all": "所有應用程式",
|
||||
"available_apps": "可用的應用程式",
|
||||
"check_email_reset_password": "請檢查信箱。已經把重設密碼的連結寄出。",
|
||||
"finish": "結束",
|
||||
@@ -514,6 +516,8 @@
|
||||
"team_description": "請提供關於團隊的簡介,這會顯示在團隊網址的頁面上。",
|
||||
"members": "成員",
|
||||
"member": "成員",
|
||||
"number_member_one": "{{count}} 名成員",
|
||||
"number_member_other": "{{count}} 名成員",
|
||||
"owner": "主持人",
|
||||
"admin": "管理者",
|
||||
"administrator_user": "管理員使用者",
|
||||
@@ -1183,7 +1187,6 @@
|
||||
"start_of_week": "一週開始",
|
||||
"recordings_title": "錄製",
|
||||
"recording": "錄製",
|
||||
"happy_scheduling": "祝排程愉快",
|
||||
"select_calendars": "選擇您想要檢查衝突的行事曆來避免重複預約。",
|
||||
"check_for_conflicts": "檢查衝突",
|
||||
"view_recordings": "檢視錄製內容",
|
||||
@@ -1578,10 +1581,7 @@
|
||||
"delete_sso_configuration_confirmation_description": "確定要刪除 {{connectionType}} 設定?使用 {{connectionType}} 登入的團隊成員將再也無法存取 Cal.com。",
|
||||
"organizer_timezone": "主辦者時區",
|
||||
"email_user_cta": "檢視邀請",
|
||||
"email_no_user_invite_heading": "您已獲邀加入 {{appName}} 上的團隊",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} 已邀請您加入對方在 {{appName}} 上的團隊。{{appName}} 是活動多工排程工具,可讓您和您的團隊無須透過繁複的電子郵件往來就能輕鬆預定會議。",
|
||||
"email_user_invite_subheading": "{{invitedBy}} 已邀請您加入對方在 {{appName}} 上的「{{teamName}}」團隊。{{appName}} 為一款活動多功能排程工具,可讓您和團隊無須透過繁複的電子郵件往來,就能輕鬆預定會議。",
|
||||
"email_no_user_invite_steps_intro": "我們會逐步引導您完成幾個簡短的步驟,然後您就能馬上與團隊享受沒有壓力的排程預定功能。",
|
||||
"email_no_user_step_one": "選擇使用者名稱",
|
||||
"email_no_user_step_two": "連結行事曆帳號",
|
||||
"email_no_user_step_three": "設定開放時間",
|
||||
@@ -1623,7 +1623,6 @@
|
||||
"show_on_booking_page": "在預約頁面上顯示",
|
||||
"get_started_zapier_templates": "開始使用 Zapier 範本",
|
||||
"team_is_unpublished": "已取消發佈 {{team}}",
|
||||
"team_is_unpublished_description": "此團隊連結目前無法使用。請聯絡團隊擁有者,或請對方發佈。",
|
||||
"team_member": "團隊成員",
|
||||
"a_routing_form": "引導表單",
|
||||
"form_description_placeholder": "表單說明",
|
||||
@@ -1654,7 +1653,6 @@
|
||||
"spot_popular_event_types_description": "查看哪種活動類型的點閱次數及預約次數最多",
|
||||
"no_responses_yet": "還沒有回應",
|
||||
"this_will_be_the_placeholder": "此處會是佔位符",
|
||||
"error_booking_event": "預約活動時發生錯誤,請重新整理頁面然後再試一次",
|
||||
"timeslot_missing_title": "未選擇任何時段",
|
||||
"timeslot_missing_description": "請選擇要預約活動的時段。",
|
||||
"timeslot_missing_cta": "選擇時段",
|
||||
@@ -1767,7 +1765,6 @@
|
||||
"book_my_cal": "預約我的 Cal",
|
||||
"invite_as": "以下列身分邀請:",
|
||||
"form_updated_successfully": "表單更新成功。",
|
||||
"email_not_cal_member_cta": "加入您的團隊",
|
||||
"disable_attendees_confirmation_emails": "為與會者停用預設確認電子郵件",
|
||||
"disable_attendees_confirmation_emails_description": "預約活動時,此活動類型至少要啟用一個工作流程來傳送電子郵件給與會者。",
|
||||
"disable_host_confirmation_emails": "為主辦人停用預設確認電子郵件",
|
||||
@@ -1777,5 +1774,6 @@
|
||||
"connect_google_workspace": "連結 Google Workspace",
|
||||
"google_workspace_admin_tooltip": "您必須是 Workspace 管理員才能使用此功能",
|
||||
"first_event_type_webhook_description": "為此活動類型建立第一個 Webhook",
|
||||
"create_for": "適用目標"
|
||||
"create_for": "適用目標",
|
||||
"organization_url_taken": "已有人使用此網址"
|
||||
}
|
||||
|
||||
@@ -28,6 +28,8 @@ export async function ssrInit(context: GetServerSidePropsContext) {
|
||||
await ssr.viewer.public.i18n.fetch();
|
||||
// So feature flags are available on first render
|
||||
await ssr.viewer.features.map.prefetch();
|
||||
// Provides a better UX to the users who have already upgraded.
|
||||
await ssr.viewer.teams.hasTeamPlan.prefetch();
|
||||
|
||||
return ssr;
|
||||
}
|
||||
|
||||
@@ -148,6 +148,7 @@ export const defaultLocations: DefaultEventLocationType[] = [
|
||||
|
||||
export type LocationObject = {
|
||||
type: string;
|
||||
address?: string;
|
||||
displayLocationPublicly?: boolean;
|
||||
} & Partial<
|
||||
Record<"address" | "attendeeAddress" | "link" | "hostPhoneNumber" | "hostDefault" | "phone", string>
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import type { App_RoutingForms_Form } from "@prisma/client";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { getSession } from "next-auth/react";
|
||||
|
||||
import { entityPrismaWhereClause, canEditEntity } from "@calcom/lib/entityPermissionUtils";
|
||||
import prisma from "@calcom/prisma";
|
||||
|
||||
import { getSerializableForm } from "../../lib/getSerializableForm";
|
||||
@@ -55,6 +57,7 @@ async function* getResponses(
|
||||
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
const { args } = req.query;
|
||||
|
||||
if (!args) {
|
||||
throw new Error("args must be set");
|
||||
}
|
||||
@@ -63,16 +66,37 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
throw new Error("formId must be provided");
|
||||
}
|
||||
|
||||
const session = await getSession({ req });
|
||||
|
||||
if (!session) {
|
||||
return res.status(401).json({ message: "Unauthorized" });
|
||||
}
|
||||
|
||||
const { user } = session;
|
||||
|
||||
const form = await prisma.app_RoutingForms_Form.findFirst({
|
||||
where: {
|
||||
id: formId,
|
||||
...entityPrismaWhereClause({ userId: user.id }),
|
||||
},
|
||||
include: {
|
||||
team: {
|
||||
select: {
|
||||
members: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (!form) {
|
||||
throw new Error("Form not found");
|
||||
return res.status(404).json({ message: "Form not found or unauthorized" });
|
||||
}
|
||||
const serializableForm = await getSerializableForm(form, true);
|
||||
|
||||
if (!canEditEntity(form, user.id)) {
|
||||
return res.status(404).json({ message: "Form not found or unauthorized" });
|
||||
}
|
||||
|
||||
const serializableForm = await getSerializableForm({ form, withDeletedFields: true });
|
||||
res.setHeader("Content-Type", "text/csv; charset=UTF-8");
|
||||
res.setHeader(
|
||||
"Content-Disposition",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user