Translations (#900)

* Translations

* Variables to Translated Words

* Fix Translations

* Fix Title to Create Events Types

Co-authored-by: Bailey Pumfleet <pumfleet@hey.com>
This commit is contained in:
Tiago Cruz 2021-10-11 15:42:43 +02:00 committed by GitHub
parent 8cbf880af6
commit 82f11b5121
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 370 additions and 201 deletions

View file

@ -85,7 +85,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
const { eventType, locationOptions, availability, team, teamMembers, hasPaymentIntegration, currency } =
props;
const { locale } = useLocale({ localeProp: props.localeProp });
const { t, locale } = useLocale({ localeProp: props.localeProp });
const router = useRouter();
const [successModalOpen, setSuccessModalOpen] = useState(false);
@ -112,9 +112,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
});
const [users, setUsers] = useState<AdvancedOptions["users"]>([]);
const [editIcon, setEditIcon] = useState(true);
const [enteredAvailability, setEnteredAvailability] = useState();
const [showLocationModal, setShowLocationModal] = useState(false);
const [selectedTimeZone, setSelectedTimeZone] = useState("");
@ -250,7 +248,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
return (
<div>
<label htmlFor="address" className="block text-sm font-medium text-gray-700">
Set an address or place
{t("set_address_place")}
</label>
<div className="mt-1">
<input
@ -265,15 +263,13 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
</div>
);
case LocationType.Phone:
return (
<p className="text-sm">Cal will ask your invitee to enter a phone number before scheduling.</p>
);
return <p className="text-sm">{t("cal_invitee_phone_number_scheduling")}</p>;
case LocationType.GoogleMeet:
return <p className="text-sm">Cal will provide a Google Meet location.</p>;
return <p className="text-sm">{t("cal_provide_google_meet_location")}</p>;
case LocationType.Zoom:
return <p className="text-sm">Cal will provide a Zoom meeting URL.</p>;
return <p className="text-sm">{t("cal_provide_zoom_meeting_url")}</p>;
case LocationType.Daily:
return <p className="text-sm">Cal will provide a video meeting URL.</p>;
return <p className="text-sm">{t("cal_provide_video_meeting_url")}</p>;
}
return null;
};
@ -325,7 +321,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
centered
title={`${eventType.title} | Event Type`}
heading={
<div className="relative group -mb-2" onClick={() => setEditIcon(false)}>
<div className="relative -mb-2 group" onClick={() => setEditIcon(false)}>
<input
ref={titleRef}
type="text"
@ -345,16 +341,16 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
</div>
}
subtitle={eventType.description || ""}>
<div className="block sm:flex md:max-w-5xl mx-auto">
<div className="block mx-auto sm:flex md:max-w-5xl">
<div className="w-full mr-2 sm:w-9/12">
<div className="p-4 py-6 -mx-4 bg-white border rounded-sm border-neutral-200 sm:mx-0 sm:px-8">
<form onSubmit={updateEventTypeHandler} className="space-y-6">
<div className="space-y-3">
<div className="items-center block sm:flex">
<div className="mb-4 min-w-48 sm:mb-0">
<label htmlFor="slug" className="flex mt-0 text-sm font-medium text-neutral-700">
<label htmlFor="slug" className="mt-0 label-form-icon">
<LinkIcon className="w-4 h-4 mr-2 text-neutral-500" />
URL
{t("url")}
</label>
</div>
<div className="w-full">
@ -378,7 +374,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<MinutesField
label={
<>
<ClockIcon className="w-4 h-4 mr-2 mt-0.5 text-neutral-500" /> Duration
<ClockIcon className="w-4 h-4 mr-2 mt-0.5 text-neutral-500" /> {t("duration")}
</>
}
name="length"
@ -394,7 +390,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<div className="min-w-48 sm:mb-0">
<label htmlFor="location" className="flex mt-2.5 text-sm font-medium text-neutral-700">
<LocationMarkerIcon className="w-4 h-4 mr-2 mt-0.5 text-neutral-500" />
Location
{t("location")}
</label>
</div>
<div className="w-full">
@ -427,7 +423,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
{location.type === LocationType.Phone && (
<div className="flex items-center flex-grow">
<PhoneIcon className="w-6 h-6" />
<span className="ml-2 text-sm">Phone call</span>
<span className="ml-2 text-sm">{t("phone_call")}</span>
</div>
)}
{location.type === LocationType.GoogleMeet && (
@ -537,11 +533,11 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<button
type="button"
onClick={() => openLocationModal(location.type)}
className="mr-1 text-gray-500 hover:text-gray-900 p-1">
className="p-1 mr-1 text-gray-500 hover:text-gray-900">
<PencilIcon className="w-4 h-4" />
</button>
<button onClick={() => removeLocation(location)}>
<XIcon className="w-6 h-6 pl-1 border-l-1 text-gray-500 hover:text-gray-900 " />
<XIcon className="w-6 h-6 pl-1 text-gray-500 border-l-1 hover:text-gray-900 " />
</button>
</div>
</div>
@ -555,7 +551,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
onClick={() => setShowLocationModal(true)}>
<PlusIcon className="h-4 w-4 mt-0.5 text-neutral-900" />
<span className="ml-1 text-sm font-medium text-neutral-700">
Add a location
{t("add_location")}
</span>
</button>
</li>
@ -571,7 +567,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<div className="mb-4 min-w-48 sm:mb-0 mt-2.5">
<label htmlFor="description" className="flex mt-0 text-sm font-medium text-neutral-700">
<DocumentIcon className="w-4 h-4 mr-2 mt-0.5 text-neutral-500" />
Description
{t("description")}
</label>
</div>
<div className="w-full">
@ -579,7 +575,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
name="description"
id="description"
className="block w-full border-gray-300 rounded-sm shadow-sm focus:ring-primary-500 focus:border-primary-500 sm:text-sm"
placeholder="A quick video meeting."
placeholder={t("quick_video_meeting")}
defaultValue={asStringOrUndefined(eventType.description)}></textarea>
</div>
</div>
@ -592,7 +588,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<label
htmlFor="schedulingType"
className="flex mt-2 text-sm font-medium text-neutral-700">
<UsersIcon className="w-5 h-5 mr-2 text-neutral-500" /> Scheduling Type
<UsersIcon className="w-5 h-5 mr-2 text-neutral-500" /> {t("scheduling_type")}
</label>
</div>
<RadioArea.Select
@ -605,7 +601,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<div className="block sm:flex">
<div className="mb-4 min-w-48 sm:mb-0">
<label htmlFor="users" className="flex text-sm font-medium text-neutral-700">
<UserAddIcon className="w-5 h-5 mr-2 text-neutral-500" /> Attendees
<UserAddIcon className="w-5 h-5 mr-2 text-neutral-500" /> {t("attendees")}
</label>
</div>
<div className="w-full space-y-2">
@ -614,7 +610,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
defaultValue={eventType.users.map(mapUserToValue)}
options={teamMembers.map(mapUserToValue)}
id="users"
placeholder="Add attendees"
placeholder={t("add_attendees")}
/>
</div>
</div>
@ -628,13 +624,15 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<ChevronRightIcon
className={`${open ? "transform rotate-90" : ""} w-5 h-5 text-neutral-500 ml-auto`}
/>
<span className="text-sm font-medium text-neutral-700">Show advanced settings</span>
<span className="text-sm font-medium text-neutral-700">
{t("show_advanced_settings")}
</span>
</Disclosure.Button>
<Disclosure.Panel className="space-y-6">
<div className="items-center block sm:flex">
<div className="mb-4 min-w-48 sm:mb-0">
<label htmlFor="eventName" className="flex text-sm font-medium text-neutral-700">
Event name
{t("event_name")}
</label>
</div>
<div className="w-full">
@ -645,7 +643,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
name="title"
id="title"
className="block w-full border-gray-300 rounded-sm shadow-sm focus:ring-primary-500 focus:border-primary-500 sm:text-sm"
placeholder="Meeting with {USER}"
placeholder={t("meeting_with_user")}
defaultValue={eventType.eventName}
/>
</div>
@ -655,8 +653,8 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<div className="mb-4 min-w-48 sm:mb-0">
<label
htmlFor="additionalFields"
className="flexflex mt-2 text-sm font-medium text-neutral-700 text-sm font-medium text-neutral-700">
Additional inputs
className="mt-2 text-sm font-medium flexflex text-neutral-700">
{t("additional_inputs")}
</label>
</div>
<div className="w-full">
@ -666,7 +664,9 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<div className="flex justify-between">
<div>
<div>
<span className="ml-2 text-sm">Label: {customInput.label}</span>
<span className="ml-2 text-sm">
{t("label")}: {customInput.label}
</span>
</div>
{customInput.placeholder && (
<div>
@ -676,7 +676,9 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
</div>
)}
<div>
<span className="ml-2 text-sm">Type: {customInput.type}</span>
<span className="ml-2 text-sm">
{t("type")}: {customInput.type}
</span>
</div>
<div>
<span className="ml-2 text-sm">
@ -692,7 +694,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
}}
color="minimal"
type="button">
Edit
{t("edit")}
</Button>
<button type="button" onClick={() => removeCustom(idx)}>
<XIcon className="w-6 h-6 pl-1 border-l-2 hover:text-red-500 " />
@ -710,7 +712,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
color="secondary"
type="button"
StartIcon={PlusIcon}>
Add an input
{t("add_input")}
</Button>
</li>
</ul>
@ -720,23 +722,23 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<CheckboxField
id="requiresConfirmation"
name="requiresConfirmation"
label="Opt-in booking"
description="The booking needs to be manually confirmed before it is pushed to the integrations and a confirmation mail is sent."
label={t("opt_in_booking")}
description={t("opt_in_booking_description")}
defaultChecked={eventType.requiresConfirmation}
/>
<CheckboxField
id="disableGuests"
name="disableGuests"
label="Disable guests"
description="Disable adding aditional guests while booking."
label={t("disable_guests")}
description={t("disable_guests_description")}
defaultChecked={eventType.disableGuests}
/>
<hr className="my-2 border-neutral-200" />
<MinutesField
label="Minimum booking notice"
label={t("minimum_booking_notice")}
name="minimumBookingNotice"
id="minimumBookingNotice"
required
@ -749,12 +751,12 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<label
htmlFor="inviteesCanSchedule"
className="flex text-sm font-medium text-neutral-700 mt-2.5">
Invitees can schedule
{t("invitees_can_schedule")}
</label>
</div>
<div className="w-full">
<RadioGroup value={periodType} onChange={setPeriodType}>
<RadioGroup.Label className="sr-only">Date Range</RadioGroup.Label>
<RadioGroup.Label className="sr-only">{t("date_range")}</RadioGroup.Label>
<div>
{PERIOD_TYPES.map((period) => (
<RadioGroup.Option
@ -804,8 +806,8 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
defaultValue={
eventType.periodCountCalendarDays ? "1" : "0"
}>
<option value="1">calendar days</option>
<option value="0">business days</option>
<option value="1">{t("calendar_days")}</option>
<option value="0">{t("business_days")}</option>
</select>
</div>
)}
@ -838,7 +840,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<label
htmlFor="availability"
className="flex text-sm font-medium text-neutral-700">
Availability
{t("availability")}
</label>
</div>
<div className="w-full">
@ -859,7 +861,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<label
htmlFor="payment"
className="flex mt-2 text-sm font-medium text-neutral-700">
Payment
{t("payment")}
</label>
</div>
@ -880,7 +882,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
</div>
<div className="ml-3 text-sm">
<p className="text-neutral-900">
Require Payment (0.5% +{" "}
{t("require_payment")} (0.5% +{" "}
<IntlProvider locale="en">
<FormattedNumber
value={0.1}
@ -888,7 +890,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
currency={currency}
/>
</IntlProvider>{" "}
commission per transaction)
{t("commission_per_transaction")})
</p>
</div>
</div>
@ -939,14 +941,15 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
</Disclosure>
<div className="flex justify-end mt-4 space-x-2">
<Button href="/event-types" color="secondary" tabIndex={-1}>
Cancel
{t("cancel")}
</Button>
{t("update")}
</Button>
<Button type="submit">Update</Button>
</div>
</form>
<Modal
heading="Event Type updated successfully"
description="Your event type has been updated successfully."
heading={t("event_type_updated_successfully")}
description={t("event_type_updated_successfully_description")}
open={successModalOpen}
handleClose={closeSuccessModal}
/>
@ -958,7 +961,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
name="isHidden"
defaultChecked={hidden}
onCheckedChange={setHidden}
label="Hide event type"
label={t("hide_event_type")}
/>
</div>
<div className="mt-4 space-y-1.5">
@ -966,9 +969,9 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
href={permalink}
target="_blank"
rel="noreferrer"
className="flex font-medium text-md text-neutral-700 text-sm items-center hover:text-gray-900 hover:bg-gray-200 px-2 py-1 rounded-sm inline-flex">
className="flex inline-flex items-center px-2 py-1 text-sm font-medium rounded-sm text-md text-neutral-700 hover:text-gray-900 hover:bg-gray-200">
<ExternalLinkIcon className="w-4 h-4 mr-2 text-neutral-500" aria-hidden="true" />
Preview
{t("preview")}
</a>
<button
onClick={() => {
@ -976,23 +979,22 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
showToast("Link copied!", "success");
}}
type="button"
className="flex font-medium text-md text-sm text-gray-700 items-center hover:text-gray-900 hover:bg-gray-200 px-2 py-1 rounded-sm">
className="flex items-center px-2 py-1 text-sm font-medium text-gray-700 rounded-sm text-md hover:text-gray-900 hover:bg-gray-200">
<LinkIcon className="w-4 h-4 mr-2 text-neutral-500" />
Copy link
{t("copy_link")}
</button>
<Dialog>
<DialogTrigger className="flex font-medium text-md text-sm text-neutral-700 items-center hover:text-gray-900 hover:bg-gray-200 px-2 py-1 rounded-sm">
<DialogTrigger className="flex items-center px-2 py-1 text-sm font-medium rounded-sm text-md text-neutral-700 hover:text-gray-900 hover:bg-gray-200">
<TrashIcon className="w-4 h-4 mr-2 text-neutral-500" />
Delete
{t("delete")}
</DialogTrigger>
<ConfirmationDialogContent
localeProp={locale}
variety="danger"
title="Delete Event Type"
confirmBtnText="Yes, delete event type"
title={t("delete_event_type")}
confirmBtnText={t("confirm_delete_event_type")}
onConfirm={deleteEventTypeHandler}>
Are you sure you want to delete this event type? Anyone who you&apos;ve shared this link
with will no longer be able to book using it.
{t("delete_event_type_description")}
</ConfirmationDialogContent>
</Dialog>
</div>
@ -1020,7 +1022,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
</div>
<div className="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
<h3 className="text-lg font-medium leading-6 text-gray-900" id="modal-title">
Edit location
{t("edit_location")}
</h3>
</div>
</div>
@ -1037,10 +1039,10 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
<LocationOptions />
<div className="mt-5 sm:mt-4 sm:flex sm:flex-row-reverse">
<button type="submit" className="btn btn-primary">
Update
{t("update")}
</button>
<button onClick={closeLocationModal} type="button" className="mr-2 btn btn-white">
Cancel
{t("cancel")}
</button>
</div>
</form>
@ -1057,11 +1059,10 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
</div>
<div className="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
<h3 className="text-lg font-medium leading-6 text-gray-900" id="modal-title">
Add new custom input field
{t("add_new_custom_input_field")}
</h3>
<div>
<p className="text-sm text-gray-400">This input will be shown when booking this event</p>
</div>
<p className="text-sm text-gray-400">{t("this_input_will_shown_booking_this_event")}</p>
</div>
</div>
<CustomInputTypeForm
@ -1091,6 +1092,7 @@ const EventTypePage = (props: inferSSRProps<typeof getServerSideProps>) => {
}}
/>
</div>
</div>
</DialogContent>
</Dialog>
</Shell>
@ -1244,7 +1246,6 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
if (hasDailyIntegration) {
locationOptions.push({ value: LocationType.Daily, label: "Daily.co Video" });
}
const currency =
(credentials.find((integration) => integration.type === "stripe_payment")?.key as unknown as StripeData)
?.default_currency || "usd";

View file

@ -55,17 +55,14 @@ type Profile = PageProps["profiles"][number];
type MembershipCount = EventType["metadata"]["membershipCount"];
const EventTypesPage = (props: PageProps) => {
const { locale } = useLocale({ localeProp: props.localeProp });
const { t, locale } = useLocale({ localeProp: props.localeProp });
const CreateFirstEventTypeView = () => (
<div className="md:py-20">
<UserCalendarIllustration />
<div className="block mx-auto text-center md:max-w-screen-sm">
<h3 className="mt-2 text-xl font-bold text-neutral-900">Create your first event type</h3>
<p className="mt-1 mb-2 text-md text-neutral-600">
Event types enable you to share links that show available times on your calendar and allow people to
make bookings with you.
</p>
<h3 className="mt-2 text-xl font-bold text-neutral-900">{t("new_event_type_heading")}</h3>
<p className="mt-1 mb-2 text-md text-neutral-600">{t("new_event_type_description")}</p>
<CreateNewEventDialog
localeProp={locale}
canAddEvents={props.canAddEvents}
@ -151,12 +148,12 @@ const EventTypesPage = (props: PageProps) => {
<span className="font-medium truncate text-neutral-900">{type.title}</span>
{type.hidden && (
<span className="ml-2 inline items-center px-1.5 py-0.5 rounded-sm text-xs font-medium bg-yellow-100 text-yellow-800">
Hidden
{t("hidden")}
</span>
)}
{readOnly && (
<span className="ml-2 inline items-center px-1.5 py-0.5 rounded-sm text-xs font-medium bg-gray-100 text-gray-800">
Readonly
{t("readonly")}
</span>
)}
</div>
@ -207,7 +204,7 @@ const EventTypesPage = (props: PageProps) => {
<>
<div>
<Menu.Button className="p-2 mt-1 border border-transparent text-neutral-400 hover:border-gray-200">
<span className="sr-only">Open options</span>
<span className="sr-only">{t("open_options")}</span>
<DotsHorizontalIcon className="w-5 h-5" aria-hidden="true" />
</Menu.Button>
</div>
@ -239,7 +236,7 @@ const EventTypesPage = (props: PageProps) => {
className="w-4 h-4 mr-3 text-neutral-400 group-hover:text-neutral-500"
aria-hidden="true"
/>
Preview
{t("preview")}
</a>
)}
</Menu.Item>
@ -260,7 +257,7 @@ const EventTypesPage = (props: PageProps) => {
className="w-4 h-4 mr-3 text-neutral-400 group-hover:text-neutral-500"
aria-hidden="true"
/>
Copy link to event
{t("copy_link")}
</button>
)}
</Menu.Item>
@ -281,12 +278,12 @@ const EventTypesPage = (props: PageProps) => {
return (
<div>
<Head>
<title>Event Types | Cal.com</title>
<title>{t("event_types_page_title")}| Cal.com</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<Shell
heading="Event Types"
subtitle="Create events to share for people to book on your calendar."
heading={t("event_types_page_title")}
subtitle={t("event_types_page_subtitle")}
CTA={
props.eventTypes.length !== 0 && (
<CreateNewEventDialog canAddEvents={props.canAddEvents} profiles={props.profiles} />
@ -295,10 +292,10 @@ const EventTypesPage = (props: PageProps) => {
{props.user.plan === "FREE" && !props.canAddEvents && (
<Alert
severity="warning"
title={<>You need to upgrade your plan to have more than one active event type.</>}
title={<>{t("plan_upgrade")}</>}
message={
<>
To upgrade go to{" "}
{t("to_upgrade_go_to")}{" "}
<a href={"https://cal.com/upgrade"} className="underline">
{"https://cal.com/upgrade"}
</a>
@ -384,7 +381,7 @@ const CreateNewEventDialog = ({
<Button EndIcon={ChevronDownIcon}>{t("new_event_type_btn")}</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuLabel>Create an event type under your name or a team.</DropdownMenuLabel>
<DropdownMenuLabel>{t("new_event_subtitle")}</DropdownMenuLabel>
<DropdownMenuSeparator className="h-px bg-gray-200" />
{profiles.map((profile) => (
<DropdownMenuItem
@ -420,10 +417,10 @@ const CreateNewEventDialog = ({
<DialogContent>
<div className="mb-8">
<h3 className="text-lg font-bold leading-6 text-gray-900" id="modal-title">
Add a new {teamId ? "team " : ""}event type
{teamId ? t("add_new_team_event_type") : t("add_new_event_type")}
</h3>
<div>
<p className="text-sm text-gray-500">Create a new event type for people to book times with.</p>
<p className="text-sm text-gray-500">{t("new_event_type_to_book_description")}</p>
</div>
</div>
<form
@ -452,7 +449,7 @@ const CreateNewEventDialog = ({
<div>
<div className="mb-4">
<label htmlFor="title" className="block text-sm font-medium text-gray-700">
Title
{t("title")}
</label>
<div className="mt-1">
<input
@ -467,17 +464,18 @@ const CreateNewEventDialog = ({
id="title"
required
className="block w-full border-gray-300 rounded-sm shadow-sm focus:ring-neutral-900 focus:border-neutral-900 sm:text-sm"
placeholder="Quick Chat"
placeholder={t("quick_chat")}
/>
</div>
</div>
<div className="mb-4">
<label htmlFor="slug" className="block text-sm font-medium text-gray-700">
URL
{t("url")}
</label>
<div className="mt-1">
<div className="flex rounded-sm shadow-sm">
<span className="inline-flex items-center px-3 text-gray-500 border border-r-0 border-gray-300 rounded-l-md bg-gray-50 sm:text-sm">
<span className="input-left">
{process.env.NEXT_PUBLIC_APP_URL}/{router.query.eventPage || profiles[0].slug}/
</span>
<input
@ -493,20 +491,20 @@ const CreateNewEventDialog = ({
</div>
<div className="mb-4">
<label htmlFor="description" className="block text-sm font-medium text-gray-700">
Description
{t("description")}
</label>
<div className="mt-1">
<textarea
name="description"
id="description"
className="block w-full border-gray-300 rounded-sm shadow-sm focus:ring-neutral-900 focus:border-neutral-900 sm:text-sm"
placeholder="A quick video meeting."
placeholder={t("quick_video_meeting")}
/>
</div>
</div>
<div className="mb-4">
<label htmlFor="length" className="block text-sm font-medium text-gray-700">
Length
{t("length")}
</label>
<div className="relative mt-1 rounded-sm shadow-sm">
<input
@ -519,7 +517,7 @@ const CreateNewEventDialog = ({
defaultValue={15}
/>
<div className="absolute inset-y-0 right-0 flex items-center pr-3 text-sm text-gray-400">
minutes
{t("minutes")}
</div>
</div>
</div>
@ -527,28 +525,28 @@ const CreateNewEventDialog = ({
{teamId && (
<div className="mb-4">
<label htmlFor="schedulingType" className="block text-sm font-medium text-gray-700">
Scheduling Type
{t("scheduling_type")}
</label>
<RadioArea.Group
name="schedulingType"
className="relative flex mt-1 space-x-6 rounded-sm shadow-sm">
<RadioArea.Item value={SchedulingType.COLLECTIVE} className="w-1/2 text-sm">
<strong className="block mb-1">Collective</strong>
<p>Schedule meetings when all selected team members are available.</p>
<strong className="block mb-1">{t("collective")}</strong>
<p>{t("collective_description")}</p>
</RadioArea.Item>
<RadioArea.Item value={SchedulingType.ROUND_ROBIN} className="w-1/2 text-sm">
<strong className="block mb-1">Round Robin</strong>
<p>Cycle meetings between multiple team members.</p>
<strong className="block mb-1">{t("round_robin")}</strong>
<p>{t("round_robin_description")}</p>
</RadioArea.Item>
</RadioArea.Group>
</div>
)}
<div className="mt-8 sm:flex sm:flex-row-reverse gap-x-2">
<Button type="submit" loading={createMutation.isLoading}>
Continue
{t("continue")}
</Button>
<DialogClose asChild>
<Button color="secondary">Cancel</Button>
<Button color="secondary">{t("cancel")}</Button>
</DialogClose>
</div>
</form>

View file

@ -145,5 +145,89 @@
"new_event_subtitle": "Create an event type under your name or a team.",
"new_team_event": "Add a new team event type",
"new_event_description": "Create a new event type for people to book times with.",
"event_type_created_successfully": "{{eventTypeTitle}} event type created successfully"
"event_type_created_successfully": "{{eventTypeTitle}} event type created successfully",
"hours": "Hours",
"full_name": "Full Name",
"your_email": "Your Email",
"change_avatar": "Change Avatar",
"language": "Language",
"timezone": "Timezone",
"first_day_week": "First day week",
"single_theme": "Single Theme",
"file_not_named": "File is not named [idOrSlug]/[user]",
"create_team": "Create Team",
"name_team": "Name",
"create_new_team_description": "Create a new team to collaborate with users.",
"create_new_team": "Create a new team",
"open_invitations": "Open Invitations",
"new_team": "New Team",
"create_first_invite_other_users": "Create your first team and invite other users to work together with you.",
"create_team_get_started": "Create a team to get started",
"teams": "Teams",
"create_manage_teams_collaborative": "Create and manage teams to use collaborative features.",
"this_feature_only_available_paid_plan": "This feature is only available in paid plan",
"order_remove_cal_branding_description": "In order to remove the Cal branding from your booking pages, you need to upgrade to a paid account.",
"to_upgrade_go_to": "To upgrade go to",
"edit_profile_info_description": "Edit your profile information, which shows on your scheduling link.",
"change_email_contact": "To change your email, please contact",
"little_something_about": "A little something about yourself.",
"profile_updated_successfully": "Profile updated successfully",
"your_user_profile_updated_successfully": "Your user profile has been updated successfully.",
"user_cannot_found_db": "User seems logged in but cannot be found in the db",
"embed_and_webhooks": "Embed &amp; Webhooks",
"enabled": "Enabled",
"disabled": "Disabled",
"billing": "Billing",
"manage_your_billing_info": "Manage your billing information and cancel your subscription.",
"availability": "Availability",
"configure_times_available_bookings": "Configure times when you are available for bookings.",
"change_weekly_schedule": "Change your weekly schedule",
"logo": "Logo",
"error": "Error",
"team_logo": "Team Logo",
"add_location": "Add a location",
"attendees": "Attendees",
"add_attendees": "Add attendees",
"show_advanced_settings": "Show advanced settings",
"event_name": "Event Name",
"meeting_with_user": "Meeting with {USER}",
"additional_inputs": "Additional Inputs",
"label": "Label",
"type": "Type",
"edit": "Edit",
"add_input": "Add an Input",
"opt_in_booking": "Opt-in Booking",
"opt_in_booking_description": "The booking needs to be manually confirmed before it is pushed to the integrations and a confirmation mail is sent.",
"disable_guests": "Disable Guests",
"disable_guests_description": "Disable adding additional guests while booking.",
"invitees_can_schedule": "Invitees can schedule",
"date_range": "Date Range",
"calendar_days": "calendar days",
"business_days": "business days",
"payment": "Payment",
"set_address_place": "Set an address or place",
"cal_invitee_phone_number_scheduling": "Cal will ask your invitee to enter a phone number before scheduling.",
"cal_provide_google_meet_location": "Cal will provide a Google Meet location.",
"cal_provide_zoom_meeting_url": "Cal will provide a Zoom meeting URL.",
"cal_provide_video_meeting_url": "Cal will provide a Daily video meeting URL.",
"require_payment": "Require Payment",
"commission_per_transaction": "commission per transaction",
"event_type_updated_successfully": "Event Type updated successfully",
"event_type_updated_successfully_description": "Your event type has been updated successfully.",
"hide_event_type": "Hide event type",
"edit_location": "Edit location",
"into_the_future": "into the future",
"within_date_range": "Within a date range",
"indefinitely_into_future": "Indefinitely into the future",
"this_input_will_shown_booking_this_event": "This input will be shown when booking this event",
"add_new_custom_input_field": "Add new custom input field",
"quick_chat": "Quick Chat",
"add_new_team_event_type": "Add a new team event type",
"add_new_event_type": "Add a new event type",
"new_event_type_to_book_description": "Create a new event type for people to book times with.",
"length": "Length",
"minimum_booking_notice": "Minimum booking notice",
"delete_event_type_description": "Are you sure you want to delete this event type? Anyone who you&apos;ve shared this link with will no longer be able to book using it.",
"delete_event_type": "Delete Event Type",
"confirm_delete_event_type": "Yes, delete event type"
}

View file

@ -1,37 +1,39 @@
{
"edit_logo": "Cambiar la marca",
"upload_a_logo": "Subir una marca",
"enable": "Habilitar",
"uh_oh": "Uh oh!",
"no_event_types_have_been_setup": "Este usuario aún no ha configurado ningún tipo de evento.",
"edit_logo": "Cambiar Logo",
"upload_a_logo": "Subir Logo",
"enable": "Activar",
"code": "Código",
"code_is_incorrect": "El código es incorrecto.",
"code_is_incorrect": "Código Incorrecto.",
"add_an_extra_layer_of_security": "Agregue una capa adicional de seguridad a su cuenta en caso de que le roben su contraseña.",
"2fa": "Autorización de dos factores",
"enable_2fa": "Habilitar la autenticación de dos factores",
"disable_2fa": "Deshabilitar la autenticación de dos factores",
"disable_2fa_recommendation": "Si necesita deshabilitar 2FA, le recomendamos que lo vuelva a habilitar lo antes posible.",
"error_disabling_2fa": "Error al deshabilitar la autenticación de dos factores",
"2fa": "Autorización de Dos Factores",
"enable_2fa": "Activar la Autenticación de Dos Factores",
"disable_2fa": "Desactivar la Autenticación de Dos Factores",
"disable_2fa_recommendation": "Si necesita desactivar 2FA, le recomendamos que lo vuelva a activar lo antes posible.",
"error_disabling_2fa": "Error al desactivar la autenticación de dos factores",
"error_enabling_2fa": "Error al configurar la autenticación de dos factores",
"security": "Seguridad",
"manage_account_security": "Administra la seguridad de tu cuenta.",
"manage_account_security": "Administra la Seguridad de tu Cuenta.",
"password": "Contraseña",
"password_updated_successfully": "Contraseña actualizada con éxito",
"password_has_been_changed": "Su contraseña se ha cambiado correctamente.",
"error_changing_password": "Error al cambiar la contraseña",
"something_went_wrong": "Algo ha fallado",
"please_try_again": "Por favor, inténtalo de nuevo",
"super_secure_new_password": "Su nueva contraseña super segura",
"new_password": "Nueva contraseña",
"your_old_password": "Su contraseña antigua",
"current_password": "Contraseña actual",
"password_updated_successfully": "Contraseña Actualizada con Éxito",
"password_has_been_changed": "Su Contraseña se ha Cambiado Correctamente.",
"error_changing_password": "Error al Cambiar la Contraseña",
"something_went_wrong": "Algo ha Fallado",
"please_try_again": "Por Favor, Inténtalo de Nuevo",
"super_secure_new_password": "Tu Nueva Contraseña Super Segura",
"new_password": "Nueva Contraseña",
"your_old_password": "Contraseña Antigua",
"current_password": "Contraseña Actual",
"change_password": "Cambiar Contraseña",
"new_password_matches_old_password": "La nueva contraseña coincide con su contraseña antigua. Por favor, elija una contraseña diferente.",
"current_incorrect_password": "La contraseña actual es incorrecta",
"incorrect_password": "La contraseña es incorrecta",
"current_incorrect_password": "La Contraseña Actual es Incorrecta",
"incorrect_password": "La Contraseña es Incorrecta",
"1_on_1": "1 a 1",
"24_h": "24hs",
"use_setting": "Usar configuración",
"use_setting": "Usar Ajuste",
"am_pm": "am/pm",
"time_options": "Opciones de tiempo",
"time_options": "Opciones Horas",
"january": "Enero",
"february": "Febrero",
"march": "Marzo",
@ -51,53 +53,53 @@
"friday": "Viernes",
"saturday": "Sábado",
"sunday": "Domingo",
"all_booked_today": "Todo reservado hoy.",
"all_booked_today": "Todo Reservado Hoy.",
"slots_load_fail": "No se pudo cargar el intervalo de tiempo disponible.",
"additional_guests": "+ Invitados adicionales",
"your_name": "Tu nombre",
"email_address": "Correo electrónico",
"additional_guests": "+ Invitados Adicionales",
"your_name": "Tu Nombre",
"email_address": "Email",
"location": "Ubicación",
"yes": "sí",
"no": "no",
"additional_notes": "Notas adicionales",
"booking_fail": "No se pudo reservar la reunión.",
"reschedule_fail": "No se pudo cambiar la reunión.",
"share_additional_notes": "Por favor comparta cualquier cosa que nos ayude preparar para esta reunión.",
"yes": "Sí",
"no": "No",
"additional_notes": "Notas Adicionales",
"booking_fail": "No se ha podido reservar la reunión.",
"reschedule_fail": "No se ha podido reprogramar la reunión.",
"share_additional_notes": "Por favor, comparta cualquier cosa que ayude a preparar nuestra reunión.",
"booking_confirmation": "Confirma tu {{eventTypeTitle}} con {{profileName}}",
"booking_reschedule_confirmation": "Cambia tu {{eventTypeTitle}} con {{profileName}}",
"in_person_meeting": "Reunión en línea o en persona",
"phone_call": "Llamada telefónica",
"phone_number": "Número telefónico",
"enter_phone_number": "Entra un número de teléfono",
"reschedule": "Cambiar",
"booking_reschedule_confirmation": "Reprogramar tu {{eventTypeTitle}} con {{profileName}}",
"in_person_meeting": "Reunión en Línea o en Persona",
"phone_call": "Llamada Telefónica",
"phone_number": "Nª de Telefono",
"enter_phone_number": "Introducir Nº de Telefono",
"reschedule": "Reprogramar",
"book_a_team_member": "Reservar un miembro del equipo en su lugar",
"or": "O",
"go_back": "Volver",
"email_or_username": "Correo electrónico o nombre de usuario",
"send_invite_email": "Enviar una invitación electrónica",
"role": "Título",
"edit_team": "Editar equipo",
"email_or_username": "Email o Nombre de Usuario",
"send_invite_email": "Enviar Invitación por Email",
"role": "Rol",
"edit_team": "Editar Equipo",
"reject": "Rechazar",
"accept": "Aceptar",
"leave": "Salir",
"leave": "Abandonar",
"profile": "Perfil",
"my_team_url": "URL de mi equipo",
"team_name": "Nombre del equipo",
"your_team_name": "Nombre de tu equipo",
"team_updated_successfully": "Equipo actualizado correctamente",
"your_team_updated_successfully": "Tu equipo se ha actualizado correctamente.",
"my_team_url": "URL de Mi Equipo",
"team_name": "Nombre del Equipo",
"your_team_name": "Nombre de tu Equipo",
"team_updated_successfully": "Equipo Actualizado Correctamente",
"your_team_updated_successfully": "Tu equipo ha sido actualizado con éxito.",
"about": "Acerca de",
"team_description": "Algunas frases sobre tu equipo. Esto aparecerá en la página de tu equipo.",
"team_description": "Descripción del Equipo. Esto aparecerá en la página de tu equipo.",
"members": "Miembros",
"member": "Miembro",
"owner": "Propietario",
"new_member": "Nuevo miembro",
"new_member": "Nuevo Miembro",
"invite": "Invitar",
"invite_new_member": "Invita a un nuevo miembro",
"invite_new_member": "Invita a un Nuevo Miembro",
"invite_new_team_member": "Invita a alguien a tu equipo.",
"disable_cal_branding": "Desactivar marca de Cal.com",
"disable_cal_branding_description": "Ocultar todas las marcas de Cal.com de sus páginas públicas.",
"danger_zone": "Zona peligrosa",
"danger_zone": "Zona Peligrosa",
"back": "Atrás",
"cancel": "Cancelar",
"continue": "Continuar",
@ -105,43 +107,127 @@
"disband_team": "Disolver Equipo",
"disband_team_confirmation_message": "¿Estás seguro de que quieres disolver este equipo? Cualquiera con quien has compartido este enlace de equipo ya no podrá reservar usando el mismo.",
"remove_member_confirmation_message": "¿Estás seguro de que quieres eliminar este miembro del equipo?",
"confirm_disband_team": "Sí, disolver equipo",
"confirm_remove_member": "Sí, eliminar miembro",
"remove_member": "Eliminar miembro",
"manage_your_team": "Administra tu equipo",
"confirm_disband_team": "Sí, Disolver Equipo",
"confirm_remove_member": "Sí, Eliminar Miembro",
"remove_member": "Eliminar Miembro",
"manage_your_team": "Administra tu Equipo",
"submit": "Enviar",
"delete": "Eliminar",
"update": "Actualizar",
"save": "Guardar",
"pending": "Pendiente",
"open_options": "Abrir opciones",
"copy_link": "Copiar enlace al evento",
"preview": "Vista previa",
"link_copied": "¡Enlace copiado!",
"open_options": "Abrir Opciones",
"copy_link": "Copiar Enlace",
"preview": "Vista Previa",
"link_copied": "¡Enlace Copiado!",
"title": "Título",
"description": "Descripción",
"quick_video_meeting": "Una reunión de vídeo rápida.",
"scheduling_type": "Tipo de programación",
"preview_team": "Vista previa del equipo",
"quick_video_meeting": "Reunión de Vídeo Rápida.",
"scheduling_type": "Tipo de Programación",
"preview_team": "Ver Equipo",
"collective": "Colectivo",
"collective_description": "Programe reuniones cuando todos los miembros del equipo seleccionados estén disponibles.",
"duration": "Duración",
"minutes": "minutos",
"round_robin": "Petición firmada por turnos",
"minutes": "Minutos",
"round_robin": "Petición Firmada por Turnos",
"round_robin_description": "Ciclo de reuniones entre varios miembros del equipo.",
"url": "URL",
"hidden": "Oculto",
"readonly": "Sólo lectura",
"readonly": "Sólo Lectura",
"plan_upgrade": "Necesitas actualizar tu plan para tener más de un tipo de evento activo.",
"plan_upgrade_instructions": "Para actualizar, dirígete a <a href=\"https://cal.com/upgrade\" className=\"underline\">https://cal.com/upgrade</a>",
"event_types_page_title": "Tipos de Evento",
"event_types_page_subtitle": "Crea eventos para que la gente que invites reserve en tu calendario.",
"new_event_type_btn": "Nuevo tipo de evento",
"new_event_type_btn": "Nuevo Tipo de Evento",
"new_event_type_heading": "Crea tu primer tipo de evento",
"new_event_type_description": "Los tipos de eventos te permiten compartir enlaces que muestran las horas disponibles en tu calendario y permitir que la gente haga reservas contigo.",
"new_event_title": "Agregar un nuevo tipo de evento",
"new_event_title": "Crear Nuevo Tipo de Evento",
"new_event_subtitle": "Crea un tipo de evento bajo tu nombre o equipo.",
"new_team_event": "Agregar un nuevo tipo de evento de equipo",
"new_event_description": "Crea un nuevo tipo de evento con el que la gente pueda hacer reservaciónes.",
"event_type_created_successfully": "{{eventTypeTitle}} tipo de evento creado con éxito"
"new_team_event": "Crear Nuevo Tipo de Evento de Equipo",
"new_event_description": "Crea un nuevo tipo de evento con el que la gente pueda hacer reservas.",
"event_type_created_successfully": "{{eventTypeTitle}} tipo de evento creado con éxito",
"hours": "Horas",
"full_name": "Nombre Completo",
"your_email": "Tu Email",
"change_avatar": "Cambiar Avatar",
"language": "Lenguaje",
"timezone": "Zona Horaria",
"first_day_week": "Primer Día de la Semana",
"single_theme": "Tema",
"automatically_theme_invitee": "Ajusta automáticamente el tema según las preferencias de los invitados",
"create_team": "Crear Equipo",
"name_team": "Nombre",
"create_new_team_description": "Crea un nuevo equipo para colaborar con los usuarios.",
"create_new_team": "Crear Nuevo Equipo",
"open_invitations": "Invitaciones Abiertas",
"new_team": "Nuevo Equipo",
"create_first_invite_other_users": "Crea tu primer equipo e invita a otros usuarios a trabajar contigo.",
"create_team_get_started": "Crea un equipo para empezar",
"teams": "Equipos",
"create_manage_teams_collaborative": "Cree y gestiona equipos para utilizar las funciones colaborativas.",
"this_feature_only_available_paid_plan": "Esta función solo está disponible en el plan pago",
"order_remove_cal_branding_description": "Para eliminar la marca Cal de sus páginas de reserva, debe actualizar a una cuenta de pago.",
"to_upgrade_go_to": "Para actualizar vaya a",
"edit_profile_info_description": "Edite la información de su perfil, que se muestra en su enlace de programación.",
"change_email_contact": "Para cambiar su email, pongase en contacto con",
"little_something_about": "Algo sobre ti.",
"profile_updated_successfully": "Perfil Actualizado con Éxito",
"your_user_profile_updated_successfully": "Su perfil de usuario se ha actualizado correctamente.",
"user_cannot_found_db": "El usuario parece haber iniciado sesión pero no se puede encontrar en la base de datos",
"embed_and_webhooks": "Insertar &amp; Webhooks",
"enabled": "Activado",
"disabled": "Desactivado",
"billing": "Facturación",
"manage_your_billing_info": "Gestione su información de facturación y cancele su suscripción.",
"availability": "Disponibilidad",
"configure_times_available_bookings": "Configure los horarios en los que está disponible para realizar reservas.",
"change_weekly_schedule": "Cambia tu Horario Semanal",
"logo": "Logo",
"error": "Error",
"team_logo": "Logo del Equipo",
"add_location": "Añadir Localización",
"attendees": "Asistentes",
"add_attendees": "Añadir Asistentes",
"show_advanced_settings": "Mostrar Opciones Avanzadas",
"event_name": "Nombre del Evento",
"meeting_with_user": "Reunión con {USER}",
"additional_inputs": "Campos Adicionales",
"label": "Etiqueta",
"type": "Tipo",
"edit": "Editar",
"add_input": "Agregar un Campo",
"opt_in_booking": "Pedido de Reserva",
"opt_in_booking_description": "La reserva debe confirmarse manualmente antes de que se envíe a las integraciones y se envíe un correo de confirmación.",
"disable_guests": "Desactivar Invitados",
"disable_guests_description": "Desactiva agregar invitados adicionales al hacer la reserva.",
"invitees_can_schedule": "Los invitados pueden programar",
"date_range": "Rango de Fechas",
"calendar_days": "Días del Calendário",
"business_days": "Días Laborales",
"payment": "Pago",
"set_address_place": "Establecer una dirección o un lugar",
"cal_invitee_phone_number_scheduling": "Cal le pedirá a su invitado que introduzca un número de teléfono antes de programar.",
"cal_provide_google_meet_location": "Cal proporcionará una URL de reunión de Google Meet.",
"cal_provide_zoom_meeting_url": "Cal proporcionará una URL de reunión de Zoom.",
"cal_provide_video_meeting_url": "Cal proporcionará una URL de reunión de Daily Video.",
"require_payment": "Requiere Pago",
"commission_per_transaction": "Comisión por Transacción",
"event_type_updated_successfully": "Tipo de Evento Actualizado con Éxito",
"event_type_updated_successfully_description": "Tu Evento fue Actualizado con Éxito",
"hide_event_type": "Ocultar Tipo de Evento",
"edit_location": "Editar Localización",
"into_the_future": "En el Futuro",
"within_date_range": "Dentro de un Rango de Fechas",
"indefinitely_into_future": "Indefinidamente en el futuro",
"this_input_will_shown_booking_this_event": "Esta entrada se mostrará al reservar este evento.",
"add_new_custom_input_field": "Agregar nuevo campo de entrada personalizado",
"quick_chat": "Chat Rápido",
"add_new_event_type": "Crear Nuevo Tipo de Evento",
"add_new_team_event_type": "Crear Nuevo Tipo de Evento para Equipo",
"new_event_type_to_book_description": "Crea un nuevo tipo de evento para que las personas reserven horarios.",
"length": "Tamaño",
"minimum_booking_notice": "Aviso de Reserva",
"delete_event_type_description": "¿Está seguro de que desea eliminar este tipo de evento? Cualquiera con quien hayas compartido este enlace ya no podrá reservar con él.",
"delete_event_type": "Eliminar Tipo de Evento",
"confirm_delete_event_type": "Sí, Eliminar Tipo de Evento"
}