Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
38d242add9 | ||
|
|
c272e281cf | ||
|
|
d4e19b0fa4 | ||
|
|
c12877a58f | ||
|
|
af83350d04 | ||
|
|
9d0cf6be0b | ||
|
|
2fe9c782d4 | ||
|
|
d0a3d8d144 | ||
|
|
cefcb1eaf8 | ||
|
|
83b60de640 | ||
|
|
a076418989 | ||
|
|
64ecce1ccb | ||
|
|
cd56a5d4f0 | ||
|
|
d5ca121ac6 | ||
|
|
1e20e80b65 | ||
|
|
75ac3fd40c | ||
|
|
3b91cc7f02 | ||
|
|
23450b61e0 | ||
|
|
dcc226976c | ||
|
|
196fde72f6 | ||
|
|
1e913cd406 | ||
|
|
02425702d1 | ||
|
|
2494655369 | ||
|
|
0e0a78c47e | ||
|
|
ed02c10f54 | ||
|
|
9c40f76184 | ||
|
|
8eda30d88c | ||
|
|
9de19d35a8 | ||
|
|
0770403ca5 | ||
|
|
1a45cb35c1 | ||
|
|
15cdff76d9 | ||
|
|
8c4eb4b5fe | ||
|
|
ae30aafafe | ||
|
|
3b74717591 | ||
|
|
7a6349b4c0 | ||
|
|
3b51fff88d | ||
|
+5 |
2a0b0be9d0 | ||
|
|
f373c9d818 | ||
|
|
540bf3a1cb | ||
|
|
2d9064e92f | ||
|
|
9487819ec1 | ||
|
|
49bf14b196 | ||
|
|
344f16d6cc | ||
|
|
ccbf3b1e54 | ||
|
|
dcf0fad35d | ||
|
|
a836800c69 | ||
|
|
b8c6ac43f7 | ||
|
|
f5e0c6b384 | ||
|
|
2a5dd9035f | ||
|
|
2cddad4336 | ||
|
|
4bcbff51b1 | ||
|
|
ae541e4c37 | ||
|
|
f254711d85 | ||
|
|
533e208643 | ||
|
|
795574ef88 | ||
|
|
48611d5c99 | ||
|
|
11a07961d0 | ||
|
|
6be0fd52e7 | ||
|
|
78da7ba338 | ||
|
|
9a72c648c5 | ||
|
|
3e42da7fc7 | ||
|
|
1d986cad04 | ||
|
|
f603e4eff2 | ||
|
|
1f4e6c1987 | ||
|
|
e57f734e79 | ||
|
|
7fad76ae23 | ||
|
|
7659a016b4 | ||
|
|
34fe1c4a95 | ||
|
|
205f73c4bc | ||
|
|
c4bd2167e1 | ||
|
|
49a7111b66 | ||
|
|
ca045a040b | ||
|
|
a8b4198bf7 | ||
|
|
2ab24e530b | ||
|
|
734b06dfdf | ||
|
|
467084993b | ||
|
|
1e2c8516d2 | ||
|
|
d57738f325 | ||
|
|
c39a7dba85 | ||
|
|
fd37397e5c | ||
|
|
df0a522656 | ||
|
|
916468b8cc | ||
|
|
b789e58624 | ||
|
|
4368536141 | ||
|
|
9eef9766ce | ||
|
|
68dbfbd7d0 | ||
|
|
692a84a86e | ||
|
|
1671095c94 | ||
|
|
3b896bee5c | ||
|
|
cc1985442e | ||
|
|
630f438b32 | ||
|
|
6fae01d45a | ||
|
|
7009373b11 | ||
|
|
c2f150dbab | ||
|
|
688541923b | ||
|
|
20402ac26c | ||
|
|
a54952b41a | ||
|
|
987756c4d4 | ||
|
|
3ee294ffc5 | ||
|
|
a638708871 | ||
|
|
3456cc5521 | ||
|
|
546f0c3881 | ||
|
|
7b18272d60 | ||
|
|
cf6efabdbb | ||
|
|
92d15a00f5 | ||
|
|
2f2b72dd54 | ||
|
|
8fd5d6b5b5 | ||
|
|
2078f12a85 | ||
|
|
77b8eb8a7f | ||
|
|
463787b607 | ||
|
|
1f4e7ca695 | ||
|
|
9eb52bbfb2 | ||
|
|
61e6f76bc6 | ||
|
|
2e6c3a6068 | ||
|
|
8f48ecafec | ||
|
|
8849d1148c | ||
|
|
98a4684a2b | ||
|
|
da0bdfacae | ||
|
|
68c7425922 | ||
|
|
c3418cbe1f | ||
|
|
3a641e0bc1 | ||
|
|
b7fcf6ade1 | ||
|
|
53d160e495 | ||
|
|
df4df6846b | ||
|
|
c1bbb9b139 | ||
|
|
56c07ec351 | ||
|
|
3080b47aec | ||
|
|
c1e23bfdc6 | ||
|
|
e7ff5508d7 | ||
|
|
5850d227ee | ||
|
|
ede987ba19 | ||
|
|
bc0d83164c | ||
|
|
30f0b080c5 | ||
|
|
ee39ea316f | ||
|
|
fbc2708259 | ||
|
|
9bb83aba7e |
+5
-3
@@ -7,14 +7,13 @@
|
||||
# - E-MAIL SETTINGS
|
||||
|
||||
# - LICENSE *************************************************************************************************
|
||||
# Set this value to 'agree' to accept our license:
|
||||
# LICENSE: https://github.com/calendso/calendso/blob/main/LICENSE
|
||||
# https://github.com/calendso/calendso/blob/main/LICENSE
|
||||
#
|
||||
# Summary of terms:
|
||||
# - The codebase has to stay open source, whether it was modified or not
|
||||
# - You can not repackage or sell the codebase
|
||||
# - Acquire a commercial license to remove these terms by visiting: cal.com/sales
|
||||
NEXT_PUBLIC_LICENSE_CONSENT=''
|
||||
#
|
||||
# To enable enterprise-only features, fill your license key in here.
|
||||
# @see https://console.cal.com
|
||||
CALCOM_LICENSE_KEY=
|
||||
@@ -86,6 +85,9 @@ SENDGRID_EMAIL=
|
||||
TWILIO_SID=
|
||||
TWILIO_TOKEN=
|
||||
TWILIO_MESSAGING_SID=
|
||||
TWILIO_PHONE_NUMBER=
|
||||
NEXT_PUBLIC_SENDER_ID=
|
||||
TWILIO_VERIFY_SID=
|
||||
|
||||
# This is used so we can bypass emails in auth flows for E2E testing
|
||||
# Set it to "1" if you need to run E2E tests locally
|
||||
|
||||
@@ -3,3 +3,10 @@
|
||||
|
||||
automerge:
|
||||
- apps/web/public/static/locales/**/*.json
|
||||
|
||||
"❗️ migrations":
|
||||
- packages/prisma/migrations/**/migration.sql
|
||||
|
||||
"❗️ .env changes":
|
||||
- .env.example
|
||||
- .env.appStore.example
|
||||
|
||||
@@ -12,8 +12,5 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@v4
|
||||
# Checking the actor will prevent your Action run failing on non-Dependabot
|
||||
# PRs but also ensures that it only does work for Dependabot PRs.
|
||||
if: ${{ github.actor == 'github-actions[bot]' }}
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
|
||||
@@ -292,7 +292,7 @@ You can deploy Cal on [Railway](https://railway.app/) using the button above. Th
|
||||
|
||||
Currently Vercel Pro Plan is required to be able to Deploy this application with Vercel, due to limitations on the number of serverless functions on the free plan.
|
||||
|
||||
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fcalcom%2Fcal.com&env=DATABASE_URL,NEXT_PUBLIC_WEBAPP_URL,NEXTAUTH_URL,NEXTAUTH_SECRET,CRON_API_KEY,CALENDSO_ENCRYPTION_KEY,NEXT_PUBLIC_LICENSE_CONSENT&envDescription=See%20all%20available%20env%20vars&envLink=https%3A%2F%2Fgithub.com%2Fcalcom%2Fcal.com%2Fblob%2Fmain%2F.env.example&project-name=cal&repo-name=cal.com&build-command=cd%20../..%20%26%26%20yarn%20build&root-directory=apps%2Fweb%2F)
|
||||
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fcalcom%2Fcal.com&env=DATABASE_URL,NEXT_PUBLIC_WEBAPP_URL,NEXTAUTH_URL,NEXTAUTH_SECRET,CRON_API_KEY,CALENDSO_ENCRYPTION_KEY&envDescription=See%20all%20available%20env%20vars&envLink=https%3A%2F%2Fgithub.com%2Fcalcom%2Fcal.com%2Fblob%2Fmain%2F.env.example&project-name=cal&repo-name=cal.com&build-command=cd%20../..%20%26%26%20yarn%20build&root-directory=apps%2Fweb%2F)
|
||||
|
||||
<!-- ROADMAP -->
|
||||
|
||||
@@ -419,14 +419,18 @@ following
|
||||
2. Click ‘Get a Twilio phone number’
|
||||
3. Copy Account SID to your .env file into the TWILIO_SID field
|
||||
4. Copy Auth Token to your .env file into the TWILIO_TOKEN field
|
||||
5. Create a messaging service (Develop -> Messaging -> Services)
|
||||
6. Choose any name for the messaging service
|
||||
7. Click 'Add Senders'
|
||||
8. Choose phone number as sender type
|
||||
9. Add the listed phone number
|
||||
10. Leave all other fields as they are
|
||||
11. Complete setup and click ‘View my new Messaging Service’
|
||||
12. Copy Messaging Service SID to your .env file into the TWILIO_MESSAGING_SID field
|
||||
5. Copy your Twilio phone number to your .env file into the TWILIO_PHONE_NUMBER field
|
||||
6. Add your own sender id to the .env file into the NEXT_PUBLIC_SENDER_ID field (fallback is Cal)
|
||||
7. Create a messaging service (Develop -> Messaging -> Services)
|
||||
8. Choose any name for the messaging service
|
||||
9. Click 'Add Senders'
|
||||
10. Choose phone number as sender type
|
||||
11. Add the listed phone number
|
||||
12. Leave all other fields as they are
|
||||
13. Complete setup and click ‘View my new Messaging Service’
|
||||
14. Copy Messaging Service SID to your .env file into the TWILIO_MESSAGING_SID field
|
||||
15. Create a verify service
|
||||
16. Copy Verify Service SID to your .env file into the TWILIO_VERIFY_SID field
|
||||
|
||||
<!-- LICENSE -->
|
||||
|
||||
|
||||
@@ -33,11 +33,6 @@
|
||||
"generator": "secret",
|
||||
"required": "true"
|
||||
},
|
||||
"NEXT_PUBLIC_LICENSE_CONSENT": {
|
||||
"description": "License consent",
|
||||
"value": "true",
|
||||
"required": "true"
|
||||
},
|
||||
"CRON_API_KEY": {
|
||||
"description": "ApiKey for cronjobs",
|
||||
"value": ""
|
||||
|
||||
+1
-1
Submodule apps/api updated: 8b74f463f4...604d937661
+1
-1
Submodule apps/console updated: 564f9b2faa...2d577dd9ed
@@ -4,6 +4,7 @@ module.exports = {
|
||||
stories: [
|
||||
"../intro.stories.mdx",
|
||||
"../../../packages/ui/components/**/*.stories.mdx",
|
||||
"../../../packages/features/**/*.stories.mdx",
|
||||
"../../../packages/ui/components/**/*.stories.@(js|jsx|ts|tsx)",
|
||||
],
|
||||
addons: [
|
||||
@@ -50,6 +51,21 @@ module.exports = {
|
||||
vm: false,
|
||||
zlib: false,
|
||||
};
|
||||
|
||||
config.module.rules.push({
|
||||
test: /\.css$/,
|
||||
use: [
|
||||
"style-loader",
|
||||
{
|
||||
loader: "css-loader",
|
||||
options: {
|
||||
modules: true, // Enable modules to help you using className
|
||||
},
|
||||
},
|
||||
],
|
||||
include: path.resolve(__dirname, "../src"),
|
||||
});
|
||||
|
||||
return config;
|
||||
},
|
||||
};
|
||||
|
||||
@@ -15,7 +15,11 @@ export const parameters = {
|
||||
},
|
||||
};
|
||||
|
||||
addDecorator((storyFn) => <I18nextProvider i18n={i18n}>{storyFn()}</I18nextProvider>);
|
||||
addDecorator((storyFn) => (
|
||||
<I18nextProvider i18n={i18n}>
|
||||
<div style={{ margin: "2rem" }}>{storyFn()}</div>
|
||||
</I18nextProvider>
|
||||
));
|
||||
|
||||
window.getEmbedNamespace = () => {
|
||||
const url = new URL(document.URL);
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@import "../../../packages/ui/styles/shared-globals.css"
|
||||
@import "../../../packages/ui/styles/shared-globals.css"
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
@import url("../../../packages/features/calendars/weeklyview/styles/styles.css");
|
||||
|
||||
.sbdocs {
|
||||
font-family: 'Inter var' !important;
|
||||
padding: 0!important;
|
||||
@@ -36,7 +38,7 @@
|
||||
|
||||
/** Docs table **/
|
||||
.custom-args-wrapper{
|
||||
max-height: 600px;
|
||||
max-height: 400px;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
margin-bottom: 1rem;
|
||||
@@ -187,3 +189,7 @@
|
||||
padding: 24px !important;
|
||||
}
|
||||
}
|
||||
|
||||
.docs-story {
|
||||
padding: 24px !important;
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ type PreviewState = {
|
||||
palette: {
|
||||
brandColor: string;
|
||||
};
|
||||
hideEventTypeDetails: boolean;
|
||||
};
|
||||
const queryParamsForDialog = ["embedType", "embedTabName", "embedUrl"];
|
||||
|
||||
@@ -125,10 +126,12 @@ const getEmbedUIInstructionString = ({
|
||||
apiName,
|
||||
theme,
|
||||
brandColor,
|
||||
hideEventTypeDetails,
|
||||
}: {
|
||||
apiName: string;
|
||||
theme?: string;
|
||||
brandColor: string;
|
||||
hideEventTypeDetails: boolean;
|
||||
}) => {
|
||||
theme = theme !== "auto" ? theme : undefined;
|
||||
return getInstructionString({
|
||||
@@ -141,6 +144,7 @@ const getEmbedUIInstructionString = ({
|
||||
brandColor,
|
||||
},
|
||||
},
|
||||
hideEventTypeDetails: hideEventTypeDetails,
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -253,18 +257,21 @@ const getEmbedTypeSpecificString = ({
|
||||
apiName: string;
|
||||
theme: PreviewState["theme"];
|
||||
brandColor: string;
|
||||
hideEventTypeDetails: boolean;
|
||||
};
|
||||
if (embedFramework === "react") {
|
||||
uiInstructionStringArg = {
|
||||
apiName: "cal",
|
||||
theme: previewState.theme,
|
||||
brandColor: previewState.palette.brandColor,
|
||||
hideEventTypeDetails: previewState.hideEventTypeDetails,
|
||||
};
|
||||
} else {
|
||||
uiInstructionStringArg = {
|
||||
apiName: "Cal",
|
||||
theme: previewState.theme,
|
||||
brandColor: previewState.palette.brandColor,
|
||||
hideEventTypeDetails: previewState.hideEventTypeDetails,
|
||||
};
|
||||
}
|
||||
if (!frameworkCodes[embedType]) {
|
||||
@@ -689,6 +696,7 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
theme: Theme.auto,
|
||||
floatingPopup: {},
|
||||
elementClick: {},
|
||||
hideEventTypeDetails: false,
|
||||
palette: {
|
||||
brandColor: "#000000",
|
||||
},
|
||||
@@ -753,6 +761,7 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
name: "ui",
|
||||
arg: {
|
||||
theme: previewState.theme,
|
||||
hideEventTypeDetails: previewState.hideEventTypeDetails,
|
||||
styles: {
|
||||
branding: {
|
||||
...previewState.palette,
|
||||
@@ -811,7 +820,7 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
{embed.title}
|
||||
</h3>
|
||||
<hr className={classNames("mt-4", embedType === "element-click" ? "hidden" : "")} />
|
||||
<div className="max-h-97 flex flex-col overflow-y-auto">
|
||||
<div className="flex flex-col overflow-y-auto">
|
||||
<div className={classNames("mt-4 font-medium", embedType === "element-click" ? "hidden" : "")}>
|
||||
<Collapsible
|
||||
open={isEmbedCustomizationOpen}
|
||||
@@ -838,7 +847,6 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
<div className="text-sm">Embed Window Sizing</div>
|
||||
<div className="justify-left flex items-center">
|
||||
<TextField
|
||||
name="width"
|
||||
labelProps={{ className: "hidden" }}
|
||||
required
|
||||
value={previewState.inline.width}
|
||||
@@ -860,7 +868,6 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
<span className="p-2">×</span>
|
||||
<TextField
|
||||
labelProps={{ className: "hidden" }}
|
||||
name="height"
|
||||
value={previewState.inline.height}
|
||||
required
|
||||
onChange={(e) => {
|
||||
@@ -888,7 +895,6 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
<div className="mb-2 text-sm">Button Text</div>
|
||||
{/* Default Values should come from preview iframe */}
|
||||
<TextField
|
||||
name="buttonText"
|
||||
labelProps={{ className: "hidden" }}
|
||||
onChange={(e) => {
|
||||
setPreviewState((previewState) => {
|
||||
@@ -1004,6 +1010,20 @@ const EmbedTypeCodeAndPreviewDialogContent = ({
|
||||
</CollapsibleTrigger>
|
||||
<CollapsibleContent>
|
||||
<div className="mt-6 text-sm">
|
||||
<div className="mb-4 flex items-center justify-start space-x-2">
|
||||
<Switch
|
||||
checked={previewState.hideEventTypeDetails}
|
||||
onCheckedChange={(checked) => {
|
||||
setPreviewState((previewState) => {
|
||||
return {
|
||||
...previewState,
|
||||
hideEventTypeDetails: checked,
|
||||
};
|
||||
});
|
||||
}}
|
||||
/>
|
||||
<div className="text-sm">{t("hide_eventtype_details")}</div>
|
||||
</div>
|
||||
<Label className="">
|
||||
<div className="mb-2">Theme</div>
|
||||
<Select
|
||||
|
||||
@@ -66,7 +66,9 @@ const Component = ({
|
||||
}
|
||||
);
|
||||
|
||||
const allowedMultipleInstalls = categories.indexOf("calendar") > -1;
|
||||
// variant not other allows, an app to be shown in calendar category without requiring an actual calendar connection e.g. vimcal
|
||||
// Such apps, can only be installed once.
|
||||
const allowedMultipleInstalls = categories.indexOf("calendar") > -1 && variant !== "other";
|
||||
|
||||
return (
|
||||
<div className="relative flex-1 flex-col items-start justify-start px-4 md:flex md:px-8 lg:flex-row lg:px-0">
|
||||
|
||||
@@ -159,6 +159,7 @@ function ConnectedCalendarsList(props: Props) {
|
||||
if (!data.connectedCalendars.length) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<List className="flex flex-col gap-6" noBorderTreatment>
|
||||
{data.connectedCalendars.map((item) => (
|
||||
@@ -168,7 +169,7 @@ function ConnectedCalendarsList(props: Props) {
|
||||
slug={item.integration.slug}
|
||||
title={item.integration.title}
|
||||
logo={item.integration.logo}
|
||||
description={item.primary?.externalId || "No external Id"}
|
||||
description={item.primary?.email ?? item.integration.description}
|
||||
separate={true}
|
||||
actions={
|
||||
<div className="flex w-32 justify-end">
|
||||
|
||||
@@ -44,7 +44,7 @@ function IntegrationListItem(props: {
|
||||
expanded={!!props.children}
|
||||
className={classNames(
|
||||
props.separate ? "rounded-md" : "first:rounded-t-md last:rounded-b-md",
|
||||
"my-0 flex-col border transition-colors duration-500 ",
|
||||
"my-0 flex-col border transition-colors duration-500",
|
||||
highlight ? "bg-yellow-100" : ""
|
||||
)}>
|
||||
<div className={classNames("flex w-full flex-1 items-center space-x-2 p-4 rtl:space-x-reverse")}>
|
||||
|
||||
@@ -57,7 +57,7 @@ const AvailableTimes: FC<AvailableTimesProps> = ({
|
||||
{nameOfDay(i18n.language, Number(date.format("d")), "short")}
|
||||
</span>
|
||||
<span className="text-bookinglight font-medium">
|
||||
, {date.toDate().toLocaleString(i18n.language, { month: "long" })} {date.format(" D ")}
|
||||
, {date.toDate().toLocaleString(i18n.language, { month: "short" })} {date.format(" D ")}
|
||||
</span>
|
||||
</div>
|
||||
<div className="ml-auto">
|
||||
@@ -101,7 +101,8 @@ const AvailableTimes: FC<AvailableTimesProps> = ({
|
||||
}
|
||||
|
||||
return (
|
||||
<div key={dayjs(slot.time).format()}>
|
||||
<div data-slot-owner={(slot.userIds || []).join(",")} key={`${dayjs(slot.time).format()}`}>
|
||||
{/* ^ data-slot-owner is helpful in debugging and used to identify the owners of the slot. Owners are the users which have the timeslot in their schedule. It doesn't consider if a user has that timeslot booked */}
|
||||
{/* Current there is no way to disable Next.js Links */}
|
||||
{seatsPerTimeSlot && slot.attendees && slot.attendees >= seatsPerTimeSlot ? (
|
||||
<div
|
||||
|
||||
@@ -44,18 +44,17 @@ const BookingDescription: FC<Props> = (props) => {
|
||||
const { profile, eventType, isBookingPage = false, children } = props;
|
||||
const { date: bookingDate } = useRouterQuery("date");
|
||||
const { t } = useLocale();
|
||||
const { duration, setQuery: setDuration } = useRouterQuery("duration");
|
||||
const { duration = eventType.length.toString(), setQuery: setDuration } = useRouterQuery("duration");
|
||||
|
||||
useEffect(() => {
|
||||
if (eventType.metadata?.multipleDuration !== undefined) {
|
||||
if (!duration) {
|
||||
setDuration(eventType.length);
|
||||
} else {
|
||||
if (!eventType.metadata?.multipleDuration.includes(Number(duration))) {
|
||||
setDuration(eventType.length);
|
||||
}
|
||||
}
|
||||
if (
|
||||
eventType.metadata?.multipleDuration &&
|
||||
!eventType.metadata?.multipleDuration?.includes(Number(duration))
|
||||
) {
|
||||
setDuration(eventType.length.toString());
|
||||
}
|
||||
}, []);
|
||||
}, [duration, setDuration, eventType.length, eventType.metadata?.multipleDuration]);
|
||||
|
||||
let requiresConfirmation = eventType?.requiresConfirmation;
|
||||
let requiresConfirmationText = t("requires_confirmation");
|
||||
const rcThreshold = eventType?.metadata?.requiresConfirmationThreshold;
|
||||
|
||||
@@ -23,14 +23,14 @@ import {
|
||||
TextArea,
|
||||
Tooltip,
|
||||
} from "@calcom/ui";
|
||||
import { ActionType, TableActions } from "@calcom/ui";
|
||||
|
||||
import useMeQuery from "@lib/hooks/useMeQuery";
|
||||
|
||||
import { EditLocationDialog } from "@components/dialog/EditLocationDialog";
|
||||
import { RescheduleDialog } from "@components/dialog/RescheduleDialog";
|
||||
import TableActions, { ActionType } from "@components/ui/TableActions";
|
||||
|
||||
type BookingListingStatus = RouterInputs["viewer"]["bookings"]["get"]["status"];
|
||||
type BookingListingStatus = RouterInputs["viewer"]["bookings"]["get"]["filters"]["status"];
|
||||
|
||||
type BookingItem = RouterOutputs["viewer"]["bookings"]["get"]["bookings"][number];
|
||||
|
||||
@@ -158,6 +158,10 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
bookedActions = bookedActions.filter((action) => action.id !== "edit_booking");
|
||||
}
|
||||
|
||||
if (isPast && isPending && !isConfirmed) {
|
||||
bookedActions = bookedActions.filter((action) => action.id !== "cancel");
|
||||
}
|
||||
|
||||
const RequestSentMessage = () => {
|
||||
return (
|
||||
<div className="ml-1 mr-8 flex text-gray-500" data-testid="request_reschedule_sent">
|
||||
@@ -248,7 +252,7 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
|
||||
<tr className="flex flex-col hover:bg-neutral-50 sm:flex-row">
|
||||
<tr className="group flex flex-col hover:bg-neutral-50 sm:flex-row">
|
||||
<td
|
||||
className="hidden align-top ltr:pl-6 rtl:pr-6 sm:table-cell sm:min-w-[12rem]"
|
||||
onClick={onClickTableData}>
|
||||
@@ -275,11 +279,6 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
{booking.eventType.team.name}
|
||||
</Badge>
|
||||
)}
|
||||
{!!booking?.eventType?.price && !booking.paid && (
|
||||
<Badge className="ltr:mr-2 rtl:ml-2" variant="orange">
|
||||
{t("pending_payment")}
|
||||
</Badge>
|
||||
)}
|
||||
{booking.paid && (
|
||||
<Badge className="ltr:mr-2 rtl:ml-2" variant="green">
|
||||
{t("paid")}
|
||||
@@ -343,12 +342,14 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
<span> </span>
|
||||
|
||||
{!!booking?.eventType?.price && !booking.paid && (
|
||||
<Tag className="hidden ltr:ml-2 rtl:mr-2 sm:inline-flex">Pending payment</Tag>
|
||||
<Badge className="hidden ltr:ml-2 rtl:mr-2 sm:inline-flex" variant="orange">
|
||||
{t("pending_payment")}
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
{booking.description && (
|
||||
<div
|
||||
className="max-w-10/12 sm:max-w-40 md:max-w-56 xl:max-w-80 lg:max-w-64 truncate text-sm text-gray-600"
|
||||
className="max-w-10/12 sm:max-w-32 md:max-w-52 xl:max-w-80 truncate text-sm text-gray-600"
|
||||
title={booking.description}>
|
||||
"{booking.description}"
|
||||
</div>
|
||||
@@ -531,13 +532,4 @@ const DisplayAttendees = ({
|
||||
);
|
||||
};
|
||||
|
||||
const Tag = ({ children, className = "" }: React.PropsWithChildren<{ className?: string }>) => {
|
||||
return (
|
||||
<span
|
||||
className={`inline-flex items-center rounded-sm bg-yellow-100 px-1.5 py-0.5 text-xs font-medium text-yellow-800 ${className}`}>
|
||||
{children}
|
||||
</span>
|
||||
);
|
||||
};
|
||||
|
||||
export default BookingListItem;
|
||||
|
||||
@@ -13,9 +13,11 @@ import dayjs, { Dayjs } from "@calcom/dayjs";
|
||||
import {
|
||||
useEmbedNonStylesConfig,
|
||||
useEmbedStyles,
|
||||
useEmbedUiConfig,
|
||||
useIsBackgroundTransparent,
|
||||
useIsEmbed,
|
||||
} from "@calcom/embed-core/embed-iframe";
|
||||
import DatePicker from "@calcom/features/calendars/DatePicker";
|
||||
import CustomBranding from "@calcom/lib/CustomBranding";
|
||||
import classNames from "@calcom/lib/classNames";
|
||||
import getStripeAppData from "@calcom/lib/getStripeAppData";
|
||||
@@ -26,7 +28,7 @@ import { getRecurringFreq } from "@calcom/lib/recurringStrings";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import { detectBrowserTimeFormat, setIs24hClockInLocalStorage, TimeFormat } from "@calcom/lib/timeFormat";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Icon, DatePicker } from "@calcom/ui";
|
||||
import { Icon } from "@calcom/ui";
|
||||
|
||||
import { timeZone as localStorageTimeZone } from "@lib/clock";
|
||||
import useRouterQuery from "@lib/hooks/useRouterQuery";
|
||||
@@ -150,7 +152,10 @@ const SlotPicker = ({
|
||||
eventTypeId: eventType.id,
|
||||
eventTypeSlug: eventType.slug,
|
||||
usernameList: users,
|
||||
startTime: browsingDate?.startOf("month"),
|
||||
startTime:
|
||||
browsingDate === undefined || browsingDate.get("month") === dayjs.tz(undefined, timeZone).get("month")
|
||||
? dayjs.tz(undefined, timeZone).subtract(2, "days").startOf("day")
|
||||
: browsingDate?.startOf("month"),
|
||||
endTime: browsingDate?.endOf("month"),
|
||||
timeZone,
|
||||
duration,
|
||||
@@ -253,6 +258,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
|
||||
useTheme(profile.theme);
|
||||
const { t } = useLocale();
|
||||
const availabilityDatePickerEmbedStyles = useEmbedStyles("availabilityDatePicker");
|
||||
//TODO: Plan to remove shouldAlignCentrallyInEmbed config
|
||||
const shouldAlignCentrallyInEmbed = useEmbedNonStylesConfig("align") !== "left";
|
||||
const shouldAlignCentrally = !isEmbed || shouldAlignCentrallyInEmbed;
|
||||
const isBackgroundTransparent = useIsBackgroundTransparent();
|
||||
@@ -289,7 +295,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
|
||||
);
|
||||
}
|
||||
}, [telemetry]);
|
||||
|
||||
const embedUiConfig = useEmbedUiConfig();
|
||||
// get dynamic user list here
|
||||
const userList = eventType.users ? eventType.users.map((user) => user.username).filter(notEmpty) : [];
|
||||
|
||||
@@ -302,6 +308,8 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
|
||||
const rawSlug = profile.slug ? profile.slug.split("/") : [];
|
||||
if (rawSlug.length > 1) rawSlug.pop(); //team events have team name as slug, but user events have [user]/[type] as slug.
|
||||
|
||||
const showEventTypeDetails = (isEmbed && !embedUiConfig.hideEventTypeDetails) || !isEmbed;
|
||||
|
||||
// Define conditional gates here
|
||||
const gates = [
|
||||
// Rainbow gate is only added if the event has both a `blockchainId` and a `smartContractAddress`
|
||||
@@ -335,7 +343,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
|
||||
<div>
|
||||
<main
|
||||
className={classNames(
|
||||
"flex-col md:mx-4 lg:flex",
|
||||
"flex flex-col md:mx-4",
|
||||
shouldAlignCentrally ? "items-center" : "items-start",
|
||||
!isEmbed && classNames("mx-auto my-0 ease-in-out md:my-24")
|
||||
)}>
|
||||
@@ -350,54 +358,55 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
|
||||
isEmbed && "mx-auto"
|
||||
)}>
|
||||
<div className="overflow-hidden md:flex">
|
||||
<div
|
||||
className={classNames(
|
||||
"sm:dark:border-darkgray-200 flex flex-col border-gray-200 p-5 sm:border-r",
|
||||
"min-w-full md:w-[230px] md:min-w-[230px]",
|
||||
recurringEventCount && "xl:w-[380px] xl:min-w-[380px]"
|
||||
)}>
|
||||
<BookingDescription profile={profile} eventType={eventType} rescheduleUid={rescheduleUid}>
|
||||
{!rescheduleUid && eventType.recurringEvent && (
|
||||
<div className="flex items-start text-sm font-medium">
|
||||
<Icon.FiRefreshCcw className="float-left mr-[10px] mt-[7px] ml-[2px] inline-block h-4 w-4 " />
|
||||
<div>
|
||||
<p className="mb-1 -ml-2 inline px-2 py-1">
|
||||
{getRecurringFreq({ t, recurringEvent: eventType.recurringEvent })}
|
||||
</p>
|
||||
<input
|
||||
type="number"
|
||||
min="1"
|
||||
max={eventType.recurringEvent.count}
|
||||
className="w-15 dark:bg-darkgray-200 h-7 rounded-sm border-gray-300 bg-white text-sm font-medium [appearance:textfield] ltr:mr-2 rtl:ml-2 dark:border-gray-500"
|
||||
defaultValue={eventType.recurringEvent.count}
|
||||
onChange={(event) => {
|
||||
setRecurringEventCount(parseInt(event?.target.value));
|
||||
}}
|
||||
/>
|
||||
<p className="inline">
|
||||
{t("occurrence", {
|
||||
count: recurringEventCount,
|
||||
})}
|
||||
</p>
|
||||
{showEventTypeDetails && (
|
||||
<div
|
||||
className={classNames(
|
||||
"sm:dark:border-darkgray-200 flex flex-col border-gray-200 p-5 sm:border-r",
|
||||
"min-w-full md:w-[230px] md:min-w-[230px]",
|
||||
recurringEventCount && "xl:w-[380px] xl:min-w-[380px]"
|
||||
)}>
|
||||
<BookingDescription profile={profile} eventType={eventType} rescheduleUid={rescheduleUid}>
|
||||
{!rescheduleUid && eventType.recurringEvent && (
|
||||
<div className="flex items-start text-sm font-medium">
|
||||
<Icon.FiRefreshCcw className="float-left mr-[10px] mt-[7px] ml-[2px] inline-block h-4 w-4 " />
|
||||
<div>
|
||||
<p className="mb-1 -ml-2 inline px-2 py-1">
|
||||
{getRecurringFreq({ t, recurringEvent: eventType.recurringEvent })}
|
||||
</p>
|
||||
<input
|
||||
type="number"
|
||||
min="1"
|
||||
max={eventType.recurringEvent.count}
|
||||
className="w-15 dark:bg-darkgray-200 h-7 rounded-sm border-gray-300 bg-white text-sm font-medium [appearance:textfield] ltr:mr-2 rtl:ml-2 dark:border-gray-500"
|
||||
defaultValue={eventType.recurringEvent.count}
|
||||
onChange={(event) => {
|
||||
setRecurringEventCount(parseInt(event?.target.value));
|
||||
}}
|
||||
/>
|
||||
<p className="inline">
|
||||
{t("occurrence", {
|
||||
count: recurringEventCount,
|
||||
})}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{stripeAppData.price > 0 && (
|
||||
<p className="-ml-2 px-2 text-sm font-medium">
|
||||
<Icon.FiCreditCard className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
<IntlProvider locale="en">
|
||||
<FormattedNumber
|
||||
value={stripeAppData.price / 100.0}
|
||||
style="currency"
|
||||
currency={stripeAppData.currency.toUpperCase()}
|
||||
/>
|
||||
</IntlProvider>
|
||||
</p>
|
||||
)}
|
||||
{timezoneDropdown}
|
||||
</BookingDescription>
|
||||
)}
|
||||
{stripeAppData.price > 0 && (
|
||||
<p className="-ml-2 px-2 text-sm font-medium">
|
||||
<Icon.FiCreditCard className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
<IntlProvider locale="en">
|
||||
<FormattedNumber
|
||||
value={stripeAppData.price / 100.0}
|
||||
style="currency"
|
||||
currency={stripeAppData.currency.toUpperCase()}
|
||||
/>
|
||||
</IntlProvider>
|
||||
</p>
|
||||
)}
|
||||
{timezoneDropdown}
|
||||
</BookingDescription>
|
||||
|
||||
{/* Temporarily disabled - booking?.startTime && rescheduleUid && (
|
||||
{/* Temporarily disabled - booking?.startTime && rescheduleUid && (
|
||||
<div>
|
||||
<p
|
||||
className="mt-4 mb-3 text-gray-600 dark:text-darkgray-600"
|
||||
@@ -410,7 +419,8 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
|
||||
</p>
|
||||
</div>
|
||||
)*/}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<SlotPicker
|
||||
weekStart={
|
||||
typeof profile.weekStart === "string"
|
||||
@@ -436,7 +446,8 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{(!restProps.isBrandingHidden || isEmbed) && <PoweredByCal />}
|
||||
{/* FIXME: We don't show branding in Embed yet because we need to place branding on top of the main content. Keeping it outside the main content would have visibility issues because outside main content background is transparent */}
|
||||
{!restProps.isBrandingHidden && !isEmbed && <PoweredByCal />}
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
@@ -26,6 +26,7 @@ import { LocationObject, LocationType } from "@calcom/core/location";
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import {
|
||||
useEmbedNonStylesConfig,
|
||||
useEmbedUiConfig,
|
||||
useIsBackgroundTransparent,
|
||||
useIsEmbed,
|
||||
} from "@calcom/embed-core/embed-iframe";
|
||||
@@ -89,6 +90,7 @@ const BookingPage = ({
|
||||
const { t, i18n } = useLocale();
|
||||
const { duration: queryDuration } = useRouterQuery("duration");
|
||||
const isEmbed = useIsEmbed(restProps.isEmbed);
|
||||
const embedUiConfig = useEmbedUiConfig();
|
||||
const shouldAlignCentrallyInEmbed = useEmbedNonStylesConfig("align") !== "left";
|
||||
const shouldAlignCentrally = !isEmbed || shouldAlignCentrallyInEmbed;
|
||||
const router = useRouter();
|
||||
@@ -141,6 +143,7 @@ const BookingPage = ({
|
||||
isSuccessBookingPage: true,
|
||||
email: bookingForm.getValues("email"),
|
||||
eventTypeSlug: eventType.slug,
|
||||
formerTime: booking?.startTime.toString(),
|
||||
},
|
||||
});
|
||||
},
|
||||
@@ -156,6 +159,7 @@ const BookingPage = ({
|
||||
allRemainingBookings: true,
|
||||
email: bookingForm.getValues("email"),
|
||||
eventTypeSlug: eventType.slug,
|
||||
formerTime: booking?.startTime.toString(),
|
||||
},
|
||||
});
|
||||
},
|
||||
@@ -297,6 +301,39 @@ const BookingPage = ({
|
||||
}
|
||||
|
||||
const bookEvent = (booking: BookingFormValues) => {
|
||||
const bookingCustomInputs = Object.keys(booking.customInputs || {}).map((inputId) => ({
|
||||
label: eventType.customInputs.find((input) => input.id === parseInt(inputId))?.label || "",
|
||||
value: booking.customInputs && booking.customInputs[inputId] ? booking.customInputs[inputId] : "",
|
||||
}));
|
||||
|
||||
// Checking if custom inputs of type Phone number are valid to display error message on UI
|
||||
if (eventType.customInputs.length) {
|
||||
let isErrorFound = false;
|
||||
eventType.customInputs.forEach((customInput) => {
|
||||
if (customInput.required && customInput.type === EventTypeCustomInputType.PHONE) {
|
||||
const input = bookingCustomInputs.find((i) => i.label === customInput.label);
|
||||
try {
|
||||
z.string({
|
||||
errorMap: () => ({
|
||||
message: `Missing ${customInput.type} customInput: '${customInput.label}'`,
|
||||
}),
|
||||
})
|
||||
.refine((val) => isValidPhoneNumber(val), {
|
||||
message: "Phone number is invalid",
|
||||
})
|
||||
.parse(input?.value);
|
||||
} catch (err) {
|
||||
isErrorFound = true;
|
||||
bookingForm.setError(`customInputs.${customInput.id}`, {
|
||||
type: "custom",
|
||||
message: "Invalid Phone number",
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
if (isErrorFound) return;
|
||||
}
|
||||
|
||||
telemetry.event(
|
||||
top !== window ? telemetryEventTypes.embedBookingConfirmed : telemetryEventTypes.bookingConfirmed,
|
||||
{ isTeamBooking: document.URL.includes("team/") }
|
||||
@@ -315,6 +352,22 @@ const BookingPage = ({
|
||||
{}
|
||||
);
|
||||
|
||||
if (eventType.customInputs.length > 0) {
|
||||
// find all required custom inputs and ensure they are filled out in the booking form
|
||||
const requiredCustomInputs = eventType.customInputs.filter((input) => input.required);
|
||||
const missingRequiredCustomInputs = requiredCustomInputs.filter(
|
||||
(input) => !booking?.customInputs?.[input.id]
|
||||
);
|
||||
if (missingRequiredCustomInputs.length > 0) {
|
||||
missingRequiredCustomInputs.forEach((input) => {
|
||||
bookingForm.setError(`customInputs.${input.id}`, {
|
||||
type: "required",
|
||||
});
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (recurringDates.length) {
|
||||
// Identify set of bookings to one intance of recurring event to support batch changes
|
||||
const recurringEventId = uuidv4();
|
||||
@@ -337,10 +390,7 @@ const BookingPage = ({
|
||||
attendeeAddress: booking.attendeeAddress,
|
||||
}),
|
||||
metadata,
|
||||
customInputs: Object.keys(booking.customInputs || {}).map((inputId) => ({
|
||||
label: eventType.customInputs.find((input) => input.id === parseInt(inputId))?.label || "",
|
||||
value: booking.customInputs && inputId in booking.customInputs ? booking.customInputs[inputId] : "",
|
||||
})),
|
||||
customInputs: bookingCustomInputs,
|
||||
hasHashedBookingLink,
|
||||
hashedLink,
|
||||
smsReminderNumber:
|
||||
@@ -368,10 +418,7 @@ const BookingPage = ({
|
||||
attendeeAddress: booking.attendeeAddress,
|
||||
}),
|
||||
metadata,
|
||||
customInputs: Object.keys(booking.customInputs || {}).map((inputId) => ({
|
||||
label: eventType.customInputs.find((input) => input.id === parseInt(inputId))?.label || "",
|
||||
value: booking.customInputs && inputId in booking.customInputs ? booking.customInputs[inputId] : "",
|
||||
})),
|
||||
customInputs: bookingCustomInputs,
|
||||
hasHashedBookingLink,
|
||||
hashedLink,
|
||||
smsReminderNumber:
|
||||
@@ -406,6 +453,7 @@ const BookingPage = ({
|
||||
}
|
||||
});
|
||||
}
|
||||
const showEventTypeDetails = (isEmbed && !embedUiConfig.hideEventTypeDetails) || !isEmbed;
|
||||
const rainbowAppData = getEventTypeAppData(eventType, "rainbow") || {};
|
||||
|
||||
// Define conditional gates here
|
||||
@@ -439,7 +487,7 @@ const BookingPage = ({
|
||||
className={classNames(
|
||||
shouldAlignCentrally ? "mx-auto" : "",
|
||||
isEmbed ? "" : "sm:my-24",
|
||||
"my-0 max-w-3xl "
|
||||
"my-0 max-w-3xl"
|
||||
)}>
|
||||
<div
|
||||
className={classNames(
|
||||
@@ -448,95 +496,97 @@ const BookingPage = ({
|
||||
"dark:border-darkgray-300 rounded-md sm:border"
|
||||
)}>
|
||||
<div className="sm:flex">
|
||||
<div className="sm:dark:border-darkgray-300 dark:text-darkgray-600 flex flex-col px-6 pt-6 pb-0 text-gray-600 sm:w-1/2 sm:border-r sm:pb-6">
|
||||
<BookingDescription isBookingPage profile={profile} eventType={eventType}>
|
||||
{stripeAppData.price > 0 && (
|
||||
<p className="text-bookinglight -ml-2 px-2 text-sm ">
|
||||
<Icon.FiCreditCard className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
<IntlProvider locale="en">
|
||||
<FormattedNumber
|
||||
value={stripeAppData.price / 100.0}
|
||||
style="currency"
|
||||
currency={stripeAppData.currency.toUpperCase()}
|
||||
/>
|
||||
</IntlProvider>
|
||||
</p>
|
||||
)}
|
||||
{!rescheduleUid && eventType.recurringEvent?.freq && recurringEventCount && (
|
||||
<div className="items-start text-sm font-medium text-gray-600 dark:text-white">
|
||||
<Icon.FiRefreshCw className="mr-[10px] ml-[2px] inline-block h-4 w-4" />
|
||||
<p className="-ml-2 inline-block items-center px-2">
|
||||
{getEveryFreqFor({
|
||||
t,
|
||||
recurringEvent: eventType.recurringEvent,
|
||||
recurringCount: recurringEventCount,
|
||||
})}
|
||||
{showEventTypeDetails && (
|
||||
<div className="sm:dark:border-darkgray-300 dark:text-darkgray-600 flex flex-col px-6 pt-6 pb-0 text-gray-600 sm:w-1/2 sm:border-r sm:pb-6">
|
||||
<BookingDescription isBookingPage profile={profile} eventType={eventType}>
|
||||
{stripeAppData.price > 0 && (
|
||||
<p className="text-bookinglight -ml-2 px-2 text-sm ">
|
||||
<Icon.FiCreditCard className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
<IntlProvider locale="en">
|
||||
<FormattedNumber
|
||||
value={stripeAppData.price / 100.0}
|
||||
style="currency"
|
||||
currency={stripeAppData.currency.toUpperCase()}
|
||||
/>
|
||||
</IntlProvider>
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
<div className="text-bookinghighlight flex items-start text-sm">
|
||||
<Icon.FiCalendar className="mr-[10px] ml-[2px] mt-[2px] inline-block h-4 w-4" />
|
||||
<div className="text-sm font-medium">
|
||||
{(rescheduleUid || !eventType.recurringEvent?.freq) && `${parseDate(date, i18n)}`}
|
||||
{!rescheduleUid &&
|
||||
eventType.recurringEvent?.freq &&
|
||||
recurringStrings.slice(0, 5).map((timeFormatted, key) => {
|
||||
return <p key={key}>{timeFormatted}</p>;
|
||||
})}
|
||||
{!rescheduleUid && eventType.recurringEvent?.freq && recurringStrings.length > 5 && (
|
||||
<div className="flex">
|
||||
<Tooltip
|
||||
content={recurringStrings.slice(5).map((timeFormatted, key) => (
|
||||
<p key={key}>{timeFormatted}</p>
|
||||
))}>
|
||||
<p className="dark:text-darkgray-600 text-sm">
|
||||
+ {t("plus_more", { count: recurringStrings.length - 5 })}
|
||||
</p>
|
||||
</Tooltip>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
{booking?.startTime && rescheduleUid && (
|
||||
<div>
|
||||
<p className="mt-8 mb-2 text-sm " data-testid="former_time_p">
|
||||
{t("former_time")}
|
||||
</p>
|
||||
<p className="line-through ">
|
||||
<Icon.FiCalendar className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
{typeof booking.startTime === "string" && parseDate(dayjs(booking.startTime), i18n)}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
{!!eventType.seatsPerTimeSlot && (
|
||||
)}
|
||||
{!rescheduleUid && eventType.recurringEvent?.freq && recurringEventCount && (
|
||||
<div className="items-start text-sm font-medium text-gray-600 dark:text-white">
|
||||
<Icon.FiRefreshCw className="mr-[10px] ml-[2px] inline-block h-4 w-4" />
|
||||
<p className="-ml-2 inline-block items-center px-2">
|
||||
{getEveryFreqFor({
|
||||
t,
|
||||
recurringEvent: eventType.recurringEvent,
|
||||
recurringCount: recurringEventCount,
|
||||
})}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
<div className="text-bookinghighlight flex items-start text-sm">
|
||||
<Icon.FiUser
|
||||
className={`mr-[10px] ml-[2px] mt-[2px] inline-block h-4 w-4 ${
|
||||
booking && booking.attendees.length / eventType.seatsPerTimeSlot >= 0.5
|
||||
? "text-rose-600"
|
||||
: booking && booking.attendees.length / eventType.seatsPerTimeSlot >= 0.33
|
||||
? "text-yellow-500"
|
||||
: "text-bookinghighlight"
|
||||
}`}
|
||||
/>
|
||||
<p
|
||||
className={`${
|
||||
booking && booking.attendees.length / eventType.seatsPerTimeSlot >= 0.5
|
||||
? "text-rose-600"
|
||||
: booking && booking.attendees.length / eventType.seatsPerTimeSlot >= 0.33
|
||||
? "text-yellow-500"
|
||||
: "text-bookinghighlight"
|
||||
} mb-2 font-medium`}>
|
||||
{booking
|
||||
? eventType.seatsPerTimeSlot - booking.attendees.length
|
||||
: eventType.seatsPerTimeSlot}{" "}
|
||||
/ {eventType.seatsPerTimeSlot} {t("seats_available")}
|
||||
</p>
|
||||
<Icon.FiCalendar className="mr-[10px] ml-[2px] mt-[2px] inline-block h-4 w-4" />
|
||||
<div className="text-sm font-medium">
|
||||
{(rescheduleUid || !eventType.recurringEvent?.freq) && `${parseDate(date, i18n)}`}
|
||||
{!rescheduleUid &&
|
||||
eventType.recurringEvent?.freq &&
|
||||
recurringStrings.slice(0, 5).map((timeFormatted, key) => {
|
||||
return <p key={key}>{timeFormatted}</p>;
|
||||
})}
|
||||
{!rescheduleUid && eventType.recurringEvent?.freq && recurringStrings.length > 5 && (
|
||||
<div className="flex">
|
||||
<Tooltip
|
||||
content={recurringStrings.slice(5).map((timeFormatted, key) => (
|
||||
<p key={key}>{timeFormatted}</p>
|
||||
))}>
|
||||
<p className="dark:text-darkgray-600 text-sm">
|
||||
+ {t("plus_more", { count: recurringStrings.length - 5 })}
|
||||
</p>
|
||||
</Tooltip>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</BookingDescription>
|
||||
</div>
|
||||
<div className="p-6 sm:w-1/2">
|
||||
{booking?.startTime && rescheduleUid && (
|
||||
<div>
|
||||
<p className="mt-8 mb-2 text-sm " data-testid="former_time_p">
|
||||
{t("former_time")}
|
||||
</p>
|
||||
<p className="line-through ">
|
||||
<Icon.FiCalendar className="mr-[10px] ml-[2px] -mt-1 inline-block h-4 w-4" />
|
||||
{typeof booking.startTime === "string" && parseDate(dayjs(booking.startTime), i18n)}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
{!!eventType.seatsPerTimeSlot && (
|
||||
<div className="text-bookinghighlight flex items-start text-sm">
|
||||
<Icon.FiUser
|
||||
className={`mr-[10px] ml-[2px] mt-[2px] inline-block h-4 w-4 ${
|
||||
booking && booking.attendees.length / eventType.seatsPerTimeSlot >= 0.5
|
||||
? "text-rose-600"
|
||||
: booking && booking.attendees.length / eventType.seatsPerTimeSlot >= 0.33
|
||||
? "text-yellow-500"
|
||||
: "text-bookinghighlight"
|
||||
}`}
|
||||
/>
|
||||
<p
|
||||
className={`${
|
||||
booking && booking.attendees.length / eventType.seatsPerTimeSlot >= 0.5
|
||||
? "text-rose-600"
|
||||
: booking && booking.attendees.length / eventType.seatsPerTimeSlot >= 0.33
|
||||
? "text-yellow-500"
|
||||
: "text-bookinghighlight"
|
||||
} mb-2 font-medium`}>
|
||||
{booking
|
||||
? eventType.seatsPerTimeSlot - booking.attendees.length
|
||||
: eventType.seatsPerTimeSlot}{" "}
|
||||
/ {eventType.seatsPerTimeSlot} {t("seats_available")}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</BookingDescription>
|
||||
</div>
|
||||
)}
|
||||
<div className={classNames("p-6", showEventTypeDetails ? "sm:w-1/2" : "w-full")}>
|
||||
<Form form={bookingForm} handleSubmit={bookEvent}>
|
||||
<div className="mb-4">
|
||||
<label htmlFor="name" className="block text-sm font-medium text-gray-700 dark:text-white">
|
||||
@@ -679,8 +729,11 @@ const BookingPage = ({
|
||||
{input.type !== EventTypeCustomInputType.BOOL && (
|
||||
<label
|
||||
htmlFor={"custom_" + input.id}
|
||||
className="mb-1 block text-sm font-medium text-gray-700 dark:text-white">
|
||||
{input.label}
|
||||
className={classNames(
|
||||
"mb-1 block text-sm font-medium text-gray-700 transition-colors dark:text-white",
|
||||
bookingForm.formState.errors.customInputs?.[input.id] && "!text-red-700"
|
||||
)}>
|
||||
{input.label} {input.required && <span className="text-red-700">*</span>}
|
||||
</label>
|
||||
)}
|
||||
{input.type === EventTypeCustomInputType.TEXTLONG && (
|
||||
@@ -745,24 +798,45 @@ const BookingPage = ({
|
||||
</div>
|
||||
)}
|
||||
{input.options && input.type === EventTypeCustomInputType.RADIO && (
|
||||
<div className="">
|
||||
<div className="flex">
|
||||
<Group
|
||||
onValueChange={(e) => {
|
||||
bookingForm.setValue(`customInputs.${input.id}`, e);
|
||||
}}>
|
||||
<>
|
||||
{input.options.map((option, i) => (
|
||||
<RadioField
|
||||
label={option.label}
|
||||
key={`option.${i}.radio`}
|
||||
value={option.label}
|
||||
id={`option.${i}.radio`}
|
||||
/>
|
||||
))}
|
||||
</>
|
||||
</Group>
|
||||
</div>
|
||||
<div className="flex">
|
||||
<Group
|
||||
required={input.required}
|
||||
onValueChange={(e) => {
|
||||
bookingForm.setValue(`customInputs.${input.id}`, e);
|
||||
}}>
|
||||
<>
|
||||
{input.options.map((option, i) => (
|
||||
<RadioField
|
||||
label={option.label}
|
||||
key={`option.${i}.radio`}
|
||||
value={option.label}
|
||||
id={`option.${i}.radio`}
|
||||
/>
|
||||
))}
|
||||
</>
|
||||
{bookingForm.formState.errors.customInputs?.[input.id] && (
|
||||
<div className="mt-px flex items-center text-xs text-red-700 ">
|
||||
<p>{t("required")}</p>
|
||||
</div>
|
||||
)}
|
||||
</Group>
|
||||
</div>
|
||||
)}
|
||||
{input.type === EventTypeCustomInputType.PHONE && (
|
||||
<div>
|
||||
<PhoneInput<BookingFormValues>
|
||||
name={`customInputs.${input.id}`}
|
||||
control={bookingForm.control}
|
||||
placeholder={t("enter_phone_number")}
|
||||
id={`customInputs.${input.id}`}
|
||||
required={input.required}
|
||||
/>
|
||||
{bookingForm.formState.errors?.customInputs?.[input.id] && (
|
||||
<div className="mt-2 flex items-center text-sm text-red-700 ">
|
||||
<Icon.FiInfo className="mr-2 h-3 w-3" />
|
||||
<p>{t("invalid_number")}</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -40,6 +40,7 @@ const CustomInputTypeForm: FC<Props> = (props) => {
|
||||
value: EventTypeCustomInputType.RADIO,
|
||||
label: t("radio"),
|
||||
},
|
||||
{ value: EventTypeCustomInputType.PHONE, label: t("phone_number") },
|
||||
];
|
||||
|
||||
const { selectedCustomInput } = props;
|
||||
|
||||
@@ -6,13 +6,13 @@ import short from "short-uuid";
|
||||
import { v5 as uuidv5 } from "uuid";
|
||||
|
||||
import DestinationCalendarSelector from "@calcom/features/calendars/DestinationCalendarSelector";
|
||||
import CustomInputItem from "@calcom/features/eventtypes/components/CustomInputItem";
|
||||
import { APP_NAME, CAL_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import {
|
||||
Button,
|
||||
Checkbox,
|
||||
CustomInputItem,
|
||||
Dialog,
|
||||
DialogClose,
|
||||
DialogContent,
|
||||
|
||||
@@ -262,12 +262,14 @@ export const EventSetupTab = (
|
||||
if (!newOptions.find((opt) => opt.value === defaultDuration?.value)) {
|
||||
if (newOptions.length > 0) {
|
||||
setDefaultDuration(newOptions[0]);
|
||||
formMethods.setValue("length", newOptions[0].value);
|
||||
} else {
|
||||
setDefaultDuration(null);
|
||||
}
|
||||
}
|
||||
if (newOptions.length === 1 && defaultDuration === null) {
|
||||
setDefaultDuration(newOptions[0]);
|
||||
formMethods.setValue("length", newOptions[0].value);
|
||||
}
|
||||
formMethods.setValue("metadata.multipleDuration", values);
|
||||
}}
|
||||
@@ -288,7 +290,7 @@ export const EventSetupTab = (
|
||||
setDefaultDuration(
|
||||
selectedMultipleDuration.find((opt) => opt.value === option?.value) ?? null
|
||||
);
|
||||
formMethods.setValue("length", Number(option?.value));
|
||||
if (option) formMethods.setValue("length", option.value);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
@@ -296,14 +298,11 @@ export const EventSetupTab = (
|
||||
) : (
|
||||
<TextField
|
||||
required
|
||||
name="length"
|
||||
type="number"
|
||||
label={t("duration")}
|
||||
addOnSuffix={<>{t("minutes")}</>}
|
||||
defaultValue={eventType.length ?? 15}
|
||||
onChange={(e) => {
|
||||
formMethods.setValue("length", Number(e.target.value));
|
||||
}}
|
||||
{...formMethods.register("length")}
|
||||
addOnSuffix={<>{t("minutes")}</>}
|
||||
/>
|
||||
)}
|
||||
<div className="!mt-4 [&_label]:my-1 [&_label]:font-normal">
|
||||
|
||||
@@ -3,9 +3,10 @@ import { EventTypeSetupInfered, FormValues } from "pages/event-types/[type]";
|
||||
import { useMemo } from "react";
|
||||
import { Controller, useFormContext } from "react-hook-form";
|
||||
|
||||
import CheckedTeamSelect from "@calcom/features/eventtypes/components/CheckedTeamSelect";
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Avatar, Button, CheckedTeamSelect, Icon, Label, Select } from "@calcom/ui";
|
||||
import { Avatar, Button, Icon, Label, Select } from "@calcom/ui";
|
||||
|
||||
interface IMemberToValue {
|
||||
id: number | null;
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
import { EventTypeSetupInfered, FormValues } from "pages/event-types/[type]";
|
||||
import { useState } from "react";
|
||||
import { TbWebhook } from "react-icons/tb";
|
||||
|
||||
import { WebhookForm } from "@calcom/features/webhooks/components";
|
||||
import { WebhookFormSubmitData } from "@calcom/features/webhooks/components/WebhookForm";
|
||||
import WebhookListItem from "@calcom/features/webhooks/components/WebhookListItem";
|
||||
import { APP_NAME } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Webhook } from "@calcom/prisma/client";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { Button, Dialog, DialogContent, EmptyScreen, Icon, showToast } from "@calcom/ui";
|
||||
|
||||
export const EventTeamWebhooksTab = ({
|
||||
eventType,
|
||||
team,
|
||||
}: Pick<EventTypeSetupInfered, "eventType" | "team">) => {
|
||||
const { t } = useLocale();
|
||||
|
||||
const utils = trpc.useContext();
|
||||
|
||||
const { data: webhooks } = trpc.viewer.webhook.list.useQuery({ eventTypeId: eventType.id });
|
||||
|
||||
const { data: installedApps, isLoading } = trpc.viewer.integrations.useQuery({
|
||||
variant: "other",
|
||||
onlyInstalled: true,
|
||||
});
|
||||
|
||||
const [createModalOpen, setCreateModalOpen] = useState(false);
|
||||
const [editModalOpen, setEditModalOpen] = useState(false);
|
||||
const [webhookToEdit, setWebhookToEdit] = useState<Webhook>();
|
||||
|
||||
const subscriberUrlReserved = (subscriberUrl: string, id?: string): boolean => {
|
||||
return !!webhooks?.find(
|
||||
(webhook) => webhook.subscriberUrl === subscriberUrl && (!id || webhook.id !== id)
|
||||
);
|
||||
};
|
||||
|
||||
const editWebhookMutation = trpc.viewer.webhook.edit.useMutation({
|
||||
async onSuccess() {
|
||||
setEditModalOpen(false);
|
||||
await utils.viewer.webhook.list.invalidate();
|
||||
showToast(t("webhook_updated_successfully"), "success");
|
||||
},
|
||||
onError(error) {
|
||||
showToast(`${error.message}`, "error");
|
||||
},
|
||||
});
|
||||
|
||||
const createWebhookMutation = trpc.viewer.webhook.create.useMutation({
|
||||
async onSuccess() {
|
||||
showToast(t("webhook_created_successfully"), "success");
|
||||
await utils.viewer.webhook.list.invalidate();
|
||||
setCreateModalOpen(false);
|
||||
},
|
||||
onError(error) {
|
||||
showToast(`${error.message}`, "error");
|
||||
},
|
||||
});
|
||||
|
||||
const onCreateWebhook = async (values: WebhookFormSubmitData) => {
|
||||
if (subscriberUrlReserved(values.subscriberUrl, values.id)) {
|
||||
showToast(t("webhook_subscriber_url_reserved"), "error");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!values.payloadTemplate) {
|
||||
values.payloadTemplate = null;
|
||||
}
|
||||
|
||||
createWebhookMutation.mutate({
|
||||
subscriberUrl: values.subscriberUrl,
|
||||
eventTriggers: values.eventTriggers,
|
||||
active: values.active,
|
||||
payloadTemplate: values.payloadTemplate,
|
||||
secret: values.secret,
|
||||
eventTypeId: eventType.id,
|
||||
});
|
||||
};
|
||||
|
||||
const NewWebhookButton = () => {
|
||||
const { t } = useLocale();
|
||||
return (
|
||||
<Button
|
||||
color="secondary"
|
||||
data-testid="new_webhook"
|
||||
StartIcon={Icon.FiPlus}
|
||||
onClick={() => setCreateModalOpen(true)}>
|
||||
{t("new_webhook")}
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
return (
|
||||
<div>
|
||||
{team && webhooks && !isLoading && (
|
||||
<>
|
||||
<div>
|
||||
<div>
|
||||
<>
|
||||
{webhooks.length ? (
|
||||
<>
|
||||
<div className="mt-4 mb-8 rounded-md border">
|
||||
{webhooks.map((webhook, index) => {
|
||||
return (
|
||||
<WebhookListItem
|
||||
key={webhook.id}
|
||||
webhook={webhook}
|
||||
lastItem={webhooks.length === index + 1}
|
||||
onEditWebhook={() => {
|
||||
setEditModalOpen(true);
|
||||
setWebhookToEdit(webhook);
|
||||
}}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
<NewWebhookButton />
|
||||
</>
|
||||
) : (
|
||||
<EmptyScreen
|
||||
Icon={TbWebhook}
|
||||
headline={t("create_your_first_webhook")}
|
||||
description={t("create_your_first_team_webhook_description", { appName: APP_NAME })}
|
||||
buttonRaw={<NewWebhookButton />}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* New webhook dialog */}
|
||||
<Dialog open={createModalOpen} onOpenChange={(isOpen) => !isOpen && setCreateModalOpen(false)}>
|
||||
<DialogContent title={t("create_webhook")} description={t("create_webhook_team_event_type")}>
|
||||
<WebhookForm
|
||||
onSubmit={onCreateWebhook}
|
||||
onCancel={() => setCreateModalOpen(false)}
|
||||
apps={installedApps?.items.map((app) => app.slug)}
|
||||
/>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
{/* Edit webhook dialog */}
|
||||
<Dialog open={editModalOpen} onOpenChange={(isOpen) => !isOpen && setEditModalOpen(false)}>
|
||||
<DialogContent title={t("edit_webhook")}>
|
||||
<WebhookForm
|
||||
webhook={webhookToEdit}
|
||||
apps={installedApps?.items.map((app) => app.slug)}
|
||||
onCancel={() => setEditModalOpen(false)}
|
||||
onSubmit={(values: WebhookFormSubmitData) => {
|
||||
if (subscriberUrlReserved(values.subscriberUrl, webhookToEdit?.id || "")) {
|
||||
showToast(t("webhook_subscriber_url_reserved"), "error");
|
||||
return;
|
||||
}
|
||||
|
||||
if (values.changeSecret) {
|
||||
values.secret = values.newSecret.length ? values.newSecret : null;
|
||||
}
|
||||
|
||||
if (!values.payloadTemplate) {
|
||||
values.payloadTemplate = null;
|
||||
}
|
||||
|
||||
editWebhookMutation.mutate({
|
||||
id: webhookToEdit?.id || "",
|
||||
subscriberUrl: values.subscriberUrl,
|
||||
eventTriggers: values.eventTriggers,
|
||||
active: values.active,
|
||||
payloadTemplate: values.payloadTemplate,
|
||||
secret: values.secret,
|
||||
eventTypeId: webhookToEdit?.eventTypeId || undefined,
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -2,8 +2,8 @@ import { TFunction } from "next-i18next";
|
||||
import { useRouter } from "next/router";
|
||||
import { EventTypeSetupInfered, FormValues } from "pages/event-types/[type]";
|
||||
import { useMemo, useState } from "react";
|
||||
import { Loader } from "react-feather";
|
||||
import { UseFormReturn } from "react-hook-form";
|
||||
import { TbWebhook } from "react-icons/tb";
|
||||
|
||||
import { classNames } from "@calcom/lib";
|
||||
import { CAL_URL } from "@calcom/lib/constants";
|
||||
@@ -150,13 +150,20 @@ function EventTypeSingleLayout({
|
||||
enabledWorkflowsNumber,
|
||||
});
|
||||
// If there is a team put this navigation item within the tabs
|
||||
if (team)
|
||||
if (team) {
|
||||
navigation.splice(2, 0, {
|
||||
name: "scheduling_type",
|
||||
href: `/event-types/${eventType.id}?tabName=team`,
|
||||
icon: Icon.FiUsers,
|
||||
info: eventType.schedulingType === "COLLECTIVE" ? "collective" : "round_robin",
|
||||
});
|
||||
navigation.push({
|
||||
name: "webhooks",
|
||||
href: `/event-types/${eventType.id}?tabName=webhooks`,
|
||||
icon: TbWebhook,
|
||||
info: `${eventType.webhooks.filter((webhook) => webhook.active).length} ${t("active")}`,
|
||||
});
|
||||
}
|
||||
return navigation;
|
||||
}, [t, eventType, installedAppsNumber, enabledAppsNumber, enabledWorkflowsNumber, team]);
|
||||
|
||||
@@ -294,7 +301,7 @@ function EventTypeSingleLayout({
|
||||
</Button>
|
||||
</div>
|
||||
}>
|
||||
<ClientSuspense fallback={<Loader />}>
|
||||
<ClientSuspense fallback={<Icon.FiLoader />}>
|
||||
<div className="-mt-2 flex flex-col xl:flex-row xl:space-x-8">
|
||||
<div className="hidden xl:block">
|
||||
<VerticalTabs
|
||||
|
||||
@@ -227,6 +227,11 @@ const nextConfig = {
|
||||
destination: "/404",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/booking/direct/:action/:email/:bookingUid/:oldToken",
|
||||
destination: "/api/link?action=:action&email=:email&bookingUid=:bookingUid&oldToken=:oldToken",
|
||||
permanent: true,
|
||||
},
|
||||
];
|
||||
|
||||
if (process.env.NEXT_PUBLIC_WEBAPP_URL === "https://app.cal.com") {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@calcom/web",
|
||||
"version": "2.3.7",
|
||||
"version": "2.4.2",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"analyze": "ANALYZE=true next build",
|
||||
@@ -61,7 +61,7 @@
|
||||
"@stripe/stripe-js": "^1.35.0",
|
||||
"@tanstack/react-query": "^4.3.9",
|
||||
"@vercel/edge-functions-ui": "^0.2.1",
|
||||
"@vercel/og": "^0.0.19",
|
||||
"@vercel/og": "^0.0.21",
|
||||
"accept-language-parser": "^1.5.0",
|
||||
"async": "^3.2.4",
|
||||
"bcryptjs": "^2.4.3",
|
||||
@@ -121,7 +121,7 @@
|
||||
"tailwindcss-radix": "^2.6.0",
|
||||
"uuid": "^8.3.2",
|
||||
"web3": "^1.7.5",
|
||||
"zod": "^3.19.1"
|
||||
"zod": "^3.20.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.19.6",
|
||||
|
||||
+29
-13
@@ -1,32 +1,48 @@
|
||||
import Head from "next/head";
|
||||
import { useRouter } from "next/router";
|
||||
|
||||
import { APP_NAME, WEBSITE_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Button } from "@calcom/ui";
|
||||
import { Button, Icon, showToast } from "@calcom/ui";
|
||||
|
||||
export default function Error500() {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
|
||||
return (
|
||||
<div className="flex h-screen">
|
||||
<div className="flex h-screen bg-gray-100">
|
||||
<Head>
|
||||
<title>Something unexpected occurred | {APP_NAME}</title>
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
<div className="m-auto text-center">
|
||||
<h1 className="font-cal text-[250px] text-gray-900">
|
||||
5
|
||||
{
|
||||
// eslint-disable-next-line @next/next/no-img-element
|
||||
<img src="/error.svg" className="-mt-10 inline w-60" alt="0" />
|
||||
}
|
||||
0
|
||||
</h1>
|
||||
<h2 className="mb-2 -mt-16 text-3xl text-gray-600">It's not you, it's us.</h2>
|
||||
<p className="mb-4 max-w-2xl text-gray-500">
|
||||
<div className="rtl: m-auto rounded-md bg-white p-10 text-right ltr:text-left">
|
||||
<h1 className="font-cal text-6xl text-black">500</h1>
|
||||
<h2 className="mt-6 text-2xl font-medium text-black">It's not you, it's us.</h2>
|
||||
<p className="mt-4 mb-6 max-w-2xl text-sm text-gray-600">
|
||||
Something went wrong on our end. Get in touch with our support team, and we’ll get it fixed right
|
||||
away for you.
|
||||
</p>
|
||||
{router.query.error && (
|
||||
<div className="mb-8 flex flex-col">
|
||||
<p className="mb-4 max-w-2xl text-sm text-gray-600">
|
||||
Please provide the following text when contacting support to better help you:
|
||||
</p>
|
||||
<pre className="w-full max-w-2xl whitespace-normal break-words rounded-md bg-gray-200 p-4 text-gray-900">
|
||||
{router.query.error}
|
||||
<br />
|
||||
<Button
|
||||
color="secondary"
|
||||
className="mt-2 border-0 font-sans font-normal hover:bg-gray-300"
|
||||
StartIcon={Icon.FiCopy}
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(router.query.error as string);
|
||||
showToast("Link copied!", "success");
|
||||
}}>
|
||||
{t("copy")}
|
||||
</Button>
|
||||
</pre>
|
||||
</div>
|
||||
)}
|
||||
<Button href={`${WEBSITE_URL}/support`}>{t("contact_support")}</Button>
|
||||
<Button color="secondary" href="javascript:history.back()" className="ml-2">
|
||||
Go back
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
useEmbedStyles,
|
||||
useIsEmbed,
|
||||
} from "@calcom/embed-core/embed-iframe";
|
||||
import { EventTypeDescriptionLazy as EventTypeDescription } from "@calcom/features/eventtypes/components";
|
||||
import EmptyPage from "@calcom/features/eventtypes/components/EmptyPage";
|
||||
import CustomBranding from "@calcom/lib/CustomBranding";
|
||||
import defaultEvents, {
|
||||
@@ -26,7 +27,7 @@ import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calco
|
||||
import prisma from "@calcom/prisma";
|
||||
import { baseEventTypeSelect } from "@calcom/prisma/selects";
|
||||
import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";
|
||||
import { BadgeCheckIcon, EventTypeDescriptionLazy as EventTypeDescription, Icon } from "@calcom/ui";
|
||||
import { BadgeCheckIcon, Icon } from "@calcom/ui";
|
||||
|
||||
import { inferSSRProps } from "@lib/types/inferSSRProps";
|
||||
import { EmbedProps } from "@lib/withEmbedSsr";
|
||||
@@ -58,7 +59,7 @@ export default function User(props: inferSSRProps<typeof getServerSideProps> & E
|
||||
{eventTypes.map((type, index) => (
|
||||
<li
|
||||
key={index}
|
||||
className="dark:bg-darkgray-100 dark:border-darkgray-200 group relative rounded-sm border border-neutral-200 bg-white dark:hover:border-neutral-600">
|
||||
className="dark:bg-darkgray-100 group relative border-b border-neutral-200 bg-white first:rounded-t-md last:rounded-b-md last:border-b-0 hover:bg-gray-50 dark:border-neutral-700 dark:hover:border-neutral-600">
|
||||
<Icon.FiArrowRight className="absolute right-3 top-3 h-4 w-4 text-black opacity-0 transition-opacity group-hover:opacity-100 dark:text-white" />
|
||||
<Link href={getUsernameSlugLink({ users: props.users, slug: type.slug })}>
|
||||
<a className="flex justify-between px-6 py-4" data-testid="event-type-link">
|
||||
@@ -68,7 +69,7 @@ export default function User(props: inferSSRProps<typeof getServerSideProps> & E
|
||||
</div>
|
||||
<div className="mt-1 self-center">
|
||||
<AvatarGroup
|
||||
border="border-2 border-white"
|
||||
border="border-2 border-white dark:border-darkgray-100"
|
||||
truncateAfter={4}
|
||||
className="flex flex-shrink-0"
|
||||
size={10}
|
||||
|
||||
@@ -4,7 +4,7 @@ import { JSONObject } from "superjson/dist/types";
|
||||
import { z } from "zod";
|
||||
|
||||
import { privacyFilteredLocations, LocationObject } from "@calcom/app-store/locations";
|
||||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { IS_TEAM_BILLING_ENABLED, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { getDefaultEvent, getGroupName, getUsernameList } from "@calcom/lib/defaultEvents";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { parseRecurringEvent } from "@calcom/lib/isRecurringEvent";
|
||||
@@ -157,9 +157,10 @@ async function getUserPageProps(context: GetStaticPropsContext) {
|
||||
// Check if the user you are logging into has any active teams
|
||||
const hasActiveTeam =
|
||||
user.teams.filter((m) => {
|
||||
if (!IS_TEAM_BILLING_ENABLED) return true;
|
||||
const metadata = teamMetadataSchema.safeParse(m.team.metadata);
|
||||
if (metadata.success && metadata.data?.subscriptionId) return false;
|
||||
return true;
|
||||
if (metadata.success && metadata.data?.subscriptionId) return true;
|
||||
return false;
|
||||
}).length > 0;
|
||||
|
||||
return {
|
||||
|
||||
@@ -14,7 +14,7 @@ import checkLicense from "@calcom/features/ee/common/server/checkLicense";
|
||||
import ImpersonationProvider from "@calcom/features/ee/impersonation/lib/ImpersonationProvider";
|
||||
import { hostedCal, isSAMLLoginEnabled } from "@calcom/features/ee/sso/lib/saml";
|
||||
import { ErrorCode, isPasswordValid, verifyPassword } from "@calcom/lib/auth";
|
||||
import { APP_NAME, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { APP_NAME, IS_TEAM_BILLING_ENABLED, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { symmetricDecrypt } from "@calcom/lib/crypto";
|
||||
import { defaultCookies } from "@calcom/lib/default-cookies";
|
||||
import rateLimit from "@calcom/lib/rateLimit";
|
||||
@@ -125,9 +125,10 @@ const providers: Provider[] = [
|
||||
// Check if the user you are logging into has any active teams
|
||||
const hasActiveTeams =
|
||||
user.teams.filter((m) => {
|
||||
if (!IS_TEAM_BILLING_ENABLED) return true;
|
||||
const metadata = teamMetadataSchema.safeParse(m.team.metadata);
|
||||
if (metadata.success && metadata.data?.subscriptionId) return false;
|
||||
return true;
|
||||
if (metadata.success && metadata.data?.subscriptionId) return true;
|
||||
return false;
|
||||
}).length > 0;
|
||||
|
||||
// authentication success- but does it meet the minimum password requirements?
|
||||
|
||||
@@ -13,10 +13,6 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
title: "30min between Pro Example and pro@example.com",
|
||||
description: null,
|
||||
additionalNotes: "asdasdas",
|
||||
customInputs: {
|
||||
"Custom input 01": "sadasdasdsadasd",
|
||||
"Custom input 02": "asdasdasd",
|
||||
},
|
||||
startTime: "2022-06-03T09:00:00-06:00",
|
||||
endTime: "2022-06-03T09:30:00-06:00",
|
||||
organizer: {
|
||||
@@ -32,26 +28,12 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
timeZone: "America/Chihuahua",
|
||||
language,
|
||||
},
|
||||
{
|
||||
email: "pro@example.com",
|
||||
name: "pro@example.com",
|
||||
timeZone: "America/Chihuahua",
|
||||
language,
|
||||
},
|
||||
{
|
||||
email: "pro@example.com",
|
||||
name: "pro@example.com",
|
||||
timeZone: "America/Chihuahua",
|
||||
language,
|
||||
},
|
||||
],
|
||||
location: "Zoom video",
|
||||
destinationCalendar: null,
|
||||
hideCalendarNotes: false,
|
||||
uid: "bwPWLpjYrx4rZf6MCZdKgE",
|
||||
uid: "xxyPr4cg2xx4XoS2KeMEQy",
|
||||
metadata: {},
|
||||
cancellationReason: "It got late",
|
||||
paymentInfo: { id: "pi_12312", link: "https://cal.com", reason: "no reason" },
|
||||
recurringEvent: null,
|
||||
};
|
||||
|
||||
@@ -60,10 +42,9 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
res.setHeader("Content-Type", "text/html");
|
||||
res.setHeader("Cache-Control", "no-cache, no-store, private, must-revalidate");
|
||||
res.write(
|
||||
renderEmail("DisabledAppEmail", {
|
||||
appName: "Stripe",
|
||||
appType: ["payment"],
|
||||
t,
|
||||
renderEmail("OrganizerRequestEmail", {
|
||||
attendee: evt.attendees[0],
|
||||
calEvent: evt,
|
||||
})
|
||||
);
|
||||
res.end();
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
import { UserPermissionRole } from "@prisma/client";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { z } from "zod";
|
||||
|
||||
import { symmetricDecrypt } from "@calcom/lib/crypto";
|
||||
import { defaultResponder } from "@calcom/lib/server";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { TRPCError } from "@calcom/trpc/server";
|
||||
import { createContext } from "@calcom/trpc/server/createContext";
|
||||
import { viewerRouter } from "@calcom/trpc/server/routers/viewer";
|
||||
|
||||
enum DirectAction {
|
||||
ACCEPT = "accept",
|
||||
REJECT = "reject",
|
||||
}
|
||||
|
||||
const querySchema = z.object({
|
||||
action: z.nativeEnum(DirectAction),
|
||||
token: z.string(),
|
||||
reason: z.string().optional(),
|
||||
});
|
||||
|
||||
const decryptedSchema = z.object({
|
||||
bookingUid: z.string(),
|
||||
userId: z.number().int(),
|
||||
});
|
||||
|
||||
async function handler(req: NextApiRequest, res: NextApiResponse<Response>) {
|
||||
const { action, token, reason } = querySchema.parse(req.query);
|
||||
const { bookingUid, userId } = decryptedSchema.parse(
|
||||
JSON.parse(symmetricDecrypt(decodeURIComponent(token), process.env.CALENDSO_ENCRYPTION_KEY || ""))
|
||||
);
|
||||
|
||||
/** 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 */,
|
||||
};
|
||||
}
|
||||
|
||||
const booking = await prisma.booking.findUniqueOrThrow({
|
||||
where: { uid: bookingUid },
|
||||
});
|
||||
|
||||
try {
|
||||
/** @see https://trpc.io/docs/server-side-calls */
|
||||
const ctx = await createContext({ req, res }, sessionGetter);
|
||||
const caller = viewerRouter.createCaller(ctx);
|
||||
await caller.bookings.confirm({
|
||||
bookingId: booking.id,
|
||||
recurringEventId: booking.recurringEventId || undefined,
|
||||
confirmed: action === DirectAction.ACCEPT,
|
||||
reason,
|
||||
});
|
||||
} catch (e) {
|
||||
let message = "Error confirming booking";
|
||||
if (e instanceof TRPCError) message = e.message;
|
||||
res.redirect(`/booking/${bookingUid}?error=${encodeURIComponent(message)}`);
|
||||
return;
|
||||
}
|
||||
|
||||
res.redirect(`/booking/${bookingUid}`);
|
||||
}
|
||||
|
||||
export default defaultResponder(handler);
|
||||
@@ -53,6 +53,8 @@ export default async function handler(req: NextApiRequest) {
|
||||
interFontMedium,
|
||||
]);
|
||||
const ogConfig = {
|
||||
width: 1200,
|
||||
height: 630,
|
||||
fonts: [
|
||||
{ name: "inter", data: interFontData, weight: 400 },
|
||||
{ name: "inter", data: interFontMediumData, weight: 500 },
|
||||
@@ -71,7 +73,7 @@ export default async function handler(req: NextApiRequest) {
|
||||
meetingImage: searchParams.get("meetingImage"),
|
||||
imageType,
|
||||
});
|
||||
return new ImageResponse(
|
||||
const img = new ImageResponse(
|
||||
(
|
||||
<Meeting
|
||||
title={title}
|
||||
@@ -80,7 +82,9 @@ export default async function handler(req: NextApiRequest) {
|
||||
/>
|
||||
),
|
||||
ogConfig
|
||||
);
|
||||
) as { body: Buffer };
|
||||
|
||||
return new Response(img.body, { status: 200 });
|
||||
}
|
||||
case "app": {
|
||||
const { name, description, slug } = appSchema.parse({
|
||||
@@ -89,7 +93,11 @@ export default async function handler(req: NextApiRequest) {
|
||||
slug: searchParams.get("slug"),
|
||||
imageType,
|
||||
});
|
||||
return new ImageResponse(<App name={name} description={description} slug={slug} />, ogConfig);
|
||||
const img = new ImageResponse(<App name={name} description={description} slug={slug} />, ogConfig) as {
|
||||
body: Buffer;
|
||||
};
|
||||
|
||||
return new Response(img.body, { status: 200 });
|
||||
}
|
||||
|
||||
case "generic": {
|
||||
@@ -99,7 +107,11 @@ export default async function handler(req: NextApiRequest) {
|
||||
imageType,
|
||||
});
|
||||
|
||||
return new ImageResponse(<Generic title={title} description={description} />, ogConfig);
|
||||
const img = new ImageResponse(<Generic title={title} description={description} />, ogConfig) as {
|
||||
body: Buffer;
|
||||
};
|
||||
|
||||
return new Response(img.body, { status: 200 });
|
||||
}
|
||||
|
||||
default:
|
||||
|
||||
@@ -47,13 +47,7 @@ export default function Apps({ apps }: InferGetStaticPropsType<typeof getStaticP
|
||||
}
|
||||
|
||||
export const getStaticPaths = async () => {
|
||||
const appStore = await getAppRegistry();
|
||||
const paths = appStore.reduce((categories, app) => {
|
||||
if (!categories.includes(app.category)) {
|
||||
categories.push(app.category);
|
||||
}
|
||||
return categories;
|
||||
}, [] as string[]);
|
||||
const paths = Object.keys(AppCategories);
|
||||
|
||||
return {
|
||||
paths: paths.map((category) => ({ params: { category } })),
|
||||
|
||||
@@ -44,7 +44,9 @@ export default function Apps({ categories }: InferGetStaticPropsType<typeof getS
|
||||
export const getStaticProps = async () => {
|
||||
const appStore = await getAppRegistry();
|
||||
const categories = appStore.reduce((c, app) => {
|
||||
c[app.category] = c[app.category] ? c[app.category] + 1 : 1;
|
||||
for (const category of app.categories) {
|
||||
c[category] = c[category] ? c[category] + 1 : 1;
|
||||
}
|
||||
return c;
|
||||
}, {} as Record<string, number>);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
|
||||
import { GetServerSidePropsContext } from "next";
|
||||
import { ChangeEventHandler, useState } from "react";
|
||||
|
||||
import { getAppRegistry, getAppRegistryWithCredentials } from "@calcom/app-store/_appRegistry";
|
||||
@@ -6,6 +6,7 @@ import { classNames } from "@calcom/lib";
|
||||
import { getSession } from "@calcom/lib/auth";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import type { AppCategories } from "@calcom/prisma/client";
|
||||
import { inferSSRProps } from "@calcom/types/inferSSRProps";
|
||||
import { AllApps, AppsLayout, AppStoreCategories, Icon, TextField, TrendingAppsSlider } from "@calcom/ui";
|
||||
|
||||
import { ssgInit } from "@server/lib/ssg";
|
||||
@@ -30,10 +31,7 @@ function AppsSearch({
|
||||
);
|
||||
}
|
||||
|
||||
export default function Apps({
|
||||
categories,
|
||||
appStore,
|
||||
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
|
||||
export default function Apps({ categories, appStore }: inferSSRProps<typeof getServerSideProps>) {
|
||||
const { t } = useLocale();
|
||||
const [searchText, setSearchText] = useState<string | undefined>(undefined);
|
||||
|
||||
@@ -52,12 +50,16 @@ export default function Apps({
|
||||
<TrendingAppsSlider items={appStore} />
|
||||
</>
|
||||
)}
|
||||
<AllApps apps={appStore} searchText={searchText} />
|
||||
<AllApps
|
||||
apps={appStore}
|
||||
searchText={searchText}
|
||||
categories={categories.map((category) => category.name)}
|
||||
/>
|
||||
</AppsLayout>
|
||||
);
|
||||
}
|
||||
|
||||
export const getServerSideProps: GetServerSideProps = async (context) => {
|
||||
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
|
||||
const ssg = await ssgInit(context);
|
||||
|
||||
const session = await getSession(context);
|
||||
|
||||
@@ -7,12 +7,13 @@ import { useState } from "react";
|
||||
import { FormProvider, useForm } from "react-hook-form";
|
||||
import { FaGoogle } from "react-icons/fa";
|
||||
|
||||
import { SAMLLogin } from "@calcom/features/auth/SAMLLogin";
|
||||
import { isSAMLLoginEnabled, samlProductID, samlTenantID } from "@calcom/features/ee/sso/lib/saml";
|
||||
import { getSafeRedirectUrl } from "@calcom/lib/getSafeRedirectUrl";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { Alert, Button, EmailField, Icon, PasswordField, SAMLLogin } from "@calcom/ui";
|
||||
import { Alert, Button, EmailField, Icon, PasswordField } from "@calcom/ui";
|
||||
|
||||
import { ErrorCode, getSession } from "@lib/auth";
|
||||
import { WEBAPP_URL, WEBSITE_URL } from "@lib/config/constants";
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import { UserPermissionRole } from "@prisma/client";
|
||||
import { GetServerSidePropsContext } from "next";
|
||||
import { useState } from "react";
|
||||
|
||||
import AdminAppsList from "@calcom/features/apps/AdminAppsList";
|
||||
import { getSession } from "@calcom/lib/auth";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { inferSSRProps } from "@calcom/types/inferSSRProps";
|
||||
@@ -24,7 +27,7 @@ export default function Setup(props: inferSSRProps<typeof getServerSideProps>) {
|
||||
{
|
||||
title: t("enable_apps"),
|
||||
description: t("enable_apps_description"),
|
||||
content: <AdminAppsList baseURL="/auth/setup" />,
|
||||
content: <AdminAppsList baseURL="/auth/setup?step=2" />,
|
||||
isLoading: false,
|
||||
},
|
||||
];
|
||||
@@ -32,14 +35,33 @@ export default function Setup(props: inferSSRProps<typeof getServerSideProps>) {
|
||||
return (
|
||||
<>
|
||||
<main className="flex items-center bg-gray-100 print:h-full">
|
||||
<WizardForm href="/auth/setup" steps={steps} disableNavigation={shouldDisable} />
|
||||
<WizardForm
|
||||
href="/auth/setup"
|
||||
steps={steps}
|
||||
nextLabel={t("next_step_text")}
|
||||
finishLabel={t("finish")}
|
||||
prevLabel={t("prev_step")}
|
||||
stepLabel={(currentStep, maxSteps) => t("current_step_of_total", { currentStep, maxSteps })}
|
||||
/>
|
||||
</main>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export const getServerSideProps = async () => {
|
||||
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
|
||||
const userCount = await prisma.user.count();
|
||||
const { req } = context;
|
||||
const session = await getSession({ req });
|
||||
|
||||
if (session?.user.role && session?.user.role !== UserPermissionRole.ADMIN) {
|
||||
return {
|
||||
redirect: {
|
||||
destination: `/404`,
|
||||
permanent: false,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
props: {
|
||||
userCount,
|
||||
|
||||
@@ -1,18 +1,30 @@
|
||||
import { useRouter } from "next/router";
|
||||
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { Icon } from "@calcom/ui";
|
||||
|
||||
const StepDone = () => {
|
||||
const router = useRouter();
|
||||
const { t } = useLocale();
|
||||
|
||||
return (
|
||||
<div className="min-h-36 my-6 flex flex-col items-center justify-center">
|
||||
<div className="flex h-[72px] w-[72px] items-center justify-center rounded-full bg-gray-600 dark:bg-white">
|
||||
<Icon.FiCheck className="inline-block h-10 w-10 text-white dark:bg-white dark:text-gray-600" />
|
||||
<form
|
||||
id="wizard-step-1"
|
||||
name="wizard-step-1"
|
||||
className="space-y-4"
|
||||
onSubmit={(e) => {
|
||||
e.preventDefault();
|
||||
router.replace(`/auth/setup?step=2&category=calendar`);
|
||||
}}>
|
||||
<div className="min-h-36 my-6 flex flex-col items-center justify-center">
|
||||
<div className="flex h-[72px] w-[72px] items-center justify-center rounded-full bg-gray-600 dark:bg-white">
|
||||
<Icon.FiCheck className="inline-block h-10 w-10 text-white dark:bg-white dark:text-gray-600" />
|
||||
</div>
|
||||
<div className="max-w-[420px] text-center">
|
||||
<h2 className="mt-6 mb-1 text-lg font-medium dark:text-gray-300">{t("all_done")}</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div className="max-w-[420px] text-center">
|
||||
<h2 className="mt-6 mb-1 text-lg font-medium dark:text-gray-300">{t("all_done")}</h2>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
import { GetStaticPaths, GetStaticProps } from "next";
|
||||
import { useEffect } from "react";
|
||||
import { Controller, useForm } from "react-hook-form";
|
||||
import { GetServerSidePropsContext } from "next";
|
||||
import { Controller, useFieldArray, useForm } from "react-hook-form";
|
||||
import { z } from "zod";
|
||||
|
||||
import { DateOverrideInputDialog, DateOverrideList } from "@calcom/features/schedules";
|
||||
import Schedule from "@calcom/features/schedules/components/Schedule";
|
||||
import { availabilityAsString } from "@calcom/lib/availability";
|
||||
import { yyyymmdd } from "@calcom/lib/date-fns";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { stringOrNumber } from "@calcom/prisma/zod-utils";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import useMeQuery from "@calcom/trpc/react/hooks/useMeQuery";
|
||||
import type { Schedule as ScheduleType } from "@calcom/types/schedule";
|
||||
import type { Schedule as ScheduleType, TimeRange, WorkingHours } from "@calcom/types/schedule";
|
||||
import {
|
||||
Button,
|
||||
Form,
|
||||
@@ -21,6 +22,7 @@ import {
|
||||
SkeletonText,
|
||||
Switch,
|
||||
TimezoneSelect,
|
||||
Tooltip,
|
||||
VerticalDivider,
|
||||
} from "@calcom/ui";
|
||||
|
||||
@@ -29,7 +31,7 @@ import { HttpError } from "@lib/core/http/error";
|
||||
import { SelectSkeletonLoader } from "@components/availability/SkeletonLoader";
|
||||
import EditableHeading from "@components/ui/EditableHeading";
|
||||
|
||||
import { ssgInit } from "@server/lib/ssg";
|
||||
import { ssrInit } from "@server/lib/ssr";
|
||||
|
||||
const querySchema = z.object({
|
||||
schedule: stringOrNumber,
|
||||
@@ -38,31 +40,59 @@ const querySchema = z.object({
|
||||
type AvailabilityFormValues = {
|
||||
name: string;
|
||||
schedule: ScheduleType;
|
||||
dateOverrides: { ranges: TimeRange[] }[];
|
||||
timeZone: string;
|
||||
isDefault: boolean;
|
||||
};
|
||||
|
||||
const DateOverride = ({ workingHours }: { workingHours: WorkingHours[] }) => {
|
||||
const { remove, append, update, fields } = useFieldArray<AvailabilityFormValues, "dateOverrides">({
|
||||
name: "dateOverrides",
|
||||
});
|
||||
const { t } = useLocale();
|
||||
return (
|
||||
<div className="px-4 py-5 sm:p-6">
|
||||
<h3 className="font-medium leading-6 text-gray-900">
|
||||
{t("date_overrides")}{" "}
|
||||
<Tooltip content={t("date_overrides_info")}>
|
||||
<span className="inline-block">
|
||||
<Icon.FiInfo />
|
||||
</span>
|
||||
</Tooltip>
|
||||
</h3>
|
||||
<p className="mb-4 text-sm text-neutral-500 ltr:mr-4 rtl:ml-4">{t("date_overrides_subtitle")}</p>
|
||||
<div className="mt-1 space-y-2">
|
||||
<DateOverrideList
|
||||
excludedDates={fields.map((field) => yyyymmdd(field.ranges[0].start))}
|
||||
remove={remove}
|
||||
update={update}
|
||||
items={fields}
|
||||
workingHours={workingHours}
|
||||
/>
|
||||
<DateOverrideInputDialog
|
||||
workingHours={workingHours}
|
||||
excludedDates={fields.map((field) => yyyymmdd(field.ranges[0].start))}
|
||||
onChange={(ranges) => append({ ranges })}
|
||||
Trigger={
|
||||
<Button color="secondary" StartIcon={Icon.FiPlus} data-testid="add-override">
|
||||
Add an override
|
||||
</Button>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default function Availability({ schedule }: { schedule: number }) {
|
||||
const { t, i18n } = useLocale();
|
||||
const utils = trpc.useContext();
|
||||
const me = useMeQuery();
|
||||
const { timeFormat } = me.data || { timeFormat: null };
|
||||
const { data, isLoading } = trpc.viewer.availability.schedule.get.useQuery({ scheduleId: schedule });
|
||||
|
||||
const form = useForm<AvailabilityFormValues>();
|
||||
const { control, reset } = form;
|
||||
|
||||
useEffect(() => {
|
||||
if (!isLoading && data) {
|
||||
reset({
|
||||
name: data?.schedule?.name,
|
||||
schedule: data.availability,
|
||||
timeZone: data.timeZone,
|
||||
isDefault: data.isDefault,
|
||||
});
|
||||
}
|
||||
}, [data, isLoading, reset]);
|
||||
|
||||
const { data: defaultValues } = trpc.viewer.availability.defaultValues.useQuery({ scheduleId: schedule });
|
||||
const form = useForm<AvailabilityFormValues>({ defaultValues });
|
||||
const { control } = form;
|
||||
const updateMutation = trpc.viewer.availability.schedule.update.useMutation({
|
||||
onSuccess: async ({ prevDefaultId, currentDefaultId, ...data }) => {
|
||||
if (prevDefaultId && currentDefaultId) {
|
||||
@@ -73,7 +103,7 @@ export default function Availability({ schedule }: { schedule: number }) {
|
||||
utils.viewer.availability.schedule.get.refetch({ scheduleId: prevDefaultId });
|
||||
}
|
||||
}
|
||||
utils.viewer.availability.schedule.get.setData({ scheduleId: data.schedule.id }, data);
|
||||
utils.viewer.availability.schedule.get.invalidate({ scheduleId: data.schedule.id });
|
||||
utils.viewer.availability.list.invalidate();
|
||||
showToast(
|
||||
t("availability_updated_successfully", {
|
||||
@@ -98,17 +128,21 @@ export default function Availability({ schedule }: { schedule: number }) {
|
||||
<Controller
|
||||
control={form.control}
|
||||
name="name"
|
||||
render={({ field }) => <EditableHeading isReady={!isLoading} {...field} />}
|
||||
render={({ field }) => (
|
||||
<EditableHeading isReady={!isLoading} {...field} data-testid="availablity-title" />
|
||||
)}
|
||||
/>
|
||||
}
|
||||
subtitle={
|
||||
data ? (
|
||||
data.schedule.availability.map((availability) => (
|
||||
<span key={availability.id}>
|
||||
{availabilityAsString(availability, { locale: i18n.language, hour12: timeFormat === 12 })}
|
||||
<br />
|
||||
</span>
|
||||
))
|
||||
data.schedule.availability
|
||||
.filter((availability) => !!availability.days.length)
|
||||
.map((availability) => (
|
||||
<span key={availability.id}>
|
||||
{availabilityAsString(availability, { locale: i18n.language, hour12: timeFormat === 12 })}
|
||||
<br />
|
||||
</span>
|
||||
))
|
||||
) : (
|
||||
<SkeletonText className="h-4 w-48" />
|
||||
)
|
||||
@@ -140,95 +174,88 @@ export default function Availability({ schedule }: { schedule: number }) {
|
||||
</Button>
|
||||
</div>
|
||||
}>
|
||||
<div className="flex items-baseline sm:mt-0">
|
||||
{/* TODO: Find a better way to guarantee alignment, but for now this'll do. */}
|
||||
<Icon.FiArrowLeft className=" mr-3 text-transparent hover:cursor-pointer" />
|
||||
<div className="w-full">
|
||||
<Form
|
||||
form={form}
|
||||
id="availability-form"
|
||||
handleSubmit={async (values) => {
|
||||
updateMutation.mutate({
|
||||
scheduleId: schedule,
|
||||
...values,
|
||||
});
|
||||
}}
|
||||
className="-mx-4 flex flex-col pb-16 sm:mx-0 xl:flex-row xl:space-x-6">
|
||||
<div className="flex-1">
|
||||
<div className="rounded-md border-gray-200 bg-white py-5 pr-4 sm:border sm:p-6">
|
||||
<h3 className="mb-5 text-base font-medium leading-6 text-gray-900">
|
||||
{t("change_start_end")}
|
||||
</h3>
|
||||
{typeof me.data?.weekStart === "string" && (
|
||||
<Schedule
|
||||
control={control}
|
||||
name="schedule"
|
||||
weekStart={
|
||||
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"].indexOf(
|
||||
me.data?.weekStart
|
||||
) as 0 | 1 | 2 | 3 | 4 | 5 | 6
|
||||
}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<div className="w-full">
|
||||
<Form
|
||||
form={form}
|
||||
id="availability-form"
|
||||
handleSubmit={async ({ dateOverrides, ...values }) => {
|
||||
updateMutation.mutate({
|
||||
scheduleId: schedule,
|
||||
dateOverrides: dateOverrides.flatMap((override) => override.ranges),
|
||||
...values,
|
||||
});
|
||||
}}
|
||||
className="flex flex-col pb-16 sm:mx-0 xl:flex-row xl:space-x-6">
|
||||
<div className="flex-1 divide-y divide-neutral-200 rounded-md border">
|
||||
<div className=" py-5 sm:p-6">
|
||||
<h3 className="mb-2 px-5 text-base font-medium leading-6 text-gray-900 sm:pl-0">
|
||||
{t("change_start_end")}
|
||||
</h3>
|
||||
{typeof me.data?.weekStart === "string" && (
|
||||
<Schedule
|
||||
control={control}
|
||||
name="schedule"
|
||||
weekStart={
|
||||
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"].indexOf(
|
||||
me.data?.weekStart
|
||||
) as 0 | 1 | 2 | 3 | 4 | 5 | 6
|
||||
}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<div className="min-w-40 col-span-3 space-y-2 lg:col-span-1">
|
||||
<div className="xl:max-w-80 mt-4 w-full pr-4 sm:p-0">
|
||||
<div>
|
||||
<label htmlFor="timeZone" className="block text-sm font-medium text-gray-700">
|
||||
{t("timezone")}
|
||||
</label>
|
||||
<Controller
|
||||
name="timeZone"
|
||||
render={({ field: { onChange, value } }) =>
|
||||
value ? (
|
||||
<TimezoneSelect
|
||||
value={value}
|
||||
className="focus:border-brand mt-1 block w-72 rounded-md border-gray-300 text-sm"
|
||||
onChange={(timezone) => onChange(timezone.value)}
|
||||
/>
|
||||
) : (
|
||||
<SelectSkeletonLoader className="w-72" />
|
||||
)
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
<hr className="my-8" />
|
||||
<div className="rounded-md">
|
||||
<h3 className="text-sm font-medium text-gray-900">{t("something_doesnt_look_right")}</h3>
|
||||
<div className="mt-3 flex">
|
||||
<Button href="/availability/troubleshoot" color="secondary">
|
||||
{t("launch_troubleshooter")}
|
||||
</Button>
|
||||
</div>
|
||||
{data?.workingHours && <DateOverride workingHours={data.workingHours} />}
|
||||
</div>
|
||||
<div className="min-w-40 col-span-3 space-y-2 lg:col-span-1">
|
||||
<div className="xl:max-w-80 mt-4 w-full pr-4 sm:p-0">
|
||||
<div>
|
||||
<label htmlFor="timeZone" className="block text-sm font-medium text-gray-700">
|
||||
{t("timezone")}
|
||||
</label>
|
||||
<Controller
|
||||
name="timeZone"
|
||||
render={({ field: { onChange, value } }) =>
|
||||
value ? (
|
||||
<TimezoneSelect
|
||||
value={value}
|
||||
className="focus:border-brand mt-1 block w-72 rounded-md border-gray-300 text-sm"
|
||||
onChange={(timezone) => onChange(timezone.value)}
|
||||
/>
|
||||
) : (
|
||||
<SelectSkeletonLoader className="w-72" />
|
||||
)
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
<hr className="my-8" />
|
||||
<div className="rounded-md">
|
||||
<h3 className="text-sm font-medium text-gray-900">{t("something_doesnt_look_right")}</h3>
|
||||
<div className="mt-3 flex">
|
||||
<Button href="/availability/troubleshoot" color="secondary">
|
||||
{t("launch_troubleshooter")}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Form>
|
||||
</div>
|
||||
</div>
|
||||
</Form>
|
||||
</div>
|
||||
</Shell>
|
||||
);
|
||||
}
|
||||
|
||||
export const getStaticProps: GetStaticProps = async (ctx) => {
|
||||
export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
|
||||
const params = querySchema.safeParse(ctx.params);
|
||||
const ssg = await ssgInit(ctx);
|
||||
const ssr = await ssrInit(ctx);
|
||||
|
||||
if (!params.success) return { notFound: true };
|
||||
|
||||
const scheduleId = params.data.schedule;
|
||||
await ssr.viewer.availability.schedule.get.fetch({ scheduleId });
|
||||
await ssr.viewer.availability.defaultValues.fetch({ scheduleId });
|
||||
return {
|
||||
props: {
|
||||
schedule: params.data.schedule,
|
||||
trpcState: ssg.dehydrate(),
|
||||
schedule: scheduleId,
|
||||
trpcState: ssr.dehydrate(),
|
||||
},
|
||||
revalidate: 10, // seconds
|
||||
};
|
||||
};
|
||||
|
||||
export const getStaticPaths: GetStaticPaths = () => {
|
||||
return {
|
||||
paths: [],
|
||||
fallback: "blocking",
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { useState } from "react";
|
||||
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { RouterOutputs, trpc } from "@calcom/trpc/react";
|
||||
import { Shell, SkeletonText } from "@calcom/ui";
|
||||
|
||||
import useRouterQuery from "@lib/hooks/useRouterQuery";
|
||||
|
||||
type User = RouterOutputs["viewer"]["me"];
|
||||
|
||||
export interface IBusySlot {
|
||||
@@ -16,7 +16,9 @@ export interface IBusySlot {
|
||||
|
||||
const AvailabilityView = ({ user }: { user: User }) => {
|
||||
const { t } = useLocale();
|
||||
const [selectedDate, setSelectedDate] = useState(dayjs());
|
||||
const { date, setQuery: setSelectedDate } = useRouterQuery("date");
|
||||
const selectedDate = dayjs(date);
|
||||
const formattedSelectedDate = selectedDate.format("YYYY-MM-DD");
|
||||
|
||||
const { data, isLoading } = trpc.viewer.availability.user.useQuery(
|
||||
{
|
||||
@@ -30,6 +32,17 @@ const AvailabilityView = ({ user }: { user: User }) => {
|
||||
}
|
||||
);
|
||||
|
||||
const overrides =
|
||||
data?.dateOverrides.reduce((acc, override) => {
|
||||
if (
|
||||
formattedSelectedDate !== dayjs(override.start).format("YYYY-MM-DD") &&
|
||||
formattedSelectedDate !== dayjs(override.end).format("YYYY-MM-DD")
|
||||
)
|
||||
return acc;
|
||||
acc.push({ ...override, source: "Date override" });
|
||||
return acc;
|
||||
}, [] as IBusySlot[]) || [];
|
||||
|
||||
return (
|
||||
<div className="max-w-xl overflow-hidden rounded-md bg-white shadow">
|
||||
<div className="px-4 py-5 sm:p-6">
|
||||
@@ -37,9 +50,9 @@ const AvailabilityView = ({ user }: { user: User }) => {
|
||||
<input
|
||||
type="date"
|
||||
className="inline h-8 border-none p-0"
|
||||
defaultValue={selectedDate.format("YYYY-MM-DD")}
|
||||
defaultValue={formattedSelectedDate}
|
||||
onChange={(e) => {
|
||||
if (e.target.value) setSelectedDate(dayjs(e.target.value));
|
||||
if (e.target.value) setSelectedDate(e.target.value);
|
||||
}}
|
||||
/>
|
||||
<small className="block text-neutral-400">{t("hover_over_bold_times_tip")}</small>
|
||||
@@ -49,39 +62,47 @@ const AvailabilityView = ({ user }: { user: User }) => {
|
||||
{t("your_day_starts_at")} {convertMinsToHrsMins(user.startTime)}
|
||||
</div>
|
||||
</div>
|
||||
{isLoading ? (
|
||||
<>
|
||||
<SkeletonText className="block h-16 w-full" />
|
||||
<SkeletonText className="block h-16 w-full" />
|
||||
</>
|
||||
) : data && data.busy.length > 0 ? (
|
||||
data.busy
|
||||
.sort((a: IBusySlot, b: IBusySlot) => (a.start > b.start ? -1 : 1))
|
||||
.map((slot: IBusySlot) => (
|
||||
<div
|
||||
key={dayjs(slot.start).format("HH:mm")}
|
||||
className="overflow-hidden rounded-md bg-neutral-100">
|
||||
<div className="px-4 py-5 text-black sm:p-6">
|
||||
{t("calendar_shows_busy_between")}{" "}
|
||||
<span className="font-medium text-neutral-800" title={dayjs(slot.start).format("HH:mm")}>
|
||||
{dayjs(slot.start).format("HH:mm")}
|
||||
</span>{" "}
|
||||
{t("and")}{" "}
|
||||
<span className="font-medium text-neutral-800" title={dayjs(slot.end).format("HH:mm")}>
|
||||
{dayjs(slot.end).format("HH:mm")}
|
||||
</span>{" "}
|
||||
{t("on")} {dayjs(slot.start).format("D")}{" "}
|
||||
{t(dayjs(slot.start).format("MMMM").toLowerCase())} {dayjs(slot.start).format("YYYY")}
|
||||
{slot.title && ` - (${slot.title})`}
|
||||
{slot.source && <small>{` - (source: ${slot.source})`}</small>}
|
||||
{(() => {
|
||||
if (isLoading)
|
||||
return (
|
||||
<>
|
||||
<SkeletonText className="block h-16 w-full" />
|
||||
<SkeletonText className="block h-16 w-full" />
|
||||
</>
|
||||
);
|
||||
|
||||
if (data && (data.busy.length > 0 || overrides.length > 0))
|
||||
return [...data.busy, ...overrides]
|
||||
.sort((a: IBusySlot, b: IBusySlot) => (a.start > b.start ? -1 : 1))
|
||||
.map((slot: IBusySlot) => (
|
||||
<div
|
||||
key={dayjs(slot.start).format("HH:mm")}
|
||||
className="overflow-hidden rounded-md bg-neutral-100"
|
||||
data-testid="troubleshooter-busy-time">
|
||||
<div className="px-4 py-5 text-black sm:p-6">
|
||||
{t("calendar_shows_busy_between")}{" "}
|
||||
<span
|
||||
className="font-medium text-neutral-800"
|
||||
title={dayjs(slot.start).format("HH:mm")}>
|
||||
{dayjs(slot.start).format("HH:mm")}
|
||||
</span>{" "}
|
||||
{t("and")}{" "}
|
||||
<span className="font-medium text-neutral-800" title={dayjs(slot.end).format("HH:mm")}>
|
||||
{dayjs(slot.end).format("HH:mm")}
|
||||
</span>{" "}
|
||||
{t("on")} {dayjs(slot.start).format("D")}{" "}
|
||||
{t(dayjs(slot.start).format("MMMM").toLowerCase())} {dayjs(slot.start).format("YYYY")}
|
||||
{slot.title && ` - (${slot.title})`}
|
||||
{slot.source && <small>{` - (source: ${slot.source})`}</small>}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className="overflow-hidden rounded-md bg-neutral-100">
|
||||
<div className="px-4 py-5 text-black sm:p-6">{t("calendar_no_busy_slots")}</div>
|
||||
</div>
|
||||
)}
|
||||
));
|
||||
return (
|
||||
<div className="overflow-hidden rounded-md bg-neutral-100">
|
||||
<div className="px-4 py-5 text-black sm:p-6">{t("calendar_no_busy_slots")}</div>
|
||||
</div>
|
||||
);
|
||||
})()}
|
||||
|
||||
<div className="bg-brand dark:bg-darkmodebrand overflow-hidden rounded-md">
|
||||
<div className="text-brandcontrast dark:text-darkmodebrandcontrast px-4 py-2 sm:px-6">
|
||||
|
||||
@@ -168,6 +168,7 @@ const querySchema = z.object({
|
||||
changes: stringToBoolean,
|
||||
reschedule: stringToBoolean,
|
||||
isSuccessBookingPage: z.string().optional(),
|
||||
formerTime: z.string().optional(),
|
||||
});
|
||||
|
||||
export default function Success(props: SuccessProps) {
|
||||
@@ -179,6 +180,7 @@ export default function Success(props: SuccessProps) {
|
||||
isSuccessBookingPage,
|
||||
cancel: isCancellationMode,
|
||||
changes,
|
||||
formerTime,
|
||||
} = querySchema.parse(router.query);
|
||||
|
||||
if ((isCancellationMode || changes) && typeof window !== "undefined") {
|
||||
@@ -425,9 +427,11 @@ export default function Success(props: SuccessProps) {
|
||||
<p className="text-neutral-600 dark:text-gray-300">{getTitle()}</p>
|
||||
</div>
|
||||
<div className="border-bookinglightest text-bookingdark dark:border-darkgray-300 mt-8 grid grid-cols-3 border-t pt-8 text-left dark:text-gray-300">
|
||||
{isCancelled && cancellationReason && (
|
||||
{(isCancelled || reschedule) && cancellationReason && (
|
||||
<>
|
||||
<div className="font-medium">{t("reason")}</div>
|
||||
<div className="font-medium">
|
||||
{isCancelled ? t("reason") : t("reschedule_reason_success_page")}
|
||||
</div>
|
||||
<div className="col-span-2 mb-6 last:mb-0">{cancellationReason}</div>
|
||||
</>
|
||||
)}
|
||||
@@ -435,6 +439,19 @@ export default function Success(props: SuccessProps) {
|
||||
<div className="col-span-2 mb-6 last:mb-0">{eventName}</div>
|
||||
<div className="font-medium">{t("when")}</div>
|
||||
<div className="col-span-2 mb-6 last:mb-0">
|
||||
{reschedule && !!formerTime && (
|
||||
<p className="line-through">
|
||||
<RecurringBookings
|
||||
eventType={props.eventType}
|
||||
duration={calculatedDuration}
|
||||
recurringBookings={props.recurringBookings}
|
||||
allRemainingBookings={allRemainingBookings}
|
||||
date={dayjs(formerTime)}
|
||||
is24h={is24h}
|
||||
isCancelled={isCancelled}
|
||||
/>
|
||||
</p>
|
||||
)}
|
||||
<RecurringBookings
|
||||
eventType={props.eventType}
|
||||
duration={calculatedDuration}
|
||||
@@ -790,10 +807,10 @@ export function RecurringBookings({
|
||||
{eventType.recurringEvent?.count &&
|
||||
recurringBookingsSorted.slice(0, 4).map((dateStr: string, idx: number) => (
|
||||
<div key={idx} className={classNames("mb-2", isCancelled ? "line-through" : "")}>
|
||||
{dayjs.tz(dateStr, timeZone()).format("MMMM DD, YYYY")}
|
||||
{dayjs.tz(dateStr, timeZone()).format("dddd, DD MMMM YYYY")}
|
||||
<br />
|
||||
{formatTime(dateStr, is24h ? 24 : 12, timeZone())} -{" "}
|
||||
{formatTime(dayjs(dateStr).add(duration, "m"), is24h ? 24 : 12, timeZone())}{" "}
|
||||
{formatTime(dateStr, is24h ? 24 : 12, timeZone().toLowerCase())} -{" "}
|
||||
{formatTime(dayjs(dateStr).add(duration, "m"), is24h ? 24 : 12, timeZone().toLowerCase())}{" "}
|
||||
<span className="text-bookinglight">({timeZone()})</span>
|
||||
</div>
|
||||
))}
|
||||
@@ -808,10 +825,10 @@ export function RecurringBookings({
|
||||
{eventType.recurringEvent?.count &&
|
||||
recurringBookingsSorted.slice(4).map((dateStr: string, idx: number) => (
|
||||
<div key={idx} className={classNames("mb-2", isCancelled ? "line-through" : "")}>
|
||||
{dayjs.tz(dateStr, timeZone()).format("MMMM DD, YYYY")}
|
||||
{dayjs.tz(dateStr, timeZone()).format("dddd, DD MMMM YYYY")}
|
||||
<br />
|
||||
{formatTime(dateStr, is24h ? 24 : 12, timeZone())} -{" "}
|
||||
{formatTime(dayjs(dateStr).add(duration, "m"), is24h ? 24 : 12, timeZone())}{" "}
|
||||
{formatTime(dateStr, is24h ? 24 : 12, timeZone().toLowerCase())} -{" "}
|
||||
{formatTime(dayjs(dateStr).add(duration, "m"), is24h ? 24 : 12, timeZone().toLowerCase())}{" "}
|
||||
<span className="text-bookinglight">({timeZone()})</span>
|
||||
</div>
|
||||
))}
|
||||
@@ -824,10 +841,10 @@ export function RecurringBookings({
|
||||
|
||||
return (
|
||||
<div className={classNames(isCancelled ? "line-through" : "")}>
|
||||
{dayjs.tz(date, timeZone()).format("MMMM DD, YYYY")}
|
||||
{dayjs.tz(date, timeZone()).format("dddd, DD MMMM YYYY")}
|
||||
<br />
|
||||
{formatTime(date, is24h ? 24 : 12, timeZone())} -{" "}
|
||||
{formatTime(dayjs(date).add(duration, "m"), is24h ? 24 : 12, timeZone())}{" "}
|
||||
{formatTime(date, is24h ? 24 : 12, timeZone().toLowerCase())} -{" "}
|
||||
{formatTime(dayjs(date).add(duration, "m"), is24h ? 24 : 12, timeZone().toLowerCase())}{" "}
|
||||
<span className="text-bookinglight">({timeZone()})</span>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -5,9 +5,11 @@ import { Fragment } from "react";
|
||||
import { z } from "zod";
|
||||
|
||||
import { WipeMyCalActionButton } from "@calcom/app-store/wipemycalother/components";
|
||||
import BookingLayout from "@calcom/features/bookings/layout/BookingLayout";
|
||||
import { filterQuerySchema, useFilterQuery } from "@calcom/features/bookings/lib/useFilterQuery";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { RouterInputs, RouterOutputs, trpc } from "@calcom/trpc/react";
|
||||
import { Alert, BookingLayout, Button, EmptyScreen, Icon } from "@calcom/ui";
|
||||
import { RouterOutputs, trpc } from "@calcom/trpc/react";
|
||||
import { Alert, Button, EmptyScreen, Icon } from "@calcom/ui";
|
||||
|
||||
import { useInViewObserver } from "@lib/hooks/useInViewObserver";
|
||||
|
||||
@@ -16,7 +18,7 @@ import SkeletonLoader from "@components/booking/SkeletonLoader";
|
||||
|
||||
import { ssgInit } from "@server/lib/ssg";
|
||||
|
||||
type BookingListingStatus = RouterInputs["viewer"]["bookings"]["get"]["status"];
|
||||
type BookingListingStatus = z.infer<typeof filterQuerySchema>["status"];
|
||||
type BookingOutput = RouterOutputs["viewer"]["bookings"]["get"]["bookings"][0];
|
||||
|
||||
type RecurringInfo = {
|
||||
@@ -41,12 +43,19 @@ const querySchema = z.object({
|
||||
});
|
||||
|
||||
export default function Bookings() {
|
||||
const { data: filterQuery } = useFilterQuery();
|
||||
const router = useRouter();
|
||||
const { status } = router.isReady ? querySchema.parse(router.query) : { status: "upcoming" as const };
|
||||
const { t } = useLocale();
|
||||
|
||||
const query = trpc.viewer.bookings.get.useInfiniteQuery(
|
||||
{ status, limit: 10 },
|
||||
{
|
||||
limit: 10,
|
||||
filters: {
|
||||
...filterQuery,
|
||||
status: filterQuery.status ?? status,
|
||||
},
|
||||
},
|
||||
{
|
||||
// first render has status `undefined`
|
||||
enabled: router.isReady,
|
||||
@@ -165,7 +174,7 @@ export default function Bookings() {
|
||||
</>
|
||||
)}
|
||||
{query.status === "success" && isEmpty && (
|
||||
<div className="flex items-center justify-center pt-2 xl:mx-6 xl:pt-0">
|
||||
<div className="flex items-center justify-center pt-2 xl:pt-0">
|
||||
<EmptyScreen
|
||||
Icon={Icon.FiCalendar}
|
||||
headline={t("no_status_bookings_yet", { status: t(status).toLowerCase() })}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/* eslint-disable @typescript-eslint/no-empty-function */
|
||||
import { useAutoAnimate } from "@formkit/auto-animate/react";
|
||||
import { zodResolver } from "@hookform/resolvers/zod";
|
||||
import { PeriodType, Prisma, SchedulingType } from "@prisma/client";
|
||||
import { GetServerSidePropsContext } from "next";
|
||||
import { useRouter } from "next/router";
|
||||
@@ -36,6 +37,7 @@ import { EventLimitsTab } from "@components/eventtype/EventLimitsTab";
|
||||
import { EventRecurringTab } from "@components/eventtype/EventRecurringTab";
|
||||
import { EventSetupTab } from "@components/eventtype/EventSetupTab";
|
||||
import { EventTeamTab } from "@components/eventtype/EventTeamTab";
|
||||
import { EventTeamWebhooksTab } from "@components/eventtype/EventTeamWebhooksTab";
|
||||
import { EventTypeSingleLayout } from "@components/eventtype/EventTypeSingleLayout";
|
||||
import EventWorkflowsTab from "@components/eventtype/EventWorkfowsTab";
|
||||
|
||||
@@ -93,7 +95,17 @@ export type CustomInputParsed = typeof customInputSchema._output;
|
||||
|
||||
const querySchema = z.object({
|
||||
tabName: z
|
||||
.enum(["setup", "availability", "apps", "limits", "recurring", "team", "advanced", "workflows"])
|
||||
.enum([
|
||||
"setup",
|
||||
"availability",
|
||||
"apps",
|
||||
"limits",
|
||||
"recurring",
|
||||
"team",
|
||||
"advanced",
|
||||
"workflows",
|
||||
"webhooks",
|
||||
])
|
||||
.optional()
|
||||
.default("setup"),
|
||||
});
|
||||
@@ -193,6 +205,16 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
|
||||
),
|
||||
metadata,
|
||||
},
|
||||
resolver: zodResolver(
|
||||
z
|
||||
.object({
|
||||
// Length if string, is converted to a number or it can be a number
|
||||
// Make it optional because it's not submitted from all tabs of the page
|
||||
length: z.union([z.string().transform((val) => +val), z.number()]).optional(),
|
||||
})
|
||||
// TODO: Add schema for other fields later.
|
||||
.passthrough()
|
||||
),
|
||||
});
|
||||
|
||||
const appsMetadata = formMethods.getValues("metadata")?.apps;
|
||||
@@ -237,6 +259,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
|
||||
workflows={eventType.workflows.map((workflowOnEventType) => workflowOnEventType.workflow)}
|
||||
/>
|
||||
),
|
||||
webhooks: <EventTeamWebhooksTab eventType={eventType} team={team} />,
|
||||
} as const;
|
||||
|
||||
return (
|
||||
@@ -248,7 +271,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
|
||||
team={team}
|
||||
isUpdateMutationLoading={updateMutation.isLoading}
|
||||
formMethods={formMethods}
|
||||
disableBorder={tabName === "apps" || tabName === "workflows"}
|
||||
disableBorder={tabName === "apps" || tabName === "workflows" || tabName === "webhooks"}
|
||||
currentUserMembership={props.currentUserMembership}>
|
||||
<Form
|
||||
form={formMethods}
|
||||
@@ -283,7 +306,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
|
||||
if (metadata?.multipleDuration.length < 1) {
|
||||
throw new Error(t("event_setup_multiple_duration_error"));
|
||||
} else {
|
||||
if (input.length && !metadata?.multipleDuration?.includes(input.length)) {
|
||||
if (!input.length && !metadata?.multipleDuration?.includes(input.length)) {
|
||||
throw new Error(t("event_setup_multiple_duration_default_error"));
|
||||
}
|
||||
}
|
||||
@@ -436,6 +459,17 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
destinationCalendar: true,
|
||||
seatsPerTimeSlot: true,
|
||||
seatsShowAttendees: true,
|
||||
webhooks: {
|
||||
select: {
|
||||
id: true,
|
||||
subscriberUrl: true,
|
||||
payloadTemplate: true,
|
||||
active: true,
|
||||
eventTriggers: true,
|
||||
secret: true,
|
||||
eventTypeId: true,
|
||||
},
|
||||
},
|
||||
workflows: {
|
||||
include: {
|
||||
workflow: {
|
||||
|
||||
@@ -4,7 +4,10 @@ import Link from "next/link";
|
||||
import { useRouter } from "next/router";
|
||||
import React, { Fragment, useEffect, useState } from "react";
|
||||
|
||||
import CreateEventTypeButton from "@calcom/features/eventtypes/components/CreateEventTypeButton";
|
||||
import {
|
||||
CreateEventTypeButton,
|
||||
EventTypeDescriptionLazy as EventTypeDescription,
|
||||
} from "@calcom/features/eventtypes/components";
|
||||
import { APP_NAME, CAL_URL, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { RouterOutputs, trpc, TRPCClientError } from "@calcom/trpc/react";
|
||||
@@ -22,7 +25,6 @@ import {
|
||||
DropdownMenuSeparator,
|
||||
DropdownMenuTrigger,
|
||||
EmptyScreen,
|
||||
EventTypeDescription,
|
||||
Icon,
|
||||
Shell,
|
||||
showToast,
|
||||
@@ -177,22 +179,17 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
|
||||
}
|
||||
|
||||
// inject selection data into url for correct router history
|
||||
const openModal = (group: EventTypeGroup, type: EventType) => {
|
||||
const openDuplicateModal = (eventType: EventType) => {
|
||||
const query = {
|
||||
...router.query,
|
||||
dialog: "new-eventtype",
|
||||
eventPage: group.profile.slug,
|
||||
title: type.title,
|
||||
slug: type.slug,
|
||||
description: type.description,
|
||||
length: type.length,
|
||||
type: type.schedulingType,
|
||||
teamId: group.teamId,
|
||||
locations: encodeURIComponent(JSON.stringify(type.locations)),
|
||||
dialog: "duplicate-event-type",
|
||||
title: eventType.title,
|
||||
description: eventType.description,
|
||||
slug: eventType.slug,
|
||||
id: eventType.id,
|
||||
length: eventType.length,
|
||||
};
|
||||
if (!group.teamId) {
|
||||
delete query.teamId;
|
||||
}
|
||||
|
||||
router.push(
|
||||
{
|
||||
pathname: router.pathname,
|
||||
@@ -261,7 +258,7 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
|
||||
const calLink = `${CAL_URL}/${embedLink}`;
|
||||
return (
|
||||
<li key={type.id}>
|
||||
<div className="flex w-full items-center justify-between hover:bg-neutral-50">
|
||||
<div className="flex w-full items-center justify-between hover:bg-gray-50">
|
||||
<div className="group flex w-full max-w-full items-center justify-between overflow-hidden px-4 py-4 sm:px-6">
|
||||
{!(firstItem && firstItem.id === type.id) && (
|
||||
<button
|
||||
@@ -361,7 +358,7 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
|
||||
type="button"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiCopy}
|
||||
onClick={() => openModal(group, type)}>
|
||||
onClick={() => openDuplicateModal(type)}>
|
||||
{t("duplicate") as string}
|
||||
</DropdownItem>
|
||||
</DropdownMenuItem>
|
||||
@@ -469,7 +466,7 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
|
||||
className="w-full rounded-none"
|
||||
data-testid={"event-type-duplicate-" + type.id}
|
||||
StartIcon={Icon.FiCopy}
|
||||
onClick={() => openModal(group, type)}>
|
||||
onClick={() => openDuplicateModal(type)}>
|
||||
{t("duplicate") as string}
|
||||
</Button>
|
||||
</DropdownMenuItem>
|
||||
|
||||
@@ -10,7 +10,7 @@ function AdminAppsView() {
|
||||
const { t } = useLocale();
|
||||
return (
|
||||
<>
|
||||
<Meta title={t("apps")} description={t("apps_description")} />
|
||||
<Meta title={t("apps")} description={t("admin_apps_description")} />
|
||||
<AdminAppsList baseURL="/settings/admin/apps" className="w-0" />
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -189,7 +189,7 @@ const AppearanceView = () => {
|
||||
onCheckedChange={(checked) =>
|
||||
formMethods.setValue("hideBranding", checked, { shouldDirty: true })
|
||||
}
|
||||
checked={value}
|
||||
checked={!session.data?.user.belongsToActiveTeam ? false : value}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -70,6 +70,7 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
|
||||
const mutation = trpc.viewer.updateProfile.useMutation({
|
||||
onSuccess: () => {
|
||||
reset(getValues());
|
||||
showToast(t("settings_updated_successfully"), "success");
|
||||
},
|
||||
onError: () => {
|
||||
@@ -119,7 +120,12 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const {
|
||||
formState: { isDirty, isSubmitting },
|
||||
reset,
|
||||
getValues,
|
||||
} = formMethods;
|
||||
const isDisabled = isSubmitting || !isDirty;
|
||||
return (
|
||||
<Form
|
||||
form={formMethods}
|
||||
@@ -160,7 +166,7 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
id="timezone"
|
||||
value={value}
|
||||
onChange={(event) => {
|
||||
if (event) formMethods.setValue("timeZone", event.value);
|
||||
if (event) formMethods.setValue("timeZone", event.value, { shouldDirty: true });
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
@@ -178,7 +184,7 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
value={value}
|
||||
options={timeFormatOptions}
|
||||
onChange={(event) => {
|
||||
if (event) formMethods.setValue("timeFormat", { ...event });
|
||||
if (event) formMethods.setValue("timeFormat", { ...event }, { shouldDirty: true });
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
@@ -199,13 +205,13 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
value={value}
|
||||
options={weekStartOptions}
|
||||
onChange={(event) => {
|
||||
if (event) formMethods.setValue("weekStart", { ...event });
|
||||
if (event) formMethods.setValue("weekStart", { ...event }, { shouldDirty: true });
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
/>
|
||||
<Button color="primary" type="submit" className="mt-8">
|
||||
<Button disabled={isDisabled} color="primary" type="submit" className="mt-8">
|
||||
<>{t("update")}</>
|
||||
</Button>
|
||||
</Form>
|
||||
|
||||
@@ -23,8 +23,24 @@ const ProfileImpersonationView = () => {
|
||||
const mutation = trpc.viewer.updateProfile.useMutation({
|
||||
onSuccess: () => {
|
||||
showToast(t("profile_updated_successfully"), "success");
|
||||
reset(getValues());
|
||||
},
|
||||
onError: (error) => {
|
||||
onSettled: () => {
|
||||
utils.viewer.me.invalidate();
|
||||
},
|
||||
onMutate: async ({ disableImpersonation }) => {
|
||||
await utils.viewer.me.cancel();
|
||||
const previousValue = utils.viewer.me.getData();
|
||||
|
||||
if (previousValue && disableImpersonation) {
|
||||
utils.viewer.me.setData(undefined, { ...previousValue, disableImpersonation });
|
||||
}
|
||||
return { previousValue };
|
||||
},
|
||||
onError: (error, variables, context) => {
|
||||
if (context?.previousValue) {
|
||||
utils.viewer.me.setData(undefined, context.previousValue);
|
||||
}
|
||||
showToast(`${t("error")}, ${error.message}`, "error");
|
||||
},
|
||||
});
|
||||
@@ -36,10 +52,13 @@ const ProfileImpersonationView = () => {
|
||||
});
|
||||
|
||||
const {
|
||||
formState: { isSubmitting },
|
||||
formState: { isSubmitting, isDirty },
|
||||
setValue,
|
||||
reset,
|
||||
getValues,
|
||||
} = formMethods;
|
||||
|
||||
const isDisabled = isSubmitting || !isDirty;
|
||||
return (
|
||||
<>
|
||||
<Meta title={t("impersonation")} description={t("impersonation_description")} />
|
||||
@@ -47,14 +66,12 @@ const ProfileImpersonationView = () => {
|
||||
form={formMethods}
|
||||
handleSubmit={({ disableImpersonation }) => {
|
||||
mutation.mutate({ disableImpersonation });
|
||||
utils.viewer.me.invalidate();
|
||||
}}>
|
||||
<div className="flex space-x-3">
|
||||
<Switch
|
||||
{...formMethods.register("disableImpersonation")}
|
||||
defaultChecked={!user?.disableImpersonation}
|
||||
onCheckedChange={(e) => {
|
||||
setValue("disableImpersonation", !e);
|
||||
setValue("disableImpersonation", !e, { shouldDirty: true });
|
||||
}}
|
||||
fitToHeight={true}
|
||||
/>
|
||||
@@ -67,7 +84,7 @@ const ProfileImpersonationView = () => {
|
||||
</Skeleton>
|
||||
</div>
|
||||
</div>
|
||||
<Button color="primary" className="mt-8" type="submit" disabled={isSubmitting || mutation.isLoading}>
|
||||
<Button color="primary" className="mt-8" type="submit" disabled={isDisabled}>
|
||||
{t("update")}
|
||||
</Button>
|
||||
</Form>
|
||||
@@ -79,7 +96,7 @@ ProfileImpersonationView.getLayout = getLayout;
|
||||
|
||||
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
|
||||
const ssr = await ssrInit(context);
|
||||
|
||||
await ssr.viewer.me.prefetch();
|
||||
return {
|
||||
props: {
|
||||
trpcState: ssr.dehydrate(),
|
||||
|
||||
@@ -18,10 +18,9 @@ import EnableTwoFactorModal from "@components/settings/EnableTwoFactorModal";
|
||||
|
||||
import { ssrInit } from "@server/lib/ssr";
|
||||
|
||||
const SkeletonLoader = ({ title, description }: { title: string; description: string }) => {
|
||||
const SkeletonLoader = () => {
|
||||
return (
|
||||
<SkeletonContainer>
|
||||
<Meta title={title} description={description} />
|
||||
<div className="mt-6 mb-8 space-y-6 divide-y">
|
||||
<div className="flex items-center">
|
||||
<SkeletonButton className="mr-6 h-8 w-20 rounded-md p-5" />
|
||||
@@ -41,7 +40,7 @@ const TwoFactorAuthView = () => {
|
||||
const [enableModalOpen, setEnableModalOpen] = useState(false);
|
||||
const [disableModalOpen, setDisableModalOpen] = useState(false);
|
||||
|
||||
if (isLoading) return <SkeletonLoader title={t("2fa")} description={t("2fa_description")} />;
|
||||
if (isLoading) return <SkeletonLoader />;
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
@@ -6,6 +6,7 @@ import { FormProvider, SubmitHandler, useForm } from "react-hook-form";
|
||||
import LicenseRequired from "@calcom/features/ee/common/components/v2/LicenseRequired";
|
||||
import { isSAMLLoginEnabled } from "@calcom/features/ee/sso/lib/saml";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import { inferSSRProps } from "@calcom/types/inferSSRProps";
|
||||
import { Alert, Button, EmailField, PasswordField, TextField } from "@calcom/ui";
|
||||
import { HeadSeo } from "@calcom/web/components/seo/head-seo";
|
||||
@@ -26,6 +27,8 @@ type FormValues = {
|
||||
export default function Signup({ prepopulateFormValues }: inferSSRProps<typeof getServerSideProps>) {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
const telemetry = useTelemetry();
|
||||
|
||||
const methods = useForm<FormValues>({
|
||||
defaultValues: prepopulateFormValues,
|
||||
});
|
||||
@@ -53,8 +56,12 @@ export default function Signup({ prepopulateFormValues }: inferSSRProps<typeof g
|
||||
})
|
||||
.then(handleErrors)
|
||||
.then(async () => {
|
||||
await signIn("Cal.com", {
|
||||
callbackUrl: router.query.callbackUrl ? `${WEBAPP_URL}/${router.query.callbackUrl}` : WEBAPP_URL,
|
||||
telemetry.event(telemetryEventTypes.login, collectPageParameters());
|
||||
await signIn<"credentials">("credentials", {
|
||||
...data,
|
||||
callbackUrl: router.query.callbackUrl
|
||||
? `${WEBAPP_URL}/${router.query.callbackUrl}`
|
||||
: `${WEBAPP_URL}/getting-started`,
|
||||
});
|
||||
})
|
||||
.catch((err) => {
|
||||
@@ -111,7 +118,9 @@ export default function Signup({ prepopulateFormValues }: inferSSRProps<typeof g
|
||||
className="w-5/12 justify-center"
|
||||
onClick={() =>
|
||||
signIn("Cal.com", {
|
||||
callbackUrl: (`${WEBAPP_URL}/${router.query.callbackUrl}` || "") as string,
|
||||
callbackUrl: router.query.callbackUrl
|
||||
? `${WEBAPP_URL}/${router.query.callbackUrl}`
|
||||
: `${WEBAPP_URL}/getting-started`,
|
||||
})
|
||||
}>
|
||||
{t("login_instead")}
|
||||
|
||||
@@ -5,13 +5,14 @@ import { useRouter } from "next/router";
|
||||
import { useEffect } from "react";
|
||||
|
||||
import { useIsEmbed } from "@calcom/embed-core/embed-iframe";
|
||||
import EventTypeDescription from "@calcom/features/eventtypes/components/EventTypeDescription";
|
||||
import { CAL_URL } from "@calcom/lib/constants";
|
||||
import { getPlaceholderAvatar } from "@calcom/lib/getPlaceholderAvatar";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import useTheme from "@calcom/lib/hooks/useTheme";
|
||||
import { getTeamWithMembers } from "@calcom/lib/server/queries/teams";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import { Avatar, Button, EventTypeDescription, Icon } from "@calcom/ui";
|
||||
import { Avatar, Button, Icon } from "@calcom/ui";
|
||||
|
||||
import { useToggleQuery } from "@lib/hooks/useToggleQuery";
|
||||
import { inferSSRProps } from "@lib/types/inferSSRProps";
|
||||
@@ -37,12 +38,12 @@ function TeamPage({ team }: TeamPageProps) {
|
||||
}, [telemetry, router.asPath]);
|
||||
|
||||
const EventTypes = () => (
|
||||
<ul className="">
|
||||
<ul className="rounded-md border border-neutral-200 dark:border-neutral-700">
|
||||
{team.eventTypes.map((type, index) => (
|
||||
<li
|
||||
key={index}
|
||||
className={classNames(
|
||||
"dark:bg-darkgray-100 dark:border-darkgray-200 group relative rounded-sm border border-neutral-200 bg-white hover:bg-gray-50 dark:hover:border-neutral-600",
|
||||
"dark:bg-darkgray-100 group relative border-b border-neutral-200 bg-white first:rounded-t-md last:rounded-b-md last:border-b-0 hover:bg-gray-50 dark:border-neutral-700 dark:hover:border-neutral-600",
|
||||
!isEmbed && "bg-white"
|
||||
)}>
|
||||
<Link href={`/team/${team.slug}/${type.slug}`}>
|
||||
@@ -96,9 +97,7 @@ function TeamPage({ team }: TeamPageProps) {
|
||||
{(showMembers.isOn || !team.eventTypes.length) && <Team team={team} />}
|
||||
{!showMembers.isOn && team.eventTypes.length > 0 && (
|
||||
<div className="mx-auto max-w-3xl ">
|
||||
<div className="dark:border-darkgray-300 rounded-md border">
|
||||
<EventTypes />
|
||||
</div>
|
||||
<EventTypes />
|
||||
<div className="relative mt-12">
|
||||
<div className="absolute inset-0 flex items-center" aria-hidden="true">
|
||||
<div className="dark:border-darkgray-300 w-full border-t border-gray-200" />
|
||||
|
||||
@@ -14,7 +14,7 @@ function Teams() {
|
||||
heading={t("teams")}
|
||||
subtitle={t("create_manage_teams_collaborative")}
|
||||
CTA={
|
||||
<Button type="button" href={`${WEBAPP_URL}/settings/teams/new`}>
|
||||
<Button type="button" href={`${WEBAPP_URL}/settings/teams/new?returnTo=/teams`}>
|
||||
<Icon.FiPlus className="inline-block h-3.5 w-3.5 text-white group-hover:text-black ltr:mr-2 rtl:ml-2" />
|
||||
{t("new")}
|
||||
</Button>
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
import { expect } from "@playwright/test";
|
||||
|
||||
import dayjs from "@calcom/dayjs";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
|
||||
test.describe.configure({ mode: "parallel" });
|
||||
|
||||
test.describe("Availablity tests", () => {
|
||||
test.beforeEach(async ({ page, users }) => {
|
||||
const user = await users.create();
|
||||
await user.login();
|
||||
await page.goto("/availability");
|
||||
// We wait until loading is finished
|
||||
await page.waitForSelector('[data-testid="schedules"]');
|
||||
});
|
||||
|
||||
test.afterEach(async ({ users }) => {
|
||||
await users.deleteAll();
|
||||
});
|
||||
|
||||
test("Date Overrides", async ({ page }) => {
|
||||
await test.step("Can add a date override", async () => {
|
||||
await page.locator('[data-testid="schedules"] > li a').click();
|
||||
await page.locator('[data-testid="add-override"]').click();
|
||||
await page.locator('[id="modal-title"]').waitFor();
|
||||
await page.locator('[data-testid="incrementMonth"]').click();
|
||||
await page.locator('[data-testid="day"][data-disabled="false"]').nth(0).click();
|
||||
await page.locator('[data-testid="date-override-mark-unavailable"]').click();
|
||||
await page.locator('[data-testid="add-override-submit-btn"]').click();
|
||||
await expect(page.locator('[data-testid="date-overrides-list"] > li')).toHaveCount(1);
|
||||
await page.locator('[form="availability-form"][type="submit"]').click();
|
||||
});
|
||||
|
||||
await test.step("Date override is displayed in troubleshooter", async () => {
|
||||
const response = await page.waitForResponse("**/api/trpc/viewer.availability.schedule.update?batch=1");
|
||||
const json = await response.json();
|
||||
// @ts-expect-error trust me bro
|
||||
const date = json[0].result.data.json.schedule.availability.find((a) => !!a.date);
|
||||
const troubleshooterURL = `/availability/troubleshoot?date=${dayjs(date.date).format("YYYY-MM-DD")}`;
|
||||
await page.goto(troubleshooterURL);
|
||||
await expect(page.locator('[data-testid="troubleshooter-busy-time"]')).toHaveCount(1);
|
||||
});
|
||||
});
|
||||
|
||||
test("Availablity pages", async ({ page }) => {
|
||||
await test.step("Can add a new schedule", async () => {
|
||||
await page.locator('[data-testid="new-schedule"]').click();
|
||||
await page.locator('[id="name"]').fill("More working hours");
|
||||
page.locator('[type="submit"]').click();
|
||||
await expect(page.locator("[data-testid=availablity-title]")).toHaveValue("More working hours");
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -8,10 +8,10 @@ import { test } from "./lib/fixtures";
|
||||
test.describe.configure({ mode: "parallel" });
|
||||
|
||||
test.describe("Event Types tests", () => {
|
||||
test.describe("pro user", () => {
|
||||
test.describe("user", () => {
|
||||
test.beforeEach(async ({ page, users }) => {
|
||||
const proUser = await users.create();
|
||||
await proUser.login();
|
||||
const user = await users.create();
|
||||
await user.login();
|
||||
await page.goto("/event-types");
|
||||
// We wait until loading is finished
|
||||
await page.waitForSelector('[data-testid="event-types"]');
|
||||
@@ -101,13 +101,13 @@ test.describe("Event Types tests", () => {
|
||||
const params = new URLSearchParams(url);
|
||||
|
||||
expect(params.get("title")).toBe(firstTitle);
|
||||
expect(params.get("slug")).toBe(firstSlug);
|
||||
expect(params.get("slug")).toContain(firstSlug);
|
||||
|
||||
const formTitle = await page.inputValue("[name=title]");
|
||||
const formSlug = await page.inputValue("[name=slug]");
|
||||
|
||||
expect(formTitle).toBe(firstTitle);
|
||||
expect(formSlug).toBe(firstSlug);
|
||||
expect(formSlug).toContain(firstSlug);
|
||||
});
|
||||
test("edit first event", async ({ page }) => {
|
||||
const $eventTypes = page.locator("[data-testid=event-types] > li a");
|
||||
|
||||
@@ -247,7 +247,7 @@ const createUser = async (
|
||||
opts?: CustomUserOpts | null
|
||||
): Promise<PrismaType.UserCreateInput> => {
|
||||
// build a unique name for our user
|
||||
const uname = `${opts?.username}-${workerInfo.workerIndex}-${Date.now()}`;
|
||||
const uname = `${opts?.username || "user"}-${workerInfo.workerIndex}-${Date.now()}`;
|
||||
return {
|
||||
username: uname,
|
||||
name: opts?.name,
|
||||
|
||||
@@ -57,6 +57,7 @@ test("add webhook & test that creating an event triggers a webhook call", async
|
||||
attendee.timeZone = dynamic;
|
||||
attendee.language = dynamic;
|
||||
}
|
||||
body.payload.organizer.id = dynamic;
|
||||
body.payload.organizer.email = dynamic;
|
||||
body.payload.organizer.timeZone = dynamic;
|
||||
body.payload.organizer.language = dynamic;
|
||||
@@ -67,6 +68,7 @@ test("add webhook & test that creating an event triggers a webhook call", async
|
||||
body.payload.eventTypeId = dynamic;
|
||||
body.payload.videoCallData = dynamic;
|
||||
body.payload.appsStatus = dynamic;
|
||||
body.payload.metadata.videoCallUrl = dynamic;
|
||||
|
||||
// if we change the shape of our webhooks, we can simply update this by clicking `u`
|
||||
// console.log("BODY", body);
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"triggerEvent":"BOOKING_CREATED","createdAt":"[redacted/dynamic]","payload":{"type":"30 min","title":"30 min between Nameless and Test Testson","description":"","additionalNotes":"","customInputs":{},"startTime":"[redacted/dynamic]","endTime":"[redacted/dynamic]","organizer":{"name":"Nameless","email":"[redacted/dynamic]","timeZone":"[redacted/dynamic]","language":"[redacted/dynamic]"},"attendees":[{"email":"test@example.com","name":"Test Testson","timeZone":"[redacted/dynamic]","language":"[redacted/dynamic]"}],"location":"[redacted/dynamic]","destinationCalendar":null,"hideCalendarNotes":false,"requiresConfirmation":"[redacted/dynamic]","eventTypeId":"[redacted/dynamic]","seatsShowAttendees":false,"uid":"[redacted/dynamic]","videoCallData":"[redacted/dynamic]","appsStatus":"[redacted/dynamic]","eventTitle":"30 min","eventDescription":null,"price":0,"currency":"usd","length":30,"bookingId":"[redacted/dynamic]","metadata":{},"status":"ACCEPTED","additionalInformation":"[redacted/dynamic]"}}
|
||||
{"triggerEvent":"BOOKING_CREATED","createdAt":"[redacted/dynamic]","payload":{"type":"30 min","title":"30 min between Nameless and Test Testson","description":"","additionalNotes":"","customInputs":{},"startTime":"[redacted/dynamic]","endTime":"[redacted/dynamic]","organizer":{"id":"[redacted/dynamic]","name":"Nameless","email":"[redacted/dynamic]","timeZone":"[redacted/dynamic]","language":"[redacted/dynamic]"},"attendees":[{"email":"test@example.com","name":"Test Testson","timeZone":"[redacted/dynamic]","language":"[redacted/dynamic]"}],"location":"[redacted/dynamic]","destinationCalendar":null,"hideCalendarNotes":false,"requiresConfirmation":"[redacted/dynamic]","eventTypeId":"[redacted/dynamic]","seatsShowAttendees":false,"uid":"[redacted/dynamic]","videoCallData":"[redacted/dynamic]","appsStatus":"[redacted/dynamic]","eventTitle":"30 min","eventDescription":null,"price":0,"currency":"usd","length":30,"bookingId":"[redacted/dynamic]","metadata":{"videoCallUrl":"[redacted/dynamic]"},"status":"ACCEPTED","additionalInformation":"[redacted/dynamic]"}}
|
||||
@@ -0,0 +1,5 @@
|
||||
<svg stroke="#888888" fill="none" stroke-width="2.5" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
|
||||
<polyline points="15 3 21 3 21 9"></polyline>
|
||||
<line x1="10" y1="14" x2="21" y2="3"></line>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 360 B |
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 53 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 35 KiB |
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "يوجد حدث لا يزال في انتظار الموافقة",
|
||||
"event_is_still_waiting": "لا يزال طلب الحدث في الانتظار: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "لا يوجد مزيد من النتائج",
|
||||
"no_results": "لا نتائج",
|
||||
"load_more_results": "تحميل المزيد من النتائج",
|
||||
"integration_meeting_id": "مُعرّف اجتماع {{integrationName}}: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "تم التأكيد: {{eventType}} مع {{name}} في {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "إضافة إلى التقويم",
|
||||
"add_another_calendar": "إضافة تقويم آخر",
|
||||
"other": "آخر",
|
||||
"email_sign_in_subject": "رابط تسجيل الدخول بك لـ{{appName}}",
|
||||
"emailed_you_and_attendees": "لقد أرسلنا إليك وإلى الحضور الآخرين دعوة للتقويم عبر البريد الإلكتروني تتضمن كل التفاصيل.",
|
||||
"emailed_you_and_attendees_recurring": "لقد أرسلنا إليك وإلى الحضور الآخرين دعوة تقويم عبر البريد الإلكتروني لأول هذه الأحداث المتكررة.",
|
||||
"emailed_you_and_any_other_attendees": "تم إرسال هذه المعلومات إليك وإلى الحضور الآخرين عبر البريد الإلكتروني.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "كلمة المرور الحالية غير صحيحة",
|
||||
"password_hint_caplow": "مزيج من الحروف الكبيرة والحروف الصغيرة",
|
||||
"password_hint_min": "8 أحرف كحد أدنى",
|
||||
"password_hint_admin_min": "15 محرفًا كحد أدنى",
|
||||
"password_hint_num": "يحتوي على رقم واحد على الأقل",
|
||||
"invalid_password_hint": "يجب أن تتألف كلمة المرور على الأقل من 7 أحرف، ورقم واحد على الأقل، ومزيج من الحروف الكبيرة والصغيرة",
|
||||
"incorrect_password": "كلمة المرور غير صحيحة.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "قم بتأكيد {{eventTypeTitle}} مع {{profileName}}",
|
||||
"booking_reschedule_confirmation": "أعد جدولة {{eventTypeTitle}} مع {{profileName}}",
|
||||
"in_person_meeting": "الرابط أو الاجتماع الشخصي",
|
||||
"attendeeInPerson": "شخصيًا (عنوان من سيحضر)",
|
||||
"inPerson": "شخصيًا (عنوان المنظم)",
|
||||
"link_meeting": "رابط الاجتماع",
|
||||
"phone_call": "رقم هاتف الحضور",
|
||||
"your_number": "رقم هاتفك",
|
||||
"phone_number": "رقم الهاتف",
|
||||
"attendee_phone_number": "رقم هاتف الحضور",
|
||||
"organizer_phone_number": "رقم هاتف المنظم",
|
||||
"host_phone_number": "رقم هاتفك",
|
||||
"enter_phone_number": "أدخل رقم الهاتف",
|
||||
"reschedule": "إعادة الجدولة",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "جماعي",
|
||||
"collective_description": "جدولة الاجتماعات عندما يكون جميع أعضاء الفريق المحددين متاحين.",
|
||||
"duration": "المدة",
|
||||
"available_durations": "المدد المتاحة",
|
||||
"default_duration": "المدة الافتراضية",
|
||||
"default_duration_no_options": "يرجى اختيار المدد المتاحة أولاً",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "الدقائق",
|
||||
"round_robin": "الترتيب الدوري",
|
||||
"round_robin_description": "نقل الاجتماعات بشكل دوري بين أعضاء الفريق المتعددين.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "الفرق",
|
||||
"team": "فريق",
|
||||
"team_billing": "الفوترة الخاصة بالفريق",
|
||||
"team_billing_description": "إدارة الفواتير لفريقك",
|
||||
"upgrade_to_flexible_pro_title": "لقد قمنا بتغيير الفوترة الخاصة بالفرق",
|
||||
"upgrade_to_flexible_pro_message": "يوجد أعضاء في فريقك من دون مقاعد. قم بترقية خطة Pro خاصتك لتوفير المقاعد الناقصة.",
|
||||
"changed_team_billing_info": "بدءًا من يناير 2022، أصبحنا نفرض الرسوم على مقاعد أعضاء الفريق بشكل منفرد. حاليًا، أعضاء فريقك الذين كانت لديهم خطة Pro مجانية أصبحوا في فترة تجريبية مدتها 14 يومًا. وبمجرد انتهاء الفترة التجريبية الخاصة بهم، سيجري إخفاء هؤلاء الأعضاء من فريقك ما لم تقم بالترقية الآن.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "إخفاء نوع الحدث",
|
||||
"edit_location": "تعديل الموقع",
|
||||
"into_the_future": "في المستقبل",
|
||||
"when_booked_with_less_than_notice": "عند الحجز بأقل من إشعار <time></time>",
|
||||
"within_date_range": "خلال فترة زمنية",
|
||||
"indefinitely_into_future": "إلى أجل غير مسمى في المستقبل",
|
||||
"add_new_custom_input_field": "إضافة خانة إدخال مخصص جديدة",
|
||||
@@ -713,6 +725,8 @@
|
||||
"delete_account_confirmation_message": "هل تريد بالتأكيد حذف حسابك على {{appName}}؟ أي شخص شاركت رابط حسابك معه لن يستطيع بعد الآن الحجز باستخدامه، وستفقد أي تفضيلات حفظتها.",
|
||||
"integrations": "التكاملات",
|
||||
"apps": "التطبيقات",
|
||||
"apps_description": "تمكين تطبيقات مثيل Cal الخاص بك",
|
||||
"apps_listing": "قائمة التطبيقات",
|
||||
"category_apps": "تطبيقات {{category}}",
|
||||
"app_store": "متجر التطبيقات",
|
||||
"app_store_description": "الربط بين الناس، والتكنولوجيا، ومكان العمل.",
|
||||
@@ -736,6 +750,7 @@
|
||||
"toggle_calendars_conflict": "قم بتبديل التقويمات التي تريد التحقق من وجود تضاربات فيها لمنع حدوث حجز مزدوج.",
|
||||
"select_destination_calendar": "إنشاء أحداث في",
|
||||
"connect_additional_calendar": "ربط رزنامة إضافية",
|
||||
"calendar_updated_successfully": "تم تحديث الرزنامة بنجاح",
|
||||
"conferencing": "المؤتمرات عبر الفيديو",
|
||||
"calendar": "التقويم",
|
||||
"payments": "المدفوعات",
|
||||
@@ -768,6 +783,7 @@
|
||||
"trending_apps": "التطبيقات الرائجة",
|
||||
"explore_apps": "تطبيقات {{category}}",
|
||||
"installed_apps": "التطبيقات المثبتة",
|
||||
"free_to_use_apps": "متاح",
|
||||
"no_category_apps": "لا توجد تطبيقات {{category}}",
|
||||
"no_category_apps_description_calendar": "إضافة تطبيق تقويم للتحقق من أي تضارب لمنع أي حجوزات مزدوجة",
|
||||
"no_category_apps_description_conferencing": "جرب إضافة تطبيق مؤتمرات لإنشاء مكالمات فيديو مع عملائك",
|
||||
@@ -806,6 +822,8 @@
|
||||
"verify_wallet": "تأكيد المحفظة",
|
||||
"connect_metamask": "توصيل Metamask",
|
||||
"create_events_on": "إنشاء أحداث في",
|
||||
"enterprise_license": "هذه هي ميزة للمؤسسات",
|
||||
"enterprise_license_description": "لتمكين هذه الميزة، احصل على مفتاح نشر في وحدة التحكم {{consoleUrl}} وأضفه إلى وحدة التحكم الخاصة بك. nv باسم CALCOM_LICENSE_KEY. إذا كان لدى فريقك بالفعل ترخيص، يرجى الاتصال بـ {{supportMail}} للحصول على المساعدة.",
|
||||
"missing_license": "الترخيص مفقود",
|
||||
"signup_requires": "يلزم ترخيص تجاري",
|
||||
"signup_requires_description": "لا تقدم شركة {{companyName}} حاليًا إصدارًا مجانيًا مفتوح المصدر لصفحة التسجيل. للحصول على حق الوصول الكامل إلى مكونات التسجيل، يجب أن تحصل على ترخيص تجاري. للاستخدام الشخصي، نوصي باستخدام منصة Prisma Data أو أي واجهة أخرى من واجهات Postgres لإنشاء الحسابات.",
|
||||
@@ -897,6 +915,7 @@
|
||||
"user_impersonation_heading": "انتحال شخصية مستخدم",
|
||||
"user_impersonation_description": "يسمح لفريق الدعم الخاص بنا بتسجيل الدخول مؤقتًا نيابة عنك لمساعدتنا على حل أي مشاكل تبلغ عنها بسرعة.",
|
||||
"team_impersonation_description": "يسمح لأعضاء فريقك بتسجيل الدخول نيابة عنك مؤقتًا.",
|
||||
"allow_booker_to_select_duration": "السماح لمن يقوم بالحجز بتحديد المدة",
|
||||
"impersonate_user_tip": "يتم مراجعة جميع استخدامات هذه الميزة.",
|
||||
"impersonating_user_warning": "انتحال اسم مستخدم \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>انقر هنا لإيقاف </0>.",
|
||||
@@ -1014,6 +1033,9 @@
|
||||
"error_removing_app": "خطأ في إزالة التطبيق",
|
||||
"web_conference": "مؤتمر عبر الإنترنت",
|
||||
"requires_confirmation": "يتطلب التأكيد",
|
||||
"always_requires_confirmation": "دائمًا",
|
||||
"requires_confirmation_threshold": "يتطلب تأكيد إذا تم حجزه مع إشعار $t({{unit}}_timeUnit){{time}}",
|
||||
"may_require_confirmation": "قد يتطلب التأكيد",
|
||||
"nr_event_type_one": "{{count}} نوع حدث",
|
||||
"nr_event_type_other": "{{count}} من أنواع الحدث",
|
||||
"add_action": "إضافة إجراء",
|
||||
@@ -1101,6 +1123,9 @@
|
||||
"event_limit_tab_description": "ما تواتر مرات الحجز",
|
||||
"event_advanced_tab_description": "إعدادات الرزنامة والمزيد...",
|
||||
"event_advanced_tab_title": "متقدم",
|
||||
"event_setup_multiple_duration_error": "إعداد الحدث: تستلزم فترات متعددة خيارًا واحدًا على الأقل.",
|
||||
"event_setup_multiple_duration_default_error": "إعداد الحدث: الرجاء تحديد مدة افتراضية صالحة.",
|
||||
"event_setup_booking_limits_error": "يجب أن تكون حدود الحجز بترتيب تصاعدي. [يوم،أسبوع،شهر،سنة]",
|
||||
"select_which_cal": "اختر أي رزنامة تريد إضافة الحجز إليها",
|
||||
"custom_event_name": "اسم حدث مخصص",
|
||||
"custom_event_name_description": "إنشاء أسماء أحداث مخصصة لعرضها في حدث الرزنامة",
|
||||
@@ -1154,8 +1179,11 @@
|
||||
"invoices": "الفواتير",
|
||||
"embeds": "التضمينات",
|
||||
"impersonation": "انتحال الشخصية",
|
||||
"impersonation_description": "إعدادات إدارة انتحال شخصية مستخدم",
|
||||
"users": "المستخدمون",
|
||||
"profile_description": "إدارة الإعدادات لملفك الشخصي على {{appName}}",
|
||||
"users_description": "يمكنك هنا العثور على قائمة بجميع المستخدمين",
|
||||
"users_listing": "قائمة المستخدمين",
|
||||
"general_description": "إدارة الإعدادات للغة والمنطقة الزمنية الخاصة بك",
|
||||
"calendars_description": "قم بتهيئة كيفية تفاعل أنواع الأحداث مع التقويمات الخاصة بك",
|
||||
"appearance_description": "إدارة إعدادات مظهر الحجز الخاص بك",
|
||||
@@ -1360,6 +1388,7 @@
|
||||
"number_sms_notifications": "رقم الهاتف (إشعارات الرسائل النصية)",
|
||||
"attendee_email_workflow": "اسم الحاضر",
|
||||
"attendee_email_info": "البريد الإلكتروني للشخص الحجز",
|
||||
"kbar_search_placeholder": "اكتب أمرًا أو بحثًا...",
|
||||
"invalid_credential": "لا! يبدو أن الصلاحية انتهت أو تم إلغاؤها. يرجى إعادة التثبيت مرة أخرى.",
|
||||
"choose_common_schedule_team_event": "اختر جدولاً زمنياً مشتركاً",
|
||||
"choose_common_schedule_team_event_description": "قم بتمكين هذا الخيار إذا كنت ترغب في استخدام جدول زمني مشترك بين المضيفين. عند تعطيل هذا الخيار، سيتم حجز كل مضيف على أساس جدوله الافتراضي.",
|
||||
@@ -1370,5 +1399,44 @@
|
||||
"test_preview": "اختبار المعاينة",
|
||||
"route_to": "التوجيه إلى",
|
||||
"test_preview_description": "اختبار نموذج التوجيه الخاص بك دون تقديم أي بيانات",
|
||||
"test_routing": "اختبار التوجيه"
|
||||
"test_routing": "اختبار التوجيه",
|
||||
"payment_app_disabled": "قام المشرف بتعطيل تطبيق دفع",
|
||||
"edit_event_type": "تعديل نوع الحدث",
|
||||
"collective_scheduling": "جدولة جماعية",
|
||||
"make_it_easy_to_book": "سهّل على فريقك الحجز عندما يكون الجميع متاحين.",
|
||||
"find_the_best_person": "ابحث عن أفضل شخص متوفر، وقم بالتدوير بين أعضاء فريقك.",
|
||||
"fixed_round_robin": "روبين دائري ثابت",
|
||||
"add_one_fixed_attendee": "أضف حاضرًا ثابتًا وروبين مستدير من خلال عدد من الحاضرين.",
|
||||
"calcom_is_better_with_team": "Cal.com أفضل مع الفرق",
|
||||
"add_your_team_members": "أضف أعضاء فريقك إلى أنواع الأحداث الخاصة بك. استخدم الجدولة الجماعية لإدراج الجميع أو العثور على أنسب شخص مع جدولة روبن الدائرية.",
|
||||
"booking_limit_reached": "تم الوصول إلى الحد الأقصى للحجز لهذا النوع من الأحداث",
|
||||
"admin_has_disabled": "قام المشرف بتعطيل {{appName}}",
|
||||
"disabled_app_affects_event_type": "قام المشرف بتعطيل {{appName}} مما يؤثر على نوع الحدث {{eventType}} لديك",
|
||||
"disable_payment_app": "قام المشرف بتعطيل {{appName}} الذي يؤثر على نوع الحدث {{title}} لديك. ولا يزال بإمكان الحاضرين حجز هذا النوع من الأحداث، ولكن لن يُطالبوا بالدفع. يمكنك إخفاء نوع الحدث لمنع حدوث هذا إلى أن يقوم المشرف بتغيير طريقة الدفع لك.",
|
||||
"payment_disabled_still_able_to_book": "لا يزال بإمكان الحاضرين حجز هذا النوع من الأحداث، ولكن لن يُطالبوا بالدفع. يمكنك إخفاء نوع الحدث لمنع حدوث هذا إلى أن يقوم المشرف بتغيير طريقة الدفع لك.",
|
||||
"app_disabled_with_event_type": "عطّل المشرف {{appName}} مما يؤثر على نوع الحدث {{title}} لديك.",
|
||||
"app_disabled_video": "عطّل المشرف {{appName}} الذي قد يؤثر على أنواع الأحداث لديك. إذا كان لديك أنواع من الأحداث مع {{appName}} كموقع، سيكون افتراضيًا من أجل فيديو Cal.",
|
||||
"app_disabled_subject": "تم تعطيل {{appName}}",
|
||||
"navigate_installed_apps": "الذهاب إلى التطبيقات المثبتة",
|
||||
"disabled_calendar": "إذا كان لديك تقويم آخر مثبت، ستُضاف الحجوزات الجديدة إليه. إذا لم يكن الأمر كذلك، قم إذن بتوصيل تقويم جديد لكيلا تفوت أي حجوزات جديدة.",
|
||||
"enable_apps": "تمكين التطبيقات",
|
||||
"enable_apps_description": "تمكين التطبيقات التي يمكن للمستخدمين دمجها مع Cal.com",
|
||||
"app_is_enabled": "تم تمكين {{appName}}",
|
||||
"app_is_disabled": "تم تعطيل {{appName}}",
|
||||
"keys_have_been_saved": "تم حفظ المفاتيح",
|
||||
"disable_app": "تعطيل التطبيق",
|
||||
"disable_app_description": "يمكن لتعطيل هذا التطبيق أن يسبب مشاكل مع كيفية تفاعل المستخدمين مع Cal",
|
||||
"edit_keys": "تحرير المفاتيح",
|
||||
"admin_apps_description": "تمكين تطبيقات مثيل Cal الخاص بك",
|
||||
"no_available_apps": "لا توجد تطبيقات متاحة",
|
||||
"no_available_apps_description": "الرجاء التأكد من وجود تطبيقات في نشرك تحت 'حزم/متجر تطبيقات'",
|
||||
"no_apps": "لا توجد تطبيقات مفعلة في هذا المظهر من Cal",
|
||||
"apps_settings": "إعدادات التطبيقات",
|
||||
"fill_this_field": "يرجى ملء هذا الحقل",
|
||||
"options": "خيارات",
|
||||
"enter_option": "أدخل خيار {{index}}",
|
||||
"add_an_option": "إضافة خيار",
|
||||
"radio": "الراديو",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-نسخ",
|
||||
"set_as_default": "تعيين كافتراضي"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Událost stále čeká na schválení",
|
||||
"event_is_still_waiting": "Požadavek na událost stále čeká: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Žádné další výsledky",
|
||||
"no_results": "Žádné výsledky",
|
||||
"load_more_results": "Načíst další výsledky",
|
||||
"integration_meeting_id": "{{integrationName}} ID schůzky: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Potvrzeno: {{eventType}} s {{name}} během {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Přidat do kalendáře",
|
||||
"add_another_calendar": "Přidat další kalendář",
|
||||
"other": "Ostatní",
|
||||
"email_sign_in_subject": "Váš přihlašovací odkaz pro {{appName}}",
|
||||
"emailed_you_and_attendees": "Poslali jsme vám a ostatním účastníkům e-mail s pozvánkou a podrobnostmi.",
|
||||
"emailed_you_and_attendees_recurring": "Na první z těchto opakovaných událostí jsme vám a ostatním účastníkům poslali e-mail s pozvánkou a podrobnostmi.",
|
||||
"emailed_you_and_any_other_attendees": "Poslali jsme vám a ostatním účastníkům e-mail s těmito informacemi.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "Aktuální heslo není správné",
|
||||
"password_hint_caplow": "Kombinace velkých a malých písmen",
|
||||
"password_hint_min": "Minimální délka 7 znaků",
|
||||
"password_hint_admin_min": "Minimální délka 15 znaků",
|
||||
"password_hint_num": "Obsahuje alespoň 1 číslo",
|
||||
"invalid_password_hint": "Heslo musí být minimálně 7 znaků dlouhé, obsahovat alespoň jedno číslo a obsahovat kombinaci velkých a malých písmen",
|
||||
"incorrect_password": "Heslo není správné.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Potvrďte {{eventTypeTitle}} skrz účet {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Přesunout {{eventTypeTitle}} na jindy skrz účet {{profileName}}",
|
||||
"in_person_meeting": "Odkaz nebo osobní schůzka",
|
||||
"attendeeInPerson": "Osobně (adresa účastníka)",
|
||||
"inPerson": "Osobně (adresa organizátora)",
|
||||
"link_meeting": "Odkaz na schůzku",
|
||||
"phone_call": "Telefon",
|
||||
"your_number": "Vaše telefonní číslo",
|
||||
"phone_number": "Tel. číslo",
|
||||
"attendee_phone_number": "Telefonní číslo účastníka",
|
||||
"organizer_phone_number": "Telefonní číslo organizátora",
|
||||
"host_phone_number": "Vaše telefonní číslo",
|
||||
"enter_phone_number": "Zadejte telefonní číslo",
|
||||
"reschedule": "Přesunout na jindy",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Souhrn",
|
||||
"collective_description": "Naplánovat schůzku na dobu, kdy jsou vybraní členové týmu dostupní.",
|
||||
"duration": "Doba trvání",
|
||||
"available_durations": "Dostupné doby trvání",
|
||||
"default_duration": "Výchozí doba trvání",
|
||||
"default_duration_no_options": "Nejprve vyberte dostupné doby trvání",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "min",
|
||||
"round_robin": "Plánování Round Robin",
|
||||
"round_robin_description": "Schůzky v řadě mezi několika členy týmu.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Týmy",
|
||||
"team": "Tým",
|
||||
"team_billing": "Fakturace týmů",
|
||||
"team_billing_description": "Správa účtování pro váš tým",
|
||||
"upgrade_to_flexible_pro_title": "Změnili jsme fakturaci pro týmy",
|
||||
"upgrade_to_flexible_pro_message": "Ve vašem týmu jsou členové bez místa. Upgradujte svůj Pro plán pro pokrytí chybějících míst.",
|
||||
"changed_team_billing_info": "Od ledna 2022 účtujeme členy vašeho týmu podle počtu míst. Členové vašeho týmu, kteří využívali tarif Pro zdarma, nyní mají 14 denní zkušební verzi. Jakmile zkušební verze skončí, nebudou tito členové v týmu vidět, pokud nepřejdete na vyšší tarif.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Skrýt typ události",
|
||||
"edit_location": "Upravit polohu",
|
||||
"into_the_future": "v budoucnu",
|
||||
"when_booked_with_less_than_notice": "Při rezervaci s předstihem méně než <time></time>",
|
||||
"within_date_range": "V časovém rozmezí",
|
||||
"indefinitely_into_future": "Neomezeně do budoucna",
|
||||
"add_new_custom_input_field": "Přidat nové vlastní pole",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "Opravdu chcete odstranit svůj účet na {{appName}}? Všichni, se kterými jste sdíleli odkaz na účet, přijdou o možnost vytvářet rezervace a vy přijdete o uložené předvolby.",
|
||||
"integrations": "Integrace",
|
||||
"apps": "Aplikace",
|
||||
"apps_listing": "Výpis aplikace",
|
||||
"category_apps": "Aplikace v kategorii {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Propojování lidí, technologií a pracoviště.",
|
||||
@@ -769,6 +782,7 @@
|
||||
"trending_apps": "Populární aplikace",
|
||||
"explore_apps": "Aplikace v kategorii {{category}}",
|
||||
"installed_apps": "Nainstalované aplikace",
|
||||
"free_to_use_apps": "Zdarma",
|
||||
"no_category_apps": "Žádné aplikace v kategorii {{category}}",
|
||||
"no_category_apps_description_calendar": "Přidejte aplikaci kalendáře, ať máte přehled v zájmu prevence dvojích rezervací",
|
||||
"no_category_apps_description_conferencing": "Zkuste přidat aplikaci pro konference, která umožní propojit videohovory s vašimi klienty",
|
||||
@@ -807,6 +821,8 @@
|
||||
"verify_wallet": "Ověřit peněženku",
|
||||
"connect_metamask": "Připojit Metamask",
|
||||
"create_events_on": "Vytvořit události v:",
|
||||
"enterprise_license": "Jedná se o firemní funkci",
|
||||
"enterprise_license_description": "Pokud chcete povolit tuto funkci, získejte klíč pro nasazení v konzoli {{consoleUrl}} a přidejte ho do souboru .env jako CALCOM_LICENSE_KEY. Pokud váš tým již licenci má, kontaktujte prosím {{supportMail}} a požádejte o pomoc.",
|
||||
"missing_license": "Chybějící licence",
|
||||
"signup_requires": "Je vyžadována komerční licence",
|
||||
"signup_requires_description": "{{companyName}} v současné době nenabízí bezplatnou open source verzi stránky registrace. Chcete-li získat plný přístup ke komponentám registrace, musíte získat komerční licenci. Pro osobní použití doporučujeme Prisma Data Platform nebo jakékoli jiné Postgres rozhraní pro vytváření účtů.",
|
||||
@@ -898,6 +914,7 @@
|
||||
"user_impersonation_heading": "Přizpůsobení uživatele",
|
||||
"user_impersonation_description": "Náš tým podpory se bude moci dočasně přihlásit místo vás, aby nám pomohl rychle vyřešit jakékoli problémy, které nám nahlásíte.",
|
||||
"team_impersonation_description": "Členové vašeho týmu se mohou dočasně přihlásit jako vy.",
|
||||
"allow_booker_to_select_duration": "Umožnit rezervující osobě vybrat dobu trvání",
|
||||
"impersonate_user_tip": "Všechna použití této funkce jsou kontrolována.",
|
||||
"impersonating_user_warning": "Zosobnění uživatelského jména „{{user}}“.",
|
||||
"impersonating_stop_instructions": "<0>Kliknutím zde zastavte</0>.",
|
||||
@@ -1015,6 +1032,9 @@
|
||||
"error_removing_app": "Při odstraňování aplikace došlo k chybě",
|
||||
"web_conference": "Webová konference",
|
||||
"requires_confirmation": "Vyžaduje potvrzení",
|
||||
"always_requires_confirmation": "Vždy",
|
||||
"requires_confirmation_threshold": "Pokud je rezervace provedena s předstihem < {{time}} $t({{unit}}_timeUnit), je nutné potvrzení",
|
||||
"may_require_confirmation": "Může vyžadovat potvrzení",
|
||||
"nr_event_type_one": "Typ události: {{count}}",
|
||||
"nr_event_type_other": "Typy událostí: {{count}}",
|
||||
"add_action": "Přidat akci",
|
||||
@@ -1102,6 +1122,9 @@
|
||||
"event_limit_tab_description": "Jak často lze u vás provést rezervaci",
|
||||
"event_advanced_tab_description": "Nastavení kalendáře a další...",
|
||||
"event_advanced_tab_title": "Upřesnit",
|
||||
"event_setup_multiple_duration_error": "Nastavení události: více dob trvání vyžaduje alespoň 1 možnost.",
|
||||
"event_setup_multiple_duration_default_error": "Nastavení události: vyberte prosím platnou výchozí dobu trvání.",
|
||||
"event_setup_booking_limits_error": "Limity rezervací musí být seřazeny vzestupně. [den,týden,měsíc,rok]",
|
||||
"select_which_cal": "Vyberte kalendář, do kterého se mají přidávat rezervace",
|
||||
"custom_event_name": "Vlastní název události",
|
||||
"custom_event_name_description": "Vytvářejte vlastní názvy událostí, které se budou zobrazovat v kalendáři událostí",
|
||||
@@ -1155,8 +1178,11 @@
|
||||
"invoices": "Faktury",
|
||||
"embeds": "Vložené kalendáře",
|
||||
"impersonation": "Ztotožnění",
|
||||
"impersonation_description": "Nastavení správy ztotožnění uživatele",
|
||||
"users": "Uživatelé",
|
||||
"profile_description": "Správa nastavení profilu {{appName}}",
|
||||
"users_description": "Tady najdete seznam všech uživatelů",
|
||||
"users_listing": "Výpis uživatelů",
|
||||
"general_description": "Správa nastavení jazyka a časového pásma",
|
||||
"calendars_description": "Konfigurace způsobu interakce typů událostí s kalendáři",
|
||||
"appearance_description": "Správa nastavení vzhledu rezervace",
|
||||
@@ -1361,6 +1387,7 @@
|
||||
"number_sms_notifications": "Číslo telefonu (SMS oznámení)",
|
||||
"attendee_email_workflow": "E-mail účastníka",
|
||||
"attendee_email_info": "E-mail osoby provádějící rezervaci",
|
||||
"kbar_search_placeholder": "Zadejte příkaz nebo vyhledejte...",
|
||||
"invalid_credential": "Ale ne! Zdá se, že platnost oprávnění vypršela nebo byla zrušena. Proveďte novou instalaci.",
|
||||
"choose_common_schedule_team_event": "Vyberte společný plán",
|
||||
"choose_common_schedule_team_event_description": "Tuto možnost povolte, pokud chcete používat společný plán mezi hostiteli. Při zakázání této možnosti bude každý hostitel rezervován na základě svého výchozího plánu.",
|
||||
@@ -1371,5 +1398,43 @@
|
||||
"test_preview": "Testovací náhled",
|
||||
"route_to": "Směrovat na",
|
||||
"test_preview_description": "Otestujte svůj směrovací formulář bez odeslání jakýchkoli dat",
|
||||
"test_routing": "Test směrování"
|
||||
"test_routing": "Test směrování",
|
||||
"payment_app_disabled": "Správce zakázal platební aplikaci",
|
||||
"edit_event_type": "Upravit typ události",
|
||||
"collective_scheduling": "Kolektivní plánování",
|
||||
"make_it_easy_to_book": "Usnadněte si rezervaci týmu, pokud jsou všichni k dispozici.",
|
||||
"find_the_best_person": "Najděte nejlepšího dostupného člověka a procházejte tým.",
|
||||
"fixed_round_robin": "Pevný „round robin“",
|
||||
"add_one_fixed_attendee": "Přidejte jednoho pevně stanoveného účastníka a „round robin“ přes daný počet účastníků.",
|
||||
"calcom_is_better_with_team": "Cal.com je s týmy lepší",
|
||||
"add_your_team_members": "Přidejte členy týmu k typům událostí. Použijte kolektivní plánování, abyste zahrnuli všechny, případně vyhledejte tu nejvhodnější osobu s plánováním „round robin“.",
|
||||
"booking_limit_reached": "Byl dosažen limit rezervací pro tento typ události",
|
||||
"admin_has_disabled": "Administrátor zakázal {{appName}}",
|
||||
"disabled_app_affects_event_type": "Administrátor zakázal {{appName}}, což ovlivňuje váš typ události {{eventType}}",
|
||||
"disable_payment_app": "Administrátor zakázal {{appName}}, což ovlivňuje váš typ události {{title}}. Účastníci si stále mohou rezervovat tento typ události, ale nebudou vyzváni k platbě. Abyste tomu zabránili, můžete tento typ události skrýt, dokud správce tento způsob platby znovu nepovolí.",
|
||||
"payment_disabled_still_able_to_book": "Účastníci si stále mohou rezervovat tento typ události, ale nebudou vyzváni k platbě. Abyste tomu zabránili, můžete tento typ události skrýt, dokud správce tento způsob platby znovu nepovolí.",
|
||||
"app_disabled_with_event_type": "Administrátor zakázal {{appName}}, což ovlivňuje váš typ události {{title}}.",
|
||||
"app_disabled_video": "Administrátor zakázal {{appName}}, což může ovlivnit vaše typy událostí. Pokud máte typy událostí s {{appName}} jako umístění, bude výchozí nastavení Cal Video.",
|
||||
"app_disabled_subject": "Aplikace {{appName}} byla zakázána",
|
||||
"navigate_installed_apps": "Přejděte na nainstalované aplikace",
|
||||
"disabled_calendar": "Pokud máte nainstalovaný jiný kalendář, budou do něj přidány nové rezervace. Pokud ne, připojte nový kalendář, abyste nepřišli o žádné nové rezervace.",
|
||||
"enable_apps": "Povolit aplikace",
|
||||
"enable_apps_description": "Povolte aplikace, které mohou uživatelé integrovat s Cal.com.",
|
||||
"app_is_enabled": "Aplikace {{appName}} je povolena",
|
||||
"app_is_disabled": "Aplikace {{appName}} je zakázána",
|
||||
"keys_have_been_saved": "Klíče byly uloženy",
|
||||
"disable_app": "Zakázat aplikaci",
|
||||
"disable_app_description": "Zakázání této aplikace by mohlo způsobit problémy s interakcí uživatelů s aplikací Cal",
|
||||
"edit_keys": "Upravit klávesy",
|
||||
"no_available_apps": "Nejsou k dispozici žádné aplikace",
|
||||
"no_available_apps_description": "Zkontrolujte, zda máte ve svém nasazení v části „packages/app-store“ k dispozici aplikace",
|
||||
"no_apps": "V této instanci Cal nejsou povoleny žádné aplikace",
|
||||
"apps_settings": "Nastavení aplikací",
|
||||
"fill_this_field": "Vyplňte prosím toto pole",
|
||||
"options": "Možnosti",
|
||||
"enter_option": "Zadejte možnost {{index}}",
|
||||
"add_an_option": "Přidat možnost",
|
||||
"radio": "Přepínač",
|
||||
"event_type_duplicate_copy_text": "{{slug}} – kopírovat",
|
||||
"set_as_default": "Nastavit jako výchozí"
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"upgrade_now": "Jetzt upgraden",
|
||||
"accept_invitation": "Einladung annehmen",
|
||||
"have_any_questions": "Haben Sie Fragen? Wir sind hier um Ihnen zu helfen.",
|
||||
"reset_password_subject": "{{appName}}: Anleitung zum Zurücksetzen des Passworts",
|
||||
"event_declined_subject": "Abgelehnt: {{eventType}} mit {{name}} am {{date}}",
|
||||
"event_cancelled_subject": "Abgesagt: {{eventType}} mit {{name}} am {{date}}",
|
||||
"event_request_declined": "Ihre Event-Anfrage wurde abgelehnt",
|
||||
@@ -50,6 +51,7 @@
|
||||
"still_waiting_for_approval": "Ein Termin wartet noch auf Bestätigung",
|
||||
"event_is_still_waiting": "Termin-Anfrage wartet: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Keine weiteren Ergebnisse",
|
||||
"no_results": "Keine Ergebnisse",
|
||||
"load_more_results": "Weitere Ergebnisse laden",
|
||||
"integration_meeting_id": "{{integrationName}} Termin-ID: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Bestätigt: {{eventType}} mit {{name}} am {{date}}",
|
||||
@@ -97,7 +99,9 @@
|
||||
"join_team": "Team beitreten",
|
||||
"manage_this_team": "Dieses Team verwalten",
|
||||
"team_info": "Informationen zum Team",
|
||||
"request_another_invitation_email": "Falls Sie {{toEmail}} lieber nicht als Ihre {{appName}}-E-Mail verwenden möchten oder bereits über ein {{appName}}-Konto verfügen, fordern Sie bitte eine weitere Einladung zu dieser E-Mail an.",
|
||||
"you_have_been_invited": "Sie wurden eingeladen, dem Team {{teamName}} beizutreten",
|
||||
"user_invited_you": "{{user}} hat Sie eingeladen, dem Team {{team}} auf {{appName}} beizutreten",
|
||||
"hidden_team_member_title": "Sie sind in diesem Team ausgeblendet",
|
||||
"hidden_team_member_message": "Ihre Teammitgliedschaft ist nicht bezahlt, entweder upgraden Sie Ihren Account auf Pro oder lassen den Team-Organisator wissen, dass er für Ihren Platz im Team bezahlen kann.",
|
||||
"hidden_team_owner_message": "Sie benötigen einen Pro-Account um die Teamfunktionen zu verweden. Sie werden dem Team nicht angezeigt, bis der Account upgegradet wurde.",
|
||||
@@ -109,6 +113,8 @@
|
||||
"team_upgraded_successfully": "Das Update für Ihr Team war erfolgreich!",
|
||||
"use_link_to_reset_password": "Benutzen Sie den Link, um Ihr Passwort zurückzusetzen",
|
||||
"hey_there": "Hallo,",
|
||||
"forgot_your_password_calcom": "Passwort vergessen? - {{appName}}",
|
||||
"delete_webhook_confirmation_message": "Sind Sie sicher, dass Sie diesen Webhook löschen möchten? Sie werden keine {{appName}} Meetingdaten mehr unter einer bestimmten URL, in Echtzeit erhalten, wenn ein Ereignis geplant oder abgesagt wird.",
|
||||
"confirm_delete_webhook": "Ja, Webhook löschen",
|
||||
"edit_webhook": "Webhook bearbeiten",
|
||||
"delete_webhook": "Webhook löschen",
|
||||
@@ -126,9 +132,9 @@
|
||||
"no_data_yet": "Noch keine Daten",
|
||||
"ping_test": "Pingtest",
|
||||
"add_to_homescreen": "Fügen Sie diese App Ihrem Startbildschirm für schnelleren Zugriff hinzu.",
|
||||
"upcoming": "Bevorstehend",
|
||||
"recurring": "Wiederkehrend",
|
||||
"past": "Vergangen",
|
||||
"upcoming": "Bevorstehende",
|
||||
"recurring": "Wiederkehrende",
|
||||
"past": "Vergangene",
|
||||
"choose_a_file": "Datei auswählen...",
|
||||
"upload_image": "Bild hochladen",
|
||||
"upload_target": "{{target}} hochladen",
|
||||
@@ -184,6 +190,7 @@
|
||||
"30min_meeting": "30 Minuten Termin",
|
||||
"secret": "Passwort",
|
||||
"leave_blank_to_remove_secret": "Leer lassen, um Passwort zu entfernen",
|
||||
"webhook_secret_key_description": "Stellen Sie sicher, dass Ihr Server aus Sicherheitsgründen nur die erwarteten {{appName}}-Anfragen empfängt",
|
||||
"secret_meeting": "Geheimer Termin",
|
||||
"login_instead": "Stattdessen einloggen",
|
||||
"already_have_an_account": "Haben Sie bereits ein Konto?",
|
||||
@@ -227,11 +234,13 @@
|
||||
"details": "Details",
|
||||
"welcome": "Willkommen",
|
||||
"welcome_back": "Willkommen zurück",
|
||||
"welcome_to_calcom": "Willkommen bei {{appName}}",
|
||||
"welcome_instructions": "Wie ist Ihr Name und in welcher Zeitzone sind Sie? Dies kann später bearbeitet werden.",
|
||||
"connect_caldav": "Mit CalDav-Server verbinden",
|
||||
"credentials_stored_and_encrypted": "Ihre Zugangsdaten werden verschlüsselt gespeichert.",
|
||||
"connect": "Verbinden",
|
||||
"try_for_free": "Kostenlos testen",
|
||||
"create_booking_link_with_calcom": "Erstellen Sie Ihren eigenen Buchungslink mit {{appName}}",
|
||||
"who": "Wer",
|
||||
"what": "Was",
|
||||
"when": "Wann",
|
||||
@@ -239,9 +248,10 @@
|
||||
"add_to_calendar": "Zum Kalender hinzufügen",
|
||||
"add_another_calendar": "Einen weiteren Kalender hinzufügen",
|
||||
"other": "Sonstige",
|
||||
"email_sign_in_subject": "Ihr Anmelde-Link für {{appName}}",
|
||||
"emailed_you_and_attendees": "Wir haben Ihnen und den anderen Teilnehmern eine Einladung zum Kalender mit allen Details zugeschickt.",
|
||||
"emailed_you_and_attendees_recurring": "Wir haben Ihnn und den anderen Teilnemern eine Kalendereinladung für den ersten Termin dieser wiederkehrenden Termins gesendet.",
|
||||
"emailed_you_and_any_other_attendees": "Wir haben Ihnen und allen anderen Teilnehmer diesen Informationen per E-Mail geschickt.",
|
||||
"emailed_you_and_attendees_recurring": "Wir haben Ihnen und den anderen Teilnemern eine Kalendereinladung für den ersten Termin dieser wiederkehrenden Termins gesendet.",
|
||||
"emailed_you_and_any_other_attendees": "Wir haben Ihnen und allen anderen Teilnehmern diese Informationen per E-Mail zugeschickt.",
|
||||
"needs_to_be_confirmed_or_rejected": "Ihre Buchung muss noch bestätigt oder abgelehnt werden.",
|
||||
"needs_to_be_confirmed_or_rejected_recurring": "Ihr wiederkehrender Termin muss noch bestätigt oder abgelehnt werden.",
|
||||
"user_needs_to_confirm_or_reject_booking": "{{user}} muss den Termin noch bestätigen oder ablehnen.",
|
||||
@@ -252,7 +262,7 @@
|
||||
"submitted_recurring": "Ihr wiederkehrender Termin wurde gebucht",
|
||||
"booking_submitted": "Ihre Buchung wurde versandt",
|
||||
"booking_submitted_recurring": "Ihre wiederkehrende Buchung wurde versandt",
|
||||
"booking_confirmed": "Ihre Termin wurde bestätigt",
|
||||
"booking_confirmed": "Ihr Termin wurde bestätigt",
|
||||
"booking_confirmed_recurring": "Ihr wiederkehrender Termin wurde bestätigt",
|
||||
"warning_recurring_event_payment": "Zahlungen werden bei wiederkehrenden Terminen noch nicht unterstützt",
|
||||
"warning_payment_recurring_event": "Zahlungen werden bei wiederkehrenden Terminen noch nicht unterstützt",
|
||||
@@ -282,7 +292,7 @@
|
||||
"error_end_time_next_day": "Die Endzeit darf nicht größer als 24 Stunden sein",
|
||||
"back_to_bookings": "Zurück zu den Buchungen",
|
||||
"free_to_pick_another_event_type": "Sie können jederzeit einen anderen Termin wählen.",
|
||||
"cancelled": "Abgesagt",
|
||||
"cancelled": "Abgesagte",
|
||||
"cancellation_successful": "Stornierung erfolgreich",
|
||||
"really_cancel_booking": "Möchten Sie wirklich stornieren?",
|
||||
"cannot_cancel_booking": "Sie können diese Buchung nicht stornieren",
|
||||
@@ -303,7 +313,7 @@
|
||||
"bookings": "Buchungen",
|
||||
"bookings_description": "Sehen Sie anstehende und vergangene Veranstaltungen, die über Ihre Events gebucht wurden.",
|
||||
"upcoming_bookings": "Sobald jemand eine Zeit bei Ihnen bucht können Sie das hier sehen.",
|
||||
"recurring_bookings": "Sobald jemand einen wiederkehrenden Termin mit Ihnen bucht er hier erscheinen.",
|
||||
"recurring_bookings": "Sobald jemand einen wiederkehrenden Termin mit Ihnen bucht wird er hier erscheinen.",
|
||||
"past_bookings": "Ihre früheren Buchungen werden hier angezeigt.",
|
||||
"cancelled_bookings": "Ihre stornierten Buchungen werden hier angezeigt.",
|
||||
"unconfirmed_bookings": "Ihre unbestätigten Buchungen werden hier angezeigt.",
|
||||
@@ -337,6 +347,7 @@
|
||||
"dark": "Dunkel",
|
||||
"automatically_adjust_theme": "Theme automatisch basierend auf den Einstellungen des Teilnehmers anpassen",
|
||||
"user_dynamic_booking_disabled": "Einige der Benutzer in der Gruppe haben derzeit dynamische Gruppenbuchungen deaktiviert",
|
||||
"allow_dynamic_booking_tooltip": "Gruppenbuchungslinks, die dynamisch durch Hinzufügen mehrerer Benutzernamen mit einem '+' erstellt werden können. Beispiel: '{{appName}}/bailey+peer'",
|
||||
"allow_dynamic_booking": "Ermöglichen Sie es den Teilnehmenden, Sie über dynamische Gruppenbuchungen zu buchen",
|
||||
"email": "E-Mail",
|
||||
"email_placeholder": "max@example.com",
|
||||
@@ -356,6 +367,8 @@
|
||||
"team_webhooks": "Team-Webhooks",
|
||||
"create_new_webhook_to_account": "Erstellen Sie einen neuen Webhook in Ihrem Account",
|
||||
"new_webhook": "Neuer Webhook",
|
||||
"receive_cal_meeting_data": "Erhalte {{appName}} Termindaten unter einer bestimmten URL in Echtzeit, wenn ein Termin geplant oder abgesagt wird.",
|
||||
"receive_cal_event_meeting_data": "Erhalte {{appName}} Termindaten unter einer bestimmten URL in Echtzeit, wenn dieser Termin geplant oder abgesagt wird.",
|
||||
"responsive_fullscreen_iframe": "Responsives Vollbild-iFrame",
|
||||
"loading": "Wird geladen...",
|
||||
"deleting": "Lösche...",
|
||||
@@ -363,6 +376,7 @@
|
||||
"developer": "Entwickler",
|
||||
"manage_developer_settings": "Verwalten Sie Ihre Entwicklereinstellungen.",
|
||||
"iframe_embed": "iFrame-Einbettung",
|
||||
"embed_calcom": "Der einfachste Weg, {{appName}} auf Ihrer Website einzubinden.",
|
||||
"integrate_using_embed_or_webhooks": "Integrieren Sie Cal.com in Ihre Website mit unseren Einbettungs-Optionen oder erhalten Sie Buchungsdaten mit Webhooks.",
|
||||
"schedule_a_meeting": "Termin planen",
|
||||
"view_and_manage_billing_details": "Ihre Rechnungsdetails ansehen und verwalten",
|
||||
@@ -407,6 +421,7 @@
|
||||
"current_incorrect_password": "Aktuelles Passwort ist falsch",
|
||||
"password_hint_caplow": "Mischung aus Groß- und Kleinbuchstaben",
|
||||
"password_hint_min": "Mindestens 8 Zeichen lang",
|
||||
"password_hint_admin_min": "Mindestens 15 Zeichen lang",
|
||||
"password_hint_num": "Enthält mindestens 1 Zahl",
|
||||
"invalid_password_hint": "Das Passwort muss mindestens 7 Zeichen lang sein und mindestens eine Nummer beinhalten, sowie eine Mischung aus Groß- und Kleinbuchstaben sein",
|
||||
"incorrect_password": "Passwort ist falsch",
|
||||
@@ -450,11 +465,14 @@
|
||||
"booking_confirmation": "Bestätigen Sie {{eventTypeTitle}} mit {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Planen Sie Ihr {{eventTypeTitle}} mit {{profileName}} um",
|
||||
"in_person_meeting": "Vor-Ort-Termin",
|
||||
"attendeeInPerson": "Persönlich (Teilnehmeradresse)",
|
||||
"inPerson": "Persönlich (Organisator-Adresse)",
|
||||
"link_meeting": "Termin verknüpfen",
|
||||
"phone_call": "Telefonat",
|
||||
"your_number": "Ihre Telefonnummer",
|
||||
"phone_number": "Telefonnummer",
|
||||
"attendee_phone_number": "Telefonnummer des Teilnehmers",
|
||||
"organizer_phone_number": "Telefonnummer des Organisators",
|
||||
"host_phone_number": "Ihre Telefonnummer",
|
||||
"enter_phone_number": "Telefonnummer eingeben",
|
||||
"reschedule": "Neuplanen",
|
||||
@@ -494,6 +512,8 @@
|
||||
"invite_new_member_description": "Hinweis: Dies wird <1>einen zusätzlichen Platz(15 $/m)</1> in Ihrem Abonnement kosten.",
|
||||
"invite_new_team_member": "Laden Sie jemanden in Ihr Team ein.",
|
||||
"change_member_role": "Rolle des Teammitglieds ändern",
|
||||
"disable_cal_branding": "{{appName}}-Branding deaktivieren",
|
||||
"disable_cal_branding_description": "Blendet alle {{appName}}-Werbung auf Ihren öffentlichen Seiten aus.",
|
||||
"danger_zone": "Achtung",
|
||||
"back": "Zurück",
|
||||
"cancel": "Abbrechen",
|
||||
@@ -539,6 +559,10 @@
|
||||
"collective": "Kollektiv",
|
||||
"collective_description": "Planen Sie Meetings, bei denen alle ausgewählten Teammitglieder verfügbar sind.",
|
||||
"duration": "Dauer",
|
||||
"available_durations": "Verfügbare Laufzeiten",
|
||||
"default_duration": "Standardlaufzeit",
|
||||
"default_duration_no_options": "Bitte wählen Sie zuerst die verfügbaren Laufzeiten aus",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minuten",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Treffen zwischen mehreren Teammitgliedern durchwechseln.",
|
||||
@@ -610,6 +634,7 @@
|
||||
"changed_team_billing_info": "Ab Januar 2022 berechnen wir pro Sitzplatz für Teammitglieder. Mitglieder deines Teams, die Pro kostenlos hatten, sind jetzt in einer 14 Tage Testphase. Sobald die Testversion abläuft, werden diese Mitglieder vor Ihrem Team verborgen, es sei denn, Sie upgraden jetzt.",
|
||||
"create_manage_teams_collaborative": "Erstellen und verwalten Sie Teams, um kollaborative Funktionen zu nutzen.",
|
||||
"only_available_on_pro_plan": "Diese Funktion ist nur im Pro Plan verfügbar",
|
||||
"remove_cal_branding_description": "Um das {{appName}}-Branding von Ihren Buchungsseiten zu entfernen, müssen Sie auf ein Pro-Konto upgraden.",
|
||||
"edit_profile_info_description": "Bearbeiten Sie Ihre Profilinformationen, welche bei Ihrem Cal-Link angezeigt werden.",
|
||||
"change_email_tip": "Möglicherweise müssen Sie sich aus- und einloggen, um die Änderung wirksam zu machen.",
|
||||
"little_something_about": "Ein wenig über sich selbst.",
|
||||
@@ -658,19 +683,28 @@
|
||||
"private_link_label": "Privater Link",
|
||||
"private_link_hint": "Ihr privater Link wird nach jeder Nutzung neu generiert",
|
||||
"copy_private_link": "Privaten Link kopieren",
|
||||
"private_link_description": "Erzeugen Sie einen privaten Link, den Sie teilen können, ohne Ihren {{appName}}-Benutzername preiszugeben",
|
||||
"invitees_can_schedule": "Teilnehmende können folgendes buchen",
|
||||
"date_range": "Datumszeitraum",
|
||||
"calendar_days": "Kalendertage",
|
||||
"business_days": "Werktage",
|
||||
"set_address_place": "Adresse oder Ort festlegen",
|
||||
"set_link_meeting": "Einen Link zum Termin setzen",
|
||||
"cal_invitee_phone_number_scheduling": "{{appName}} wird Ihren Teilnehmer bitten, vor der Planung eine Telefonnummer einzugeben.",
|
||||
"cal_provide_google_meet_location": "{{appName}} wird einen Google Meet Ort zur Verfügung stellen.",
|
||||
"cal_provide_zoom_meeting_url": "{{appName}} wird eine Zoom Meeting URL zur Verfügung stellen.",
|
||||
"cal_provide_tandem_meeting_url": "{{appName}} wird eine Tandem Meeting URL zur Verfügung stellen.",
|
||||
"cal_provide_video_meeting_url": "{{appName}} wird eine Video-Meeting URL zur Verfügung stellen.",
|
||||
"cal_provide_jitsi_meeting_url": "Cal stellt eine Jitsi Meet URL zur Verfügung.",
|
||||
"cal_provide_huddle01_meeting_url": "{{appName}} wird eine Huddle01 web3 Video-Meeting URL zur Verfügung stellen.",
|
||||
"cal_provide_teams_meeting_url": "{{appName}} wird eine MS Teams Meeting-URL zur Verfügung stellen. HINWEIS: SIE BRAUCHEN EIN BERUFS- ODER SCHULKONTO",
|
||||
"require_payment": "Zahlung erforderlich",
|
||||
"commission_per_transaction": "Provision pro Transaktion",
|
||||
"event_type_updated_successfully_description": "Ihr Termintyp wurde erfolgreich aktualisiert.",
|
||||
"hide_event_type": "Termintyp ausblenden",
|
||||
"edit_location": "Standort bearbeiten",
|
||||
"into_the_future": "in die Zukunft",
|
||||
"when_booked_with_less_than_notice": "Bei Buchung mit weniger als <time></time> Vorlauf",
|
||||
"within_date_range": "Innerhalb eines Zeitraums",
|
||||
"indefinitely_into_future": "Auf unbestimmte Zeit in die Zukunft",
|
||||
"add_new_custom_input_field": "Neues individuelles Eingabefeld hinzufügen",
|
||||
@@ -687,6 +721,7 @@
|
||||
"confirm_delete_event_type": "Ja, Termintyp löschen",
|
||||
"delete_account": "Account löschen",
|
||||
"confirm_delete_account": "Ja, Account löschen",
|
||||
"delete_account_confirmation_message": "Sind Sie sicher, dass Sie Ihr {{appName}}-Konto löschen möchten? Sie können dann nicht mehr über Ihre geteilten Links gebucht werden und alle Einstellungen werden gelöscht.",
|
||||
"integrations": "Integrationen",
|
||||
"apps": "Apps",
|
||||
"apps_description": "Hier findest du eine Auflistung deiner Apps",
|
||||
@@ -714,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "Wechseln Sie die Kalender in denen nach Konflikten gesucht werden sollen, um Doppelbuchungen zu vermeiden.",
|
||||
"select_destination_calendar": "Erstelle Termine im",
|
||||
"connect_additional_calendar": "Zusätzlichen Kalender verbinden",
|
||||
"calendar_updated_successfully": "Kalender erfolgreich aktualisiert",
|
||||
"conferencing": "Videokonferenzen",
|
||||
"calendar": "Kalender",
|
||||
"payments": "Zahlungen",
|
||||
@@ -789,6 +825,7 @@
|
||||
"enterprise_license_description": "Um diese Funktion zu aktivieren, holen Sie sich einen Deployment-Schlüssel von der {{consoleUrl}}-Konsole und fügen Sie ihn als CALCOM_LICENSE_KEY zu Ihrer .env hinzu. Wenn Ihr Team bereits eine Lizenz hat, wenden Sie sich bitte an {{supportMail}} für Hilfe.",
|
||||
"missing_license": "Lizenz fehlt",
|
||||
"signup_requires": "Kommerzielle Lizenz erforderlich",
|
||||
"signup_requires_description": "{{companyName}} bietet zur Zeit keine kostenlose Open-Source-Version der Anmeldeseite an. Um vollen Zugriff auf die Registrierungskomponenten zu erhalten, müssen Sie eine kommerzielle Lizenz erwerben. Für den persönlichen Gebrauch empfehlen wir die Prisma Data Platform oder jede andere Postgres-Schnittstelle zur Erstellung von Accounts.",
|
||||
"next_steps": "Nächste Schritte",
|
||||
"acquire_commercial_license": "Eine kommerzielle Lizenz erwerben",
|
||||
"the_infrastructure_plan": "Der Infrastrukturplan ist nutzungsbasiert und bietet Startup-freundliche Discounts an.",
|
||||
@@ -877,6 +914,7 @@
|
||||
"user_impersonation_heading": "Benutzeridentitätswechsel",
|
||||
"user_impersonation_description": "Erlaubt es unserem Support-Team, sich vorübergehend mit Ihrem Konto anzumelden, um jegliche Probleme, die Sie gemeldet haben, schneller zu lösen.",
|
||||
"team_impersonation_description": "Ermöglicht den Team-Administratoren, sich vorübergehend als Sie einzuloggen.",
|
||||
"allow_booker_to_select_duration": "Bucher erlauben, die Länge zu wählen",
|
||||
"impersonate_user_tip": "Alle Verwendungen dieser Funktion werden geprüft.",
|
||||
"impersonating_user_warning": "Imitiere den Account {{user}}.",
|
||||
"impersonating_stop_instructions": "<0>Klicke hier um zu stoppen </0>.",
|
||||
@@ -890,11 +928,15 @@
|
||||
"update_location": "Ort aktualisieren",
|
||||
"location_updated": "Ort aktualisiert",
|
||||
"email_validation_error": "Das sieht nicht wie eine E-Mail-Adresse aus",
|
||||
"place_where_cal_widget_appear": "Kopieren Sie diesen Code an die Stelle in Ihrem HTML, an der Ihr {{appName}}-Widget erscheinen soll.",
|
||||
"create_update_react_component": "Erstellen oder Aktualisieren einer existierenden Reaktionskomponente wie unten gezeigt.",
|
||||
"copy_code": "Code kopieren",
|
||||
"code_copied": "Code kopiert!",
|
||||
"how_you_want_add_cal_site": "Wie möchten Sie {{appName}} zu Ihrer Website hinzufügen?",
|
||||
"choose_ways_put_cal_site": "Wählen Sie eine der folgenden Möglichkeiten, um {{appName}} in Ihre Website zu integrieren.",
|
||||
"setting_up_zapier": "Einrichtung Ihrer Zapier-Integration",
|
||||
"generate_api_key": "Api Key generieren",
|
||||
"generate_api_key_description": "Generieren Sie einen API-Schlüssel für {{appName}} unter",
|
||||
"your_unique_api_key": "Ihr eindeutiger API-Key",
|
||||
"copy_safe_api_key": "Kopieren Sie diesen API-Schlüssel und speichern Sie ihn an einem sicheren Ort. Wenn Sie diesen Schlüssel verlieren, müssen Sie einen neuen generieren.",
|
||||
"zapier_setup_instructions": "<0>Gehen Sie zu: <1>Zapier-Einladungs-Link</1></0><1>Logge Sie sich in Ihr Zapier-Konto ein und erstelle einen neuen Zap.</1><2>Wählen Sie Cal.com als ihre Trigger-App aus. Wählen Sie auch ein Auslöserereignis.</2><3>Wähle Sie ihr Konto aus und geben dann ihren eindeutigen API-Key ein.</3><4>Teste Sie den Trigger.</4><5>Alles fertig!</5>",
|
||||
@@ -902,6 +944,7 @@
|
||||
"connect_apple_server": "Mit Apple-Server verbinden",
|
||||
"connect_caldav_server": "Mit CalDav-Server verbinden",
|
||||
"calendar_url": "Kalender-URL",
|
||||
"apple_server_generate_password": "Generieren Sie ein App-spezifisches Passwort für {{appName}} unter",
|
||||
"credentials_stored_encrypted": "Ihre Zugangsdaten werden verschlüsselt gespeichert.",
|
||||
"it_stored_encrypted": "Er wird gespeichert und verschlüsselt.",
|
||||
"go_to_app_store": "Zum App Store",
|
||||
@@ -989,6 +1032,9 @@
|
||||
"error_removing_app": "Fehler beim Entfernen der App",
|
||||
"web_conference": "Webkonferenz",
|
||||
"requires_confirmation": "Erfordert Bestätigung",
|
||||
"always_requires_confirmation": "Immer",
|
||||
"requires_confirmation_threshold": "Erfordert eine Bestätigung bei Buchung mit < {{time}} $t({{unit}}_timeUnit) Vorlauf",
|
||||
"may_require_confirmation": "Kann Bestätigung erfordern",
|
||||
"nr_event_type_one": "{{count}} Ereignistyp",
|
||||
"nr_event_type_other": "{{count}} Ereignistypen",
|
||||
"add_action": "Aktion hinzufügen",
|
||||
@@ -1076,6 +1122,9 @@
|
||||
"event_limit_tab_description": "Wie oft können Sie gebucht werden",
|
||||
"event_advanced_tab_description": "Kalendereinstellungen & mehr...",
|
||||
"event_advanced_tab_title": "Erweitert",
|
||||
"event_setup_multiple_duration_error": "Terminkonfiguration: Mehrere Laufzeiten erfordern mindestens eine Option.",
|
||||
"event_setup_multiple_duration_default_error": "Termineinrichtung: Bitte wählen Sie eine gültige Standarddauer.",
|
||||
"event_setup_booking_limits_error": "Die Buchungslimits müssen in aufsteigender Reihenfolge sein. [Tag, Woche, Monat, Jahr]",
|
||||
"select_which_cal": "Wählen Sie den Kalender aus, zu dem Termine hinzugefügt werden sollen",
|
||||
"custom_event_name": "Eigener Terminname",
|
||||
"custom_event_name_description": "Erstellen Sie benutzerdefinierte Terminnamen, die im Kalendereintrag angezeigt werden sollen",
|
||||
@@ -1089,8 +1138,10 @@
|
||||
"turn_off": "Abschalten",
|
||||
"settings_updated_successfully": "Einstellungen erfolgreich aktualisiert",
|
||||
"error_updating_settings": "Fehler beim Aktualisieren der Einstellungen",
|
||||
"personal_cal_url": "Meine persönliche {{appName}}-URL",
|
||||
"bio_hint": "Schreiben Sie eine kurze Beschreibung, welche auf Ihrer persönlichen Profil-Seite erscheinen wird.",
|
||||
"delete_account_modal_title": "Account löschen",
|
||||
"confirm_delete_account_modal": "Sind Sie sicher, dass Sie Ihr {{appName}}-Konto löschen möchten?",
|
||||
"delete_my_account": "Meinen Account löschen",
|
||||
"start_of_week": "Wochenstart",
|
||||
"select_calendars": "Wählen Sie aus, in welchen Kalendern Sie nach Konflikten suchen wollen, um Doppelbuchungen zu vermeiden.",
|
||||
@@ -1100,6 +1151,7 @@
|
||||
"custom_brand_colors": "Eigene Marken-Farben",
|
||||
"customize_your_brand_colors": "Passen Sie Ihre eigene Markenfarbe auf Ihrer Buchungsseite an.",
|
||||
"pro": "Pro",
|
||||
"removes_cal_branding": "Entfernt alle {{appName}}-bezogenen Markenzeichen, z. B. „Powered by {{appName}}.“",
|
||||
"profile_picture": "Profilbild",
|
||||
"upload": "Upload",
|
||||
"add_profile_photo": "Profilbild hinzufügen",
|
||||
@@ -1168,6 +1220,7 @@
|
||||
"create_your_first_form": "Erstellen Sie Ihr erstes Formular",
|
||||
"create_your_first_form_description": "Mithilfe von Leitungsformularen können Sie qualifizierende Fragen stellen und zur richtigen Person oder zum richtigen Veranstaltungstyp weiterleiten.",
|
||||
"create_your_first_webhook": "Erstellen Sie Ihren ersten Webhook",
|
||||
"create_your_first_webhook_description": "Mit Webhooks können Sie Meetingdaten in Echtzeit erhalten, sobald etwas in {{appName}} passiert.",
|
||||
"for_a_maximum_of": "Für maximal",
|
||||
"event_one": "Ereignis",
|
||||
"event_other": "Ereignisse",
|
||||
@@ -1183,6 +1236,7 @@
|
||||
"workflow_example_4": "Eine Erinnerung per SMS an die Teilnehmer verschicken, 24 Stunden bevor das Event startet",
|
||||
"workflow_example_5": "Benutzerdefinierte E-Mail senden, wenn der Termin zum Moderieren neu geplant wird",
|
||||
"workflow_example_6": "Benutzerdefinierte SMS senden, wenn der Termin zum Moderieren gebucht wird",
|
||||
"welcome_to_cal_header": "Willkommen bei {{appName}}!",
|
||||
"edit_form_later_subtitle": "Sie können dies später bearbeiten.",
|
||||
"connect_calendar_later": "Ich verbinde meinen Kalender später",
|
||||
"set_my_availability_later": "Ich werde meine Verfügbarkeit später festlegen",
|
||||
@@ -1192,6 +1246,7 @@
|
||||
"booking_appearance": "Darstellung der Buchungsseite",
|
||||
"appearance_team_description": "Einstellungen für die Buchungsdarstellung Ihres Teams verwalten",
|
||||
"only_owner_change": "Nur der Besitzer dieses Teams kann Änderungen an den Buchungen des Teams vornehmen ",
|
||||
"team_disable_cal_branding_description": "Entfernt alle {{appName}}-bezogenen Markenzeichen, z. B. „Powered by {{appName}}“",
|
||||
"invited_by_team": "{{teamName}} hat Sie eingeladen, dem Team als {{role}} beizutreten",
|
||||
"token_invalid_expired": "Token ist entweder ungültig oder abgelaufen.",
|
||||
"exchange_add": "Mit Microsoft Exchange verbinden",
|
||||
@@ -1211,11 +1266,13 @@
|
||||
"theme_dark": "Dunkel",
|
||||
"theme_system": "Systemstandard",
|
||||
"add_a_team": "Team hinzufügen",
|
||||
"add_webhook_description": "Erhalten Sie Meetingdaten in Echtzeit, wenn etwas in {{appName}} passiert",
|
||||
"triggers_when": "Löst aus, wenn",
|
||||
"test_webhook": "Bitte führen Sie einen Pingtest vor der Erstellung durch.",
|
||||
"enable_webhook": "Webhook aktivieren",
|
||||
"add_webhook": "Webhook hinzufügen",
|
||||
"webhook_edited_successfully": "Webhook gespeichert",
|
||||
"webhooks_description": "Erhalten Sie Meetingdaten in Echtzeit, wenn etwas in {{appName}} passiert",
|
||||
"api_keys_description": "Generieren Sie API-Schlüssel für den Zugriff auf Ihren eigenen Account",
|
||||
"new_api_key": "Neuer API-Schlüssel",
|
||||
"active": "Aktiv",
|
||||
@@ -1224,6 +1281,7 @@
|
||||
"embeds_title": "HTML iframe-Einbettung",
|
||||
"embeds_description": "Alle Event-Typen auf Ihrer Website einbetten",
|
||||
"create_first_api_key": "Erstellen Sie Ihren ersten API-Schlüssel",
|
||||
"create_first_api_key_description": "API-Schlüssel erlauben es anderen Apps, mit {{appName}} zu kommunizieren",
|
||||
"back_to_signin": "Zurück zur Anmeldung",
|
||||
"reset_link_sent": "Zurücksetzungslink gesendet",
|
||||
"password_reset_email": "Eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts ist auf dem Weg zu {{email}}.",
|
||||
@@ -1231,12 +1289,14 @@
|
||||
"password_updated": "Passwort aktualisiert!",
|
||||
"pending_payment": "Zahlung ausstehend",
|
||||
"confirmation_page_rainbow": "Sperren Sie Ihr Ereignis hinter Tokens oder NFTs auf Ethereum, Polygon und mehr.",
|
||||
"not_on_cal": "Nicht auf {{appName}}",
|
||||
"no_calendar_installed": "Kein Kalender installiert",
|
||||
"no_calendar_installed_description": "Sie haben noch keinen Ihrer Kalender verbunden",
|
||||
"add_a_calendar": "Kalender hinzufügen",
|
||||
"change_email_hint": "Möglicherweise müssen Sie sich aus- und einloggen, um jegliche Änderung wirksam zu machen",
|
||||
"confirm_password_change_email": "Bitte bestätigen Sie Ihr Passwort, bevor Sie Ihre E-Mail-Adresse ändern",
|
||||
"seats": "Plätze",
|
||||
"every_app_published": "Jede App, die im {{appName}} App Store veröffentlicht wird, ist Open Source und gründlich durch Peer Reviews getestet. {{companyName}} unterstützt oder zertifiziert diese Apps jedoch nicht, es sei denn, sie werden von {{appName}} selbst veröffentlicht. Wenn Sie auf unangemessene Inhalte oder Verhaltensweisen stoßen, melden Sie diese bitte.",
|
||||
"report_app": "App melden",
|
||||
"limit_booking_frequency": "Buchungsfrequenz begrenzen",
|
||||
"limit_booking_frequency_description": "Begrenzen, wie oft dieses Ereignis gebucht werden kann",
|
||||
@@ -1338,5 +1398,44 @@
|
||||
"test_preview": "Vorschau testen",
|
||||
"route_to": "Weiterleiten zu",
|
||||
"test_preview_description": "Testen Sie Ihr Weiterleitungsformular, ohne Daten zu senden",
|
||||
"test_routing": "Testweiterleitung"
|
||||
"test_routing": "Testweiterleitung",
|
||||
"payment_app_disabled": "Ein Administrator hat eine Zahlungs-App deaktiviert",
|
||||
"edit_event_type": "Termintyp bearbeiten",
|
||||
"collective_scheduling": "Kollektive Terminplanung",
|
||||
"make_it_easy_to_book": "Machen Sie es einfach, Ihr Team zu buchen, wenn jeder verfügbar ist.",
|
||||
"find_the_best_person": "Finden Sie die beste verfügbare Person und rotieren Sie durch Ihr Team.",
|
||||
"fixed_round_robin": "Festgelegter Round Robin",
|
||||
"add_one_fixed_attendee": "Fügen Sie einen festen Teilnehmer und einen Round Robin mit einer Reihe von Teilnehmern hinzu.",
|
||||
"calcom_is_better_with_team": "Cal.com ist mit Teams besser",
|
||||
"add_your_team_members": "Fügen Sie Ihre Teammitglieder zu Ihren Termintypen hinzu. Nutzen Sie kollektive Planung, um alle einzubinden oder finden Sie die geeignetste Person mit der Round Robin Planung.",
|
||||
"booking_limit_reached": "Das Buchungslimit für diesen Termintyp wurde erreicht",
|
||||
"admin_has_disabled": "Ein Admin hat {{appName}} deaktiviert",
|
||||
"disabled_app_affects_event_type": "Ein Admin hat {{appName}} deaktiviert, was Ihren Termintyp {{eventType}} betrifft",
|
||||
"disable_payment_app": "Der Admin hat {{appName}} deaktiviert, wodurch Ihr Termintyp {{title}} beeinflusst wurde. Die Teilnehmer können diesen Termintyp immer noch buchen, werden aber nicht zur Zahlung aufgefordert. Sie können den Termintyp ausblenden, um dies zu verhindern, bis Ihr Administrator Ihre Zahlungsmethode wieder aktiviert.",
|
||||
"payment_disabled_still_able_to_book": "Die Teilnehmer können diesen Termintyp immer noch buchen, werden aber nicht zur Zahlung aufgefordert. Sie können den Termintyp ausblenden, um dies zu verhindern, bis Ihr Administrator Ihre Zahlungsmethode wieder aktiviert.",
|
||||
"app_disabled_with_event_type": "Der Admin hat {{appName}} deaktiviert, was Ihren Termintyp {{title}} betrifft.",
|
||||
"app_disabled_video": "Der Administrator hat {{appName}} deaktiviert, was Ihre Termintypen beeinflussen kann. Wenn Sie Termintypen mit {{appName}} als Ort haben, wird es standardmäßig zu Cal Video geändert.\n",
|
||||
"app_disabled_subject": "{{appName}} wurde deaktiviert",
|
||||
"navigate_installed_apps": "Zu installierte Apps wechseln",
|
||||
"disabled_calendar": "Wenn Sie einen anderen Kalender installiert haben, werden neue Buchungen zu dem Kalender hinzugefügt. Verbinden Sie andernfalls einen neuen Kalender, damit Sie keine neuen Buchungen verpassen.",
|
||||
"enable_apps": "Apps aktivieren",
|
||||
"enable_apps_description": "Apps aktivieren, die Benutzer mit Cal.com integrieren können",
|
||||
"app_is_enabled": "{{appName}} ist aktiviert",
|
||||
"app_is_disabled": "{{appName}} ist deaktiviert",
|
||||
"keys_have_been_saved": "Schlüssel wurden gespeichert",
|
||||
"disable_app": "App deaktivieren",
|
||||
"disable_app_description": "Das Deaktivieren dieser App kann Probleme mit den Interaktionen Ihrer Nutzer mit Cal verursachen",
|
||||
"edit_keys": "Schlüssel bearbeiten",
|
||||
"admin_apps_description": "Hier findest du eine Auflistung deiner Apps",
|
||||
"no_available_apps": "Es gibt keine verfügbaren Apps",
|
||||
"no_available_apps_description": "Bitte stellen Sie sicher, dass sich unter „packages/app-store“ Apps in Ihrem Deployment befinden",
|
||||
"no_apps": "In dieser Instanz von Cal sind keine Apps aktiviert",
|
||||
"apps_settings": "Apps-Einstellungen",
|
||||
"fill_this_field": "Bitte füllen Sie dieses Feld aus",
|
||||
"options": "Optionen",
|
||||
"enter_option": "Option {{index}} eingeben",
|
||||
"add_an_option": "Option hinzufügen",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-Kopie",
|
||||
"set_as_default": "Als Standard festlegen"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"day_one": "{{count}} ημέρα",
|
||||
"day_other": "{{count}} ημέρες",
|
||||
"second_one": "{{count}} δευτερόλεπτο",
|
||||
"second_other": "{{count}} δευτερόλεπτα",
|
||||
"upgrade_now": "Αναβαθμίστε τώρα",
|
||||
"accept_invitation": "Αποδοχή Πρόσκλησης",
|
||||
"have_any_questions": "Έχετε ερωτήσεις? Είμαστε εδώ για να βοηθήσουμε.",
|
||||
"reset_password_subject": "{{appName}}: Οδηγίες επαναφοράς κωδικού πρόσβασης",
|
||||
"event_declined_subject": "Απορρίφθηκε: {{eventType}} με {{name}} στις {{date}}",
|
||||
"event_cancelled_subject": "Ακύρωση: {{eventType}} με {{name}} στις {{date}}",
|
||||
"need_to_reschedule_or_cancel": "Χρειάζεται να επαναπρογραμματίσετε ή να ακυρώσετε;",
|
||||
"cancellation_reason": "Λόγος ακύρωσης (προαιρετικό)",
|
||||
"rejection_reason": "Λόγος απόρριψης",
|
||||
"rejection_reason_title": "Απόρριψη του αιτήματος κράτησης;",
|
||||
"rejection_confirmation": "Απόρριψη κράτησης",
|
||||
"error_message": "Το μήνυμα σφάλματος ήταν: '{{errorMessage}}'",
|
||||
"refund_failed_subject": "Η επιστροφή χρημάτων απέτυχε: {{name}} - {{date}} - {{eventType}}",
|
||||
"refund_failed": "Η επιστροφή χρημάτων για την εκδήλωση {{eventType}} με {{userName}} στις {{date}} απέτυχε.",
|
||||
"a_refund_failed": "Αποτυχία επιστροφής χρημάτων",
|
||||
"awaiting_payment_subject": "Σε αναμονή Πληρωμής: {{eventType}} με {{name}} στις {{date}}",
|
||||
"meeting_awaiting_payment": "Η πληρωμή της συνάντησής σας εκκρεμεί",
|
||||
"help": "Βοήθεια",
|
||||
"price": "Τιμή",
|
||||
"payment": "Πληρωμή",
|
||||
"missing_card_fields": "Λείπουν τα πεδία της κάρτας",
|
||||
"pay_now": "Πληρωμή τώρα",
|
||||
"terms_summary": "Περίληψη όρων",
|
||||
"open_env": "Ανοίξτε το .env και συμφωνήστε με την Άδεια χρήσης μας",
|
||||
"env_changed": "Έχω αλλάξει το .env μου",
|
||||
"accept_license": "Αποδοχή Άδειας",
|
||||
"no_more_results": "Δεν υπάρχουν άλλα αποτελέσματα",
|
||||
"no_results": "Δεν υπάρχουν αποτελέσματα",
|
||||
"load_more_results": "Φόρτωση περισσότερων αποτελεσμάτων",
|
||||
"integration_meeting_id": "ID συνάντησης {{integrationName}} : {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Επιβεβαίωση: {{eventType}} με {{name}} στις {{date}}",
|
||||
"new_event_request": "Νέο αίτημα εκδήλωσης: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"confirm_or_reject_request": "Επιβεβαιώστε ή απορρίψτε το αίτημα",
|
||||
"check_bookings_page_to_confirm_or_reject": "Ελέγξτε τη σελίδα κρατήσεων για να επιβεβαιώσετε ή να απορρίψετε την κράτηση.",
|
||||
"event_awaiting_approval": "Ένα γεγονός περιμένει την έγκρισή σας",
|
||||
"event_type": "Τύπος Συμβάντος",
|
||||
"meeting_password": "Συνθηματικό Συνάντησης",
|
||||
"meeting_url": "URL Συνάντησης",
|
||||
"meeting_request_rejected": "Το αίτημα συνάντησής σας απορρίφθηκε",
|
||||
"hi": "Γεια",
|
||||
"manage_this_team": "Διαχείριση αυτής της ομάδας",
|
||||
"team_info": "Πληροφορίες Ομάδας",
|
||||
"hidden_team_member_title": "Είστε κρυμμένοι σε αυτήν την ομάδα",
|
||||
"edit_webhook": "Επεξεργασία Webhook",
|
||||
"delete_webhook": "Διαγραφή Webhook",
|
||||
"webhook_enabled": "Ενεργοποιημένο Webhook",
|
||||
"webhook_disabled": "Απενεργοποιημένο Webhook",
|
||||
"webhook_response": "Απάντηση Webhook",
|
||||
"webhook_test": "Έλεγχος Webhook",
|
||||
"webhook_created_successfully": "Το Webhook δημιουργήθηκε επιτυχώς!",
|
||||
"webhook_updated_successfully": "Το Webhook ενημερώθηκε επιτυχώς!",
|
||||
"webhook_removed_successfully": "Το Webhook αφαιρέθηκε επιτυχώς!",
|
||||
"dismiss": "Παράβλεψη",
|
||||
"no_data_yet": "Δεν υπάρχουν δεδομένα ακόμη",
|
||||
"upcoming": "Επερχόμενα",
|
||||
"recurring": "Επαναλαμβανόμενα",
|
||||
"past": "Παρελθοντικά",
|
||||
"choose_a_file": "Επιλογή αρχείου...",
|
||||
"upload_image": "Μεταφόρτωση εικόνας",
|
||||
"username": "Όνομα χρήστη",
|
||||
"is_still_available": "είναι ακόμα διαθέσιμο.",
|
||||
"documentation": "Τεκμηρίωση",
|
||||
"blog": "Ιστολόγιο",
|
||||
"blog_description": "Διαβάστε τα τελευταία μας νέα και άρθρα",
|
||||
"popular_pages": "Δημοφιλείς σελίδες",
|
||||
"register_now": "Εγγραφή τώρα",
|
||||
"register": "Εγγραφή",
|
||||
"page_doesnt_exist": "Η σελίδα δεν υπάρχει.",
|
||||
"check_spelling_mistakes_or_go_back": "Έλεγχος για ορθογραφικά λάθη ή επιστροφή στην προηγούμενη σελίδα.",
|
||||
"404_page_not_found": "404: Η σελίδα δεν βρέθηκε.",
|
||||
"getting_started": "Ξεκινήστε",
|
||||
"already_have_an_account": "Έχετε ήδη λογαριασμό;",
|
||||
"create_account": "Δημιουργία Λογαριασμού",
|
||||
"confirm_password": "Επιβεβαίωση κωδικού πρόσβασης",
|
||||
"create_your_account": "Δημιουργία λογαριασμού",
|
||||
"sign_up": "Εγγραφή",
|
||||
"youve_been_logged_out": "Έχετε αποσυνδεθεί",
|
||||
"hope_to_see_you_soon": "Ελπίζουμε να σας ξαναδούμε σύντομα!",
|
||||
"please_try_again_and_contact_us": "Παρακαλούμε δοκιμάστε ξανά και επικοινωνήστε μαζί μας αν το πρόβλημα παραμένει.",
|
||||
"no_account_exists": "Δεν υπάρχει λογαριασμός που να ταιριάζει με τη διεύθυνση email.",
|
||||
"2fa_enter_six_digit_code": "Εισάγετε τον εξαψήφιο κωδικό από την εφαρμογή ελέγχου ταυτότητας παρακάτω.",
|
||||
"create_an_account": "Δημιουργία λογαριασμού",
|
||||
"dont_have_an_account": "Δεν έχετε λογαριασμό;",
|
||||
"sign_in_account": "Συνδεθείτε στο λογαριασμό σας",
|
||||
"sign_in": "Είσοδος",
|
||||
"connect": "Σύνδεση",
|
||||
"try_for_free": "Δοκιμάστε δωρεάν",
|
||||
"add_to_calendar": "Προσθήκη στο ημερολόγιο",
|
||||
"add_another_calendar": "Προσθήκη άλλου ημερολογίου",
|
||||
"meeting_is_scheduled": "Η συνάντηση έχει προγραμματιστεί",
|
||||
"submitted": "Η κράτησή σας έχει υποβληθεί",
|
||||
"reset_password": "Επαναφορά Κωδικού Πρόσβασης",
|
||||
"change_your_password": "Αλλαγή κωδικού πρόσβασης",
|
||||
"show_password": "Εμφάνιση κωδικού πρόσβασης",
|
||||
"hide_password": "Απόκρυψη κωδικού πρόσβασης",
|
||||
"try_again": "Δοκιμάστε ξανά",
|
||||
"sunday_time_error": "Μη έγκυρη ώρα την Κυριακή",
|
||||
"monday_time_error": "Μη έγκυρη ώρα τη Δευτέρα",
|
||||
"tuesday_time_error": "Μη έγκυρη ώρα την Τρίτη",
|
||||
"wednesday_time_error": "Μη έγκυρη ώρα την Τετάρτη",
|
||||
"thursday_time_error": "Μη έγκυρη ώρα την Πέμπτη",
|
||||
"friday_time_error": "Μη έγκυρη ώρα την Παρασκευή",
|
||||
"saturday_time_error": "Μη έγκυρη ώρα το Σάββατο",
|
||||
"no_meeting_found": "Δε βρέθηκε συνάντηση",
|
||||
"bookings": "Κρατήσεις"
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
"second_other": "{{count}} seconds",
|
||||
"upgrade_now": "Upgrade now",
|
||||
"accept_invitation": "Accept Invitation",
|
||||
"calcom_explained": "{{appName}} is the open source Calendly alternative putting you in control of your own data, workflow and appearance.",
|
||||
"calcom_explained": "{{appName}} provides scheduling infrastructure for absolutely everyone.",
|
||||
"have_any_questions": "Have questions? We're here to help.",
|
||||
"reset_password_subject": "{{appName}}: Reset password instructions",
|
||||
"event_declined_subject": "Declined: {{eventType}} with {{name}} at {{date}}",
|
||||
@@ -303,6 +303,7 @@
|
||||
"cancelling_all_recurring": "These are all remaining instances in the recurring event.",
|
||||
"error_with_status_code_occured": "An error with status code {{status}} occurred.",
|
||||
"booking_already_cancelled": "This booking was already cancelled",
|
||||
"booking_already_accepted_rejected": "This booking was already accepted or rejected",
|
||||
"go_back_home": "Go back home",
|
||||
"or_go_back_home": "Or go back home",
|
||||
"no_availability": "Unavailable",
|
||||
@@ -385,7 +386,9 @@
|
||||
"go_to_billing_portal": "Go to the billing portal",
|
||||
"need_anything_else": "Need anything else?",
|
||||
"further_billing_help": "If you need any further help with billing, our support team are here to help.",
|
||||
"contact_our_support_team": "Contact our support team",
|
||||
"contact": "Contact",
|
||||
"our_support_team": "our support team",
|
||||
"contact_our_support_team":"Contact our support team",
|
||||
"uh_oh": "Uh oh!",
|
||||
"no_event_types_have_been_setup": "This user hasn't set up any event types yet.",
|
||||
"edit_logo": "Edit logo",
|
||||
@@ -750,7 +753,7 @@
|
||||
"toggle_calendars_conflict": "Toggle the calendars you want to check for conflicts to prevent double bookings.",
|
||||
"select_destination_calendar": "Create events on",
|
||||
"connect_additional_calendar": "Connect additional calendar",
|
||||
"calendar_updated_successfully":"Calendar updated successfully",
|
||||
"calendar_updated_successfully": "Calendar updated successfully",
|
||||
"conferencing": "Conferencing",
|
||||
"calendar": "Calendar",
|
||||
"payments": "Payments",
|
||||
@@ -791,7 +794,7 @@
|
||||
"no_category_apps_description_analytics": "Add an analytics app for your booking pages",
|
||||
"no_category_apps_description_automation": "Add an automation app to use",
|
||||
"no_category_apps_description_other": "Add any other type of app to do all sorts of things",
|
||||
"installed_app_calendar_description": "Set the calendar(s) to check for conflicts to prevent double bookings.",
|
||||
"installed_app_calendar_description": "Set the calendars to check for conflicts to prevent double bookings.",
|
||||
"installed_app_conferencing_description": "Add your favourite video conferencing apps for your meetings",
|
||||
"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",
|
||||
@@ -918,7 +921,7 @@
|
||||
"allow_booker_to_select_duration": "Allow booker to select duration",
|
||||
"impersonate_user_tip": "All uses of this feature is audited.",
|
||||
"impersonating_user_warning": "Impersonating username \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>Click Here to stop</0>.",
|
||||
"impersonating_stop_instructions": "Click here to stop",
|
||||
"event_location_changed": "Updated - Your event changed the location",
|
||||
"location_changed_event_type_subject": "Location Changed: {{eventType}} with {{name}} at {{date}}",
|
||||
"current_location": "Current Location",
|
||||
@@ -1213,7 +1216,7 @@
|
||||
"event_time_info": "The event start time",
|
||||
"location_info": "The event location",
|
||||
"organizer_name_info": "Your name",
|
||||
"additional_notes_info": "The Additional notes of booking",
|
||||
"additional_notes_info": "The additional notes of booking",
|
||||
"attendee_name_info": "The person booking's name",
|
||||
"to": "To",
|
||||
"workflow_turned_on_successfully": "{{workflowName}} workflow turned {{offOn}} successfully",
|
||||
@@ -1326,6 +1329,8 @@
|
||||
"booking_confirmation_success": "Booking confirmation succeeded",
|
||||
"booking_rejection_success": "Booking rejection succeeded",
|
||||
"booking_confirmation_fail": "Booking confirmation failed",
|
||||
"booking_tentative": "This booking is tentative",
|
||||
"booking_accept_intent": "Oops, I want to accept",
|
||||
"we_wont_show_again": "We won't show this again",
|
||||
"couldnt_update_timezone": "We couldn't update the timezone",
|
||||
"updated_timezone_to": "Updated timezone to {{formattedCurrentTz}}",
|
||||
@@ -1389,10 +1394,8 @@
|
||||
"attendee_email_workflow": "Attendee email",
|
||||
"attendee_email_info": "The person booking's email",
|
||||
"kbar_search_placeholder": "Type a command or search...",
|
||||
"free_to_use_apps": "Free",
|
||||
"enterprise_license": "This is an enterprise feature",
|
||||
"enterprise_license_description": "To enable this feature, get a deployment key at {{consoleUrl}} console and add it to your .env as CALCOM_LICENSE_KEY. If your team already has a license, please contact {{supportMail}} for help.",
|
||||
"invalid_credential": "Oh no! Looks like permission expired or was revoked. Please reinstall again.",
|
||||
"reschedule_reason_success_page": "Reschedule reason",
|
||||
"choose_common_schedule_team_event": "Choose a common schedule",
|
||||
"choose_common_schedule_team_event_description": "Enable this if you want to use a common schedule between hosts. When disabled, each host will be booked based on their default schedule.",
|
||||
"reason": "Reason",
|
||||
@@ -1412,7 +1415,7 @@
|
||||
"add_one_fixed_attendee": "Add one fixed attendee and round robin through a number of attendees.",
|
||||
"calcom_is_better_with_team": "Cal.com is better with teams",
|
||||
"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",
|
||||
"booking_limit_reached": "Booking Limit for this event type has been reached",
|
||||
"admin_has_disabled": "An admin has disabled {{appName}}",
|
||||
"disabled_app_affects_event_type": "An admin has disabled {{appName}} which affects your event type {{eventType}}",
|
||||
"disable_payment_app": "The admin has disabled {{appName}} which affects your event type {{title}}. Attendees are still able to book this type of event but will not be prompted to pay. You may hide hide the event type to prevent this until your admin renables your payment method.",
|
||||
@@ -1430,7 +1433,7 @@
|
||||
"disable_app": "Disable App",
|
||||
"disable_app_description": "Disabling this app could cause problems with how your users interact with Cal",
|
||||
"edit_keys": "Edit Keys",
|
||||
"apps_description": "Enable apps for your instance of Cal",
|
||||
"admin_apps_description": "Enable apps for your instance of Cal",
|
||||
"no_available_apps": "There are no available apps",
|
||||
"no_available_apps_description": "Please ensure there are apps in your deployment under 'packages/app-store'",
|
||||
"no_apps": "There are no apps enabled in this instance of Cal",
|
||||
@@ -1440,6 +1443,35 @@
|
||||
"enter_option": "Enter Option {{index}}",
|
||||
"add_an_option": "Add an option",
|
||||
"radio": "Radio",
|
||||
"kbar_search_placeholder" : "Start typing to search",
|
||||
"set_as_default": "Set as default"
|
||||
"individual":"Individual",
|
||||
"all_bookings_filter_label":"All Bookings",
|
||||
"all_users_filter_label":"All Users",
|
||||
"meeting_url_workflow": "Meeting url",
|
||||
"meeting_url_info": "The event meeting conference url",
|
||||
"date_overrides": "Date overrides",
|
||||
"date_overrides_subtitle": "Add dates when your availability changes from your daily hours.",
|
||||
"date_overrides_info": "Date overrides are archived automatically after the date has passed",
|
||||
"date_overrides_dialog_which_hours": "Which hours are you free?",
|
||||
"date_overrides_dialog_which_hours_unavailable": "Which hours are you busy?",
|
||||
"date_overrides_dialog_title": "Select the dates to override",
|
||||
"date_overrides_unavailable": "Unavailable all day",
|
||||
"date_overrides_mark_all_day_unavailable_one": "Mark unavailable (All day)",
|
||||
"date_overrides_mark_all_day_unavailable_other": "Mark unavailable on selected dates",
|
||||
"date_overrides_add_btn": "Add Override",
|
||||
"date_overrides_update_btn": "Update Override",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-copy",
|
||||
"set_as_default": "Set as default",
|
||||
"hide_eventtype_details": "Hide EventType Details",
|
||||
"show_navigation": "Show navigation",
|
||||
"hide_navigation": "Hide navigation",
|
||||
"verification_code_sent": "Verification code sent",
|
||||
"verified_successfully": "Verified successfully",
|
||||
"wrong_code": "Wong verification code",
|
||||
"not_verified": "Not yet verified",
|
||||
"no_availability_in_month": "No availability in {{month}}",
|
||||
"view_next_month": "View next month",
|
||||
"send_code" : "Send code",
|
||||
"number_verified": "Number Verified",
|
||||
"create_your_first_team_webhook_description": "Create your first webhook for this team event type",
|
||||
"create_webhook_team_event_type": "Create a webhook for this team event type"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Un evento aún está esperando su aprobación",
|
||||
"event_is_still_waiting": "La solicitud del evento todavía está esperando: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "No hay más resultados",
|
||||
"no_results": "Sin resultados",
|
||||
"load_more_results": "Cargar más resultados",
|
||||
"integration_meeting_id": "ID de la reunión {{integrationName}}: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Confirma: {{eventType}} con {{name}} en {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Añadir al Calendario",
|
||||
"add_another_calendar": "Añadir otro calendario",
|
||||
"other": "Otro",
|
||||
"email_sign_in_subject": "Su enlace de inicio de sesión para {{appName}}",
|
||||
"emailed_you_and_attendees": "Le enviamos a usted y a los demás asistentes una invitación al calendario con todos los detalles.",
|
||||
"emailed_you_and_attendees_recurring": "Le enviamos a usted y a los demás asistentes una invitación al calendario para el primero de estos eventos recurrentes.",
|
||||
"emailed_you_and_any_other_attendees": "Usted y cualquier otro asistente han recibido esta información.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "La Contraseña Actual es Incorrecta",
|
||||
"password_hint_caplow": "Mezcla de letras mayúsculas y minúsculas",
|
||||
"password_hint_min": "Mínimo 7 caracteres",
|
||||
"password_hint_admin_min": "Longitud mínima de 15 caracteres",
|
||||
"password_hint_num": "Debe contener al menos 1 número",
|
||||
"invalid_password_hint": "La contraseña debe tener un mínimo de 7 caracteres que contengan al menos un número y una mezcla de letras mayúsculas y minúsculas",
|
||||
"incorrect_password": "La Contraseña es Incorrecta.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Confirma tu {{eventTypeTitle}} con {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Reprogramar tu {{eventTypeTitle}} con {{profileName}}",
|
||||
"in_person_meeting": "Reunión en Línea o en Persona",
|
||||
"attendeeInPerson": "En persona (dirección del asistente)",
|
||||
"inPerson": "En persona (dirección del organizador)",
|
||||
"link_meeting": "Enlazar reunión",
|
||||
"phone_call": "Número de teléfono del asistente",
|
||||
"your_number": "Su número de teléfono",
|
||||
"phone_number": "Nª de Telefono",
|
||||
"attendee_phone_number": "Número de teléfono del asistente",
|
||||
"organizer_phone_number": "Número de teléfono del organizador",
|
||||
"host_phone_number": "Su número de teléfono",
|
||||
"enter_phone_number": "Introducir Nº de Telefono",
|
||||
"reschedule": "Reprogramar",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Colectivo",
|
||||
"collective_description": "Programe reuniones cuando todos los miembros del equipo seleccionados estén disponibles.",
|
||||
"duration": "Duración",
|
||||
"available_durations": "Duraciones disponibles",
|
||||
"default_duration": "Duración predeterminada",
|
||||
"default_duration_no_options": "Seleccione primero las duraciones disponibles",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minutos",
|
||||
"round_robin": "Petición Firmada por Turnos",
|
||||
"round_robin_description": "Ciclo de reuniones entre varios miembros del equipo.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Equipos",
|
||||
"team": "Equipo",
|
||||
"team_billing": "Facturación del equipo",
|
||||
"team_billing_description": "Gestione la facturación para su equipo",
|
||||
"upgrade_to_flexible_pro_title": "Hemos cambiado la facturación de los equipos",
|
||||
"upgrade_to_flexible_pro_message": "Hay miembros en tu equipo sin asiento. Actualiza al plan Pro para cubrir los asientos restantes.",
|
||||
"changed_team_billing_info": "A partir de enero de 2022 cobramos por asiento para los miembros del equipo. Los miembros de tu equipo que tenían el plan Pro de forma gratuita están ahora en una prueba de 14 días. Una vez que caduque su prueba, estos miembros estarán ocultos para tu equipo a menos que actualices ahora.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Ocultar Tipo de Evento",
|
||||
"edit_location": "Editar Localización",
|
||||
"into_the_future": "en el futuro",
|
||||
"when_booked_with_less_than_notice": "Cuando se reserve con menos de <time></time> de aviso",
|
||||
"within_date_range": "Dentro de un rango de fechas",
|
||||
"indefinitely_into_future": "Indefinidamente en el futuro",
|
||||
"add_new_custom_input_field": "Agregar nuevo campo de entrada personalizado",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "¿Estás seguro de que quieres eliminar tu cuenta de {{appName}}? Cualquier persona con la que hayas compartido el enlace de tu cuenta ya no podrá reservar con ella y cualquier preferencia que hayas guardado se perderá.",
|
||||
"integrations": "Integraciones",
|
||||
"apps": "Aplicaciones",
|
||||
"apps_listing": "Lista de aplicaciones",
|
||||
"category_apps": "Aplicaciones {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Conectar personas, tecnología y lugar de trabajo.",
|
||||
@@ -736,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "Activa/desactiva los calendarios en los que desees comprobar conflictos para evitar reservas dobles.",
|
||||
"select_destination_calendar": "Crear eventos en",
|
||||
"connect_additional_calendar": "Conectar calendario adicional",
|
||||
"calendar_updated_successfully": "Calendario actualizado correctamente",
|
||||
"conferencing": "Conferencias",
|
||||
"calendar": "Calendario",
|
||||
"payments": "Pagos",
|
||||
@@ -768,6 +782,7 @@
|
||||
"trending_apps": "Aplicaciones populares",
|
||||
"explore_apps": "Aplicaciones {{category}}",
|
||||
"installed_apps": "Aplicaciones instaladas",
|
||||
"free_to_use_apps": "Libre",
|
||||
"no_category_apps": "No hay aplicaciones de {{category}}",
|
||||
"no_category_apps_description_calendar": "Añade una aplicación de calendario para comprobar si hay conflictos y evitar reservas duplicadas",
|
||||
"no_category_apps_description_conferencing": "Intenta añadir una aplicación de conferencias para integrar las videollamadas con tus clientes",
|
||||
@@ -806,6 +821,8 @@
|
||||
"verify_wallet": "Verificar billetera",
|
||||
"connect_metamask": "Conectar Metamask",
|
||||
"create_events_on": "Crear eventos en",
|
||||
"enterprise_license": "Esta es una función empresarial",
|
||||
"enterprise_license_description": "Para habilitar esta función, obtenga una clave de despliegue en la consola {{consoleUrl}} y añádala a su .env como CALCOM_LICENSE_KEY. Si su equipo ya tiene una licencia, póngase en contacto con {{supportMail}} para obtener ayuda.",
|
||||
"missing_license": "Falta la licencia",
|
||||
"signup_requires": "Licencia comercial requerida",
|
||||
"signup_requires_description": "Actualmente, {{companyName}} no ofrece una versión gratuita de código abierto de la página de registro. Para recibir acceso completo a los componentes de registro es necesario adquirir una licencia comercial. Para uso personal, recomendamos la Plataforma de Datos Prisma o cualquier otra interfaz Postgres para crear cuentas.",
|
||||
@@ -897,6 +914,7 @@
|
||||
"user_impersonation_heading": "Suplantación de usuario",
|
||||
"user_impersonation_description": "Permite a nuestro equipo de soporte iniciar sesión temporalmente para ayudar a resolver rápidamente cualquier problema reportado.",
|
||||
"team_impersonation_description": "Permite a los administradores de tu equipo iniciar sesión temporalmente como tú.",
|
||||
"allow_booker_to_select_duration": "Permitir que el encargado de las reservas seleccione la duración",
|
||||
"impersonate_user_tip": "Todos los usos de esta función son revisados.",
|
||||
"impersonating_user_warning": "Suplantando nombre de usuario \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>Haga clic aquí para detener</0>.",
|
||||
@@ -1014,6 +1032,9 @@
|
||||
"error_removing_app": "Error al eliminar la aplicación",
|
||||
"web_conference": "Conferencia web",
|
||||
"requires_confirmation": "Requiere confirmación",
|
||||
"always_requires_confirmation": "Siempre",
|
||||
"requires_confirmation_threshold": "Requiere confirmación si se reservó con el aviso < {{time}} $t({{unit}}_timeUnit)",
|
||||
"may_require_confirmation": "Puede requerir confirmación",
|
||||
"nr_event_type_one": "{{count}} tipo de evento",
|
||||
"nr_event_type_other": "{{count}} tipos de eventos",
|
||||
"add_action": "Agregar acción",
|
||||
@@ -1101,6 +1122,9 @@
|
||||
"event_limit_tab_description": "Con qué frecuencia se puede reservar",
|
||||
"event_advanced_tab_description": "Ajustes del calendario y más...",
|
||||
"event_advanced_tab_title": "Avanzado",
|
||||
"event_setup_multiple_duration_error": "Configuración de eventos: varias duraciones requieren al menos una opción.",
|
||||
"event_setup_multiple_duration_default_error": "Configuración de eventos: seleccione una duración predeterminada válida.",
|
||||
"event_setup_booking_limits_error": "Los límites de las reservas deben estar en orden ascendente. [día, semana, mes, año]",
|
||||
"select_which_cal": "Seleccione a qué calendario añadir reservas",
|
||||
"custom_event_name": "Nombre de evento personalizado",
|
||||
"custom_event_name_description": "Cree nombres de eventos personalizados para que el evento aparezca en el calendario",
|
||||
@@ -1154,8 +1178,11 @@
|
||||
"invoices": "Facturas",
|
||||
"embeds": "Inserciones",
|
||||
"impersonation": "Suplantación",
|
||||
"impersonation_description": "Configuración para administrar la suplantación del usuario",
|
||||
"users": "Usuarios",
|
||||
"profile_description": "Administra los ajustes para tu perfil de {{appName}}",
|
||||
"users_description": "Aquí puede encontrar una lista de todos los usuarios",
|
||||
"users_listing": "Listado de usuarios",
|
||||
"general_description": "Administre los ajustes para tu idioma y zona horaria",
|
||||
"calendars_description": "Configura cómo interactúan tus tipos de eventos con tus calendarios",
|
||||
"appearance_description": "Administra los ajustes para el aspecto de tu reserva",
|
||||
@@ -1360,6 +1387,7 @@
|
||||
"number_sms_notifications": "Número de teléfono (notificaciones por SMS)",
|
||||
"attendee_email_workflow": "Correo electrónico del asistente",
|
||||
"attendee_email_info": "El correo electrónico de la persona que reserva",
|
||||
"kbar_search_placeholder": "Escriba un comando o búsqueda...",
|
||||
"invalid_credential": "¡Oh no! Parece que el permiso ha caducado o se ha revocado. Vuelva a instalarlo.",
|
||||
"choose_common_schedule_team_event": "Elige un horario común para todos",
|
||||
"choose_common_schedule_team_event_description": "Habilite esto si desea utilizar un cronograma común entre anfitriones. Cuando esté desactivado, cada anfitrión se reservará en relación a su horario predeterminado.",
|
||||
@@ -1370,5 +1398,43 @@
|
||||
"test_preview": "Vista previa de la prueba",
|
||||
"route_to": "Ruta hacia",
|
||||
"test_preview_description": "Pruebe su formulario de ruta sin enviar ningún dato",
|
||||
"test_routing": "Prueba de ruta"
|
||||
"test_routing": "Prueba de ruta",
|
||||
"payment_app_disabled": "Un administrador ha desactivado una aplicación de pago",
|
||||
"edit_event_type": "Editar tipo de evento",
|
||||
"collective_scheduling": "Programación colectiva",
|
||||
"make_it_easy_to_book": "Haga que sea fácil reservar su equipo cuando todos estén disponibles.",
|
||||
"find_the_best_person": "Encuentre a la mejor persona disponible y haga una rotación en su equipo.",
|
||||
"fixed_round_robin": "Rotación fija por turnos",
|
||||
"add_one_fixed_attendee": "Agregue un asistente fijo y la rotación por turnos a través de un número de asistentes.",
|
||||
"calcom_is_better_with_team": "Cal.com funciona mejor con equipos",
|
||||
"add_your_team_members": "Añada los miembros de su equipo a sus tipos de eventos. Utilice la programación colectiva para incluir a todos o encuentre a la persona más adecuada con programación de rotación por turnos.",
|
||||
"booking_limit_reached": "Se ha alcanzado el límite de reserva para este tipo de evento",
|
||||
"admin_has_disabled": "Un administrador ha desactivado {{appName}}",
|
||||
"disabled_app_affects_event_type": "Un administrador ha desactivado {{appName}}, lo que afecta a su tipo de evento {{eventType}}",
|
||||
"disable_payment_app": "El administrador ha deshabilitado {{appName}}, lo que afecta a su tipo de evento {{title}}. Los asistentes todavía pueden reservar este tipo de evento pero no se les pedirá que paguen. Puede ocultar el tipo de evento para evitar esto hasta que su administrador cambie su forma de pago.",
|
||||
"payment_disabled_still_able_to_book": "Los asistentes todavía pueden reservar este tipo de eventos, pero no se les pedirá que paguen. Puede ocultar el tipo de evento para evitar esto hasta que su administrador reactive su método de pago.",
|
||||
"app_disabled_with_event_type": "El administrador ha desactivado {{appName}}, lo que afecta a su tipo de evento {{title}}.",
|
||||
"app_disabled_video": "El administrador ha desactivado {{appName}}, lo que puede afectar a sus tipos de evento. Si tiene tipos de eventos con {{appName}} como localización, entonces el valor predeterminado será Cal Video.",
|
||||
"app_disabled_subject": "{{appName}} se ha desactivado",
|
||||
"navigate_installed_apps": "Ir a las aplicaciones instaladas",
|
||||
"disabled_calendar": "Si tiene otro calendario instalado se le añadirán nuevas reservas. De lo contrario, conecte un nuevo calendario para que no se pierda ninguna reserva nueva.",
|
||||
"enable_apps": "Activar aplicaciones",
|
||||
"enable_apps_description": "Active aplicaciones que los usuarios puedan integrar con Cal.com",
|
||||
"app_is_enabled": "{{appName}} está activada",
|
||||
"app_is_disabled": "{{appName}} está desactivada",
|
||||
"keys_have_been_saved": "Las llaves se han guardado",
|
||||
"disable_app": "Desactivar aplicación",
|
||||
"disable_app_description": "Desactivar esta aplicación puede causar problemas con la forma en que sus usuarios interactúan con Cal",
|
||||
"edit_keys": "Editar claves",
|
||||
"no_available_apps": "No hay aplicaciones disponibles",
|
||||
"no_available_apps_description": "Verifique que haya aplicaciones en su despliegue bajo 'packages/app-store'",
|
||||
"no_apps": "No hay aplicaciones activadas en esta instancia de Cal",
|
||||
"apps_settings": "Configuración de aplicaciones",
|
||||
"fill_this_field": "Complete este campo",
|
||||
"options": "Opciones",
|
||||
"enter_option": "Introduzca la opción {{index}}",
|
||||
"add_an_option": "Agregue una opción",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-copia",
|
||||
"set_as_default": "Establecer como predeterminado"
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
"event_request_cancelled": "Votre événement programmé a été annulé",
|
||||
"organizer": "Organisateur",
|
||||
"need_to_reschedule_or_cancel": "Besoin de reprogrammer ou d'annuler ?",
|
||||
"cancellation_reason": "Motif de l'annulation",
|
||||
"cancellation_reason_placeholder": "Pourquoi annulez-vous ? (facultatif)",
|
||||
"cancellation_reason": "Motif de l'annulation (facultatif)",
|
||||
"cancellation_reason_placeholder": "Pourquoi annulez-vous ?",
|
||||
"rejection_reason": "Motif de rejet",
|
||||
"rejection_reason_title": "Rejeter la demande de réservation ?",
|
||||
"rejection_reason_description": "Êtes-vous sûr de vouloir rejeter la réservation ? Nous informerons la personne qui a essayé de réserver. Vous pouvez fournir une raison ci-dessous.",
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Un événement est toujours en attente d'approbation",
|
||||
"event_is_still_waiting": "La demande d'événement est toujours en attente : {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Plus de résultats",
|
||||
"no_results": "Aucun résultat",
|
||||
"load_more_results": "Charger plus de résultats",
|
||||
"integration_meeting_id": "Identifiant de la réunion {{integrationName}} : {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Confirmé : {{eventType}} avec {{name}} le {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Ajouter au calendrier",
|
||||
"add_another_calendar": "Ajouter un autre calendrier",
|
||||
"other": "Autre",
|
||||
"email_sign_in_subject": "Votre lien de connexion pour {{appName}}",
|
||||
"emailed_you_and_attendees": "Nous vous avons envoyé, à vous et aux autres participants, une invitation par e-mail avec tous les détails.",
|
||||
"emailed_you_and_attendees_recurring": "Nous vous avons envoyé, à vous et aux autres participants, une invitation au calendrier pour le premier de ces événements récurrents.",
|
||||
"emailed_you_and_any_other_attendees": "Ces informations vous ont été envoyées par e-mail, ainsi qu'à tous les autres participants.",
|
||||
@@ -419,7 +421,8 @@
|
||||
"forgotten_secret_description": "Si vous avez perdu ou oublié ce code secret, vous pouvez le modifer, mais soyez conscient que toutes les intégrations l'utilisant devront être actualisées",
|
||||
"current_incorrect_password": "Le mot de passe actuel est incorrect",
|
||||
"password_hint_caplow": "Mélange de lettres majuscules et minuscules",
|
||||
"password_hint_min": "Minimum 7 caractères",
|
||||
"password_hint_min": "Minimum 8 caractères",
|
||||
"password_hint_admin_min": "Minimum 15 caractères",
|
||||
"password_hint_num": "Contient au moins 1 chiffre",
|
||||
"invalid_password_hint": "Le mot de passe doit comporter un minimum de 7 caractères, dont au moins un chiffre, et avoir un mélange de lettres majuscules et minuscules",
|
||||
"incorrect_password": "Le mot de passe est incorrect.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Confirmez votre {{eventTypeTitle}} avec {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Reporté votre {{eventTypeTitle}} avec {{profileName}}",
|
||||
"in_person_meeting": "Lien ou réunion en présentiel",
|
||||
"attendeeInPerson": "En personne (adresse du participant)",
|
||||
"inPerson": "En personne (adresse de l'organisateur)",
|
||||
"link_meeting": "Lier une réunion",
|
||||
"phone_call": "Appel téléphonique",
|
||||
"your_number": "Votre numéro de téléphone",
|
||||
"phone_number": "Numéro de téléphone",
|
||||
"attendee_phone_number": "Numéro de téléphone du participant",
|
||||
"organizer_phone_number": "Numéro de téléphone de l'organisateur",
|
||||
"host_phone_number": "Votre numéro de téléphone",
|
||||
"enter_phone_number": "Saisissez le numéro de téléphone",
|
||||
"reschedule": "Reporter",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Collectif",
|
||||
"collective_description": "Planifiez des réunions lorsque tous les membres de l'équipe sélectionnés sont disponibles.",
|
||||
"duration": "Durée",
|
||||
"available_durations": "Durées disponibles",
|
||||
"default_duration": "Durée par défaut",
|
||||
"default_duration_no_options": "Veuillez d'abord choisir les durées disponibles",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minutes",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Faites tourner les réunions entre plusieurs membres de l'équipe.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Équipes",
|
||||
"team": "Équipe",
|
||||
"team_billing": "Facturation d'équipe",
|
||||
"team_billing_description": "Gérer la facturation pour votre équipe",
|
||||
"upgrade_to_flexible_pro_title": "Nous avons modifié la facturation pour les équipes",
|
||||
"upgrade_to_flexible_pro_message": "Des membres dans votre équipe n'ont pas de place. Mettez à niveau votre offre pro pour couvrir les places manquantes.",
|
||||
"changed_team_billing_info": "Depuis janvier 2022, nous facturons chaque place aux membres de l'équipe. Les membres de votre équipe qui ont eu la version Pro gratuitement disposent maintenant d'un essai de 14 jours. Une fois leur période d'essai expirée, ces membres seront cachés pour votre équipe, sauf si vous mettez à niveau maintenant.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Masquer le type d'événement",
|
||||
"edit_location": "Modifier le lieu",
|
||||
"into_the_future": "dans le futur",
|
||||
"when_booked_with_less_than_notice": "Si réservé avec moins de <time></time> de préavis",
|
||||
"within_date_range": "Dans une plage de dates",
|
||||
"indefinitely_into_future": "Sans doute dans le futur",
|
||||
"add_new_custom_input_field": "Ajouter un nouveau champ de saisie personnalisé",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "Êtes-vous sûr de vouloir supprimer votre compte {{appName}} ? Toute personne avec qui vous avez partagé le lien de votre compte ne pourra plus réserver en utilisant ce lien et toutes les préférences que vous avez enregistrées seront perdues.",
|
||||
"integrations": "Intégrations",
|
||||
"apps": "Applications",
|
||||
"apps_listing": "Liste des applications",
|
||||
"category_apps": "Applications {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Connecter les personnes, la technologie et l'espace de travail.",
|
||||
@@ -736,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "Activer/désactiver les calendriers pour lesquels vous souhaiter vérifier les conflits afin d'éviter les doubles réservations.",
|
||||
"select_destination_calendar": "Créer des événements le",
|
||||
"connect_additional_calendar": "Connecter un calendrier supplémentaire",
|
||||
"calendar_updated_successfully": "Calendrier mis à jour avec succès",
|
||||
"conferencing": "Conférence",
|
||||
"calendar": "Calendrier",
|
||||
"payments": "Paiements",
|
||||
@@ -768,6 +782,7 @@
|
||||
"trending_apps": "Applications populaires",
|
||||
"explore_apps": "{{category}} applications",
|
||||
"installed_apps": "Applications installées",
|
||||
"free_to_use_apps": "Gratuit",
|
||||
"no_category_apps": "Aucune application {{category}}",
|
||||
"no_category_apps_description_calendar": "Ajouter une application de calendrier pour vérifier les conflits et éviter les doubles réservations",
|
||||
"no_category_apps_description_conferencing": "Essayez d'ajouter une application de conférence pour interconnecter les appels vidéo avec vos clients",
|
||||
@@ -806,6 +821,8 @@
|
||||
"verify_wallet": "Vérifier le portefeuille",
|
||||
"connect_metamask": "Connecter Metamask",
|
||||
"create_events_on": "Créer des événements le :",
|
||||
"enterprise_license": "Il s'agit d'une fonctionnalité d'entreprise",
|
||||
"enterprise_license_description": "Pour activer cette fonctionnalité, obtenez une clé de déploiement sur la console {{consoleUrl}} et ajoutez-la à votre .env en tant que CALCOM_LICENSE_KEY. Si votre équipe a déjà une licence, veuillez contacter {{supportMail}} pour obtenir de l'aide.",
|
||||
"missing_license": "Licence manquante",
|
||||
"signup_requires": "Licence commerciale requise",
|
||||
"signup_requires_description": "{{companyName}} ne propose pas actuellement de version open source gratuite de la page d'inscription. Pour obtenir un accès complet aux composants d'inscription, vous devez acquérir une licence commerciale. Pour une utilisation personnelle, nous recommandons la Plateforme de Données Prisma ou toute autre interface Postgres pour créer des comptes.",
|
||||
@@ -897,6 +914,7 @@
|
||||
"user_impersonation_heading": "Connexion en tant qu'autre utilisateur",
|
||||
"user_impersonation_description": "Permet à notre équipe d'assistance de se connecter temporairement lorsque vous nous aidez à résoudre rapidement tous les problèmes que vous nous signalez.",
|
||||
"team_impersonation_description": "Permet aux administrateurs de votre équipe de se connecter temporairement en tant que vous-même.",
|
||||
"allow_booker_to_select_duration": "Autoriser l'organisateur à sélectionner la durée",
|
||||
"impersonate_user_tip": "Toutes les utilisations de cette fonctionnalité sont vérifiées.",
|
||||
"impersonating_user_warning": "Identification du nom d'utilisateur \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>Cliquez ici pour arrêter</0>.",
|
||||
@@ -1014,6 +1032,9 @@
|
||||
"error_removing_app": "Erreur lors de la suppression de l'application",
|
||||
"web_conference": "Conférence en ligne",
|
||||
"requires_confirmation": "Nécessite une confirmation",
|
||||
"always_requires_confirmation": "Toujours",
|
||||
"requires_confirmation_threshold": "Nécessite une confirmation si réservé avec un préavis de < {{time}} $t({{unit}}_timeUnit)",
|
||||
"may_require_confirmation": "Peut nécessiter une confirmation",
|
||||
"nr_event_type_one": "{{count}} type d'événement",
|
||||
"nr_event_type_other": "{{count}} types d'événements",
|
||||
"add_action": "Ajouter une action",
|
||||
@@ -1101,6 +1122,9 @@
|
||||
"event_limit_tab_description": "Fréquence de réservation",
|
||||
"event_advanced_tab_description": "Paramètres du calendrier & plus...",
|
||||
"event_advanced_tab_title": "Avancé",
|
||||
"event_setup_multiple_duration_error": "Configuration de l'événement : plusieurs durées requièrent au moins une option.",
|
||||
"event_setup_multiple_duration_default_error": "Configuration de l'événement: veuillez sélectionner une durée par défaut valide.",
|
||||
"event_setup_booking_limits_error": "Les limites de réservation doivent être en ordre croissant. [jour,semaine,mois,année]",
|
||||
"select_which_cal": "Sélectionnez le calendrier auquel ajouter des réservations",
|
||||
"custom_event_name": "Nom de l'événement personnalisé",
|
||||
"custom_event_name_description": "Créer des noms d'événements personnalisés à afficher sur l'événement du calendrier",
|
||||
@@ -1154,8 +1178,11 @@
|
||||
"invoices": "Factures",
|
||||
"embeds": "Intègre",
|
||||
"impersonation": "Identification",
|
||||
"impersonation_description": "Paramètres de gestion de l'identité de l'utilisateur",
|
||||
"users": "Utilisateurs",
|
||||
"profile_description": "Gérer les paramètres de votre profil {{appName}}",
|
||||
"users_description": "Vous trouverez ici une liste de tous les utilisateurs",
|
||||
"users_listing": "Liste des utilisateurs",
|
||||
"general_description": "Gérer les paramètres pour votre langue et votre fuseau horaire",
|
||||
"calendars_description": "Configurez la manière dont vos types d'événements interagissent avec vos calendriers",
|
||||
"appearance_description": "Gérer les paramètres pour votre apparence de réservation",
|
||||
@@ -1228,8 +1255,8 @@
|
||||
"exchange_authentication_ntlm": "Authentification NTLM",
|
||||
"exchange_compression": "Compression GZip",
|
||||
"routing_forms_description": "Vous pouvez voir tous les formulaires et tous les parcours que vous avez créés ici.",
|
||||
"routing_forms_send_email_owner": "Envoyer un e-mail au responsable",
|
||||
"routing_forms_send_email_owner_description": "Envoie un e-mail au responsable lorsque le formulaire est soumis",
|
||||
"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 envoyé",
|
||||
"add_new_form": "Ajouter un nouveau formulaire",
|
||||
"form_description": "Créez votre formulaire pour acheminer un organisateur",
|
||||
"copy_link_to_form": "Copier le lien vers le formulaire",
|
||||
@@ -1296,7 +1323,7 @@
|
||||
"fetching_calendars_error": "Un problème est survenu lors de la récupération de vos calendriers. Veuillez <1>réessayer</1> ou contacter le service client.",
|
||||
"calendar_connection_fail": "Échec de la connexion au calendrier",
|
||||
"booking_confirmation_success": "Confirmation de réservation réussie",
|
||||
"booking_rejection_success": "Rejet de réservation réussi",
|
||||
"booking_rejection_success": "Refus de réservation réussi",
|
||||
"booking_confirmation_fail": "Échec de la confirmation de la réservation",
|
||||
"we_wont_show_again": "Nous n'afficherons plus ceci",
|
||||
"couldnt_update_timezone": "Nous n'avons pas pu mettre à jour le fuseau horaire",
|
||||
@@ -1346,21 +1373,22 @@
|
||||
"monthly": "Mensuellement",
|
||||
"yearly": "Annuellement",
|
||||
"checkout": "Paiement",
|
||||
"your_team_disbanded_successfully": "Votre équipe a été dissoute avec succès",
|
||||
"your_team_disbanded_successfully": "Votre équipe a bien été dissoute",
|
||||
"error_creating_team": "Erreur lors de la création de l'équipe",
|
||||
"you": "Vous",
|
||||
"send_email": "Envoyer un e-mail",
|
||||
"member_already_invited": "Le membre a déjà été invité",
|
||||
"enter_email_or_username": "Saisissez une adresse e-mail ou un nom d'utilisateur",
|
||||
"team_name_taken": "Ce nom est déjà pris",
|
||||
"must_enter_team_name": "Vous devez entrer un nom d'équipe",
|
||||
"team_url_required": "Vous devez entrer une URL d'équipe",
|
||||
"must_enter_team_name": "Vous devez saisir un nom d'équipe",
|
||||
"team_url_required": "Vous devez saisir une URL d'équipe",
|
||||
"team_url_taken": "Cette URL est déjà prise",
|
||||
"team_publish": "Publier l'équipe",
|
||||
"number_sms_notifications": "Numéro de téléphone (notifications SMS)",
|
||||
"attendee_email_workflow": "E-mail du participant",
|
||||
"attendee_email_info": "E-mail de la personne ayant réservé",
|
||||
"invalid_credential": "Oh non ! Il semble que l’autorisation ait expiré ou a été révoquée. Veuillez la réinstaller.",
|
||||
"kbar_search_placeholder": "Saisissez une commande ou une recherche...",
|
||||
"invalid_credential": "Oh non ! L'autorisation semble avoir expiré ou avoir été révoquée. Veuillez la réinstaller.",
|
||||
"choose_common_schedule_team_event": "Choisissez un horaire commun",
|
||||
"choose_common_schedule_team_event_description": "Activez cette option si vous souhaitez utiliser un horaire commun entre les hôtes. Si désactivée, chaque hôte sera réservé en fonction de son planning par défaut.",
|
||||
"reason": "Raison",
|
||||
@@ -1370,5 +1398,44 @@
|
||||
"test_preview": "Tester l'aperçu",
|
||||
"route_to": "Router vers",
|
||||
"test_preview_description": "Tester votre formulaire de routage sans envoyer de données",
|
||||
"test_routing": "Tester le routage"
|
||||
"test_routing": "Tester le routage",
|
||||
"payment_app_disabled": "Un administrateur a désactivé une application de paiement",
|
||||
"edit_event_type": "Modifier le type d'événement",
|
||||
"collective_scheduling": "Programmation collective",
|
||||
"make_it_easy_to_book": "Il est facile de réserver votre équipe quand tout le monde sera disponible.",
|
||||
"find_the_best_person": "Trouvez la meilleure personne disponible et passez en revue votre équipe.",
|
||||
"fixed_round_robin": "Round robin établi",
|
||||
"add_one_fixed_attendee": "Ajoutez un participant fixe et un round robin via un certain nombre de participants.",
|
||||
"calcom_is_better_with_team": "Cal.com est meilleur avec des équipes",
|
||||
"add_your_team_members": "Ajoutez les membres de votre équipe à vos types d'événements. Utilisez la planification collective pour inclure tout le monde ou trouvez la personne la plus appropriée avec la planification de round robin.",
|
||||
"booking_limit_reached": "La limite de réservation pour ce type d'événement a été atteinte",
|
||||
"admin_has_disabled": "Un administrateur a désactivé {{appName}}",
|
||||
"disabled_app_affects_event_type": "Un administrateur a désactivé {{appName}} qui affecte votre type d'événement {{eventType}}",
|
||||
"disable_payment_app": "L'administrateur a désactivé {{appName}} qui affecte votre type d'événement {{title}}. Les participants sont toujours en mesure de réserver ce type d'événement, mais ne seront pas invités à payer. Vous pouvez masquer le type d'événement pour l'empêcher jusqu'à ce que votre administrateur réactive votre moyen de paiement.",
|
||||
"payment_disabled_still_able_to_book": "Les participants sont toujours en mesure de réserver ce type d'événement, mais ne seront pas invités à payer. Vous pouvez masquer le type d'événement pour l'empêcher jusqu'à ce que votre administrateur réactive votre mode de paiement.",
|
||||
"app_disabled_with_event_type": "L'administrateur a désactivé {{appName}} qui affecte votre type d'événement {{title}}.",
|
||||
"app_disabled_video": "L'administrateur a désactivé {{appName}}, ce qui peut affecter vos types d'événements. Si vous avez des types d'événements avec {{appName}} comme emplacement, Cal Video sera alors utilisé par défaut.",
|
||||
"app_disabled_subject": "{{appName}} a été désactivé",
|
||||
"navigate_installed_apps": "Accéder aux applications installées",
|
||||
"disabled_calendar": "Si un autre calendrier est installé, de nouvelles réservations y seront ajoutées. Si ce n'est pas le cas, connectez un nouveau calendrier pour ne pas manquer de nouvelles réservations.",
|
||||
"enable_apps": "Activer les applications",
|
||||
"enable_apps_description": "Activer les applications que les utilisateurs peuvent intégrer à Cal.com",
|
||||
"app_is_enabled": "{{appName}} est activé",
|
||||
"app_is_disabled": "{{appName}} est désactivé",
|
||||
"keys_have_been_saved": "Les clés ont été enregistrées",
|
||||
"disable_app": "Désactiver l'application",
|
||||
"disable_app_description": "Désactiver cette application peut causer des problèmes avec la façon dont vos utilisateurs interagissent avec Cal",
|
||||
"edit_keys": "Modifier les clés",
|
||||
"admin_apps_description": "Activer les applications pour votre instance de Cal",
|
||||
"no_available_apps": "Il n'y a aucune application disponible",
|
||||
"no_available_apps_description": "Veuillez vous assurer qu'il y a des applications dans votre déploiement sous 'packages/app-store'",
|
||||
"no_apps": "Aucune application n'est activée dans cette instance de Cal",
|
||||
"apps_settings": "Paramètres des applications",
|
||||
"fill_this_field": "Veuillez remplir ce champ",
|
||||
"options": "Options",
|
||||
"enter_option": "Entrer l'option {{index}}",
|
||||
"add_an_option": "Ajouter une option",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-copie",
|
||||
"set_as_default": "Définir par défaut"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "אירוע עדיין ממתין לאישור",
|
||||
"event_is_still_waiting": "בקשת האירוע עדיין בהמתנה: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "אין יותר תוצאות",
|
||||
"no_results": "אין תוצאות",
|
||||
"load_more_results": "לטעון תוצאות נוספות",
|
||||
"integration_meeting_id": "{{integrationName}} מזהה פגישה: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "אושר: {{eventType}} עם {{name}} בתאריך {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "הוספה ללוח השנה",
|
||||
"add_another_calendar": "להוסיף לוח שנה אחר",
|
||||
"other": "אחר",
|
||||
"email_sign_in_subject": "קישור הכניסה שלך אל {{appName}}",
|
||||
"emailed_you_and_attendees": "שלחנו לך ולמשתתפים האחרים הודעת דוא\"ל עם הזמנה בלוח השנה הכוללת את כל הפרטים.",
|
||||
"emailed_you_and_attendees_recurring": "שלחנו לך ולמשתתפים האחרים הודעת דוא\"ל עם הזמנה בלוח השנה לאירוע הראשון מבין האירועים החוזרים האלה.",
|
||||
"emailed_you_and_any_other_attendees": "שלחנו לך ולמשתתפים האחרים, אם ישנם כאלה, הודעת דוא\"ל עם הפרטים האלה.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "הסיסמה הנוכחית שגויה",
|
||||
"password_hint_caplow": "שילוב של אותיות רישיות וקטנות",
|
||||
"password_hint_min": "באורך 8 תווים לפחות",
|
||||
"password_hint_admin_min": "באורך של 15 תווים לפחות",
|
||||
"password_hint_num": "לכלול לפחות ספרה אחת",
|
||||
"invalid_password_hint": "הסיסמה חייבת להיות באורך של 7 תווים לפחות ולכלול לפחות ספרה אחת ושילוב של אותיות רישיות וקטנות",
|
||||
"incorrect_password": "הסיסמה שגויה.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "אשר את ה{{eventTypeTitle}} עם {{profileName}}",
|
||||
"booking_reschedule_confirmation": "שנה את המועד של ה{{eventTypeTitle}} עם {{profileName}}",
|
||||
"in_person_meeting": "פגישה אישית",
|
||||
"attendeeInPerson": "פנים-אל-פנים (הכתובת של המשתתף/ת)",
|
||||
"inPerson": "פנים-אל-פנים (הכתובת של המארגן/ת)",
|
||||
"link_meeting": "פגישה עם קישור",
|
||||
"phone_call": "מספר הטלפון של המשתתף/ת",
|
||||
"your_number": "מספר הטלפון שלך",
|
||||
"phone_number": "מספר טלפון",
|
||||
"attendee_phone_number": "מספר הטלפון של המשתתף/ת",
|
||||
"organizer_phone_number": "מספר הטלפון של המארגן/ת",
|
||||
"host_phone_number": "מספר הטלפון שלך",
|
||||
"enter_phone_number": "נא להזין מספר טלפון",
|
||||
"reschedule": "שינוי המועד שנקבע",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "קבוצתי",
|
||||
"collective_description": "קבע מועדים לפגישות כאשר כל חברי הצוות שנבחרו זמינים.",
|
||||
"duration": "משך זמן",
|
||||
"available_durations": "משכי זמן זמינים",
|
||||
"default_duration": "משך הזמן המוגדר כברירת מחדל",
|
||||
"default_duration_no_options": "יש לבחור תחילה משכי זמן זמינים",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "דקות",
|
||||
"round_robin": "לפי תורות",
|
||||
"round_robin_description": "פגישות מחזוריות בין חברי צוות מרובים.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "צוותים",
|
||||
"team": "צוות",
|
||||
"team_billing": "חיוב צוותים",
|
||||
"team_billing_description": "ניהול החיוב עבור הצוות",
|
||||
"upgrade_to_flexible_pro_title": "שינינו את החיוב בעבור צוותים",
|
||||
"upgrade_to_flexible_pro_message": "יש בצוות שלך חברים שאין להם מקום. שדרג לחבילת Pro לדאוג למקומות החסרים.",
|
||||
"changed_team_billing_info": "החל מינואר 2022, התחלנו לגבות תשלום עבור כל חבר צוות שמשתתף בפגישה. חברי צוות שעבדו עם גרסת PRO בחינם, הועברו לגרסת ניסיון למשך 14 יום. ברגע שהתוקף של גרסת הניסיון יסתיים, חברי צוות אלה יוסתרו מהצוות, אלא אם תשדרג כעת.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "הסתר את סוג האירוע",
|
||||
"edit_location": "ערוך מיקום",
|
||||
"into_the_future": "בעתיד",
|
||||
"when_booked_with_less_than_notice": "כאשר ההזמנה היא פחות מ-<time></time> מראש",
|
||||
"within_date_range": "בתוך טווח תאריכים",
|
||||
"indefinitely_into_future": "בעתיד, במועד לא ידוע",
|
||||
"add_new_custom_input_field": "הוספת שדה קלט מותאם אישית חדש",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "בטוח שברצונך למחוק את חשבון {{appName}} שלך? כל מי ששיתפת איתו את הקישור לחשבון לא יוכל יותר להזמין באמצעותו, וכל ההעדפות ששמרת יאבדו.",
|
||||
"integrations": "שילובים",
|
||||
"apps": "אפליקציות",
|
||||
"apps_listing": "פירוט האפליקציות",
|
||||
"category_apps": "אפליקציות בקטגוריה {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "מקשרים בין אנשים, טכנולוגיה ומקום העבודה.",
|
||||
@@ -736,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "סמן/י את לוחות השנה שבהם ברצונך לבדוק אם יש התנגשויות כדי למנוע כפל הזמנות.",
|
||||
"select_destination_calendar": "יצירת אירועים ב",
|
||||
"connect_additional_calendar": "חיבור לוח שנה נוסף",
|
||||
"calendar_updated_successfully": "עדכון לוח השנה בוצע בהצלחה",
|
||||
"conferencing": "שיחות ועידה",
|
||||
"calendar": "לוח שנה",
|
||||
"payments": "תשלומים",
|
||||
@@ -768,6 +782,7 @@
|
||||
"trending_apps": "אפליקציות פופולריות",
|
||||
"explore_apps": "אפליקציות בקטגוריה {{category}}",
|
||||
"installed_apps": "אפליקציות מותקנות",
|
||||
"free_to_use_apps": "חינם",
|
||||
"no_category_apps": "אין אפליקציות בקטגוריה {{category}}",
|
||||
"no_category_apps_description_calendar": "הוסף/י אפליקציית לוח שנה כדי לבדוק אם יש התנגשויות על מנת למנוע כפל הזמנות",
|
||||
"no_category_apps_description_conferencing": "נסה/י להוסיף אפליקציית שיחות ועידה כדי לשלב שיחות וידאו עם הלקוחות",
|
||||
@@ -806,6 +821,8 @@
|
||||
"verify_wallet": "אימות הארנק",
|
||||
"connect_metamask": "קישור Metamask",
|
||||
"create_events_on": "ליצור אירועים ב-",
|
||||
"enterprise_license": "תכונה זו זמינה רק במינוי ארגוני",
|
||||
"enterprise_license_description": "כדי להפעיל תכונה זו, עליך לקבל מפתח פריסה בכתובת {{consoleUrl}} ולהוסיף אותו לסביבת .env שלך בתור CALCOM_LICENSE_KEY. אם כבר יש לצוות שלך רישיון, ניתן לפנות אל {{supportMail}} לקבלת עזרה.",
|
||||
"missing_license": "חסר רישיון",
|
||||
"signup_requires": "נדרש רישיון לשימוש מסחרי",
|
||||
"signup_requires_description": "בשלב זה, {{companyName}} אינה מציעה גרסת קוד פתוח חינמית של דף ההרשמה. לקבלת גישה מלאה לרכיבי ההרשמה, תצטרך לקנות רישיון לשימוש מסחרי. ליציר חשבונות המיועדים לשימוש אישי, אנחנו ממליצים על Prisma Data Platform או על כל ממשק אחר של Postgres ליצירת חשבונות.",
|
||||
@@ -897,6 +914,7 @@
|
||||
"user_impersonation_heading": "התחזות למשתמשים",
|
||||
"user_impersonation_description": "מצב זה מאפשר לצוות התמיכה שלנו להתחבר באופן זמני לחשבונך כדי שנוכל לפתור במהירות את הבעיות שתדווח/י לנו עליהם.",
|
||||
"team_impersonation_description": "מאפשר למנהלי הצוות להיכנס זמנית בשמך.",
|
||||
"allow_booker_to_select_duration": "אפשר/י למזמין/ה לבחור משך זמן",
|
||||
"impersonate_user_tip": "כל השימושים בתכונה זו נבדקים.",
|
||||
"impersonating_user_warning": "בהתחזות לשם המשתמש \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>לחץ כאן כדי להפסיק</0>.",
|
||||
@@ -1014,6 +1032,9 @@
|
||||
"error_removing_app": "שגיאה בהסרת האפליקציה",
|
||||
"web_conference": "שיחת ועידה מקוונת",
|
||||
"requires_confirmation": "נדרש אישור",
|
||||
"always_requires_confirmation": "תמיד",
|
||||
"requires_confirmation_threshold": "מחייב אישור אם ההזמנה בוצעה פחות מ-{{time}} $t({{unit}}_timeUnit) מראש",
|
||||
"may_require_confirmation": "עשוי לחייב אישור",
|
||||
"nr_event_type_one": "סוג אירוע {{count}}",
|
||||
"nr_event_type_other": "{{count}} סוגי אירועים",
|
||||
"add_action": "הוספת פעולה",
|
||||
@@ -1101,6 +1122,9 @@
|
||||
"event_limit_tab_description": "באיזו תדירות ניתן להזמין אותך",
|
||||
"event_advanced_tab_description": "הגדרות לוח שנה ועוד...",
|
||||
"event_advanced_tab_title": "מתקדם",
|
||||
"event_setup_multiple_duration_error": "הגדרת אירוע: משכי זמן מרובים מחייבים הגדרה של אפשרות אחת לפחות.",
|
||||
"event_setup_multiple_duration_default_error": "הגדרת אירוע: יש לבחור משך זמן חוקי המוגדר כברירת מחדל.",
|
||||
"event_setup_booking_limits_error": "הגבלות על הזמנות חייבות להיות מוגדרות בסדר עולה. [יום,שבוע,חודש,שנה]",
|
||||
"select_which_cal": "בחר/י את לוח השנה שאליו יש להוסיף הזמנות",
|
||||
"custom_event_name": "שם אירוע מותאם אישית",
|
||||
"custom_event_name_description": "ניתן ליצור שמות אירועים בהתאמה אישית שיוצגו באירוע בלוח השנה",
|
||||
@@ -1154,8 +1178,11 @@
|
||||
"invoices": "חשבוניות",
|
||||
"embeds": "הטמעות",
|
||||
"impersonation": "התחזות",
|
||||
"impersonation_description": "הגדרות לניהול התחזות למשתמשים",
|
||||
"users": "משתמשים",
|
||||
"profile_description": "ניהול הגדרות עבור פרופיל {{appName}} שלך",
|
||||
"users_description": "כאן אפשר למצוא רשימה של כל המשתמשים",
|
||||
"users_listing": "רישום משתמש",
|
||||
"general_description": "ניהול הגדרות השפה ואזור הזמן",
|
||||
"calendars_description": "הגדרת האינטראקציה בין סוגי האירועים שלך לבין לוחות השנה שלך",
|
||||
"appearance_description": "ניהול ההגדרות של מראה ההזמנות שלך",
|
||||
@@ -1360,6 +1387,7 @@
|
||||
"number_sms_notifications": "מספר טלפון (הודעות SMS)",
|
||||
"attendee_email_workflow": "כתובת הדוא\"ל של המשתתף/ת",
|
||||
"attendee_email_info": "כתובת הדוא\"ל של האדם שביצע את ההזמנה",
|
||||
"kbar_search_placeholder": "הקלד/י פקודה או חפש/י...",
|
||||
"invalid_credential": "נראה שתוקף ההרשאה פג או שההרשאה בוטלה. יש להתקין מחדש שוב.",
|
||||
"choose_common_schedule_team_event": "בחירת לוח זמנים משותף",
|
||||
"choose_common_schedule_team_event_description": "יש להפעיל אפשרות זו אם רוצים להשתמש בלוח זמנים משותף בין המארחים. אם האפשרות הזו מבוטלת, כל מארח יוזמן לפי לוח הזמנים המשמש כברירת המחדל שלו.",
|
||||
@@ -1370,5 +1398,43 @@
|
||||
"test_preview": "בדיקת התצוגה המקדימה",
|
||||
"route_to": "ניתוב אל",
|
||||
"test_preview_description": "לבדוק את טופס הניתוב שלך בלי לשלוח נתונים",
|
||||
"test_routing": "בדיקת ניתוב"
|
||||
"test_routing": "בדיקת ניתוב",
|
||||
"payment_app_disabled": "מנהל/ת מערכת השבית/ה אפליקציית תשלומים",
|
||||
"edit_event_type": "עריכת סוג האירוע",
|
||||
"collective_scheduling": "תזמון שיתופי",
|
||||
"make_it_easy_to_book": "לקבוע בקלות פגישה עם חברי הצוות במועד שמתאים לכולם.",
|
||||
"find_the_best_person": "למצוא את האדם הכי מתאים שגם זמין לפגישה, ולעבור בסבב דרך כל חברי הצוות.",
|
||||
"fixed_round_robin": "בוצע תיקון של הסבב",
|
||||
"add_one_fixed_attendee": "הוסף/י משתתף/ת קבוע/ה אחד/ת ועבור/י בסבב בין מספר משתתפים.",
|
||||
"calcom_is_better_with_team": "Cal.com טוב יותר לשימוש עם צוותים",
|
||||
"add_your_team_members": "הוסף/י את חברי הצוות לסוגי האירועים שלך. השתמש/י בתזמון שיתופי כדי לכלול את כולם או מצא/י את האדם הכי מתאים בעזרת תזמון בסבב.",
|
||||
"booking_limit_reached": "הגעת להגבלת ההזמנות עבור סוג אירוע זה",
|
||||
"admin_has_disabled": "מנהל/ת מערכת השבית/ה את {{appName}}",
|
||||
"disabled_app_affects_event_type": "מנהל/ת מערכת השבית/ה את {{appName}}, ויש לכך השפעה על האירוע שלך מסוג {{eventType}}",
|
||||
"disable_payment_app": "מנהל/ת המערכת השבית/ה את {{appName}}, ויש לכך השפעה על סוג האירוע שלך בשם {{title}}. המשתתפים עדיין יוכלו להזמין אירוע מסוג זה, אבל לא תוצג להם בקשה לשלם. ניתן להסתיר את סוג האירוע הזה על מנת למנוע מצב זה עד שמנהל/ת המערכת יפעיל/תפעיל שוב את שיטת התשלום.",
|
||||
"payment_disabled_still_able_to_book": "המשתתפים עדיין יוכלו להזמין אירוע מסוג זה, אבל לא תוצג להם בקשה לשלם. ניתן להסתיר את סוג האירוע הזה על מנת למנוע מצב זה עד שמנהל/ת המערכת יפעיל/תפעיל שוב את שיטת התשלום.",
|
||||
"app_disabled_with_event_type": "מנהל/ת המערכת השבית/ה את {{appName}}, ויש לכך השפעה על האירוע שלך מסוג {{title}}.",
|
||||
"app_disabled_video": "מנהל/ת המערכת השבית/ה את {{appName}}, ועשויה להיות לכך השפעה על סוגי האירועים שלך. אם יש לך סוגי אירועים שבהם המיקום הוא {{appName}}, ייעשה שימוש בברירת המחדל, Cal Video.",
|
||||
"app_disabled_subject": "האפליקציה {{appName}} הושבתה",
|
||||
"navigate_installed_apps": "עבור/י אל האפליקציות המותקנות",
|
||||
"disabled_calendar": "אם הגדרת לוח שנה אחר, הזמנות חדשות יתווספו אליו. אם לא, קשר/י לוח שנה חדש כדי לא להחמיץ הזמנות חדשות.",
|
||||
"enable_apps": "הפעלת אפליקציות",
|
||||
"enable_apps_description": "הפעל/י אפליקציות שמשתמשים יכולים לשלב עם Cal.com",
|
||||
"app_is_enabled": "האפליקציה {{appName}} מופעלת",
|
||||
"app_is_disabled": "האפליקציה {{appName}} מושבתת",
|
||||
"keys_have_been_saved": "המפתחות נשמרו",
|
||||
"disable_app": "השבתת האפליקציה",
|
||||
"disable_app_description": "השבתת האפליקציה הזו עלולה לגרום בעיות באופן שבו המשתמשים שלך יהיו באינטראקציה עם Cal",
|
||||
"edit_keys": "עריכת מפתחות",
|
||||
"no_available_apps": "אין אפליקציות זמינות",
|
||||
"no_available_apps_description": "ודא/י שיש אפליקציות בפריסה שלך בנתיב 'packages/app-store'",
|
||||
"no_apps": "אף אפליקציה לא מופעלת במופע הזה של Cal",
|
||||
"apps_settings": "הגדרות אפליקציות",
|
||||
"fill_this_field": "יש להזין מידע בשדה הזה",
|
||||
"options": "אפשרויות",
|
||||
"enter_option": "הזנת ה-{{index}} של האפשרות",
|
||||
"add_an_option": "הוספת אפשרות",
|
||||
"radio": "לחצן אפשרויות",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-copy",
|
||||
"set_as_default": "הגדר/י כברירת מחדל"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Un evento è ancora in attesa di approvazione",
|
||||
"event_is_still_waiting": "La richiesta d'evento è ancora in attesa: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Nessun altro risultato",
|
||||
"no_results": "Nessun risultato",
|
||||
"load_more_results": "Carica più risultati",
|
||||
"integration_meeting_id": "{{integrationName}} meeting ID: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Confermato: {{eventType}} con {{name}} il {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Aggiungi al calendario",
|
||||
"add_another_calendar": "Aggiungi un altro calendario",
|
||||
"other": "Altro",
|
||||
"email_sign_in_subject": "Link di accesso a {{appName}}",
|
||||
"emailed_you_and_attendees": "Abbiamo inviato via email a te e agli altri partecipanti un invito al calendario con tutti i dettagli.",
|
||||
"emailed_you_and_attendees_recurring": "Abbiamo inviato via email a te e agli altri partecipanti un invito al primo di questi eventi ricorrenti.",
|
||||
"emailed_you_and_any_other_attendees": "Tu e tutti gli altri partecipanti siete stati inviati via email con queste informazioni.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "La password attuale non è corretta",
|
||||
"password_hint_caplow": "Combinazione di caratteri maiuscoli e minuscoli",
|
||||
"password_hint_min": "La lunghezza minima è di 8 caratteri",
|
||||
"password_hint_admin_min": "La lunghezza minima è di 15 caratteri",
|
||||
"password_hint_num": "Deve contenere almeno 1 numero",
|
||||
"invalid_password_hint": "La password deve avere una lunghezza minima di 7 caratteri e deve contenere almeno 1 numero e una combinazione di caratteri maiuscoli e minuscoli",
|
||||
"incorrect_password": "La password non è corretta.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Conferma il tuo {{eventTypeTitle}} con {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Riprogramma il tuo {{eventTypeTitle}} con {{profileName}}",
|
||||
"in_person_meeting": "Link o riunione di persona",
|
||||
"attendeeInPerson": "Di persona (indirizzo del partecipante)",
|
||||
"inPerson": "Di persona (indirizzo dell'organizzatore)",
|
||||
"link_meeting": "Collegamento riunione",
|
||||
"phone_call": "Numero di telefono del partecipante",
|
||||
"your_number": "Il tuo numero di telefono",
|
||||
"phone_number": "Numero Di Telefono",
|
||||
"attendee_phone_number": "Numero di telefono del partecipante",
|
||||
"organizer_phone_number": "Numero di telefono organizzatore",
|
||||
"host_phone_number": "Il tuo numero di telefono",
|
||||
"enter_phone_number": "Inserisci numero di telefono",
|
||||
"reschedule": "Riprogramma",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Collettivo",
|
||||
"collective_description": "Pianifica le riunioni quando tutti i membri del team selezionati sono disponibili.",
|
||||
"duration": "Durata",
|
||||
"available_durations": "Durate disponibili",
|
||||
"default_duration": "Durata predefinita",
|
||||
"default_duration_no_options": "Scegliere prima delle durate disponibili",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minuti",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Ciclo di riunioni tra più membri del team.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Team",
|
||||
"team": "Team",
|
||||
"team_billing": "Fatturazione team",
|
||||
"team_billing_description": "Gestisci la fatturazione per il tuo team",
|
||||
"upgrade_to_flexible_pro_title": "Abbiamo cambiato la fatturazione per i team",
|
||||
"upgrade_to_flexible_pro_message": "Alcuni membri del tuo team non hanno un posto. Aggiorna il tuo piano Pro per coprire i posti mancanti.",
|
||||
"changed_team_billing_info": "A partire da gennaio 2022, applichiamo una tariffazione in base ai posti per i membri dei team. I membri del tuo team che utilizzavano Pro gratuitamente dispongono ora di un periodo di prova di 14 giorni. Terminata la prova, questi membri saranno nascosti dal tuo team, se non aggiornerai il piano.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Nascondi tipo evento",
|
||||
"edit_location": "Aggiungi un luogo",
|
||||
"into_the_future": "nel futuro",
|
||||
"when_booked_with_less_than_notice": "Quando si prenota con un avviso inferiore a <time></time>",
|
||||
"within_date_range": "All'interno di un intervallo di date",
|
||||
"indefinitely_into_future": "Indefinitamente nel futuro",
|
||||
"add_new_custom_input_field": "Aggiungi un nuovo campo di input personalizzato",
|
||||
@@ -713,6 +725,8 @@
|
||||
"delete_account_confirmation_message": "Sei sicuro di voler eliminare il tuo account {{appName}}? Chiunque abbia il link del tuo account non potrà più utilizzarlo per prenotare e le preferenze che hai salvato andranno perse.",
|
||||
"integrations": "Integrazioni",
|
||||
"apps": "App",
|
||||
"apps_description": "Abilita le app per la tua istanza di Cal",
|
||||
"apps_listing": "Elenco delle app",
|
||||
"category_apps": "App {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Collegare persone, tecnologia e luogo di lavoro.",
|
||||
@@ -736,6 +750,7 @@
|
||||
"toggle_calendars_conflict": "Attiva/disattiva i calendari in cui desideri controllare i conflitti per evitare doppie prenotazioni.",
|
||||
"select_destination_calendar": "Crea eventi su",
|
||||
"connect_additional_calendar": "Collega calendario aggiuntivo",
|
||||
"calendar_updated_successfully": "Calendario aggiornato correttamente",
|
||||
"conferencing": "Conferenze",
|
||||
"calendar": "Calendario",
|
||||
"payments": "Pagamenti",
|
||||
@@ -768,6 +783,7 @@
|
||||
"trending_apps": "App di tendenza",
|
||||
"explore_apps": "App {{category}}",
|
||||
"installed_apps": "App installate",
|
||||
"free_to_use_apps": "Gratuito",
|
||||
"no_category_apps": "Nessuna app {{category}}",
|
||||
"no_category_apps_description_calendar": "Aggiungi un'app di calendario per controllare i conflitti ed evitare doppie prenotazioni",
|
||||
"no_category_apps_description_conferencing": "Prova ad aggiungere un'app di conferenza per integrare le videochiamate con i clienti",
|
||||
@@ -806,6 +822,8 @@
|
||||
"verify_wallet": "Verifica Wallet",
|
||||
"connect_metamask": "Connetti Metamask",
|
||||
"create_events_on": "Crea eventi su:",
|
||||
"enterprise_license": "Questa è una funzione Enterprise",
|
||||
"enterprise_license_description": "Per abilitare questa funzione, ottenere una chiave di distribuzione presso la console {{consoleUrl}} e aggiungerla al proprio .env come CALCOM_LICENSE_KEY. Nel caso il team possieda già una licenza, contattare {{supportMail}} per assistenza.",
|
||||
"missing_license": "Licenza mancante",
|
||||
"signup_requires": "È necessaria una licenza commerciale",
|
||||
"signup_requires_description": "{{companyName}} attualmente non offre una versione open source gratuita della pagina di registrazione. Per avere accesso completo ai componenti di registrazione è necessario acquisire una licenza commerciale. Per un uso personale consigliamo Prisma Data Platform o qualsiasi altra interfaccia Postgres per creare account.",
|
||||
@@ -897,6 +915,7 @@
|
||||
"user_impersonation_heading": "Accesso con altra identità",
|
||||
"user_impersonation_description": "Consente al nostro team di supporto di effettuare l'accesso temporaneo a tuo nome per risolvere rapidamente gli eventuali problemi da te segnalati.",
|
||||
"team_impersonation_description": "Consente ai membri del tuo team di accedere temporaneamente con il tuo nome.",
|
||||
"allow_booker_to_select_duration": "Consenti alla persona che prenota di selezionare la durata",
|
||||
"impersonate_user_tip": "Ogni utilizzo di questa funzionalità viene controllato.",
|
||||
"impersonating_user_warning": "Accesso con l'identità dell'utente \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>Fai clic qui per interrompere</0>.",
|
||||
@@ -1014,6 +1033,9 @@
|
||||
"error_removing_app": "Errore durante la rimozione dell'app",
|
||||
"web_conference": "Conferenza Web",
|
||||
"requires_confirmation": "Richiede conferma",
|
||||
"always_requires_confirmation": "Sempre",
|
||||
"requires_confirmation_threshold": "Richiede conferma se si prenota con un avviso di < {{time}} $t({{unit}}_timeUnit)",
|
||||
"may_require_confirmation": "Può richiedere conferma",
|
||||
"nr_event_type_one": "{{count}} tipo di evento",
|
||||
"nr_event_type_other": "{{count}} tipi di evento",
|
||||
"add_action": "Aggiungi azione",
|
||||
@@ -1101,6 +1123,9 @@
|
||||
"event_limit_tab_description": "Con quale frequenza è possibile fare una prenotazione",
|
||||
"event_advanced_tab_description": "Impostazioni calendario e altro...",
|
||||
"event_advanced_tab_title": "Avanzate",
|
||||
"event_setup_multiple_duration_error": "Impostazione evento: In caso di più durate è richiesta almeno 1 opzione.",
|
||||
"event_setup_multiple_duration_default_error": "Impostazione evento: Selezionare una durata predefinita valida.",
|
||||
"event_setup_booking_limits_error": "I limiti per le prenotazioni devono essere specificati in ordine crescente [giorno,settimana,mese,anno]",
|
||||
"select_which_cal": "Seleziona il calendario al quale aggiungere prenotazioni",
|
||||
"custom_event_name": "Nome evento personalizzato",
|
||||
"custom_event_name_description": "Crea nomi di eventi personalizzati da visualizzare nell'evento del calendario",
|
||||
@@ -1154,8 +1179,11 @@
|
||||
"invoices": "Fatture",
|
||||
"embeds": "Integrazioni",
|
||||
"impersonation": "Accesso con altra identità",
|
||||
"impersonation_description": "Impostazioni per gestire gli accessi con altra identità",
|
||||
"users": "Utenti",
|
||||
"profile_description": "Gestisci le impostazioni del tuo profilo {{appName}}",
|
||||
"users_description": "Qui è possibile trovare l'elenco di tutti gli utenti",
|
||||
"users_listing": "Elenco degli utenti",
|
||||
"general_description": "Gestisci le impostazioni di lingua e fuso orario",
|
||||
"calendars_description": "Configura come i tipi di eventi devono interagire con i tuoi calendari",
|
||||
"appearance_description": "Gestisci le impostazioni di aspetto delle tue prenotazioni",
|
||||
@@ -1360,6 +1388,7 @@
|
||||
"number_sms_notifications": "Numero di telefono (notifiche SMS)",
|
||||
"attendee_email_workflow": "E-mail partecipante",
|
||||
"attendee_email_info": "E-mail della persona che prenota",
|
||||
"kbar_search_placeholder": "Digitare un comando o eseguire una ricerca...",
|
||||
"invalid_credential": "Errore! Sembra che l'autorizzazione sia scaduta o che sia stata revocata. Prova a reinstallare.",
|
||||
"choose_common_schedule_team_event": "Scegli un programma comune",
|
||||
"choose_common_schedule_team_event_description": "Abilita questa opzione se desideri utilizzare un programma comune per tutti gli organizzatori. Quando l'opzione è disabilitata, ciascun organizzatore verrà prenotato in base al proprio programma predefinito.",
|
||||
@@ -1370,5 +1399,45 @@
|
||||
"test_preview": "Test anteprima",
|
||||
"route_to": "Instrada a",
|
||||
"test_preview_description": "Esegui un test del modulo di instradamento senza inviare alcun dato",
|
||||
"test_routing": "Test instradamento"
|
||||
"test_routing": "Test instradamento",
|
||||
"payment_app_disabled": "Un amministratore ha disabilitato un'app di pagamento",
|
||||
"edit_event_type": "Modifica tipo di evento",
|
||||
"collective_scheduling": "Pianificazione collettiva",
|
||||
"make_it_easy_to_book": "Facilita la prenotazione del tuo team quando tutti sono disponibili.",
|
||||
"find_the_best_person": "Trova la persona più adatta disponibile e passa tra 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": "Cal.com funziona meglio in team",
|
||||
"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",
|
||||
"admin_has_disabled": "Un amministratore ha disabilitato {{appName}}",
|
||||
"disabled_app_affects_event_type": "Un amministratore ha disabilitato {{appName}}, il che influenza il tuo tipo di evento {{eventType}}",
|
||||
"disable_payment_app": "L'amministratore ha disabilitato {{appName}}, il che influenza il tuo tipo di evento {{title}}. I partecipanti sono ancora in grado di prenotare questo tipo di evento, ma non gli verrà richiesto di pagare. Per evitarlo, è possibile nascondere questo tipo di evento fino a che l'amministratore non riattivi il tuo metodo di pagamento.",
|
||||
"payment_disabled_still_able_to_book": "I partecipanti sono ancora in grado di prenotare questo tipo di evento, ma non gli verrà richiesto di pagare. Per evitarlo, è possibile nascondere questo tipo di evento fino a che l'amministratore non riattivi il tuo metodo di pagamento.",
|
||||
"app_disabled_with_event_type": "L'amministratore ha disabilitato {{appName}}, il che influenza il tuo tipo di evento {{title}}.",
|
||||
"app_disabled_video": "L'amministratore ha disabilitato {{appName}}, il che potrebbe influenzare i tuoi tipi di eventi. Se hai dei tipi di eventi che utilizzano {{appName}} come luogo, allora verrà usato Cal Video come luogo predefinito.",
|
||||
"app_disabled_subject": "{{appName}} è stato disabilitato",
|
||||
"navigate_installed_apps": "Vai alle app installate",
|
||||
"disabled_calendar": "Se si dispone di un altro calendario installato, le nuove prenotazioni saranno aggiunte a quel calendario. Se così non fosse, connettere 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 Cal.com",
|
||||
"app_is_enabled": "{{appName}} è abilitato",
|
||||
"app_is_disabled": "{{appName}} è disabilitato",
|
||||
"keys_have_been_saved": "Le chiavi sono state salvate",
|
||||
"disable_app": "Disabilita app",
|
||||
"disable_app_description": "La disattivazione di questa app potrebbe causare problemi con il modo in cui i tuoi utenti interagiscono con Cal",
|
||||
"edit_keys": "Modifica chiavi",
|
||||
"admin_apps_description": "Abilita le app per la tua istanza di Cal",
|
||||
"no_available_apps": "Nessuna app disponibile",
|
||||
"no_available_apps_description": "Assicurarsi che ci siano delle applicazioni nella propria distribuzione in 'packages/app-store'",
|
||||
"no_apps": "Non ci sono applicazioni abilitate in questa istanza di Cal",
|
||||
"apps_settings": "Impostazioni delle app",
|
||||
"fill_this_field": "Compilare il campo",
|
||||
"options": "Opzioni",
|
||||
"enter_option": "Immetti opzione {{index}}",
|
||||
"add_an_option": "Aggiungi un'opzione",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-copia",
|
||||
"set_as_default": "Imposta come predefinito",
|
||||
"hide_eventtype_details": "Nascondi dettagli tipo di evento"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "イベントはまだ承認待ちです",
|
||||
"event_is_still_waiting": "イベントリクエストはまだ待機中です: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "他の結果はありません",
|
||||
"no_results": "結果はありません",
|
||||
"load_more_results": "さらに結果を読み込む",
|
||||
"integration_meeting_id": "{{integrationName}} ミーティング ID: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "確認済: {{date}} の {{name}} との {{eventType}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "カレンダーに追加",
|
||||
"add_another_calendar": "別のカレンダーを追加",
|
||||
"other": "その他",
|
||||
"email_sign_in_subject": "{{appName}} のサインインリンク",
|
||||
"emailed_you_and_attendees": "あなたと他の出席者にすべての詳細を記載したカレンダーの招待状を電子メールで送信しました。",
|
||||
"emailed_you_and_attendees_recurring": "あなたと他の出席者にこの繰り返しイベント初回のカレンダーの招待状を電子メールで送信しました。",
|
||||
"emailed_you_and_any_other_attendees": "あなたと他の参加者にこの情報を電子メールで送信しました。",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "現在のパスワードが正しくありません",
|
||||
"password_hint_caplow": "アルファベットの大文字と小文字を両方使用してください",
|
||||
"password_hint_min": "8 文字以上入力してください",
|
||||
"password_hint_admin_min": "15 文字以上入力してください",
|
||||
"password_hint_num": "少なくとも 1 文字は数字を含めてください",
|
||||
"invalid_password_hint": "パスワードには少なくとも 1 文字以上数字を含め、アルファベットの大文字と小文字を両方使用した上で 7 文字以上の長さに設定してください",
|
||||
"incorrect_password": "パスワードが正しくありません。",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "{{profileName}} の{{eventTypeTitle}} を確認",
|
||||
"booking_reschedule_confirmation": "{{profileName}} の {{eventTypeTitle}} をスケジュール変更する",
|
||||
"in_person_meeting": "リンクまたは対面ミーティング",
|
||||
"attendeeInPerson": "対面(出席者のアドレス)",
|
||||
"inPerson": "対面(主催者のアドレス)",
|
||||
"link_meeting": "ミーティングをリンク",
|
||||
"phone_call": "出席者の電話番号",
|
||||
"your_number": "あなたの電話番号",
|
||||
"phone_number": "電話番号",
|
||||
"attendee_phone_number": "出席者の電話番号",
|
||||
"organizer_phone_number": "主催者の電話番号",
|
||||
"host_phone_number": "あなたの電話番号",
|
||||
"enter_phone_number": "電話番号を入力",
|
||||
"reschedule": "スケジュールの変更",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "全体",
|
||||
"collective_description": "選択したすべてのチームメンバーが利用可能な場合、ミーティングをスケジュールします。",
|
||||
"duration": "時間",
|
||||
"available_durations": "空いている時間",
|
||||
"default_duration": "デフォルトの時間",
|
||||
"default_duration_no_options": "最初に空いている時間を選択してください",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "分",
|
||||
"round_robin": "ラウンドロビン",
|
||||
"round_robin_description": "複数のチームメンバー間のミーティングを定期化する。",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "チーム",
|
||||
"team": "チーム",
|
||||
"team_billing": "チームの請求",
|
||||
"team_billing_description": "チームへの請求を管理します",
|
||||
"upgrade_to_flexible_pro_title": "チームへの請求内容を変更しました",
|
||||
"upgrade_to_flexible_pro_message": "あなたのチームには座席がないメンバーがいます。Pro プランへとアップグレードし、不足している座席を確保してください。",
|
||||
"changed_team_billing_info": "2022 年 1 月より、チームのメンバーには座席単位で料金が請求されます。Pro プランを無料でご利用いただいていたチームメンバーにつきましては、現在は 14 日間のトライアル期間中となっています。今すぐアップグレードしない限り、トライアル期間の終了とともにこれらのメンバーはあなたのチームにおいて非表示となります。",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "イベントタイプを非表示にする",
|
||||
"edit_location": "場所を編集",
|
||||
"into_the_future": "将来の日付",
|
||||
"when_booked_with_less_than_notice": "<time></time>未満の通知で予約された場合",
|
||||
"within_date_range": "日付の範囲内で",
|
||||
"indefinitely_into_future": "未定の将来の日",
|
||||
"add_new_custom_input_field": "新しいカスタム入力フィールドを追加する",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "あなたの {{appName}} アカウントを本当に削除してもよろしいですか?あなたのアカウントリンクを共有しているユーザーは、そのアカウントを使用して予約を行うことができなくなり、保存していた設定も失われます。",
|
||||
"integrations": "連携",
|
||||
"apps": "アプリ",
|
||||
"apps_listing": "アプリ一覧",
|
||||
"category_apps": "{{category}} アプリ",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "人とテクノロジーと職場をつなぐ。",
|
||||
@@ -736,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "ダブルブッキングを防ぐために、スケジュールの重なりをチェックするカレンダーを切り替えてください。",
|
||||
"select_destination_calendar": "以下にイベントを作成する",
|
||||
"connect_additional_calendar": "別のカレンダーを接続する",
|
||||
"calendar_updated_successfully": "カレンダーが正常に更新されました",
|
||||
"conferencing": "ミーティング中",
|
||||
"calendar": "カレンダー",
|
||||
"payments": "お支払い",
|
||||
@@ -768,6 +782,7 @@
|
||||
"trending_apps": "人気のアプリ",
|
||||
"explore_apps": "{{category}} アプリ",
|
||||
"installed_apps": "インストールされているアプリ",
|
||||
"free_to_use_apps": "無料",
|
||||
"no_category_apps": "{{category}} アプリはありません",
|
||||
"no_category_apps_description_calendar": "ダブルブッキングを防ぐために、スケジュールの重複をチェックするカレンダーアプリを追加しましょう",
|
||||
"no_category_apps_description_conferencing": "会議アプリを追加して、顧客とのビデオ通話を統合しましょう",
|
||||
@@ -806,6 +821,8 @@
|
||||
"verify_wallet": "ウォレットを確認する",
|
||||
"connect_metamask": "メタマスクを接続する",
|
||||
"create_events_on": "以下にイベントを作成する:",
|
||||
"enterprise_license": "これは企業向けの機能です",
|
||||
"enterprise_license_description": "この機能を有効にするには、{{consoleUrl}} コンソールでデプロイメントキーを入手して .env に CALCOM_LICENSE_KEY として追加してください。既にチームがライセンスを持っている場合は {{supportMail}} にお問い合わせください。",
|
||||
"missing_license": "ライセンスが見つかりません",
|
||||
"signup_requires": "商用ライセンスが必要です",
|
||||
"signup_requires_description": "{{companyName}} は、現時点ではサインアップページの無料のオープンソース版を提供しておりません。サインアップコンポーネントへのフルアクセスをご利用いただくためには、商用ライセンスを取得する必要があります。個人での利用につきましては、Prisma Data Platform またはその他の Postgres インターフェースを使用してアカウントの作成を行うことをお勧めしております。",
|
||||
@@ -897,6 +914,7 @@
|
||||
"user_impersonation_heading": "ユーザーなりすまし",
|
||||
"user_impersonation_description": "サポートチームがあなたとして一時的にサインインすることを許可し、あなたが当社に報告した問題を迅速に解決できるようにします。",
|
||||
"team_impersonation_description": "あなたのチームメンバーが一時的にあなたとしてサインインできるようになります。",
|
||||
"allow_booker_to_select_duration": "予約者が時間を選択できるようにする",
|
||||
"impersonate_user_tip": "この機能の使用はすべて監査されています。",
|
||||
"impersonating_user_warning": "ユーザー名 \"{{user}}\" になりすましています。",
|
||||
"impersonating_stop_instructions": "<0>停止するにはここをクリック</0>。",
|
||||
@@ -1014,6 +1032,9 @@
|
||||
"error_removing_app": "アプリの削除中にエラーが発生しました",
|
||||
"web_conference": "ウェブ会議",
|
||||
"requires_confirmation": "確認が必要です",
|
||||
"always_requires_confirmation": "常に",
|
||||
"requires_confirmation_threshold": "< {{time}} $t({{unit}}_timeUnit) の通知で予約された場合には確認が必要です",
|
||||
"may_require_confirmation": "確認が必要な場合もあります",
|
||||
"nr_event_type_one": "{{count}} 種類のイベントタイプ",
|
||||
"nr_event_type_other": "{{count}} 種類のイベントタイプ",
|
||||
"add_action": "アクションを追加",
|
||||
@@ -1101,6 +1122,9 @@
|
||||
"event_limit_tab_description": "予約できる頻度",
|
||||
"event_advanced_tab_description": "カレンダー設定など...",
|
||||
"event_advanced_tab_title": "詳細設定",
|
||||
"event_setup_multiple_duration_error": "イベント設定:複数の期間には少なくとも1つのオプションが必要です。",
|
||||
"event_setup_multiple_duration_default_error": "イベント設定:有効なデフォルト期間を選択してください。",
|
||||
"event_setup_booking_limits_error": "予約の上限の日時表記は昇順にする必要があります。[日、週、月、年]",
|
||||
"select_which_cal": "予約を追加するカレンダーを選択してください",
|
||||
"custom_event_name": "カスタムイベント名",
|
||||
"custom_event_name_description": "カレンダーのイベントに表示するカスタマイズされたイベント名を作成します",
|
||||
@@ -1154,8 +1178,11 @@
|
||||
"invoices": "請求書",
|
||||
"embeds": "埋め込み",
|
||||
"impersonation": "なりすまし",
|
||||
"impersonation_description": "ユーザーなりすましを管理するための設定",
|
||||
"users": "ユーザー",
|
||||
"profile_description": "{{appName}} プロフィールの設定を管理します",
|
||||
"users_description": "ここにはすべてのユーザーの一覧が表示されます",
|
||||
"users_listing": "ユーザー一覧",
|
||||
"general_description": "言語とタイムゾーンの設定を管理します",
|
||||
"calendars_description": "イベントの種類とカレンダーの連携方法を設定します",
|
||||
"appearance_description": "予約画面の外観設定を管理します",
|
||||
@@ -1360,6 +1387,7 @@
|
||||
"number_sms_notifications": "電話番号(SMS 通知)",
|
||||
"attendee_email_workflow": "出席者のメールアドレス",
|
||||
"attendee_email_info": "予約者のメールアドレス",
|
||||
"kbar_search_placeholder": "コマンドを入力するか、検索...",
|
||||
"invalid_credential": "アクセス許可の有効期限が切れたか、取り消されたようです。もう一度インストールしてください。",
|
||||
"choose_common_schedule_team_event": "共通のスケジュールを選択",
|
||||
"choose_common_schedule_team_event_description": "ホスト間で共通のスケジュールを使用する場合には、これを有効にしてください。無効にすると、各ホストに対してはデフォルトのスケジュールに基づいて予約が行われます。",
|
||||
@@ -1370,5 +1398,43 @@
|
||||
"test_preview": "プレビューをテスト",
|
||||
"route_to": "ルーティング先",
|
||||
"test_preview_description": "データを送信せずにルーティングフォームをテストします",
|
||||
"test_routing": "ルーティングをテスト"
|
||||
"test_routing": "ルーティングをテスト",
|
||||
"payment_app_disabled": "管理者が決済アプリを無効にしました",
|
||||
"edit_event_type": "イベントタイプを編集",
|
||||
"collective_scheduling": "全体スケジューリング",
|
||||
"make_it_easy_to_book": "誰もが参加可能な場合にチームの予約を簡単にします。",
|
||||
"find_the_best_person": "参加できる最適な人を見つけて、チームで繰り返し分担する。",
|
||||
"fixed_round_robin": "固定ラウンドロビン",
|
||||
"add_one_fixed_attendee": "決まった出席者を1人追加して、多数の出席者で持ち回りにします。",
|
||||
"calcom_is_better_with_team": "Cal.comはチームで使った方がよいです",
|
||||
"add_your_team_members": "イベントタイプにチームメンバーを追加します。全体スケジュールを使って、全員を含めるか、ラウンドロビンスケジューリングを使って、最適な人を見つけます。",
|
||||
"booking_limit_reached": "このイベントタイプの予約上限に達しました",
|
||||
"admin_has_disabled": "管理者が {{appName}} を無効にしました",
|
||||
"disabled_app_affects_event_type": "管理者が {{appName}} を無効にしているため、あなたのイベントタイプ {{eventType}} に影響があります",
|
||||
"disable_payment_app": "管理者が {{appName}} を無効にしているため、あなたのイベントタイプ {{title}} に影響すがあります。出席者はこのタイプのイベントを予約することはできますが、支払いを促されることはありません。管理者が支払い方法を再有効化するまで出席者が予約しないよう、このイベントタイプを非表示にすることができます。",
|
||||
"payment_disabled_still_able_to_book": "出席者はこのタイプのイベントを予約することはできますが、支払いを促されることはありません。管理者が支払い方法を再有効化するまで出席者が予約しないよう、このイベントタイプを非表示にすることができます。",
|
||||
"app_disabled_with_event_type": "管理者が {{appName}} を無効にしているため、あなたのイベントタイプ {{title}} に影響があります。",
|
||||
"app_disabled_video": "管理者が {{appName}} を無効にしているため、あなたのイベントタイプに影響する可能性があります。場所として {{appName}} を使ったイベントタイプがある場合はデフォルトの Cal Video になります。",
|
||||
"app_disabled_subject": "{{appName}} は無効になっています",
|
||||
"navigate_installed_apps": "インストールされているアプリに移動",
|
||||
"disabled_calendar": "別のカレンダーがインストールされている場合は、新しい予約はそこに追加されます。そうでない場合は新しい予約を見逃さないために新しいカレンダーを接続してください。",
|
||||
"enable_apps": "アプリを有効にする",
|
||||
"enable_apps_description": "ユーザーが Cal.com と連携できるアプリを有効にします",
|
||||
"app_is_enabled": "{{appName}} は有効です",
|
||||
"app_is_disabled": "{{appName}} は無効です",
|
||||
"keys_have_been_saved": "キーが保存されました",
|
||||
"disable_app": "アプリを無効化",
|
||||
"disable_app_description": "このアプリを無効にすると、ユーザーの Cal の操作に問題が発生する可能性があります",
|
||||
"edit_keys": "キーを編集",
|
||||
"no_available_apps": "利用可能なアプリはありません",
|
||||
"no_available_apps_description": "「packages/app-store」以下のデプロイメントにアプリがあることを確認してください",
|
||||
"no_apps": "Cal のこのインスタンスで有効になっているアプリはありません",
|
||||
"apps_settings": "アプリ設定",
|
||||
"fill_this_field": "このフィールドに入力してください",
|
||||
"options": "オプション",
|
||||
"enter_option": "オプション {{index}} を入力してください",
|
||||
"add_an_option": "オプションを追加",
|
||||
"radio": "ラジオボタン",
|
||||
"event_type_duplicate_copy_text": "{{slug}} をコピー",
|
||||
"set_as_default": "デフォルトとして設定"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "이벤트가 아직 승인을 기다리고 있습니다.",
|
||||
"event_is_still_waiting": "이벤트 요청이 아직 대기중입니다: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "더 이상 결과 없음",
|
||||
"no_results": "결과 없음",
|
||||
"load_more_results": "더 많은 결과 보기",
|
||||
"integration_meeting_id": "{{integrationName}} 회의 ID: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "확인됨: {{date}}, {{name}} 의 {{eventType}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "캘린더에 추가하기",
|
||||
"add_another_calendar": "다른 캘린더 추가",
|
||||
"other": "더 보기",
|
||||
"email_sign_in_subject": "{{appName}}의 로그인 링크",
|
||||
"emailed_you_and_attendees": "당신과 다른 참여자들에게 상세 사항이 담긴 캘린더 초대 이메일을 보냈습니다.",
|
||||
"emailed_you_and_attendees_recurring": "귀하와 다른 참석자들에게 이 되풀이 이벤트의 첫 이벤트에 대한 예약 초대장을 이메일로 발송했습니다.",
|
||||
"emailed_you_and_any_other_attendees": "당신과 다른 참여자들이 이 정보가 담긴 이메일을 주고 받았습니다.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "현재 비밀번호가 잘못되었습니다.",
|
||||
"password_hint_caplow": "대문자와 소문자의 혼합",
|
||||
"password_hint_min": "최소 7자 길이",
|
||||
"password_hint_admin_min": "최소 15자 길이",
|
||||
"password_hint_num": "1개 이상 숫자 포함",
|
||||
"invalid_password_hint": "비밀번호는 7자 이상이어야 하고 숫자가 하나 이상 포함되어야 하며 대문자와 소문자가 혼합되어야 합니다",
|
||||
"incorrect_password": "비밀번호가 잘못되었습니다",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "{{profileName}}로 {{eventTypeTitle}} 확인",
|
||||
"booking_reschedule_confirmation": "{{profileName}}을 사용하여 {{eventTypeTitle}} 일정을 변경하세요.",
|
||||
"in_person_meeting": "온라인 또는 오프라인 회의",
|
||||
"attendeeInPerson": "직접 방문(참석자 주소)",
|
||||
"inPerson": "방문(주최자 주소)",
|
||||
"link_meeting": "회의 링크",
|
||||
"phone_call": "참석자 전화 번호",
|
||||
"your_number": "본인 전화 번호",
|
||||
"phone_number": "전화 번호",
|
||||
"attendee_phone_number": "참석자 전화 번호",
|
||||
"organizer_phone_number": "주최자 전화번호",
|
||||
"host_phone_number": "본인 전화 번호",
|
||||
"enter_phone_number": "전화 번호 입력",
|
||||
"reschedule": "일정 변경",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "집단",
|
||||
"collective_description": "선택한 모든 팀원이 참석할 수 있을 때 회의를 예약합니다.",
|
||||
"duration": "기간",
|
||||
"available_durations": "사용 가능한 기간",
|
||||
"default_duration": "기본 기간",
|
||||
"default_duration_no_options": "사용 가능한 기간을 먼저 선택하세요",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "분",
|
||||
"round_robin": "라운드 로빈",
|
||||
"round_robin_description": "여러 팀 구성원 간의 주기적인 회의",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "팀",
|
||||
"team": "팀",
|
||||
"team_billing": "팀 비용 청구",
|
||||
"team_billing_description": "팀의 청구 관리",
|
||||
"upgrade_to_flexible_pro_title": "팀에 대한 청구를 변경했습니다",
|
||||
"upgrade_to_flexible_pro_message": "팀에 시트가 없는 구성원이 있습니다. 누락된 시트를 보완하려면 Pro 플랜을 업그레이드하세요.",
|
||||
"changed_team_billing_info": "2022년 1월부터 팀원에 대해 시트별로 요금을 부과합니다. 무료로 Pro를 사용하던 팀원은 이제 14일 평가판을 사용할 수 있습니다. 평가판 기한이 만료되고 업그레이드하지 않으면 이 팀원은 팀에서 숨겨집니다.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "이벤트 타입 숨기기",
|
||||
"edit_location": "위치 수정",
|
||||
"into_the_future": "미래로",
|
||||
"when_booked_with_less_than_notice": "<time></time>회 미만 통지로 예약한 경우",
|
||||
"within_date_range": "기간 내",
|
||||
"indefinitely_into_future": "무한히 미래로",
|
||||
"add_new_custom_input_field": "새 사용자 정의 입력 필드 추가",
|
||||
@@ -713,6 +725,8 @@
|
||||
"delete_account_confirmation_message": "{{appName}} 계정을 삭제하시겠습니까? 계정 링크를 공유한 사람은 더 이상 이 링크를 사용하여 예약할 수 없으며 저장한 모든 기본 설정이 손실됩니다.",
|
||||
"integrations": "통합",
|
||||
"apps": "앱",
|
||||
"apps_description": "Cal 인스턴스용 앱 활성화",
|
||||
"apps_listing": "앱 목록화",
|
||||
"category_apps": "{{category}} 앱",
|
||||
"app_store": "앱 스토어",
|
||||
"app_store_description": "사람, 기술, 직장을 연결합니다.",
|
||||
@@ -736,6 +750,7 @@
|
||||
"toggle_calendars_conflict": "중복 예약을 방지하기 위해 충돌을 확인하려는 캘린더를 전환합니다.",
|
||||
"select_destination_calendar": "이벤트 작성일",
|
||||
"connect_additional_calendar": "추가 캘린더 연결",
|
||||
"calendar_updated_successfully": "캘린더가 업데이트되었습니다",
|
||||
"conferencing": "회의",
|
||||
"calendar": "달력",
|
||||
"payments": "결제",
|
||||
@@ -768,6 +783,7 @@
|
||||
"trending_apps": "트랜드 앱",
|
||||
"explore_apps": "{{category}} 앱",
|
||||
"installed_apps": "설치된 앱",
|
||||
"free_to_use_apps": "무료",
|
||||
"no_category_apps": "{{category}} 앱 없음",
|
||||
"no_category_apps_description_calendar": "중복 예약을 방지하기 위해 충돌을 확인하려는 캘린더 앱을 추가합니다",
|
||||
"no_category_apps_description_conferencing": "고객과 화상 통화를 통합하려면 회의 앱을 추가해 보세요",
|
||||
@@ -806,6 +822,8 @@
|
||||
"verify_wallet": "지갑 인증",
|
||||
"connect_metamask": "메타마스크 연결",
|
||||
"create_events_on": "이벤트 생성일:",
|
||||
"enterprise_license": "엔터프라이즈 기능입니다",
|
||||
"enterprise_license_description": "이 기능을 활성화하려면 {{consoleUrl}} 콘솔에서 배포 키를 가져와 .env에 CALCOM_LICENSE_KEY로 추가하세요. 팀에 이미 라이선스가 있는 경우 {{supportMail}}에 문의하여 도움을 받으세요.",
|
||||
"missing_license": "라이선스 없음",
|
||||
"signup_requires": "상용 라이선스 필요",
|
||||
"signup_requires_description": "지금은 {{companyName}}에서 가입 페이지의 무료 오픈 소스 버전을 제공하지 않습니다. 가입 구성 요소에 대한 정식 액세스 권한을 받으려면 상용 라이선스를 취득해야 합니다. 개인 용도의 경우 Prisma Data Platform 또는 기타 Postgres 인터페이스를 사용하여 계정을 생성하는 것이 좋습니다.",
|
||||
@@ -897,6 +915,7 @@
|
||||
"user_impersonation_heading": "사용자 가장",
|
||||
"user_impersonation_description": "신고하신 문제를 신속하게 해결할 수 있도록 지원 팀이 귀하의 계정에 일시적으로 로그인할 수 있게 허용합니다.",
|
||||
"team_impersonation_description": "팀 구성원이 일시적으로 귀하의 자격으로 로그인할 수 있게 합니다.",
|
||||
"allow_booker_to_select_duration": "예약자가 기간을 선택하도록 허용",
|
||||
"impersonate_user_tip": "이 기능의 사용은 모두 감사됩니다.",
|
||||
"impersonating_user_warning": "\"{{user}}\"의 사용자 이름을 가장하는 중입니다.",
|
||||
"impersonating_stop_instructions": "<0>중지하려면 여기를 클릭하십시오</0>.",
|
||||
@@ -1014,6 +1033,9 @@
|
||||
"error_removing_app": "앱 제거 중 오류 발생",
|
||||
"web_conference": "웹 화상 회의",
|
||||
"requires_confirmation": "확인 필수",
|
||||
"always_requires_confirmation": "항상",
|
||||
"requires_confirmation_threshold": "< {{time}} $t({{unit}}_timeUnit) 알림으로 예약한 경우 확인이 필요합니다",
|
||||
"may_require_confirmation": "확인이 필요할 수 있음",
|
||||
"nr_event_type_one": "{{count}} 이벤트 타입",
|
||||
"nr_event_type_other": "{{count}} 이벤트 타입",
|
||||
"add_action": "작업 추가",
|
||||
@@ -1101,6 +1123,9 @@
|
||||
"event_limit_tab_description": "예약 가능 횟수",
|
||||
"event_advanced_tab_description": "캘린더 설정 및 기타...",
|
||||
"event_advanced_tab_title": "고급",
|
||||
"event_setup_multiple_duration_error": "이벤트 설정: 복수 기간에는 최소 1개의 옵션이 필요합니다.",
|
||||
"event_setup_multiple_duration_default_error": "이벤트 설정: 유효한 기본 기간을 선택하십시오.",
|
||||
"event_setup_booking_limits_error": "예약 한도는 오름차순이어야 합니다. [일,주,월,년]",
|
||||
"select_which_cal": "예약을 추가할 캘린더 선택",
|
||||
"custom_event_name": "사용자 정의 이벤트 이름",
|
||||
"custom_event_name_description": "캘린더 이벤트에 표시할 사용자 정의 이벤트 이름 만들기",
|
||||
@@ -1154,8 +1179,11 @@
|
||||
"invoices": "청구서",
|
||||
"embeds": "내장",
|
||||
"impersonation": "가장",
|
||||
"impersonation_description": "사용자 가장을 관리하기 위한 설정",
|
||||
"users": "사용자",
|
||||
"profile_description": "사용자 {{appName}} 프로필 설정 관리",
|
||||
"users_description": "여기에서 모든 사용자 목록을 찾을 수 있습니다",
|
||||
"users_listing": "사용자 목록화",
|
||||
"general_description": "언어 및 시간대 설정 관리",
|
||||
"calendars_description": "이벤트 타입이 캘린더와 상호 작용하는 방식 구성",
|
||||
"appearance_description": "예약 모양 설정 관리",
|
||||
@@ -1360,6 +1388,7 @@
|
||||
"number_sms_notifications": "전화번호 (SMS notifications)",
|
||||
"attendee_email_workflow": "참석자 이메일",
|
||||
"attendee_email_info": "예약자 이메일",
|
||||
"kbar_search_placeholder": "명령어를 입력하거나 검색하세요...",
|
||||
"invalid_credential": "죄송합니다! 권한이 만료되었거나 취소된 것 같습니다. 다시 설치하십시오.",
|
||||
"choose_common_schedule_team_event": "공통 일정 선택",
|
||||
"choose_common_schedule_team_event_description": "호스트 간에 공통 일정을 사용하려면 이 옵션을 활성화하세요. 비활성화되면 각 호스트는 기본 일정에 따라 예약됩니다.",
|
||||
@@ -1370,5 +1399,44 @@
|
||||
"test_preview": "미리보기 테스트",
|
||||
"route_to": "목표 경로",
|
||||
"test_preview_description": "데이터를 제출하지 않고 라우팅 양식 테스트",
|
||||
"test_routing": "라우팅 테스트"
|
||||
"test_routing": "라우팅 테스트",
|
||||
"payment_app_disabled": "관리자가 결제 앱을 비활성화했습니다",
|
||||
"edit_event_type": "이벤트 타입 편집",
|
||||
"collective_scheduling": "집단 일정 관리",
|
||||
"make_it_easy_to_book": "모든 사람이 참석할 수 있을 때 팀을 쉽게 예약할 수 있게 합니다.",
|
||||
"find_the_best_person": "가능한 최상의 인원을 찾고 팀원을 순환 배정하십시오.",
|
||||
"fixed_round_robin": "고정 라운드 로빈",
|
||||
"add_one_fixed_attendee": "한 명의 고정 참석자를 추가하고 여러 참석자를 통해 라운드 로빈을 추가합니다.",
|
||||
"calcom_is_better_with_team": "Cal.com은 팀과 함께라면 더욱 좋습니다",
|
||||
"add_your_team_members": "이벤트 타입에 팀원을 추가하세요. 집단 일정 관리를 사용해 모든 사람을 포함하거나 라운드 로빈 일정 관리로 가장 적합한 인원을 찾으십시오.",
|
||||
"booking_limit_reached": "이 이벤트 타입에 대한 예약 한도에 도달했습니다",
|
||||
"admin_has_disabled": "관리자가 {{appName}} 앱을 비활성화했습니다",
|
||||
"disabled_app_affects_event_type": "관리자가 이벤트 타입 {{eventType}}에 영향을 미치는 {{appName}} 앱을 비활성화했습니다",
|
||||
"disable_payment_app": "관리자가 이벤트 타입 {{title}}에 영향을 미치는 {{appName}} 앱을 비활성화했습니다. 참석자는 여전히 이러한 타입의 이벤트를 예약할 수 있지만 결제하라는 메시지는 표시되지 않습니다. 관리자가 결제 수단을 다시 활성화할 때까지 이를 방지하기 위해 이벤트 타입을 숨길 수 있습니다.",
|
||||
"payment_disabled_still_able_to_book": "참석자는 여전히 이러한 타입의 이벤트를 예약할 수 있지만 결제하라는 메시지는 표시되지 않습니다. 관리자가 결제 수단을 다시 활성화할 때까지 이를 방지하기 위해 이벤트 타입을 숨길 수 있습니다.",
|
||||
"app_disabled_with_event_type": "관리자가 이벤트 타입 {{title}}에 영향을 미치는 {{appName}} 앱을 비활성화했습니다.",
|
||||
"app_disabled_video": "관리자가 이벤트 타입에 영향을 미칠 수 있는 {{appName}} 앱을 비활성화했습니다. 위치가 {{appName}} 앱에 대한 이벤트 타입이 있는 경우 기본적으로 Cal Video로 설정됩니다.",
|
||||
"app_disabled_subject": "{{appName}} 앱이 비활성화되었습니다",
|
||||
"navigate_installed_apps": "설치된 앱으로 이동",
|
||||
"disabled_calendar": "다른 캘린더를 설치한 경우 새 예약이 추가됩니다. 그렇지 않은 경우 새로운 예약을 놓치지 않도록 새 캘린더를 연결하십시오.",
|
||||
"enable_apps": "앱 활성화",
|
||||
"enable_apps_description": "사용자가 Cal.com과 통합할 수 있는 앱 활성화",
|
||||
"app_is_enabled": "{{appName}} 앱이 활성화되었습니다",
|
||||
"app_is_disabled": "{{appName}} 앱이 비활성화되었습니다",
|
||||
"keys_have_been_saved": "키가 저장되었습니다",
|
||||
"disable_app": "앱 비활성화",
|
||||
"disable_app_description": "이 앱을 비활성화하면 사용자가 Cal과 상호 작용하는 방식에 문제가 발생할 수 있습니다",
|
||||
"edit_keys": "키 편집",
|
||||
"admin_apps_description": "Cal 인스턴스용 앱 활성화",
|
||||
"no_available_apps": "사용 가능한 앱이 없습니다",
|
||||
"no_available_apps_description": "'packages/app-store' 아래 배포에 앱이 있는지 확인하세요",
|
||||
"no_apps": "Cal의 이 인스턴스에서 활성화된 앱이 없습니다",
|
||||
"apps_settings": "앱 설정",
|
||||
"fill_this_field": "이 필드에 입력하세요",
|
||||
"options": "선택사항",
|
||||
"enter_option": "선택사항 {{index}} 입력",
|
||||
"add_an_option": "선택사항 추가",
|
||||
"radio": "라디오",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-카피",
|
||||
"set_as_default": "기본값으로 설정"
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
"event_request_cancelled": "Uw geplande gebeurtenis is geannuleerd",
|
||||
"organizer": "Organisator",
|
||||
"need_to_reschedule_or_cancel": "Moet u verplaatsen of annuleren?",
|
||||
"cancellation_reason": "Reden voor annulering",
|
||||
"cancellation_reason_placeholder": "Waarom annuleert u? (optioneel)",
|
||||
"cancellation_reason": "Reden voor annulering (optioneel)",
|
||||
"cancellation_reason_placeholder": "Waarom annuleert u?",
|
||||
"rejection_reason": "Reden voor weigering",
|
||||
"rejection_reason_title": "Boekingsverzoek weigeren?",
|
||||
"rejection_reason_description": "Weet u zeker dat u de boeking wilt weigeren? We informeren de persoon die probeerde te boeken. U kunt hieronder een reden opgeven.",
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Er is nog een openstaande goedkeuring voor een evenement",
|
||||
"event_is_still_waiting": "Openstaand verzoek voor evenement: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Geen verdere resultaten",
|
||||
"no_results": "Geen resultaten",
|
||||
"load_more_results": "Meer resultaten laden",
|
||||
"integration_meeting_id": "{{integrationName}} afspraak ID: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Bevestigd: {{eventType}} met {{name}} op {{date}}",
|
||||
@@ -108,7 +109,7 @@
|
||||
"link_expires": "p.s. De uitnodiging verloopt over {{expiresIn}} uur.",
|
||||
"upgrade_to_per_seat": "Upgraden naar per plaats",
|
||||
"team_upgrade_seats_details": "Van de {{memberCount}} leden in uw team zijn {{unpaidCount}} plaats(en) onbetaald. Voor $ {{seatPrice}}/maand per plaats bedragen de geschatte totale kosten van uw abonnement $ {{totalCost}}/maand.",
|
||||
"team_upgrade_banner_description": "Bedankt voor het testen van ons nieuwe teamabonnement. We hebben gemerkt dat uw team \"{{teamName}}\" moet worden geüpgraded.",
|
||||
"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!",
|
||||
"use_link_to_reset_password": "Gebruik de onderstaande link om uw wachtwoord te resetten",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Toevoegen aan kalender",
|
||||
"add_another_calendar": "Andere agenda toevoegen",
|
||||
"other": "Overige",
|
||||
"email_sign_in_subject": "Uw aanmeldingslink voor {{appName}}",
|
||||
"emailed_you_and_attendees": "We hebben u en de andere deelnemende een kalender uitnodiging met alle details gestuurd.",
|
||||
"emailed_you_and_attendees_recurring": "We hebben u en de andere deelnemers een agenda-uitnodiging voor de eerste van deze terugkerende gebeurtenissen gestuurd.",
|
||||
"emailed_you_and_any_other_attendees": "U en alle andere deelnemers zijn gemaild met deze informatie.",
|
||||
@@ -419,7 +421,8 @@
|
||||
"forgotten_secret_description": "Als u dit geheim vergeten of verloren bent, kunt u het wijzigen. Maar wees u ervan bewust dat alle integraties die dit geheim gebruiken bijgewerkt moeten worden",
|
||||
"current_incorrect_password": "Uw wachtwoord is verkeerd",
|
||||
"password_hint_caplow": "Mix van hoofd- en kleine letters",
|
||||
"password_hint_min": "Minimaal 7 tekens lang",
|
||||
"password_hint_min": "Minimaal 8 tekens lang",
|
||||
"password_hint_admin_min": "Minimaal 15 tekens lang",
|
||||
"password_hint_num": "Minimaal 1 cijfer bevatten",
|
||||
"invalid_password_hint": "Het wachtwoord moet minimaal 7 tekens lang zijn, minimaal 1 cijfer bevatten en bestaan uit een mix van hoofd- en kleine letters",
|
||||
"incorrect_password": "Uw wachtwoord is incorrect.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Bevestig uw {{eventTypeTitle}} met {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Opnieuw plannen van uw {{eventTypeTitle}} met {{profileName}}",
|
||||
"in_person_meeting": "Online of persoonlijk afspreken",
|
||||
"attendeeInPerson": "Persoonlijk (adres deelnemer)",
|
||||
"inPerson": "Persoonlijk (adres organisator)",
|
||||
"link_meeting": "Vergadering koppelen",
|
||||
"phone_call": "Telefoonnummer deelnemer",
|
||||
"your_number": "Uw telefoonnummer",
|
||||
"phone_number": "Telefoon nummer",
|
||||
"attendee_phone_number": "Telefoonnummer deelnemer",
|
||||
"organizer_phone_number": "Telefoonnummer organisator",
|
||||
"host_phone_number": "Uw telefoonnummer",
|
||||
"enter_phone_number": "Telefoonnummer",
|
||||
"reschedule": "Boeking wijzigen",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Collectief",
|
||||
"collective_description": "Plan vergaderingen wanneer alle geselecteerde teamleden beschikbaar zijn.",
|
||||
"duration": "Looptijd",
|
||||
"available_durations": "Beschikbare duur",
|
||||
"default_duration": "Standaardduur",
|
||||
"default_duration_no_options": "Kies eerst de beschikbare duur",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minuten",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Afspraken wisselen tussen meerdere teamleden.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Teams",
|
||||
"team": "Team",
|
||||
"team_billing": "Teamfacturatie",
|
||||
"team_billing_description": "Beheer de facturering voor uw team",
|
||||
"upgrade_to_flexible_pro_title": "We hebben het factureren gewijzigd voor teams",
|
||||
"upgrade_to_flexible_pro_message": "Er zijn leden in uw team zonder een plaats. Upgrade uw Pro-abonnement om de ontbrekende plaatsen te dekken.",
|
||||
"changed_team_billing_info": "Vanaf januari 2022 rekenen we per plaats voor teamleden. Leden van uw team die Pro gratis hadden, hebben nu een proefperiode van 14 dagen. Zodra hun proefperiode afloopt, worden deze leden verborgen voor uw team, tenzij u nu upgradet.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Verberg evenement",
|
||||
"edit_location": "Locatie wijzigen",
|
||||
"into_the_future": "in de toekomst",
|
||||
"when_booked_with_less_than_notice": "Wanneer geboekt met minder dan <time></time> kennisgeving",
|
||||
"within_date_range": "Binnen een datumbereik",
|
||||
"indefinitely_into_future": "Voor onbepaalde tijd",
|
||||
"add_new_custom_input_field": "Nieuw invoerveld toevoegen",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "Weet u zeker dat u uw {{appName}}-account wilt verwijderen? Iedereen met wie u uw accountlink gedeeld heeft, kan er niet meer mee boeken en alle voorkeuren die u opgeslagen heeft gaan verloren.",
|
||||
"integrations": "Integraties",
|
||||
"apps": "Apps",
|
||||
"apps_listing": "App-beschrijving",
|
||||
"category_apps": "apps voor {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Mensen, technologie en de werkplek verbinden.",
|
||||
@@ -736,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "Schakel de agenda's in die u wilt controleren op conflicten om dubbele boekingen te voorkomen.",
|
||||
"select_destination_calendar": "Maak gebeurtenissen aan op",
|
||||
"connect_additional_calendar": "Extra agenda kopppelen",
|
||||
"calendar_updated_successfully": "Agenda bijgewerkt",
|
||||
"conferencing": "Confereren",
|
||||
"calendar": "Agenda",
|
||||
"payments": "Betalingen",
|
||||
@@ -768,6 +782,7 @@
|
||||
"trending_apps": "Trending apps",
|
||||
"explore_apps": "{{category}}-apps",
|
||||
"installed_apps": "Geinstalleerde apps",
|
||||
"free_to_use_apps": "Gratis",
|
||||
"no_category_apps": "Geen apps voor {{category}}",
|
||||
"no_category_apps_description_calendar": "Voeg een agenda-app toe om te controleren op conflicten om dubbele boekingen te voorkomen",
|
||||
"no_category_apps_description_conferencing": "Probeer een conferentieapp toe te voegen om videogesprekken met uw klanten te integreren",
|
||||
@@ -784,7 +799,7 @@
|
||||
"analytics": "Analyse",
|
||||
"empty_installed_apps_headline": "Geen apps geïnstalleerd",
|
||||
"empty_installed_apps_description": "Met apps kunt u uw workflow en uw planning aanzienlijk verbeteren.",
|
||||
"empty_installed_apps_button": "Ontdek de App Store",
|
||||
"empty_installed_apps_button": "Bladeren in App Store",
|
||||
"manage_your_connected_apps": "Beheer uw geïnstalleerde apps of wijzig instellingen",
|
||||
"browse_apps": "Door apps bladeren",
|
||||
"features": "Functies",
|
||||
@@ -806,6 +821,8 @@
|
||||
"verify_wallet": "Wallet verifiëren",
|
||||
"connect_metamask": "Metamasker verbinden",
|
||||
"create_events_on": "Maak gebeurtenissen aan in de",
|
||||
"enterprise_license": "Dit is een bedrijfsfunctie",
|
||||
"enterprise_license_description": "Om deze functie in te schakelen, krijgt u een implementatiesleutel op de {{consoleUrl}}-console en voegt u deze toe aan uw .env als CALCOM_LICENSE_KEY. Als uw team al een licentie heeft, neem dan contact op met {{supportMail}} voor hulp.",
|
||||
"missing_license": "Ontbrekende licentie",
|
||||
"signup_requires": "Commerciële licentie vereist",
|
||||
"signup_requires_description": "{{companyName}} biedt momenteel geen gratis opensourceversie van de registratiepagina aan. Om volledige toegang te krijgen tot de registratieonderdelen moet u een commerciële licentie verkrijgen. Voor persoonlijk gebruik raden we aan om accounts aan te maken op het Prisma Data Platform of een andere Postgres-interface.",
|
||||
@@ -897,6 +914,7 @@
|
||||
"user_impersonation_heading": "Imitatie van gebruiker",
|
||||
"user_impersonation_description": "Hiermee kan ons ondersteuningsteam tijdelijk als u inloggen zodat we eventuele problemen die u aan ons meldt snel op kunnen lossen.",
|
||||
"team_impersonation_description": "Hiermee kunnen uw teamleden zich tijdelijk aanmelden als u.",
|
||||
"allow_booker_to_select_duration": "Booker toestaan om een duur te selecteren",
|
||||
"impersonate_user_tip": "Alle gebruik van deze functie wordt gecontroleerd.",
|
||||
"impersonating_user_warning": "Gebruikersnaam \"{{user}}\" wordt geïmiteerd.",
|
||||
"impersonating_stop_instructions": "<0>Klik hier om te stoppen</0>.",
|
||||
@@ -1014,6 +1032,9 @@
|
||||
"error_removing_app": "Fout bij het verwijderen van de app",
|
||||
"web_conference": "Webconferentie",
|
||||
"requires_confirmation": "Vereist bevestiging",
|
||||
"always_requires_confirmation": "Altijd",
|
||||
"requires_confirmation_threshold": "Vereist bevestiging als geboekt met < {{time}} $t({{unit}}_timeUnit) kennisgeving",
|
||||
"may_require_confirmation": "Kan bevestiging vereisen",
|
||||
"nr_event_type_one": "{{count}} gebeurtenistype",
|
||||
"nr_event_type_other": "{{count}} gebeurtenistypen",
|
||||
"add_action": "Actie toevoegen",
|
||||
@@ -1101,6 +1122,9 @@
|
||||
"event_limit_tab_description": "Hoe vaak u geboekt kunt worden",
|
||||
"event_advanced_tab_description": "Agenda-instellingen en meer...",
|
||||
"event_advanced_tab_title": "Geavanceerd",
|
||||
"event_setup_multiple_duration_error": "Gebeurtenisconfiguratie: voor meerdere duren is minimaal 1 optie vereist.",
|
||||
"event_setup_multiple_duration_default_error": "Gebeurtenisconfiguratie: selecteer een geldige standaardduur.",
|
||||
"event_setup_booking_limits_error": "Reserveringslimieten moeten in oplopende volgorde zijn. [dag, week, maand, jaar]",
|
||||
"select_which_cal": "Selecteer aan welke agenda u boekingen wilt toevoegen",
|
||||
"custom_event_name": "Aangepaste gebeurtenisnaam",
|
||||
"custom_event_name_description": "Maak aangepaste gebeurtenisnamen om weer te geven op agendagebeurtenissen",
|
||||
@@ -1154,8 +1178,11 @@
|
||||
"invoices": "Facturen",
|
||||
"embeds": "Ingesloten opties",
|
||||
"impersonation": "Imitatie",
|
||||
"impersonation_description": "Instellingen voor imitatie van gebruiker beheren",
|
||||
"users": "Gebruikers",
|
||||
"profile_description": "Beheer de instellingen van uw {{appName}}-profiel",
|
||||
"users_description": "Hier vindt u een lijst met alle gebruikers",
|
||||
"users_listing": "Gebruikersbeschrijving",
|
||||
"general_description": "Beheer de instellingen voor uw taal en tijdzone",
|
||||
"calendars_description": "Configureer hoe uw typen gebeurtenissen samenwerken met uw agenda's",
|
||||
"appearance_description": "Beheer de instellingen voor uw boekingsweergave",
|
||||
@@ -1360,6 +1387,7 @@
|
||||
"number_sms_notifications": "Telefoonnummer (sms-meldingen)",
|
||||
"attendee_email_workflow": "E-mailadres deelnemer",
|
||||
"attendee_email_info": "Het e-mailadres van de persoon die boekt",
|
||||
"kbar_search_placeholder": "Typ een opdracht of zoek...",
|
||||
"invalid_credential": "Oh nee! Het lijkt erop dat de machtiging is verlopen of is ingetrokken. Installeer het opnieuw.",
|
||||
"choose_common_schedule_team_event": "Kies een gemeenschappelijke planning",
|
||||
"choose_common_schedule_team_event_description": "Schakel dit in als u een gemeenschappelijke planning tussen organisatoren wilt gebruiken. Indien uitgeschakeld, wordt elke organisator geboekt op basis van zijn standaardplanning.",
|
||||
@@ -1370,5 +1398,43 @@
|
||||
"test_preview": "Voorbeeld testen",
|
||||
"route_to": "Routeren naar",
|
||||
"test_preview_description": "Test uw routeringsformulier zonder gegevens te versturen",
|
||||
"test_routing": "Routering testen"
|
||||
"test_routing": "Routering testen",
|
||||
"payment_app_disabled": "Een beheerder heeft een betaalapp uitgeschakeld",
|
||||
"edit_event_type": "Gebeurtenistype bewerken",
|
||||
"collective_scheduling": "Collectieve planning",
|
||||
"make_it_easy_to_book": "Maak het gemakkelijk om uw team te boeken wanneer iedereen beschikbaar is.",
|
||||
"find_the_best_person": "Zoek de beste beschikbare persoon en blader door uw team.",
|
||||
"fixed_round_robin": "Vaste round robin",
|
||||
"add_one_fixed_attendee": "Voeg één vaste deelnemer en round robin toe via een aantal deelnemers.",
|
||||
"calcom_is_better_with_team": "Cal.com is beter met teams",
|
||||
"add_your_team_members": "Voeg uw teamleden toe aan uw gebeurtenistypes. Gebruik collectieve planning om iedereen op te nemen of zoek de meest geschikte persoon met round robin-planning.",
|
||||
"booking_limit_reached": "Boekingslimiet voor dit gebeurtenistype is bereikt",
|
||||
"admin_has_disabled": "Een beheerder heeft {{appName}} uitgeschakeld",
|
||||
"disabled_app_affects_event_type": "Een beheerder heeft {{appName}} uitgeschakeld die van invloed is op uw gebeurtenistype {{eventType}}",
|
||||
"disable_payment_app": "De beheerder heeft {{appName}} uitgeschakeld die van invloed is op uw gebeurtenistype {{title}}. Deelnemers kunnen dit tyoe gebeurtenissen nog steeds boeken, maar worden niet gevraagd te betalen. U kunt het gebeurtenistype verbergen om dit te voorkomen totdat uw beheerde de betaalmethode opnieuw inschakelt.",
|
||||
"payment_disabled_still_able_to_book": "Deelnemers kunnen dit type gebeurtenis nog steeds boeken, maar worden niet gevraagd te betalen. U kunt het gebeurtenistype verbergen om dit te voorkomen totdat uw beheerde de betaalmethode opnieuw inschakelt.",
|
||||
"app_disabled_with_event_type": "De beheerder heeft {{appName}} uitgeschakeld die van invloed is op uw gebeurtenistype {{title}}.",
|
||||
"app_disabled_video": "De beheerde heeft {{appName}} uitgeschakeld, wat van invloed kan zijn op uw gebeurtenistypes. Als u gebeurtenistypes heeft met {{appName}} als locatie, is het standaard Cal Video.",
|
||||
"app_disabled_subject": "{{appName}} is uitgeschakeld",
|
||||
"navigate_installed_apps": "Naar geïnstalleerde apps",
|
||||
"disabled_calendar": "Als u een andere agenda heeft geïnstalleerd, worden nieuwe boekingen daaraan toegevoegd. Zo niet, koppel dan een nieuwe agenda zodat u geen nieuwe boekingen mist.",
|
||||
"enable_apps": "Apps inschakelen",
|
||||
"enable_apps_description": "Schakel apps in die gebruikers kunnen integreren met Cal.com",
|
||||
"app_is_enabled": "{{appName}} is ingeschakeld",
|
||||
"app_is_disabled": "{{appName}} is uitgeschakeld",
|
||||
"keys_have_been_saved": "Sleutels zijn opgeslagen",
|
||||
"disable_app": "App uitschakelen",
|
||||
"disable_app_description": "Het uitschakelen van deze app kan problemen veroorzaken met de interactie tussen uw gebruikers en Cal",
|
||||
"edit_keys": "Sleutels bewerken",
|
||||
"no_available_apps": "Er zijn geen beschikbare apps",
|
||||
"no_available_apps_description": "Zorg ervoor dat er apps zijn in uw implementatie onder \"packages/app-store\"",
|
||||
"no_apps": "Er zijn geen apps ingeschakeld in dit exemplaar van Cal",
|
||||
"apps_settings": "Apps-instellingen",
|
||||
"fill_this_field": "Vul dit veld in",
|
||||
"options": "Opties",
|
||||
"enter_option": "Voer optie {{index}} in",
|
||||
"add_an_option": "Voeg een optie toe",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-kopie",
|
||||
"set_as_default": "Als standaard instellen"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Wydarzenie nadal oczekuje na zatwierdzenie",
|
||||
"event_is_still_waiting": "Prośba o wydarzenie nadal czeka: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Brak więcej wyników",
|
||||
"no_results": "Brak wyników",
|
||||
"load_more_results": "Wczytaj więcej wyników",
|
||||
"integration_meeting_id": "{{integrationName}} ID spotkania: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Potwierdzono: {{eventType}} z {{name}} w {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Dodaj do kalendarza",
|
||||
"add_another_calendar": "Dodaj kolejny kalendarz",
|
||||
"other": "Inne",
|
||||
"email_sign_in_subject": "Twój link logowania do aplikacji {{appName}}",
|
||||
"emailed_you_and_attendees": "Wysłaliśmy Ci i innym uczestnikom zaproszenie do kalendarza ze wszystkimi szczegółami.",
|
||||
"emailed_you_and_attendees_recurring": "Wysłaliśmy Ci oraz innym uczestnikom zaproszenie do kalendarza dotyczące pierwszego z tych cyklicznych wydarzeń.",
|
||||
"emailed_you_and_any_other_attendees": "Ty i inni uczestnicy dostali e-mail z tymi informacjami.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "Bieżące hasło jest nieprawidłowe",
|
||||
"password_hint_caplow": "Kombinacja wielkich i małych liter",
|
||||
"password_hint_min": "Długość co najmniej 8 znaków",
|
||||
"password_hint_admin_min": "Długość co najmniej 15 znaków",
|
||||
"password_hint_num": "Zawrzyj co najmniej 1 cyfrę",
|
||||
"invalid_password_hint": "Hasło musi składać się z co najmniej 7 znaków, zawierać co najmniej jedną cyfrę oraz kombinację wielkich i małych liter",
|
||||
"incorrect_password": "Hasło jest nieprawidłowe.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Potwierdź {{eventTypeTitle}} z {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Przełóż Twój {{eventTypeTitle}} z {{profileName}}",
|
||||
"in_person_meeting": "Link lub spotkanie osób",
|
||||
"attendeeInPerson": "Osobiście (adres uczestnika)",
|
||||
"inPerson": "Osobiście (adres organizatora)",
|
||||
"link_meeting": "Link do spotkania",
|
||||
"phone_call": "Numer telefonu uczestnika",
|
||||
"your_number": "Twój numer telefonu",
|
||||
"phone_number": "Numer telefonu",
|
||||
"attendee_phone_number": "Numer telefonu uczestnika",
|
||||
"organizer_phone_number": "Numer telefonu organizatora",
|
||||
"host_phone_number": "Twój numer telefonu",
|
||||
"enter_phone_number": "Podaj numer telefonu",
|
||||
"reschedule": "Przełóż",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Zbiór",
|
||||
"collective_description": "Zaplanuj spotkania, gdy wszyscy wybrani członkowie zespołu są dostępni.",
|
||||
"duration": "Czas trwania",
|
||||
"available_durations": "Dostępne czasy trwania",
|
||||
"default_duration": "Domyślny czas trwania",
|
||||
"default_duration_no_options": "Proszę najpierw wybrać dostępne czasy trwania",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minuty",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Cykl spotkań między wieloma członkami zespołu.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Drużyny",
|
||||
"team": "Zespół",
|
||||
"team_billing": "Rozliczenie zespołu",
|
||||
"team_billing_description": "Zarządzaj rozliczeniami swojego zespołu",
|
||||
"upgrade_to_flexible_pro_title": "Zmieniliśmy rozliczenie dla zespołów",
|
||||
"upgrade_to_flexible_pro_message": "W twoim zespole nie ma miejsca. Ulepsz swój plan pro aby pokryć brakujące miejsca.",
|
||||
"changed_team_billing_info": "Od stycznia 2022 r. obciążamy członków zespołu opłatami za miejsce. Członkowie zespołu, którzy mieli PRO za darmo są teraz w 14-dniowym okresie próbnym. Po wygaśnięciu okresu próbnego członkowie ci zostaną ukryci przed Twoim zespołem, chyba że ulepszysz teraz.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Ukryj typ zdarzenia",
|
||||
"edit_location": "Edytuj lokalizację",
|
||||
"into_the_future": "w przyszłość",
|
||||
"when_booked_with_less_than_notice": "W przypadku rezerwacji z wyprzedzeniem krótszym niż <time></time>",
|
||||
"within_date_range": "W zakresie dat",
|
||||
"indefinitely_into_future": "Na czas nieokreślony w przyszłości",
|
||||
"add_new_custom_input_field": "Dodaj nowe niestandardowe pole wprowadzania",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "Czy na pewno chcesz usunąć swój {{appName}}. umówić konto? Każdy, kto udostępnił link do Twojego konta, nie będzie już mógł zarezerwować za jego pomocą i wszystkie zapisane preferencje zostaną utracone.",
|
||||
"integrations": "Integracje",
|
||||
"apps": "Aplikacje",
|
||||
"apps_listing": "Informacje o aplikacji",
|
||||
"category_apps": "Aplikacje z kategorii {{category}}",
|
||||
"app_store": "Sklep App Store",
|
||||
"app_store_description": "Łączymy ludzi, technologię i miejsca pracy.",
|
||||
@@ -736,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "Przełącz kalendarze, które chcesz sprawdzić pod kątem konfliktów, aby uniknąć podwójnych rezerwacji.",
|
||||
"select_destination_calendar": "Utwórz wydarzenia na",
|
||||
"connect_additional_calendar": "Połącz dodatkowy kalendarz",
|
||||
"calendar_updated_successfully": "Kalendarz został pomyślnie zaktualizowany",
|
||||
"conferencing": "Konferencja",
|
||||
"calendar": "Kalendarz",
|
||||
"payments": "Płatności",
|
||||
@@ -768,6 +782,7 @@
|
||||
"trending_apps": "Popularne aplikacje",
|
||||
"explore_apps": "Aplikacje z kategorii {{category}}",
|
||||
"installed_apps": "Zainstalowane aplikacje",
|
||||
"free_to_use_apps": "Darmowe",
|
||||
"no_category_apps": "Brak aplikacji z kategorii {{category}}",
|
||||
"no_category_apps_description_calendar": "Dodaj aplikację kalendarza, aby wykrywać konflikty i unikać podwójnych rezerwacji",
|
||||
"no_category_apps_description_conferencing": "Dodaj aplikację konferencyjną, aby uzyskać możliwość nawiązywania połączeń wideo z klientami.",
|
||||
@@ -806,6 +821,8 @@
|
||||
"verify_wallet": "Zweryfikuj portfel",
|
||||
"connect_metamask": "Podłącz Metamask",
|
||||
"create_events_on": "Utwórz wydarzenia w",
|
||||
"enterprise_license": "To funkcja dla przedsiębiorstw",
|
||||
"enterprise_license_description": "Aby włączyć tę funkcję, uzyskaj klucz wdrożenia na konsoli {{consoleUrl}} i dodaj go do swojego pliku .env jako CALCOM_LICENSE_KEY. Jeśli Twój zespół ma już licencję, napisz na adres {{supportMail}}, aby uzyskać pomoc.",
|
||||
"missing_license": "Brakująca licencja",
|
||||
"signup_requires": "Wymagana licencja handlowa",
|
||||
"signup_requires_description": "{{companyName}} obecnie nie oferuje darmowej otwartej wersji strony rejestracji. Aby uzyskać pełny dostęp do komponentów rejestracji, musisz zdobyć licencję komercyjną. Do użytku osobistego zalecamy platformę danych Prisma lub jakikolwiek inny interfejs Postgres do tworzenia kont.",
|
||||
@@ -897,6 +914,7 @@
|
||||
"user_impersonation_heading": "Podszywanie się pod użytkownika",
|
||||
"user_impersonation_description": "Pozwala naszemu zespołowi pomocy na tymczasowe zalogowanie się jako użytkownik w celu szybkiego rozwiązania wszelkich zgłaszanych nam problemów.",
|
||||
"team_impersonation_description": "Umożliwia administratorom Twojego zespołu tymczasowe logowanie się jako Ty.",
|
||||
"allow_booker_to_select_duration": "Zezwól rezerwującemu na wybranie czasu trwania",
|
||||
"impersonate_user_tip": "Wszystkie przypadki użycia tej funkcji są kontrolowane.",
|
||||
"impersonating_user_warning": "Podszywanie się pod użytkownika „{{user}}”.",
|
||||
"impersonating_stop_instructions": "<0>Kliknij tutaj, aby zatrzymać</0>.",
|
||||
@@ -1014,6 +1032,9 @@
|
||||
"error_removing_app": "Błąd podczas usuwania aplikacji",
|
||||
"web_conference": "Konferencja internetowa",
|
||||
"requires_confirmation": "Wymaga potwierdzenia",
|
||||
"always_requires_confirmation": "Zawsze",
|
||||
"requires_confirmation_threshold": "Wymaga potwierdzenia w przypadku rezerwacji z wyprzedzeniem < {{time}} $t({{unit}}_timeUnit)",
|
||||
"may_require_confirmation": "Może wymagać potwierdzenia",
|
||||
"nr_event_type_one": "Liczba typów wydarzenia: {{count}}",
|
||||
"nr_event_type_other": "Liczba typów wydarzenia: {{count}}",
|
||||
"add_action": "Dodaj czynność",
|
||||
@@ -1101,6 +1122,9 @@
|
||||
"event_limit_tab_description": "Jak często można rezerwować Twoje usługi",
|
||||
"event_advanced_tab_description": "Ustawienia kalendarza i więcej...",
|
||||
"event_advanced_tab_title": "Zaawansowane",
|
||||
"event_setup_multiple_duration_error": "Konfiguracja wydarzeń: wiele czasów trwania wymaga co najmniej 1 opcji.",
|
||||
"event_setup_multiple_duration_default_error": "Konfiguracja wydarzenia: wybierz prawidłowy domyślny czas trwania.",
|
||||
"event_setup_booking_limits_error": "Limity rezerwacji muszą być podane w kolejności rosnącej. [dzień,tydzień,miesiąc,rok]",
|
||||
"select_which_cal": "Wybierz kalendarz, do którego chcesz dodać rezerwacje.",
|
||||
"custom_event_name": "Niestandardowa nazwa wydarzenia",
|
||||
"custom_event_name_description": "Utwórz niestandardowe nazwy wydarzeń, które będą wyświetlać się w kalendarzu wydarzeń.",
|
||||
@@ -1154,8 +1178,11 @@
|
||||
"invoices": "Faktury",
|
||||
"embeds": "Osadzenia",
|
||||
"impersonation": "Podszywanie się",
|
||||
"impersonation_description": "Ustawienia do zarządzania podszywaniem się pod użytkownika",
|
||||
"users": "Użytkownicy",
|
||||
"profile_description": "Zarządzaj ustawieniami swojego profilu {{appName}}",
|
||||
"users_description": "Tutaj znajdziesz listę wszystkich użytkowników",
|
||||
"users_listing": "Lista użytkowników",
|
||||
"general_description": "Zarządzaj ustawieniami języka i strefy czasowej.",
|
||||
"calendars_description": "Skonfiguruj sposoby interakcji typów wydarzeń z kalendarzami",
|
||||
"appearance_description": "Zarządzaj ustawieniami wyglądu rezerwacji",
|
||||
@@ -1360,6 +1387,7 @@
|
||||
"number_sms_notifications": "Numer telefonu (powiadomienia SMS)",
|
||||
"attendee_email_workflow": "Adres e-mail uczestnika",
|
||||
"attendee_email_info": "Adres e-mail osoby rezerwującej",
|
||||
"kbar_search_placeholder": "Wpisz polecenie lub wyszukaj...",
|
||||
"invalid_credential": "O nie! Wygląda na to, że uprawnienia wygasły lub zostały cofnięte. Zainstaluj aplikację ponownie.",
|
||||
"choose_common_schedule_team_event": "Wybierz wspólny harmonogram",
|
||||
"choose_common_schedule_team_event_description": "Włącz tę opcję, jeśli chcesz używać wspólnego harmonogramu gospodarzy. Jeśli ją wyłączysz, rezerwacje u każdego gospodarza będą dokonywane na podstawie jego domyślnego harmonogramu.",
|
||||
@@ -1370,5 +1398,43 @@
|
||||
"test_preview": "Przetestuj podgląd",
|
||||
"route_to": "Przekieruj do",
|
||||
"test_preview_description": "Przetestuj swój formularz przekierowania bez przesyłania jakichkolwiek danych",
|
||||
"test_routing": "Przetestuj przekierowanie"
|
||||
"test_routing": "Przetestuj przekierowanie",
|
||||
"payment_app_disabled": "Administrator wyłączył aplikację płatniczą",
|
||||
"edit_event_type": "Edytuj typ wydarzenia",
|
||||
"collective_scheduling": "Zbiorowe ustalanie harmonogramu",
|
||||
"make_it_easy_to_book": "Uprość rezerwację zespołu, gdy wszyscy są dostępni.",
|
||||
"find_the_best_person": "Znajdź najlepszą dostępną osobę i przejrzyj listę członków swojego zespołu.",
|
||||
"fixed_round_robin": "Stały algorytm karuzelowy",
|
||||
"add_one_fixed_attendee": "Dodaj jednego stałego uczestnika i przeglądaj uczestników zgodnie z algorytmem karuzelowym",
|
||||
"calcom_is_better_with_team": "Usługa Cal.com jest lepsza z zespołami",
|
||||
"add_your_team_members": "Dodaj członków zespołu do typów wydarzeń. Użyj zbiorowego ustalania harmonogramu, aby uwzględnić wszystkich, lub znajdź najodpowiedniejszą osobę za pomocą algorytmu karuzelowego.",
|
||||
"booking_limit_reached": "Osiągnięto limit rezerwacji tego typu wydarzenia",
|
||||
"admin_has_disabled": "Administrator wyłączył aplikację {{appName}}",
|
||||
"disabled_app_affects_event_type": "Administrator wyłączył aplikację {{appName}}, która ma wpływ na Twój typ wydarzenia ({{eventType}})",
|
||||
"disable_payment_app": "Administrator wyłączył aplikację {{appName}}, która ma wpływ na Twój typ wydarzenia ({{title}}). Uczestnicy nadal mogą rezerwować wydarzenie tego typu, ale nie zostaną poproszeni o płatność. Możesz ukryć ten typ wydarzenia, aby temu zapobiec, póki administrator nie uruchomi ponownie Twojej metody płatności.",
|
||||
"payment_disabled_still_able_to_book": "Uczestnicy nadal mogą rezerwować wydarzenie tego typu, ale nie zostaną poproszeni o płatność. Możesz ukryć ten typ wydarzenia, aby temu zapobiec, póki administrator nie uruchomi ponownie Twojej metody płatności.",
|
||||
"app_disabled_with_event_type": "Administrator wyłączył aplikację {{appName}}, która ma wpływ na Twój typ wydarzenia ({{title}}).",
|
||||
"app_disabled_video": "Administrator wyłączył aplikację {{appName}}, która może mieć wpływ na Twoje typy wydarzeń. Jeśli masz typy wydarzeń z aplikacją {{appName}} jako lokalizacją, domyślnym wyborem będzie wideo w usłudze Cal.",
|
||||
"app_disabled_subject": "Aplikacja {{appName}} została wyłączona",
|
||||
"navigate_installed_apps": "Przejdź do zainstalowanych aplikacji",
|
||||
"disabled_calendar": "Jeśli masz zainstalowany inny kalendarz, nowe rezerwacje zostaną dodane do niego. Jeśli nie, podłącz nowy kalendarz, aby nie przegapić żadnych nowych rezerwacji.",
|
||||
"enable_apps": "Włącz aplikacje",
|
||||
"enable_apps_description": "Włącz aplikacje, które użytkownicy mogą zintegrować z usługą Cal.com",
|
||||
"app_is_enabled": "Aplikacja {{appName}} jest włączona",
|
||||
"app_is_disabled": "Aplikacja {{appName}} jest wyłączona",
|
||||
"keys_have_been_saved": "Klucze zostały zapisane",
|
||||
"disable_app": "Wyłącz aplikację",
|
||||
"disable_app_description": "Wyłączenie tej aplikacji może spowodować problemy z korzystaniem z usługi Cal dla Twoich użytkowników",
|
||||
"edit_keys": "Edytuj klucze",
|
||||
"no_available_apps": "Brak dostępnych aplikacji",
|
||||
"no_available_apps_description": "Upewnij się, że w Twoim wdrożeniu w folderze „packages/app-store” znajdują są aplikacje.",
|
||||
"no_apps": "W tym wystąpieniu usługi Cal nie ma włączonych aplikacji",
|
||||
"apps_settings": "Ustawienia aplikacji",
|
||||
"fill_this_field": "Wypełnij to pole",
|
||||
"options": "Opcje",
|
||||
"enter_option": "Wprowadź opcję {{index}}",
|
||||
"add_an_option": "Dodaj opcję",
|
||||
"radio": "Przycisk radiowy",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-kopia",
|
||||
"set_as_default": "Ustaw jako domyślne"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Um evento ainda aguarda aprovação",
|
||||
"event_is_still_waiting": "Solicitação de evento pendente: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Não existem mais resultados",
|
||||
"no_results": "Nenhum resultado",
|
||||
"load_more_results": "Carregar mais resultados",
|
||||
"integration_meeting_id": "ID da reunião de {{integrationName}}: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Confirmado: {{eventType}} com {{name}} em {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Adicionar ao calendário",
|
||||
"add_another_calendar": "Adicionar outro calendário",
|
||||
"other": "Outras",
|
||||
"email_sign_in_subject": "Seu link de login para {{appName}}",
|
||||
"emailed_you_and_attendees": "Enviamos um email para você e para os outros participantes com um convite de calendário com todos os detalhes.",
|
||||
"emailed_you_and_attendees_recurring": "Enviamos um e-mail para você e para os outros participantes com um convite de calendário para o primeiro desses eventos recorrentes.",
|
||||
"emailed_you_and_any_other_attendees": "Esta informação foi enviada para você e para todos os outros participantes.",
|
||||
@@ -464,11 +466,14 @@
|
||||
"booking_confirmation": "Confirme seu {{eventTypeTitle}} com {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Reagende seu {{eventTypeTitle}} com {{profileName}}",
|
||||
"in_person_meeting": "Reunião presencial",
|
||||
"attendeeInPerson": "Pessoalmente (endereço do participante)",
|
||||
"inPerson": "Pessoalmente (endereço do organizador)",
|
||||
"link_meeting": "Vincular reunião",
|
||||
"phone_call": "Número de telefone do participante",
|
||||
"your_number": "Seu número de telefone",
|
||||
"phone_number": "Número de Telefone",
|
||||
"attendee_phone_number": "Número de telefone do participante",
|
||||
"organizer_phone_number": "Número de telefone do organizador",
|
||||
"host_phone_number": "Seu número de telefone",
|
||||
"enter_phone_number": "Digite o número de telefone",
|
||||
"reschedule": "Reagendar",
|
||||
@@ -555,6 +560,10 @@
|
||||
"collective": "Coletivo",
|
||||
"collective_description": "Agende reuniões quando todos os membros selecionados do time estiverem disponíveis.",
|
||||
"duration": "Duração",
|
||||
"available_durations": "Durações disponíveis",
|
||||
"default_duration": "Duração padrão",
|
||||
"default_duration_no_options": "Escolha as durações disponíveis primeiro",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minutos",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Reuniões recorrentes entre vários membros da equipe.",
|
||||
@@ -620,6 +629,7 @@
|
||||
"teams": "Times",
|
||||
"team": "Equipe",
|
||||
"team_billing": "Cobrança da equipe",
|
||||
"team_billing_description": "Gerenciar cobrança para sua equipe",
|
||||
"upgrade_to_flexible_pro_title": "Alteramos a cobrança para equipes",
|
||||
"upgrade_to_flexible_pro_message": "Há membros da sua equipe que não têm assento. Atualize para o plano Pro para incluir os assentos faltando.",
|
||||
"changed_team_billing_info": "A partir de janeiro de 2022, a cobrança dos membros de equipe será realizada por assento. Os membros da sua equipe que tinham o plano PRO gratuito receberam um teste de 14 dias. Ao fim do teste, eles serão ocultos da sua equipe, a não ser que você atualize agora.",
|
||||
@@ -695,6 +705,7 @@
|
||||
"hide_event_type": "Ocultar Tipo de Evento",
|
||||
"edit_location": "Editar Localização",
|
||||
"into_the_future": "no futuro",
|
||||
"when_booked_with_less_than_notice": "Reserva feita com menos de <time></time> de antecedência",
|
||||
"within_date_range": "Dentro de um período",
|
||||
"indefinitely_into_future": "Indefinidamente no futuro",
|
||||
"add_new_custom_input_field": "Adicionar novo campo personalizado",
|
||||
@@ -714,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "Você tem certeza de que deseja apagar sua conta {{appName}}? Qualquer pessoa que você compartilhou seu link de reservas não poderá mais utilizá-lo para agendar novos eventos e todas as suas preferências serão perdidas.",
|
||||
"integrations": "Integrações",
|
||||
"apps": "Apps",
|
||||
"apps_listing": "Listagem de aplicativos",
|
||||
"category_apps": "Aplicativos de {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Conectando pessoas, tecnologia e o ambiente de trabalho.",
|
||||
@@ -737,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "Ative/desative os calendários que você quiser para verificar conflitos e evitar reservas repetidas.",
|
||||
"select_destination_calendar": "Criar eventos em",
|
||||
"connect_additional_calendar": "Conectar calendário adicional",
|
||||
"calendar_updated_successfully": "Calendário atualizado com êxito",
|
||||
"conferencing": "Conferência",
|
||||
"calendar": "Calendário",
|
||||
"payments": "Pagamentos",
|
||||
@@ -769,6 +782,7 @@
|
||||
"trending_apps": "Apps em alta",
|
||||
"explore_apps": "{{category}} aplicativos",
|
||||
"installed_apps": "Apps instalados",
|
||||
"free_to_use_apps": "Grátis",
|
||||
"no_category_apps": "Sem aplicativos de {{category}}",
|
||||
"no_category_apps_description_calendar": "Adicione um aplicativo de calendário para verificar se há conflitos para evitar agendamentos duplos",
|
||||
"no_category_apps_description_conferencing": "Tente adicionar um aplicativo de conferência para integrar chamadas de vídeo com seus clientes",
|
||||
@@ -807,6 +821,8 @@
|
||||
"verify_wallet": "Verificar carteira",
|
||||
"connect_metamask": "Conecte o Metamask",
|
||||
"create_events_on": "Criar eventos em",
|
||||
"enterprise_license": "Este não é um recurso corporativo",
|
||||
"enterprise_license_description": "Para ativar este recurso, obtenha uma chave de desenvolvimento no console {{consoleUrl}} e adicione ao seu .env como CALCOM_LICENSE_KEY. Caso sua equipe já tenha uma licença, entre em contato com {{supportMail}} para obter ajuda.",
|
||||
"missing_license": "Falta a licença",
|
||||
"signup_requires": "Licença comercial obrigatória",
|
||||
"signup_requires_description": "Atualmente a {{companyName}} não oferece nenhuma versão gratuita de código aberto da página de inscrição. Para obter acesso completo aos componentes da inscrição, você precisa adquirir uma licença comercial. Para uso pessoal, recomendamos o Prisma Data Platform ou outras interfaces em Postgres para criação de contas.",
|
||||
@@ -898,6 +914,7 @@
|
||||
"user_impersonation_heading": "Representação do usuário",
|
||||
"user_impersonation_description": "Permite que a nossa equipe de suporte entre temporariamente como você para ajudar a resolver rapidamente os problemas relatados.",
|
||||
"team_impersonation_description": "Permite que os administradores da sua equipe façam login como você.",
|
||||
"allow_booker_to_select_duration": "Permitir que o reservante selecione a duração",
|
||||
"impersonate_user_tip": "Todos os usos desse recurso são auditados.",
|
||||
"impersonating_user_warning": "Representando o nome de usuário \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>Clique aqui para parar</0>.",
|
||||
@@ -1015,6 +1032,9 @@
|
||||
"error_removing_app": "Erro ao remover o aplicativo",
|
||||
"web_conference": "Conferência via web",
|
||||
"requires_confirmation": "Requer confirmação",
|
||||
"always_requires_confirmation": "Sempre",
|
||||
"requires_confirmation_threshold": "Requer confirmação caso a reserva seja feita com menos de {{time}} $t({{unit}}_timeUnit) de antecedência",
|
||||
"may_require_confirmation": "Pode exigir confirmação",
|
||||
"nr_event_type_one": "{{count}} tipo de evento",
|
||||
"nr_event_type_other": "{{count}} tipos de evento",
|
||||
"add_action": "Adicionar ação",
|
||||
@@ -1102,6 +1122,9 @@
|
||||
"event_limit_tab_description": "Com que frequência você pode receber reserva",
|
||||
"event_advanced_tab_description": "Configurações de calendário e muito mais...",
|
||||
"event_advanced_tab_title": "Avançado",
|
||||
"event_setup_multiple_duration_error": "Configuração do evento: múltiplas durações requerem pelo menos uma opção.",
|
||||
"event_setup_multiple_duration_default_error": "Configuração de evento: selecione uma duração padrão válida.",
|
||||
"event_setup_booking_limits_error": "Limites de reserva devem estar em ordem crescente. [dia, semana, mês, ano,]",
|
||||
"select_which_cal": "Selecione para qual calendário adicionar reservas",
|
||||
"custom_event_name": "Nome de evento personalizado",
|
||||
"custom_event_name_description": "Criar nomes de eventos personalizados para exibir no evento do calendário",
|
||||
@@ -1155,8 +1178,11 @@
|
||||
"invoices": "Faturas",
|
||||
"embeds": "Incorporados",
|
||||
"impersonation": "Representação",
|
||||
"impersonation_description": "Configurações para gerenciar representação de usuário",
|
||||
"users": "Usuários",
|
||||
"profile_description": "Gerencie as configurações para o seu perfil {{appName}}",
|
||||
"users_description": "Aqui você poderá encontrar uma lista de todos os usuários",
|
||||
"users_listing": "Listagem de usuários",
|
||||
"general_description": "Gerencie as configurações para seu idioma e fuso horário",
|
||||
"calendars_description": "Configure como seus tipos de evento interagem com seus calendários",
|
||||
"appearance_description": "Gerencie as configurações da aparência da sua reserva",
|
||||
@@ -1361,6 +1387,7 @@
|
||||
"number_sms_notifications": "Número de telefone (notificações de SMS)",
|
||||
"attendee_email_workflow": "E-mail do participante",
|
||||
"attendee_email_info": "O e-mail da pessoa que fez a reserva",
|
||||
"kbar_search_placeholder": "Digite um comando ou procure...",
|
||||
"invalid_credential": "Ah, não! Parece que a permissão expirou ou foi revogada. Reinstale novamente.",
|
||||
"choose_common_schedule_team_event": "Escolha uma agenda compartilhada",
|
||||
"choose_common_schedule_team_event_description": "Ative esta opção se você quiser usar uma agenda compartilhada entre os hosts. Ao desativar esta opção, cada host será reservado conforme seu horário padrão.",
|
||||
@@ -1371,5 +1398,43 @@
|
||||
"test_preview": "Visualizar teste",
|
||||
"route_to": "Direcionar para",
|
||||
"test_preview_description": "Teste seu formulário de roteamento sem enviar dados",
|
||||
"test_routing": "Testar roteamento"
|
||||
"test_routing": "Testar roteamento",
|
||||
"payment_app_disabled": "Um administrador desativou um aplicativo de pagamento",
|
||||
"edit_event_type": "Editar tipo de evento",
|
||||
"collective_scheduling": "Programação coletiva",
|
||||
"make_it_easy_to_book": "Facilite a reserva da sua equipe quando todos estiverem disponíveis.",
|
||||
"find_the_best_person": "Encontre a pessoa mais indicada disponível e percorra sua equipe.",
|
||||
"fixed_round_robin": "Round-robin fixo",
|
||||
"add_one_fixed_attendee": "Adicione um participante fixo e utilize o round-robin em uma determinada quantidade de participantes.",
|
||||
"calcom_is_better_with_team": "Cal.com é melhor com equipes",
|
||||
"add_your_team_members": "Adicione membros da sua equipe ao seus tipos de evento. Use programação coletiva para incluir todos ou encontre a pessoa mais apropriada pela programação com round-robin.",
|
||||
"booking_limit_reached": "O limite de reseva para este tipo de evento foi atingido",
|
||||
"admin_has_disabled": "Um administrador desativou {{appName}}",
|
||||
"disabled_app_affects_event_type": "Um administrador desativou {{appName}}, afetando seu tipo de evento {{eventType}}",
|
||||
"disable_payment_app": "O administrador desativou {{appName}}, afetando o seu tipo de evento {{title}}. Os participantes ainda poderão reservar este tipo de evento, mas não será solicitado pagamento. Você poderá ocultar o tipo de evento para impedir isso até o adiministrador reativar seu método de pagamento.",
|
||||
"payment_disabled_still_able_to_book": "Os participantes ainda poderão reservar este tipo de evento, mas não será solicitado pagamento. Você poderá ocultar o tipo de evento para impedir isso até o adiministrador reativar seu método de pagamento.",
|
||||
"app_disabled_with_event_type": "O administrador desativou {{appName}}, afetando seu tipo de evento {{title}}.",
|
||||
"app_disabled_video": "O administrador desativou {{appName}}, afetando seus tipos de evento. Se você tiver tipos de evento com {{appName}} como localização, o vídeo do Cal será definido como padrão.",
|
||||
"app_disabled_subject": "{{appName}} foi desativado",
|
||||
"navigate_installed_apps": "Ir para aplicativos instalados",
|
||||
"disabled_calendar": "Se você tiver outro calendário instalado, novas reservas serão adicionadas a ele. Caso contrário, conecte um novo calendário para não perder novas reservas.",
|
||||
"enable_apps": "Ativar aplicativos",
|
||||
"enable_apps_description": "Ative aplicativos que os usuários possam integrar com o Cal.com",
|
||||
"app_is_enabled": "{{appName}} foi ativado",
|
||||
"app_is_disabled": "{{appName}} foi desativado",
|
||||
"keys_have_been_saved": "As chaves foram salvas",
|
||||
"disable_app": "Desativar aplicativo",
|
||||
"disable_app_description": "Desativar este aplicativo pode causar problemas para a interação dos usuários com o Cal",
|
||||
"edit_keys": "Editar chaves",
|
||||
"no_available_apps": "Não há aplicativos disponíveis",
|
||||
"no_available_apps_description": "Verifique se há aplicativos na sua implantação, em \"packages/app-store\"",
|
||||
"no_apps": "Não há aplicativos ativados nesta instância do Cal",
|
||||
"apps_settings": "Configurações do app",
|
||||
"fill_this_field": "Preencha este campo",
|
||||
"options": "Opções",
|
||||
"enter_option": "insira a opção {{index}}",
|
||||
"add_an_option": "Adicionar uma opção",
|
||||
"radio": "Rádio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-cópia",
|
||||
"set_as_default": "Definir como padrão"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Um evento ainda aguarda aprovação",
|
||||
"event_is_still_waiting": "Pedido de evento pendente: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Não existem mais resultados",
|
||||
"no_results": "Sem resultados",
|
||||
"load_more_results": "Carregar mais resultados",
|
||||
"integration_meeting_id": "ID da reunião de {{integrationName}}: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Confirmado: {{eventType}} com {{name}} em {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Adicionar ao calendário",
|
||||
"add_another_calendar": "Adicionar outro calendário",
|
||||
"other": "Outras",
|
||||
"email_sign_in_subject": "A sua ligação de início de sessão para {{appName}}",
|
||||
"emailed_you_and_attendees": "Enviámos um email para si e para os outros participantes com um convite de calendário com todos os detalhes.",
|
||||
"emailed_you_and_attendees_recurring": "Enviámos um email para si e para os outros participantes com um convite de calendário para o primeiro destes eventos recorrentes.",
|
||||
"emailed_you_and_any_other_attendees": "Esta informação foi enviada para si e para todos os outros participantes.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "A senha atual está incorreta",
|
||||
"password_hint_caplow": "Mistura de letras maiúsculas e minúsculas",
|
||||
"password_hint_min": "Tamanho mínimo de 7 caracteres",
|
||||
"password_hint_admin_min": "Tamanho mínimo de 15 caracteres",
|
||||
"password_hint_num": "Contém pelo menos 1 número",
|
||||
"invalid_password_hint": "A palavra-passe deve ter no mínimo 7 caracteres, com pelo menos um número e uma mistura de letras maiúsculas e minúsculas",
|
||||
"incorrect_password": "Palavra-Passe incorreta",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Confirme o seu {{eventTypeTitle}} com {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Reagende o seu {{eventTypeTitle}} com {{profileName}}",
|
||||
"in_person_meeting": "Ligação ou reunião presencial",
|
||||
"attendeeInPerson": "Pessoalmente (endereço do participante)",
|
||||
"inPerson": "Pessoalmente (endereço do organizador)",
|
||||
"link_meeting": "Ligar reunião",
|
||||
"phone_call": "Número de telefone do participante",
|
||||
"your_number": "O seu número de telefone",
|
||||
"phone_number": "Número de Telefone",
|
||||
"attendee_phone_number": "Número de telefone do participante",
|
||||
"organizer_phone_number": "Número de telefone do organizador",
|
||||
"host_phone_number": "O seu número de telefone",
|
||||
"enter_phone_number": "Inserir Número do Telefone",
|
||||
"reschedule": "Reagendar",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Coletivo",
|
||||
"collective_description": "Agende reuniões quando todos os membros selecionados da equipa estiverem disponíveis.",
|
||||
"duration": "Duração",
|
||||
"available_durations": "Durações disponíveis",
|
||||
"default_duration": "Duração predefinida",
|
||||
"default_duration_no_options": "Por favor, selecione primeiro as durações disponíveis",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minutos",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Reuniões de ciclo entre vários membros da equipa.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Equipas",
|
||||
"team": "Equipa",
|
||||
"team_billing": "Facturação da equipa",
|
||||
"team_billing_description": "Gerir a faturação para a sua equipa",
|
||||
"upgrade_to_flexible_pro_title": "Alterámos os termos de facturação",
|
||||
"upgrade_to_flexible_pro_message": "Há membros sem lugar na sua equipa. Actualize para o plano Pro para cobrir os lugares em falta.",
|
||||
"changed_team_billing_info": "Desde Janeiro de 2022 a cobrança é efectuada por cada lugar de membro da equipa. Os membros da sua equipa que tivessem a versão Pro gratuitamente, estão agora num período experimental de 14 dias. Assim que este período expirar, estes membros ficarão ocultos da sua equipa, a menos que actualize agora.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Ocultar Tipo de Evento",
|
||||
"edit_location": "Editar Localização",
|
||||
"into_the_future": "no futuro",
|
||||
"when_booked_with_less_than_notice": "Quando reservado com aviso prévio inferior a <time></time>",
|
||||
"within_date_range": "Dentro de um período",
|
||||
"indefinitely_into_future": "Indefinidamente para o futuro",
|
||||
"add_new_custom_input_field": "Adicionar novo campo personalizado",
|
||||
@@ -713,6 +725,8 @@
|
||||
"delete_account_confirmation_message": "De certeza que quer eliminar a sua conta {{appName}}? Qualquer pessoa com quem tenha partilhado esta ligação de equipa deixará de poder fazer reservas através da respetiva ligação, e quaisquer preferências que tenha guardado serão perdidas.",
|
||||
"integrations": "Integrações",
|
||||
"apps": "Aplicações",
|
||||
"apps_description": "Ativar aplicações para a sua instância do Cal",
|
||||
"apps_listing": "Lista de aplicações",
|
||||
"category_apps": "Aplicações de {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Ligar pessoas, tecnologia e o local de trabalho.",
|
||||
@@ -736,6 +750,7 @@
|
||||
"toggle_calendars_conflict": "Escolha os calendários que deseja verificar para evitar conflitos e duplicação de reservas.",
|
||||
"select_destination_calendar": "Criar eventos em",
|
||||
"connect_additional_calendar": "Ligar um calendário adicional",
|
||||
"calendar_updated_successfully": "Calendário atualizado com sucesso",
|
||||
"conferencing": "Conferência",
|
||||
"calendar": "Calendário",
|
||||
"payments": "Pagamentos",
|
||||
@@ -768,6 +783,7 @@
|
||||
"trending_apps": "Aplicações em destaque",
|
||||
"explore_apps": "Aplicações de {{category}}",
|
||||
"installed_apps": "Aplicações instaladas",
|
||||
"free_to_use_apps": "Grátis",
|
||||
"no_category_apps": "Sem aplicações de {{category}}",
|
||||
"no_category_apps_description_calendar": "Adicione uma aplicação de calendário para verificar se existem conflitos e assim evitar sobreposição de marcações",
|
||||
"no_category_apps_description_conferencing": "Experimente adicionar uma aplicação de conferência para integrar chamadas de vídeo com os seus clientes",
|
||||
@@ -806,6 +822,8 @@
|
||||
"verify_wallet": "Verificar carteira",
|
||||
"connect_metamask": "Ligar Metamask",
|
||||
"create_events_on": "Criar eventos em:",
|
||||
"enterprise_license": "Esta é uma funcionalidade empresarial",
|
||||
"enterprise_license_description": "Para ativar esta funcionalidade, obtenha uma chave de instalação na consola {{consoleUrl}} e adicione-a ao seu .env como CALCOM_LICENSE_KEY. Se a sua equipa já tem uma licença, entre em contacto com {{supportMail}} para obter ajuda.",
|
||||
"missing_license": "Licença em falta",
|
||||
"signup_requires": "Necessita de licença comercial",
|
||||
"signup_requires_description": "De momento a {{companyName}} não oferece uma versão gratuita de código aberto da página de registo. Para aceder completamente aos componentes de registo tem de adquirir uma licença comercial. Para uso pessoal, recomendamos a Prisma Data Platform ou qualquer outra interface Postgres para criar contas.",
|
||||
@@ -897,6 +915,7 @@
|
||||
"user_impersonation_heading": "Representação de utilizador",
|
||||
"user_impersonation_description": "Permite à nossa equipa de suporte iniciar sessão temporariamente em seu nome para rapidamente resolver quaisquer erros que nos reporte.",
|
||||
"team_impersonation_description": "Permite que os administradores da sua equipa iniciem a sessão temporariamente em seu nome.",
|
||||
"allow_booker_to_select_duration": "Permitir que o responsável pela reserva selecione a duração",
|
||||
"impersonate_user_tip": "Todas as utilizações desta funcionalidade são auditadas.",
|
||||
"impersonating_user_warning": "Representar o nome de utilizador \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>Clique aqui para parar</0>.",
|
||||
@@ -1014,6 +1033,9 @@
|
||||
"error_removing_app": "Erro ao remover a aplicação",
|
||||
"web_conference": "Conferência web",
|
||||
"requires_confirmation": "Requer confirmação",
|
||||
"always_requires_confirmation": "Sempre",
|
||||
"requires_confirmation_threshold": "Requer confirmação se reservado com um aviso prévio inferior a {{time}} $t({{unit}}_timeUnit)",
|
||||
"may_require_confirmation": "Pode necessitar de confirmação",
|
||||
"nr_event_type_one": "{{count}} tipo de evento",
|
||||
"nr_event_type_other": "{{count}} tipos de evento",
|
||||
"add_action": "Adicionar acção",
|
||||
@@ -1101,6 +1123,9 @@
|
||||
"event_limit_tab_description": "Com que frequência pode ser reservado",
|
||||
"event_advanced_tab_description": "Definições do calendário e muito mais...",
|
||||
"event_advanced_tab_title": "Avançado",
|
||||
"event_setup_multiple_duration_error": "Configuração do evento: durações múltiplas requerem pelo menos 1 opção.",
|
||||
"event_setup_multiple_duration_default_error": "Configuração do evento: por favor, selecione uma duração predefinida válida.",
|
||||
"event_setup_booking_limits_error": "Os limites de reserva devem estar ordenados de forma ascendente. [dia,semana,mês,ano]",
|
||||
"select_which_cal": "Selecione para que calendário devem ser adicionadas as marcações",
|
||||
"custom_event_name": "Nome de evento personalizado",
|
||||
"custom_event_name_description": "Crie nomes de eventos personalizados a mostrar no calendário de eventos",
|
||||
@@ -1154,8 +1179,11 @@
|
||||
"invoices": "Faturas",
|
||||
"embeds": "Incorporações",
|
||||
"impersonation": "Representação",
|
||||
"impersonation_description": "Definições para gerir a personificação de utilizadores",
|
||||
"users": "Utilizadores",
|
||||
"profile_description": "Gerir as definições para o seu perfil {{appName}}",
|
||||
"users_description": "Aqui pode encontrar uma lista de todos os utilizadores",
|
||||
"users_listing": "Lista de utilizadores",
|
||||
"general_description": "Faça a gestão das definições do seu idioma e fuso horário",
|
||||
"calendars_description": "Configure como os tipos de evento devem interagir com os seus calendários",
|
||||
"appearance_description": "Faça a gestão das definições de aparência da sua reserva",
|
||||
@@ -1360,6 +1388,7 @@
|
||||
"number_sms_notifications": "Número de telefone (notificações SMS)",
|
||||
"attendee_email_workflow": "E-mail do participante",
|
||||
"attendee_email_info": "O e-mail do responsável pela reserva",
|
||||
"kbar_search_placeholder": "Digite um comando ou pesquise...",
|
||||
"invalid_credential": "Oh não! Parece que a permissão expirou ou foi revogada. Por favor, reinstale novamente.",
|
||||
"choose_common_schedule_team_event": "Escolha uma agenda comum",
|
||||
"choose_common_schedule_team_event_description": "Ative esta opção se quiser utilizar uma agenda comum entre anfitriões. Quando desativada, cada anfitrião será reservado com base na respetiva agenda pré-definida.",
|
||||
@@ -1370,5 +1399,44 @@
|
||||
"test_preview": "Pré-visualização do teste",
|
||||
"route_to": "Encaminhar para",
|
||||
"test_preview_description": "Teste o encaminhamento do seu formulário sem submeter qualquer dado",
|
||||
"test_routing": "Testar encaminhamento"
|
||||
"test_routing": "Testar encaminhamento",
|
||||
"payment_app_disabled": "Um administrador desativou uma aplicação de pagamentos",
|
||||
"edit_event_type": "Editar o tipo de evento",
|
||||
"collective_scheduling": "Agendamento coletivo",
|
||||
"make_it_easy_to_book": "Faça com que seja simples reservar a sua equipa quando todos estiverem disponíveis.",
|
||||
"find_the_best_person": "Encontre a melhor pessoa disponível e navegue na sua equipa.",
|
||||
"fixed_round_robin": "Distribuição equilibrada fixa",
|
||||
"add_one_fixed_attendee": "Adicione um participante fixo e distribua de forma equilibrada a partir de um número de participantes.",
|
||||
"calcom_is_better_with_team": "O Cal.com é melhor com equipas",
|
||||
"add_your_team_members": "Adicione os membros da sua equipa aos seus tipos de eventos. Utilize o agendamento coletivo para incluir todos os membros ou encontre a pessoa mais adequada com o agendamento baseado numa distribuição equilibrada.",
|
||||
"booking_limit_reached": "O limite de reservas para este tipo de evento foi atingido",
|
||||
"admin_has_disabled": "{{appName}} foi desativada por um administrador",
|
||||
"disabled_app_affects_event_type": "{{appName}} foi desativada por um administrador o que afeta o seu tipo de evento {{eventType}}",
|
||||
"disable_payment_app": "O administrador desativou {{appName}} o que afeta o seu tipo de evento {{title}}. Os participantes ainda poderão reservar este tipo de evento, mas não será solicitado que façam qualquer pagamento. Pode ocultar o tipo de evento para evitar esta situação, até que o seu administrador reative o seu método de pagamento.",
|
||||
"payment_disabled_still_able_to_book": "Os participantes ainda poderão reservar este tipo de evento, mas não será solicitado que façam qualquer pagamento. Pode ocultar o tipo de evento para evitar esta situação, até que o seu administrador reative o seu método de pagamento.",
|
||||
"app_disabled_with_event_type": "O administrador desativou {{appName}} o que afeta o seu tipo de evento {{title}}.",
|
||||
"app_disabled_video": "O administrador desativou {{appName}} o que afeta os seus tipos de eventos. Se tiver tipos de eventos com {{appName}} como o sítio, então o mesmo será predefinido para o Cal Video.",
|
||||
"app_disabled_subject": "{{appName}} foi desativada",
|
||||
"navigate_installed_apps": "Ir para as aplicações instaladas",
|
||||
"disabled_calendar": "Se tiver outro calendário instalado, os novos pedidos serão adicionados ao mesmo. Se não é este o caso, deve associar um novo calendário para garantir que não perde novas reservas.",
|
||||
"enable_apps": "Ativar aplicações",
|
||||
"enable_apps_description": "Ativar aplicações que os utilizadores podem integrar com o Cal.com",
|
||||
"app_is_enabled": "{{appName}} foi ativada",
|
||||
"app_is_disabled": "{{appName}} foi desativada",
|
||||
"keys_have_been_saved": "As chaves foram guardadas",
|
||||
"disable_app": "Desativar a aplicação",
|
||||
"disable_app_description": "A desativação desta aplicação pode causar problemas na forma como os seus utilizadores interagem com o Cal",
|
||||
"edit_keys": "Editar chaves",
|
||||
"admin_apps_description": "Ativar aplicações para a sua instância do Cal",
|
||||
"no_available_apps": "Não existem aplicações disponíveis",
|
||||
"no_available_apps_description": "Por favor, certifique-se que existem aplicações na sua instalação em 'packages/app-store'",
|
||||
"no_apps": "Não existem aplicações ativas nesta instância do Cal",
|
||||
"apps_settings": "Definições de aplicações",
|
||||
"fill_this_field": "Por favor, preencha este campo",
|
||||
"options": "Opções",
|
||||
"enter_option": "Insira a opção {{index}}",
|
||||
"add_an_option": "Adicione uma opção",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-copia",
|
||||
"set_as_default": "Predefinir"
|
||||
}
|
||||
|
||||
@@ -714,6 +714,7 @@
|
||||
"delete_account_confirmation_message": "Sigur doriți să vă ștergeți contul {{appName}}? Persoanele cărora le-ați transmis linkul contului dvs. nu vor mai putea rezerva folosindu-l și orice preferințe pe care le-ați salvat se vor pierde.",
|
||||
"integrations": "Integrări",
|
||||
"apps": "Aplicații",
|
||||
"apps_listing": "Listare aplicații",
|
||||
"category_apps": " Aplicații {{category}}",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Creăm conexiuni între oameni, tehnologii și locuri de muncă.",
|
||||
@@ -1102,6 +1103,7 @@
|
||||
"event_limit_tab_description": "Cât de des puteți fi rezervat",
|
||||
"event_advanced_tab_description": "Setări calendar și mai multe...",
|
||||
"event_advanced_tab_title": "Avansat",
|
||||
"event_setup_booking_limits_error": "Limitele de rezervare trebuie să fie în ordine crescătoare. [zi,săptămână,lună,an]",
|
||||
"select_which_cal": "Alegeți la ce calendar se adaugă rezervările",
|
||||
"custom_event_name": "Nume eveniment personalizat",
|
||||
"custom_event_name_description": "Creați nume de evenimente personalizate pentru a fi afișate pe evenimentul calendarului",
|
||||
@@ -1372,5 +1374,9 @@
|
||||
"route_to": "Direcționați către",
|
||||
"test_preview_description": "Testați-vă formularul de redirecționare fără a trimite date",
|
||||
"test_routing": "Testați redirecționarea",
|
||||
"booking_limit_reached": "A fost atinsă limita de rezervare pentru acest tip de eveniment"
|
||||
"find_the_best_person": "Găsește cea mai bună persoană disponibilă și treci succesiv prin membrii echipei tale.",
|
||||
"booking_limit_reached": "A fost atinsă limita de rezervare pentru acest tip de eveniment",
|
||||
"keys_have_been_saved": "Cheile au fost salvate",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-copie"
|
||||
}
|
||||
|
||||
@@ -555,6 +555,7 @@
|
||||
"collective": "Коллективная встреча",
|
||||
"collective_description": "Расписание встреч, когда доступны все выбранные члены команды.",
|
||||
"duration": "Продолжительность",
|
||||
"available_durations": "Доступные сроки",
|
||||
"minutes": "мин.",
|
||||
"round_robin": "По кругу",
|
||||
"round_robin_description": "Цикл встреч между несколькими членами команды.",
|
||||
@@ -714,6 +715,7 @@
|
||||
"delete_account_confirmation_message": "Вы уверены, что хотите удалить свой {{appName}}-аккаунт? Любой, кто имеет ссылку на вашу учетную запись, больше не сможет забронировать встречу, и сохраненные настройки будут потеряны.",
|
||||
"integrations": "Интеграции",
|
||||
"apps": "Приложения",
|
||||
"apps_listing": "Список приложений",
|
||||
"category_apps": "Приложения в категории «{{category}}»",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Соединяя людей, технологии и рабочие места.",
|
||||
@@ -769,6 +771,7 @@
|
||||
"trending_apps": "Популярные приложения",
|
||||
"explore_apps": "Приложения в категории «{{category}}»",
|
||||
"installed_apps": "Установленные приложения",
|
||||
"free_to_use_apps": "Бесплатные",
|
||||
"no_category_apps": "Нет приложений в категории «{{category}}»",
|
||||
"no_category_apps_description_calendar": "Добавьте приложение календаря, чтобы проверять наличие конфликтов для избежания двойного бронирования",
|
||||
"no_category_apps_description_conferencing": "Попробуйте добавить приложение конференц-связи для интеграции видеозвонков с клиентами",
|
||||
@@ -807,6 +810,7 @@
|
||||
"verify_wallet": "Подтвердить кошелек",
|
||||
"connect_metamask": "Подключить Metamask",
|
||||
"create_events_on": "Создавать события в календаре:",
|
||||
"enterprise_license_description": "Чтобы включить эту функцию, получите ключ развертывания на консоли {{consoleUrl}} и добавьте его в .env как CALCOM_LICENSE_KEY. Если у вашей команды уже есть лицензия, пожалуйста, обратитесь за помощью в {{supportMail}}.",
|
||||
"missing_license": "Отсутствует лицензия",
|
||||
"signup_requires": "Требуется коммерческая лицензия",
|
||||
"signup_requires_description": "В настоящее время компания {{companyName}} не предлагает бесплатную версию страницы регистрации с открытым исходным кодом. Чтобы получить полный доступ к компонентам входа в систему, необходимо приобрести коммерческую лицензию. Для личного пользования мы рекомендуем Prisma Data Platform или любой другой интерфейс Postgres для создания учетных записей.",
|
||||
@@ -1102,6 +1106,7 @@
|
||||
"event_limit_tab_description": "Как часто можно забронировать для вас событие",
|
||||
"event_advanced_tab_description": "Настройки календаря и ещё...",
|
||||
"event_advanced_tab_title": "Расширенные",
|
||||
"event_setup_booking_limits_error": "Лимиты бронирования должны указываться по возрастанию [день, неделя, месяц, год].",
|
||||
"select_which_cal": "Выберите, в какой календарь добавить бронирование",
|
||||
"custom_event_name": "Пользовательское имя события",
|
||||
"custom_event_name_description": "Создавайте пользовательские названия событий, которые будут отображаться в событии в календаре",
|
||||
@@ -1157,6 +1162,7 @@
|
||||
"impersonation": "Разрешить вход под вашим именем",
|
||||
"users": "Пользователи",
|
||||
"profile_description": "Настройка вашего профиля в {{appName}}",
|
||||
"users_listing": "Список пользователей",
|
||||
"general_description": "Настройте язык и часовой пояс",
|
||||
"calendars_description": "Настройка взаимодействия типов событий с календарями",
|
||||
"appearance_description": "Настройка внешнего вида страниц бронирования",
|
||||
@@ -1372,5 +1378,18 @@
|
||||
"route_to": "Цель маршрута",
|
||||
"test_preview_description": "Проверить форму маршрутизации без отправки данных",
|
||||
"test_routing": "Проверить машрутизацию",
|
||||
"booking_limit_reached": "Достигнут лимит бронирования для этого типа события"
|
||||
"find_the_best_person": "Выберите наиболее подходящего сотрудника из команды.",
|
||||
"fixed_round_robin": "Фиксированный раунд",
|
||||
"add_one_fixed_attendee": "Добавьте одного фиксированного участника и общайтесь с другими участниками по кругу.",
|
||||
"calcom_is_better_with_team": "Cal.com отлично подходит для командной работы",
|
||||
"booking_limit_reached": "Достигнут лимит бронирования для этого типа события",
|
||||
"disable_payment_app": "Администратор отключил приложение {{appName}}, которое влияет на тип вашего мероприятия {{title}}. Участники все еще могут забронировать этот тип мероприятия, но они не получат собщение о том, что нужно произвести оплату. Чтобы этого избежать, можно скрыть тип мероприятия, пока администратор не активирует способ оплаты снова.",
|
||||
"app_disabled_video": "Администратор отключил приложение {{appName}}, которое влияет на типы мероприятий. Если у вас есть типы мероприятий с {{appName}} в качестве места, то по умолчанию будет использоваться Cal Video.",
|
||||
"enable_apps_description": "Включить приложения, которые пользователи могут интегрировать с Cal.com",
|
||||
"keys_have_been_saved": "Ключи сохранены",
|
||||
"disable_app_description": "При отключении этого приложения у пользователей могут возникнуть проблемы с взаимодействием с Cal",
|
||||
"edit_keys": "Изменить ключи",
|
||||
"no_available_apps_description": "Убедитесь, что в вашей установке в 'packages/app-store' есть приложения",
|
||||
"radio": "Переключатель",
|
||||
"event_type_duplicate_copy_text": "{{slug}}- копия"
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
"event_request_cancelled": "Vaš zakazan dogadjaj je odbijen",
|
||||
"organizer": "Organizator",
|
||||
"need_to_reschedule_or_cancel": "Morate da odložite ili otkažete?",
|
||||
"cancellation_reason": "Razlog otkazivanja",
|
||||
"cancellation_reason_placeholder": "Zašto otkazujete? (opciono)",
|
||||
"cancellation_reason": "Razlog otkazivanja (opciono)",
|
||||
"cancellation_reason_placeholder": "Zašto otkazujete?",
|
||||
"rejection_reason": "Razlog odbijanja",
|
||||
"rejection_reason_title": "Odbij zahtev za rezervaciju?",
|
||||
"rejection_reason_description": "Da li ste sigurni da želite da odbijete rezervaciju? Obavestićemo osobu koja je pokušala da rezerviše. Možete navesti razlog ispod.",
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Dogadjaj još čeka na odobrenje",
|
||||
"event_is_still_waiting": "Zahtev na dogadjaj još čeka: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Nema više rezultata",
|
||||
"no_results": "Nema rezultata",
|
||||
"load_more_results": "Učitaj više rezultata",
|
||||
"integration_meeting_id": "{{integrationName}} ID sastanka: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Potvrdjeno: {{eventType}} sa {{name}} datuma {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Dodaj u kalendar",
|
||||
"add_another_calendar": "Dodaj još jedan kalendar",
|
||||
"other": "Drugo",
|
||||
"email_sign_in_subject": "Vaša veza za prijavu na {{appName}}",
|
||||
"emailed_you_and_attendees": "Poslali smo vama i ostalim učesnicima kalendarski poziv sa svim detaljima.",
|
||||
"emailed_you_and_attendees_recurring": "Poslali smo vama i ostalim učesnicima kalendarski poziv za prvi od ovih ponavljajućih događaja.",
|
||||
"emailed_you_and_any_other_attendees": "Vi i ostali učesnici ste dobili e-poštu sa ovim informacijama.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "Trenutna lozinka je netačna",
|
||||
"password_hint_caplow": "Mešavina velikih i malih slova",
|
||||
"password_hint_min": "Dugačka minimalno 7 znakova",
|
||||
"password_hint_admin_min": "Dugačka minimalno 15 znakova",
|
||||
"password_hint_num": "Sadrži barem 1 broj",
|
||||
"invalid_password_hint": "Lozinka mora da bude dugačka najmanje 7 znakova, da sadrži najmanje jedan broj i da ima mešavinu velikih i malih slova",
|
||||
"incorrect_password": "Lozinka je netačna.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Potvrdite vaš {{eventTypeTitle}} sa {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Odložite vaš {{eventTypeTitle}} sa {{profileName}}",
|
||||
"in_person_meeting": "Sastanak uživo ili preko online linka",
|
||||
"attendeeInPerson": "Lično (adresa polaznika)",
|
||||
"inPerson": "Lično (adresa organizatora)",
|
||||
"link_meeting": "Link za sastanak",
|
||||
"phone_call": "Broj telefona učesnika",
|
||||
"your_number": "Vaš broj telefona",
|
||||
"phone_number": "Broj Telefona",
|
||||
"attendee_phone_number": "Broj telefona učesnika",
|
||||
"organizer_phone_number": "Broj telefona organizatora",
|
||||
"host_phone_number": "Vaš broj telefona",
|
||||
"enter_phone_number": "Unesite broj telefona",
|
||||
"reschedule": "Odloži",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Kolektiv",
|
||||
"collective_description": "Rezerviši sastanke kad su izabrani članovi tima dostupni.",
|
||||
"duration": "Trajanje",
|
||||
"available_durations": "Dostupna trajanja",
|
||||
"default_duration": "Podrazumevano trajanje",
|
||||
"default_duration_no_options": "Najpre izaberite dostupna trajanja",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minuti",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Ciklusirajte sastanke između više članova tima.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Timovi",
|
||||
"team": "Tim",
|
||||
"team_billing": "Naplata za timove",
|
||||
"team_billing_description": "Upravljajte naplatom za vaš tim",
|
||||
"upgrade_to_flexible_pro_title": "Promenili smo proces naplate za timove",
|
||||
"upgrade_to_flexible_pro_message": "Imate članove u timu koji nemaju mesto. Nadogradite svoj pro plan da biste pokrili mesta koja nedostaju.",
|
||||
"changed_team_billing_info": "Od Januara 2022 vršimo naplatu po mestu za članove tima. Članovi vašeg tima koji su imali Pro besplatno su sada na Pro probnom periodu od 14 dana. Kad probni period istekne ovi članovi biće sakriveni od vašeg tima ukoliko se ne pretplatite na ovu uslugu.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Sakrij tip događaja",
|
||||
"edit_location": "Uredi lokaciju",
|
||||
"into_the_future": "u budućnost",
|
||||
"when_booked_with_less_than_notice": "Kada je rezervisano sa manje od <time></time> napomenom",
|
||||
"within_date_range": "U okviru vremenskog perioda",
|
||||
"indefinitely_into_future": "Na neodređeno u budućnost",
|
||||
"add_new_custom_input_field": "Dodajte prilagodljivo polje unosa",
|
||||
@@ -713,6 +725,8 @@
|
||||
"delete_account_confirmation_message": "Da li ste sigurni da želite izbrisati svoj {{appName}} nalog? S kim god ste podelili link ovog naloga više neće moći da ga koristi za rezervacije i sva podešavanja koja imate neće biti sačuvana.",
|
||||
"integrations": "Integracije",
|
||||
"apps": "Aplikacije",
|
||||
"apps_description": "Omogućite aplikacije za vašu instancu Cal-a",
|
||||
"apps_listing": "Spisak aplikacija",
|
||||
"category_apps": "{{category}} aplikacije",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Povezujemo ljude, tehnologiju i radno mesto.",
|
||||
@@ -736,6 +750,7 @@
|
||||
"toggle_calendars_conflict": "Uključite kalendare koje želite da proverite da li imaju konflikta da biste sprečili dvostruka zakazivanja.",
|
||||
"select_destination_calendar": "Napravi događaje na",
|
||||
"connect_additional_calendar": "Poveži se sa dodatnim kalendarom",
|
||||
"calendar_updated_successfully": "Kalendar je uspešno ažuriran",
|
||||
"conferencing": "Konferencija",
|
||||
"calendar": "Kalendar",
|
||||
"payments": "Plaćanja",
|
||||
@@ -768,6 +783,7 @@
|
||||
"trending_apps": "Aplikacije u trendu",
|
||||
"explore_apps": "{{category}} aplikacije",
|
||||
"installed_apps": "Instalirane aplikacije",
|
||||
"free_to_use_apps": "Besplatno",
|
||||
"no_category_apps": "Nema {{category}} aplikacija",
|
||||
"no_category_apps_description_calendar": "Dodajte kalendar aplikaciju da biste proverili da li postoje konflikti i time sprečili dvostruka zakazivanja",
|
||||
"no_category_apps_description_conferencing": "Pokušajte da dodate aplikaciju za konferenciju da biste integrisali video poziv sa svojim klijentima",
|
||||
@@ -784,7 +800,7 @@
|
||||
"analytics": "Analitika",
|
||||
"empty_installed_apps_headline": "Aplikacije nisu instalirane",
|
||||
"empty_installed_apps_description": "Aplikacije omogućavaju da unapredite svoj rad i značajno poboljšate svoja zakazivanja.",
|
||||
"empty_installed_apps_button": "Istražite App Store ili instalirajte neku od aplikacija u nastavku",
|
||||
"empty_installed_apps_button": "Istražite App Store",
|
||||
"manage_your_connected_apps": "Upravljajte instaliranim aplikacijama ili promenite postavke",
|
||||
"browse_apps": "Pregledajte aplikacije",
|
||||
"features": "Funkcije",
|
||||
@@ -806,6 +822,8 @@
|
||||
"verify_wallet": "Verifikuj Wallet",
|
||||
"connect_metamask": "Poveži Metamask",
|
||||
"create_events_on": "Kreiraj događaje na",
|
||||
"enterprise_license": "Ovo je enterprise funkcija",
|
||||
"enterprise_license_description": "Da biste omogućili ovu funkciju, nabavite ključ za primenu na {{consoleUrl}} konzoli i dodajte ga u svoj .env kao CALCOM_LICENCE_KEY. Ako vaš tim već ima licencu, obratite se na {{supportMail}} za pomoć.",
|
||||
"missing_license": "Nedostaje Licenca",
|
||||
"signup_requires": "Komercijalna dozvola je neophodna",
|
||||
"signup_requires_description": "{{companyName}} trenutno ne nudi besplatnu verziju otvorenog koda od stranice za prijavu. Da bi dobili potpuni pristup kompenentama za prijavu, neophodno je da ste vlasnik komercijalne licence. Za ličnu upotrebu preporučujemo Prisma Data Platformu ili bilo koji drugi Postgres interfejs za pravljenje naloga.",
|
||||
@@ -897,6 +915,7 @@
|
||||
"user_impersonation_heading": "Predstavljanje kao korisnik",
|
||||
"user_impersonation_description": "Dozvoljava našem timu za podršku da se privremeno prijavi umesto vas kako bismo vam pomogli da brzo rešite sve probleme koje ste nam prijavili.",
|
||||
"team_impersonation_description": "Dozvolite administratorima svog tima da se privremeno prijave kao vi.",
|
||||
"allow_booker_to_select_duration": "Dozvoli polazniku da izabere trajanje",
|
||||
"impersonate_user_tip": "Sva korišćenja ove funkcije se nadgledaju.",
|
||||
"impersonating_user_warning": "Predstavljanje kao korisnik „{{user}}“.",
|
||||
"impersonating_stop_instructions": "<0>Kliknite ovde da zaustavite</0>.",
|
||||
@@ -1014,6 +1033,9 @@
|
||||
"error_removing_app": "Greška prilikom uklanjanja aplikacije",
|
||||
"web_conference": "Veb konferencija",
|
||||
"requires_confirmation": "Potrebna je potvrda",
|
||||
"always_requires_confirmation": "Uvek",
|
||||
"requires_confirmation_threshold": "Zahteva potvrdu ako je rezervisano sa < {{time}}$t({{unit}}_timeUnit) napomenom",
|
||||
"may_require_confirmation": "Može da zahteva potvrdu",
|
||||
"nr_event_type_one": "{{count}} tip događaja",
|
||||
"nr_event_type_other": "{{count}} tipova događaja",
|
||||
"add_action": "Dodaj radnju",
|
||||
@@ -1101,6 +1123,9 @@
|
||||
"event_limit_tab_description": "Koliko često možete da budete rezervisani",
|
||||
"event_advanced_tab_description": "Podešavanja kalendara i više...",
|
||||
"event_advanced_tab_title": "Napredno",
|
||||
"event_setup_multiple_duration_error": "Podešavanje događaja: Višestruka trajanja zahteva najmanje 1 opciju.",
|
||||
"event_setup_multiple_duration_default_error": "Podešavanje događaja: Izaberite važeće podrazumevano trajanje.",
|
||||
"event_setup_booking_limits_error": "Ograničenja zakazivanja moraju da budu u rastućem nizu. [dan,nedelja,mesec,godina]",
|
||||
"select_which_cal": "Izaberite u koji kalendar želite da dodate rezervacije",
|
||||
"custom_event_name": "Prilagođeno ime događaja",
|
||||
"custom_event_name_description": "Kreirajte prilagođena imena događaja za prikaz na kalendaru događaja",
|
||||
@@ -1154,8 +1179,11 @@
|
||||
"invoices": "Fakture",
|
||||
"embeds": "Ugrađivanja",
|
||||
"impersonation": "Predstavljanje kao",
|
||||
"impersonation_description": "Podešavanja za upravljanje lažnim predstavljanjem korisnika",
|
||||
"users": "Korisnici",
|
||||
"profile_description": "Upravljajte podešavanjima vašeg {{appName}} profila",
|
||||
"users_description": "Ovde možete da nađete spisak svih korisnika",
|
||||
"users_listing": "Spisak korisnika",
|
||||
"general_description": "Upravljajte podešavanjima za vaš jezik i vremensku zonu",
|
||||
"calendars_description": "Konfigurišite način na koji tipovi događaja vrše interakciju sa vašim kalendarima",
|
||||
"appearance_description": "Upravljajte podešavanjima za izgled vaše rezervacije",
|
||||
@@ -1345,7 +1373,7 @@
|
||||
"billing_frequency": "Učestalost naplate",
|
||||
"monthly": "Mesečno",
|
||||
"yearly": "Godišnje",
|
||||
"checkout": "Odjava",
|
||||
"checkout": "Kasa",
|
||||
"your_team_disbanded_successfully": "Vaš tim je uspešno rasformiran",
|
||||
"error_creating_team": "Greška prilikom kreiranja tima",
|
||||
"you": "Vi",
|
||||
@@ -1353,22 +1381,62 @@
|
||||
"member_already_invited": "Član je već pozvan",
|
||||
"enter_email_or_username": "Unesite imejl ili korisničko ime",
|
||||
"team_name_taken": "Ime je zauzeto",
|
||||
"must_enter_team_name": "Unesite ime tima",
|
||||
"must_enter_team_name": "Morate uneti naziv tima",
|
||||
"team_url_required": "Morate da unesete URL tima",
|
||||
"team_url_taken": "Ovaj URL je zauzet",
|
||||
"team_publish": "Objavite tim",
|
||||
"number_sms_notifications": "Broj telefona (obaveštenja putem SMS-a)",
|
||||
"attendee_email_workflow": "Imejl polaznika",
|
||||
"attendee_email_info": "Imejl osobe koja rezerviše",
|
||||
"invalid_credential": "Izgleda da je dozvola istekla ili je povučena. Instalirajte ponovo.",
|
||||
"kbar_search_placeholder": "Unesite komandu ili pretražite...",
|
||||
"invalid_credential": "O, ne! Izgleda da je dozvola istekla ili je povučena. Instalirajte ponovo.",
|
||||
"choose_common_schedule_team_event": "Izaberite zajednički raspored",
|
||||
"choose_common_schedule_team_event_description": "Omogućite to ako želite da koristite zajednički raspored između domaćina. Kada je onemogućen, svaki domaćin može rezervisati na osnovu svog podrazumevanog rasporeda.",
|
||||
"reason": "Razlog",
|
||||
"sender_id": "ID pošiljaoca",
|
||||
"sender_id_error_message": "Dozvoljena su samo slova, brojevi i razmaci (maks. 11 karaktera)",
|
||||
"sender_id_error_message": "Dozvoljena su samo slova, brojevi i razmaci (maks. 11 znakova)",
|
||||
"test_routing_form": "Testiranje obrasca za usmeravanje",
|
||||
"test_preview": "Pregled testa",
|
||||
"route_to": "Usmeri na",
|
||||
"test_preview_description": "Proverite obrazac za usmeravanje bez slanja bilo kog podatka",
|
||||
"test_routing": "Testiranje usmeravanja"
|
||||
"test_routing": "Testiranje usmeravanja",
|
||||
"payment_app_disabled": "Administrator je onemogućio aplikaciju za plaćanje",
|
||||
"edit_event_type": "Izmenite tip događaja",
|
||||
"collective_scheduling": "Kolektivno zakazivanje",
|
||||
"make_it_easy_to_book": "Učinite lakim da zakažete svoj tim kada je su svi dostupni.",
|
||||
"find_the_best_person": "Nađite najbolju dostupnu osobu i pregledajte svoj tim.",
|
||||
"fixed_round_robin": "Fiksno kružno dodeljivanje",
|
||||
"add_one_fixed_attendee": "Dodajte jednog fiksnog polaznika i kružno dodelite velikom broju polaznika.",
|
||||
"calcom_is_better_with_team": "Cal.com je bolji uz timove",
|
||||
"add_your_team_members": "Dodajte članove svog tima vašem tipovima događaja. Koristite kolektivno zakazivanje da uključite svakoga ili pronađete osobu koja najviše odgovara pomoću zakazivanja kružnim dodeljivanjem.",
|
||||
"booking_limit_reached": "Dostignuta je granica zakazivanja za ovaj tip događaja",
|
||||
"admin_has_disabled": "Administrator je onemogućio {{appName}}",
|
||||
"disabled_app_affects_event_type": "Administrator je onemogućio {{appName}} što utiče na vaš tip događaja {{eventType}}",
|
||||
"disable_payment_app": "Administrator je onemogućio {{appName}} što utiče na vaš tip događaja {{title}}. Polaznici još uvek mogu da zakažu ovaj tip događaja, ali im neće biti zatraženo da plate. Možete da sakrijete ovaj tip događaja da biste to sprečili dok vaš administrator ponovo ne omogući vaš način plaćanja.",
|
||||
"payment_disabled_still_able_to_book": "Polaznici još uvek mogu da zakažu ovaj tip događaja, ali im neće biti zatraženo da plate. Možete da sakrijete ovaj tip događaja da biste to sprečili dok vaš administrator ponovo ne omogući vaš način plaćanja.",
|
||||
"app_disabled_with_event_type": "Administrator je onemogućio {{appName}} što utiče na vaš tip događaja {{title}}.",
|
||||
"app_disabled_video": "Administrator je onemogućio {{appName}} što može da utiče na vaš tip događaja. Ako imate tipove događaja sa {{appName}} kao lokacijom, onda će biti podrazumevano usmereni na Cal Video.",
|
||||
"app_disabled_subject": "Aplikacija {{appName}} je onemogućena",
|
||||
"navigate_installed_apps": "Idi na instalirane aplikacije",
|
||||
"disabled_calendar": "Ako imate instaliran drugi kalendar, nova zakazivanja će biti dodata na njega. Ako nemate, onda povežite novi kalendar da ne biste propustili nova zakazivanja.",
|
||||
"enable_apps": "Omogući aplikacije",
|
||||
"enable_apps_description": "Omogući aplikacije koje korisnik može da integriše sa Cal.com",
|
||||
"app_is_enabled": "Aplikacija {{appName}} je omogućena",
|
||||
"app_is_disabled": "Aplikacija {{appName}} je onemogućena",
|
||||
"keys_have_been_saved": "Ključevi su sačuvani",
|
||||
"disable_app": "Onemogući aplikaciju",
|
||||
"disable_app_description": "Onemogućavanje ove aplikacije može da stvori probleme u komunikaciji vaših korisnika sa Cal-om",
|
||||
"edit_keys": "Izmeni ključeve",
|
||||
"admin_apps_description": "Omogućite aplikacije za vašu instancu Cal-a",
|
||||
"no_available_apps": "Nema dostupnih aplikacija",
|
||||
"no_available_apps_description": "Uverite se da ima aplikacija u vašoj fascikli za instalaciju pod „packages/app-store“",
|
||||
"no_apps": "Nema omogućenih aplikacija u ovoj instanci Cal-a",
|
||||
"apps_settings": "Podešavanja aplikacija",
|
||||
"fill_this_field": "Popunite ovo polje",
|
||||
"options": "Opcije",
|
||||
"enter_option": "Unesite opciju {{index}}",
|
||||
"add_an_option": "Dodajte opciju",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-kopija",
|
||||
"set_as_default": "Postavi kao podrazumevano"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "En bokning väntar fortfarande på godkännande",
|
||||
"event_is_still_waiting": "Bokningsförfrågan väntar fortfarande: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Inga fler resultat",
|
||||
"no_results": "Inga resultat",
|
||||
"load_more_results": "Hämta fler resultat",
|
||||
"integration_meeting_id": "{{integrationName}} mötes-ID: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Bekräftad: {{eventType}} med {{name}} vid {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Lägg till i kalender",
|
||||
"add_another_calendar": "Lägg till en annan kalender",
|
||||
"other": "Annat",
|
||||
"email_sign_in_subject": "Din inloggningslänk för {{appName}}",
|
||||
"emailed_you_and_attendees": "Vi skickade dig och de andra deltagarna en kalenderinbjudan med alla detaljer.",
|
||||
"emailed_you_and_attendees_recurring": "Vi skickade dig och de andra deltagarna en kalenderinbjudan via e-post för den första av dessa återkommande händelser.",
|
||||
"emailed_you_and_any_other_attendees": "Du och alla andra deltagare har fått e-post med denna information.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "Nuvarande lösenord är felaktigt",
|
||||
"password_hint_caplow": "Blandning av versaler och gemener",
|
||||
"password_hint_min": "Minst 8 tecken",
|
||||
"password_hint_admin_min": "Minst 15 tecken",
|
||||
"password_hint_num": "Innehåller minst 1 siffra",
|
||||
"invalid_password_hint": "Lösenordet måste innehålla minst 7 tecken och har minst en siffra samt en blandning av versaler och gemener",
|
||||
"incorrect_password": "Lösenordet är felaktigt.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Bekräfta {{eventTypeTitle}} med {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Omboka {{eventTypeTitle}} med {{profileName}}",
|
||||
"in_person_meeting": "Länk eller fysiskt möte",
|
||||
"attendeeInPerson": "Personligen (deltagandeadress)",
|
||||
"inPerson": "Personligen (orgnanisatörsadress)",
|
||||
"link_meeting": "Länka möte",
|
||||
"phone_call": "Deltagarens telefonnummer",
|
||||
"your_number": "Ditt telefonnummer",
|
||||
"phone_number": "Telefonnummer",
|
||||
"attendee_phone_number": "Deltagarens telefonnummer",
|
||||
"organizer_phone_number": "Organisatörens telefonnummer",
|
||||
"host_phone_number": "Ditt telefonnummer",
|
||||
"enter_phone_number": "Fyll i telefonnummer",
|
||||
"reschedule": "Omplanera",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Kollektiv",
|
||||
"collective_description": "Schemalägg möten när alla valda teammedlemmar är tillgängliga.",
|
||||
"duration": "Längd",
|
||||
"available_durations": "Tillgänglig varaktighet",
|
||||
"default_duration": "Standardvaraktighet",
|
||||
"default_duration_no_options": "Välj först tillgänglig varaktighet",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Minuter",
|
||||
"round_robin": "Tur och ordning",
|
||||
"round_robin_description": "Variera möten mellan olika teammedlemmar.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Teams",
|
||||
"team": "Team",
|
||||
"team_billing": "Team-fakturering",
|
||||
"team_billing_description": "Hantera fakturering för ditt team",
|
||||
"upgrade_to_flexible_pro_title": "Vi har ändrat fakturering för team",
|
||||
"upgrade_to_flexible_pro_message": "Det finns medlemmar i ditt team utan en plats. Uppgradera din pro plan för att täcka saknade platser.",
|
||||
"changed_team_billing_info": "Från och med januari 2022 tar vi betalt på plats-basis för teammedlemmar. Medlemmar i ditt team som hade Pro gratis är nu på en 14 dagars provperiod. När deras provperiod löper ut kommer dessa medlemmar att döljas från ditt team om du inte uppgraderar nu.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Dölj händelsetyp",
|
||||
"edit_location": "Redigera plats",
|
||||
"into_the_future": "in i framtiden",
|
||||
"when_booked_with_less_than_notice": "Vid bokning med mindre än <time></time> varsel",
|
||||
"within_date_range": "Inom ett datumintervall",
|
||||
"indefinitely_into_future": "På obestämd tid in i framtiden",
|
||||
"add_new_custom_input_field": "Lägg till nytt anpassat inmatningsfält",
|
||||
@@ -713,6 +725,8 @@
|
||||
"delete_account_confirmation_message": "Är du säker på att du vill radera ditt {{appName}} konto? Alla som du har delat din kontolänk med kommer inte längre att kunna boka med hjälp av den och eventuella inställningar du har sparat kommer att gå förlorade.",
|
||||
"integrations": "Integrationer",
|
||||
"apps": "Appar",
|
||||
"apps_description": "Aktivera appar för din Cal-version",
|
||||
"apps_listing": "App-listning",
|
||||
"category_apps": "{{category}}-appar",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Kopplar samman människor, teknik och arbetsplats.",
|
||||
@@ -736,6 +750,7 @@
|
||||
"toggle_calendars_conflict": "Ändra de kalendrar du vill kontrollera för konflikter för att förhindra dubbelbokningar.",
|
||||
"select_destination_calendar": "Skapa händelser i",
|
||||
"connect_additional_calendar": "Anslut ytterligare kalender",
|
||||
"calendar_updated_successfully": "Kalendern har uppdaterats",
|
||||
"conferencing": "Konferenser",
|
||||
"calendar": "Kalender",
|
||||
"payments": "Betalningar",
|
||||
@@ -768,6 +783,7 @@
|
||||
"trending_apps": "Trendande appar",
|
||||
"explore_apps": "{{category}}-appar",
|
||||
"installed_apps": "Installerade appar",
|
||||
"free_to_use_apps": "Gratis",
|
||||
"no_category_apps": "Inga {{category}}-appar",
|
||||
"no_category_apps_description_calendar": "Lägg till en kalenderapp för att kontrollera konflikter och förhindra dubbelbokningar",
|
||||
"no_category_apps_description_conferencing": "Prova att lägga till en konferensapp för att integrera videosamtal med dina kunder",
|
||||
@@ -806,6 +822,8 @@
|
||||
"verify_wallet": "Verifiera plånbok",
|
||||
"connect_metamask": "Anslut Metamask",
|
||||
"create_events_on": "Skapa händelser i",
|
||||
"enterprise_license": "Det här är en företagsfunktion",
|
||||
"enterprise_license_description": "För att aktivera den här funktionen hämtar du en distributionsnyckel i konsolen {{consoleUrl}} och lägger till den i din .env som CALCOM_LICENSE_KEY. Om ditt team redan har en licens kan du kontakta {{supportMail}} för att få hjälp.",
|
||||
"missing_license": "Licens saknas",
|
||||
"signup_requires": "Kommersiell licens krävs",
|
||||
"signup_requires_description": "{{companyName}} erbjuder för närvarande inte en gratis open source-version av registreringssidan. För att få full tillgång till de registreringskomponenter du behöver för att skaffa en kommersiell licens. För personligt bruk rekommenderar vi Prisma Data Platform eller något annat Postgres-gränssnitt för att skapa konton.",
|
||||
@@ -897,6 +915,7 @@
|
||||
"user_impersonation_heading": "Användarpersonifiering",
|
||||
"user_impersonation_description": "Gör det möjligt för vårt supportteam att tillfälligt logga in som du så att vi snabbt kan lösa problem som du rapporterar till oss.",
|
||||
"team_impersonation_description": "Tillåter dina teamadministratörer att tillfälligt logga in som dig.",
|
||||
"allow_booker_to_select_duration": "Låt bokaren välja varaktighet",
|
||||
"impersonate_user_tip": "All användning av denna funktion granskas.",
|
||||
"impersonating_user_warning": "Imiterar användarnamn \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>Klicka här för att sluta</0>.",
|
||||
@@ -1014,6 +1033,9 @@
|
||||
"error_removing_app": "Det gick inte att ta bort app",
|
||||
"web_conference": "Webbkonferens",
|
||||
"requires_confirmation": "Kräver bekräftelse",
|
||||
"always_requires_confirmation": "Alltid",
|
||||
"requires_confirmation_threshold": "Kräver bekräftelse om bokat med < {{time}} $t({{unit}}_timeUnit) varsel",
|
||||
"may_require_confirmation": "Kan kräva bekräftelse",
|
||||
"nr_event_type_one": "{{count}} händelsetyp",
|
||||
"nr_event_type_other": "{{count}} händelsetyper",
|
||||
"add_action": "Lägg till åtgärd",
|
||||
@@ -1101,6 +1123,9 @@
|
||||
"event_limit_tab_description": "Hur ofta du kan bokas",
|
||||
"event_advanced_tab_description": "Kalenderinställningar och mer...",
|
||||
"event_advanced_tab_title": "Avancerat",
|
||||
"event_setup_multiple_duration_error": "Konfiguration av händelse: Flera varaktigheter kräver minst 1 alternativ.",
|
||||
"event_setup_multiple_duration_default_error": "Konfiguration av händelse: Välj en giltig standardvaraktighet.",
|
||||
"event_setup_booking_limits_error": "Bokningsgränserna ska vara i stigande ordning. [dag,vecka,månad,år]",
|
||||
"select_which_cal": "Välj vilken kalender du vill lägga till bokningar till",
|
||||
"custom_event_name": "Anpassat händelsenamn",
|
||||
"custom_event_name_description": "Skapa anpassade händelsenamn som ska visas på kalenderhändelse",
|
||||
@@ -1154,8 +1179,11 @@
|
||||
"invoices": "Fakturor",
|
||||
"embeds": "Inbäddningar",
|
||||
"impersonation": "Imitering",
|
||||
"impersonation_description": "Inställningar för att hantera användarens personifiering",
|
||||
"users": "Användare",
|
||||
"profile_description": "Hantera inställningar för din {{appName}}-profil",
|
||||
"users_description": "Här hittar du en lista med alla användare",
|
||||
"users_listing": "Användarlistning",
|
||||
"general_description": "Hantera inställningar för språk och tidszon",
|
||||
"calendars_description": "Ställ in hur dina händelsetyper interagerar med dina kalendrar",
|
||||
"appearance_description": "Hantera inställningar för ditt bokningsutseende",
|
||||
@@ -1360,6 +1388,7 @@
|
||||
"number_sms_notifications": "Telefonnummer (SMS-notiser)",
|
||||
"attendee_email_workflow": "Deltagarens e-postadress",
|
||||
"attendee_email_info": "Personens e-postadress för bokning",
|
||||
"kbar_search_placeholder": "Skriv ett kommando eller sök...",
|
||||
"invalid_credential": "Åh nej! Det verkar som om behörigheten löpt ut eller återkallats. Installera om igen.",
|
||||
"choose_common_schedule_team_event": "Välj ett gemensamt schema",
|
||||
"choose_common_schedule_team_event_description": "Aktivera den här funktionen om du vill använda ett gemensamt schema mellan värdarna. När den är inaktiverad bokas varje värd enligt sitt standardschema.",
|
||||
@@ -1370,5 +1399,44 @@
|
||||
"test_preview": "Testa förhandsgranskning",
|
||||
"route_to": "Dirigera till",
|
||||
"test_preview_description": "Testa ditt routingformulär utan att skicka data",
|
||||
"test_routing": "Testa routing"
|
||||
"test_routing": "Testa routing",
|
||||
"payment_app_disabled": "En administratör har inaktiverat en betalningsapp",
|
||||
"edit_event_type": "Redigera händelsetyp",
|
||||
"collective_scheduling": "Kollektiv schemaläggning",
|
||||
"make_it_easy_to_book": "Gör det enkelt att boka ditt team när alla är tillgängliga.",
|
||||
"find_the_best_person": "Hitta den bästa personen som finns och cykla genom ditt team.",
|
||||
"fixed_round_robin": "Fast runda robin",
|
||||
"add_one_fixed_attendee": "Lägg till en fast deltagare och rundgång för ett antal deltagare.",
|
||||
"calcom_is_better_with_team": "Cal.com är bättre med teams",
|
||||
"add_your_team_members": "Lägg till dina teammedlemmar i dina händelsetyper. Använd kollektiv schemaläggning för att inkludera alla eller hitta den lämpligaste personen med rundgångsschemaläggning.",
|
||||
"booking_limit_reached": "Bokningsgränsen för denna händelsetyp har uppnåtts",
|
||||
"admin_has_disabled": "En administratör har inaktiverat {{appName}}",
|
||||
"disabled_app_affects_event_type": "En administratör har inaktiverat {{appName}} vilket påverkar din händelsetyp {{eventType}}",
|
||||
"disable_payment_app": "Administratören har inaktiverat {{appName}} vilket påverkar din evenemangstyp {{title}}. Deltagarna kan fortfarande boka den här typen av händelse men kommer inte att uppmanas att betala. Du kan dölja händelsetypen för att förhindra detta tills din administratör återaktiverar din betalningsmetod.",
|
||||
"payment_disabled_still_able_to_book": "Deltagarna kan fortfarande boka den här typen av händelse, men kommer inte att uppmanas att betala. Du kan dölja händelsetypen för att förhindra detta tills din administratör återaktiverar betalningsmetoden.",
|
||||
"app_disabled_with_event_type": "Administratören har inaktiverat {{appName}} vilket påverkar din händelsetyp {{title}}.",
|
||||
"app_disabled_video": "Administratören har inaktiverat {{appName}} vilket kan påverka dina händelsetyper. Om du har händelsetyper med {{appName}} som plats kommer den att vara standard för Cal Video.",
|
||||
"app_disabled_subject": "{{appName}} har inaktiverats",
|
||||
"navigate_installed_apps": "Gå till installerade appar",
|
||||
"disabled_calendar": "Om du har en annan kalender installerad kommer nya bokningar att läggas till i den. Om du inte sedan ansluter en ny kalender så missar du inga nya bokningar.",
|
||||
"enable_apps": "Aktivera appar",
|
||||
"enable_apps_description": "Aktivera appar som användare kan integrera med Cal.com",
|
||||
"app_is_enabled": "{{appName}} har aktiverats",
|
||||
"app_is_disabled": "{{appName}} har inaktiverats",
|
||||
"keys_have_been_saved": "Nycklar har sparats",
|
||||
"disable_app": "Inaktivera app",
|
||||
"disable_app_description": "Inaktivering av den här appen kan orsaka problem med hur dina användare interagerar med Cal",
|
||||
"edit_keys": "Redigera nycklar",
|
||||
"admin_apps_description": "Aktivera appar för din Cal-version",
|
||||
"no_available_apps": "Det finns inga tillgängliga appar",
|
||||
"no_available_apps_description": "Se till att det finns appar i din distribution under \"paket/app-store\"",
|
||||
"no_apps": "Det finns inga appar aktiverade i denna instans av Cal",
|
||||
"apps_settings": "App-inställningar",
|
||||
"fill_this_field": "Fyll i det här fältet",
|
||||
"options": "Alternativ",
|
||||
"enter_option": "Ange alternativ {{index}}",
|
||||
"add_an_option": "Lägg till ett alternativ",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-kopia",
|
||||
"set_as_default": "Ange som standard"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Bir etkinlik hâlâ onay bekliyor",
|
||||
"event_is_still_waiting": "Etkinlik isteği hâlâ beklemede: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Başka sonuç yok",
|
||||
"no_results": "Sonuç yok",
|
||||
"load_more_results": "Daha fazla sonuç yükle",
|
||||
"integration_meeting_id": "{{integrationName}} toplantı kimliği: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Onaylandı: {{date}} tarihinde {{name}} ile {{eventType}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Takvime ekle",
|
||||
"add_another_calendar": "Başka bir takvim ekle",
|
||||
"other": "Diğer",
|
||||
"email_sign_in_subject": "{{appName}} için giriş bağlantınız",
|
||||
"emailed_you_and_attendees": "Size ve diğer katılımcılara tüm ayrıntıları içeren bir takvim daveti e-postası gönderdik.",
|
||||
"emailed_you_and_attendees_recurring": "Size ve diğer katılımcılara bu yinelenen etkinliklerin ilki için bir takvim daveti e-postası gönderdik.",
|
||||
"emailed_you_and_any_other_attendees": "Bu bilgiler size ve diğer katılımcılara e-posta ile gönderildi.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "Mevcut şifre hatalı",
|
||||
"password_hint_caplow": "Büyük ve küçük harf karışımı",
|
||||
"password_hint_min": "En az 8 karakter uzunluğunda",
|
||||
"password_hint_admin_min": "Minimum uzunluk 15 karakter",
|
||||
"password_hint_num": "En az 1 rakam içermelidir",
|
||||
"invalid_password_hint": "Şifre en az 7 karakter uzunluğunda olmalı, en az bir rakam içermeli ve büyük ve küçük harflerin karışımından oluşmalıdır",
|
||||
"incorrect_password": "Şifre hatalı.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "{{profileName}} ile {{eventTypeTitle}} etkinliğinizi onaylayın",
|
||||
"booking_reschedule_confirmation": "{{profileName}} ile {{eventTypeTitle}} etkinliğinizi yeniden planlayın",
|
||||
"in_person_meeting": "Yüz yüze görüşme",
|
||||
"attendeeInPerson": "Şahsen (Katılımcı Adresi)",
|
||||
"inPerson": "Şahsen (Organizatör Adresi)",
|
||||
"link_meeting": "Bağlantılı toplantı",
|
||||
"phone_call": "Katılımcı Telefon Numarası",
|
||||
"your_number": "Telefon numaranız",
|
||||
"phone_number": "Telefon Numarası",
|
||||
"attendee_phone_number": "Katılımcı Telefon Numarası",
|
||||
"organizer_phone_number": "Organizatör Telefon Numarası",
|
||||
"host_phone_number": "Telefon Numaranız",
|
||||
"enter_phone_number": "Telefon numarası girin",
|
||||
"reschedule": "Yeniden planla",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Toplu",
|
||||
"collective_description": "Tüm seçili ekip üyeleri müsait olduğunda toplantıları planlayın.",
|
||||
"duration": "Süre",
|
||||
"available_durations": "Uygun süreler",
|
||||
"default_duration": "Varsayılan süre",
|
||||
"default_duration_no_options": "Lütfen önce uygun süreleri seçin",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Dakika",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Toplantıları birden fazla ekip üyesi arasında döndürün.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Ekipler",
|
||||
"team": "Ekip",
|
||||
"team_billing": "Ekip Faturası",
|
||||
"team_billing_description": "Ekibiniz için faturalandırmayı yönetin",
|
||||
"upgrade_to_flexible_pro_title": "Ekipler için faturayı değiştirdik",
|
||||
"upgrade_to_flexible_pro_message": "Ekibinizde alanı olmayan üyeler var. Eksik alanları doldurmak için profesyonel plana yükseltin.",
|
||||
"changed_team_billing_info": "Ocak 2022'den itibaren her ekip üyesi alanı için ücret alıyoruz. Ücretsiz PRO'ya sahip olan ekip üyeleriniz şu anda 14 günlük deneme süresinde. Deneme süreleri sona erdiğinde ve yükseltme yapmadığınızda bu üyeler ekibinizden gizlenecektir.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Etkinlik türünü gizle",
|
||||
"edit_location": "Konumu düzenle",
|
||||
"into_the_future": "gelecekte",
|
||||
"when_booked_with_less_than_notice": "<time></time> bildiriminden daha az süre ile rezervasyon yapıldığında",
|
||||
"within_date_range": "Bir tarih aralığında",
|
||||
"indefinitely_into_future": "Süresiz olarak gelecekte",
|
||||
"add_new_custom_input_field": "Yeni özel veri girdi alanı ekle",
|
||||
@@ -713,6 +725,8 @@
|
||||
"delete_account_confirmation_message": "{{appName}} hesabınızı silmek istediğinizden emin misiniz? Hesap bağlantısı paylaştığınız herkes artık bu bağlantıyı kullanarak rezervasyon yapamayacak ve kaydettiğiniz tüm tercihler kaybolacak.",
|
||||
"integrations": "Entegrasyonlar",
|
||||
"apps": "Uygulamalar",
|
||||
"apps_description": "Cal örneğiniz için uygulamayı etkinleştirin",
|
||||
"apps_listing": "Uygulama listesi",
|
||||
"category_apps": "{{category}} uygulamaları",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "İnsanları, teknolojiyi ve çalışma ortamını birbirine bağlıyor.",
|
||||
@@ -736,6 +750,7 @@
|
||||
"toggle_calendars_conflict": "Çifte rezervasyonu önlemek için çakışmaları kontrol etmek istediğiniz takvimleri değiştirin.",
|
||||
"select_destination_calendar": "Şurada etkinlik oluştur:",
|
||||
"connect_additional_calendar": "Ek takvim bağlayın",
|
||||
"calendar_updated_successfully": "Takvim başarıyla güncellendi",
|
||||
"conferencing": "Konferans",
|
||||
"calendar": "Takvim",
|
||||
"payments": "Ödemeler",
|
||||
@@ -768,6 +783,7 @@
|
||||
"trending_apps": "Popüler Uygulamalar",
|
||||
"explore_apps": "{{category}} uygulamaları",
|
||||
"installed_apps": "Yüklü Uygulamalar",
|
||||
"free_to_use_apps": "Ücretsiz",
|
||||
"no_category_apps": "{{category}} uygulaması yok",
|
||||
"no_category_apps_description_calendar": "Çifte rezervasyonları önlemek amacıyla çakışmaları kontrol etmek için bir takvim uygulaması ekleyin",
|
||||
"no_category_apps_description_conferencing": "Müşterilerinizle görüntülü arama yapmak için bir konferans uygulaması eklemeyi deneyin",
|
||||
@@ -806,6 +822,8 @@
|
||||
"verify_wallet": "Cüzdanı Doğrula",
|
||||
"connect_metamask": "MetaMask'i Bağla",
|
||||
"create_events_on": "Şurada etkinlik oluşturun:",
|
||||
"enterprise_license": "Bu bir kurumsal özelliktir",
|
||||
"enterprise_license_description": "Bu özelliği etkinleştirmek için {{consoleUrl}} konsolundan bir dağıtım anahtarı alın ve bunu .env dosyanıza CALCOM_LICENSE_KEY olarak ekleyin. Ekibinizin zaten bir lisansı varsa yardım için lütfen {{supportMail}} adresinden iletişime geçin.",
|
||||
"missing_license": "Eksik Lisans",
|
||||
"signup_requires": "Ticari lisans gerekli",
|
||||
"signup_requires_description": "{{companyName}} şu anda kayıt sayfasının ücretsiz, açık kaynaklı bir sürümünü sunmamaktadır. Kayıt bileşenlerine tam erişim elde etmek için ticari bir lisans almanız gerekiyor. Kişisel kullanım için hesap oluşturmak üzere Prisma Data veya başka bir Postgres arayüzü öneriyoruz.",
|
||||
@@ -897,6 +915,7 @@
|
||||
"user_impersonation_heading": "Kullanıcı Kimliğine Bürünme",
|
||||
"user_impersonation_description": "Bize bildirdiğiniz hataları hızlı bir şekilde çözmek için destek ekibimizin sizin adınıza geçici olarak oturum açmasına izin verir.",
|
||||
"team_impersonation_description": "Ekip üyelerinizin sizin adınıza geçici olarak oturum açmasına izin verir.",
|
||||
"allow_booker_to_select_duration": "Rezervasyon yapan kişinin süreyi seçmesine izin ver",
|
||||
"impersonate_user_tip": "Bu özelliğin tüm kullanımları denetlenir.",
|
||||
"impersonating_user_warning": "\"{{user}}\" kullanıcı adı kimliğine bürünme.",
|
||||
"impersonating_stop_instructions": "<0>Durdurmak için Buraya tıklayın</0>.",
|
||||
@@ -1014,6 +1033,9 @@
|
||||
"error_removing_app": "Uygulama kaldırılırken bir hata oluştu",
|
||||
"web_conference": "Web konferansı",
|
||||
"requires_confirmation": "Onay gerekli",
|
||||
"always_requires_confirmation": "Her zaman",
|
||||
"requires_confirmation_threshold": "{{time}} $t({{unit}}_timeUnit) bildiriminden daha az süre ile rezervasyon yapıldığında onay gerekir",
|
||||
"may_require_confirmation": "Onay gerekebilir",
|
||||
"nr_event_type_one": "{{count}} etkinlik türü",
|
||||
"nr_event_type_other": "{{count}} etkinlik türü",
|
||||
"add_action": "Eylem ekle",
|
||||
@@ -1101,6 +1123,9 @@
|
||||
"event_limit_tab_description": "Ne sıklıkla rezervasyon yapabilirsiniz",
|
||||
"event_advanced_tab_description": "Takvim ayarları ve daha fazlası...",
|
||||
"event_advanced_tab_title": "Gelişmiş",
|
||||
"event_setup_multiple_duration_error": "Etkinlik Kurulumu: Birden çok süre için en az 1 seçenek gereklidir.",
|
||||
"event_setup_multiple_duration_default_error": "Etkinlik Kurulumu: Lütfen geçerli bir varsayılan süre seçin.",
|
||||
"event_setup_booking_limits_error": "Rezervasyon limitleri artan sırada olmalıdır. [gün,hafta,ay,yıl]",
|
||||
"select_which_cal": "Rezervasyonların hangi takvime ekleneceğini seçin",
|
||||
"custom_event_name": "Özel etkinlik adı",
|
||||
"custom_event_name_description": "Takvim etkinliğinde görüntülenecek özelleştirilmiş etkinlik adları oluşturun",
|
||||
@@ -1154,8 +1179,11 @@
|
||||
"invoices": "Faturalar",
|
||||
"embeds": "Gömülüler",
|
||||
"impersonation": "Kimliğe bürünme",
|
||||
"impersonation_description": "Kullanıcı kimliğine bürünmeyi yönetmek için ayarlar",
|
||||
"users": "Kullanıcılar",
|
||||
"profile_description": "{{appName}} profiliniz için ayarları yönetin",
|
||||
"users_description": "Burada tüm kullanıcıların bir listesini bulabilirsiniz",
|
||||
"users_listing": "Kullanıcı listesi",
|
||||
"general_description": "Diliniz ve saat diliminiz için ayarları yönetin",
|
||||
"calendars_description": "Etkinlik türlerinizin takvimlerinizle nasıl etkileşimde bulunacağını yapılandırın",
|
||||
"appearance_description": "Rezervasyon görünümünüz için ayarları yönetin",
|
||||
@@ -1360,6 +1388,7 @@
|
||||
"number_sms_notifications": "Telefon numarası (SMS bildirimleri)",
|
||||
"attendee_email_workflow": "Katılımcı e-postası",
|
||||
"attendee_email_info": "Rezervasyon yaptıran kişinin e-postası",
|
||||
"kbar_search_placeholder": "Bir komut girin veya arayın...",
|
||||
"invalid_credential": "Hata! İznin süresi dolmuş veya iptal edilmiş gibi görünüyor. Lütfen yeniden yükleyin.",
|
||||
"choose_common_schedule_team_event": "Ortak bir program seçin",
|
||||
"choose_common_schedule_team_event_description": "Toplantı sahipleri arasında ortak bir plan kullanmak istiyorsanız bunu etkinleştirin. Devre dışı bırakıldığında, her toplantı sahibi varsayılan programına göre rezerve edilir.",
|
||||
@@ -1370,5 +1399,44 @@
|
||||
"test_preview": "Ön İzlemeyi Test Et",
|
||||
"route_to": "Şuraya yönlendir:",
|
||||
"test_preview_description": "Herhangi bir veri göndermeden yönlendirme formunuzu test edin",
|
||||
"test_routing": "Yönlendirmeyi Test Et"
|
||||
"test_routing": "Yönlendirmeyi Test Et",
|
||||
"payment_app_disabled": "Bir yönetici, ödeme uygulamasını devre dışı bıraktı",
|
||||
"edit_event_type": "Etkinlik türünü düzenle",
|
||||
"collective_scheduling": "Toplu Planlama",
|
||||
"make_it_easy_to_book": "Herkes müsait olduğunda ekibinizin rezervasyon yapmasını kolaylaştırın.",
|
||||
"find_the_best_person": "Mevcut en iyi kişiyi bulun ve ekip üyeleriniz arasında rotasyon yapın.",
|
||||
"fixed_round_robin": "Sabit döngü",
|
||||
"add_one_fixed_attendee": "Tek bir sabit katılımcı ve birden fazla katılımcının olduğu bir döngü ekleyin.",
|
||||
"calcom_is_better_with_team": "Cal.com ekiplerle daha iyidir",
|
||||
"add_your_team_members": "Ekip üyelerinizi etkinlik türlerinize ekleyin. Herkesi eklemek için toplu planlamayı kullanın veya döngüsel planlama ile en uygun kişiyi bulun.",
|
||||
"booking_limit_reached": "Bu etkinlik türü için Rezervasyon Sınırına ulaşıldı",
|
||||
"admin_has_disabled": "Bir yönetici {{appName}} uygulamasını devre dışı bıraktı",
|
||||
"disabled_app_affects_event_type": "Bir yönetici {{eventType}} etkinlik türünüzü etkileyen {{appName}} uygulamasını devre dışı bıraktı",
|
||||
"disable_payment_app": "Yönetici, {{title}} etkinlik türünüzü etkileyebilecek {{appName}} uygulamasını devre dışı bıraktı. Katılımcılar yine de bu tür bir etkinlik için rezervasyon yaptırabilirler ancak herhangi bir ödeme yapmalarına gerek yoktur. Bu durumu önlemek için yöneticiniz ödeme yönteminizi yeniden etkinleştirene kadar etkinlik türünü gizleyebilirsiniz.",
|
||||
"payment_disabled_still_able_to_book": "Katılımcılar yine de bu tür bir etkinlik için rezervasyon yaptırabilirler ancak herhangi bir ödeme yapmalarına gerek yoktur. Bu durumu önlemek için yöneticiniz ödeme yönteminizi yeniden etkinleştirene kadar etkinlik türünü gizleyebilirsiniz.",
|
||||
"app_disabled_with_event_type": "Yönetici, etkinlik {{title}} türünüzü etkileyen {{appName}} uygulamasını devre dışı bıraktı.",
|
||||
"app_disabled_video": "Yönetici, etkinlik türlerinizi etkileyebilecek {{appName}} uygulamasını devre dışı bıraktı. Konum olarak {{appName}} olan etkinlik türleriniz varsa varsayılan uygulama Cal Video olacaktır.",
|
||||
"app_disabled_subject": "{{appName}} devre dışı bırakıldı",
|
||||
"navigate_installed_apps": "Yüklü uygulamalara git",
|
||||
"disabled_calendar": "Yüklü başka bir takviminiz varsa yeni randevular bu takvime eklenecektir. Aksi takdirde yeni bir takvim bağlamazsanız yeni rezervasyonları kaçırabilirsiniz.",
|
||||
"enable_apps": "Uygulamaları Etkinleştir",
|
||||
"enable_apps_description": "Kullanıcıların Cal.com ile entegre edebileceği uygulamaları etkinleştirin",
|
||||
"app_is_enabled": "{{appName}} etkinleştirildi",
|
||||
"app_is_disabled": "{{appName}} devre dışı bırakıldı",
|
||||
"keys_have_been_saved": "Anahtarlar kaydedildi",
|
||||
"disable_app": "Uygulamaları Devre Dışı Bırak",
|
||||
"disable_app_description": "Bu uygulamanın devre dışı bırakılması kullanıcılarınızın Cal ile etkileşimde bulunmaları konusunda sorunlara neden olabilir",
|
||||
"edit_keys": "Anahtarları Düzenle",
|
||||
"admin_apps_description": "Cal örneğiniz için uygulamayı etkinleştirin",
|
||||
"no_available_apps": "Kullanılabilir uygulama yok",
|
||||
"no_available_apps_description": "'Paketler/uygulama mağazası' altındaki dağıtım klasörünüzde uygulamaların olduğundan emin olun",
|
||||
"no_apps": "Bu Cal örneğindeki hiçbir uygulama etkin değil",
|
||||
"apps_settings": "Uygulama ayarları",
|
||||
"fill_this_field": "Lütfen bu alanı doldurun",
|
||||
"options": "Seçenekler",
|
||||
"enter_option": "{{index}} Seçeneğini Girin",
|
||||
"add_an_option": "Bir seçenek ekle",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-kopyala",
|
||||
"set_as_default": "Varsayılan olarak ayarla"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Захід досі чекає на схвалення",
|
||||
"event_is_still_waiting": "Запит на захід досі в очікуванні: {{attendeeName}} – {{date}} – {{eventType}}",
|
||||
"no_more_results": "Інших результатів немає",
|
||||
"no_results": "Немає результатів",
|
||||
"load_more_results": "Завантажити інші результати",
|
||||
"integration_meeting_id": "Ідентифікатор наради «{{integrationName}}»: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Підтверджено: {{eventType}} «{{name}}», {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Додати в календар",
|
||||
"add_another_calendar": "Додати інший календар",
|
||||
"other": "Інше",
|
||||
"email_sign_in_subject": "Ваше посилання для входу в {{appName}}",
|
||||
"emailed_you_and_attendees": "Ми надіслали вам та іншим учасникам запрошення до календаря з усіма деталями.",
|
||||
"emailed_you_and_attendees_recurring": "Ми надіслали вам та іншим учасникам запрошення з календаря на перший із цих періодичних заходів.",
|
||||
"emailed_you_and_any_other_attendees": "Цю інформацію надіслано вам і всім іншим учасникам.",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "Поточний пароль неправильний",
|
||||
"password_hint_caplow": "Комбінація великих і малих літер",
|
||||
"password_hint_min": "Щонайменше 8 символів завдовжки",
|
||||
"password_hint_admin_min": "Щонайменше 15 символів",
|
||||
"password_hint_num": "Містить принаймні 1 цифру",
|
||||
"invalid_password_hint": "Пароль має містити не менше ніж 7 символів: принаймні одну цифру та комбінацію великих і малих літер",
|
||||
"incorrect_password": "Пароль неправильний.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Підтвердьте свій захід ({{eventTypeTitle}}) із користувачем {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Перенесіть свій захід ({{eventTypeTitle}}) із користувачем {{profileName}}",
|
||||
"in_person_meeting": "Посилання або особиста зустріч",
|
||||
"attendeeInPerson": "Особисто (адреса відвідувача)",
|
||||
"inPerson": "Особисто (адреса організатора)",
|
||||
"link_meeting": "Нарада з посиланням",
|
||||
"phone_call": "Номер телефону учасника",
|
||||
"your_number": "Ваш номер телефону",
|
||||
"phone_number": "Номер телефону",
|
||||
"attendee_phone_number": "Номер телефону учасника",
|
||||
"organizer_phone_number": "Телефон організатора",
|
||||
"host_phone_number": "Ваш номер телефону",
|
||||
"enter_phone_number": "Введіть номер телефону",
|
||||
"reschedule": "Перенести",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Групова",
|
||||
"collective_description": "Плануйте наради, коли доступні всі вибрані учасники команди.",
|
||||
"duration": "Тривалість",
|
||||
"available_durations": "Доступні варіанти тривалості",
|
||||
"default_duration": "Тривалість за замовчуванням",
|
||||
"default_duration_no_options": "Спочатку виберіть доступні варіанти тривалості",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "Хвилини",
|
||||
"round_robin": "Ротація",
|
||||
"round_robin_description": "Кілька учасників команди призначаються для нарад циклічно й по черзі.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Команди",
|
||||
"team": "Команда",
|
||||
"team_billing": "Виставлення рахунків для команд",
|
||||
"team_billing_description": "Керуйте виставленням рахунків у своїй команді",
|
||||
"upgrade_to_flexible_pro_title": "Ми змінили умови оплати для команд",
|
||||
"upgrade_to_flexible_pro_message": "У вашій команді є учасники без придбаних місць. Перейдіть на план Pro, щоб отримати всі потрібні місця.",
|
||||
"changed_team_billing_info": "Станом на січень 2022 року оплата з учасників команди стягується за кількістю місць. Учасників вашої команди, які безкоштовно користувалися функціями Pro, тепер переведено на 14-денні пробні версії. Щойно пробний період завершиться, учасників вашої команди, для яких не придбано план Pro, буде приховано.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Приховати тип заходу",
|
||||
"edit_location": "Змінити розташування",
|
||||
"into_the_future": "у майбутньому",
|
||||
"when_booked_with_less_than_notice": "Якщо бронювання створено менше ніж за <time></time> до заходу",
|
||||
"within_date_range": "У діапазоні дат",
|
||||
"indefinitely_into_future": "Колись у майбутньому",
|
||||
"add_new_custom_input_field": "Додати нове власне поле введення",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "Справді видалити обліковий запис {{appName}}? Усі, кому ви надавали посилання на свій обліковий запис, більше не зможуть бронювати ваш час за його допомогою. Усі збережені налаштування буде втрачено.",
|
||||
"integrations": "Інтеграції",
|
||||
"apps": "Додатки",
|
||||
"apps_listing": "Список додатків",
|
||||
"category_apps": "Додатки з категорії «{{category}}»",
|
||||
"app_store": "App Store",
|
||||
"app_store_description": "Спілкування та технології на робочому місці.",
|
||||
@@ -736,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "Увімкніть ті календарі, які потрібно перевірити на наявність конфліктів, щоб уникнути подвійних бронювань.",
|
||||
"select_destination_calendar": "Створюйте заходи в календарі",
|
||||
"connect_additional_calendar": "Підключити додатковий календар",
|
||||
"calendar_updated_successfully": "Календар оновлено",
|
||||
"conferencing": "Відеоконференції",
|
||||
"calendar": "Календар",
|
||||
"payments": "Платежі",
|
||||
@@ -768,6 +782,7 @@
|
||||
"trending_apps": "Популярні додатки",
|
||||
"explore_apps": "Додатки з категорії «{{category}}»",
|
||||
"installed_apps": "Установлені додатки",
|
||||
"free_to_use_apps": "Безкоштовні",
|
||||
"no_category_apps": "{{category}} — немає додатків",
|
||||
"no_category_apps_description_calendar": "Додайте додаток для календаря, щоб перевіряти, чи немає конфліктів у розкладі, і уникати подвійних бронювань",
|
||||
"no_category_apps_description_conferencing": "Спробуйте додати додаток для конференцій, щоб інтегрувати можливість відеорозмов зі своїми клієнтами",
|
||||
@@ -806,6 +821,8 @@
|
||||
"verify_wallet": "Пройдіть перевірку гаманця",
|
||||
"connect_metamask": "Підключіть Metamask",
|
||||
"create_events_on": "Створюйте заходи в календарі",
|
||||
"enterprise_license": "Це корпоративна функція",
|
||||
"enterprise_license_description": "Щоб увімкнути цю функцію, отримайте ключ розгортання в консолі {{consoleUrl}} і додайте його у свій файл .env як CALCOM_LICENSE_KEY. Якщо у вашої команди вже є ліцензія, зверніться по допомогу за адресою {{supportMail}}.",
|
||||
"missing_license": "Відсутня ліцензія",
|
||||
"signup_requires": "Потрібна комерційна ліцензія",
|
||||
"signup_requires_description": "{{companyName}} зараз не надає безкоштовну версію сторінки реєстрації з відкритим кодом. Щоб отримати повний доступ до складових функціоналу реєстрації, потрібно придбати комерційну ліцензію. Для особистого використання та створення облікових записів радимо Prisma Data Platform або будь-який інший інтерфейс Postgres.",
|
||||
@@ -897,6 +914,7 @@
|
||||
"user_impersonation_heading": "Виконання ролі користувача",
|
||||
"user_impersonation_description": "Ви можете дозволити нашій команді підтримки тимчасово входити в систему під вашим іменем, щоб швидко вирішувати проблеми, про які ви повідомляєте.",
|
||||
"team_impersonation_description": "Дозвольте адміністраторам своєї команди тимчасово входити під вашим іменем.",
|
||||
"allow_booker_to_select_duration": "Дозволити автору бронювання вибирати тривалість",
|
||||
"impersonate_user_tip": "Усі випадки використання цієї функції підпадають під аудит.",
|
||||
"impersonating_user_warning": "Виконується роль користувача {{user}}.",
|
||||
"impersonating_stop_instructions": "<0>Натисніть тут, щоб зупинити</0>.",
|
||||
@@ -1014,6 +1032,9 @@
|
||||
"error_removing_app": "Не вдалося вилучити додаток",
|
||||
"web_conference": "Вебконференція",
|
||||
"requires_confirmation": "Потрібне підтвердження",
|
||||
"always_requires_confirmation": "Завжди",
|
||||
"requires_confirmation_threshold": "Вимагати підтвердження, якщо бронювання створено менше ніж за {{time}} $t({{unit}}_timeUnit) до заходу",
|
||||
"may_require_confirmation": "Може вимагати підтвердження",
|
||||
"nr_event_type_one": "{{count}} тип заходу",
|
||||
"nr_event_type_other": "Типів заходів: {{count}}",
|
||||
"add_action": "Додати дію",
|
||||
@@ -1101,6 +1122,9 @@
|
||||
"event_limit_tab_description": "Як часто ваш час можуть бронювати",
|
||||
"event_advanced_tab_description": "Налаштування календаря та інше…",
|
||||
"event_advanced_tab_title": "Додатково",
|
||||
"event_setup_multiple_duration_error": "Налаштування заходу: якщо мають бути доступні різні варіанти, потрібно вказати принаймні один.",
|
||||
"event_setup_multiple_duration_default_error": "Налаштування заходу: виберіть припустиму тривалість за замовчуванням.",
|
||||
"event_setup_booking_limits_error": "Ліміти на бронювання мають бути впорядковані за зростанням. [день,тиждень,місяць,рік]",
|
||||
"select_which_cal": "Виберіть календар, у який додаватимуться бронювання",
|
||||
"custom_event_name": "Користувацька назва події",
|
||||
"custom_event_name_description": "Вибирайте для заходів власні назви, що показуватимуться в календарі",
|
||||
@@ -1154,8 +1178,11 @@
|
||||
"invoices": "Рахунки-фактури",
|
||||
"embeds": "Вставки",
|
||||
"impersonation": "Вхід під іншим іменем",
|
||||
"impersonation_description": "Налаштування входу під іншим іменем",
|
||||
"users": "Користувачі",
|
||||
"profile_description": "Керуйте налаштуваннями свого профілю {{appName}}",
|
||||
"users_description": "Тут наведено список усіх користувачів",
|
||||
"users_listing": "Список користувачів",
|
||||
"general_description": "Налаштуйте параметри мови й часового поясу",
|
||||
"calendars_description": "Налаштуйте, як типи заходів мають взаємодіяти з вашими календарями",
|
||||
"appearance_description": "Налаштуйте варіанти оформлення свого бронювання",
|
||||
@@ -1360,6 +1387,7 @@
|
||||
"number_sms_notifications": "Номер телефону (SMS-сповіщення)",
|
||||
"attendee_email_workflow": "Адреса ел. пошти учасника",
|
||||
"attendee_email_info": "Адреса ел. пошти особи, яка бронює",
|
||||
"kbar_search_placeholder": "Введіть команду або пошуковий запис…",
|
||||
"invalid_credential": "Отакої! Схоже, дозвіл більше не дійсний або його відкликано. Перевстановіть додаток знову.",
|
||||
"choose_common_schedule_team_event": "Виберіть спільний розклад",
|
||||
"choose_common_schedule_team_event_description": "Увімкніть цей параметр, щоб використовувати спільний для двох ведучих розклад. Якщо цей параметр вимкнено, бронювання для кожного з ведучих відбуватиметься за їхніми власними графіками.",
|
||||
@@ -1370,5 +1398,43 @@
|
||||
"test_preview": "Перевірити попередній перегляд",
|
||||
"route_to": "Кінцева точка",
|
||||
"test_preview_description": "Перевірте свою форму переспрямування без надсилання даних",
|
||||
"test_routing": "Перевірка переспрямування"
|
||||
"test_routing": "Перевірка переспрямування",
|
||||
"payment_app_disabled": "Додаток для оплати вимкнув адміністратор",
|
||||
"edit_event_type": "Редагувати тип заходу",
|
||||
"collective_scheduling": "Колективне планування",
|
||||
"make_it_easy_to_book": "Просте бронювання у випадках, коли всі члени вашої команди доступні.",
|
||||
"find_the_best_person": "Пошук найкращого доступного члена команди та циклічна ротація між ними.",
|
||||
"fixed_round_robin": "Фіксована циклічна ротація",
|
||||
"add_one_fixed_attendee": "Додавання одного фіксованого учасника та циклічна ротація між кількома учасниками.",
|
||||
"calcom_is_better_with_team": "З Cal.com краще працювати в командах",
|
||||
"add_your_team_members": "Додавайте членів своєї команди в типи заходів. Колективне планування дає змогу включати всіх або знаходити найвідповіднішого члена завдяки циклічній ротації.",
|
||||
"booking_limit_reached": "Для цього типу заходу досягнуто ліміт бронювання",
|
||||
"admin_has_disabled": "Адміністратор вимкнув {{appName}}",
|
||||
"disabled_app_affects_event_type": "Адміністратор вимкнув {{appName}}, що впливає на ваш тип заходу «{{eventType}}»",
|
||||
"disable_payment_app": "Адміністратор вимкнув {{appName}}, що впливає на ваш тип заходу «{{title}}». Учасники все одно можуть бронювати події такого типу, але від них не вимагатиметься оплата. Ви можете приховати цей тип заходу, щоб цього не ставалося, та дочекатися на активацію способу оплати з боку адміністратора.",
|
||||
"payment_disabled_still_able_to_book": "Учасники все одно можуть бронювати події такого типу, але від них не вимагатиметься оплата. Ви можете приховати цей тип заходу, щоб цього не ставалося, та дочекатися на активацію способу оплати з боку адміністратора.",
|
||||
"app_disabled_with_event_type": "Адміністратор вимкнув {{appName}}, що впливає на ваш тип заходу «{{title}}».",
|
||||
"app_disabled_video": "Адміністратор вимкнув {{appName}}, що впливає на ваші типи заходів. Якщо у вас є типи заходів, де {{appName}} визначає розташування, за замовчуванням використовуватиметься Cal Video.",
|
||||
"app_disabled_subject": "{{appName}} вимкнено",
|
||||
"navigate_installed_apps": "Перейти до встановлених додатків",
|
||||
"disabled_calendar": "Якщо ви встановите інший календар, у нього буде додано нові бронювання. Якщо цього не станеться, під’єднайте новий календар, щоб не пропускати нові бронювання.",
|
||||
"enable_apps": "Увімкнення додатків",
|
||||
"enable_apps_description": "Активуйте додатки, які користувачі зможуть інтегрувати з Cal.com",
|
||||
"app_is_enabled": "{{appName}} увімкнено",
|
||||
"app_is_disabled": "{{appName}} вимкнено",
|
||||
"keys_have_been_saved": "Ключі збережено",
|
||||
"disable_app": "Вимкнути додаток",
|
||||
"disable_app_description": "Якщо вимкнути цей додаток, у користувачів можуть виникнути проблеми із роботою з Cal",
|
||||
"edit_keys": "Редагувати ключі",
|
||||
"no_available_apps": "Немає доступних додатків",
|
||||
"no_available_apps_description": "Перевірте, чи в «packages/app-store» є додатки для розгортання",
|
||||
"no_apps": "У цьому екземплярі Cal немає ввімкнених додатків",
|
||||
"apps_settings": "Налаштування додатків",
|
||||
"fill_this_field": "Заповніть це поле",
|
||||
"options": "Варіанти",
|
||||
"enter_option": "Введіть варіант {{index}}",
|
||||
"add_an_option": "Додайте варіант",
|
||||
"radio": "Радіо",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-копія",
|
||||
"set_as_default": "Встановити за замовчуванням"
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
"event_request_cancelled": "Sự kiện của bạn đã bị huỷ",
|
||||
"organizer": "Tổ chức",
|
||||
"need_to_reschedule_or_cancel": "Cần phải đổi lịch hẹn hoặc huỷ?",
|
||||
"cancellation_reason": "Lý do huỷ",
|
||||
"cancellation_reason_placeholder": "Tại sao bạn huỷ? (nếu có)",
|
||||
"cancellation_reason": "Lý do hủy",
|
||||
"cancellation_reason_placeholder": "Lý do bạn muốn hủy?",
|
||||
"rejection_reason": "Lý do từ chối",
|
||||
"rejection_reason_title": "Từ chối lịch hẹn?",
|
||||
"rejection_reason_description": "Bạn có chắc bạn muốn từ chối đặt lịch hẹn? Chúng tôi sẽ cho người đặt biết. Bạn có thể cho người dùng biết lý do từ chối dưới đây.",
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "Một sự kiện vẫn đang chờ được chấp thuận",
|
||||
"event_is_still_waiting": "Lời mời sự kiện vẫn đang chờ: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "Không còn kết quả",
|
||||
"no_results": "Không có kết quả",
|
||||
"load_more_results": "Tải thêm kết quả",
|
||||
"integration_meeting_id": "{{integrationName}} ID buổi hẹn: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "Đã chấp nhận: {{eventType}} với {{name}} tại {{date}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "Thêm vào lịch",
|
||||
"add_another_calendar": "Thêm lịch khác",
|
||||
"other": "Khác",
|
||||
"email_sign_in_subject": "Liên kết đăng nhập cho {{appName}}",
|
||||
"emailed_you_and_attendees": "Chúng tôi đã gửi email cho bạn và những người tham dự khác một lời mời theo lịch hẹn với tất cả các chi tiết đi kèm.",
|
||||
"emailed_you_and_attendees_recurring": "Chúng tôi đã gửi email cho bạn và những người tham dự khác một lời mời theo lịch hẹn cho sự kiện định kỳ đầu tiên trong số những sự kiện định kỳ này.",
|
||||
"emailed_you_and_any_other_attendees": "Bạn và mọi người tham dự khác đã được gửi email với thông tin này.",
|
||||
@@ -419,7 +421,8 @@
|
||||
"forgotten_secret_description": "Nếu bạn mất hoặc quên từ bí mật này, bạn có thể đổi nó, nhưng hãy biết cho tất cả mọi tích hợp dùng từ bí mật này sẽ cần được cập nhật",
|
||||
"current_incorrect_password": "Mật khẩu hiện tại không đúng",
|
||||
"password_hint_caplow": "Kết hợp các chữ cái in hoa & in thường",
|
||||
"password_hint_min": "Tối thiểu có 7 ký tự",
|
||||
"password_hint_min": "Dài tối thiểu 8 ký tự",
|
||||
"password_hint_admin_min": "Dài tối thiểu 15 ký tự",
|
||||
"password_hint_num": "Chứa ít nhất 1 con số",
|
||||
"invalid_password_hint": "Mật khẩu phải có tối thiểu 7 ký tự chứa ít nhất một con số và phải kết hợp chữ cái in hoa lẫn in thường",
|
||||
"incorrect_password": "Mật khẩu không đúng.",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "Xác nhận {{eventTypeTitle}} của bạn với {{profileName}}",
|
||||
"booking_reschedule_confirmation": "Lên lịch lại {{eventTypeTitle}} của bạn với {{profileName}}",
|
||||
"in_person_meeting": "Gặp mặt trực tiếp",
|
||||
"attendeeInPerson": "Đích thân (địa chỉ người tham gia)",
|
||||
"inPerson": "Đích thân (địa chỉ người tổ chức)",
|
||||
"link_meeting": "Liên kết cuộc họp",
|
||||
"phone_call": "Số điện thoại của người tham gia",
|
||||
"your_number": "Số điện thoại của bạn",
|
||||
"phone_number": "Số điện thoại",
|
||||
"attendee_phone_number": "Số điện thoại của người tham gia",
|
||||
"organizer_phone_number": "Số điện thoại người tổ chức",
|
||||
"host_phone_number": "Số điện thoại của bạn",
|
||||
"enter_phone_number": "Nhập số điện thoại",
|
||||
"reschedule": "Thay đổi lịch hẹn",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "Tập thể",
|
||||
"collective_description": "Lên lịch họp khi tất cả các thành viên trong nhóm đã chọn đều có mặt.",
|
||||
"duration": "Khoảng thời gian",
|
||||
"available_durations": "Khoảng thời gian khả dụng",
|
||||
"default_duration": "Khoảng thời gian mặc định",
|
||||
"default_duration_no_options": "Vui lòng chọn trước tiên những khoảng thời gian khả dụng",
|
||||
"multiple_duration_mins": "{{count}}$t(minute_timeUnit)",
|
||||
"minutes": "Phút",
|
||||
"round_robin": "Round Robin",
|
||||
"round_robin_description": "Luân phiên những cuộc họp giữa các thành viên trong nhóm.",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "Các nhóm",
|
||||
"team": "Nhóm",
|
||||
"team_billing": "Thanh toán nhóm",
|
||||
"team_billing_description": "Quản lí thanh toán cho đội ngũ của bạn",
|
||||
"upgrade_to_flexible_pro_title": "Chúng tôi đã thay đổi thanh toán cho các nhóm",
|
||||
"upgrade_to_flexible_pro_message": "Có những thành viên trong nhóm của bạn không có gói. Nâng cấp gói PRO của bạn để trang trải những gói bị thiếu.",
|
||||
"changed_team_billing_info": "Kể từ tháng 1 năm 2022, chúng tôi tính phí trên cơ sở từng người cho các thành viên trong nhóm. Các thành viên trong nhóm của bạn mà từng có PRO miễn phí nay sẽ chuyển sang dùng thử 14 ngày. Khi thời gian dùng thử hết hạn, các thành viên này sẽ bị ẩn khỏi nhóm của bạn trừ khi bạn nâng cấp.",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "Ẩn loại sự kiện",
|
||||
"edit_location": "Chỉnh sửa vị trí",
|
||||
"into_the_future": "trong tương lai",
|
||||
"when_booked_with_less_than_notice": "Khi đặt hẹn với khoảng thời gian thông báo ít hơn <time></time>",
|
||||
"within_date_range": "Trong phạm vi ngày",
|
||||
"indefinitely_into_future": "Vô thời hạn trong tương lai",
|
||||
"add_new_custom_input_field": "Thêm trường tùy chỉnh mới",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "Bạn có chắc chắn muốn xóa tài khoản {{appName}} của mình không? Bất kỳ ai mà bạn đã chia sẻ liên kết tài khoản của mình sẽ không thể đặt trước bằng liên kết đó nữa và mọi tùy chọn bạn đã lưu sẽ bị mất.",
|
||||
"integrations": "Tích hợp",
|
||||
"apps": "Ứng dụng",
|
||||
"apps_listing": "Danh sách ứng dụng",
|
||||
"category_apps": "Ứng dụng {{category}}",
|
||||
"app_store": "Cửa hàng ứng dụng",
|
||||
"app_store_description": "Kết nối con người, công nghệ và nơi làm việc.",
|
||||
@@ -736,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "Bật lịch mà bạn muốn kiểm tra trùng ngày để tránh đặt lịch hẹn trùng.",
|
||||
"select_destination_calendar": "Tạo sự kiện trên",
|
||||
"connect_additional_calendar": "Kết nối lịch bổ sung",
|
||||
"calendar_updated_successfully": "Đã cập nhật lịch thành công",
|
||||
"conferencing": "Hội nghị",
|
||||
"calendar": "Lịch",
|
||||
"payments": "Thanh toán",
|
||||
@@ -768,6 +782,7 @@
|
||||
"trending_apps": "Ứng dụng thịnh hành",
|
||||
"explore_apps": "{{category}} ứng dụng",
|
||||
"installed_apps": "Ứng dụng đã cài đặt",
|
||||
"free_to_use_apps": "Miễn phí",
|
||||
"no_category_apps": "Không có ứng dụng {{category}}",
|
||||
"no_category_apps_description_calendar": "Thêm một ứng dụng lịch để kiểm tra xung đột nhằm tránh đặt lịch hẹn trùng",
|
||||
"no_category_apps_description_conferencing": "Thử thêm vào một ứng dụng hội nghị để hợp nhất cuộc gọi video với khách hàng của bạn",
|
||||
@@ -784,7 +799,7 @@
|
||||
"analytics": "Phân tích",
|
||||
"empty_installed_apps_headline": "Chưa cài ứng dụng nào",
|
||||
"empty_installed_apps_description": "Ứng dụng cho phép bạn cải thiện tiến độ công việc và cải thiện đáng kể việc sắp xếp tổ chức.",
|
||||
"empty_installed_apps_button": "Khám phá App Store hoặc Cài đặt các ứng dụng dưới đây",
|
||||
"empty_installed_apps_button": "Duyệt xem App Store",
|
||||
"manage_your_connected_apps": "Quản lý các ứng dụng đã cài đặt của bạn hoặc thay đổi cài đặt",
|
||||
"browse_apps": "Xem ứng dụng",
|
||||
"features": "Tính năng",
|
||||
@@ -806,6 +821,8 @@
|
||||
"verify_wallet": "Xác minh Ví",
|
||||
"connect_metamask": "Kết nối Metamask",
|
||||
"create_events_on": "Tạo sự kiện trên",
|
||||
"enterprise_license": "Đây là tính năng doanh nghiệp",
|
||||
"enterprise_license_description": "Để bật tính năng này, nhận khoá triển khai tại console {{consoleUrl}} và thêm nó vào .env của bạn ở dạng CALCOM_LICENSE_KEY. Nếu nhóm của bạn đã có giấy phép, vui lòng liên hệ {{supportMail}} để được trợ giúp.",
|
||||
"missing_license": "Giấy phép bị thiếu",
|
||||
"signup_requires": "Yêu cầu giấy phép thương mại",
|
||||
"signup_requires_description": "{{companyName}} hiện không cung cấp phiên bản nguồn mở miễn phí của trang đăng ký. Để nhận toàn quyền truy cập vào các thành phần đăng ký, bạn cần có giấy phép thương mại. Đối với mục đích sử dụng cá nhân, chúng tôi khuyên bạn nên sử dụng Nền tảng dữ liệu Prisma hoặc bất kỳ giao diện Postgres nào khác để tạo tài khoản.",
|
||||
@@ -897,6 +914,7 @@
|
||||
"user_impersonation_heading": "Mạo danh người dùng",
|
||||
"user_impersonation_description": "Cho phép đội ngũ hỗ trợ tạm thời đăng nhập với tư cách là bạn nhằm giúp chúng tôi nhanh chóng giải quyết mọi vấn đề mà bạn báo cáo cho chúng tôi.",
|
||||
"team_impersonation_description": "Cho phép các quản trị viên của nhóm bạn tạm thời đăng nhập bằng danh tính của bạn.",
|
||||
"allow_booker_to_select_duration": "Cho phép người đặt hẹn chọn khoảng thời gian",
|
||||
"impersonate_user_tip": "Tất cả những lần dùng tính năng này đều bị kiểm toán.",
|
||||
"impersonating_user_warning": "Đang mạo danh tên người dùng \"{{user}}\".",
|
||||
"impersonating_stop_instructions": "<0>Nhấp vào đây để ngừng lại</0>.",
|
||||
@@ -1014,6 +1032,9 @@
|
||||
"error_removing_app": "Lỗi khi gỡ bỏ ứng dụng",
|
||||
"web_conference": "Hội nghị web",
|
||||
"requires_confirmation": "Yêu cầu xác nhận",
|
||||
"always_requires_confirmation": "Luôn luôn",
|
||||
"requires_confirmation_threshold": "Cần xác nhận nếu đặt hẹn với thông báo trước chưa đầy {{time}}$t({{unit}}_timeUnit)",
|
||||
"may_require_confirmation": "Có thể yêu cầu xác nhận",
|
||||
"nr_event_type_one": "{{count}} loại sự kiện",
|
||||
"nr_event_type_other": "{{count}} loại sự kiện",
|
||||
"add_action": "Thêm hoạt động",
|
||||
@@ -1101,6 +1122,9 @@
|
||||
"event_limit_tab_description": "Bạn có thể được đặt lịch bao lần",
|
||||
"event_advanced_tab_description": "Cài đặt cho lịch & nhiều tính năng khác...",
|
||||
"event_advanced_tab_title": "Nâng cao",
|
||||
"event_setup_multiple_duration_error": "Thiết lập sự kiện: Nhiều khoảng thời gian cần ít nhất 1 tuỳ chọn.",
|
||||
"event_setup_multiple_duration_default_error": "Thiết lập sự kiện: Vui lòng chọn một khoảng thời gian mặc định hợp lệ.",
|
||||
"event_setup_booking_limits_error": "Giới hạn lịch hẹn phải theo thứ tự tăng dần. [day,week,month,year]",
|
||||
"select_which_cal": "Chọn lịch nào cần thêm lịch hẹn vào",
|
||||
"custom_event_name": "Tên sự kiện tuỳ chỉnh",
|
||||
"custom_event_name_description": "Tạo những tên sự kiện tuỳ chỉnh để hiển thị ở phần sự kiện lịch",
|
||||
@@ -1154,8 +1178,11 @@
|
||||
"invoices": "Hoá đơn",
|
||||
"embeds": "Nhúng",
|
||||
"impersonation": "Mạo danh",
|
||||
"impersonation_description": "Cài đặt để quản lý mạo danh người dùng",
|
||||
"users": "Người dùng",
|
||||
"profile_description": "Quản lí cài đặt cho hồ sơ {{appName}} của bạn",
|
||||
"users_description": "Tại đây bạn có thể tìm thấy danh sách tất cả người dùng",
|
||||
"users_listing": "Danh sách người dùng",
|
||||
"general_description": "Quản lí cài đặt cho ngôn ngữ và múi giờ của bạn",
|
||||
"calendars_description": "Cấu hình cách các loại sự kiện của bạn tương tác với lịch của bạn",
|
||||
"appearance_description": "Quản lí cài đặt cho giao diện lịch hẹn của bạn",
|
||||
@@ -1356,19 +1383,59 @@
|
||||
"must_enter_team_name": "Cần phải nhập một tên nhóm",
|
||||
"team_url_required": "Cần phải nhập một URL của nhóm",
|
||||
"team_url_taken": "URL này đã có người lấy rồi",
|
||||
"team_publish": "Công bố nhóm",
|
||||
"team_publish": "Đăng nhóm",
|
||||
"number_sms_notifications": "Số điện thoại (thông báo SMS)",
|
||||
"attendee_email_workflow": "Email người tham dự",
|
||||
"attendee_email_info": "Email người tham gia lịch hẹn",
|
||||
"kbar_search_placeholder": "Nhập một lệnh hoặc tìm kiếm...",
|
||||
"invalid_credential": "Ôi không! Có vẻ như quyền đã hết hạn hoặc đã bị thu hồi. Vui lòng cài đặt lại.",
|
||||
"choose_common_schedule_team_event": "Chọn một lịch chung",
|
||||
"choose_common_schedule_team_event_description": "Bật cái này nếu bạn muốn dùng lịch thông thường giữa các chủ sự kiện. Khi tắt đi, mỗi chủ sự kiện sẽ được đặt lịch theo lịch mặc định của họ.",
|
||||
"choose_common_schedule_team_event_description": "Bật mục này nếu bạn muốn dùng lịch thông thường giữa các chủ sự kiện. Khi tắt đi, mỗi chủ sự kiện sẽ được đặt lịch theo lịch mặc định của họ.",
|
||||
"reason": "Lý do",
|
||||
"sender_id": "ID người gửi",
|
||||
"sender_id_error_message": "Chỉ chữ cái, số và khoảng trắng là được phép (tối đa 11 ký tự)",
|
||||
"sender_id_error_message": "Chỉ được phép sử dụng chữ cái, số và khoảng trắng (tối đa 11 ký tự)",
|
||||
"test_routing_form": "Kiểm tra Biểu mẫu định hướng",
|
||||
"test_preview": "Kiểm tra Xem trước",
|
||||
"route_to": "Định hướng đến",
|
||||
"test_preview_description": "Kiểm tra biểu mẫu định hướng mà không cần gửi bất kỳ dữ liệu nào",
|
||||
"test_routing": "Kiểm tra định hướng"
|
||||
"test_routing": "Kiểm tra định hướng",
|
||||
"payment_app_disabled": "Một quản trị viên đã vô hiệu hoá một ứng dụng thanh toán",
|
||||
"edit_event_type": "Sửa loại sự kiện",
|
||||
"collective_scheduling": "Lên lịch tập thể",
|
||||
"make_it_easy_to_book": "Tạo điều kiện dễ dàng đặt lịch cho nhóm của bạn khi mọi người đều rảnh.",
|
||||
"find_the_best_person": "Tìm người tốt nhất có được và xoay vòng trong nhóm bạn.",
|
||||
"fixed_round_robin": "Round robin cố định",
|
||||
"add_one_fixed_attendee": "Thêm một người tham dự và round robin cố định thông qua số người tham dự.",
|
||||
"calcom_is_better_with_team": "Cal.com tốt hơn với nhóm",
|
||||
"add_your_team_members": "Thêm những thành viên nhóm của bạn vào những loại sự kiện của bạn. Sử dụng lên lịch tập thể để bao gồm mọi người hoặc tìm người thích hợp nhất với chức năng lên lịch round robin.",
|
||||
"booking_limit_reached": "Đã đạt mức giới hạn đặt hẹn cho loại sự kiện này",
|
||||
"admin_has_disabled": "Một quản trị viên đã tắt {{appName}}",
|
||||
"disabled_app_affects_event_type": "Một quản trị viên đã tắt {{appName}} vốn có ảnh hưởng đến loại sự kiện {{eventType}}",
|
||||
"disable_payment_app": "Một quản trị viên đã tắt {{appName}} vốn có ảnh hưởng đến loại sự kiện {{title}}. Người tham dự vẫn có thể đặt hẹn cho loại sự kiện này nhưng sẽ được nhắc trả phí. Bạn có thể ẩn loại sự kiện này để tránh điều này cho đến khi quản trị viên kích hoạt lại phương thức thanh toán của bạn.",
|
||||
"payment_disabled_still_able_to_book": "Người tham dự vẫn có thể đặt hẹn cho loại sự kiện này nhưng sẽ được nhắc trả phí. Bạn có thể ẩn loại sự kiện này để tránh điều này cho đến khi quản trị viên kích hoạt lại phương thức thanh toán của bạn.",
|
||||
"app_disabled_with_event_type": "Quản trị viên đã tắt {{appName}} vốn có ảnh hưởng đến loại sự kiện {{title}}.",
|
||||
"app_disabled_video": "Quản trị viên đã tắt {{appName}} vốn có ảnh hưởng đến những loại sự kiện của bạn. Nếu bạn có những loại sự kiện với {{appName}} ở dạng vị trí thì nó sẽ mặc định gắn với Cal Video.",
|
||||
"app_disabled_subject": "{{appName}} đã được tắt",
|
||||
"navigate_installed_apps": "Đến những ứng dụng được cài đặt",
|
||||
"disabled_calendar": "Nếu bạn có lịch khác được cài đặt, những mục đặt hẹn mới sẽ được thêm vào đó. Nếu không thì hãy kết nối với lịch mới để bạn không bỏ lỡ bất cứ mục đặt hẹn mới nào.",
|
||||
"enable_apps": "Kích hoạt ứng dụng",
|
||||
"enable_apps_description": "Kích hoạt những ứng dụng mà người dùng có thể tích hợp với Cal.com",
|
||||
"app_is_enabled": "{{appName}} đã được kích hoạt",
|
||||
"app_is_disabled": "{{appName}} đã được vô hiệu hoá",
|
||||
"keys_have_been_saved": "Các khoá đã được lưu lại",
|
||||
"disable_app": "Vô hiệu hoá ứng dụng",
|
||||
"disable_app_description": "Việc vô hiệu hoá ứng dụng này có thể gây rắc rối cho cách thức người dùng tương tác với Cal",
|
||||
"edit_keys": "Sửa các khoá",
|
||||
"admin_apps_description": "Bật các ứng dụng cho thực thể Cal của bạn",
|
||||
"no_available_apps": "Không có ứng dụng nào khả dụng",
|
||||
"no_available_apps_description": "Vui lòng bảo đảm rằng có những ứng dụng trong phần triển khai trong 'packages/app-store'",
|
||||
"no_apps": "Không ứng dụng được kích hoạt cho thể hiện này của Cal",
|
||||
"apps_settings": "Cài đặt của ứng dụng",
|
||||
"fill_this_field": "Vui lòng điền vào trường này",
|
||||
"options": "Tuỳ chọn",
|
||||
"enter_option": "Nhập vào tuỳ chọn {{index}}",
|
||||
"add_an_option": "Thêm một tuỳ chọn",
|
||||
"radio": "Radio",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-copy",
|
||||
"set_as_default": "Đặt làm mặc định"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "有活动正在等待您的批准",
|
||||
"event_is_still_waiting": "活动请求仍在等待中: {{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "无更多结果",
|
||||
"no_results": "无结果",
|
||||
"load_more_results": "加载更多结果",
|
||||
"integration_meeting_id": "{{integrationName}} 会议 ID: {{meetingId}}",
|
||||
"confirmed_event_type_subject": "已确认: 和 {{name}} 在 {{date}} 的 {{eventType}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "添加到日历",
|
||||
"add_another_calendar": "添加另一个日历",
|
||||
"other": "其他",
|
||||
"email_sign_in_subject": "您的 {{appName}} 登录链接",
|
||||
"emailed_you_and_attendees": "我们通过电子邮件给您和其他参与者发送了一份包含所有详细信息的日历邀请。",
|
||||
"emailed_you_and_attendees_recurring": "我们通过电子邮件给您和其他参与者发送了第一次定期活动的日历邀请。",
|
||||
"emailed_you_and_any_other_attendees": "已向您和其他参与者发送了关于此信息的电子邮件",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "当前密码不正确",
|
||||
"password_hint_caplow": "大写和小写字母混合",
|
||||
"password_hint_min": "至少 8 个字符长",
|
||||
"password_hint_admin_min": "至少 15 个字符长",
|
||||
"password_hint_num": "包含至少 1 个数字",
|
||||
"invalid_password_hint": "密码必须是至少 7 个字符长,包含至少一个数字,并且是大写和小写字母混合",
|
||||
"incorrect_password": "密码不正确。",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "确认您和 {{profileName}} 的 {{eventTypeTitle}}",
|
||||
"booking_reschedule_confirmation": "重新安排您和 {{profileName}} 的 {{eventTypeTitle}}",
|
||||
"in_person_meeting": "线上或线下会议",
|
||||
"attendeeInPerson": "本人(参与者地址)",
|
||||
"inPerson": "本人(组织者地址)",
|
||||
"link_meeting": "线上会议",
|
||||
"phone_call": "参与者电话号码",
|
||||
"your_number": "您的电话号码",
|
||||
"phone_number": "电话号码",
|
||||
"attendee_phone_number": "参与者电话号码",
|
||||
"organizer_phone_number": "组织者电话号码",
|
||||
"host_phone_number": "您的电话号码",
|
||||
"enter_phone_number": "输入电话号码",
|
||||
"reschedule": "重新安排",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "集体模式",
|
||||
"collective_description": "当所有选定的团队成员都可预约时安排会议。",
|
||||
"duration": "时长",
|
||||
"available_durations": "可用时长",
|
||||
"default_duration": "默认时长",
|
||||
"default_duration_no_options": "请先选择可用时长",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "分钟",
|
||||
"round_robin": "轮流模式",
|
||||
"round_robin_description": "和多个团队成员之间轮流举行会议。",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "团队",
|
||||
"team": "团队",
|
||||
"team_billing": "团队计费",
|
||||
"team_billing_description": "管理您团队的计费",
|
||||
"upgrade_to_flexible_pro_title": "我们更改了团队的计费方式",
|
||||
"upgrade_to_flexible_pro_message": "您的团队中有没有位置的成员。升级到专业版来获得更多位置。",
|
||||
"changed_team_billing_info": "自2022年1月起,我们将按每个位置向团队成员收取费用。 您的团队中免费获得专业版的成员现在正在进行为期14天的试用。 试用期结束后,这些成员将在您的团队中隐藏,除非您现在升级到专业版。",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "隐藏活动类型",
|
||||
"edit_location": "编辑位置",
|
||||
"into_the_future": "未来的时间",
|
||||
"when_booked_with_less_than_notice": "以少于 <time></time> 的通知提前时间预约后",
|
||||
"within_date_range": "在日期范围内",
|
||||
"indefinitely_into_future": "未来无限时间",
|
||||
"add_new_custom_input_field": "新增自定义输入字段",
|
||||
@@ -713,6 +725,8 @@
|
||||
"delete_account_confirmation_message": "您确定要删除您的 {{appName}} 账户? 任何曾通过您的账户链接与您预约过的人都将无法再使用它和您预约,您保存的任何偏好设置都将丢失。",
|
||||
"integrations": "集成",
|
||||
"apps": "应用",
|
||||
"apps_description": "为您的 Cal 实例启用应用",
|
||||
"apps_listing": "应用列表",
|
||||
"category_apps": "{{category}}应用",
|
||||
"app_store": "应用商店",
|
||||
"app_store_description": "连接人员、技术和工作场所。",
|
||||
@@ -736,6 +750,7 @@
|
||||
"toggle_calendars_conflict": "切换要检查冲突的日历,以防止重复预约。",
|
||||
"select_destination_calendar": "创建活动于",
|
||||
"connect_additional_calendar": "连接其他日历",
|
||||
"calendar_updated_successfully": "日历已成功更新",
|
||||
"conferencing": "会议",
|
||||
"calendar": "日历",
|
||||
"payments": "付款",
|
||||
@@ -768,6 +783,7 @@
|
||||
"trending_apps": "热门应用",
|
||||
"explore_apps": "{{category}}应用",
|
||||
"installed_apps": "已安装的应用",
|
||||
"free_to_use_apps": "免费",
|
||||
"no_category_apps": "无{{category}}应用",
|
||||
"no_category_apps_description_calendar": "添加日历应用以检查冲突,防止重复预约",
|
||||
"no_category_apps_description_conferencing": "尝试添加会议应用以整合与客户的视频通话",
|
||||
@@ -806,6 +822,8 @@
|
||||
"verify_wallet": "验证钱包",
|
||||
"connect_metamask": "连接元掩码",
|
||||
"create_events_on": "活动创建于:",
|
||||
"enterprise_license": "这是企业版功能",
|
||||
"enterprise_license_description": "要启用此功能,请在 {{consoleUrl}} 控制台获取一个部署密钥,并将其添加到您的 .env 中作为 CALCOM_LICENSE_KEY。如果您的团队已经有许可证,请联系 {{supportMail}} 获取帮助。",
|
||||
"missing_license": "缺少许可证",
|
||||
"signup_requires": "需要商业许可证",
|
||||
"signup_requires_description": "{{companyName}} 免费开源版目前不提供的注册页面。 要获得对注册页面组件的完全访问权,您需要获得商业许可证。 对于个人使用用途,我们推荐使用Prisma 数据平台或任何其他Postgres接口创建账户。",
|
||||
@@ -897,6 +915,7 @@
|
||||
"user_impersonation_heading": "用户模拟",
|
||||
"user_impersonation_description": "允许我们的支持团队临时以您的身份登录,帮助我们快速解决您报告给我们的问题。",
|
||||
"team_impersonation_description": "允许您的团队成员以您的身份临时登录。",
|
||||
"allow_booker_to_select_duration": "允许预约者选择时长",
|
||||
"impersonate_user_tip": "此功能的所有使用都已审核。",
|
||||
"impersonating_user_warning": "正在模拟用户名“{{user}}”。",
|
||||
"impersonating_stop_instructions": "<0>点击此处停止</0>。",
|
||||
@@ -1014,6 +1033,9 @@
|
||||
"error_removing_app": "删除应用时出错",
|
||||
"web_conference": "网络会议",
|
||||
"requires_confirmation": "需要确认",
|
||||
"always_requires_confirmation": "始终",
|
||||
"requires_confirmation_threshold": "如果预约通知提前时间少于 {{time}}$t({{unit}}_timeUnit),则需要确认",
|
||||
"may_require_confirmation": "可能需要确认",
|
||||
"nr_event_type_one": "{{count}} 种活动类型",
|
||||
"nr_event_type_other": "{{count}} 种活动类型",
|
||||
"add_action": "添加操作",
|
||||
@@ -1101,6 +1123,9 @@
|
||||
"event_limit_tab_description": "您多久可被预约一次",
|
||||
"event_advanced_tab_description": "日历设置及更多...",
|
||||
"event_advanced_tab_title": "高级",
|
||||
"event_setup_multiple_duration_error": "活动设置: 多个时长需要至少 1 个选项。",
|
||||
"event_setup_multiple_duration_default_error": "活动设置: 请选择有效的默认时长。",
|
||||
"event_setup_booking_limits_error": "预约限制必须按升序排列。[日,周,月,年]",
|
||||
"select_which_cal": "选择要添加预约的日历",
|
||||
"custom_event_name": "自定义活动名称",
|
||||
"custom_event_name_description": "创建要在日历活动上显示的自定义活动名称",
|
||||
@@ -1154,8 +1179,11 @@
|
||||
"invoices": "发票",
|
||||
"embeds": "嵌入项",
|
||||
"impersonation": "模拟",
|
||||
"impersonation_description": "用于管理用户模拟的设置",
|
||||
"users": "用户",
|
||||
"profile_description": "管理您的 {{appName}} 个人资料的设置",
|
||||
"users_description": "在这里可以找到所有用户的列表",
|
||||
"users_listing": "用户列表",
|
||||
"general_description": "管理语言和时区的设置",
|
||||
"calendars_description": "配置您的活动类型与日历的交互方式",
|
||||
"appearance_description": "管理预约页面外观的设置",
|
||||
@@ -1360,6 +1388,7 @@
|
||||
"number_sms_notifications": "电话号码(短信通知)",
|
||||
"attendee_email_workflow": "参与者电子邮件",
|
||||
"attendee_email_info": "预约人的电子邮件",
|
||||
"kbar_search_placeholder": "输入命令或搜索...",
|
||||
"invalid_credential": "哦不!看起来权限已过期或被撤销。请重新安装。",
|
||||
"choose_common_schedule_team_event": "选择通用时间表",
|
||||
"choose_common_schedule_team_event_description": "如果您希望在主持人之间使用通用时间表,请启用此选项。如果禁用,将根据主持人的默认时间表预约每个主持人。",
|
||||
@@ -1370,5 +1399,44 @@
|
||||
"test_preview": "测试预览",
|
||||
"route_to": "根据途径找到",
|
||||
"test_preview_description": "测试途径表格而不提交任何数据",
|
||||
"test_routing": "测试途径"
|
||||
"test_routing": "测试途径",
|
||||
"payment_app_disabled": "管理员已禁用支付应用",
|
||||
"edit_event_type": "编辑活动类型",
|
||||
"collective_scheduling": "集体日程安排",
|
||||
"make_it_easy_to_book": "当每个人都可预约时,可轻松预约您的团队。",
|
||||
"find_the_best_person": "查找最合适的人选,在您的团队内轮流选择。",
|
||||
"fixed_round_robin": "固定轮流模式",
|
||||
"add_one_fixed_attendee": "添加一名固定参与者,在多名参与者中轮流选择。",
|
||||
"calcom_is_better_with_team": "Cal.com 更适合团队",
|
||||
"add_your_team_members": "将您的团队成员添加到您的活动类型。使用集体日程安排来包括所有人或以轮流安排的方式找到最适合的人员。",
|
||||
"booking_limit_reached": "已达到此活动类型的预约限制",
|
||||
"admin_has_disabled": "管理员已禁用 {{appName}}",
|
||||
"disabled_app_affects_event_type": "管理员已禁用会影响活动类型 {{eventType}} 的 {{appName}}",
|
||||
"disable_payment_app": "管理员已禁用会影响活动类型 {{title}} 的 {{appName}}。参与者仍然能预约此类型的活动,但不会被提示付款。您可以隐藏该活动类型来防止出现这种情况,直到管理员重新启用您的支付方式。",
|
||||
"payment_disabled_still_able_to_book": "参与者仍然能预约此类型的活动,但不会被提示付款。您可以隐藏该活动类型来防止出现这种情况,直到管理员重新启用您的支付方式。",
|
||||
"app_disabled_with_event_type": "管理员已禁用会影响活动类型 {{title}} 的 {{appName}}。",
|
||||
"app_disabled_video": "管理员已禁用可能会影响活动类型的 {{appName}}。如果您有将 {{appName}} 作为位置的活动类型,则默认为 Cal Video。",
|
||||
"app_disabled_subject": "{{appName}} 已被禁用",
|
||||
"navigate_installed_apps": "转到已安装的应用",
|
||||
"disabled_calendar": "如果您安装了其他日历,新预约将添加至其中。如果没有,则会连接一个新日历,这样您就不会错过任何新预约。",
|
||||
"enable_apps": "启用应用",
|
||||
"enable_apps_description": "启用用户可以与 Cal.com 集成的应用",
|
||||
"app_is_enabled": "{{appName}} 已启用",
|
||||
"app_is_disabled": "{{appName}} 已禁用",
|
||||
"keys_have_been_saved": "密钥已保存",
|
||||
"disable_app": "禁用应用",
|
||||
"disable_app_description": "禁用此应用可能会导致您的用户与 Cal 的交互方式出现问题",
|
||||
"edit_keys": "编辑密钥",
|
||||
"admin_apps_description": "为您的 Cal 实例启用应用",
|
||||
"no_available_apps": "没有可用的应用",
|
||||
"no_available_apps_description": "请确保您在“packages/app-store”下的部署中有应用",
|
||||
"no_apps": "此 Cal 实例中未启用任何应用",
|
||||
"apps_settings": "应用设置",
|
||||
"fill_this_field": "请填写此字段",
|
||||
"options": "选项",
|
||||
"enter_option": "输入选项 {{index}}",
|
||||
"add_an_option": "添加选项",
|
||||
"radio": "无线电",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-副本",
|
||||
"set_as_default": "设置为默认"
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"still_waiting_for_approval": "活動還在等待核准",
|
||||
"event_is_still_waiting": "活動請求還在等待中:{{attendeeName}} - {{date}} - {{eventType}}",
|
||||
"no_more_results": "沒有更多結果",
|
||||
"no_results": "沒有任何結果",
|
||||
"load_more_results": "讀取更多結果",
|
||||
"integration_meeting_id": "{{integrationName}} 會議識別碼:{{meetingId}}",
|
||||
"confirmed_event_type_subject": "已確認:{{date}} 與 {{name}} 的 {{eventType}}",
|
||||
@@ -248,6 +249,7 @@
|
||||
"add_to_calendar": "加到行事曆",
|
||||
"add_another_calendar": "新增另一個行事曆",
|
||||
"other": "其它",
|
||||
"email_sign_in_subject": "您的「{{appName}}」登入連結",
|
||||
"emailed_you_and_attendees": "已經寄出行事曆邀請,包含其他與會者都會收到有全部細節的電子郵件。",
|
||||
"emailed_you_and_attendees_recurring": "已就這系列定期活動的首次活動,寄出行事曆邀請給您和其他與會者。",
|
||||
"emailed_you_and_any_other_attendees": "您與其他與會者已經收到這份資訊的電子郵件。",
|
||||
@@ -420,6 +422,7 @@
|
||||
"current_incorrect_password": "現有密碼不正確",
|
||||
"password_hint_caplow": "大小寫字母組合",
|
||||
"password_hint_min": "至少 8 個字元長",
|
||||
"password_hint_admin_min": "至少 15 個字元長",
|
||||
"password_hint_num": "至少包含 1 個數字",
|
||||
"invalid_password_hint": "密碼長度至少要有 7 個字元,其中包含至少一個數字和大小寫字母組合",
|
||||
"incorrect_password": "密碼不正確。",
|
||||
@@ -463,11 +466,14 @@
|
||||
"booking_confirmation": "向 {{profileName}} 確認{{eventTypeTitle}}。",
|
||||
"booking_reschedule_confirmation": "向 {{profileName}} 重新預定{{eventTypeTitle}}",
|
||||
"in_person_meeting": "實體會議",
|
||||
"attendeeInPerson": "親自赴會 (與會者地址)",
|
||||
"inPerson": "親自赴會 (主辦者地址)",
|
||||
"link_meeting": "線上會議",
|
||||
"phone_call": "與會者電話",
|
||||
"your_number": "您的電話號碼",
|
||||
"phone_number": "電話號碼",
|
||||
"attendee_phone_number": "與會者電話號碼",
|
||||
"organizer_phone_number": "主辦者電話號碼",
|
||||
"host_phone_number": "您的電話號碼",
|
||||
"enter_phone_number": "輸入電話號碼",
|
||||
"reschedule": "重新預定",
|
||||
@@ -554,6 +560,10 @@
|
||||
"collective": "全體",
|
||||
"collective_description": "所有挑選到成員都有空的時候預定會議。",
|
||||
"duration": "時間",
|
||||
"available_durations": "可預約的時間長度",
|
||||
"default_duration": "預設時間長度",
|
||||
"default_duration_no_options": "請先選擇可預約的時間長度",
|
||||
"multiple_duration_mins": "{{count}} $t(minute_timeUnit)",
|
||||
"minutes": "分鐘",
|
||||
"round_robin": "循環制",
|
||||
"round_robin_description": "與多位團隊成員進行週期會議。",
|
||||
@@ -619,6 +629,7 @@
|
||||
"teams": "團隊",
|
||||
"team": "團隊",
|
||||
"team_billing": "團隊收費",
|
||||
"team_billing_description": "管理您團隊的費用",
|
||||
"upgrade_to_flexible_pro_title": "我們已經改變團隊收費",
|
||||
"upgrade_to_flexible_pro_message": "在團隊裡,有成員沒有座位。升級為 Pro 方案就可以補上缺少的座位。",
|
||||
"changed_team_billing_info": "2022 年一月起,我們會依照團隊成員的座位數進行收費。曾經免費使用 Pro 帳號的成員現在會有 14 天試用期。試用結束之後,除非立即升級,要不然成員會在團隊中隱藏起來。",
|
||||
@@ -694,6 +705,7 @@
|
||||
"hide_event_type": "隱藏活動類型",
|
||||
"edit_location": "編輯地點",
|
||||
"into_the_future": "至未來",
|
||||
"when_booked_with_less_than_notice": "預約的提前通知時間短於 <time></time> 時",
|
||||
"within_date_range": "一段日期範圍之內",
|
||||
"indefinitely_into_future": "無限延伸至未來",
|
||||
"add_new_custom_input_field": "新增自訂輸入欄",
|
||||
@@ -713,6 +725,7 @@
|
||||
"delete_account_confirmation_message": "確定要刪除 {{appName}} 的帳號?任何分享過帳號連結的人再也無法以此進行預約,而且任何儲存過的偏好設定都會消失。",
|
||||
"integrations": "整合",
|
||||
"apps": "應用程式",
|
||||
"apps_listing": "應用程式列表",
|
||||
"category_apps": "{{category}}應用程式",
|
||||
"app_store": "應用程式商店",
|
||||
"app_store_description": "連線人員、技術,與工作場所。",
|
||||
@@ -736,6 +749,7 @@
|
||||
"toggle_calendars_conflict": "切換您想要檢查衝突的行事曆來避免重複預約。",
|
||||
"select_destination_calendar": "新增活動於",
|
||||
"connect_additional_calendar": "連結額外的行事曆",
|
||||
"calendar_updated_successfully": "成功更新行事曆",
|
||||
"conferencing": "開會",
|
||||
"calendar": "行事曆",
|
||||
"payments": "付款",
|
||||
@@ -768,6 +782,7 @@
|
||||
"trending_apps": "熱門應用程式",
|
||||
"explore_apps": "{{category}}應用程式",
|
||||
"installed_apps": "已安裝的應用程式",
|
||||
"free_to_use_apps": "免費",
|
||||
"no_category_apps": "沒有{{category}}應用程式",
|
||||
"no_category_apps_description_calendar": "新增行事曆應用程式來檢查衝突,以避免重複預約",
|
||||
"no_category_apps_description_conferencing": "嘗試新增會議應用程式,以整合與客戶的視訊通話",
|
||||
@@ -806,6 +821,8 @@
|
||||
"verify_wallet": "驗證錢包",
|
||||
"connect_metamask": "連接 Metamask",
|
||||
"create_events_on": "建立活動時間:",
|
||||
"enterprise_license": "此為企業版功能",
|
||||
"enterprise_license_description": "若要啟用此功能,請在 {{consoleUrl}} 主控台取得部署金鑰,並在您的 .env 中新增為 CALCOM_LICENSE_KEY。如果您的團隊已經取得授權,請聯絡 {{supportMail}} 取得協助。",
|
||||
"missing_license": "遺失授權",
|
||||
"signup_requires": "必須有商業授權",
|
||||
"signup_requires_description": "{{companyName}} 目前不提供註冊頁面的免費開源版本。如果要完整獲得註冊元件,就得要取得商業授權。個人使用的情況,我們推薦 Prisma Data Platform 或其它 Postgres 介面來建立帳號。",
|
||||
@@ -897,6 +914,7 @@
|
||||
"user_impersonation_heading": "使用者模擬",
|
||||
"user_impersonation_description": "允許支援團隊以您的身分暫時登入,以便快速解決您通報給我們的任何問題。",
|
||||
"team_impersonation_description": "允許您的團隊管理員暫時以您的身分登入。",
|
||||
"allow_booker_to_select_duration": "允許預約者選擇時間長度",
|
||||
"impersonate_user_tip": "此功能的所有使用已經過稽核。",
|
||||
"impersonating_user_warning": "正在模擬使用者名稱「{{user}}」。",
|
||||
"impersonating_stop_instructions": "<0>按一下此處以停止</0>。",
|
||||
@@ -1014,6 +1032,9 @@
|
||||
"error_removing_app": "移除應用程式時發生錯誤",
|
||||
"web_conference": "網路會議",
|
||||
"requires_confirmation": "需要確認",
|
||||
"always_requires_confirmation": "一律如此",
|
||||
"requires_confirmation_threshold": "預約的提前通知時間短於 {{time}} $t({{unit}}_timeUnit) 時,就需要確認",
|
||||
"may_require_confirmation": "可能需要確認",
|
||||
"nr_event_type_one": "{{count}} 種活動類型",
|
||||
"nr_event_type_other": "{{count}} 種活動類型",
|
||||
"add_action": "新增動作",
|
||||
@@ -1101,6 +1122,9 @@
|
||||
"event_limit_tab_description": "您的可預約頻率",
|
||||
"event_advanced_tab_description": "行事曆設定等...",
|
||||
"event_advanced_tab_title": "進階",
|
||||
"event_setup_multiple_duration_error": "活動設定:多個時間長度需要至少 1 個選項。",
|
||||
"event_setup_multiple_duration_default_error": "活動設定:請選擇有效的預設時間長度。",
|
||||
"event_setup_booking_limits_error": "預約限制必須按遞增順序排列。[日、週、月、年]",
|
||||
"select_which_cal": "選取要新增預約的行事曆",
|
||||
"custom_event_name": "自訂活動名稱",
|
||||
"custom_event_name_description": "建立自訂活動名稱,以在行事曆活動上顯示",
|
||||
@@ -1154,8 +1178,11 @@
|
||||
"invoices": "發票",
|
||||
"embeds": "嵌入",
|
||||
"impersonation": "模擬",
|
||||
"impersonation_description": "管理使用者模擬的設定",
|
||||
"users": "使用者",
|
||||
"profile_description": "管理您的 {{appName}} 個人資料設定",
|
||||
"users_description": "您可以在這裡找到列有全部使用者的名單",
|
||||
"users_listing": "使用者列表",
|
||||
"general_description": "管理語言和時區設定",
|
||||
"calendars_description": "設定活動類型跟行事曆互動的方式",
|
||||
"appearance_description": "管理預約外觀設定",
|
||||
@@ -1360,6 +1387,7 @@
|
||||
"number_sms_notifications": "電話號碼 (簡訊通知)",
|
||||
"attendee_email_workflow": "與會者電子郵件",
|
||||
"attendee_email_info": "預約人電子郵件",
|
||||
"kbar_search_placeholder": "輸入指令或搜尋…",
|
||||
"invalid_credential": "糟糕!權限似乎過期或遭到撤銷。請重新安裝。",
|
||||
"choose_common_schedule_team_event": "選擇公用行程表",
|
||||
"choose_common_schedule_team_event_description": "若要在多個主辦者之間使用公用行程表,請啟用此選項。停用時,會根據每個主辦者預設的行程表預約對方的時間。",
|
||||
@@ -1370,5 +1398,43 @@
|
||||
"test_preview": "測試預覽",
|
||||
"route_to": "引導至",
|
||||
"test_preview_description": "測試引導表單而不提交任何資料",
|
||||
"test_routing": "測試引導"
|
||||
"test_routing": "測試引導",
|
||||
"payment_app_disabled": "管理員已停用付款應用程式",
|
||||
"edit_event_type": "編輯活動類型",
|
||||
"collective_scheduling": "全體預定",
|
||||
"make_it_easy_to_book": "輕鬆預約所有團隊成員有空的時間。",
|
||||
"find_the_best_person": "尋找可預約的最佳人選,然後在團隊內部循環。",
|
||||
"fixed_round_robin": "固定循環制",
|
||||
"add_one_fixed_attendee": "新增一名固定的與會者,然後在多名與會者之間循環。",
|
||||
"calcom_is_better_with_team": "Cal.com 更適合團隊使用",
|
||||
"add_your_team_members": "將團隊成員新增到活動類型。使用全體預定即可納入所有使用者,也可以使用循環制預定找出最合適的人選。",
|
||||
"booking_limit_reached": "已達此活動類型的預約限制",
|
||||
"admin_has_disabled": "管理員已停用「{{appName}}」",
|
||||
"disabled_app_affects_event_type": "管理員已停用會影響「{{eventType}}」活動類型的「{{appName}}」",
|
||||
"disable_payment_app": "管理員已停用會影響「{{title}}」活動類型的「{{appName}}」。與會者仍可預約此類型活動,但不會收到付費提示。您也可以隱藏此活動類型來避免這種情況,直到管理員再次啟用您的付款方式為止。",
|
||||
"payment_disabled_still_able_to_book": "與會者仍可預約此類型活動,但不會收到付費提示。您也可以隱藏此活動類型來避免這種情況,直到管理員再次啟用您的付款方式。",
|
||||
"app_disabled_with_event_type": "管理員已停用會影響「{{title}}」活動類型的「{{appName}}」。",
|
||||
"app_disabled_video": "管理員已停用可能會影響您的活動類型的「{{appName}}」。如果您有活動類型將「{{appName}}」設為地點,系統就會將地點預設為 Cal Video。",
|
||||
"app_disabled_subject": "已停用「{{appName}}」",
|
||||
"navigate_installed_apps": "前往已安裝的應用程式",
|
||||
"disabled_calendar": "如果您安裝了其他行事曆,新的預約就會新增到該行事曆中。如果沒有,請連結新行事曆,這樣才不會錯過任何新的預約。",
|
||||
"enable_apps": "啟用應用程式",
|
||||
"enable_apps_description": "啟用使用者可以與 Cal.com 整合使用的應用程式",
|
||||
"app_is_enabled": "已啟用「{{appName}}」",
|
||||
"app_is_disabled": "已停用「{{appName}}」",
|
||||
"keys_have_been_saved": "已儲存金鑰",
|
||||
"disable_app": "停用應用程式",
|
||||
"disable_app_description": "若停用此應用程式,使用者操作 Cal 時可能會出現問題",
|
||||
"edit_keys": "編輯金鑰",
|
||||
"no_available_apps": "沒有任何可用的應用程式",
|
||||
"no_available_apps_description": "請確認「packages/app-store」下方的部署有應用程式",
|
||||
"no_apps": "此 Cal 執行個體中並未啟用任何應用程式",
|
||||
"apps_settings": "應用程式設定",
|
||||
"fill_this_field": "請填寫此欄位",
|
||||
"options": "選項",
|
||||
"enter_option": "輸入選項 {{index}}",
|
||||
"add_an_option": "新增選項",
|
||||
"radio": "無線電",
|
||||
"event_type_duplicate_copy_text": "{{slug}}-複製",
|
||||
"set_as_default": "設為預設"
|
||||
}
|
||||
|
||||
@@ -432,6 +432,11 @@ hr {
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.react-date-picker__inputGroup__input {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
/* animations */
|
||||
.slideInBottom {
|
||||
animation-duration: 0.3s;
|
||||
|
||||
@@ -8,18 +8,20 @@ MockDate.set("2021-06-20T11:59:59Z");
|
||||
const HAWAII_AND_NEWYORK_TEAM = [
|
||||
{
|
||||
timeZone: "America/Detroit", // GMT -4 per 22th of Aug, 2022
|
||||
workingHours: [{ days: [1, 2, 3, 4, 5], startTime: 780, endTime: 1260 }],
|
||||
workingHours: [{ userId: 1, days: [1, 2, 3, 4, 5], startTime: 780, endTime: 1260 }],
|
||||
busy: [],
|
||||
dateOverrides: [],
|
||||
},
|
||||
{
|
||||
timeZone: "Pacific/Honolulu", // GMT -10 per 22th of Aug, 2022
|
||||
workingHours: [
|
||||
{ days: [3, 4, 5], startTime: 0, endTime: 360 },
|
||||
{ days: [6], startTime: 0, endTime: 180 },
|
||||
{ days: [2, 3, 4], startTime: 780, endTime: 1439 },
|
||||
{ days: [5], startTime: 780, endTime: 1439 },
|
||||
{ userId: 1, days: [3, 4, 5], startTime: 0, endTime: 360 },
|
||||
{ userId: 2, days: [6], startTime: 0, endTime: 180 },
|
||||
{ userId: 3, days: [2, 3, 4], startTime: 780, endTime: 1439 },
|
||||
{ userId: 4, days: [5], startTime: 780, endTime: 1439 },
|
||||
],
|
||||
busy: [],
|
||||
dateOverrides: [],
|
||||
},
|
||||
];
|
||||
|
||||
@@ -42,6 +44,7 @@ it("Sydney and Shiraz can live in harmony 🙏", async () => {
|
||||
],
|
||||
"endTime": 180,
|
||||
"startTime": 0,
|
||||
"userId": 2,
|
||||
},
|
||||
Object {
|
||||
"days": Array [
|
||||
@@ -61,4 +64,57 @@ it("Sydney and Shiraz can live in harmony 🙏", async () => {
|
||||
},
|
||||
]
|
||||
`);
|
||||
|
||||
expect(getAggregateWorkingHours(HAWAII_AND_NEWYORK_TEAM, "ROUND_ROBIN")).toMatchInlineSnapshot(`
|
||||
Array [
|
||||
Object {
|
||||
"days": Array [
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
],
|
||||
"endTime": 1260,
|
||||
"startTime": 780,
|
||||
"userId": 1,
|
||||
},
|
||||
Object {
|
||||
"days": Array [
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
],
|
||||
"endTime": 360,
|
||||
"startTime": 0,
|
||||
"userId": 1,
|
||||
},
|
||||
Object {
|
||||
"days": Array [
|
||||
6,
|
||||
],
|
||||
"endTime": 180,
|
||||
"startTime": 0,
|
||||
"userId": 2,
|
||||
},
|
||||
Object {
|
||||
"days": Array [
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
],
|
||||
"endTime": 1439,
|
||||
"startTime": 780,
|
||||
"userId": 3,
|
||||
},
|
||||
Object {
|
||||
"days": Array [
|
||||
5,
|
||||
],
|
||||
"endTime": 1439,
|
||||
"startTime": 780,
|
||||
"userId": 4,
|
||||
},
|
||||
]
|
||||
`);
|
||||
});
|
||||
|
||||
@@ -18,6 +18,7 @@ describe("Tests the slot logic", () => {
|
||||
minimumBookingNotice: 0,
|
||||
workingHours: [
|
||||
{
|
||||
userId: 1,
|
||||
days: Array.from(Array(7).keys()),
|
||||
startTime: MINUTES_DAY_START,
|
||||
endTime: MINUTES_DAY_END,
|
||||
@@ -38,6 +39,7 @@ describe("Tests the slot logic", () => {
|
||||
minimumBookingNotice: 0,
|
||||
workingHours: [
|
||||
{
|
||||
userId: 1,
|
||||
days: Array.from(Array(7).keys()),
|
||||
startTime: MINUTES_DAY_START,
|
||||
endTime: MINUTES_DAY_END,
|
||||
@@ -56,6 +58,7 @@ describe("Tests the slot logic", () => {
|
||||
minimumBookingNotice: 0,
|
||||
workingHours: [
|
||||
{
|
||||
userId: 1,
|
||||
days: [0],
|
||||
startTime: 23 * 60, // 23h
|
||||
endTime: MINUTES_DAY_END,
|
||||
@@ -69,6 +72,7 @@ describe("Tests the slot logic", () => {
|
||||
it("can cut off dates that due to invitee timezone differences fall on the previous day", async () => {
|
||||
const workingHours = [
|
||||
{
|
||||
userId: 1,
|
||||
days: [0],
|
||||
startTime: MINUTES_DAY_START,
|
||||
endTime: 1 * 60, // 1h
|
||||
@@ -94,6 +98,7 @@ describe("Tests the slot logic", () => {
|
||||
minimumBookingNotice: 1500,
|
||||
workingHours: [
|
||||
{
|
||||
userId: 1,
|
||||
days: Array.from(Array(7).keys()),
|
||||
startTime: MINUTES_DAY_START,
|
||||
endTime: MINUTES_DAY_END,
|
||||
|
||||
+1
-1
Submodule apps/website updated: 30cbf3990b...ba98a7c980
@@ -1,7 +1,6 @@
|
||||
import type { Credential } from "@prisma/client";
|
||||
|
||||
import prisma from "@calcom/prisma";
|
||||
import { App } from "@calcom/types/App";
|
||||
import prisma, { safeAppSelect, safeCredentialSelect } from "@calcom/prisma";
|
||||
import { AppFrontendPayload as App } from "@calcom/types/App";
|
||||
import { CredentialFrontendPayload as Credential } from "@calcom/types/Credential";
|
||||
|
||||
export async function getAppWithMetadata(app: { dirName: string }) {
|
||||
let appMetadata: App | null = null;
|
||||
@@ -30,7 +29,7 @@ export async function getAppRegistry() {
|
||||
where: { enabled: true },
|
||||
select: { dirName: true, slug: true, categories: true, enabled: true },
|
||||
});
|
||||
const apps = [] as Omit<App, "key">[];
|
||||
const apps = [] as App[];
|
||||
for await (const dbapp of dbApps) {
|
||||
const app = await getAppWithMetadata(dbapp);
|
||||
if (!app) continue;
|
||||
@@ -56,9 +55,15 @@ export async function getAppRegistry() {
|
||||
export async function getAppRegistryWithCredentials(userId: number) {
|
||||
const dbApps = await prisma.app.findMany({
|
||||
where: { enabled: true },
|
||||
include: { credentials: { where: { userId } } },
|
||||
select: {
|
||||
...safeAppSelect,
|
||||
credentials: {
|
||||
where: { userId },
|
||||
select: safeCredentialSelect,
|
||||
},
|
||||
},
|
||||
});
|
||||
const apps = [] as (Omit<App, "key"> & {
|
||||
const apps = [] as (App & {
|
||||
credentials: Credential[];
|
||||
})[];
|
||||
for await (const dbapp of dbApps) {
|
||||
@@ -77,8 +82,7 @@ export async function getAppRegistryWithCredentials(userId: number) {
|
||||
...remainingAppProps,
|
||||
categories: dbapp.categories,
|
||||
credentials: dbapp.credentials,
|
||||
installed:
|
||||
true /* All apps from DB are considered installed by default. @TODO: Add and filter our by `enabled` property */,
|
||||
installed: true,
|
||||
});
|
||||
}
|
||||
return apps;
|
||||
|
||||
@@ -15,6 +15,7 @@ export default function AppCard({
|
||||
switchChecked,
|
||||
children,
|
||||
setAppData,
|
||||
returnTo,
|
||||
}: {
|
||||
app: RouterOutputs["viewer"]["apps"][number];
|
||||
description?: React.ReactNode;
|
||||
@@ -22,6 +23,7 @@ export default function AppCard({
|
||||
switchOnClick?: (e: boolean) => void;
|
||||
children?: React.ReactNode;
|
||||
setAppData: SetAppDataGeneric<typeof eventTypeAppCardZod>;
|
||||
returnTo?: string;
|
||||
}) {
|
||||
const [animationRef] = useAutoAnimate<HTMLDivElement>();
|
||||
|
||||
@@ -55,7 +57,11 @@ export default function AppCard({
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<OmniInstallAppButton className="ml-auto flex items-center" appId={app.slug} />
|
||||
<OmniInstallAppButton
|
||||
className="ml-auto flex items-center"
|
||||
appId={app.slug}
|
||||
returnTo={returnTo}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { useAutoAnimate } from "@formkit/auto-animate/react";
|
||||
import { useMemo } from "react";
|
||||
|
||||
import { classNames } from "@calcom/lib";
|
||||
@@ -10,23 +11,33 @@ const AppCategoryNavigation = ({
|
||||
children,
|
||||
containerClassname,
|
||||
className,
|
||||
fromAdmin,
|
||||
}: {
|
||||
baseURL: string;
|
||||
children: React.ReactNode;
|
||||
containerClassname: string;
|
||||
className?: string;
|
||||
fromAdmin?: boolean;
|
||||
}) => {
|
||||
const appCategories = useMemo(() => getAppCategories(baseURL), [baseURL]);
|
||||
const [animationRef] = useAutoAnimate<HTMLDivElement>();
|
||||
const appCategories = useMemo(() => getAppCategories(baseURL, fromAdmin), [baseURL, fromAdmin]);
|
||||
|
||||
return (
|
||||
<div className={classNames("flex flex-col p-2 md:p-0 xl:flex-row", className)}>
|
||||
<div className="hidden xl:block">
|
||||
<VerticalTabs tabs={appCategories} sticky linkProps={{ shallow: true }} />
|
||||
<VerticalTabs
|
||||
tabs={appCategories}
|
||||
sticky
|
||||
linkProps={{ shallow: true }}
|
||||
itemClassname={classNames(fromAdmin && "w-60")}
|
||||
/>
|
||||
</div>
|
||||
<div className="block overflow-x-scroll xl:hidden">
|
||||
<div className="mb-4 block overflow-x-scroll xl:hidden">
|
||||
<HorizontalTabs tabs={appCategories} linkProps={{ shallow: true }} />
|
||||
</div>
|
||||
<main className={containerClassname}>{children}</main>
|
||||
<main className={containerClassname} ref={animationRef}>
|
||||
{children}
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -11,12 +11,21 @@ import { InstallAppButton } from "../components";
|
||||
* Use this component to allow installing an app from anywhere on the app.
|
||||
* Use of this component requires you to remove custom InstallAppButtonComponent so that it can manage the redirection itself
|
||||
*/
|
||||
export default function OmniInstallAppButton({ appId, className }: { appId: string; className: string }) {
|
||||
export default function OmniInstallAppButton({
|
||||
appId,
|
||||
className,
|
||||
returnTo,
|
||||
}: {
|
||||
appId: string;
|
||||
className: string;
|
||||
returnTo?: string;
|
||||
}) {
|
||||
const { t } = useLocale();
|
||||
const { data: app } = useApp(appId);
|
||||
const utils = trpc.useContext();
|
||||
|
||||
const mutation = useAddAppMutation(null, {
|
||||
returnTo,
|
||||
onSuccess: (data) => {
|
||||
//TODO: viewer.appById might be replaced with viewer.apps so that a single query needs to be invalidated.
|
||||
utils.viewer.appById.invalidate({ appId });
|
||||
|
||||
@@ -1,40 +1,44 @@
|
||||
import { Icon } from "@calcom/ui";
|
||||
|
||||
const getAppCategories = (baseURL: string) => {
|
||||
function getHref(baseURL: string, category: string, useQueryParam: boolean) {
|
||||
return useQueryParam ? `${baseURL}&category=${category}` : `${baseURL}/${category}`;
|
||||
}
|
||||
|
||||
const getAppCategories = (baseURL: string, useQueryParam = false) => {
|
||||
return [
|
||||
{
|
||||
name: "calendar",
|
||||
href: `${baseURL}/calendar`,
|
||||
href: getHref(baseURL, "calendar", useQueryParam),
|
||||
icon: Icon.FiCalendar,
|
||||
},
|
||||
{
|
||||
name: "conferencing",
|
||||
href: `${baseURL}/conferencing`,
|
||||
href: getHref(baseURL, "conferencing", useQueryParam),
|
||||
icon: Icon.FiVideo,
|
||||
},
|
||||
{
|
||||
name: "payment",
|
||||
href: `${baseURL}/payment`,
|
||||
href: getHref(baseURL, "payment", useQueryParam),
|
||||
icon: Icon.FiCreditCard,
|
||||
},
|
||||
{
|
||||
name: "automation",
|
||||
href: `${baseURL}/automation`,
|
||||
href: getHref(baseURL, "automation", useQueryParam),
|
||||
icon: Icon.FiShare2,
|
||||
},
|
||||
{
|
||||
name: "analytics",
|
||||
href: `${baseURL}/analytics`,
|
||||
href: getHref(baseURL, "analytics", useQueryParam),
|
||||
icon: Icon.FiBarChart,
|
||||
},
|
||||
{
|
||||
name: "web3",
|
||||
href: `${baseURL}/web3`,
|
||||
href: getHref(baseURL, "web3", useQueryParam),
|
||||
icon: Icon.FiBarChart,
|
||||
},
|
||||
{
|
||||
name: "other",
|
||||
href: `${baseURL}/other`,
|
||||
href: getHref(baseURL, "other", useQueryParam),
|
||||
icon: Icon.FiGrid,
|
||||
},
|
||||
];
|
||||
|
||||
@@ -21,9 +21,11 @@ type CustomUseMutationOptions =
|
||||
type AddAppMutationData = { setupPending: boolean } | void;
|
||||
type UseAddAppMutationOptions = CustomUseMutationOptions & {
|
||||
onSuccess: (data: AddAppMutationData) => void;
|
||||
returnTo?: string;
|
||||
};
|
||||
|
||||
function useAddAppMutation(_type: App["type"] | null, options?: UseAddAppMutationOptions) {
|
||||
function useAddAppMutation(_type: App["type"] | null, allOptions?: UseAddAppMutationOptions) {
|
||||
const { returnTo, ...options } = allOptions || {};
|
||||
const mutation = useMutation<
|
||||
AddAppMutationData,
|
||||
Error,
|
||||
@@ -42,11 +44,12 @@ function useAddAppMutation(_type: App["type"] | null, options?: UseAddAppMutatio
|
||||
}
|
||||
const state: IntegrationOAuthCallbackState = {
|
||||
returnTo:
|
||||
returnTo ||
|
||||
WEBAPP_URL +
|
||||
getInstalledAppPath(
|
||||
{ variant: variables && variables.variant, slug: variables && variables.slug },
|
||||
location.search
|
||||
),
|
||||
getInstalledAppPath(
|
||||
{ variant: variables && variables.variant, slug: variables && variables.slug },
|
||||
location.search
|
||||
),
|
||||
};
|
||||
const stateStr = encodeURIComponent(JSON.stringify(state));
|
||||
const searchParams = `?state=${stateStr}`;
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
---
|
||||
items:
|
||||
- /api/app-store/amie/1.jpg
|
||||
- /api/app-store/amie/2.jpg
|
||||
- /api/app-store/amie/3.jpg
|
||||
---
|
||||
|
||||
<iframe class="w-full aspect-video -mx-2" width="560" height="315" src="https://www.youtube.com/embed/OGe1NYKhZE8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||
|
||||
## The joyful productivity app
|
||||
|
||||
- Use your calendar as a todo list
|
||||
- Color your calendar to organize
|
||||
- Instantly know if someone is available
|
||||
- Track what you listened to when
|
||||
- Send scheduling links guests love
|
||||
- Always know what your team is up to
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
import type { AppMeta } from "@calcom/types/App";
|
||||
|
||||
import config from "./config.json";
|
||||
|
||||
export const metadata = {
|
||||
category: "other",
|
||||
...config,
|
||||
} as AppMeta;
|
||||
|
||||
export default metadata;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user