Compare commits

...
67 Commits
Author SHA1 Message Date
Alex van Andel 3af614f778 v2.8.8
release.yml / release (push) Canceled after 0s
2023-04-21 16:21:23 +02:00
Nafees NazikandAlex van Andel 77b41a4623 feat: add support endpoint (#8404)
* feat: open intercom

* Remove redirect from middleware, use next.config.js instead

---------

Co-authored-by: Alex van Andel <me@alexvanandel.com>
2023-04-21 14:18:57 +00:00
Crowdin Bot c23738b885 New Crowdin translations by Github Action 2023-04-21 13:50:42 +00:00
alannncandAlex van Andel afe1f5b72f Fix/seats-cancel-links (#8394)
* Fix cancel links

* Use searchParams API to build cancelLink

* Fix cancel showSeats

* Added test for owner cancel attendee list

---------

Co-authored-by: Alex van Andel <me@alexvanandel.com>
2023-04-21 15:49:53 +02:00
Crowdin Bot 5ce341093b New Crowdin translations by Github Action 2023-04-21 11:48:02 +00:00
Crowdin Bot fc6d2839fb New Crowdin translations by Github Action 2023-04-21 11:47:08 +00:00
2fadba85f4 Fix workflow not firing for event types without video app as location (#8435)
* fix error when videoCallUrl was null

* make sure videocallurl is not null

* Revert "fix error when videoCallUrl was null"

This reverts commit f23776ec8be1be334245b7e3f8a977f7e73591f1.

* Update packages/features/bookings/lib/handleNewBooking.ts

Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>

---------

Co-authored-by: CarinaWolli <wollencarina@gmail.com>
Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
2023-04-21 11:46:23 +00:00
sean-brydon 473b36a6be Bulk update modal (#8433)
* Use checkbox component

* Update packages/features/eventtypes/components/BulkEditDefaultConferencingModal.tsx
2023-04-21 11:04:27 +00:00
Crowdin Bot f74b9eb70a New Crowdin translations by Github Action 2023-04-21 10:51:27 +00:00
Hariom Balhara a845841ad0 Prevent looping b/w dark and light (#8440) 2023-04-21 16:20:27 +05:30
Crowdin Bot dba80a1b64 New Crowdin translations by Github Action 2023-04-21 08:25:54 +00:00
sean-brydon 41558d297c Brand colour on setup tab (#8430) 2023-04-21 10:24:59 +02:00
Crowdin Bot cd3946d482 New Crowdin translations by Github Action 2023-04-21 00:46:08 +00:00
Alex van Andel dcbf695217 Remove getDirFromLang, in favour of doing this in the I18nLanguageHan… (#8425)
* Remove getDirFromLang, in favour of doing this in the I18nLanguageHandler exclusively

* Small tweak
2023-04-21 00:45:22 +00:00
Alex van Andel 49cbdda4cf Use modularizeImports for @heroicons (#8422) 2023-04-21 00:58:57 +02:00
Crowdin Bot 22f458cb74 New Crowdin translations by Github Action 2023-04-20 22:34:42 +00:00
Peer Richelsen 561d9f154b misc frontend fixes (#8416)
* (temp) dark mode changes (#8415)

* fixes skeletons, some wrong buttons, spacing, settings
2023-04-20 22:33:49 +00:00
Peer Richelsen 0c9b9bc296 Update package.json
release.yml / release (push) Canceled after 0s
2023-04-21 00:11:59 +02:00
Alex van Andel 552bfcc7db Moved forgot? behind the label (#8421) 2023-04-20 22:06:35 +00:00
986f9dca8d Fix: appKeys handling (#8406)
* Handle appKeys save and read correctly

* Add missing zod file for zohocrm which needs keys

* Show team invites regardless of user plan

* Linting

---------

Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com>
Co-authored-by: Keith Williams <keithwillcode@gmail.com>
Co-authored-by: zomars <zomars@me.com>
2023-04-20 21:14:50 +00:00
Omar López 3af5a7404e Show team invites regardless of user plan (#8417) 2023-04-20 20:56:38 +00:00
Crowdin Bot 10d3c6ecaa New Crowdin translations by Github Action 2023-04-20 20:02:05 +00:00
Hariom BalharaandKeith Williams a0c37ea4b7 Remove css vars handling from PageWrapper. It was removed from _app.tsx earlier (#8401)
Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2023-04-20 17:01:21 -03:00
Crowdin Bot 798999ad1a New Crowdin translations by Github Action 2023-04-20 18:54:58 +00:00
Crowdin Bot d40e306baa New Crowdin translations by Github Action 2023-04-20 18:54:12 +00:00
Crowdin Bot e558e61f6b New Crowdin translations by Github Action 2023-04-20 18:53:15 +00:00
Crowdin Bot 210eafcd6e New Crowdin translations by Github Action 2023-04-20 18:52:13 +00:00
Crowdin Bot c05e7d75a5 New Crowdin translations by Github Action 2023-04-20 18:51:26 +00:00
Crowdin Bot d0ebf3319a New Crowdin translations by Github Action 2023-04-20 18:50:44 +00:00
Keith Williams 9eb4187644 Added write permission for pull requests in cron action (#8391) 2023-04-20 11:49:52 -07:00
Crowdin Bot 958cebc82c New Crowdin translations by Github Action 2023-04-20 15:57:11 +00:00
Crowdin Bot 0c36dcac4c New Crowdin translations by Github Action 2023-04-20 15:56:18 +00:00
alannncandAlex van Andel fe996b4e41 Fix/user creds (#8393)
* fix-user-creds

* Type fixes

* Type fixes

* Type fixes

---------

Co-authored-by: Alex van Andel <me@alexvanandel.com>
2023-04-20 15:55:19 +00:00
Alex van Andel c1c95f711b v2.8.6
release.yml / release (push) Canceled after 0s
2023-04-20 15:54:26 +02:00
Syed Ali Shahbaz 7cb7006c54 CalDAV - improves the UTC offset eval to include DST (#8399)
* improves the UTC offset eval to include DST

* remove debug remnants
2023-04-20 15:51:39 +02:00
Alex van Andel e1403bfbeb Initial implementation, getAppLogos() (#8405)
* Initial implementation, getAppLogos()

* Handle localhost:3000 correctly

* New URL wasn't working with all hostnames

* Only get the first of the subdomainParts, join not needed

* rename url -> hostname

* getAppLogos -> getTeamLogos
2023-04-20 13:43:06 +00:00
Hariom Balhara c38dd2d072 Hotfix: Fix theme not changing once page has started loading (#8400)
* Fix theme not changing once page is loaded

* Add toggle case in playground
2023-04-20 11:57:28 +00:00
Crowdin Bot f9d9e74d6b New Crowdin translations by Github Action 2023-04-20 11:39:48 +00:00
sean-brydon 2ab597addc Fixing default event location URL for dynamic events (#8396)
* Set bookingLocaiton to URL if there is a default location

* Update packages/features/bookings/lib/handleNewBooking.ts

* Suggestions implmented

* Remove old implemntation

* Cleanup
2023-04-20 13:38:57 +02:00
Hariom Balhara 33e394d5ed One App shouldnt break other app, or the entire cal.com build. Also, handle slug change in seeding update (#8294) 2023-04-20 04:41:14 +00:00
Crowdin Bot 4577de3b17 New Crowdin translations by Github Action 2023-04-19 23:03:32 +00:00
Crowdin Bot 658b529840 New Crowdin translations by Github Action 2023-04-19 23:02:40 +00:00
Alex van Andel 4aed769da4 Invert domain check, make default logo work 2023-04-20 01:01:29 +02:00
Crowdin Bot 6c753290aa New Crowdin translations by Github Action
release.yml / release (push) Canceled after 0s
2023-04-19 22:20:17 +00:00
Alex van Andel 59c91607db v2.8.5 2023-04-20 00:19:14 +02:00
b0530d59af Remove Intl.Provider (#8208)
* Add payment option to schema

* Add payment option to Stripe zod

* Set payment option on event type

* Create manual payment intent in Stripe

* Set payment option from Stripe app

* Add payment option to DB

* Pass React.ReactNode to checkbox

* Create uncaptured payment intent

* WIP

* Capture card in setup intent

* Show charge card option

* Charge card from booking page

* Bug fixes

* Clean up

* Clean up app card

* Add no-show fee messaging on booking page

* Send payment email on payment & add price

* Fix messaging

* Create no show fee charged email

* Send charge fee collected email

* Disable submit on card failure

* Clean up

* Serverside prevent charging card again if already charged

* Only confirm booking if paid for

* Type fixes

* More type fixes

* More type fixes

* Type fix

* Type fixes

* UI changes

* Payment component rework

* Update apps/web/public/static/locales/en/common.json

Co-authored-by: Alex van Andel <me@alexvanandel.com>

* Update apps/web/public/static/locales/en/common.json

Co-authored-by: Alex van Andel <me@alexvanandel.com>

* Update apps/web/components/dialog/ChargeCardDialog.tsx

Co-authored-by: Alex van Andel <me@alexvanandel.com>

* Update packages/trpc/server/routers/viewer/payments.tsx

Co-authored-by: Alex van Andel <me@alexvanandel.com>

* Revert GTM config

* Adjust payment option dropdown

* Show alert when seats are set

* Small bug fixes

* Create collect card method

* clean up

* Prevent seats & charge no-show fee to be enabled together

* Do not charge no-show fee on unconfirmed bookings

* Add check to collect card method

* Webhook send request emails

* Fix some dark mode colours

* Change awaiting payment language

* Type fixes

* Set height of Select and TextField both to 38px to fix alignment

* Fix message seats & payment error message

* Type fix

* Remove Intl.Provider

* Add percentFeePercentage

* WIP

* Use i18n language

* Type fix

---------

Co-authored-by: Alex van Andel <me@alexvanandel.com>
Co-authored-by: Omar López <zomars@me.com>
2023-04-19 21:38:06 +00:00
Omar López b1ff829745 Warns about lodash usage (#8390) 2023-04-19 23:07:48 +02:00
sean-brydonandzomars d202b536b5 Feat/subdomain logochanges (#8264)
* logo map

* Archimed logo

* usememo

* Subdomain logo logic

* or our logo

* Update packages/features/orgs/SubdomainProvider.tsx

* Provider comments

* Move DB logic to db

* Fix a11y on alt tag

* Added example for dynamic endpoint

* Move to API approach

* Implement Icon logo on subdomain level

---------

Co-authored-by: zomars <zomars@me.com>
2023-04-19 13:55:40 -07:00
Joe Au-Yeung 2ac5ef10ba Add event type redirect URL (#8385) 2023-04-19 13:46:59 -07:00
8a2ab68e9a feat: add user hash for intercom (#8263)
Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2023-04-19 22:22:07 +02:00
877220caa0 Event Type: Title not displayed in the mobile view (#7451)
* Event Type: Title not displayed in the mobile view

* Fix toggle not updating in UI

---------

Co-authored-by: gitstart-calcom <gitstart@users.noreply.github.com>
Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
2023-04-19 13:17:54 -07:00
0686c08de3 Fix/insights load speed (#8364)
* Adding skipBatch to trpc calls

* Use view in trpc insights

* Added performance data creation on seed-insights

* fix some scenarios

* Fix migration view fields

* Prevent revalidating too often

---------

Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: zomars <zomars@me.com>
2023-04-19 20:14:09 +00:00
Alex van Andel d3f1f8b906 Shaves off an easy 1.4kb win from the global package (#8382) 2023-04-19 16:23:49 -03:00
Crowdin Bot 33a69d3ef6 New Crowdin translations by Github Action 2023-04-19 18:25:28 +00:00
Alex van Andel d91b451d7b Also unpack React / don't directly import React (#8384) 2023-04-19 20:24:34 +02:00
Nafees Nazik 9e17149e5e fix: limit avatar upload size (#8135) 2023-04-19 18:19:31 +02:00
Peer Richelsen de61b032b7 RFC: added brandcolor for switch (#8213) 2023-04-19 14:39:23 +00:00
bdbf9bd04d perf: reduce bundle size (#8337)
Co-authored-by: zomars <zomars@me.com>
Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2023-04-19 19:45:08 +05:30
Henrique PachecoandUdit Takkar ccd589ef38 fix: addon wrapper to password input field (#8320)
* fix: addon wrapper to password input field

* fix: tooltip

Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in>

---------

Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in>
Co-authored-by: Udit Takkar <udit.07814802719@cse.mait.ac.in>
2023-04-19 14:12:55 +00:00
Crowdin Bot b4c3753566 New Crowdin translations by Github Action 2023-04-19 14:03:48 +00:00
2fdadb98ac fix the issue "ReferenceError: window is not defined" (#8193)
Co-authored-by: Nafees Nazik <84864519+G3root@users.noreply.github.com>
Co-authored-by: nafees nazik <nafeesnazik21@gmail.com>
2023-04-19 19:32:55 +05:30
Crowdin Bot a33847a878 New Crowdin translations by Github Action 2023-04-19 13:03:16 +00:00
Nafees Nazik 88cf535c8e fix: address input (#8352) 2023-04-19 13:02:26 +00:00
Carina WollendorferandCarinaWolli ea0b59d7c0 Fixes editor not saving new value (#8379)
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
2023-04-19 17:10:18 +05:30
Hariom BalharaandPeer Richelsen 39b93cdb5b Fix Editor not triggering setText (#8368)
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2023-04-19 12:25:05 +02:00
Nafees Nazik e27fc05d5f fix: frontend issues and dark mode regressions (#8373) 2023-04-19 12:14:59 +02:00
Carina WollendorferandCarinaWolli 20c010fef1 Revert "Date override fixes (#8330)" (#8369)
release.yml / release (push) Canceled after 0s
This reverts commit 3ef328421f.

Co-authored-by: CarinaWolli <wollencarina@gmail.com>
2023-04-19 08:43:08 +00:00
176 changed files with 2731 additions and 1753 deletions
+3
View File
@@ -79,6 +79,9 @@ CALENDSO_ENCRYPTION_KEY=
# Intercom Config
NEXT_PUBLIC_INTERCOM_APP_ID=
# Secret to enable Intercom Identity Verification
INTERCOM_SECRET=
# Zendesk Config
NEXT_PUBLIC_ZENDESK_KEY=
+1
View File
@@ -2,6 +2,7 @@ name: Cron - mark stale for inactive issues
permissions:
issues: write
pull-requests: write
on:
# "Scheduled workflows run on the latest commit on the default or base branch."
+9 -7
View File
@@ -1,7 +1,7 @@
import { isEmpty } from "lodash";
import { useTranslation } from "next-i18next";
import { useEffect } from "react";
import { getDirFromLang } from "@calcom/lib/i18n";
import { trpc } from "@calcom/trpc/react";
export function useViewerI18n() {
@@ -22,16 +22,18 @@ export function useViewerI18n() {
*/
const I18nLanguageHandler = (): null => {
const { i18n } = useTranslation("common");
const locale = useViewerI18n().data?.locale || "en";
const locale = useViewerI18n().data?.locale || i18n.language;
useEffect(() => {
if (locale && i18n.language && i18n.language !== locale) {
if (typeof i18n.changeLanguage === "function") i18n.changeLanguage(locale);
// bail early when i18n = {}
if (isEmpty(i18n)) return;
// if locale is ready and the i18n.language does != locale - changeLanguage
if (locale && i18n.language !== locale) {
i18n.changeLanguage(locale);
}
const dir = getDirFromLang(locale);
// set dir="rtl|ltr"
document.dir = i18n.dir();
document.documentElement.setAttribute("lang", locale);
document.documentElement.setAttribute("dir", dir);
}, [locale, i18n]);
return null;
-167
View File
@@ -1,167 +0,0 @@
import type { FormEvent } from "react";
import { useCallback, useEffect, useState } from "react";
import Cropper from "react-easy-crop";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Button, Dialog, DialogClose, DialogContent, DialogTrigger } from "@calcom/ui";
import type { Area } from "@lib/cropImage";
import { getCroppedImg } from "@lib/cropImage";
import { useFileReader } from "@lib/hooks/useFileReader";
import Slider from "@components/Slider";
type ImageUploaderProps = {
id: string;
buttonMsg: string;
handleAvatarChange: (imageSrc: string) => void;
imageSrc?: string;
target: string;
};
interface FileEvent<T = Element> extends FormEvent<T> {
target: EventTarget & T;
}
// This is separate to prevent loading the component until file upload
function CropContainer({
onCropComplete,
imageSrc,
}: {
imageSrc: string;
onCropComplete: (croppedAreaPixels: Area) => void;
}) {
const { t } = useLocale();
const [crop, setCrop] = useState({ x: 0, y: 0 });
const [zoom, setZoom] = useState(1);
const handleZoomSliderChange = (value: number) => {
value < 1 ? setZoom(1) : setZoom(value);
};
return (
<div className="crop-container h-40 max-h-40 w-40 rounded-full">
<div className="relative h-40 w-40 rounded-full">
<Cropper
image={imageSrc}
crop={crop}
zoom={zoom}
aspect={1}
onCropChange={setCrop}
onCropComplete={(croppedArea, croppedAreaPixels) => onCropComplete(croppedAreaPixels)}
onZoomChange={setZoom}
/>
</div>
<Slider
value={zoom}
min={1}
max={3}
step={0.1}
label={t("slide_zoom_drag_instructions")}
changeHandler={handleZoomSliderChange}
/>
</div>
);
}
/** @deprecated Use `packages/ui/v2/core/ImageUploader.tsx` */
export default function ImageUploader({
target,
id,
buttonMsg,
handleAvatarChange,
...props
}: ImageUploaderProps) {
const { t } = useLocale();
const [imageSrc, setImageSrc] = useState<string | null>(null);
const [croppedAreaPixels, setCroppedAreaPixels] = useState<Area | null>(null);
const [{ result }, setFile] = useFileReader({
method: "readAsDataURL",
});
useEffect(() => {
if (props.imageSrc) setImageSrc(props.imageSrc);
}, [props.imageSrc]);
const onInputFile = (e: FileEvent<HTMLInputElement>) => {
if (!e.target.files?.length) {
return;
}
setFile(e.target.files[0]);
};
const showCroppedImage = useCallback(
async (croppedAreaPixels: Area | null) => {
try {
if (!croppedAreaPixels) return;
const croppedImage = await getCroppedImg(
result as string /* result is always string when using readAsDataUrl */,
croppedAreaPixels
);
setImageSrc(croppedImage);
handleAvatarChange(croppedImage);
} catch (e) {
console.error(e);
}
},
[result, handleAvatarChange]
);
return (
<Dialog
onOpenChange={
(opened) => !opened && setFile(null) // unset file on close
}>
<DialogTrigger asChild>
<div className="flex items-center">
<Button color="secondary" type="button" className="py-1 text-xs">
{buttonMsg}
</Button>
</div>
</DialogTrigger>
<DialogContent>
<div className="mb-4 sm:flex sm:items-start">
<div className="mt-3 text-center sm:mt-0 sm:text-left">
<h3 className="font-cal text-emphasis text-lg leading-6" id="modal-title">
{t("upload_target", { target })}
</h3>
</div>
</div>
<div className="mb-4">
<div className="cropper mt-6 flex flex-col items-center justify-center p-8">
{!result && (
<div className="bg-muted flex h-20 max-h-20 w-20 items-center justify-start rounded-full">
{!imageSrc && (
<p className="text-inverted w-full text-center text-sm sm:text-xs">
{t("no_target", { target })}
</p>
)}
{imageSrc && (
// eslint-disable-next-line @next/next/no-img-element
<img className="h-20 w-20 rounded-full" src={imageSrc} alt={target} />
)}
</div>
)}
{result && <CropContainer imageSrc={result as string} onCropComplete={setCroppedAreaPixels} />}
<label className="border-default bg-default hover:bg-mutedover:text-emphasis dark:hover:bg-inverted text-default dark:text-inverted focus:ring-empthasis mt-8 rounded-sm border px-3 py-1 text-xs font-medium leading-4 focus:outline-none focus:ring-2 focus:ring-offset-1 dark:border-gray-800 dark:bg-transparent">
<input
onInput={onInputFile}
type="file"
name={id}
placeholder={t("upload_image")}
className="pointer-events-none absolute mt-4 opacity-0"
accept="image/*"
/>
{t("choose_a_file")}
</label>
</div>
</div>
<div className="mt-5 gap-x-2 sm:mt-4 sm:flex sm:flex-row-reverse">
<DialogClose onClick={() => showCroppedImage(croppedAreaPixels)}>{t("save")}</DialogClose>
<DialogClose color="secondary">{t("cancel")}</DialogClose>
</div>
</DialogContent>
</Dialog>
);
}
+2 -2
View File
@@ -1,4 +1,3 @@
import { AdminRequired } from "components/ui/AdminRequired";
import { noop } from "lodash";
import type { LinkProps } from "next/link";
import Link from "next/link";
@@ -6,6 +5,7 @@ import { useRouter } from "next/router";
import type { FC, MouseEventHandler } from "react";
import { Fragment } from "react";
import { PermissionContainer } from "@calcom/features/auth/PermissionContainer";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import classNames from "@lib/classNames";
@@ -60,7 +60,7 @@ const NavTabs: FC<NavTabProps> = ({ tabs, linkProps, ...props }) => {
}
: noop;
const Component = tab.adminRequired ? AdminRequired : Fragment;
const Component = tab.adminRequired ? PermissionContainer : Fragment;
const className = tab.className || "";
return (
<Component key={tab.name}>
-17
View File
@@ -4,7 +4,6 @@ import localFont from "next/font/local";
import Script from "next/script";
import "@calcom/embed-core/src/embed-iframe";
import { useEmbedUiConfig } from "@calcom/embed-core/src/embed-iframe";
import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import type { AppProps } from "@lib/app-providers";
@@ -29,17 +28,6 @@ const calFont = localFont({
function PageWrapper(props: AppProps) {
const { Component, pageProps, err, router } = props;
let pageStatus = "200";
const { cssVarsPerTheme } = useEmbedUiConfig();
const cssVarsStyle = [];
if (cssVarsPerTheme) {
for (const [themeName, cssVars] of Object.entries(cssVarsPerTheme)) {
cssVarsStyle.push(`.${themeName} {`);
for (const [cssVarName, value] of Object.entries(cssVars)) {
cssVarsStyle.push(`--${cssVarName}: ${value};`);
}
cssVarsStyle.push(`}`);
}
}
if (router.pathname === "/404") {
pageStatus = "404";
@@ -77,11 +65,6 @@ function PageWrapper(props: AppProps) {
}
`}</style>
<style jsx global>
{`
${cssVarsStyle.join("")}
`}
</style>
{getLayout(
Component.requiresLicense ? (
<LicenseRequired>
+1 -1
View File
@@ -46,7 +46,7 @@ export default function SettingsShell({
...rest
}: { children: React.ReactNode } & ComponentProps<typeof Shell>) {
return (
<Shell {...rest}>
<Shell {...rest} hideHeadingOnMobile>
<div className="sm:mx-auto">
<NavTabs tabs={tabs} />
</div>
-27
View File
@@ -1,27 +0,0 @@
import * as SliderPrimitive from "@radix-ui/react-slider";
import React from "react";
const Slider = ({
value,
label,
changeHandler,
...props
}: Omit<SliderPrimitive.SliderProps, "value"> & {
value: number;
label: string;
changeHandler: (value: number) => void;
}) => (
<SliderPrimitive.Root
className="slider mt-2"
value={[value]}
aria-label={label}
onValueChange={(value: number[]) => changeHandler(value[0] ?? value)}
{...props}>
<SliderPrimitive.Track className="slider-track">
<SliderPrimitive.Range className="slider-range" />
</SliderPrimitive.Track>
<SliderPrimitive.Thumb className="slider-thumb" />
</SliderPrimitive.Root>
);
export default Slider;
+4 -4
View File
@@ -6,7 +6,7 @@ import React, { useState } from "react";
import useAddAppMutation from "@calcom/app-store/_utils/useAddAppMutation";
import { InstallAppButton, AppDependencyComponent } from "@calcom/app-store/components";
import DisconnectIntegration from "@calcom/features/apps/components/DisconnectIntegration";
import LicenseRequired from "@calcom/features/ee/common/components/v2/LicenseRequired";
import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import Shell from "@calcom/features/shell/Shell";
import classNames from "@calcom/lib/classNames";
import { APP_NAME, COMPANY_NAME, SUPPORT_MAIL_ADDRESS } from "@calcom/lib/constants";
@@ -41,7 +41,7 @@ const Component = ({
isTemplate,
dependencies,
}: Parameters<typeof App>[0]) => {
const { t } = useLocale();
const { t, i18n } = useLocale();
const hasDescriptionItems = descriptionItems && descriptionItems.length > 0;
const router = useRouter();
@@ -247,7 +247,7 @@ const Component = ({
t("free_to_use_apps")
) : (
<>
{Intl.NumberFormat("en-US", {
{Intl.NumberFormat(i18n.language, {
style: "currency",
currency: "USD",
useGrouping: false,
@@ -366,7 +366,7 @@ export default function App(props: {
dependencies?: string[];
}) {
return (
<Shell smallHeading isPublic heading={<ShellHeading />} backPath="/apps" withoutSeo>
<Shell smallHeading isPublic hideHeadingOnMobile heading={<ShellHeading />} backPath="/apps" withoutSeo>
<HeadSeo
title={props.name}
description={props.description}
@@ -22,7 +22,7 @@ export default function AppsLayout({ children, actions, emptyStore, ...rest }: A
if (session.status === "loading") return <></>;
return (
<Shell {...rest} actions={actions?.("block")}>
<Shell {...rest} actions={actions?.("block")} hideHeadingOnMobile>
<div className="flex flex-col xl:flex-row">
<main className="w-full">
{emptyStore ? (
@@ -57,7 +57,7 @@ export default function InstalledAppsLayout({
}
return (
<Shell {...rest}>
<Shell {...rest} hideHeadingOnMobile>
<AppCategoryNavigation baseURL="/apps/installed" containerClassname="min-w-0 w-full">
{children}
</AppCategoryNavigation>
@@ -41,7 +41,7 @@ export function AvailableEventLocations({ locations }: { locations: Props["event
return (
<div key={`${location.type}-${index}`} className="flex flex-row items-center text-sm font-medium">
{eventLocationType.iconUrl === "/link.svg" ? (
<Link className="text-default min-h-4 min-w-4 ml-[2px] opacity-70 ltr:mr-[10px] rtl:ml-[10px] " />
<Link className="text-default ml-[2px] h-4 w-4 ltr:mr-[10px] rtl:ml-[10px] " />
) : (
<img
src={eventLocationType.iconUrl}
@@ -1,5 +1,5 @@
import { i18n } from "next-i18next";
import type { TFunction } from "next-i18next";
import { FormattedNumber, IntlProvider } from "react-intl";
import getPaymentAppData from "@calcom/lib/getPaymentAppData";
import { CreditCard } from "@calcom/ui/components/icon";
@@ -7,28 +7,29 @@ import { CreditCard } from "@calcom/ui/components/icon";
const BookingDescriptionPayment = (props: {
eventType: Parameters<typeof getPaymentAppData>[0];
t: TFunction;
i18n: typeof i18n;
}) => {
const paymentAppData = getPaymentAppData(props.eventType);
if (!paymentAppData || paymentAppData.price <= 0) return null;
const params = {
amount: paymentAppData.price / 100.0,
formatParams: { amount: { currency: paymentAppData.currency } },
};
return (
<p className="text-bookinglight -ml-2 px-2 text-sm ">
<CreditCard className="ml-[2px] -mt-1 inline-block h-4 w-4 ltr:mr-[10px] rtl:ml-[10px]" />
{paymentAppData.paymentOption === "HOLD" ? (
<>
{props.t("no_show_fee_amount", {
amount: paymentAppData.price / 100.0,
formatParams: { amount: { currency: paymentAppData.currency } },
})}
</>
<>{props.t("no_show_fee_amount", params)}</>
) : (
<IntlProvider locale="en">
<FormattedNumber
value={paymentAppData.price / 100.0}
style="currency"
currency={paymentAppData.currency?.toUpperCase()}
/>
</IntlProvider>
<>
{/* If undefined this will default to the browser locale */}
{new Intl.NumberFormat(i18n?.language, {
style: "currency",
currency: paymentAppData.currency,
}).format(paymentAppData.price / 100)}
</>
)}
</p>
);
@@ -1,7 +1,6 @@
import dynamic from "next/dynamic";
import { useRouter } from "next/router";
import { useEffect, useMemo, useReducer, useState } from "react";
import { FormattedNumber, IntlProvider } from "react-intl";
import { z } from "zod";
import BookingPageTagManager from "@calcom/app-store/BookingPageTagManager";
@@ -75,7 +74,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
brandColor: profile.brandColor,
darkBrandColor: profile.darkBrandColor,
});
const { t } = useLocale();
const { t, i18n } = useLocale();
const availabilityDatePickerEmbedStyles = useEmbedStyles("availabilityDatePicker");
//TODO: Plan to remove shouldAlignCentrallyInEmbed config
const shouldAlignCentrallyInEmbed = useEmbedNonStylesConfig("align") !== "left";
@@ -124,16 +123,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
[timeZone]
);
const paymentAppData = getPaymentAppData(eventType);
const paymentAmount = () => {
return;
<IntlProvider locale="en">
<FormattedNumber
value={paymentAppData.price / 100.0}
style="currency"
currency={paymentAppData.currency?.toUpperCase()}
/>
</IntlProvider>;
};
const rainbowAppData = getEventTypeAppData(eventType, "rainbow") || {};
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.
@@ -257,13 +247,12 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
})}
</>
) : (
<IntlProvider locale="en">
<FormattedNumber
value={paymentAppData.price / 100.0}
style="currency"
currency={paymentAppData.currency?.toUpperCase()}
/>
</IntlProvider>
<>
{new Intl.NumberFormat(i18n.language, {
style: "currency",
currency: paymentAppData.currency,
}).format(paymentAppData.price / 100)}
</>
)}
</p>
)}
@@ -554,7 +554,7 @@ const BookingPage = ({
{showEventTypeDetails && (
<div className="sm:border-subtle text-default flex flex-col px-6 pt-6 pb-0 sm:w-1/2 sm:border-r sm:pb-6">
<BookingDescription isBookingPage profile={profile} eventType={eventType}>
<BookingDescriptionPayment eventType={eventType} t={t} />
<BookingDescriptionPayment eventType={eventType} t={t} i18n={i18n} />
{!rescheduleUid && eventType.recurringEvent?.freq && recurringEventCount && (
<div className="dark:text-inverted text-default items-start text-sm font-medium">
<RefreshCw className="ml-[2px] inline-block h-4 w-4 ltr:mr-[10px] rtl:ml-[10px]" />
@@ -1,7 +1,5 @@
import { Trans } from "next-i18next";
import { useState } from "react";
import type { Dispatch, SetStateAction } from "react";
import { IntlProvider, FormattedNumber } from "react-intl";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc/react";
@@ -40,6 +38,11 @@ export const ChargeCardDialog = (props: IRescheduleDialog) => {
},
});
const currencyStringParams = {
amount: props.paymentAmount / 100.0,
formatParams: { amount: { currency: props.paymentCurrency } },
};
return (
<Dialog open={isOpenDialog} onOpenChange={setIsOpenDialog}>
<DialogContent>
@@ -49,19 +52,7 @@ export const ChargeCardDialog = (props: IRescheduleDialog) => {
</div>
<div className="pt-1">
<DialogHeader title={t("charge_card")} />
<Trans i18nKey="charge_card_dialog_body">
<p className="text-sm text-gray-500">
You are about to charge the attendee{" "}
<IntlProvider locale="en">
<FormattedNumber
value={props.paymentAmount / 100.0}
style="currency"
currency={props.paymentCurrency?.toUpperCase()}
/>
</IntlProvider>
. Are you sure you want to continue?
</p>
</Trans>
<p>{t("charge_card_dialog_body", currencyStringParams)}</p>
{chargeError && (
<div className="mt-4 flex text-red-500">
@@ -80,16 +71,7 @@ export const ChargeCardDialog = (props: IRescheduleDialog) => {
bookingId,
})
}>
<Trans i18nKey="charge_card_confirm">
Charge attendee{" "}
<IntlProvider locale="en">
<FormattedNumber
value={props.paymentAmount / 100.0}
style="currency"
currency={props.paymentCurrency?.toUpperCase()}
/>
</IntlProvider>
</Trans>
{t("charge_attendee", currencyStringParams)}
</Button>
</DialogFooter>
</div>
@@ -174,7 +174,6 @@ export const EditLocationDialog = (props: ISetLocationDialog) => {
id="locationInput"
placeholder={t(eventLocationType.organizerInputPlaceholder || "")}
required
className="border-default block w-full rounded-sm text-sm"
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
defaultValue={
defaultLocation ? defaultLocation[eventLocationType.defaultValueVariable] : undefined
@@ -106,7 +106,7 @@ export const EventAppsTab = ({ eventType }: { eventType: EventType }) => {
{!shouldLockDisableProps("apps").disabled && (
<div>
{!isLoading && notInstalledApps?.length ? (
<h2 className="text-emphasis mt-0 mb-2 text-lg font-semibold">{t("available_apps")}</h2>
<h2 className="text-emphasis my-2 text-lg font-semibold">{t("available_apps")}</h2>
) : null}
<div className="before:border-0">
{notInstalledApps?.map((app) => (
@@ -12,6 +12,7 @@ import { z } from "zod";
import type { EventLocationType } from "@calcom/app-store/locations";
import { getEventLocationType, MeetLocationType, LocationType } from "@calcom/app-store/locations";
import useLockedFieldsManager from "@calcom/features/ee/managed-event-types/hooks/useLockedFieldsManager";
import cx from "@calcom/lib/classNames";
import { CAL_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { md } from "@calcom/lib/markdownIt";
@@ -80,6 +81,7 @@ const DescriptionEditor = (props: DescriptionEditorProps) => {
const [mounted, setIsMounted] = useState(false);
const { t } = useLocale();
const { description } = props;
const [firstRender, setFirstRender] = useState(true);
useEffect(() => {
setIsMounted(true);
}, []);
@@ -91,6 +93,8 @@ const DescriptionEditor = (props: DescriptionEditorProps) => {
excludedToolbarItems={["blockType"]}
placeholder={t("quick_video_meeting")}
editable={props.editable}
firstRender={firstRender}
setFirstRender={setFirstRender}
/>
) : (
<SkeletonContainer>
@@ -277,7 +281,13 @@ export const EventSetupTab = (
<div className="flex items-center">
<img
src={eventLocationType.iconUrl}
className="h-4 w-4"
className={cx(
"h-4 w-4",
// invert all the icons except app icons
eventLocationType.iconUrl &&
!eventLocationType.iconUrl.startsWith("/api") &&
"dark:invert"
)}
alt={`${eventLocationType.label} logo`}
/>
<span className="line-clamp-1 ms-1 text-sm">{eventLabel}</span>
@@ -50,7 +50,7 @@ const SetupAvailability = (props: ISetupAvailabilityProps) => {
const updateSchedule = trpc.viewer.availability.schedule.update.useMutation(mutationOptions);
return (
<Form
className="bg-default dark:text-inverted text-emphasis w-full dark:bg-opacity-5"
className="bg-default dark:text-inverted text-emphasis w-full [--cal-brand-accent:#fafafa] dark:bg-opacity-5"
form={availabilityForm}
handleSubmit={async (values) => {
try {
@@ -35,6 +35,7 @@ const UserProfile = (props: IUserProfileProps) => {
const router = useRouter();
const createEventType = trpc.viewer.eventTypes.create.useMutation();
const telemetry = useTelemetry();
const [firstRender, setFirstRender] = useState(true);
const mutation = trpc.viewer.updateProfile.useMutation({
onSuccess: async (_data, context) => {
@@ -147,6 +148,8 @@ const UserProfile = (props: IUserProfileProps) => {
getText={() => md.render(getValues("bio") || user?.bio || "")}
setText={(value: string) => setValue("bio", turndown(value))}
excludedToolbarItems={["blockType"]}
firstRender={firstRender}
setFirstRender={setFirstRender}
/>
<p className="dark:text-inverted text-default mt-2 font-sans text-sm font-normal">
{t("few_sentences_about_yourself")}
-17
View File
@@ -1,17 +0,0 @@
import { useSession } from "next-auth/react";
import type { FC } from "react";
import { Fragment } from "react";
type AdminRequiredProps = {
as?: keyof JSX.IntrinsicElements;
children?: React.ReactNode;
};
/** @deprecated use PermssionContainer instead. Will delete once V2 goes live */
export const AdminRequired: FC<AdminRequiredProps> = ({ children, as, ...rest }) => {
const session = useSession();
if (session.data?.user.role !== "ADMIN") return null;
const Component = as ?? Fragment;
return <Component {...rest}>{children}</Component>;
};
+2 -6
View File
@@ -1,7 +1,6 @@
import classNames from "classnames";
import { APP_NAME, LOGO } from "@calcom/lib/constants";
import { HeadSeo } from "@calcom/ui";
import { HeadSeo, Logo } from "@calcom/ui";
import Loader from "@components/Loader";
@@ -18,10 +17,7 @@ export default function AuthContainer(props: React.PropsWithChildren<Props>) {
return (
<div className="flex min-h-screen flex-col justify-center bg-[#f3f4f6] py-12 sm:px-6 lg:px-8">
<HeadSeo title={props.title} description={props.description} />
{props.showLogo && (
// eslint-disable-next-line @next/next/no-img-element
<img className="mb-auto h-4" src={LOGO} alt={`${APP_NAME} Logo`} />
)}
{props.showLogo && <Logo small inline={false} className="mx-auto mb-auto" />}
<div className={classNames(props.showLogo ? "text-center" : "", "sm:mx-auto sm:w-full sm:max-w-md")}>
{props.heading && <h2 className="font-cal text-emphasis text-center text-3xl">{props.heading}</h2>}
+5 -3
View File
@@ -16,8 +16,10 @@ const EditableHeading = function EditableHeading({
const [isEditing, setIsEditing] = useState(false);
const enableEditing = () => setIsEditing(true);
return (
<div className="group relative cursor-pointer" onClick={enableEditing}>
<div className="flex items-center">
<div
className="group pointer-events-none relative truncate sm:pointer-events-auto"
onClick={enableEditing}>
<div className="flex cursor-pointer items-center">
<label className="min-w-8 relative inline-block">
<span className="whitespace-pre text-xl tracking-normal text-transparent">{value}&nbsp;</span>
{!isEditing && isReady && (
@@ -29,7 +31,7 @@ const EditableHeading = function EditableHeading({
value={value}
required
className={classNames(
"text-emphasis hover:text-default focus:text-emphasis absolute top-0 left-0 w-full cursor-pointer border-none bg-transparent p-0 align-top text-xl focus:outline-none focus:ring-0"
"text-emphasis hover:text-default focus:text-emphasis absolute top-0 left-0 w-full cursor-pointer truncate border-none bg-transparent p-0 align-top text-xl focus:outline-none focus:ring-0"
)}
onFocus={(e) => {
setIsEditing(true);
@@ -195,7 +195,7 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
<span
className={classNames(
isInputUsernamePremium ? "border border-orange-400 " : "",
"border-default bg-muted text-subtle hidden h-9 items-center rounded-l-md border border-r-0 border-r-gray-300 px-3 text-sm md:inline-flex"
"border-default bg-muted text-subtle hidden h-9 items-center rounded-l-md border border-r-0 px-3 text-sm md:inline-flex"
)}>
{process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "")}/
</span>
@@ -215,7 +215,7 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
: "border focus:border",
markAsError
? "focus:shadow-0 focus:ring-shadow-0 border-red-500 focus:border-red-500 focus:outline-none"
: "border-l-gray-300",
: "border-l-default",
disabled ? "bg-subtle text-muted focus:border-0" : ""
)}
value={inputUsernameValue}
@@ -234,8 +234,8 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
isInputUsernamePremium ? "text-orange-400" : "",
usernameIsAvailable ? "" : ""
)}>
{isInputUsernamePremium ? <StarIconSolid className="mt-[2px] w-6" /> : <></>}
{!isInputUsernamePremium && usernameIsAvailable ? <Check className="mt-2 w-6" /> : <></>}
{isInputUsernamePremium ? <StarIconSolid className="mt-[2px] h-4 w-4" /> : <></>}
{!isInputUsernamePremium && usernameIsAvailable ? <Check className="mt-2 h-4 w-4" /> : <></>}
</span>
</div>
</div>
@@ -136,8 +136,8 @@ const UsernameTextfield = (props: ICustomUsernameProps) => {
/>
{currentUsername !== inputUsernameValue && (
<div className="absolute right-[2px] top-6 flex flex-row">
<span className={classNames("mx-2 py-2")}>
{usernameIsAvailable ? <Check className="w-6" /> : <></>}
<span className={classNames("mx-2 py-2.5")}>
{usernameIsAvailable ? <Check className="h-4 w-4" /> : <></>}
</span>
</div>
)}
@@ -49,7 +49,7 @@ const CheckboxField = forwardRef<HTMLInputElement, Props>(
{...rest}
ref={ref}
type="checkbox"
className="text-primary-600 focus:ring-primary-500 border-default h-4 w-4 rounded"
className="text-primary-600 focus:ring-primary-500 border-default bg-default h-4 w-4 rounded"
/>
</div>
<span className="ms-3 text-sm">{description}</span>
@@ -3,6 +3,7 @@ import { components } from "react-select";
import type { EventLocationType } from "@calcom/app-store/locations";
import { classNames } from "@calcom/lib";
import cx from "@calcom/lib/classNames";
import { Select } from "@calcom/ui";
export type LocationOption = {
@@ -19,10 +20,14 @@ export type GroupOptionType = GroupBase<LocationOption>;
const OptionWithIcon = ({ icon, label }: { icon?: string; label: string }) => {
return (
<div className="flex items-center gap-3">
{/* TODO: figure out a way to invert icons when in dark mode. We can't just
dark:invert due to google meet cal etc all breaking when we do this
*/}
{icon && <img src={icon} alt="cover" className="h-3.5 w-3.5 dark:hidden" />}
{icon && (
<img
src={icon}
alt="cover"
// invert all the icons except app icons
className={cx("h-3.5 w-3.5", icon && !icon.startsWith("/api") && "dark:invert")}
/>
)}
<span className={classNames("text-sm font-medium")}>{label}</span>
</div>
);
+1
View File
@@ -155,6 +155,7 @@ const AppProviders = (props: AppPropsWithChildren) => {
<SessionProvider session={session || undefined}>
<CustomI18nextProvider {...props}>
<TooltipProvider>
{/* color-scheme makes background:transparent not work which is required by embed. We need to ensure next-theme adds color-scheme to `body` instead of `html`(https://github.com/pacocoursey/next-themes/blob/main/src/index.tsx#L74). Once that's done we can enable color-scheme support */}
<CalcomThemeProvider
nonce={props.pageProps.nonce}
isThemeSupported={props.Component.isThemeSupported}
+11
View File
@@ -98,6 +98,12 @@ const nextConfig = {
transform: "lucide-react/dist/esm/icons/{{ kebabCase member }}",
preventFullImport: true,
},
"@heroicons/react/solid": {
transform: "@heroicons/react/solid/esm/{{ member }}",
},
"@heroicons/react/outline": {
transform: "@heroicons/react/outline/esm/{{ member }}",
},
"@calcom/features/insights/components": {
transform: "@calcom/features/insights/components/{{member}}",
skipDefaultConversion: true,
@@ -291,6 +297,11 @@ const nextConfig = {
destination: "/api/link?action=:action&email=:email&bookingUid=:bookingUid&oldToken=:oldToken",
permanent: true,
},
{
source: "/support",
destination: "/event-types?openIntercom=true",
permanent: true,
},
];
if (process.env.NEXT_PUBLIC_WEBAPP_URL === "https://app.cal.com") {
+1 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@calcom/web",
"version": "2.8.4",
"version": "2.8.8",
"private": true,
"scripts": {
"analyze": "ANALYZE=true next build",
@@ -115,8 +115,6 @@
"react-select": "^5.7.0",
"react-timezone-select": "^1.4.0",
"react-use-intercom": "1.5.1",
"react-virtualized-auto-sizer": "^1.0.6",
"react-window": "^1.8.7",
"remark": "^14.0.2",
"rrule": "^2.7.1",
"sanitize-html": "^2.10.0",
@@ -155,8 +153,6 @@
"@types/qrcode": "^1.4.3",
"@types/react": "18.0.26",
"@types/react-phone-number-input": "^3.0.14",
"@types/react-virtualized-auto-sizer": "^1.0.1",
"@types/react-window": "^1.8.5",
"@types/sanitize-html": "^2.9.0",
"@types/stripe": "^8.0.417",
"@types/uuid": "8.3.1",
+3 -3
View File
@@ -59,7 +59,7 @@ export default function User(props: inferSSRProps<typeof getServerSideProps> & E
{eventTypes.map((type, index) => (
<li
key={index}
className=" border-subtle bg-default hover:bg-muted group relative border-b first:rounded-t-md last:rounded-b-md last:border-b-0">
className=" border-subtle bg-default dark:bg-muted dark:hover:bg-emphasis hover:bg-muted group relative border-b first:rounded-t-md last:rounded-b-md last:border-b-0">
<ArrowRight className="text-emphasis absolute right-3 top-3 h-4 w-4 opacity-0 transition-opacity group-hover:opacity-100" />
<Link
href={getUsernameSlugLink({ users: props.users, slug: type.slug })}
@@ -123,7 +123,7 @@ export default function User(props: inferSSRProps<typeof getServerSideProps> & E
<main
className={classNames(
shouldAlignCentrally ? "mx-auto" : "",
isEmbed ? " border-booker border-booker-width bg-default rounded-md border" : "",
isEmbed ? "border-booker border-booker-width bg-default rounded-md border" : "",
"max-w-3xl py-24 px-4"
)}>
{isSingleUser && ( // When we deal with a single user, not dynamic group
@@ -161,7 +161,7 @@ export default function User(props: inferSSRProps<typeof getServerSideProps> & E
<div
key={type.id}
style={{ display: "flex", ...eventTypeListItemEmbedStyles }}
className=" border-subtle bg-default hover:bg-muted group relative border-b first:rounded-t-md last:rounded-b-md last:border-b-0">
className="border-subtle dark:bg-muted dark:hover:bg-emphasis hover:bg-muted group relative border-b first:rounded-t-md last:rounded-b-md last:border-b-0">
<ArrowRight className="text-emphasis absolute right-4 top-4 h-4 w-4 opacity-0 transition-opacity group-hover:opacity-100" />
{/* Don't prefetch till the time we drop the amount of javascript in [user][type] page which is impacting score for [user] page */}
<div className="block w-full p-5">
@@ -18,7 +18,7 @@ export const getStaticProps: GetStaticProps<
{ user: string }
> = async (context) => {
const { user: username, month } = paramsSchema.parse(context.params);
const user = await prisma.user.findUnique({
const userWithCredentials = await prisma.user.findUnique({
where: {
username,
},
@@ -34,14 +34,15 @@ export const getStaticProps: GetStaticProps<
).startOf("day");
const endDate = startDate.endOf("month");
try {
const results = user?.credentials
const results = userWithCredentials?.credentials
? await getCachedResults(
user?.credentials,
userWithCredentials?.credentials,
startDate.format(),
endDate.format(),
user?.selectedCalendars
userWithCredentials?.selectedCalendars
)
: [];
return {
props: { results, date: new Date().toISOString() },
revalidate: 1,
+1 -4
View File
@@ -3,8 +3,6 @@ import type { DocumentContext, DocumentProps } from "next/document";
import Document, { Head, Html, Main, NextScript } from "next/document";
import { z } from "zod";
import { getDirFromLang } from "@calcom/lib/i18n";
import { csp } from "@lib/csp";
type Props = Record<string, unknown> & DocumentProps;
@@ -38,9 +36,8 @@ class MyDocument extends Document<Props> {
const { isEmbed } = this.props;
const nonceParsed = z.string().safeParse(this.props.nonce);
const nonce = nonceParsed.success ? nonceParsed.data : "";
const dir = getDirFromLang(locale);
return (
<Html lang={locale} dir={dir}>
<Html lang={locale}>
<Head nonce={nonce}>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
+4 -4
View File
@@ -14,7 +14,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
return;
}
const user = await prisma.user.findUnique({
const userWithCredentials = await prisma.user.findUnique({
where: {
id: session.user.id,
},
@@ -25,11 +25,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
selectedCalendars: true,
},
});
if (!user) {
if (!userWithCredentials) {
res.status(401).json({ message: "Not authenticated" });
return;
}
const { credentials, ...user } = userWithCredentials;
if (req.method === "POST") {
await prisma.selectedCalendar.upsert({
@@ -80,7 +80,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
});
// get user's credentials + their connected integrations
const calendarCredentials = getCalendarCredentials(user.credentials);
const calendarCredentials = getCalendarCredentials(credentials);
// get all the connected integrations' calendars (from third party)
const { connectedCalendars } = await getConnectedCalendars(calendarCredentials, user.selectedCalendars);
const calendars = connectedCalendars.flatMap((c) => c.calendars).filter(notEmpty);
+28
View File
@@ -0,0 +1,28 @@
import type { NextApiRequest, NextApiResponse } from "next";
import crypto from "node:crypto";
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
import { defaultHandler } from "@calcom/lib/server";
async function handler(req: NextApiRequest, res: NextApiResponse) {
const session = await getServerSession({ req, res });
const secret = process.env.INTERCOM_SECRET;
if (!session) {
return res.status(401).json({ message: "user not authenticated" });
}
if (!secret) {
return res.status(400).json({ message: "Intercom Identity Verification secret not set" });
}
const hmac = crypto.createHmac("sha256", secret);
hmac.update(String(session.user.id));
const hash = hmac.digest("hex");
return res.status(200).json({ hash });
}
export default defaultHandler({
GET: Promise.resolve({ default: handler }),
});
+80
View File
@@ -0,0 +1,80 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { z } from "zod";
import { IS_SELF_HOSTED, LOGO, LOGO_ICON, WEBAPP_URL } from "@calcom/lib/constants";
function removePort(url: string) {
return url.replace(/:\d+$/, "");
}
function extractSubdomainAndDomain(hostname: string) {
const hostParts = removePort(hostname).split(".");
const subdomainParts = hostParts.slice(0, hostParts.length - 2);
const domain = hostParts.slice(hostParts.length - 2).join(".");
return [subdomainParts[0], domain];
}
const logoApiSchema = z.object({
icon: z.coerce.boolean().optional(),
});
const SYSTEM_SUBDOMAINS = ["console", "app", "www"];
async function getTeamLogos(subdomain: string) {
if (
// if not cal.com
IS_SELF_HOSTED ||
// missing subdomain (empty string)
!subdomain ||
// in SYSTEM_SUBDOMAINS list
SYSTEM_SUBDOMAINS.includes(subdomain)
) {
return {
appLogo: `${WEBAPP_URL}${LOGO}`,
appIconLogo: `${WEBAPP_URL}${LOGO_ICON}`,
};
}
// load from DB
const { default: prisma } = await import("@calcom/prisma");
const team = await prisma.team.findUniqueOrThrow({
where: {
slug: subdomain,
},
select: {
appLogo: true,
appIconLogo: true,
},
});
// try to use team logos, otherwise default to LOGO/LOGO_ICON regardless
return {
appLogo: team.appLogo || `${WEBAPP_URL}${LOGO}`,
appIconLogo: team.appIconLogo || `${WEBAPP_URL}${LOGO_ICON}`,
};
}
/**
* This API endpoint is used to serve the logo associated with a team if no logo is found we serve our default logo
*/
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { query } = req;
const parsedQuery = logoApiSchema.parse(query);
const hostname = req?.headers["host"];
if (!hostname) throw new Error("No hostname");
const domains = extractSubdomainAndDomain(hostname);
if (!domains) throw new Error("No domains");
const [subdomain] = domains;
const { appLogo, appIconLogo } = await getTeamLogos(subdomain);
const filteredLogo = parsedQuery?.icon ? appIconLogo : appLogo;
const response = await fetch(filteredLogo);
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
res.setHeader("Content-Type", response.headers.get("content-type") as string);
res.setHeader("Cache-Control", "s-maxage=86400");
res.send(buffer);
}
@@ -54,7 +54,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
user: {
select: {
id: true,
credentials: true,
timeZone: true,
email: true,
name: true,
+1 -1
View File
@@ -13,7 +13,7 @@ export default function Apps({ categories }: InferGetStaticPropsType<typeof getS
const { t, isLocaleReady } = useLocale();
return (
<Shell isPublic large>
<Shell isPublic large hideHeadingOnMobile>
<div className="text-md flex items-center gap-1 px-4 pb-3 pt-3 font-normal md:px-8 lg:px-0 lg:pt-0">
<Link
href="/apps"
+8 -8
View File
@@ -165,14 +165,6 @@ export default function Login({
{...register("email")}
/>
<div className="relative">
<div className="absolute -top-[6px] z-10 ltr:right-0 rtl:left-0">
<Link
href="/auth/forgot-password"
tabIndex={-1}
className="text-default text-sm font-medium">
{t("forgot")}
</Link>
</div>
<PasswordField
id="password"
autoComplete="off"
@@ -180,6 +172,14 @@ export default function Login({
className="mb-0"
{...register("password")}
/>
<div className="absolute -top-1.5 ltr:right-0 rtl:left-0">
<Link
href="/auth/forgot-password"
tabIndex={-1}
className="text-default text-sm font-medium">
{t("forgot")}
</Link>
</div>
</div>
</div>
+16 -12
View File
@@ -1,5 +1,6 @@
import { signIn } from "next-auth/react";
import { useRouter } from "next/router";
import { useEffect } from "react";
import { samlProductID, samlTenantID } from "@calcom/features/ee/sso/lib/saml";
import { HOSTED_CAL_FEATURES } from "@calcom/lib/constants";
@@ -13,19 +14,22 @@ import PageWrapper from "@components/PageWrapper";
export default function Page({ samlTenantID, samlProductID }: inferSSRProps<typeof getServerSideProps>) {
const router = useRouter();
if (HOSTED_CAL_FEATURES) {
router.push("/auth/login");
return;
}
useEffect(() => {
if (HOSTED_CAL_FEATURES) {
router.push("/auth/login");
}
}, []);
// Initiate SAML authentication flow
signIn(
"saml",
{
callbackUrl: "/",
},
{ tenant: samlTenantID, product: samlProductID }
);
useEffect(() => {
// Initiate SAML authentication flow
signIn(
"saml",
{
callbackUrl: "/",
},
{ tenant: samlTenantID, product: samlProductID }
);
}, []);
return null;
}
+57 -9
View File
@@ -1,4 +1,5 @@
import { useRouter } from "next/router";
import { useState } from "react";
import { Controller, useFieldArray, useForm } from "react-hook-form";
import { z } from "zod";
@@ -24,10 +25,15 @@ import {
Tooltip,
Dialog,
DialogTrigger,
DropdownMenuSeparator,
Dropdown,
DropdownMenuContent,
DropdownItem,
DropdownMenuTrigger,
ConfirmationDialogContent,
VerticalDivider,
} from "@calcom/ui";
import { Info, Plus, Trash } from "@calcom/ui/components/icon";
import { Info, Plus, Trash, MoreHorizontal } from "@calcom/ui/components/icon";
import { HttpError } from "@lib/core/http/error";
@@ -97,6 +103,7 @@ export default function Availability() {
const { fromEventType } = router.query;
const { timeFormat } = me.data || { timeFormat: null };
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const { data: schedule, isLoading } = trpc.viewer.availability.schedule.get.useQuery(
{ scheduleId },
{
@@ -182,11 +189,8 @@ export default function Availability() {
}
CTA={
<div className="flex items-center justify-end">
<div className="sm:hover:bg-subtle flex items-center rounded-md px-2">
<Skeleton
as={Label}
htmlFor="hiddenSwitch"
className="mt-2 hidden cursor-pointer self-center pr-2 sm:inline">
<div className="hidden items-center rounded-md px-2 sm:flex sm:hover:bg-gray-100">
<Skeleton as={Label} htmlFor="hiddenSwitch" className="mt-2 cursor-pointer self-center pr-2 ">
{t("set_to_default")}
</Skeleton>
<Switch
@@ -199,7 +203,7 @@ export default function Availability() {
/>
</div>
<VerticalDivider />
<VerticalDivider className="hidden sm:inline" />
<Dialog>
<DialogTrigger asChild>
<Button
@@ -207,6 +211,7 @@ export default function Availability() {
variant="icon"
color="destructive"
aria-label={t("delete")}
className="hidden sm:inline"
disabled={schedule?.isLastSchedule}
tooltip={t("requires_at_least_one_schedule")}
/>
@@ -223,8 +228,51 @@ export default function Availability() {
{t("delete_schedule_description")}
</ConfirmationDialogContent>
</Dialog>
<VerticalDivider />
<VerticalDivider className="hidden sm:inline" />
<Dropdown>
<DropdownMenuTrigger asChild>
<Button className="sm:hidden" StartIcon={MoreHorizontal} variant="icon" color="secondary" />
</DropdownMenuTrigger>
<DropdownMenuContent style={{ minWidth: "200px" }}>
<DropdownItem
type="button"
color="destructive"
StartIcon={Trash}
onClick={() => setDeleteDialogOpen(true)}>
{t("delete")}
</DropdownItem>
<Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>
<ConfirmationDialogContent
isLoading={deleteMutation.isLoading}
variety="danger"
title={t("delete_schedule")}
confirmBtnText={t("delete")}
loadingText={t("delete")}
onConfirm={() => {
schedule !== undefined && deleteMutation.mutate({ scheduleId: schedule.id });
}}>
{t("delete_schedule_description")}
</ConfirmationDialogContent>
</Dialog>
<DropdownMenuSeparator />
<div className="flex h-9 flex-row items-center justify-between py-2 px-4 hover:bg-gray-100">
<Skeleton
as={Label}
htmlFor="hiddenSwitch"
className="mt-2 cursor-pointer self-center pr-2 sm:inline">
{t("set_to_default")}
</Skeleton>
<Switch
id="hiddenSwitch"
disabled={isLoading || schedule?.isDefault}
checked={form.watch("isDefault")}
onCheckedChange={(e) => {
form.setValue("isDefault", e);
}}
/>
</div>
</DropdownMenuContent>
</Dropdown>
<div className="border-default border-l-2" />
<Button className="ml-4 lg:ml-0" type="submit" form="availability-form">
+5 -1
View File
@@ -111,7 +111,11 @@ export default function AvailabilityPage() {
const { t } = useLocale();
return (
<div>
<Shell heading={t("availability")} subtitle={t("configure_availability")} CTA={<NewScheduleButton />}>
<Shell
heading={t("availability")}
hideHeadingOnMobile
subtitle={t("configure_availability")}
CTA={<NewScheduleButton />}>
<WithQuery success={({ data }) => <AvailabilityList {...data} />} customLoader={<SkeletonLoader />} />
</Shell>
</div>
+1 -1
View File
@@ -122,7 +122,7 @@ export default function Troubleshoot() {
const { t } = useLocale();
return (
<div>
<Shell heading={t("troubleshoot")} subtitle={t("troubleshoot_description")}>
<Shell heading={t("troubleshoot")} hideHeadingOnMobile subtitle={t("troubleshoot_description")}>
{!isLoading && data && <AvailabilityView user={data} />}
</Shell>
</div>
+46 -9
View File
@@ -891,16 +891,31 @@ const getEventTypesFromDB = async (id: number) => {
};
};
const handleSeatsEventTypeOnBooking = (
const handleSeatsEventTypeOnBooking = async (
eventType: {
seatsPerTimeSlot?: number | null;
seatsShowAttendees: boolean | null;
[x: string | number | symbol]: unknown;
},
bookingInfo: Partial<
Prisma.BookingGetPayload<{ include: { attendees: { select: { name: true; email: true } } } }>
Prisma.BookingGetPayload<{
include: {
attendees: { select: { name: true; email: true } };
seatsReferences: { select: { referenceUid: true } };
user: {
select: {
id: true;
name: true;
email: true;
username: true;
timeZone: true;
};
};
};
}>
>,
email: string
seatReferenceUid?: string,
userId?: number
) => {
if (eventType?.seatsPerTimeSlot !== null) {
// @TODO: right now bookings with seats doesn't save every description that its entered by every user
@@ -908,12 +923,34 @@ const handleSeatsEventTypeOnBooking = (
} else {
return;
}
// @TODO: If handling teams, we need to do more check ups for this.
if (bookingInfo?.user?.id === userId) {
return;
}
if (!eventType.seatsShowAttendees) {
const attendee = bookingInfo?.attendees?.find((a) => {
return a.email === email;
const seatAttendee = await prisma.bookingSeat.findFirst({
where: {
referenceUid: seatReferenceUid,
},
include: {
attendee: {
select: {
name: true,
email: true,
},
},
},
});
bookingInfo["attendees"] = attendee ? [attendee] : [];
if (seatAttendee) {
const attendee = bookingInfo?.attendees?.find((a) => {
return a.email === seatAttendee.attendee?.email;
});
bookingInfo["attendees"] = attendee ? [attendee] : [];
} else {
bookingInfo["attendees"] = [];
}
}
return bookingInfo;
};
@@ -931,7 +968,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
const parsedQuery = querySchema.safeParse(context.query);
if (!parsedQuery.success) return { notFound: true };
const { uid, email, eventTypeSlug, cancel, isSuccessBookingPage } = parsedQuery.data;
const { uid, eventTypeSlug, seatReferenceUid } = parsedQuery.data;
const bookingInfoRaw = await prisma.booking.findFirst({
where: {
@@ -1037,8 +1074,8 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
slug: eventType.team?.slug || eventType.users[0]?.username || null,
};
if (bookingInfo !== null && email && eventType.seatsPerTimeSlot) {
handleSeatsEventTypeOnBooking(eventType, bookingInfo, email);
if (bookingInfo !== null && eventType.seatsPerTimeSlot) {
await handleSeatsEventTypeOnBooking(eventType, bookingInfo, seatReferenceUid, session?.user.id);
}
const payment = await prisma.payment.findFirst({
+10 -1
View File
@@ -8,6 +8,7 @@ import type { FC } from "react";
import { useEffect, useState, memo } from "react";
import { z } from "zod";
import useIntercom from "@calcom/features/ee/support/lib/intercom/useIntercom";
import { EventTypeDescriptionLazy as EventTypeDescription } from "@calcom/features/eventtypes/components";
import CreateEventTypeDialog from "@calcom/features/eventtypes/components/CreateEventTypeDialog";
import { DuplicateDialog } from "@calcom/features/eventtypes/components/DuplicateDialog";
@@ -756,9 +757,16 @@ const WithQuery = withQuery(trpc.viewer.eventTypes.getByViewer);
const EventTypesPage = () => {
const { t } = useLocale();
const router = useRouter();
const { open } = useIntercom();
const { query } = router;
const isMobile = useMediaQuery("(max-width: 768px)");
useEffect(() => {
if (query?.openIntercom && query?.openIntercom === "true") {
open();
}
}, []);
return (
<div>
<HeadSeo
@@ -768,6 +776,7 @@ const EventTypesPage = () => {
<Shell
withoutSeo
heading={t("event_types_page_title")}
hideHeadingOnMobile
subtitle={t("event_types_page_subtitle")}
CTA={<CTA />}>
<WithQuery
+1 -1
View File
@@ -55,7 +55,7 @@ export default function InsightsPage() {
return (
<div>
<Shell>
<Shell hideHeadingOnMobile>
<UpgradeTip
title={t("make_informed_decisions")}
description={t("make_informed_decisions_description")}
+1 -1
View File
@@ -6,7 +6,7 @@ import PageWrapper from "@components/PageWrapper";
export default function MorePage() {
const { t } = useLocale();
return (
<Shell>
<Shell hideHeadingOnMobile>
<div className="max-w-screen-lg">
<MobileNavigationMoreItems />
<p className="text-subtle mt-6 text-xs leading-tight md:hidden">{t("more_page_footer")}</p>
+2 -2
View File
@@ -39,8 +39,8 @@ const BillingView = () => {
const returnTo = router.asPath;
const billingHref = `/api/integrations/stripepayment/portal?returnTo=${WEBAPP_URL}${returnTo}`;
const onContactSupportClick = () => {
open();
const onContactSupportClick = async () => {
await open();
};
return (
@@ -1,7 +1,7 @@
import { useState } from "react";
import type { TApiKeys } from "@calcom/ee/api-keys/components/ApiKeyListItem";
import LicenseRequired from "@calcom/ee/common/components/v2/LicenseRequired";
import LicenseRequired from "@calcom/ee/common/components/LicenseRequired";
import ApiKeyDialogForm from "@calcom/features/ee/api-keys/components/ApiKeyDialogForm";
import ApiKeyListItem from "@calcom/features/ee/api-keys/components/ApiKeyListItem";
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
@@ -52,6 +52,7 @@ const AppearanceView = () => {
const utils = trpc.useContext();
const { data: user, isLoading } = trpc.viewer.me.useQuery();
const [darkModeError, setDarkModeError] = useState(false);
const [lightModeError, setLightModeError] = useState(false);
const { isLoading: isTeamPlanStatusLoading, hasPaidPlan } = useHasPaidPlan();
@@ -145,7 +146,14 @@ const AppearanceView = () => {
<p className="text-default mb-2 block text-sm font-medium">{t("light_brand_color")}</p>
<ColorPicker
defaultValue={user.brandColor}
onChange={(value) => formMethods.setValue("brandColor", value, { shouldDirty: true })}
onChange={(value) => {
if (!checkWCAGContrastColor("#ffffff", value)) {
setLightModeError(true);
} else {
setLightModeError(false);
}
formMethods.setValue("brandColor", value, { shouldDirty: true });
}}
/>
</div>
)}
@@ -180,6 +188,14 @@ const AppearanceView = () => {
/>
</div>
) : null}
{lightModeError ? (
<div className="mt-4">
<Alert
severity="warning"
message="Light Theme color doesn't pass contrast check. We recommend you change this colour so your buttons will be more visible."
/>
</div>
) : null}
{/* TODO future PR to preview brandColors */}
{/* <Button
color="secondary"
@@ -320,6 +320,7 @@ const ProfileForm = ({
extraField?: React.ReactNode;
}) => {
const { t } = useLocale();
const [firstRender, setFirstRender] = useState(true);
const profileFormSchema = z.object({
username: z.string(),
@@ -385,6 +386,8 @@ const ProfileForm = ({
}}
excludedToolbarItems={["blockType"]}
disableLists
firstRender={firstRender}
setFirstRender={setFirstRender}
/>
</div>
<Button disabled={isDisabled} color="primary" className="mt-8" type="submit">
+1 -1
View File
@@ -5,7 +5,7 @@ import type { CSSProperties } from "react";
import type { SubmitHandler } from "react-hook-form";
import { FormProvider, useForm } from "react-hook-form";
import LicenseRequired from "@calcom/features/ee/common/components/v2/LicenseRequired";
import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import { isSAMLLoginEnabled } from "@calcom/features/ee/sso/lib/saml";
import { WEBAPP_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
+1
View File
@@ -14,6 +14,7 @@ function Teams() {
return (
<Shell
heading={t("teams")}
hideHeadingOnMobile
subtitle={t("create_manage_teams_collaborative")}
CTA={
<Button
-1
View File
@@ -282,7 +282,6 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
user: {
select: {
id: true,
credentials: true,
timeZone: true,
name: true,
email: true,
+140
View File
@@ -313,5 +313,145 @@ test.describe("Booking with Seats", () => {
// Validate that the number of seats its 10
expect(await page.locator("text=9 / 10 Seats available").count()).toEqual(0);
});
test("Should cancel with seats but event should be still accesible and with one less attendee/seat", async ({
page,
users,
bookings,
}) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Now we cancel the booking as the first attendee
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
);
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
);
// Page should not be 404
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
});
test("Should book with seats and hide attendees info from showAttendees true", async ({
page,
users,
bookings,
}) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
const bookingWithEventType = await prisma.booking.findFirst({
where: { uid: booking.uid },
select: {
id: true,
eventTypeId: true,
},
});
await prisma.eventType.update({
data: {
seatsShowAttendees: false,
},
where: {
id: bookingWithEventType?.eventTypeId || -1,
},
});
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Go to cancel page and see that attendees are listed and myself as I'm owner of the booking
await page.goto(`/booking/${booking.uid}?cancel=true&allRemainingBookings=false`);
const foundFirstAttendeeAsOwner = await page.locator('p[data-testid="attendee-first+seats@cal.com"]');
await expect(foundFirstAttendeeAsOwner).toHaveCount(1);
const foundSecondAttendeeAsOwner = await page.locator('p[data-testid="attendee-second+seats@cal.com"]');
await expect(foundSecondAttendeeAsOwner).toHaveCount(1);
await page.pause();
await page.goto("auth/logout");
// Now we cancel the booking as the first attendee
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
);
// No attendees should be displayed only the one that it's cancelling
const notFoundSecondAttendee = await page.locator('p[data-testid="attendee-second+seats@cal.com"]');
await expect(notFoundSecondAttendee).toHaveCount(0);
const foundFirstAttendee = await page.locator('p[data-testid="attendee-first+seats@cal.com"]');
await expect(foundFirstAttendee).toHaveCount(1);
await prisma.eventType.update({
data: {
seatsShowAttendees: true,
},
where: {
id: bookingWithEventType?.eventTypeId || -1,
},
});
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
);
// Now attendees should be displayed
const foundSecondAttendee = await page.locator('p[data-testid="attendee-second+seats@cal.com"]');
await expect(foundSecondAttendee).toHaveCount(1);
const foundFirstAttendeeAgain = await page
.locator('p[data-testid="attendee-first+seats@cal.com"]')
.first();
await expect(foundFirstAttendeeAgain).toHaveCount(1);
});
});
});
@@ -860,7 +860,7 @@
"add_new_calendar": "Přidat nový kalendář",
"set_calendar": "Nastavte, kam se mají při rezervaci přidávat nové události.",
"delete_schedule": "Odstranit plán",
"delete_schedule_description": "Odstranění plánu má za následek, že bude odstraněn ze všech typů událostí. Tuto akci nelze vrátit zpět.",
"delete_schedule_description": "Odstraněný plán bude odstraněn ze všech typů událostí. Tuto akci nelze vrátit zpět.",
"schedule_created_successfully": "Plán {{scheduleName}} byl úspěšně vytvořen",
"availability_updated_successfully": "Plán {{scheduleName}} byl úspěšně aktualizován",
"schedule_deleted_successfully": "Plán byl úspěšně odstraněn",
@@ -1154,7 +1154,7 @@
"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]",
"event_setup_duration_limits_error": "Limity doby trvání musí být seřazeny vzestupně. [den,týden,měsíc,rok]",
"event_setup_duration_limits_error": "Limity doby trvání 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í",
@@ -1614,7 +1614,7 @@
"form_builder_field_add_subtitle": "Přizpůsobte otázky položené na stránce rezervace",
"get_started_zapier_templates": "Začněte používat šablony Zapier",
"team_is_unpublished": "Tým {{team}} není zveřejněn",
"team_is_unpublished_description": "Tento týmový odkaz není v současné době k dispozici. Kontaktujte prosím vlastníka týmu nebo ho požádejte o jeho zveřejnění.",
"team_is_unpublished_description": "Tento týmový odkaz není v současné době k dispozici. Kontaktujte vlastníka týmu nebo ho požádejte o jeho zveřejnění.",
"team_member": "Člen týmu",
"a_routing_form": "Směrovací formulář",
"form_description_placeholder": "Popis formuláře",
@@ -1525,7 +1525,7 @@
"sender_name": "Absendername",
"already_invited": "Teilnehmer bereits eingeladen",
"no_recordings_found": "Keine Aufnahmen gefunden",
"new_workflow_subtitle": "Neuer Workflow für...",
"new_workflow_subtitle": "Neuer Workflow für ...",
"reporting": "Meldungen",
"reporting_feature": "Alle eingehenden Daten anzeigen und als CSV herunterladen",
"teams_plan_required": "Teams-Plan benötigt",
@@ -1586,15 +1586,15 @@
"recommended_next_steps": "Empfohlene nächste Schritte",
"create_a_managed_event": "Einen verwalteten Ereignistyp erstellen",
"meetings_are_better_with_the_right": "Meetings sind mit den richtigen Teammitgliedern besser. Laden Sie sie jetzt ein.",
"create_a_one_one_template": "Erstellen Sie eine One-on-One Vorlage für einen Termintyp und verteilen Sie diese an mehrere Mitglieder.",
"create_a_one_one_template": "Erstellen Sie eine One-on-One-Vorlage für einen Termintyp und verteilen Sie diese an mehrere Mitglieder.",
"collective_or_roundrobin": "Kollektiv oder Round-Robin",
"book_your_team_members": "Buchen Sie Ihre Teammitglieder zusammen mit Kollektivveranstaltungen oder wählen Sie mit Round-Robin die richtige Person.",
"event_no_longer_attending_subject": "Nimmt nicht mehr an {{title}} am {{date}} teil",
"no_longer_attending": "Sie nehmen an diesem Termin nicht mehr teil",
"attendee_no_longer_attending_subject": "Ein Teilnehmer nimmt nicht mehr an {{title}} am {{date}} teil",
"attendee_no_longer_attending": "Ein Teilnehmer nimmt nicht mehr an Ihrem Termin teil",
"attendee_no_longer_attending_subtitle": "{{name}} wurde abgebrochen. Das bedeutet, dass ein Platz für dieses Zeitfenster geöffnet wurde",
"create_event_on": "Erstelle Termin in",
"attendee_no_longer_attending_subtitle": "{{name}} hat abgesagt. Das bedeutet, dass ein Platz für dieses Zeitfenster geöffnet wurde",
"create_event_on": "Erstelle Termin am",
"default_app_link_title": "Standard-App-Link festlegen",
"default_app_link_description": "Mit dem Festlegen eines Standard-App-Links können alle neu erstellten Ereignistypen den App-Link verwenden, den Sie gesetzt haben.",
"change_default_conferencing_app": "Als Standard festlegen",
@@ -1621,9 +1621,9 @@
"keep_me_connected_with_form": "Verbindung mit dem Formular beibehalten",
"fields_in_form_duplicated": "Alle Änderungen an Weiterleitungsformularen und in den Feldern des Formulars, die dupliziert werden, werden auch im Duplikat wiedergegeben.",
"form_deleted": "Formular gelöscht",
"delete_form": "Formular löschen",
"delete_form": "Möchten Sie dieses Formular wirklich löschen?",
"delete_form_action": "Ja, Formular löschen",
"delete_form_confirmation": "Sind Sie sicher, dass Sie dieses Formular löschen möchten? Jede Person, mit der Sie den Link geteilt haben, kann nicht mehr über das Formular buchen. Außerdem würden alle zugehörigen Antworten gelöscht werden.",
"delete_form_confirmation": "Jede Person, mit der Sie den Link geteilt haben, kann nicht mehr über das Formular buchen.",
"delete_form_confirmation_2": "Alle zugehörigen Antworten werden gelöscht.",
"typeform_redirect_url_copied": "Typeform Umleitungs-URL kopiert! Sie können die URL in Typeform einstellen.",
"modifications_in_fields_warning": "Änderungen in den Feldern und Weiterleitungen der folgenden Formulare werden in diesem Formular reflektiert.",
@@ -1644,7 +1644,7 @@
"requires_app": "Benötigt {{dependencyName}}",
"verification_code": "Bestätigungscode",
"can_you_try_again": "Können Sie es zu einem anderen Zeitpunkt erneut versuchen?",
"verify": "Verifizieren",
"verify": "Bestätigen",
"timezone_variable": "Zeitzone",
"invalid_event_name_variables": "Es gibt eine ungültige Variable in Ihrem Terminnamen",
"select_all": "Alle auswählen",
@@ -1784,5 +1784,10 @@
"seats_and_no_show_fee_error": "Currently cannot enable seats and charge a no-show fee",
"complete_your_booking": "Complete your booking",
"complete_your_booking_subject": "Complete your booking: {{title}} on {{date}}",
"email_invite_team": "{{email}} has been invited"
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "You are about to charge the attendee {{amount, currency}}. Are you sure you want to continue?",
"charge_attendee": "Charge attendee {{amount, currency}}",
"payment_app_commission": "Require payment ({{paymentFeePercentage}}% + {{fee, currency}} commission per transaction)",
"email_invite_team": "{{email}} has been invited",
"image_size_limit_exceed": "Uploaded image shouldn't exceed 5mb size limit"
}
@@ -1586,15 +1586,15 @@
"recommended_next_steps": "Siguientes pasos recomendados",
"create_a_managed_event": "Crear un tipo de evento administrado",
"meetings_are_better_with_the_right": "Las reuniones son mejores si están los miembros adecuados del equipo. Invítelos ahora.",
"create_a_one_one_template": "Cree una plantilla uno a uno para un tipo de evento y distribúyala a varios miembros.",
"create_a_one_one_template": "Cree una plantilla de reunión individual para un tipo de evento y distribúyala a varios miembros.",
"collective_or_roundrobin": "Colectivo o turnos rotativos",
"book_your_team_members": "Reserve a los miembros de su equipo juntos con eventos colectivos o por ciclos para conseguir a la persona adecuada con turnos rotativos.",
"event_no_longer_attending_subject": "Ya no asistirá a {{title}} el {{date}}",
"event_no_longer_attending_subject": "Ya no asistirá a {{title}} a las {{date}}",
"no_longer_attending": "Ya no asistirá a este evento",
"attendee_no_longer_attending_subject": "Un asistente ya no asistirá a {{title}} el {{date}}",
"attendee_no_longer_attending_subject": "Un asistente ya no asistirá a {{title}} a las {{date}}",
"attendee_no_longer_attending": "Un asistente ya no asistirá a su evento",
"attendee_no_longer_attending_subtitle": "{{name}} ha cancelado. Esto significa que está disponible un cupo para esta franja horaria",
"create_event_on": "Crear evento el",
"create_event_on": "Crear evento en",
"default_app_link_title": "Establecer un enlace de aplicación predeterminado",
"default_app_link_description": "Establecer un enlace de aplicación predeterminado permite que todos los tipos de eventos recién creados utilicen el enlace de aplicación que establezca.",
"change_default_conferencing_app": "Establecer como predeterminado",
@@ -1640,7 +1640,7 @@
"this_meeting_has_not_started_yet": "Esta reunión aún no ha comenzado",
"this_app_requires_connected_account": "{{appName}} requiere una cuenta {{dependencyName}} conectada",
"connect_app": "Conectar {{dependencyName}}",
"app_is_connected": "{{dependencyName}} está conectado",
"app_is_connected": "{{dependencyName}} está conectada",
"requires_app": "Requiere {{dependencyName}}",
"verification_code": "Código de verificación",
"can_you_try_again": "¿Puede intentarlo de nuevo con una hora diferente?",
@@ -1784,5 +1784,10 @@
"seats_and_no_show_fee_error": "Il n'est pas possible d'activer les places et de facturer des frais d'absence pour le moment",
"complete_your_booking": "Terminer votre réservation",
"complete_your_booking_subject": "Terminer votre réservation : {{title}} le {{date}}",
"email_invite_team": "{{email}} a été invité"
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "Vous êtes sur le point de facturer {{amount, currency}} au participant. Voulez-vous vraiment continuer ?",
"charge_attendee": "Facturer {{amount, currency}} au participant",
"payment_app_commission": "Exiger un paiement ({{paymentFeePercentage}} % + {{fee, currency}} de commission par transaction)",
"email_invite_team": "{{email}} a été invité",
"image_size_limit_exceed": "L'image téléchargée ne doit pas dépasser 5 Mo"
}
+136 -1
View File
@@ -1,4 +1,5 @@
{
"identity_provider": "Provider di identità",
"trial_days_left": "Ti rimangono $t(day, {\"count\": {{days}} }) di prova con il piano PRO",
"day_one": "{{count}} giorno",
"day_other": "{{count}} giorni",
@@ -69,6 +70,8 @@
"event_awaiting_approval_subject": "In attesa di approvazione: {{title}} il {{date}}",
"event_still_awaiting_approval": "Un evento è ancora in attesa della tua approvazione",
"booking_submitted_subject": "Prenotazione inviata: {{title}} il {{date}}",
"download_recording_subject": "Scarica registrazione: {{title}} alle {{date}}",
"download_your_recording": "Scarica la tua registrazione",
"your_meeting_has_been_booked": "Il tuo meeting è stata prenotato",
"event_type_has_been_rescheduled_on_time_date": "Il tuo {{title}} è stato riprogrammato per il {{date}}.",
"event_has_been_rescheduled": "Aggiornato: il tuo evento è stato riprogrammato",
@@ -224,6 +227,7 @@
"done": "Fatto",
"all_done": "Operazione completata!",
"all_apps": "Tutte le app",
"available_apps": "Applicazioni disponibili",
"check_email_reset_password": "Controlla la tua email. Ti abbiamo inviato un link per reimpostare la password.",
"finish": "Fine",
"few_sentences_about_yourself": "Alcune frasi su di te. Questo apparirà sulla tua pagina url personale.",
@@ -404,6 +408,7 @@
"add_time_availability": "Aggiungi nuova fascia oraria",
"add_an_extra_layer_of_security": "Aggiungi un ulteriore livello di sicurezza al tuo account nel caso in cui la password venga rubata.",
"2fa": "Autenticazione A Due Fattori",
"2fa_disabled": "L'autenticazione a due fattori può essere abilitata solo per l'autenticazione tramite e-mail e password",
"enable_2fa": "Abilita autenticazione a due fattori",
"disable_2fa": "Disabilita autenticazione a due fattori",
"disable_2fa_recommendation": "Se è necessario disattivare 2FA, si consiglia di riattivarlo il prima possibile.",
@@ -585,6 +590,20 @@
"minutes": "Minuti",
"round_robin": "Round Robin",
"round_robin_description": "Ciclo di riunioni tra più membri del team.",
"managed_event": "Evento gestito",
"username_placeholder": "username",
"managed_event_description": "Crea e distribuisci tipi di evento in blocco ai membri del team",
"managed": "Gestito",
"managed_event_url_clarification": "il campo \"username\" può essere compilato solo con il nome utente dei membri assegnati",
"assign_to": "Assegna a",
"add_members": "Aggiungi membri...",
"count_members_one": "{{count}} membro",
"count_members_other": "{{count}} membri",
"no_assigned_members": "Nessun membro assegnato",
"assigned_to": "Assegnato a",
"start_assigning_members_above": "Inizia ad assegnare membri in alto",
"locked_fields_admin_description": "I membri non saranno in grado di apportare modifiche qui",
"locked_fields_member_description": "Questa opzione è stata bloccata dall'amministratore del team",
"url": "URL",
"hidden": "Nascosto",
"readonly": "Sola lettura",
@@ -736,6 +755,11 @@
"minimum_booking_notice": "Preavviso minimo",
"slot_interval": "Intervalli di fascia oraria",
"slot_interval_default": "Usa durata evento (impostazione predefinita)",
"delete_event_type": "Eliminare il tipo di evento?",
"delete_managed_event_type": "Eliminare il tipo di evento gestito?",
"delete_event_type_description": "Gli utenti con cui hai condiviso il link non saranno più in grado di usarlo per prenotare.",
"delete_managed_event_type_description": "<ul><li>Questo tipo di evento sarà eliminato anche ai membri a esso assegnati.</li><li>Gli utenti con cui hai condiviso il link non saranno più in grado di usarlo per prenotare.</li></ul>",
"confirm_delete_event_type": "Sì, elimina",
"delete_account": "Elimina account",
"confirm_delete_account": "Sì, elimina account",
"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.",
@@ -1126,11 +1150,13 @@
"current_username": "Nome utente corrente",
"example_1": "Esempio 1",
"example_2": "Esempio 2",
"booking_question_identifier": "Identificatore domanda alla prenotazione",
"company_size": "Dimensione dell'azienda",
"what_help_needed": "Per cosa ti serve assistenza?",
"variable_format": "Formato variabile",
"webhook_subscriber_url_reserved": "URL dell'abbonato Webhook già definito",
"custom_input_as_variable_info": "Ignora tutti i caratteri speciali dell'etichetta del campo di input aggiuntivo (usa solo lettere e numeri), usa solo lettere maiuscole e sostituisci gli spazi con il trattino basso.",
"using_booking_questions_as_variables": "Come posso utilizzare le domande poste nella pagina di prenotazione come variabili?",
"download_desktop_app": "Scarica app desktop",
"set_ping_link": "Imposta link di Ping",
"rate_limit_exceeded": "Limite superato",
@@ -1176,6 +1202,7 @@
"start_of_week": "Inizio della settimana",
"recordings_title": "Registrazioni",
"recording": "Registrazione",
"happy_scheduling": "Ti auguriamo una piacevole esperienza di pianificazione",
"select_calendars": "Seleziona su quali calendari desideri controllare i conflitti per evitare doppie prenotazioni.",
"check_for_conflicts": "Controlla conflitti",
"view_recordings": "Visualizza registrazioni",
@@ -1213,6 +1240,7 @@
"impersonation": "Accesso con altra identità",
"impersonation_description": "Impostazioni per gestire gli accessi con altra identità",
"users": "Utenti",
"user": "Utente",
"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",
@@ -1253,6 +1281,8 @@
"download_responses": "Scarica risposte",
"download_responses_description": "Scarica tutte le risposte al tuo modulo in formato CSV.",
"download": "Scarica",
"download_recording": "Scarica registrazione",
"recording_from_your_recent_call": "Una registrazione della tua recente chiamata su Cal.com è pronta per il download",
"create_your_first_form": "Crea il tuo primo modulo",
"create_your_first_form_description": "I Moduli di instradamento consentono di porre domande qualificanti agli utenti per indirizzarli a persone o eventi pertinenti.",
"create_your_first_webhook": "Crea il tuo primo Webhook",
@@ -1289,6 +1319,15 @@
"exchange_authentication_standard": "Autenticazione di base",
"exchange_authentication_ntlm": "Autenticazione NTLM",
"exchange_compression": "Compressione GZip",
"exchange_version": "Versione di Exchange",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Qui puoi vedere tutti i moduli e tutti i percorsi che hai creato.",
"routing_forms_send_email_owner": "Invia e-mail al proprietario",
"routing_forms_send_email_owner_description": "Invia un'e-mail al proprietario quando il modulo viene inviato",
@@ -1343,6 +1382,7 @@
"add_limit": "Aggiungi limite",
"team_name_required": "Nome del team richiesto",
"show_attendees": "Condividi le informazioni dei partecipanti tra gli ospiti",
"how_booking_questions_as_variables": "Come utilizzare le domande poste nella pagina di prenotazione come variabili?",
"format": "Formato",
"uppercase_for_letters": "Usa tutte lettere maiuscole",
"replace_whitespaces_underscores": "Sostituisci spazi con sottolineature",
@@ -1357,6 +1397,7 @@
"billing_help_title": "Hai bisogno di altro?",
"billing_help_description": "Se hai bisogno di ulteriore aiuto per la fatturazione, il nostro team di supporto è qui per aiutarti.",
"billing_help_cta": "Contatta l'assistenza",
"ignore_special_characters_booking_questions": "Ignora i caratteri speciali nell'identificatore della domanda da porre nella pagina di prenotazione. Usa solo lettere e numeri",
"retry": "Riprova",
"fetching_calendars_error": "Si è verificato un problema durante il recupero dei calendari. <1>Riprova</1> o contatta l'assistenza clienti.",
"calendar_connection_fail": "Impossibile connettersi al calendario",
@@ -1439,11 +1480,17 @@
"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",
"the_calcom_team": "Il team Cal.com",
"add_your_team_members": "Aggiungi i membri del tuo team ai tuoi tipi di eventi. Usa la pianificazione collettiva per includere tutti o trova la persona più adatta con la pianificazione round robin.",
"booking_limit_reached": "È stato raggiunto il limite di prenotazione per questo tipo di evento",
"duration_limit_reached": "È stato raggiunto il limite di durata per questo tipo di evento",
"admin_has_disabled": "Un amministratore ha disabilitato {{appName}}",
"disabled_app_affects_event_type": "Un amministratore ha disabilitato {{appName}}, il che ha effetto sul tuo tipo di evento {{eventType}}",
"event_replaced_notice": "Un amministratore ha sostituito uno dei tuoi tipi di evento",
"email_subject_slug_replacement": "Un amministratore di team ha sostituito il tuo evento /{{slug}}",
"email_body_slug_replacement_notice": "Un amministratore del team <strong>{{teamName}}</strong> ha sostituito il tuo tipo di evento <strong>/{{slug}}</strong> con un tipo di evento gestito da lui controllato.",
"email_body_slug_replacement_info": "Il tuo link continuerà a funzionare, ma alcune sue impostazioni potrebbero essere state cambiate. Puoi verificarlo nella sezione Tipi di evento.",
"email_body_slug_replacement_suggestion": "Per qualsiasi domanda sui tipi di evento, contatta il nostro amministratore.<br /><br />Ti auguriamo una piacevole esperienza di pianificazione, <br />Il team Cal.com",
"disable_payment_app": "L'amministratore ha disabilitato {{appName}}, il che ha effetto sul 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 ha effetto sul tuo tipo di evento {{title}}.",
@@ -1492,6 +1539,7 @@
"date_overrides_update_btn": "Aggiorna configurazione data specifica",
"event_type_duplicate_copy_text": "{{slug}}-copia",
"set_as_default": "Imposta come predefinito",
"hide_eventtype_details": "Nascondi dettagli del tipo di evento",
"show_navigation": "Mostra navigazione",
"hide_navigation": "Nascondi navigazione",
"verification_code_sent": "Codice di verifica inviato",
@@ -1505,6 +1553,7 @@
"create_your_first_team_webhook_description": "Crea il primo webhook per questo tipo di evento del team",
"create_webhook_team_event_type": "Crea un webhook per questo tipo di evento del team",
"disable_success_page": "Disabilita pagina di conferma dell'esito (funziona solo se si dispone di un URL di reindirizzamento)",
"invalid_admin_password": "Sei un amministratore, ma la tua password non ha la lunghezza minima di 15 caratteri, né utilizzi l'autenticazione a due fattori",
"change_password_admin": "Cambia password per ottenere i diritti di accesso come amministratore",
"username_already_taken": "Nome utente già in uso",
"assignment": "Assegnazione",
@@ -1537,6 +1586,7 @@
"ee_enterprise_license": "Licenza Enterprise “/ee”",
"enterprise_booking_fee": "A partire da {{enterprise_booking_fee}}/mese",
"enterprise_license_includes": "Tutto il necessario per l'utilizzo commerciale",
"no_need_to_keep_your_code_open_source": "Non è necessario che il codice rimanga open source",
"repackage_rebrand_resell": "Rivendi facilmente con un nuovo marchio",
"a_vast_suite_of_enterprise_features": "Un'estesa suite di funzionalità enterprise",
"free_license_fee": "0,00 $/mese",
@@ -1598,6 +1648,7 @@
"default_app_link_title": "Imposta il link dell'app predefinita",
"default_app_link_description": "L'impostazione di un link dell'app predefinita permette a tutti i nuovi tipi di eventi di usare il link dell'app impostato.",
"change_default_conferencing_app": "Imposta come predefinito",
"organizer_default_conferencing_app": "Applicazione predefinita dell'organizzatore",
"under_maintenance": "Inattivo per manutenzione",
"under_maintenance_description": "Il team di {{appName}} sta eseguendo la manutenzione programmata. Per qualsiasi domanda, contattare il supporto.",
"event_type_seats": "{{numberOfSeats}} posti",
@@ -1612,6 +1663,7 @@
"not_enough_seats": "Posti insufficienti",
"form_builder_field_already_exists": "Esiste già un campo con questo nome",
"form_builder_field_add_subtitle": "Personalizza le domande poste nella pagina di prenotazione",
"show_on_booking_page": "Mostra nella pagina di prenotazione",
"get_started_zapier_templates": "Inizia con i modelli Zapier",
"team_is_unpublished": "{{team}} non è pubblicato",
"team_is_unpublished_description": "Questo link del team non è attualmente disponibile. Contattare il proprietario del team o chiedergli di pubblicarlo.",
@@ -1635,6 +1687,14 @@
"add_1_option_per_line": "Aggiungi 1 opzione per riga",
"select_a_router": "Seleziona un instradatore",
"add_a_new_route": "Aggiungi un nuovo percorso",
"make_informed_decisions": "Prendi decisioni informate con Approfondimenti",
"make_informed_decisions_description": "Il pannello di controllo Approfondimenti offre una panoramica di tutte le attività del team e mostra le tendenze, il che consente di migliorare la pianificazione di gruppo e il processo decisionale.",
"view_bookings_across": "Visualizza le prenotazioni di tutti i membri",
"view_bookings_across_description": "Individua la persona che riceve il maggior numero di prenotazioni e assicura la migliore distribuzione delle prenotazioni all'interno del team",
"identify_booking_trends": "Identifica le tendenze di prenotazione",
"identify_booking_trends_description": "Scopri quali giorni della settimana e quali fasce orarie sono popolari tra le persone che prenotano",
"spot_popular_event_types": "Individua i tipi di evento popolari",
"spot_popular_event_types_description": "Scopri quali tipi di evento ricevono più clic e prenotazioni",
"no_responses_yet": "Per ora non ci sono risposte",
"this_will_be_the_placeholder": "Questo sarà il segnaposto",
"this_meeting_has_not_started_yet": "Questa riunione non è ancora iniziata",
@@ -1646,8 +1706,83 @@
"can_you_try_again": "Riprovare specificando un orario differente.",
"verify": "Verifica",
"timezone_variable": "Timezone",
"timezone_info": "Il fuso orario della persona che riceve",
"event_end_time_variable": "Ora di fine evento",
"event_end_time_info": "Ora di fine dell'evento",
"cancel_url_variable": "URL di annullamento",
"cancel_url_info": "URL per annullare la prenotazione",
"reschedule_url_variable": "URL di riprogrammazione",
"reschedule_url_info": "URL per riprogrammare la prenotazione",
"invalid_event_name_variables": "Nel nome dell'evento è presente una variabile non valida",
"select_all": "Seleziona tutto",
"default_conferencing_bulk_title": "Aggiorna in blocco i tipi di eventi esistenti",
"default_conferencing_bulk_description": "Aggiorna le posizioni per i tipi di eventi selezionati"
"members_default_schedule": "Pianificazione predefinita membro",
"set_by_admin": "Impostato dall'amministratore del team",
"members_default_location": "Posizione predefinita del membro",
"members_default_schedule_description": "Useremo il programma di disponibilità predefinito di ciascun membro. I membri saranno in grado di modificarlo.",
"requires_at_least_one_schedule": "È necessario avere almeno un programma",
"default_conferencing_bulk_description": "Aggiorna le posizioni per i tipi di eventi selezionati",
"locked_for_members": "Bloccato per i membri",
"locked_apps_description": "I membri saranno in grado di vedere le app attive, ma non saranno in grado di modificare le impostazioni delle app",
"locked_webhooks_description": "I membri saranno in grado di vedere i webhook attivi, ma non saranno in grado di modificare le impostazioni dei webhook",
"locked_workflows_description": "I membri saranno in grado di vedere i flussi di lavoro attivi, ma non saranno in grado di modificare le impostazioni dei flussi di lavoro",
"locked_by_admin": "Bloccato dall'amministratore",
"app_not_connected": "Non è stato connesso un account di {{appName}}.",
"connect_now": "Connetti ora",
"managed_event_dialog_confirm_button_one": "Sostituisci e invia notifica a {{count}} membro",
"managed_event_dialog_confirm_button_other": "Sostituisci e invia notifica a {{count}} membri",
"managed_event_dialog_title_one": "L'URL /{{slug}} esiste già per {{count}} membro. Sostituirlo?",
"managed_event_dialog_title_other": "L'URL /{{slug}} esiste già per {{count}} membri. Sostituirlo?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> utilizza già l'URL <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> utilizzano già l'URL <strong>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "Se si decide di sostituirlo, ai membri ne verrà inviata una notifica. Tornare indietro e rimuoverli se non si desidera sovrascriverlo.",
"review_event_type": "Verifica tipo di evento",
"looking_for_more_analytics": "Hai bisogno di più dati analitici?",
"looking_for_more_insights": "Hai bisogno di maggiori approfondimenti?",
"add_filter": "Aggiungi filtro",
"select_user": "Seleziona utente",
"select_event_type": "Seleziona tipo di evento",
"select_date_range": "Seleziona intervallo di date",
"popular_events": "Eventi popolari",
"no_event_types_found": "Nessun tipo di evento trovato",
"average_event_duration": "Durata media evento",
"most_booked_members": "Membri più prenotati",
"least_booked_members": "Membri meno prenotati",
"events_created": "Eventi creati",
"events_completed": "Eventi completati",
"events_cancelled": "Eventi annullati",
"events_rescheduled": "Eventi riprogrammati",
"from_last_period": "dall'ultimo periodo",
"from_to_date_period": "Da: {{startDate}} A: {{endDate}}",
"analytics_for_organisation": "Approfondimenti",
"subtitle_analytics": "Scopri di più sull'attività del tuo team",
"redirect_url_warning": "Aggiungendo un reindirizzamento, viene disabilitata la pagina di conferma dell'esito. Assicurati che nella pagina di conferma dell'esito personalizzata compaia la dicitura \"Prenotazione confermata\".",
"event_trends": "Tendenze eventi",
"clear_filters": "Cancella filtri",
"hold": "Preautorizzazione",
"on_booking_option": "Raccogli pagamento alla prenotazione",
"hold_option": "Addebita penale per mancata presentazione",
"card_held": "Preautorizzazione carta",
"charge_card": "Addebita carta",
"card_charged": "Carta addebitata",
"no_show_fee_amount": "Penale per mancata presentazione: {{amount, currency}}",
"no_show_fee": "Penale per mancata presentazione",
"submit_card": "Invia carta",
"submit_payment_information": "Invia informazioni di pagamento",
"meeting_awaiting_payment_method": "La tua riunione è in attesa di un metodo di pagamento",
"no_show_fee_charged_email_subject": "Una penale per mancata presentazione di {{amount, currency}} è stata addebitata per {{title}} alle {{date}}",
"no_show_fee_charged_text_body": "È stata addebitata una penale per mancata presentazione",
"no_show_fee_charged_subtitle": "Una penale per mancata presentazione di {{amount, currency}} è stata addebitata per il seguente evento",
"error_charging_card": "L'addebito della penale per mancata presentazione non è andato a buon fine. Riprovare più tardi.",
"collect_no_show_fee": "Riscuoti penale per mancata presentazione",
"no_show_fee_charged": "Penale per mancata presentazione addebitata",
"insights": "Approfondimenti",
"testing_workflow_info_message": "Durante il test di questo flusso di lavoro, tieni presente che le e-mail e i messaggi SMS possono essere programmati con almeno 1 ora di anticipo",
"insights_no_data_found_for_filter": "Nessun dato trovato per il filtro selezionato o le date selezionate.",
"acknowledge_booking_no_show_fee": "Confermo che in caso di mia mancata partecipazione a questo evento, una penale per mancata presentazione di {{amount, currency}} verrà addebitata sulla mia carta.",
"card_details": "Dati della carta",
"seats_and_no_show_fee_error": "Attualmente non è possibile abilitare i posti e addebitare la penale per mancata presentazione",
"complete_your_booking": "Completa la prenotazione",
"complete_your_booking_subject": "Completa la prenotazione: {{title}} del {{date}}",
"email_invite_team": "{{email}} è stato invitato"
}
+136 -1
View File
@@ -1,4 +1,5 @@
{
"identity_provider": "アイデンティティプロバイダー",
"trial_days_left": "PRO トライアル版は残り $t(day, {\"count\": {{days}} }) です",
"day_one": "{{count}} 日",
"day_other": "{{count}} 日",
@@ -69,6 +70,8 @@
"event_awaiting_approval_subject": "承認を待っています: {{date}} の {{title}}",
"event_still_awaiting_approval": "イベントはまだあなたの承認待ちです",
"booking_submitted_subject": "予約を送信しました: {{title}}、{{date}}",
"download_recording_subject": "録音のダウンロード: {{date}} の {{title}}",
"download_your_recording": "録音をダウンロード",
"your_meeting_has_been_booked": "ミーティングが予約されました",
"event_type_has_been_rescheduled_on_time_date": "あなたの {{title}} は {{date}} に再スケジュールされました。",
"event_has_been_rescheduled": "更新 - イベントのスケジュールが変更されました",
@@ -224,6 +227,7 @@
"done": "完了",
"all_done": "すべて完了!",
"all_apps": "すべて",
"available_apps": "利用可能なアプリ",
"check_email_reset_password": "メールをご確認ください。パスワードをリセットするためのリンクを送信しました。",
"finish": "完了",
"few_sentences_about_yourself": "あなたについてのいくつかの文章。これはあなたの個人URLページに表示されます。",
@@ -404,6 +408,7 @@
"add_time_availability": "新しい時間帯を追加",
"add_an_extra_layer_of_security": "パスワードが盗まれる場合に備えて、アカウントのセキュリティを強化します。",
"2fa": "二要素認証",
"2fa_disabled": "二要素認証はメールとパスワードの認証にのみ有効化できます",
"enable_2fa": "二要素認証を有効にする",
"disable_2fa": "二要素認証を無効にする",
"disable_2fa_recommendation": "2FA を無効にする必要がある場合は、その必要がなくなった後すぐに有効にしなおすことをおすすめします。",
@@ -585,6 +590,20 @@
"minutes": "分",
"round_robin": "ラウンドロビン",
"round_robin_description": "複数のチームメンバー間のミーティングを定期化する。",
"managed_event": "管理イベント",
"username_placeholder": "ユーザー名",
"managed_event_description": "イベントタイプを一括して作成し、チームメンバーに割り当てる",
"managed": "管理",
"managed_event_url_clarification": "「ユーザー名」には、割り当てられたメンバーのユーザー名が入ります",
"assign_to": "割り当て先",
"add_members": "メンバーを追加…",
"count_members_one": "{{count}} 人のメンバー",
"count_members_other": "{{count}} 人のメンバー",
"no_assigned_members": "割り当てられたメンバーはいません",
"assigned_to": "割り当て先",
"start_assigning_members_above": "上記のメンバーへの割り当てを開始する",
"locked_fields_admin_description": "メンバーはこれを編集できません",
"locked_fields_member_description": "このオプションはチーム管理者によってロックされました",
"url": "URL",
"hidden": "隠れている",
"readonly": "読み込み専用",
@@ -736,6 +755,11 @@
"minimum_booking_notice": "最低頻度の通知",
"slot_interval": "時間帯の間隔",
"slot_interval_default": "イベントの長さを使用する (デフォルト)",
"delete_event_type": "イベントタイプを削除しますか?",
"delete_managed_event_type": "管理イベントタイプを削除しますか?",
"delete_event_type_description": "これまでにこのリンクを共有された人は、リンクを使って予約することができなくなります。",
"delete_managed_event_type_description": "<ul><li>このイベントタイプを割り当てられたメンバーも、イベントタイプが削除されます。</li><li>これまでにこのリンクを共有された人は皆、このリンクを使った予約ができなくなります。</li></ul>",
"confirm_delete_event_type": "はい、削除します",
"delete_account": "アカウントを削除する",
"confirm_delete_account": "はい。アカウントを削除します",
"delete_account_confirmation_message": "あなたの {{appName}} アカウントを本当に削除してもよろしいですか?あなたのアカウントリンクを共有しているユーザーは、そのアカウントを使用して予約を行うことができなくなり、保存していた設定も失われます。",
@@ -1126,11 +1150,13 @@
"current_username": "現在のユーザー名",
"example_1": "例 1",
"example_2": "例 2",
"booking_question_identifier": "予約時の質問の識別子",
"company_size": "会社の規模",
"what_help_needed": "何かお困りですか?",
"variable_format": "変数の形式",
"webhook_subscriber_url_reserved": "ウェブフック購読者 URL は既に定義されています",
"custom_input_as_variable_info": "追加の入力ラベルに含まれている特殊文字はすべて無視し (アルファベットと数字のみを使用)、アルファベットをすべて大文字に、そして空白をアンダースコアへと変換します。",
"using_booking_questions_as_variables": "予約時の質問を変数として使う方法は?",
"download_desktop_app": "デスクトップアプリをダウンロード",
"set_ping_link": "Ping リンクを設定",
"rate_limit_exceeded": "試行回数の上限を超えました",
@@ -1176,6 +1202,7 @@
"start_of_week": "週の始まり",
"recordings_title": "録音",
"recording": "録音",
"happy_scheduling": "スケジュール設定をお楽しみください",
"select_calendars": "ダブルブッキングを防ぐために、スケジュールの重なりをチェックするカレンダーを選択してください。",
"check_for_conflicts": "スケジュールの重なりをチェック",
"view_recordings": "録音を表示",
@@ -1213,6 +1240,7 @@
"impersonation": "なりすまし",
"impersonation_description": "ユーザーのなりすましを管理するための設定です",
"users": "ユーザー",
"user": "ユーザー",
"profile_description": "{{appName}} プロフィールの設定を管理します",
"users_description": "こちらではすべてのユーザーの一覧をご確認いただけます",
"users_listing": "ユーザー一覧",
@@ -1253,6 +1281,8 @@
"download_responses": "回答をダウンロード",
"download_responses_description": "CSV 形式ですべての回答をフォームにダウンロードします。",
"download": "ダウンロード",
"download_recording": "録音をダウンロード",
"recording_from_your_recent_call": "Cal.com での最近の通話の録音がダウンロード可能です",
"create_your_first_form": "最初のフォームを作成",
"create_your_first_form_description": "ルーティングフォームを使用すれば、絞り込みの質問を通して適切な人物やイベントの種類へとルーティングを行うことができます。",
"create_your_first_webhook": "最初のウェブフックを作成",
@@ -1289,6 +1319,15 @@
"exchange_authentication_standard": "Basic 認証",
"exchange_authentication_ntlm": "NTLM 認証",
"exchange_compression": "GZip 圧縮",
"exchange_version": "Exchange のバージョン",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "作成したすべてのフォームとルートをここで確認できます。",
"routing_forms_send_email_owner": "所有者にメールを送信",
"routing_forms_send_email_owner_description": "フォームの送信時に所有者にメールを送信します",
@@ -1343,6 +1382,7 @@
"add_limit": "上限を追加する",
"team_name_required": "チーム名が必要です",
"show_attendees": "ゲスト間で出席者情報を共有する",
"how_booking_questions_as_variables": "予約時の質問を変数として使う方法は?",
"format": "書式",
"uppercase_for_letters": "すべての文字に大文字を使用する",
"replace_whitespaces_underscores": "空白をアンダーバー「 _ 」に置き換える",
@@ -1357,6 +1397,7 @@
"billing_help_title": "他にもお手伝いできることはありませんか?",
"billing_help_description": "請求に関してサポートが必要な場合には、サポートチームがお手伝いさせていただきます。",
"billing_help_cta": "サポートに問い合わせる",
"ignore_special_characters_booking_questions": "予約時の質問の識別子に含まれている特殊文字はすべて無視し、アルファベットと数字のみを使用してください",
"retry": "再試行",
"fetching_calendars_error": "カレンダーの取得中にエラーが発生しました。<1>もう一度お試しいただく</1>か、カスタマーサポートまでお問い合わせください。",
"calendar_connection_fail": "カレンダーの接続に失敗しました",
@@ -1439,11 +1480,17 @@
"fixed_round_robin": "固定ラウンドロビン",
"add_one_fixed_attendee": "固定された出席者を 1 人追加し、複数の出席者についてラウンドロビン方式で出席スケジュールを決定します。",
"calcom_is_better_with_team": "Cal.com はチームでの使用に適しています",
"the_calcom_team": "Cal.com チーム",
"add_your_team_members": "イベントの種類にチームメンバーを追加します。一括スケジューリングで全員を参加させたり、ラウンドロビンスケジューリングで最適な人を設定したりすることができます。",
"booking_limit_reached": "このイベントタイプの予約上限に達しました",
"duration_limit_reached": "このイベントタイプの時間上限に達しました",
"admin_has_disabled": "管理者が {{appName}} を無効にしています",
"disabled_app_affects_event_type": "管理者が {{appName}} を無効にしているため、あなたのイベントの種類 {{eventType}} に影響を与える可能性があります",
"event_replaced_notice": "管理者があなたのイベントタイプの1つを置き換えました",
"email_subject_slug_replacement": "チーム管理者があなたのイベントの /{{slug}} を置き換えました",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong>チームの管理者が、あなたのイベントタイプの <strong>/{{slug}}</strong> を彼らが管理する管理イベントタイプに置き換えました。",
"email_body_slug_replacement_info": "あなたのリンクは引き続き機能しますが、リンクの設定の一部が変更された可能性があります。変更はイベントタイプで確認できます。",
"email_body_slug_replacement_suggestion": "イベントタイプについてご質問がある場合は、管理者までお問合せください。<br /><br />スケジュール設定をお楽しみください、<br />Cal.comチーム",
"disable_payment_app": "管理者が {{appName}} を無効にしたため、イベントの種類 {{title}} に影響を与える可能性があります。出席者がこの種類のイベントを予約することは可能ですが、支払いを促されることはありません。管理者が支払い方法を再度有効にするまでの間これを防ぐために、イベントの種類を非表示にすることができます。",
"payment_disabled_still_able_to_book": "出席者がこの種類のイベントを予約することは可能ですが、支払いを促されることはありません。管理者が支払い方法を再度有効にするまでの間これを防ぐために、イベントの種類を非表示にすることができます。",
"app_disabled_with_event_type": "管理者が {{appName}} を無効にしているため、あなたのイベントの種類 {{title}} に影響を与える可能性があります.",
@@ -1492,6 +1539,7 @@
"date_overrides_update_btn": "上書きを更新",
"event_type_duplicate_copy_text": "{{slug}}-copy",
"set_as_default": "デフォルトとして設定",
"hide_eventtype_details": "イベントタイプの詳細を非表示にする",
"show_navigation": "ナビゲーションを表示",
"hide_navigation": "ナビゲーションを非表示にする",
"verification_code_sent": "確認コードが送信されました",
@@ -1505,6 +1553,7 @@
"create_your_first_team_webhook_description": "このチームイベントの種類の初めての webhook を作成します",
"create_webhook_team_event_type": "このチームイベントの種類の webhook を作成します",
"disable_success_page": "予約完了ページを無効化する (リダイレクト URL がある場合にのみ有効)",
"invalid_admin_password": "あなたは管理者ですが、パスワードの長さが足りないか(15文字以上必要です)、まだ二要素認証をしていません",
"change_password_admin": "パスワードを変更して管理者アクセス権を取得する",
"username_already_taken": "ユーザー名が既に使用されています",
"assignment": "割り当て",
@@ -1537,6 +1586,7 @@
"ee_enterprise_license": "\"/ee\" Enterprise ライセンス",
"enterprise_booking_fee": "{{enterprise_booking_fee}}/月で開始する",
"enterprise_license_includes": "商用ユースケースで必要となるすべてのもの",
"no_need_to_keep_your_code_open_source": "コードをオープンソースにしておく必要はありません",
"repackage_rebrand_resell": "再パッケージ、リブランディング、再販売が簡単になります",
"a_vast_suite_of_enterprise_features": "膨大な量の企業向け機能パッケージ",
"free_license_fee": "0.00 ドル/月",
@@ -1598,6 +1648,7 @@
"default_app_link_title": "デフォルトのアプリリンクを設定",
"default_app_link_description": "デフォルトのアプリリンクを設定することで、新たに作成するすべてのイベントの種類が設定したアプリリンクを使用できるようになります。",
"change_default_conferencing_app": "デフォルトとして設定",
"organizer_default_conferencing_app": "主催者のデフォルトアプリ",
"under_maintenance": "メンテナンスのため停止中",
"under_maintenance_description": "{{appName}} チームが定期メンテナンスを行っています。質問がある場合には、サポートへとお問い合わせください。",
"event_type_seats": "{{numberOfSeats}} 席",
@@ -1612,6 +1663,7 @@
"not_enough_seats": "座席が足りません",
"form_builder_field_already_exists": "この名前のフィールドは既に存在します",
"form_builder_field_add_subtitle": "予約ページで尋ねる質問をカスタマイズする",
"show_on_booking_page": "予約ページに表示",
"get_started_zapier_templates": "Zapier テンプレートの使用を開始する",
"team_is_unpublished": "{{team}} は公開されていません",
"team_is_unpublished_description": "このチームのリンクは現在利用できません。チームの所有者に問い合わせるか、リンクを公開するように依頼してください。",
@@ -1635,6 +1687,14 @@
"add_1_option_per_line": "1 行に 1 つのオプションを追加する",
"select_a_router": "ルーターを選択",
"add_a_new_route": "新しいルートを追加",
"make_informed_decisions": "インサイトを使って情報に基づいた決定をする",
"make_informed_decisions_description": "インサイトダッシュボードではチーム全体のアクティビティがひと目でわかります。傾向もわかるので、チームはより良いスケジューリングと決定ができます。",
"view_bookings_across": "メンバー全体の予約を表示",
"view_bookings_across_description": "誰が最も予約されているか確認し、チーム全体で最適な配分ができるようにします",
"identify_booking_trends": "予約の傾向を明らかにする",
"identify_booking_trends_description": "週のどの期間と1日のどの時間帯が予約者に人気か確認します",
"spot_popular_event_types": "人気のイベントタイプを見つける",
"spot_popular_event_types_description": "どのイベントタイプが最もクリックされ、予約されているのか確認します",
"no_responses_yet": "回答はまだありません",
"this_will_be_the_placeholder": "これがプレースホルダーになります",
"this_meeting_has_not_started_yet": "このミーティングはまだ開始されていません",
@@ -1646,8 +1706,83 @@
"can_you_try_again": "別の時間帯でもう1度お試しください",
"verify": "確認する",
"timezone_variable": "タイムゾーン",
"timezone_info": "受け取る人のタイムゾーン",
"event_end_time_variable": "イベント終了時刻",
"event_end_time_info": "イベント終了時刻",
"cancel_url_variable": "キャンセル URL",
"cancel_url_info": "予約をキャンセルするための URL",
"reschedule_url_variable": "スケジュール変更 URL",
"reschedule_url_info": "予約をスケジュール変更するための URL",
"invalid_event_name_variables": "イベント名に無効な変数があります",
"select_all": "すべてを選択",
"default_conferencing_bulk_title": "既存のイベントタイプを一括更新する",
"default_conferencing_bulk_description": "選択したイベントタイプの場所を更新します"
"members_default_schedule": "メンバーのデフォルトスケジュール",
"set_by_admin": "チーム管理者により設定",
"members_default_location": "メンバーのデフォルトの場所",
"members_default_schedule_description": "各メンバーのデフォルトの空き状況スケジュールを使用します。メンバーはスケジュールを編集したり、変更したりできます。",
"requires_at_least_one_schedule": "少なくとも 1 つのスケジュールが必要です",
"default_conferencing_bulk_description": "選択したイベントタイプの場所を更新します",
"locked_for_members": "メンバーにはロックされています",
"locked_apps_description": "メンバーは有効なアプリを確認できますが、アプリの設定を編集することはできません",
"locked_webhooks_description": "メンバーは有効なウェブフックを確認できますが、ウェブフックの設定を編集することはできません",
"locked_workflows_description": "メンバーは有効なワークフローを確認できますが、ワークフローの設定を編集することはできません",
"locked_by_admin": "管理者によりロックされています",
"app_not_connected": "{{appName}} のアカウントに接続していません。",
"connect_now": "今すぐ接続",
"managed_event_dialog_confirm_button_one": "{{count}} 人のメンバーを置き換えて通知する",
"managed_event_dialog_confirm_button_other": "{{count}} 人のメンバーを置き換えて通知する",
"managed_event_dialog_title_one": "{{count}} 人のメンバーには url/{{slug}} が既に存在します。置き換えますか?",
"managed_event_dialog_title_other": "{{count}} 人のメンバーには url/{{slug}} が既に存在します。置き換えますか?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong>は既に <strong>/{{slug}}</strong> url を使用しています。",
"managed_event_dialog_information_other": "<strong>{{names}}</strong>は既に <string>/{{slug}}</strong> url を使用しています。",
"managed_event_dialog_clarification": "置き換えを選択すると、通知が送られます。上書きしたくない場合は、戻って削除してください。",
"review_event_type": "イベントタイプを確認",
"looking_for_more_analytics": "詳しい分析をお探しですか?",
"looking_for_more_insights": "詳しいインサイトをお探しですか?",
"add_filter": "フィルターを追加",
"select_user": "ユーザーを選択",
"select_event_type": "イベントタイプを選択",
"select_date_range": "日付範囲を選択",
"popular_events": "人気のイベント",
"no_event_types_found": "イベントタイプが見つかりません",
"average_event_duration": "イベントの平均時間",
"most_booked_members": "最も予約が多いメンバー",
"least_booked_members": "最も予約が少ないメンバー",
"events_created": "イベントが作成されました",
"events_completed": "イベントが完了しました",
"events_cancelled": "イベントがキャンセルされました",
"events_rescheduled": "イベントがスケジュール変更されました",
"from_last_period": "最後の期間から",
"from_to_date_period": "開始:{{startDate}} 終了:{{endDate}}",
"analytics_for_organisation": "インサイト",
"subtitle_analytics": "チームのアクティビティについてさらに詳しく知る",
"redirect_url_warning": "リダイレクトを追加すると予約完了ページが無効化されます。必ずカスタムの予約完了ページで「予約が確認されました」と伝えてください。",
"event_trends": "イベントのトレンド",
"clear_filters": "フィルターをクリア",
"hold": "保留",
"on_booking_option": "予約の支払いを受け取る",
"hold_option": "予約不参加料金を請求",
"card_held": "カードを保留",
"charge_card": "カードに請求",
"card_charged": "カードに請求されました",
"no_show_fee_amount": "{{amount, currency}} の予約不参加料金",
"no_show_fee": "予約不参加料金",
"submit_card": "カードを送信",
"submit_payment_information": "支払い情報を送信",
"meeting_awaiting_payment_method": "会議の支払い方法を待っています",
"no_show_fee_charged_email_subject": "{{date}} の {{title}} に {{amount, currency}} の予約不参加料金が請求されました",
"no_show_fee_charged_text_body": "予約不参加料金が請求されました",
"no_show_fee_charged_subtitle": "次のイベントに {{amount, currency}} の予約不参加料金が請求されました",
"error_charging_card": "予約不参加料金の請求に問題が発生しました。後でもう一度お試しください。",
"collect_no_show_fee": "予約不参加料金を受け取る",
"no_show_fee_charged": "予約不参加料金が請求されました",
"insights": "インサイト",
"testing_workflow_info_message": "このワークフローをテストする際は、少なくとも1時間前でないとメールとSMSをスケジュール設定できないことにご注意ください",
"insights_no_data_found_for_filter": "選択したフィルターまたは選択した日付のデータが見つかりません。",
"acknowledge_booking_no_show_fee": "このイベントに参加しない場合、{{amount, currency}} の予約不参加料金が私のカードに請求されることに同意します。",
"card_details": "カードの詳細",
"seats_and_no_show_fee_error": "現在、座席の有効化と予約不参加料金の請求はできません",
"complete_your_booking": "予約を完了する",
"complete_your_booking_subject": "次の予約を完了する:{{date}} の {{title}}",
"email_invite_team": "{{email}} は招待されました"
}
@@ -1,4 +1,5 @@
{
"identity_provider": "ID 제공자",
"trial_days_left": "PRO 평가판의 남은 기한 $t(day, {\"count\": {{days}} })",
"day_one": "{{count}}일",
"day_other": "{{count}}일",
@@ -69,6 +70,8 @@
"event_awaiting_approval_subject": "승인을 기다리고 있습니다: {{date}} {{title}}",
"event_still_awaiting_approval": "이벤트가 아직 승인을 기다리고 있습니다.",
"booking_submitted_subject": "예약 제출됨: {{date}}에 {{title}}",
"download_recording_subject": "기록 다운로드: {{title}} 날짜 {{date}}",
"download_your_recording": "사용자 기록 다운로드",
"your_meeting_has_been_booked": "회의가 예약되었습니다.",
"event_type_has_been_rescheduled_on_time_date": "귀하의 {{title}} 일정이 {{date}}로 변경되었습니다.",
"event_has_been_rescheduled": "업데이트 - 이벤트 일정이 변경되었습니다.",
@@ -587,6 +590,20 @@
"minutes": "분",
"round_robin": "라운드 로빈",
"round_robin_description": "여러 팀 구성원 간의 주기적인 회의",
"managed_event": "관리형 이벤트",
"username_placeholder": "사용자 이름",
"managed_event_description": "팀원들에게 대량으로 이벤트 유형 생성 및 배포",
"managed": "관리됨",
"managed_event_url_clarification": "\"사용자 이름\"은 할당된 회원의 사용자 이름으로 채워집니다",
"assign_to": "할당:",
"add_members": "회원 추가:",
"count_members_one": "회원 {{count}}명",
"count_members_other": "회원 {{count}}명",
"no_assigned_members": "할당된 회원 없음",
"assigned_to": "할당됨:",
"start_assigning_members_above": "위에서 회원 할당 시작",
"locked_fields_admin_description": "회원은 이 내용을 수정할 수 없게 됩니다",
"locked_fields_member_description": "이 옵션은 팀 관리자에 의해 잠겼습니다",
"url": "링크",
"hidden": "숨기기",
"readonly": "읽기 전용",
@@ -739,6 +756,9 @@
"slot_interval": "시간 슬롯 간격",
"slot_interval_default": "이벤트 길이 사용(기본값)",
"delete_event_type": "이벤트 타입을 삭제하시겠습니까?",
"delete_managed_event_type": "관리 이벤트 유형을 삭제하시겠습니까?",
"delete_event_type_description": "링크를 공유한 회원은 더 이상 링크를 사용하여 예약할 수 없게 됩니다.",
"delete_managed_event_type_description": "<ul><li>이 이벤트 유형에 할당된 회원은 이벤트 유형도 삭제됩니다.</li><li>링크를 공유한 회원은 더 이상 링크를 사용하여 예약할 수 없게 됩니다.</li> </ul>",
"confirm_delete_event_type": "네, 삭제합니다",
"delete_account": "계정 삭제",
"confirm_delete_account": "예, 계정을 삭제합니다",
@@ -1130,11 +1150,13 @@
"current_username": "현재 사용자 이름",
"example_1": "예 1",
"example_2": "예 2",
"booking_question_identifier": "예약 질문 ID",
"company_size": "회사 규모",
"what_help_needed": "어떻게 도와 드릴까요?",
"variable_format": "변수 형식",
"webhook_subscriber_url_reserved": "웹훅 구독자 URL이 이미 정의되었습니다",
"custom_input_as_variable_info": "추가 입력 레이블의 모든 특수 문자는 무시하고(문자와 숫자만 사용) 모든 문자에 대문자를 사용하며 공백은 밑줄로 대체합니다.",
"using_booking_questions_as_variables": "예약 질문을 변수로 어떻게 사용합니까?",
"download_desktop_app": "데스크탑 앱 다운로드",
"set_ping_link": "Ping 링크 설정",
"rate_limit_exceeded": "요금 한도 초과됨",
@@ -1180,6 +1202,7 @@
"start_of_week": "주의 시작",
"recordings_title": "녹음",
"recording": "녹음",
"happy_scheduling": "즐거운 일정 관리 되세요",
"select_calendars": "중복 예약을 방지하기 위해 충돌을 확인하려는 캘린더를 선택합니다.",
"check_for_conflicts": "충돌 확인",
"view_recordings": "녹음 보기",
@@ -1258,6 +1281,7 @@
"download_responses": "다운로드 응답",
"download_responses_description": "양식에 대한 모든 응답을 CSV 형식으로 다운로드합니다.",
"download": "다운로드",
"download_recording": "기록 다운로드",
"recording_from_your_recent_call": "Cal.com에서 최근 통화 내용 녹음 파일을 다운로드 할 준비가 되었습니다",
"create_your_first_form": "첫 양식 작성",
"create_your_first_form_description": "라우팅 양식을 사용하면 적격성 질문을 올리고 올바른 사람 또는 이벤트 유형으로 라우팅할 수 있습니다.",
@@ -1295,6 +1319,15 @@
"exchange_authentication_standard": "기본 인증",
"exchange_authentication_ntlm": "NTLM 인증",
"exchange_compression": "GZip 압축",
"exchange_version": "전환 버전",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "여기에서 생성했던 모든 양식과 경로를 볼 수 있습니다.",
"routing_forms_send_email_owner": "소유자에게 이메일 보내기",
"routing_forms_send_email_owner_description": "양식이 제출되면 소유자에게 이메일을 발송합니다",
@@ -1349,6 +1382,7 @@
"add_limit": "제한 추가",
"team_name_required": "팀 이름 필수",
"show_attendees": "게스트 간에 참석자 정보 공유",
"how_booking_questions_as_variables": "예약 질문을 변수로 어떻게 사용합니까?",
"format": "형식",
"uppercase_for_letters": "모든 문자에 대문자 사용",
"replace_whitespaces_underscores": "공백을 밑줄로 바꾸기",
@@ -1363,6 +1397,7 @@
"billing_help_title": "또 필요한 것이 있나요?",
"billing_help_description": "청구와 관련하여 추가적인 도움이 필요한 경우 지원 팀이 도와드리겠습니다.",
"billing_help_cta": "지원 문의",
"ignore_special_characters_booking_questions": "예약 질문 ID의 특수 문자는 무시하십시오. 문자와 숫자만 사용하십시오",
"retry": "재시도",
"fetching_calendars_error": "캘린더를 가져오는 중 문제가 발생했습니다. <1>다시 시도</1>하거나 고객 지원에 문의하십시오.",
"calendar_connection_fail": "캘린더 연결 실패",
@@ -1451,8 +1486,11 @@
"duration_limit_reached": "이 이벤트 타입에 대한 기간 한도에 도달했습니다",
"admin_has_disabled": "관리자가 {{appName}} 앱을 비활성화했습니다",
"disabled_app_affects_event_type": "관리자가 이벤트 타입 {{eventType}}에 영향을 미치는 {{appName}} 앱을 비활성화했습니다",
"event_replaced_notice": "관리자가 이벤트 유형 중 하나를 바꿨습니다",
"email_subject_slug_replacement": "팀 관리자가 당신의 이벤트 /{{slug}}를 변경하였습니다",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong> 팀의 관리자가 귀하의 이벤트 유형 <strong>/{{slug}}</strong>을(를) 관리 이벤트 유형으로 바꿨습니다.",
"email_body_slug_replacement_info": "링크는 계속 유효하지만 일부 설정이 변경될 수 있습니다. 이벤트 타입에서 이를 검토할 수 있습니다.",
"email_body_slug_replacement_suggestion": "이벤트 유형에 대해 질문이 있는 경우 관리자에게 문의하십시오.<br /><br />즐거운 일정 되시기 바랍니다. <br />Cal.com 팀",
"disable_payment_app": "관리자가 이벤트 타입 {{title}}에 영향을 미치는 {{appName}} 앱을 비활성화했습니다. 참석자는 여전히 이러한 타입의 이벤트를 예약할 수 있지만 결제하라는 메시지는 표시되지 않습니다. 관리자가 결제 수단을 다시 활성화할 때까지 이를 방지하기 위해 이벤트 타입을 숨길 수 있습니다.",
"payment_disabled_still_able_to_book": "참석자는 여전히 이러한 타입의 이벤트를 예약할 수 있지만 결제하라는 메시지는 표시되지 않습니다. 관리자가 결제 수단을 다시 활성화할 때까지 이를 방지하기 위해 이벤트 타입을 숨길 수 있습니다.",
"app_disabled_with_event_type": "관리자가 이벤트 타입 {{title}}에 영향을 미치는 {{appName}} 앱을 비활성화했습니다.",
@@ -1548,6 +1586,7 @@
"ee_enterprise_license": "“/ee” Enterprise 라이선스",
"enterprise_booking_fee": "시작 가격 {{enterprise_booking_fee}}/월",
"enterprise_license_includes": "모든 상업적 기능 구비",
"no_need_to_keep_your_code_open_source": "코드를 오픈 소스로 유지할 필요가 없습니다",
"repackage_rebrand_resell": "쉽게 패키지를 재구성하여 새 브랜드로 재판매 가능",
"a_vast_suite_of_enterprise_features": "방대한 엔터프라이즈 기능 모음",
"free_license_fee": "$0.00/월",
@@ -1609,6 +1648,7 @@
"default_app_link_title": "기본 앱 링크 설정",
"default_app_link_description": "기본 앱 링크를 설정하면 새로 생성된 모든 이벤트 유형에서 설정된 앱 링크를 사용할 수 있습니다.",
"change_default_conferencing_app": "기본값으로 설정",
"organizer_default_conferencing_app": "주최자의 기본 앱",
"under_maintenance": "아래로 밀어 유지관리",
"under_maintenance_description": "{{appName}} 팀에서 예정된 유지관리를 수행하고 있습니다. 궁금한 점이 있으면 지원팀에 문의하세요.",
"event_type_seats": "{{numberOfSeats}}개 시트",
@@ -1623,6 +1663,7 @@
"not_enough_seats": "좌석이 부족합니다",
"form_builder_field_already_exists": "이 이름을 가진 필드가 이미 존재합니다",
"form_builder_field_add_subtitle": "예약 페이지에서 묻는 질문을 사용자 정의합니다",
"show_on_booking_page": "예약 페이지에 표시",
"get_started_zapier_templates": "Zapier 템플릿 시작하기",
"team_is_unpublished": "{{team}} 팀은 게시되지 않았습니다",
"team_is_unpublished_description": "이 팀 링크는 현재 사용할 수 없습니다. 팀 소유자에게 연락하거나 게시하라고 요청하십시오.",
@@ -1665,12 +1706,36 @@
"can_you_try_again": "다른 시간으로 다시 해보시겠어요?",
"verify": "인증",
"timezone_variable": "시간대",
"timezone_info": "받는 사람의 시간대",
"event_end_time_variable": "이벤트 종료 시간",
"event_end_time_info": "이벤트 종료 시간",
"cancel_url_variable": "취소 URL",
"cancel_url_info": "예약 취소 URL",
"reschedule_url_variable": "일정 변경 URL",
"reschedule_url_info": "예약 일정 변경 URL",
"invalid_event_name_variables": "이벤트 이름에 유효하지 않은 변수가 있습니다",
"select_all": "모두 선택",
"default_conferencing_bulk_title": "기존 이벤트 유형 일괄 업데이트",
"members_default_schedule": "회원의 기본 일정",
"set_by_admin": "팀 관리자에 의해 설정됨",
"members_default_location": "회원의 기본 위치",
"members_default_schedule_description": "각 회원의 기본 사용 가능 일정을 사용합니다. 편집 또는 변경할 수 있습니다.",
"requires_at_least_one_schedule": "적어도 한 개 이상의 스케줄이 필요합니다",
"default_conferencing_bulk_description": "선택한 이벤트 유형의 위치 업데이트",
"locked_for_members": "회원에 대해 잠김",
"locked_apps_description": "회원은 활성 앱을 볼 수 있지만 앱 설정을 편집할 수는 없습니다",
"locked_webhooks_description": "회원은 활성 웹훅을 볼 수 있지만 웹훅 설정을 편집할 수는 없습니다",
"locked_workflows_description": "회원은 활성 워크플로를 볼 수 있지만 워크플로 설정을 편집할 수는 없습니다",
"locked_by_admin": "관리자에 의해 잠금 됨",
"app_not_connected": "{{appName}} 계정을 연결하지 않으셨습니다.",
"connect_now": "지금 연결",
"managed_event_dialog_confirm_button_one": "회원 {{count}}명 바꾸기 및 알림",
"managed_event_dialog_confirm_button_other": "회원 {{count}}명 바꾸기 및 알림",
"managed_event_dialog_title_one": "URL /{{slug}}은(는) {{count}}명의 회원에 대해 이미 존재합니다. 바꾸시겠습니까?",
"managed_event_dialog_title_other": "URL /{{slug}}은(는) {{count}}명의 회원에 대해 이미 존재합니다. 바꾸시겠습니까?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> 님이 이미 <strong>/{{slug}}</strong> url을 사용하는 중입니다.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> 님이 이미 <string>/{{slug}}</strong> url을 사용하는 중입니다.",
"managed_event_dialog_clarification": "바꾸기를 선택하면 알려드립니다. 덮어쓰지 않으려면 돌아가서 제거하십시오.",
"review_event_type": "이벤트 타입 검토",
"looking_for_more_analytics": "추가적인 분석을 원하시나요?",
"looking_for_more_insights": "더 많은 인사이트를 찾고계신가요?",
@@ -1678,21 +1743,46 @@
"select_user": "사용자 선택",
"select_event_type": "이벤트 타입 선택",
"select_date_range": "날짜 범위 선택",
"popular_events": "인기 이벤트",
"no_event_types_found": "이벤트 타입을 찾을 수 없습니다",
"average_event_duration": "평균 이벤트 기간",
"most_booked_members": "가장 많이 예약한 회원",
"least_booked_members": "가장 적게 예약한 회원",
"events_created": "생성된 이벤트",
"events_completed": "완료된 이벤트",
"events_cancelled": "취소된 이벤트",
"events_rescheduled": "일정이 변경된 이벤트",
"from_last_period": "마지막 기간부터",
"from_to_date_period": "시작일: {{startDate}} 종료일: {{endDate}}",
"analytics_for_organisation": "인사이트",
"subtitle_analytics": "팀 활동에 대해 자세히 알아보기",
"redirect_url_warning": "리디렉션을 추가하면 성공 페이지가 비활성화됩니다. 사용자 지정 성공 페이지에 \"예약 확인됨\"을 언급해야 합니다.",
"event_trends": "이벤트 트렌드",
"clear_filters": "필터 삭제",
"hold": "보류",
"on_booking_option": "예약 시 결제 징수",
"hold_option": "노쇼 수수료 부과",
"card_held": "카드 보류됨",
"charge_card": "카드 부과",
"card_charged": "카드 부과됨",
"no_show_fee_amount": "{{amount, currency}} 노쇼 수수료",
"no_show_fee": "No-show 수수료",
"submit_card": "카드 제출",
"submit_payment_information": "결제 정보 제출",
"meeting_awaiting_payment_method": "회의에 대한 결제 수단을 기다리는 중입니다",
"no_show_fee_charged_email_subject": "{{amount, currency}}에 대한 노쇼 수수료 부과됨: {{title}} 날짜 {{date}}",
"no_show_fee_charged_text_body": "No-show 수수료가 부과되었습니다",
"no_show_fee_charged_subtitle": "다음 이벤트에 대해 {{amount, currency}}에 대한 노쇼 수수료가 부과되었습니다",
"error_charging_card": "No-show 수수료 청구 중 문제가 발생했습니다. 나중에 다시 시도해주세요.",
"collect_no_show_fee": "No-show 수수료를 청구하세요",
"no_show_fee_charged": "No-show 수수료가 부과됩니다",
"insights": "인사이트",
"testing_workflow_info_message": "이 워크플로를 테스트할 때 이메일 및 SMS는 최소 1시간 전에만 예약할 수 있다는 점에 유의하세요",
"insights_no_data_found_for_filter": "선택한 필터 또는 날짜에 대한 데이터를 찾을 수 없습니다.",
"acknowledge_booking_no_show_fee": "본인은 이 이벤트에 참석하지 않을 경우 {{amount, currency}}에 대한 노쇼 수수료가 내 카드에 적용됨을 인정합니다.",
"card_details": "카드 세부정보",
"seats_and_no_show_fee_error": "현재 좌석을 활성화할 수 없으므로 노쇼 수수료를 부과할 수 없습니다",
"complete_your_booking": "예약을 완료하세요",
"complete_your_booking_subject": "예약 완료: {{title}} 날짜 {{date}}",
"email_invite_team": "{{email}} 이 초대되었습니다."
}
+140 -21
View File
@@ -69,6 +69,8 @@
"event_awaiting_approval_subject": "Oczekiwanie na zatwierdzenie: {{title}} w {{date}}",
"event_still_awaiting_approval": "Wydarzenie nadal oczekuje na Twoje zatwierdzenie",
"booking_submitted_subject": "Rezerwacja potwierdzona: {{title}} w {{date}}",
"download_recording_subject": "Pobierz nagranie: {{title}} z {{date}}",
"download_your_recording": "Pobierz nagranie",
"your_meeting_has_been_booked": "Twoje spotkanie zostało zarezerwowane",
"event_type_has_been_rescheduled_on_time_date": "Twój {{title}} został przełożony na {{date}}.",
"event_has_been_rescheduled": "Zaktualizowano - Twoje wydarzenie zostało przełożone",
@@ -111,7 +113,7 @@
"hidden_team_owner_message": "Potrzebujesz konta pro aby korzystać z zespołów, jesteś ukryty do czasu ulepszenia.",
"link_expires": "P.S. Wygasa za {{expiresIn}} godzin.",
"upgrade_to_per_seat": "Ulepsz do Per-Seat",
"seat_options_doesnt_support_confirmation": "Opcja miejsc nie obsługuje wymogu potwierdzenia.",
"seat_options_doesnt_support_confirmation": "Opcja miejsc nie obsługuje wymogu potwierdzenia",
"team_upgrade_seats_details": "Spośród {{memberCount}} członków Twojego zespołu, {{unpaidCount}} miejsc(e) nie jest opłacane. Szacowany całkowity koszt Twojego członkostwa w liczbie ${{seatPrice}} na miesiąc wynosi ${{totalCost}} na miesiąc.",
"team_upgrade_banner_description": "Dziękujemy za wypróbowanie naszego nowego planu zespołowego. Zauważyliśmy, że Twój zespół „{{teamName}}” trzeba ulepszyć.",
"team_upgrade_banner_action": "Ulepsz tutaj",
@@ -224,6 +226,7 @@
"done": "Gotowe",
"all_done": "Wszystko gotowe!",
"all_apps": "Wszystkie",
"available_apps": "Dostępne aplikacje",
"check_email_reset_password": "Sprawdź swój e-mail. Wysłaliśmy Ci link do zresetowania hasła.",
"finish": "Ukończ",
"few_sentences_about_yourself": "Kilka zdań o Tobie. To pojawi się na Twojej osobistej stronie URL.",
@@ -404,6 +407,7 @@
"add_time_availability": "Dodaj nowy przedział czasowy",
"add_an_extra_layer_of_security": "Dodaj dodatkową warstwę zabezpieczeń do swojego konta na wypadek kradzieży hasła.",
"2fa": "Uwierzytelnianie dwuetapowe",
"2fa_disabled": "Uwierzytelnianie dwuetapowe może zostać włączone tylko do uwierzytelniania adresu e-mail i hasła",
"enable_2fa": "Włącz uwierzytelnianie dwuskładnikowe",
"disable_2fa": "Wyłącz uwierzytelnianie dwuetapowe",
"disable_2fa_recommendation": "Jeśli chcesz wyłączyć 2FA, zalecamy ponowne włączenie go tak szybko, jak to możliwe.",
@@ -433,7 +437,7 @@
"password_hint_min": "Długość co najmniej 7 znaków",
"password_hint_admin_min": "Długość co najmniej 15 znaków",
"password_hint_num": "Zawrzyj co najmniej 1 cyfrę",
"max_limit_allowed_hint": "Może składać się maksymalnie z {{limit}} znaków.",
"max_limit_allowed_hint": "Może składać się z maksymalnie {{limit}} znaków",
"invalid_password_hint": "Hasło musi składać się z co najmniej {{passwordLength}} znaków, zawierać co najmniej jedną cyfrę oraz kombinację wielkich i małych liter",
"incorrect_password": "Hasło jest nieprawidłowe.",
"incorrect_username_password": "Nieprawidłowa nazwa użytkownika lub hasło.",
@@ -585,6 +589,19 @@
"minutes": "Minuty",
"round_robin": "Round Robin",
"round_robin_description": "Cykl spotkań między wieloma członkami zespołu.",
"username_placeholder": "nazwa użytkownika",
"managed_event_description": "Masowo twórz i udostępniaj rodzaje wydarzeń członkom zespołu",
"managed": "Zarządzane",
"managed_event_url_clarification": "Pole \"nazwa użytkownika\" zostanie uzupełnione nazwami przypisanych użytkowników",
"assign_to": "Przypisz do",
"add_members": "Dodaj członków...",
"count_members_one": "Liczba członków: {{count}}",
"count_members_other": "Liczba członków: {{count}}",
"no_assigned_members": "Brak przypisanych członków",
"assigned_to": "Przypisano do:",
"start_assigning_members_above": "Rozpocznij przypisywanie członków powyżej",
"locked_fields_admin_description": "Członkowie nie będą mogli tego edytować",
"locked_fields_member_description": "Ta opcja została zablokowana przez administratora zespołu",
"url": "Adres URL",
"hidden": "Ukryte",
"readonly": "Tylko do odczytu",
@@ -736,6 +753,11 @@
"minimum_booking_notice": "Minimalne powiadomienie",
"slot_interval": "Przedziały czasowe",
"slot_interval_default": "Użyj długości zdarzenia (domyślnie)",
"delete_event_type": "Usunąć typ wydarzenia?",
"delete_managed_event_type": "Usunąć typ zarządzanego wydarzenia?",
"delete_event_type_description": "Osoby, którym udostępniono ten link, nie będą już mogły dokonać rezerwacji za jego pomocą.",
"delete_managed_event_type_description": "<ul><li>Typy wydarzeń członków przypisanych do tego typu wydarzenia również zostaną usunięte.</li><li>Osoby, którym udostępniono linki, nie będą już mogły dokonać rezerwacji za ich pomocą.</li></ul>",
"confirm_delete_event_type": "Tak, usuń",
"delete_account": "Usuń konto",
"confirm_delete_account": "Tak, usuń konto",
"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.",
@@ -1176,6 +1198,7 @@
"start_of_week": "Początek tygodnia",
"recordings_title": "Nagrania",
"recording": "Nagranie",
"happy_scheduling": "Miłego planowania",
"select_calendars": "Wybierz kalendarze, które chcesz sprawdzić pod kątem konfliktów, aby uniknąć podwójnych rezerwacji.",
"check_for_conflicts": "Sprawdź konflikty",
"view_recordings": "Wyświetl nagrania",
@@ -1213,6 +1236,7 @@
"impersonation": "Podszywanie się",
"impersonation_description": "Ustawienia do zarządzania podszywaniem się pod użytkownika",
"users": "Użytkownicy",
"user": "Użytkownik",
"profile_description": "Zarządzaj ustawieniami swojego profilu {{appName}}",
"users_description": "Tutaj znajdziesz listę wszystkich użytkowników",
"users_listing": "Lista użytkowników",
@@ -1253,6 +1277,8 @@
"download_responses": "Pobierz odpowiedzi",
"download_responses_description": "Pobierz wszystkie odpowiedzi do formularza w formacie CSV.",
"download": "Pobierz",
"download_recording": "Pobierz nagranie",
"recording_from_your_recent_call": "Nagranie z ostatniego połączenia na Cal.com jest gotowe do pobrania",
"create_your_first_form": "Utwórz pierwszy formularz",
"create_your_first_form_description": "Za pomocą formularzy przekierowujących możesz zadawać pytania profilujące i przekierowywać użytkowników do odpowiednich osób lub typów wydarzeń.",
"create_your_first_webhook": "Utwórz pierwszy Webhook",
@@ -1289,6 +1315,14 @@
"exchange_authentication_standard": "Uwierzytelnianie podstawowe",
"exchange_authentication_ntlm": "Uwierzytelnianie NTLM",
"exchange_compression": "Kompresja gzip",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Możesz tutaj zobaczyć wszystkie utworzone przez siebie formularze i przekierowania.",
"routing_forms_send_email_owner": "Wyślij wiadomość e-mail do właściciela",
"routing_forms_send_email_owner_description": "Wysyła wiadomość e-mail do właściciela, gdy formularz zostanie przesłany.",
@@ -1339,7 +1373,7 @@
"limit_booking_frequency": "Ogranicz częstotliwość rezerwacji",
"limit_booking_frequency_description": "Ogranicz liczbę rezerwacji tego wydarzenia",
"limit_total_booking_duration": "Ogranicz całkowity czas trwania rezerwacji",
"limit_total_booking_duration_description": "Ogranicz całkowity czas, przez jaki to wydarzenie może być rezerwowane.",
"limit_total_booking_duration_description": "Ogranicz całkowity czas, przez jaki można rezerwować to wydarzenie",
"add_limit": "Dodaj limit",
"team_name_required": "Wymagana nazwa zespołu",
"show_attendees": "Udostępniaj gościom informacje o uczestnikach",
@@ -1439,11 +1473,16 @@
"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",
"the_calcom_team": "Zespół Cal.com",
"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",
"duration_limit_reached": "Osiągnięto limit czasu trwania 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}})",
"event_replaced_notice": "Administrator zastąpił jeden z Twoich typów wydarzeń",
"email_subject_slug_replacement": "Administrator zespołu zastąpił Twoje wydarzenie /{{slug}}",
"email_body_slug_replacement_info": "Twój link nadal będzie działał, ale niektóre z jego ustawień mogły ulec zmianie. Możesz zobaczyć szczegóły w typach zdarzeń.",
"email_body_slug_replacement_suggestion": "Jeśli masz jakiekolwiek pytania dotyczące typu wydarzenia, skontaktuj się z administratorem.<br /><br />Miłego planowania, <br />zespół Cal.com",
"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 włączy 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 włączy 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}}).",
@@ -1492,6 +1531,7 @@
"date_overrides_update_btn": "Zaktualizuj zastąpienie",
"event_type_duplicate_copy_text": "{{slug}}-kopia",
"set_as_default": "Ustaw jako domyślne",
"hide_eventtype_details": "Ukryj szczegóły typu wydarzenia",
"show_navigation": "Pokaż nawigację",
"hide_navigation": "Ukryj nawigację",
"verification_code_sent": "Wysłano kod weryfikacyjny",
@@ -1505,6 +1545,7 @@
"create_your_first_team_webhook_description": "Utwórz swój pierwszy element webhook dla tego typu wydarzenia zespołowego",
"create_webhook_team_event_type": "Utwórz element webhook dla tego typu wydarzenia zespołowego",
"disable_success_page": "Wyłącz stronę powodzenia (działa tylko wtedy, gdy masz adres URL przekierowania)",
"invalid_admin_password": "Jesteś administratorem, ale Twoje hasło jest krótsze niż 15 znaków lub nie używasz jeszcze uwierzytelniania dwuetapowego",
"change_password_admin": "Zmień hasło, aby uzyskać uprawnienia dostępu administratora",
"username_already_taken": "Nazwa użytkownika jest już zajęta",
"assignment": "Przypisanie",
@@ -1586,44 +1627,46 @@
"recommended_next_steps": "Zalecane następne kroki",
"create_a_managed_event": "Utwórz typ zarządzanego wydarzenia",
"meetings_are_better_with_the_right": "Spotkania idą lepiej, gdy uczestniczą w nich właściwi członkowie zespołu. Zaproś ich teraz.",
"create_a_one_one_template": "Utwórz szablon jeden na jeden dla danego typu wydarzenia i udostępnij go wielu użytkownikom.",
"create_a_one_one_template": "Utwórz jeden szablon dla danego typu wydarzenia i udostępnij go wielu użytkownikom.",
"collective_or_roundrobin": "Zbiorowo lub według algorytmu karuzelowego",
"book_your_team_members": "Zarezerwuj wszystkich członków zespołu za pomocą wydarzeń zbiorowych lub przeglądaj dostępne osoby, aby znaleźć tę właściwą za pomocą algorytmu karuzelowego.",
"event_no_longer_attending_subject": "Nie bierzesz już udziału w wydarzeniu {{title}} odbywającym się {{date}}.",
"no_longer_attending": "Nie bierzesz już udziału w tym wydarzeniu.",
"attendee_no_longer_attending_subject": "Uczestnik nie bierze już udziału w wydarzeniu {{title}} odbywającym się {{date}}.",
"event_no_longer_attending_subject": "Nie bierzesz już udziału w wydarzeniu {{title}} odbywającym się {{date}}",
"no_longer_attending": "Nie bierzesz już udziału w tym wydarzeniu",
"attendee_no_longer_attending_subject": "Uczestnik nie bierze już udziału w wydarzeniu {{title}} odbywającym się {{date}}",
"attendee_no_longer_attending": "Uczestnik nie bierze już udziału w Twoim wydarzeniu.",
"attendee_no_longer_attending_subtitle": "Użytkownik {{name}} anulował rezerwację. To oznacza, że zwolniło się miejsce w tym terminie.",
"attendee_no_longer_attending_subtitle": "Użytkownik {{name}} anulował rezerwację. To znaczy, że zwolniło się miejsce w tym terminie",
"create_event_on": "Utwórz wydarzenie w kalendarzu",
"default_app_link_title": "Ustaw domyślny link do aplikacji",
"default_app_link_description": "Ustawienie domyślnego linku do aplikacji pozwala wszystkim nowo utworzonym typom wydarzeń na używanie ustawionego przez Ciebie linku do aplikacji.",
"change_default_conferencing_app": "Ustaw jako domyślne",
"organizer_default_conferencing_app": "Domyślna aplikacja organizatora",
"under_maintenance": "Przerwa konserwacyjna",
"under_maintenance_description": "Zespół {{appName}} przeprowadza zaplanowane prace konserwacyjne. Jeśli masz jakieś pytania, skontaktuj się z pomocą techniczną.",
"event_type_seats": "Liczba stanowisk: {{numberOfSeats}}",
"booking_questions_title": "Pytania dotyczące rezerwacji",
"booking_questions_description": "Dostosuj pytania zadawane na stronie rezerwacji",
"add_a_booking_question": "Dodaj pytanie",
"duplicate_email": "Adres e-mail jest zduplikowany.",
"duplicate_email": "Adres e-mail jest zduplikowany",
"booking_with_payment_cancelled": "Nie można już zapłacić za to wydarzenie",
"booking_with_payment_cancelled_already_paid": "Zwrot środków za tę rezerwację jest już w drodze.",
"booking_with_payment_cancelled_refunded": "Płatność za tę rezerwację została zwrócona.",
"booking_confirmation_failed": "Potwierdzenie rezerwacji nie powiodło się",
"not_enough_seats": "Za mało miejsc",
"form_builder_field_already_exists": "Pole o tej nazwie już istnieje.",
"form_builder_field_already_exists": "Pole o tej nazwie już istnieje",
"form_builder_field_add_subtitle": "Dostosuj pytania zadawane na stronie rezerwacji",
"show_on_booking_page": "Wyświetl na stronie rezerwacji",
"get_started_zapier_templates": "Zacznij korzystać z szablonów Zapier",
"team_is_unpublished": "Zespół {{team}} nie został opublikowany.",
"team_is_unpublished_description": "Ten link zespołu jest obecnie niedostępny. Skontaktuj się z właścicielem zespołu lub poproś o jego opublikowanie.",
"team_is_unpublished": "Zespół {{team}} nie został opublikowany",
"team_is_unpublished_description": "Link tego zespołu jest obecnie niedostępny. Skontaktuj się z właścicielem zespołu lub poproś o jego opublikowanie.",
"team_member": "Członek zespołu",
"a_routing_form": "Formularz przekierowania",
"form_description_placeholder": "Opis formularza",
"keep_me_connected_with_form": "Zachowaj połączenie z formularzem",
"fields_in_form_duplicated": "Duplikowanie zmian w formularzu przekierowania i jego polach zostanie odzwierciedlone w duplikacie.",
"form_deleted": "Formularz usunięty",
"delete_form": "Usuń formularz",
"delete_form": "Czy na pewno chcesz usunąć ten formularz?",
"delete_form_action": "Tak, usuń formularz",
"delete_form_confirmation": "Czy na pewno chcesz usunąć ten formularz? Osoby, którym udostępniono link, nie będą już mogły użyć go do rezerwacji. Ponadto wszystkie powiązane odpowiedzi zostaną usunięte.",
"delete_form_confirmation": "Osoby, którym udostępniono ten link, nie będą miały już do niego dostępu.",
"delete_form_confirmation_2": "Wszystkie powiązane odpowiedzi zostaną usunięte.",
"typeform_redirect_url_copied": "Skopiowano adres URL przekierowania z rozwiązania Typeform! Możesz teraz skonfigurować adres URL w formularzu Typeform.",
"modifications_in_fields_warning": "Zmiany w polach i przekierowaniach następujących formularzy zostaną odzwierciedlone w tym formularzu.",
@@ -1635,19 +1678,95 @@
"add_1_option_per_line": "Dodaj 1 opcję w każdym wierszu",
"select_a_router": "Wybierz formularz przekierowania",
"add_a_new_route": "Dodaj nowe przekierowanie",
"make_informed_decisions": "Dokonuj świadomych decyzji dzięki funkcji Insights",
"make_informed_decisions_description": "Panel Insights wyświetla całą aktywność zespołu i pokazuje trendy umożliwiające lepsze planowanie i podejmowanie decyzji w zespole.",
"view_bookings_across": "Zobacz rezerwacje wszystkich członków",
"view_bookings_across_description": "Zobacz, kto zapewnia najwięcej rezerwacji i upewnij się, że Twój zespół działa równomiernie",
"identify_booking_trends": "Identyfikuj trendy rezerwacji",
"identify_booking_trends_description": "Zobacz, jakie dni tygodnia i pory dnia są popularne wśród rezerwujących",
"spot_popular_event_types": "Przekonaj się, które typy wydarzeń są popularne",
"spot_popular_event_types_description": "Zobacz, które typy wydarzeń są najczęściej oglądane i rezerwowane",
"no_responses_yet": "Nie ma jeszcze odpowiedzi",
"this_will_be_the_placeholder": "To będzie symbol zastępczy",
"this_meeting_has_not_started_yet": "To spotkanie jeszcze się nie rozpoczęło.",
"this_app_requires_connected_account": "Aplikacja {{appName}} wymaga połączonego konta {{dependencyName}}.",
"connect_app": "Połącz {{dependencyName}}",
"app_is_connected": "Aplikacja {{dependencyName}} jest połączona.",
"requires_app": "Wymaga {{dependencyName}}",
"this_meeting_has_not_started_yet": "To spotkanie jeszcze się nie rozpoczęło",
"this_app_requires_connected_account": "Aplikacja {{appName}} wymaga podłączonego konta {{dependencyName}}",
"connect_app": "Podłącz {{dependencyName}}",
"app_is_connected": "Aplikacja {{dependencyName}} jest podłączona",
"requires_app": "Wymaga aplikacji {{dependencyName}}",
"verification_code": "Kod weryfikacyjny",
"can_you_try_again": "Możesz spróbować ponownie w innym terminie?",
"can_you_try_again": "Czy możesz spróbować ponownie w innym terminie?",
"verify": "Zweryfikuj",
"timezone_variable": "Strefa Czasowa",
"timezone_info": "Strefa czasowa osoby otrzymującej",
"event_end_time_variable": "Czas zakończenia wydarzenia",
"event_end_time_info": "Czas zakończenia wydarzenia",
"cancel_url_variable": "Adres URL do anulowania",
"cancel_url_info": "Adres URL do anulowania rezerwacji",
"reschedule_url_variable": "Adres URL do zmiany harmonogramu",
"reschedule_url_info": "Adres URL do zmiany terminu rezerwacji",
"invalid_event_name_variables": "W Twojej nazwie wydarzenia występuje nieprawidłowa zmienna.",
"select_all": "Zaznacz wszystko",
"default_conferencing_bulk_title": "Zbiorcza aktualizacja istniejących typów wydarzeń",
"default_conferencing_bulk_description": "Aktualizuj lokalizacje wybranych typów wydarzeń"
"members_default_schedule": "Domyślny harmonogram użytkownika",
"set_by_admin": "Ustalono przez administratora zespołu",
"members_default_location": "Domyślna lokalizacja członka",
"members_default_schedule_description": "Będziemy używać domyślnego harmonogramu dostępności każdego członka. Każdy z nich będzie mógł go edytować lub zmienić.",
"requires_at_least_one_schedule": "Musisz mieć co najmniej jeden harmonogram",
"default_conferencing_bulk_description": "Aktualizuj lokalizacje wybranych typów wydarzeń",
"locked_for_members": "Zablokowane dla członków",
"locked_apps_description": "Członkowie będą mogli zobaczyć aktywne aplikacje, ale nie będą mogli zmieniać ustawień aplikacji",
"locked_webhooks_description": "Członkowie będą mogli zobaczyć aktywne webhooki, ale nie będą mogli zmieniać żadnych ustawień webhooków",
"locked_workflows_description": "Członkowie będą mogli zobaczyć aktywne plany pracy, ale nie będą mogli zmieniać żadnych ustawień planów pracy",
"locked_by_admin": "Zablokowane przez administratora",
"app_not_connected": "Konto {{appName}} nie zostało połączone.",
"connect_now": "Połącz teraz",
"managed_event_dialog_confirm_button_one": "Zastąp i poinformuj {{count}} członka",
"managed_event_dialog_confirm_button_other": "Zastąp i poinformuj {{count}} członków",
"managed_event_dialog_title_one": "Adres URL /{{slug}} już istnieje dla {{count}} członka. Czy chcesz go zastąpić?",
"managed_event_dialog_title_other": "Adres URL /{{slug}} już istnieje dla {{count}} członków. Czy chcesz go zastąpić?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> używa już adresu URL <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> używają już adresu URL <strong>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "Jeśli zdecydujesz go zastąpić, powiadomimy ich. Jeśli nie chcesz nadpisywać adresu, wróć i usuń ich.",
"review_event_type": "Zobacz szczegóły typu wydarzenia",
"looking_for_more_analytics": "Szukasz większej ilości danych analitycznych?",
"add_filter": "Dodaj filtr",
"select_user": "Wybierz użytkownika",
"select_event_type": "Wybierz typ wydarzenia",
"select_date_range": "Wybierz zakres dat",
"popular_events": "Popularne wydarzenia",
"no_event_types_found": "Nie znaleziono typów wydarzeń",
"average_event_duration": "Średni czas trwania wydarzenia",
"most_booked_members": "Najczęściej rezerwowani członkowie",
"least_booked_members": "Najrzadziej rezerwowani członkowie",
"events_created": "Utworzone wydarzenia",
"events_completed": "Zakończone wydarzenia",
"events_cancelled": "Anulowane wydarzenia",
"events_rescheduled": "Przełożone wydarzenia",
"from_to_date_period": "Od: {{startDate}} Do: {{endDate}}",
"subtitle_analytics": "Dowiedz się więcej o aktywności Twojego zespołu",
"redirect_url_warning": "Dodanie przekierowania sprawi, że strona potwierdzenia zostanie wyłączona. Upewnij się, że na swojej spersonalizowanej stronie potwierdzenia umieścisz informację o potwierdzeniu rezerwacji.",
"event_trends": "Trendy wydarzeń",
"clear_filters": "Wyczyść filtry",
"on_booking_option": "Pobieraj płatność przy rezerwacji",
"hold_option": "Pobierz opłatę za niestawienie się",
"charge_card": "Obciąż kartę płatniczą",
"card_charged": "Obciążono kartę płatniczą",
"no_show_fee_amount": "Opłata za niestawienie się w wysokości {{amount, currency}}",
"no_show_fee": "Opłata za niestawienie się",
"submit_card": "Prześlij dane karty",
"submit_payment_information": "Prześlij informacje o płatności",
"no_show_fee_charged_email_subject": "Pobrano opłatę za niestawienie się na wydarzeniu: {{title}} dnia {{date}}",
"no_show_fee_charged_text_body": "Pobrano opłatę za niestawienie się",
"no_show_fee_charged_subtitle": "Za następujęce wydarzenie pobrano opłatę za niestawienie się w wysokości {{amount, currency}}",
"error_charging_card": "Coś poszło nie tak podczas pobierania opłaty za niestawienie się. Spróbuj ponownie później.",
"collect_no_show_fee": "Pobierz opłatę za niestawienie się",
"no_show_fee_charged": "Pobrano opłatę za niestawienie się",
"testing_workflow_info_message": "Podczas testowania tego planu pracy pamiętaj, że wiadomości e-mail i SMS mogą zostać zaplanowane najpóźniej godzinę przed ich dostarczeniem",
"insights_no_data_found_for_filter": "Nie znaleziono danych dla wybranego filtra lub dat.",
"acknowledge_booking_no_show_fee": "Rozumiem, że jeśli nie wezmę udziału w wydarzeniu, z mojej karty pobrana zostanie opłata w wysokości {{amount, currency}}.",
"card_details": "Dane karty",
"seats_and_no_show_fee_error": "Obecnie nie można udostępnić miejsc siedzących ani naliczyć opłaty za niestawienie się",
"complete_your_booking": "Ukończ rezerwację",
"complete_your_booking_subject": "Ukończ rezerwację: {{title}} dnia {{date}}",
"email_invite_team": "Zaproszono {{email}}"
}
@@ -1614,7 +1614,7 @@
"form_builder_field_add_subtitle": "Personalize as questões colocadas na página da reserva",
"get_started_zapier_templates": "Comece a utilizar os modelos Zapier",
"team_is_unpublished": "A equipa {{team}} ainda não está publicada",
"team_is_unpublished_description": "Esta ligação de equipa não está disponível neste momento. Por favor, entre em contacto com o responsável pela equipa ou solicite-lhes a respetiva publicação.",
"team_is_unpublished_description": "Esta ligação de equipa não está disponível neste momento. Por favor, entre em contacto com o responsável pela equipa ou solicite-lhe a respetiva publicação.",
"team_member": "Membro da equipa",
"a_routing_form": "Um formulário de encaminhamento",
"form_description_placeholder": "Descrição do formulário",
+22 -22
View File
@@ -111,7 +111,7 @@
"hidden_team_owner_message": "Aveți nevoie de un cont Pro pentru a utiliza echipe. Sunteți ascuns până când faceți upgrade.",
"link_expires": "p.s. Expiră în {{expiresIn}} ore.",
"upgrade_to_per_seat": "Faceți upgrade la nivelul Per licență",
"seat_options_doesnt_support_confirmation": "Opțiunea pentru locuri nu este disponibilă dacă rezervarea solicită de confirmare",
"seat_options_doesnt_support_confirmation": "Opțiunea cu locuri nu este disponibilă dacă rezervarea necesită confirmare",
"team_upgrade_seats_details": "Printre cei {{memberCount}} (de) membri din echipa dvs., {{unpaidCount}} (de) locuri nu sunt plătite. La {{seatPrice}} USD/lună/licență, costul total estimat al abonamentului dvs. este de {{totalCost}} USD/lună.",
"team_upgrade_banner_description": "Vă mulțumim că ați încercat noul nostru plan pentru echipe. Am observat că planul echipei dvs. „{{teamName}}” necesită un upgrade.",
"team_upgrade_banner_action": "Realizați upgrade aici",
@@ -1338,8 +1338,8 @@
"report_app": "Raportați aplicația",
"limit_booking_frequency": "Limitați frecvența de rezervare",
"limit_booking_frequency_description": "Limitați numărul de rezervări posibile pentru acest eveniment",
"limit_total_booking_duration": "Limitează durata totală a rezervării",
"limit_total_booking_duration_description": "Limitează durata totală de timp pentru care poate fi rezervat acest eveniment",
"limit_total_booking_duration": "Limitare durată totală a rezervării",
"limit_total_booking_duration_description": "Limitare durată totală de timp pentru care poate fi rezervat acest eveniment",
"add_limit": "Adăugați o limită",
"team_name_required": "Este necesar numele echipei",
"show_attendees": "Distribuiți informațiile despre participanți între invitați",
@@ -1582,7 +1582,7 @@
"available_variables": "Variabile disponibile",
"scheduler": "{Scheduler}",
"no_workflows": "Niciun flux de lucru",
"change_filter": "Schimbă filtrul pentru a vedea fluxurile tale de lucru personale și de echipă.",
"change_filter": "Schimbați filtrul pentru a vedea fluxurile de lucru personale și de echipă.",
"recommended_next_steps": "Următorii pași recomandați",
"create_a_managed_event": "Creați un tip de eveniment gestionat",
"meetings_are_better_with_the_right": "Ședințele sunt mai agreabile dacă participă membrii potriviți ai echipei. Invitați-i acum.",
@@ -1590,9 +1590,9 @@
"collective_or_roundrobin": "Alocare colectivă sau prin rotație",
"book_your_team_members": "Efectuați rezervări comune pentru membrii echipei. Alegeți evenimente colective sau creați un ciclu pentru a găsi persoana potrivită în urma alocării prin rotație.",
"event_no_longer_attending_subject": "Nu mai participă la {{title}} de la {{date}}",
"no_longer_attending": "Nu mai participi la acest eveniment",
"no_longer_attending": "Nu mai participați la acest eveniment",
"attendee_no_longer_attending_subject": "Un participant nu mai ia parte la {{title}} de la {{date}}",
"attendee_no_longer_attending": "Un participant nu mai ia parte la evenimentul tău",
"attendee_no_longer_attending": "Un participant nu mai ia parte la evenimentul dvs.",
"attendee_no_longer_attending_subtitle": "{{name}} a anulat. Acest lucru înseamnă că s-a eliberat un loc pentru acest interval de timp",
"create_event_on": "Creați eveniment pe",
"default_app_link_title": "Setați un link implicit pentru aplicații",
@@ -1602,28 +1602,28 @@
"under_maintenance_description": "Echipa {{appName}} efectuează lucrări de întreținere programate. Dacă aveți întrebări, contactați serviciul de asistență.",
"event_type_seats": "{{numberOfSeats}} (de) locuri",
"booking_questions_title": "Întrebări legate de rezervare",
"booking_questions_description": "Personalizează întrebările adresate pe pagina de rezervare",
"add_a_booking_question": "Adaugă o întrebare",
"booking_questions_description": "Personalizați întrebările adresate pe pagina de rezervare",
"add_a_booking_question": "Adăugați o întrebare",
"duplicate_email": "E-mailul este duplicat",
"booking_with_payment_cancelled": "Nu se mai poate plăti pentru acest eveniment",
"booking_with_payment_cancelled_already_paid": "Există o rambursare în curs pentru plata acestei rezervări.",
"booking_with_payment_cancelled_refunded": "Plata pentru această rezervare a fost rambursată.",
"booking_confirmation_failed": "Confirmare rezervare nereușită",
"not_enough_seats": "Nu sunt destule locuri",
"form_builder_field_already_exists": "Deja exiztă un câmp cu acest nume",
"form_builder_field_add_subtitle": "Personalizează întrebările adresate pe pagina de rezervare",
"not_enough_seats": "Nu sunt suficiente locuri",
"form_builder_field_already_exists": "Există deja un câmp cu acest nume",
"form_builder_field_add_subtitle": "Personalizați întrebările adresate pe pagina de rezervare",
"get_started_zapier_templates": "Faceți primii pași cu șabloanele Zapier",
"team_is_unpublished": "{{team}} este nepublicată",
"team_is_unpublished_description": "Acest link de echipă nu este disponibil momentan. Te rugăm să contactezi proprietarul echipei sau să îi spui să îl publice.",
"team_is_unpublished": "Echipa {{team}} nu este publicată",
"team_is_unpublished_description": "Acest link de echipă nu este disponibil momentan. Contactați proprietarul echipei sau rugați-l să îl publice.",
"team_member": "Membru al echipei",
"a_routing_form": "Un formular de parcurs",
"form_description_placeholder": "Descriere formular",
"keep_me_connected_with_form": "Vreau să primesc actualizări privind formularul",
"fields_in_form_duplicated": "Orice modificări aduse parcursului și câmpurilor din formularul duplicat se vor reflecta în duplicat.",
"form_deleted": "Formular șters",
"delete_form": "Ștergere formular",
"delete_form": "Sigur doriți să ștergeți acest formular?",
"delete_form_action": "Da, șterg formularul",
"delete_form_confirmation": "Sigur doriți să ștergeți acest formular? Nicio persoană căreia i-ați transmis linkul nu va mai putea efectua rezervări pe baza lui. În plus, toate răspunsurile asociate vor fi șterse.",
"delete_form_confirmation": "Nicio persoană căreia i-ați transmis linkul nu îl va mai putea accesa.",
"delete_form_confirmation_2": "Toate răspunsurile asociate vor fi șterse.",
"typeform_redirect_url_copied": "URL-ul de redirecționare Typeform a fost copiat! Puteți accesa și seta URL-ul în formularul Typeform.",
"modifications_in_fields_warning": "Modificările aduse câmpurilor și parcursurilor pentru următoarele formulare vor fi reproduse în acest formular.",
@@ -1647,17 +1647,17 @@
"this_will_be_the_placeholder": "Acesta va fi substituentul",
"this_meeting_has_not_started_yet": "Această întâlnire nu a început încă",
"this_app_requires_connected_account": "{{appName}} necesită un cont {{dependencyName}} conectat",
"connect_app": "Conectează {{dependencyName}}",
"app_is_connected": "{{dependencyName}} este conectată",
"connect_app": "Conectare {{dependencyName}}",
"app_is_connected": "Aplicația {{dependencyName}} este conectată",
"requires_app": "Necesită {{dependencyName}}",
"verification_code": "Cod de verificare",
"can_you_try_again": "Poți încerca din nou cu o oră diferită?",
"verify": "Verifică",
"can_you_try_again": "Puteți încerca din nou cu o oră diferită?",
"verify": "Verificare",
"timezone_variable": "Timezone",
"invalid_event_name_variables": "Numele evenimentului include o variabilă nevalidă",
"select_all": "Selectează tot",
"default_conferencing_bulk_title": "Actualizează în masă tipurile de evenimente existente",
"default_conferencing_bulk_description": "Actualizează locațiile pentru tipurile de evenimente selectate",
"select_all": "Selectare tot",
"default_conferencing_bulk_title": "Actualizare în masă tipuri de evenimente existente",
"default_conferencing_bulk_description": "Actualizați locațiile pentru tipurile de evenimente selectate",
"looking_for_more_analytics": "Cauți mai multe analize?",
"add_filter": "Adaugă filtru",
"select_user": "Selectează utilizatorul",
@@ -1589,11 +1589,11 @@
"create_a_one_one_template": "Создайте единый шаблон для данного типа события и распространите его среди нескольких участников.",
"collective_or_roundrobin": "Коллективное событие или событие с назначением участников по очереди",
"book_your_team_members": "Бронируйте встречи с несколькими участниками команды или назначайте участников по очереди.",
"event_no_longer_attending_subject": "Не планирует посетить {{title}} {{date}}",
"event_no_longer_attending_subject": "Посещение {{title}} в {{date}} не планируется",
"no_longer_attending": "Вы не идете на это мероприятие",
"attendee_no_longer_attending_subject": "Пользователь не планирует посетить {{title}} {{date}}",
"attendee_no_longer_attending_subject": "Пользователь не планирует посетить {{title}} в {{date}}",
"attendee_no_longer_attending": "Пользователь не участвует в вашем мероприятии",
"attendee_no_longer_attending_subtitle": "{{name}} отменено. Этот промежуток времени снова свободен",
"attendee_no_longer_attending_subtitle": "{{name}} отменил посещение мероприятия. Этот промежуток времени снова свободен",
"create_event_on": "Создать события",
"default_app_link_title": "Установить ссылку на приложение по умолчанию",
"default_app_link_description": "Если установить ссылку на приложение по умолчанию, она будет присваиваться всем вновь создаваемым событиям.",
+115 -1
View File
@@ -1,4 +1,5 @@
{
"identity_provider": "Dobavljač identiteta",
"trial_days_left": "Preostalo vam je $t(day, {\"count\": {{days}} }) na vašem probnom PRO nalogu",
"day_one": "{{count}} dan",
"day_other": "{{count}} dana",
@@ -69,6 +70,8 @@
"event_awaiting_approval_subject": "Čeka na odobrenje: {{title}} datuma {{date}}",
"event_still_awaiting_approval": "Događaj još čeka na vaše odobrenje",
"booking_submitted_subject": "Rezervacija podneta:{{title}} datuma {{date}}",
"download_recording_subject": "Preuzimanje snimka: {{title}} dana {{date}}",
"download_your_recording": "Preuzmite svoj snimak",
"your_meeting_has_been_booked": "Sastanak je zakazan",
"event_type_has_been_rescheduled_on_time_date": "Ваш {{титле}} је померен за {{дате}}.",
"event_has_been_rescheduled": "Ažurirano - Vaš dogadjaj je odložen",
@@ -224,6 +227,7 @@
"done": "Urađeno",
"all_done": "Završeno!",
"all_apps": "Sve aplikacije",
"available_apps": "Dostupne aplikacije",
"check_email_reset_password": "Proverite vašu e-poštu. Poslali smo vam link za resetovanje lozinke.",
"finish": "Završi",
"few_sentences_about_yourself": "Par rečenica o vama. Ovo će se pojaviti na vašoj ličnoj url stranici.",
@@ -404,6 +408,7 @@
"add_time_availability": "Dodaj novi vremenski interval",
"add_an_extra_layer_of_security": "Dodajte dodatni nivo sigurnosti svom nalogu u slučaju da vam je lozinka ukradena.",
"2fa": "Dvofaktorska Autentikacija",
"2fa_disabled": "Dvostruka potvrda identiteta pože biti omogućena samo za potvrdu identiteta putem imejla i lozinke",
"enable_2fa": "Omogući dvofaktorsku autentikaciju",
"disable_2fa": "Onemogući dvofaktorsku autentikaciju",
"disable_2fa_recommendation": "Ako morate da onemogućite 2FA, predlažemo da je omogućite što pre.",
@@ -585,6 +590,20 @@
"minutes": "Minuti",
"round_robin": "Round Robin",
"round_robin_description": "Ciklusirajte sastanke između više članova tima.",
"managed_event": "Upravljani događaj",
"username_placeholder": "korisničko ime",
"managed_event_description": "Kreirajte i distribuirajte veliku količinu tipova događaja članovima tima",
"managed": "Upravljano",
"managed_event_url_clarification": "„korisničko ime“ će biti ispunjeno korisničkim imenom dodeljenog člana",
"assign_to": "Dodelite",
"add_members": "Dodajte članove...",
"count_members_one": "{{count}} član",
"count_members_other": "{{count}} članova",
"no_assigned_members": "Nema dodeljenih članova",
"assigned_to": "Dodeljeno",
"start_assigning_members_above": "Počnite da dodeljujete korisnicima iznad",
"locked_fields_admin_description": "Članovi neće moći da uređuju ovo",
"locked_fields_member_description": "Ova opcija je zaključana od strane administratora tima",
"url": "URL",
"hidden": "Sakriven",
"readonly": "Samo za čitanje",
@@ -736,6 +755,11 @@
"minimum_booking_notice": "Minimalni rok za najavu sastanka",
"slot_interval": "Intervali vremenskih slotova",
"slot_interval_default": "Koristi dužinu događaja (uobičajeno podešavanje)",
"delete_event_type": "Izbriši tip događaja?",
"delete_managed_event_type": "Izbriši upravljani tip događaja?",
"delete_event_type_description": "Niko sa kime ste podelili link neće više moći da rezerviše pomoću njega.",
"delete_managed_event_type_description": "<ul><li>Članovima dodeljenim ovom tipu događaja će takođe biti obrisani njihovi tipovi događaja.</li><li>Niko sa kim su podelili svoj link neće više moći da zakaže pomoću njega.</li></ul>",
"confirm_delete_event_type": "Da, izbriši",
"delete_account": "Izbriši nalog",
"confirm_delete_account": "Da, izbriši nalog",
"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.",
@@ -1126,11 +1150,13 @@
"current_username": "Trenutno korisničko ime",
"example_1": "Primer 1",
"example_2": "Primer 2",
"booking_question_identifier": "Identifikator pitanja o zakazivanju",
"company_size": "Veličina kompanije",
"what_help_needed": "U vezi sa čim vam je potrebna pomoć?",
"variable_format": "Format promenljive",
"webhook_subscriber_url_reserved": "Url adresa Webhook pretplatnika je već definisana",
"custom_input_as_variable_info": "Zanemarite sve specijalne znakove za dodatne oznake unosa (koristite samo slova i brojeve), koristite samo velika slova i zamenite razmake donjim crtama.",
"using_booking_questions_as_variables": "Kako da koristim pitanja o zakazivanju kao promenljivu?",
"download_desktop_app": "Preuzmite aplikaciju za stoni računar",
"set_ping_link": "Podesi Ping vezu",
"rate_limit_exceeded": "Premašeno ograničenje stope",
@@ -1176,6 +1202,7 @@
"start_of_week": "Početak nedelje",
"recordings_title": "Snimci",
"recording": "Snimanje",
"happy_scheduling": "Srećno planiranje",
"select_calendars": "Izaberite kalendare koje želite da proverite da li imaju konflikta da biste sprečili dvostruka zakazivanja.",
"check_for_conflicts": "Proverite konflikte",
"view_recordings": "Pregledaj snimke",
@@ -1213,6 +1240,7 @@
"impersonation": "Predstavljanje kao",
"impersonation_description": "Podešavanja za upravljanje prijavljivanjem na nalog u ime korisnika",
"users": "Korisnici",
"user": "Korisnik",
"profile_description": "Upravljajte podešavanjima vašeg {{appName}} profila",
"users_description": "Ovde možete pronaći spisak svih korisnika",
"users_listing": "Spisak korisnika",
@@ -1253,6 +1281,8 @@
"download_responses": "Preuzmi odgovore",
"download_responses_description": "Preuzmite sve odgovore iz obrasca u CSV formatu.",
"download": "Preuzmi",
"download_recording": "Preuzmi snimak",
"recording_from_your_recent_call": "Snimak vašeg nedavnog poziva na Cal.com je spreman za preuzimanje",
"create_your_first_form": "Kreirajte vaš prvi formular",
"create_your_first_form_description": "Sa formularima za rutiranje možete postavljati kvalifikaciona pitanja i usmeravati ih do prave osobe ili tipa događaja.",
"create_your_first_webhook": "Kreirajte vaš prvi Webhook",
@@ -1289,6 +1319,15 @@
"exchange_authentication_standard": "Osnovna potvrda identiteta",
"exchange_authentication_ntlm": "NTLM potvrda identiteta",
"exchange_compression": "GZip kompresija",
"exchange_version": "Verzija za razmenu",
"exchange_version_2007_SP1": "2007. SP1",
"exchange_version_2010": "2010.",
"exchange_version_2010_SP1": "2010. SP1",
"exchange_version_2010_SP2": "2010. SP2",
"exchange_version_2013": "2013.",
"exchange_version_2013_SP1": "2013. SP1",
"exchange_version_2015": "2015.",
"exchange_version_2016": "2016.",
"routing_forms_description": "Možete da vidite sve formulare i rute koje ste kreirali ovde.",
"routing_forms_send_email_owner": "Pošaljite imejl vlasniku",
"routing_forms_send_email_owner_description": "Pošaljite imejl vlasniku kada pošaljete obrazac",
@@ -1343,6 +1382,7 @@
"add_limit": "Dodajte ograničenje",
"team_name_required": "Ime tima je potrebno",
"show_attendees": "Podelite informacije o učesnicima između gostiju",
"how_booking_questions_as_variables": "Kako da koristite pitanja o zakazivanju kao promenljivu?",
"format": "Format",
"uppercase_for_letters": "Koristite velika slova za sva slova",
"replace_whitespaces_underscores": "Zamenite prazna mesta donjom crtom",
@@ -1357,6 +1397,7 @@
"billing_help_title": "Treba li vam još nešto?",
"billing_help_description": "Ako vam treba pomoć sa naplatom, naš tim podrške je tu da pomogne.",
"billing_help_cta": "Obratite se podršci",
"ignore_special_characters_booking_questions": "Ignorišite specijalne znakove u vašim identifikatorima pitanja o zakazivanju. Koristite samo slova i brojeve",
"retry": "Pokušajte ponovo",
"fetching_calendars_error": "Došlo je do problema prilikom dobavljanja vaših kalendara. <1>Pokušajte ponovo</1> ili se obratite korisničkoj podršci.",
"calendar_connection_fail": "Povezivanje sa kalendarom nije uspelo",
@@ -1439,11 +1480,17 @@
"fixed_round_robin": "Fiksno kružno dodeljivanje",
"add_one_fixed_attendee": "Dodajte jednog fiksnog učesnika i onda rotirajte ostale učesnike.",
"calcom_is_better_with_team": "Cal.com je bolji uz timove",
"the_calcom_team": "Cal.com tim",
"add_your_team_members": "Dodajte članove vašeg tima vašim 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",
"duration_limit_reached": "Dostignuta je granica trajanja 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}}",
"event_replaced_notice": "Administrator je zamenio jedan od vaših tipova događaja",
"email_subject_slug_replacement": "Administrator tima je zamenio vaš događaj /{{slug}}",
"email_body_slug_replacement_notice": "Administrator iz <strong>{{teamName}}</strong> tima je zamenio vaš tip događaja <strong>{{slug}}</strong> upravljanim tipom događaja koji oni kontrolišu.",
"email_body_slug_replacement_info": "Vaš link će nastaviti da funkcioniše, ali neka od njegovih podešavanja su se možda promenila. Možete da ih pregledate u tipovima događaja.",
"email_body_slug_replacement_suggestion": "Ako imate bilo kakvih pitanja u vezi sa tipom događaja, obratite se svom administratoru.<br /><br />Srećno planiranje, <br />Cal.com tim",
"disable_payment_app": "Administrator je onemogućio {{appName}}, što utiče na vaš tip događaja {{title}}. Učesnici još uvek mogu da zakažu ovaj tip događaja, ali od njih 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": "Učesnici još uvek mogu da zakažu ovaj tip događaja, ali od njih 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}}.",
@@ -1492,6 +1539,7 @@
"date_overrides_update_btn": "Ažuriraj zamenu",
"event_type_duplicate_copy_text": "{{slug}}-kopija",
"set_as_default": "Postavi kao podrazumevano",
"hide_eventtype_details": "Sakrij detalje tipa događaja",
"show_navigation": "Prikaži navigaciju",
"hide_navigation": "Sakrij navigaciju",
"verification_code_sent": "Verifikacioni kod je poslat",
@@ -1505,6 +1553,7 @@
"create_your_first_team_webhook_description": "Napravite svoj prvi webhook za ovaj tip timskog događaja",
"create_webhook_team_event_type": "Napravite webhook za ovaj tip timskog događaja",
"disable_success_page": "Onemogući stranicu Uspeh (radi samo ako imate URL za preusmeravanje)",
"invalid_admin_password": "Vi ste administrator ali nemate lozinku koja je duga najmanje 15 znakova ili još uvek nemate dvostruku potvrdu identiteta",
"change_password_admin": "Promenite lozinku da biste dobili pristup administratora",
"username_already_taken": "Korisničko ime je zauzeto",
"assignment": "Dodeljivanje",
@@ -1537,6 +1586,7 @@
"ee_enterprise_license": "“/ee” Licenca za preduzeća",
"enterprise_booking_fee": "Već od {{enterprise_booking_fee}}/mesečno",
"enterprise_license_includes": "Sve za komercijalnu upotrebu",
"no_need_to_keep_your_code_open_source": "Nije potrebno da vaš kôd bude otvoren",
"repackage_rebrand_resell": "Prepakujte, rebrendirajte i lako ponovo prodajte",
"a_vast_suite_of_enterprise_features": "Ogroman izbor funkcija za preduzeća",
"free_license_fee": "0,00 $/mesečno",
@@ -1598,6 +1648,7 @@
"default_app_link_title": "Podesite podrazumevani link aplikacije",
"default_app_link_description": "Podešavanje podrazumevanog linka aplikacije omogućava novokreiranim tipovima događaja da koriste link aplikacije koji ste postavili.",
"change_default_conferencing_app": "Postavi kao podrazumevano",
"organizer_default_conferencing_app": "Podrazumevana aplikacija organizatora",
"under_maintenance": "Ne radi zbog održavanja",
"under_maintenance_description": "Tim {{appName}} izvodi zakazano održavanje. Ako imate pitanja, obratite se korisničkoj podršci.",
"event_type_seats": "{{numberOfSeats}} mesta",
@@ -1612,6 +1663,7 @@
"not_enough_seats": "Nema dovoljno mesta",
"form_builder_field_already_exists": "Polje sa ovim imenom već postoji",
"form_builder_field_add_subtitle": "Prilagodite pitanja postavljana na stranici za zakazivanje",
"show_on_booking_page": "Prikaži na stranici zakazivanja",
"get_started_zapier_templates": "Započnite sa Zapier predlošcima",
"team_is_unpublished": "{{team}} više nije objavljen",
"team_is_unpublished_description": "Ova veza tima više nije dostupna. Obratite se vlasniku tima ili ih zamolite da ga objave.",
@@ -1654,12 +1706,39 @@
"can_you_try_again": "Možete li da pokušate sa drugim terminom?",
"verify": "Verifikuj",
"timezone_variable": "Vremenska zona",
"timezone_info": "Vremenska zona primaoca",
"event_end_time_variable": "Vreme završetka događaja",
"event_end_time_info": "Vreme završetka događaja",
"cancel_url_variable": "URL za otkazivanje",
"cancel_url_info": "URL za otkazivanje zakazivanja",
"reschedule_url_variable": "URL za promenu termina",
"reschedule_url_info": "URL za promenu termina",
"invalid_event_name_variables": "U nazivu vašeg događaja se nalazi nevažeća promenljiva",
"select_all": "Izaberite sve",
"default_conferencing_bulk_title": "Masovno ažuriranje postojećih vrsti događaja",
"members_default_schedule": "Podrazumevani raspored članova",
"set_by_admin": "Postavio administrator tima",
"members_default_location": "Podrazumevana lokacija članova",
"members_default_schedule_description": "Koristićemo podrazumevani raspored dostupnosti za svakog člana. Oni će moći da ga uređuju ili promene.",
"requires_at_least_one_schedule": "Potrebno je da imate barem jedan raspored",
"default_conferencing_bulk_description": "Ažuriranje lokacija za izabrane tipove događaja",
"locked_for_members": "Zaključano za članove",
"locked_apps_description": "Članovi će moći da vide aktivne aplikacije, ali neće moći da uređuju bilo kakva podešavanja aplikacije",
"locked_webhooks_description": "Članovi će moći da vide aktivne webhook-ove, ali neće moći da uređuju bilo kakva podešavanja webhook-ova",
"locked_workflows_description": "Članovi će moći da vide aktivne radne tokove, ali neće moći da uređuju bilo kakva podešavanja radnih tokova",
"locked_by_admin": "Zaključao administrator",
"app_not_connected": "Niste povezali {{appName}} nalog.",
"connect_now": "Povežite odmah",
"managed_event_dialog_confirm_button_one": "Zameni i obavesti {{count}} člana",
"managed_event_dialog_confirm_button_other": "Zameni i obavesti {{count}} članova",
"managed_event_dialog_title_one": "URL /{{slug}} već postoji za {{count}} člana. Da li želite da ga zamenite?",
"managed_event_dialog_title_other": "URL /{{slug}} već postoji za {{count}} članova. Da li želite da ga zamenite?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> već koristi <strong>/{{slug}}</strong> URL.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> već koriste <string>/{{slug}}</strong> URL.",
"managed_event_dialog_clarification": "Ako izaberete da ga zamenite, obavestićemo ih. Vratite se i uklonite ih ako ne želite da zamenite postojeće.",
"review_event_type": "Pregledajte tip događaja",
"looking_for_more_analytics": "Tražite još analitike?",
"looking_for_more_insights": "Tražite još uvida?",
"add_filter": "Dodajte filter",
"select_user": "Izaberite korisnika",
"select_event_type": "Izaberite tip događaja",
@@ -1675,5 +1754,40 @@
"events_rescheduled": "Pomereni događaji",
"from_last_period": "iz prošlog perioda",
"from_to_date_period": "Od: {{startDate}} Do: {{endDate}}",
"event_trends": "Trendovi događaja"
"analytics_for_organisation": "Uvidi",
"subtitle_analytics": "Saznajte više o aktivnosti vašeg tima",
"redirect_url_warning": "Dodavanje preusmeravanja će onemogućiti stranicu uspeha. Uverite se da spomenete „Zakazivanje potvrđeno“ na vašoj prilagođenoj stranici uspeha.",
"event_trends": "Trendovi događaja",
"clear_filters": "Izbriši filtere",
"hold": "Zadrži",
"on_booking_option": "Sakupite plaćanje za zakazivanje",
"hold_option": "Naplatite nadoknadu za izostanak",
"card_held": "Karta zadržana",
"charge_card": "Naplati karticu",
"card_charged": "Kartica naplaćena",
"no_show_fee_amount": "{{amount, currency}} nadoknada za izostanak",
"no_show_fee": "Nadoknada za izostanak",
"submit_card": "Pošaljite karticu",
"submit_payment_information": "Pošaljite informacije o plaćanju",
"meeting_awaiting_payment_method": "Vaš sastanak čeka na način plaćanja",
"no_show_fee_charged_email_subject": "Nadoknada za izostanak u iznosu od {{amount, currency}} je naplaćena za {{title}} dana {{date}}",
"no_show_fee_charged_text_body": "Naplaćena je naknada za izostanak",
"no_show_fee_charged_subtitle": "Naknada za izostanak u iznosu od {{amount, currency}} je naplaćena za sledeći događaj",
"error_charging_card": "Došlo je do greške prilikom naplate naknade za izostanak. Pokušajte ponovo kasnije.",
"collect_no_show_fee": "Sakupite naknadu za izostanak",
"no_show_fee_charged": "Naplaćena je naknada za izostanak",
"insights": "Uvidi",
"testing_workflow_info_message": "Kada testirate ovaj radni tok, imajte na umu da imejlovi i SMS-ovi mogu da budu zakazani najmanje 1 sat unapred",
"insights_no_data_found_for_filter": "Nisu pronađeni podaci za izabrani filter ili izabrane datume.",
"acknowledge_booking_no_show_fee": "Jasno mi je da će mi biti naplaćena naknada za izostanak putem kartice u iznosu od {{amount, currency}} ukoliko ne dođem na ovaj događaj.",
"card_details": "Informacije o kartici",
"seats_and_no_show_fee_error": "Omogućavanje mesta i naplata naknade za izostanak trenutno nije moguće",
"complete_your_booking": "Završite svoje zakazivanje",
"complete_your_booking_subject": "Završite svoje zakazivanje: {{title}} dana {{date}}",
"currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "Upravo ćete naplatiti polazniku {{amount, currency}}. Jeste li sigurni da želite da nastavite?",
"charge_attendee": "Naplatite polazniku {{amount, currency}}",
"payment_app_commission": "Zahtevajte plaćanje ({{paymentFeePercentage}}% + {{fee, currency}} provizija po transakciji)",
"email_invite_team": "{{email}} je pozvan",
"image_size_limit_exceed": "Otpremljena slika ne sme da prevazilazi ograničenje od 5mb"
}
+137 -2
View File
@@ -1,4 +1,5 @@
{
"identity_provider": "Identitetsleverantör",
"trial_days_left": "Du har $t(day, {\"count\": {{days}} }) kvar på din PRO-provperiod",
"day_one": "{{count}} dag",
"day_other": "{{count}} dagar",
@@ -69,6 +70,8 @@
"event_awaiting_approval_subject": "Inväntar godkännande: {{title}} den {{date}}",
"event_still_awaiting_approval": "En bokning väntar fortfarande på ditt godkännande",
"booking_submitted_subject": "Bokning skickad: {{title}} {{date}}",
"download_recording_subject": "Ladda ner inspelning: {{title}} {{date}}",
"download_your_recording": "Ladda ner din inspelning",
"your_meeting_has_been_booked": "Ditt möte har bokats",
"event_type_has_been_rescheduled_on_time_date": "Din {{title}} har ändrats till {{date}}.",
"event_has_been_rescheduled": "Uppdatering - Din bokning har blivit omplanerad",
@@ -224,6 +227,7 @@
"done": "Klar",
"all_done": "Allt klart!",
"all_apps": "Alla",
"available_apps": "Tillgängliga appar",
"check_email_reset_password": "Kolla din e-post. Vi har skickat en länk till dig för att återställa ditt lösenord.",
"finish": "Slutför",
"few_sentences_about_yourself": "Några meningar om dig själv. Detta kommer att visas på din personliga webbsida.",
@@ -404,6 +408,7 @@
"add_time_availability": "Lägg till ny tidslucka",
"add_an_extra_layer_of_security": "Lägg till ett extra säkerhetslager till ditt konto om ditt lösenord blir stulet.",
"2fa": "Tvåfaktorsautentisering",
"2fa_disabled": "Tvåfaktorsautentisering kan endast aktiveras för e-post- och lösenordsautentisering",
"enable_2fa": "Aktivera tvåfaktorsautentisering",
"disable_2fa": "Inaktivera tvåfaktorsautentisering",
"disable_2fa_recommendation": "Om du behöver inaktivera 2FA rekommenderar vi att du återaktiverar den så snart som möjligt.",
@@ -433,7 +438,7 @@
"password_hint_min": "Minst 7 tecken",
"password_hint_admin_min": "Minst 15 tecken",
"password_hint_num": "Innehåller minst 1 siffra",
"max_limit_allowed_hint": "Måste vara {{limit}} eller färre tecken långt",
"max_limit_allowed_hint": "Måste innehålla {{limit}} eller färre tecken",
"invalid_password_hint": "Lösenordet måste innehålla minst {{passwordLength}} tecken och har minst en siffra samt en blandning av versaler och gemener",
"incorrect_password": "Lösenordet är felaktigt.",
"incorrect_username_password": "Felaktigt användarnamn eller lösenord.",
@@ -585,6 +590,20 @@
"minutes": "Minuter",
"round_robin": "Tur och ordning",
"round_robin_description": "Variera möten mellan olika teammedlemmar.",
"managed_event": "Hanterad händelse",
"username_placeholder": "användarnamn",
"managed_event_description": "Skapa och distribuera evenemangstyper i bulk till teammedlemmar",
"managed": "Hanterad",
"managed_event_url_clarification": "\"användarnamn\" kommer att fyllas i med användarnamnet för de medlemmar som tilldelats",
"assign_to": "Tilldela till",
"add_members": "Lägg till medlemmar...",
"count_members_one": "{{count}} medlem",
"count_members_other": "{{count}} medlemmar",
"no_assigned_members": "Inga tilldelade medlemmar",
"assigned_to": "Tilldelad till",
"start_assigning_members_above": "Börja tilldela medlemmar ovan",
"locked_fields_admin_description": "Medlemmar kommer inte att kunna redigera detta",
"locked_fields_member_description": "Det här alternativet låstes av teamadministratören",
"url": "Webbadress",
"hidden": "Dold",
"readonly": "Skrivskyddad",
@@ -736,6 +755,11 @@
"minimum_booking_notice": "Senaste tid för att boka",
"slot_interval": "Tid mellan bokningar",
"slot_interval_default": "Använd händelsens längd (standard)",
"delete_event_type": "Radera händelsetyp?",
"delete_managed_event_type": "Radera hanterad händelsetyp?",
"delete_event_type_description": "Alla som du har delat den här länken med kommer inte längre att kunna boka med hjälp av den.",
"delete_managed_event_type_description": "<ul><li>Medlemmar som tilldelats denna händelsetyp kommer också att få sina händelsetyper raderade.</li><li>Alla som de har delat sin länk med kommer inte längre att kunna boka med den.</li></ul>",
"confirm_delete_event_type": "Ja, radera",
"delete_account": "Radera konto",
"confirm_delete_account": "Ja, radera konto",
"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.",
@@ -1126,11 +1150,13 @@
"current_username": "Nuvarande användarnamn",
"example_1": "Exempel 1",
"example_2": "Exempel 2",
"booking_question_identifier": "Bokningsfrågeidentifierare",
"company_size": "Företagets storlek",
"what_help_needed": "Vad behöver du hjälp med?",
"variable_format": "Variabelformat",
"webhook_subscriber_url_reserved": "Webhook-prenumerantens url är redan definierad",
"custom_input_as_variable_info": "Ignorera alla specialtecken i etiketten för ytterligare indata (använd endast bokstäver och siffror), använd versaler för alla bokstäver och ersätt blanktecken med understreck.",
"using_booking_questions_as_variables": "Hur använder jag bokningsfrågor som variabler?",
"download_desktop_app": "Ladda ned skrivbordsappen",
"set_ping_link": "Ange Ping-länk",
"rate_limit_exceeded": "Betygsgränsen överskriden",
@@ -1176,6 +1202,7 @@
"start_of_week": "Början av veckan",
"recordings_title": "Inspelningar",
"recording": "Inspelning",
"happy_scheduling": "Glad schemaläggning",
"select_calendars": "Välj vilka kalendrar du vill kontrollera för konflikter för att förhindra dubbelbokningar.",
"check_for_conflicts": "Kontrollera om konflikter",
"view_recordings": "Visa inspelningar",
@@ -1213,6 +1240,7 @@
"impersonation": "Imitering",
"impersonation_description": "Inställningar för att hantera användarpersonifiering",
"users": "Användare",
"user": "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",
@@ -1253,6 +1281,8 @@
"download_responses": "Ladda ned svar",
"download_responses_description": "Ladda ned alla svar till ditt formulär i CSV-format.",
"download": "Ladda ned",
"download_recording": "Ladda ner inspelning",
"recording_from_your_recent_call": "En inspelning från ditt senaste samtal på Cal.com är redo för nedladdning",
"create_your_first_form": "Skapa ditt första formulär",
"create_your_first_form_description": "Med Dirigeringsformulär kan du ställa kvalificerade frågor och dirigera till rätt person eller händelsetyp.",
"create_your_first_webhook": "Skapa din första webhook",
@@ -1289,6 +1319,15 @@
"exchange_authentication_standard": "Grundläggande autentisering",
"exchange_authentication_ntlm": "NTLM-autentisering",
"exchange_compression": "GZip-komprimering",
"exchange_version": "Exchange-version",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Du kan se alla former och rutter som du har skapat här.",
"routing_forms_send_email_owner": "Skicka e-post till ägare",
"routing_forms_send_email_owner_description": "Skickar ett e-postmeddelande till ägaren när formuläret skickas",
@@ -1343,6 +1382,7 @@
"add_limit": "Lägg till gräns",
"team_name_required": "Teamnamn krävs",
"show_attendees": "Dela deltagarinformation mellan gäster",
"how_booking_questions_as_variables": "Hur används bokningsfrågor som variabler?",
"format": "Formatera",
"uppercase_for_letters": "Använd versaler för alla bokstäver",
"replace_whitespaces_underscores": "Ersätt blanktecken med understreck",
@@ -1357,6 +1397,7 @@
"billing_help_title": "Behöver du något annat?",
"billing_help_description": "Om du behöver mer hjälp med fakturering finns vårt supportteam här för att hjälpa till.",
"billing_help_cta": "Kontakta support",
"ignore_special_characters_booking_questions": "Ignorera specialtecken i din bokningsfrågeidentifierare. Använd endast bokstäver och siffror",
"retry": "Försök igen",
"fetching_calendars_error": "Det gick inte att hämta dina kalendrar. <1>Försök igen</1> eller kontakta kundtjänst.",
"calendar_connection_fail": "Det gick inte att ansluta kalender",
@@ -1439,11 +1480,17 @@
"fixed_round_robin": "Fast Round Robin",
"add_one_fixed_attendee": "Lägg till en fast deltagare och Round Robin för ett antal deltagare.",
"calcom_is_better_with_team": "Cal.com är bättre med team",
"the_calcom_team": "Cal.com-teamet",
"add_your_team_members": "Lägg till teammedlemmar i dina händelsetyper. Använd kollektiv schemaläggning för att inkludera alla eller hitta den lämpligaste personen med Round Robin-schemaläggning.",
"booking_limit_reached": "Bokningsgränsen för denna händelsetyp har uppnåtts",
"duration_limit_reached": "Varaktighetsgrä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}}",
"event_replaced_notice": "En administratör har ersatt en av dina händelsetyper",
"email_subject_slug_replacement": "En teamadministratör har ersatt din händelse /{{slug}}",
"email_body_slug_replacement_notice": "En administratör i <strong>{{teamName}}</strong>-teamet har ersatt din händelsetyp <strong>/{{slug}}</strong> med en hanterad händelsetyp som de kontrollerar.",
"email_body_slug_replacement_info": "Din länk kommer att fortsätta fungera, men vissa inställningar för den kan ha ändrats. Du kan granska den i händelsetyper.",
"email_body_slug_replacement_suggestion": "Om du har några frågor om händelsetypen, kontakta din administratör.<br /><br />Glad schemaläggning, <br />Cal.com-teamet",
"disable_payment_app": "Administratören har inaktiverat {{appName}} vilket påverkar din händelsetyp {{title}}. Deltagarna kan fortfarande boka den här händelsetypen, men de uppmanas inte att betala. Du kan dölja händelsetypen för att förhindra detta tills din administratör återaktiverar betalningsmetoden.",
"payment_disabled_still_able_to_book": "Deltagarna kan fortfarande boka den här händelsetypen, men de uppmanas inte 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}}.",
@@ -1492,6 +1539,7 @@
"date_overrides_update_btn": "Uppdatera åsidosättning",
"event_type_duplicate_copy_text": "{{slug}}-kopia",
"set_as_default": "Ange som standard",
"hide_eventtype_details": "Dölj information om händelse",
"show_navigation": "Visa navigering",
"hide_navigation": "Dölj navigering",
"verification_code_sent": "Verifieringskod har skickats",
@@ -1505,6 +1553,7 @@
"create_your_first_team_webhook_description": "Skapa din första webhook för denna teamhändelsetyp",
"create_webhook_team_event_type": "Skapa en webhook för denna teamhändelsetyp",
"disable_success_page": "Inaktivera framgångssida (fungerar bara om du har en omdirigerings-URL)",
"invalid_admin_password": "Du är administratör men du har inte ett lösenord med minst 15 tecken eller ingen 2FA än",
"change_password_admin": "Ändra lösenord för att få administratörsåtkomst",
"username_already_taken": "Användarnamnet används redan",
"assignment": "Tilldelning",
@@ -1537,6 +1586,7 @@
"ee_enterprise_license": "\"/ee\" Enterprise-licens",
"enterprise_booking_fee": "Från {{enterprise_booking_fee}}/månad",
"enterprise_license_includes": "Allt för ett kommersiellt användningsfall",
"no_need_to_keep_your_code_open_source": "Inget behov av att behålla din kod som öppen källkod",
"repackage_rebrand_resell": "Lätt att ompaketera, omprofilera och sälja vidare",
"a_vast_suite_of_enterprise_features": "En omfattande uppsättning Enterprise-funktioner",
"free_license_fee": "0,00 USD/månad",
@@ -1598,6 +1648,7 @@
"default_app_link_title": "Skapa en standardapplänk",
"default_app_link_description": "Om du skapar en standardapplänk kan alla händelsetyper som nyligen skapats använda den applänk som du har angett.",
"change_default_conferencing_app": "Ange som standard",
"organizer_default_conferencing_app": "Arrangörens standardapp",
"under_maintenance": "Nere för underhåll",
"under_maintenance_description": "{{appName}}-teamet genomför planerat underhåll. Om du har några frågor kan du kontakta supporten.",
"event_type_seats": "{{numberOfSeats}} platser",
@@ -1612,6 +1663,7 @@
"not_enough_seats": "Inte tillräckligt med platser",
"form_builder_field_already_exists": "Ett fält med detta namn finns redan",
"form_builder_field_add_subtitle": "Anpassa de frågor som ställs på bokningssidan",
"show_on_booking_page": "Visa på bokningssidan",
"get_started_zapier_templates": "Kom igång med Zapier-mallar",
"team_is_unpublished": "{{team}} har avpublicerats",
"team_is_unpublished_description": "Den här teamlänken är för närvarande inte tillgänglig. Kontakta teamets ägare eller be dem publicera den.",
@@ -1635,6 +1687,14 @@
"add_1_option_per_line": "Lägg till ett alternativ per rad",
"select_a_router": "Välj en omdirigering",
"add_a_new_route": "Lägg till ny omdirigering",
"make_informed_decisions": "Ta välgrundade beslut med Insights",
"make_informed_decisions_description": "Vår instrumentpanel i Insights visar all aktivitet i ditt team och visar trender som gör det möjligt att schemalägga teamet och fatta beslut på ett bättre sätt.",
"view_bookings_across": "Visa bokningar för alla medlemmar",
"view_bookings_across_description": "Se vem som får flest bokningar och se till att du får den bästa fördelningen i ditt team",
"identify_booking_trends": "Identifiera bokningstrender",
"identify_booking_trends_description": "Se vilka tider i veckan och vilka tider under dagen som är populära för dina bokare",
"spot_popular_event_types": "Hitta populära händelsetyper",
"spot_popular_event_types_description": "Se vilka av dina händelsetyper som får flest klick och bokningar",
"no_responses_yet": "Inga svar ännu",
"this_will_be_the_placeholder": "Det här blir platshållaren",
"this_meeting_has_not_started_yet": "Det här mötet har inte startat ännu",
@@ -1646,8 +1706,83 @@
"can_you_try_again": "Kan du försöka igen med en annan tid?",
"verify": "Verifiera",
"timezone_variable": "Tidszon",
"timezone_info": "Tidszonen för den person som tar emot",
"event_end_time_variable": "Händelsens sluttid",
"event_end_time_info": "Händelsens sluttid",
"cancel_url_variable": "URL för att avbryta",
"cancel_url_info": "Webbadressen fö ratt avbryta bokningen",
"reschedule_url_variable": "URL för ombokning",
"reschedule_url_info": "Webbadressen för att ändra bokningen",
"invalid_event_name_variables": "Det finns en ogiltig variabel i ditt händelsenamn",
"select_all": "Välj alla",
"default_conferencing_bulk_title": "Uppdatera befintliga händelsetyper i bulk",
"default_conferencing_bulk_description": "Uppdatera platserna för de valda händelsetyperna"
"members_default_schedule": "Medlemmens standardschema",
"set_by_admin": "Ställ in av teamadministratör",
"members_default_location": "Medlemmens förvalda plats",
"members_default_schedule_description": "Vi kommer att använda varje medlems standardschema för tillgänglighet. De kommer att kunna redigera eller ändra det.",
"requires_at_least_one_schedule": "Du måste ha minst ett schema",
"default_conferencing_bulk_description": "Uppdatera platserna för de valda händelsetyperna",
"locked_for_members": "Låst för medlemmar",
"locked_apps_description": "Medlemmarna kommer att kunna se de aktiva apparna, men de kommer inte att kunna ändra appinställningarna",
"locked_webhooks_description": "Medlemmarna kommer att kunna se aktiva webhooks men inte kunna redigera inställningar för webhooks",
"locked_workflows_description": "Medlemmarna kommer att kunna se de aktiva arbetsflödena, men de kommer inte att kunna ändra några arbetsflödesinställningar",
"locked_by_admin": "Låst av administratör",
"app_not_connected": "Du har inte anslutit ett {{appName}}-konto.",
"connect_now": "Anslut nu",
"managed_event_dialog_confirm_button_one": "Ersätt och meddela {{count}} medlem",
"managed_event_dialog_confirm_button_other": "Ersätt och meddela {{count}} medlemmar",
"managed_event_dialog_title_one": "Webbadressen /{{slug}} finns redan för {{count}} medlem. Vill du ersätta den?",
"managed_event_dialog_title_other": "Webbadressen /{{slug}} finns redan för {{count}} medlemmar. Vill du ersätta den?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> använder redan webbadressen <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> använder redan webbadressen <string>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "Om du väljer att byta ut den kommer vi att meddela dem. Gå tillbaka och ta bort dem om du inte vill skriva över den.",
"review_event_type": "Granska händelsetyp",
"looking_for_more_analytics": "Vill du ha fler analyser?",
"looking_for_more_insights": "Vill du ha fler insikter?",
"add_filter": "Lägg till filter",
"select_user": "Välj användare",
"select_event_type": "Välj händelsetyp",
"select_date_range": "Välj datumintervall",
"popular_events": "Populära händelser",
"no_event_types_found": "Inga händelsetyper hittade",
"average_event_duration": "Genomsnittlig händelselängd",
"most_booked_members": "Mest bokade medlemmar",
"least_booked_members": "Minst bokade medlemmar",
"events_created": "Skapade händelser",
"events_completed": "Slutförda händelser",
"events_cancelled": "Händelser avbrutna",
"events_rescheduled": "Händelser ombokade",
"from_last_period": "från senaste perioden",
"from_to_date_period": "Från: {{startDate}} till: {{endDate}}",
"analytics_for_organisation": "Insikter",
"subtitle_analytics": "Läs mer om ditt teams aktivitet",
"redirect_url_warning": "Att lägga till en omdirigering kommer att inaktivera framgångssidan. Se till att nämna \"Bokning bekräftad\" på din anpassade framgångssida.",
"event_trends": "Händelsetrender",
"clear_filters": "Rensa filter",
"hold": "Vänta",
"on_booking_option": "Samla in betalning vid bokning",
"hold_option": "Ta ut en avgift för utebliven ankomst",
"card_held": "Kort som innehas",
"charge_card": "Debitera kort",
"card_charged": "Kort debiterat",
"no_show_fee_amount": "{{amount, currency}} i avgift för utebliven ankomst",
"no_show_fee": "Avgift för utebliven ankomst",
"submit_card": "Använd kort",
"submit_payment_information": "Ange betalningsinformation",
"meeting_awaiting_payment_method": "Ditt möte väntar på en betalningsmetod",
"no_show_fee_charged_email_subject": "Avgift för utebliven ankomst på {{amount, currency}} debiteras för {{title}} {{date}}",
"no_show_fee_charged_text_body": "Avgift för utebliven ankomst debiterades",
"no_show_fee_charged_subtitle": "Avgift för utebliven ankomst på {{amount, currency}} debiterades för följande händelse",
"error_charging_card": "Något gick fel när avgiften för utebliven ankomst debiterades. Försök igen senare.",
"collect_no_show_fee": "Samla in avgift för utebliven ankomst",
"no_show_fee_charged": "Avgift för utebliven ankomst debiterades",
"insights": "Insikter",
"testing_workflow_info_message": "När det här arbetsflödet testas, var medveten om att e-postmeddelanden och SMS endast kan schemaläggas minst en timme i förväg",
"insights_no_data_found_for_filter": "Inga data hittades för valda filter eller valda datum.",
"acknowledge_booking_no_show_fee": "Jag bekräftar att om jag inte deltar i händelsen kommer en avgift på {{amount, currency}} för utebliven ankomst att debiteras mitt kort.",
"card_details": "Kortuppgifter",
"seats_and_no_show_fee_error": "För närvarande går det inte att aktivera platser och ta ut en avgift för utebliven ankomst",
"complete_your_booking": "Slutför din bokning",
"complete_your_booking_subject": "Slutför din bokning: {{title}} {{date}}",
"email_invite_team": "{{email}} har bjudits in"
}
+153 -18
View File
@@ -1,4 +1,5 @@
{
"identity_provider": "Постачальник посвідчень",
"trial_days_left": "У вас ще $t(day, {\"count\": {{days}} }) користування пробною PRO-версією",
"day_one": "{{count}} день",
"day_other": "{{count}} д.",
@@ -69,6 +70,8 @@
"event_awaiting_approval_subject": "Очікування на схвалення: {{title}}, {{date}}",
"event_still_awaiting_approval": "Захід досі чекає на ваше схвалення",
"booking_submitted_subject": "Бронювання надіслано: {{title}}, {{date}}",
"download_recording_subject": "Завантажити запис: {{title}} о {{date}}",
"download_your_recording": "Завантажте запис",
"your_meeting_has_been_booked": "Вашу нараду заброньовано",
"event_type_has_been_rescheduled_on_time_date": "Ваш {{title}} перенесено на {{date}}.",
"event_has_been_rescheduled": "Оновлено – ваш захід перенесено",
@@ -224,6 +227,7 @@
"done": "Готово",
"all_done": "Усе готово!",
"all_apps": "Усі",
"available_apps": "Доступні додатки",
"check_email_reset_password": "Перевірте електронну пошту. Ми надіслали вам посилання для скидання пароля.",
"finish": "Готово",
"few_sentences_about_yourself": "Кілька речень про вас. Ця інформація з’явиться на сторінці за вашою URL-адресою.",
@@ -404,6 +408,7 @@
"add_time_availability": "Додати нове часове вікно",
"add_an_extra_layer_of_security": "Підвищте рівень захисту свого облікового запису на випадок, якщо у вас викрадуть пароль.",
"2fa": "Двоетапна автентифікація",
"2fa_disabled": "Двоетапну автентифікацію можна ввімкнути лише для автентифікації за допомогою ел. пошти й пароля",
"enable_2fa": "Увімкнути двоетапну автентифікацію",
"disable_2fa": "Вимкнути двоетапну автентифікацію",
"disable_2fa_recommendation": "Якщо вам потрібно вимкнути двоетапну перевірку, рекомендуємо потім увімкнути її якомога швидше.",
@@ -585,6 +590,20 @@
"minutes": "Хвилини",
"round_robin": "Ротація",
"round_robin_description": "Кілька учасників команди призначаються для нарад циклічно й по черзі.",
"managed_event": "Керований захід",
"username_placeholder": "ім’я користувача",
"managed_event_description": "Створюйте й надсилайте типи заходів усім учасникам команди пакетом",
"managed": "Керований",
"managed_event_url_clarification": "у полі «ім’я користувача» буде вказано імена користувачів призначених учасників",
"assign_to": "Призначити",
"add_members": "Додати учасників…",
"count_members_one": "{{count}} учасник",
"count_members_other": "{{count}} учасники(-ів)",
"no_assigned_members": "Немає призначених учасників",
"assigned_to": "Призначено",
"start_assigning_members_above": "Почніть призначати учасників вище",
"locked_fields_admin_description": "Учасники не зможуть редагувати це",
"locked_fields_member_description": "Адміністратор команди заблокував цю опцію",
"url": "URL",
"hidden": "Приховано",
"readonly": "Тільки читання",
@@ -736,6 +755,11 @@
"minimum_booking_notice": "Мінімальний час до наступного заходу",
"slot_interval": "Інтервали між бронюваннями",
"slot_interval_default": "Використовувати тривалість заходу (за замовчуванням)",
"delete_event_type": "Видалити тип заходу?",
"delete_managed_event_type": "Видалити захід керованого типу?",
"delete_event_type_description": "Користувачі, з якими ви поділилися цим посиланням, більше не зможуть здійснити бронювання з його допомогою.",
"delete_managed_event_type_description": "<ul><li>В учасників, призначених для цього типу заходу, також буде видалено їхні типи заходів.</li><li> Користувачі, з якими вони поділилися своїм посиланням, більше не зможуть здійснити бронювання з його допомогою.</li></ul>",
"confirm_delete_event_type": "Так, видалити",
"delete_account": "Видалити обліковий запис",
"confirm_delete_account": "Так, видалити обліковий запис",
"delete_account_confirmation_message": "Справді видалити обліковий запис {{appName}}? Усі, кому ви надавали посилання на свій обліковий запис, більше не зможуть бронювати ваш час за його допомогою. Усі збережені налаштування буде втрачено.",
@@ -860,7 +884,7 @@
"add_new_calendar": "Додати новий календар",
"set_calendar": "Укажіть, куди додавати нові заходи, коли ваш час бронюють.",
"delete_schedule": "Видалити розклад",
"delete_schedule_description": "Видалення розкладу вилучить його з усіх типів заходів. Цю дію неможливо скасувати.",
"delete_schedule_description": "Видалений розклад буде вилучено з усіх типів заходів. Цю дію неможливо скасувати.",
"schedule_created_successfully": "Розклад «{{scheduleName}}» створено",
"availability_updated_successfully": "Розклад «{{scheduleName}}» оновлено",
"schedule_deleted_successfully": "Розклад видалено",
@@ -1126,11 +1150,13 @@
"current_username": "Поточне ім’я користувача",
"example_1": "Приклад 1",
"example_2": "Приклад 2",
"booking_question_identifier": "Ідентифікатор запитання щодо бронювання",
"company_size": "Розмір компанії",
"what_help_needed": "З чим саме потрібна допомога?",
"variable_format": "Формат змінної",
"webhook_subscriber_url_reserved": "URL-адресу для абонента у вебгуку вже визначено",
"custom_input_as_variable_info": "Усі спеціальні символи в додатковому введеному підписі пропускаються (використовуються тільки літери та цифри), використовуються лише великі літери, пробіли замінюються на підкреслення.",
"using_booking_questions_as_variables": "Як використовувати запитання щодо бронювання як змінні?",
"download_desktop_app": "Завантажити додаток для ПК",
"set_ping_link": "Установити Ping-посилання",
"rate_limit_exceeded": "Перевищено ліміт кількості запитів",
@@ -1176,6 +1202,7 @@
"start_of_week": "Початок тижня",
"recordings_title": "Записи",
"recording": "Запис",
"happy_scheduling": "Щасливого планування",
"select_calendars": "Виберіть, які календарі потрібно перевірити на наявність конфліктів, щоб уникнути подвійних бронювань.",
"check_for_conflicts": "Перевірка конфліктів",
"view_recordings": "Переглянути записи",
@@ -1213,6 +1240,7 @@
"impersonation": "Вхід під іншим іменем",
"impersonation_description": "Налаштування входу під іншим іменем",
"users": "Користувачі",
"user": "Користувач",
"profile_description": "Керуйте налаштуваннями свого профілю {{appName}}",
"users_description": "Тут наведено список усіх користувачів",
"users_listing": "Список користувачів",
@@ -1253,6 +1281,8 @@
"download_responses": "Завантажити відповіді",
"download_responses_description": "Завантажте всі відповіді у свою форму у форматі CSV.",
"download": "Завантажити",
"download_recording": "Завантажити запис",
"recording_from_your_recent_call": "Запис вашого попереднього дзвінка в Cal.com готовий до завантаження",
"create_your_first_form": "Створіть свою першу форму",
"create_your_first_form_description": "Форми переспрямування дають змогу надавати уточнювальні запитання та переходити до відповідної особи або типу заходу.",
"create_your_first_webhook": "Створіть свій перший вебгук",
@@ -1289,6 +1319,15 @@
"exchange_authentication_standard": "Проста автентифікація",
"exchange_authentication_ntlm": "Автентифікація NTLM",
"exchange_compression": "Стиснення GZip",
"exchange_version": "Версія обміну",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Тут можна переглянути всі створені вами форми й переспрямування.",
"routing_forms_send_email_owner": "Надіслати власнику електронний лист",
"routing_forms_send_email_owner_description": "Коли надсилається форма, власник отримує електронний лист",
@@ -1343,6 +1382,7 @@
"add_limit": "Додати ліміт",
"team_name_required": "Назва команди обов’язкова",
"show_attendees": "Поширювати інформацію про учасників серед гостей",
"how_booking_questions_as_variables": "Як використовувати запитання щодо бронювання як змінні?",
"format": "Формат",
"uppercase_for_letters": "Використовувати всі великі літери",
"replace_whitespaces_underscores": "Заміняти пробіли підкресленнями",
@@ -1357,6 +1397,7 @@
"billing_help_title": "Потрібно щось інше?",
"billing_help_description": "Якщо вам потрібна додаткова допомога з виставленням рахунків, наша служба підтримки готова її надати.",
"billing_help_cta": "Звернутися в службу підтримки",
"ignore_special_characters_booking_questions": "Пропускайте спеціальні символи в ідентифікаторі запитання щодо бронювання. Використовуйте лише літери й цифри.",
"retry": "Повторити",
"fetching_calendars_error": "Під час отримання календарів виникла проблема. <1>Повторіть спробу</1> або зверніться в службу підтримки.",
"calendar_connection_fail": "Не вдалося підключитися до календаря",
@@ -1439,11 +1480,17 @@
"fixed_round_robin": "Фіксоване циклічне планування",
"add_one_fixed_attendee": "Додайте одного постійного учасника та циклічно замінюйте кількох інших учасників.",
"calcom_is_better_with_team": "З Cal.com краще працювати в командах",
"the_calcom_team": "Команда Cal.com",
"add_your_team_members": "Додавайте членів своєї команди в типи заходів. Колективне планування дає змогу включати всіх або знаходити найвідповіднішого члена завдяки циклічній ротації.",
"booking_limit_reached": "Для цього типу заходу досягнуто ліміт бронювання",
"duration_limit_reached": "Досягнуто ліміту тривалості для цього типу заходу",
"admin_has_disabled": "Адміністратор вимкнув додаток {{appName}}",
"disabled_app_affects_event_type": "Адміністратор вимкнув додаток {{appName}}, що впливає на ваш тип заходу «{{eventType}}»",
"event_replaced_notice": "Адміністратор замінив один із типів ваших заходів",
"email_subject_slug_replacement": "Адміністратор команди замінив ваш захід /{{slug}}",
"email_body_slug_replacement_notice": "Адміністратор команди <strong>{{teamName}}</strong> замінив ваш тип заходу<strong>/{{slug}}</strong> на керований тип заходу, який він контролює.",
"email_body_slug_replacement_info": "Ваше посилання продовжуватиме працювати, але деякі параметри можуть бути змінені. Дізнайтеся більше в типах подій.",
"email_body_slug_replacement_suggestion": "Якщо у вас виникли запитання щодо типу заходу, зверніться до свого адміністратора.<br /><br />Щасливого планування!<br />Команда Cal.com",
"disable_payment_app": "Адміністратор вимкнув додаток {{appName}}, що впливає на ваш тип заходу «{{title}}». Учасники все одно можуть бронювати події такого типу, але від них не вимагатиметься оплата. Ви можете приховати цей тип заходу, щоб уникнути цього, і дочекатись активації способу оплати адміністратором.",
"payment_disabled_still_able_to_book": "Учасники все одно можуть бронювати події такого типу, але від них не вимагатиметься оплата. Ви можете приховати цей тип заходу, щоб уникнути цього, і дочекатись активації способу оплати адміністратором.",
"app_disabled_with_event_type": "Адміністратор вимкнув додаток {{appName}}, що впливає на ваш тип заходу «{{title}}».",
@@ -1492,6 +1539,7 @@
"date_overrides_update_btn": "Оновити перевизначення",
"event_type_duplicate_copy_text": "{{slug}} (копія)",
"set_as_default": "Установити за замовчуванням",
"hide_eventtype_details": "Приховати інформацію про тип заходу",
"show_navigation": "Показати навігацію",
"hide_navigation": "Приховати навігацію",
"verification_code_sent": "Код перевірки надіслано",
@@ -1505,6 +1553,7 @@
"create_your_first_team_webhook_description": "Створіть свій перший вебгук для цього типу командного заходу",
"create_webhook_team_event_type": "Створити вебгук для цього типу командного заходу",
"disable_success_page": "Вимкнути сторінку, де показано результат бронювання (працює тільки з URL-адресою перенаправлення)",
"invalid_admin_password": "Ви адміністратор, але у вас немає пароля, що містить принаймні 15 символів, або не налаштовано двоетапну автентифікацію",
"change_password_admin": "Змініть пароль, щоб отримати доступ адміністратора",
"username_already_taken": "Таке ім’я користувача вже існує",
"assignment": "Призначення",
@@ -1537,6 +1586,7 @@
"ee_enterprise_license": "“/ee” Ліцензія для плану Enterprise",
"enterprise_booking_fee": "Від {{enterprise_booking_fee}}/міс.",
"enterprise_license_includes": "Усе для комерційного використання",
"no_need_to_keep_your_code_open_source": "Немає потреби залишати код відкритим",
"repackage_rebrand_resell": "Легко здійснювати перепакування, ребрендинг і перепродаж",
"a_vast_suite_of_enterprise_features": "Великий набір корпоративних функцій",
"free_license_fee": "$0,00/міс.",
@@ -1582,48 +1632,50 @@
"available_variables": "Доступні змінні",
"scheduler": "{Scheduler}",
"no_workflows": "Немає робочих процесів",
"change_filter": "Змініть фільтр, щоб побачити особисті та командні робочі процеси.",
"change_filter": "Змініть фільтр, щоб побачити особисті й командні робочі процеси.",
"recommended_next_steps": "Рекомендовані наступні кроки",
"create_a_managed_event": "Створіть подію керованого типу",
"meetings_are_better_with_the_right": "Краще проводити наради з потрібними учасниками команди. Запросіть їх зараз.",
"create_a_one_one_template": "Створіть шаблон «один на один» для типу заходу та розповсюдьте його між учасниками.",
"create_a_one_one_template": "Створіть один шаблон індивідуальної наради для цього типу заходу й розповсюдьте його між учасниками.",
"collective_or_roundrobin": "Колективна або циклічна",
"book_your_team_members": "Забронюйте час усіх учасників команди одночасно за допомогою колективних подій або виберіть потрібну людину за циклічним принципом.",
"event_no_longer_attending_subject": "Більше не відвідує захід «{{title}}» о {{date}}",
"event_no_longer_attending_subject": "Більше не відвідує захід «{{title}}», запланований на {{date}}",
"no_longer_attending": "Ви більше не відвідуєте цей захід",
"attendee_no_longer_attending_subject": "Учасник більше не відвідує захід «{{title}}» о {{date}}",
"attendee_no_longer_attending_subject": "Учасник більше не відвідує захід «{{title}}», запланований на {{date}}",
"attendee_no_longer_attending": "Учасник більше не відвідує ваш захід",
"attendee_no_longer_attending_subtitle": "{{name}} скасував(-ла) участь. Це означає, що на цей час з’явилося вільне місце.",
"create_event_on": "Створити захід в календарі",
"create_event_on": "Створити захід у календарі",
"default_app_link_title": "Установити посилання на додаток за замовчуванням",
"default_app_link_description": "Посилання на додаток за замовчуванням використовуватиметься для всіх новостворених типів подій.",
"change_default_conferencing_app": "Установити за замовчуванням",
"organizer_default_conferencing_app": "Додаток організації за замовчуванням",
"under_maintenance": "На обслуговуванні",
"under_maintenance_description": "Команда {{appName}} здійснює планове обслуговування. Якщо маєте запитання, зверніться в службу підтримки.",
"event_type_seats": "Місць: {{numberOfSeats}}",
"booking_questions_title": "Питання про бронювання",
"booking_questions_description": "Налаштуйте запитання, які ставитимуться на сторінці бронювання",
"booking_questions_title": "Запитання про бронювання",
"booking_questions_description": "Налаштуйте запитання, відповіді на які потрібно буде надати на сторінці бронювання",
"add_a_booking_question": "Додати запитання",
"duplicate_email": "Ця адреса ел. пошти дублюється",
"duplicate_email": "Ця електронна адреса дублюється",
"booking_with_payment_cancelled": "Більше не можна оплатити цю подію",
"booking_with_payment_cancelled_already_paid": "Повернення коштів за це бронювання вже виконано.",
"booking_with_payment_cancelled_refunded": "Кошти за бронювання повернено.",
"booking_confirmation_failed": "Не вдалося підтвердити бронювання",
"not_enough_seats": "Недостатньо місць",
"form_builder_field_already_exists": "Поле з такою назвою вже існує",
"form_builder_field_add_subtitle": "Налаштуйте запитання, які ставитимуться на сторінці бронювання",
"form_builder_field_add_subtitle": "Налаштуйте запитання, відповіді на які потрібно буде надати на сторінці бронювання",
"show_on_booking_page": "Показати на сторінці бронювання",
"get_started_zapier_templates": "Розпочніть роботу із шаблонами Zapier",
"team_is_unpublished": "Публікацію такої команди скасовано: {{team}}",
"team_is_unpublished_description": "Посилання на команду зараз недоступне. Зверніться до власника команди або попросіть його опублікувати це посилання.",
"team_is_unpublished": "Публікацію команди «{{team}}» скасовано",
"team_is_unpublished_description": "Посилання на команду зараз недоступне. Зверніться до власника команди або попросіть його опублікувати команду.",
"team_member": "Учасник команди",
"a_routing_form": "Форма переспрямування",
"form_description_placeholder": "Опис форми",
"keep_me_connected_with_form": "Підтримувати зі мною зв’язок за допомогою форми",
"fields_in_form_duplicated": "Будь-які зміни, внесені у форму переспрямування і її поля, буде відображено в дублікаті цієї форми.",
"form_deleted": "Форму видалено",
"delete_form": "Видалити форму",
"delete_form": "Видалити цю форму?",
"delete_form_action": "Так, видалити форму",
"delete_form_confirmation": "Справді видалити цю форму? Користувачі, з якими ви поділилися посиланням, не зможуть забронювати час з її допомогою. Крім того, усі пов’язані відповіді буде видалено.",
"delete_form_confirmation": "Користувачі, з якими ви поділилися посиланням, більше не зможуть перейти за ним.",
"delete_form_confirmation_2": "Усі пов’язані відповіді буде видалено.",
"typeform_redirect_url_copied": "URL-адресу переспрямування Typeform скопійовано! Ви можете перейти й налаштувати URL-адресу у формі Typeform.",
"modifications_in_fields_warning": "Зміни в полях і переспрямуваннях нижчезазначених форм будуть відображені в цій формі.",
@@ -1635,6 +1687,14 @@
"add_1_option_per_line": "Додати 1 варіант на рядок",
"select_a_router": "Вибрати форму переспрямування",
"add_a_new_route": "Додати нове переспрямування",
"make_informed_decisions": "Приймайте обґрунтовані рішення за допомогою аналітики",
"make_informed_decisions_description": "У розділі «Аналітика» показано всю діяльність вашої команди й тенденції, які дають змогу краще планувати час команди й приймати рішення.",
"view_bookings_across": "Переглядайте бронювання всіх учасників",
"view_bookings_across_description": "Дізнайтеся, хто отримує найбільше бронювань і забезпечте найкращий розподіл у команді",
"identify_booking_trends": "Визначте тенденції бронювання",
"identify_booking_trends_description": "Дізнайтесь, які дні тижня і який час популярні в користувачів, які здійснюють бронювання",
"spot_popular_event_types": "Визначте популярні типи заходів",
"spot_popular_event_types_description": "Дізнайтеся, які типи заходів отримують найбільшу кількість переходів і бронювань",
"no_responses_yet": "Поки немає відповідей",
"this_will_be_the_placeholder": "Це заповнювач",
"this_meeting_has_not_started_yet": "Ця нарада ще не почалася",
@@ -1643,11 +1703,86 @@
"app_is_connected": "{{dependencyName}} підключено",
"requires_app": "Потрібно підключити {{dependencyName}}",
"verification_code": "Код перевірки",
"can_you_try_again": "Можете спробувати, указавши інший час?",
"can_you_try_again": "Виберіть інший час і повторіть спробу.",
"verify": "Перевірити",
"timezone_variable": "Часовий пояс",
"timezone_info": "Часовий пояс одержувача",
"event_end_time_variable": "Час завершення заходу",
"event_end_time_info": "Час завершення заходу",
"cancel_url_variable": "URL-адреса для скасування",
"cancel_url_info": "URL-адреса для скасування бронювання",
"reschedule_url_variable": "URL-адреса для перенесення",
"reschedule_url_info": "URL-адреса для перенесення бронювання",
"invalid_event_name_variables": "Назва вашого заходу містить неприпустиму змінну",
"select_all": "Вибрати всі",
"default_conferencing_bulk_title": "Масове оновлення існуючих типів заходів",
"default_conferencing_bulk_description": "Оновіть розташування для вибраних типів заходів"
"select_all": "Вибрати все",
"default_conferencing_bulk_title": "Масове оновлення наявних типів заходів",
"members_default_schedule": "Розклад учасника за замовчуванням",
"set_by_admin": "Встановлено адміністратором команди",
"members_default_location": "Розташування учасника за замовчуванням",
"members_default_schedule_description": "Ми використовуватимемо розклад кожного учасника за замовчуванням. Вони зможуть редагувати або змінювати його.",
"requires_at_least_one_schedule": "У вас має бути принаймні один розклад",
"default_conferencing_bulk_description": "Оновіть розташування для вибраних типів заходів",
"locked_for_members": "Заблоковано для учасників",
"locked_apps_description": "Учасники зможуть бачити активні додатки, але не зможуть редагувати налаштування додатка",
"locked_webhooks_description": "Учасники бачитимуть активні вебгуки, але не зможуть змінювати їх налаштування",
"locked_workflows_description": "Учасники бачитимуть активні робочі процеси, але не зможуть змінювати їх налаштування",
"locked_by_admin": "Заблоковано адміністратором",
"app_not_connected": "Ви не під’єднали обліковий запис {{appName}}.",
"connect_now": "Під’єднати",
"managed_event_dialog_confirm_button_one": "Замінити й повідомити {{count}} учасника",
"managed_event_dialog_confirm_button_other": "Замінити й повідомити учасників ({{count}})",
"managed_event_dialog_title_one": "URL-адреса /{{slug}} вже існує для {{count}} учасника. Хочете замінити її?",
"managed_event_dialog_title_other": "URL-адреса /{{slug}} вже існує для кількох учасників ({{count}}). Хочете замінити її?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> вже використовує URL-адресу <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> вже використовують URL-адресу <string>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "Якщо ви захочете замінити її, ми повідомимо їм. Поверніться і вилучіть їх, якщо ви не хочете перезаписувати її.",
"review_event_type": "Переглянути тип заходу",
"looking_for_more_analytics": "Вам потрібно більше аналітичних даних?",
"looking_for_more_insights": "Вам потрібно більше аналітики?",
"add_filter": "Додати фільтр",
"select_user": "Виберіть користувача",
"select_event_type": "Виберіть тип заходу",
"select_date_range": "Виберіть діапазон дат",
"popular_events": "Популярні заходи",
"no_event_types_found": "Типи заходів не знайдено",
"average_event_duration": "Середня тривалість заходу",
"most_booked_members": "Учасники з найбільшою кількістю бронювань",
"least_booked_members": "Учасники з найменшою кількістю бронювань",
"events_created": "Створені заходи",
"events_completed": "Завершені заходи",
"events_cancelled": "Скасовані заходи",
"events_rescheduled": "Перенесені заходи",
"from_last_period": "після останнього періоду",
"from_to_date_period": "З: {{startDate}} До: {{endDate}}",
"analytics_for_organisation": "Аналітика",
"subtitle_analytics": "Дізнайтеся більше про активність вашої команди",
"redirect_url_warning": "Додавання переспрямування вимкне сторінку з результатом бронювання. Переконайтеся, що ви додали текст «Бронювання підтверджено» на свою сторінку з результатом бронювання.",
"event_trends": "Тенденції заходів",
"clear_filters": "Очистити фільтри",
"hold": "Утримати",
"on_booking_option": "Отримуйте оплату за бронювання",
"hold_option": "Стягнути плату за відсутність",
"card_held": "Здійснено попередню авторизацію",
"charge_card": "Списати з картки",
"card_charged": "Списано кошти з картки",
"no_show_fee_amount": "Плата за відсутність у розмірі {{amount, currency}}",
"no_show_fee": "Плата за відсутність",
"submit_card": "Надіслати картку",
"submit_payment_information": "Надіслати платіжну інформацію",
"meeting_awaiting_payment_method": "Потрібно вказати спосіб оплати для вашої наради",
"no_show_fee_charged_email_subject": "Стягнуто плату за відсутність на заході «{{title}}» у розмірі {{amount, currency}} о {{date}}",
"no_show_fee_charged_text_body": "Стягнуто плату за відсутність",
"no_show_fee_charged_subtitle": "За нижчезазначений захід було стягнуто плату за відсутність у розмірі {{amount, currency}}",
"error_charging_card": "Сталася помилка під час стягнення плати за відсутність. Спробуйте ще раз пізніше.",
"collect_no_show_fee": "Стягнути плату за відсутність",
"no_show_fee_charged": "Стягнуто плату за відсутність",
"insights": "Аналітика",
"testing_workflow_info_message": "Тестуючи цей робочий процес, зважайте на те, що надсилання електронних листів і SMS-повідомлень можна запланувати мінімум за 1 годину",
"insights_no_data_found_for_filter": "Не знайдено жодних даних для вибраного фільтру або вибраних дат.",
"acknowledge_booking_no_show_fee": "Я підтверджую, що в разі моєї відсутності на цьому заході з моєї картки буде стягнуто плату за відсутність у розмірі {{amount, currency}}.",
"card_details": "Інформація про картку",
"seats_and_no_show_fee_error": "Наразі неможливо ввімкнути місця і стягнути плату за відсутність",
"complete_your_booking": "Завершіть бронювання",
"complete_your_booking_subject": "Завершіть бронювання: {{title}} {{date}}",
"email_invite_team": "{{email}} запрошено"
}
+136 -1
View File
@@ -1,4 +1,5 @@
{
"identity_provider": "Nhà cung cấp danh tính",
"trial_days_left": "Bạn có $t(day, {\"count\": {{days}} }) còn lại trên bản thử nghiệm PRO",
"day_one": "{{count}} ngày",
"day_other": "{{count}} ngày",
@@ -69,6 +70,8 @@
"event_awaiting_approval_subject": "Đang chờ phê duyệt: {{title}} lúc {{date}}",
"event_still_awaiting_approval": "Một sự kiện vẫn đang chờ bạn phê duyệt",
"booking_submitted_subject": "Lịch hẹn đã được gửi: {{title}} lúc {{date}}",
"download_recording_subject": "Tải xuống bản ghi âm: {{title}} vào ngày {{date}}",
"download_your_recording": "Tải xuống bản ghi âm của bạn",
"your_meeting_has_been_booked": "Cuộc họp của bạn đã được đặt",
"event_type_has_been_rescheduled_on_time_date": "{{title}} của bạn đã được chuyển sang ngày {{date}}.",
"event_has_been_rescheduled": "Đã cập nhật - Sự kiện của bạn đã được đổi",
@@ -224,6 +227,7 @@
"done": "Xong",
"all_done": "Đã xong hết!",
"all_apps": "Tất cả",
"available_apps": "Ứng dụng hiện có",
"check_email_reset_password": "Kiểm tra hộp thư điện tử của bạn. Chúng tôi đã gửi cho bạn một liên kết để đặt lại mật khẩu của bạn.",
"finish": "Hoàn thành",
"few_sentences_about_yourself": "Vài câu về bản thân bạn - nó sẽ xuất hiện trên trang cá nhân của bạn.",
@@ -404,6 +408,7 @@
"add_time_availability": "Thêm khoảng thời gian mới",
"add_an_extra_layer_of_security": "Thêm một lớp bảo mật bổ sung cho tài khoản của bạn trong trường hợp mật khẩu của bạn bị đánh cắp.",
"2fa": "Xác thực hai yếu tố",
"2fa_disabled": "Xác thực đa yếu tố chỉ được bật cho chức năng xác thực qua email và mật khẩu",
"enable_2fa": "Bật xác thực hai yếu tố",
"disable_2fa": "Tắt xác thực hai yếu tố",
"disable_2fa_recommendation": "Nếu bạn cần tắt xác thực hai yếu tố, chúng tôi khuyên bạn nên bật lại nó càng sớm càng tốt.",
@@ -585,6 +590,20 @@
"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.",
"managed_event": "Sự kiện được quản lý",
"username_placeholder": "tên người dùng",
"managed_event_description": "Tạo & phân phối cả cụm nhiều loại sự kiện đến các thành viên nhóm",
"managed": "Được quản lý",
"managed_event_url_clarification": "\"tên người dùng\" sẽ được điền vào theo tên người dùng của những thành viên được phân công",
"assign_to": "Phân công cho",
"add_members": "Thêm thành viên...",
"count_members_one": "{{count}} thành viên",
"count_members_other": "{{count}} thành viên",
"no_assigned_members": "Không thành viên nào được phân công",
"assigned_to": "Được phân công cho",
"start_assigning_members_above": "Bắt đầu phân công những thành viên bên trên",
"locked_fields_admin_description": "Các thành viên sẽ không sửa được phần này",
"locked_fields_member_description": "Tuỳ chọn này do quản trị nhóm khoá lại",
"url": "URL",
"hidden": "Ẩn giấu",
"readonly": "Chỉ đọc",
@@ -736,6 +755,11 @@
"minimum_booking_notice": "Thời gian đệm tối thiểu",
"slot_interval": "Khoảng thời gian giữa các lịch hẹn",
"slot_interval_default": "Sử dụng độ dài sự kiện (mặc định)",
"delete_event_type": "Xoá loại sự kiện?",
"delete_managed_event_type": "Xoá loại sự kiện được quản lý?",
"delete_event_type_description": "Đối với những người mà bạn chia sẻ liên kết này, họ sẽ không thể đặt lịch hẹn bằng liên kết đó được nữa.",
"delete_managed_event_type_description": "<ul><li>Những thành viên được phân công cho loại sự kiện này cũng sẽ khiến cho loại sự kiện của họ được xoá đi.</li><li>Đối với những người mà bạn chia sẻ liên kết này, họ sẽ không thể đặt lịch hẹn bằng liên kết đó được nữa.</li></ul>",
"confirm_delete_event_type": "Có, hãy xoá",
"delete_account": "Xóa tài khoản",
"confirm_delete_account": "Có, xóa tài khoản",
"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.",
@@ -1126,11 +1150,13 @@
"current_username": "Tên người dùng hiện tại",
"example_1": "Ví dụ 1",
"example_2": "Ví dụ 2",
"booking_question_identifier": "Mã định danh câu hỏi lịch hẹn",
"company_size": "Quy mô công ty",
"what_help_needed": "Bạn cần giúp điều gì?",
"variable_format": "Định dạng biến số",
"webhook_subscriber_url_reserved": "Url ghi danh Webhook đã được lập định",
"custom_input_as_variable_info": "Bỏ qua tất cả các ký tự đặc biệt của nhãn thông tin đầu vào bổ sung (chỉ dùng chữ cái và con số), dùng chữ in hoa cho tất cả các chữ cái và thay thế khoảng trắng bằng dấu gạch dưới.",
"using_booking_questions_as_variables": "Làm cách nào tôi dùng những câu hỏi lịch hẹn ở dạng tham số?",
"download_desktop_app": "Tải ứng dụng trên máy tính bàn",
"set_ping_link": "Đặt liên kết Ping",
"rate_limit_exceeded": "Đã vượt quá giới hạn đăng nhập",
@@ -1176,6 +1202,7 @@
"start_of_week": "Khởi đầu tuần",
"recordings_title": "Bản ghi âm",
"recording": "Bản ghi âm",
"happy_scheduling": "Đặt lịch vui",
"select_calendars": "Chọn lịch nào mà bạn muốn kiểm tra xung đột nhằm tránh đặt lịch hẹn trùng.",
"check_for_conflicts": "Kiểm tra xung đột",
"view_recordings": "Xem các bản ghi âm",
@@ -1213,6 +1240,7 @@
"impersonation": "Mạo danh",
"impersonation_description": "Cài đặt để quản lý mạo danh người dùng",
"users": "Người dùng",
"user": "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",
@@ -1253,6 +1281,8 @@
"download_responses": "Tải xuống Phản hồi",
"download_responses_description": "Tải xuống tất cả phản hồi vào biểu mẫu của bạn ở định dạng CSV.",
"download": "Tải về",
"download_recording": "Tải xuống bản ghi âm",
"recording_from_your_recent_call": "Một bản ghi âm từ cuộc gọi gần đây trên Cal.com đã sẵn sàng để tải xuống",
"create_your_first_form": "Tạo biểu mẫu đầu tiên",
"create_your_first_form_description": "Với Biểu mẫu định hướng, bạn có thể hỏi một số câu sơ tuyển và định hướng đến đúng người hay đúng loại sự kiện.",
"create_your_first_webhook": "Tạo Webhook đầu tiên",
@@ -1289,6 +1319,15 @@
"exchange_authentication_standard": "Xác thực cơ bản",
"exchange_authentication_ntlm": "Xác thực NTLM",
"exchange_compression": "Giao thức nén GZip",
"exchange_version": "Phiên bản Exchange",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Bạn có thể thấy tất cả các biểu mẫu và định hướng mà bạn đã tạo ra ở đây.",
"routing_forms_send_email_owner": "Gửi email đến chủ sở hữu",
"routing_forms_send_email_owner_description": "Gửi một email đến chủ sở hữu khi biểu mẫu được gửi đi",
@@ -1343,6 +1382,7 @@
"add_limit": "Thêm giới hạn",
"team_name_required": "Cần có tên nhóm",
"show_attendees": "Chia sẻ thông tin người tham gia cho khách",
"how_booking_questions_as_variables": "Làm cách nào dùng những câu hỏi lịch hẹn ở dạng tham số?",
"format": "Định dạng",
"uppercase_for_letters": "In hoa hết tất cả các chữ cái",
"replace_whitespaces_underscores": "Thay thế khoảng trắng bằng dấu gạch dưới",
@@ -1357,6 +1397,7 @@
"billing_help_title": "Cần gì nữa không?",
"billing_help_description": "Nếu bạn cần thêm bất kỳ trợ giúp nào về thanh toán, nhóm hỗ trợ của chúng tôi luôn sẵn sàng trợ giúp.",
"billing_help_cta": "Liên hệ với bộ phận hỗ trợ",
"ignore_special_characters_booking_questions": "Bỏ qua những kí tự đặc biệt trong mã định danh câu hỏi lịch hẹn. Chỉ dùng chữ cái và số",
"retry": "Thử lại",
"fetching_calendars_error": "Có vấn đề khi tìm dữ liệu của bạn. Vui lòng <1>thử lại</1> hoặc liên hệ với bộ phận hỗ trợ khách hàng.",
"calendar_connection_fail": "Kết nối lịch bất thành",
@@ -1439,11 +1480,17 @@
"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",
"the_calcom_team": "Nhóm Cal.com",
"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",
"duration_limit_reached": "Đã đạt mức giới hạn thời gian 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}}",
"event_replaced_notice": "Một quản trị viên đã thay thế một trong những loại sự kiện của bạn",
"email_subject_slug_replacement": "Một quản trị viên của nhóm đã thay thế sự kiện của bạn /{{slug}}",
"email_body_slug_replacement_notice": "Một quản trị viên trên nhóm <strong>{{teamName}}</strong> đã thay thế loại sự kiện của bạn <strong>/{{slug}}</strong> bằng một loại sự kiện được quản lý mà họ kiểm soát.",
"email_body_slug_replacement_info": "Liên kết của bạn sẽ tiếp tục hoạt động nhưng một số thiết lập cho nó có thể thay đổi. Bạn có thể xem lại nó trong những loại sự kiện.",
"email_body_slug_replacement_suggestion": "Nếu bạn có thắc mắc gì về loại sự kiện này, vui lòng liên lạc với quản trị viên của bạn. <br /><br />Đặt lịch vui,<br /> Nhóm Cal.com",
"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}}.",
@@ -1492,6 +1539,7 @@
"date_overrides_update_btn": "Cập nhận ngày ghi đè",
"event_type_duplicate_copy_text": "{{slug}}-bansao",
"set_as_default": "Đặt làm mặc định",
"hide_eventtype_details": "Ẩn chi tiết của loại sự kiện",
"show_navigation": "Hiển thị điều hướng",
"hide_navigation": "Ẩn điều hướng",
"verification_code_sent": "Đã gửi mã xác minh",
@@ -1505,6 +1553,7 @@
"create_your_first_team_webhook_description": "Tạo webhook đầu tiên của bạn cho loại sự kiện nhóm này",
"create_webhook_team_event_type": "Tạo webhook cho loại sự kiện nhóm này",
"disable_success_page": "Tắt trang báo hiệu đặt lịch thành công (chỉ hoạt động nếu bạn có URL chuyển hướng)",
"invalid_admin_password": "Bạn là quản trị viên nhưng bạn chưa đặt mật khẩu dài ít nhất 15 ký tự hoặc không có xác thực hai yếu tố",
"change_password_admin": "Hãy đổi Mật khẩu để lấy quyền quản trị viên",
"username_already_taken": "Tên này đã có người lấy rồi",
"assignment": "Phân công",
@@ -1537,6 +1586,7 @@
"ee_enterprise_license": "Giấy phép Enterprise \"/ee\"",
"enterprise_booking_fee": "Bắt đầu từ mức {{enterprise_booking_fee}}/tháng",
"enterprise_license_includes": "Mọi thứ cho trường hợp sử dụng thương mại",
"no_need_to_keep_your_code_open_source": "Không cần giữ mã của bạn ở dạng mã nguồn mở",
"repackage_rebrand_resell": "Đóng gói lại, tái cấu trúc thương hiệu và bán lại dễ dàng",
"a_vast_suite_of_enterprise_features": "Một bộ khổng lồ các tính năng doanh nghiệp",
"free_license_fee": "0,00$/tháng",
@@ -1598,6 +1648,7 @@
"default_app_link_title": "Đặt một liên kết ứng dụng mặc định",
"default_app_link_description": "Thao tác đặt liên kết ứng dụng mặc định sẽ giúp cho phép tất cả các loại sự kiện mới tạo có thể dùng liên kết ứng dụng mà bạn đã đặt.",
"change_default_conferencing_app": "Đặt làm mặc định",
"organizer_default_conferencing_app": "Ứng dụng mặc định của nhà tổ chức",
"under_maintenance": "Tạm ngừng để bảo trì",
"under_maintenance_description": "Nhóm {{appName}} đang thực hiện việc bảo trì theo lịch. Nếu bạn có thắc mắc gì, vui lòng liên hệ bộ phận hỗ trợ.",
"event_type_seats": "{{numberOfSeats}} chỗ ngồi",
@@ -1612,6 +1663,7 @@
"not_enough_seats": "Không đủ chỗ",
"form_builder_field_already_exists": "Đã tồn tại một trường có tên này",
"form_builder_field_add_subtitle": "Tùy chỉnh các câu hỏi ở trang đặt lịch hẹn",
"show_on_booking_page": "Hiện trên trang lịch hẹn",
"get_started_zapier_templates": "Bắt đầu với các mẫu Zapier",
"team_is_unpublished": "{{team}} chưa được công bố",
"team_is_unpublished_description": "Liên kết nhóm này hiện không khả dụng. Hãy liên lạc với chủ nhóm hoặc yêu cầu họ công bố liên kết đó.",
@@ -1635,6 +1687,14 @@
"add_1_option_per_line": "Thêm 1 tuỳ chọn cho mỗi hàng",
"select_a_router": "Chọn một định hướng",
"add_a_new_route": "Thêm một Định hướng mới",
"make_informed_decisions": "Đưa ra những quyết định sáng suốt với Insights",
"make_informed_decisions_description": "Bảng điều khiển Insights của chúng tôi nằm ở bề mặt xuyên suốt nhóm bạn và hiển thị cho bạn thấy những xu hướng giúp đặt lịch nhóm và ra quyết định tốt hơn.",
"view_bookings_across": "Xem lịch hẹn ở mọi thành viên",
"view_bookings_across_description": "Xem ai nhận được nhiều lịch hẹn nhất và bảo đảm việc phân phối tốt nhất cho khắp nhóm",
"identify_booking_trends": "Nhận diện xu hướng lịch hẹn",
"identify_booking_trends_description": "Xem thời điểm nào trong tuần và thời điểm nào trong ngày là thời điểm phổ biến cho người đặt lịch hẹn bên bạn",
"spot_popular_event_types": "Nhận ra các loại sự kiện phổ biến",
"spot_popular_event_types_description": "Xem loại sự kiện nào của bạn nhận được nhiều lần nhấp chuột và nhiều lịch hẹn nhất",
"no_responses_yet": "Chưa có hồi đáp",
"this_will_be_the_placeholder": "Đây sẽ là mã giữ chỗ",
"this_meeting_has_not_started_yet": "Cuộc hẹn này chưa được bắt đầu",
@@ -1646,8 +1706,83 @@
"can_you_try_again": "Bạn có thể thử lại lúc khác được chứ?",
"verify": "Xác minh",
"timezone_variable": "Múi giờ",
"timezone_info": "Múi giờ của người nhận",
"event_end_time_variable": "Thời gian kết thúc sự kiện",
"event_end_time_info": "Thời gian kết thúc sự kiện",
"cancel_url_variable": "URL huỷ lịch",
"cancel_url_info": "URL để huỷ lịch hẹn",
"reschedule_url_variable": "URL đặt lịch lại",
"reschedule_url_info": "URL để đặt lịch hẹn lại",
"invalid_event_name_variables": "Có biến số không hợp lệ trong tên sự kiện của bạn",
"select_all": "Chọn tất cả",
"default_conferencing_bulk_title": "Cập nhật hàng loại những loại sự kiện hiện có",
"default_conferencing_bulk_description": "Cập nhật địa điểm cho những loại sự kiện đã chọn"
"members_default_schedule": "Lịch biểu mặc định của thành viên",
"set_by_admin": "Đặt bởi quản trị viên của nhóm",
"members_default_location": "Vị trí mặc định của thành viên",
"members_default_schedule_description": "Chúng tôi sẽ dùng trạng thái trống lịch mặc định của mỗi thành viên. Họ sẽ có thể sửa hoặc thay đổi trạng thái này.",
"requires_at_least_one_schedule": "Bạn cần phải có ít nhất một lịch biểu",
"default_conferencing_bulk_description": "Cập nhật địa điểm cho những loại sự kiện đã chọn",
"locked_for_members": "Bị khoá đối với thành viên",
"locked_apps_description": "Các thành viên có thể thấy được những ứng dụng đang hoạt động nhưng không thể sửa bất kỳ thiết lập nào của ứng dụng",
"locked_webhooks_description": "Các thành viên có thể thấy được những webhook đang hoạt động nhưng không thể sửa bất kỳ thiết lập nào của webhook",
"locked_workflows_description": "Các thành viên có thể thấy được những tiến độ công việc đang hoạt động nhưng không thể sửa bất kỳ thiết lập nào của tiến độ công việc",
"locked_by_admin": "Bị khoá bởi quản trị viên",
"app_not_connected": "Bạn không có tài khoản {{appName}} đã được kết nối.",
"connect_now": "Kết nối ngay",
"managed_event_dialog_confirm_button_one": "Thay thế & thông báo cho {{count}} thành viên",
"managed_event_dialog_confirm_button_other": "Thay thế & thông báo cho {{count}} thành viên",
"managed_event_dialog_title_one": "URL / {{slug}} đã có sẵn cho {{count}} thành viên. Bạn có muốn thay thế nó?",
"managed_event_dialog_title_other": "URL /{{slug}} đã có sẵn cho {{count}} thành viên. Bạn có muốn thay thế nó?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> đã dùng URL <strong>/{{slug}}</strong> rồi.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> đã dùng URL <string>/{{slug}}</strong> rồi.",
"managed_event_dialog_clarification": "Nếu bạn chọn phương án thay thế nó, chúng tôi sẽ thông báo cho họ biết. Hãy quay lại và xoá bỏ họ nếu bạn không muốn ghi đè nó.",
"review_event_type": "Xem lại loại sự kiện",
"looking_for_more_analytics": "Đang tìm thêm công cụ phân tích?",
"looking_for_more_insights": "Đang tìm thêm Insights?",
"add_filter": "Thêm bộ lọc",
"select_user": "Chọn người dùng",
"select_event_type": "Chọn loại sự kiện",
"select_date_range": "Chọn khoảng ngày",
"popular_events": "Sự kiện phổ biến",
"no_event_types_found": "Không tìm thấy loại sự kiện nào",
"average_event_duration": "Thời lượng trung bình của sự kiện",
"most_booked_members": "Thành viên được đặt lịch hẹn nhiều nhất",
"least_booked_members": "Thành viên được đặt lịch hẹn ít nhất",
"events_created": "Những sự kiện đã tạo",
"events_completed": "Những sự kiện đã hoàn thành",
"events_cancelled": "Những sự kiện đã huỷ",
"events_rescheduled": "Những sự kiện đã đặt lịch lại",
"from_last_period": "từ thời gian gần nhất",
"from_to_date_period": "Từ: {{startDate}} Đến: {{endDate}}",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "Tìm hiểu thêm về hoạt động của nhóm bạn",
"redirect_url_warning": "Thêm mục chuyển hướng sẽ tắt đi trang thành công. Hãy bảo đảm có đề cập \"Lịch hẹn đã xác nhận\" trên trang thành công tuỳ chỉnh riêng của bạn.",
"event_trends": "Xu hướng sự kiện",
"clear_filters": "Xoá bộ lọc",
"hold": "Giữ đó",
"on_booking_option": "Thu tiền thanh toán cho lịch hẹn",
"hold_option": "Tính phí vắng mặt",
"card_held": "Thẻ đã được giữ",
"charge_card": "Tính phí cho thẻ",
"card_charged": "Thẻ đã thu phí",
"no_show_fee_amount": "Phí vắng mặt {{amount, currency}}",
"no_show_fee": "Phí vắng mặt",
"submit_card": "Gửi thẻ",
"submit_payment_information": "Gửi thông tin thanh toán",
"meeting_awaiting_payment_method": "Cuộc họp của bạn đang chờ phương thức thanh toán",
"no_show_fee_charged_email_subject": "Phí vắng mặt {{amount, currency}} sẽ được tính cho {{title}} vào ngày {{date}}",
"no_show_fee_charged_text_body": "Phí vắng mặt được tính",
"no_show_fee_charged_subtitle": "Phí vắng mặt {{amount, currency}} sẽ được tính cho sự kiện sau",
"error_charging_card": "Có sự cố khi tính phí vắng mặt. Vui lòng thử lại sau.",
"collect_no_show_fee": "Thu phí vắng mặt",
"no_show_fee_charged": "Phí vắng mặt đã tính",
"insights": "Insights",
"testing_workflow_info_message": "Khi kiểm tra tiến độ công việc này, hãy để ý rằng Email và SMS chỉ có thể được đặt lịch trước ít nhất 1 giờ",
"insights_no_data_found_for_filter": "Không tìm thấy dữ liệu cho bộ lọc hay ngày đã chọn.",
"acknowledge_booking_no_show_fee": "Tôi công nhận là nếu tôi không tham dự sự kiện này thì một khoản phí vắng mặt gồm {{amount, currency}} sẽ được áp dụng cho thẻ của tôi.",
"card_details": "Chi tiết thẻ",
"seats_and_no_show_fee_error": "Hiện không thể kích hoạt chỗ ngồi và tính khoản phí vắng mặt",
"complete_your_booking": "Hoàn thành lịch hẹn của bạn",
"complete_your_booking_subject": "Hoàn thành lịch hẹn của bạn: {{title}} vào {{date}}",
"email_invite_team": "{{email}} đã được mời"
}
@@ -70,6 +70,8 @@
"event_awaiting_approval_subject": "等待批准:{{date}} 的 {{title}}",
"event_still_awaiting_approval": "有活动仍在等待您的批准",
"booking_submitted_subject": "已提交预订:{{title}},于 {{date}}",
"download_recording_subject": "下载录制内容: {{date}} 的 {{title}}",
"download_your_recording": "下载您的录制内容",
"your_meeting_has_been_booked": "您的会议已预定",
"event_type_has_been_rescheduled_on_time_date": "您的 {{title}} 已改期至 {{date}}。",
"event_has_been_rescheduled": "已更新 - 您的活动已被重新安排",
@@ -225,6 +227,7 @@
"done": "完成",
"all_done": "全部完成!",
"all_apps": "所有应用",
"available_apps": "可用应用",
"check_email_reset_password": "请检查您的邮箱,我们向您发送了一个重置密码的链接。",
"finish": "完成",
"few_sentences_about_yourself": "请写一段简单的自我介绍,该介绍将会展示在您的个人链接页面上。",
@@ -405,6 +408,7 @@
"add_time_availability": "添加新的时间段",
"add_an_extra_layer_of_security": "在您的密码被盗时,能给您的账户添加一层额外的安全保护",
"2fa": "两步验证",
"2fa_disabled": "只能为电子邮件和密码身份验证启用双因素身份验证",
"enable_2fa": "启用两步验证",
"disable_2fa": "禁用两步验证",
"disable_2fa_recommendation": "如果您需要临时禁用两步验证,我们建议尽快重新启用它。",
@@ -586,6 +590,20 @@
"minutes": "分钟",
"round_robin": "轮流模式",
"round_robin_description": "和多个团队成员之间轮流举行会议。",
"managed_event": "托管活动",
"username_placeholder": "用户名",
"managed_event_description": "批量创建事件类型并分发给团队成员",
"managed": "托管",
"managed_event_url_clarification": "“用户名”将填写所分配的成员的用户名",
"assign_to": "分配给",
"add_members": "添加成员...",
"count_members_one": "{{count}} 个成员",
"count_members_other": "{{count}} 个成员",
"no_assigned_members": "没有已分配的成员",
"assigned_to": "已分配给",
"start_assigning_members_above": "开始分配上面的成员",
"locked_fields_admin_description": "成员将无法编辑此内容",
"locked_fields_member_description": "此选项已被团队管理员锁定",
"url": "链接",
"hidden": "隐藏",
"readonly": "只读",
@@ -737,6 +755,11 @@
"minimum_booking_notice": "最小预约通知提前时间",
"slot_interval": "时间段间隔",
"slot_interval_default": "使用活动时长 (默认)",
"delete_event_type": "删除活动类型?",
"delete_managed_event_type": "创建托管活动类型?",
"delete_event_type_description": "您将此链接共享给的任何人都将无法再使用它进行预约。",
"delete_managed_event_type_description": "<ul><li>分配给此活动类型的成员也将删除其活动类型。</li><li>他们将链接共享给的任何人都将无法再使用它进行预约。</li></ul>",
"confirm_delete_event_type": "是,删除",
"delete_account": "删除账户",
"confirm_delete_account": "是,删除账户",
"delete_account_confirmation_message": "您确定要删除您的 {{appName}} 账户? 任何曾通过您的账户链接与您预约过的人都将无法再使用它和您预约,您保存的任何偏好设置都将丢失。",
@@ -861,7 +884,7 @@
"add_new_calendar": "添加新日历",
"set_calendar": "设置当您被预约后添加新活动的位置。",
"delete_schedule": "删除时间表",
"delete_schedule_description": "删除时间表会将其从所有活动类型中删除。此操作无法撤消。",
"delete_schedule_description": "删除日程安排会将其从所有活动类型中删除。此操作无法撤消。",
"schedule_created_successfully": "{{scheduleName}} 时间表已成功创建",
"availability_updated_successfully": "{{scheduleName}} 日程更新成功",
"schedule_deleted_successfully": "已成功删除时间表",
@@ -1127,11 +1150,13 @@
"current_username": "当前用户名",
"example_1": "示例 1",
"example_2": "示例 2",
"booking_question_identifier": "预约问题标识符",
"company_size": "公司规模",
"what_help_needed": "您需要什么帮助?",
"variable_format": "变量格式",
"webhook_subscriber_url_reserved": "Webhook 订阅者 url 已定义",
"custom_input_as_variable_info": "忽略附加输入标签的所有特殊字符(仅使用字母和数字),所有字母均使用大写,并将空格替换为下划线。",
"using_booking_questions_as_variables": "如何将预约问题用作变量?",
"download_desktop_app": "下载桌面应用",
"set_ping_link": "设置 Ping 链接",
"rate_limit_exceeded": "已超过速率限制",
@@ -1177,6 +1202,7 @@
"start_of_week": "一周开始",
"recordings_title": "录制",
"recording": "录制",
"happy_scheduling": "祝日程安排愉快",
"select_calendars": "选择要检查冲突的日历,以防止重复预约。",
"check_for_conflicts": "检查冲突",
"view_recordings": "查看录制",
@@ -1214,6 +1240,7 @@
"impersonation": "模拟",
"impersonation_description": "用于管理用户模拟的设置",
"users": "用户",
"user": "用户",
"profile_description": "管理您的 {{appName}} 个人资料的设置",
"users_description": "在此处可以找到所有用户的列表",
"users_listing": "用户列表",
@@ -1254,6 +1281,8 @@
"download_responses": "下载回应",
"download_responses_description": "以 CSV 格式下载对表格的所有回复。",
"download": "下载",
"download_recording": "下载录制内容",
"recording_from_your_recent_call": "您最近在 Cal.com 上的通话录制可供下载",
"create_your_first_form": "创建您的第一个表格",
"create_your_first_form_description": "利用途径表格,您可以提出符合条件的问题,并可根据途径找到正确的人或活动类型。",
"create_your_first_webhook": "创建您的第一个 Webhook",
@@ -1290,6 +1319,15 @@
"exchange_authentication_standard": "基本身份验证",
"exchange_authentication_ntlm": "NTLM 身份验证",
"exchange_compression": "GZip 压缩",
"exchange_version": "Exchange 版本",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "您可以在此处看到您创建的所有表格和途径。",
"routing_forms_send_email_owner": "向所有者发送电子邮件",
"routing_forms_send_email_owner_description": "提交表单后向所有者发送电子邮件",
@@ -1344,6 +1382,7 @@
"add_limit": "添加限制",
"team_name_required": "需要团队名称",
"show_attendees": "在访客之间共享参与者信息",
"how_booking_questions_as_variables": "如何将预约问题用作变量?",
"format": "格式",
"uppercase_for_letters": "所有字母均使用大写",
"replace_whitespaces_underscores": "将空格替换为下划线",
@@ -1358,6 +1397,7 @@
"billing_help_title": "还有其他需要?",
"billing_help_description": "如果您在支付帐单时需要任何进一步的帮助,我们的支持团队随时为您提供。",
"billing_help_cta": "联系支持",
"ignore_special_characters_booking_questions": "忽略预约问题标识符中的特殊字符。仅使用字母和数字",
"retry": "重试",
"fetching_calendars_error": "获取您的日历时出现问题。请<1>重试</1>或联系客户支持。",
"calendar_connection_fail": "日历连接失败",
@@ -1440,11 +1480,17 @@
"fixed_round_robin": "固定轮流模式",
"add_one_fixed_attendee": "添加一名固定参与者,并由多名参与者轮流担任。",
"calcom_is_better_with_team": "Cal.com 更适合团队",
"the_calcom_team": "Cal.com 团队",
"add_your_team_members": "将您的团队成员添加到您的活动类型。使用集体日程安排来包括所有人或以轮流安排的方式找到最适合的人员。",
"booking_limit_reached": "已达到此活动类型的预约限制",
"duration_limit_reached": "已达到此活动类型的时长限制",
"admin_has_disabled": "管理员已禁用 {{appName}}",
"disabled_app_affects_event_type": "管理员已禁用会影响活动类型 {{eventType}} 的 {{appName}}",
"event_replaced_notice": "管理员已替换您的一个活动类型",
"email_subject_slug_replacement": "团队管理员已替换您的活动/{{slug}}",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong> 团队的管理员已将您的活动类型 <strong>{{slug}}</strong> 替换为他们控制的托管活动类型。",
"email_body_slug_replacement_info": "您的链接将继续有效,但其某些设置可能已更改。您可以在活动类型中查看它。",
"email_body_slug_replacement_suggestion": "如果您对活动类型有任何疑问,请联系您的管理员。<br /><br />祝日程安排愉快,<br />Cal.com 团队",
"disable_payment_app": "管理员已禁用会影响活动类型 {{title}} 的 {{appName}}。参与者仍然能预约此类型的活动,但不会被提示付款。您可以隐藏该活动类型来防止出现这种情况,直到管理员重新启用您的支付方式。",
"payment_disabled_still_able_to_book": "参与者仍然能预约此类型的活动,但不会被提示付款。您可以隐藏该活动类型来防止出现这种情况,直到管理员重新启用您的支付方式。",
"app_disabled_with_event_type": "管理员已禁用会影响活动类型 {{title}} 的 {{appName}}。",
@@ -1493,6 +1539,7 @@
"date_overrides_update_btn": "更新替代",
"event_type_duplicate_copy_text": "{{slug}}-复制",
"set_as_default": "设置为默认",
"hide_eventtype_details": "隐藏活动类型详细信息",
"show_navigation": "显示导航",
"hide_navigation": "隐藏导航",
"verification_code_sent": "验证码已发送",
@@ -1506,6 +1553,7 @@
"create_your_first_team_webhook_description": "为此团队活动类型创建第一个 Webhook",
"create_webhook_team_event_type": "为此团队活动类型创建 Webhook",
"disable_success_page": "禁用“成功”页面 (仅当有重定向链接时才有效)",
"invalid_admin_password": "您是管理员,但您的密码长度不足 15 个字符或尚未启用 2FA",
"change_password_admin": "更改密码以获取管理员访问权限",
"username_already_taken": "用户名已被占用",
"assignment": "分配",
@@ -1588,7 +1636,7 @@
"recommended_next_steps": "建议的后续步骤",
"create_a_managed_event": "创建托管活动类型",
"meetings_are_better_with_the_right": "有合适的团队成员参加会议会更好。立即邀请他们。",
"create_a_one_one_template": "为活动类型创建一个一对一模板,并将其分发给多个成员。",
"create_a_one_one_template": "为活动类型创建一个一对一模板,并将其分配给多个成员。",
"collective_or_roundrobin": "集体或轮流",
"book_your_team_members": "以集体模式预约您的团队成员,或以轮流模式循环到合适的人员。",
"event_no_longer_attending_subject": "不再参加于 {{date}} 举行的 {{title}} ",
@@ -1600,6 +1648,7 @@
"default_app_link_title": "设置默认应用链接",
"default_app_link_description": "设置默认应用链接可以让所有新创建的活动类型使用您设置的应用链接。",
"change_default_conferencing_app": "设置为默认",
"organizer_default_conferencing_app": "组织者的默认应用",
"under_maintenance": "停机维护",
"under_maintenance_description": "{{appName}} 团队正在进行计划维护。如果您有任何疑问,请联系支持。",
"event_type_seats": "{{numberOfSeats}} 个位置",
@@ -1614,6 +1663,7 @@
"not_enough_seats": "位置不足",
"form_builder_field_already_exists": "具有此名称的字段已存在",
"form_builder_field_add_subtitle": "自定义预约页面上提出的问题",
"show_on_booking_page": "在预约页面上显示",
"get_started_zapier_templates": "开始使用 Zapier 模板",
"team_is_unpublished": "{{team}} 已被取消发布",
"team_is_unpublished_description": "该团队链接当前不可用。请联系团队所有者或请他们发布。",
@@ -1623,10 +1673,10 @@
"keep_me_connected_with_form": "让我与表格保持连接",
"fields_in_form_duplicated": "所复制的途径表格本身和其字段的任何变化都会反映在副本中。",
"form_deleted": "表格已删除",
"delete_form": "删除表格",
"delete_form": "确定要删除此表格吗?",
"delete_form_action": "是,删除表格",
"delete_form_confirmation": "您确定要删除此表格吗?与您共享链接的任何人都将无法再使用它进行预约。此外,所有相关回复都将被删除。",
"delete_form_confirmation_2": "所有相关的回复都将被删除。",
"delete_form_confirmation": "与您共享链接的所有人都将无法再对其进行访问。",
"delete_form_confirmation_2": "所有关联的回复都将被删除。",
"typeform_redirect_url_copied": "Typeform 重定向链接已复制!您可以在 TypeForm 表格中设置链接。",
"modifications_in_fields_warning": "对以下表格中字段和途径的修改将反映在此表格中。",
"connected_forms": "连接的表格",
@@ -1637,6 +1687,14 @@
"add_1_option_per_line": "每行添加 1 个选项",
"select_a_router": "选择途径",
"add_a_new_route": "添加新途径",
"make_informed_decisions": "使用洞察做出明智的决策",
"make_informed_decisions_description": "我们的“洞察”仪表板会显示您团队中的所有活动,并向您展示趋势,以便更好地进行团队日程安排和制定决策。",
"view_bookings_across": "查看所有成员的预约",
"view_bookings_across_description": "查看谁收到的预约最多,并确保在团队中实现最佳分配",
"identify_booking_trends": "确定预约趋势",
"identify_booking_trends_description": "查看一周中的哪些时间和一天中的哪些时间受预约者欢迎",
"spot_popular_event_types": "发现热门的活动类型",
"spot_popular_event_types_description": "查看哪些活动类型获得最多点击和预约",
"no_responses_yet": "尚无回复",
"this_will_be_the_placeholder": "这将是占位符",
"this_meeting_has_not_started_yet": "此会议尚未开始",
@@ -1648,8 +1706,83 @@
"can_you_try_again": "可否用不同的时间再次尝试?",
"verify": "验证",
"timezone_variable": "时区",
"timezone_info": "接收人的时区",
"event_end_time_variable": "活动结束时间",
"event_end_time_info": "活动结束时间",
"cancel_url_variable": "取消链接",
"cancel_url_info": "取消预约的链接",
"reschedule_url_variable": "重新安排链接",
"reschedule_url_info": "重新安排预约的链接",
"invalid_event_name_variables": "活动名称中存在无效变量",
"select_all": "全选",
"default_conferencing_bulk_title": "批量更新现有事件类型",
"default_conferencing_bulk_description": "更新选定活动类型的位置"
"default_conferencing_bulk_title": "批量更新现有活动类型",
"members_default_schedule": "成员的默认时间表",
"set_by_admin": "由团队管理员设置",
"members_default_location": "成员的默认位置",
"members_default_schedule_description": "我们将使用每个成员的默认可预约时间表。他们将能够编辑或更改它。",
"requires_at_least_one_schedule": "您需要至少有一个时间表",
"default_conferencing_bulk_description": "更新选定活动类型的位置",
"locked_for_members": "为成员锁定",
"locked_apps_description": "成员将能够查看活动的应用,但不能编辑任何应用设置",
"locked_webhooks_description": "成员将能够查看活动的 Webhook,但不能编辑任何 Webhook 设置",
"locked_workflows_description": "成员将能够查看活动的工作流程,但不能编辑任何工作流程设置",
"locked_by_admin": "被管理员锁定",
"app_not_connected": "您尚未连接 {{appName}} 账户。",
"connect_now": "立即连接",
"managed_event_dialog_confirm_button_one": "替换并通知 {{count}} 个成员",
"managed_event_dialog_confirm_button_other": "替换并通知 {{count}} 个成员",
"managed_event_dialog_title_one": "{{count}} 个成员的链接/{{slug}} 已存在。是否要将其替换?",
"managed_event_dialog_title_other": "{{count}} 个成员的链接/{{slug}} 已存在。是否要将其替换?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> 已经在使用 <strong>/{{slug}}</strong> 链接。",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> 已经在使用 <string>/{{slug}}</strong> 链接。",
"managed_event_dialog_clarification": "如果您选择将其替换,我们会通知他们。如果您不想将其覆盖,请返回并移除它们。",
"review_event_type": "查看活动类型",
"looking_for_more_analytics": "寻找更多分析?",
"looking_for_more_insights": "寻找更多洞察?",
"add_filter": "添加筛选器",
"select_user": "选择用户",
"select_event_type": "选择活动类型",
"select_date_range": "选择日期范围",
"popular_events": "热门活动",
"no_event_types_found": "未找到任何活动类型",
"average_event_duration": "平均活动持续时间",
"most_booked_members": "预约最多的成员",
"least_booked_members": "预约最少的成员",
"events_created": "创建的活动",
"events_completed": "完成的活动",
"events_cancelled": "取消的活动",
"events_rescheduled": "重新安排的活动",
"from_last_period": "从上一期间",
"from_to_date_period": "开始日期: {{startDate}} 结束日期: {{endDate}}",
"analytics_for_organisation": "洞察",
"subtitle_analytics": "详细了解团队的活动",
"redirect_url_warning": "添加重定向将禁用成功页面。请确保在您的自定义成功页面上提及“预约已确认”。",
"event_trends": "活动趋势",
"clear_filters": "清除筛选器",
"hold": "保留",
"on_booking_option": "预约时收款",
"hold_option": "收取失约费",
"card_held": "卡已保留",
"charge_card": "对卡收款",
"card_charged": "卡已扣款",
"no_show_fee_amount": "{{amount, currency}} 失约费",
"no_show_fee": "失约费",
"submit_card": "提交卡",
"submit_payment_information": "提交付款信息",
"meeting_awaiting_payment_method": "您的会议正在等待付款方式",
"no_show_fee_charged_email_subject": "已为 {{date}} 的 {{title}} 收取 {{amount, currency}} 的失约费",
"no_show_fee_charged_text_body": "已收取失约费",
"no_show_fee_charged_subtitle": "已为以下活动收取 {{amount, currency}} 的失约费",
"error_charging_card": "收取失约费时出错。请稍后再试。",
"collect_no_show_fee": "收取失约费",
"no_show_fee_charged": "已收取失约费",
"insights": "洞察",
"testing_workflow_info_message": "测试此工作流程时请注意,电子邮件和短信只能提前至少 1 小时安排",
"insights_no_data_found_for_filter": "未找到所选筛选器或所选日期的数据。",
"acknowledge_booking_no_show_fee": "我确认,如果我不参加此活动,我的卡将被收取 {{amount, currency}} 的失约费。",
"card_details": "卡详细信息",
"seats_and_no_show_fee_error": "当前无法启用位置和收取失约费",
"complete_your_booking": "完成您的预约",
"complete_your_booking_subject": "完成您的预约: {{date}} 的 {{title}}",
"email_invite_team": "{{email}} 已被邀请"
}
@@ -1,4 +1,5 @@
{
"identity_provider": "身分提供者",
"trial_days_left": "試用 PRO 方案還有 $t(day, {\"count\": {{days}} })",
"day_one": "{{count}} 天",
"day_other": "{{count}} 天",
@@ -69,6 +70,8 @@
"event_awaiting_approval_subject": "等待核准:{{date}} 與 {{title}}",
"event_still_awaiting_approval": "活動還在等待核准",
"booking_submitted_subject": "已提出預約:{{date}} 與 {{title}}",
"download_recording_subject": "下載錄製內容:{{date}} 的 {{title}}",
"download_your_recording": "下載您的錄製內容",
"your_meeting_has_been_booked": "會議已經預定",
"event_type_has_been_rescheduled_on_time_date": "您的 {{title}} 已改期至 {{date}}。",
"event_has_been_rescheduled": "已更新 - 已經重新預定活動時間",
@@ -224,6 +227,7 @@
"done": "完成",
"all_done": "大功告成!",
"all_apps": "所有應用程式",
"available_apps": "可用的應用程式",
"check_email_reset_password": "請檢查信箱。已經把重設密碼的連結寄出。",
"finish": "結束",
"few_sentences_about_yourself": "一些關於自己的句子,這會顯示在個人網址頁。",
@@ -404,6 +408,7 @@
"add_time_availability": "新增時段",
"add_an_extra_layer_of_security": "萬一密碼遭竊的時候,為帳號增加額外安全層級。",
"2fa": "兩階段認證",
"2fa_disabled": "兩階段認證只能針對電子郵件和密碼驗證啟用",
"enable_2fa": "開啟兩階段認證",
"disable_2fa": "關閉兩階段認證",
"disable_2fa_recommendation": "如果有必要關閉兩階段認證,我們建議還是要盡快重新開啟。",
@@ -585,6 +590,20 @@
"minutes": "分鐘",
"round_robin": "循環制",
"round_robin_description": "與多位團隊成員進行週期會議。",
"managed_event": "受控活動",
"username_placeholder": "使用者名稱",
"managed_event_description": "大量建立並分配活動類型給團隊成員",
"managed": "受控",
"managed_event_url_clarification": "「使用者名稱」會填入指派成員的使用者名稱",
"assign_to": "指派給",
"add_members": "新增成員……",
"count_members_one": "{{count}} 名成員",
"count_members_other": "{{count}} 名成員",
"no_assigned_members": "沒有已指派的成員",
"assigned_to": "已指派給",
"start_assigning_members_above": "開始指派以上成員",
"locked_fields_admin_description": "成員將無法編輯此資訊",
"locked_fields_member_description": "此選項已被團隊管理員鎖定",
"url": "網址",
"hidden": "隱藏",
"readonly": "唯讀",
@@ -736,6 +755,11 @@
"minimum_booking_notice": "最晚預約通知",
"slot_interval": "時間單位",
"slot_interval_default": "使用活動長度(預設)",
"delete_event_type": "要刪除活動類型嗎?",
"delete_managed_event_type": "要建立受管活動類型嗎?",
"delete_event_type_description": "與您共用此連結的任何使用者將無法再使用此表單預約。",
"delete_managed_event_type_description": "<ul><li>獲指派此活動類型的成員的活動類型也將被刪除。</li><li>與他們共用此連結的任何使用者將無法再使用此連結預約。</li></ul>",
"confirm_delete_event_type": "是,刪除",
"delete_account": "刪除帳號",
"confirm_delete_account": "是,刪除帳號",
"delete_account_confirmation_message": "確定要刪除 {{appName}} 的帳號?任何分享過帳號連結的人再也無法以此進行預約,而且任何儲存過的偏好設定都會消失。",
@@ -1126,11 +1150,13 @@
"current_username": "目前使用者名稱",
"example_1": "範例 1",
"example_2": "範例 2",
"booking_question_identifier": "預約問題識別元",
"company_size": "公司規模",
"what_help_needed": "您需要什麼協助?",
"variable_format": "變數格式",
"webhook_subscriber_url_reserved": "已定義 Webhook 訂閱者網址",
"custom_input_as_variable_info": "忽略額外輸入標籤的所有特殊字元 (只使用字母和數字),所有字母一律使用大寫,並以底線取代空格。",
"using_booking_questions_as_variables": "要如何將預約問題當作變數?",
"download_desktop_app": "下載桌面版應用程式",
"set_ping_link": "設定 Ping 連結",
"rate_limit_exceeded": "已超過限速",
@@ -1176,6 +1202,7 @@
"start_of_week": "一週開始",
"recordings_title": "錄製",
"recording": "錄製",
"happy_scheduling": "排程愉快",
"select_calendars": "選擇您想要檢查衝突的行事曆來避免重複預約。",
"check_for_conflicts": "檢查衝突",
"view_recordings": "檢視錄製內容",
@@ -1213,6 +1240,7 @@
"impersonation": "模擬",
"impersonation_description": "管理使用者模擬的設定",
"users": "使用者",
"user": "使用者",
"profile_description": "管理您的 {{appName}} 個人資料設定",
"users_description": "您可以在這裡找到列出所有使用者的名單",
"users_listing": "使用者名單",
@@ -1253,6 +1281,8 @@
"download_responses": "下載回應",
"download_responses_description": "以 CSV 格式下載您表單的所有回覆。",
"download": "下載",
"download_recording": "下載錄製內容",
"recording_from_your_recent_call": "來自您最近在 Cal.com 的通話錄製內容已可供下載",
"create_your_first_form": "建立您的第一份表單",
"create_your_first_form_description": "您可使用引導表單提出符合條件的問題,並引導至適當的人員或活動類型。",
"create_your_first_webhook": "建立您的第一個 Webhook",
@@ -1289,6 +1319,15 @@
"exchange_authentication_standard": "基本驗證",
"exchange_authentication_ntlm": "NTLM 驗證",
"exchange_compression": "GZip 壓縮",
"exchange_version": "Exchange 版本",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "您可以在這裡查看您已建立的所有表單和引導路徑。",
"routing_forms_send_email_owner": "傳送電子郵件給擁有者",
"routing_forms_send_email_owner_description": "表單提交後傳送電子郵件給擁有者",
@@ -1343,6 +1382,7 @@
"add_limit": "新增限制",
"team_name_required": "需提供團隊名稱",
"show_attendees": "和賓客分享與會者資訊",
"how_booking_questions_as_variables": "如何將預約問題當作變數?",
"format": "格式",
"uppercase_for_letters": "一律使用大寫字母",
"replace_whitespaces_underscores": "以底線取代空格",
Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

After

Width:  |  Height:  |  Size: 155 KiB

-18
View File
@@ -784,24 +784,6 @@ describe("getSchedule", () => {
dateString: plus2DateString,
}
);
const scheduleForEventOnADayWithDateOverrideDifferentTimezone = await getSchedule(
{
eventTypeId: 1,
eventTypeSlug: "",
startTime: `${plus1DateString}T18:30:00.000Z`,
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+6:00"],
},
ctx
);
// it should return the same as this is the utc time
expect(scheduleForEventOnADayWithDateOverrideDifferentTimezone).toHaveTimeSlots(
["08:30:00.000Z", "09:30:00.000Z", "10:30:00.000Z", "11:30:00.000Z"],
{
dateString: plus2DateString,
}
);
});
test("that a user is considered busy when there's a booking they host", async () => {
+1
View File
@@ -12,6 +12,7 @@ export const appStoreMetadata = {} as AppStoreMetaData;
for (const [key, value] of Object.entries(rawAppStoreMetadata)) {
appStoreMetadata[key as keyof typeof appStoreMetadata] = {
appData: null,
dirName: "dirName" in value ? value.dirName : value.slug,
__template: "",
...value,
} as AppStoreMetaData[keyof AppStoreMetaData];
@@ -24,6 +24,7 @@ import { appKeysSchema as event_type_app_card_zod_ts } from "./templates/event-t
import { appKeysSchema as vital_zod_ts } from "./vital/zod";
import { appKeysSchema as wordpress_zod_ts } from "./wordpress/zod";
import { appKeysSchema as zapier_zod_ts } from "./zapier/zod";
import { appKeysSchema as zohocrm_zod_ts } from "./zohocrm/zod";
import { appKeysSchema as zoomvideo_zod_ts } from "./zoomvideo/zod";
export const appKeysSchemas = {
@@ -49,5 +50,6 @@ export const appKeysSchemas = {
vital: vital_zod_ts,
wordpress: wordpress_zod_ts,
zapier: zapier_zod_ts,
zohocrm: zohocrm_zod_ts,
zoomvideo: zoomvideo_zod_ts,
};
@@ -24,6 +24,7 @@ import { appDataSchema as event_type_app_card_zod_ts } from "./templates/event-t
import { appDataSchema as vital_zod_ts } from "./vital/zod";
import { appDataSchema as wordpress_zod_ts } from "./wordpress/zod";
import { appDataSchema as zapier_zod_ts } from "./zapier/zod";
import { appDataSchema as zohocrm_zod_ts } from "./zohocrm/zod";
import { appDataSchema as zoomvideo_zod_ts } from "./zoomvideo/zod";
export const appDataSchemas = {
@@ -49,5 +50,6 @@ export const appDataSchemas = {
vital: vital_zod_ts,
wordpress: wordpress_zod_ts,
zapier: zapier_zod_ts,
zohocrm: zohocrm_zod_ts,
zoomvideo: zoomvideo_zod_ts,
};
@@ -352,13 +352,21 @@ type FormActionProps<T> = {
action: FormActionType;
children?: React.ReactNode;
render?: (props: { routingForm: RoutingForm | null; className?: string; label?: string }) => JSX.Element;
extraClassNames?: string;
} & ButtonProps;
export const FormAction = forwardRef(function FormAction<T extends typeof Button>(
props: FormActionProps<T>,
forwardedRef: React.ForwardedRef<HTMLAnchorElement | HTMLButtonElement>
) {
const { action: actionName, routingForm, children, as: asFromElement, ...additionalProps } = props;
const {
action: actionName,
routingForm,
children,
as: asFromElement,
extraClassNames,
...additionalProps
} = props;
const { appUrl, _delete, toggle } = useContext(actionsCtx);
const dropdownCtxValue = useContext(dropdownCtx);
const dropdown = dropdownCtxValue?.dropdown;
@@ -419,11 +427,17 @@ export const FormAction = forwardRef(function FormAction<T extends typeof Button
return <></>;
}
return (
<div {...restProps} className="hover:bg-emphasis self-center rounded-md p-2">
<div
{...restProps}
className={classNames(
"sm:hover:bg-subtle self-center rounded-md p-2 hover:bg-gray-200",
extraClassNames
)}>
<Switch
checked={!routingForm.disabled}
label={label}
onCheckedChange={(checked) => toggle.onAction({ routingForm, checked })}
labelOnLeading
/>
</div>
);
@@ -66,8 +66,10 @@ const Actions = ({
return (
<div className="flex items-center">
<FormAction className="self-center" data-testid="toggle-form" action="toggle" routingForm={form} />
<VerticalDivider />
<div className="hidden items-center sm:inline-flex">
<FormAction className="self-center" data-testid="toggle-form" action="toggle" routingForm={form} />
<VerticalDivider />
</div>
<ButtonGroup combined containerProps={{ className: "hidden md:inline-flex items-center" }}>
<Tooltip content={t("preview")}>
<FormAction
@@ -186,7 +188,7 @@ const Actions = ({
{t("Copy Typeform Redirect Url")}
</FormAction>
) : null}
<DropdownMenuSeparator />
<DropdownMenuSeparator className="hidden sm:block" />
<FormAction
action="_delete"
routingForm={form}
@@ -196,6 +198,16 @@ const Actions = ({
StartIcon={Trash}>
{t("delete")}
</FormAction>
<div className="block sm:hidden">
<DropdownMenuSeparator />
<FormAction
data-testid="toggle-form"
action="toggle"
routingForm={form}
label="Disable Form"
extraClassNames="hover:bg-subtle cursor-pointer rounded-[5px] pr-4"
/>
</div>
</FormActionsDropdown>
</div>
<VerticalDivider />
@@ -272,8 +284,8 @@ function SingleForm({ form, appUrl, Page }: SingleFormComponentProps) {
subtitle={form.description || ""}
backPath={`/${appUrl}/forms`}
CTA={<Actions form={form} mutation={mutation} />}>
<div className="-mx-4 px-4 sm:px-6 md:-mx-8 md:px-8">
<div className="flex flex-col items-center md:flex-row md:items-start">
<div className="-mx-4 mt-4 px-4 sm:px-6 md:-mx-8 md:mt-0 md:px-8">
<div className="flex flex-col items-center items-baseline md:flex-row md:items-start">
<div className="lg:min-w-72 lg:max-w-72 mb-6 md:mr-6">
<TextField
type="text"
@@ -253,7 +253,11 @@ export default function RoutingForms({
}
RoutingForms.getLayout = (page: React.ReactElement) => {
return <Shell withoutMain={true}>{page}</Shell>;
return (
<Shell withoutMain={true} hideHeadingOnMobile>
{page}
</Shell>
);
};
export const getServerSideProps = async function getServerSideProps(
@@ -1,6 +1,5 @@
import { useRouter } from "next/router";
import { useState } from "react";
import { FormattedNumber, IntlProvider } from "react-intl";
import { useAppContextWithSchema } from "@calcom/app-store/EventTypeAppContext";
import AppCard from "@calcom/app-store/_components/AppCard";
@@ -47,11 +46,11 @@ const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({
description={
<>
<div className="">
{t("require_payment")} (0.5% +{" "}
<IntlProvider locale="en">
<FormattedNumber value={0.1} style="currency" currency={currency} />
</IntlProvider>{" "}
{t("commission_per_transaction")})
{t("payment_app_commission", {
paymentFeePercentage: 0.5,
fee: 0.1,
formatParams: { fee: { currency } },
})}
</div>
</>
}>
@@ -57,7 +57,7 @@ export default function ZapierSetup(props: IZapierSetupProps) {
{!newApiKey ? (
<>
<div className="mt-1 text-xl">{t("generate_api_key")}:</div>
<Button onClick={() => createApiKey()} className="mt-4 mb-4">
<Button color="primary" onClick={() => createApiKey()} className="mt-4 mb-4">
{t("generate_api_key")}
</Button>
</>
+8
View File
@@ -0,0 +1,8 @@
import { z } from "zod";
export const appKeysSchema = z.object({
client_id: z.string().min(1),
client_secret: z.string().min(1),
});
export const appDataSchema = z.object({});
+7 -1
View File
@@ -1,7 +1,13 @@
/** @type {import("eslint").Linter.Config} */
module.exports = {
root: true,
extends: ["plugin:playwright/playwright-test", "next", "plugin:prettier/recommended", "turbo"],
extends: [
"plugin:playwright/playwright-test",
"next",
"plugin:prettier/recommended",
"turbo",
"plugin:you-dont-need-lodash-underscore/compatible-warn",
],
plugins: ["unused-imports"],
parserOptions: {
tsconfigRootDir: __dirname,
+1
View File
@@ -25,6 +25,7 @@
"@typescript-eslint/parser": "^5.52.0",
"eslint": "^8.34.0",
"eslint-plugin-unused-imports": "^2.0.0",
"eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0",
"prettier": "^2.8.6",
"prettier-plugin-tailwindcss": "^0.2.5",
"tailwind-scrollbar": "^2.0.1",
+4 -3
View File
@@ -26,9 +26,10 @@ module.exports = {
error: "var(--cal-bg-error)",
black: "#111111",
brand: {
default: "var(--cal-brand,'#111827')",
emphasis: "var(--cal-brand-emphasis,'#101010')",
subtle: "var(--cal-brand-subtle,'#9CA3AF')",
default: "var(--cal-brand,#111827)",
emphasis: "var(--cal-brand-emphasis,#101010)",
subtle: "var(--cal-brand-subtle,#9CA3AF)",
accent: "var(--cal-brand-accent,white)",
},
gray: {
50: "#F9FAFB",
+4 -1
View File
@@ -70,7 +70,10 @@ type EventType = Awaited<ReturnType<typeof getEventType>>;
const getUser = (where: Prisma.UserWhereUniqueInput) =>
prisma.user.findUnique({
where,
select: availabilityUserSelect,
select: {
...availabilityUserSelect,
credentials: true,
},
});
type User = Awaited<ReturnType<typeof getUser>>;
+2
View File
@@ -161,6 +161,8 @@
<h3>
<a href="?only=ns:default">[Dark Theme][Guests(janedoe@example.com and test@example.com)]</a>
</h3>
<button onclick="Cal('ui',{theme:'light'})" >Toggle to Light</button>
<i class="last-action"> You would see last Booking page action in my place </i>
<div>
<div class="place" style="width: 100%"></div>
@@ -19,7 +19,8 @@ export const PermissionContainer: FC<AdminRequiredProps> = ({
const session = useSession();
// Admin can do everything
if (session.data?.user.role !== roleRequired || !UserPermissionRole.ADMIN) return null;
if (session.data?.user.role !== roleRequired && session.data?.user.role != UserPermissionRole.ADMIN)
return null;
const Component = as ?? Fragment;
return <Component {...rest}>{children}</Component>;
};
@@ -34,7 +34,7 @@ export default function BookingLayout({
...rest
}: { children: React.ReactNode } & ComponentProps<typeof Shell>) {
return (
<Shell {...rest}>
<Shell {...rest} hideHeadingOnMobile>
<div className="flex max-w-6xl flex-col">
<div className="flex flex-col lg:flex-row">
<HorizontalTabs tabs={tabs} />
@@ -38,7 +38,7 @@ async function getBookingToDelete(id: number | undefined, uid: string | undefine
user: {
select: {
id: true,
credentials: true,
credentials: true, // Not leaking at the moment, be careful with
email: true,
timeZone: true,
name: true,
@@ -197,7 +197,12 @@ const getEventTypesFromDB = async (eventTypeId: number) => {
id: true,
customInputs: true,
disableGuests: true,
users: userSelect,
users: {
select: {
credentials: true,
...userSelect.select,
},
},
slug: true,
team: {
select: {
@@ -253,7 +258,12 @@ const getEventTypesFromDB = async (eventTypeId: number) => {
hosts: {
select: {
isFixed: true,
user: userSelect,
user: {
select: {
credentials: true,
...userSelect.select,
},
},
},
},
availability: {
@@ -277,7 +287,7 @@ const getEventTypesFromDB = async (eventTypeId: number) => {
};
};
type IsFixedAwareUser = User & { isFixed: boolean };
type IsFixedAwareUser = User & { isFixed: boolean; credentials: Credential[] };
async function ensureAvailableUsers(
eventType: Awaited<ReturnType<typeof getEventTypesFromDB>> & {
@@ -623,6 +633,7 @@ async function handler(
},
select: {
...userSelect.select,
credentials: true, // Don't leak to client
metadata: true,
},
})
@@ -654,7 +665,10 @@ async function handler(
where: {
id: eventType.userId,
},
...userSelect,
select: {
credentials: true, // Don't leak to client
...userSelect.select,
},
});
if (!eventTypeUser) {
log.warn({ message: "NewBooking: eventTypeUser.notFound" });
@@ -683,8 +697,7 @@ async function handler(
return aIndex - bIndex;
});
const firstUsersMetadata = userMetadataSchema.parse(users[0].metadata);
const app = getAppFromSlug(firstUsersMetadata?.defaultConferencingApp?.appSlug);
locationBodyString = app?.appData?.location?.type || locationBodyString;
locationBodyString = firstUsersMetadata?.defaultConferencingApp?.appLink || locationBodyString;
defaultLocationUrl = firstUsersMetadata?.defaultConferencingApp?.appLink;
}
@@ -840,6 +853,7 @@ async function handler(
const calEventUserFieldsResponses =
"calEventUserFieldsResponses" in reqBody ? reqBody.calEventUserFieldsResponses : null;
let evt: CalendarEvent = {
type: eventType.title,
title: getEventName(eventNameObject), //this needs to be either forced in english, or fetched for each attendee and organizer separately
@@ -1429,6 +1443,7 @@ async function handler(
* deep cloning evt to avoid this
*/
const copyEvent = cloneDeep(evt);
copyEvent.uid = booking.uid;
await sendScheduledSeatsEmails(copyEvent, invitee[0], newSeat, !!eventType.seatsShowAttendees);
const credentials = await refreshCredentials(organizerUser.credentials);
@@ -1489,7 +1504,7 @@ async function handler(
// Here we should handle every after action that needs to be done after booking creation
// Obtain event metadata that includes videoCallUrl
const metadata = { videoCallUrl: evt.videoCallData?.url };
const metadata = evt.videoCallData?.url ? { videoCallUrl: evt.videoCallData.url } : undefined;
try {
await scheduleWorkflowReminders({
workflows: eventType.workflows,
@@ -2105,7 +2120,7 @@ async function handler(
log.error("Error while creating booking references", error);
}
const metadataFromEvent = { videoCallUrl };
const metadataFromEvent = videoCallUrl ? { videoCallUrl } : undefined;
try {
await scheduleWorkflowReminders({
@@ -3,7 +3,7 @@ import { Controller, useForm } from "react-hook-form";
import dayjs from "@calcom/dayjs";
import type { TApiKeys } from "@calcom/ee/api-keys/components/ApiKeyListItem";
import LicenseRequired from "@calcom/ee/common/components/v2/LicenseRequired";
import LicenseRequired from "@calcom/ee/common/components/LicenseRequired";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc/react";
import { Button, DatePicker, DialogFooter, Form, showToast, Switch, TextField, Tooltip } from "@calcom/ui";
@@ -1,14 +1,9 @@
/**
* @deprecated file
* All new changes should be made to the V2 file in
* `/packages/features/ee/common/components/v2/LicenseRequired.tsx`
*/
import DOMPurify from "dompurify";
import { useSession } from "next-auth/react";
import type { AriaRole, ComponentType } from "react";
import React, { Fragment } from "react";
import { APP_NAME, WEBAPP_URL } from "@calcom/lib/constants";
import { APP_NAME, CONSOLE_URL, SUPPORT_MAIL_ADDRESS, WEBAPP_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { EmptyScreen } from "@calcom/ui";
import { AlertTriangle } from "@calcom/ui/components/icon";
@@ -20,20 +15,15 @@ type LicenseRequiredProps = {
children: React.ReactNode;
};
/**
* @deprecated file
* All new changes should be made to the V2 file in
* `/packages/features/ee/common/components/v2/LicenseRequired.tsx`
* This component will only render it's children if the installation has a valid
* license.
*/
const LicenseRequired = ({ children, as = "", ...rest }: LicenseRequiredProps) => {
const { t } = useLocale();
const session = useSession();
const { t } = useLocale();
const Component = as || Fragment;
const hasValidLicense = session.data ? session.data.hasValidLicense : null;
return (
<Component {...rest}>
{session.data?.hasValidLicense ? (
{hasValidLicense === null || hasValidLicense ? (
children
) : (
<EmptyScreen
@@ -44,13 +34,12 @@ const LicenseRequired = ({ children, as = "", ...rest }: LicenseRequiredProps) =
dangerouslySetInnerHTML={{
__html: DOMPurify.sanitize(
t("enterprise_license_description", {
consoleUrl: `<a href="https://go.cal.com/console" target="_blank" class="underline">
consoleUrl: `<a href="${CONSOLE_URL}" target="_blank" rel="noopener noreferrer" class="underline">
${APP_NAME}
</a>`,
setupUrl: `<a href="${WEBAPP_URL}/auth/setup">/auth/setup</a>`,
supportMail: `<a href="mailto:sales@cal.com" class="underline">
sales@cal.com
</a>`,
setupUrl: `<a href="${WEBAPP_URL}/auth/setup" class="underline">/auth/setup</a>`,
supportMail: `<a href="mailto:${SUPPORT_MAIL_ADDRESS}" class="underline">
${SUPPORT_MAIL_ADDRESS}</a>`,
})
),
}}
@@ -1,64 +0,0 @@
import DOMPurify from "dompurify";
import { useSession } from "next-auth/react";
import type { AriaRole, ComponentType } from "react";
import React, { Fragment } from "react";
import { APP_NAME, CONSOLE_URL, SUPPORT_MAIL_ADDRESS, WEBAPP_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { EmptyScreen } from "@calcom/ui";
import { AlertTriangle } from "@calcom/ui/components/icon";
type LicenseRequiredProps = {
as?: keyof JSX.IntrinsicElements | "";
className?: string;
role?: AriaRole | undefined;
children: React.ReactNode;
};
const LicenseRequired = ({ children, as = "", ...rest }: LicenseRequiredProps) => {
const session = useSession();
const { t } = useLocale();
const Component = as || Fragment;
const hasValidLicense = session.data ? session.data.hasValidLicense : null;
return (
<Component {...rest}>
{hasValidLicense === null || hasValidLicense ? (
children
) : (
<EmptyScreen
Icon={AlertTriangle}
headline={t("enterprise_license")}
description={
<div
dangerouslySetInnerHTML={{
__html: DOMPurify.sanitize(
t("enterprise_license_description", {
consoleUrl: `<a href="${CONSOLE_URL}" target="_blank" rel="noopener noreferrer" class="underline">
${APP_NAME}
</a>`,
setupUrl: `<a href="${WEBAPP_URL}/auth/setup" class="underline">/auth/setup</a>`,
supportMail: `<a href="mailto:${SUPPORT_MAIL_ADDRESS}" class="underline">
${SUPPORT_MAIL_ADDRESS}</a>`,
})
),
}}
/>
}
/>
)}
</Component>
);
};
export const withLicenseRequired =
<T extends JSX.IntrinsicAttributes>(Component: ComponentType<T>) =>
// eslint-disable-next-line react/display-name
(hocProps: T) =>
(
<LicenseRequired>
<Component {...hocProps} />
</LicenseRequired>
);
export default LicenseRequired;
+33 -7
View File
@@ -55,7 +55,6 @@ async function getBooking(bookingId: number) {
select: {
id: true,
username: true,
credentials: true,
timeZone: true,
email: true,
name: true,
@@ -176,9 +175,11 @@ async function handlePaymentSuccess(event: Stripe.Event) {
eventTypeRaw = await getEventType(booking.eventTypeId);
}
const { user } = booking;
const { user: userWithCredentials } = booking;
if (!user) throw new HttpCode({ statusCode: 204, message: "No user found" });
if (!userWithCredentials) throw new HttpCode({ statusCode: 204, message: "No user found" });
const { credentials, ...user } = userWithCredentials;
const t = await getTranslation(user.locale ?? "en", "common");
const attendeesListPromises = booking.attendees.map(async (attendee) => {
@@ -227,7 +228,7 @@ async function handlePaymentSuccess(event: Stripe.Event) {
const isConfirmed = booking.status === BookingStatus.ACCEPTED;
if (isConfirmed) {
const eventManager = new EventManager(user);
const eventManager = new EventManager(userWithCredentials);
const scheduleResult = await eventManager.create(evt);
bookingData.references = { create: scheduleResult.referencesToCreate };
}
@@ -255,7 +256,14 @@ async function handlePaymentSuccess(event: Stripe.Event) {
await prisma.$transaction([paymentUpdate, bookingUpdate]);
if (!isConfirmed && !eventTypeRaw?.requiresConfirmation) {
await handleConfirmation({ user, evt, prisma, bookingId: booking.id, booking, paid: true });
await handleConfirmation({
user: userWithCredentials,
evt,
prisma,
bookingId: booking.id,
booking,
paid: true,
});
} else {
await sendScheduledEmails({ ...evt });
}
@@ -276,14 +284,32 @@ const handleSetupSuccess = async (event: Stripe.Event) => {
if (!payment?.data || !payment?.id) throw new HttpCode({ statusCode: 204, message: "Payment not found" });
const { booking, user, evt, eventTypeRaw } = await getBooking(payment.bookingId);
const { user, evt, eventTypeRaw } = await getBooking(payment.bookingId);
const bookingData: Prisma.BookingUpdateInput = {
paid: true,
};
const userWithCredentials = await prisma.user.findUnique({
where: {
id: user.id,
},
select: {
id: true,
username: true,
timeZone: true,
email: true,
name: true,
locale: true,
destinationCalendar: true,
credentials: true,
},
});
if (!userWithCredentials) throw new HttpCode({ statusCode: 204, message: "No user found" });
if (!eventTypeRaw?.requiresConfirmation) {
const eventManager = new EventManager(user);
const eventManager = new EventManager(userWithCredentials);
const scheduleResult = await eventManager.create(evt);
bookingData.references = { create: scheduleResult.referencesToCreate };
bookingData.status = BookingStatus.ACCEPTED;
@@ -57,19 +57,17 @@ const PaymentForm = (props: Props) => {
email: router.query.email,
};
if (paymentOption === "HOLD" && "setupIntent" in props.payment.data) {
const setupIntentData = props.payment.data as unknown as StripeSetupIntentData;
payload = await stripe.confirmSetup({
elements,
confirmParams: {
return_url: `${CAL_URL}/booking/${props.bookingUid}`,
return_url: props.eventType.successRedirectUrl || `${CAL_URL}/booking/${props.bookingUid}`,
},
});
} else if (paymentOption === "ON_BOOKING") {
const paymentData = props.payment.data as unknown as StripePaymentData;
payload = await stripe.confirmPayment({
elements,
confirmParams: {
return_url: `${CAL_URL}/booking/${props.bookingUid}`,
return_url: props.eventType.successRedirectUrl || `${CAL_URL}/booking/${props.bookingUid}`,
},
});
}
@@ -2,7 +2,6 @@ import classNames from "classnames";
import Head from "next/head";
import type { FC } from "react";
import { useEffect, useState } from "react";
import { FormattedNumber, IntlProvider } from "react-intl";
import { getSuccessPageLocationMessage } from "@calcom/app-store/locations";
import dayjs from "@calcom/dayjs";
@@ -19,7 +18,7 @@ import type { PaymentPageProps } from "../pages/payment";
import PaymentComponent from "./Payment";
const PaymentPage: FC<PaymentPageProps> = (props) => {
const { t } = useLocale();
const { t, i18n } = useLocale();
const [is24h, setIs24h] = useState(isBrowserLocale24h());
const [date, setDate] = useState(dayjs.utc(props.booking.startTime));
const [timezone, setTimezone] = useState<string | null>(null);
@@ -107,13 +106,10 @@ const PaymentPage: FC<PaymentPageProps> = (props) => {
{props.payment.paymentOption === "HOLD" ? t("no_show_fee") : t("price")}
</div>
<div className="col-span-2 mb-6 font-semibold">
<IntlProvider locale="en">
<FormattedNumber
value={paymentAppData.price / 100.0}
style="currency"
currency={paymentAppData?.currency?.toUpperCase()}
/>
</IntlProvider>
{new Intl.NumberFormat(i18n.language, {
style: "currency",
currency: paymentAppData.currency,
}).format(paymentAppData.price / 100.0)}
</div>
</div>
</div>

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