Compare commits

..
116 Commits
Author SHA1 Message Date
Keith Williams 1b4469f6e5 chore: v4.7.3 (#17701)
release.yml / release (push) Canceled after 0s
2024-11-17 21:58:45 -03:00
Benny JooandKeith Williams 5401bcca4e feat: AI description - DB model + frontend + backend (fetch only) (#17651)
* feat: AI description - DB model + frontend + backend (fetch only)

* fix types and add validation to backend

* improve log

* improve

* import type

* fix replexica error

* fix

* fix test

* update replexica type

* Renamed descriptionTranslations to fieldTranslations

* Moved the eventTypeId column to 2nd

---------

Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2024-11-18 00:16:56 +00:00
Benny Joo f9afca2939 feat: Add link column to CSV file for org members (#17695)
* improve spacing

* feat: Add link column to CSV file for org members

* update tests
2024-11-17 10:53:43 +00:00
Alex van Andel fc1d553b74 chore: Release v4.7.2 (#17692)
release.yml / release (push) Canceled after 0s
2024-11-16 18:36:43 +00:00
Calcom BotandReplexica b8c2fdac44 feat: update translations via @replexica (#17691)
Co-authored-by: Replexica <support@replexica.com>
2024-11-16 18:32:52 +00:00
Abul Hassan SathuliandPrashant Varma e24c40f518 fix: how-to-setup-api-in-a-local-instance.mdx in docs with correction after api-v2 (#17667)
* Updating how-to-setup-api-in-a-local-instance.mdx with correction after api v2

After the implementation of api v2, some of the documents are not yet updated and could you make developers spend too much time on finding these things.

* fix: typo

---------

Co-authored-by: Prashant Varma <prashantvarma5083@gmail.com>
2024-11-16 18:27:02 +00:00
Alex van Andel c5cefc3e61 chore: Found a critical index missing on profileId (#17690) 2024-11-16 18:26:50 +00:00
Omar López 2c57ad0288 perf: optimize organization admin check (#17683) 2024-11-16 18:26:23 +00:00
sean-brydon af9bf14d9e fix: routing column filters (#17688)
* remove column filters

* remove column filters

* use a loading state while loading columns

* fix
2024-11-16 18:05:36 +00:00
sean-brydon b1a0cdc8e2 fix: large org routing insights UI issues (#17687)
* fix overflow colour in darkmode

* truncate/show overflow scroll indicator when overflowing on response values

* remove total created count

* overflow Y on failed response container

* fix darkmode styles on barlist

* radix hovercards to properly allow overflow in container

* column visible state

* remove constrained width on dropdowns to w-fit

* export type
2024-11-16 11:01:26 -03:00
Alex van AndelandPeer Richelsen 7fef3e7b85 chore: Release v4.7.1 (#17686)
release.yml / release (push) Canceled after 0s
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2024-11-16 10:00:16 +00:00
Hariom Balhara 384deab0ce test: findTeamMemberEmailFromCrm (#17685)
* We need to choose contact owner when crm app slug is not present

* Add unit tests for getTeamMemberEmailFromCrm module
2024-11-16 09:32:33 +00:00
Hariom Balhara 22da681f8c We need to choose contact owner when crm app slug is not present (#17684) 2024-11-16 09:02:24 +00:00
Omar López f4f4afad39 perf: optimize team admin check queries (#17681)
## What does this PR do?

Optimizes team and organization admin checks by:
- Removing unnecessary member data fetching in profile repository
- Simplifying team admin verification query to directly check membership
- Refactoring organization admin check to use the optimized team verification method

## Mandatory Tasks

- [x] I have self-reviewed the code
- [x] I have updated the developer docs in /docs
- [ ] I confirm automated tests are in place

## How should this be tested?

1. Log in as a team admin/owner
2. Verify team admin privileges still work correctly
3. Log in as an organization admin
4. Confirm organization admin permissions are maintained
5. Check that admin-only features remain accessible

Expected behavior:
- Team admins/owners should retain all their existing permissions
- Organization admins should maintain their administrative capabilities
- No degradation in admin functionality while improving query performance

## Checklist

- I haven't read the [contributing guide](https://github.com/calcom/cal.com/blob/main/CONTRIBUTING.md)
- My code doesn't follow the style guidelines of this project
- I haven't commented my code, particularly in hard-to-understand areas
- I haven't checked if my changes generate no new warnings
2024-11-15 19:00:18 -07:00
Keith Williams 1c05952077 chore: Remove playwright install for API v2 E2E (#17677) 2024-11-15 23:47:26 +00:00
Keith Williams 1df70e75ed chore: v4.7.0 (#17664)
release.yml / release (push) Canceled after 0s
2024-11-15 20:11:00 -03:00
Udit Takkar 8962f6f08e fix: update current cursor (#17626) 2024-11-15 16:07:17 -07:00
Keith Williams 6272c881c8 revert: "feat: Populate gCal calendar cache via webhooks (#11928)" (#17675)
This reverts commit d294a74aad.
2024-11-15 19:28:30 -03:00
Omar López bdf94c7f48 fix: removed calendar cache admin page (#17676) 2024-11-15 21:46:08 +00:00
b79c5e7c86 feat: update translations via @replexica (#17674)
* feat: update translations via @replexica

* feat: update translations via @replexica

* Delete packages/app-store/routing-forms/trpc/findTeamMembersMatchingAttributeLogic.handler.ts

* Delete packages/app-store/routing-forms/trpc/findTeamMembersMatchingAttributeLogic.schema.ts

---------

Co-authored-by: Replexica <support@replexica.com>
Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2024-11-15 21:34:07 +00:00
3eaccb8738 fix: Preview queue position and contact owner in preview (#17552)
* wip

* Add preview mode in router

* only fetch bookings of this month for weighted rr

* test set up

* only get bookings of current month

* reverts test setup

* first changes for weight adjustments

* reset booking count + adjust calibration

* depreciate weightAdjustment

* get only bookings created this month

* fix typo

* make sure createdAt for hosts is correct

* use earliest possibel date as fallback

* add missing createdAt date to tests

* fix typo

* clean up changes in tests

* fix typo

* change end date to current date

* fix: Fall back to empty host array when no hosts are found

* fix: Restructure code a little

* fixed test, incorrectly used now outdated var

* perf: remove Dayjs from getLuckyUser

* Refactor getHostsWithCalibration for optimised performance, intentionally break test as findMany is always an array

* Better mock for host.findMany

* Remove team-event-types.test.ts, move to appropriate package

* TypeScript cannot auto-infer that an array is non-empty when assigning to a var

* fix: Type Fixes and DistributionMethod enum add

* Optimise tests

* Added test to show that bookings made before a newHost was added affect the lucky user result

* Throw error when the usersWithHighestPriority is empty, which should never happen

* WIP

* remove comment

* update migrations

* get attributes weights and virtual queue data

* use attribute weights and use bookings of virtual queue only

* clean up migrations

* Add shortfall column and add tests

* code clean up from feedback

* wrapper function for getLuckyUser

* code clean up

* fetch routingFormResponse in handleNewBooking

* fix type errors

* fix type errors in tests

* fix getAttributesQueryValue import for tests

* fix totalWeight

* add test for attributes weights and virtual queues

* clean up code

* add test for prepareQueuesAndAttributesData

* remove console.log

* use lazy import

* Add more tests and more columns to matching members queue

* fix issue from merge

* always send usersAndTheirBookingShortfalls

---------

Co-authored-by: CarinaWolli <wollencarina@gmail.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
2024-11-15 20:39:46 +00:00
Anik Dhabal Babu 9273226fb4 test: Add test to validate error when 'in' field in where clause is undefine and contain null values (#17670) 2024-11-15 19:55:34 +00:00
sean-brydonandJoe Au-Yeung 7ce5886b4f feat: insights routing forms (#17583)
Co-authored-by: Joe Au-Yeung <j.auyeung419@gmail.com>
2024-11-15 14:54:51 -05:00
Anik Dhabal Babu e85c0e1a85 fix: unable to lock individual event type creation (#17668) 2024-11-15 15:58:19 -03:00
Omar LópezandUdit Takkar d294a74aad feat: Populate gCal calendar cache via webhooks (#11928)
* WIP

* WIP

* WIP

* WIP

* WIP

* WIP

* WIP

* WIP

* WIP

* Update CalendarService.ts

* Type fixes

* WIP

* fix: improve cache hits

* Update CalendarService.ts

* Update CalendarService.ts

* Update CalendarService.ts

* Update CalendarService.ts

* Update CalendarService.ts

* Update CalendarService.ts

* Feedback

* Update CalendarService.ts

* Update CalendarService.ts

* Update _router.ts

* feedback

* WIP

* WIP

* Update schema.prisma

* feedback

* typefixes

* Update Calendar.d.ts

* fix: watches when adding a calendar

* Discard changes to packages/app-store/googlecalendar/api/add.ts

* WIP

Signed-off-by: Omar López <zomars@me.com>

* WIP

Signed-off-by: Omar López <zomars@me.com>

* WP

Signed-off-by: Omar López <zomars@me.com>

* Update calendar.ts

* Update calendar.ts

* Update callback.ts

* Update callback.ts

* Conflicts

* WIP

* WIP

* Update CalendarService.ts

* Cleanup

* Discard changes to packages/features/settings/layouts/SettingsLayout.tsx

* Update calendar-cache.repository.ts

* WIP

* Update getSelectedCalendarsToWatch.sql

* WIP

* Update CalendarService.ts

* Cleanup

* Discard changes to packages/app-store/googlecalendar/lib/CalendarService.ts

* Create CalendarService.wip.ts

* WIP

* Update CalendarService.ts

* Update getSelectedCalendarsToWatch.sql

* Delete CalendarService.wip.ts

* test updates

* cleanup

Signed-off-by: Omar López <zomars@me.com>

* Update CalendarService.test.ts

* Update CalendarService.ts

* type fixes

* Update OAuthManager.ts

* Update CalendarService.ts

* Almost there

* Update CalendarService.test.ts

* Update calendar.ts

* Update callback.ts

* Update toggleFeatureFlag.handler.ts

* fix: feedback

* Update getSelectedCalendarsToWatch.sql

* Fix unit tests

---------

Signed-off-by: Omar López <zomars@me.com>
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
2024-11-15 14:59:37 -03:00
5012a16794 feat: attribute weights and virtual queues (#17567)
* only fetch bookings of this month for weighted rr

* test set up

* only get bookings of current month

* reverts test setup

* first changes for weight adjustments

* reset booking count + adjust calibration

* depreciate weightAdjustment

* get only bookings created this month

* fix typo

* make sure createdAt for hosts is correct

* use earliest possibel date as fallback

* add missing createdAt date to tests

* fix typo

* clean up changes in tests

* fix typo

* change end date to current date

* fix: Fall back to empty host array when no hosts are found

* fix: Restructure code a little

* fixed test, incorrectly used now outdated var

* perf: remove Dayjs from getLuckyUser

* Refactor getHostsWithCalibration for optimised performance, intentionally break test as findMany is always an array

* Better mock for host.findMany

* Remove team-event-types.test.ts, move to appropriate package

* TypeScript cannot auto-infer that an array is non-empty when assigning to a var

* fix: Type Fixes and DistributionMethod enum add

* Optimise tests

* Added test to show that bookings made before a newHost was added affect the lucky user result

* Throw error when the usersWithHighestPriority is empty, which should never happen

* WIP

* remove comment

* update migrations

* get attributes weights and virtual queue data

* use attribute weights and use bookings of virtual queue only

* clean up migrations

* code clean up from feedback

* wrapper function for getLuckyUser

* code clean up

* fetch routingFormResponse in handleNewBooking

* fix type errors

* fix type errors in tests

* fix getAttributesQueryValue import for tests

* fix totalWeight

* add test for attributes weights and virtual queues

* clean up code

* add test for prepareQueuesAndAttributesData

* remove console.log

* use lazy import

* use findUnique

* add fallback weight

---------

Co-authored-by: CarinaWolli <wollencarina@gmail.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
2024-11-15 17:36:46 +00:00
Calcom BotandReplexica 322ca2a12c feat: update translations via @replexica (#17666)
* feat: update translations via @replexica

* feat: update translations via @replexica

* feat: update translations via @replexica

---------

Co-authored-by: Replexica <support@replexica.com>
2024-11-15 16:50:57 +00:00
Udit Takkar 9b79c037c2 fix: remove cal video logo from select (#17665)
* fix: remove cal video logo from managed event types

* fix: do not fetch cal video logo
2024-11-15 16:45:44 +00:00
Alex van Andel f76696032e feat: Implements maxLeadThreshold (#17643)
* feat: Implements maxLeadThreshold which puts a maximum to the amount of lead a given host is allowed to be ahead

* Refactor getLuckyUser + implement in handleNewBooking + move logic to repo

* Decoupled @prisma from findQualifiedHosts

* Fix deep type error

* Add maxLeadThreshold to builder.ts

* Removed a console.log :O + fix handleChildrenEventTypes input

* Add distribution UI to enable balanced distribution/maximize availability

* 0-1-2 instead of 0-1-2-3 (3 bookings instead of 4)
2024-11-15 15:54:02 +00:00
Udit Takkar c6aa57177a fix: filter cal video logo (#17663)
* fix: filter cal video logo

* chore: message
2024-11-15 14:38:28 +00:00
Anik Dhabal Babu 7f2db48c72 fix: meeting not created on hubspot for contacts (#17661) 2024-11-15 13:18:17 +00:00
c59e733b5a feat: exclude emails and domains (#17591)
* feat: add constants

* feat: add excludeEmails field in baseSchema

* feat: add ExcludeEmails Input field in FieldEditDialog

* feat: add excludedEmails check in FormBuilderField

* chore: move validations in getBookingResponsesSchema

* Update i18n string to be more generic

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

* feat: add validation on excludeEmails field

* feat: add fieldSchema as resolver

* chore: remove comment

* chore: format comments

* feat: add tests for excluded email or domains

---------

Co-authored-by: Alex van Andel <me@alexvanandel.com>
Co-authored-by: Peer Richelsen <peer@cal.com>
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
2024-11-15 10:46:25 +00:00
sean-brydon e0713d78b3 fix: z index issue on dropdown menu (#17656)
* portal content

* fix(dropdown-z-index-issue): Fixes dropdown z index issue by portaling
2024-11-15 10:51:39 +01:00
Max Prilutskiy d868b325c4 feat(CAL-4730): add sk-SK language (#17652) 2024-11-15 09:41:36 +00:00
Keith Williams f8f6c31e40 chore: v4.6.24 (#17639)
release.yml / release (push) Canceled after 0s
2024-11-14 18:06:09 -03:00
Anik Dhabal Babu 7246fa4084 fix: unable to update host schedules (#17649) 2024-11-14 15:37:19 -05:00
Benny Joo 039a0b7a85 chore: remove wrong logs (#17648) 2024-11-14 18:57:51 +00:00
sean-brydon 12c5005305 chore: routingform org attribute seed (#17510)
* seed to org

* more org+routing form seed improvments

* add routing responses

* check if attributes already exist to prevent crash

* remove files not for PR

* fix type error

* fix connection

* assign manually

* fix seed

* update to match integration tests

* fix integration test to new user count
2024-11-14 14:50:26 -03:00
Sachin Siddhuandunknown 1ff6465384 fix: resolved troubleshoot-sidbar bug (#17613)
* resolved troubleshoot-sidbar bug

* fulfilled review changes

---------

Co-authored-by: unknown <sachinsiddhu112@gmail.com>
2024-11-14 13:26:55 -03:00
ae706bb6d6 feat: update translations via @replexica (#17629)
* feat: update translations via @replexica

* feat: update translations via @replexica

* Delete packages/ui/components/data-table/tanstack.d.ts

* Delete packages/lib/sync/services/CloseComService.ts

* Delete packages/lib/sync/SyncServiceManager.ts

---------

Co-authored-by: Replexica <support@replexica.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2024-11-14 16:19:03 +00:00
Lauris Skraucis 538a39328e fix: useOAuthClient is not initialized (#17637) 2024-11-14 15:35:45 +00:00
Joe Au-Yeung 3589767099 feat: Salesforce when create contacts under an account if creating leads is chosen [CAL-4713] (#17630) 2024-11-14 10:29:21 -05:00
Kartik SainiandUdit Takkar ff2754f663 feat: allow marking no show after booking has started (#17625)
* feat: allow marking no show after booking has started

* fix

---------

Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
2024-11-14 09:55:39 +00:00
Rajiv Sahal 65484e7d01 fix: BookerEmbed atom localStorage issues (#17611) 2024-11-14 08:07:47 +00:00
Peer Richelsen 4d942a454a chore: typo in webhook (#17628) 2024-11-14 02:57:03 +00:00
Keith WilliamsandUdit Takkar 7dbcb62724 perf: Move /me stats to separate tRPC handler (#17206)
* perf: Move /me stats to separate tRPC handler

* Update packages/trpc/server/routers/loggedInViewer/meStats.handler.ts

Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>

* Rename and skipping batch for myStats

* Refactor of counting team events

* Fixed type issues

---------

Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
2024-11-13 20:55:57 -03:00
Benny Joo c197c33fd0 chore: upgrade @vercel/og lib (#17503)
## What does this PR do?

<!-- Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. -->

- housekeeping: having important packages up to date

<!-- Please provide a loom video for visual changes to speed up reviews
 Loom Video: https://www.loom.com/
-->

## Mandatory Tasks (DO NOT REMOVE)

- [x] I have self-reviewed the code (A decent size PR without self-review might be rejected).
- [x] N/A - I have updated the developer docs in /docs if this PR makes changes that would require a [documentation change](https://cal.com/docs). If N/A, write N/A here and check the checkbox.
- [x] I confirm automated tests are in place that prove my fix is effective or that my feature works.

## How should this be tested?

<!-- Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration. Write details that help to start the tests -->

- Are there environment variables that should be set?
- What are the minimal test data to have?
- What is expected (happy path) to have (input and output)?
- Any other important info that could help to test that PR

## Checklist

<!-- Remove bullet points below that don't apply to you -->

- I haven't read the [contributing guide](https://github.com/calcom/cal.com/blob/main/CONTRIBUTING.md)
- My code doesn't follow the style guidelines of this project
- I haven't commented my code, particularly in hard-to-understand areas
- I haven't checked if my changes generate no new warnings
2024-11-13 13:50:21 -07:00
Keith Williams 815065d67c feat: Add API v2 logs to axiom (#17595)
## What does this PR do?

Adds ability to send API v2 logs to Axiom.

## Mandatory Tasks (DO NOT REMOVE)

- [x] I have self-reviewed the code (A decent size PR without self-review might be rejected).
- [x] N/A - I have updated the developer docs in /docs if this PR makes changes that would require a [documentation change](https://cal.com/docs). If N/A, write N/A here and check the checkbox.
- [x] I confirm automated tests are in place that prove my fix is effective or that my feature works.

## How should this be tested?

- Add the AXIOM_DATASET and AXIOM_TOKEN variables and run the API locally. Ensure the logs flow through to Axiom.
2024-11-13 13:18:53 -07:00
Omar López 02cecd6707 chore: Cleanup Close.com (#16929) 2024-11-13 15:14:31 -05:00
Keith Williams 81386d4ec0 chore: v4.6.23 (#17620)
release.yml / release (push) Canceled after 0s
2024-11-13 14:40:22 -03:00
Eunjae LeeandKeith Williams 204e411585 fix: make actions column sticky in members list (#17554)
* fix: make actions column sticky in members list

* clean up import

* change type definition

* remove old export

* include tanstack.d.ts

* fix declaration file

* move type def to packages/types/tanstack-table.d.ts

---------

Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2024-11-13 16:36:01 +00:00
Chiranjeev VishnoiandAnik Dhabal Babu 1ec1554cb5 change telly url (#17618)
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
2024-11-13 16:21:53 +00:00
Udit Takkar 241579eba6 refactor: change title (#17623)
* chore: change title

* chore: translation
2024-11-13 16:19:58 +00:00
Udit Takkar 8ccad29ab6 fix: skip triggering webhook in case of duplicate email (#17612)
* fix: skip sending webhook in case of duplicate response

* fix: type err

* fix: tests

* refactor: only check email

* fix: type err

* chore: changed it to 60 min

* fix: use lowercase
2024-11-13 15:50:26 +00:00
74b4d7a94a chore: Automated API v2 OpenAPI spec generation (#17046)
* chore: Automated API v2 OpenAPI spec generation

* chore: update docs

---------

Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
Co-authored-by: Morgan Vernay <morgan@cal.com>
2024-11-13 15:28:25 +00:00
5c6e60b726 fix: fetch next batch if event types are empty and cursor exists (#17109)
* fix: fetch next batch if event types are empty and cursor exists

* refactor: improve

* fix: add isFetchingForFirstTime

* chore: add number type

* fix: type err

* chore: add logs

* fix: type err

* fix: conflict

* fix: bug

* fix: type err

* chore: try changing type

* chore: add nul

* Update packages/trpc/server/routers/viewer/eventTypes/getEventTypesFromGroup.handler.ts

Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com>

* chore: use log.info

---------

Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com>
Co-authored-by: Bailey Pumfleet <bailey@pumfleet.co.uk>
2024-11-13 14:37:03 +00:00
Alex van Andel 18c7c3c940 fix: Refactor publicPageUrl to use getBookerBaseUrlSync like elsewhere (#17607) 2024-11-13 08:55:01 -05:00
fbd113b976 feat: update translations via @replexica (#17619)
* feat: update translations via @replexica

* feat: update translations via @replexica

* feat: update translations via @replexica

---------

Co-authored-by: Replexica <support@replexica.com>
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
2024-11-13 13:53:51 +00:00
Udit Takkar c7f11c6795 fix: mark guest are no show (#17588)
* fix: mark guest are no show

* chore: missing import

* nit

* fix: type err
2024-11-13 19:03:55 +05:30
Peer Richelsen 84fb9bb371 chore: update Instant Meeting Error Message (#17617)
* Update common.json

* small copy changes
2024-11-13 13:08:05 +00:00
Lauris Skraucis 1aac70f643 feat: v2 confirm / decline booking endpoints (#17578)
* feat: v2 confirm / decline booking endpoints

* chore: bump platform libraries

* fix: type export

* tests: accepting and declining a booking

* refactor: sent emails abstract renderEmail with getHtml that is mocked in test
2024-11-13 11:20:43 +02:00
Lauris Skraucis 0dde8c1db9 feat: v2 multiple length event types and their bookings (#17598)
* feat: input lengthInMinutesOptions

* Revert "feat: input lengthInMinutesOptions"

This reverts commit f23fd8a3861097f0972cc6210b47f25511d85183.

* feat: handle lengthInMinutesOptions input

* feat: handle lengthInMinutesOptions event output

* fix: remove it.only

* feat: variable length bookings
2024-11-13 11:13:11 +02:00
Ankit YadavandOmar López 0da3a9fa11 fix: #17602 (#17604)
Co-authored-by: Omar López <zomars@me.com>
2024-11-12 20:20:38 +00:00
Alex van Andel eb8f5bd194 chore: Release v4.6.22 (#17600)
release.yml / release (push) Canceled after 0s
2024-11-12 18:18:37 +00:00
Morgan 82901fee94 fix: apiv2 updateNewTeamMemberEventTypes silently (#17555)
* fix: apiv2 updateNewTeamMemberEventTypes silently

* fixup! fix: apiv2 updateNewTeamMemberEventTypes silently
2024-11-12 09:32:21 -03:00
Udit Takkar 4e0e3a47f5 perf: routing forms loading time (#17518)
* perf: routing forms loading time

* chore: add TODO

* chore

* chore: add type

* chore: use Promise.all

* fix: type err

* fix: fetch id

* refactor: don't fetch team

* chore: add name
2024-11-12 17:32:42 +05:30
Syed Ali Shahbaz dc400d80d0 fix: split firstname lastname support, phone support & timezone specific startTime in success redirect params (#17593)
* init

* fixes

* fix type
2024-11-12 11:16:41 +00:00
Morgan 6889592d4f feat: add free platform plan (#17581)
* feat: add free platform plan

* chore: handle payment success / fail overdue

* chore: refactor and add tests
2024-11-12 11:14:51 +02:00
Benny Joo 95b833bc1c fix: avatars are not showing in preview image (#17592) 2024-11-12 07:57:06 +00:00
b06683458a feat: update translations via @replexica (#17585)
Co-authored-by: Replexica <support@replexica.com>
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
2024-11-11 22:20:17 -03:00
Alex van Andel 01d764c6d3 chore: Release v4.6.21 (#17586)
release.yml / release (push) Canceled after 0s
2024-11-12 01:09:55 +00:00
Joe Au-YeungandAlex van Andel 49333addc2 feat: Salesforce RR skip based on a user on a lookup field on an account (#17526)
* move types to types file

* Create salesforce routing form components

* Save salesforce data to routing form

* Fixes

* Add event type service

* Change commenting

* Pass data from routing form to CRM

* Init Salesforce routing form booking form handler

* Salesforce find user associated with lookup field

* Add looking up the contact owner

* If salesforce is disabled then don't change the Salesforce option

* Small refactor

* Refactor getting event type app metadata

* Refactor eventType service

* Type fix

* Clean up

* Add translations

Co-authored-by: Alex van Andel <emrysal@users.noreply.github.com>

---------

Co-authored-by: Alex van Andel <emrysal@users.noreply.github.com>
2024-11-12 01:09:30 +00:00
Anik Dhabal Babu 6c40d29745 fix: incorrect booking title for diff users (#17448)
* fix: incorrect booking title for diff users

* Update common.json

* update
2024-11-11 19:10:45 +00:00
Anik Dhabal BabuandUdit Takkar fc5ad53a6d fix: hidden phone booking field should never need validation (#17564)
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
2024-11-11 15:06:38 +00:00
Anik Dhabal Babu 4d38c6d0c7 fix: Form link in Reroute Dialog gives 404 for members that aren't admin/owner of team (#17537)
* fix: Form link in Reroute Dialog gives 404 for members that aren't admin/owner of team

* NIT
2024-11-11 20:25:08 +05:30
Anik Dhabal Babu cd15335eed chore: plain text plugin for Editor (#17134)
* chore: plain text plugin for Editor

* fix build error
2024-11-11 20:23:12 +05:30
Anik Dhabal Babu aaa75100d4 chore: Routing form - Add submitted_at and Sort entries with latest on top (#17491)
* chore: Routing form - Add submitted_at and sort rows by this timestamp in reporting

* fix e2e

* fix e2e

* Update basic.e2e.ts

* Update basic.e2e.ts

* Update
2024-11-11 19:57:57 +05:30
Anik Dhabal Babu ae9063804d fix: Users details leak for team booking when the team is private (#17403)
* fix: host details leaking

* type error

* update

* update

* Update getPublicEvent.ts

* Update getPublicEvent.ts
2024-11-11 19:55:42 +05:30
Calcom BotandReplexica 30f9d9b980 feat: update translations via @replexica (#17577)
Co-authored-by: Replexica <support@replexica.com>
2024-11-11 13:57:50 +00:00
Anik Dhabal Babu 42a264380a fix (#17548) 2024-11-11 09:37:14 +00:00
Hariom BalharaandUdit Takkar 62aaba32cf fix: Routing Form - Small Improvements (#17538)
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
2024-11-11 14:14:39 +05:30
Amit Sharmaandsean-brydon aaf630f01f feat: Delete attribute modal (#17557)
* feat: Delete attribute modal

* move Modal file

---------

Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com>
2024-11-11 08:33:19 +00:00
Rajiv Sahal 838e8b9e89 fix: iframe issue for atoms documentation (#17570)
* fix syntax for code examples

* update iframe styling
2024-11-11 08:28:02 +00:00
Kunall Banerjee ce373c475c fix: incorrect capitalization in company names (#17573) 2024-11-10 08:42:29 +00:00
Omar López ed662b7956 chore: v4.6.20 (#17571)
release.yml / release (push) Canceled after 0s
2024-11-09 16:48:45 -07:00
Rajiv Sahal 2e49110ce6 fix: docs loom iframe fixes (#17569) 2024-11-09 08:41:55 +00:00
Rajiv Sahal fc35f9de85 fix: atoms docs (#17556)
* fixup

* resolve merge conflicts

* fixup fixup

* trying some fixups
2024-11-09 07:39:48 +00:00
Joe Au-Yeung 9c67ee7375 fix: pass upId to JWT if logging in through SAML (#17566)
* pass `upId` to JWT if logging in through SAML

* Correct change
2024-11-08 22:43:56 +00:00
Syed Ali Shahbaz a1477dc7e1 feat: adds attendee and host names, and guest emails in forwarded params (#17530)
* adds attendee and host names in forwarded params

* address feedback

* add guest emails
2024-11-08 22:33:22 +05:30
25d39b4273 feat: api v2 reassign (#17460)
* adding input types and method to controller/service

* add output types

* add outputs and inputs

* feat: reassign automatically

* feat: reassign to user

* e2e test for reassign

* update platform libraries + experimental modules for jest

* fix test

---------

Co-authored-by: supalarry <laurisskraucis@gmail.com>
Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com>
2024-11-08 12:42:59 +00:00
sean-brydon 4976e24e12 fix: move team availability search to serverside (#17549)
* move search to severside

* transform zod stirng to lowercase
2024-11-08 15:32:08 +05:30
Rajiv Sahal 5ae6e1e983 fix: loom iframe for atoms (#17550) 2024-11-08 09:37:29 +00:00
Omar López 6080ce0c85 v4.6.19 (#17524)
release.yml / release (push) Canceled after 0s
2024-11-07 13:24:04 -07:00
Morgan 79f0754bf7 chore: add sentry performance tracking api-v2 (#17519)
* chore: add sentry performance tracking api-v2

* fixup! chore: add sentry performance tracking api-v2
2024-11-07 09:38:05 -03:00
Vijay 540bd478dc fix: issues in 'updateNewTeamMemberEventTypes' while adding new team member. (#17513)
* fix due to error in zod.parse while adding new member

* updated zod parsing

* fix the linking with parent

* update fixture to accomodate assignAllTeamMembers for team and org scenarios

* added e2e test

* nit
2024-11-07 10:33:25 +00:00
9873e373dc feat: reset RR every month (#17472)
* only fetch bookings of this month for weighted rr

* test set up

* only get bookings of current month

* reverts test setup

* first changes for weight adjustments

* reset booking count + adjust calibration

* depreciate weightAdjustment

* get only bookings created this month

* fix typo

* make sure createdAt for hosts is correct

* use earliest possibel date as fallback

* add missing createdAt date to tests

* fix typo

* clean up changes in tests

* fix typo

* change end date to current date

* fix: Fall back to empty host array when no hosts are found

* fix: Restructure code a little

* fixed test, incorrectly used now outdated var

* perf: remove Dayjs from getLuckyUser

* Refactor getHostsWithCalibration for optimised performance, intentionally break test as findMany is always an array

* Better mock for host.findMany

* Remove team-event-types.test.ts, move to appropriate package

* TypeScript cannot auto-infer that an array is non-empty when assigning to a var

* fix: Type Fixes and DistributionMethod enum add

* Optimise tests

* Added test to show that bookings made before a newHost was added affect the lucky user result

* Throw error when the usersWithHighestPriority is empty, which should never happen

---------

Co-authored-by: CarinaWolli <wollencarina@gmail.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
2024-11-07 10:24:23 +00:00
Morgan 52093862ce fix: booker timezone from preference instead of session (#17520)
* fix: booker timezone from preference instead of session

* fixup! fix: booker timezone from preference instead of session
2024-11-07 09:42:38 +00:00
Rajiv Sahal e101f35b4f fix: event types atom docs (#17528)
* fix syntax for code examples

* fixup
2024-11-07 07:59:29 +00:00
Benny Joo 54cc2dc094 chore: cache meeting OG images for 1 day (#17525) 2024-11-07 00:19:20 +00:00
Alex van Andel 88e57d48fe chore: Release v4.6.18 (#17521)
release.yml / release (push) Canceled after 0s
2024-11-06 20:39:39 +00:00
Morgan 6619701c88 fix: event-type atom tabs controlled by prop (#17480)
* fix: event-type atom tabs controlled by prop

* fixup! fix: event-type atom tabs controlled by prop
2024-11-06 20:38:29 +00:00
Alex van Andel ebb8bb9c67 fix: saml does not add future members to eventtype (#17522)
* fix: trigger createOrUpdateMemberships from dsync so SAML signup triggers side-effects

* forEach does not wait for async/await done-ness
2024-11-06 20:38:08 +00:00
Alex van Andel 993bf23986 fix: common schedule toggling incorrectly (#17517)
* fix: common schedule toggling incorrectly

* type fixes to util.ts

* fix another type error
2024-11-06 20:21:25 +00:00
Benny Joo 4b38d73120 chore: Replace prisma actions Credential Repository / SelectedCalendar Repository methods (#17443)
* create lib/google.ts

* add updateAvatar method to UserRepository

* refactor googlecalendar callback

* add methods to CredentialRepository and SelectedCalendarRepository

* refactor

* remove not needed code

* refactor

* make credential repository and selected calendar repository more generic

* create GoogleRepository
2024-11-06 14:48:45 -05:00
Joe Au-Yeung 8f92c9b884 fix: Logic fix in Salesforce no-show (#17516) 2024-11-06 16:49:31 +00:00
Joe Au-Yeung edecc7e60e feat: Round Robin Skip If contact owner first available slot is more than 2 weeks, round robin as normal [CAL-4651] (#17416)
* If contact owner first available slot is more than 2 weeks. Normal RR

* If contact owner first available slot is more than 2 weeks. Normal RR

* Type fix

* Add test
2024-11-06 15:51:36 +00:00
sean-brydon 4eefb08a0d fix: copy to clipboard button (#17512)
* fixes copy to clipboard button

* fix type error
2024-11-06 15:11:55 +00:00
Calcom BotandReplexica 3f7e632d5c feat: update translations (#17474)
Co-authored-by: Replexica <support@replexica.com>
2024-11-06 10:08:15 -03:00
Peer RichelsenandhbjORbj ef0fd67646 chore: Update SettingsLayout.tsx (#17498)
* chore: Update SettingsLayout.tsx

* Update settings layout app dir

---------

Co-authored-by: hbjORbj <sldisek783@gmail.com>
2024-11-06 09:34:30 -03:00
Hariom Balhara 8e7567b6a3 fix: Don't let the modal close accidentally atleast when loading (#17508)
* Dont close during loading state

* Dont allow accidental close when loader is running
2024-11-06 09:34:04 -03:00
Amit Sharma 193855d60f fix: routing form: dont disable routing and reporting on mobile and fix mobile layout instead (#17444) 2024-11-06 09:29:51 -03:00
Vincent Lam 92fafa7344 feat: team availability - vertical selector and align times (#17502)
* - aligns timezones offset by minutes and add minutes to the label in the teams availability view
- added a vertical guidebar to view alligned schedules

* fixed type-check issues
2024-11-06 10:37:21 +00:00
Somay Chauhan 21aaff01fa fix: disable all emails modal crash on platform (#17485) 2024-11-06 10:43:57 +02:00
e07a28a2d1 feat: Salesforce - on booking write to fields on person record [CAL-4575] (#17477)
* Create data type

* Start FE component

* Rename and add new enums

* Add new schema for write on record options

* Add options on the frontend

* Backend write to custom fields

* refactor: Salesforce - on booking write to fields on person record (#17481)

* Add translations

* fix: type err

---------

Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
Co-authored-by: Udit Takkar <udit222001@gmail.com>
2024-11-06 08:20:52 +00:00
Benny Joo 9a1b5ad149 fix: broken social media preview and title (#17504)
* fix: broken social media preview and title

* remove code not needed
2024-11-06 13:28:35 +05:30
Benny Joo 1c20a257d3 fix: missing responsive design in org members page (#17495) 2024-11-05 17:26:41 +00:00
358 changed files with 21167 additions and 10871 deletions
+3
View File
@@ -408,3 +408,6 @@ NEXT_PUBLIC_WEBSITE_TERMS_URL=
# NEXT_PUBLIC_LOGGER_LEVEL=3 sets to log info, warn, error and fatal logs.
# [0: silly & upwards, 1: trace & upwards, 2: debug & upwards, 3: info & upwards, 4: warn & upwards, 5: error & fatal, 6: fatal]
NEXT_PUBLIC_LOGGER_LEVEL=
# Used to use Replexica SDK, a tool for real-time AI-powered localization
REPLEXICA_API_KEY=
-1
View File
@@ -65,7 +65,6 @@ jobs:
- uses: actions/checkout@v4
- uses: ./.github/actions/dangerous-git-checkout
- uses: ./.github/actions/yarn-install
- uses: ./.github/actions/yarn-playwright-install
- uses: ./.github/actions/cache-db
- name: Run Tests
working-directory: apps/api/v2
@@ -81,7 +81,7 @@ describe("retrieveScopedAccessibleUsers tests", () => {
where: { email: "member2-acme@example.com" },
});
expect(accessibleUserIds.length).toBe(3);
expect(accessibleUserIds.length).toBe(11);
expect(accessibleUserIds).toContain(memberOneUser.id);
expect(accessibleUserIds).toContain(memberTwoUser.id);
expect(accessibleUserIds).toContain(adminUser.id);
+4
View File
@@ -28,3 +28,7 @@ API_KEY_PREFIX=cal_
GET_LICENSE_KEY_URL="https://console.cal.com/api/license"
IS_E2E=false
DOCS_URL=
# Axiom logging
AXIOM_DATASET=
AXIOM_TOKEN=
+7 -3
View File
@@ -19,16 +19,17 @@
"test:watch": "yarn dev:build && jest --watch",
"test:cov": "yarn dev:build && jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "yarn dev:build && NODE_OPTIONS='--max_old_space_size=8192' jest --ci --forceExit --config ./jest-e2e.json",
"test:e2e": "yarn dev:build && NODE_OPTIONS='--max_old_space_size=8192 --experimental-vm-modules' jest --ci --forceExit --config ./jest-e2e.json",
"test:e2e:watch": "yarn dev:build && jest --runInBand --detectOpenHandles --forceExit --config ./jest-e2e.json --watch",
"prisma": "yarn workspace @calcom/prisma prisma",
"generate-schemas": "yarn prisma generate && yarn prisma format",
"copy-swagger-module": "ts-node -r tsconfig-paths/register swagger/copy-swagger-module.ts"
},
"dependencies": {
"@axiomhq/winston": "^1.2.0",
"@calcom/platform-constants": "*",
"@calcom/platform-enums": "*",
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.56",
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.60",
"@calcom/platform-libraries-0.0.2": "npm:@calcom/platform-libraries@0.0.2",
"@calcom/platform-types": "*",
"@calcom/platform-utils": "*",
@@ -45,7 +46,9 @@
"@nestjs/platform-express": "^10.0.0",
"@nestjs/swagger": "^7.3.0",
"@nestjs/throttler": "6.2.1",
"@sentry/nestjs": "^8.37.1",
"@sentry/node": "^8.8.0",
"@sentry/profiling-node": "^8.37.1",
"body-parser": "^1.20.2",
"bull": "^4.12.4",
"class-transformer": "^0.5.1",
@@ -67,7 +70,8 @@
"rxjs": "^7.8.1",
"stripe": "^15.3.0",
"uuid": "^8.3.2",
"winston": "^3.11.0",
"winston": "^3.13.0",
"winston-transport": "^4.7.0",
"zod": "^3.22.4"
},
"devDependencies": {
+7 -1
View File
@@ -17,13 +17,15 @@ import { ThrottlerStorageRedisService } from "@nest-lab/throttler-storage-redis"
import { BullModule } from "@nestjs/bull";
import { MiddlewareConsumer, Module, NestModule, RequestMethod } from "@nestjs/common";
import { ConfigModule } from "@nestjs/config";
import { APP_GUARD, APP_INTERCEPTOR } from "@nestjs/core";
import { APP_GUARD, APP_INTERCEPTOR, APP_FILTER } from "@nestjs/core";
import { seconds, ThrottlerModule } from "@nestjs/throttler";
import { SentryModule, SentryGlobalFilter } from "@sentry/nestjs/setup";
import { AppController } from "./app.controller";
@Module({
imports: [
SentryModule.forRoot(),
ConfigModule.forRoot({
ignoreEnvFile: true,
isGlobal: true,
@@ -59,6 +61,10 @@ import { AppController } from "./app.controller";
],
controllers: [AppController],
providers: [
{
provide: APP_FILTER,
useClass: SentryGlobalFilter,
},
{
provide: ThrottlerStorageRedisService,
useFactory: (redisService: RedisService) => {
-4
View File
@@ -7,7 +7,6 @@ import type { ValidationError } from "@nestjs/common";
import { BadRequestException, ValidationPipe, VersioningType } from "@nestjs/common";
import { BaseExceptionFilter, HttpAdapterHost } from "@nestjs/core";
import type { NestExpressApplication } from "@nestjs/platform-express";
import * as Sentry from "@sentry/node";
import * as cookieParser from "cookie-parser";
import { Request } from "express";
import helmet from "helmet";
@@ -71,9 +70,6 @@ export const bootstrap = (app: NestExpressApplication): NestExpressApplication =
// Exception filters, new filters go at the bottom, keep the order
const { httpAdapter } = app.get(HttpAdapterHost);
if (process.env.SENTRY_DSN) {
Sentry.setupNestErrorHandler(app, new BaseExceptionFilter(httpAdapter));
}
app.useGlobalFilters(new PrismaExceptionFilter());
app.useGlobalFilters(new ZodExceptionFilter());
app.useGlobalFilters(new HttpExceptionFilter());
@@ -56,6 +56,17 @@ export class BookingsRepository_2024_08_13 {
});
}
async getByUidWithUser(bookingUid: string) {
return this.dbRead.prisma.booking.findUnique({
where: {
uid: bookingUid,
},
include: {
user: true,
},
});
}
async getByIdWithAttendeesAndUserAndEvent(id: number) {
return this.dbRead.prisma.booking.findUnique({
where: {
@@ -2,6 +2,7 @@ import { BookingUidGuard } from "@/ee/bookings/2024-08-13/guards/booking-uid.gua
import { CancelBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/cancel-booking.output";
import { CreateBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/create-booking.output";
import { MarkAbsentBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/mark-absent.output";
import { ReassignBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/reassign-booking.output";
import { RescheduleBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/reschedule-booking.output";
import { BookingsService_2024_08_13 } from "@/ee/bookings/2024-08-13/services/bookings.service";
import { VERSION_2024_08_13_VALUE } from "@/lib/api-versions";
@@ -9,6 +10,7 @@ import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator";
import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator";
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
import { UserWithProfile } from "@/modules/users/users.repository";
import {
Controller,
Post,
@@ -46,12 +48,12 @@ import {
CreateBookingInputPipe,
CreateBookingInput,
GetBookingsInput_2024_08_13,
RescheduleBookingInput_2024_08_13,
CancelBookingInput_2024_08_13,
ReassignToUserBookingInput_2024_08_13,
MarkAbsentBookingInput_2024_08_13,
CreateBookingInput_2024_08_13,
CreateInstantBookingInput_2024_08_13,
CreateRecurringBookingInput_2024_08_13,
DeclineBookingInput_2024_08_13,
} from "@calcom/platform-types";
@Controller({
@@ -227,4 +229,104 @@ export class BookingsController_2024_08_13 {
data: booking,
};
}
@Post("/:bookingUid/reassign")
@HttpCode(HttpStatus.OK)
@Permissions([BOOKING_WRITE])
@UseGuards(ApiAuthGuard, BookingUidGuard)
@ApiHeader({
name: "Authorization",
description:
"value must be `Bearer <token>` where `<token>` either managed user access token or api key prefixed with cal_",
required: true,
})
@ApiOperation({ summary: "Automatically reassign booking to a new host" })
async reassignBooking(
@Param("bookingUid") bookingUid: string,
@GetUser() user: UserWithProfile
): Promise<ReassignBookingOutput_2024_08_13> {
const booking = await this.bookingsService.reassignBooking(bookingUid, user);
return {
status: SUCCESS_STATUS,
data: booking,
};
}
@Post("/:bookingUid/reassign/:userId")
@HttpCode(HttpStatus.OK)
@Permissions([BOOKING_WRITE])
@UseGuards(ApiAuthGuard, BookingUidGuard)
@ApiHeader({
name: "Authorization",
description:
"value must be `Bearer <token>` where `<token>` either managed user access token or api key prefixed with cal_",
required: true,
})
@ApiOperation({ summary: "Reassign a booking to a specific user" })
async reassignBookingToUser(
@Param("bookingUid") bookingUid: string,
@Param("userId") userId: number,
@GetUser("id") reassignedById: number,
@Body() body: ReassignToUserBookingInput_2024_08_13
): Promise<ReassignBookingOutput_2024_08_13> {
const booking = await this.bookingsService.reassignBookingToUser(
bookingUid,
userId,
reassignedById,
body
);
return {
status: SUCCESS_STATUS,
data: booking,
};
}
@Post("/:bookingUid/confirm")
@HttpCode(HttpStatus.OK)
@Permissions([BOOKING_WRITE])
@UseGuards(ApiAuthGuard, BookingUidGuard)
@ApiHeader({
name: "Authorization",
description:
"value must be `Bearer <token>` where `<token>` either managed user access token or api key prefixed with cal_",
required: true,
})
@ApiOperation({ summary: "Confirm booking that requires a confirmation" })
async confirmBooking(
@Param("bookingUid") bookingUid: string,
@GetUser() user: UserWithProfile
): Promise<GetBookingOutput_2024_08_13> {
const booking = await this.bookingsService.confirmBooking(bookingUid, user);
return {
status: SUCCESS_STATUS,
data: booking,
};
}
@Post("/:bookingUid/decline")
@HttpCode(HttpStatus.OK)
@Permissions([BOOKING_WRITE])
@UseGuards(ApiAuthGuard, BookingUidGuard)
@ApiHeader({
name: "Authorization",
description:
"value must be `Bearer <token>` where `<token>` either managed user access token or api key prefixed with cal_",
required: true,
})
@ApiOperation({ summary: "Decline booking that requires a confirmation" })
async declineBooking(
@Param("bookingUid") bookingUid: string,
@Body() body: DeclineBookingInput_2024_08_13,
@GetUser() user: UserWithProfile
): Promise<GetBookingOutput_2024_08_13> {
const booking = await this.bookingsService.declineBooking(bookingUid, user, body.reason);
return {
status: SUCCESS_STATUS,
data: booking,
};
}
}
@@ -0,0 +1,262 @@
import { bootstrap } from "@/app";
import { AppModule } from "@/app.module";
import { CreateBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/create-booking.output";
import { CreateScheduleInput_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/inputs/create-schedule.input";
import { SchedulesModule_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/schedules.module";
import { SchedulesService_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/services/schedules.service";
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
import { PrismaModule } from "@/modules/prisma/prisma.module";
import { UsersModule } from "@/modules/users/users.module";
import { INestApplication } from "@nestjs/common";
import { NestExpressApplication } from "@nestjs/platform-express";
import { Test } from "@nestjs/testing";
import { User } from "@prisma/client";
import * as request from "supertest";
import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.repository.fixture";
import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture";
import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture";
import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture";
import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture";
import { withApiAuth } from "test/utils/withApiAuth";
import { CAL_API_VERSION_HEADER, SUCCESS_STATUS, VERSION_2024_08_13 } from "@calcom/platform-constants";
import {
AttendeeScheduledEmail,
OrganizerScheduledEmail,
AttendeeDeclinedEmail,
} from "@calcom/platform-libraries";
import { BookingOutput_2024_08_13, GetBookingOutput_2024_08_13 } from "@calcom/platform-types";
import { Booking, PlatformOAuthClient, Team } from "@calcom/prisma/client";
jest.spyOn(AttendeeScheduledEmail.prototype as any, "getHtml").mockImplementation(async function () {
return "<html><body>Mocked Email Content</body></html>";
});
jest.spyOn(OrganizerScheduledEmail.prototype as any, "getHtml").mockImplementation(async function () {
return "<html><body>Mocked Email Content</body></html>";
});
jest.spyOn(AttendeeDeclinedEmail.prototype as any, "getHtml").mockImplementation(async function () {
return "<html><body>Mocked Email Content</body></html>";
});
describe("Bookings Endpoints 2024-08-13", () => {
describe("Bookings confirmation", () => {
let app: INestApplication;
let organization: Team;
let userRepositoryFixture: UserRepositoryFixture;
let bookingsRepositoryFixture: BookingsRepositoryFixture;
let schedulesService: SchedulesService_2024_04_15;
let eventTypesRepositoryFixture: EventTypesRepositoryFixture;
let oauthClientRepositoryFixture: OAuthClientRepositoryFixture;
let oAuthClient: PlatformOAuthClient;
let teamRepositoryFixture: TeamRepositoryFixture;
const userEmail = "bookings-controller-e2e@api.com";
let user: User;
let eventTypeId: number;
const eventTypeSlug = "peer-coding";
let createdBooking1: Booking;
let createdBooking2: Booking;
beforeAll(async () => {
const moduleRef = await withApiAuth(
userEmail,
Test.createTestingModule({
imports: [AppModule, PrismaModule, UsersModule, SchedulesModule_2024_04_15],
})
)
.overrideGuard(PermissionsGuard)
.useValue({
canActivate: () => true,
})
.compile();
userRepositoryFixture = new UserRepositoryFixture(moduleRef);
bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef);
eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef);
oauthClientRepositoryFixture = new OAuthClientRepositoryFixture(moduleRef);
teamRepositoryFixture = new TeamRepositoryFixture(moduleRef);
schedulesService = moduleRef.get<SchedulesService_2024_04_15>(SchedulesService_2024_04_15);
organization = await teamRepositoryFixture.create({ name: "organization bookings" });
oAuthClient = await createOAuthClient(organization.id);
user = await userRepositoryFixture.create({
email: userEmail,
});
const userSchedule: CreateScheduleInput_2024_04_15 = {
name: "working time",
timeZone: "Europe/Rome",
isDefault: true,
};
await schedulesService.createUserSchedule(user.id, userSchedule);
const event = await eventTypesRepositoryFixture.create(
{ title: "peer coding", slug: eventTypeSlug, length: 60 },
user.id
);
eventTypeId = event.id;
app = moduleRef.createNestApplication();
bootstrap(app as NestExpressApplication);
await app.init();
});
async function createOAuthClient(organizationId: number) {
const data = {
logo: "logo-url",
name: "name",
redirectUris: ["http://localhost:5555"],
permissions: 32,
};
const secret = "secret";
const client = await oauthClientRepositoryFixture.create(organizationId, data, secret);
return client;
}
it("should be defined", () => {
expect(userRepositoryFixture).toBeDefined();
expect(user).toBeDefined();
});
it("should confirm a booking", async () => {
const status = "PENDING";
createdBooking1 = await bookingsRepositoryFixture.create({
user: {
connect: {
id: user.id,
},
},
startTime: new Date(Date.UTC(2050, 0, 7, 13, 0, 0)),
endTime: new Date(Date.UTC(2050, 0, 7, 14, 0, 0)),
title: "peer coding",
uid: "peer-coding-one",
eventType: {
connect: {
id: eventTypeId,
},
},
location: "via 10, rome, italy",
customInputs: {},
metadata: {},
responses: {
name: "Bob",
email: "bob@gmail.com",
},
attendees: {
create: {
email: "bob@gmail.com",
name: "Bob",
locale: "it",
timeZone: "Europe/Rome",
},
},
status,
});
expect(createdBooking1.status).toEqual("PENDING");
return request(app.getHttpServer())
.post(`/v2/bookings/${createdBooking1.uid}/confirm`)
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
.expect(200)
.then(async (response) => {
const responseBody: GetBookingOutput_2024_08_13 = response.body;
expect(responseBody.status).toEqual(SUCCESS_STATUS);
expect(responseBody.data).toBeDefined();
expect(responseDataIsBooking(responseBody.data)).toBe(true);
if (responseDataIsBooking(responseBody.data)) {
const data: BookingOutput_2024_08_13 = responseBody.data;
expect(data.uid).toBeDefined();
expect(data.status).toEqual("accepted");
const dbBooking = await bookingsRepositoryFixture.getByUid(data.uid);
expect(dbBooking?.status).toEqual("ACCEPTED");
} else {
throw new Error(
"Invalid response data - expected booking but received array of possibily recurring bookings"
);
}
});
});
it("should decline a booking", async () => {
const status = "PENDING";
createdBooking2 = await bookingsRepositoryFixture.create({
user: {
connect: {
id: user.id,
},
},
startTime: new Date(Date.UTC(2050, 0, 7, 10, 0, 0)),
endTime: new Date(Date.UTC(2050, 0, 7, 11, 0, 0)),
title: "peer coding",
uid: "peer-coding-two",
eventType: {
connect: {
id: eventTypeId,
},
},
location: "via 10, rome, italy",
customInputs: {},
metadata: {},
responses: {
name: "Bob",
email: "bob@gmail.com",
},
attendees: {
create: {
email: "bob@gmail.com",
name: "Bob",
locale: "it",
timeZone: "Europe/Rome",
},
},
status,
});
expect(createdBooking2.status).toEqual("PENDING");
return request(app.getHttpServer())
.post(`/v2/bookings/${createdBooking2.uid}/decline`)
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
.expect(200)
.then(async (response) => {
const responseBody: GetBookingOutput_2024_08_13 = response.body;
expect(responseBody.status).toEqual(SUCCESS_STATUS);
expect(responseBody.data).toBeDefined();
expect(responseDataIsBooking(responseBody.data)).toBe(true);
if (responseDataIsBooking(responseBody.data)) {
const data: BookingOutput_2024_08_13 = responseBody.data;
expect(data.uid).toBeDefined();
expect(data.status).toEqual("rejected");
const dbBooking = await bookingsRepositoryFixture.getByUid(data.uid);
expect(dbBooking?.status).toEqual("REJECTED");
} else {
throw new Error(
"Invalid response data - expected booking but received array of possibily recurring bookings"
);
}
});
});
afterAll(async () => {
await oauthClientRepositoryFixture.delete(oAuthClient.id);
await teamRepositoryFixture.delete(organization.id);
await userRepositoryFixture.deleteByEmail(user.email);
await bookingsRepositoryFixture.deleteAllBookings(user.id, user.email);
await app.close();
});
});
function responseDataIsBooking(data: any): data is BookingOutput_2024_08_13 {
return !Array.isArray(data) && typeof data === "object" && data && "id" in data;
}
});
@@ -0,0 +1,337 @@
import { bootstrap } from "@/app";
import { AppModule } from "@/app.module";
import { CreateBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/create-booking.output";
import { ReassignBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/reassign-booking.output";
import { CreateScheduleInput_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/inputs/create-schedule.input";
import { SchedulesModule_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/schedules.module";
import { SchedulesService_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/services/schedules.service";
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
import { PrismaModule } from "@/modules/prisma/prisma.module";
import { UsersModule } from "@/modules/users/users.module";
import { INestApplication } from "@nestjs/common";
import { NestExpressApplication } from "@nestjs/platform-express";
import { Test } from "@nestjs/testing";
import { Booking, User } from "@prisma/client";
import * as request from "supertest";
import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.repository.fixture";
import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture";
import { HostsRepositoryFixture } from "test/fixtures/repository/hosts.repository.fixture";
import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture";
import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture";
import { OrganizationRepositoryFixture } from "test/fixtures/repository/organization.repository.fixture";
import { ProfileRepositoryFixture } from "test/fixtures/repository/profiles.repository.fixture";
import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture";
import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture";
import { withApiAuth } from "test/utils/withApiAuth";
import { CAL_API_VERSION_HEADER, SUCCESS_STATUS, VERSION_2024_08_13 } from "@calcom/platform-constants";
import {
CreateBookingInput_2024_08_13,
BookingOutput_2024_08_13,
RecurringBookingOutput_2024_08_13,
GetBookingsOutput_2024_08_13,
GetSeatedBookingOutput_2024_08_13,
} from "@calcom/platform-types";
import { PlatformOAuthClient, Team } from "@calcom/prisma/client";
describe("Bookings Endpoints 2024-08-13", () => {
describe("Reassign bookings", () => {
let app: INestApplication;
let organization: Team;
let team: Team;
let userRepositoryFixture: UserRepositoryFixture;
let bookingsRepositoryFixture: BookingsRepositoryFixture;
let schedulesService: SchedulesService_2024_04_15;
let eventTypesRepositoryFixture: EventTypesRepositoryFixture;
let oauthClientRepositoryFixture: OAuthClientRepositoryFixture;
let oAuthClient: PlatformOAuthClient;
let teamRepositoryFixture: TeamRepositoryFixture;
let membershipsRepositoryFixture: MembershipRepositoryFixture;
let hostsRepositoryFixture: HostsRepositoryFixture;
let organizationsRepositoryFixture: OrganizationRepositoryFixture;
let profileRepositoryFixture: ProfileRepositoryFixture;
const teamUserEmail = "orgUser1team1@api.com";
const teamUserEmail2 = "orgUser2team1@api.com";
let teamUser1: User;
let teamUser2: User;
let teamRoundRobinEventTypeId: number;
let roundRobinBooking: Booking;
beforeAll(async () => {
const moduleRef = await withApiAuth(
teamUserEmail,
Test.createTestingModule({
imports: [AppModule, PrismaModule, UsersModule, SchedulesModule_2024_04_15],
})
)
.overrideGuard(PermissionsGuard)
.useValue({
canActivate: () => true,
})
.compile();
userRepositoryFixture = new UserRepositoryFixture(moduleRef);
bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef);
eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef);
oauthClientRepositoryFixture = new OAuthClientRepositoryFixture(moduleRef);
teamRepositoryFixture = new TeamRepositoryFixture(moduleRef);
organizationsRepositoryFixture = new OrganizationRepositoryFixture(moduleRef);
profileRepositoryFixture = new ProfileRepositoryFixture(moduleRef);
membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef);
hostsRepositoryFixture = new HostsRepositoryFixture(moduleRef);
schedulesService = moduleRef.get<SchedulesService_2024_04_15>(SchedulesService_2024_04_15);
organization = await organizationsRepositoryFixture.create({ name: "organization team bookings" });
team = await teamRepositoryFixture.create({
name: "team 1",
isOrganization: false,
parent: { connect: { id: organization.id } },
});
oAuthClient = await createOAuthClient(organization.id);
teamUser1 = await userRepositoryFixture.create({
email: teamUserEmail,
locale: "it",
name: "orgUser1team1",
});
teamUser2 = await userRepositoryFixture.create({
email: teamUserEmail2,
locale: "it",
name: "orgUser2team1",
});
const userSchedule: CreateScheduleInput_2024_04_15 = {
name: "working time",
timeZone: "Europe/Rome",
isDefault: true,
};
await schedulesService.createUserSchedule(teamUser1.id, userSchedule);
await schedulesService.createUserSchedule(teamUser2.id, userSchedule);
await profileRepositoryFixture.create({
uid: `usr-${teamUser1.id}`,
username: teamUserEmail,
organization: {
connect: {
id: organization.id,
},
},
user: {
connect: {
id: teamUser1.id,
},
},
});
await profileRepositoryFixture.create({
uid: `usr-${teamUser2.id}`,
username: teamUserEmail2,
organization: {
connect: {
id: organization.id,
},
},
user: {
connect: {
id: teamUser2.id,
},
},
});
await membershipsRepositoryFixture.create({
role: "MEMBER",
team: { connect: { id: team.id } },
user: { connect: { id: teamUser1.id } },
accepted: true,
});
await membershipsRepositoryFixture.create({
role: "MEMBER",
team: { connect: { id: team.id } },
user: { connect: { id: teamUser2.id } },
accepted: true,
});
const team1EventType = await eventTypesRepositoryFixture.createTeamEventType({
schedulingType: "ROUND_ROBIN",
team: {
connect: { id: team.id },
},
users: {
connect: [{ id: teamUser1.id }, { id: teamUser2.id }],
},
title: "Round Robin Event Type",
slug: "round-robin-event-type",
length: 60,
assignAllTeamMembers: false,
bookingFields: [],
locations: [{ type: "inPerson", address: "via 10, rome, italy" }],
});
teamRoundRobinEventTypeId = team1EventType.id;
await hostsRepositoryFixture.create({
isFixed: false,
user: {
connect: {
id: teamUser1.id,
},
},
eventType: {
connect: {
id: team1EventType.id,
},
},
});
await hostsRepositoryFixture.create({
isFixed: false,
user: {
connect: {
id: teamUser2.id,
},
},
eventType: {
connect: {
id: team1EventType.id,
},
},
});
roundRobinBooking = await bookingsRepositoryFixture.create({
user: {
connect: {
id: teamUser1.id,
},
},
startTime: new Date(Date.UTC(2050, 0, 7, 13, 0, 0)),
endTime: new Date(Date.UTC(2050, 0, 7, 14, 0, 0)),
title: "round robin coding lets goo",
uid: "round-robin-coding",
eventType: {
connect: {
id: teamRoundRobinEventTypeId,
},
},
location: "via 10, rome, italy",
customInputs: {},
metadata: {},
responses: {
name: "Bob",
email: "bob@gmail.com",
},
attendees: {
create: {
email: "bob@gmail.com",
name: "Bob",
locale: "it",
timeZone: "Europe/Rome",
},
},
});
app = moduleRef.createNestApplication();
bootstrap(app as NestExpressApplication);
await app.init();
});
it("should reassign round robin booking", async () => {
const booking = await bookingsRepositoryFixture.getByUid(roundRobinBooking.uid);
expect(booking?.userId).toEqual(teamUser1.id);
return request(app.getHttpServer())
.post(`/v2/bookings/${roundRobinBooking.uid}/reassign`)
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
.expect(200)
.then(async (response) => {
const responseBody: ReassignBookingOutput_2024_08_13 = response.body;
expect(responseBody.status).toEqual(SUCCESS_STATUS);
expect(responseBody.data).toBeDefined();
const data: ReassignBookingOutput_2024_08_13["data"] = responseBody.data;
expect(data.bookingUid).toEqual(roundRobinBooking.uid);
expect(data.reassignedTo).toEqual({
id: teamUser2.id,
name: teamUser2.name,
email: teamUser2.email,
});
const reassigned = await bookingsRepositoryFixture.getByUid(roundRobinBooking.uid);
expect(reassigned?.userId).toEqual(teamUser2.id);
});
});
it("should reassign round robin booking to a specific user", async () => {
const booking = await bookingsRepositoryFixture.getByUid(roundRobinBooking.uid);
expect(booking?.userId).toEqual(teamUser2.id);
const body: CreateBookingInput_2024_08_13 = {
start: new Date(Date.UTC(2030, 0, 8, 13, 0, 0)).toISOString(),
eventTypeId: teamRoundRobinEventTypeId,
attendee: {
name: "alice",
email: "alice@gmail.com",
timeZone: "Europe/Madrid",
language: "es",
},
meetingUrl: "https://meet.google.com/abc-def-ghi",
};
return request(app.getHttpServer())
.post(`/v2/bookings/${roundRobinBooking.uid}/reassign/${teamUser1.id}`)
.send(body)
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
.expect(200)
.then(async (response) => {
const responseBody: ReassignBookingOutput_2024_08_13 = response.body;
expect(responseBody.status).toEqual(SUCCESS_STATUS);
expect(responseBody.data).toBeDefined();
const data: ReassignBookingOutput_2024_08_13["data"] = responseBody.data;
expect(data.bookingUid).toEqual(roundRobinBooking.uid);
expect(data.reassignedTo).toEqual({
id: teamUser1.id,
name: teamUser1.name,
email: teamUser1.email,
});
const reassigned = await bookingsRepositoryFixture.getByUid(roundRobinBooking.uid);
expect(reassigned?.userId).toEqual(teamUser1.id);
});
});
async function createOAuthClient(organizationId: number) {
const data = {
logo: "logo-url",
name: "name",
redirectUris: ["http://localhost:5555"],
permissions: 32,
};
const secret = "secret";
const client = await oauthClientRepositoryFixture.create(organizationId, data, secret);
return client;
}
function responseDataIsBooking(data: any): data is BookingOutput_2024_08_13 {
return !Array.isArray(data) && typeof data === "object" && data && "id" in data;
}
afterAll(async () => {
await oauthClientRepositoryFixture.delete(oAuthClient.id);
await teamRepositoryFixture.delete(organization.id);
await userRepositoryFixture.deleteByEmail(teamUser1.email);
await userRepositoryFixture.deleteByEmail(teamUserEmail2);
await bookingsRepositoryFixture.deleteAllBookings(teamUser1.id, teamUser1.email);
await bookingsRepositoryFixture.deleteAllBookings(teamUser2.id, teamUser2.email);
await app.close();
});
});
});
@@ -0,0 +1,251 @@
import { bootstrap } from "@/app";
import { AppModule } from "@/app.module";
import { CancelBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/cancel-booking.output";
import { CreateBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/create-booking.output";
import { MarkAbsentBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/mark-absent.output";
import { RescheduleBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs/reschedule-booking.output";
import { CreateScheduleInput_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/inputs/create-schedule.input";
import { SchedulesModule_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/schedules.module";
import { SchedulesService_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/services/schedules.service";
import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard";
import { PrismaModule } from "@/modules/prisma/prisma.module";
import { UsersModule } from "@/modules/users/users.module";
import { INestApplication } from "@nestjs/common";
import { NestExpressApplication } from "@nestjs/platform-express";
import { Test } from "@nestjs/testing";
import { EventType, User } from "@prisma/client";
import * as request from "supertest";
import { BookingsRepositoryFixture } from "test/fixtures/repository/bookings.repository.fixture";
import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture";
import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture";
import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture";
import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture";
import { withApiAuth } from "test/utils/withApiAuth";
import { CAL_API_VERSION_HEADER, SUCCESS_STATUS, VERSION_2024_08_13 } from "@calcom/platform-constants";
import { CreateBookingInput_2024_08_13, BookingOutput_2024_08_13 } from "@calcom/platform-types";
import { PlatformOAuthClient, Team } from "@calcom/prisma/client";
describe("Bookings Endpoints 2024-08-13", () => {
describe("User bookings", () => {
let app: INestApplication;
let organization: Team;
let userRepositoryFixture: UserRepositoryFixture;
let bookingsRepositoryFixture: BookingsRepositoryFixture;
let schedulesService: SchedulesService_2024_04_15;
let eventTypesRepositoryFixture: EventTypesRepositoryFixture;
let oauthClientRepositoryFixture: OAuthClientRepositoryFixture;
let oAuthClient: PlatformOAuthClient;
let teamRepositoryFixture: TeamRepositoryFixture;
const userEmail = "bookings-controller-e2e@api.com";
let user: User;
let variableLengthEventType: EventType;
const variableLengthEventTypeSlug = "variable-length-event";
let normalEventType: EventType;
beforeAll(async () => {
const moduleRef = await withApiAuth(
userEmail,
Test.createTestingModule({
imports: [AppModule, PrismaModule, UsersModule, SchedulesModule_2024_04_15],
})
)
.overrideGuard(PermissionsGuard)
.useValue({
canActivate: () => true,
})
.compile();
userRepositoryFixture = new UserRepositoryFixture(moduleRef);
bookingsRepositoryFixture = new BookingsRepositoryFixture(moduleRef);
eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef);
oauthClientRepositoryFixture = new OAuthClientRepositoryFixture(moduleRef);
teamRepositoryFixture = new TeamRepositoryFixture(moduleRef);
schedulesService = moduleRef.get<SchedulesService_2024_04_15>(SchedulesService_2024_04_15);
organization = await teamRepositoryFixture.create({ name: "organization bookings" });
oAuthClient = await createOAuthClient(organization.id);
user = await userRepositoryFixture.create({
email: userEmail,
});
const userSchedule: CreateScheduleInput_2024_04_15 = {
name: "working time",
timeZone: "Europe/Rome",
isDefault: true,
};
await schedulesService.createUserSchedule(user.id, userSchedule);
variableLengthEventType = await eventTypesRepositoryFixture.create(
{
title: "variable length event",
slug: variableLengthEventTypeSlug,
length: 15,
metadata: { multipleDuration: [15, 30, 60] },
},
user.id
);
normalEventType = await eventTypesRepositoryFixture.create(
{ title: "normal event", slug: "normal-event", length: 15 },
user.id
);
app = moduleRef.createNestApplication();
bootstrap(app as NestExpressApplication);
await app.init();
});
async function createOAuthClient(organizationId: number) {
const data = {
logo: "logo-url",
name: "name",
redirectUris: ["http://localhost:5555"],
permissions: 32,
};
const secret = "secret";
const client = await oauthClientRepositoryFixture.create(organizationId, data, secret);
return client;
}
it("should be defined", () => {
expect(userRepositoryFixture).toBeDefined();
expect(user).toBeDefined();
});
describe("create bookings", () => {
it("should not be able to specify length of booking for non variable length event type", async () => {
const lengthInMinutes = 30;
const body: CreateBookingInput_2024_08_13 = {
start: new Date(Date.UTC(2030, 0, 8, 10, 0, 0)).toISOString(),
eventTypeId: normalEventType.id,
lengthInMinutes,
attendee: {
name: "Mr Proper",
email: "mr_proper@gmail.com",
timeZone: "Europe/Rome",
language: "it",
},
location: "https://meet.google.com/abc-def-ghi",
bookingFieldsResponses: {
customField: "customValue",
},
};
return request(app.getHttpServer())
.post("/v2/bookings")
.send(body)
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
.expect(400);
});
it("should create a booking with default length", async () => {
const body: CreateBookingInput_2024_08_13 = {
start: new Date(Date.UTC(2030, 0, 8, 10, 0, 0)).toISOString(),
eventTypeId: variableLengthEventType.id,
attendee: {
name: "Mr Proper",
email: "mr_proper@gmail.com",
timeZone: "Europe/Rome",
language: "it",
},
location: "https://meet.google.com/abc-def-ghi",
bookingFieldsResponses: {
customField: "customValue",
},
};
return request(app.getHttpServer())
.post("/v2/bookings")
.send(body)
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
.expect(201)
.then(async (response) => {
const responseBody: CreateBookingOutput_2024_08_13 = response.body;
expect(responseBody.status).toEqual(SUCCESS_STATUS);
expect(responseBody.data).toBeDefined();
expect(responseDataIsBooking(responseBody.data)).toBe(true);
if (responseDataIsBooking(responseBody.data)) {
const data: BookingOutput_2024_08_13 = responseBody.data;
expect(data.id).toBeDefined();
expect(data.uid).toBeDefined();
expect(data.status).toEqual("accepted");
expect(data.start).toEqual(body.start);
expect(data.end).toEqual(
new Date(Date.UTC(2030, 0, 8, 10, variableLengthEventType.length, 0)).toISOString()
);
expect(data.duration).toEqual(variableLengthEventType.length);
} else {
throw new Error(
"Invalid response data - expected booking but received array of possibily recurring bookings"
);
}
});
});
it("should create a booking with specified length that is not default length", async () => {
const lengthInMinutes = 30;
const body: CreateBookingInput_2024_08_13 = {
lengthInMinutes,
start: new Date(Date.UTC(2030, 0, 8, 11, 0, 0)).toISOString(),
eventTypeId: variableLengthEventType.id,
attendee: {
name: "Mr Proper",
email: "mr_proper@gmail.com",
timeZone: "Europe/Rome",
language: "it",
},
location: "https://meet.google.com/abc-def-ghi",
bookingFieldsResponses: {
customField: "customValue",
},
};
return request(app.getHttpServer())
.post("/v2/bookings")
.send(body)
.set(CAL_API_VERSION_HEADER, VERSION_2024_08_13)
.expect(201)
.then(async (response) => {
const responseBody: CreateBookingOutput_2024_08_13 = response.body;
expect(responseBody.status).toEqual(SUCCESS_STATUS);
expect(responseBody.data).toBeDefined();
expect(responseDataIsBooking(responseBody.data)).toBe(true);
if (responseDataIsBooking(responseBody.data)) {
const data: BookingOutput_2024_08_13 = responseBody.data;
expect(data.id).toBeDefined();
expect(data.uid).toBeDefined();
expect(data.status).toEqual("accepted");
expect(data.start).toEqual(body.start);
expect(data.end).toEqual(new Date(Date.UTC(2030, 0, 8, 11, lengthInMinutes, 0)).toISOString());
expect(data.duration).toEqual(lengthInMinutes);
} else {
throw new Error(
"Invalid response data - expected booking but received array of possibily recurring bookings"
);
}
});
});
});
afterAll(async () => {
await oauthClientRepositoryFixture.delete(oAuthClient.id);
await teamRepositoryFixture.delete(organization.id);
await userRepositoryFixture.deleteByEmail(user.email);
await bookingsRepositoryFixture.deleteAllBookings(user.id, user.email);
await app.close();
});
});
function responseDataIsBooking(data: any): data is BookingOutput_2024_08_13 {
return !Array.isArray(data) && typeof data === "object" && data && "id" in data;
}
});
@@ -0,0 +1,21 @@
import { ApiProperty, getSchemaPath } from "@nestjs/swagger";
import { Type } from "class-transformer";
import { IsEnum, ValidateNested } from "class-validator";
import { SUCCESS_STATUS, ERROR_STATUS } from "@calcom/platform-constants";
import { ReassignBookingOutput_2024_08_13 as ReassignBookingOutputData_2024_08_13 } from "@calcom/platform-types";
export class ReassignBookingOutput_2024_08_13 {
@ApiProperty({ example: SUCCESS_STATUS, enum: [SUCCESS_STATUS, ERROR_STATUS] })
@IsEnum([SUCCESS_STATUS, ERROR_STATUS])
status!: typeof SUCCESS_STATUS | typeof ERROR_STATUS;
@ApiProperty({
oneOf: [{ $ref: getSchemaPath(ReassignBookingOutputData_2024_08_13) }],
description:
"Booking data, which can be either a ReassignAutoBookingOutput object or a ReassignManualBookingOutput object",
})
@ValidateNested()
@Type(() => Object)
data!: ReassignBookingOutputData_2024_08_13;
}
@@ -5,6 +5,8 @@ import { EventTypesRepository_2024_06_14 } from "@/ee/event-types/event-types_20
import { BillingService } from "@/modules/billing/services/billing.service";
import { BookingSeatRepository } from "@/modules/booking-seat/booking-seat.repository";
import { PrismaReadService } from "@/modules/prisma/prisma-read.service";
import { UsersService } from "@/modules/users/services/users.service";
import { UsersRepository, UserWithProfile } from "@/modules/users/users.repository";
import { Injectable, Logger, NotFoundException } from "@nestjs/common";
import { BadRequestException } from "@nestjs/common";
import { Request } from "express";
@@ -15,7 +17,10 @@ import {
getAllUserBookings,
handleInstantMeeting,
handleCancelBooking,
roundRobinReassignment,
roundRobinManualReassignment,
handleMarkNoShow,
confirmBookingHandler,
} from "@calcom/platform-libraries";
import {
CreateBookingInput_2024_08_13,
@@ -23,8 +28,8 @@ import {
CreateRecurringBookingInput_2024_08_13,
GetBookingsInput_2024_08_13,
CreateInstantBookingInput_2024_08_13,
CancelBookingInput_2024_08_13,
MarkAbsentBookingInput_2024_08_13,
ReassignToUserBookingInput_2024_08_13,
BookingOutput_2024_08_13,
RecurringBookingOutput_2024_08_13,
GetSeatedBookingOutput_2024_08_13,
@@ -50,7 +55,9 @@ export class BookingsService_2024_08_13 {
private readonly bookingSeatRepository: BookingSeatRepository,
private readonly eventTypesRepository: EventTypesRepository_2024_06_14,
private readonly prismaReadService: PrismaReadService,
private readonly billingService: BillingService
private readonly billingService: BillingService,
private readonly usersService: UsersService,
private readonly usersRepository: UsersRepository
) {}
async createBooking(request: Request, body: CreateBookingInput) {
@@ -358,4 +365,95 @@ export class BookingsService_2024_08_13 {
fromReschedule: oldBookingUid,
});
}
async reassignBooking(bookingUid: string, requestUser: UserWithProfile) {
const booking = await this.bookingsRepository.getByUid(bookingUid);
if (!booking) {
throw new NotFoundException(`Booking with uid=${bookingUid} was not found in the database`);
}
const profile = this.usersService.getUserMainProfile(requestUser);
await roundRobinReassignment({
bookingId: booking.id,
orgId: profile?.organizationId || null,
});
const reassigned = await this.bookingsRepository.getByUidWithUser(bookingUid);
if (!reassigned) {
throw new NotFoundException(`Reassigned booking with uid=${bookingUid} was not found in the database`);
}
return this.outputService.getOutputReassignedBooking(reassigned);
}
async reassignBookingToUser(
bookingUid: string,
newUserId: number,
reassignedById: number,
body: ReassignToUserBookingInput_2024_08_13
) {
const booking = await this.bookingsRepository.getByUid(bookingUid);
if (!booking) {
throw new NotFoundException(`Booking with uid=${bookingUid} was not found in the database`);
}
const user = await this.usersRepository.findByIdWithProfile(newUserId);
if (!user) {
throw new NotFoundException(`User with id=${newUserId} was not found in the database`);
}
const profile = this.usersService.getUserMainProfile(user);
const reassigned = await roundRobinManualReassignment({
bookingId: booking.id,
newUserId,
orgId: profile?.organizationId || null,
reassignReason: body.reason,
reassignedById,
});
return this.outputService.getOutputReassignedBooking(reassigned);
}
async confirmBooking(bookingUid: string, requestUser: UserWithProfile) {
const booking = await this.bookingsRepository.getByUid(bookingUid);
if (!booking) {
throw new NotFoundException(`Booking with uid=${bookingUid} was not found in the database`);
}
await confirmBookingHandler({
ctx: {
user: requestUser,
},
input: {
bookingId: booking.id,
confirmed: true,
recurringEventId: booking.recurringEventId,
},
});
return this.getBooking(bookingUid);
}
async declineBooking(bookingUid: string, requestUser: UserWithProfile, reason?: string) {
const booking = await this.bookingsRepository.getByUid(bookingUid);
if (!booking) {
throw new NotFoundException(`Booking with uid=${bookingUid} was not found in the database`);
}
await confirmBookingHandler({
ctx: {
user: requestUser,
},
input: {
bookingId: booking.id,
confirmed: false,
recurringEventId: booking.recurringEventId,
reason,
},
});
return this.getBooking(bookingUid);
}
}
@@ -19,6 +19,7 @@ import { v4 as uuidv4 } from "uuid";
import { z } from "zod";
import { X_CAL_CLIENT_ID } from "@calcom/platform-constants";
import { EventTypeMetaDataSchema } from "@calcom/platform-libraries";
import {
CancelBookingInput,
CancelBookingInput_2024_08_13,
@@ -32,6 +33,7 @@ import {
RescheduleBookingInput_2024_08_13,
RescheduleSeatedBookingInput_2024_08_13,
} from "@calcom/platform-types";
import { EventType } from "@calcom/prisma/client";
type BookingRequest = NextApiRequest & { userId: number | undefined } & OAuthRequestParams;
@@ -123,10 +125,13 @@ export class InputBookingsService_2024_08_13 {
throw new NotFoundException(`Event type with id=${inputBooking.eventTypeId} not found`);
}
this.validateBookingLengthInMinutes(inputBooking, eventType);
const lengthInMinutes = inputBooking.lengthInMinutes ?? eventType.length;
const startTime = DateTime.fromISO(inputBooking.start, { zone: "utc" }).setZone(
inputBooking.attendee.timeZone
);
const endTime = startTime.plus({ minutes: eventType.length });
const endTime = startTime.plus({ minutes: lengthInMinutes });
return {
start: startTime.toISO(),
@@ -150,6 +155,25 @@ export class InputBookingsService_2024_08_13 {
};
}
validateBookingLengthInMinutes(inputBooking: CreateBookingInput_2024_08_13, eventType: EventType) {
const eventTypeMetadata = EventTypeMetaDataSchema.parse(eventType.metadata);
if (inputBooking.lengthInMinutes && !eventTypeMetadata?.multipleDuration) {
throw new BadRequestException(
"Can't specify 'lengthInMinutes' because event type does not have multiple possible lengths. Please, remove the 'lengthInMinutes' field from the request."
);
}
if (
inputBooking.lengthInMinutes &&
!eventTypeMetadata?.multipleDuration?.includes(inputBooking.lengthInMinutes)
) {
throw new BadRequestException(
`Provided 'lengthInMinutes' is not one of the possible lengths for the event type. The possible lengths are: ${eventTypeMetadata?.multipleDuration?.join(
", "
)}`
);
}
}
async createRecurringBookingRequest(
request: Request,
body: CreateRecurringBookingInput_2024_08_13
@@ -10,6 +10,7 @@ import {
CreateSeatedBookingOutput_2024_08_13,
GetRecurringSeatedBookingOutput_2024_08_13,
GetSeatedBookingOutput_2024_08_13,
ReassignBookingOutput_2024_08_13,
RecurringBookingOutput_2024_08_13,
SeatedAttendee,
} from "@calcom/platform-types";
@@ -50,6 +51,8 @@ type DatabaseBooking = Booking & {
}[];
} & { user: { id: number; name: string | null; email: string } | null };
type BookingWithUser = Booking & { user: { id: number; name: string | null; email: string } | null };
@Injectable()
export class OutputBookingsService_2024_08_13 {
constructor(private readonly bookingsRepository: BookingsRepository_2024_08_13) {}
@@ -308,4 +311,17 @@ export class OutputBookingsService_2024_08_13 {
return parsed;
}
getOutputReassignedBooking(
databaseBooking: Pick<BookingWithUser, "uid" | "user">
): ReassignBookingOutput_2024_08_13 {
return {
bookingUid: databaseBooking.uid,
reassignedTo: {
id: databaseBooking?.user?.id || 0,
name: databaseBooking?.user?.name || "unknown",
email: databaseBooking?.user?.email || "unknown",
},
};
}
}
@@ -212,6 +212,7 @@ describe("Event types Endpoints", () => {
slug: "coding-class",
description: "Let's learn how to code like a pro.",
lengthInMinutes: 60,
lengthInMinutesOptions: [30, 60, 90],
locations: [
{
type: "integration",
@@ -300,6 +301,7 @@ describe("Event types Endpoints", () => {
expect(createdEventType.title).toEqual(body.title);
expect(createdEventType.description).toEqual(body.description);
expect(createdEventType.lengthInMinutes).toEqual(body.lengthInMinutes);
expect(createdEventType.lengthInMinutesOptions).toEqual(body.lengthInMinutesOptions);
expect(createdEventType.locations).toEqual(body.locations);
expect(createdEventType.ownerId).toEqual(user.id);
expect(createdEventType.scheduleId).toEqual(firstSchedule.id);
@@ -360,6 +362,7 @@ describe("Event types Endpoints", () => {
expect(fetchedEventType?.title).toEqual(eventType.title);
expect(fetchedEventType?.description).toEqual(eventType.description);
expect(fetchedEventType?.lengthInMinutes).toEqual(eventType.lengthInMinutes);
expect(fetchedEventType?.lengthInMinutesOptions).toEqual(eventType.lengthInMinutesOptions);
expect(fetchedEventType?.locations).toEqual(eventType.locations);
expect(fetchedEventType?.bookingFields).toEqual(eventType.bookingFields);
expect(fetchedEventType?.ownerId).toEqual(user.id);
@@ -665,6 +668,7 @@ describe("Event types Endpoints", () => {
const body: UpdateEventTypeInput_2024_06_14 = {
title: newTitle,
scheduleId: secondSchedule.id,
lengthInMinutesOptions: [15, 30],
bookingFields: [
nameBookingField,
{
@@ -733,6 +737,7 @@ describe("Event types Endpoints", () => {
expect(updatedEventType.id).toEqual(eventType.id);
expect(updatedEventType.title).toEqual(newTitle);
expect(updatedEventType.lengthInMinutesOptions).toEqual(body.lengthInMinutesOptions);
expect(updatedEventType.description).toEqual(eventType.description);
expect(updatedEventType.lengthInMinutes).toEqual(eventType.lengthInMinutes);
expect(updatedEventType.locations).toEqual(eventType.locations);
@@ -772,6 +777,7 @@ describe("Event types Endpoints", () => {
eventType.title = newTitle;
eventType.scheduleId = secondSchedule.id;
eventType.lengthInMinutesOptions = updatedEventType.lengthInMinutesOptions;
eventType.bookingLimitsCount = updatedEventType.bookingLimitsCount;
eventType.onlyShowFirstAvailableSlot = updatedEventType.onlyShowFirstAvailableSlot;
eventType.bookingLimitsDuration = updatedEventType.bookingLimitsDuration;
@@ -819,6 +825,7 @@ describe("Event types Endpoints", () => {
expect(fetchedEventType.title).toEqual(eventType.title);
expect(fetchedEventType.description).toEqual(eventType.description);
expect(fetchedEventType.lengthInMinutes).toEqual(eventType.lengthInMinutes);
expect(fetchedEventType.lengthInMinutesOptions).toEqual(eventType.lengthInMinutesOptions);
expect(fetchedEventType.locations).toEqual(eventType.locations);
expect(fetchedEventType.bookingFields).toEqual(eventType.bookingFields);
expect(fetchedEventType.ownerId).toEqual(user.id);
@@ -857,6 +864,7 @@ describe("Event types Endpoints", () => {
expect(fetchedEventType?.title).toEqual(eventType.title);
expect(fetchedEventType?.description).toEqual(eventType.description);
expect(fetchedEventType?.lengthInMinutes).toEqual(eventType.lengthInMinutes);
expect(fetchedEventType?.lengthInMinutesOptions).toEqual(eventType.lengthInMinutesOptions);
expect(fetchedEventType?.locations).toEqual(eventType.locations);
expect(fetchedEventType?.bookingFields).toEqual(eventType.bookingFields);
expect(fetchedEventType?.ownerId).toEqual(user.id);
@@ -104,6 +104,7 @@ export class InputEventTypesService_2024_06_14 {
const {
lengthInMinutes,
lengthInMinutesOptions,
locations,
bookingFields,
bookingLimitsCount,
@@ -135,6 +136,7 @@ export class InputEventTypesService_2024_06_14 {
bookerLayouts: this.transformInputBookerLayouts(bookerLayouts),
requiresConfirmationThreshold:
confirmationPolicyTransformed?.requiresConfirmationThreshold ?? undefined,
multipleDuration: lengthInMinutesOptions,
},
requiresConfirmation: confirmationPolicyTransformed?.requiresConfirmation ?? undefined,
requiresConfirmationWillBlockSlot:
@@ -152,6 +154,7 @@ export class InputEventTypesService_2024_06_14 {
async transformInputUpdateEventType(inputEventType: UpdateEventTypeInput_2024_06_14, eventTypeId: number) {
const {
lengthInMinutes,
lengthInMinutesOptions,
locations,
bookingFields,
bookingLimitsCount,
@@ -191,6 +194,7 @@ export class InputEventTypesService_2024_06_14 {
bookerLayouts: this.transformInputBookerLayouts(bookerLayouts),
requiresConfirmationThreshold:
confirmationPolicyTransformed?.requiresConfirmationThreshold ?? undefined,
multipleDuration: lengthInMinutesOptions,
},
recurringEvent: recurrence ? this.transformInputRecurrignEvent(recurrence) : undefined,
requiresConfirmation: confirmationPolicyTransformed?.requiresConfirmation ?? undefined,
@@ -153,6 +153,7 @@ export class OutputEventTypesService_2024_06_14 {
id,
ownerId,
lengthInMinutes: length,
lengthInMinutesOptions: metadata.multipleDuration,
title,
slug,
description: description || "",
+4
View File
@@ -10,6 +10,8 @@ export type Environment = {
DATABASE_URL: string;
JWT_SECRET: string;
SENTRY_DSN: string;
SENTRY_TRACES_SAMPLE_RATE?: number;
SENTRY_PROFILES_SAMPLE_RATE?: number;
LOG_LEVEL: keyof typeof logLevels;
REDIS_URL: string;
STRIPE_API_KEY: string;
@@ -26,6 +28,8 @@ export type Environment = {
RATE_LIMIT_DEFAULT_LIMIT_ACCESS_TOKEN: number;
RATE_LIMIT_DEFAULT_LIMIT: number;
RATE_LIMIT_DEFAULT_BLOCK_DURATION_MS: number;
AXIOM_DATASET: string;
AXIOM_TOKEN: string;
};
export const getEnv = <K extends keyof Environment>(key: K, fallback?: Environment[K]): Environment[K] => {
+7 -4
View File
@@ -1,12 +1,15 @@
import { getEnv } from "@/env";
import * as Sentry from "@sentry/node";
import * as Sentry from "@sentry/nestjs";
import { nodeProfilingIntegration } from "@sentry/profiling-node";
if (process.env.SENTRY_DSN) {
// Ensure to call this before requiring any other modules!
Sentry.init({
dsn: getEnv("SENTRY_DSN"),
// Add Performance Monitoring by setting tracesSampleRate
// We recommend adjusting this value in production
// todo: Evaluate? tracesSampleRate: 1.0
integrations: [nodeProfilingIntegration()],
// Performance Monitoring
tracesSampleRate: getEnv("SENTRY_TRACES_SAMPLE_RATE") ?? 1.0, // Capture 100% of the transactions
// Set sampling rate for profiling - this is relative to tracesSampleRate
profilesSampleRate: getEnv("SENTRY_PROFILES_SAMPLE_RATE") ?? 1.0,
});
}
+18 -4
View File
@@ -1,5 +1,7 @@
import { WinstonTransport as AxiomTransport } from "@axiomhq/winston";
import type { LoggerOptions } from "winston";
import { format, transports } from "winston";
import { format, transports as Transports } from "winston";
import type Transport from "winston-transport";
const formattedTimestamp = format.timestamp({
format: "YYYY-MM-DD HH:mm:ss.SSS",
@@ -36,13 +38,25 @@ export const logLevels = {
export const loggerConfig = (): LoggerOptions => {
const isProduction = process.env.NODE_ENV === "production";
const transports: Transport[] = [];
transports.push(new Transports.Console());
if (!!process.env.AXIOM_TOKEN && !!process.env.AXIOM_DATASET) {
transports.push(
new AxiomTransport({
token: process.env.AXIOM_TOKEN,
dataset: process.env.AXIOM_DATASET,
})
);
}
return {
levels: logLevels,
level: process.env.LOG_LEVEL ?? "info",
format: isProduction ? WINSTON_PROD_FORMAT : WINSTON_DEV_FORMAT,
transports: [new transports.Console()],
exceptionHandlers: [new transports.Console()],
rejectionHandlers: [new transports.Console()],
transports,
exceptionHandlers: transports,
rejectionHandlers: transports,
defaultMeta: {
service: "cal-platform-api",
},
+12 -4
View File
@@ -1,4 +1,5 @@
import type { AppConfig } from "@/config/type";
import { getEnv } from "@/env";
import { Logger } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { NestFactory } from "@nestjs/core";
@@ -107,13 +108,20 @@ async function generateSwagger(app: NestExpressApplication<Server>) {
const document = SwaggerModule.createDocument(app, config);
document.paths = groupAndSortPathsByFirstTag(document.paths);
const outputFile = "./swagger/documentation.json";
const swaggerOutputFile = "./swagger/documentation.json";
const docsOutputFile = "../../../docs/api-reference/v2/openapi.json";
const stringifiedContents = JSON.stringify(document, null, 2);
if (fs.existsSync(outputFile)) {
fs.unlinkSync(outputFile);
if (fs.existsSync(swaggerOutputFile)) {
fs.unlinkSync(swaggerOutputFile);
}
fs.writeFileSync(outputFile, JSON.stringify(document, null, 2), { encoding: "utf8" });
fs.writeFileSync(swaggerOutputFile, stringifiedContents, { encoding: "utf8" });
if (fs.existsSync(docsOutputFile) && getEnv("NODE_ENV") === "development") {
fs.unlinkSync(docsOutputFile);
fs.writeFileSync(docsOutputFile, stringifiedContents, { encoding: "utf8" });
}
if (!process.env.DOCS_URL) {
SwaggerModule.setup("docs", app, document, {
@@ -46,9 +46,9 @@ export class BillingProcessor {
return;
}
const stripeSubscription = await this.stripeService.stripe.subscriptions.retrieve(
billingSubscription.subscriptionId
);
const stripeSubscription = await this.stripeService
.getStripe()
.subscriptions.retrieve(billingSubscription.subscriptionId);
if (!stripeSubscription?.id) {
this.logger.error(`Failed to retrieve stripe subscription (${billingSubscription.subscriptionId})`, {
teamId,
@@ -69,7 +69,7 @@ export class BillingProcessor {
return;
}
await this.stripeService.stripe.subscriptionItems.createUsageRecord(meteredItem.id, {
await this.stripeService.getStripe().subscriptionItems.createUsageRecord(meteredItem.id, {
action: "increment",
quantity: 1,
timestamp: "now",
@@ -1,10 +1,11 @@
import { PlatformPlan } from "@/modules/billing/types";
import { PrismaReadService } from "@/modules/prisma/prisma-read.service";
import { PrismaWriteService } from "@/modules/prisma/prisma-write.service";
import { Injectable } from "@nestjs/common";
import { Injectable, Logger } from "@nestjs/common";
@Injectable()
export class BillingRepository {
private readonly logger = new Logger("BillingRepository");
constructor(private readonly dbRead: PrismaReadService, private readonly dbWrite: PrismaWriteService) {}
getBillingForTeam = (teamId: number) =>
@@ -30,6 +31,35 @@ export class BillingRepository {
billingCycleEnd: billingEnd,
subscriptionId,
plan: plan.toString(),
overdue: false,
},
});
}
async updateBillingOverdue(subId: string, cusId: string, overdue: boolean) {
try {
return this.dbWrite.prisma.platformBilling.update({
where: {
subscriptionId: subId,
customerId: cusId,
},
data: {
overdue,
},
});
} catch (err) {
this.logger.error("Could not update billing overdue", {
subId,
cusId,
err,
});
}
}
async deleteBilling(id: number) {
return this.dbWrite.prisma.platformBilling.delete({
where: {
id,
},
});
}
@@ -0,0 +1,211 @@
import { bootstrap } from "@/app";
import { AppModule } from "@/app.module";
import { PrismaModule } from "@/modules/prisma/prisma.module";
import { StripeService } from "@/modules/stripe/stripe.service";
import { TokensModule } from "@/modules/tokens/tokens.module";
import { UsersModule } from "@/modules/users/users.module";
import { UserWithProfile } from "@/modules/users/users.repository";
import { INestApplication } from "@nestjs/common";
import { NestExpressApplication } from "@nestjs/platform-express";
import { Test } from "@nestjs/testing";
import Stripe from "stripe";
import * as request from "supertest";
import { PlatformBillingRepositoryFixture } from "test/fixtures/repository/billing.repository.fixture";
import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture";
import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture";
import { OrganizationRepositoryFixture } from "test/fixtures/repository/organization.repository.fixture";
import { ProfileRepositoryFixture } from "test/fixtures/repository/profiles.repository.fixture";
import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture";
import { withApiAuth } from "test/utils/withApiAuth";
import { Team, PlatformOAuthClient, PlatformBilling } from "@calcom/prisma/client";
describe("Platform Billing Controller (e2e)", () => {
let app: INestApplication;
const userEmail = "platform-billing-controller-e2e@api.com";
let user: UserWithProfile;
let billing: PlatformBilling;
let userRepositoryFixture: UserRepositoryFixture;
let organizationsRepositoryFixture: OrganizationRepositoryFixture;
let profileRepositoryFixture: ProfileRepositoryFixture;
let membershipsRepositoryFixture: MembershipRepositoryFixture;
let oauthClientRepositoryFixture: OAuthClientRepositoryFixture;
let oAuthClient: PlatformOAuthClient;
let platformBillingRepositoryFixture: PlatformBillingRepositoryFixture;
let organization: Team;
beforeAll(async () => {
const moduleRef = await withApiAuth(
userEmail,
Test.createTestingModule({
imports: [AppModule, PrismaModule, UsersModule, TokensModule],
})
).compile();
userRepositoryFixture = new UserRepositoryFixture(moduleRef);
organizationsRepositoryFixture = new OrganizationRepositoryFixture(moduleRef);
profileRepositoryFixture = new ProfileRepositoryFixture(moduleRef);
oauthClientRepositoryFixture = new OAuthClientRepositoryFixture(moduleRef);
membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef);
platformBillingRepositoryFixture = new PlatformBillingRepositoryFixture(moduleRef);
organization = await organizationsRepositoryFixture.create({ name: "platform billing" });
user = await userRepositoryFixture.create({
email: userEmail,
username: userEmail,
});
await profileRepositoryFixture.create({
uid: `usr-${user.id}`,
username: userEmail,
organization: {
connect: {
id: organization.id,
},
},
user: {
connect: {
id: user.id,
},
},
});
await membershipsRepositoryFixture.create({
role: "OWNER",
team: { connect: { id: organization.id } },
user: { connect: { id: user.id } },
accepted: true,
});
billing = await platformBillingRepositoryFixture.create(organization.id);
app = moduleRef.createNestApplication();
bootstrap(app as NestExpressApplication);
await app.init();
});
afterAll(async () => {
userRepositoryFixture.deleteByEmail(user.email);
await app.close();
});
it("/billing/webhook (POST) should set billing free plan for org", () => {
jest.spyOn(StripeService.prototype, "getStripe").mockImplementation(
() =>
({
webhooks: {
constructEventAsync: async () => {
return {
type: "checkout.session.completed",
data: {
object: {
metadata: {
teamId: organization.id,
plan: "FREE",
},
mode: "subscription",
},
},
};
},
},
} as unknown as Stripe)
);
return request(app.getHttpServer())
.post("/v2/billing/webhook")
.expect(200)
.then(async (res) => {
const billing = await platformBillingRepositoryFixture.get(organization.id);
expect(billing?.plan).toEqual("FREE");
});
});
it("/billing/webhook (POST) failed payment should set billing free plan to overdue", () => {
jest.spyOn(StripeService.prototype, "getStripe").mockImplementation(
() =>
({
webhooks: {
constructEventAsync: async () => {
return {
type: "invoice.payment_failed",
data: {
object: {
customer: billing?.customerId,
subscription: billing?.subscriptionId,
},
},
};
},
},
} as unknown as Stripe)
);
return request(app.getHttpServer())
.post("/v2/billing/webhook")
.expect(200)
.then(async (res) => {
const billing = await platformBillingRepositoryFixture.get(organization.id);
expect(billing?.overdue).toEqual(true);
});
});
it("/billing/webhook (POST) success payment should set billing free plan to not overdue", () => {
jest.spyOn(StripeService.prototype, "getStripe").mockImplementation(
() =>
({
webhooks: {
constructEventAsync: async () => {
return {
type: "invoice.payment_succeeded",
data: {
object: {
customer: billing?.customerId,
subscription: billing?.subscriptionId,
},
},
};
},
},
} as unknown as Stripe)
);
return request(app.getHttpServer())
.post("/v2/billing/webhook")
.expect(200)
.then(async (res) => {
const billing = await platformBillingRepositoryFixture.get(organization.id);
expect(billing?.overdue).toEqual(false);
});
});
it("/billing/webhook (POST) should delete subscription", () => {
jest.spyOn(StripeService.prototype, "getStripe").mockImplementation(
() =>
({
webhooks: {
constructEventAsync: async () => {
return {
type: "customer.subscription.deleted",
data: {
object: {
metadata: {
teamId: organization.id,
plan: "FREE",
},
id: billing?.subscriptionId,
},
},
};
},
},
} as unknown as Stripe)
);
return request(app.getHttpServer())
.post("/v2/billing/webhook")
.expect(200)
.then(async (res) => {
const billing = await platformBillingRepositoryFixture.get(organization.id);
expect(billing).toBeNull();
});
});
});
@@ -102,13 +102,26 @@ export class BillingController {
@Req() request: Request,
@Headers("stripe-signature") stripeSignature: string
): Promise<ApiResponse> {
const event = await this.billingService.stripeService.stripe.webhooks.constructEventAsync(
request.body,
stripeSignature,
this.stripeWhSecret
);
const event = await this.billingService.stripeService
.getStripe()
.webhooks.constructEventAsync(request.body, stripeSignature, this.stripeWhSecret);
await this.billingService.createOrUpdateStripeSubscription(event);
switch (event.type) {
case "checkout.session.completed":
await this.billingService.handleStripeCheckoutEvents(event);
break;
case "customer.subscription.deleted":
await this.billingService.handleStripeSubscriptionDeleted(event);
break;
case "invoice.payment_failed":
await this.billingService.handleStripePaymentFailed(event);
break;
case "invoice.payment_succeeded":
await this.billingService.handleStripePaymentSuccess(event);
break;
default:
break;
}
return {
status: "success",
@@ -64,7 +64,7 @@ export class BillingService implements OnModuleDestroy {
}
async redirectToSubscribeCheckout(teamId: number, plan: PlatformPlan, customerId?: string) {
const { url } = await this.stripeService.stripe.checkout.sessions.create({
const { url } = await this.stripeService.getStripe().checkout.sessions.create({
customer: customerId,
line_items: [
{
@@ -101,7 +101,7 @@ export class BillingService implements OnModuleDestroy {
const teamWithBilling = await this.teamsRepository.findByIdIncludeBilling(teamId);
const customerId = teamWithBilling?.platformBilling?.customerId;
const { url } = await this.stripeService.stripe.checkout.sessions.create({
const { url } = await this.stripeService.getStripe().checkout.sessions.create({
customer: customerId,
success_url: `${this.webAppUrl}/settings/platform/`,
cancel_url: `${this.webAppUrl}/settings/platform/plans`,
@@ -131,41 +131,92 @@ export class BillingService implements OnModuleDestroy {
);
}
async createOrUpdateStripeSubscription(event: Stripe.Event) {
if (event.type === "checkout.session.completed") {
const subscription = event.data.object as Stripe.Checkout.Session;
if (!subscription.metadata?.teamId) {
return {
status: "success",
};
}
const teamId = Number.parseInt(subscription.metadata.teamId);
const plan = subscription.metadata.plan;
if (!plan || !teamId) {
this.logger.log("Webhook received but not pertaining to Platform, discarding.");
return {
status: "success",
};
}
if (subscription.mode === "subscription") {
await this.setSubscriptionForTeam(
async handleStripeSubscriptionDeleted(event: Stripe.Event) {
const subscription = event.data.object as Stripe.Subscription;
const teamId = subscription?.metadata?.teamId;
const plan = PlatformPlan[subscription?.metadata?.plan?.toUpperCase() as keyof typeof PlatformPlan];
if (teamId && plan) {
const currentBilling = await this.billingRepository.getBillingForTeam(Number.parseInt(teamId));
if (currentBilling?.subscriptionId === subscription.id) {
await this.billingRepository.deleteBilling(currentBilling.id);
this.logger.log(`Stripe Subscription deleted`, {
customerId: currentBilling.customerId,
subscriptionId: currentBilling.subscriptionId,
teamId,
subscription.subscription as string,
PlatformPlan[plan.toUpperCase() as keyof typeof PlatformPlan]
);
});
return;
}
if (subscription.mode === "setup") {
await this.updateStripeSubscriptionForTeam(teamId, plan as PlatformPlan);
}
return {
status: "success",
};
this.logger.log("No platform billing found.");
return;
}
this.logger.log("Webhook received but not pertaining to Platform, discarding.");
return;
}
getSubscriptionIdFromInvoice(invoice: Stripe.Invoice): string | null {
if (typeof invoice.subscription === "string") {
return invoice.subscription;
} else if (invoice.subscription && typeof invoice.subscription === "object") {
return invoice.subscription.id;
} else {
return null;
}
}
getCustomerIdFromInvoice(invoice: Stripe.Invoice): string | null {
if (typeof invoice.customer === "string") {
return invoice.customer;
} else if (invoice.customer && typeof invoice.customer === "object") {
return invoice.customer.id;
} else {
return null;
}
}
async handleStripePaymentSuccess(event: Stripe.Event) {
const invoice = event.data.object as Stripe.Invoice;
const subscriptionId = this.getSubscriptionIdFromInvoice(invoice);
const customerId = this.getCustomerIdFromInvoice(invoice);
if (subscriptionId && customerId) {
await this.billingRepository.updateBillingOverdue(subscriptionId, customerId, false);
}
}
async handleStripePaymentFailed(event: Stripe.Event) {
const invoice = event.data.object as Stripe.Invoice;
const subscriptionId = this.getSubscriptionIdFromInvoice(invoice);
const customerId = this.getCustomerIdFromInvoice(invoice);
if (subscriptionId && customerId) {
await this.billingRepository.updateBillingOverdue(subscriptionId, customerId, true);
}
}
async handleStripeCheckoutEvents(event: Stripe.Event) {
const checkoutSession = event.data.object as Stripe.Checkout.Session;
if (!checkoutSession.metadata?.teamId) {
return;
}
const teamId = Number.parseInt(checkoutSession.metadata.teamId);
const plan = checkoutSession.metadata.plan;
if (!plan || !teamId) {
this.logger.log("Webhook received but not pertaining to Platform, discarding.");
return;
}
if (checkoutSession.mode === "subscription") {
await this.setSubscriptionForTeam(
teamId,
checkoutSession.subscription as string,
PlatformPlan[plan.toUpperCase() as keyof typeof PlatformPlan]
);
}
if (checkoutSession.mode === "setup") {
await this.updateStripeSubscriptionForTeam(teamId, plan as PlatformPlan);
}
return;
}
async updateStripeSubscriptionForTeam(teamId: number, plan: PlatformPlan) {
@@ -175,9 +226,9 @@ export class BillingService implements OnModuleDestroy {
throw new NotFoundException("Team plan not found");
}
const existingUserSubscription = await this.stripeService.stripe.subscriptions.retrieve(
teamWithBilling?.platformBilling?.subscriptionId
);
const existingUserSubscription = await this.stripeService
.getStripe()
.subscriptions.retrieve(teamWithBilling?.platformBilling?.subscriptionId);
const currentLicensedItem = existingUserSubscription.items.data.find(
(item) => item.price?.recurring?.usage_type === "licensed"
);
@@ -193,21 +244,23 @@ export class BillingService implements OnModuleDestroy {
throw new NotFoundException("There is no overage item present in the subscription");
}
await this.stripeService.stripe.subscriptions.update(teamWithBilling?.platformBilling?.subscriptionId, {
items: [
{
id: currentLicensedItem.id,
price: this.billingConfigService.get(plan)?.base,
},
{
id: currentOverageItem.id,
price: this.billingConfigService.get(plan)?.overage,
clear_usage: false,
},
],
billing_cycle_anchor: "now",
proration_behavior: "create_prorations",
});
await this.stripeService
.getStripe()
.subscriptions.update(teamWithBilling?.platformBilling?.subscriptionId, {
items: [
{
id: currentLicensedItem.id,
price: this.billingConfigService.get(plan)?.base,
},
{
id: currentOverageItem.id,
price: this.billingConfigService.get(plan)?.overage,
clear_usage: false,
},
],
billing_cycle_anchor: "now",
proration_behavior: "create_prorations",
});
await this.setSubscriptionForTeam(
teamId,
+2 -1
View File
@@ -1,8 +1,9 @@
export enum PlatformPlan {
FREE = "FREE",
STARTER = "STARTER",
ESSENTIALS = "ESSENTIALS",
SCALE = "SCALE",
ENTERPRISE = "ENTERPRISE",
}
export type PlatformPlanType = "STARTER" | "ESSENTIALS" | "SCALE" | "ENTERPRISE";
export type PlatformPlanType = "FREE" | "STARTER" | "ESSENTIALS" | "SCALE" | "ENTERPRISE";
@@ -25,9 +25,9 @@ import {
import {
ApiTags as DocsTags,
ApiExcludeController as DocsExcludeController,
ApiExcludeEndpoint as DocsExcludeEndpoint,
ApiOperation as DocsOperation,
ApiOkResponse as DocsOkResponse,
ApiExcludeEndpoint as DocsExcludeEndpoint,
ApiBadRequestResponse as DocsBadRequestResponse,
ApiHeader as DocsHeader,
} from "@nestjs/swagger";
@@ -50,20 +50,7 @@ export class OAuthFlowController {
@Post("/authorize")
@HttpCode(HttpStatus.OK)
@UseGuards(NextAuthGuard)
@DocsOperation({
summary: "Authorize an OAuth client",
description:
"Redirects the user to the specified 'redirect_uri' with an authorization code in query parameter if the client is authorized successfully. The code is then exchanged for access and refresh tokens via the `/exchange` endpoint.",
})
@DocsOkResponse({
description:
"The user is redirected to the 'redirect_uri' with an authorization code in query parameter e.g. `redirectUri?code=secretcode.`",
})
@DocsBadRequestResponse({
description:
"Bad request if the OAuth client is not found, if the redirect URI is invalid, or if the user has already authorized the client.",
})
@DocsExcludeEndpoint(getEnv("NODE_ENV") === "production")
@DocsExcludeEndpoint()
async authorize(
@Param("clientId") clientId: string,
@Body() body: OAuthAuthorizeInput,
@@ -97,20 +84,7 @@ export class OAuthFlowController {
@Post("/exchange")
@HttpCode(HttpStatus.OK)
@DocsOperation({
summary: "Exchange authorization code for access tokens",
description:
"Exchanges the authorization code received from the `/authorize` endpoint for access and refresh tokens. The authorization code should be provided in the 'Authorization' header prefixed with 'Bearer '.",
})
@DocsOkResponse({
type: KeysResponseDto,
description: "Successfully exchanged authorization code for access and refresh tokens.",
})
@DocsBadRequestResponse({
description:
"Bad request if the authorization code is missing, invalid, or if the client ID and secret do not match.",
})
@DocsExcludeEndpoint(getEnv("NODE_ENV") === "production")
@DocsExcludeEndpoint()
async exchange(
@Headers("Authorization") authorization: string,
@Param("clientId") clientId: string,
@@ -31,6 +31,7 @@ import {
HttpStatus,
HttpCode,
UnprocessableEntityException,
Logger,
} from "@nestjs/common";
import { ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger";
import { plainToClass } from "class-transformer";
@@ -46,6 +47,8 @@ import { SkipTakePagination } from "@calcom/platform-types";
@UseGuards(ApiAuthGuard, IsOrgGuard, RolesGuard, IsTeamInOrg, PlatformPlanGuard, IsAdminAPIEnabledGuard)
@DocsTags("Orgs / Teams / Memberships")
export class OrganizationsTeamsMembershipsController {
private logger = new Logger("OrganizationsTeamsMembershipsController");
constructor(
private organizationsTeamsMembershipsService: OrganizationsTeamsMembershipsService,
private oganizationsEventTypesService: OrganizationsEventTypesService,
@@ -148,7 +151,11 @@ export class OrganizationsTeamsMembershipsController {
);
if (!currentMembership.accepted && updatedMembership.accepted) {
await updateNewTeamMemberEventTypes(updatedMembership.userId, teamId);
try {
await updateNewTeamMemberEventTypes(updatedMembership.userId, teamId);
} catch (err) {
this.logger.error("Could not update new team member eventTypes", err);
}
}
return {
@@ -175,7 +182,11 @@ export class OrganizationsTeamsMembershipsController {
const membership = await this.organizationsTeamsMembershipsService.createOrgTeamMembership(teamId, data);
if (membership.accepted) {
await updateNewTeamMemberEventTypes(user.id, teamId);
try {
await updateNewTeamMemberEventTypes(user.id, teamId);
} catch (err) {
this.logger.error("Could not update new team member eventTypes", err);
}
}
return {
status: SUCCESS_STATUS,
@@ -33,7 +33,7 @@ export class OrganizationsRepository {
}
async createNewBillingRelation(orgId: number, plan?: PlatformPlan) {
const { id } = await this.stripeService.stripe.customers.create({
const { id } = await this.stripeService.getStripe().customers.create({
metadata: {
createdBy: "oauth_client_no_csid", // mark in case this is needed in the future.
},
@@ -28,7 +28,7 @@ type IntegrationOAuthCallbackState = {
@Injectable()
export class StripeService {
public stripe: Stripe;
private stripe: Stripe;
private redirectUri = `${this.config.get("api.url")}/stripe/save`;
constructor(
@@ -44,6 +44,10 @@ export class StripeService {
});
}
getStripe() {
return this.stripe;
}
async getStripeRedirectUrl(state: string, userEmail?: string, userName?: string | null) {
const { client_id } = await this.getStripeAppKeys();
@@ -82,7 +82,10 @@ export class WebhooksController {
}
@Get("/")
@ApiOperation({ summary: "Get all webooks (paginated)" })
@ApiOperation({
summary: "Get all webooks",
description: "Gets a paginated list of webhooks for the authenticated user.",
})
async getWebhooks(
@GetUser() user: UserWithProfile,
@Query() query: SkipTakePagination
+431 -116
View File
@@ -3257,6 +3257,230 @@
]
}
},
"/v2/bookings/{bookingUid}/reassign": {
"post": {
"operationId": "BookingsController_2024_08_13_reassignBooking",
"summary": "Automatically reassign booking to a new host",
"parameters": [
{
"name": "cal-api-version",
"in": "header",
"description": "Must be set to `2024-08-13`",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "bookingUid",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "Authorization",
"in": "header",
"description": "value must be `Bearer <token>` where `<token>` either managed user access token or api key prefixed with cal_",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ReassignBookingOutput_2024_08_13"
}
}
}
}
},
"tags": [
"Bookings"
]
}
},
"/v2/bookings/{bookingUid}/reassign/{userId}": {
"post": {
"operationId": "BookingsController_2024_08_13_reassignBookingToUser",
"summary": "Reassign a booking to a specific user",
"parameters": [
{
"name": "cal-api-version",
"in": "header",
"description": "Must be set to `2024-08-13`",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "bookingUid",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "userId",
"required": true,
"in": "path",
"schema": {
"type": "number"
}
},
{
"name": "Authorization",
"in": "header",
"description": "value must be `Bearer <token>` where `<token>` either managed user access token or api key prefixed with cal_",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ReassignToUserBookingInput_2024_08_13"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ReassignBookingOutput_2024_08_13"
}
}
}
}
},
"tags": [
"Bookings"
]
}
},
"/v2/bookings/{bookingUid}/confirm": {
"post": {
"operationId": "BookingsController_2024_08_13_confirmBooking",
"summary": "Confirm booking that requires a confirmation",
"parameters": [
{
"name": "cal-api-version",
"in": "header",
"description": "Must be set to `2024-08-13`",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "bookingUid",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "Authorization",
"in": "header",
"description": "value must be `Bearer <token>` where `<token>` either managed user access token or api key prefixed with cal_",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GetBookingOutput_2024_08_13"
}
}
}
}
},
"tags": [
"Bookings"
]
}
},
"/v2/bookings/{bookingUid}/decline": {
"post": {
"operationId": "BookingsController_2024_08_13_declineBooking",
"summary": "Decline booking that requires a confirmation",
"parameters": [
{
"name": "cal-api-version",
"in": "header",
"description": "Must be set to `2024-08-13`",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "bookingUid",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "Authorization",
"in": "header",
"description": "value must be `Bearer <token>` where `<token>` either managed user access token or api key prefixed with cal_",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DeclineBookingInput_2024_08_13"
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GetBookingOutput_2024_08_13"
}
}
}
}
},
"tags": [
"Bookings"
]
}
},
"/v2/calendars/ics-feed/save": {
"post": {
"operationId": "CalendarsController_createIcsFeed",
@@ -4214,97 +4438,6 @@
]
}
},
"/v2/oauth/{clientId}/authorize": {
"post": {
"operationId": "OAuthFlowController_authorize",
"summary": "Authorize an OAuth client",
"description": "Redirects the user to the specified 'redirect_uri' with an authorization code in query parameter if the client is authorized successfully. The code is then exchanged for access and refresh tokens via the `/exchange` endpoint.",
"parameters": [
{
"name": "clientId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OAuthAuthorizeInput"
}
}
}
},
"responses": {
"200": {
"description": "The user is redirected to the 'redirect_uri' with an authorization code in query parameter e.g. `redirectUri?code=secretcode.`"
},
"400": {
"description": "Bad request if the OAuth client is not found, if the redirect URI is invalid, or if the user has already authorized the client."
}
},
"tags": [
"OAuth"
]
}
},
"/v2/oauth/{clientId}/exchange": {
"post": {
"operationId": "OAuthFlowController_exchange",
"summary": "Exchange authorization code for access tokens",
"description": "Exchanges the authorization code received from the `/authorize` endpoint for access and refresh tokens. The authorization code should be provided in the 'Authorization' header prefixed with 'Bearer '.",
"parameters": [
{
"name": "Authorization",
"required": true,
"in": "header",
"schema": {
"type": "string"
}
},
{
"name": "clientId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ExchangeAuthorizationCodeInput"
}
}
}
},
"responses": {
"200": {
"description": "Successfully exchanged authorization code for access and refresh tokens.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/KeysResponseDto"
}
}
}
},
"400": {
"description": "Bad request if the authorization code is missing, invalid, or if the client ID and secret do not match."
}
},
"tags": [
"OAuth"
]
}
},
"/v2/oauth/{clientId}/refresh": {
"post": {
"operationId": "OAuthFlowController_refreshAccessToken",
@@ -5033,6 +5166,37 @@
]
}
},
"/v2/stripe/check/{teamId}": {
"get": {
"operationId": "StripeController_checkTeamStripeConnection",
"summary": "Check team stripe connection",
"parameters": [
{
"name": "teamId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/StripCredentialsCheckOutputResponseDto"
}
}
}
}
},
"tags": [
"Stripe"
]
}
},
"/v2/timezones": {
"get": {
"operationId": "TimezonesController_getTimeZones",
@@ -5088,7 +5252,8 @@
},
"get": {
"operationId": "WebhooksController_getWebhooks",
"summary": "Get all webooks (paginated)",
"summary": "Get all webooks",
"description": "Gets a paginated list of webhooks for the authenticated user.",
"parameters": [
{
"name": "take",
@@ -5818,28 +5983,6 @@
}
}
},
"OAuthAuthorizeInput": {
"type": "object",
"properties": {
"redirectUri": {
"type": "string"
}
},
"required": [
"redirectUri"
]
},
"ExchangeAuthorizationCodeInput": {
"type": "object",
"properties": {
"clientSecret": {
"type": "string"
}
},
"required": [
"clientSecret"
]
},
"RefreshTokenInput": {
"type": "object",
"properties": {
@@ -6720,6 +6863,18 @@
"type": "number",
"example": 60
},
"lengthInMinutesOptions": {
"example": [
15,
30,
60
],
"description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.",
"type": "array",
"items": {
"type": "string"
}
},
"title": {
"type": "string",
"example": "Learn the secrets of masterchief!"
@@ -6943,6 +7098,7 @@
},
"required": [
"lengthInMinutes",
"lengthInMinutesOptions",
"title",
"slug"
]
@@ -8085,6 +8241,18 @@
"type": "number",
"example": 60
},
"lengthInMinutesOptions": {
"example": [
15,
30,
60
],
"description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.",
"type": "array",
"items": {
"type": "string"
}
},
"title": {
"type": "string",
"example": "Learn the secrets of masterchief!"
@@ -8308,6 +8476,7 @@
"required": [
"id",
"lengthInMinutes",
"lengthInMinutesOptions",
"title",
"slug",
"description",
@@ -8423,6 +8592,18 @@
"type": "number",
"example": 60
},
"lengthInMinutesOptions": {
"example": [
15,
30,
60
],
"description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.",
"type": "array",
"items": {
"type": "string"
}
},
"title": {
"type": "string",
"example": "Learn the secrets of masterchief!"
@@ -8643,7 +8824,10 @@
"hideCalendarEventDetails": {
"type": "boolean"
}
}
},
"required": [
"lengthInMinutesOptions"
]
},
"UpdateEventTypeOutput_2024_06_14": {
"type": "object",
@@ -9902,6 +10086,18 @@
"type": "number",
"example": 60
},
"lengthInMinutesOptions": {
"example": [
15,
30,
60
],
"description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.",
"type": "array",
"items": {
"type": "string"
}
},
"title": {
"type": "string",
"example": "Learn the secrets of masterchief!"
@@ -10138,6 +10334,7 @@
},
"required": [
"lengthInMinutes",
"lengthInMinutesOptions",
"title",
"slug",
"schedulingType",
@@ -10219,6 +10416,19 @@
"minimum": 1,
"example": 60
},
"lengthInMinutesOptions": {
"example": [
15,
30,
60
],
"description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.",
"type": "array",
"items": {
"type": "number",
"minimum": 1
}
},
"title": {
"type": "string",
"example": "Learn the secrets of masterchief!"
@@ -10644,6 +10854,18 @@
"type": "number",
"example": 60
},
"lengthInMinutesOptions": {
"example": [
15,
30,
60
],
"description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.",
"type": "array",
"items": {
"type": "string"
}
},
"title": {
"type": "string",
"example": "Learn the secrets of masterchief!"
@@ -10874,7 +11096,10 @@
"type": "boolean",
"description": "If true, all current and future team members will be assigned to this event type"
}
}
},
"required": [
"lengthInMinutesOptions"
]
},
"UpdateTeamEventTypeOutput": {
"type": "object",
@@ -12584,6 +12809,11 @@
"description": "The start time of the booking in ISO 8601 format in UTC timezone.",
"example": "2024-08-13T09:00:00Z"
},
"lengthInMinutes": {
"type": "number",
"example": 30,
"description": "If it is an event type that has multiple possible lengths that attendee can pick from, you can pass the desired booking length here.\n If not provided then event type default length will be used for the booking."
},
"eventTypeId": {
"type": "number",
"description": "The ID of the event type that is booked.",
@@ -12629,6 +12859,7 @@
},
"required": [
"start",
"lengthInMinutes",
"eventTypeId",
"attendee"
]
@@ -12641,6 +12872,11 @@
"description": "The start time of the booking in ISO 8601 format in UTC timezone.",
"example": "2024-08-13T09:00:00Z"
},
"lengthInMinutes": {
"type": "number",
"example": 30,
"description": "If it is an event type that has multiple possible lengths that attendee can pick from, you can pass the desired booking length here.\n If not provided then event type default length will be used for the booking."
},
"eventTypeId": {
"type": "number",
"description": "The ID of the event type that is booked.",
@@ -12691,6 +12927,7 @@
},
"required": [
"start",
"lengthInMinutes",
"eventTypeId",
"attendee",
"instant"
@@ -12704,6 +12941,11 @@
"description": "The start time of the booking in ISO 8601 format in UTC timezone.",
"example": "2024-08-13T09:00:00Z"
},
"lengthInMinutes": {
"type": "number",
"example": 30,
"description": "If it is an event type that has multiple possible lengths that attendee can pick from, you can pass the desired booking length here.\n If not provided then event type default length will be used for the booking."
},
"eventTypeId": {
"type": "number",
"description": "The ID of the event type that is booked.",
@@ -12754,6 +12996,7 @@
},
"required": [
"start",
"lengthInMinutes",
"eventTypeId",
"attendee"
]
@@ -13278,6 +13521,78 @@
"data"
]
},
"ReassignedToDto": {
"type": "object",
"properties": {
"id": {
"type": "number",
"example": 123
},
"name": {
"type": "string",
"example": "John Doe"
},
"email": {
"type": "string",
"example": "john.doe@example.com"
}
},
"required": [
"id",
"name",
"email"
]
},
"ReassignBookingOutput_2024_08_13": {
"type": "object",
"properties": {
"status": {
"type": "string",
"example": "success",
"enum": [
"success",
"error"
]
},
"data": {
"oneOf": [
{
"$ref": "#/components/schemas/ReassignBookingOutput_2024_08_13"
}
],
"description": "Booking data, which can be either a ReassignAutoBookingOutput object or a ReassignManualBookingOutput object",
"allOf": [
{
"$ref": "#/components/schemas/ReassignBookingOutput_2024_08_13"
}
]
}
},
"required": [
"status",
"data"
]
},
"ReassignToUserBookingInput_2024_08_13": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"example": "Host has to take another call",
"description": "Reason for reassigning the booking"
}
}
},
"DeclineBookingInput_2024_08_13": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"example": "Host has to take another call",
"description": "Reason for declining a booking that requires a confirmation"
}
}
},
"ReserveSlotInput": {
"type": "object",
"properties": {
@@ -23,6 +23,14 @@ export class PlatformBillingRepositoryFixture {
});
}
async get(orgId: number) {
return this.prismaWriteClient.platformBilling.findFirst({
where: {
id: orgId,
},
});
}
async deleteSubscriptionForTeam(teamId: number) {
// silently try to delete the subscription
try {
+2
View File
@@ -40,6 +40,8 @@ function PageWrapper(props: AppProps) {
pageStatus = "404";
} else if (router.pathname === "/500") {
pageStatus = "500";
} else if (router.pathname === "/403") {
pageStatus = "403";
}
// On client side don't let nonce creep into DOM
@@ -31,6 +31,8 @@ function PageWrapper(props: PageWrapperProps) {
pageStatus = "404";
} else if (pathname === "/500") {
pageStatus = "500";
} else if (pathname === "/403") {
pageStatus = "403";
}
// On client side don't let nonce creep into DOM
@@ -132,6 +132,7 @@ function BookingListItem(booking: BookingItemProps) {
});
const isUpcoming = new Date(booking.endTime) >= new Date();
const isOngoing = isUpcoming && new Date() >= new Date(booking.startTime);
const isBookingInPast = new Date(booking.endTime) < new Date();
const isCancelled = booking.status === BookingStatus.CANCELLED;
const isConfirmed = booking.status === BookingStatus.ACCEPTED;
@@ -269,7 +270,7 @@ function BookingListItem(booking: BookingItemProps) {
});
}
if (isBookingInPast) {
if (isBookingInPast || isOngoing) {
editBookingActions.push({
id: "no_show",
label: t("mark_as_no_show"),
+2 -2
View File
@@ -775,9 +775,9 @@ const RerouteDialogContentAndFooterWithFormResponse = ({
>([]);
const findTeamMembersMatchingAttributeLogicMutation =
trpc.viewer.appRoutingForms.findTeamMembersMatchingAttributeLogic.useMutation({
trpc.viewer.routingForms.findTeamMembersMatchingAttributeLogic.useMutation({
onSuccess(data) {
setTeamMembersMatchingAttributeLogic(data.result);
setTeamMembersMatchingAttributeLogic(data.result ? data.result.users : data.result);
},
});
@@ -164,28 +164,6 @@ vi.mock("@calcom/trpc/react", () => ({
isPending: false,
})),
},
findTeamMembersMatchingAttributeLogic: {
useMutation: vi.fn(({ onSuccess }) => {
return {
mutate: vi.fn(() => {
onSuccess({
result: [
{
id: 1,
name: "Matching User 1",
email: "matching-user-1@example.com",
},
{
id: 2,
name: "Matching User 2",
email: "matching-user-2@example.com",
},
],
});
}),
};
}),
},
},
eventTypes: {
get: {
@@ -204,11 +182,37 @@ vi.mock("@calcom/trpc/react", () => ({
})),
},
},
routingForms: {
findTeamMembersMatchingAttributeLogic: {
useMutation: vi.fn(({ onSuccess }) => {
return {
mutate: vi.fn(() => {
onSuccess({
result: {
users: [
{
id: 1,
name: "Matching User 1",
email: "matching-user-1@example.com",
},
{
id: 2,
name: "Matching User 2",
email: "matching-user-2@example.com",
},
],
},
});
}),
};
}),
},
},
},
},
}));
const mockMutateFn = vi.fn(({ __testOnSuccess }) => {
const mockReactQueryMutateFn = vi.fn(({ __testOnSuccess }) => {
__testOnSuccess({
uid: "RESCHEDULED_BOOKING_UID_SAME_TIMESLOT",
});
@@ -218,7 +222,7 @@ vi.mock("@tanstack/react-query", () => ({
useMutation: vi.fn(({ onSuccess }) => {
return {
mutate: vi.fn((payload) => {
mockMutateFn({
mockReactQueryMutateFn({
...payload,
__testOnSuccess: onSuccess,
});
@@ -441,7 +445,7 @@ describe("RerouteDialog", () => {
);
clickVerifyNewRouteButton();
clickRescheduleWithSameTimeslotOfChosenEventButton();
expect(mockMutateFn).toHaveBeenCalledWith(
expect(mockReactQueryMutateFn).toHaveBeenCalledWith(
expect.objectContaining({
rescheduleUid: mockBooking.uid,
// Shouldn't include the user who booked the booking
@@ -1,82 +0,0 @@
import type { TFunction } from "next-i18next";
import { Trans } from "next-i18next";
import { useState } from "react";
import {
SettingsToggle,
Dialog,
DialogContent,
DialogFooter,
InputField,
DialogClose,
Button,
} from "@calcom/ui";
interface DisableEmailsSettingProps {
checked: boolean;
onCheckedChange: (e: boolean) => void;
recipient: "attendees" | "hosts";
t: TFunction;
}
export const DisableAllEmailsSetting = ({
checked,
onCheckedChange,
recipient,
t,
}: DisableEmailsSettingProps) => {
const [dialogOpen, setDialogOpen] = useState(false);
const [confirmText, setConfirmText] = useState("");
const title =
recipient === "attendees" ? t("disable_all_emails_to_attendees") : t("disable_all_emails_to_hosts");
return (
<div>
<Dialog open={dialogOpen} onOpenChange={(e) => setDialogOpen(e)}>
<DialogContent title={title} Icon="circle-alert">
<p className="text-default text-sm">
<Trans i18nKey="disable_attendees_emails_description">
This will disable all emails to {{ recipient }}. This includes booking confirmations, requests,
reschedules and reschedule requests, cancellation emails, and any other emails related to
booking updates.
<br />
<br />
It is your responsibility to ensure that your {{ recipient }} are aware of any bookings and
changes to their bookings.
</Trans>
</p>
<p className="text-default mb-1 mt-2 text-sm">{t("type_confirm_to_continue")}</p>
<InputField
value={confirmText}
onChange={(e) => {
setConfirmText(e.target.value);
}}
/>
<DialogFooter>
<DialogClose />
<Button
disabled={confirmText !== "confirm"}
onClick={(e) => {
onCheckedChange(true);
setDialogOpen(false);
}}>
{t("disable_email")}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
<SettingsToggle
labelClassName="text-sm"
toggleSwitchAtTheEnd={true}
switchContainerClassName="border-subtle rounded-lg border py-6 px-4 sm:px-6"
title={title}
description={t("disable_all_emails_description")}
checked={!!checked}
onCheckedChange={() => {
checked ? onCheckedChange(!checked) : setDialogOpen(true);
}}
/>
</div>
);
};
@@ -8,12 +8,12 @@ type IndividualPlatformPlan = {
// if pricing or plans change in future modify this
export const platformPlans: IndividualPlatformPlan[] = [
{
plan: "Starter",
plan: "Free",
description:
"Perfect for just getting started with community support and access to hosted platform APIs, Cal.com Atoms (React components) and more.",
pricing: 99,
"The best plan to dip your toes into scheduling infrastructure. Start immediately with 25 free meetings per month",
pricing: 0,
includes: [
"Up to 100 bookings a month",
"Up to 25 bookings a month",
"$0.99 overage beyond",
"Community Support",
"Cal Atoms (React Library)",
@@ -37,7 +37,7 @@ export const PlatformBillingCard = ({
</h1>
<p className="pb-5 pt-3 text-base">{description}</p>
<h1 className="text-3xl font-semibold">
{pricing && (
{pricing !== undefined && (
<>
US${pricing} <span className="text-sm">per month</span>
</>
@@ -50,7 +50,7 @@ export const PlatformBillingCard = ({
loading={isLoading}
onClick={handleSubscribe}
className="flex w-[100%] items-center justify-center">
{pricing ? "Subscribe" : "Schedule a time"}
{pricing !== undefined ? "Subscribe" : "Schedule a time"}
</Button>
</div>
)}
@@ -0,0 +1,410 @@
import prismock from "../../../../tests/libs/__mocks__/prisma";
import { v4 } from "uuid";
import { describe, expect, it, vi, beforeEach } from "vitest";
import { getCRMContactOwnerForRRLeadSkip } from "@calcom/app-store/_utils/CRMRoundRobinSkip";
import bookingFormHandlers from "@calcom/app-store/routing-forms/appBookingFormHandler";
import { ROUTING_FORM_RESPONSE_ID_QUERY_STRING } from "@calcom/app-store/routing-forms/lib/constants";
import { RouteActionType } from "@calcom/app-store/routing-forms/zod";
import { SchedulingType } from "@calcom/prisma/enums";
import { getTeamMemberEmailForResponseOrContactUsingUrlQuery } from "../getTeamMemberEmailFromCrm";
vi.mock("@calcom/app-store/routing-forms/appBookingFormHandler", () => ({
default: {
salesforce: vi.fn(),
},
}));
vi.mock("@calcom/app-store/_utils/CRMRoundRobinSkip", () => ({
getCRMContactOwnerForRRLeadSkip: vi.fn(),
}));
function mockGetCRMContactOwnerForRRLeadSkip({
bookerEmail,
teamMemberEmail,
}: {
bookerEmail: string;
teamMemberEmail: string;
}) {
vi.mocked(getCRMContactOwnerForRRLeadSkip).mockImplementation((_bookerEmail, _eventMetadata) => {
if (_bookerEmail === bookerEmail) {
return Promise.resolve(teamMemberEmail);
}
return Promise.resolve(undefined);
});
}
function mockBookingFormHandler({
bookerEmail,
teamMemberEmail,
}: {
bookerEmail: string;
teamMemberEmail: string;
}) {
vi.mocked(bookingFormHandlers.salesforce).mockImplementation(
(_bookerEmail, _attributeRoutingConfig, _eventTypeId) => {
if (_bookerEmail === bookerEmail) {
return Promise.resolve({ email: teamMemberEmail });
}
return Promise.resolve({ email: null });
}
);
}
async function createRoutingFormWithResponse({
formData,
}: {
formData: {
routes: {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
queryValue?: any;
action: {
eventTypeId: number;
type: RouteActionType;
value: string;
};
attributeRoutingConfig: {
skipContactOwner: boolean;
};
}[];
};
}) {
const user = await prismock.user.create({
data: {
name: "Routing Form User",
username: "routing-form-user",
email: "routing-form-user@example.com",
},
});
const form = await prismock.app_RoutingForms_Form.create({
data: {
...formData,
name: "Test Form",
routes: formData.routes.map((route) => ({
queryValue: {
id: v4(),
type: "group",
children1: [],
properties: {},
},
id: v4(),
...route,
})),
user: {
connect: {
id: user.id,
},
},
},
});
const responseRecord = await prismock.app_RoutingForms_FormResponse.create({
data: {
response: {},
form: {
connect: {
id: form.id,
},
},
},
});
return { form, responseRecord };
}
async function createHostForEvent({
eventTypeData,
userData,
}: {
eventTypeData: { id: number } & Partial<{
title: string;
slug: string;
length: number;
}>;
userData: {
email: string;
} & Partial<{
name: string;
username: string;
}>;
}) {
const user = await prismock.user.create({
data: {
name: "Test User",
username: "testuser",
...userData,
},
});
await prismock.eventType.create({
data: {
title: "Title",
slug: "slug",
length: 30,
...eventTypeData,
hosts: {
create: {
userId: user.id,
isFixed: true,
},
},
},
});
}
describe("getTeamMemberEmailForResponseOrContactUsingUrlQuery", () => {
beforeEach(() => {
vi.resetAllMocks();
});
const mockEventData = {
id: 1,
isInstantEvent: false,
schedulingType: SchedulingType.ROUND_ROBIN,
metadata: null,
length: 30,
};
it("should return null when email is not provided in query", async () => {
const result = await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query: {},
eventData: mockEventData,
});
expect(result).toBeNull();
});
it("should return null when scheduling type is not ROUND_ROBIN", async () => {
const bookerEmail = "booker@example.com";
const teamMemberEmail = "teamMember@example.com";
mockGetCRMContactOwnerForRRLeadSkip({ bookerEmail, teamMemberEmail });
await createHostForEvent({
eventTypeData: {
id: mockEventData.id,
},
userData: {
email: teamMemberEmail,
},
});
const result = await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query: { email: bookerEmail },
eventData: { ...mockEventData, schedulingType: SchedulingType.COLLECTIVE },
});
expect(result).toBeNull();
});
it("should return CRM owner email when valid", async () => {
const ownerEmail = "owner@example.com";
const bookerEmail = "booker@example.com";
mockGetCRMContactOwnerForRRLeadSkip({ bookerEmail, teamMemberEmail: ownerEmail });
await createHostForEvent({
eventTypeData: {
id: mockEventData.id,
},
userData: {
email: ownerEmail,
},
});
const result = await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query: { email: "booker@example.com" },
eventData: mockEventData,
});
expect(result).toBe(ownerEmail);
});
it("should return null when CRM owner is not found", async () => {
const bookerEmail = "booker@example.com";
const teamMemberEmail = "teamMember@example.com";
mockGetCRMContactOwnerForRRLeadSkip({ bookerEmail, teamMemberEmail });
const result = await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query: { email: bookerEmail },
eventData: mockEventData,
});
expect(result).toBeNull();
});
it("should return null when CRM owner is not part of event type", async () => {
const ownerEmail = "owner@example.com";
const bookerEmail = "booker@example.com";
mockGetCRMContactOwnerForRRLeadSkip({ bookerEmail, teamMemberEmail: ownerEmail });
const result = await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query: { email: bookerEmail },
eventData: mockEventData,
});
expect(result).toBeNull();
});
describe("Booking form handler", () => {
it("should return teamMember email through booking form handler when cal.routingFormResponseId and cal.salesforce.xxxx=true is provided", async () => {
const bookerEmail = "booker@example.com";
const teamMemberEmail = "owner@example.com";
mockBookingFormHandler({ bookerEmail, teamMemberEmail });
await createHostForEvent({
eventTypeData: {
id: mockEventData.id,
},
userData: {
email: teamMemberEmail,
},
});
const { responseRecord } = await createRoutingFormWithResponse({
formData: {
routes: [
{
action: {
eventTypeId: 1,
type: RouteActionType.EventTypeRedirectUrl,
value: "/team/sales",
},
attributeRoutingConfig: { skipContactOwner: false },
},
],
},
});
const result = await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query: {
email: bookerEmail,
[ROUTING_FORM_RESPONSE_ID_QUERY_STRING]: responseRecord.id.toString(),
"cal.salesforce.xxx": "true",
},
eventData: mockEventData,
});
expect(result).toBe(teamMemberEmail);
});
it("should return null when skipContactOwner is true even when cal.routingFormResponseId and cal.salesforce.xxxx=true is provided", async () => {
const bookerEmail = "booker@example.com";
const teamMemberEmail = "owner@example.com";
mockBookingFormHandler({ bookerEmail, teamMemberEmail });
await createHostForEvent({
eventTypeData: {
id: mockEventData.id,
},
userData: {
email: teamMemberEmail,
},
});
const { responseRecord } = await createRoutingFormWithResponse({
formData: {
routes: [
{
action: {
eventTypeId: 1,
type: RouteActionType.EventTypeRedirectUrl,
value: "/team/sales",
},
attributeRoutingConfig: { skipContactOwner: true },
},
],
},
});
const result = await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query: {
email: bookerEmail,
[ROUTING_FORM_RESPONSE_ID_QUERY_STRING]: responseRecord.id.toString(),
"cal.salesforce.xxx": "true",
},
eventData: mockEventData,
});
// Because skipContactOwner is true, the booking form handler should return null
expect(result).toBe(null);
});
it("should return null when when cal.routingFormResponseId and cal.salesforce.xxxx=true is provided but the returned email isn't an event member", async () => {
const bookerEmail = "booker@example.com";
const teamMemberEmail = "owner@example.com";
mockBookingFormHandler({ bookerEmail, teamMemberEmail });
const SOME_OTHER_EVENT_ID = 200;
await createHostForEvent({
eventTypeData: {
id: SOME_OTHER_EVENT_ID,
},
userData: {
email: teamMemberEmail,
},
});
const { responseRecord } = await createRoutingFormWithResponse({
formData: {
routes: [
{
action: {
eventTypeId: 1,
type: RouteActionType.EventTypeRedirectUrl,
value: "/team/sales",
},
attributeRoutingConfig: { skipContactOwner: false },
},
],
},
});
const result = await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query: {
email: bookerEmail,
[ROUTING_FORM_RESPONSE_ID_QUERY_STRING]: responseRecord.id.toString(),
"cal.salesforce.xxx": "true",
},
eventData: mockEventData,
});
expect(result).toBe(null);
});
it("should return null when cal.routingFormResponseId is provided but cal.salesforce.xxxx is not", async () => {
const bookerEmail = "booker@example.com";
const teamMemberEmail = "owner@example.com";
mockBookingFormHandler({ bookerEmail, teamMemberEmail });
await createHostForEvent({
eventTypeData: {
id: mockEventData.id,
},
userData: {
email: teamMemberEmail,
},
});
const { responseRecord } = await createRoutingFormWithResponse({
formData: {
routes: [
{
action: {
eventTypeId: 1,
type: RouteActionType.EventTypeRedirectUrl,
value: "/team/sales",
},
attributeRoutingConfig: { skipContactOwner: false },
},
],
},
});
const result = await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query: {
email: bookerEmail,
[ROUTING_FORM_RESPONSE_ID_QUERY_STRING]: responseRecord.id.toString(),
"cal.somethingelse.xxx": "true",
},
eventData: mockEventData,
});
expect(result).toBe(null);
});
});
});
+241
View File
@@ -0,0 +1,241 @@
import type { ParsedUrlQuery } from "querystring";
import { getCRMContactOwnerForRRLeadSkip } from "@calcom/app-store/_utils/CRMRoundRobinSkip";
import { ROUTING_FORM_RESPONSE_ID_QUERY_STRING } from "@calcom/app-store/routing-forms/lib/constants";
import { enabledAppSlugs } from "@calcom/app-store/routing-forms/lib/enabledApps";
import type { AttributeRoutingConfig, LocalRoute } from "@calcom/app-store/routing-forms/types/types";
import { zodRoutes as routesSchema } from "@calcom/app-store/routing-forms/zod";
import logger from "@calcom/lib/logger";
import { safeStringify } from "@calcom/lib/safeStringify";
import prisma from "@calcom/prisma";
import type { Prisma } from "@calcom/prisma/client";
import { SchedulingType } from "@calcom/prisma/enums";
const log = logger.getSubLogger({ prefix: ["getTeamMemberEmailFromCrm"] });
interface EventData {
id: number;
isInstantEvent: boolean;
schedulingType: SchedulingType | null;
metadata: Prisma.JsonValue | null;
length: number;
}
async function findUserByEmailWhoIsAHostOfEventType({
email,
eventTypeId,
}: {
email: string;
eventTypeId: number;
}) {
return prisma.user.findFirst({
where: {
email,
hosts: { some: { eventTypeId } },
},
});
}
function getRoutingFormResponseIdFromQuery(query: ParsedUrlQuery) {
const routingFormResponseIdAsNumber = Number(query[ROUTING_FORM_RESPONSE_ID_QUERY_STRING]);
const routingFormResponseId = isNaN(routingFormResponseIdAsNumber) ? null : routingFormResponseIdAsNumber;
return routingFormResponseId;
}
async function getAttributeRoutingConfig(
data:
| {
routingFormResponseId: number;
eventTypeId: number;
}
| {
route: Pick<LocalRoute, "attributeRoutingConfig">;
}
) {
if ("route" in data) {
return data.route.attributeRoutingConfig ?? null;
}
const { routingFormResponseId, eventTypeId } = data;
const routingFormQuery = await prisma.app_RoutingForms_Form.findFirst({
where: {
responses: {
some: {
id: routingFormResponseId,
},
},
},
select: {
routes: true,
},
});
if (!routingFormQuery || !routingFormQuery?.routes) return null;
const parsedRoutes = routesSchema.safeParse(routingFormQuery.routes);
if (!parsedRoutes.success || !parsedRoutes.data) return null;
// Find the route with the attributeRoutingConfig
// FIXME: There could be multiple routes with same action.eventTypeId, we should actually ensure we have the chosenRouteId in here and use that route.
const route = parsedRoutes.data.find((route) => {
if ("action" in route) {
return route.action.eventTypeId === eventTypeId;
}
});
if (!route || !("attributeRoutingConfig" in route)) return null;
// Get attributeRoutingConfig for the form
const attributeRoutingConfig = route.attributeRoutingConfig;
if (!attributeRoutingConfig) return null;
return attributeRoutingConfig;
}
function getEnabledRoutingFormAppSlugFromQuery(query: ParsedUrlQuery) {
// Determine if a routing form enabled app is in the query. Then pass it to the proper handler
// Routing form apps will have the format cal.appSlug
let enabledRoutingFormApp;
for (const key of Object.keys(query)) {
const keySplit = key.split(".");
const appSlug = keySplit[1];
if (enabledAppSlugs.includes(appSlug)) {
enabledRoutingFormApp = appSlug;
break;
}
}
return enabledRoutingFormApp;
}
/**
* Uses the owner of the contact directly from CRM
*/
async function getOwnerEmailFromCrm(eventData: EventData, email: string): Promise<string | null> {
const crmContactOwnerEmail = await getCRMContactOwnerForRRLeadSkip(email, eventData.metadata);
if (!crmContactOwnerEmail) return null;
// Determine if the contactOwner is a part of the event type
const contactOwnerQuery = await findUserByEmailWhoIsAHostOfEventType({
email: crmContactOwnerEmail,
eventTypeId: eventData.id,
});
if (!contactOwnerQuery) return null;
return crmContactOwnerEmail;
}
/**
* Handles custom lookup field logic
*/
async function getTeamMemberEmailUsingRoutingFormHandler({
bookerEmail,
eventTypeId,
attributeRoutingConfig,
crmAppSlug,
}: {
bookerEmail: string;
eventTypeId: number;
attributeRoutingConfig: AttributeRoutingConfig | null;
crmAppSlug: string;
}) {
const nullReturnValue = { email: null, skipContactOwner: false };
if (!attributeRoutingConfig) return nullReturnValue;
// If the skipContactOwner is enabled then don't return an team member email
if (attributeRoutingConfig.skipContactOwner) return { ...nullReturnValue, skipContactOwner: true };
const appBookingFormHandler = (await import("@calcom/app-store/routing-forms/appBookingFormHandler"))
.default;
const appHandler = appBookingFormHandler[crmAppSlug];
if (!appHandler) return nullReturnValue;
const { email: userEmail } = await appHandler(bookerEmail, attributeRoutingConfig, eventTypeId);
if (!userEmail) return nullReturnValue;
// Determine if the user is a part of the event type
const userQuery = await findUserByEmailWhoIsAHostOfEventType({ email: userEmail, eventTypeId });
if (!userQuery) return nullReturnValue;
return { ...nullReturnValue, email: userEmail };
}
async function getTeamMemberEmailForResponseOrContact({
bookerEmail,
eventData,
routingFormResponseId,
chosenRoute,
crmAppSlug,
}: {
bookerEmail: string;
eventData: EventData;
routingFormResponseId?: number | null;
/**
* If provided, we won't go look for the route from DB.
*/
chosenRoute?: LocalRoute;
crmAppSlug?: string;
}) {
const eventTypeId = eventData.id;
if (eventData.schedulingType !== SchedulingType.ROUND_ROBIN) return null;
const attributeRoutingConfigGetterData = routingFormResponseId
? { routingFormResponseId, eventTypeId }
: chosenRoute
? { route: chosenRoute }
: null;
// If we have found crmAppSlug, it means that the CRM App in the routing-form will handle the logic
if (attributeRoutingConfigGetterData && crmAppSlug) {
log.debug(
"Using CRM App handler in routing-forms",
safeStringify({ attributeRoutingConfigGetterData, crmAppSlug })
);
const attributeRoutingConfig = await getAttributeRoutingConfig(attributeRoutingConfigGetterData);
const { email, skipContactOwner } = await getTeamMemberEmailUsingRoutingFormHandler({
bookerEmail,
eventTypeId,
attributeRoutingConfig,
crmAppSlug,
});
if (skipContactOwner) return null;
if (email) return email;
} else {
log.debug("Getting the contact owner email from CRM");
return await getOwnerEmailFromCrm(eventData, bookerEmail);
}
return null;
}
export async function getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query,
eventData,
chosenRoute,
}: {
query: ParsedUrlQuery;
eventData: EventData;
chosenRoute?: LocalRoute;
}) {
// Without email no lookup is possible
if (!query.email || typeof query.email !== "string") {
return null;
}
log.debug("getTeamMemberEmailForResponseOrContactUsingUrlQuery", safeStringify({ query }));
const crmAppSlug = getEnabledRoutingFormAppSlugFromQuery(query);
const routingFormResponseId = getRoutingFormResponseIdFromQuery(query);
return await getTeamMemberEmailForResponseOrContact({
bookerEmail: query.email,
eventData,
routingFormResponseId,
chosenRoute,
crmAppSlug,
});
}
+5 -4
View File
@@ -21,12 +21,13 @@ type HelpCardInfo = {
// if pricing or plans change in future modify this
export const platformPlans: IndividualPlatformPlan[] = [
{
plan: "Starter",
plan: "Free",
description:
"Perfect for just getting started with community support and access to hosted platform APIs, Cal.com Atoms (React components) and more.",
pricing: 99,
"The best plan to dip your toes into scheduling infrastructure. Start immediately with 25 free meetings per month",
pricing: 0,
includes: [
"Up to 100 bookings a month",
"Up to 25 bookings a month",
"$0.99 overage beyond",
"Community Support",
"Cal Atoms (React Library)",
"Platform APIs",
@@ -1,8 +1,6 @@
import type { Prisma } from "@prisma/client";
import type { GetServerSidePropsContext } from "next";
import { z } from "zod";
import { getCRMContactOwnerForRRLeadSkip } from "@calcom/app-store/_utils/CRMRoundRobinSkip";
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking";
import { getBookingForReschedule } from "@calcom/features/bookings/lib/get-booking";
@@ -10,7 +8,6 @@ import { getSlugOrRequestedSlug, orgDomainConfig } from "@calcom/features/ee/org
import slugify from "@calcom/lib/slugify";
import prisma from "@calcom/prisma";
import { RedirectType } from "@calcom/prisma/client";
import { SchedulingType } from "@calcom/prisma/enums";
import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";
import { getTemporaryOrgRedirect } from "@lib/getTemporaryOrgRedirect";
@@ -79,6 +76,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
}
const eventData = team.eventTypes[0];
const eventTypeId = eventData.id;
let booking: GetBookingType | null = null;
if (rescheduleUid) {
@@ -88,11 +86,13 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
const ssr = await ssrInit(context);
const fromRedirectOfNonOrgLink = context.query.orgRedirection === "true";
const isUnpublished = team.parent ? !team.parent.slug : !team.slug;
const { getTeamMemberEmailForResponseOrContactUsingUrlQuery } = await import(
"@calcom/web/lib/getTeamMemberEmailFromCrm"
);
return {
props: {
eventData: {
eventTypeId: eventData.id,
eventTypeId,
entity: {
fromRedirectOfNonOrgLink,
considerUnpublished: isUnpublished && !fromRedirectOfNonOrgLink,
@@ -112,36 +112,10 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
isInstantMeeting: eventData && queryIsInstantMeeting ? true : false,
themeBasis: null,
orgBannerUrl: team.parent?.bannerUrl ?? "",
teamMemberEmail: await getTeamMemberEmail(eventData, email as string),
teamMemberEmail: await getTeamMemberEmailForResponseOrContactUsingUrlQuery({
query,
eventData,
}),
},
};
};
async function getTeamMemberEmail(
eventData: {
id: number;
isInstantEvent: boolean;
schedulingType: SchedulingType | null;
metadata: Prisma.JsonValue | null;
length: number;
},
email?: string
): Promise<string | null> {
// Pre-requisites
if (!eventData || !email || eventData.schedulingType !== SchedulingType.ROUND_ROBIN) return null;
const crmContactOwnerEmail = await getCRMContactOwnerForRRLeadSkip(email, eventData.metadata);
if (!crmContactOwnerEmail) return null;
// Determine if the contactOwner is a part of the event type
const contactOwnerQuery = await prisma.user.findFirst({
where: {
email: crmContactOwnerEmail,
hosts: {
some: {
eventTypeId: eventData.id,
},
},
},
});
if (!contactOwnerQuery) return null;
return crmContactOwnerEmail;
}
@@ -9,6 +9,7 @@ import {
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
import { getCalVideoReference } from "@calcom/features/get-cal-video-reference";
import { BookingRepository } from "@calcom/lib/server/repository/booking";
import { OrganizationRepository } from "@calcom/lib/server/repository/organization";
import { UserRepository } from "@calcom/lib/server/repository/user";
import prisma from "@calcom/prisma";
@@ -55,6 +56,10 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
).profile
: null;
const calVideoLogo = profile?.organization
? await OrganizationRepository.findCalVideoLogoByOrgId({ id: profile.organization.id })
: null;
//daily.co calls have a 14 days exit buffer when a user enters a call when it's not available it will trigger the modals
const now = new Date();
const exitDate = new Date(now.getTime() - 14 * 24 * 60 * 60 * 1000);
@@ -134,6 +139,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
: bookingObj.user,
},
hasTeamPlan: !!hasTeamPlan,
calVideoLogo,
trpcState: ssr.dehydrate(),
},
};
@@ -315,8 +315,23 @@ export default function Success(props: PageProps) {
return t(`needs_to_be_confirmed_or_rejected${titleSuffix}`);
}
if (bookingInfo.user) {
return t(`${titlePrefix}emailed_you_and_attendees${titleSuffix}`, {
user: bookingInfo.user.name || bookingInfo.user.email,
const isHost = bookingInfo.user.id === session?.user?.id;
const isAttendee = bookingInfo.attendees.find((attendee) => attendee.email === session?.user?.email);
const attendee = bookingInfo.attendees[0]?.name || bookingInfo.attendees[0]?.email || "Nameless";
const host = bookingInfo.user.name || bookingInfo.user.email;
if (isHost) {
return t(`${titlePrefix}emailed_you_and_attendees${titleSuffix}`, {
user: attendee,
});
}
if (isAttendee) {
return t(`${titlePrefix}emailed_you_and_attendees${titleSuffix}`, {
user: host,
});
}
return t(`${titlePrefix}emailed_host_and_attendee${titleSuffix}`, {
host,
attendee,
});
}
return t(`emailed_you_and_attendees${titleSuffix}`);
@@ -18,8 +18,9 @@ import { InfiniteSkeletonLoader } from "@calcom/features/eventtypes/components/S
import { getTeamsFiltersFromQuery } from "@calcom/features/filters/lib/getTeamsFiltersFromQuery";
import Shell from "@calcom/features/shell/Shell";
import { parseEventTypeColor } from "@calcom/lib";
import { APP_NAME } from "@calcom/lib/constants";
import { APP_NAME, WEBSITE_URL } from "@calcom/lib/constants";
import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams";
import { useCopy } from "@calcom/lib/hooks/useCopy";
import { useDebounce } from "@calcom/lib/hooks/useDebounce";
import { useInViewObserver } from "@calcom/lib/hooks/useInViewObserver";
import { useLocale } from "@calcom/lib/hooks/useLocale";
@@ -80,7 +81,7 @@ interface InfiniteEventTypeListProps {
group: InfiniteEventTypeGroup;
readOnly: boolean;
bookerUrl: string | null;
pages: { nextCursor: number | undefined; eventTypes: InfiniteEventType[] }[] | undefined;
pages: { nextCursor: number | null | undefined; eventTypes: InfiniteEventType[] }[] | undefined;
lockedByOrg?: boolean;
isPending?: boolean;
debouncedSearchTerm?: string;
@@ -257,6 +258,7 @@ export const InfiniteEventTypeList = ({
const router = useRouter();
const pathname = usePathname();
const searchParams = useCompatSearchParams();
const { copyToClipboard } = useCopy();
const [parent] = useAutoAnimate<HTMLUListElement>();
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [deleteDialogTypeId, setDeleteDialogTypeId] = useState(0);
@@ -347,9 +349,14 @@ export const InfiniteEventTypeList = ({
group: { teamId: group?.teamId, parentId: group?.parentId },
},
(data) => {
if (!data) return { pages: [], pageParams: [] };
return {
pageParams: data?.pageParams ?? [],
pages: newOrder,
...data,
pages: newOrder.map((page) => ({
...page,
nextCursor: page.nextCursor ?? undefined,
})),
};
}
);
@@ -566,7 +573,7 @@ export const InfiniteEventTypeList = ({
StartIcon="link"
onClick={() => {
showToast(t("link_copied"), "success");
navigator.clipboard.writeText(calLink);
copyToClipboard(calLink);
}}
/>
</Tooltip>
@@ -579,7 +586,7 @@ export const InfiniteEventTypeList = ({
StartIcon="venetian-mask"
onClick={() => {
showToast(t("private_link_copied"), "success");
navigator.clipboard.writeText(placeholderHashedLink);
copyToClipboard(placeholderHashedLink);
setPrivateLinkCopyIndices((prev) => {
const prevIndex = prev[type.slug] ?? 0;
prev[type.slug] = (prevIndex + 1) % type.hashedLink.length;
@@ -893,6 +900,7 @@ const InfiniteScrollMain = ({
}) => {
const searchParams = useCompatSearchParams();
const { data } = useTypedQuery(querySchema);
const orgBranding = useOrgBranding();
if (status === "error") {
return <Alert severity="error" title="Something went wrong" message={errorMessage} />;
@@ -911,6 +919,18 @@ const InfiniteScrollMain = ({
const activeEventTypeGroup =
eventTypeGroups.filter((item) => item.teamId === data.teamId) ?? eventTypeGroups[0];
const bookerUrl = orgBranding ? orgBranding?.fullDomain : WEBSITE_URL;
// If the event type group is the same as the org branding team, or the parent team, set the bookerUrl to the org branding URL
// This is to ensure that the bookerUrl is always the same as the one in the org branding settings
// This keeps the app working for personal event types that were not migrated to the org (rare)
if (
activeEventTypeGroup[0].teamId === orgBranding?.id ||
activeEventTypeGroup[0].parentId === orgBranding?.id
) {
activeEventTypeGroup[0].bookerUrl = bookerUrl;
}
return (
<>
{eventTypeGroups.length >= 1 && (
@@ -0,0 +1,42 @@
"use client";
import {
RoutingFormResponsesTable,
RoutingKPICards,
FailedBookingsByField,
} from "@calcom/features/insights/components";
import { FiltersProvider } from "@calcom/features/insights/context/FiltersProvider";
import { Filters } from "@calcom/features/insights/filters";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import InsightsLayout from "./layout";
export default function InsightsPage() {
const { t } = useLocale();
return (
<InsightsLayout>
<FiltersProvider>
<Filters showRoutingFilters />
<div className="mb-4 space-y-4">
<RoutingKPICards />
<RoutingFormResponsesTable />
<FailedBookingsByField />
<small className="text-default block text-center">
{t("looking_for_more_insights")}{" "}
<a
className="text-blue-500 hover:underline"
href="mailto:updates@cal.com?subject=Feature%20Request%3A%20More%20Analytics&body=Hey%20Cal.com%20Team%2C%20I%20love%20the%20analytics%20page%20but%20I%20am%20looking%20for%20...">
{" "}
{t("contact_support")}
</a>
</small>
</div>
</FiltersProvider>
</InsightsLayout>
);
}
+34 -87
View File
@@ -14,107 +14,54 @@ import {
} from "@calcom/features/insights/components";
import { FiltersProvider } from "@calcom/features/insights/context/FiltersProvider";
import { Filters } from "@calcom/features/insights/filters";
import Shell from "@calcom/features/shell/Shell";
import { UpgradeTip } from "@calcom/features/tips";
import { WEBAPP_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc";
import { Button, ButtonGroup } from "@calcom/ui";
import { Icon } from "@calcom/ui";
import type { getServerSideProps } from "@lib/insights/getServerSideProps";
import type { inferSSRProps } from "@lib/types/inferSSRProps";
import InsightsLayout from "./layout";
export type PageProps = inferSSRProps<typeof getServerSideProps>;
export default function InsightsPage() {
const { t } = useLocale();
const { data: user } = trpc.viewer.me.useQuery();
const features = [
{
icon: <Icon name="users" className="h-5 w-5" />,
title: t("view_bookings_across"),
description: t("view_bookings_across_description"),
},
{
icon: <Icon name="refresh-ccw" className="h-5 w-5" />,
title: t("identify_booking_trends"),
description: t("identify_booking_trends_description"),
},
{
icon: <Icon name="user-plus" className="h-5 w-5" />,
title: t("spot_popular_event_types"),
description: t("spot_popular_event_types_description"),
},
];
return (
<div>
<Shell
withoutMain={false}
heading={t("insights")}
subtitle={t("insights_subtitle")}
title={t("insights")}
description={t("insights_subtitle")}>
<UpgradeTip
plan="team"
title={t("make_informed_decisions")}
description={t("make_informed_decisions_description")}
features={features}
background="/tips/insights"
buttons={
<div className="space-y-2 rtl:space-x-reverse sm:space-x-2">
<ButtonGroup>
<Button color="primary" href={`${WEBAPP_URL}/settings/teams/new`}>
{t("create_team")}
</Button>
<Button color="minimal" href="https://go.cal.com/insights" target="_blank">
{t("learn_more")}
</Button>
</ButtonGroup>
</div>
}>
{!user ? (
<></>
) : (
<FiltersProvider>
<Filters />
<InsightsLayout>
<FiltersProvider>
<Filters />
<div className="mb-4 space-y-4">
<BookingKPICards />
<div className="mb-4 space-y-4">
<BookingKPICards />
<BookingStatusLineChart />
<BookingStatusLineChart />
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
<PopularEventsTable />
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
<PopularEventsTable />
<AverageEventDurationChart />
</div>
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
<MostBookedTeamMembersTable />
<LeastBookedTeamMembersTable />
</div>
<RecentFeedbackTable />
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
<HighestNoShowHostTable />
<HighestRatedMembersTable />
<LowestRatedMembersTable />
</div>
<small className="text-default block text-center">
{t("looking_for_more_insights")}{" "}
<a
className="text-blue-500 hover:underline"
href="mailto:updates@cal.com?subject=Feature%20Request%3A%20More%20Analytics&body=Hey%20Cal.com%20Team%2C%20I%20love%20the%20analytics%20page%20but%20I%20am%20looking%20for%20...">
{" "}
{t("contact_support")}
</a>
</small>
</div>
</FiltersProvider>
)}
</UpgradeTip>
</Shell>
</div>
<AverageEventDurationChart />
</div>
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
<MostBookedTeamMembersTable />
<LeastBookedTeamMembersTable />
</div>
<RecentFeedbackTable />
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
<HighestNoShowHostTable />
<HighestRatedMembersTable />
<LowestRatedMembersTable />
</div>
<small className="text-default block text-center">
{t("looking_for_more_insights")}{" "}
<a
className="text-blue-500 hover:underline"
href="mailto:updates@cal.com?subject=Feature%20Request%3A%20More%20Analytics&body=Hey%20Cal.com%20Team%2C%20I%20love%20the%20analytics%20page%20but%20I%20am%20looking%20for%20...">
{" "}
{t("contact_support")}
</a>
</small>
</div>
</FiltersProvider>
</InsightsLayout>
);
}
+69
View File
@@ -0,0 +1,69 @@
"use client";
import Shell from "@calcom/features/shell/Shell";
import { UpgradeTip } from "@calcom/features/tips";
import { WEBAPP_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc";
import { Button, ButtonGroup } from "@calcom/ui";
import { Icon } from "@calcom/ui";
import type { getServerSideProps } from "@lib/insights/getServerSideProps";
import type { inferSSRProps } from "@lib/types/inferSSRProps";
export type PageProps = inferSSRProps<typeof getServerSideProps>;
export default function InsightsLayout({ children }: { children: React.ReactNode }) {
const { t } = useLocale();
const { data: user } = trpc.viewer.me.useQuery();
const features = [
{
icon: <Icon name="users" className="h-5 w-5" />,
title: t("view_bookings_across"),
description: t("view_bookings_across_description"),
},
{
icon: <Icon name="refresh-ccw" className="h-5 w-5" />,
title: t("identify_booking_trends"),
description: t("identify_booking_trends_description"),
},
{
icon: <Icon name="user-plus" className="h-5 w-5" />,
title: t("spot_popular_event_types"),
description: t("spot_popular_event_types_description"),
},
];
return (
<div>
<Shell
withoutMain={false}
heading={t("insights")}
subtitle={t("insights_subtitle")}
title={t("insights")}
description={t("insights_subtitle")}>
<UpgradeTip
plan="team"
title={t("make_informed_decisions")}
description={t("make_informed_decisions_description")}
features={features}
background="/tips/insights"
buttons={
<div className="space-y-2 rtl:space-x-reverse sm:space-x-2">
<ButtonGroup>
<Button color="primary" href={`${WEBAPP_URL}/settings/teams/new`}>
{t("create_team")}
</Button>
<Button color="minimal" href="https://go.cal.com/insights" target="_blank">
{t("learn_more")}
</Button>
</ButtonGroup>
</div>
}>
{!user ? null : children}
</UpgradeTip>
</Shell>
</div>
);
}
+3 -3
View File
@@ -624,7 +624,7 @@ export default function Signup({
</div>
</div>
</div>
<div className="border-subtle lg:bg-subtle mx-auto mt-24 w-full max-w-2xl flex-col justify-between rounded-l-2xl pl-4 lg:mt-0 lg:flex lg:max-w-full lg:border lg:py-12 lg:pl-12 dark:bg-none">
<div className="border-subtle lg:bg-subtle mx-auto mt-24 w-full max-w-2xl flex-col justify-between rounded-l-2xl pl-4 dark:bg-none lg:mt-0 lg:flex lg:max-w-full lg:border lg:py-12 lg:pl-12">
{IS_CALCOM && (
<>
<div className="-mt-4 mb-6 mr-12 grid w-full grid-cols-3 gap-5 pr-4 sm:gap-3 lg:grid-cols-4">
@@ -675,7 +675,7 @@ export default function Signup({
</div>
</>
)}
<div className="border-default hidden rounded-bl-2xl rounded-br-none rounded-tl-2xl border border-r-0 border-dashed bg-black/[3%] lg:block lg:py-[6px] lg:pl-[6px] dark:bg-white/5">
<div className="border-default hidden rounded-bl-2xl rounded-br-none rounded-tl-2xl border border-r-0 border-dashed bg-black/[3%] dark:bg-white/5 lg:block lg:py-[6px] lg:pl-[6px]">
<img className="block dark:hidden" src="/mock-event-type-list.svg" alt="Cal.com Booking Page" />
<img
className="hidden dark:block"
@@ -686,7 +686,7 @@ export default function Signup({
<div className="mr-12 mt-8 hidden h-full w-full grid-cols-3 gap-4 overflow-hidden lg:grid">
{FEATURES.map((feature) => (
<>
<div className="mb-8 flex max-w-52 flex-col leading-none sm:mb-0">
<div className="max-w-52 mb-8 flex flex-col leading-none sm:mb-0">
<div className="text-emphasis items-center">
<Icon name={feature.icon} className="mb-1 h-4 w-4" />
<span className="text-sm font-medium">{t(feature.title)}</span>
@@ -24,7 +24,7 @@ export type PageProps = inferSSRProps<typeof getServerSideProps>;
export default function JoinCall(props: PageProps) {
const { t } = useLocale();
const { meetingUrl, meetingPassword, booking, hasTeamPlan } = props;
const { meetingUrl, meetingPassword, booking, hasTeamPlan, calVideoLogo } = props;
const [daily, setDaily] = useState<DailyCall | null>(null);
useEffect(() => {
@@ -103,10 +103,10 @@ export default function JoinCall(props: PageProps) {
<CalAiTranscribe />
</div>
<div style={{ zIndex: 2, position: "relative" }}>
{booking?.user?.organization?.calVideoLogo ? (
{calVideoLogo ? (
<img
className="min-w-16 min-h-16 fixed z-10 hidden aspect-square h-16 w-16 rounded-full sm:inline-block"
src={booking.user.organization.calVideoLogo}
src={calVideoLogo}
alt="My Org Logo"
style={{
top: 32,
+3 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@calcom/web",
"version": "4.6.17",
"version": "4.7.3",
"private": true,
"scripts": {
"analyze": "ANALYZE=true next build",
@@ -64,6 +64,7 @@
"@radix-ui/react-switch": "^1.0.0",
"@radix-ui/react-toggle-group": "^1.0.0",
"@radix-ui/react-tooltip": "^1.0.0",
"@replexica/sdk": "^0.6.0",
"@sentry/nextjs": "^8.8.0",
"@stripe/react-stripe-js": "^1.10.0",
"@stripe/stripe-js": "^1.35.0",
@@ -74,7 +75,7 @@
"@upstash/redis": "^1.21.0",
"@vercel/edge-config": "^0.1.1",
"@vercel/edge-functions-ui": "^0.2.1",
"@vercel/og": "^0.5.0",
"@vercel/og": "^0.6.3",
"accept-language-parser": "^1.5.0",
"async": "^3.2.4",
"bcp-47-match": "^2.0.3",
+30
View File
@@ -0,0 +1,30 @@
import Head from "next/head";
import { APP_NAME, WEBAPP_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Button } from "@calcom/ui";
import PageWrapper from "@components/PageWrapper";
export default function AccessDenied() {
const { t } = useLocale();
return (
<div className="bg-subtle flex h-screen">
<Head>
<title>{`${t("access_denied")} | ${APP_NAME}`}</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<div className="rtl: bg-default m-auto rounded-md p-10 text-right ltr:text-left">
<h1 className="font-cal text-emphasis text-6xl">403</h1>
<h2 className="text-emphasis mt-6 text-2xl font-medium">{t("dont_have_access_this_page")}</h2>
<p className="text-default mb-6 mt-4 max-w-2xl text-sm">
{t("you_need_admin_or_owner_privileges_to_access")}
</p>
<Button href={WEBAPP_URL}>{t("go_back_home")}</Button>
</div>
</div>
);
}
AccessDenied.PageWrapper = PageWrapper;
+7 -8
View File
@@ -83,9 +83,12 @@ export default async function handler(req: NextApiRequest) {
/>
),
ogConfig
) as { body: Buffer };
);
return new Response(img.body, { status: 200, headers: { "Content-Type": "image/png" } });
return new Response(img.body, {
status: 200,
headers: { "Content-Type": "image/png", "cache-control": "max-age=86400" },
});
}
case "app": {
const { name, description, slug } = appSchema.parse({
@@ -94,9 +97,7 @@ export default async function handler(req: NextApiRequest) {
slug: searchParams.get("slug"),
imageType,
});
const img = new ImageResponse(<App name={name} description={description} slug={slug} />, ogConfig) as {
body: Buffer;
};
const img = new ImageResponse(<App name={name} description={description} slug={slug} />, ogConfig);
return new Response(img.body, { status: 200, headers: { "Content-Type": "image/png" } });
}
@@ -108,9 +109,7 @@ export default async function handler(req: NextApiRequest) {
imageType,
});
const img = new ImageResponse(<Generic title={title} description={description} />, ogConfig) as {
body: Buffer;
};
const img = new ImageResponse(<Generic title={title} description={description} />, ogConfig);
return new Response(img.body, { status: 200, headers: { "Content-Type": "image/png" } });
}
-3
View File
@@ -80,9 +80,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
},
});
// Sync Services: Close.com
// closeComUpdateTeam(prevTeam, team);
// redirect to team screen
res.redirect(302, `/settings/teams/${team.id}/onboard-members?event=team_created`);
}
@@ -0,0 +1,4 @@
import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler";
import { routingFormsRouter } from "@calcom/trpc/server/routers/viewer/routing-forms/_router";
export default createNextApiHandler(routingFormsRouter);
+12
View File
@@ -0,0 +1,12 @@
"use client";
import { getServerSideProps } from "@lib/insights/getServerSideProps";
import PageWrapper from "@components/PageWrapper";
import InsightsPage from "~/insights/insights-routing-view";
const Page = () => <InsightsPage />;
Page.PageWrapper = PageWrapper;
export default Page;
export { getServerSideProps };
+8
View File
@@ -94,6 +94,7 @@ const createTeamEventType = async (
teamEventLength?: number;
seatsPerTimeSlot?: number;
managedEventUnlockedFields?: Record<string, boolean>;
assignAllTeamMembers?: boolean;
}
) => {
return await prisma.eventType.create({
@@ -138,6 +139,7 @@ const createTeamEventType = async (
},
}
: undefined,
assignAllTeamMembers: scenario?.assignAllTeamMembers,
},
});
};
@@ -154,6 +156,7 @@ const createTeamAndAddUser = async (
index,
orgRequestedSlug,
schedulingType,
assignAllTeamMembersForSubTeamEvents,
}: {
user: { id: number; email: string; username: string | null; role?: MembershipRole };
isUnpublished?: boolean;
@@ -165,6 +168,7 @@ const createTeamAndAddUser = async (
index?: number;
orgRequestedSlug?: string;
schedulingType?: SchedulingType;
assignAllTeamMembersForSubTeamEvents?: boolean;
},
workerInfo: WorkerInfo
) => {
@@ -193,6 +197,7 @@ const createTeamAndAddUser = async (
const team = await createTeamAndAddUser({ user }, workerInfo);
await createTeamEventType(user, team, {
schedulingType: schedulingType,
assignAllTeamMembers: assignAllTeamMembersForSubTeamEvents,
});
await createTeamWorkflow(user, team);
data.children = { connect: [{ id: team.id }] };
@@ -282,6 +287,8 @@ export const createUsersFixture = (
addManagedEventToTeamMates?: boolean;
managedEventUnlockedFields?: Record<string, boolean>;
orgRequestedSlug?: string;
assignAllTeamMembers?: boolean;
assignAllTeamMembersForSubTeamEvents?: boolean;
} = {}
) => {
const _user = await prisma.user.create({
@@ -537,6 +544,7 @@ export const createUsersFixture = (
organizationId: opts?.organizationId,
orgRequestedSlug: scenario.orgRequestedSlug,
schedulingType: scenario.schedulingType,
assignAllTeamMembersForSubTeamEvents: scenario.assignAllTeamMembersForSubTeamEvents,
},
workerInfo
);
Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 KiB

After

Width:  |  Height:  |  Size: 221 KiB

+13 -9
View File
@@ -209,20 +209,24 @@ test.describe("Insights", async () => {
await page.getByRole("button", { name: "User" }).click();
// <div class="flex select-none truncate font-medium" data-state="closed">People</div>
await page.locator('div[class="flex select-none truncate font-medium"]').getByText("People").click();
// await page.locator('div[class="flex select-none truncate font-medium"]').getByText("People").click();
await page.waitForSelector('[data-testid="people-filter-button"]');
await page.click('[data-testid="people-filter-button"]');
await page
.locator(
'div[class="hover:bg-muted flex items-center py-2 pl-3 pr-2.5 transition hover:cursor-pointer"]'
)
.nth(0)
// .locator(
// 'div[class="hover:bg-muted flex items-center py-2 pl-3 pr-2.5 transition hover:cursor-pointer"]'
// )
.locator('[data-testid="people-filter-group-option-0"]')
// .nth(0)
.click();
await page
.locator(
'div[class="hover:bg-muted flex items-center py-2 pl-3 pr-2.5 transition hover:cursor-pointer"]'
)
.nth(1)
// .locator(
// 'div[class="hover:bg-muted flex items-center py-2 pl-3 pr-2.5 transition hover:cursor-pointer"]'
// )
.locator('[data-testid="people-filter-group-option-1"]')
// .nth(1)
.click();
// press escape button to close the filter
await page.keyboard.press("Escape");
@@ -1,6 +1,8 @@
import { expect } from "@playwright/test";
import { WEBAPP_URL } from "@calcom/lib/constants";
import { prisma } from "@calcom/prisma";
import { MembershipRole, SchedulingType } from "@calcom/prisma/enums";
import { test } from "../lib/fixtures";
import { getInviteLink, localize } from "../lib/testUtils";
@@ -121,4 +123,60 @@ test.describe("Team", () => {
).toHaveCount(1);
});
});
test("Invited member is assigned to existing managed event, after invitation is accepted", async ({
page,
users,
}) => {
const t = await localize("en");
const teamEventSlugAndTitle = "managed-event-test";
const teamMatesObj = [{ name: "teammate-1" }, { name: "teammate-2" }];
const teamOwner = await users.create(
{ name: `team-owner-${Date.now()}` },
{
hasTeam: true,
teamRole: MembershipRole.ADMIN,
teammates: teamMatesObj,
schedulingType: SchedulingType.MANAGED,
teamEventSlug: teamEventSlugAndTitle,
teamEventTitle: teamEventSlugAndTitle,
teamEventLength: 30,
addManagedEventToTeamMates: true,
assignAllTeamMembers: true,
}
);
const invitedMember = await users.create({
name: `invited-member-${Date.now()}`,
email: `invited-member-${Date.now()}@example.com`,
});
const { team } = await teamOwner.getFirstTeamMembership();
await teamOwner.apiLogin();
await page.goto(`/settings/teams/${team.id}/members`);
await page.getByTestId("new-member-button").click();
await page.locator('input[name="inviteUser"]').fill(invitedMember.email);
await page.locator(`button:text("${t("send_invite")}")`).click();
await invitedMember.apiLogin();
await page.goto(`/teams`);
await page.getByTestId(`accept-invitation-${team.id}`).click();
const response = await page.waitForResponse("/api/trpc/teams/acceptOrLeave?batch=1");
expect(response.status()).toBe(200);
await page.goto(`/event-types`);
//ensure managed event-type is created for the invited member
await expect(page.locator(`text="${teamEventSlugAndTitle}"`)).toBeVisible();
//ensure the new event-type created for invited member is child of team event-type
const parentEventType = await prisma.eventType.findFirst({
where: {
slug: teamEventSlugAndTitle,
teamId: team.id,
},
select: {
children: true,
},
});
expect(parentEventType?.children.find((et) => et.userId === invitedMember.id)).toBeTruthy();
});
});
+4
View File
@@ -161,6 +161,10 @@
<symbol class="lucide lucide-chevron-up" viewBox="0 0 24 24" fill="inherit" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" id="chevron-up">
<path d="m18 15-6-6-6 6" ></path>
</symbol>
<symbol class="lucide lucide-chevrons-down-up" viewBox="0 0 24 24" fill="inherit" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" id="chevrons-down-up">
<path d="m7 20 5-5 5 5" ></path>
<path d="m7 4 5 5 5-5" ></path>
</symbol>
<symbol class="lucide lucide-chevrons-left" viewBox="0 0 24 24" fill="inherit" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" id="chevrons-left">
<path d="m11 17-5-5 5-5" ></path>
<path d="m18 17-5-5 5-5" ></path>

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 48 KiB

+66 -3
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "الإجراء المطلوب إعادة الجدولة: يُرجى حجز وقت جديد لمدة {{eventType}} مع {{name}}",
"hi_user_name": "مرحبا {{name}}",
"ics_event_title": "{{eventType}} مع {{name}}",
"please_book_a_time_sometime_later": "عفواً، لم نتمكن من الاتصال بك هذه المرة. الرجاء جدولة مكالمة مستقبلية بدلاً من ذلك",
"please_book_a_time_sometime_later": "يبدو أن جميع خبرائنا مشغولون حاليًا. يرجى تحديد موعد مكالمة في الوقت الذي يناسبك وسنكون جاهزين لمساعدتك.",
"schedule_instead": "حدد موعدًا بدلاً من ذلك",
"new_event_subject": "حدث جديد: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "الانضمام بواسطة {{entryPoint}}",
"notes": "ملاحظات",
@@ -198,6 +199,8 @@
"webhook_disabled": "تعطيل الويبهوك",
"webhook_response": "رد الويبهوك",
"webhook_test": "اختبار ويبهوك",
"webhook_update_form": "نموذج تحديث الويب هوك",
"webhook_update_form_description": "أضف ويب هوك إلى عميل OAuth الخاص بك.",
"manage_your_webhook": "إدارة الويبهوك الخاص بك",
"webhook_created_successfully": "تم إنشاء الويبهوك بنجاح!",
"webhook_updated_successfully": "تم تحديث الويبهوك بنجاح!",
@@ -348,9 +351,13 @@
"other": "آخر",
"email_sign_in_subject": "رابط تسجيل الدخول بك لـ{{appName}}",
"round_robin_emailed_you_and_attendees": "أنت تجتمع مع {{user}}. أرسلنا بريداً إلكترونياً مع دعوة اجتماع بكل التفاصيل إلى الجميع.",
"round_robin_emailed_host_and_attendee": "{{host}} سيجتمع مع {{attendee}}. لقد أرسلنا بريداً إلكترونياً يحتوي على دعوة تقويم مع كافة التفاصيل للجميع.",
"emailed_you_and_attendees": "لقد أرسلنا إليك وإلى الحضور الآخرين دعوة للتقويم عبر البريد الإلكتروني تتضمن كل التفاصيل.",
"emailed_host_and_attendee": "لقد أرسلنا بريداً إلكترونياً يحتوي على دعوة تقويم مع كافة التفاصيل للجميع.",
"emailed_you_and_attendees_recurring": "لقد أرسلنا إليك وإلى الحضور الآخرين دعوة تقويم عبر البريد الإلكتروني لأول هذه الأحداث المتكررة.",
"round_robin_emailed_you_and_attendees_recurring": "أنت تجتمع مع {{user}}. أرسلنا بريداً إلكترونياً مع دعوة اجتماع بكل التفاصيل إلى الجميع لأول اجتماع من هذه الاجتماعات الدورية.",
"emailed_host_and_attendee_recurring": "لقد أرسلنا بريداً إلكترونياً يحتوي على دعوة تقويم مع كافة التفاصيل للجميع للحدث الأول من هذه الأحداث المتكررة.",
"round_robin_emailed_you_and_attendees_recurring": "أنت على موعد مع {{user}}. لقد أرسلنا بريداً إلكترونياً يحتوي على دعوة تقويم مع كافة التفاصيل للجميع للحدث الأول من هذه الأحداث المتكررة.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} سيجتمع مع {{attendee}}. لقد أرسلنا بريداً إلكترونياً يحتوي على دعوة تقويم مع كافة التفاصيل للجميع للحدث الأول من هذه الأحداث المتكررة.",
"emailed_you_and_any_other_attendees": "تم إرسال هذه المعلومات إليك وإلى الحضور الآخرين عبر البريد الإلكتروني.",
"needs_to_be_confirmed_or_rejected": "لا يزال الحجز الخاص بك يحتاج إلى التأكيد أو الرفض.",
"needs_to_be_confirmed_or_rejected_recurring": "لا يزال الاجتماع المتكرر الخاص بك بحاجة إلى التأكيد أو الرفض.",
@@ -403,6 +410,8 @@
"back_to_bookings": "العودة إلى عمليات الحجز",
"free_to_pick_another_event_type": "لا تتردد في اختيار حدث آخر في أي وقت.",
"cancelled": "تم الإلغاء",
"no_booking": "لا يوجد حجز",
"awaiting_host": "في انتظار المضيف",
"cancellation_successful": "تم الإلغاء بنجاح",
"really_cancel_booking": "هل تريد حقًا إلغاء الحجز؟",
"cannot_cancel_booking": "لا يمكنك إلغاء هذا الحجز",
@@ -703,6 +712,9 @@
"no_teams": "ليس لديك أي فرق حتى الآن.",
"no_teams_description": "تسمح الفرق للآخرين بحجز الأحداث المشتركة بين زملائك في العمل.",
"submit": "إرسال",
"confirm_remove_attribute": "نعم، إزالة السمة",
"remove_attribute": "إزالة السمة",
"remove_attribute_confirmation_message": "هل أنت متأكد أنك تريد إزالة السمة '{{name}}'؟ سيتم إلغاء تعيين جميع المستخدمين المعينين لها حالياً.",
"delete": "حذف",
"update": "تحديث",
"save": "حفظ",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "التوجيه",
"routing_forms_description": "أنشئ النماذج لتوجيه الحضور إلى الوجهات الصحيحة",
"routing_forms_send_email_owner": "إرسال رسالة إلكترونية إلى المالك",
"routing_forms_send_email_owner_description": "يرسل رسالة بريد إلكتروني إلى المالك عند إرسال النموذج",
@@ -1630,6 +1643,7 @@
"format": "التنسيق",
"uppercase_for_letters": "استخدم الحروف الكبيرة لجميع الأحرف",
"replace_whitespaces_underscores": "استبدل المساحات البيضاء بالشرطات السفلية",
"platform_billing": "فوترة المنصة",
"manage_billing": "إدارة الفواتير",
"manage_billing_description": "إدارة كل ما يخص الفواتير",
"billing_freeplan_title": "أنت حاليًا على الخطة المجانية",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "هل تبحث عن المزيد من Insights؟",
"filters": "الفلاتر",
"add_filter": "إضافة عامل تصفية",
"add_rule": "إضافة قاعدة",
"add_rule_group": "إضافة مجموعة قواعد",
"remove_filters": "إزالة جميع الفلاتر",
"email_verified": "تم التحقق من البريد الإلكتروني",
"select_user": "اختر المستخدم",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "إعداد منظمتك",
"set_up_your_platform_organization": "إعداد منصتك",
"organizations_description": "المنظمات هي بيئات مشتركة حيث يمكن للفرق إنشاء أنواع الأحداث المشتركة والتطبيقات ومهام سير العمل والمزيد.",
"plans": "الخطط",
"platform": "المنصة",
"platform_description": "إدارة كل ما يتعلق بالمنصة.",
"platform_organization_description": "تتيح لك منصة Cal.com دمج الجدولة بسهولة في تطبيقك باستخدام واجهات برمجة التطبيقات والعناصر.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "حدّد بعض الفترات المتاحة وأدرجها في رسالتك الإلكترونية",
"select_time": "اختيار الوقت",
"select_date": "اختيار التاريخ",
"connecting_you_to_someone": "نقوم بربطك بشخص ما.",
"connecting_you_to_someone": "نقوم بربطك بشخص من {{orgName}}.",
"please_do_not_close_this_tab": "من فضلك لا تغلق أو تحدّث هذه الصفحة",
"see_all_available_times": "رؤية كل الأوقات المتاحة",
"org_team_names_example_1": "مثال، فريق التسويق",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "لا يدعم خيار المقعد فترات متعددة",
"include_calendar_event": "إدراج فعاليات في التقويم",
"oAuth": "OAuth",
"oAuth_client_creation_form": "نموذج إنشاء عميل OAuth",
"oAuth_client_creation_form_description": "هذا هو النموذج لإنشاء عميل OAuth جديد",
"oAuth_client_updation_form": "نموذج تحديث عميل OAuth",
"oAuth_client_updation_form_description": "هذا هو النموذج لتعديل عميل OAuth موجود",
"recently_added": "تمت الإضافة مؤخراً",
"connect_all_calendars": "قم بربط جميع التقويمات",
"connect_all_calendars_description": "{{appName}} يقرأ التوافر من جميع تقاويمك الحالية.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "تم تحديث حدود الحجز بنجاح",
"you_are_unauthorized_to_make_this_change_to_the_booking": "أنت غير مخول لإجراء هذا التغيير على الحجز",
"matching_members": "الأعضاء المطابقون",
"matching_members_queue_using_attribute_weights": "قائمة انتظار مطابقة الأعضاء (باستخدام أوزان السمات)",
"matching_members_queue_using_event_assignee_weights": "قائمة انتظار مطابقة الأعضاء (باستخدام أوزان المسؤولين عن الفعاليات)",
"no_matching_members": "لا يوجد أعضاء مطابقون. سيتم الرجوع إلى استخدام أعضاء الفريق المعينين لنوع الحدث.",
"no_matching_members_will_fallback_to_all_assigned_members": "لا يوجد أعضاء مطابقين. سيتم الرجوع إلى استخدام أعضاء الفريق المعينين لنوع الحدث. فكر في إضافة بديل أو تصحيح منطق استخدام الأعضاء البديلين",
"hide_calendar_event_details": "إخفاء تفاصيل الأحداث في التقويمات المشتركة",
@@ -2704,6 +2727,8 @@
"add_new_field": "إضافة حقل جديد",
"you_dont_have_access_to_reroute_this_booking": "ليس لديك صلاحية لإعادة توجيه هذا الحجز",
"form_response_not_found": "لم يتم العثور على استجابة النموذج",
"contact_owner": "مالك جهة الاتصال",
"contact_owner_not_found": "غير موجود",
"using_fallback_members": "استخدام الأعضاء البديلين",
"chosen_route": "المسار المختار",
"attribute_logic_matched": "تطابق منطق السمات",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "معلومات وقت انتهاء الحدث في المنطقة الزمنية للحاضر",
"salesforce_create_event_on_contact": "إنشاء حدث على جهة الاتصال، إذا كانت موجودة. وإلا، الرجوع إلى العميل المحتمل",
"salesforce_owner_name_to_change": "اسم المالك المراد تغييره",
"dont_have_access_this_page": "ليس لديك صلاحية الوصول إلى هذه الصفحة",
"you_need_admin_or_owner_privileges_to_access": "لرؤية هذه الصفحة أو التفاعل معها، يجب أن تكون لديك صلاحيات المدير أو المالك",
"field_type": "نوع الحقل",
"when_to_write": "متى تتم الكتابة",
"salesforce_on_booking_write_to_record": "عند الحجز، اكتب في حقل مخصص في سجل الحاضر {{record}}",
"on_every_booking": "عند كل حجز",
"only_if_field_is_empty": "فقط إذا كان الحقل فارغًا",
"booking_start_date": "تاريخ بدء الحجز",
"booking_created_date": "تاريخ إنشاء الحجز",
"booking_reassigned_to_host": "تم إعادة تعيين الحجز إلى {{host}}",
"no_contact_owner": "لا يوجد مالك لجهة الاتصال",
"routing_forms_created": "نماذج التوجيه التي تم إنشاؤها",
"routing_forms_total_responses": "إجمالي الردود",
"routing_forms_total_responses_without_booking": "إجمالي الردود بدون حجز",
"routing_forms_total_responses_with_booking": "إجمالي الردود مع الحجز",
"routing_form_insights": "لا توجد حجوزات",
"routing_form_insights_form_name_header": "اسم النموذج",
"routing_form_insights_booking_status_header": "الحجز",
"routing_form_insights_response_no_booking": "لا يوجد حجز",
"routing_form_insights_booked_by": "تم الحجز بواسطة",
"routing_form_insights_created_at": "تم الإنشاء في",
"routing_form_insights_booking_status": "حالة الحجز",
"routing_form_insights_booking_at": "موعد الحجز",
"routing_form_insights_submitted_at": "تاريخ التقديم",
"access_denied": "تم رفض الوصول",
"salesforce_route_to_owner": "سيكون مالك جهة الاتصال هو مضيف Round Robin إذا كان متاحاً",
"salesforce_do_not_route_to_owner": "لن يتم فرض مالك جهة الاتصال (يمكن أن يظل مضيفاً إذا تطابق مع السمات ومعايير Round Robin)",
"salesforce_route_to_custom_lookup_field": "التوجيه إلى مستخدم يطابق حقل البحث في الحساب",
"salesforce_option": "خيار Salesforce",
"lookup_field_name": "اسم حقل البحث",
"rr_distribution_method": "التوزيع",
"rr_distribution_method_description": "يتيح تحسين التوزيع لتحقيق أقصى قدر من التوفر أو لتحقيق توزيع أكثر توازناً.",
"rr_distribution_method_availability_title": "تعظيم التوفر",
"rr_distribution_method_availability_description": "يسمح للحاجزين بحجز الاجتماعات عندما يكون المضيف متاحاً. استخدم هذا الخيار لزيادة عدد الاجتماعات المحتملة التي يمكن حجزها عندما يكون التوزيع المتساوي للاجتماعات بين المضيفين أقل أهمية.",
"rr_distribution_method_balanced_title": "توازن الأحمال",
"rr_distribution_method_balanced_description": "سنراقب عدد الحجوزات التي تمت مع كل مضيف ونقارنها مع الآخرين، مع تعطيل بعض المضيفين الذين تجاوزوا الحد بكثير لضمان توزيع الحجوزات بشكل متساوٍ.",
"exclude_emails_that_contain": "استبعاد رسائل البريد الإلكتروني التي تحتوي على ...",
"exclude_emails_match_found_error_message": "يرجى إدخال عنوان بريد إلكتروني صالح للعمل",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ أضف السلاسل الجديدة أعلاه هنا ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+67 -4
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Təxirə salma tələb olunur: {{eventType}} {{name}} ilə yeni vaxt təyin edin",
"hi_user_name": "Salam {{name}}",
"ics_event_title": "{{eventType}} {{name}} ilə",
"please_book_a_time_sometime_later": "Bağışlayın, bu dəfə əlaqə qura bilmədik. Zəhmət olmasa, gələcək bir zəng üçün vaxt təyin edin",
"please_book_a_time_sometime_later": "Görünür ki, hazırda bütün ekspertlərimiz məşğuldur. Zəhmət olmasa, sizə ən uyğun olan vaxtı seçin və biz sizə kömək etməyə hazır olacağıq.",
"schedule_instead": "Əvəzində planlaşdırın",
"new_event_subject": "Yeni tədbir: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "{{entryPoint}} ilə qoşulun",
"notes": "Qeydlər",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook Deaktivdir",
"webhook_response": "Webhook cavabı",
"webhook_test": "Webhook testi",
"webhook_update_form": "Webhook yeniləmə forması",
"webhook_update_form_description": "OAuthClient-ə webhook əlavə edin.",
"manage_your_webhook": "Webhook-u idarə edin",
"webhook_created_successfully": "Webhook uğurla yaradıldı!",
"webhook_updated_successfully": "Webhook uğurla yeniləndi!",
@@ -348,9 +351,13 @@
"other": "Digər",
"email_sign_in_subject": "{{appName}} üçün giriş linkiniz",
"round_robin_emailed_you_and_attendees": "{{user}} ilə görüşürsünüz. Təfərrüatları olan təqvim dəvəti ilə hər kəsə e-poçt göndərdik.",
"round_robin_emailed_host_and_attendee": "{{host}} {{attendee}} ilə görüşür. Təfərrüatları olan təqvim dəvəti ilə hər kəsə e-poçt göndərdik.",
"emailed_you_and_attendees": "Təfərrüatları olan təqvim dəvəti ilə hər kəsə e-poçt göndərdik.",
"emailed_host_and_attendee": "Təfərrüatları olan təqvim dəvəti ilə hər kəsə e-poçt göndərdik.",
"emailed_you_and_attendees_recurring": "Bu təkrarlanan hadisələrin birincisi üçün təfərrüatları olan təqvim dəvəti ilə hər kəsə e-poçt göndərdik.",
"round_robin_emailed_you_and_attendees_recurring": "{{user}} ilə görüşürsünüz. Bu təkrarlanan hadisələrin birincisi üçün təfərrüatları olan təqvim dəvəti ilə hər kəsə e-poçt göndərdik.",
"emailed_host_and_attendee_recurring": "Bu təkrarlanan tədbirlərin birincisi üçün təfərrüatları olan təqvim dəvəti ilə hər kəsə e-poçt göndərdik.",
"round_robin_emailed_you_and_attendees_recurring": "Siz {{user}} ilə görüşürsünüz. Bu təkrarlanan tədbirlərin birincisi üçün təfərrüatları olan təqvim dəvəti ilə hər kəsə e-poçt göndərdik.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} {{attendee}} ilə görüşür. Bu təkrarlanan tədbirlərin birincisi üçün təfərrüatları olan təqvim dəvəti ilə hər kəsə e-poçt göndərdik.",
"emailed_you_and_any_other_attendees": "Bu məlumatla hər kəsə e-poçt göndərdik.",
"needs_to_be_confirmed_or_rejected": "Rezervasiyanız hələ də təsdiqlənməli və ya rədd edilməlidir.",
"needs_to_be_confirmed_or_rejected_recurring": "Təkrarlanan görüşünüz hələ də təsdiqlənməli və ya rədd edilməlidir.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Rezervasiyalara geri dön",
"free_to_pick_another_event_type": "Başqa bir tədbir növünü seçməkdə sərbəstsiniz.",
"cancelled": "Ləğv edildi",
"no_booking": "Rezervasiya yoxdur",
"awaiting_host": "Ev sahibini gözləyir",
"cancellation_successful": "Ləğv uğurla tamamlandı",
"really_cancel_booking": "Rezervasiyanı həqiqətən ləğv etmək istəyirsiniz?",
"cannot_cancel_booking": "Bu rezervasiyanı ləğv edə bilməzsiniz",
@@ -703,6 +712,9 @@
"no_teams": "Hələ heç bir komandanız yoxdur.",
"no_teams_description": "Komandalar həmkarlarınız arasında paylaşılan tədbirləri sifariş etməyə imkan verir.",
"submit": "Təsdiqlə",
"confirm_remove_attribute": "Bəli, atributu sil",
"remove_attribute": "Atributu sil",
"remove_attribute_confirmation_message": "Atributu '{{name}}' silmək istədiyinizə əminsinizmi? Hazırda ona təyin edilmiş bütün istifadəçilər təyin edilməmiş olacaq.",
"delete": "Sil",
"update": "Yenilə",
"save": "Yadda saxla",
@@ -1237,7 +1249,7 @@
"number_provided": "Telefon nömrəsi təmin ediləcək",
"before_event_trigger": "tədbir başlamazdan əvvəl",
"event_cancelled_trigger": "tədbir ləğv edildikdə",
"after_hosts_cal_video_no_show": "Ev sahibləri Cal video görüşünə qoşulmadıqdan sonra",
"after_hosts_cal_video_no_show": "Təşkilatçılar Cal video görüşünə qoşulmadıqdan sonra",
"after_guests_cal_video_no_show": "Qonaqlar Cal video görüşünə qoşulmadıqdan sonra",
"new_event_trigger": "yeni tədbir sifariş edildikdə",
"email_host_action": "ev sahibinə e-poçt göndərin",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Marşrutlaşdırma",
"routing_forms_description": "İştirakçıları düzgün istiqamətlərə yönləndirmək üçün formalar yaradın",
"routing_forms_send_email_owner": "Sahibə e-poçt göndər",
"routing_forms_send_email_owner_description": "Forma təqdim edildikdə sahibə e-poçt göndərir",
@@ -1630,6 +1643,7 @@
"format": "Format",
"uppercase_for_letters": "Bütün hərfləri böyük hərflərlə yaz",
"replace_whitespaces_underscores": "Boşluqları alt xətlərlə əvəz et",
"platform_billing": "Platforma ödənişi",
"manage_billing": "Ödənişləri idarə et",
"manage_billing_description": "Bütün ödəniş işlərini idarə et",
"billing_freeplan_title": "Hazırda PULSUZ plandasınız",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Daha çox məlumat axtarırsınız?",
"filters": "Filtrlər",
"add_filter": "Filtr əlavə et",
"add_rule": "Qayda əlavə et",
"add_rule_group": "Qayda qrupu əlavə et",
"remove_filters": "Bütün filtrləri təmizlə",
"email_verified": "Email Təsdiqləndi",
"select_user": "İstifadəçini seçin",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Təşkilatınızı qurun",
"set_up_your_platform_organization": "Platformanızı qurun",
"organizations_description": "Təşkilatlar komandaların paylaşılan tədbir növləri, tətbiqlər, iş axınları və daha çoxunu yarada biləcəyi paylaşılan mühitlərdir.",
"plans": "Planlar",
"platform": "Platforma",
"platform_description": "Platforma ilə bağlı hər şeyi idarə edin.",
"platform_organization_description": "Cal.com Platforması, platforma API-ləri və atomları istifadə edərək planlaşdırmanı tətbiqinizə asanlıqla inteqrasiya etməyə imkan verir.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Mövcud vaxtları seçin və Email-ə əlavə edin",
"select_time": "Vaxtı Seçin",
"select_date": "Tarixi Seçin",
"connecting_you_to_someone": "Sizi kiməsə qoşuruq.",
"connecting_you_to_someone": "Sizi {{orgName}}-dən birisi ilə əlaqələndiririk.",
"please_do_not_close_this_tab": "Zəhmət olmasa, bu səhifəni bağlamayın və ya yeniləməyin",
"see_all_available_times": "Bütün mövcud vaxtları görün",
"org_team_names_example_1": "məs. Marketinq Komandası",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Oturacaq seçimi bir neçə müddəti dəstəkləmir",
"include_calendar_event": "Təqvim tədbirini daxil edin",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuth müştəri yaratma forması",
"oAuth_client_creation_form_description": "Bu, yeni OAuth müştərisi yaratmaq üçün formadır",
"oAuth_client_updation_form": "OAuth müştəri yeniləmə forması",
"oAuth_client_updation_form_description": "Bu, mövcud OAuth müştərisini redaktə etmək üçün formadır",
"recently_added": "Son zamanlar əlavə olunmuş",
"connect_all_calendars": "Bütün təqvimlərinizi qoşun",
"connect_all_calendars_description": "{{appName}} mövcud təqvimlərinizdən mövcudluğu oxuyur.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Rezervasiya məhdudiyyətləri uğurla yeniləndi",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Bu dəyişikliyi etmək üçün səlahiyyətiniz yoxdur",
"matching_members": "Uyğun üzvlər",
"matching_members_queue_using_attribute_weights": "Üzvlərin uyğunlaşdırılması növbəsi (atribut çəkilərindən istifadə edərək)",
"matching_members_queue_using_event_assignee_weights": "Üzvlərin uyğunlaşdırılması növbəsi (tədbir təyin edən çəkilərindən istifadə edərək)",
"no_matching_members": "Uyğun üzvlər yoxdur. Bu halda tədbir növünə təyin edilmiş komanda üzvləri istifadə olunacaq.",
"no_matching_members_will_fallback_to_all_assigned_members": "Uyğun üzvlər tapılmadı. Tədbir növünə təyin edilmiş komanda üzvlərindən istifadə ediləcək. Ehtiyat variant əlavə etməyi və ya using_fallback_members məntiqini düzəltməyi nəzərdən keçirin",
"hide_calendar_event_details": "Təqvim hadisə detallarını gizlət",
@@ -2704,6 +2727,8 @@
"add_new_field": "Yeni sahə əlavə et",
"you_dont_have_access_to_reroute_this_booking": "Bu rezervasiyanı yönləndirmək üçün icazəniz yoxdur",
"form_response_not_found": "Form cavabı tapılmadı",
"contact_owner": "Əlaqə sahibi",
"contact_owner_not_found": "Tapılmadı",
"using_fallback_members": "Ehtiyat üzvlərdən istifadə edilir",
"chosen_route": "Seçilmiş marşrut",
"attribute_logic_matched": "Atribut məntiqi uyğun gəldi",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "İştirakçı Saat Qurşağında Tədbirin Bitmə Vaxtı",
"salesforce_create_event_on_contact": "Əgər mövcuddursa, kontakt üzərində hadisə yaradın. Əks halda, lidə qayıdın",
"salesforce_owner_name_to_change": "Dəyişdiriləcək sahibin adı",
"dont_have_access_this_page": "Bu səhifəyə girişiniz yoxdur",
"you_need_admin_or_owner_privileges_to_access": "Bu səhifəni görmək və ya onunla qarşılıqlı əlaqədə olmaq üçün admin və ya sahib imtiyazlarına malik olmalısınız",
"field_type": "Sahə növü",
"when_to_write": "Nə zaman yazmaq",
"salesforce_on_booking_write_to_record": "Rezervasiya zamanı iştirakçının {{record}} qeydinə xüsusi sahəyə yaz",
"on_every_booking": "Hər rezervasiyada",
"only_if_field_is_empty": "Yalnız sahə boşdursa",
"booking_start_date": "Rezervasiyanın başlama tarixi",
"booking_created_date": "Rezervasiyanın yaradılma tarixi",
"booking_reassigned_to_host": "Rezervasiya {{host}}-a yenidən təyin edildi",
"no_contact_owner": "Əlaqə sahibi yoxdur",
"routing_forms_created": "Marşrutlaşdırma formaları yaradıldı",
"routing_forms_total_responses": "Ümumi cavablar",
"routing_forms_total_responses_without_booking": "Rezervasiyasız ümumi cavablar",
"routing_forms_total_responses_with_booking": "Rezervasiyalı ümumi cavablar",
"routing_form_insights": "Rezervasiya yoxdur",
"routing_form_insights_form_name_header": "Formanın adı",
"routing_form_insights_booking_status_header": "Rezervasiya",
"routing_form_insights_response_no_booking": "Rezervasiya yoxdur",
"routing_form_insights_booked_by": "Rezervasiya edən",
"routing_form_insights_created_at": "Yaradılma tarixi",
"routing_form_insights_booking_status": "Rezervasiya statusu",
"routing_form_insights_booking_at": "Rezervasiya tarixi",
"routing_form_insights_submitted_at": "Göndərilmə tarixi",
"access_denied": "Giriş qadağandır",
"salesforce_route_to_owner": "Əlaqə sahibi mövcud olduqda Round Robin ev sahibi olacaq",
"salesforce_do_not_route_to_owner": "Əlaqə sahibi məcbur edilməyəcək (əgər atributlara və Round Robin meyarlarına uyğun gəlirsə, yenə də ev sahibi ola bilər)",
"salesforce_route_to_custom_lookup_field": "Hesabda axtarış sahəsinə uyğun gələn istifadəçiyə yönləndir",
"salesforce_option": "Salesforce Seçimi",
"lookup_field_name": "Axtarış Sahəsinin Adı",
"rr_distribution_method": "Paylama",
"rr_distribution_method_description": "Maksimum əlçatanlıq üçün paylamanı optimallaşdırmağa və ya daha balanslı bir təyinat üçün çalışmağa imkan verir.",
"rr_distribution_method_availability_title": "Əlçatanlığı maksimuma çatdırmaq",
"rr_distribution_method_availability_description": "Görüş təşkilatçısı mövcud olduqda, görüşlərin bron edilməsinə imkan verir. Bu, potensial görüşlərin sayını maksimuma çatdırmaq və görüşlərin təşkilatçılar arasında bərabər paylanmasının daha az əhəmiyyətli olduğu hallarda istifadə olunur.",
"rr_distribution_method_balanced_title": "Yük balanslaşdırma",
"rr_distribution_method_balanced_description": "Hər bir təşkilatçı ilə neçə bron edildiyini izləyəcəyik və bunu digərləri ilə müqayisə edəcəyik, çox irəlidə olan bəzi təşkilatçıları deaktiv edərək bronların bərabər paylanmasını təmin edəcəyik.",
"exclude_emails_that_contain": "Tərkibində olan e-poçtları istisna et...",
"exclude_emails_match_found_error_message": "Zəhmət olmasa düzgün iş e-poçt ünvanı daxil edin",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Yeni sətirləri bura əlavə edin ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Akce vyžadovaná k přeplánování: zarezervujte si nový čas pro událost {{eventType}} s osobou {{name}}",
"hi_user_name": "Hezký den, {{name}}",
"ics_event_title": "{{eventType}} s {{name}}",
"please_book_a_time_sometime_later": "Jejda, tentokrát jsme vás nemohli spojit. Prosím, naplánujte si hovor na později.",
"please_book_a_time_sometime_later": "Zdá se, že všichni naši experti jsou momentálně zaneprázdněni. Naplánujte si prosím hovor na čas, který vám nejvíce vyhovuje, a my vám rádi pomůžeme.",
"schedule_instead": "Naplánovat schůzku",
"new_event_subject": "Nová událost: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Připojit se k {{entryPoint}}",
"notes": "Poznámky",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook vypnut",
"webhook_response": "Webhook odpověď",
"webhook_test": "Test webhooku",
"webhook_update_form": "Formulář pro aktualizaci webhooku",
"webhook_update_form_description": "Přidejte webhook k vašemu OAuthClientovi.",
"manage_your_webhook": "Spravovat webhook",
"webhook_created_successfully": "Webhook úspěšně vytvořen!",
"webhook_updated_successfully": "Webhook úspěšně aktualizován!",
@@ -348,9 +351,13 @@
"other": "Ostatní",
"email_sign_in_subject": "Váš přihlašovací odkaz pro {{appName}}",
"round_robin_emailed_you_and_attendees": "Setkáte se s {{user}}. Poslali jsme e-mail s pozvánkou do kalendáře a podrobnostmi všem účastníkům.",
"round_robin_emailed_host_and_attendee": "{{host}} se setká s {{attendee}}. Všem jsme poslali e-mail s pozvánkou do kalendáře a podrobnostmi.",
"emailed_you_and_attendees": "Poslali jsme vám a ostatním účastníkům e-mail s pozvánkou a podrobnostmi.",
"emailed_host_and_attendee": "Všem jsme poslali e-mail s pozvánkou do kalendáře a podrobnostmi.",
"emailed_you_and_attendees_recurring": "Na první z těchto opakovaných událostí jsme vám a ostatním účastníkům poslali e-mail s pozvánkou a podrobnostmi.",
"round_robin_emailed_you_and_attendees_recurring": "Setkáte se s {{user}}. Poslali jsme e-mail s pozvánkou do kalendáře a podrobnostmi všem účastníkům pro první z těchto opakujících se událostí.",
"emailed_host_and_attendee_recurring": "Všem jsme poslali e-mail s pozvánkou do kalendáře a podrobnostmi pro první z těchto opakujících se událostí.",
"round_robin_emailed_you_and_attendees_recurring": "Setkáte se s {{user}}. Všem jsme poslali e-mail s pozvánkou do kalendáře a podrobnostmi pro první z těchto opakujících se událostí.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} se setká s {{attendee}}. Všem jsme poslali e-mail s pozvánkou do kalendáře a podrobnostmi pro první z těchto opakujících se událostí.",
"emailed_you_and_any_other_attendees": "Poslali jsme vám a ostatním účastníkům e-mail s těmito informacemi.",
"needs_to_be_confirmed_or_rejected": "Vaše rezervace bude teprve schválena nebo zamítnuta.",
"needs_to_be_confirmed_or_rejected_recurring": "Vaše opakovaná schůzka musí být ještě potvrzena nebo zamítnuta.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Zpět na rezervace",
"free_to_pick_another_event_type": "Kdykoliv si můžete vybrat jinou událost.",
"cancelled": "Zrušeno",
"no_booking": "Žádná rezervace",
"awaiting_host": "Čeká se na hostitele",
"cancellation_successful": "Zrušení proběhlo úspěšně",
"really_cancel_booking": "Opravdu chcete zrušit svou rezervaci?",
"cannot_cancel_booking": "Tuto rezervaci nelze zrušit",
@@ -703,6 +712,9 @@
"no_teams": "Zatím nemáte žádné týmy.",
"no_teams_description": "Týmy ostatním umožňují rezervovat sdílené události mezi spolupracovníky.",
"submit": "Odeslat",
"confirm_remove_attribute": "Ano, odstranit atribut",
"remove_attribute": "Odstranit atribut",
"remove_attribute_confirmation_message": "Opravdu chcete odstranit atribut '{{name}}'? Všichni uživatelé, kteří jsou k němu aktuálně přiřazeni, budou od něj odpojeni.",
"delete": "Smazat",
"update": "Aktualizovat",
"save": "Uložit",
@@ -1237,8 +1249,8 @@
"number_provided": "Bude uvedeno telefonní číslo",
"before_event_trigger": "před zahájením události",
"event_cancelled_trigger": "při zrušení události",
"after_hosts_cal_video_no_show": "Po tom, co se hostitelé nepřipojí k cal video",
"after_guests_cal_video_no_show": "Po tom, co se hosté nepřipojí k cal video",
"after_hosts_cal_video_no_show": "Poté, co se hostitelé nepřipojili k video hovoru",
"after_guests_cal_video_no_show": "Poté, co se hosté nepřipojili k video hovoru",
"new_event_trigger": "při rezervaci nové události",
"email_host_action": "odeslání e-mailu hostiteli",
"email_attendee_action": "odeslat e-mail účastníkům",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Směrování",
"routing_forms_description": "Vytvořit formuláře pro přesměrování účastníků do správných destinací",
"routing_forms_send_email_owner": "Odeslat e-mail vlastníkovi",
"routing_forms_send_email_owner_description": "Po odeslání formuláře bude vlastníkovi odeslán e-mail",
@@ -1630,6 +1643,7 @@
"format": "Formát",
"uppercase_for_letters": "Použít velká písmena pro všechna písmena",
"replace_whitespaces_underscores": "Nahradit mezery podtržítky",
"platform_billing": "Fakturace platformy",
"manage_billing": "Spravovat fakturaci",
"manage_billing_description": "Spravovat vše ohledně fakturace",
"billing_freeplan_title": "Momentálně používáte tarif ZDARMA",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Hledáte další přehledy?",
"filters": "Filtry",
"add_filter": "Přidat filtr",
"add_rule": "Přidat pravidlo",
"add_rule_group": "Přidat skupinu pravidel",
"remove_filters": "Vymazat všechny filtry",
"email_verified": "E-mail ověřen",
"select_user": "Vybrat uživatele",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Nastavení organizace",
"set_up_your_platform_organization": "Nastavte svou platformu",
"organizations_description": "Organizace jsou sdílená prostředí, ve kterých mohou týmy vytvářet sdílené typy událostí, aplikace, pracovní postupy a mnoho dalšího.",
"plans": "Plány",
"platform": "Platforma",
"platform_description": "Spravujte vše, co souvisí s platformou.",
"platform_organization_description": "Platforma Cal.com vám umožňuje snadno integrovat plánování do vaší aplikace pomocí platformových API a atomů.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Vyberte několik dostupných časů a vložte je do e-mailu",
"select_time": "Vyberte čas",
"select_date": "Vyberte datum",
"connecting_you_to_someone": "Spojujeme vás s někým.",
"connecting_you_to_someone": "Spojujeme vás s někým z {{orgName}}.",
"please_do_not_close_this_tab": "Prosím, nezavírejte ani neobnovujte tuto stránku",
"see_all_available_times": "Zobrazit všechny dostupné časy",
"org_team_names_example_1": "Např. marketingový tým",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Volba místa nepodporuje více dob trvání",
"include_calendar_event": "Zahrnout událost kalendáře",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formulář pro vytvoření OAuth klienta",
"oAuth_client_creation_form_description": "Toto je formulář pro vytvoření nového OAuth klienta",
"oAuth_client_updation_form": "Formulář pro aktualizaci OAuth klienta",
"oAuth_client_updation_form_description": "Toto je formulář pro úpravu existujícího OAuth klienta",
"recently_added": "Nedávno přidáno",
"connect_all_calendars": "Propojte všechny své kalendáře",
"connect_all_calendars_description": "{{appName}} čte dostupnost ze všech vašich stávajících kalendářů.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Limity rezervací byly úspěšně aktualizovány",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Nemáte oprávnění provést tuto změnu v rezervaci",
"matching_members": "Odpovídající členové",
"matching_members_queue_using_attribute_weights": "Fronta přiřazování členů (podle vah atributů)",
"matching_members_queue_using_event_assignee_weights": "Fronta přiřazování členů (podle vah účastníků události)",
"no_matching_members": "Žádní odpovídající členové. Bude použito záložní řešení s členy týmu přiřazenými k typu události.",
"no_matching_members_will_fallback_to_all_assigned_members": "Žádní odpovídající členové. Použijí se všichni členové týmu přiřazení k typu události. Zvažte přidání záložního plánu nebo opravu logiky using_fallback_members",
"hide_calendar_event_details": "Skrýt podrobnosti událostí v kalendáři na sdílených kalendářích",
@@ -2704,6 +2727,8 @@
"add_new_field": "Přidat nové pole",
"you_dont_have_access_to_reroute_this_booking": "Nemáte přístup k přesměrování této rezervace",
"form_response_not_found": "Odpověď formuláře nebyla nalezena",
"contact_owner": "Vlastník kontaktu",
"contact_owner_not_found": "Nenalezeno",
"using_fallback_members": "Používají se záložní členové",
"chosen_route": "Zvolená cesta",
"attribute_logic_matched": "Logika atributů odpovídá",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Čas konce události v časovém pásmu účastníka",
"salesforce_create_event_on_contact": "Vytvořit událost na kontaktu, pokud existuje. Jinak použít lead",
"salesforce_owner_name_to_change": "Jméno vlastníka ke změně",
"dont_have_access_this_page": "K této stránce nemáte přístup",
"you_need_admin_or_owner_privileges_to_access": "Pro zobrazení nebo interakci s touto stránkou musíte mít administrátorská nebo vlastnická práva",
"field_type": "Typ pole",
"when_to_write": "Kdy zapisovat",
"salesforce_on_booking_write_to_record": "Při rezervaci zapsat do vlastního pole záznamu účastníka {{record}}",
"on_every_booking": "Při každé rezervaci",
"only_if_field_is_empty": "Pouze pokud je pole prázdné",
"booking_start_date": "Datum začátku rezervace",
"booking_created_date": "Datum vytvoření rezervace",
"booking_reassigned_to_host": "Rezervace přeřazena hostiteli {{host}}",
"no_contact_owner": "Bez vlastníka kontaktu",
"routing_forms_created": "Vytvořené směrovací formuláře",
"routing_forms_total_responses": "Celkový počet odpovědí",
"routing_forms_total_responses_without_booking": "Celkový počet odpovědí bez rezervace",
"routing_forms_total_responses_with_booking": "Celkový počet odpovědí s rezervací",
"routing_form_insights": "Žádné rezervace",
"routing_form_insights_form_name_header": "Název formuláře",
"routing_form_insights_booking_status_header": "Rezervace",
"routing_form_insights_response_no_booking": "Bez rezervace",
"routing_form_insights_booked_by": "Rezervoval/a",
"routing_form_insights_created_at": "Vytvořeno",
"routing_form_insights_booking_status": "Stav rezervace",
"routing_form_insights_booking_at": "Čas rezervace",
"routing_form_insights_submitted_at": "Čas odeslání",
"access_denied": "Přístup odepřen",
"salesforce_route_to_owner": "Vlastník kontaktu bude hostem Round Robin, pokud je k dispozici",
"salesforce_do_not_route_to_owner": "Vlastník kontaktu nebude nucen (stále může být hostem, pokud odpovídá atributům a kritériím Round Robin)",
"salesforce_route_to_custom_lookup_field": "Přiřadit uživateli, který odpovídá vyhledávacímu poli na účtu",
"salesforce_option": "Možnost Salesforce",
"lookup_field_name": "Název vyhledávacího pole",
"rr_distribution_method": "Distribuce",
"rr_distribution_method_description": "Umožňuje optimalizovat distribuci pro maximální dostupnost nebo pro vyváženější přidělování.",
"rr_distribution_method_availability_title": "Maximalizovat dostupnost",
"rr_distribution_method_availability_description": "Umožňuje rezervujícím sjednat schůzky kdykoliv, když je hostitel k dispozici. Použijte tuto možnost pro maximalizaci počtu potenciálních schůzek a v případech, kdy rovnoměrné rozdělení schůzek mezi hostitele není tak důležité.",
"rr_distribution_method_balanced_title": "Vyvažování zátěže",
"rr_distribution_method_balanced_description": "Budeme sledovat, kolik rezervací bylo provedeno u jednotlivých hostitelů a porovnávat je s ostatními. Některé hostitele, kteří jsou příliš napřed, dočasně deaktivujeme, aby byly rezervace rovnoměrně distribuovány.",
"exclude_emails_that_contain": "Vyloučit e-maily obsahující...",
"exclude_emails_match_found_error_message": "Zadejte prosím platnou pracovní e-mailovou adresu",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Přidejte své nové řetězce nahoru ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+67 -4
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Handling Påkrævet Omlægning: Reservér en ny tid for {{eventType}} med {{name}}",
"hi_user_name": "Hej {{name}}",
"ics_event_title": "{{eventType}} med {{name}}",
"please_book_a_time_sometime_later": "Ups, vi kunne ikke forbinde dig denne gang. Venligst planlæg et opkald på et senere tidspunkt.",
"please_book_a_time_sometime_later": "Det ser ud til, at alle vores eksperter er optaget lige nu. Venligst planlæg et opkald på et tidspunkt, der passer dig bedst, så vi er klar til at hjælpe dig.",
"schedule_instead": "Planlæg i stedet",
"new_event_subject": "Ny begivenhed: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Deltag via {{entryPoint}}",
"notes": "Noter",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook Deaktiveret",
"webhook_response": "Webhook svar",
"webhook_test": "Webhook test",
"webhook_update_form": "Formular til opdatering af webhook",
"webhook_update_form_description": "Tilføj en webhook til din OAuthClient.",
"manage_your_webhook": "Administrer din webhook",
"webhook_created_successfully": "Webhook blev oprettet!",
"webhook_updated_successfully": "Webhook blev opdateret!",
@@ -348,9 +351,13 @@
"other": "Flere",
"email_sign_in_subject": "Dit login link til {{appName}}",
"round_robin_emailed_you_and_attendees": "Du mødes med {{user}}. Vi har sendt en e-mail med en kalenderinvitation med detaljerne til alle.",
"round_robin_emailed_host_and_attendee": "{{host}} mødes med {{attendee}}. Vi har sendt en e-mail med en kalenderinvitation med detaljerne til alle.",
"emailed_you_and_attendees": "Vi har sendt dig og de andre deltagere en kalenderinvitation med alle detaljerne.",
"emailed_host_and_attendee": "Vi har sendt en e-mail med en kalenderinvitation med detaljerne til alle.",
"emailed_you_and_attendees_recurring": "Vi har sendt dig og de andre deltagere en kalenderinvitation til den første af disse tilbagevendende begivenheder.",
"emailed_host_and_attendee_recurring": "Vi har sendt en e-mail med en kalenderinvitation med detaljerne til alle for den første af disse tilbagevendende begivenheder.",
"round_robin_emailed_you_and_attendees_recurring": "Du mødes med {{user}}. Vi har sendt en e-mail med en kalenderinvitation med detaljerne til alle for den første af disse tilbagevendende begivenheder.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} mødes med {{attendee}}. Vi har sendt en e-mail med en kalenderinvitation med detaljerne til alle for den første af disse tilbagevendende begivenheder.",
"emailed_you_and_any_other_attendees": "Du og eventuelle andre deltagere er blevet mailet med disse oplysninger.",
"needs_to_be_confirmed_or_rejected": "Din booking mangler stadig at blive bekræftet eller afvist.",
"needs_to_be_confirmed_or_rejected_recurring": "Dit tilbagevendende møde mangler stadig at blive bekræftet eller afvist.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Tilbage til bookinger",
"free_to_pick_another_event_type": "Du er til enhver tid velkommen til at vælge en anden begivenhed.",
"cancelled": "Annulleret",
"no_booking": "Ingen booking",
"awaiting_host": "Venter på vært",
"cancellation_successful": "Annullering lykkedes",
"really_cancel_booking": "Vil du virkelig annullere din booking?",
"cannot_cancel_booking": "Du kan ikke annullere denne booking",
@@ -703,6 +712,9 @@
"no_teams": "Du har ikke nogen teams endnu.",
"no_teams_description": "Teams giver andre mulighed for at booke begivenheder, der deles mellem dine kolleger.",
"submit": "Videre",
"confirm_remove_attribute": "Ja, fjern attribut",
"remove_attribute": "Fjern attribut",
"remove_attribute_confirmation_message": "Er du sikker på, at du vil fjerne attributten '{{name}}'? Alle brugere, der i øjeblikket er tildelt den, vil blive frakoblet.",
"delete": "Slet",
"update": "Opdatér",
"save": "Gem",
@@ -1237,8 +1249,8 @@
"number_provided": "Telefonnummer vil blive angivet",
"before_event_trigger": "før begivenheden starter",
"event_cancelled_trigger": "når begivenheden er aflyst",
"after_hosts_cal_video_no_show": "Efter værter ikke deltager i cal video",
"after_guests_cal_video_no_show": "Efter gæster ikke deltager i cal video",
"after_hosts_cal_video_no_show": "Efter værterne ikke deltog i cal-videomødet",
"after_guests_cal_video_no_show": "Efter gæsterne ikke deltog i cal-videomødet",
"new_event_trigger": "når ny begivenhed er booket",
"email_host_action": "send e-mail til vært",
"email_attendee_action": "send e-mail til deltagere",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Routing",
"routing_forms_description": "Opret formularer for at dirigere deltagere til de korrekte destinationer",
"routing_forms_send_email_owner": "Send e-mail til Ejer",
"routing_forms_send_email_owner_description": "Sender en e-mail til ejeren når formularen er indsendt",
@@ -1630,6 +1643,7 @@
"format": "Formatér",
"uppercase_for_letters": "Brug store bogstaver for alle bogstaver",
"replace_whitespaces_underscores": "Erstat blanke tegn med understregninger",
"platform_billing": "Platformsfakturering",
"manage_billing": "Håndtér fakturering",
"manage_billing_description": "Håndtér alt omkring fakturering",
"billing_freeplan_title": "Du er i øjeblikket på den GRATIS plan",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Leder du efter flere indsigter?",
"filters": "Filtre",
"add_filter": "Tilføj filter",
"add_rule": "Tilføj regel",
"add_rule_group": "Tilføj regelgruppe",
"remove_filters": "Ryd alle filtre",
"email_verified": "Email bekræftet",
"select_user": "Vælg bruger",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Opsæt din organisation",
"set_up_your_platform_organization": "Opsæt din platform",
"organizations_description": "Organisationer er delte miljøer, hvor teams kan oprette delte begivenhedstyper, apps, arbejdsgange og mere.",
"plans": "Planer",
"platform": "Platform",
"platform_description": "Administrer alt relateret til platformen.",
"platform_organization_description": "Cal.com Platform lader dig integrere planlægning problemfrit i din app ved hjælp af platformens API'er og atomer.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Vælg nogle tilgængelige tidspunkter og indlejre dem i din e-mail",
"select_time": "Vælg tid",
"select_date": "Vælg dato",
"connecting_you_to_someone": "Vi forbinder dig med en person.",
"connecting_you_to_someone": "Vi forbinder dig med en person fra {{orgName}}.",
"please_do_not_close_this_tab": "Luk eller opdater venligst ikke denne side",
"see_all_available_times": "Se alle tilgængelige tidspunkter",
"org_team_names_example_1": "f.eks. Marketingteam",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Sædeoption understøtter ikke flere varigheder",
"include_calendar_event": "Inkluder kalenderbegivenhed",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formular til oprettelse af OAuth-klient",
"oAuth_client_creation_form_description": "Dette er formularen til at oprette en ny OAuth-klient",
"oAuth_client_updation_form": "Formular til opdatering af OAuth-klient",
"oAuth_client_updation_form_description": "Dette er formularen til at redigere en eksisterende OAuth-klient",
"recently_added": "For nylig tilføjet",
"connect_all_calendars": "Forbind alle dine kalendere",
"connect_all_calendars_description": "{{appName}} læser tilgængelighed fra alle dine eksisterende kalendere.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Bookinggrænser opdateret med succes",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Du har ikke tilladelse til at foretage denne ændring i bookingen",
"matching_members": "Matchende medlemmer",
"matching_members_queue_using_attribute_weights": "Matchende medlemskø (bruger attributvægte)",
"matching_members_queue_using_event_assignee_weights": "Matchende medlemskø (bruger begivenhedsansvarlig-vægte)",
"no_matching_members": "Ingen matchende medlemmer. Det vil falde tilbage til at bruge de teammedlemmer, der er tildelt til begivenhedstypen.",
"no_matching_members_will_fallback_to_all_assigned_members": "Ingen matchende medlemmer. Der vil falde tilbage til at bruge de teammedlemmer, der er tildelt begivenhedstypen. Overvej at tilføje en fallback eller korrigere logikken for using_fallback_members",
"hide_calendar_event_details": "Skjul kalenderbegivenhedsdetaljer på delte kalendere",
@@ -2704,6 +2727,8 @@
"add_new_field": "Tilføj nyt felt",
"you_dont_have_access_to_reroute_this_booking": "Du har ikke adgang til at omdirigere denne booking",
"form_response_not_found": "Formularbesvarelse ikke fundet",
"contact_owner": "Kontaktejer",
"contact_owner_not_found": "Ikke fundet",
"using_fallback_members": "Bruger fallback-medlemmer",
"chosen_route": "Valgt rute",
"attribute_logic_matched": "Attributlogik matchet",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Begivenhedens sluttidspunkt i deltagers tidszone",
"salesforce_create_event_on_contact": "Opret begivenhed på kontakt, hvis den eksisterer. Ellers fald tilbage til lead",
"salesforce_owner_name_to_change": "Ejernavn der skal ændres",
"dont_have_access_this_page": "Du har ikke adgang til denne side",
"you_need_admin_or_owner_privileges_to_access": "For at kunne se eller interagere med denne side, skal du have administrator- eller ejerrettigheder",
"field_type": "Felttype",
"when_to_write": "Hvornår der skal skrives",
"salesforce_on_booking_write_to_record": "Ved booking, skriv til et brugerdefineret felt på deltagerens {{record}}-post",
"on_every_booking": "Ved hver booking",
"only_if_field_is_empty": "Kun hvis feltet er tomt",
"booking_start_date": "Bookings startdato",
"booking_created_date": "Dato for oprettelse af booking",
"booking_reassigned_to_host": "Booking omfordelt til {{host}}",
"no_contact_owner": "Ingen kontaktejer",
"routing_forms_created": "Oprettede routingformularer",
"routing_forms_total_responses": "Samlede besvarelser",
"routing_forms_total_responses_without_booking": "Samlede besvarelser uden booking",
"routing_forms_total_responses_with_booking": "Samlede besvarelser med booking",
"routing_form_insights": "Ingen bookinger",
"routing_form_insights_form_name_header": "Formularnavn",
"routing_form_insights_booking_status_header": "Booking",
"routing_form_insights_response_no_booking": "Ingen booking",
"routing_form_insights_booked_by": "Booket af",
"routing_form_insights_created_at": "Oprettet den",
"routing_form_insights_booking_status": "Bookingstatus",
"routing_form_insights_booking_at": "Booket den",
"routing_form_insights_submitted_at": "Indsendt den",
"access_denied": "Adgang nægtet",
"salesforce_route_to_owner": "Kontaktens ejer vil være Round Robin-vært, hvis tilgængelig",
"salesforce_do_not_route_to_owner": "Kontaktens ejer vil ikke blive tvunget (kan stadig være vært, hvis det matcher attributterne og Round Robin-kriterierne)",
"salesforce_route_to_custom_lookup_field": "Rute til en bruger, der matcher et opslagfelt på en konto",
"salesforce_option": "Salesforce-indstilling",
"lookup_field_name": "Opslagsfeltnavn",
"rr_distribution_method": "Distribution",
"rr_distribution_method_description": "Gør det muligt at optimere distributionen for maksimal tilgængelighed eller for at opnå en mere balanceret tildeling.",
"rr_distribution_method_availability_title": "Maksimer tilgængelighed",
"rr_distribution_method_availability_description": "Giver bookere mulighed for at booke møder, når en vært er tilgængelig. Brug dette for at maksimere antallet af potentielle møder, der kan bookes, når den jævne fordeling af møder på tværs af værter er mindre vigtig.",
"rr_distribution_method_balanced_title": "Load balancing",
"rr_distribution_method_balanced_description": "Vi vil overvåge, hvor mange bookinger der er foretaget med hver vært og sammenligne dette med andre, og deaktivere nogle værter, der er for langt foran, så bookinger fordeles jævnt.",
"exclude_emails_that_contain": "Ekskluder e-mails, der indeholder ...",
"exclude_emails_match_found_error_message": "Indtast venligst en gyldig arbejds-e-mailadresse",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Tilføj dine nye strenge ovenfor her ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Aktion erforderlich - Neuplanung: Bitte buchen Sie eine neue Zeit für „{{eventType}}“ mit {{name}}",
"hi_user_name": "Hallo, {{name}}",
"ics_event_title": "{{eventType}} mit {{name}}",
"please_book_a_time_sometime_later": "Ups, wir konnten Sie dieses Mal nicht verbinden. Bitte planen Sie stattdessen einen zukünftigen Anruf",
"please_book_a_time_sometime_later": "Es scheint, dass alle unsere Experten momentan beschäftigt sind. Bitte vereinbaren Sie einen Termin zu einem Zeitpunkt, der Ihnen am besten passt, und wir werden bereit sein, Ihnen zu helfen.",
"schedule_instead": "Stattdessen planen",
"new_event_subject": "Neuer Termin: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "{{entryPoint}} beitreten",
"notes": "Notizen",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook deaktiviert",
"webhook_response": "Webhook-Antwort",
"webhook_test": "Webhook-Test",
"webhook_update_form": "Webhook-Aktualisierungsformular",
"webhook_update_form_description": "Fügen Sie Ihrem OAuth-Client einen Webhook hinzu.",
"manage_your_webhook": "Webhook verwalten",
"webhook_created_successfully": "Webhook erfolgreich erstellt!",
"webhook_updated_successfully": "Webhook erfolgreich aktualisiert!",
@@ -348,9 +351,13 @@
"other": "Sonstige",
"email_sign_in_subject": "Ihr Anmelde-Link für {{appName}}",
"round_robin_emailed_you_and_attendees": "Sie treffen sich mit {{user}}. Wir haben eine E-Mail mit einer Kalendereinladung mit den Details an alle gesendet.",
"round_robin_emailed_host_and_attendee": "{{host}} trifft sich mit {{attendee}}. Wir haben allen eine E-Mail mit einer Kalendereinladung und den Details gesendet.",
"emailed_you_and_attendees": "Wir haben eine E-Mail mit einer Kalendereinladung mit den Details an alle gesendet.",
"emailed_host_and_attendee": "Wir haben allen eine E-Mail mit einer Kalendereinladung und den Details gesendet.",
"emailed_you_and_attendees_recurring": "Wir haben eine E-Mail mit einer Kalendereinladung mit den Details für das erste dieser wiederkehrenden Termine an alle gesendet.",
"round_robin_emailed_you_and_attendees_recurring": "Sie treffen sich mit {{user}}. Wir haben eine E-Mail mit einer Kalendereinladung mit den Details für das erste dieser wiederkehrenden Termine an alle gesendet.",
"emailed_host_and_attendee_recurring": "Wir haben allen eine E-Mail mit einer Kalendereinladung und den Details für das erste dieser wiederkehrenden Events gesendet.",
"round_robin_emailed_you_and_attendees_recurring": "Sie treffen sich mit {{user}}. Wir haben allen eine E-Mail mit einer Kalendereinladung und den Details für das erste dieser wiederkehrenden Events gesendet.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} trifft sich mit {{attendee}}. Wir haben allen eine E-Mail mit einer Kalendereinladung und den Details für das erste dieser wiederkehrenden Events gesendet.",
"emailed_you_and_any_other_attendees": "Wir haben eine E-Mail mit diesen Informationen an alle gesendet.",
"needs_to_be_confirmed_or_rejected": "Ihr Termin muss noch bestätigt oder abgelehnt werden.",
"needs_to_be_confirmed_or_rejected_recurring": "Ihr wiederkehrender Termin muss noch bestätigt oder abgelehnt werden.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Zurück zu den Buchungen",
"free_to_pick_another_event_type": "Sie können jederzeit einen anderen Termin wählen.",
"cancelled": "Abgesagt",
"no_booking": "Keine Buchung",
"awaiting_host": "Warten auf Gastgeber",
"cancellation_successful": "Stornierung erfolgreich",
"really_cancel_booking": "Möchten Sie wirklich stornieren?",
"cannot_cancel_booking": "Sie können diese Buchung nicht stornieren",
@@ -703,6 +712,9 @@
"no_teams": "Sie haben noch keine Teams.",
"no_teams_description": "Teams ermöglichen Termine zu buchen, an denen mehrere Mitarbeiter beteiligt sind.",
"submit": "Abschicken",
"confirm_remove_attribute": "Ja, Attribut entfernen",
"remove_attribute": "Attribut entfernen",
"remove_attribute_confirmation_message": "Sind Sie sicher, dass Sie das Attribut '{{name}}' entfernen möchten? Alle Benutzer, die derzeit zugewiesen sind, werden abgemeldet.",
"delete": "Löschen",
"update": "Aktualisieren",
"save": "Speichern",
@@ -1237,8 +1249,8 @@
"number_provided": "Telefonnummer wird angegeben",
"before_event_trigger": "vor Beginn des Termins",
"event_cancelled_trigger": "wenn der Termin abgesagt wird",
"after_hosts_cal_video_no_show": "Nachdem Gastgeber nicht zum Cal-Video erscheinen",
"after_guests_cal_video_no_show": "Nachdem Gäste nicht zum Cal-Video erscheinen",
"after_hosts_cal_video_no_show": "Nachdem die Gastgeber nicht am Cal-Video teilgenommen haben",
"after_guests_cal_video_no_show": "Nachdem die Gäste nicht am Cal-Video teilgenommen haben",
"new_event_trigger": "wenn ein neuer Termin gebucht wird",
"email_host_action": "E-Mail an den Veranstalter senden",
"email_attendee_action": "E-Mail an Teilnehmende senden",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Weiterleitung",
"routing_forms_description": "Erstellen Sie Formulare , um Teilnehmer zu den richtigen Stellen weiterzuleiten",
"routing_forms_send_email_owner": "E-Mail an Eigentümer senden",
"routing_forms_send_email_owner_description": "Sendet eine E-Mail an den Eigentümer, wenn das Formular abgeschickt wird",
@@ -1630,6 +1643,7 @@
"format": "Format",
"uppercase_for_letters": "Großbuchstaben für alle Buchstaben verwenden",
"replace_whitespaces_underscores": "Leerzeichen durch Unterstriche ersetzen",
"platform_billing": "Plattform-Abrechnung",
"manage_billing": "Abrechnung verwalten",
"manage_billing_description": "Alles zur Abrechnung verwalten",
"billing_freeplan_title": "Sie verwenden derzeit den KOSTENLOSEN Plan",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Möchten Sie mehr Insights?",
"filters": "Filter",
"add_filter": "Filter hinzufügen",
"add_rule": "Regel hinzufügen",
"add_rule_group": "Regelgruppe hinzufügen",
"remove_filters": "Alle Filter löschen",
"email_verified": "E-Mail bestätigt",
"select_user": "Benutzer auswählen",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Ihre Organization einrichten",
"set_up_your_platform_organization": "Richten Sie Ihre Plattform ein",
"organizations_description": "Organizations sind geteilte Umgebungen, in denen Teams gemeinsame Termintypen, Apps, Workflows und mehr erstellen können.",
"plans": "Pläne",
"platform": "Plattform",
"platform_description": "Verwalten Sie alles, was mit der Plattform zusammenhängt.",
"platform_organization_description": "Mit der Cal.com-Plattform können Sie die Terminplanung mühelos mit Hilfe von Plattform-APIs und -Atoms in Ihre App integrieren.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Zeiten zur E-Mail hinzufügen",
"select_time": "Zeit auswählen",
"select_date": "Datum auswählen",
"connecting_you_to_someone": "Wir verbinden Sie mit jemandem.",
"connecting_you_to_someone": "Wir verbinden Sie mit jemandem von {{orgName}}.",
"please_do_not_close_this_tab": "Bitte schließen oder aktualisieren Sie diese Seite nicht",
"see_all_available_times": "Alle verfügbaren Zeiten ansehen",
"org_team_names_example_1": "z.B. Marketing-Team",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Platzoption unterstützt mehrere Dauern nicht",
"include_calendar_event": "Kalenderereignis hinzufügen",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuth-Client-Erstellungsformular",
"oAuth_client_creation_form_description": "Dies ist das Formular zur Erstellung eines neuen OAuth-Clients",
"oAuth_client_updation_form": "OAuth-Client-Aktualisierungsformular",
"oAuth_client_updation_form_description": "Dies ist das Formular zur Bearbeitung eines bestehenden OAuth-Clients",
"recently_added": "Kürzlich hinzugefügt",
"connect_all_calendars": "Verbinden Sie alle Ihre Kalender",
"connect_all_calendars_description": "{{appName}} liest die Verfügbarkeit aus allen Ihren vorhandenen Kalendern.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Buchungslimits erfolgreich aktualisiert",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Sie sind nicht berechtigt, diese Änderung an der Buchung vorzunehmen",
"matching_members": "Passende Mitglieder",
"matching_members_queue_using_attribute_weights": "Warteschlange für passende Mitglieder (mit Attributgewichtung)",
"matching_members_queue_using_event_assignee_weights": "Warteschlange für passende Mitglieder (mit Gewichtung der Terminverantwortlichen)",
"no_matching_members": "Keine passenden Mitglieder gefunden. Es wird auf die dem Ereignistyp zugewiesenen Teammitglieder zurückgegriffen.",
"no_matching_members_will_fallback_to_all_assigned_members": "Keine passenden Mitglieder gefunden. Es wird auf alle dem Ereignistyp zugewiesenen Teammitglieder zurückgegriffen. Erwägen Sie, eine Fallback-Option hinzuzufügen oder die Logik für using_fallback_members zu korrigieren",
"hide_calendar_event_details": "Kalenderereignisdetails in geteilten Kalendern verbergen",
@@ -2704,6 +2727,8 @@
"add_new_field": "Neues Feld hinzufügen",
"you_dont_have_access_to_reroute_this_booking": "Sie haben keine Berechtigung, diese Buchung umzuleiten",
"form_response_not_found": "Formularantwort nicht gefunden",
"contact_owner": "Kontaktinhaber",
"contact_owner_not_found": "Nicht gefunden",
"using_fallback_members": "Verwendung von Fallback-Mitgliedern",
"chosen_route": "Gewählte Route",
"attribute_logic_matched": "Attributlogik zutreffend",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Ereignis-Endzeit in der Zeitzone des Teilnehmers",
"salesforce_create_event_on_contact": "Event für Kontakt erstellen, falls vorhanden. Andernfalls auf Lead zurückgreifen",
"salesforce_owner_name_to_change": "Zu ändernder Besitzername",
"dont_have_access_this_page": "Sie haben keinen Zugriff auf diese Seite",
"you_need_admin_or_owner_privileges_to_access": "Um diese Seite anzuzeigen oder mit ihr zu interagieren, benötigen Sie Administrator- oder Eigentümerrechte",
"field_type": "Feldtyp",
"when_to_write": "Wann schreiben",
"salesforce_on_booking_write_to_record": "Bei Buchung in ein benutzerdefiniertes Feld des Teilnehmer-{{record}}-Datensatzes schreiben",
"on_every_booking": "Bei jeder Buchung",
"only_if_field_is_empty": "Nur wenn das Feld leer ist",
"booking_start_date": "Buchungs-Startdatum",
"booking_created_date": "Buchungs-Erstellungsdatum",
"booking_reassigned_to_host": "Buchung an {{host}} neu zugewiesen",
"no_contact_owner": "Kein Kontaktinhaber",
"routing_forms_created": "Erstellte Weiterleitungsformulare",
"routing_forms_total_responses": "Gesamtantworten",
"routing_forms_total_responses_without_booking": "Gesamtantworten ohne Buchung",
"routing_forms_total_responses_with_booking": "Gesamtantworten mit Buchung",
"routing_form_insights": "Keine Buchungen",
"routing_form_insights_form_name_header": "Formularname",
"routing_form_insights_booking_status_header": "Buchung",
"routing_form_insights_response_no_booking": "Keine Buchung",
"routing_form_insights_booked_by": "Gebucht von",
"routing_form_insights_created_at": "Erstellt am",
"routing_form_insights_booking_status": "Buchungsstatus",
"routing_form_insights_booking_at": "Gebucht am",
"routing_form_insights_submitted_at": "Eingereicht am",
"access_denied": "Zugriff verweigert",
"salesforce_route_to_owner": "Der Kontaktinhaber wird der Round Robin Host sein, falls verfügbar",
"salesforce_do_not_route_to_owner": "Der Kontaktinhaber wird nicht erzwungen (kann trotzdem Host sein, wenn die Attribute und Round Robin Kriterien übereinstimmen)",
"salesforce_route_to_custom_lookup_field": "Weiterleitung an einen Benutzer, der mit einem Lookup-Feld eines Accounts übereinstimmt",
"salesforce_option": "Salesforce-Option",
"lookup_field_name": "Name des Lookup-Felds",
"rr_distribution_method": "Verteilung",
"rr_distribution_method_description": "Ermöglicht die Optimierung der Verteilung für maximale Verfügbarkeit oder eine ausgewogenere Zuweisung.",
"rr_distribution_method_availability_title": "Verfügbarkeit maximieren",
"rr_distribution_method_availability_description": "Ermöglicht Buchenden, Meetings zu buchen, wann immer ein Host verfügbar ist. Nutzen Sie dies, um die Anzahl potenzieller Meetings zu maximieren, wenn die gleichmäßige Verteilung der Meetings auf die Hosts weniger wichtig ist.",
"rr_distribution_method_balanced_title": "Lastverteilung",
"rr_distribution_method_balanced_description": "Wir überwachen, wie viele Buchungen bei jedem Host eingegangen sind und vergleichen dies mit anderen. Hosts, die zu weit voraus sind, werden temporär deaktiviert, damit die Buchungen gleichmäßig verteilt werden.",
"exclude_emails_that_contain": "E-Mails ausschließen, die ... enthalten",
"exclude_emails_match_found_error_message": "Bitte geben Sie eine gültige Geschäfts-E-Mail-Adresse ein",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Fügen Sie Ihre neuen Code-Zeilen über dieser hinzu ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+59 -6
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Action Required Reschedule: Please book a new time for {{eventType}} with {{name}}",
"hi_user_name": "Hi {{name}}",
"ics_event_title": "{{eventType}} with {{name}}",
"please_book_a_time_sometime_later": "Oops, we couldn't connect you this time. Please schedule a future call instead",
"please_book_a_time_sometime_later": "It looks like all of our experts are busy right now. Please schedule a call at a time that works best for you and we'll be ready to assist you.",
"schedule_instead": "Schedule instead",
"new_event_subject": "New event: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Join by {{entryPoint}}",
"notes": "Notes",
@@ -350,9 +351,13 @@
"other": "Other",
"email_sign_in_subject": "Your sign-in link for {{appName}}",
"round_robin_emailed_you_and_attendees": "You are meeting with {{user}}. We sent an email with a calendar invitation with the details to everyone.",
"round_robin_emailed_host_and_attendee": "{{host}} is meeting with {{attendee}}. We sent an email with a calendar invitation with the details to everyone.",
"emailed_you_and_attendees": "We sent an email with a calendar invitation with the details to everyone.",
"emailed_host_and_attendee": "We sent an email with a calendar invitation with the details to everyone.",
"emailed_you_and_attendees_recurring": "We sent an email with a calendar invitation with the details to everyone for the first of these recurring events.",
"round_robin_emailed_you_and_attendees_recurring": "You are meeting with {{user}}.We sent an email with a calendar invitation with the details to everyone for the first of these recurring events.",
"emailed_host_and_attendee_recurring": "We sent an email with a calendar invitation with the details to everyone for the first of these recurring events.",
"round_robin_emailed_you_and_attendees_recurring": "You are meeting with {{user}}. We sent an email with a calendar invitation with the details to everyone for the first of these recurring events.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} is meeting with {{attendee}}. We sent an email with a calendar invitation with the details to everyone for the first of these recurring events.",
"emailed_you_and_any_other_attendees": "We sent an email to everyone with this information.",
"needs_to_be_confirmed_or_rejected": "Your booking still needs to be confirmed or rejected.",
"needs_to_be_confirmed_or_rejected_recurring": "Your recurring meeting still needs to be confirmed or rejected.",
@@ -405,6 +410,8 @@
"back_to_bookings": "Back to bookings",
"free_to_pick_another_event_type": "Feel free to pick another event anytime.",
"cancelled": "Canceled",
"no_booking": "No booking",
"awaiting_host": "Awaiting host",
"cancellation_successful": "Cancellation successful",
"really_cancel_booking": "Really cancel your booking?",
"cannot_cancel_booking": "You cannot cancel this booking",
@@ -705,6 +712,9 @@
"no_teams": "You don't have any teams yet.",
"no_teams_description": "Teams allow others to book events shared between your coworkers.",
"submit": "Submit",
"confirm_remove_attribute": "Yes, remove attribute",
"remove_attribute": "Remove attribute",
"remove_attribute_confirmation_message": "Are you sure you want to remove the attribute '{{name}}'? All users currently assigned to it will be unassigned.",
"delete": "Delete",
"update": "Update",
"save": "Save",
@@ -1239,8 +1249,8 @@
"number_provided": "Phone number will be provided",
"before_event_trigger": "before event starts",
"event_cancelled_trigger": "when event is canceled",
"after_hosts_cal_video_no_show": "After hosts don't join cal video",
"after_guests_cal_video_no_show": "After guests don't join cal video",
"after_hosts_cal_video_no_show": "After hosts didn't join cal video",
"after_guests_cal_video_no_show": "After guests didn't join cal video",
"new_event_trigger": "when new event is booked",
"email_host_action": "send email to host",
"email_attendee_action": "send email to attendees",
@@ -1570,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Routing",
"routing_forms_description": "Create forms to direct attendees to the correct destinations",
"routing_forms_send_email_owner": "Send Email to Owner",
"routing_forms_send_email_owner_description": "Sends an email to the owner when the form is submitted",
@@ -2039,7 +2050,7 @@
"looking_for_more_analytics": "Looking for more analytics?",
"looking_for_more_insights": "Looking for more Insights?",
"filters": "Filters",
"add_filter": "Add filter",
"add_filter": "Add filter",
"add_rule": "Add rule",
"add_rule_group": "Add rule group",
"remove_filters": "Clear all filters",
@@ -2207,7 +2218,7 @@
"add_times_to_your_email": "Select a few available times and embed them in your Email",
"select_time": "Select Time",
"select_date": "Select Date",
"connecting_you_to_someone": "We are connecting you to someone.",
"connecting_you_to_someone": "We are connecting you to someone from {{orgName}}.",
"please_do_not_close_this_tab": "Please do not close or refresh this page",
"see_all_available_times": "See all available times",
"org_team_names_example_1": "e.g. Marketing Team",
@@ -2669,6 +2680,8 @@
"booking_limits_updated_successfully": "Booking limits updated successfully",
"you_are_unauthorized_to_make_this_change_to_the_booking": "You are unauthorized to make this change to the booking",
"matching_members": "Matching members",
"matching_members_queue_using_attribute_weights": "Matching members queue (using attribute weights)",
"matching_members_queue_using_event_assignee_weights": "Matching members queue (using event assignee weights)",
"no_matching_members": "No matching members. It will fallback to using the team members assigned to the event type.",
"no_matching_members_will_fallback_to_all_assigned_members": "No matching members. It will fallback to using the team members assigned to the event type. Consider adding a fallback or correcting the logic of using_fallback_members",
"hide_calendar_event_details": "Hide calendar event details on shared calendars",
@@ -2718,6 +2731,8 @@
"add_new_field": "Add new field",
"you_dont_have_access_to_reroute_this_booking": "You don't have access to reroute this booking",
"form_response_not_found": "Form response not found",
"contact_owner": "Contact owner",
"contact_owner_not_found": "Not found",
"using_fallback_members": "Using fallback members",
"chosen_route": "Chosen Route",
"attribute_logic_matched": "Attribute logic matched",
@@ -2746,6 +2761,44 @@
"event_end_time_in_attendee_timezone_info": "Event End Time In Attendee Timezone",
"salesforce_create_event_on_contact": "Create event on contact, if it exists. Else fallback to lead",
"salesforce_owner_name_to_change": "Owner name to change",
"dont_have_access_this_page": "You don't have access to this page",
"you_need_admin_or_owner_privileges_to_access": "In order to view or interact with this page, you must have admin or owner privileges",
"field_type": "Field type",
"when_to_write": "When to write",
"salesforce_on_booking_write_to_record": "On booking, write to a custom field on the attendee {{record}} record",
"on_every_booking": "On every booking",
"only_if_field_is_empty": "Only if field is empty",
"booking_start_date": "Booking start date",
"booking_created_date": "Booking created date",
"booking_reassigned_to_host": "Booking reassigned to {{host}}",
"no_contact_owner": "No contact owner",
"routing_forms_created": "Routing Forms Created",
"routing_forms_total_responses": "Total Responses",
"routing_forms_total_responses_without_booking": "Total Responses Without Booking",
"routing_forms_total_responses_with_booking": "Total Responses With Booking",
"routing_form_insights": "No Bookings",
"routing_form_insights_form_name_header": "Form Name",
"routing_form_insights_booking_status_header": "Booking",
"routing_form_insights_response_no_booking": "No Booking",
"routing_form_insights_booked_by": "Booked by",
"routing_form_insights_created_at": "Created at",
"routing_form_insights_booking_status": "Booking Status",
"routing_form_insights_booking_at": "Booking At",
"routing_form_insights_submitted_at": "Submitted At",
"access_denied": "Access Denied",
"salesforce_route_to_owner": "Contact owner will be the Round Robin host if available",
"salesforce_do_not_route_to_owner": "Contact owner will not be forced (can still be host if it matches the attributes and Round Robin criteria)",
"salesforce_route_to_custom_lookup_field": "Route to a user that matches a lookup field on an account",
"salesforce_option": "Salesforce Option",
"lookup_field_name": "Lookup Field Name",
"translate_description_button": "Translate description to the visitor's browser language using AI",
"rr_distribution_method": "Distribution",
"rr_distribution_method_description": "Allows for optimising distribution for maximum availability or to aim for a more balanced assignment.",
"rr_distribution_method_availability_title": "Maximize availability",
"rr_distribution_method_availability_description": "Allows bookers to book meetings whenever a host is available. Use this to maximize the number of potential meetings booked and when the even distribution of meetings across hosts is less important.",
"rr_distribution_method_balanced_title": "Load balancing",
"rr_distribution_method_balanced_description": "We will monitor how many bookings have been made with each host and compare this with others, disabling some hosts that are too far ahead so bookings are evenly distributed.",
"exclude_emails_that_contain" : "Exclude emails that contain ...",
"exclude_emails_match_found_error_message" : "Please enter a valid work email address",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Acción requerida para reprogramar: Por favor, reserva un nuevo horario para {{eventType}} con {{name}}",
"hi_user_name": "Hola {{name}}",
"ics_event_title": "{{eventType}} con {{name}}",
"please_book_a_time_sometime_later": "Ups, no pudimos conectarte esta vez. Por favor, programa una llamada futura en su lugar",
"please_book_a_time_sometime_later": "Parece que todos nuestros expertos están ocupados en este momento. Por favor, agenda una llamada en el horario que más te convenga y estaremos listos para ayudarte.",
"schedule_instead": "Agendar ahora",
"new_event_subject": "Nuevo evento: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Únete por {{entryPoint}}",
"notes": "Notas",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook Deshabilitado",
"webhook_response": "Respuesta del Webhook",
"webhook_test": "Prueba de Webhook",
"webhook_update_form": "Formulario de actualización de webhook",
"webhook_update_form_description": "Agrega un webhook a tu cliente OAuth.",
"manage_your_webhook": "Gestiona tu webhook",
"webhook_created_successfully": "¡Webhook creado con éxito!",
"webhook_updated_successfully": "¡Webhook actualizado con éxito!",
@@ -348,9 +351,13 @@
"other": "Otro",
"email_sign_in_subject": "Tu enlace de inicio de sesión para {{appName}}",
"round_robin_emailed_you_and_attendees": "Te reunirás con {{user}}. Enviamos un correo electrónico con una invitación de calendario con los detalles a todos.",
"round_robin_emailed_host_and_attendee": "{{host}} se reunirá con {{attendee}}. Enviamos un correo electrónico con una invitación de calendario con los detalles a todos.",
"emailed_you_and_attendees": "Enviamos un correo electrónico con una invitación de calendario con los detalles a todos.",
"emailed_host_and_attendee": "Enviamos un correo electrónico con una invitación de calendario con los detalles a todos.",
"emailed_you_and_attendees_recurring": "Enviamos un correo electrónico con una invitación de calendario con los detalles a todos para el primero de estos eventos recurrentes.",
"emailed_host_and_attendee_recurring": "Enviamos un correo electrónico con una invitación de calendario con los detalles a todos para el primero de estos eventos recurrentes.",
"round_robin_emailed_you_and_attendees_recurring": "Te reunirás con {{user}}. Enviamos un correo electrónico con una invitación de calendario con los detalles a todos para el primero de estos eventos recurrentes.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} se reunirá con {{attendee}}. Enviamos un correo electrónico con una invitación de calendario con los detalles a todos para el primero de estos eventos recurrentes.",
"emailed_you_and_any_other_attendees": "Enviamos un correo electrónico a todos con esta información.",
"needs_to_be_confirmed_or_rejected": "Tu reserva aún necesita ser confirmada o rechazada.",
"needs_to_be_confirmed_or_rejected_recurring": "Tu reunión recurrente aún necesita ser confirmada o rechazada.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Volver a las reservas",
"free_to_pick_another_event_type": "Siéntete libre de elegir otro evento en cualquier momento.",
"cancelled": "Cancelado",
"no_booking": "Sin reserva",
"awaiting_host": "Esperando al anfitrión",
"cancellation_successful": "Cancelación exitosa",
"really_cancel_booking": "¿Realmente quieres cancelar tu reserva?",
"cannot_cancel_booking": "No puedes cancelar esta reserva",
@@ -703,6 +712,9 @@
"no_teams": "Aún no tienes equipos.",
"no_teams_description": "Los equipos permiten que otros reserven eventos compartidos entre tus compañeros de trabajo.",
"submit": "Enviar",
"confirm_remove_attribute": "Sí, eliminar atributo",
"remove_attribute": "Eliminar atributo",
"remove_attribute_confirmation_message": "¿Estás seguro de que deseas eliminar el atributo '{{name}}'? Todos los usuarios asignados actualmente serán desvinculados.",
"delete": "Eliminar",
"update": "Actualizar",
"save": "Guardar",
@@ -1237,8 +1249,8 @@
"number_provided": "Se proporcionará el número de teléfono",
"before_event_trigger": "antes de que comience el evento",
"event_cancelled_trigger": "cuando el evento está cancelado",
"after_hosts_cal_video_no_show": "Después de que los anfitriones no se unan al video de Cal",
"after_guests_cal_video_no_show": "Después de que los invitados no se unan al video de Cal",
"after_hosts_cal_video_no_show": "Después de que los anfitriones no se unieron a la videollamada",
"after_guests_cal_video_no_show": "Después de que los invitados no se unieron a la videollamada",
"new_event_trigger": "cuando se reserva un nuevo evento",
"email_host_action": "enviar correo electrónico al anfitrión",
"email_attendee_action": "enviar correo electrónico a los asistentes",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Enrutamiento",
"routing_forms_description": "Cree formularios para dirigir a los asistentes a los destinos correctos",
"routing_forms_send_email_owner": "Enviar correo electrónico al propietario",
"routing_forms_send_email_owner_description": "Envía un correo electrónico al propietario cuando se envía el formulario",
@@ -1630,6 +1643,7 @@
"format": "Formato",
"uppercase_for_letters": "Usa mayúsculas para todas las letras",
"replace_whitespaces_underscores": "Reemplaza los espacios en blanco con guiones bajos",
"platform_billing": "Facturación de la plataforma",
"manage_billing": "Gestionar facturación",
"manage_billing_description": "Gestiona todo lo relacionado con la facturación",
"billing_freeplan_title": "Actualmente estás en el plan GRATUITO",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "¿Buscas más información?",
"filters": "Filtros",
"add_filter": "Agregar filtro",
"add_rule": "Agregar regla",
"add_rule_group": "Agregar grupo de reglas",
"remove_filters": "Borrar todos los filtros",
"email_verified": "Correo Electrónico Verificado",
"select_user": "Seleccionar Usuario",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Configura tu organización",
"set_up_your_platform_organization": "Configura tu plataforma",
"organizations_description": "Las organizaciones son entornos compartidos donde los equipos pueden crear tipos de eventos, aplicaciones, flujos de trabajo y más compartidos.",
"plans": "Planes",
"platform": "Plataforma",
"platform_description": "Gestiona todo lo relacionado con la plataforma.",
"platform_organization_description": "La plataforma de Cal.com te permite integrar la programación sin esfuerzo en tu aplicación utilizando APIs y átomos de la plataforma.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Selecciona algunos horarios disponibles e insértalos en tu correo electrónico",
"select_time": "Seleccionar hora",
"select_date": "Seleccionar fecha",
"connecting_you_to_someone": "Te estamos conectando con alguien.",
"connecting_you_to_someone": "Te estamos conectando con alguien de {{orgName}}.",
"please_do_not_close_this_tab": "Por favor, no cierres ni actualices esta página",
"see_all_available_times": "Ver todos los horarios disponibles",
"org_team_names_example_1": "p. ej. Equipo de Marketing",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "La opción de asiento no admite múltiples duraciones",
"include_calendar_event": "Incluir evento en el calendario",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formulario de creación de cliente OAuth",
"oAuth_client_creation_form_description": "Este es el formulario para crear un nuevo cliente OAuth",
"oAuth_client_updation_form": "Formulario de actualización de cliente OAuth",
"oAuth_client_updation_form_description": "Este es el formulario para editar un cliente OAuth existente",
"recently_added": "Recientemente añadido",
"connect_all_calendars": "Conecta todos tus calendarios",
"connect_all_calendars_description": "{{appName}} lee la disponibilidad de todos tus calendarios existentes.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Límites de reservas actualizados con éxito",
"you_are_unauthorized_to_make_this_change_to_the_booking": "No tienes autorización para realizar este cambio en la reserva",
"matching_members": "Miembros coincidentes",
"matching_members_queue_using_attribute_weights": "Cola de miembros coincidentes (usando pesos de atributos)",
"matching_members_queue_using_event_assignee_weights": "Cola de miembros coincidentes (usando pesos de asignados al evento)",
"no_matching_members": "No hay miembros coincidentes. Se utilizarán los miembros del equipo asignados al tipo de evento como alternativa.",
"no_matching_members_will_fallback_to_all_assigned_members": "No hay miembros que coincidan. Se utilizarán los miembros del equipo asignados al tipo de evento como respaldo. Considera agregar un respaldo o corregir la lógica de using_fallback_members",
"hide_calendar_event_details": "Ocultar detalles de eventos del calendario en calendarios compartidos",
@@ -2704,6 +2727,8 @@
"add_new_field": "Agregar nuevo campo",
"you_dont_have_access_to_reroute_this_booking": "No tienes acceso para redirigir esta reserva",
"form_response_not_found": "Respuesta del formulario no encontrada",
"contact_owner": "Propietario del contacto",
"contact_owner_not_found": "No encontrado",
"using_fallback_members": "Usando miembros de respaldo",
"chosen_route": "Ruta elegida",
"attribute_logic_matched": "Lógica de atributos coincidente",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Hora de finalización del evento en la zona horaria del asistente",
"salesforce_create_event_on_contact": "Crear evento en el contacto, si existe. De lo contrario, usar lead como alternativa",
"salesforce_owner_name_to_change": "Nombre del propietario a cambiar",
"dont_have_access_this_page": "No tienes acceso a esta página",
"you_need_admin_or_owner_privileges_to_access": "Para ver o interactuar con esta página, debes tener privilegios de administrador o propietario",
"field_type": "Tipo de campo",
"when_to_write": "Cuándo escribir",
"salesforce_on_booking_write_to_record": "Al reservar, escribir en un campo personalizado en el registro {{record}} del asistente",
"on_every_booking": "En cada reserva",
"only_if_field_is_empty": "Solo si el campo está vacío",
"booking_start_date": "Fecha de inicio de la reserva",
"booking_created_date": "Fecha de creación de la reserva",
"booking_reassigned_to_host": "Reserva reasignada a {{host}}",
"no_contact_owner": "Sin propietario del contacto",
"routing_forms_created": "Formularios de enrutamiento creados",
"routing_forms_total_responses": "Respuestas totales",
"routing_forms_total_responses_without_booking": "Respuestas totales sin reserva",
"routing_forms_total_responses_with_booking": "Respuestas totales con reserva",
"routing_form_insights": "Sin reservas",
"routing_form_insights_form_name_header": "Nombre del formulario",
"routing_form_insights_booking_status_header": "Reserva",
"routing_form_insights_response_no_booking": "Sin reserva",
"routing_form_insights_booked_by": "Reservado por",
"routing_form_insights_created_at": "Creado el",
"routing_form_insights_booking_status": "Estado de la reserva",
"routing_form_insights_booking_at": "Reservado el",
"routing_form_insights_submitted_at": "Enviado el",
"access_denied": "Acceso denegado",
"salesforce_route_to_owner": "El propietario del contacto será el anfitrión de Round Robin si está disponible",
"salesforce_do_not_route_to_owner": "El propietario del contacto no será forzado (aún puede ser anfitrión si coincide con los atributos y criterios de Round Robin)",
"salesforce_route_to_custom_lookup_field": "Dirigir a un usuario que coincida con un campo de búsqueda en una cuenta",
"salesforce_option": "Opción de Salesforce",
"lookup_field_name": "Nombre del campo de búsqueda",
"rr_distribution_method": "Distribución",
"rr_distribution_method_description": "Permite optimizar la distribución para maximizar la disponibilidad o lograr una asignación más equilibrada.",
"rr_distribution_method_availability_title": "Maximizar disponibilidad",
"rr_distribution_method_availability_description": "Permite a los usuarios agendar reuniones cuando un anfitrión esté disponible. Usa esta opción para maximizar el número de reuniones potenciales y cuando la distribución equitativa entre anfitriones es menos importante.",
"rr_distribution_method_balanced_title": "Equilibrio de carga",
"rr_distribution_method_balanced_description": "Monitoreamos cuántas reservas se han realizado con cada anfitrión y las comparamos con otros, deshabilitando algunos anfitriones que están muy adelantados para que las reservas se distribuyan de manera uniforme.",
"exclude_emails_that_contain": "Excluir correos electrónicos que contengan ...",
"exclude_emails_match_found_error_message": "Por favor, ingresa una dirección de correo electrónico laboral válida",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Agrega tus nuevas cadenas arriba de esta línea ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+67 -4
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Reprogramar acción requerida: reserva una nueva hora para {{eventType}} con {{name}}",
"hi_user_name": "Hola {{name}}",
"ics_event_title": "{{eventType}} con {{name}}",
"please_book_a_time_sometime_later": "Vaya, no pudimos conectarte esta vez. Por favor, programa una llamada futura.",
"please_book_a_time_sometime_later": "Parece que todos nuestros expertos están ocupados en este momento. Por favor, programa una llamada en el horario que mejor te convenga y estaremos listos para ayudarte.",
"schedule_instead": "Programar ahora",
"new_event_subject": "Nuevo Evento: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Únase por {{entryPoint}}",
"notes": "Notas",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook Desactivado",
"webhook_response": "Respuesta del Webhook",
"webhook_test": "Prueba del Webhook",
"webhook_update_form": "Formulario de actualización de webhook",
"webhook_update_form_description": "Añade un webhook a tu cliente OAuth.",
"manage_your_webhook": "Administra tu webhook",
"webhook_created_successfully": "¡Webhook creado con éxito!",
"webhook_updated_successfully": "¡Webhook actualizado con éxito!",
@@ -348,9 +351,13 @@
"other": "Otro",
"email_sign_in_subject": "Su enlace de inicio de sesión para {{appName}}",
"round_robin_emailed_you_and_attendees": "Te reunirás con {{user}}. Hemos enviado un correo electrónico con una invitación de calendario con los detalles a todos.",
"round_robin_emailed_host_and_attendee": "{{host}} se reunirá con {{attendee}}. Hemos enviado un correo electrónico con una invitación de calendario con los detalles a todos.",
"emailed_you_and_attendees": "Le enviamos a usted y a los demás asistentes una invitación al calendario con todos los detalles.",
"emailed_host_and_attendee": "Hemos enviado un correo electrónico con una invitación de calendario con los detalles a todos.",
"emailed_you_and_attendees_recurring": "Le enviamos a usted y a los demás asistentes una invitación al calendario para el primero de estos eventos recurrentes.",
"emailed_host_and_attendee_recurring": "Hemos enviado un correo electrónico con una invitación de calendario con los detalles a todos para el primero de estos eventos recurrentes.",
"round_robin_emailed_you_and_attendees_recurring": "Te reunirás con {{user}}. Hemos enviado un correo electrónico con una invitación de calendario con los detalles a todos para el primero de estos eventos recurrentes.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} se reunirá con {{attendee}}. Hemos enviado un correo electrónico con una invitación de calendario con los detalles a todos para el primero de estos eventos recurrentes.",
"emailed_you_and_any_other_attendees": "Usted y cualquier otro asistente han recibido esta información.",
"needs_to_be_confirmed_or_rejected": "Su reserva todavía necesita ser confirmada o rechazada.",
"needs_to_be_confirmed_or_rejected_recurring": "Su reunión recurrente todavía necesita confirmarse o rechazarse.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Volver a Reservas",
"free_to_pick_another_event_type": "No dude en elegir otro evento en cualquier momento.",
"cancelled": "Cancelado",
"no_booking": "Sin reserva",
"awaiting_host": "Esperando al anfitrión",
"cancellation_successful": "Cancelación Realizada",
"really_cancel_booking": "¿Realmente deseas cancelar tu reserva?",
"cannot_cancel_booking": "No puedes cancelar esta reserva",
@@ -703,6 +712,9 @@
"no_teams": "Todavía no tienes ningún equipo.",
"no_teams_description": "Los equipos permiten que otros reserven eventos compartidos entre tus compañeros de trabajo.",
"submit": "Enviar",
"confirm_remove_attribute": "Sí, eliminar atributo",
"remove_attribute": "Eliminar atributo",
"remove_attribute_confirmation_message": "¿Estás seguro de que deseas eliminar el atributo '{{name}}'? Todos los usuarios asignados actualmente serán desvinculados.",
"delete": "Eliminar",
"update": "Actualizar",
"save": "Guardar",
@@ -1237,8 +1249,8 @@
"number_provided": "Se proporcionará el número de teléfono",
"before_event_trigger": "antes del inicio del evento",
"event_cancelled_trigger": "cuando se cancela el evento",
"after_hosts_cal_video_no_show": "Después de que los anfitriones no se unan al video de Cal",
"after_guests_cal_video_no_show": "Después de que los invitados no se unan al video de Cal",
"after_hosts_cal_video_no_show": "Después de que los anfitriones no se unieron al video de Cal",
"after_guests_cal_video_no_show": "Después de que los invitados no se unieron al video de Cal",
"new_event_trigger": "cuando se reserva un nuevo evento",
"email_host_action": "enviar correo electrónico al anfitrión",
"email_attendee_action": "enviar correo electrónico a los asistentes",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Enrutamiento",
"routing_forms_description": "Crea formularios para dirigir a los asistentes a sus destinos correctos",
"routing_forms_send_email_owner": "Enviar correo electrónico al propietario",
"routing_forms_send_email_owner_description": "Mande un correo electrónico al propietario cuando se envía el formulario",
@@ -1630,6 +1643,7 @@
"format": "Formato",
"uppercase_for_letters": "Use mayúsculas para todas las letras",
"replace_whitespaces_underscores": "Reemplace espacios en blanco con guiones bajos",
"platform_billing": "Facturación de la plataforma",
"manage_billing": "Gestione la facturación",
"manage_billing_description": "Gestione todo lo relacionado con la facturación",
"billing_freeplan_title": "Actualmente está en el plan GRATUITO",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "¿Quiere saber más sobre Insights?",
"filters": "Filtros",
"add_filter": "Añadir filtro",
"add_rule": "Añadir regla",
"add_rule_group": "Añadir grupo de reglas",
"remove_filters": "Borrar todos los filtros",
"email_verified": "Correo electrónico verificado",
"select_user": "Seleccionar usuario",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Configure su organización",
"set_up_your_platform_organization": "Configura tu plataforma",
"organizations_description": "Las organizaciones son entornos compartidos donde los equipos pueden crear tipos de eventos, aplicaciones, flujos de trabajo compartidos y más.",
"plans": "Planes",
"platform": "Plataforma",
"platform_description": "Gestiona todo lo relacionado con la plataforma.",
"platform_organization_description": "Cal.com Platform te permite integrar la programación sin esfuerzo en tu aplicación utilizando APIs y átomos de la plataforma.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Seleccione algunos horarios disponibles e incrústelos en su correo electrónico",
"select_time": "Seleccione la hora",
"select_date": "Seleccione la fecha",
"connecting_you_to_someone": "Te estamos conectando con alguien.",
"connecting_you_to_someone": "Te estamos conectando con alguien de {{orgName}}.",
"please_do_not_close_this_tab": "Por favor, no cierres ni actualices esta página",
"see_all_available_times": "Ver todas las horas disponibles",
"org_team_names_example_1": "ej. Equipo de marketing",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "La opción Cupo no soporta múltiples duraciones",
"include_calendar_event": "Incluir evento del calendario",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formulario de creación de cliente OAuth",
"oAuth_client_creation_form_description": "Este es el formulario para crear un nuevo cliente OAuth",
"oAuth_client_updation_form": "Formulario de actualización de cliente OAuth",
"oAuth_client_updation_form_description": "Este es el formulario para editar un cliente OAuth existente",
"recently_added": "Añadido recientemente",
"connect_all_calendars": "Conecte todos sus calendarios",
"connect_all_calendars_description": "{{appName}} lee la disponibilidad de todos tus calendarios existentes.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Límites de reservas actualizados con éxito",
"you_are_unauthorized_to_make_this_change_to_the_booking": "No tienes autorización para realizar este cambio en la reserva",
"matching_members": "Miembros coincidentes",
"matching_members_queue_using_attribute_weights": "Cola de miembros coincidentes (usando pesos de atributos)",
"matching_members_queue_using_event_assignee_weights": "Cola de miembros coincidentes (usando pesos de asignados al evento)",
"no_matching_members": "No hay miembros coincidentes. Se utilizarán los miembros del equipo asignados al tipo de evento como alternativa.",
"no_matching_members_will_fallback_to_all_assigned_members": "No hay miembros coincidentes. Se utilizarán los miembros del equipo asignados al tipo de evento como alternativa. Considera añadir una opción de respaldo o corregir la lógica de using_fallback_members",
"hide_calendar_event_details": "Ocultar detalles de eventos del calendario en calendarios compartidos",
@@ -2704,6 +2727,8 @@
"add_new_field": "Añadir nuevo campo",
"you_dont_have_access_to_reroute_this_booking": "No tienes acceso para redirigir esta reserva",
"form_response_not_found": "Respuesta del formulario no encontrada",
"contact_owner": "Propietario del contacto",
"contact_owner_not_found": "No encontrado",
"using_fallback_members": "Usando miembros de respaldo",
"chosen_route": "Ruta elegida",
"attribute_logic_matched": "Lógica de atributos coincidente",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Hora de finalización del evento en la zona horaria del asistente",
"salesforce_create_event_on_contact": "Crear evento en el contacto, si existe. De lo contrario, usar el lead",
"salesforce_owner_name_to_change": "Nombre del propietario a cambiar",
"dont_have_access_this_page": "No tienes acceso a esta página",
"you_need_admin_or_owner_privileges_to_access": "Para ver o interactuar con esta página, debes tener privilegios de administrador o propietario",
"field_type": "Tipo de campo",
"when_to_write": "Cuándo escribir",
"salesforce_on_booking_write_to_record": "Al reservar, escribir en un campo personalizado en el registro {{record}} del asistente",
"on_every_booking": "En cada reserva",
"only_if_field_is_empty": "Solo si el campo está vacío",
"booking_start_date": "Fecha de inicio de la reserva",
"booking_created_date": "Fecha de creación de la reserva",
"booking_reassigned_to_host": "Reserva reasignada a {{host}}",
"no_contact_owner": "Sin propietario del contacto",
"routing_forms_created": "Formularios de enrutamiento creados",
"routing_forms_total_responses": "Total de respuestas",
"routing_forms_total_responses_without_booking": "Total de respuestas sin reserva",
"routing_forms_total_responses_with_booking": "Total de respuestas con reserva",
"routing_form_insights": "Sin reservas",
"routing_form_insights_form_name_header": "Nombre del formulario",
"routing_form_insights_booking_status_header": "Reserva",
"routing_form_insights_response_no_booking": "Sin reserva",
"routing_form_insights_booked_by": "Reservado por",
"routing_form_insights_created_at": "Creado el",
"routing_form_insights_booking_status": "Estado de la reserva",
"routing_form_insights_booking_at": "Fecha de reserva",
"routing_form_insights_submitted_at": "Fecha de envío",
"access_denied": "Acceso denegado",
"salesforce_route_to_owner": "El propietario del contacto será el anfitrión de Round Robin si está disponible",
"salesforce_do_not_route_to_owner": "No se forzará al propietario del contacto (aún puede ser anfitrión si coincide con los atributos y criterios de Round Robin)",
"salesforce_route_to_custom_lookup_field": "Dirigir a un usuario que coincida con un campo de búsqueda en una cuenta",
"salesforce_option": "Opción de Salesforce",
"lookup_field_name": "Nombre del campo de búsqueda",
"rr_distribution_method": "Distribución",
"rr_distribution_method_description": "Permite optimizar la distribución para maximizar la disponibilidad o lograr una asignación más equilibrada.",
"rr_distribution_method_availability_title": "Maximizar disponibilidad",
"rr_distribution_method_availability_description": "Permite a los usuarios reservar reuniones cuando un anfitrión esté disponible. Utiliza esta opción para maximizar el número de reuniones potenciales y cuando la distribución equitativa entre anfitriones sea menos importante.",
"rr_distribution_method_balanced_title": "Equilibrio de carga",
"rr_distribution_method_balanced_description": "Monitorizaremos cuántas reservas se han realizado con cada anfitrión y las compararemos con otros, deshabilitando algunos anfitriones que estén muy por delante para que las reservas se distribuyan uniformemente.",
"exclude_emails_that_contain": "Excluir correos que contengan...",
"exclude_emails_match_found_error_message": "Por favor, introduce una dirección de correo electrónico laboral válida",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Agregue sus nuevas cadenas arriba ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Nõutud ümberajastamine: Palun broneerige oma {{eventType}} üritusele nimega {{name}} uus aeg",
"hi_user_name": "Tere, {{name}}",
"ics_event_title": "{{eventType}} koos {{name}}",
"please_book_a_time_sometime_later": "Vabandust, meil ei olnud võimalik teiega praegu ühendust luua. Ajastage selle asemel tulevane kõne",
"please_book_a_time_sometime_later": "Paistab, et kõik meie eksperdid on hetkel hõivatud. Palun broneeri kõne sulle sobivaks ajaks ja oleme valmis sind aitama.",
"schedule_instead": "Broneeri aeg",
"new_event_subject": "Uus üritus: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Liituge {{entryPoint}} viisil",
"notes": "Märkmed",
@@ -198,6 +199,8 @@
"webhook_disabled": "Veebihaak keelatud",
"webhook_response": "Veebihaagi vastus",
"webhook_test": "Veebihaagi test",
"webhook_update_form": "Webhooki uuendamise vorm",
"webhook_update_form_description": "Lisa webhook oma OAuthCliendile.",
"manage_your_webhook": "Halda oma veebihaaki",
"webhook_created_successfully": "Veebihaagi loomine õnnestus!",
"webhook_updated_successfully": "Veebihaagi värskendamine õnnestus!",
@@ -348,9 +351,13 @@
"other": "Muu",
"email_sign_in_subject": "Teie sisselogimislink rakendusele {{appName}}",
"round_robin_emailed_you_and_attendees": "Kohtute kasutajaga {{user}}. Saatsime kõigile meili kalendri kutsega koos üksikasjadega.",
"round_robin_emailed_host_and_attendee": "{{host}} kohtub {{attendee}}-ga. Saatsime kõigile e-kirja koos kalendrikutsega, mis sisaldab üksikasju.",
"emailed_you_and_attendees": "Saatsime kõigile kalendrikutse üksikasjadega meili.",
"emailed_host_and_attendee": "Saatsime kõigile e-kirja koos kalendrikutsega, mis sisaldab üksikasju.",
"emailed_you_and_attendees_recurring": "Saatsime kõigile esimeste korduvate sündmuste üksikasjadega meili kalendrikutsega.",
"round_robin_emailed_you_and_attendees_recurring": "Kohtute kasutajaga {{user}}. Saatsime kõigile kalendrikutse koos üksikasjadega meili esimese korduva sündmuse kohta.",
"emailed_host_and_attendee_recurring": "Saatsime kõigile e-kirja koos kalendrikutsega, mis sisaldab esimese korduva ürituse üksikasju.",
"round_robin_emailed_you_and_attendees_recurring": "Sa kohtud {{user}}-ga. Saatsime kõigile e-kirja koos kalendrikutsega, mis sisaldab esimese korduva ürituse üksikasju.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} kohtub {{attendee}}-ga. Saatsime kõigile e-kirja koos kalendrikutsega, mis sisaldab esimese korduva ürituse üksikasju.",
"emailed_you_and_any_other_attendees": "Saatsime selle teabega kõigile meili.",
"needs_to_be_confirmed_or_rejected": "Teie broneering tuleb veel kinnitada või tagasi lükata.",
"needs_to_be_confirmed_or_rejected_recurring": "Teie korduv koosolek tuleb veel kinnitada või tagasi lükata.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Tagasi broneeringute juurde",
"free_to_pick_another_event_type": "Valige igal ajal mõni muu sündmus.",
"cancelled": "Tühistatud",
"no_booking": "Broneering puudub",
"awaiting_host": "Ootab võõrustajat",
"cancellation_successful": "Tühistamine õnnestus",
"really_cancel_booking": "Kas tõesti tühistada oma broneering?",
"cannot_cancel_booking": "Sa ei saa seda broneeringut tühistada",
@@ -703,6 +712,9 @@
"no_teams": "Teil pole veel ühtegi meeskonda.",
"no_teams_description": "Meeskonnad võimaldavad teistel broneerida teie töökaaslaste vahel jagatud sündmusi.",
"submit": "Esita",
"confirm_remove_attribute": "Jah, eemalda atribuut",
"remove_attribute": "Eemalda atribuut",
"remove_attribute_confirmation_message": "Kas olete kindel, et soovite atribuudi '{{name}}' eemaldada? Kõik sellele määratud kasutajad eemaldatakse.",
"delete": "Kustuta",
"update": "Uuendus",
"save": "Salvesta",
@@ -1237,8 +1249,8 @@
"number_provided": "Telefoninumber antakse",
"before_event_trigger": "enne ürituse algust",
"event_cancelled_trigger": "Kui sündmus tühistatakse",
"after_hosts_cal_video_no_show": "Pärast seda, kui võõrustajad ei liitu Cal videokõnega",
"after_guests_cal_video_no_show": "Pärast seda, kui külalised ei liitu Cal videokõnega",
"after_hosts_cal_video_no_show": "Pärast seda, kui võõrustajad ei liitunud cal videoga",
"after_guests_cal_video_no_show": "Pärast seda, kui külalised ei liitunud cal videoga",
"new_event_trigger": "kui uus sündmus on broneeritud",
"email_host_action": "saada e-kiri hostile",
"email_attendee_action": "saada osalejatele e-kiri",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Marsruutimine",
"routing_forms_description": "Loo vormid osalejate suunamiseks õigetesse sihtkohtadesse",
"routing_forms_send_email_owner": "Saada e-kiri omanikule",
"routing_forms_send_email_owner_description": "Saadab vormi esitamisel omanikule meili",
@@ -1630,6 +1643,7 @@
"format": "Formaat",
"uppercase_for_letters": "Kasuta kõigi tähtede jaoks suurtähti",
"replace_whitespaces_underscores": "Asenda tühikud alakriipsudega",
"platform_billing": "Platvormi arveldus",
"manage_billing": "Arvelduse haldamine",
"manage_billing_description": "Hallake kõike arveldust",
"billing_freeplan_title": "Teil on praegu TASUTA plaan",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Kas otsite rohkem teadmisi?",
"filters": "Filtrid",
"add_filter": "Lisa filter",
"add_rule": "Lisa reegel",
"add_rule_group": "Lisa reeglite grupp",
"remove_filters": "Tühjenda kõik filtrid",
"email_verified": "E-post kinnitatud",
"select_user": "Vali kasutaja",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Seadistage oma organisatsioon",
"set_up_your_platform_organization": "Seadista oma platvorm",
"organizations_description": "Organisatsioonid on jagatud keskkonnad, kus meeskonnad saavad luua jagatud sündmuste tüüpe, rakendusi, töövooge ja palju muud.",
"plans": "Plaanid",
"platform": "Platvorm",
"platform_description": "Halda kõike platvormiga seonduvat.",
"platform_organization_description": "Platvorm Cal.com võimaldab teil ajakava hõlpsalt oma rakendusse integreerida, kasutades platvormi apisid ja aatomeid.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Valige mõned vabad ajad ja manustage need oma e-kirja",
"select_time": "Vali aeg",
"select_date": "Vali kuupäev",
"connecting_you_to_someone": "Me ühendame teid kellegagi.",
"connecting_you_to_someone": "Me ühendame teid kellegagi {{orgName}}-st.",
"please_do_not_close_this_tab": "Palun ärge sulgege ega värskendage seda lehte",
"see_all_available_times": "Vaata kõiki saadaolevaid aegu",
"org_team_names_example_1": "nt turundusmeeskond",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Istme valik ei toeta mitut kestust",
"include_calendar_event": "Kaasa kalendrisündmus",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuth kliendi loomise vorm",
"oAuth_client_creation_form_description": "See on vorm uue OAuth kliendi loomiseks",
"oAuth_client_updation_form": "OAuth kliendi uuendamise vorm",
"oAuth_client_updation_form_description": "See on vorm olemasoleva OAuth kliendi muutmiseks",
"recently_added": "Viimati lisatud",
"connect_all_calendars": "Ühenda kõik oma kalendrid",
"connect_all_calendars_description": "{{appName}} loeb saadavust kõigist teie olemasolevatest kalendritest",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Broneerimispiirangud on edukalt uuendatud",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Teil puuduvad õigused selle broneeringu muutmiseks",
"matching_members": "Sobivad liikmed",
"matching_members_queue_using_attribute_weights": "Liikmete järjekord vastavalt atribuudi kaaludele",
"matching_members_queue_using_event_assignee_weights": "Liikmete järjekord vastavalt sündmuse määratud isiku kaaludele",
"no_matching_members": "Sobivaid liikmeid ei leitud. Kasutatakse sündmuse tüübile määratud meeskonnaliikmeid.",
"no_matching_members_will_fallback_to_all_assigned_members": "Sobivaid liikmeid ei leitud. Kasutatakse sündmuse tüübile määratud meeskonnaliikmeid. Kaaluge varuvariant lisada või parandada using_fallback_members loogikat",
"hide_calendar_event_details": "Peida kalendrisündmuste üksikasjad jagatud kalendrites",
@@ -2704,6 +2727,8 @@
"add_new_field": "Lisa uus väli",
"you_dont_have_access_to_reroute_this_booking": "Sul pole õigust seda broneeringut ümber suunata",
"form_response_not_found": "Vormi vastust ei leitud",
"contact_owner": "Kontakti omanik",
"contact_owner_not_found": "Ei leitud",
"using_fallback_members": "Kasutatakse varuliikmeid",
"chosen_route": "Valitud tee",
"attribute_logic_matched": "Atribuudi loogika sobis",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Sündmuse lõpuaeg osaleja ajavööndis",
"salesforce_create_event_on_contact": "Loo sündmus kontaktil, kui see eksisteerib. Vastasel juhul kasuta liidi",
"salesforce_owner_name_to_change": "Muudetava omaniku nimi",
"dont_have_access_this_page": "Teil ei ole sellele lehele juurdepääsu",
"you_need_admin_or_owner_privileges_to_access": "Selle lehe vaatamiseks või sellega suhtlemiseks peate omama administraatori või omaniku õigusi",
"field_type": "Välja tüüp",
"when_to_write": "Millal kirjutada",
"salesforce_on_booking_write_to_record": "Broneeringu korral kirjuta osaleja {{record}} kirje kohandatud väljale",
"on_every_booking": "Iga broneeringu korral",
"only_if_field_is_empty": "Ainult kui väli on tühi",
"booking_start_date": "Broneeringu alguskuupäev",
"booking_created_date": "Broneeringu loomise kuupäev",
"booking_reassigned_to_host": "Broneering määrati ümber {{host}}-le",
"no_contact_owner": "Kontakti omanik puudub",
"routing_forms_created": "Marsruutimisvormid loodud",
"routing_forms_total_responses": "Kokku vastuseid",
"routing_forms_total_responses_without_booking": "Vastused ilma broneeringuta",
"routing_forms_total_responses_with_booking": "Vastused broneeringuga",
"routing_form_insights": "Broneeringud puuduvad",
"routing_form_insights_form_name_header": "Vormi nimi",
"routing_form_insights_booking_status_header": "Broneering",
"routing_form_insights_response_no_booking": "Broneering puudub",
"routing_form_insights_booked_by": "Broneeris",
"routing_form_insights_created_at": "Loodud",
"routing_form_insights_booking_status": "Broneeringu staatus",
"routing_form_insights_booking_at": "Broneeritud",
"routing_form_insights_submitted_at": "Esitatud",
"access_denied": "Juurdepääs keelatud",
"salesforce_route_to_owner": "Kontakti omanik on round robin host, kui saadaval",
"salesforce_do_not_route_to_owner": "Kontakti omanikku ei sunnita (võib siiski olla host, kui vastab atribuutidele ja round robin kriteeriumitele)",
"salesforce_route_to_custom_lookup_field": "Suuna kasutajale, kes vastab konto otsinguväljale",
"salesforce_option": "Salesforce'i valik",
"lookup_field_name": "Otsinguvälja nimi",
"rr_distribution_method": "Jaotamine",
"rr_distribution_method_description": "Võimaldab optimeerida jaotust maksimaalseks kättesaadavuseks või tasakaalustatumaks määramiseks.",
"rr_distribution_method_availability_title": "Maksimeeri kättesaadavus",
"rr_distribution_method_availability_description": "Võimaldab broneerijatel broneerida kohtumisi alati, kui võõrustaja on saadaval. Kasutage seda, et maksimeerida potentsiaalsete broneeritud kohtumiste arvu, kui kohtumiste ühtlane jaotamine võõrustajate vahel on vähem oluline.",
"rr_distribution_method_balanced_title": "Koormuse tasakaalustamine",
"rr_distribution_method_balanced_description": "Jälgime, kui palju broneeringuid on tehtud iga võõrustajaga ja võrdleme seda teistega, keelates mõned võõrustajad, kes on liiga kaugel ees, et broneeringud oleksid ühtlaselt jaotatud.",
"exclude_emails_that_contain": "Välista e-kirjad, mis sisaldavad ...",
"exclude_emails_match_found_error_message": "Palun sisestage kehtiv tööalane e-posti aadress",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Replanification requise : veuillez réserver un nouveau créneau pour {{eventType}} avec {{name}}",
"hi_user_name": "Bonjour {{name}}",
"ics_event_title": "{{eventType}} avec {{name}}",
"please_book_a_time_sometime_later": "Oups, nous n'avons pas pu vous connecter cette fois-ci. Veuillez plutôt planifier un appel ultérieur",
"please_book_a_time_sometime_later": "Il semble que tous nos experts soient occupés pour le moment. Veuillez planifier un appel à un moment qui vous convient le mieux et nous serons prêts à vous aider.",
"schedule_instead": "Planifier à la place",
"new_event_subject": "Nouvel événement : {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Rejoindre par {{entryPoint}}",
"notes": "Notes",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook désactivé",
"webhook_response": "Réponse du webhook",
"webhook_test": "Test du webhook",
"webhook_update_form": "Formulaire de mise à jour du webhook",
"webhook_update_form_description": "Ajoutez un webhook à votre client OAuth.",
"manage_your_webhook": "Gérez votre webhook",
"webhook_created_successfully": "Webhook créé avec succès !",
"webhook_updated_successfully": "Webhook mis à jour avec succès !",
@@ -348,9 +351,13 @@
"other": "Autre",
"email_sign_in_subject": "Votre lien de connexion pour {{appName}}",
"round_robin_emailed_you_and_attendees": "Vous avez rendez-vous avec {{user}}. Nous avons envoyé un e-mail avec une invitation de calendrier comprenant les détails à tout le monde.",
"round_robin_emailed_host_and_attendee": "{{host}} a un rendez-vous avec {{attendee}}. Nous avons envoyé un e-mail avec une invitation calendrier contenant tous les détails aux participants.",
"emailed_you_and_attendees": "Nous avons envoyé un e-mail avec une invitation de calendrier comprenant les détails à tout le monde.",
"emailed_host_and_attendee": "Nous avons envoyé un e-mail avec une invitation calendrier contenant tous les détails aux participants.",
"emailed_you_and_attendees_recurring": "Nous avons envoyé un e-mail avec une invitation de calendrier comprenant les détails à tout le monde pour le premier de ces événements récurrents.",
"round_robin_emailed_you_and_attendees_recurring": "Vous avez rendez-vous avec {{user}}. Nous avons envoyé un e-mail avec une invitation de calendrier comprenant les détails à tout le monde pour le premier de ces événements récurrents.",
"emailed_host_and_attendee_recurring": "Nous avons envoyé un e-mail avec une invitation calendrier contenant tous les détails aux participants pour le premier de ces événements récurrents.",
"round_robin_emailed_you_and_attendees_recurring": "Vous avez un rendez-vous avec {{user}}. Nous avons envoyé un e-mail avec une invitation calendrier contenant tous les détails aux participants pour le premier de ces événements récurrents.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} a un rendez-vous avec {{attendee}}. Nous avons envoyé un e-mail avec une invitation calendrier contenant tous les détails aux participants pour le premier de ces événements récurrents.",
"emailed_you_and_any_other_attendees": "Nous avons envoyé cette information à tout le monde par e-mail.",
"needs_to_be_confirmed_or_rejected": "Votre réservation doit encore être confirmée ou refusée.",
"needs_to_be_confirmed_or_rejected_recurring": "Votre rendez-vous récurrent doit encore être confirmé ou refusé.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Retour aux réservations",
"free_to_pick_another_event_type": "N'hésitez pas à choisir un autre événement à tout moment.",
"cancelled": "Annulées",
"no_booking": "Aucune réservation",
"awaiting_host": "En attente de l'hôte",
"cancellation_successful": "Annulation réussie",
"really_cancel_booking": "Voulez-vous vraiment annuler votre réservation ?",
"cannot_cancel_booking": "Vous ne pouvez pas annuler cette réservation",
@@ -703,6 +712,9 @@
"no_teams": "Vous n'avez pas encore d'équipe.",
"no_teams_description": "Les équipes permettent aux autres de réserver des événements partagés entre vos collègues.",
"submit": "Envoyer",
"confirm_remove_attribute": "Oui, supprimer l'attribut",
"remove_attribute": "Supprimer l'attribut",
"remove_attribute_confirmation_message": "Êtes-vous sûr de vouloir supprimer l'attribut '{{name}}' ? Tous les utilisateurs actuellement assignés à cet attribut seront désassignés.",
"delete": "Supprimer",
"update": "Mettre à jour",
"save": "Enregistrer",
@@ -1237,8 +1249,8 @@
"number_provided": "Un numéro de téléphone sera fourni",
"before_event_trigger": "avant le début de l'événement",
"event_cancelled_trigger": "lorsque l'événement est annulé",
"after_hosts_cal_video_no_show": "Après que les hôtes ne rejoignent pas la vidéo Cal",
"after_guests_cal_video_no_show": "Après que les invités ne rejoignent pas la vidéo Cal",
"after_hosts_cal_video_no_show": "Après que les hôtes ne se sont pas connectés à l'appel vidéo",
"after_guests_cal_video_no_show": "Après que les invités ne se sont pas connectés à l'appel vidéo",
"new_event_trigger": "lorsqu'un nouvel événement est réservé",
"email_host_action": "envoyer un e-mail à l'hôte",
"email_attendee_action": "envoyer un e-mail aux participants",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Routage",
"routing_forms_description": "Créez des formulaires pour acheminer les participants vers les bonnes destinations.",
"routing_forms_send_email_owner": "Envoyer un e-mail au propriétaire",
"routing_forms_send_email_owner_description": "Envoie un e-mail au propriétaire lorsque le formulaire est soumis",
@@ -1630,6 +1643,7 @@
"format": "Format",
"uppercase_for_letters": "Utilisez des majuscules pour toutes les lettres.",
"replace_whitespaces_underscores": "Remplacez les espaces par des tirets bas.",
"platform_billing": "Facturation de la plateforme",
"manage_billing": "Gérer la facturation",
"manage_billing_description": "Gérez tout ce qui est en lien avec la facturation.",
"billing_freeplan_title": "Vous êtes actuellement sur le plan Gratuit",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Vous cherchez plus de statistiques ?",
"filters": "Filtres",
"add_filter": "Ajouter un filtre",
"add_rule": "Ajouter une règle",
"add_rule_group": "Ajouter un groupe de règles",
"remove_filters": "Effacer les filtres",
"email_verified": "E-mail vérifié",
"select_user": "Sélectionner un utilisateur",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Configurer votre organisation",
"set_up_your_platform_organization": "Configurer votre plateforme",
"organizations_description": "Les organisations sont des environnements partagés dans lesquels les équipes peuvent créer des types d'événements partagés, des applications, des workflows, etc.",
"plans": "Plans",
"platform": "Plateforme",
"platform_description": "Gérez tout ce qui concerne la plateforme.",
"platform_organization_description": "La plateforme Cal.com vous permet d'intégrer sans effort la planification dans votre application en utilisant les API et atoms de la plateforme.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Sélectionnez quelques créneaux disponibles et intégrez-les dans votre e-mail.",
"select_time": "Sélectionner un créneau",
"select_date": "Sélectionner une date",
"connecting_you_to_someone": "Nous vous mettons en relation avec quelqu'un.",
"connecting_you_to_someone": "Nous vous mettons en relation avec quelqu'un de {{orgName}}.",
"please_do_not_close_this_tab": "Veuillez ne pas fermer ou actualiser cette page",
"see_all_available_times": "Voir tous les créneaux disponibles",
"org_team_names_example_1": "p. ex. Équipe marketing",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "L'option par place ne prend pas en charge les durées multiples",
"include_calendar_event": "Inclure l'événement du calendrier",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formulaire de création de client OAuth",
"oAuth_client_creation_form_description": "Ceci est le formulaire pour créer un nouveau client OAuth",
"oAuth_client_updation_form": "Formulaire de mise à jour du client OAuth",
"oAuth_client_updation_form_description": "Ceci est le formulaire pour modifier un client OAuth existant",
"recently_added": "Ajoutées récemment",
"connect_all_calendars": "Connectez vos calendriers",
"connect_all_calendars_description": "{{appName}} relève la disponibilité de tous vos calendriers existants.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Limites de réservation mises à jour avec succès",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Vous n'êtes pas autorisé à apporter cette modification à la réservation",
"matching_members": "Membres correspondants",
"matching_members_queue_using_attribute_weights": "File d'attente des membres correspondants (selon les pondérations d'attributs)",
"matching_members_queue_using_event_assignee_weights": "File d'attente des membres correspondants (selon les pondérations des assignés à l'événement)",
"no_matching_members": "Aucun membre correspondant. Par défaut, les membres de l'équipe assignés au type d'événement seront utilisés.",
"no_matching_members_will_fallback_to_all_assigned_members": "Aucun membre correspondant. Le système utilisera par défaut les membres de l'équipe assignés au type d'événement. Envisagez d'ajouter une solution de repli ou de corriger la logique d'utilisation des membres de repli",
"hide_calendar_event_details": "Masquer les détails des événements du calendrier sur les calendriers partagés",
@@ -2704,6 +2727,8 @@
"add_new_field": "Ajouter un nouveau champ",
"you_dont_have_access_to_reroute_this_booking": "Vous n'avez pas accès pour rediriger cette réservation",
"form_response_not_found": "Réponse du formulaire non trouvée",
"contact_owner": "Propriétaire du contact",
"contact_owner_not_found": "Non trouvé",
"using_fallback_members": "Utilisation des membres de repli",
"chosen_route": "Itinéraire choisi",
"attribute_logic_matched": "Logique d'attribut correspondante",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Heure de fin de l'événement dans le fuseau horaire du participant",
"salesforce_create_event_on_contact": "Créer un événement sur le contact, s'il existe. Sinon, utiliser le lead comme alternative",
"salesforce_owner_name_to_change": "Nom du propriétaire à modifier",
"dont_have_access_this_page": "Vous n'avez pas accès à cette page",
"you_need_admin_or_owner_privileges_to_access": "Pour voir ou interagir avec cette page, vous devez avoir des privilèges d'administrateur ou de propriétaire",
"field_type": "Type de champ",
"when_to_write": "Quand écrire",
"salesforce_on_booking_write_to_record": "Lors de la réservation, écrire dans un champ personnalisé sur l'enregistrement {{record}} du participant",
"on_every_booking": "À chaque réservation",
"only_if_field_is_empty": "Seulement si le champ est vide",
"booking_start_date": "Date de début de la réservation",
"booking_created_date": "Date de création de la réservation",
"booking_reassigned_to_host": "Réservation réassignée à {{host}}",
"no_contact_owner": "Aucun propriétaire de contact",
"routing_forms_created": "Formulaires de routage créés",
"routing_forms_total_responses": "Réponses totales",
"routing_forms_total_responses_without_booking": "Réponses totales sans réservation",
"routing_forms_total_responses_with_booking": "Réponses totales avec réservation",
"routing_form_insights": "Aucune réservation",
"routing_form_insights_form_name_header": "Nom du formulaire",
"routing_form_insights_booking_status_header": "Réservation",
"routing_form_insights_response_no_booking": "Aucune réservation",
"routing_form_insights_booked_by": "Réservé par",
"routing_form_insights_created_at": "Créé le",
"routing_form_insights_booking_status": "Statut de la réservation",
"routing_form_insights_booking_at": "Réservé le",
"routing_form_insights_submitted_at": "Soumis le",
"access_denied": "Accès refusé",
"salesforce_route_to_owner": "Le propriétaire du contact sera l'hôte Round Robin si disponible",
"salesforce_do_not_route_to_owner": "Le propriétaire du contact ne sera pas forcé (peut toujours être l'hôte si cela correspond aux attributs et aux critères Round Robin)",
"salesforce_route_to_custom_lookup_field": "Acheminer vers un utilisateur correspondant à un champ de recherche sur un compte",
"salesforce_option": "Option Salesforce",
"lookup_field_name": "Nom du champ de recherche",
"rr_distribution_method": "Distribution",
"rr_distribution_method_description": "Permet d'optimiser la distribution pour une disponibilité maximale ou pour viser une répartition plus équilibrée.",
"rr_distribution_method_availability_title": "Maximiser la disponibilité",
"rr_distribution_method_availability_description": "Permet aux participants de réserver des réunions dès qu'un hôte est disponible. Utilisez cette option pour maximiser le nombre potentiel de réunions réservées lorsque la distribution équitable des réunions entre les hôtes est moins importante.",
"rr_distribution_method_balanced_title": "Équilibrage de charge",
"rr_distribution_method_balanced_description": "Nous surveillerons le nombre de réservations effectuées avec chaque hôte et le comparerons avec les autres, en désactivant certains hôtes trop en avance pour que les réservations soient réparties équitablement.",
"exclude_emails_that_contain": "Exclure les e-mails contenant ...",
"exclude_emails_match_found_error_message": "Veuillez entrer une adresse e-mail professionnelle valide",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Ajoutez vos nouvelles chaînes ci-dessus ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "הפעולה חייבה קביעת מועד חדש: יש לקבוע מועד חדש עבור {{eventType}} עם {{name}}",
"hi_user_name": "שלום {{name}}",
"ics_event_title": "{{eventType}} עם {{name}}",
"please_book_a_time_sometime_later": "אף אחד לא זמין כרגע. נא לקבוע זימון למועד אחר",
"please_book_a_time_sometime_later": "נראה שכל המומחים שלנו עסוקים כרגע. אנא קבע/י שיחה בזמן שנוח לך ונשמח לסייע לך.",
"schedule_instead": "לקבוע במקום",
"new_event_subject": "אירוע חדש: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "ניתן להצטרף עד {{entryPoint}}",
"notes": "הערות",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook מושבת",
"webhook_response": "תגובת Webhook",
"webhook_test": "בדיקת Webhook",
"webhook_update_form": "טופס עדכון Webhook",
"webhook_update_form_description": "הוסף webhook ללקוח OAuth שלך.",
"manage_your_webhook": "ניהול ה-Webhook שלך",
"webhook_created_successfully": "יצירת ה-Webhook בוצעה בהצלחה!",
"webhook_updated_successfully": "עדכון ה-Webhook בוצע בהצלחה!",
@@ -348,9 +351,13 @@
"other": "אחר",
"email_sign_in_subject": "קישור הכניסה שלך אל {{appName}}",
"round_robin_emailed_you_and_attendees": "נקבעה לך פגישה עם {{user}}. שלחנו לך ולמשתתפים האחרים הודעת דוא״ל עם הזמנה בלוח השנה הכוללת את כל הפרטים.",
"round_robin_emailed_host_and_attendee": "{{host}} נפגש/ת עם {{attendee}}. שלחנו לכולם אימייל עם הזמנה ליומן הכוללת את כל הפרטים.",
"emailed_you_and_attendees": "שלחנו לך ולמשתתפים האחרים הודעת דוא\"ל עם הזמנה בלוח השנה הכוללת את כל הפרטים.",
"emailed_host_and_attendee": "שלחנו לכולם אימייל עם הזמנה ליומן הכוללת את כל הפרטים.",
"emailed_you_and_attendees_recurring": "שלחנו לך ולמשתתפים האחרים הודעת דוא\"ל עם הזמנה בלוח השנה לאירוע הראשון מבין האירועים החוזרים האלה.",
"round_robin_emailed_you_and_attendees_recurring": "נקבעה לך פגישה עם {{user}}. שלחנו לך ולמשתתפים האחרים הודעת דוא״ל עם הזמנה בלוח השנה לאירוע הראשון מבין האירועים החוזרים האלה.",
"emailed_host_and_attendee_recurring": "שלחנו לכולם אימייל עם הזמנה ליומן הכוללת את הפרטים עבור האירוע הראשון בסדרת האירועים החוזרים.",
"round_robin_emailed_you_and_attendees_recurring": "את/ה נפגש/ת עם {{user}}. שלחנו לכולם אימייל עם הזמנה ליומן הכוללת את הפרטים עבור האירוע הראשון בסדרת האירועים החוזרים.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} נפגש/ת עם {{attendee}}. שלחנו לכולם אימייל עם הזמנה ליומן הכוללת את הפרטים עבור האירוע הראשון בסדרת האירועים החוזרים.",
"emailed_you_and_any_other_attendees": "שלחנו לך ולמשתתפים האחרים, אם ישנם כאלה, הודעת דוא\"ל עם הפרטים האלה.",
"needs_to_be_confirmed_or_rejected": "ההזמנה שלך עדיין ממתינה לאישור או לדחייה.",
"needs_to_be_confirmed_or_rejected_recurring": "עדיין לא אישרת/דחית את הפגישה החוזרת.",
@@ -403,6 +410,8 @@
"back_to_bookings": "בחזרה להזמנות",
"free_to_pick_another_event_type": "ניתן לבחור אירוע אחר בכל עת.",
"cancelled": "בוטלה",
"no_booking": "אין הזמנה",
"awaiting_host": "ממתין למארח",
"cancellation_successful": "פעולת הביטול בוצעה בהצלחה",
"really_cancel_booking": "בטוח שברצונך לבטל את ההזמנה?",
"cannot_cancel_booking": "לא ניתן לבטל את ההזמנה הזו",
@@ -703,6 +712,9 @@
"no_teams": "עדיין אין לך צוותים.",
"no_teams_description": "בעזרת צוותים, אנשים אחרים יכולים לקבוע מועד לאירועים המשותפים לעמיתיך.",
"submit": "שליחה",
"confirm_remove_attribute": "כן, הסר את המאפיין",
"remove_attribute": "הסר מאפיין",
"remove_attribute_confirmation_message": "האם אתה בטוח שברצונך להסיר את המאפיין '{{name}}'? כל המשתמשים המוקצים לו יוסרו.",
"delete": "מחיקה",
"update": "עדכון",
"save": "שמירה",
@@ -1237,8 +1249,8 @@
"number_provided": "מספר הטלפון יסופק",
"before_event_trigger": "לפני שהאירוע מתחיל",
"event_cancelled_trigger": "כאשר אירוע מבוטל",
"after_hosts_cal_video_no_show": "לאחר שהמארחים לא מצטרפים לשיחת הווידאו ב-Cal",
"after_guests_cal_video_no_show": "לאחר שהאורחים לא מצטרפים לשיחת הווידאו ב-Cal",
"after_hosts_cal_video_no_show": "לאחר שהמארחים לא הצטרפו לשיחת הוידאו",
"after_guests_cal_video_no_show": "לאחר שהאורחים לא הצטרפו לשיחת הוידאו",
"new_event_trigger": "כאשר אירוע חדש מוזמן",
"email_host_action": "שלח מייל למארח",
"email_attendee_action": "שליחת דוא\"ל למשתתפים",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "‎2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "ניתוב",
"routing_forms_description": "צור טפסים להפניית משתתפים ליעדים הנכונים",
"routing_forms_send_email_owner": "שליחת דוא\"ל לבעלים",
"routing_forms_send_email_owner_description": "דוא\"ל נשלח לבעלים לאחר שליחת הטופס",
@@ -1630,6 +1643,7 @@
"format": "פורמט",
"uppercase_for_letters": "שימוש באותיות רישיות עבור כל האותיות",
"replace_whitespaces_underscores": "החלפת רווחים במקפים תחתונים",
"platform_billing": "חיוב פלטפורמה",
"manage_billing": "ניהול החיוב",
"manage_billing_description": "ניהול כל מה שקשור לחיובים",
"billing_freeplan_title": "החבילה הנוכחית שלך היא החבילה החינמית",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "רוצה עוד Insights?",
"filters": "מסננים",
"add_filter": "הוסף סנן",
"add_rule": "הוסף כלל",
"add_rule_group": "הוסף קבוצת כללים",
"remove_filters": "ניקוי כל המסננים",
"email_verified": "כתובת הדוא״ל אומתה",
"select_user": "בחר משתמש",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "הגדרת הארגון שלך",
"set_up_your_platform_organization": "הגדרת הפלטפורמה שלך",
"organizations_description": "ארגונים הם סביבות משותפות שבהן צוותים יכולים ליצור משאבים משותפים, כמו סוגי אירועים, אפליקציות, תהליכי עבודה ועוד.",
"plans": "תוכניות",
"platform": "פלטפורמה",
"platform_description": "נהל את כל מה שקשור לפלטפורמה.",
"platform_organization_description": "פלטפורמת Cal.com מאפשרת לך לשלב תזמון בקלות באפליקציה שלך באמצעות APIs ו-atoms של הפלטפורמה.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "בחר/י כמה מועדים פנויים והטבע/י אותם בדוא\"ל",
"select_time": "בחירת שעה",
"select_date": "בחירת תאריך",
"connecting_you_to_someone": "אנו מחברים אותך למישהו או מישהי.",
"connecting_you_to_someone": "אנו מחברים אותך למישהו מ-{{orgName}}.",
"please_do_not_close_this_tab": "אנא אל תסגור או תרענן דף זה",
"see_all_available_times": "לצפייה בכל המועדים הפנויים",
"org_team_names_example_1": "לדוגמה, מחלקת שיווק",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "האפשרויות של הושבה במקומות לא תומכות במשכי זמן שונים",
"include_calendar_event": "כלילת אירוע מלוח השנה",
"oAuth": "OAuth",
"oAuth_client_creation_form": "טופס יצירת לקוח OAuth",
"oAuth_client_creation_form_description": "זהו הטופס ליצירת לקוח OAuth חדש",
"oAuth_client_updation_form": "טופס עדכון לקוח OAuth",
"oAuth_client_updation_form_description": "זהו הטופס לעריכת לקוח OAuth קיים",
"recently_added": "נוספו לאחרונה",
"connect_all_calendars": "חבר את כל לוחות השנה שלך",
"connect_all_calendars_description": "{{appName}} קורא את הזמינות מכל לוחות השנה הקיימים שלך.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "מגבלות ההזמנה עודכנו בהצלחה",
"you_are_unauthorized_to_make_this_change_to_the_booking": "אין לך הרשאה לבצע שינוי זה בהזמנה",
"matching_members": "חברים תואמים",
"matching_members_queue_using_attribute_weights": "תור התאמת חברים (באמצעות משקלי מאפיינים)",
"matching_members_queue_using_event_assignee_weights": "תור התאמת חברים (באמצעות משקלי מוקצים לאירוע)",
"no_matching_members": "אין חברים תואמים. המערכת תשתמש בחברי הצוות שהוקצו לסוג האירוע.",
"no_matching_members_will_fallback_to_all_assigned_members": "אין חברי צוות תואמים. יחזור לשימוש בחברי הצוות המשויכים לסוג האירוע. שקול להוסיף גיבוי או לתקן את הלוגיקה של using_fallback_members",
"hide_calendar_event_details": "הסתר פרטי אירועי לוח שנה בלוחות שנה משותפים",
@@ -2704,6 +2727,8 @@
"add_new_field": "הוסף שדה חדש",
"you_dont_have_access_to_reroute_this_booking": "אין לך גישה לניתוב מחדש של הזמנה זו",
"form_response_not_found": "תגובת הטופס לא נמצאה",
"contact_owner": "בעל הקשר",
"contact_owner_not_found": "לא נמצא",
"using_fallback_members": "משתמש בחברי גיבוי",
"chosen_route": "מסלול נבחר",
"attribute_logic_matched": "לוגיקת המאפיינים תואמת",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "זמן סיום האירוע באזור הזמן של המשתתף",
"salesforce_create_event_on_contact": "צור אירוע על איש קשר, אם קיים. אחרת, חזור ללידים",
"salesforce_owner_name_to_change": "שם הבעלים לשינוי",
"dont_have_access_this_page": "אין לך גישה לדף זה",
"you_need_admin_or_owner_privileges_to_access": "כדי לצפות או לפעול בדף זה, עליך להיות בעל הרשאות מנהל או בעלים",
"field_type": "סוג שדה",
"when_to_write": "מתי לכתוב",
"salesforce_on_booking_write_to_record": "בעת הזמנה, כתוב לשדה מותאם אישית ברשומת המשתתף {{record}}",
"on_every_booking": "בכל הזמנה",
"only_if_field_is_empty": "רק אם השדה ריק",
"booking_start_date": "תאריך תחילת ההזמנה",
"booking_created_date": "תאריך יצירת ההזמנה",
"booking_reassigned_to_host": "ההזמנה הועברה למארח {{host}}",
"no_contact_owner": "אין בעל קשר",
"routing_forms_created": "טפסי ניתוב נוצרו",
"routing_forms_total_responses": "סך כל התגובות",
"routing_forms_total_responses_without_booking": "סך כל התגובות ללא הזמנה",
"routing_forms_total_responses_with_booking": "סך כל התגובות עם הזמנה",
"routing_form_insights": "אין הזמנות",
"routing_form_insights_form_name_header": "שם הטופס",
"routing_form_insights_booking_status_header": "סטטוס הזמנה",
"routing_form_insights_response_no_booking": "אין הזמנה",
"routing_form_insights_booked_by": "הוזמן על ידי",
"routing_form_insights_created_at": "נוצר ב-",
"routing_form_insights_booking_status": "סטטוס הזמנה",
"routing_form_insights_booking_at": "מועד ההזמנה",
"routing_form_insights_submitted_at": "מועד ההגשה",
"access_denied": "הגישה נדחתה",
"salesforce_route_to_owner": "בעל איש הקשר יהיה מארח ה-Round Robin אם זמין",
"salesforce_do_not_route_to_owner": "בעל איש הקשר לא יהיה מאולץ (עדיין יכול להיות מארח אם תואם את המאפיינים וקריטריוני ה-Round Robin)",
"salesforce_route_to_custom_lookup_field": "נתב למשתמש התואם לשדה חיפוש בחשבון",
"salesforce_option": "אפשרות Salesforce",
"lookup_field_name": "שם שדה החיפוש",
"rr_distribution_method": "שיטת חלוקה",
"rr_distribution_method_description": "מאפשר אופטימיזציה של החלוקה למקסימום זמינות או לחלוקה מאוזנת יותר",
"rr_distribution_method_availability_title": "מקסום זמינות",
"rr_distribution_method_availability_description": "מאפשר לקובעי פגישות לקבוע פגישות בכל פעם שמארח זמין. השתמשו באפשרות זו כדי למקסם את מספר הפגישות הפוטנציאליות ובמקרים בהם חלוקה שווה של פגישות בין המארחים פחות חשובה",
"rr_distribution_method_balanced_title": "איזון עומסים",
"rr_distribution_method_balanced_description": "אנחנו נעקוב אחר מספר ההזמנות שנקבעו עם כל מארח ונשווה זאת לאחרים, תוך השבתה זמנית של מארחים שקיבלו יותר מדי הזמנות כדי להבטיח חלוקה שווה",
"exclude_emails_that_contain": "הוצא כתובות דוא\"ל המכילות...",
"exclude_emails_match_found_error_message": "אנא הזן כתובת דוא\"ל עבודה תקינה",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Átütmezés szükséges: Kérlek foglalj új időpontot a következőre: {{eventType}}, {{name}}",
"hi_user_name": "Szia {{name}}",
"ics_event_title": "{{eventType}} a következővel: {{name}}",
"please_book_a_time_sometime_later": "Hoppá, ezúttal nem tudtuk összekapcsolni. Kérjük, ütemezzen be egy jövőbeli hívást",
"please_book_a_time_sometime_later": "Úgy tűnik, hogy szakértőink jelenleg mind elfoglaltak. Kérjük, foglaljon időpontot egy önnek megfelelő időpontra, és készséggel állunk majd rendelkezésére.",
"schedule_instead": "Időpontfoglalás",
"new_event_subject": "Új esemény: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Csatlakozás a következővel: {{entryPoint}}",
"notes": "Jegyzetek",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook letiltva",
"webhook_response": "Webhook válasza",
"webhook_test": "Webhook teszt",
"webhook_update_form": "Webhook frissítési űrlap",
"webhook_update_form_description": "Webhook hozzáadása az OAuthClient-hez.",
"manage_your_webhook": "Webhookjaid kezelése",
"webhook_created_successfully": "Webhook sikeresen létrehozva!",
"webhook_updated_successfully": "Webhook sikeresen frissítve!",
@@ -348,9 +351,13 @@
"other": "Egyéb",
"email_sign_in_subject": "Bejelentkezési link a következőhöz: {{appName}}",
"round_robin_emailed_you_and_attendees": "Találkotó a következővel: {{user}}. Mindenkinek küldtünk egy naptári meghívót a részletekkel.",
"round_robin_emailed_host_and_attendee": "{{host}} találkozik {{attendee}} résztvevővel. Mindenkinek küldtünk egy e-mailt a naptári meghívóval és a részletekkel.",
"emailed_you_and_attendees": "Mindenkinek küldtünk egy e-mailt a naptár meghívóval és a részletekkel.",
"emailed_host_and_attendee": "Mindenkinek küldtünk egy e-mailt a naptári meghívóval és a részletekkel.",
"emailed_you_and_attendees_recurring": "Mindenkinek küldtünk e-mailben egy naptár meghívót a részletekkel az első ismétlődő eseményről.",
"round_robin_emailed_you_and_attendees_recurring": "Találkozó a következővel: {{user}}. E-mailben küldtünk egy naptári meghívót mindenkinek az első ismétlődő esemény részleteivel.",
"emailed_host_and_attendee_recurring": "Mindenkinek küldtünk egy e-mailt a naptári meghívóval és a részletekkel az ismétlődő események első alkalmára.",
"round_robin_emailed_you_and_attendees_recurring": "Ön találkozik {{user}} résztvevővel. Mindenkinek küldtünk egy e-mailt a naptári meghívóval és a részletekkel az ismétlődő események első alkalmára.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} találkozik {{attendee}} résztvevővel. Mindenkinek küldtünk egy e-mailt a naptári meghívóval és a részletekkel az ismétlődő események első alkalmára.",
"emailed_you_and_any_other_attendees": "Küldtünk egy e-mail-t mindenkinek ezekről az információkról.",
"needs_to_be_confirmed_or_rejected": "Foglalását még meg kell erősíteni vagy el kell utasítani.",
"needs_to_be_confirmed_or_rejected_recurring": "Az ismétlődő találkozót még meg kell erősíteni vagy el kell utasítani.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Vissza a foglalásokhoz",
"free_to_pick_another_event_type": "Nyugodtan válasszon másik eseményt bármikor.",
"cancelled": "Lemondva",
"no_booking": "Nincs foglalás",
"awaiting_host": "Várakozás a házigazdára",
"cancellation_successful": "Sikeres lemondás",
"really_cancel_booking": "Biztosan lemondod a foglalásod?",
"cannot_cancel_booking": "Ezt a foglalást nem tudod lemondani",
@@ -703,6 +712,9 @@
"no_teams": "Még nincs csapatod.",
"no_teams_description": "A csapatok lehetővé teszik mások számára, hogy lefoglalják a munkatársai között megosztott eseményeket.",
"submit": "Beküldés",
"confirm_remove_attribute": "Igen, az attribútum eltávolítása",
"remove_attribute": "Attribútum eltávolítása",
"remove_attribute_confirmation_message": "Biztosan el szeretné távolítani a(z) '{{name}}' attribútumot? Minden jelenleg hozzárendelt felhasználó hozzárendelése megszűnik.",
"delete": "Törlés",
"update": "Frissítés",
"save": "Mentés",
@@ -1237,8 +1249,8 @@
"number_provided": "A telefonszámot megadjuk",
"before_event_trigger": "az esemény kezdete előtt",
"event_cancelled_trigger": "amikor az esemény le lett mondva",
"after_hosts_cal_video_no_show": "Miután a házigazdák nem csatlakoznak a cal videóhoz",
"after_guests_cal_video_no_show": "Miután a vendégek nem csatlakoznak a cal videóhoz",
"after_hosts_cal_video_no_show": "Miután a házigazdák nem csatlakoztak a Cal videóhoz",
"after_guests_cal_video_no_show": "Miután a vendégek nem csatlakoztak a Cal videóhoz",
"new_event_trigger": "új esemény lefoglalásakor",
"email_host_action": "küldjön e-mailt a házigazdának",
"email_attendee_action": "küldjön e-mailt a résztvevőknek",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Útvonal",
"routing_forms_description": "Hozzon létre űrlapokat, amelyek a résztvevőket a megfelelő helyre irányítják",
"routing_forms_send_email_owner": "E-mail küldése a tulajdonosnak",
"routing_forms_send_email_owner_description": "Az űrlap elküldésekor e-mailt küld a tulajdonosnak",
@@ -1630,6 +1643,7 @@
"format": "Formátum",
"uppercase_for_letters": "Használjon nagybetűt minden betűhöz",
"replace_whitespaces_underscores": "Cserélje ki a szóközöket aláhúzásjelre",
"platform_billing": "Platform számlázás",
"manage_billing": "Számlázás kezelése",
"manage_billing_description": "Számlázással kapcsolatos teendők",
"billing_freeplan_title": "Jelenleg az INGYENES csomagban vagy",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "További információkra vágyik?",
"filters": "Szűrők",
"add_filter": "Szűrő hozzáadása",
"add_rule": "Szabály hozzáadása",
"add_rule_group": "Szabálycsoport hozzáadása",
"remove_filters": "Törölje az összes szűrőt",
"email_verified": "E-mail ellenőrizve",
"select_user": "Felhasználó kiválasztása",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Állítsa be szervezetét",
"set_up_your_platform_organization": "Állítsa be a platformot",
"organizations_description": "A szervezetek megosztott környezetek, ahol a csapatok megosztott eseménytípusokat, alkalmazásokat, munkafolyamatokat és egyebeket hozhatnak létre.",
"plans": "Csomagok",
"platform": "Platform",
"platform_description": "Kezelje a platformmal kapcsolatos összes tevékenységet.",
"platform_organization_description": "A Cal.com Platform segítségével könnyedén integrálhatja az ütemezést az alkalmazásba a platform apis és atomok segítségével.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Válasszon ki néhány elérhető időpontot, és ágyazza be e-mailjeibe",
"select_time": "Válasszon időt",
"select_date": "Válasszon dátumot",
"connecting_you_to_someone": "Összekapcsolunk valakivel.",
"connecting_you_to_someone": "Kapcsolatba hozzuk egy {{orgName}} munkatársával.",
"please_do_not_close_this_tab": "Kérjük, ne zárja be vagy frissítse ezt az oldalt",
"see_all_available_times": "Az összes elérhető időpont megtekintése",
"org_team_names_example_1": "például. Marketing Csapat",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Az hely opció nem támogatja a több időtartamot",
"include_calendar_event": "Tartalmazza a naptári eseményt",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuth kliens létrehozási űrlap",
"oAuth_client_creation_form_description": "Ez az űrlap új OAuth kliens létrehozásához",
"oAuth_client_updation_form": "OAuth kliens frissítési űrlap",
"oAuth_client_updation_form_description": "Ez az űrlap egy meglévő OAuth kliens szerkesztéséhez",
"recently_added": "Nemrég hozzáadott",
"connect_all_calendars": "Csatlakoztassa az összes naptárát",
"connect_all_calendars_description": "A {{appName}} beolvassa az elérhetőséget az összes meglévő naptárából.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "A foglalási korlátok sikeresen frissítve",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Nincs jogosultsága a foglalás módosításához",
"matching_members": "Megfelelő tagok",
"matching_members_queue_using_attribute_weights": "Tagok sorba állítása (attribútum súlyozás alapján)",
"matching_members_queue_using_event_assignee_weights": "Tagok sorba állítása (esemény felelős súlyozás alapján)",
"no_matching_members": "Nincsenek megfelelő tagok. Az eseménytípushoz rendelt csapattagok kerülnek felhasználásra.",
"no_matching_members_will_fallback_to_all_assigned_members": "Nincs megfelelő tag. Visszaesik az eseménytípushoz rendelt csapattagok használatára. Fontolja meg egy tartalék hozzáadását vagy a using_fallback_members logika javítását",
"hide_calendar_event_details": "Naptáresemény részleteinek elrejtése megosztott naptárakon",
@@ -2704,6 +2727,8 @@
"add_new_field": "Új mező hozzáadása",
"you_dont_have_access_to_reroute_this_booking": "Nincs jogosultságod átirányítani ezt a foglalást",
"form_response_not_found": "Űrlap válasz nem található",
"contact_owner": "Kapcsolattartó",
"contact_owner_not_found": "Nem található",
"using_fallback_members": "Tartalék tagok használata",
"chosen_route": "Választott útvonal",
"attribute_logic_matched": "Attribútum logika egyezik",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Esemény befejezési ideje a résztvevő időzónájában",
"salesforce_create_event_on_contact": "Esemény létrehozása a kapcsolaton, ha létezik. Egyébként visszalépés a leadre",
"salesforce_owner_name_to_change": "Módosítandó tulajdonos neve",
"dont_have_access_this_page": "Nincs hozzáférése ehhez az oldalhoz",
"you_need_admin_or_owner_privileges_to_access": "Az oldal megtekintéséhez vagy használatához adminisztrátori vagy tulajdonosi jogosultság szükséges",
"field_type": "Mező típusa",
"when_to_write": "Mikor írjon",
"salesforce_on_booking_write_to_record": "Foglaláskor írjon egy egyéni mezőbe a résztvevő {{record}} rekordjában",
"on_every_booking": "Minden foglalásnál",
"only_if_field_is_empty": "Csak ha a mező üres",
"booking_start_date": "Foglalás kezdő dátuma",
"booking_created_date": "Foglalás létrehozásának dátuma",
"booking_reassigned_to_host": "Foglalás átirányítva a következő házigazdához: {{host}}",
"no_contact_owner": "Nincs kapcsolattartó",
"routing_forms_created": "Létrehozott útvonalformák",
"routing_forms_total_responses": "Összes válasz",
"routing_forms_total_responses_without_booking": "Összes válasz foglalás nélkül",
"routing_forms_total_responses_with_booking": "Összes válasz foglalással",
"routing_form_insights": "Nincs foglalás",
"routing_form_insights_form_name_header": "Űrlap neve",
"routing_form_insights_booking_status_header": "Foglalás",
"routing_form_insights_response_no_booking": "Nincs foglalás",
"routing_form_insights_booked_by": "Foglalva általa",
"routing_form_insights_created_at": "Létrehozva",
"routing_form_insights_booking_status": "Foglalás állapota",
"routing_form_insights_booking_at": "Foglalás időpontja",
"routing_form_insights_submitted_at": "Beküldés időpontja",
"access_denied": "Hozzáférés megtagadva",
"salesforce_route_to_owner": "A kapcsolattartó tulajdonosa lesz a round robin házigazda, ha elérhető",
"salesforce_do_not_route_to_owner": "A kapcsolattartó tulajdonosa nem lesz kötelező (továbbra is lehet házigazda, ha megfelel a tulajdonságoknak és a round robin kritériumoknak)",
"salesforce_route_to_custom_lookup_field": "Átirányítás olyan felhasználóhoz, aki megfelel a fiók keresési mezőjének",
"salesforce_option": "Salesforce beállítás",
"lookup_field_name": "Keresési mező neve",
"rr_distribution_method": "Elosztás",
"rr_distribution_method_description": "Lehetővé teszi az elosztás optimalizálását a maximális rendelkezésre állás érdekében, vagy a kiegyensúlyozottabb feladatkiosztás eléréséhez.",
"rr_distribution_method_availability_title": "Rendelkezésre állás maximalizálása",
"rr_distribution_method_availability_description": "Lehetővé teszi a foglalóknak, hogy találkozókat foglaljanak, amikor a házigazda elérhető. Használja ezt a lehetőséget a potenciális találkozók számának maximalizálására, amikor a találkozók egyenletes elosztása a házigazdák között kevésbé fontos.",
"rr_distribution_method_balanced_title": "Terheléselosztás",
"rr_distribution_method_balanced_description": "Figyelemmel kísérjük, hogy hány foglalás történt az egyes házigazdákkal, és összehasonlítjuk másokkal, letiltva azokat a házigazdákat, akik túl sok foglalással rendelkeznek, így a foglalások egyenletesen oszlanak el.",
"exclude_emails_that_contain": "Zárja ki azokat az e-maileket, amelyek tartalmazzák ...",
"exclude_emails_match_found_error_message": "Kérjük, adjon meg egy érvényes munkahelyi e-mail címet",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Adja hozzá az új karakterláncokat fent ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Azione richiesta per la riprogrammazione: prenota un nuovo orario per {{eventType}} con {{name}}",
"hi_user_name": "Ciao {{name}}",
"ics_event_title": "{{eventType}} con {{name}}",
"please_book_a_time_sometime_later": "Oops, non siamo riusciti a collegarti. Pianifica una chiamata futura",
"please_book_a_time_sometime_later": "Sembra che tutti i nostri esperti siano occupati al momento. Ti invitiamo a programmare una chiamata in un momento che ti sia più comodo e saremo pronti ad assisterti.",
"schedule_instead": "Programma invece",
"new_event_subject": "Richiesta di nuovo evento: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Entra da {{entryPoint}}",
"notes": "Osservazioni",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook Disabilitato",
"webhook_response": "Risposta Webhook",
"webhook_test": "Test Webhook",
"webhook_update_form": "Modulo di aggiornamento webhook",
"webhook_update_form_description": "Aggiungi un webhook al tuo OAuthClient.",
"manage_your_webhook": "Gestisci il tuo webhook",
"webhook_created_successfully": "Webhook creato con successo!",
"webhook_updated_successfully": "Webhook aggiornato con successo!",
@@ -348,9 +351,13 @@
"other": "Altro",
"email_sign_in_subject": "Link di accesso a {{appName}}",
"round_robin_emailed_you_and_attendees": "Avrai un incontro con {{user}}. Abbiamo inviato a tutti un'email di invito contenente tutte le informazioni.",
"round_robin_emailed_host_and_attendee": "{{host}} si incontra con {{attendee}}. Abbiamo inviato un'email con un invito al calendario con i dettagli a tutti.",
"emailed_you_and_attendees": "Abbiamo inviato via email a te e agli altri partecipanti un invito al calendario con tutti i dettagli.",
"emailed_host_and_attendee": "Abbiamo inviato un'email con un invito al calendario con i dettagli a tutti.",
"emailed_you_and_attendees_recurring": "Abbiamo inviato via email a te e agli altri partecipanti un invito al primo di questi eventi ricorrenti.",
"round_robin_emailed_you_and_attendees_recurring": "Avrai un incontro con {{user}}. Abbiamo inviato a tutti un'email di invito contenente tutte le informazioni per il primo di questi eventi ricorrenti.",
"emailed_host_and_attendee_recurring": "Abbiamo inviato un'email con un invito al calendario con i dettagli a tutti per il primo di questi eventi ricorrenti.",
"round_robin_emailed_you_and_attendees_recurring": "Ti incontri con {{user}}. Abbiamo inviato un'email con un invito al calendario con i dettagli a tutti per il primo di questi eventi ricorrenti.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} si incontra con {{attendee}}. Abbiamo inviato un'email con un invito al calendario con i dettagli a tutti per il primo di questi eventi ricorrenti.",
"emailed_you_and_any_other_attendees": "Tu e tutti gli altri partecipanti siete stati inviati via email con queste informazioni.",
"needs_to_be_confirmed_or_rejected": "La tua prenotazione deve ancora essere confermata o rifiutata.",
"needs_to_be_confirmed_or_rejected_recurring": "La tua riunione ricorrente deve ancora essere confermata o rifiutata.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Torna alle prenotazioni",
"free_to_pick_another_event_type": "Sentiti libero di scegliere un altro evento in qualsiasi momento.",
"cancelled": "Cancellato",
"no_booking": "Nessuna prenotazione",
"awaiting_host": "In attesa dell'host",
"cancellation_successful": "Cancellazione riuscita",
"really_cancel_booking": "Davvero vuoi annullare la prenotazione?",
"cannot_cancel_booking": "Non puoi annullare questa prenotazione",
@@ -703,6 +712,9 @@
"no_teams": "Non hai ancora alcun team.",
"no_teams_description": "I team permettono ad altri di prenotare eventi in condivisione con i tuoi collaboratori.",
"submit": "Invia",
"confirm_remove_attribute": "Sì, rimuovi attributo",
"remove_attribute": "Rimuovi attributo",
"remove_attribute_confirmation_message": "Sei sicuro di voler rimuovere l'attributo '{{name}}'? Tutti gli utenti attualmente assegnati verranno disassegnati.",
"delete": "Elimina",
"update": "Aggiorna",
"save": "Salva",
@@ -1237,8 +1249,8 @@
"number_provided": "Verrà fornito il numero di telefono",
"before_event_trigger": "prima dell'inizio dell'evento",
"event_cancelled_trigger": "quando l'evento viene cancellato",
"after_hosts_cal_video_no_show": "Dopo che gli host non si uniscono al video di Cal",
"after_guests_cal_video_no_show": "Dopo che gli ospiti non si uniscono al video di Cal",
"after_hosts_cal_video_no_show": "Dopo che gli host non si sono uniti alla videochiamata",
"after_guests_cal_video_no_show": "Dopo che gli ospiti non si sono uniti alla videochiamata",
"new_event_trigger": "quando viene prenotato un nuovo evento",
"email_host_action": "invia e-mail all'organizzatore",
"email_attendee_action": "invia e-mail ai partecipanti",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Instradamento",
"routing_forms_description": "Crea moduli per indirizzare i partecipanti alle destinazioni corrette",
"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",
@@ -1630,6 +1643,7 @@
"format": "Formato",
"uppercase_for_letters": "Usa tutte lettere maiuscole",
"replace_whitespaces_underscores": "Sostituisci spazi con sottolineature",
"platform_billing": "Fatturazione della piattaforma",
"manage_billing": "Gestisci fatturazione",
"manage_billing_description": "Gestisci tutto ciò che riguarda la fatturazione",
"billing_freeplan_title": "Attualmente stai usando il piano GRATUITO",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Ti servono più Insights?",
"filters": "Filtri",
"add_filter": "Aggiungi filtro",
"add_rule": "Aggiungi regola",
"add_rule_group": "Aggiungi gruppo di regole",
"remove_filters": "Cancella tutti i filtri",
"email_verified": "Email verificata",
"select_user": "Seleziona utente",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Imposta la tua organizzazione",
"set_up_your_platform_organization": "Configura la tua piattaforma",
"organizations_description": "Le organizzazioni sono ambienti condivisi dove i team possono creare e condividere tipi di eventi, applicazioni, flussi di lavoro e altro ancora.",
"plans": "Piani",
"platform": "Piattaforma",
"platform_description": "Gestisci tutto ciò che riguarda la piattaforma.",
"platform_organization_description": "La piattaforma Cal.com ti permette di integrare facilmente la pianificazione nella tua app utilizzando API e atom della piattaforma.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Seleziona alcuni orari disponibili e incorporali nella tua e-mail",
"select_time": "Seleziona l'ora",
"select_date": "Seleziona la data",
"connecting_you_to_someone": "Ti stiamo collegando con qualcuno.",
"connecting_you_to_someone": "Ti stiamo mettendo in contatto con qualcuno di {{orgName}}.",
"please_do_not_close_this_tab": "Per favore, non chiudere o aggiornare questa pagina",
"see_all_available_times": "Vedi tutti gli orari disponibili",
"org_team_names_example_1": "ad es., team di marketing",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "L'opzione di prenotazione dei posti non supporta durate multiple",
"include_calendar_event": "Includi evento del calendario",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Modulo di creazione client OAuth",
"oAuth_client_creation_form_description": "Questo è il modulo per creare un nuovo client OAuth",
"oAuth_client_updation_form": "Modulo di aggiornamento client OAuth",
"oAuth_client_updation_form_description": "Questo è il modulo per modificare un client OAuth esistente",
"recently_added": "Aggiunti di recente",
"connect_all_calendars": "Collega tutti i tuoi calendari",
"connect_all_calendars_description": "{{appName}} legge la disponibilità da tutti i tuoi calendari esistenti.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Limiti di prenotazione aggiornati con successo",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Non sei autorizzato a effettuare questa modifica alla prenotazione",
"matching_members": "Membri corrispondenti",
"matching_members_queue_using_attribute_weights": "Coda di membri corrispondenti (utilizzando i pesi degli attributi)",
"matching_members_queue_using_event_assignee_weights": "Coda di membri corrispondenti (utilizzando i pesi degli assegnatari dell'evento)",
"no_matching_members": "Nessun membro corrispondente. Verrà utilizzato il fallback con i membri del team assegnati al tipo di evento.",
"no_matching_members_will_fallback_to_all_assigned_members": "Nessun membro corrispondente. Si utilizzeranno i membri del team assegnati al tipo di evento come fallback. Considera di aggiungere un fallback o correggere la logica di using_fallback_members",
"hide_calendar_event_details": "Nascondi i dettagli degli eventi del calendario nei calendari condivisi",
@@ -2704,6 +2727,8 @@
"add_new_field": "Aggiungi nuovo campo",
"you_dont_have_access_to_reroute_this_booking": "Non hai l'accesso per reindirizzare questa prenotazione",
"form_response_not_found": "Risposta del modulo non trovata",
"contact_owner": "Proprietario del contatto",
"contact_owner_not_found": "Non trovato",
"using_fallback_members": "Utilizzo dei membri di fallback",
"chosen_route": "Percorso scelto",
"attribute_logic_matched": "Logica degli attributi corrispondente",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Ora di fine evento nel fuso orario del partecipante",
"salesforce_create_event_on_contact": "Crea evento sul contatto, se esiste. Altrimenti, passa al lead",
"salesforce_owner_name_to_change": "Nome del proprietario da modificare",
"dont_have_access_this_page": "Non hai accesso a questa pagina",
"you_need_admin_or_owner_privileges_to_access": "Per visualizzare o interagire con questa pagina, devi avere privilegi di amministratore o proprietario",
"field_type": "Tipo di campo",
"when_to_write": "Quando scrivere",
"salesforce_on_booking_write_to_record": "Al momento della prenotazione, scrivi in un campo personalizzato nel record {{record}} del partecipante",
"on_every_booking": "Ad ogni prenotazione",
"only_if_field_is_empty": "Solo se il campo è vuoto",
"booking_start_date": "Data di inizio prenotazione",
"booking_created_date": "Data di creazione della prenotazione",
"booking_reassigned_to_host": "Prenotazione riassegnata a {{host}}",
"no_contact_owner": "Nessun proprietario del contatto",
"routing_forms_created": "Moduli di instradamento creati",
"routing_forms_total_responses": "Risposte totali",
"routing_forms_total_responses_without_booking": "Risposte totali senza prenotazione",
"routing_forms_total_responses_with_booking": "Risposte totali con prenotazione",
"routing_form_insights": "Nessuna prenotazione",
"routing_form_insights_form_name_header": "Nome del modulo",
"routing_form_insights_booking_status_header": "Prenotazione",
"routing_form_insights_response_no_booking": "Nessuna prenotazione",
"routing_form_insights_booked_by": "Prenotato da",
"routing_form_insights_created_at": "Creato il",
"routing_form_insights_booking_status": "Stato della prenotazione",
"routing_form_insights_booking_at": "Data prenotazione",
"routing_form_insights_submitted_at": "Data invio",
"access_denied": "Accesso negato",
"salesforce_route_to_owner": "Il proprietario del contatto sarà l'host del Round Robin se disponibile",
"salesforce_do_not_route_to_owner": "Il proprietario del contatto non sarà obbligato (può comunque essere l'host se corrisponde agli attributi e ai criteri del Round Robin)",
"salesforce_route_to_custom_lookup_field": "Instrada a un utente che corrisponde a un campo di ricerca su un account",
"salesforce_option": "Opzione Salesforce",
"lookup_field_name": "Nome del campo di ricerca",
"rr_distribution_method": "Distribuzione",
"rr_distribution_method_description": "Permette di ottimizzare la distribuzione per massimizzare la disponibilità o per ottenere un'assegnazione più bilanciata.",
"rr_distribution_method_availability_title": "Massimizza disponibilità",
"rr_distribution_method_availability_description": "Permette ai prenotanti di fissare incontri ogni volta che un host è disponibile. Usa questa opzione per massimizzare il numero di potenziali incontri prenotabili e quando la distribuzione uniforme degli incontri tra gli host è meno importante.",
"rr_distribution_method_balanced_title": "Bilanciamento del carico",
"rr_distribution_method_balanced_description": "Monitoreremo quante prenotazioni sono state effettuate con ciascun host e le confronteremo con gli altri, disabilitando alcuni host che sono troppo avanti per garantire una distribuzione uniforme delle prenotazioni.",
"exclude_emails_that_contain": "Escludi le email che contengono ...",
"exclude_emails_match_found_error_message": "Inserisci un indirizzo email di lavoro valido",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Aggiungi le tue nuove stringhe qui sopra ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "スケジュール変更のアクションが必要です: {{name}} との {{eventType}} に新しい時間を予約してください",
"hi_user_name": "こんにちは、{{name}} さん",
"ics_event_title": "{{name}} との {{eventType}}",
"please_book_a_time_sometime_later": "おっと、今回は接続できませんでした。後で再度スケジュールしてください。",
"please_book_a_time_sometime_later": "現在、すべての専門家が対応中のようです。ご都合の良い時間にお電話を予約していただければ、準備してお待ちしております。",
"schedule_instead": "代わりに予約する",
"new_event_subject": "新規イベント: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "{{entryPoint}} に参加する",
"notes": "メモ",
@@ -198,6 +199,8 @@
"webhook_disabled": "ウェブフックは無効です",
"webhook_response": "ウェブフックの応答",
"webhook_test": "ウェブフックのテスト",
"webhook_update_form": "Webhookアップデートフォーム",
"webhook_update_form_description": "OAuthクライアントにWebhookを追加します。",
"manage_your_webhook": "ウェブフックの管理",
"webhook_created_successfully": "ウェブフックが正常に作成されました!",
"webhook_updated_successfully": "ウェブフックが正常に更新されました!",
@@ -348,9 +351,13 @@
"other": "その他",
"email_sign_in_subject": "{{appName}} のサインインリンク",
"round_robin_emailed_you_and_attendees": "{{user}}とのミーティングが設定されました。詳細を含むカレンダー招待を全員にメールで送信しました。",
"round_robin_emailed_host_and_attendee": "{{host}}が{{attendee}}と面談予定です。詳細を含む予定表の招待メールを全員に送信しました。",
"emailed_you_and_attendees": "あなたと他の出席者にすべての詳細を記載したカレンダーの招待状を電子メールで送信しました。",
"emailed_host_and_attendee": "詳細を含む予定表の招待メールを全員に送信しました。",
"emailed_you_and_attendees_recurring": "あなたと他の出席者にこの繰り返しイベント初回のカレンダーの招待状を電子メールで送信しました。",
"round_robin_emailed_you_and_attendees_recurring": "{{user}}との定期的なミーティングが設定されました。最初のイベントの詳細を含むカレンダー招待を全員にメールで送信しました。",
"emailed_host_and_attendee_recurring": "定期的な予定の最初の回について、詳細を含む予定表の招待メールを全員に送信しました。",
"round_robin_emailed_you_and_attendees_recurring": "あなたは{{user}}と面談予定です。定期的な予定の最初の回について、詳細を含む予定表の招待メールを全員に送信しました。",
"round_robin_emailed_host_and_attendee_recurring": "{{host}}が{{attendee}}と面談予定です。定期的な予定の最初の回について、詳細を含む予定表の招待メールを全員に送信しました。",
"emailed_you_and_any_other_attendees": "あなたと他の参加者にこの情報を電子メールで送信しました。",
"needs_to_be_confirmed_or_rejected": "予約は依然として確認または拒否が必要です。",
"needs_to_be_confirmed_or_rejected_recurring": "繰り返しミーティングは、まだ確認または拒否が必要です。",
@@ -403,6 +410,8 @@
"back_to_bookings": "予約に戻る",
"free_to_pick_another_event_type": "他の好きなイベントを選んでください。",
"cancelled": "キャンセル済み",
"no_booking": "予約なし",
"awaiting_host": "ホストを待機中",
"cancellation_successful": "キャンセルしました",
"really_cancel_booking": "本当に予約をキャンセルしますか?",
"cannot_cancel_booking": "この予約はキャンセルできません",
@@ -703,6 +712,9 @@
"no_teams": "まだチームがありません。",
"no_teams_description": "チームを使用することにより、同僚の間で共有されているイベントを予約できるようになります。",
"submit": "送信",
"confirm_remove_attribute": "はい、属性を削除します",
"remove_attribute": "属性を削除",
"remove_attribute_confirmation_message": "属性「{{name}}」を削除してもよろしいですか?現在この属性が割り当てられているすべてのユーザーの割り当てが解除されます。",
"delete": "削除",
"update": "更新",
"save": "保存",
@@ -1237,8 +1249,8 @@
"number_provided": "電話番号が提供されます",
"before_event_trigger": "イベント開始前に",
"event_cancelled_trigger": "イベントキャンセル時",
"after_hosts_cal_video_no_show": "ホストがCalビデオに参加しない場合",
"after_guests_cal_video_no_show": "ゲストがCalビデオに参加しない場合",
"after_hosts_cal_video_no_show": "ホストがCalビデオに参加しなかった後",
"after_guests_cal_video_no_show": "ゲストがCalビデオに参加しなかった後",
"new_event_trigger": "新しいイベント予約時に",
"email_host_action": "ホストにメールを送信",
"email_attendee_action": "出席者にメールを送る",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "ルーティング",
"routing_forms_description": "出席者を正しい目的地に案内するためのフォームを作成します。",
"routing_forms_send_email_owner": "所有者にメールを送信",
"routing_forms_send_email_owner_description": "フォームの送信時に所有者にメールを送信します",
@@ -1630,6 +1643,7 @@
"format": "書式",
"uppercase_for_letters": "すべての文字に大文字を使用する",
"replace_whitespaces_underscores": "空白をアンダーバー「 _ 」に置き換える",
"platform_billing": "プラットフォーム請求",
"manage_billing": "請求を管理する",
"manage_billing_description": "請求に関するすべての事柄を管理する",
"billing_freeplan_title": "あなたは現在、無料プランを利用しています",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Insights をさらにお探しですか?",
"filters": "フィルター",
"add_filter": "フィルターを追加",
"add_rule": "ルールを追加",
"add_rule_group": "ルールグループを追加",
"remove_filters": "すべてのフィルターをクリア",
"email_verified": "メール確認済み",
"select_user": "ユーザーを選択",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "組織をセットアップする",
"set_up_your_platform_organization": "プラットフォームを設定する",
"organizations_description": "組織は、チームが共有するイベントの種類、アプリ、ワークフローなどが作成可能な共有環境です。",
"plans": "プラン",
"platform": "プラットフォーム",
"platform_description": "プラットフォームに関連するすべてを管理します。",
"platform_organization_description": "Cal.comプラットフォームを使用すると、プラットフォームAPIとアトムを使用してスケジューリングをアプリに簡単に統合できます。",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "出席できる時間帯をいくつか選んで、メールに埋め込みます",
"select_time": "時間帯を選ぶ",
"select_date": "日付を選ぶ",
"connecting_you_to_someone": "誰かに接続しています。",
"connecting_you_to_someone": "{{orgName}}の担当者におつなぎしています。",
"please_do_not_close_this_tab": "このページを閉じたり、リフレッシュしたりしないでください",
"see_all_available_times": "出席できる時間帯をすべて表示",
"org_team_names_example_1": "例:マーケティングチーム",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "座席オプションは複数の期間をサポートしていません",
"include_calendar_event": "カレンダーのイベントを含める",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuthクライアント作成フォーム",
"oAuth_client_creation_form_description": "これは新しいOAuthクライアントを作成するためのフォームです",
"oAuth_client_updation_form": "OAuthクライアント更新フォーム",
"oAuth_client_updation_form_description": "これは既存のOAuthクライアントを編集するためのフォームです",
"recently_added": "最近追加されました",
"connect_all_calendars": "すべてのカレンダーに接続",
"connect_all_calendars_description": "{{appName}}は、すべての既存のカレンダーから可用性を読み取ります。",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "予約制限が正常に更新されました",
"you_are_unauthorized_to_make_this_change_to_the_booking": "この予約の変更を行う権限がありません",
"matching_members": "一致するメンバー",
"matching_members_queue_using_attribute_weights": "メンバーのマッチングキュー(属性の重み付けを使用)",
"matching_members_queue_using_event_assignee_weights": "メンバーのマッチングキュー(イベント担当者の重み付けを使用)",
"no_matching_members": "一致するメンバーがいません。イベントタイプに割り当てられたチームメンバーが使用されます。",
"no_matching_members_will_fallback_to_all_assigned_members": "一致するメンバーがいません。イベントタイプに割り当てられたチームメンバーを使用します。フォールバックを追加するか、using_fallback_membersのロジックを修正することを検討してください",
"hide_calendar_event_details": "共有カレンダーのイベント詳細を非表示にする",
@@ -2704,6 +2727,8 @@
"add_new_field": "新しいフィールドを追加",
"you_dont_have_access_to_reroute_this_booking": "この予約を変更する権限がありません",
"form_response_not_found": "フォームの回答が見つかりません",
"contact_owner": "担当者",
"contact_owner_not_found": "見つかりません",
"using_fallback_members": "フォールバックメンバーを使用中",
"chosen_route": "選択されたルート",
"attribute_logic_matched": "属性ロジックが一致しました",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "参加者のタイムゾーンでのイベント終了時間",
"salesforce_create_event_on_contact": "連絡先が存在する場合はイベントを作成し、存在しない場合はリードにフォールバック",
"salesforce_owner_name_to_change": "変更する所有者名",
"dont_have_access_this_page": "このページにアクセスする権限がありません",
"you_need_admin_or_owner_privileges_to_access": "このページを表示または操作するには、管理者または所有者の権限が必要です",
"field_type": "フィールドタイプ",
"when_to_write": "書き込むタイミング",
"salesforce_on_booking_write_to_record": "予約時、参加者の{{record}}レコードのカスタムフィールドに書き込む",
"on_every_booking": "すべての予約時",
"only_if_field_is_empty": "フィールドが空の場合のみ",
"booking_start_date": "予約開始日",
"booking_created_date": "予約作成日",
"booking_reassigned_to_host": "予約が{{host}}に再割り当てされました",
"no_contact_owner": "担当者なし",
"routing_forms_created": "ルーティングフォーム作成済み",
"routing_forms_total_responses": "総回答数",
"routing_forms_total_responses_without_booking": "予約なしの総回答数",
"routing_forms_total_responses_with_booking": "予約ありの総回答数",
"routing_form_insights": "予約なし",
"routing_form_insights_form_name_header": "フォーム名",
"routing_form_insights_booking_status_header": "予約状況",
"routing_form_insights_response_no_booking": "予約なし",
"routing_form_insights_booked_by": "予約者",
"routing_form_insights_created_at": "作成日",
"routing_form_insights_booking_status": "予約状況",
"routing_form_insights_booking_at": "予約日時",
"routing_form_insights_submitted_at": "送信日時",
"access_denied": "アクセスが拒否されました",
"salesforce_route_to_owner": "可能な場合、取引先責任者の所有者がラウンドロビンのホストになります",
"salesforce_do_not_route_to_owner": "取引先責任者の所有者は強制されません(属性とラウンドロビンの基準に一致する場合はホストになる可能性があります)",
"salesforce_route_to_custom_lookup_field": "取引先の参照項目に一致するユーザーに割り当てる",
"salesforce_option": "Salesforceオプション",
"lookup_field_name": "参照項目名",
"rr_distribution_method": "配分方式",
"rr_distribution_method_description": "最大限の予約可能性を確保するため、または均等な配分を目指すための最適化が可能です。",
"rr_distribution_method_availability_title": "予約可能性を最大化",
"rr_distribution_method_availability_description": "ホストが対応可能な時はいつでも予約を受け付けることができます。潜在的な予約数を最大化したい場合や、ホスト間での予約の均等な配分が重要でない場合に使用します。",
"rr_distribution_method_balanced_title": "負荷分散",
"rr_distribution_method_balanced_description": "各ホストの予約数を監視し、他のホストと比較して予約数が多すぎるホストを一時的に無効にすることで、予約を均等に配分します。",
"exclude_emails_that_contain": "...を含むメールアドレスを除外",
"exclude_emails_match_found_error_message": "有効な勤務用メールアドレスを入力してください",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ この上に新しい文字列を追加してください ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "ត្រូវតែកាលវិភាគឡើងវិញ: សូមកក់ពេលវេលាថ្មីសម្រាប់ {{eventType}} ជាមួយ {{name}}",
"hi_user_name": "សួស្តី {{name}}",
"ics_event_title": "{{eventType}} ជាមួយ {{name}}",
"please_book_a_time_sometime_later": "សូមទោស យើងមិនអាចភ្ជាប់អ្នកបាននៅពេលនេះទេ។ សូមកំណត់ពេលហៅម្តងទៀត។",
"please_book_a_time_sometime_later": "មើលទៅអ្នកជំនាញរបស់យើងទាំងអស់កំពុងជាប់រវល់នៅពេលនេះ។ សូមកំណត់ពេលវេលាហៅទូរស័ព្ទនៅពេលដែលងាយស្រួលសម្រាប់អ្នក ហើយយើងនឹងត្រៀមខ្លួនជាស្រេចដើម្បីជួយអ្នក។",
"schedule_instead": "កំណត់ពេលវេលាជំនួសវិញ",
"new_event_subject": "ព្រឹត្តិការណ៍ថ្មី៖ {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "ចូលរួមដោយ {{entryPoint}}",
"notes": "កំណត់ចំណាំ",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook បានបិទ",
"webhook_response": "ការឆ្លើយតប Webhook",
"webhook_test": "តេស្ត Webhook",
"webhook_update_form": "ទម្រង់បច្ចុប្បន្នភាព Webhook",
"webhook_update_form_description": "បន្ថែម webhook ទៅកាន់ OAuthClient របស់អ្នក។",
"manage_your_webhook": "គ្រប់គ្រង webhook របស់អ្នក។",
"webhook_created_successfully": "Webhook បានបង្កើតដោយជោគជ័យ!",
"webhook_updated_successfully": "Webhook បានធ្វើបច្ចុប្បន្នភាពដោយជោគជ័យ!",
@@ -348,9 +351,13 @@
"other": "ផ្សេងទៀត",
"email_sign_in_subject": "តំណភ្ជាប់ចូលរបស់អ្នកសម្រាប់ {{appName}}",
"round_robin_emailed_you_and_attendees": "អ្នកកំពុងជួបជាមួយ {{user}}។ យើងបានផ្ញើអ៊ីមែលជាមួយការអញ្ជើញប្រតិទិនដែលមានព័ត៌មានលម្អិតទៅកាន់គ្រប់គ្នា។",
"round_robin_emailed_host_and_attendee": "{{host}} កំពុងជួបជាមួយ {{attendee}}។ យើងបានផ្ញើអ៊ីមែលដែលមានការអញ្ជើញកាលវិភាគជាមួយព័ត៌មានទៅអ្នកទាំងអស់គ្នា។",
"emailed_you_and_attendees": "យើងបានផ្ញើអ៊ីមែលជាមួយការអញ្ជើញប្រតិទិនដែលមានព័ត៌មានលម្អិតទៅកាន់គ្រប់គ្នា។",
"emailed_host_and_attendee": "យើងបានផ្ញើអ៊ីមែលដែលមានការអញ្ជើញកាលវិភាគជាមួយព័ត៌មានទៅអ្នកទាំងអស់គ្នា។",
"emailed_you_and_attendees_recurring": "យើងបានផ្ញើអ៊ីមែលជាមួយការអញ្ជើញប្រតិទិនដែលមានព័ត៌មានលម្អិតទៅកាន់គ្រប់គ្នាសម្រាប់ព្រឹត្តិការណ៍ដែលកើតឡើងជាថេរនេះ។",
"round_robin_emailed_you_and_attendees_recurring": "អ្នកកំពុងជួបជាមួយ {{user}}។ យើងបានផ្ញើអ៊ីមែលជាមួយការអញ្ជើញប្រតិទិនដែលមានព័ត៌មានលម្អិតទៅកាន់គ្រប់គ្នាសម្រាប់ព្រឹត្តិការណ៍ដែលកើតឡើងជាថេរនេះ។",
"emailed_host_and_attendee_recurring": "យើងបានផ្ញើអ៊ីមែលដែលមានការអញ្ជើញកាលវិភាគជាមួយព័ត៌មានទៅអ្នកទាំងអស់គ្នាសម្រាប់ព្រឹត្តិការណ៍ជាប្រចាំដំបូងនេះ។",
"round_robin_emailed_you_and_attendees_recurring": "អ្នកកំពុងជួបជាមួយ {{user}}។ យើងបានផ្ញើអ៊ីមែលដែលមានការអញ្ជើញកាលវិភាគជាមួយព័ត៌មានទៅអ្នកទាំងអស់គ្នាសម្រាប់ព្រឹត្តិការណ៍ជាប្រចាំដំបូងនេះ។",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} កំពុងជួបជាមួយ {{attendee}}។ យើងបានផ្ញើអ៊ីមែលដែលមានការអញ្ជើញកាលវិភាគជាមួយព័ត៌មានទៅអ្នកទាំងអស់គ្នាសម្រាប់ព្រឹត្តិការណ៍ជាប្រចាំដំបូងនេះ។",
"emailed_you_and_any_other_attendees": "យើងបានផ្ញើអ៊ីមែលទៅកាន់គ្រប់គ្នាជាមួយព័ត៌មាននេះ។",
"needs_to_be_confirmed_or_rejected": "ការកក់របស់អ្នកត្រូវការការបញ្ជាក់ឬបដិសេធ។",
"needs_to_be_confirmed_or_rejected_recurring": "ការជួបជុំជាថេររបស់អ្នកត្រូវការការបញ្ជាក់ឬបដិសេធ។",
@@ -403,6 +410,8 @@
"back_to_bookings": "ត្រឡប់ទៅការកក់",
"free_to_pick_another_event_type": "អាចជ្រើសរើសប្រភេទព្រឹត្តិការណ៍ផ្សេងទៀតបានគ្រប់ពេលវេលា។",
"cancelled": "បានលុបចោល",
"no_booking": "គ្មានការកក់",
"awaiting_host": "កំពុងរង់ចាំម្ចាស់",
"cancellation_successful": "ការលុបចោលបានជោគជ័យ",
"really_cancel_booking": "តើអ្នកពិតជាចង់លុបចោលការកក់របស់អ្នកមែនទេ?",
"cannot_cancel_booking": "អ្នកមិនអាចលុបចោលការកក់នេះបានទេ",
@@ -703,6 +712,9 @@
"no_teams": "អ្នកមិនមានក្រុមណាមួយនៅឡើយទេ។",
"no_teams_description": "ក្រុមអនុញ្ញាតឱ្យអ្នកដទៃកក់ព្រឹត្តិការណ៍ដែលចែករំលែករវាងមិត្តរួមការងាររបស់អ្នក។",
"submit": "ដាក់ស្នើ",
"confirm_remove_attribute": "បាទ/ចាស, លុបគុណលក្ខណៈ",
"remove_attribute": "លុបគុណលក្ខណៈ",
"remove_attribute_confirmation_message": "តើអ្នកប្រាកដថាចង់លុបគុណលក្ខណៈ '{{name}}' មែនទេ? អ្នកប្រើប្រាស់ទាំងអស់ដែលបានផ្ដល់ឱ្យវានឹងត្រូវបានដកចេញ។",
"delete": "លុប",
"update": "ធ្វើបច្ចុប្បន្នភាព",
"save": "រក្សាទុក",
@@ -1237,8 +1249,8 @@
"number_provided": "លេខទូរស័ព្ទនឹងត្រូវបានផ្តល់",
"before_event_trigger": "មុនព្រឹត្តិការណ៍ចាប់ផ្តើម",
"event_cancelled_trigger": "ពេលព្រឹត្តិការណ៍ត្រូវបានលុបចោល",
"after_hosts_cal_video_no_show": "បន្ទាប់ពីម្ចាស់ផ្ទះមិនចូលរួមវីដេអូ cal",
"after_guests_cal_video_no_show": "បន្ទាប់ពីភ្ញៀវមិនចូលរួមវីដេអូ cal",
"after_hosts_cal_video_no_show": "បន្ទាប់ពីម្ចាស់ផ្ទះមិនបានចូលរួមក្នុងវីដេអូ Cal",
"after_guests_cal_video_no_show": "បន្ទាប់ពីភ្ញៀវមិនបានចូលរួមក្នុងវីដេអូ Cal",
"new_event_trigger": "ពេលមានការកក់ព្រឹត្តិការណ៍ថ្មី",
"email_host_action": "ផ្ញើអ៊ីមែលទៅម្ចាស់",
"email_attendee_action": "ផ្ញើអ៊ីមែលទៅអ្នកចូលរួម",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "ការបញ្ជូនបន្ត",
"routing_forms_description": "បង្កើតទម្រង់ដើម្បីដឹកនាំអ្នកចូលរួមទៅកាន់គោលដៅត្រឹមត្រូវ",
"routing_forms_send_email_owner": "ផ្ញើអ៊ីមែលទៅម្ចាស់",
"routing_forms_send_email_owner_description": "ផ្ញើអ៊ីមែលទៅម្ចាស់នៅពេលទម្រង់ត្រូវបានដាក់ស្នើ",
@@ -1630,6 +1643,7 @@
"format": "ទ្រង់ទ្រាយ",
"uppercase_for_letters": "ប្រើអក្សរធំសម្រាប់អក្សរទាំងអស់",
"replace_whitespaces_underscores": "ជំនួសចន្លោះទទេដោយសញ្ញាគូសក្រោម",
"platform_billing": "ការគិតថ្លៃវេទិកា",
"manage_billing": "គ្រប់គ្រងវិក្កយបត្រ",
"manage_billing_description": "គ្រប់គ្រងរឿងទាំងអស់ដែលទាក់ទងនឹងវិក្កយបត្រ",
"billing_freeplan_title": "អ្នកកំពុងប្រើផែនការមិនគិតថ្លៃ",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "កំពុងស្វែងរកការយល់ដឹងបន្ថែម?",
"filters": "តម្រង",
"add_filter": "បន្ថែមតម្រង",
"add_rule": "បន្ថែមច្បាប់",
"add_rule_group": "បន្ថែមក្រុមច្បាប់",
"remove_filters": "សម្អាតតម្រងទាំងអស់",
"email_verified": "អ៊ីមែលបានផ្ទៀងផ្ទាត់",
"select_user": "ជ្រើសរើសអ្នកប្រើ",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "រៀបចំអង្គការរបស់អ្នក",
"set_up_your_platform_organization": "រៀបចំវេទិការបស់អ្នក",
"organizations_description": "អង្គការគឺជាបរិយាកាសចែករំលែកដែលក្រុមអាចបង្កើតប្រភេទព្រឹត្តិការណ៍ចែករំលែក កម្មវិធី ដំណើរការ និងច្រើនទៀត។",
"plans": "គម្រោង",
"platform": "វេទិកា",
"platform_description": "គ្រប់គ្រងអ្វីៗទាំងអស់ដែលទាក់ទងនឹងវេទិកា។",
"platform_organization_description": "វេទិកា Cal.com អនុញ្ញាតឱ្យអ្នករួមបញ្ចូលការកំណត់ពេលវេលាដោយគ្មានការលំបាកទៅក្នុងកម្មវិធីរបស់អ្នកដោយប្រើ apis និង atoms វេទិកា។",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "ជ្រើសរើសពេលវេលាដែលអាចប្រើបានប៉ុន្មាន និងបញ្ចូលវានៅក្នុងអ៊ីមែលរបស់អ្នក",
"select_time": "ជ្រើសរើសពេលវេលា",
"select_date": "ជ្រើសរើសកាលបរិច្ឆេទ",
"connecting_you_to_someone": "យើងកំពុងភ្ជាប់អ្នកទៅនរណាម្នាក់។",
"connecting_you_to_someone": "យើងកំពុងភ្ជាប់អ្នកទៅនរណាម្នាក់ពី {{orgName}}។",
"please_do_not_close_this_tab": "សូមកុំបិទ ឬធ្វើការបន្ទាន់សម័យទំព័រនេះ",
"see_all_available_times": "មើលពេលវេលាទាំងអស់ដែលអាចប្រើបាន",
"org_team_names_example_1": "ឧ. ក្រុមទីផ្សារ",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "ជម្រើសកៅអីមិនគាំទ្រចំនួនរយៈពេលច្រើនទេ",
"include_calendar_event": "រួមបញ្ចូលព្រឹត្តិការណ៍ប្រតិទិន",
"oAuth": "OAuth",
"oAuth_client_creation_form": "ទម្រង់បង្កើតអតិថិជន OAuth",
"oAuth_client_creation_form_description": "នេះគឺជាទម្រង់សម្រាប់បង្កើតអតិថិជន OAuth ថ្មី",
"oAuth_client_updation_form": "ទម្រង់ធ្វើបច្ចុប្បន្នភាពអតិថិជន OAuth",
"oAuth_client_updation_form_description": "នេះគឺជាទម្រង់សម្រាប់កែសម្រួលអតិថិជន OAuth ដែលមានស្រាប់",
"recently_added": "បានបន្ថែមថ្មីៗ",
"connect_all_calendars": "ភ្ជាប់ប្រតិទិនទាំងអស់របស់អ្នក",
"connect_all_calendars_description": "{{appName}} អានភាពទំនេរពីប្រតិទិនទាំងអស់ដែលមានរបស់អ្នក។",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "ដែនកំណត់ការកក់ត្រូវបានធ្វើបច្ចុប្បន្នភាពដោយជោគជ័យ",
"you_are_unauthorized_to_make_this_change_to_the_booking": "អ្នកមិនមានសិទ្ធិធ្វើការផ្លាស់ប្តូរនេះលើការកក់ទេ",
"matching_members": "សមាជិកដែលត្រូវគ្នា",
"matching_members_queue_using_attribute_weights": "ជួររៀងសមាជិកដែលត្រូវគ្នា (ប្រើទំងន់គុណលក្ខណៈ)",
"matching_members_queue_using_event_assignee_weights": "ជួររៀងសមាជិកដែលត្រូវគ្នា (ប្រើទំងន់អ្នកចាត់តាំងព្រឹត្តិការណ៍)",
"no_matching_members": "គ្មានសមាជិកដែលត្រូវគ្នា។ វានឹងត្រឡប់ទៅប្រើសមាជិកក្រុមដែលបានចាត់តាំងទៅប្រភេទព្រឹត្តិការណ៍។",
"no_matching_members_will_fallback_to_all_assigned_members": "គ្មានសមាជិកដែលត្រូវគ្នា។ វានឹងត្រឡប់ទៅប្រើសមាជិកក្រុមដែលបានចាត់តាំងឱ្យប្រភេទព្រឹត្តិការណ៍។ សូមពិចារណាបន្ថែមការត្រឡប់ក្រោយ ឬកែតម្រូវតក្កវិជ្ជានៃការប្រើប្រាស់សមាជិកត្រឡប់ក្រោយ",
"hide_calendar_event_details": "លាក់ព័ត៌មានលម្អិតនៃព្រឹត្តិការណ៍ប្រចាំប្រតិទិននៅលើប្រតិទិនដែលបានចែករំលែក",
@@ -2704,6 +2727,8 @@
"add_new_field": "បន្ថែមវាលថ្មី",
"you_dont_have_access_to_reroute_this_booking": "អ្នកមិនមានសិទ្ធិប្តូរទិសការកក់នេះទេ",
"form_response_not_found": "រកមិនឃើញការឆ្លើយតបទម្រង់",
"contact_owner": "ម្ចាស់ទំនាក់ទំនង",
"contact_owner_not_found": "រកមិនឃើញ",
"using_fallback_members": "កំពុងប្រើសមាជិកត្រឡប់ក្រោយ",
"chosen_route": "ផ្លូវដែលបានជ្រើសរើស",
"attribute_logic_matched": "តក្កវិជ្ជាលក្ខណៈសម្បត្តិត្រូវគ្នា",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "ពេលវេលាបញ្ចប់ព្រឹត្តិការណ៍នៅក្នុងតំបន់ពេលវេលារបស់អ្នកចូលរួម",
"salesforce_create_event_on_contact": "បង្កើតព្រឹត្តិការណ៍នៅលើទំនាក់ទំនង បើមាន។ បើមិនដូច្នោះទេ ត្រឡប់ទៅ lead វិញ",
"salesforce_owner_name_to_change": "ឈ្មោះម្ចាស់ដែលត្រូវផ្លាស់ប្តូរ",
"dont_have_access_this_page": "អ្នកមិនមានសិទ្ធិចូលប្រើទំព័រនេះទេ",
"you_need_admin_or_owner_privileges_to_access": "ដើម្បីមើល ឬប្រើប្រាស់ទំព័រនេះ អ្នកត្រូវតែមានសិទ្ធិជាអ្នកគ្រប់គ្រង ឬម្ចាស់",
"field_type": "ប្រភេទវាល",
"when_to_write": "ពេលណាត្រូវសរសេរ",
"salesforce_on_booking_write_to_record": "នៅពេលកក់ សរសេរទៅវាលផ្ទាល់ខ្លួននៅលើកំណត់ត្រា {{record}} របស់អ្នកចូលរួម",
"on_every_booking": "នៅរាល់ពេលកក់",
"only_if_field_is_empty": "លុះត្រាតែវាលនោះទទេ",
"booking_start_date": "កាលបរិច្ឆេទចាប់ផ្តើមការកក់",
"booking_created_date": "កាលបរិច្ឆេទបង្កើតការកក់",
"booking_reassigned_to_host": "ការកក់ត្រូវបានកំណត់ឡើងវិញទៅ {{host}}",
"no_contact_owner": "គ្មានម្ចាស់ទំនាក់ទំនង",
"routing_forms_created": "ទម្រង់បញ្ជូនបន្តដែលបានបង្កើត",
"routing_forms_total_responses": "ចំនួនការឆ្លើយតបសរុប",
"routing_forms_total_responses_without_booking": "ចំនួនការឆ្លើយតបសរុបដោយគ្មានការកក់",
"routing_forms_total_responses_with_booking": "ចំនួនការឆ្លើយតបសរុបជាមួយការកក់",
"routing_form_insights": "គ្មានការកក់",
"routing_form_insights_form_name_header": "ឈ្មោះទម្រង់",
"routing_form_insights_booking_status_header": "ការកក់",
"routing_form_insights_response_no_booking": "គ្មានការកក់",
"routing_form_insights_booked_by": "កក់ដោយ",
"routing_form_insights_created_at": "បង្កើតនៅ",
"routing_form_insights_booking_status": "ស្ថានភាពនៃការកក់",
"routing_form_insights_booking_at": "កាលបរិច្ឆេទកក់",
"routing_form_insights_submitted_at": "កាលបរិច្ឆេទដាក់ស្នើ",
"access_denied": "ការចូលប្រើត្រូវបានបដិសេធ",
"salesforce_route_to_owner": "ម្ចាស់ទំនាក់ទំនងនឹងជាម្ចាស់ Round Robin ប្រសិនបើមានស្រាប់។",
"salesforce_do_not_route_to_owner": "ម្ចាស់ទំនាក់ទំនងនឹងមិនត្រូវបានបង្ខំ (អាចនៅតែជាម្ចាស់ប្រសិនបើវាដូចគ្នាជាមួយលក្ខណៈ និងលក្ខខណ្ឌ Round Robin)។",
"salesforce_route_to_custom_lookup_field": "ផ្លូវទៅកាន់អ្នកប្រើដែលត្រូវនឹងវាលស្វែងរកនៅលើគណនី។",
"salesforce_option": "ជម្រើស Salesforce",
"lookup_field_name": "ឈ្មោះវាលស្វែងរក",
"rr_distribution_method": "ការចែកចាយ",
"rr_distribution_method_description": "អនុញ្ញាតឱ្យធ្វើការបែងចែកប្រសិទ្ធភាពដើម្បីបង្កើនភាពអាចរកបានអតិបរមា ឬដើម្បីសម្រេចបាននូវការចាត់តាំងដែលមានតុល្យភាពជាងមុន។",
"rr_distribution_method_availability_title": "បង្កើនភាពអាចរកបាន",
"rr_distribution_method_availability_description": "អនុញ្ញាតឱ្យអ្នកកក់អាចកក់កិច្ចប្រជុំនៅពេលដែលម្ចាស់មានពេលទំនេរ។ ប្រើវាដើម្បីបង្កើនចំនួនកិច្ចប្រជុំដែលអាចកក់បាន និងនៅពេលដែលការចែកចាយស្មើគ្នានៃកិច្ចប្រជុំរវាងម្ចាស់មានសារៈសំខាន់តិចជាង។",
"rr_distribution_method_balanced_title": "ការរក្សាតុល្យភាពបន្ទុក",
"rr_distribution_method_balanced_description": "យើងនឹងតាមដានចំនួនការកក់ដែលបានធ្វើឡើងជាមួយម្ចាស់នីមួយៗ និងប្រៀបធៀបជាមួយអ្នកផ្សេងទៀត ដោយបិទម្ចាស់មួយចំនួនដែលមានការកក់ច្រើនពេកដើម្បីឱ្យការកក់ត្រូវបានចែកចាយស្មើៗគ្នា។",
"exclude_emails_that_contain": "ច្រានចោលអ៊ីមែលដែលមាន ...",
"exclude_emails_match_found_error_message": "សូមបញ្ចូលអាសយដ្ឋានអ៊ីមែលការងារដែលមានសុពលភាព",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ បន្ថែមខ្សែអក្សរថ្មីរបស់អ្នកនៅខាងលើនេះ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "일정 변경 조치 필요: {{name}} 님과 함께 새로운 {{eventType}} 시간을 예약하십시오",
"hi_user_name": "안녕하세요 {{name}}",
"ics_event_title": "{{eventType}}과 {{name}}",
"please_book_a_time_sometime_later": "죄송합니다, 이번에는 연결할 수 없었습니다. 나중에 다시 예약해 주세요.",
"please_book_a_time_sometime_later": "현재 모든 전문가가 바쁘신 것 같습니다. 귀하에게 가장 적합한 시간에 전화를 예약해 주시면 저희가 도와드리겠습니다.",
"schedule_instead": "대신 예약하기",
"new_event_subject": "새 이벤트: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "{{entryPoint}}로 가입하세요",
"notes": "노트",
@@ -198,6 +199,8 @@
"webhook_disabled": "웹훅 비활성화",
"webhook_response": "웹훅 응답",
"webhook_test": "웹훅 테스트",
"webhook_update_form": "웹훅 업데이트 양식",
"webhook_update_form_description": "OAuth 클라이언트에 웹훅을 추가하세요.",
"manage_your_webhook": "웹훅 관리하기",
"webhook_created_successfully": "웹훅이 생성되었습니다!",
"webhook_updated_successfully": "웹훅이 업데이트되었습니다!",
@@ -348,9 +351,13 @@
"other": "더 보기",
"email_sign_in_subject": "{{appName}}의 로그인 링크",
"round_robin_emailed_you_and_attendees": "{{user}}와의 미팅이 예정되어 있습니다. 모든 참석자에게 캘린더 초대 이메일을 보냈습니다.",
"round_robin_emailed_host_and_attendee": "{{host}}님이 {{attendee}}님과 만납니다. 모든 사람에게 세부 사항이 포함된 캘린더 초대 이메일을 보냈습니다.",
"emailed_you_and_attendees": "당신과 다른 참여자들에게 상세 사항이 담긴 캘린더 초대 이메일을 보냈습니다.",
"emailed_host_and_attendee": "모든 사람에게 세부 사항이 포함된 캘린더 초대 이메일을 보냈습니다.",
"emailed_you_and_attendees_recurring": "귀하와 다른 참석자들에게 이 되풀이 이벤트의 첫 이벤트에 대한 예약 초대장을 이메일로 발송했습니다.",
"round_robin_emailed_you_and_attendees_recurring": "{{user}}와의 미팅이 예정되어 있습니다. 반복되는 이벤트의 첫 번째 일정에 대한 캘린더 초대 이메일을 모든 참석자에게 보냈습니다.",
"emailed_host_and_attendee_recurring": "반복되는 이벤트 중 첫 번째에 대한 세부 사항이 포함된 캘린더 초대 이메일을 모든 사람에게 보냈습니다.",
"round_robin_emailed_you_and_attendees_recurring": "{{user}}님과 만납니다. 반복되는 이벤트 중 첫 번째에 대한 세부 사항이 포함된 캘린더 초대 이메일을 모든 사람에게 보냈습니다.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}}님이 {{attendee}}님과 만납니다. 반복되는 이벤트 중 첫 번째에 대한 세부 사항이 포함된 캘린더 초대 이메일을 모든 사람에게 보냈습니다.",
"emailed_you_and_any_other_attendees": "당신과 다른 참여자들이 이 정보가 담긴 이메일을 주고 받았습니다.",
"needs_to_be_confirmed_or_rejected": "예약을 확정하거나 취소해주세요.",
"needs_to_be_confirmed_or_rejected_recurring": "되풀이 회의를 여전히 확인 또는 거부해야 합니다.",
@@ -403,6 +410,8 @@
"back_to_bookings": "예약으로 돌아가기",
"free_to_pick_another_event_type": "언제든지 다른 이벤트를 선택할 수 있습니다.",
"cancelled": "취소됨",
"no_booking": "예약 없음",
"awaiting_host": "호스트 대기 중",
"cancellation_successful": "취소 성공",
"really_cancel_booking": "예약을 정말 취소하시겠습니까?",
"cannot_cancel_booking": "예약을 취소하실 수 없습니다.",
@@ -703,6 +712,9 @@
"no_teams": "아직 팀이 하나도 없습니다.",
"no_teams_description": "팀을 통해 다른 사람들이 동료 간 공유된 이벤트를 예약할 수 있습니다.",
"submit": "제출하기",
"confirm_remove_attribute": "네, 속성을 제거합니다",
"remove_attribute": "속성 제거",
"remove_attribute_confirmation_message": "속성 '{{name}}'을(를) 제거하시겠습니까? 현재 할당된 모든 사용자가 할당 해제됩니다.",
"delete": "지우기",
"update": "업데이트",
"save": "저장하기",
@@ -1237,8 +1249,8 @@
"number_provided": "전화 번호는 제공됩니다",
"before_event_trigger": "이벤트 시작 전",
"event_cancelled_trigger": "이벤트 취소 시",
"after_hosts_cal_video_no_show": "호스트가 Cal 비디오에 참여하지 않은 후",
"after_guests_cal_video_no_show": "게스트가 Cal 비디오에 참여하지 않은 후",
"after_hosts_cal_video_no_show": "호스트가 Cal 비디오에 참여하지 않았습니다",
"after_guests_cal_video_no_show": "게스트가 Cal 비디오에 참여하지 않았습니다",
"new_event_trigger": "새 이벤트 예약 시",
"email_host_action": "호스트에게 이메일 발송",
"email_attendee_action": "참석자들에게 이메일 전송",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "라우팅",
"routing_forms_description": "참석자를 올바른 대상으로 안내하는 양식 만들기",
"routing_forms_send_email_owner": "소유자에게 이메일 보내기",
"routing_forms_send_email_owner_description": "양식이 제출되면 소유자에게 이메일을 발송합니다",
@@ -1630,6 +1643,7 @@
"format": "형식",
"uppercase_for_letters": "모든 문자에 대문자 사용",
"replace_whitespaces_underscores": "공백을 밑줄로 바꾸기",
"platform_billing": "플랫폼 결제",
"manage_billing": "대금청구 관리",
"manage_billing_description": "대금청구의 모든 항목 관리",
"billing_freeplan_title": "현재 무료 요금제를 사용 중입니다",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "더 많은 인사이트를 찾고 있습니까?",
"filters": "필터",
"add_filter": "필터 추가",
"add_rule": "규칙 추가",
"add_rule_group": "규칙 그룹 추가",
"remove_filters": "모든 필터 지우기",
"email_verified": "이메일 인증됨",
"select_user": "사용자 선택",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "조직 설정",
"set_up_your_platform_organization": "플랫폼 설정",
"organizations_description": "조직은 팀이 공유 이벤트 유형, 앱, 워크플로 등을 만들 수 있는 공유 환경입니다.",
"plans": "요금제",
"platform": "플랫폼",
"platform_description": "플랫폼과 관련된 모든 것을 관리합니다.",
"platform_organization_description": "Cal.com 플랫폼을 사용하면 플랫폼 API와 아톰을 통해 손쉽게 앱에 스케줄링을 통합할 수 있습니다.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "사용 가능한 시간을 몇 개 선택하여 이메일에 포함시키세요",
"select_time": "시간 선택",
"select_date": "날짜 선택",
"connecting_you_to_someone": "다른 사람과 연결 중입니다.",
"connecting_you_to_someone": "{{orgName}}의 담당자와 연결 중입니다.",
"please_do_not_close_this_tab": "이 페이지를 닫거나 새로 고침하지 마세요",
"see_all_available_times": "모든 사용 가능한 시간 보기",
"org_team_names_example_1": "예: 마케팅 팀",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "좌석 옵션은 여러 기간을 지원하지 않습니다",
"include_calendar_event": "캘린더 이벤트 포함",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuth 클라이언트 생성 양식",
"oAuth_client_creation_form_description": "새로운 OAuth 클라이언트를 생성하기 위한 양식입니다",
"oAuth_client_updation_form": "OAuth 클라이언트 수정 양식",
"oAuth_client_updation_form_description": "기존 OAuth 클라이언트를 수정하기 위한 양식입니다",
"recently_added": "최근 추가됨",
"connect_all_calendars": "모든 캘린더 연결",
"connect_all_calendars_description": "{{appName}}은(는) 모든 기존 캘린더에서 가용성을 읽어옵니다.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "예약 제한이 성공적으로 업데이트되었습니다",
"you_are_unauthorized_to_make_this_change_to_the_booking": "이 예약을 변경할 권한이 없습니다",
"matching_members": "일치하는 멤버",
"matching_members_queue_using_attribute_weights": "속성 가중치를 사용한 멤버 매칭 대기열",
"matching_members_queue_using_event_assignee_weights": "이벤트 담당자 가중치를 사용한 멤버 매칭 대기열",
"no_matching_members": "일치하는 멤버가 없습니다. 이벤트 유형에 할당된 팀 멤버를 사용할 것입니다.",
"no_matching_members_will_fallback_to_all_assigned_members": "일치하는 멤버가 없습니다. 이벤트 유형에 할당된 팀 멤버를 사용하는 것으로 대체됩니다. 대체 옵션을 추가하거나 using_fallback_members 로직을 수정하는 것을 고려해보세요.",
"hide_calendar_event_details": "공유 캘린더에서 이벤트 세부 정보 숨기기",
@@ -2704,6 +2727,8 @@
"add_new_field": "새 필드 추가",
"you_dont_have_access_to_reroute_this_booking": "이 예약을 재라우팅할 권한이 없습니다",
"form_response_not_found": "양식 응답을 찾을 수 없습니다",
"contact_owner": "연락처 소유자",
"contact_owner_not_found": "찾을 수 없음",
"using_fallback_members": "대체 멤버 사용 중",
"chosen_route": "선택된 경로",
"attribute_logic_matched": "속성 로직 일치함",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "참석자 시간대의 이벤트 종료 시간",
"salesforce_create_event_on_contact": "연락처가 존재하는 경우 이벤트 생성. 그렇지 않으면 리드로 대체",
"salesforce_owner_name_to_change": "변경할 소유자 이름",
"dont_have_access_this_page": "이 페이지에 접근할 수 없습니다",
"you_need_admin_or_owner_privileges_to_access": "이 페이지를 보거나 상호작용하려면 관리자 또는 소유자 권한이 필요합니다",
"field_type": "필드 유형",
"when_to_write": "작성 시기",
"salesforce_on_booking_write_to_record": "예약 시, 참석자 {{record}} 레코드의 사용자 정의 필드에 작성",
"on_every_booking": "모든 예약 시",
"only_if_field_is_empty": "필드가 비어있을 때만",
"booking_start_date": "예약 시작 날짜",
"booking_created_date": "예약 생성 날짜",
"booking_reassigned_to_host": "예약이 {{host}}에게 재할당됨",
"no_contact_owner": "연락처 소유자 없음",
"routing_forms_created": "생성된 라우팅 양식",
"routing_forms_total_responses": "전체 응답",
"routing_forms_total_responses_without_booking": "예약 없는 전체 응답",
"routing_forms_total_responses_with_booking": "예약이 있는 전체 응답",
"routing_form_insights": "예약 없음",
"routing_form_insights_form_name_header": "양식 이름",
"routing_form_insights_booking_status_header": "예약",
"routing_form_insights_response_no_booking": "예약 없음",
"routing_form_insights_booked_by": "예약자",
"routing_form_insights_created_at": "생성 시간",
"routing_form_insights_booking_status": "예약 상태",
"routing_form_insights_booking_at": "예약 시간",
"routing_form_insights_submitted_at": "제출 시간",
"access_denied": "접근 거부됨",
"salesforce_route_to_owner": "연락처 소유자가 가능하면 Round Robin 호스트가 됩니다.",
"salesforce_do_not_route_to_owner": "연락처 소유자가 강제되지 않습니다 (속성과 Round Robin 기준이 일치하면 여전히 호스트가 될 수 있습니다).",
"salesforce_route_to_custom_lookup_field": "계정의 조회 필드와 일치하는 사용자에게 라우팅합니다.",
"salesforce_option": "Salesforce 옵션",
"lookup_field_name": "조회 필드 이름",
"rr_distribution_method": "분배 방식",
"rr_distribution_method_description": "최대 가용성을 위한 분배 최적화 또는 균형 잡힌 할당을 위한 설정이 가능합니다.",
"rr_distribution_method_availability_title": "가용성 최대화",
"rr_distribution_method_availability_description": "호스트가 가능한 시간대에 예약자가 미팅을 예약할 수 있습니다. 호스트 간 미팅 분배의 균형보다 잠재적 미팅 예약 수를 최대화하고 싶을 때 사용하세요.",
"rr_distribution_method_balanced_title": "부하 분산",
"rr_distribution_method_balanced_description": "각 호스트의 예약 수를 모니터링하고 다른 호스트들과 비교하여, 예약이 균등하게 분배되도록 예약이 너무 많은 호스트를 일시적으로 비활성화합니다.",
"exclude_emails_that_contain": "다음이 포함된 이메일 제외 ...",
"exclude_emails_match_found_error_message": "유효한 업무용 이메일 주소를 입력해 주세요.",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 여기에 새 문자열을 추가하세요 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+67 -4
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Actie vereist voor verplaatsing: boek een nieuwe tijd voor {{eventType}} met {{name}}",
"hi_user_name": "Hallo {{name}}",
"ics_event_title": "{{eventType}} met {{name}}",
"please_book_a_time_sometime_later": "Oeps, we konden je deze keer niet verbinden. Plan in plaats daarvan een toekomstige oproep.",
"please_book_a_time_sometime_later": "Het lijkt erop dat al onze experts momenteel bezet zijn. Plan een gesprek in op een moment dat jou het beste uitkomt en we staan klaar om je te helpen.",
"schedule_instead": "Plan in plaats daarvan",
"new_event_subject": "Nieuwe afspraak: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Word lid via {{entryPoint}}",
"notes": "Opmerkingen",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook uitgeschakeld",
"webhook_response": "Webhook melding",
"webhook_test": "Webhook testen",
"webhook_update_form": "Webhook-updateformulier",
"webhook_update_form_description": "Voeg een webhook toe aan je OAuthClient.",
"manage_your_webhook": "Beheer uw webhook",
"webhook_created_successfully": "Webhook succesvol toegevoegd!",
"webhook_updated_successfully": "Webhook succesvol bijgewerkt!",
@@ -348,9 +351,13 @@
"other": "Overige",
"email_sign_in_subject": "Uw aanmeldingslink voor {{appName}}",
"round_robin_emailed_you_and_attendees": "Je hebt een afspraak met {{user}}. We hebben een e-mail met een kalenderuitnodiging en de details naar iedereen gestuurd.",
"round_robin_emailed_host_and_attendee": "{{host}} heeft een afspraak met {{attendee}}. We hebben een e-mail met een kalenderuitnodiging en de details naar iedereen gestuurd.",
"emailed_you_and_attendees": "We hebben u en de andere deelnemende een kalender uitnodiging met alle details gestuurd.",
"emailed_host_and_attendee": "We hebben een e-mail met een kalenderuitnodiging en de details naar iedereen gestuurd.",
"emailed_you_and_attendees_recurring": "We hebben u en de andere deelnemers een agenda-uitnodiging voor de eerste van deze terugkerende gebeurtenissen gestuurd.",
"emailed_host_and_attendee_recurring": "We hebben een e-mail met een kalenderuitnodiging en de details naar iedereen gestuurd voor de eerste van deze terugkerende evenementen.",
"round_robin_emailed_you_and_attendees_recurring": "Je hebt een afspraak met {{user}}. We hebben een e-mail met een kalenderuitnodiging en de details naar iedereen gestuurd voor de eerste van deze terugkerende evenementen.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} heeft een afspraak met {{attendee}}. We hebben een e-mail met een kalenderuitnodiging en de details naar iedereen gestuurd voor de eerste van deze terugkerende evenementen.",
"emailed_you_and_any_other_attendees": "U en alle andere deelnemers zijn gemaild met deze informatie.",
"needs_to_be_confirmed_or_rejected": "Uw boeking moet nog steeds worden bevestigd of geweigerd.",
"needs_to_be_confirmed_or_rejected_recurring": "Uw terugkerende afspraak moet nog steeds bevestigd of geweigerd worden.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Terug naar afspraken",
"free_to_pick_another_event_type": "U kunt op elk moment een andere afspraak maken.",
"cancelled": "Geannuleerd",
"no_booking": "Geen boeking",
"awaiting_host": "Wachten op host",
"cancellation_successful": "Annulering geslaagd",
"really_cancel_booking": "Weet u zeker dat u deze afspraak wilt annuleren?",
"cannot_cancel_booking": "U kunt deze afspraak niet annuleren",
@@ -703,6 +712,9 @@
"no_teams": "U heeft nog geen teams.",
"no_teams_description": "Teams geven anderen de mogelijkheid om gebeurtenissen te boeken die zijn gedeeld tussen uw collega's.",
"submit": "Opslaan",
"confirm_remove_attribute": "Ja, attribuut verwijderen",
"remove_attribute": "Attribuut verwijderen",
"remove_attribute_confirmation_message": "Weet u zeker dat u het attribuut '{{name}}' wilt verwijderen? Alle gebruikers die momenteel zijn toegewezen, zullen worden losgekoppeld.",
"delete": "Verwijderen",
"update": "Bijwerken",
"save": "Opslaan",
@@ -1237,8 +1249,8 @@
"number_provided": "Telefoonnummer wordt verstrekt",
"before_event_trigger": "voordat de gebeurtenis begint",
"event_cancelled_trigger": "wanneer de gebeurtenis is geannuleerd",
"after_hosts_cal_video_no_show": "Nadat hosts niet deelnemen aan cal video",
"after_guests_cal_video_no_show": "Nadat gasten niet deelnemen aan cal video",
"after_hosts_cal_video_no_show": "Nadat hosts niet bij de cal video zijn gekomen",
"after_guests_cal_video_no_show": "Nadat gasten niet bij de cal video zijn gekomen",
"new_event_trigger": "wanneer een nieuwe gebeurtenis is geboekt",
"email_host_action": "e-mail naar organisator versturen",
"email_attendee_action": "e-mail naar deelnemers versturen",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Routering",
"routing_forms_description": "Maak formulieren om deelnemers naar de juiste bestemmingen te verwijzen",
"routing_forms_send_email_owner": "E-mail naar eigenaar versturen",
"routing_forms_send_email_owner_description": "Verstuurt een e-mail naar de eigenaar wanneer het formulier is verzonden",
@@ -1630,6 +1643,7 @@
"format": "Formatteren",
"uppercase_for_letters": "Gebruik hoofdletters voor alle letters",
"replace_whitespaces_underscores": "Vervang spaties door onderstrepingstekens",
"platform_billing": "Platformfacturering",
"manage_billing": "Facturering beheren",
"manage_billing_description": "Alles beheren wat met facturering te maken heeft",
"billing_freeplan_title": "U heeft momenteel het GRATIS abonnement",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Op zoek naar meer Insights?",
"filters": "Filters",
"add_filter": "Filter toevoegen",
"add_rule": "Regel toevoegen",
"add_rule_group": "Regelgroep toevoegen",
"remove_filters": "Alle filters wissen",
"email_verified": "E-mail geverifieerd",
"select_user": "Selecteer gebruiker",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Stel uw organisatie in",
"set_up_your_platform_organization": "Stel je platform in",
"organizations_description": "Organisaties zijn gedeelde omgevingen waar teams gedeelde gebeurtenistypen, apps, werkstromen en meer kunnen maken.",
"plans": "Abonnementen",
"platform": "Platform",
"platform_description": "Beheer alles wat met het platform te maken heeft.",
"platform_organization_description": "Cal.com Platform stelt je in staat om plannen moeiteloos te integreren in je app met behulp van platform-API's en -atomen.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Selecteer enkele beschikbare tijden en voeg ze toe aan uw e-mail",
"select_time": "Tijd selecteren",
"select_date": "Datum selecteren",
"connecting_you_to_someone": "We verbinden je met iemand.",
"connecting_you_to_someone": "We verbinden je met iemand van {{orgName}}.",
"please_do_not_close_this_tab": "Sluit of vernieuw deze pagina niet",
"see_all_available_times": "Bekijk alle beschikbare tijden",
"org_team_names_example_1": "bijvoorbeeld Marketingteam",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "De plaatsoptie ondersteunt geen meerdere duren",
"include_calendar_event": "Agendagebeurtenis opnemen",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuth-client aanmaakformulier",
"oAuth_client_creation_form_description": "Dit is het formulier om een nieuwe OAuth-client aan te maken",
"oAuth_client_updation_form": "OAuth-client bewerkingsformulier",
"oAuth_client_updation_form_description": "Dit is het formulier om een bestaande OAuth-client te bewerken",
"recently_added": "Recent toegevoegd",
"connect_all_calendars": "Koppel al uw agenda's",
"connect_all_calendars_description": "{{appName}} leest beschikbaarheid van al je bestaande agenda's.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Boekingslimieten succesvol bijgewerkt",
"you_are_unauthorized_to_make_this_change_to_the_booking": "U bent niet gemachtigd om deze wijziging in de boeking aan te brengen",
"matching_members": "Overeenkomende leden",
"matching_members_queue_using_attribute_weights": "Wachtrij voor overeenkomende leden (op basis van kenmerkengewicht)",
"matching_members_queue_using_event_assignee_weights": "Wachtrij voor overeenkomende leden (op basis van toewijzingsgewicht)",
"no_matching_members": "Geen overeenkomende leden. Er wordt teruggevallen op de teamleden die aan het type evenement zijn toegewezen.",
"no_matching_members_will_fallback_to_all_assigned_members": "Geen overeenkomende leden. Er wordt teruggevallen op de teamleden die aan het evenementtype zijn toegewezen. Overweeg een fallback toe te voegen of de logica van using_fallback_members te corrigeren",
"hide_calendar_event_details": "Verberg details van kalendergebeurtenissen op gedeelde kalenders",
@@ -2704,6 +2727,8 @@
"add_new_field": "Nieuw veld toevoegen",
"you_dont_have_access_to_reroute_this_booking": "Je hebt geen toegang om deze boeking om te leiden",
"form_response_not_found": "Formulierreactie niet gevonden",
"contact_owner": "Contacteigenaar",
"contact_owner_not_found": "Niet gevonden",
"using_fallback_members": "Gebruik van fallback-leden",
"chosen_route": "Gekozen route",
"attribute_logic_matched": "Attribuutlogica komt overeen",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Eindtijd evenement in tijdzone deelnemer",
"salesforce_create_event_on_contact": "Maak een evenement aan op het contact, indien aanwezig. Anders terugvallen op lead",
"salesforce_owner_name_to_change": "Eigenaarsnaam om te wijzigen",
"dont_have_access_this_page": "Je hebt geen toegang tot deze pagina",
"you_need_admin_or_owner_privileges_to_access": "Om deze pagina te bekijken of ermee te communiceren, moet je over admin- of eigenaarsrechten beschikken",
"field_type": "Veldtype",
"when_to_write": "Wanneer schrijven",
"salesforce_on_booking_write_to_record": "Bij boeking, schrijf naar een aangepast veld op het {{record}}-record van de deelnemer",
"on_every_booking": "Bij elke boeking",
"only_if_field_is_empty": "Alleen als het veld leeg is",
"booking_start_date": "Startdatum boeking",
"booking_created_date": "Aanmaakdatum boeking",
"booking_reassigned_to_host": "Boeking opnieuw toegewezen aan {{host}}",
"no_contact_owner": "Geen contacteigenaar",
"routing_forms_created": "Routeringsformulieren aangemaakt",
"routing_forms_total_responses": "Totaal aantal reacties",
"routing_forms_total_responses_without_booking": "Totaal aantal reacties zonder boeking",
"routing_forms_total_responses_with_booking": "Totaal aantal reacties met boeking",
"routing_form_insights": "Geen boekingen",
"routing_form_insights_form_name_header": "Formuliernaam",
"routing_form_insights_booking_status_header": "Boeking",
"routing_form_insights_response_no_booking": "Geen boeking",
"routing_form_insights_booked_by": "Geboekt door",
"routing_form_insights_created_at": "Aangemaakt op",
"routing_form_insights_booking_status": "Boekingsstatus",
"routing_form_insights_booking_at": "Geboekt op",
"routing_form_insights_submitted_at": "Ingediend op",
"access_denied": "Toegang geweigerd",
"salesforce_route_to_owner": "Contacteigenaar zal de Round Robin host zijn indien beschikbaar",
"salesforce_do_not_route_to_owner": "Contacteigenaar wordt niet geforceerd (kan nog steeds host zijn als het overeenkomt met de attributen en Round Robin criteria)",
"salesforce_route_to_custom_lookup_field": "Routeer naar een gebruiker die overeenkomt met een zoekveld op een account",
"salesforce_option": "Salesforce-optie",
"lookup_field_name": "Zoekveldnaam",
"rr_distribution_method": "Distributie",
"rr_distribution_method_description": "Maakt het mogelijk om de distributie te optimaliseren voor maximale beschikbaarheid of voor een meer gebalanceerde toewijzing.",
"rr_distribution_method_availability_title": "Maximale beschikbaarheid",
"rr_distribution_method_availability_description": "Stelt boekers in staat om afspraken te maken wanneer een host beschikbaar is. Gebruik dit om het aantal potentiële afspraken te maximaliseren en wanneer de gelijke verdeling van afspraken over hosts minder belangrijk is.",
"rr_distribution_method_balanced_title": "Evenredige verdeling",
"rr_distribution_method_balanced_description": "We monitoren hoeveel boekingen er bij elke host zijn gemaakt en vergelijken dit met anderen. Hosts die te ver voorlopen worden tijdelijk uitgeschakeld zodat boekingen gelijkmatig worden verdeeld.",
"exclude_emails_that_contain": "E-mailadressen uitsluiten die ... bevatten",
"exclude_emails_match_found_error_message": "Voer een geldig zakelijk e-mailadres in",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Voeg uw nieuwe strings hierboven toe ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Handling Påkrevd: Vennligst book en ny tid for {{eventType}} med {{name}}",
"hi_user_name": "Hei {{name}}",
"ics_event_title": "{{eventType}} med {{name}}",
"please_book_a_time_sometime_later": "Oops, vi kunne ikke koble deg til denne gangen. Vennligst planlegg en samtale senere.",
"please_book_a_time_sometime_later": "Det ser ut til at alle våre eksperter er opptatt akkurat nå. Vennligst planlegg en samtale på et tidspunkt som passer best for deg, så vil vi være klare til å hjelpe deg.",
"schedule_instead": "Planlegg i stedet",
"new_event_subject": "Ny hendelse: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Bli med via {{entryPoint}}",
"notes": "Notater",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook Deaktivert",
"webhook_response": "Webhook respons",
"webhook_test": "Webhook test",
"webhook_update_form": "Skjema for oppdatering av webhook",
"webhook_update_form_description": "Legg til en webhook i din OAuthClient.",
"manage_your_webhook": "Administrer webhook",
"webhook_created_successfully": "Webhook ble opprettet!",
"webhook_updated_successfully": "Webhook ble oppdatert!",
@@ -348,9 +351,13 @@
"other": "Annet",
"email_sign_in_subject": "Påloggings-lenken din for {{appName}}",
"round_robin_emailed_you_and_attendees": "Du skal møte med {{user}}. Vi har sendt en e-post med en kalenderinvitasjon med detaljene til alle.",
"round_robin_emailed_host_and_attendee": "{{host}} møter {{attendee}}. Vi har sendt en e-post med en kalenderinvitasjon med detaljene til alle.",
"emailed_you_and_attendees": "Vi sendte deg og de andre deltakerne en kalenderinvitasjon med alle detaljene.",
"emailed_host_and_attendee": "Vi har sendt en e-post med en kalenderinvitasjon med detaljene til alle.",
"emailed_you_and_attendees_recurring": "Vi sendte deg og de andre deltakerne en kalenderinvitasjon på e-post for den første av disse gjentakende hendelsene.",
"round_robin_emailed_you_and_attendees_recurring": "Du skal møte med {{user}}. Vi har sendt en e-post med en kalenderinvitasjon med detaljene til alle for den første av disse gjentakende hendelsene.",
"emailed_host_and_attendee_recurring": "Vi har sendt en e-post med en kalenderinvitasjon med detaljene til alle for den første av disse gjentakende hendelsene.",
"round_robin_emailed_you_and_attendees_recurring": "Du møter {{user}}. Vi har sendt en e-post med en kalenderinvitasjon med detaljene til alle for den første av disse gjentakende hendelsene.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} møter {{attendee}}. Vi har sendt en e-post med en kalenderinvitasjon med detaljene til alle for den første av disse gjentakende hendelsene.",
"emailed_you_and_any_other_attendees": "Du og eventuelle andre deltakere har fått e-post med denne informasjonen.",
"needs_to_be_confirmed_or_rejected": "Bookingen din må fortsatt bekreftes eller avvises.",
"needs_to_be_confirmed_or_rejected_recurring": "Ditt gjentakende møte må fortsatt bekreftes eller avvises.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Tilbake til bookinger",
"free_to_pick_another_event_type": "Du er velkommen til å velge et annet event når som helst.",
"cancelled": "Avlyst",
"no_booking": "Ingen bestilling",
"awaiting_host": "Venter på vert",
"cancellation_successful": "Kanselleringen var vellykket",
"really_cancel_booking": "Sikker på at du vil kansellere bookingen din?",
"cannot_cancel_booking": "Du kan ikke avbryte denne bookingen",
@@ -703,6 +712,9 @@
"no_teams": "Du har ingen team ennå.",
"no_teams_description": "Team lar andre booke hendelser som deles mellom kollegene dine.",
"submit": "Send inn",
"confirm_remove_attribute": "Ja, fjern attributt",
"remove_attribute": "Fjern attributt",
"remove_attribute_confirmation_message": "Er du sikker på at du vil fjerne attributtet '{{name}}'? Alle brukere som for øyeblikket er tildelt det, vil bli fjernet.",
"delete": "Slett",
"update": "Oppdater",
"save": "Lagre",
@@ -1237,8 +1249,8 @@
"number_provided": "Telefonnummer vil bli oppgitt",
"before_event_trigger": "før hendelsen starter",
"event_cancelled_trigger": "når arrangementet er avlyst",
"after_hosts_cal_video_no_show": "Etter at verter ikke blir med på cal video",
"after_guests_cal_video_no_show": "Etter at gjester ikke blir med på cal video",
"after_hosts_cal_video_no_show": "Etter at vertene ikke møtte opp til cal-videoen",
"after_guests_cal_video_no_show": "Etter at gjestene ikke møtte opp til cal-videoen",
"new_event_trigger": "når en ny hendelse er booket",
"email_host_action": "send e-post til vert",
"email_attendee_action": "send e-post til deltakere",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Ruting",
"routing_forms_description": "Lag skjemaer for å lede deltakere til riktig destinasjon",
"routing_forms_send_email_owner": "Send E-post til Eier",
"routing_forms_send_email_owner_description": "Sender en e-post til eieren når skjemaet er sendt inn",
@@ -1630,6 +1643,7 @@
"format": "Format",
"uppercase_for_letters": "Bruk store bokstaver for alle bokstaver",
"replace_whitespaces_underscores": "Erstatt mellomrom med understrek",
"platform_billing": "Plattformfakturering",
"manage_billing": "Administrer betaling",
"manage_billing_description": "Administrer alt av betaling",
"billing_freeplan_title": "Du er for øyeblikket på GRATIS planen",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Leter du etter flere innsikter?",
"filters": "Filtre",
"add_filter": "Legg til filter",
"add_rule": "Legg til regel",
"add_rule_group": "Legg til regelgruppe",
"remove_filters": "Fjern alle filtre",
"email_verified": "E-post bekreftet",
"select_user": "Velg bruker",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Sett opp din organisasjon",
"set_up_your_platform_organization": "Sett opp din plattform",
"organizations_description": "Organisasjoner er delte miljøer hvor team kan lage delte hendelsestyper, apper, arbeidsflyter og mer.",
"plans": "Planer",
"platform": "Plattform",
"platform_description": "Administrer alt relatert til plattformen.",
"platform_organization_description": "Cal.com Platform lar deg integrere planlegging sømløst i appen din ved hjelp av plattform-APIer og atomer.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Velg noen tilgjengelige tider og legg dem inn i e-posten din",
"select_time": "Velg tid",
"select_date": "Velg dato",
"connecting_you_to_someone": "Vi kobler deg til noen.",
"connecting_you_to_someone": "Vi kobler deg til noen fra {{orgName}}.",
"please_do_not_close_this_tab": "Vennligst ikke lukk eller oppdater denne siden",
"see_all_available_times": "Se alle tilgjengelige tider",
"org_team_names_example_1": "f.eks. Markedsføringsteam",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Setealternativet støtter ikke flere varigheter",
"include_calendar_event": "Inkluder kalenderhendelse",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Skjema for opprettelse av OAuth-klient",
"oAuth_client_creation_form_description": "Dette er skjemaet for å opprette en ny OAuth-klient",
"oAuth_client_updation_form": "Skjema for oppdatering av OAuth-klient",
"oAuth_client_updation_form_description": "Dette er skjemaet for å redigere en eksisterende OAuth-klient",
"recently_added": "Nylig lagt til",
"connect_all_calendars": "Koble til alle kalenderne dine",
"connect_all_calendars_description": "{{appName}} leser tilgjengelighet fra alle dine eksisterende kalendere.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Bestillingsgrenser oppdatert vellykket",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Du har ikke tillatelse til å gjøre denne endringen i bestillingen",
"matching_members": "Matchende medlemmer",
"matching_members_queue_using_attribute_weights": "Kø for samsvarende medlemmer (bruker attributtvekting)",
"matching_members_queue_using_event_assignee_weights": "Kø for samsvarende medlemmer (bruker vekting for hendelsesansvarlige)",
"no_matching_members": "Ingen matchende medlemmer. Det vil falle tilbake til å bruke teammedlemmene som er tildelt hendelsestypen.",
"no_matching_members_will_fallback_to_all_assigned_members": "Ingen matchende medlemmer. Det vil falle tilbake til å bruke teammedlemmene som er tildelt hendelsestypen. Vurder å legge til en reserveløsning eller korrigere logikken for using_fallback_members",
"hide_calendar_event_details": "Skjul kalenderhendelsesdetaljer på delte kalendere",
@@ -2704,6 +2727,8 @@
"add_new_field": "Legg til nytt felt",
"you_dont_have_access_to_reroute_this_booking": "Du har ikke tilgang til å omdirigere denne bookingen",
"form_response_not_found": "Skjemasvar ikke funnet",
"contact_owner": "Kontakteier",
"contact_owner_not_found": "Ikke funnet",
"using_fallback_members": "Bruker reservemedlemmer",
"chosen_route": "Valgt rute",
"attribute_logic_matched": "Attributtlogikk matchet",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Hendelsens sluttid i deltakers tidssone",
"salesforce_create_event_on_contact": "Opprett hendelse på kontakt, hvis den eksisterer. Ellers faller tilbake til lead",
"salesforce_owner_name_to_change": "Eiernavn som skal endres",
"dont_have_access_this_page": "Du har ikke tilgang til denne siden",
"you_need_admin_or_owner_privileges_to_access": "For å se eller bruke denne siden, må du ha administrator- eller eierrettigheter",
"field_type": "Felttype",
"when_to_write": "Når skal det skrives",
"salesforce_on_booking_write_to_record": "Ved booking, skriv til et tilpasset felt på deltaker-{{record}}-posten",
"on_every_booking": "Ved hver booking",
"only_if_field_is_empty": "Bare hvis feltet er tomt",
"booking_start_date": "Bookingstart-dato",
"booking_created_date": "Dato for opprettet booking",
"booking_reassigned_to_host": "Booking omfordelt til {{host}}",
"no_contact_owner": "Ingen kontakteier",
"routing_forms_created": "Ruteformularer opprettet",
"routing_forms_total_responses": "Totalt antall svar",
"routing_forms_total_responses_without_booking": "Totalt antall svar uten bestilling",
"routing_forms_total_responses_with_booking": "Totalt antall svar med bestilling",
"routing_form_insights": "Ingen bestillinger",
"routing_form_insights_form_name_header": "Skjemanavn",
"routing_form_insights_booking_status_header": "Bestilling",
"routing_form_insights_response_no_booking": "Ingen bestilling",
"routing_form_insights_booked_by": "Bestilt av",
"routing_form_insights_created_at": "Opprettet den",
"routing_form_insights_booking_status": "Bestillingsstatus",
"routing_form_insights_booking_at": "Booket",
"routing_form_insights_submitted_at": "Sendt inn",
"access_denied": "Tilgang nektet",
"salesforce_route_to_owner": "Kontaktens eier vil være Round Robin-vert hvis tilgjengelig",
"salesforce_do_not_route_to_owner": "Kontaktens eier vil ikke bli tvunget (kan fortsatt være vert hvis det samsvarer med attributtene og Round Robin-kriteriene)",
"salesforce_route_to_custom_lookup_field": "Rute til en bruker som samsvarer med et oppslagsfelt på en konto",
"salesforce_option": "Salesforce-alternativ",
"lookup_field_name": "Oppslagsfeltnavn",
"rr_distribution_method": "Distribusjon",
"rr_distribution_method_description": "Gjør det mulig å optimalisere distribusjonen for maksimal tilgjengelighet eller for å oppnå en mer balansert fordeling.",
"rr_distribution_method_availability_title": "Maksimer tilgjengelighet",
"rr_distribution_method_availability_description": "Lar personer bestille møter når som helst en vert er tilgjengelig. Bruk dette for å maksimere antall potensielle møter som kan bestilles, og når jevn fordeling av møter mellom verter er mindre viktig.",
"rr_distribution_method_balanced_title": "Lastbalansering",
"rr_distribution_method_balanced_description": "Vi vil overvåke hvor mange bestillinger som er gjort med hver vert og sammenligne dette med andre, og deaktivere enkelte verter som ligger for langt foran slik at bestillinger blir jevnt fordelt.",
"exclude_emails_that_contain": "Ekskluder e-poster som inneholder ...",
"exclude_emails_match_found_error_message": "Vennligst skriv inn en gyldig arbeids-e-postadresse",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Legg til dine nye strenger over her ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Działanie wymagało zmiany harmonogramu: Zarezerwuj nową godzinę na wydarzenie {{eventType}} z {{name}}",
"hi_user_name": "Cześć {{name}}",
"ics_event_title": "{{eventType}} z {{name}}",
"please_book_a_time_sometime_later": "Ups, nie udało się połączyć tym razem. Proszę zaplanować rozmowę na późniejszy termin.",
"please_book_a_time_sometime_later": "Wygląda na to, że wszyscy nasi eksperci są teraz zajęci. Proszę umówić się na rozmowę w dogodnym dla siebie terminie, a my będziemy gotowi, aby Ci pomóc.",
"schedule_instead": "Umów się zamiast tego",
"new_event_subject": "Nowe wydarzenie: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Dołącz przez {{entryPoint}}",
"notes": "Uwagi",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook Wyłączony",
"webhook_response": "Odpowiedź Webhooka",
"webhook_test": "Test Webhooka",
"webhook_update_form": "Formularz aktualizacji webhooka",
"webhook_update_form_description": "Dodaj webhook do swojego klienta OAuth.",
"manage_your_webhook": "Zarządzaj swoim webhookiem",
"webhook_created_successfully": "Webhook został pomyślnie utworzony!",
"webhook_updated_successfully": "Webhook został pomyślnie zaktualizowany!",
@@ -348,9 +351,13 @@
"other": "Inne",
"email_sign_in_subject": "Twój link logowania do aplikacji {{appName}}",
"round_robin_emailed_you_and_attendees": "Spotykasz się z {{user}}. Wysłaliśmy e-mail z zaproszeniem do kalendarza i szczegółami do wszystkich.",
"round_robin_emailed_host_and_attendee": "{{host}} spotka się z {{attendee}}. Wysłaliśmy do wszystkich email z zaproszeniem kalendarzowym zawierającym szczegóły.",
"emailed_you_and_attendees": "Wysłaliśmy Ci i innym uczestnikom zaproszenie do kalendarza ze wszystkimi szczegółami.",
"emailed_host_and_attendee": "Wysłaliśmy do wszystkich email z zaproszeniem kalendarzowym zawierającym szczegóły.",
"emailed_you_and_attendees_recurring": "Wysłaliśmy Ci oraz innym uczestnikom zaproszenie do kalendarza dotyczące pierwszego z tych cyklicznych wydarzeń.",
"round_robin_emailed_you_and_attendees_recurring": "Spotykasz się z {{user}}. Wysłaliśmy e-mail z zaproszeniem do kalendarza i szczegółami do wszystkich na pierwsze z tych cyklicznych wydarzeń.",
"emailed_host_and_attendee_recurring": "Wysłaliśmy do wszystkich email z zaproszeniem kalendarzowym zawierającym szczegóły pierwszego z serii cyklicznych spotkań.",
"round_robin_emailed_you_and_attendees_recurring": "Spotkasz się z {{user}}. Wysłaliśmy do wszystkich email z zaproszeniem kalendarzowym zawierającym szczegóły pierwszego z serii cyklicznych spotkań.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} spotka się z {{attendee}}. Wysłaliśmy do wszystkich email z zaproszeniem kalendarzowym zawierającym szczegóły pierwszego z serii cyklicznych spotkań.",
"emailed_you_and_any_other_attendees": "Ty i inni uczestnicy dostali e-mail z tymi informacjami.",
"needs_to_be_confirmed_or_rejected": "Twoja rezerwacja musi zostać potwierdzona lub odrzucona.",
"needs_to_be_confirmed_or_rejected_recurring": "Twoje spotkanie cykliczne musi jeszcze zostać potwierdzone lub odrzucone.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Powrót do rezerwacji",
"free_to_pick_another_event_type": "Możesz wybrać inne wydarzenie w dowolnym momencie.",
"cancelled": "Anulowano",
"no_booking": "Brak rezerwacji",
"awaiting_host": "Oczekiwanie na gospodarza",
"cancellation_successful": "Anulowano pomyślnie",
"really_cancel_booking": "Czy na pewno anulować Twoją rezerwację?",
"cannot_cancel_booking": "Nie możesz anulować tej rezerwacji",
@@ -703,6 +712,9 @@
"no_teams": "Nie masz jeszcze żadnych drużyn.",
"no_teams_description": "Drużyny pozwalają innym na rezerwowanie wydarzeń dzielonych pomiędzy Twoich współpracowników.",
"submit": "Prześlij",
"confirm_remove_attribute": "Tak, usuń atrybut",
"remove_attribute": "Usuń atrybut",
"remove_attribute_confirmation_message": "Czy na pewno chcesz usunąć atrybut '{{name}}'? Wszyscy użytkownicy obecnie do niego przypisani zostaną odłączeni.",
"delete": "Usuń",
"update": "Aktualizuj",
"save": "Zapisz",
@@ -1237,8 +1249,8 @@
"number_provided": "Numer telefonu zostanie podany.",
"before_event_trigger": "przed rozpoczęciem wydarzenia",
"event_cancelled_trigger": "gdy wydarzenie zostanie anulowane",
"after_hosts_cal_video_no_show": "Po tym, jak gospodarze nie dołączą do wideo na Cal",
"after_guests_cal_video_no_show": "Po tym, jak goście nie dołączą do wideo na Cal",
"after_hosts_cal_video_no_show": "Po tym, jak gospodarze nie dołączyli do rozmowy wideo",
"after_guests_cal_video_no_show": "Po tym, jak goście nie dołączyli do rozmowy wideo",
"new_event_trigger": "gdy nowe wydarzenie zostanie zarezerwowane",
"email_host_action": "wyślij wiadomość e-mail do hosta",
"email_attendee_action": "wyślij wiadomość e-mail do uczestników",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Routing",
"routing_forms_description": "Utwórz formularze kierujące uczestników do właściwych miejsc docelowych",
"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.",
@@ -1630,6 +1643,7 @@
"format": "Formatowanie",
"uppercase_for_letters": "Użyj wielkich liter w przypadku wszystkich liter",
"replace_whitespaces_underscores": "Zastąp spacje podkreśleniami",
"platform_billing": "Rozliczenia platformy",
"manage_billing": "Zarządzaj płatnościami",
"manage_billing_description": "Zarządzaj wszystkimi kwestiami dotyczącymi płatności",
"billing_freeplan_title": "Obecnie korzystasz z planu BEZPŁATNEGO",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Szukasz dokładniejszych danych Insights?",
"filters": "Filtry",
"add_filter": "Dodaj filtr",
"add_rule": "Dodaj regułę",
"add_rule_group": "Dodaj grupę reguł",
"remove_filters": "Wyczyść wszystkie filtry",
"email_verified": "Email zweryfikowany",
"select_user": "Wybierz użytkownika",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Skonfiguruj swoją organizację",
"set_up_your_platform_organization": "Skonfiguruj swoją platformę",
"organizations_description": "Organizacje to współdzielone środowiska, w których zespoły mogą tworzyć wspólne typy wydarzeń, aplikacje, przepływy pracy itd.",
"plans": "Plany",
"platform": "Platforma",
"platform_description": "Zarządzaj wszystkim, co związane z platformą.",
"platform_organization_description": "Platforma Cal.com pozwala na bezproblemową integrację harmonogramowania z Twoją aplikacją za pomocą API i atomów platformy.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Wybierz kilka dostępnych terminów i osadź je w wiadomości e-mail",
"select_time": "Wybierz godzinę",
"select_date": "Wybierz datę",
"connecting_you_to_someone": "Łączymy Cię z kimś.",
"connecting_you_to_someone": "Łączymy Cię z kimś z {{orgName}}.",
"please_do_not_close_this_tab": "Proszę nie zamykać ani nie odświeżać tej strony",
"see_all_available_times": "Zobacz wszystkie dostępne godziny",
"org_team_names_example_1": "np. zespół marketingowy",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Opcja Miejsce nie obsługuje wielu czasów trwania.",
"include_calendar_event": "Uwzględnij wydarzenie z kalendarza",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formularz tworzenia klienta OAuth",
"oAuth_client_creation_form_description": "To jest formularz do utworzenia nowego klienta OAuth",
"oAuth_client_updation_form": "Formularz aktualizacji klienta OAuth",
"oAuth_client_updation_form_description": "To jest formularz do edycji istniejącego klienta OAuth",
"recently_added": "Niedawno dodane",
"connect_all_calendars": "Podłącz wszystkie swoje kalendarze",
"connect_all_calendars_description": "{{appName}} odczytuje dostępność ze wszystkich Twoich istniejących kalendarzy.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Limity rezerwacji zostały pomyślnie zaktualizowane",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Nie masz uprawnień do wprowadzenia tej zmiany w rezerwacji",
"matching_members": "Pasujący członkowie",
"matching_members_queue_using_attribute_weights": "Kolejka dopasowanych członków (używając wag atrybutów)",
"matching_members_queue_using_event_assignee_weights": "Kolejka dopasowanych członków (używając wag przypisanych do wydarzeń)",
"no_matching_members": "Brak pasujących członków. Zostaną użyci członkowie zespołu przypisani do typu wydarzenia.",
"no_matching_members_will_fallback_to_all_assigned_members": "Brak pasujących członków. Nastąpi powrót do użycia członków zespołu przypisanych do typu wydarzenia. Rozważ dodanie zapasowego rozwiązania lub poprawienie logiki using_fallback_members",
"hide_calendar_event_details": "Ukryj szczegóły wydarzeń w kalendarzu na udostępnionych kalendarzach",
@@ -2704,6 +2727,8 @@
"add_new_field": "Dodaj nowe pole",
"you_dont_have_access_to_reroute_this_booking": "Nie masz dostępu do przekierowania tej rezerwacji",
"form_response_not_found": "Nie znaleziono odpowiedzi formularza",
"contact_owner": "Właściciel kontaktu",
"contact_owner_not_found": "Nie znaleziono",
"using_fallback_members": "Używanie zapasowych członków",
"chosen_route": "Wybrana trasa",
"attribute_logic_matched": "Logika atrybutów dopasowana",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Czas zakończenia wydarzenia w strefie czasowej uczestnika",
"salesforce_create_event_on_contact": "Utwórz wydarzenie na kontakcie, jeśli istnieje. W przeciwnym razie użyj leada",
"salesforce_owner_name_to_change": "Nazwa właściciela do zmiany",
"dont_have_access_this_page": "Nie masz dostępu do tej strony",
"you_need_admin_or_owner_privileges_to_access": "Aby wyświetlić lub korzystać z tej strony, musisz mieć uprawnienia administratora lub właściciela",
"field_type": "Typ pola",
"when_to_write": "Kiedy zapisać",
"salesforce_on_booking_write_to_record": "Przy rezerwacji, zapisz do niestandardowego pola w rekordzie {{record}} uczestnika",
"on_every_booking": "Przy każdej rezerwacji",
"only_if_field_is_empty": "Tylko jeśli pole jest puste",
"booking_start_date": "Data rozpoczęcia rezerwacji",
"booking_created_date": "Data utworzenia rezerwacji",
"booking_reassigned_to_host": "Rezerwacja przypisana ponownie do {{host}}",
"no_contact_owner": "Brak właściciela kontaktu",
"routing_forms_created": "Utworzone formularze routingu",
"routing_forms_total_responses": "Łączna liczba odpowiedzi",
"routing_forms_total_responses_without_booking": "Łączna liczba odpowiedzi bez rezerwacji",
"routing_forms_total_responses_with_booking": "Łączna liczba odpowiedzi z rezerwacją",
"routing_form_insights": "Brak rezerwacji",
"routing_form_insights_form_name_header": "Nazwa formularza",
"routing_form_insights_booking_status_header": "Rezerwacja",
"routing_form_insights_response_no_booking": "Brak rezerwacji",
"routing_form_insights_booked_by": "Zarezerwowane przez",
"routing_form_insights_created_at": "Utworzono",
"routing_form_insights_booking_status": "Status rezerwacji",
"routing_form_insights_booking_at": "Data rezerwacji",
"routing_form_insights_submitted_at": "Data przesłania",
"access_denied": "Odmowa dostępu",
"salesforce_route_to_owner": "Właściciel kontaktu będzie hostem Round Robin, jeśli jest dostępny",
"salesforce_do_not_route_to_owner": "Właściciel kontaktu nie będzie wymuszony (może nadal być hostem, jeśli spełnia atrybuty i kryteria Round Robin)",
"salesforce_route_to_custom_lookup_field": "Przekieruj do użytkownika, który odpowiada polu wyszukiwania w koncie",
"salesforce_option": "Opcja Salesforce",
"lookup_field_name": "Nazwa pola wyszukiwania",
"rr_distribution_method": "Dystrybucja",
"rr_distribution_method_description": "Pozwala zoptymalizować dystrybucję pod kątem maksymalnej dostępności lub bardziej zrównoważonego przydziału spotkań.",
"rr_distribution_method_availability_title": "Maksymalizuj dostępność",
"rr_distribution_method_availability_description": "Umożliwia rezerwację spotkań, gdy którykolwiek z gospodarzy jest dostępny. Używaj tej opcji, aby zmaksymalizować liczbę potencjalnych spotkań, gdy równomierne rozłożenie spotkań między gospodarzami jest mniej istotne.",
"rr_distribution_method_balanced_title": "Równoważenie obciążenia",
"rr_distribution_method_balanced_description": "System będzie monitorować liczbę rezerwacji przypisanych do każdego gospodarza i porównywać ją z innymi, dezaktywując tymczasowo gospodarzy z większą liczbą spotkań, aby zapewnić równomierną dystrybucję.",
"exclude_emails_that_contain": "Wyklucz e-maile, które zawierają ...",
"exclude_emails_match_found_error_message": "Proszę wprowadzić prawidłowy adres e-mail służbowy",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Dodaj nowe ciągi powyżej ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Ação de reagendamento necessária: reserve outro horário para {{eventType}} com {{name}}",
"hi_user_name": "Olá {{name}}",
"ics_event_title": "{{eventType}} com {{name}}",
"please_book_a_time_sometime_later": "Ops, não foi possível conectá-lo desta vez. Por favor, agende uma chamada mais tarde",
"please_book_a_time_sometime_later": "Parece que todos os nossos especialistas estão ocupados no momento. Por favor, agende uma chamada em um horário que seja mais conveniente para você e estaremos prontos para ajudar.",
"schedule_instead": "Agendar agora",
"new_event_subject": "Novo evento: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Junte-se através de {{entryPoint}}",
"notes": "Notas",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook desativado",
"webhook_response": "Resposta do Webhook",
"webhook_test": "Teste do Webhook",
"webhook_update_form": "Formulário de atualização de webhook",
"webhook_update_form_description": "Adicione um webhook ao seu OAuthClient.",
"manage_your_webhook": "Gerenciar o seu Webhook",
"webhook_created_successfully": "Webhook criado com sucesso!",
"webhook_updated_successfully": "Webhook atualizado com sucesso!",
@@ -348,9 +351,13 @@
"other": "Outras",
"email_sign_in_subject": "Seu link de login para {{appName}}",
"round_robin_emailed_you_and_attendees": "Você está reunindo-se com {{user}}. Nós enviamos um e-mail com um convite de calendário com todos os detalhes para todos.",
"round_robin_emailed_host_and_attendee": "{{host}} terá uma reunião com {{attendee}}. Enviamos um e-mail com um convite para o calendário contendo todos os detalhes para todos os participantes.",
"emailed_you_and_attendees": "Enviamos um e-mail para você e para os outros participantes com um convite de calendário com todos os detalhes.",
"emailed_host_and_attendee": "Enviamos um e-mail com um convite para o calendário contendo todos os detalhes para todos os participantes.",
"emailed_you_and_attendees_recurring": "Enviamos um e-mail para você e para os outros participantes com um convite de calendário para o primeiro desses eventos recorrentes.",
"round_robin_emailed_you_and_attendees_recurring": "Você está reunindo-se com {{user}}. Nós enviamos um e-mail com um convite de calendário com todos os detalhes para todos com o primeiro destes eventos recorrentes.",
"emailed_host_and_attendee_recurring": "Enviamos um e-mail com um convite para o calendário contendo todos os detalhes para todos os participantes para o primeiro destes eventos recorrentes.",
"round_robin_emailed_you_and_attendees_recurring": "Você terá uma reunião com {{user}}. Enviamos um e-mail com um convite para o calendário contendo todos os detalhes para todos os participantes para o primeiro destes eventos recorrentes.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} terá uma reunião com {{attendee}}. Enviamos um e-mail com um convite para o calendário contendo todos os detalhes para todos os participantes para o primeiro destes eventos recorrentes.",
"emailed_you_and_any_other_attendees": "Esta informação foi enviada para você e para todos os outros participantes.",
"needs_to_be_confirmed_or_rejected": "A sua reserva ainda precisa de ser confirmada ou recusada.",
"needs_to_be_confirmed_or_rejected_recurring": "A sua reunião recorrente ainda precisa ser confirmada ou recusada.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Voltar às Reservas",
"free_to_pick_another_event_type": "Sinta-se à vontade para escolher outro evento a qualquer hora.",
"cancelled": "Cancelado",
"no_booking": "Sem agendamento",
"awaiting_host": "Aguardando anfitrião",
"cancellation_successful": "Cancelado com Sucesso",
"really_cancel_booking": "Deseja realmente cancelar a sua reserva?",
"cannot_cancel_booking": "Você não pode cancelar esta reserva",
@@ -703,6 +712,9 @@
"no_teams": "Você ainda não tem nenhuma equipe.",
"no_teams_description": "Equipes permitem que outras pessoas reservem eventos compartilhados entre seus colegas de trabalho.",
"submit": "Enviar",
"confirm_remove_attribute": "Sim, remover atributo",
"remove_attribute": "Remover atributo",
"remove_attribute_confirmation_message": "Você tem certeza de que deseja remover o atributo '{{name}}'? Todos os usuários atualmente atribuídos a ele serão desassociados.",
"delete": "Apagar",
"update": "Atualizar",
"save": "Salvar",
@@ -1237,8 +1249,8 @@
"number_provided": "O número de telefone será fornecido",
"before_event_trigger": "antes do início do evento",
"event_cancelled_trigger": "quando o evento for cancelado",
"after_hosts_cal_video_no_show": "Após os anfitriões não entrarem no vídeo do Cal",
"after_guests_cal_video_no_show": "Após os convidados não entrarem no vídeo do Cal",
"after_hosts_cal_video_no_show": "Após os anfitriões não entrarem na videochamada do Cal",
"after_guests_cal_video_no_show": "Após os convidados não entrarem na videochamada do Cal",
"new_event_trigger": "quando um novo evento for reservado",
"email_host_action": "enviar e-mail para a(o) anfitriã(o)",
"email_attendee_action": "enviar e-mail aos participantes",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Roteamento",
"routing_forms_description": "Criar formulários para direcionar os participantes para os destinos corretos",
"routing_forms_send_email_owner": "Enviar e-mail ao proprietário",
"routing_forms_send_email_owner_description": "Envia um e-mail ao proprietário após o envio do formulário",
@@ -1630,6 +1643,7 @@
"format": "Formato",
"uppercase_for_letters": "Use letras maiúsculas para todas as letras",
"replace_whitespaces_underscores": "Substituir espaços em branco com sublinhados",
"platform_billing": "Faturamento da plataforma",
"manage_billing": "Gerencie o faturamento",
"manage_billing_description": "Gerencie tudo do faturamento",
"billing_freeplan_title": "No momento, você está no plano GRÁTIS",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Procurando mais Insights?",
"filters": "Filtros",
"add_filter": "Adicionar filtro",
"add_rule": "Adicionar regra",
"add_rule_group": "Adicionar grupo de regras",
"remove_filters": "Limpar todos os filtros",
"email_verified": "E-mail Verificado",
"select_user": "Selecionar usuário",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Configurar sua organização",
"set_up_your_platform_organization": "Configurar sua plataforma",
"organizations_description": "Organizações são ambientes compartilhados em que as equipes podem criar fluxos de trabalho, aplicativos, tipos de evento compartilhados e muito mais.",
"plans": "Planos",
"platform": "Plataforma",
"platform_description": "Gerencie tudo relacionado à plataforma.",
"platform_organization_description": "A Plataforma Cal.com permite que você facilmente integre agendadores no seu aplicativo usando APIs e módulos da plataforma.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Selecione alguns horários disponíveis e incorpore-os no seu e-mail",
"select_time": "Selecione o horário",
"select_date": "Selecione a data",
"connecting_you_to_someone": "Estamos conectando você a alguém.",
"connecting_you_to_someone": "Estamos conectando você a alguém da {{orgName}}.",
"please_do_not_close_this_tab": "Por favor, não feche ou atualize esta página",
"see_all_available_times": "Veja todos os horários disponíveis",
"org_team_names_example_1": "ex.: Time de Marketing",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "A opção de assento não é compatível com múltiplas durações",
"include_calendar_event": "Incluir evento do calendário",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formulário de criação de cliente OAuth",
"oAuth_client_creation_form_description": "Este é o formulário para criar um novo cliente OAuth",
"oAuth_client_updation_form": "Formulário de atualização de cliente OAuth",
"oAuth_client_updation_form_description": "Este é o formulário para editar um cliente OAuth existente",
"recently_added": "Adicionou recentemente",
"connect_all_calendars": "Conecte todos os seus calendários",
"connect_all_calendars_description": "{{appName}} lê a disponibilidade de todos os seus calendários existentes.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Limites de agendamento atualizados com sucesso",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Você não tem autorização para fazer essa alteração na reserva",
"matching_members": "Membros correspondentes",
"matching_members_queue_using_attribute_weights": "Fila de membros correspondentes (usando pesos de atributos)",
"matching_members_queue_using_event_assignee_weights": "Fila de membros correspondentes (usando pesos de designados do evento)",
"no_matching_members": "Nenhum membro correspondente. Será utilizado como alternativa os membros da equipe atribuídos ao tipo de evento.",
"no_matching_members_will_fallback_to_all_assigned_members": "Nenhum membro correspondente. Será usado como fallback os membros da equipe atribuídos ao tipo de evento. Considere adicionar um fallback ou corrigir a lógica de using_fallback_members",
"hide_calendar_event_details": "Ocultar detalhes dos eventos do calendário em calendários compartilhados",
@@ -2704,6 +2727,8 @@
"add_new_field": "Adicionar novo campo",
"you_dont_have_access_to_reroute_this_booking": "Você não tem acesso para redirecionar esta reserva",
"form_response_not_found": "Resposta do formulário não encontrada",
"contact_owner": "Proprietário do contato",
"contact_owner_not_found": "Não encontrado",
"using_fallback_members": "Usando membros de fallback",
"chosen_route": "Rota escolhida",
"attribute_logic_matched": "Lógica de atributos correspondida",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Hora de término do evento no fuso horário do participante",
"salesforce_create_event_on_contact": "Criar evento no contato, se existir. Caso contrário, usar lead como alternativa",
"salesforce_owner_name_to_change": "Nome do proprietário a ser alterado",
"dont_have_access_this_page": "Você não tem acesso a esta página",
"you_need_admin_or_owner_privileges_to_access": "Para visualizar ou interagir com esta página, você deve ter privilégios de administrador ou proprietário",
"field_type": "Tipo de campo",
"when_to_write": "Quando escrever",
"salesforce_on_booking_write_to_record": "Ao fazer uma reserva, escrever em um campo personalizado no registro {{record}} do participante",
"on_every_booking": "Em cada reserva",
"only_if_field_is_empty": "Apenas se o campo estiver vazio",
"booking_start_date": "Data de início da reserva",
"booking_created_date": "Data de criação da reserva",
"booking_reassigned_to_host": "Reserva reatribuída para {{host}}",
"no_contact_owner": "Sem proprietário do contato",
"routing_forms_created": "Formulários de Roteamento Criados",
"routing_forms_total_responses": "Total de Respostas",
"routing_forms_total_responses_without_booking": "Total de Respostas Sem Agendamento",
"routing_forms_total_responses_with_booking": "Total de Respostas Com Agendamento",
"routing_form_insights": "Sem Agendamentos",
"routing_form_insights_form_name_header": "Nome do Formulário",
"routing_form_insights_booking_status_header": "Agendamento",
"routing_form_insights_response_no_booking": "Sem Agendamento",
"routing_form_insights_booked_by": "Agendado por",
"routing_form_insights_created_at": "Criado em",
"routing_form_insights_booking_status": "Status do Agendamento",
"routing_form_insights_booking_at": "Agendado em",
"routing_form_insights_submitted_at": "Enviado em",
"access_denied": "Acesso negado",
"salesforce_route_to_owner": "O proprietário do contato será o anfitrião do Round Robin se disponível",
"salesforce_do_not_route_to_owner": "O proprietário do contato não será forçado (ainda pode ser anfitrião se corresponder aos atributos e critérios do Round Robin)",
"salesforce_route_to_custom_lookup_field": "Direcionar para um usuário que corresponda a um campo de pesquisa em uma conta",
"salesforce_option": "Opção do Salesforce",
"lookup_field_name": "Nome do campo de pesquisa",
"rr_distribution_method": "Distribuição",
"rr_distribution_method_description": "Permite otimizar a distribuição para máxima disponibilidade ou buscar uma atribuição mais equilibrada.",
"rr_distribution_method_availability_title": "Maximizar disponibilidade",
"rr_distribution_method_availability_description": "Permite que os agendadores marquem reuniões sempre que um anfitrião estiver disponível. Use isso para maximizar o número de reuniões potenciais agendadas quando a distribuição uniforme de reuniões entre os anfitriões for menos importante.",
"rr_distribution_method_balanced_title": "Balanceamento de carga",
"rr_distribution_method_balanced_description": "Monitoraremos quantas reservas foram feitas com cada anfitrião e compararemos com os outros, desativando alguns anfitriões que estão muito à frente para que as reservas sejam distribuídas uniformemente.",
"exclude_emails_that_contain": "Excluir e-mails que contêm ...",
"exclude_emails_match_found_error_message": "Por favor, insira um endereço de e-mail corporativo válido",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Adicione suas novas strings aqui em cima ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Acção necessária para reagendamento: Por favor reserve uma nova hora para {{eventType}} com {{name}}",
"hi_user_name": "Olá {{name}}",
"ics_event_title": "{{eventType}} com {{name}}",
"please_book_a_time_sometime_later": "Ninguém estava disponível no momento. Por favor, faça uma reserva para um horário mais tarde",
"please_book_a_time_sometime_later": "Parece que todos os nossos especialistas estão ocupados no momento. Por favor, agende uma chamada em um horário que seja melhor para você e estaremos prontos para ajudá-lo.",
"schedule_instead": "Agendar em vez disso",
"new_event_subject": "Novo evento: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Junte-se através de {{entryPoint}}",
"notes": "Notas",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook desativado",
"webhook_response": "Resposta do Webhook",
"webhook_test": "Teste do Webhook",
"webhook_update_form": "Formulário de atualização de webhook",
"webhook_update_form_description": "Adicione um webhook ao seu OAuthClient.",
"manage_your_webhook": "Gerir o seu Webhook",
"webhook_created_successfully": "Webhook criado com sucesso!",
"webhook_updated_successfully": "Webhook atualizado com sucesso!",
@@ -348,9 +351,13 @@
"other": "Outras",
"email_sign_in_subject": "A sua ligação de início de sessão para {{appName}}",
"round_robin_emailed_you_and_attendees": "Está a reunir com {{user}}. Enviámos um e-mail para si e para os outros participantes com um convite de calendário com todos os detalhes.",
"round_robin_emailed_host_and_attendee": "{{host}} terá uma reunião com {{attendee}}. Enviamos um e-mail com um convite para o calendário contendo todos os detalhes.",
"emailed_you_and_attendees": "Enviámos um email para si e para os outros participantes com um convite de calendário com todos os detalhes.",
"emailed_host_and_attendee": "Enviamos um e-mail com um convite para o calendário contendo todos os detalhes.",
"emailed_you_and_attendees_recurring": "Enviámos um email para si e para os outros participantes com um convite de calendário para o primeiro destes eventos recorrentes.",
"round_robin_emailed_you_and_attendees_recurring": "Está a reunir com {{user}}. Enviámos um e-mail para si e para os outros participantes com um convite de calendário para o primeiro destes eventos recorrentes.",
"emailed_host_and_attendee_recurring": "Enviamos um e-mail com um convite para o calendário contendo os detalhes do primeiro destes eventos recorrentes.",
"round_robin_emailed_you_and_attendees_recurring": "Você terá uma reunião com {{user}}. Enviamos um e-mail com um convite para o calendário contendo os detalhes do primeiro destes eventos recorrentes.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} terá uma reunião com {{attendee}}. Enviamos um e-mail com um convite para o calendário contendo os detalhes do primeiro destes eventos recorrentes.",
"emailed_you_and_any_other_attendees": "Esta informação foi enviada para si e para todos os outros participantes.",
"needs_to_be_confirmed_or_rejected": "A sua reserva ainda precisa de ser confirmada ou rejeitada.",
"needs_to_be_confirmed_or_rejected_recurring": "A sua reunião recorrente ainda precisa de ser confirmada ou rejeitada.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Voltar às Reservas",
"free_to_pick_another_event_type": "Sinta-se à vontade para escolher outro evento a qualquer hora.",
"cancelled": "Cancelado",
"no_booking": "Sem agendamento",
"awaiting_host": "Aguardando anfitrião",
"cancellation_successful": "Cancelado com Sucesso",
"really_cancel_booking": "Deseja realmente cancelar a sua reserva?",
"cannot_cancel_booking": "Não pode cancelar esta reserva",
@@ -703,6 +712,9 @@
"no_teams": "Ainda não tem nenhuma equipa.",
"no_teams_description": "As equipas permitem-lhe reservar eventos partilhados entre os seus colaboradores.",
"submit": "Enviar",
"confirm_remove_attribute": "Sim, remover atributo",
"remove_attribute": "Remover atributo",
"remove_attribute_confirmation_message": "Você tem certeza de que deseja remover o atributo '{{name}}'? Todos os usuários atualmente atribuídos a ele serão desassociados.",
"delete": "Apagar",
"update": "Atualizar",
"save": "Guardar",
@@ -1237,8 +1249,8 @@
"number_provided": "Será fornecido um número de telefone",
"before_event_trigger": "antes do evento iniciar",
"event_cancelled_trigger": "quando o evento for cancelado",
"after_hosts_cal_video_no_show": "Após os anfitriões não se juntarem ao vídeo do Cal",
"after_guests_cal_video_no_show": "Após os convidados não se juntarem ao vídeo do Cal",
"after_hosts_cal_video_no_show": "Após os anfitriões não terem participado do vídeo do Cal",
"after_guests_cal_video_no_show": "Após os convidados não terem participado do vídeo do Cal",
"new_event_trigger": "quando um novo evento for reservado",
"email_host_action": "enviar email ao anfitrião",
"email_attendee_action": "enviar e-mail aos participantes",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Roteamento",
"routing_forms_description": "Crie formulários para direcionar os participantes para os destinos corretos",
"routing_forms_send_email_owner": "Enviar e-mail ao proprietário",
"routing_forms_send_email_owner_description": "Envia um e-mail ao proprietário quando o formulário for submetido",
@@ -1630,6 +1643,7 @@
"format": "Formato",
"uppercase_for_letters": "Utilize letras maiúsculas para todas as letras",
"replace_whitespaces_underscores": "Substituir espaços em branco com carateres de sublinhado",
"platform_billing": "Faturação da plataforma",
"manage_billing": "Gerir faturação",
"manage_billing_description": "Gerir tudo o que esteja relacionado com a faturação",
"billing_freeplan_title": "Atualmente está a utilizar o plano GRATUITO",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "À procura de mais Insights?",
"filters": "Filtros",
"add_filter": "Adicionar filtro",
"add_rule": "Adicionar regra",
"add_rule_group": "Adicionar grupo de regras",
"remove_filters": "Limpar todos os filtros",
"email_verified": "E-mail verificado",
"select_user": "Selecionar utilizador",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Configurar a sua organização",
"set_up_your_platform_organization": "Configurar a sua plataforma",
"organizations_description": "As organizações são ambientes partilhados onde as equipas podem criar tipos de eventos partilhados, aplicações, fluxos de trabalho e muito mais.",
"plans": "Planos",
"platform": "Plataforma",
"platform_description": "Gerir tudo relacionado com a plataforma.",
"platform_organization_description": "A plataforma Cal.com permite, de forma muito simples, integrar agendamentos na sua aplicação utilizando APIs e atoms da plataforma.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Selecione alguns horários disponíveis e incorpore-os no seu E-mail",
"select_time": "Selecionar horário",
"select_date": "Selecionar data",
"connecting_you_to_someone": "Estamos a conectá-lo a alguém.",
"connecting_you_to_someone": "Estamos conectando você a alguém da {{orgName}}.",
"please_do_not_close_this_tab": "Por favor, não feche ou atualize esta página",
"see_all_available_times": "Ver todos os horários disponíveis",
"org_team_names_example_1": "Por exemplo, Equipa de Marketing",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "A opção lugar não suporta múltiplas durações",
"include_calendar_event": "Incluir evento no calendário",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formulário de criação de cliente OAuth",
"oAuth_client_creation_form_description": "Este é o formulário para criar um novo cliente OAuth",
"oAuth_client_updation_form": "Formulário de atualização de cliente OAuth",
"oAuth_client_updation_form_description": "Este é o formulário para editar um cliente OAuth existente",
"recently_added": "Adicionados recentemente",
"connect_all_calendars": "Associe todos os seus calendários",
"connect_all_calendars_description": "{{appName}} lê a disponibilidade de todos os seus calendários existentes.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Limites de reservas atualizados com sucesso",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Não tem autorização para fazer esta alteração na reserva",
"matching_members": "Membros correspondentes",
"matching_members_queue_using_attribute_weights": "Fila de membros correspondentes (usando pesos de atributos)",
"matching_members_queue_using_event_assignee_weights": "Fila de membros correspondentes (usando pesos de responsáveis por eventos)",
"no_matching_members": "Nenhum membro correspondente. Será utilizado como alternativa os membros da equipa atribuídos ao tipo de evento.",
"no_matching_members_will_fallback_to_all_assigned_members": "Nenhum membro correspondente. Irá recorrer aos membros da equipa atribuídos ao tipo de evento. Considere adicionar um fallback ou corrigir a lógica de using_fallback_members",
"hide_calendar_event_details": "Ocultar detalhes dos eventos do calendário em calendários partilhados",
@@ -2704,6 +2727,8 @@
"add_new_field": "Adicionar novo campo",
"you_dont_have_access_to_reroute_this_booking": "Não tem acesso para redirecionar esta reserva",
"form_response_not_found": "Resposta do formulário não encontrada",
"contact_owner": "Proprietário do contato",
"contact_owner_not_found": "Não encontrado",
"using_fallback_members": "A usar membros de fallback",
"chosen_route": "Rota escolhida",
"attribute_logic_matched": "Lógica de atributos correspondida",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Hora de fim do evento no fuso horário do participante",
"salesforce_create_event_on_contact": "Criar evento no contacto, se existir. Caso contrário, recorrer ao lead",
"salesforce_owner_name_to_change": "Nome do proprietário a alterar",
"dont_have_access_this_page": "Você não tem acesso a esta página",
"you_need_admin_or_owner_privileges_to_access": "Para visualizar ou interagir com esta página, você deve ter privilégios de administrador ou proprietário",
"field_type": "Tipo de campo",
"when_to_write": "Quando escrever",
"salesforce_on_booking_write_to_record": "Na reserva, escrever num campo personalizado no registo {{record}} do participante",
"on_every_booking": "Em cada reserva",
"only_if_field_is_empty": "Apenas se o campo estiver vazio",
"booking_start_date": "Data de início da reserva",
"booking_created_date": "Data de criação da reserva",
"booking_reassigned_to_host": "Reserva reatribuída a {{host}}",
"no_contact_owner": "Sem proprietário do contato",
"routing_forms_created": "Formulários de roteamento criados",
"routing_forms_total_responses": "Total de respostas",
"routing_forms_total_responses_without_booking": "Total de respostas sem agendamento",
"routing_forms_total_responses_with_booking": "Total de respostas com agendamento",
"routing_form_insights": "Sem agendamentos",
"routing_form_insights_form_name_header": "Nome do formulário",
"routing_form_insights_booking_status_header": "Agendamento",
"routing_form_insights_response_no_booking": "Sem agendamento",
"routing_form_insights_booked_by": "Agendado por",
"routing_form_insights_created_at": "Criado em",
"routing_form_insights_booking_status": "Status do agendamento",
"routing_form_insights_booking_at": "Agendado em",
"routing_form_insights_submitted_at": "Enviado em",
"access_denied": "Acesso negado",
"salesforce_route_to_owner": "O proprietário do contato será o anfitrião do Round Robin se disponível",
"salesforce_do_not_route_to_owner": "O proprietário do contato não será forçado (ainda pode ser anfitrião se corresponder aos atributos e critérios do Round Robin)",
"salesforce_route_to_custom_lookup_field": "Direcionar para um usuário que corresponda a um campo de pesquisa em uma conta",
"salesforce_option": "Opção do Salesforce",
"lookup_field_name": "Nome do campo de pesquisa",
"rr_distribution_method": "Distribuição",
"rr_distribution_method_description": "Permite otimizar a distribuição para máxima disponibilidade ou para buscar uma atribuição mais equilibrada.",
"rr_distribution_method_availability_title": "Maximizar disponibilidade",
"rr_distribution_method_availability_description": "Permite que os agendadores marquem reuniões sempre que um anfitrião estiver disponível. Use isso para maximizar o número de reuniões potenciais agendadas quando a distribuição uniforme de reuniões entre os anfitriões for menos importante.",
"rr_distribution_method_balanced_title": "Balanceamento de carga",
"rr_distribution_method_balanced_description": "Monitoraremos quantas reservas foram feitas com cada anfitrião e compararemos com os outros, desativando alguns anfitriões que estão muito à frente para que as reservas sejam distribuídas uniformemente.",
"exclude_emails_that_contain": "Excluir emails que contêm ...",
"exclude_emails_match_found_error_message": "Por favor, insira um endereço de email de trabalho válido",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Acțiunea necesită reprogramare: rezervați o nouă dată pentru {{eventType}} cu {{name}}",
"hi_user_name": "Salut {{name}}",
"ics_event_title": "{{eventType}} cu {{name}}",
"please_book_a_time_sometime_later": "Ups, nu te-am putut conecta de această dată. Te rugăm să programezi un apel pentru o dată viitoare.",
"please_book_a_time_sometime_later": "Se pare că toți experții noștri sunt ocupați în acest moment. Vă rugăm să programați un apel la un moment care vi se potrivește cel mai bine și vom fi pregătiți să vă asistăm.",
"schedule_instead": "Programați în schimb",
"new_event_subject": "Eveniment nou: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Alăturați-vă de {{entryPoint}}",
"notes": "Notiţe",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook dezactivat",
"webhook_response": "Răspuns Webhook",
"webhook_test": "Testul Webhook",
"webhook_update_form": "Formular de actualizare webhook",
"webhook_update_form_description": "Adăugați un webhook la clientul dumneavoastră OAuth.",
"manage_your_webhook": "Gestionați webhook-ul",
"webhook_created_successfully": "Webhook creat cu succes!",
"webhook_updated_successfully": "Webhook actualizat cu succes!",
@@ -348,9 +351,13 @@
"other": "Altele",
"email_sign_in_subject": "Linkul tău de conectare pentru {{appName}}",
"round_robin_emailed_you_and_attendees": "Te întâlnești cu {{user}}. Am trimis un email cu o invitație în calendar cu detaliile către toți participanții.",
"round_robin_emailed_host_and_attendee": "{{host}} se întâlnește cu {{attendee}}. Am trimis un email cu o invitație în calendar cu detaliile către toată lumea.",
"emailed_you_and_attendees": "V-am trimis un e-mail dumneavoastră şi celuilalt participant la o invitaţie în calendar cu toate detaliile.",
"emailed_host_and_attendee": "Am trimis un email cu o invitație în calendar cu detaliile către toată lumea.",
"emailed_you_and_attendees_recurring": "V-am trimis un e-mail dvs. și celorlalți participanți cu o invitație în calendar pentru primul dintre aceste evenimente recurente.",
"round_robin_emailed_you_and_attendees_recurring": "Te întâlnești cu {{user}}. Am trimis un email cu o invitație în calendar cu detaliile către toți participanții pentru primul dintre aceste evenimente recurente.",
"emailed_host_and_attendee_recurring": "Am trimis un email cu o invitație în calendar cu detaliile către toată lumea pentru primul dintre aceste evenimente recurente.",
"round_robin_emailed_you_and_attendees_recurring": "Te întâlnești cu {{user}}. Am trimis un email cu o invitație în calendar cu detaliile către toată lumea pentru primul dintre aceste evenimente recurente.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} se întâlnește cu {{attendee}}. Am trimis un email cu o invitație în calendar cu detaliile către toată lumea pentru primul dintre aceste evenimente recurente.",
"emailed_you_and_any_other_attendees": "Dumneavoastră şi oricare alţi participanţi aţi primit prin e-mail aceste informaţii.",
"needs_to_be_confirmed_or_rejected": "Rezervarea dvs. încă trebuie confirmată sau respinsă.",
"needs_to_be_confirmed_or_rejected_recurring": "Întâlnirea dvs. recurentă încă trebuie confirmată sau respinsă.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Înapoi la rezervări",
"free_to_pick_another_event_type": "Puteți alege un alt eveniment oricând.",
"cancelled": "Anulat",
"no_booking": "Fără programare",
"awaiting_host": "Se așteaptă gazda",
"cancellation_successful": "Anulare cu succes",
"really_cancel_booking": "Chiar doriți să anulați rezervarea?",
"cannot_cancel_booking": "Nu puteți anula această rezervare",
@@ -703,6 +712,9 @@
"no_teams": "Încă nu aveți nicio echipă.",
"no_teams_description": "Echipele permit altora să rezerve evenimente distribuite între colegii dvs.",
"submit": "Trimiteți",
"confirm_remove_attribute": "Da, elimină atributul",
"remove_attribute": "Elimină atributul",
"remove_attribute_confirmation_message": "Ești sigur că vrei să elimini atributul '{{name}}'? Toți utilizatorii care sunt în prezent asociați cu acesta vor fi dezasociați.",
"delete": "Şterge",
"update": "Actualizează",
"save": "Salvează",
@@ -1237,8 +1249,8 @@
"number_provided": "Numărul de telefon va fi furnizat",
"before_event_trigger": "înainte de începerea evenimentului",
"event_cancelled_trigger": "la anularea evenimentului",
"after_hosts_cal_video_no_show": "După ce gazdele nu se alătură la cal video",
"after_guests_cal_video_no_show": "După ce invitații nu se alătură la cal video",
"after_hosts_cal_video_no_show": "După ce gazdele nu s-au alăturat la cal video",
"after_guests_cal_video_no_show": "După ce oaspeții nu s-au alăturat la cal video",
"new_event_trigger": "când este rezervat noul eveniment",
"email_host_action": "trimiteți e-mail la gazdă",
"email_attendee_action": "trimiteți e-mail participanților",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Direcționare",
"routing_forms_description": "Creați formulare pentru a direcționa participanții către destinațiile corecte",
"routing_forms_send_email_owner": "Trimiteți un e-mail către proprietar",
"routing_forms_send_email_owner_description": "Trimite un e-mail către proprietar atunci când este trimis formularul",
@@ -1630,6 +1643,7 @@
"format": "Format",
"uppercase_for_letters": "Utilizați majuscule pentru toate literele",
"replace_whitespaces_underscores": "Înlocuiți spațiile cu caractere de subliniere",
"platform_billing": "Facturare platformă",
"manage_billing": "Gestionați facturarea",
"manage_billing_description": "Gestionați toate aspectele legate de facturare",
"billing_freeplan_title": "Utilizați planul GRATUIT în prezent",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Căutați mai multe perspective?",
"filters": "Filtre",
"add_filter": "Adăugare filtru",
"add_rule": "Adaugă regulă",
"add_rule_group": "Adaugă grup de reguli",
"remove_filters": "Șterge toate filtrele",
"email_verified": "Email verificat",
"select_user": "Selectare utilizator",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Configurați organizația",
"set_up_your_platform_organization": "Configurează-ți platforma",
"organizations_description": "Organizațiile sunt medii partajate în care echipele pot crea tipuri de evenimente, aplicații, fluxuri de lucru comune și multe altele.",
"plans": "Planuri",
"platform": "Platformă",
"platform_description": "Gestionează tot ce ține de platformă.",
"platform_organization_description": "Platforma Cal.com îți permite să integrezi programarea fără efort în aplicația ta folosind API-uri și atomi de platformă.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Selectați câteva date disponibile și încorporați-le în e-mailul dvs.",
"select_time": "Selectați ora",
"select_date": "Selectați data",
"connecting_you_to_someone": "Te conectăm cu cineva.",
"connecting_you_to_someone": "Vă conectăm cu cineva de la {{orgName}}.",
"please_do_not_close_this_tab": "Vă rugăm să nu închideți sau să reîmprospătați această pagină",
"see_all_available_times": "Vedeți toate orele disponibile",
"org_team_names_example_1": "de ex. echipa de marketing",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Opțiunea de loc nu acceptă mai multe durate",
"include_calendar_event": "Includeți eveniment din calendar",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formular de creare client OAuth",
"oAuth_client_creation_form_description": "Acesta este formularul pentru crearea unui nou client OAuth",
"oAuth_client_updation_form": "Formular de actualizare client OAuth",
"oAuth_client_updation_form_description": "Acesta este formularul pentru editarea unui client OAuth existent",
"recently_added": "Adăugate recent",
"connect_all_calendars": "Conectați-vă toate calendarele",
"connect_all_calendars_description": "{{appName}} citește disponibilitatea din toate calendarele tale existente.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Limitele de rezervare au fost actualizate cu succes",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Nu aveți autorizația necesară pentru a face această modificare în rezervare",
"matching_members": "Membri corespunzători",
"matching_members_queue_using_attribute_weights": "Coadă de potrivire membri (folosind ponderi de atribute)",
"matching_members_queue_using_event_assignee_weights": "Coadă de potrivire membri (folosind ponderi pentru responsabilii evenimentelor)",
"no_matching_members": "Nu există membri corespunzători. Se va reveni la utilizarea membrilor echipei alocați tipului de eveniment.",
"no_matching_members_will_fallback_to_all_assigned_members": "Nu există membri potriviți. Se va reveni la utilizarea membrilor echipei atribuiți tipului de eveniment. Luați în considerare adăugarea unei opțiuni de rezervă sau corectarea logicii de utilizare a membrilor de rezervă",
"hide_calendar_event_details": "Ascunde detaliile evenimentelor din calendar pe calendarele partajate",
@@ -2704,6 +2727,8 @@
"add_new_field": "Adaugă câmp nou",
"you_dont_have_access_to_reroute_this_booking": "Nu ai acces pentru a redirecționa această rezervare",
"form_response_not_found": "Răspunsul formularului nu a fost găsit",
"contact_owner": "Proprietarul contactului",
"contact_owner_not_found": "Nu a fost găsit",
"using_fallback_members": "Se utilizează membrii de rezervă",
"chosen_route": "Ruta aleasă",
"attribute_logic_matched": "Logica atributelor corespunde",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Ora de sfârșit a evenimentului în fusul orar al participantului",
"salesforce_create_event_on_contact": "Creați evenimentul pe contact, dacă există. Altfel, reveniți la lead",
"salesforce_owner_name_to_change": "Numele proprietarului de schimbat",
"dont_have_access_this_page": "Nu aveți acces la această pagină",
"you_need_admin_or_owner_privileges_to_access": "Pentru a vizualiza sau interacționa cu această pagină, trebuie să aveți privilegii de administrator sau proprietar",
"field_type": "Tip câmp",
"when_to_write": "Când să se scrie",
"salesforce_on_booking_write_to_record": "La rezervare, scrie într-un câmp personalizat în înregistrarea {{record}} a participantului",
"on_every_booking": "La fiecare rezervare",
"only_if_field_is_empty": "Doar dacă câmpul este gol",
"booking_start_date": "Data de început a rezervării",
"booking_created_date": "Data creării rezervării",
"booking_reassigned_to_host": "Rezervare reatribuită către {{host}}",
"no_contact_owner": "Fără proprietar de contact",
"routing_forms_created": "Formulare de direcționare create",
"routing_forms_total_responses": "Total răspunsuri",
"routing_forms_total_responses_without_booking": "Total răspunsuri fără programare",
"routing_forms_total_responses_with_booking": "Total răspunsuri cu programare",
"routing_form_insights": "Fără programări",
"routing_form_insights_form_name_header": "Nume formular",
"routing_form_insights_booking_status_header": "Programare",
"routing_form_insights_response_no_booking": "Fără programare",
"routing_form_insights_booked_by": "Programat de",
"routing_form_insights_created_at": "Creat la",
"routing_form_insights_booking_status": "Status programare",
"routing_form_insights_booking_at": "Programat la",
"routing_form_insights_submitted_at": "Trimis la",
"access_denied": "Acces refuzat",
"salesforce_route_to_owner": "Proprietarul contactului va fi gazda Round Robin dacă este disponibil",
"salesforce_do_not_route_to_owner": "Proprietarul contactului nu va fi forțat (poate fi totuși gazdă dacă se potrivesc atributele și criteriile Round Robin)",
"salesforce_route_to_custom_lookup_field": "Redirecționează către un utilizator care se potrivește cu un câmp de căutare pe un cont",
"salesforce_option": "Opțiune Salesforce",
"lookup_field_name": "Nume câmp de căutare",
"rr_distribution_method": "Distribuție",
"rr_distribution_method_description": "Permite optimizarea distribuției pentru disponibilitate maximă sau pentru o alocare mai echilibrată.",
"rr_distribution_method_availability_title": "Maximizează disponibilitatea",
"rr_distribution_method_availability_description": "Permite programatorilor să rezerve întâlniri oricând un host este disponibil. Folosește această opțiune pentru a maximiza numărul potențial de întâlniri programate și când distribuția uniformă a întâlnirilor între hosți este mai puțin importantă.",
"rr_distribution_method_balanced_title": "Echilibrarea încărcării",
"rr_distribution_method_balanced_description": "Vom monitoriza câte rezervări au fost făcute cu fiecare host și vom compara acest lucru cu ceilalți, dezactivând temporar hosții care au prea multe programări, astfel încât rezervările să fie distribuite uniform.",
"exclude_emails_that_contain": "Excludează emailurile care conțin ...",
"exclude_emails_match_found_error_message": "Vă rugăm să introduceți o adresă de email de serviciu validă",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Adăugați stringurile noi deasupra acestui rând ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
File diff suppressed because it is too large Load Diff
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Promena vremena zahteva radnju: zakažite novo vreme za {{eventType}} sa {{name}}",
"hi_user_name": "Zdravo {{name}}",
"ics_event_title": "{{eventType}} sa {{name}}",
"please_book_a_time_sometime_later": "Ups, nismo uspeli da vas povežemo ovaj put. Molimo vas da zakažete poziv za kasnije.",
"please_book_a_time_sometime_later": "Izgleda da su svi naši stručnjaci trenutno zauzeti. Molimo vas da zakažete poziv u vreme koje vam najviše odgovara i bićemo spremni da vam pomognemo.",
"schedule_instead": "Zakažite umesto toga",
"new_event_subject": "Novi dogadjaj: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Pridruži se putem {{entryPoint}}",
"notes": "Beleške",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook Onemogućen",
"webhook_response": "Webhook Odgovor",
"webhook_test": "Webhook test",
"webhook_update_form": "Forma za ažuriranje webhook-a",
"webhook_update_form_description": "Dodajte webhook vašem OAuthClient-u.",
"manage_your_webhook": "Upravljajte sa webhook-om",
"webhook_created_successfully": "Webhook uspešno napravljen!",
"webhook_updated_successfully": "Webhook upsešno ažuriran!",
@@ -348,9 +351,13 @@
"other": "Drugo",
"email_sign_in_subject": "Vaša veza za prijavu na {{appName}}",
"round_robin_emailed_you_and_attendees": "Sastajete se sa {{user}}. Poslali smo email sa pozivom na kalendar sa detaljima svima.",
"round_robin_emailed_host_and_attendee": "{{host}} se sastaje sa {{attendee}}. Poslali smo e-mail sa pozivnicom za kalendar sa detaljima svima.",
"emailed_you_and_attendees": "Poslali smo vama i ostalim učesnicima kalendarski poziv sa svim detaljima.",
"emailed_host_and_attendee": "Poslali smo e-mail sa pozivnicom za kalendar sa detaljima svima.",
"emailed_you_and_attendees_recurring": "Poslali smo vama i ostalim učesnicima kalendarski poziv za prvi od ovih ponavljajućih događaja.",
"round_robin_emailed_you_and_attendees_recurring": "Sastajete se sa {{user}}. Poslali smo email sa pozivom na kalendar sa detaljima svima za prvi od ovih ponavljajućih događaja.",
"emailed_host_and_attendee_recurring": "Poslali smo e-mail sa pozivnicom za kalendar sa detaljima svima za prvi od ovih ponavljajućih događaja.",
"round_robin_emailed_you_and_attendees_recurring": "Sastajete se sa {{user}}. Poslali smo e-mail sa pozivnicom za kalendar sa detaljima svima za prvi od ovih ponavljajućih događaja.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} se sastaje sa {{attendee}}. Poslali smo e-mail sa pozivnicom za kalendar sa detaljima svima za prvi od ovih ponavljajućih događaja.",
"emailed_you_and_any_other_attendees": "Vi i ostali učesnici ste dobili e-poštu sa ovim informacijama.",
"needs_to_be_confirmed_or_rejected": "Vaša rezervicija i dalje mora da se potrvrdi ili odbije.",
"needs_to_be_confirmed_or_rejected_recurring": "Vaš ponavljajući sastanak i dalje mora da se potvrdi ili odbije.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Nazad na rezervacije",
"free_to_pick_another_event_type": "Slobodno izaberite drugi dogadjaj u bilo kom trenutku.",
"cancelled": "Otkazano",
"no_booking": "Nema rezervacije",
"awaiting_host": "Čeka se domaćin",
"cancellation_successful": "Otkazivanje uspešno",
"really_cancel_booking": "Zaista želite da otkažete rezervaciju?",
"cannot_cancel_booking": "Ne možete otkazati ovu rezervaciju",
@@ -703,6 +712,9 @@
"no_teams": "Još uvek nemate nijedan tim.",
"no_teams_description": "Timovi služe za rezervacije dogadjaja koje delite sa vašim kolegama.",
"submit": "Podnesi",
"confirm_remove_attribute": "Da, ukloni atribut",
"remove_attribute": "Ukloni atribut",
"remove_attribute_confirmation_message": "Da li ste sigurni da želite da uklonite atribut '{{name}}'? Svi korisnici koji su trenutno dodeljeni ovom atributu biće razdodeljeni.",
"delete": "Obriši",
"update": "Ažuriraj",
"save": "Snimi",
@@ -1237,8 +1249,8 @@
"number_provided": "Broj telefona će biti dostavljen",
"before_event_trigger": "pre početka događaja",
"event_cancelled_trigger": "kada je događaj otkazan",
"after_hosts_cal_video_no_show": "Nakon što se domaćini ne pojave na Cal video sastanku",
"after_guests_cal_video_no_show": "Nakon što se gosti ne pojave na Cal video sastanku",
"after_hosts_cal_video_no_show": "Nakon što se domaćini nisu pojavili na cal video pozivu",
"after_guests_cal_video_no_show": "Nakon što se gosti nisu pojavili na cal video pozivu",
"new_event_trigger": "kada je zakazan novi događaj",
"email_host_action": "pošalji imejl domaćinu",
"email_attendee_action": "pošalji imejl učesnicima",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Rutiranje",
"routing_forms_description": "Kreirajte formulare da biste uputili učesnike na ispravna odredišta",
"routing_forms_send_email_owner": "Pošaljite imejl vlasniku",
"routing_forms_send_email_owner_description": "Pošaljite imejl vlasniku kada pošaljete obrazac",
@@ -1630,6 +1643,7 @@
"format": "Format",
"uppercase_for_letters": "Koristite velika slova za sva slova",
"replace_whitespaces_underscores": "Zamenite prazna mesta donjom crtom",
"platform_billing": "Naplata platforme",
"manage_billing": "Upravljajte naplatom",
"manage_billing_description": "Upravljajte svim u vezi sa naplatom",
"billing_freeplan_title": "Trenutno ste na BESPLATNOM planu",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Tražite još Insights podataka?",
"filters": "Filteri",
"add_filter": "Dodajte filter",
"add_rule": "Dodaj pravilo",
"add_rule_group": "Dodaj grupu pravila",
"remove_filters": "Ukloni sve filtere",
"email_verified": "Email verifikovan",
"select_user": "Izaberite korisnika",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Konfigurisanje profila organizacije",
"set_up_your_platform_organization": "Postavite svoju platformu",
"organizations_description": "Organizacije su deljena okruženja gde timovi mogu da kreiraju deljene vrste događaja, aplikacije, radne tokove i još mnogo toga.",
"plans": "Planovi",
"platform": "Platforma",
"platform_description": "Upravljajte svim što je povezano sa platformom.",
"platform_organization_description": "Cal.com platforma vam omogućava da lako integrišete zakazivanje u vašu aplikaciju koristeći platform API-je i atome.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Izaberite nekoliko dostupnih termina i ugradite ih u svoj imejl",
"select_time": "Izaberite vreme",
"select_date": "Izaberite datum",
"connecting_you_to_someone": "Povezujemo vas sa nekim.",
"connecting_you_to_someone": "Povezujemo vas sa nekim iz {{orgName}}.",
"please_do_not_close_this_tab": "Молимо вас да не затварате или освежавате ову страницу",
"see_all_available_times": "Pogledajte sva dostupna vremena",
"org_team_names_example_1": "npr. Marketing tim",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Opcije za mesta ne podržavaju višestruko trajanje",
"include_calendar_event": "Uključite događaj u kalendaru",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Forma za kreiranje OAuth klijenta",
"oAuth_client_creation_form_description": "Ovo je forma za kreiranje novog OAuth klijenta",
"oAuth_client_updation_form": "Forma za ažuriranje OAuth klijenta",
"oAuth_client_updation_form_description": "Ovo je forma za uređivanje postojećeg OAuth klijenta",
"recently_added": "Nedavno dodato",
"connect_all_calendars": "Povežite sve svoje kalendare",
"connect_all_calendars_description": "{{appName}} čita dostupnost iz svih vaših postojećih kalendara.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Ograničenja zakazivanja su uspešno ažurirana",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Nemate ovlašćenje da izvršite ovu promenu u rezervaciji",
"matching_members": "Одговарајући чланови",
"matching_members_queue_using_attribute_weights": "Red članova za uparivanje (korišćenjem težinskih atributa)",
"matching_members_queue_using_event_assignee_weights": "Red članova za uparivanje (korišćenjem težinskih vrednosti dodeljenih događaju)",
"no_matching_members": "Нема одговарајућих чланова. Систем ће се вратити на коришћење чланова тима додељених типу догађаја.",
"no_matching_members_will_fallback_to_all_assigned_members": "Nema odgovarajućih članova. Koristiće se članovi tima dodeljeni tipu događaja. Razmotrite dodavanje rezervne opcije ili ispravku logike korišćenja rezervnih članova",
"hide_calendar_event_details": "Sakrij detalje događaja u deljenim kalendarima",
@@ -2704,6 +2727,8 @@
"add_new_field": "Dodaj novo polje",
"you_dont_have_access_to_reroute_this_booking": "Nemate pristup za preusmeravanje ove rezervacije",
"form_response_not_found": "Odgovor na formular nije pronađen",
"contact_owner": "Vlasnik kontakta",
"contact_owner_not_found": "Nije pronađen",
"using_fallback_members": "Korišćenje rezervnih članova",
"chosen_route": "Izabrana ruta",
"attribute_logic_matched": "Logika atributa se podudara",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Vreme završetka događaja u vremenskoj zoni učesnika",
"salesforce_create_event_on_contact": "Kreiraj događaj na kontaktu, ako postoji. U suprotnom, prebaci na lead",
"salesforce_owner_name_to_change": "Ime vlasnika koje treba promeniti",
"dont_have_access_this_page": "Nemate pristup ovoj stranici",
"you_need_admin_or_owner_privileges_to_access": "Da biste pregledali ili koristili ovu stranicu, morate imati administratorske ili vlasničke privilegije",
"field_type": "Tip polja",
"when_to_write": "Kada pisati",
"salesforce_on_booking_write_to_record": "Pri rezervaciji, upiši u prilagođeno polje na {{record}} zapisu učesnika",
"on_every_booking": "Pri svakoj rezervaciji",
"only_if_field_is_empty": "Samo ako je polje prazno",
"booking_start_date": "Datum početka rezervacije",
"booking_created_date": "Datum kreiranja rezervacije",
"booking_reassigned_to_host": "Rezervacija dodeljena {{host}}-u",
"no_contact_owner": "Nema vlasnika kontakta",
"routing_forms_created": "Kreirani formulari za rutiranje",
"routing_forms_total_responses": "Ukupno odgovora",
"routing_forms_total_responses_without_booking": "Ukupno odgovora bez rezervacije",
"routing_forms_total_responses_with_booking": "Ukupno odgovora sa rezervacijom",
"routing_form_insights": "Nema rezervacija",
"routing_form_insights_form_name_header": "Naziv formulara",
"routing_form_insights_booking_status_header": "Rezervacija",
"routing_form_insights_response_no_booking": "Nema rezervacije",
"routing_form_insights_booked_by": "Rezervisao/la",
"routing_form_insights_created_at": "Kreirano",
"routing_form_insights_booking_status": "Status rezervacije",
"routing_form_insights_booking_at": "Vreme rezervacije",
"routing_form_insights_submitted_at": "Vreme podnošenja",
"access_denied": "Pristup odbijen",
"salesforce_route_to_owner": "Vlasnik kontakta će biti Round Robin domaćin ako je dostupan",
"salesforce_do_not_route_to_owner": "Vlasnik kontakta neće biti primoran (može i dalje biti domaćin ako odgovara atributima i Round Robin kriterijumima)",
"salesforce_route_to_custom_lookup_field": "Usmeri ka korisniku koji odgovara polju za pretragu na nalogu",
"salesforce_option": "Salesforce opcija",
"lookup_field_name": "Naziv polja za pretragu",
"rr_distribution_method": "Distribucija",
"rr_distribution_method_description": "Omogućava optimizaciju distribucije za maksimalnu dostupnost ili za balansiranu raspodelu.",
"rr_distribution_method_availability_title": "Maksimalna dostupnost",
"rr_distribution_method_availability_description": "Omogućava zakazivanje sastanaka kad god je domaćin dostupan. Koristite ovo da maksimalno povećate broj potencijalnih sastanaka kada je ravnomerna distribucija sastanaka među domaćinima manje važna.",
"rr_distribution_method_balanced_title": "Balansiranje opterećenja",
"rr_distribution_method_balanced_description": "Pratićemo broj zakazanih sastanaka kod svakog domaćina i upoređivati ga sa ostalima, privremeno onemogućavajući domaćine koji imaju previše sastanaka kako bi distribucija bila ravnomerna.",
"exclude_emails_that_contain": "Isključi e-poruke koje sadrže ...",
"exclude_emails_match_found_error_message": "Molimo unesite važeću poslovnu e-mail adresu",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Dodajte svoje nove stringove iznad ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Åtgärd som krävs Tidsschema: Boka en ny tid för {{eventType}} hos {{name}}",
"hi_user_name": "Hej {{name}}",
"ics_event_title": "{{eventType}} med {{name}}",
"please_book_a_time_sometime_later": "Oj, vi kunde inte ansluta dig den här gången. Vänligen boka ett framtida samtal istället.",
"please_book_a_time_sometime_later": "Det verkar som att alla våra experter är upptagna just nu. Vänligen boka ett samtal vid en tidpunkt som passar dig bäst, så hjälper vi dig då.",
"schedule_instead": "Boka istället",
"new_event_subject": "Ny bokning: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Anslut med {{entryPoint}}",
"notes": "Anteckningar",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webbhook inaktiverad",
"webhook_response": "Webhook svar",
"webhook_test": "Webhook test",
"webhook_update_form": "Formulär för uppdatering av webhook",
"webhook_update_form_description": "Lägg till en webhook till din OAuthClient.",
"manage_your_webhook": "Hantera din webhook",
"webhook_created_successfully": "Webhook har skapats!",
"webhook_updated_successfully": "Webhook har uppdaterats!",
@@ -348,9 +351,13 @@
"other": "Annat",
"email_sign_in_subject": "Din inloggningslänk för {{appName}}",
"round_robin_emailed_you_and_attendees": "Du möter {{user}}. Vi har skickat ett e-postmeddelande med en kalenderinbjudan med detaljerna till alla.",
"round_robin_emailed_host_and_attendee": "{{host}} träffar {{attendee}}. Vi har skickat ett e-postmeddelande med en kalenderinbjudan med detaljerna till alla.",
"emailed_you_and_attendees": "Vi skickade dig och de andra deltagarna en kalenderinbjudan med alla detaljer.",
"emailed_host_and_attendee": "Vi har skickat ett e-postmeddelande med en kalenderinbjudan med detaljerna till alla.",
"emailed_you_and_attendees_recurring": "Vi skickade dig och de andra deltagarna en kalenderinbjudan via e-post för den första av dessa återkommande händelser.",
"round_robin_emailed_you_and_attendees_recurring": "Du möter {{user}}. Vi har skickat ett e-postmeddelande med en kalenderinbjudan med detaljerna till alla för det första av dessa återkommande evenemang.",
"emailed_host_and_attendee_recurring": "Vi har skickat ett e-postmeddelande med en kalenderinbjudan med detaljerna till alla för det första av dessa återkommande evenemang.",
"round_robin_emailed_you_and_attendees_recurring": "Du träffar {{user}}. Vi har skickat ett e-postmeddelande med en kalenderinbjudan med detaljerna till alla för det första av dessa återkommande evenemang.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} träffar {{attendee}}. Vi har skickat ett e-postmeddelande med en kalenderinbjudan med detaljerna till alla för det första av dessa återkommande evenemang.",
"emailed_you_and_any_other_attendees": "Du och alla andra deltagare har fått e-post med denna information.",
"needs_to_be_confirmed_or_rejected": "Din bokning behöver fortfarande bekräftas eller avböjas.",
"needs_to_be_confirmed_or_rejected_recurring": "Ditt återkommande möte behöver fortfarande bekräftas eller avböjas.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Tillbaka till bokningarna",
"free_to_pick_another_event_type": "Känn dig fri att välja en annan händelse när som helst.",
"cancelled": "Avbokad",
"no_booking": "Ingen bokning",
"awaiting_host": "Väntar på värd",
"cancellation_successful": "Avbokning lyckades",
"really_cancel_booking": "Är du säker på att du vill avboka din bokning?",
"cannot_cancel_booking": "Du kan inte avboka denna bokning",
@@ -703,6 +712,9 @@
"no_teams": "Du har inga team ännu.",
"no_teams_description": "Team tillåter andra att boka gemensamma evenemang mellan dina medarbetare.",
"submit": "Skicka",
"confirm_remove_attribute": "Ja, ta bort attribut",
"remove_attribute": "Ta bort attribut",
"remove_attribute_confirmation_message": "Är du säker på att du vill ta bort attributet '{{name}}'? Alla användare som för närvarande är tilldelade det kommer att avregistreras.",
"delete": "Radera",
"update": "Uppdatera",
"save": "Spara",
@@ -1237,8 +1249,8 @@
"number_provided": "Telefonnummer kommer att anges",
"before_event_trigger": "innan händelsen startar",
"event_cancelled_trigger": "när händelsen ställs in",
"after_hosts_cal_video_no_show": "Efter att värdarna inte ansluter till cal video",
"after_guests_cal_video_no_show": "Efter att gästerna inte ansluter till cal video",
"after_hosts_cal_video_no_show": "Efter att värdarna inte deltog i cal-video",
"after_guests_cal_video_no_show": "Efter att gästerna inte deltog i cal-video",
"new_event_trigger": "när ny händelse bokas",
"email_host_action": "skicka e-post till värd",
"email_attendee_action": "skicka e-post till deltagare",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Dirigering",
"routing_forms_description": "Skapa formulär för att dirigera deltagare till rätt mål",
"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",
@@ -1630,6 +1643,7 @@
"format": "Formatera",
"uppercase_for_letters": "Använd versaler för alla bokstäver",
"replace_whitespaces_underscores": "Ersätt blanktecken med understreck",
"platform_billing": "Plattformsfakturering",
"manage_billing": "Hantera fakturering",
"manage_billing_description": "Hantera allt som faktureras",
"billing_freeplan_title": "Du använder för närvarande GRATIS-prenumerationen",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Vill du ha mer Insights?",
"filters": "Filter",
"add_filter": "Lägg till filter",
"add_rule": "Lägg till regel",
"add_rule_group": "Lägg till regelgrupp",
"remove_filters": "Rensa alla filter",
"email_verified": "E-post verifierad",
"select_user": "Välj användare",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Konfigurera din organisation",
"set_up_your_platform_organization": "Ställ in din plattform",
"organizations_description": "Organisationer är delade miljöer där team kan skapa delade händelsetyper, appar, arbetsflöden och mycket mer.",
"plans": "Planer",
"platform": "Plattform",
"platform_description": "Hantera allt som rör plattformen.",
"platform_organization_description": "Cal.com-plattformen låter dig integrera schemaläggning smidigt i din app med hjälp av plattformens API:er och atomer.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Välj några tillgängliga tider och bädda in dem i din e-post",
"select_time": "Välj tid",
"select_date": "Välj datum",
"connecting_you_to_someone": "Vi kopplar dig till någon.",
"connecting_you_to_someone": "Vi kopplar dig till någon från {{orgName}}.",
"please_do_not_close_this_tab": "Vänligen stäng eller uppdatera inte den här sidan",
"see_all_available_times": "Se alla tillgängliga tider",
"org_team_names_example_1": "t.ex. marknadsföringsteam",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Platsalternativet stöder inte flera varaktigheter",
"include_calendar_event": "Inkludera kalenderhändelse",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Formulär för skapande av OAuth-klient",
"oAuth_client_creation_form_description": "Detta är formuläret för att skapa en ny OAuth-klient",
"oAuth_client_updation_form": "Formulär för uppdatering av OAuth-klient",
"oAuth_client_updation_form_description": "Detta är formuläret för att redigera en befintlig OAuth-klient",
"recently_added": "Nyligen tillagda",
"connect_all_calendars": "Anslut alla dina kalendrar",
"connect_all_calendars_description": "{{appName}} läser tillgänglighet från alla dina befintliga kalendrar.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Bokningsgränser uppdaterades framgångsrikt",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Du har inte behörighet att göra denna ändring i bokningen",
"matching_members": "Matchande medlemmar",
"matching_members_queue_using_attribute_weights": "Matchande medlemmars kö (med attributvikter)",
"matching_members_queue_using_event_assignee_weights": "Matchande medlemmars kö (med händelsetilldelningsvikter)",
"no_matching_members": "Inga matchande medlemmar. Det kommer att återgå till att använda de teammedlemmar som är tilldelade till händelsetypen.",
"no_matching_members_will_fallback_to_all_assigned_members": "Inga matchande medlemmar. Det kommer att falla tillbaka på att använda teammedlemmarna som är tilldelade till händelsetypen. Överväg att lägga till en reservplan eller korrigera logiken för using_fallback_members",
"hide_calendar_event_details": "Dölj kalenderhändelsedetaljer på delade kalendrar",
@@ -2704,6 +2727,8 @@
"add_new_field": "Lägg till nytt fält",
"you_dont_have_access_to_reroute_this_booking": "Du har inte behörighet att omdirigera denna bokning",
"form_response_not_found": "Formulärsvar hittades inte",
"contact_owner": "Kontaktägare",
"contact_owner_not_found": "Hittades inte",
"using_fallback_members": "Använder reservmedlemmar",
"chosen_route": "Vald rutt",
"attribute_logic_matched": "Attributlogik matchad",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Händelsens sluttid i deltagarens tidszon",
"salesforce_create_event_on_contact": "Skapa händelse på kontakt om den finns, annars fallback till lead",
"salesforce_owner_name_to_change": "Ägarnamn att ändra",
"dont_have_access_this_page": "Du har inte åtkomst till den här sidan",
"you_need_admin_or_owner_privileges_to_access": "För att visa eller interagera med den här sidan måste du ha administratörs- eller ägarprivilegier",
"field_type": "Fälttyp",
"when_to_write": "När ska det skrivas",
"salesforce_on_booking_write_to_record": "Vid bokning, skriv till ett anpassat fält på deltagarens {{record}}-post",
"on_every_booking": "Vid varje bokning",
"only_if_field_is_empty": "Endast om fältet är tomt",
"booking_start_date": "Bokningens startdatum",
"booking_created_date": "Bokningens skapandedatum",
"booking_reassigned_to_host": "Bokning omtilldelad till {{host}}",
"no_contact_owner": "Ingen kontaktägare",
"routing_forms_created": "Skapade dirigeringsformulär",
"routing_forms_total_responses": "Totalt antal svar",
"routing_forms_total_responses_without_booking": "Totalt antal svar utan bokning",
"routing_forms_total_responses_with_booking": "Totalt antal svar med bokning",
"routing_form_insights": "Inga bokningar",
"routing_form_insights_form_name_header": "Formulärnamn",
"routing_form_insights_booking_status_header": "Bokning",
"routing_form_insights_response_no_booking": "Ingen bokning",
"routing_form_insights_booked_by": "Bokad av",
"routing_form_insights_created_at": "Skapad",
"routing_form_insights_booking_status": "Bokningsstatus",
"routing_form_insights_booking_at": "Bokad den",
"routing_form_insights_submitted_at": "Skickad den",
"access_denied": "Åtkomst nekad",
"salesforce_route_to_owner": "Kontaktägaren blir Round Robin-värd om tillgänglig",
"salesforce_do_not_route_to_owner": "Kontaktägaren kommer inte att tvingas (kan fortfarande vara värd om det matchar attributen och Round Robin-kriterierna)",
"salesforce_route_to_custom_lookup_field": "Rikta till en användare som matchar ett uppslagsfält på ett konto",
"salesforce_option": "Salesforce-alternativ",
"lookup_field_name": "Uppslagsfältsnamn",
"rr_distribution_method": "Distribution",
"rr_distribution_method_description": "Möjliggör optimering av distributionen för maximal tillgänglighet eller för att uppnå en mer balanserad fördelning.",
"rr_distribution_method_availability_title": "Maximera tillgänglighet",
"rr_distribution_method_availability_description": "Låter bokare boka möten när en värd är tillgänglig. Använd detta för att maximera antalet potentiella möten som kan bokas och när jämn fördelning av möten mellan värdar är mindre viktigt.",
"rr_distribution_method_balanced_title": "Lastbalansering",
"rr_distribution_method_balanced_description": "Vi övervakar hur många bokningar som har gjorts med varje värd och jämför detta med andra, och inaktiverar vissa värdar som ligger för långt före så att bokningarna fördelas jämnt.",
"exclude_emails_that_contain": "Uteslut e-postmeddelanden som innehåller ...",
"exclude_emails_match_found_error_message": "Ange en giltig arbets-e-postadress",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Yeniden Planlama İşlemi Gerekiyor: Lütfen {{name}} ile {{eventType}} için yeni bir saat belirleyin",
"hi_user_name": "Merhaba {{name}}",
"ics_event_title": "{{name}} ile {{eventType}}",
"please_book_a_time_sometime_later": "Üzgünüz, bu sefer bağlanamadık. Lütfen ileri bir tarih için arama planlayın.",
"please_book_a_time_sometime_later": "Görünüşe göre şu anda tüm uzmanlarımız meşgul. Lütfen sizin için en uygun olan bir zamanda bir görüşme planlayın, biz de size yardımcı olmaya hazır olacağız.",
"schedule_instead": "Bunun yerine planla",
"new_event_subject": "Yeni etkinlik: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "{{entryPoint}} ile katıl",
"notes": "Notlar",
@@ -198,6 +199,8 @@
"webhook_disabled": "Web Kancası Devre Dışı",
"webhook_response": "Web kancası yanıtı",
"webhook_test": "Web kancası testi",
"webhook_update_form": "Webhook güncelleme formu",
"webhook_update_form_description": "OAuthClient'ınıza bir webhook ekleyin.",
"manage_your_webhook": "Web kancanızı yönetin",
"webhook_created_successfully": "Web kancası başarıyla oluşturuldu!",
"webhook_updated_successfully": "Web kancası başarıyla güncellendi!",
@@ -348,9 +351,13 @@
"other": "Diğer",
"email_sign_in_subject": "{{appName}} için giriş bağlantınız",
"round_robin_emailed_you_and_attendees": "{{user}} ile görüşüyorsunuz. Detayları içeren bir takvim davetiyesi e-postası herkese gönderildi.",
"round_robin_emailed_host_and_attendee": "{{host}}, {{attendee}} ile görüşecek. Herkese detayları içeren takvim davetiyesini e-posta ile gönderdik.",
"emailed_you_and_attendees": "Size ve diğer katılımcılara tüm ayrıntıları içeren bir takvim daveti e-postası gönderdik.",
"emailed_host_and_attendee": "Herkese detayları içeren takvim davetiyesini e-posta ile gönderdik.",
"emailed_you_and_attendees_recurring": "Size ve diğer katılımcılara bu yinelenen etkinliklerin ilki için bir takvim daveti e-postası gönderdik.",
"round_robin_emailed_you_and_attendees_recurring": "{{user}} ile görüşüyorsunuz. Bu tekrarlayan etkinliklerin ilki için detayları içeren bir takvim davetiyesi e-postası herkese gönderildi.",
"emailed_host_and_attendee_recurring": "Bu tekrarlanan etkinliklerin ilki için herkese detayları içeren takvim davetiyesini e-posta ile gönderdik.",
"round_robin_emailed_you_and_attendees_recurring": "{{user}} ile görüşeceksiniz. Bu tekrarlanan etkinliklerin ilki için herkese detayları içeren takvim davetiyesini e-posta ile gönderdik.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}}, {{attendee}} ile görüşecek. Bu tekrarlanan etkinliklerin ilki için herkese detayları içeren takvim davetiyesini e-posta ile gönderdik.",
"emailed_you_and_any_other_attendees": "Bu bilgiler size ve diğer katılımcılara e-posta ile gönderildi.",
"needs_to_be_confirmed_or_rejected": "Rezervasyonunuzun hâlâ onaylanması veya reddedilmesi gerekiyor.",
"needs_to_be_confirmed_or_rejected_recurring": "Yinelenen toplantınızın hâlâ onaylanması veya reddedilmesi gerekiyor.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Rezervasyonlara dön",
"free_to_pick_another_event_type": "İstediğiniz zaman başka bir etkinlik seçmekten çekinmeyin.",
"cancelled": "İptal edildi",
"no_booking": "Rezervasyon yok",
"awaiting_host": "Ev sahibi bekleniyor",
"cancellation_successful": "İptal işlemi başarılı",
"really_cancel_booking": "Rezervasyonunuz gerçekten iptal edilsin mi?",
"cannot_cancel_booking": "Bu rezervasyonu iptal edemezsiniz",
@@ -703,6 +712,9 @@
"no_teams": "Henüz hiç ekibiniz yok.",
"no_teams_description": "Ekipler, iş arkadaşlarınız arasında paylaşılan etkinlik rezervasyonları için diğer kişilere izin verir.",
"submit": "Gönder",
"confirm_remove_attribute": "Evet, özelliği kaldır",
"remove_attribute": "Özelliği kaldır",
"remove_attribute_confirmation_message": "'{{name}}' özelliğini kaldırmak istediğinizden emin misiniz? Bu özelliğe atanmış tüm kullanıcıların ataması kaldırılacak.",
"delete": "Sil",
"update": "Güncelle",
"save": "Kaydet",
@@ -1237,8 +1249,8 @@
"number_provided": "Telefon numarası sağlanacaktır",
"before_event_trigger": "etkinlik başlamadan önce",
"event_cancelled_trigger": "etkinlik iptal edildiğinde",
"after_hosts_cal_video_no_show": "Ev sahipleri Cal video toplantısına katılmadığında",
"after_guests_cal_video_no_show": "Misafirler Cal video toplantısına katılmadığında",
"after_hosts_cal_video_no_show": "Ev sahipleri Cal görüntülü görüşmesine katılmadıktan sonra",
"after_guests_cal_video_no_show": "Misafirler Cal görüntülü görüşmesine katılmadıktan sonra",
"new_event_trigger": "yeni bir etkinlik için rezervasyon yapıldığında",
"email_host_action": "organizatöre e-posta gönder",
"email_attendee_action": "katılımcılara e-posta gönder",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Yönlendirme",
"routing_forms_description": "Katılımcıları doğru destinasyonlara yönlendirmek için form oluşturun",
"routing_forms_send_email_owner": "Sahibine E-posta Gönderin",
"routing_forms_send_email_owner_description": "Form gönderildiğinde sahibine bir e-posta gönderir",
@@ -1630,6 +1643,7 @@
"format": "Biçim",
"uppercase_for_letters": "Tüm harfleri büyük harf olarak kullanın",
"replace_whitespaces_underscores": "Boşlukları alt çizgi ile değiştir",
"platform_billing": "Platform faturalandırması",
"manage_billing": "Faturalandırmayı yönetin",
"manage_billing_description": "Faturalandırmayla ilgili her şeyi yönetin",
"billing_freeplan_title": "Şu anda ÜCRETSİZ plandasınız",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Daha fazla Insights mı arıyorsunuz?",
"filters": "Filtreler",
"add_filter": "Filtre ekle",
"add_rule": "Kural ekle",
"add_rule_group": "Kural grubu ekle",
"remove_filters": "Tüm filtreleri temizle",
"email_verified": "E-posta Doğrulandı",
"select_user": "Kullanıcı seç",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Kuruluşunuzu düzenleyin",
"set_up_your_platform_organization": "Platformunuzu kurun",
"organizations_description": "Kuruluşlar, ekiplerin paylaşımlı etkinlik türleri, uygulamalar, iş akışları ve daha fazlasını oluşturabileceği paylaşımlı ortamlardır.",
"plans": "Planlar",
"platform": "Platform",
"platform_description": "Platformla ilgili her şeyi yönetin.",
"platform_organization_description": "Cal.com Platformu, platform API'leri ve atomları kullanarak planlamayı uygulamanıza zahmetsizce entegre etmenizi sağlar.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Uygun zamanlardan bazılarını seçin ve bunları E-postanıza ekleyin",
"select_time": "Saati Seçin",
"select_date": "Tarihi Seçin",
"connecting_you_to_someone": "Sizi birine bağlıyoruz.",
"connecting_you_to_someone": "Sizi {{orgName}}'den birisiyle bağlıyoruz.",
"please_do_not_close_this_tab": "Lütfen bu sayfayı kapatmayın veya yenilemeyin",
"see_all_available_times": "Tüm müsait saatleri görün",
"org_team_names_example_1": "Örneğin. Pazarlama ekibi",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Koltuk seçeneği birden fazla süreyi desteklemiyor",
"include_calendar_event": "Takvim etkinliğini dahil et",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuth istemcisi oluşturma formu",
"oAuth_client_creation_form_description": "Bu, yeni bir OAuth istemcisi oluşturmak için kullanılan formdur",
"oAuth_client_updation_form": "OAuth istemcisi güncelleme formu",
"oAuth_client_updation_form_description": "Bu, mevcut bir OAuth istemcisini düzenlemek için kullanılan formdur",
"recently_added": "Son eklenen",
"connect_all_calendars": "Tüm takvimlerinizi bağlayın",
"connect_all_calendars_description": "{{appName}}, mevcut tüm takvimlerinizden müsaitlik bilgilerini okur.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Rezervasyon sınırları başarıyla güncellendi",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Bu rezervasyonda değişiklik yapma yetkiniz yok",
"matching_members": "Eşleşen üyeler",
"matching_members_queue_using_attribute_weights": "Üye eşleştirme sırası (özellik ağırlıkları kullanılarak)",
"matching_members_queue_using_event_assignee_weights": "Üye eşleştirme sırası (etkinlik atanan kişi ağırlıkları kullanılarak)",
"no_matching_members": "Eşleşen üye yok. Etkinlik türüne atanan takım üyeleri kullanılacaktır.",
"no_matching_members_will_fallback_to_all_assigned_members": "Eşleşen üye yok. Etkinlik türüne atanmış tüm ekip üyelerine geri dönülecek. Yedek eklemeyi veya using_fallback_members mantığını düzeltmeyi düşünün",
"hide_calendar_event_details": "Paylaşılan takvimlerde etkinlik ayrıntılarını gizle",
@@ -2704,6 +2727,8 @@
"add_new_field": "Yeni alan ekle",
"you_dont_have_access_to_reroute_this_booking": "Bu rezervasyonu yeniden yönlendirme erişiminiz yok",
"form_response_not_found": "Form yanıtı bulunamadı",
"contact_owner": "İletişim sahibi",
"contact_owner_not_found": "Bulunamadı",
"using_fallback_members": "Yedek üyeler kullanılıyor",
"chosen_route": "Seçilen rota",
"attribute_logic_matched": "Özellik mantığı eşleşti",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Katılımcı Saat Diliminde Etkinlik Bitiş Zamanı",
"salesforce_create_event_on_contact": "Eğer varsa, kişi üzerinde etkinlik oluştur. Yoksa potansiyel müşteriye geri dön",
"salesforce_owner_name_to_change": "Değiştirilecek sahip adı",
"dont_have_access_this_page": "Bu sayfaya erişiminiz yok",
"you_need_admin_or_owner_privileges_to_access": "Bu sayfayı görüntülemek veya etkileşimde bulunmak için yönetici veya sahip ayrıcalıklarına sahip olmalısınız",
"field_type": "Alan türü",
"when_to_write": "Ne zaman yazılacak",
"salesforce_on_booking_write_to_record": "Rezervasyon yapıldığında, katılımcının {{record}} kaydındaki özel alana yaz",
"on_every_booking": "Her rezervasyonda",
"only_if_field_is_empty": "Sadece alan boşsa",
"booking_start_date": "Rezervasyon başlangıç tarihi",
"booking_created_date": "Rezervasyon oluşturma tarihi",
"booking_reassigned_to_host": "Rezervasyon {{host}} kişisine yeniden atandı",
"no_contact_owner": "İletişim sahibi yok",
"routing_forms_created": "Oluşturulan yönlendirme formları",
"routing_forms_total_responses": "Toplam yanıtlar",
"routing_forms_total_responses_without_booking": "Rezervasyonsuz toplam yanıtlar",
"routing_forms_total_responses_with_booking": "Rezervasyonlu toplam yanıtlar",
"routing_form_insights": "Rezervasyon yok",
"routing_form_insights_form_name_header": "Form adı",
"routing_form_insights_booking_status_header": "Rezervasyon",
"routing_form_insights_response_no_booking": "Rezervasyon yok",
"routing_form_insights_booked_by": "Rezervasyon yapan",
"routing_form_insights_created_at": "Oluşturulma tarihi",
"routing_form_insights_booking_status": "Rezervasyon durumu",
"routing_form_insights_booking_at": "Rezervasyon tarihi",
"routing_form_insights_submitted_at": "Gönderilme tarihi",
"access_denied": "Erişim Reddedildi",
"salesforce_route_to_owner": "Mümkünse kişi sahibi round robin ev sahibi olacak",
"salesforce_do_not_route_to_owner": "Kişi sahibi zorlanmayacak (özellikler ve round robin kriterlerine uyuyorsa yine de ev sahibi olabilir)",
"salesforce_route_to_custom_lookup_field": "Bir hesaptaki arama alanıyla eşleşen bir kullanıcıya yönlendir",
"salesforce_option": "Salesforce seçeneği",
"lookup_field_name": "Arama alanı adı",
"rr_distribution_method": "Dağıtım",
"rr_distribution_method_description": "Maksimum kullanılabilirlik için dağıtımı optimize etmeye veya daha dengeli bir atama sağlamaya olanak tanır.",
"rr_distribution_method_availability_title": "Kullanılabilirliği maksimize et",
"rr_distribution_method_availability_description": "Rezervasyon yapanların, bir ev sahibi müsait olduğunda toplantı ayarlamasına olanak tanır. Potansiyel toplantı rezervasyonlarının sayısını en üst düzeye çıkarmak ve ev sahipleri arasında toplantıların eşit dağılımının daha az önemli olduğu durumlarda bunu kullanın.",
"rr_distribution_method_balanced_title": "Yük dengeleme",
"rr_distribution_method_balanced_description": "Her ev sahibiyle yapılan rezervasyon sayısını takip edip diğerleriyle karşılaştıracağız ve rezervasyonların eşit dağılımını sağlamak için çok ileri giden bazı ev sahiplerini devre dışı bırakacağız.",
"exclude_emails_that_contain": "... içeren e-postaları hariç tut",
"exclude_emails_match_found_error_message": "Lütfen geçerli bir iş e-posta adresi girin",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Yeni dizelerinizi yukarıya ekleyin ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+67 -4
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Потрібно перенести бронювання: забронюйте новий час для заходу «{{eventType}}» із користувачем {{name}}",
"hi_user_name": "Привіт, {{name}}!",
"ics_event_title": "{{eventType}} «{{name}}»",
"please_book_a_time_sometime_later": "Ой, ми не можемо підключитися до вас цього разу. Будь ласка, організуйте майбутній дзвінок замість цього",
"please_book_a_time_sometime_later": "Схоже, що всі наші експерти зараз зайняті. Будь ласка, заплануйте дзвінок на зручний для вас час, і ми будемо готові вам допомогти.",
"schedule_instead": "Запланувати натомість",
"new_event_subject": "Новий захід: {{attendeeName}} – {{date}} – {{eventType}}",
"join_by_entrypoint": "Приєднатися через {{entryPoint}}",
"notes": "Примітки",
@@ -198,6 +199,8 @@
"webhook_disabled": "Вебгук вимкнено",
"webhook_response": "Відповідь вебгуку",
"webhook_test": "Тест вебгуку",
"webhook_update_form": "Форма оновлення вебхука",
"webhook_update_form_description": "Додайте вебхук до вашого OAuthClient.",
"manage_your_webhook": "Керування вебгуком",
"webhook_created_successfully": "Вебгук створено!",
"webhook_updated_successfully": "Вебгук оновлено!",
@@ -348,9 +351,13 @@
"other": "Інше",
"email_sign_in_subject": "Ваше посилання для входу в {{appName}}",
"round_robin_emailed_you_and_attendees": "Ви зустрічаєтеся з {{user}}. Ми надіслали електронний лист із запрошенням у календар з деталями всім учасникам.",
"round_robin_emailed_host_and_attendee": "{{host}} зустрічається з {{attendee}}. Ми надіслали електронний лист із запрошенням у календар з деталями всім учасникам.",
"emailed_you_and_attendees": "Ми надіслали вам та іншим учасникам запрошення до календаря з усіма деталями.",
"emailed_host_and_attendee": "Ми надіслали електронний лист із запрошенням у календар з деталями всім учасникам.",
"emailed_you_and_attendees_recurring": "Ми надіслали вам та іншим учасникам запрошення з календаря на перший із цих періодичних заходів.",
"emailed_host_and_attendee_recurring": "Ми надіслали електронний лист із запрошенням у календар з деталями всім учасникам для першої з цих повторюваних подій.",
"round_robin_emailed_you_and_attendees_recurring": "Ви зустрічаєтеся з {{user}}. Ми надіслали електронний лист із запрошенням у календар з деталями всім учасникам для першої з цих повторюваних подій.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} зустрічається з {{attendee}}. Ми надіслали електронний лист із запрошенням у календар з деталями всім учасникам для першої з цих повторюваних подій.",
"emailed_you_and_any_other_attendees": "Цю інформацію надіслано вам і всім іншим учасникам.",
"needs_to_be_confirmed_or_rejected": "Ваше бронювання досі потрібно підтвердити або відхилити.",
"needs_to_be_confirmed_or_rejected_recurring": "Вашу періодичну нараду досі потрібно підтвердити або відхилити.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Повернутися до бронювань",
"free_to_pick_another_event_type": "Ви можете будь-коли вибрати інший захід.",
"cancelled": "Скасовано",
"no_booking": "Без бронювання",
"awaiting_host": "Очікування господаря",
"cancellation_successful": "Скасовано",
"really_cancel_booking": "Справді скасувати ваше бронювання?",
"cannot_cancel_booking": "Ви не можете скасувати це бронювання",
@@ -703,6 +712,9 @@
"no_teams": "У вас ще немає команд.",
"no_teams_description": "Завдяки командам охочі можуть бронювати спільні заходи для ваших колег.",
"submit": "Надіслати",
"confirm_remove_attribute": "Так, видалити атрибут",
"remove_attribute": "Видалити атрибут",
"remove_attribute_confirmation_message": "Ви впевнені, що хочете видалити атрибут '{{name}}'? Усі користувачі, які зараз мають цей атрибут, втратять його.",
"delete": "Видалити",
"update": "Оновити",
"save": "Зберегти",
@@ -1237,8 +1249,8 @@
"number_provided": "Номер телефону буде надано",
"before_event_trigger": "до початку заходу",
"event_cancelled_trigger": "у момент скасування заходу",
"after_hosts_cal_video_no_show": "Після того, як господарі не приєдналися до відеозустрічі на Cal",
"after_guests_cal_video_no_show": "Після того, як гості не приєдналися до відеозустрічі на Cal",
"after_hosts_cal_video_no_show": "Після того, як організатори не приєдналися до відеодзвінка",
"after_guests_cal_video_no_show": "Після того, як гості не приєдналися до відеодзвінка",
"new_event_trigger": "у момент бронювання нового заходу",
"email_host_action": "надсилати електронний лист ведучому",
"email_attendee_action": "надіслати ел. лист учасникам",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Маршрутизація",
"routing_forms_description": "Створюйте форми, щоб правильно скеровувати відвідувачів",
"routing_forms_send_email_owner": "Надіслати власнику електронний лист",
"routing_forms_send_email_owner_description": "Коли надсилається форма, власник отримує електронний лист",
@@ -1630,6 +1643,7 @@
"format": "Формат",
"uppercase_for_letters": "Використовувати всі великі літери",
"replace_whitespaces_underscores": "Заміняти пробіли підкресленнями",
"platform_billing": "Тарифікація платформи",
"manage_billing": "Керувати рахунками",
"manage_billing_description": "Керувати всіма моментами виставлення рахунків",
"billing_freeplan_title": "Зараз ви використовуєте БЕЗКОШТОВНИЙ план",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Потрібно більше висновків Insights?",
"filters": "Фільтри",
"add_filter": "Додати фільтр",
"add_rule": "Додати правило",
"add_rule_group": "Додати групу правил",
"remove_filters": "Очистити всі фільтри",
"email_verified": "Електронна пошта підтверджена",
"select_user": "Вибрати користувача",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Налаштуйте свою організацію",
"set_up_your_platform_organization": "Налаштуйте свою платформу",
"organizations_description": "Організації — це спільне середовище, де команди можуть створювати спільні типи заходів, застосунки, робочі процеси тощо.",
"plans": "Плани",
"platform": "Платформа",
"platform_description": "Керуйте всім, що стосується платформи.",
"platform_organization_description": "Платформа Cal.com дозволяє легко інтегрувати планування у ваш додаток за допомогою API та атомів платформи.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Виберіть кілька доступних часових проміжків і вбудуйте їх в електронний лист",
"select_time": "Виберіть час",
"select_date": "Виберіть дату",
"connecting_you_to_someone": "Ми з'єднуємо вас з кимось.",
"connecting_you_to_someone": "Ми з'єднуємо вас із представником {{orgName}}.",
"please_do_not_close_this_tab": "Будь ласка, не закривайте і не оновлюйте цю сторінку",
"see_all_available_times": "Переглянути доступні часові проміжки",
"org_team_names_example_1": "напр. команда маркетингу",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Параметр «Місця» не підтримує декілька варіантів тривалості",
"include_calendar_event": "Включити календарний захід",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Форма створення OAuth клієнта",
"oAuth_client_creation_form_description": "Це форма для створення нового OAuth клієнта",
"oAuth_client_updation_form": "Форма оновлення OAuth клієнта",
"oAuth_client_updation_form_description": "Це форма для редагування існуючого OAuth клієнта",
"recently_added": "Нещодавно додані",
"connect_all_calendars": "Можливість підключення всіх календарів",
"connect_all_calendars_description": "{{appName}} зчитує доступність з усіх ваших існуючих календарів.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Обмеження бронювання успішно оновлено",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Ви не маєте дозволу на внесення цієї зміни до бронювання",
"matching_members": "Відповідні учасники",
"matching_members_queue_using_attribute_weights": "Черга відповідних учасників (з використанням ваги атрибутів)",
"matching_members_queue_using_event_assignee_weights": "Черга відповідних учасників (з використанням ваги призначених подій)",
"no_matching_members": "Відповідних учасників немає. Буде використано учасників команди, призначених для цього типу події.",
"no_matching_members_will_fallback_to_all_assigned_members": "Немає відповідних учасників. Буде використано всіх учасників команди, призначених для типу події. Розгляньте можливість додавання резервного варіанту або виправлення логіки використання резервних учасників",
"hide_calendar_event_details": "Приховати деталі подій календаря у спільних календарях",
@@ -2704,6 +2727,8 @@
"add_new_field": "Додати нове поле",
"you_dont_have_access_to_reroute_this_booking": "У вас немає доступу для перенаправлення цього бронювання",
"form_response_not_found": "Відповідь форми не знайдено",
"contact_owner": "Власник контакту",
"contact_owner_not_found": "Не знайдено",
"using_fallback_members": "Використання резервних учасників",
"chosen_route": "Обраний маршрут",
"attribute_logic_matched": "Логіка атрибутів співпала",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Час закінчення події в часовому поясі учасника",
"salesforce_create_event_on_contact": "Створити подію для контакту, якщо він існує. В іншому випадку створити для ліда",
"salesforce_owner_name_to_change": "Ім'я власника для зміни",
"dont_have_access_this_page": "Ви не маєте доступу до цієї сторінки",
"you_need_admin_or_owner_privileges_to_access": "Щоб переглядати або взаємодіяти з цією сторінкою, ви повинні мати права адміністратора або власника",
"field_type": "Тип поля",
"when_to_write": "Коли записувати",
"salesforce_on_booking_write_to_record": "При бронюванні, записати в користувацьке поле запису {{record}} учасника",
"on_every_booking": "При кожному бронюванні",
"only_if_field_is_empty": "Тільки якщо поле порожнє",
"booking_start_date": "Дата початку бронювання",
"booking_created_date": "Дата створення бронювання",
"booking_reassigned_to_host": "Бронювання перепризначено {{host}}",
"no_contact_owner": "Немає власника контакту",
"routing_forms_created": "Створено форми маршрутизації",
"routing_forms_total_responses": "Загальна кількість відповідей",
"routing_forms_total_responses_without_booking": "Відповіді без бронювання",
"routing_forms_total_responses_with_booking": "Відповіді з бронюванням",
"routing_form_insights": "Без бронювань",
"routing_form_insights_form_name_header": "Назва форми",
"routing_form_insights_booking_status_header": "Бронювання",
"routing_form_insights_response_no_booking": "Без бронювання",
"routing_form_insights_booked_by": "Заброньовано",
"routing_form_insights_created_at": "Створено",
"routing_form_insights_booking_status": "Статус бронювання",
"routing_form_insights_booking_at": "Час бронювання",
"routing_form_insights_submitted_at": "Час подання",
"access_denied": "Доступ заборонено",
"salesforce_route_to_owner": "Власник контакту буде ведучим Round Robin, якщо доступний",
"salesforce_do_not_route_to_owner": "Власник контакту не буде примусово призначений (може бути ведучим, якщо відповідає атрибутам і критеріям Round Robin)",
"salesforce_route_to_custom_lookup_field": "Маршрутизація до користувача, який відповідає полю пошуку в обліковому записі",
"salesforce_option": "Опція Salesforce",
"lookup_field_name": "Назва поля пошуку",
"rr_distribution_method": "Розподіл",
"rr_distribution_method_description": "Дозволяє оптимізувати розподіл для максимальної доступності або для більш збалансованого розподілу завдань.",
"rr_distribution_method_availability_title": "Максимізувати доступність",
"rr_distribution_method_availability_description": "Дозволяє учасникам бронювати зустрічі, коли хост доступний. Використовуйте це для максимізації кількості потенційних зустрічей та коли рівномірний розподіл зустрічей між хостами менш важливий.",
"rr_distribution_method_balanced_title": "Балансування навантаження",
"rr_distribution_method_balanced_description": "Ми будемо відстежувати кількість бронювань для кожного хоста та порівнювати їх з іншими, деактивуючи тих хостів, які значно випереджають інших, щоб бронювання розподілялися рівномірно.",
"exclude_emails_that_contain": "Виключити електронні адреси, які містять ...",
"exclude_emails_match_found_error_message": "Будь ласка, введіть дійсну робочу електронну адресу",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+68 -5
View File
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "Thao tác cần làm để xếp lại lịch: Vui lòng đặt thời gian mới cho {{eventType}} với {{name}}",
"hi_user_name": "Xin chào {{name}}",
"ics_event_title": "{{eventType}} với {{name}}",
"please_book_a_time_sometime_later": "Rất tiếc, chúng tôi không thể kết nối bạn lần này. Vui lòng lên lịch cuộc gọi trong tương lai.",
"please_book_a_time_sometime_later": "Có vẻ như tất cả các chuyên gia của chúng tôi hiện đang bận. Vui lòng đặt lịch cuộc gọi vào thời gian phù hợp nhất với bạn và chúng tôi sẽ sẵn sàng hỗ trợ bạn.",
"schedule_instead": "Thay vào đó, hãy đặt lịch",
"new_event_subject": "Sự kiện mới: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "Tham gia bằng {{entryPoint}}",
"notes": "Ghi chú",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook đang tắt",
"webhook_response": "Phản đáp của Webhook",
"webhook_test": "Kiểm tra Webhook",
"webhook_update_form": "Biểu mẫu cập nhật webhook",
"webhook_update_form_description": "Thêm một webhook vào OAuthClient của bạn.",
"manage_your_webhook": "Quản lý webhook của bạn",
"webhook_created_successfully": "Webhook đã được tạo thành công!",
"webhook_updated_successfully": "Webhook đã được cập nhật!",
@@ -348,9 +351,13 @@
"other": "Khác",
"email_sign_in_subject": "Liên kết đăng nhập cho {{appName}}",
"round_robin_emailed_you_and_attendees": "Bạn sẽ gặp {{user}}. Chúng tôi đã gửi email với lời mời lịch và chi tiết cho tất cả mọi người.",
"round_robin_emailed_host_and_attendee": "{{host}} sẽ gặp {{attendee}}. Chúng tôi đã gửi email kèm lời mời lịch với đầy đủ thông tin chi tiết đến tất cả mọi người.",
"emailed_you_and_attendees": "Chúng tôi đã gửi email cho bạn và những người tham dự khác một lời mời theo lịch hẹn với tất cả các chi tiết đi kèm.",
"emailed_host_and_attendee": "Chúng tôi đã gửi email kèm lời mời lịch với đầy đủ thông tin chi tiết đến tất cả mọi người.",
"emailed_you_and_attendees_recurring": "Chúng tôi đã gửi email cho bạn và những người tham dự khác một lời mời theo lịch hẹn cho sự kiện định kỳ đầu tiên trong số những sự kiện định kỳ này.",
"round_robin_emailed_you_and_attendees_recurring": "Bạn sẽ gặp {{user}}. Chúng tôi đã gửi email với lời mời lịch và chi tiết cho tất cả mọi người cho sự kiện lặp lại đầu tiên này.",
"emailed_host_and_attendee_recurring": "Chúng tôi đã gửi email kèm lời mời lịch với đầy đủ thông tin chi tiết đến tất cả mọi người cho sự kiện đầu tiên trong chuỗi sự kiện định kỳ này.",
"round_robin_emailed_you_and_attendees_recurring": "Bạn sẽ gặp {{user}}. Chúng tôi đã gửi email kèm lời mời lịch với đầy đủ thông tin chi tiết đến tất cả mọi người cho sự kiện đầu tiên trong chuỗi sự kiện định kỳ này.",
"round_robin_emailed_host_and_attendee_recurring": "{{host}} sẽ gặp {{attendee}}. Chúng tôi đã gửi email kèm lời mời lịch với đầy đủ thông tin chi tiết đến tất cả mọi người cho sự kiện đầu tiên trong chuỗi sự kiện định kỳ này.",
"emailed_you_and_any_other_attendees": "Bạn và mọi người tham dự khác đã được gửi email với thông tin này.",
"needs_to_be_confirmed_or_rejected": "Đặt hẹn của bạn vẫn cần được xác nhận hoặc từ chối.",
"needs_to_be_confirmed_or_rejected_recurring": "Cuộc họp định kỳ của bạn vẫn cần được xác nhận hoặc từ chối.",
@@ -403,6 +410,8 @@
"back_to_bookings": "Quay lại các lịch hẹn",
"free_to_pick_another_event_type": "Hãy tuỳ ý chọn một sự kiện khác bất cứ lúc nào.",
"cancelled": "Đã hủy",
"no_booking": "Không có đặt chỗ",
"awaiting_host": "Đang chờ chủ trì",
"cancellation_successful": "Hủy thành công",
"really_cancel_booking": "Thực sự hủy lịch hẹn của bạn?",
"cannot_cancel_booking": "Bạn không thể hủy lịch hẹn này",
@@ -703,6 +712,9 @@
"no_teams": "Bạn chưa có bất kỳ nhóm nào.",
"no_teams_description": "Các nhóm cho phép người khác đăng ký các sự kiện được chia sẻ giữa đồng nghiệp của bạn.",
"submit": "Gửi đi",
"confirm_remove_attribute": "Có, xóa thuộc tính",
"remove_attribute": "Xóa thuộc tính",
"remove_attribute_confirmation_message": "Bạn có chắc chắn muốn xóa thuộc tính '{{name}}'? Tất cả người dùng hiện đang được gán cho thuộc tính này sẽ bị gỡ gán.",
"delete": "Xóa bỏ",
"update": "Cập nhật",
"save": "Lưu",
@@ -1237,8 +1249,8 @@
"number_provided": "Số điện thoại sẽ được cung ứng",
"before_event_trigger": "trước khi sự kiện bắt đầu",
"event_cancelled_trigger": "khi sự kiện bị huỷ",
"after_hosts_cal_video_no_show": "Sau khi người tổ chức không tham gia video trên Cal",
"after_guests_cal_video_no_show": "Sau khi khách mời không tham gia video trên Cal",
"after_hosts_cal_video_no_show": "Sau khi người chủ trì không tham gia cuộc gọi video",
"after_guests_cal_video_no_show": "Sau khi khách không tham gia cuộc gọi video",
"new_event_trigger": "khi sự kiện mới được đặt lịch hẹn",
"email_host_action": "gửi email đến chủ sự kiện",
"email_attendee_action": "gửi email đến người tham gia",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "Định tuyến",
"routing_forms_description": "Tạo các biểu mẫu để chuyển hướng người tham dự đến đúng địa điểm",
"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",
@@ -1630,6 +1643,7 @@
"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",
"platform_billing": "Thanh toán nền tảng",
"manage_billing": "Quản lí thanh toán",
"manage_billing_description": "Quản lí tất cả những thanh toán",
"billing_freeplan_title": "Bạn hiện đang sử dụng gói MIỄN PHÍ",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "Bạn muốn có thêm Insights?",
"filters": "Bộ Lọc",
"add_filter": "Thêm bộ lọc",
"add_rule": "Thêm quy tắc",
"add_rule_group": "Thêm nhóm quy tắc",
"remove_filters": "Xóa tất cả bộ lọc",
"email_verified": "Email đã được xác minh",
"select_user": "Chọn người dùng",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "Thiết lập tổ chức của bạn",
"set_up_your_platform_organization": "Thiết lập nền tảng của bạn",
"organizations_description": "Tổ chức là môi trường chia sẻ tại đó các nhóm có thể tạo loại sự kiện, ứng dụng, tiến độ công việc, v.v. để dùng chung.",
"plans": "Các gói",
"platform": "Nền tảng",
"platform_description": "Quản lý mọi thứ liên quan đến nền tảng.",
"platform_organization_description": "Nền tảng Cal.com cho phép bạn tích hợp việc lên lịch một cách dễ dàng vào ứng dụng của bạn bằng cách sử dụng các API và atoms của nền tảng.",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "Chọn một số thời gian trống và nhúng chúng vào trong Email của bạn",
"select_time": "Chọn thời gian",
"select_date": "Chọn ngày",
"connecting_you_to_someone": "Chúng tôi đang kết nối bạn với ai đó.",
"connecting_you_to_someone": "Chúng tôi đang kết nối bạn với một người từ {{orgName}}.",
"please_do_not_close_this_tab": "Vui lòng không đóng hoặc làm mới trang này",
"see_all_available_times": "Xem tất cả những thời gian trống",
"org_team_names_example_1": "ví dụ Nhóm Tiếp thị",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "Tuỳ chọn ghế ngồi không hỗ trợ nhiều khoảng thời gian",
"include_calendar_event": "Bao gồm sự kiện lịch",
"oAuth": "OAuth",
"oAuth_client_creation_form": "Biểu mẫu tạo OAuth client",
"oAuth_client_creation_form_description": "Đây là biểu mẫu để tạo một OAuth client mới",
"oAuth_client_updation_form": "Biểu mẫu cập nhật OAuth client",
"oAuth_client_updation_form_description": "Đây là biểu mẫu để chỉnh sửa một OAuth client hiện có",
"recently_added": "Đã thêm vào gần đây",
"connect_all_calendars": "Kết nối tất cả lịch của bạn",
"connect_all_calendars_description": "{{appName}} đọc khả dụng từ tất cả các lịch hiện có của bạn.",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "Giới hạn đặt lịch đã được cập nhật thành công",
"you_are_unauthorized_to_make_this_change_to_the_booking": "Bạn không có quyền thực hiện thay đổi này đối với đặt chỗ",
"matching_members": "Thành viên phù hợp",
"matching_members_queue_using_attribute_weights": "Hàng đợi thành viên phù hợp (sử dụng trọng số thuộc tính)",
"matching_members_queue_using_event_assignee_weights": "Hàng đợi thành viên phù hợp (sử dụng trọng số người được chỉ định sự kiện)",
"no_matching_members": "Không có thành viên phù hợp. Hệ thống sẽ sử dụng các thành viên trong nhóm được chỉ định cho loại sự kiện.",
"no_matching_members_will_fallback_to_all_assigned_members": "Không có thành viên phù hợp. Hệ thống sẽ sử dụng tất cả thành viên nhóm được chỉ định cho loại sự kiện. Hãy cân nhắc thêm phương án dự phòng hoặc điều chỉnh logic sử dụng thành viên dự phòng",
"hide_calendar_event_details": "Ẩn chi tiết sự kiện trên lịch chia sẻ",
@@ -2704,6 +2727,8 @@
"add_new_field": "Thêm trường mới",
"you_dont_have_access_to_reroute_this_booking": "Bạn không có quyền chuyển hướng đặt lịch này",
"form_response_not_found": "Không tìm thấy phản hồi biểu mẫu",
"contact_owner": "Người sở hữu liên hệ",
"contact_owner_not_found": "Không tìm thấy",
"using_fallback_members": "Đang sử dụng thành viên dự phòng",
"chosen_route": "Lộ trình đã chọn",
"attribute_logic_matched": "Logic thuộc tính phù hợp",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "Thời gian kết thúc sự kiện theo múi giờ của Người tham dự",
"salesforce_create_event_on_contact": "Tạo sự kiện trên liên hệ, nếu tồn tại. Nếu không, chuyển sang khách hàng tiềm năng",
"salesforce_owner_name_to_change": "Tên chủ sở hữu cần thay đổi",
"dont_have_access_this_page": "Bạn không có quyền truy cập trang này",
"you_need_admin_or_owner_privileges_to_access": "Để xem hoặc tương tác với trang này, bạn cần có quyền quản trị viên hoặc chủ sở hữu",
"field_type": "Loại trường",
"when_to_write": "Khi nào ghi",
"salesforce_on_booking_write_to_record": "Khi đặt lịch, ghi vào trường tùy chỉnh trên bản ghi {{record}} của người tham dự",
"on_every_booking": "Trên mỗi lần đặt lịch",
"only_if_field_is_empty": "Chỉ khi trường trống",
"booking_start_date": "Ngày bắt đầu đặt lịch",
"booking_created_date": "Ngày tạo đặt lịch",
"booking_reassigned_to_host": "Đặt lịch được chuyển giao cho {{host}}",
"no_contact_owner": "Không có người sở hữu liên hệ",
"routing_forms_created": "Biểu mẫu định tuyến đã tạo",
"routing_forms_total_responses": "Tổng số phản hồi",
"routing_forms_total_responses_without_booking": "Tổng số phản hồi không có đặt chỗ",
"routing_forms_total_responses_with_booking": "Tổng số phản hồi có đặt chỗ",
"routing_form_insights": "Không có đặt chỗ",
"routing_form_insights_form_name_header": "Tên biểu mẫu",
"routing_form_insights_booking_status_header": "Trạng thái đặt chỗ",
"routing_form_insights_response_no_booking": "Không có đặt chỗ",
"routing_form_insights_booked_by": "Được đặt bởi",
"routing_form_insights_created_at": "Được tạo vào",
"routing_form_insights_booking_status": "Trạng thái đặt chỗ",
"routing_form_insights_booking_at": "Thời gian đặt lịch",
"routing_form_insights_submitted_at": "Thời gian gửi",
"access_denied": "Từ chối truy cập",
"salesforce_route_to_owner": "Người sở hữu liên hệ sẽ là người chủ trì Round Robin nếu khả dụng",
"salesforce_do_not_route_to_owner": "Người sở hữu liên hệ sẽ không bị bắt buộc (vẫn có thể là người chủ trì nếu phù hợp với các thuộc tính và tiêu chí Round Robin)",
"salesforce_route_to_custom_lookup_field": "Chuyển đến người dùng phù hợp với trường tra cứu trên tài khoản",
"salesforce_option": "Tùy chọn Salesforce",
"lookup_field_name": "Tên trường tra cứu",
"rr_distribution_method": "Phân phối",
"rr_distribution_method_description": "Cho phép tối ưu hóa việc phân phối để đạt khả năng sẵn sàng tối đa hoặc hướng đến việc phân công cân bằng hơn.",
"rr_distribution_method_availability_title": "Tối đa hóa khả năng sẵn sàng",
"rr_distribution_method_availability_description": "Cho phép người đặt lịch đặt cuộc họp bất cứ khi nào người chủ trì có mặt. Sử dụng tính năng này để tối đa hóa số lượng cuộc họp tiềm năng được đặt và khi việc phân phối cuộc họp đồng đều giữa các chủ trì ít quan trọng hơn.",
"rr_distribution_method_balanced_title": "Cân bằng tải",
"rr_distribution_method_balanced_description": "Chúng tôi sẽ theo dõi số lượng đặt lịch đã được thực hiện với từng chủ trì và so sánh với những người khác, vô hiệu hóa một số chủ trì đã nhận quá nhiều lịch để đảm bảo việc đặt lịch được phân phối đồng đều.",
"exclude_emails_that_contain": "Loại trừ các email chứa ...",
"exclude_emails_match_found_error_message": "Vui lòng nhập địa chỉ email công việc hợp lệ",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "需要重新安排操作: 请为名称为 {{name}} 的 {{eventType}} 预约新的时间",
"hi_user_name": "您好 {{name}}",
"ics_event_title": "与 {{name}} 的 {{eventType}}",
"please_book_a_time_sometime_later": "Oops, 我们无法联系到您。请您另外安排一次计划会议。",
"please_book_a_time_sometime_later": "看起来我们所有的专家现在都很忙。请安排一个适合您的时间进行通话,我们将准备好为您提供帮助。",
"schedule_instead": "改为安排",
"new_event_subject": "新活动: {{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "由 {{entryPoint}} 加入",
"notes": "备注",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook 已禁用",
"webhook_response": "Webhook 回应",
"webhook_test": "Webhook 测试",
"webhook_update_form": "Webhook 更新表单",
"webhook_update_form_description": "为您的 OAuth 客户端添加一个 webhook。",
"manage_your_webhook": "管理您的 Webhook",
"webhook_created_successfully": "Webhook 创建成功!",
"webhook_updated_successfully": "Webhook 更新成功!",
@@ -348,9 +351,13 @@
"other": "其他",
"email_sign_in_subject": "您的 {{appName}} 登录链接",
"round_robin_emailed_you_and_attendees": "您将与 {{user}} 会面。我们已向所有人发送了包含详细信息的日历邀请邮件。",
"round_robin_emailed_host_and_attendee": "{{host}}将与{{attendee}}会面。我们已向所有人发送了包含详细信息的日历邀请邮件。",
"emailed_you_and_attendees": "我们通过电子邮件给您和其他参与者发送了一份包含所有详细信息的日历邀请。",
"emailed_host_and_attendee": "我们已向所有人发送了包含详细信息的日历邀请邮件。",
"emailed_you_and_attendees_recurring": "我们通过电子邮件给您和其他参与者发送了第一次定期活动的日历邀请。",
"round_robin_emailed_you_and_attendees_recurring": "您将与 {{user}} 会面。我们已向所有人发送了包含详细信息的日历邀请邮件,适用于这些重复事件的第一次。",
"emailed_host_and_attendee_recurring": "我们已向所有人发送了首次循环会议的日历邀请邮件及详细信息。",
"round_robin_emailed_you_and_attendees_recurring": "您将与{{user}}会面。我们已向所有人发送了首次循环会议的日历邀请邮件及详细信息。",
"round_robin_emailed_host_and_attendee_recurring": "{{host}}将与{{attendee}}会面。我们已向所有人发送了首次循环会议的日历邀请邮件及详细信息。",
"emailed_you_and_any_other_attendees": "已向您和其他参与者发送了关于此信息的电子邮件",
"needs_to_be_confirmed_or_rejected": "您的预约仍然需要确认或拒绝。",
"needs_to_be_confirmed_or_rejected_recurring": "您的定期会议仍然需要确认或拒绝。",
@@ -403,6 +410,8 @@
"back_to_bookings": "返回预约",
"free_to_pick_another_event_type": "随时可以选择另一个活动。",
"cancelled": "已取消",
"no_booking": "无预订",
"awaiting_host": "等待主持人",
"cancellation_successful": "取消成功",
"really_cancel_booking": "真的要取消您的预约吗?",
"cannot_cancel_booking": "您不能取消此预约",
@@ -703,6 +712,9 @@
"no_teams": "您还没有任何团队。",
"no_teams_description": "团队允许他人预约您和同事共同的活动。",
"submit": "提交",
"confirm_remove_attribute": "是的,移除属性",
"remove_attribute": "移除属性",
"remove_attribute_confirmation_message": "您确定要移除属性“{{name}}”吗?所有当前分配到该属性的用户将被取消分配。",
"delete": "删除",
"update": "更新",
"save": "保存",
@@ -1237,8 +1249,8 @@
"number_provided": "将提供电话号码",
"before_event_trigger": "活动开始前",
"event_cancelled_trigger": "活动取消后",
"after_hosts_cal_video_no_show": "主持人未加入 Cal 视频后的处理",
"after_guests_cal_video_no_show": "嘉宾未加入 Cal 视频后的处理",
"after_hosts_cal_video_no_show": "主持人未加入 Cal 视频后",
"after_guests_cal_video_no_show": "嘉宾未加入 Cal 视频后",
"new_event_trigger": "预约新活动时",
"email_host_action": "向主持人发送电子邮件",
"email_attendee_action": "向参与者发送电子邮件",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "路由",
"routing_forms_description": "创建表格以将参与者引导到正确的目标",
"routing_forms_send_email_owner": "向所有者发送电子邮件",
"routing_forms_send_email_owner_description": "提交表单后向所有者发送电子邮件",
@@ -1630,6 +1643,7 @@
"format": "格式",
"uppercase_for_letters": "所有字母均使用大写",
"replace_whitespaces_underscores": "将空格替换为下划线",
"platform_billing": "平台计费",
"manage_billing": "管理计费",
"manage_billing_description": "管理所有计费事项",
"billing_freeplan_title": "您目前正在使用免费计划",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "寻找更多的 Insights?",
"filters": "过滤",
"add_filter": "添加筛选器",
"add_rule": "添加规则",
"add_rule_group": "添加规则组",
"remove_filters": "清楚所有过滤",
"email_verified": "电子邮件已验证",
"select_user": "选择用户",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "设置您的组织",
"set_up_your_platform_organization": "设置您的平台",
"organizations_description": "组织是一种共享环境,团队可以在其中创建共享的活动类型、应用、工作流程等。",
"plans": "计划",
"platform": "平台",
"platform_description": "管理与平台相关的所有内容。",
"platform_organization_description": "Cal.com平台让您可以使用平台API和原子轻松将调度集成到您的应用中。",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "选择几个可预约时间并将它们嵌入到您的电子邮件",
"select_time": "选择时间",
"select_date": "选择日期",
"connecting_you_to_someone": "我们正在为您创建连接",
"connecting_you_to_someone": "我们正在为您接通{{orgName}}的工作人员。",
"please_do_not_close_this_tab": "请不要关闭或刷新此页面",
"see_all_available_times": "查看所有可预约时间",
"org_team_names_example_1": "例如,营销团队",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "位置选项不支持多个持续时间",
"include_calendar_event": "包括日历活动",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuth 客户端创建表单",
"oAuth_client_creation_form_description": "这是用于创建新 OAuth 客户端的表单",
"oAuth_client_updation_form": "OAuth 客户端更新表单",
"oAuth_client_updation_form_description": "这是用于编辑现有 OAuth 客户端的表单",
"recently_added": "最近添加",
"connect_all_calendars": "连接您的所有日历",
"connect_all_calendars_description": "{{appName}} 从您所有现有的日历中读取可用性。",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "预订限制更新成功",
"you_are_unauthorized_to_make_this_change_to_the_booking": "您无权对此预订进行更改",
"matching_members": "匹配的成员",
"matching_members_queue_using_attribute_weights": "使用属性权重的匹配成员队列",
"matching_members_queue_using_event_assignee_weights": "使用事件分配者权重的匹配成员队列",
"no_matching_members": "没有匹配的成员。将回退到使用分配给事件类型的团队成员。",
"no_matching_members_will_fallback_to_all_assigned_members": "没有匹配的成员。将回退使用分配给该事件类型的团队成员。考虑添加一个回退选项或修正使用回退成员的逻辑",
"hide_calendar_event_details": "隐藏共享日历中的事件详情",
@@ -2704,6 +2727,8 @@
"add_new_field": "添加新字段",
"you_dont_have_access_to_reroute_this_booking": "您无权重新路由此预订",
"form_response_not_found": "未找到表单响应",
"contact_owner": "联系所有者",
"contact_owner_not_found": "未找到",
"using_fallback_members": "正在使用回退成员",
"chosen_route": "选定路线",
"attribute_logic_matched": "属性逻辑匹配",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "参与者时区的事件结束时间",
"salesforce_create_event_on_contact": "如果联系人存在,则在联系人上创建事件。否则回退到潜在客户",
"salesforce_owner_name_to_change": "要更改的所有者名称",
"dont_have_access_this_page": "您无权访问此页面",
"you_need_admin_or_owner_privileges_to_access": "要查看或操作此页面,您必须拥有管理员或所有者权限",
"field_type": "字段类型",
"when_to_write": "何时写入",
"salesforce_on_booking_write_to_record": "预约时,写入参与者 {{record}} 记录的自定义字段",
"on_every_booking": "每次预约时",
"only_if_field_is_empty": "仅当字段为空时",
"booking_start_date": "预约开始日期",
"booking_created_date": "预约创建日期",
"booking_reassigned_to_host": "预约重新分配给 {{host}}",
"no_contact_owner": "没有联系所有者",
"routing_forms_created": "已创建路由表单",
"routing_forms_total_responses": "总响应数",
"routing_forms_total_responses_without_booking": "无预订的总响应数",
"routing_forms_total_responses_with_booking": "有预订的总响应数",
"routing_form_insights": "无预订",
"routing_form_insights_form_name_header": "表单名称",
"routing_form_insights_booking_status_header": "预订",
"routing_form_insights_response_no_booking": "无预订",
"routing_form_insights_booked_by": "预订者",
"routing_form_insights_created_at": "创建于",
"routing_form_insights_booking_status": "预订状态",
"routing_form_insights_booking_at": "预约时间",
"routing_form_insights_submitted_at": "提交时间",
"access_denied": "访问被拒绝",
"salesforce_route_to_owner": "如果联系人所有者可用,将作为轮询主持人",
"salesforce_do_not_route_to_owner": "不会强制指定联系人所有者(如果符合属性和轮询标准,仍可成为主持人)",
"salesforce_route_to_custom_lookup_field": "路由至与账户查找字段匹配的用户",
"salesforce_option": "Salesforce选项",
"lookup_field_name": "查找字段名称",
"rr_distribution_method": "分配方式",
"rr_distribution_method_description": "可以优化分配方式以实现最大可用性或更均衡的任务分配。",
"rr_distribution_method_availability_title": "最大化可用性",
"rr_distribution_method_availability_description": "允许预订者在任何主持人可用时预订会议。当会议在主持人之间的均衡分配不太重要时,可使用此选项来最大化潜在会议预订数量。",
"rr_distribution_method_balanced_title": "负载均衡",
"rr_distribution_method_balanced_description": "系统会监控每位主持人已接受的预订数量并与其他人进行比较,如果某些主持人的预订数量远超他人,系统会暂时停用这些主持人,以确保预订均匀分配。",
"exclude_emails_that_contain": "排除包含...的电子邮件",
"exclude_emails_match_found_error_message": "请输入有效的工作电子邮件地址",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 在此上方添加您的新字符串 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
@@ -139,7 +139,8 @@
"requested_to_reschedule_subject_attendee": "需進行重新預約操作:請為與 {{name}} 的 {{eventType}} 預訂新時間",
"hi_user_name": "哈囉 {{name}}",
"ics_event_title": "與 {{name}} 的 {{eventType}}",
"please_book_a_time_sometime_later": "抱歉,這次無法連接。請改為安排未來的通話。",
"please_book_a_time_sometime_later": "目前我們的專家都在忙碌中。請選擇一個最適合您的時間預約通話,我們將準備好為您提供協助。",
"schedule_instead": "立即預約",
"new_event_subject": "新活動:{{attendeeName}} - {{date}} - {{eventType}}",
"join_by_entrypoint": "透過 {{entryPoint}} 加入",
"notes": "備註",
@@ -198,6 +199,8 @@
"webhook_disabled": "Webhook 已關閉",
"webhook_response": "Webhook 回應",
"webhook_test": "Webhook 測試",
"webhook_update_form": "Webhook 更新表單",
"webhook_update_form_description": "為您的 OAuth 客戶端添加 webhook。",
"manage_your_webhook": "管理 Webhook",
"webhook_created_successfully": "新增 Webhook 成功!",
"webhook_updated_successfully": "更新 Webhook 成功!",
@@ -348,9 +351,13 @@
"other": "其它",
"email_sign_in_subject": "您的「{{appName}}」登入連結",
"round_robin_emailed_you_and_attendees": "您將與 {{user}} 會面。我們已向所有人發送了包含詳細資訊的日曆邀請。",
"round_robin_emailed_host_and_attendee": "{{host}}將與{{attendee}}會面。我們已向所有人發送含有詳細資訊的行事曆邀請郵件。",
"emailed_you_and_attendees": "已經寄出行事曆邀請,包含其他與會者都會收到有全部細節的電子郵件。",
"emailed_host_and_attendee": "我們已向所有人發送含有詳細資訊的行事曆邀請郵件。",
"emailed_you_and_attendees_recurring": "已就這系列定期活動的首次活動,寄出行事曆邀請給您和其他與會者。",
"round_robin_emailed_you_and_attendees_recurring": "您將與 {{user}} 會面。我們已向所有人發送了包含詳細資訊的日曆邀請,這是這些重複事件中的第一次。",
"emailed_host_and_attendee_recurring": "我們已向所有人發送首次週期性會議的行事曆邀請郵件及詳細資訊。",
"round_robin_emailed_you_and_attendees_recurring": "您將與{{user}}會面。我們已向所有人發送首次週期性會議的行事曆邀請郵件及詳細資訊。",
"round_robin_emailed_host_and_attendee_recurring": "{{host}}將與{{attendee}}會面。我們已向所有人發送首次週期性會議的行事曆邀請郵件及詳細資訊。",
"emailed_you_and_any_other_attendees": "您與其他與會者已經收到這份資訊的電子郵件。",
"needs_to_be_confirmed_or_rejected": "此預約仍得經過確認,或遭到拒絕。",
"needs_to_be_confirmed_or_rejected_recurring": "您的定期會議仍需確認或拒絕。",
@@ -403,6 +410,8 @@
"back_to_bookings": "回去預約列表",
"free_to_pick_another_event_type": "請自由挑選其它活動。",
"cancelled": "已取消",
"no_booking": "無預約",
"awaiting_host": "等待主持人",
"cancellation_successful": "成功取消",
"really_cancel_booking": "真的要取消預約嗎?",
"cannot_cancel_booking": "無法取消這次的預約",
@@ -703,6 +712,9 @@
"no_teams": "還沒有任何團隊。",
"no_teams_description": "團隊可以讓其他人預約在同事之間分享的活動。",
"submit": "送出",
"confirm_remove_attribute": "是的,移除屬性",
"remove_attribute": "移除屬性",
"remove_attribute_confirmation_message": "您確定要移除屬性 '{{name}}' 嗎?所有目前被指派的使用者將會被取消指派。",
"delete": "刪除",
"update": "更新",
"save": "儲存",
@@ -1237,8 +1249,8 @@
"number_provided": "將提供電話號碼",
"before_event_trigger": "活動開始前",
"event_cancelled_trigger": "活動取消時",
"after_hosts_cal_video_no_show": "主持人未加入 Cal 視訊後",
"after_guests_cal_video_no_show": "賓客未加入 Cal 視訊後",
"after_hosts_cal_video_no_show": "主持人未加入視訊會議後",
"after_guests_cal_video_no_show": "訪客未加入視訊會議後",
"new_event_trigger": "預約新活動時",
"email_host_action": "傳送電子郵件給主辦者",
"email_attendee_action": "傳送電子郵件給與會者",
@@ -1568,6 +1580,7 @@
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing": "路由",
"routing_forms_description": "建立表單以將參與者引導到正確的目的地",
"routing_forms_send_email_owner": "傳送電子郵件給擁有者",
"routing_forms_send_email_owner_description": "表單提交後傳送電子郵件給擁有者",
@@ -1630,6 +1643,7 @@
"format": "格式",
"uppercase_for_letters": "一律使用大寫字母",
"replace_whitespaces_underscores": "以底線取代空格",
"platform_billing": "平台計費",
"manage_billing": "管理付費",
"manage_billing_description": "管理所有付費事項",
"billing_freeplan_title": "您目前使用的是免費方案",
@@ -2037,6 +2051,8 @@
"looking_for_more_insights": "在找更多 Insights 嗎?",
"filters": "篩選器",
"add_filter": "新增篩選條件",
"add_rule": "新增規則",
"add_rule_group": "新增規則群組",
"remove_filters": "清除所有篩選器",
"email_verified": "電子郵件已驗證",
"select_user": "選擇使用者",
@@ -2139,6 +2155,7 @@
"set_up_your_organization": "設定組織",
"set_up_your_platform_organization": "設置您的平台",
"organizations_description": "組織是一種共用環境,團隊可以在其中建立共用的活動類型、應用程式、工作流程等。",
"plans": "方案",
"platform": "平台",
"platform_description": "管理與平台相關的所有事務。",
"platform_organization_description": "Cal.com 平台讓您可以使用平台 API 和原子輕鬆將排程集成到您的應用中。",
@@ -2201,7 +2218,7 @@
"add_times_to_your_email": "選取幾個開放預約的時段,然後嵌入您的電子郵件",
"select_time": "選取時間",
"select_date": "選取日期",
"connecting_you_to_someone": "我們正在為您連接某人。",
"connecting_you_to_someone": "我們正在為您連接 {{orgName}} 的人員。",
"please_do_not_close_this_tab": "請勿關閉或重新整理此頁面",
"see_all_available_times": "查看所有可預約時段",
"org_team_names_example_1": "例如行銷團隊",
@@ -2276,6 +2293,10 @@
"seat_options_doesnt_multiple_durations": "座位選項不支援多個持續時間",
"include_calendar_event": "包含行事曆活動",
"oAuth": "OAuth",
"oAuth_client_creation_form": "OAuth 客戶端創建表單",
"oAuth_client_creation_form_description": "這是用於創建新 OAuth 客戶端的表單",
"oAuth_client_updation_form": "OAuth 客戶端更新表單",
"oAuth_client_updation_form_description": "這是用於編輯現有 OAuth 客戶端的表單",
"recently_added": "最近新增",
"connect_all_calendars": "連接您的所有行事曆",
"connect_all_calendars_description": "{{appName}} 會從您所有現有的日曆中讀取可用性。",
@@ -2655,6 +2676,8 @@
"booking_limits_updated_successfully": "預約限制更新成功",
"you_are_unauthorized_to_make_this_change_to_the_booking": "您無權更改此預訂",
"matching_members": "符合條件的成員",
"matching_members_queue_using_attribute_weights": "成員匹配隊列(使用屬性權重)",
"matching_members_queue_using_event_assignee_weights": "成員匹配隊列(使用事件指派權重)",
"no_matching_members": "沒有符合條件的成員。將回退使用分配給事件類型的團隊成員。",
"no_matching_members_will_fallback_to_all_assigned_members": "沒有符合條件的成員。將回退使用指派給該事件類型的團隊成員。請考慮添加回退選項或修正使用回退成員的邏輯",
"hide_calendar_event_details": "隱藏共享行事曆中的事件詳情",
@@ -2704,6 +2727,8 @@
"add_new_field": "新增欄位",
"you_dont_have_access_to_reroute_this_booking": "您沒有權限重新安排此預訂",
"form_response_not_found": "找不到表單回應",
"contact_owner": "聯絡人擁有者",
"contact_owner_not_found": "未找到",
"using_fallback_members": "使用回退成員",
"chosen_route": "選定路徑",
"attribute_logic_matched": "屬性邏輯匹配",
@@ -2732,5 +2757,43 @@
"event_end_time_in_attendee_timezone_info": "參與者時區的活動結束時間",
"salesforce_create_event_on_contact": "如果聯絡人存在,則在聯絡人上建立事件。否則回退到潛在客戶",
"salesforce_owner_name_to_change": "要更改的擁有者名稱",
"dont_have_access_this_page": "您無權存取此頁面",
"you_need_admin_or_owner_privileges_to_access": "若要查看或使用此頁面,您必須具有管理員或擁有者權限",
"field_type": "欄位類型",
"when_to_write": "何時寫入",
"salesforce_on_booking_write_to_record": "預約時,寫入參與者 {{record}} 記錄的自定義欄位",
"on_every_booking": "每次預約時",
"only_if_field_is_empty": "僅當欄位為空時",
"booking_start_date": "預約開始日期",
"booking_created_date": "預約創建日期",
"booking_reassigned_to_host": "預約重新分配給 {{host}}",
"no_contact_owner": "無聯絡人擁有者",
"routing_forms_created": "已建立的路由表單",
"routing_forms_total_responses": "總回應數",
"routing_forms_total_responses_without_booking": "未預約的總回應數",
"routing_forms_total_responses_with_booking": "已預約的總回應數",
"routing_form_insights": "無預約",
"routing_form_insights_form_name_header": "表單名稱",
"routing_form_insights_booking_status_header": "預約狀態",
"routing_form_insights_response_no_booking": "無預約",
"routing_form_insights_booked_by": "預約者",
"routing_form_insights_created_at": "建立時間",
"routing_form_insights_booking_status": "預約狀態",
"routing_form_insights_booking_at": "預約時間",
"routing_form_insights_submitted_at": "提交時間",
"access_denied": "拒絕存取",
"salesforce_route_to_owner": "如果聯絡人負責人可用,將成為Round Robin主持人",
"salesforce_do_not_route_to_owner": "不會強制指定聯絡人負責人(如果符合屬性和Round Robin條件,仍可成為主持人)",
"salesforce_route_to_custom_lookup_field": "路由至符合帳戶查詢欄位的使用者",
"salesforce_option": "Salesforce選項",
"lookup_field_name": "查詢欄位名稱",
"rr_distribution_method": "分配方式",
"rr_distribution_method_description": "可以優化分配方式以達到最大可用性或更平衡的任務分配。",
"rr_distribution_method_availability_title": "最大化可用性",
"rr_distribution_method_availability_description": "讓預約者可以在任何主持人有空的時候預約會議。當會議在主持人之間的平均分配不是那麼重要時,可使用此選項來最大化潛在會議預約數量。",
"rr_distribution_method_balanced_title": "負載平衡",
"rr_distribution_method_balanced_description": "系統會監控每位主持人的預約數量並與其他人進行比較,當某些主持人的預約量遠超過其他人時,系統會暫時停用這些主持人,以確保預約能夠均勻分配。",
"exclude_emails_that_contain": "排除包含...的電子郵件",
"exclude_emails_match_found_error_message": "請輸入有效的工作電子郵件地址",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 請在此處新增您的字串 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
@@ -8,9 +8,7 @@ describe("Tests to Check if Event Types have empty Assignment", () => {
checkForEmptyAssignment({
assignedUsers: [],
assignAllTeamMembers: false,
hosts: [
{ userId: 101, isFixed: false, priority: 2, weight: 100, weightAdjustment: 0, scheduleId: null },
],
hosts: [{ userId: 101, isFixed: false, priority: 2, weight: 100, scheduleId: null }],
isManagedEventType: true,
})
).toBe(true);
@@ -63,9 +61,7 @@ describe("Tests to Check if Event Types have empty Assignment", () => {
checkForEmptyAssignment({
assignedUsers: [],
assignAllTeamMembers: false,
hosts: [
{ userId: 101, isFixed: false, priority: 2, weight: 100, weightAdjustment: 0, scheduleId: null },
],
hosts: [{ userId: 101, isFixed: false, priority: 2, weight: 100, scheduleId: null }],
isManagedEventType: false,
})
).toBe(false);
+47 -38
View File
@@ -1,8 +1,8 @@
import type { Table } from "@tanstack/react-table";
import { describe, it, expect, vi } from "vitest";
import { describe, it, expect, vi, beforeAll, afterAll } from "vitest";
import type { UserTableUser } from "@calcom/features/users/components/UserTable/types";
import { generateCsvRaw, generateHeaderFromReactTable } from "@calcom/lib/csvUtils";
import { generateCsvRawForMembersTable, generateHeaderFromReactTable } from "@calcom/lib/csvUtils";
import type { MembershipRole } from "@calcom/prisma/enums";
function createMockTable(data: UserTableUser[]): Table<UserTableUser> {
@@ -53,8 +53,19 @@ function createMockTable(data: UserTableUser[]): Table<UserTableUser> {
}
describe("generate Csv for Org Users Table", () => {
beforeAll(() => {
vi.stubGlobal("window", {
location: {
origin: "https://acme.cal.com",
},
});
});
afterAll(() => {
vi.unstubAllGlobals();
});
const mockAttributeIds = ["attr1", "attr2"];
const HEADER_IDS_TO_EXCLUDE = ["select", "actions"];
const mockUser: UserTableUser = {
id: 1,
username: "testuser",
@@ -69,22 +80,19 @@ describe("generate Csv for Org Users Table", () => {
attributes: [],
};
it("should return null if no headers", () => {
const mockTableNoHeaders = {
getHeaderGroups: vi.fn().mockReturnValue([]),
} as unknown as Table<UserTableUser>;
expect(generateCsvRaw([], [], mockAttributeIds)).toBeNull();
it("should throw if no headers", () => {
expect(() => generateCsvRawForMembersTable([], [], mockAttributeIds)).toThrow();
});
it("should generate correct CSV headers", () => {
const mockTable = createMockTable([]);
const csv = generateCsvRaw(
generateHeaderFromReactTable(mockTable, HEADER_IDS_TO_EXCLUDE) ?? [],
const csv = generateCsvRawForMembersTable(
generateHeaderFromReactTable(mockTable) ?? [],
[],
mockAttributeIds
);
const headers = csv?.split("\n")[0];
expect(headers).toBe("Members,Role,Teams,Attribute 1,Attribute 2");
expect(headers).toBe("Members,Link,Role,Teams,Attribute 1,Attribute 2");
});
it("should handle user with single attribute value", () => {
@@ -97,15 +105,15 @@ describe("generate Csv for Org Users Table", () => {
];
const mockTable = createMockTable(mockData);
const csv = generateCsvRaw(
generateHeaderFromReactTable(mockTable, HEADER_IDS_TO_EXCLUDE) ?? [],
const csv = generateCsvRawForMembersTable(
generateHeaderFromReactTable(mockTable) ?? [],
mockData,
mockAttributeIds
);
expect(csv).toMatchInlineSnapshot(`
"Members,Role,Teams,Attribute 1,Attribute 2
test@example.com,MEMBER,Team1,value1,"
"Members,Link,Role,Teams,Attribute 1,Attribute 2
test@example.com,https://acme.cal.com/testuser,MEMBER,Team1,value1,"
`);
});
@@ -122,15 +130,15 @@ describe("generate Csv for Org Users Table", () => {
];
const mockTable = createMockTable(mockData);
const csv = generateCsvRaw(
generateHeaderFromReactTable(mockTable, HEADER_IDS_TO_EXCLUDE) ?? [],
const csv = generateCsvRawForMembersTable(
generateHeaderFromReactTable(mockTable) ?? [],
mockData,
mockAttributeIds
);
expect(csv).toMatchInlineSnapshot(`
"Members,Role,Teams,Attribute 1,Attribute 2
test@example.com,MEMBER,Team1,"value1,value2","
"Members,Link,Role,Teams,Attribute 1,Attribute 2
test@example.com,https://acme.cal.com/testuser,MEMBER,Team1,"value1,value2","
`);
});
@@ -147,15 +155,15 @@ describe("generate Csv for Org Users Table", () => {
];
const mockTable = createMockTable(mockData);
const csv = generateCsvRaw(
generateHeaderFromReactTable(mockTable, HEADER_IDS_TO_EXCLUDE) ?? [],
const csv = generateCsvRawForMembersTable(
generateHeaderFromReactTable(mockTable) ?? [],
mockData,
mockAttributeIds
);
expect(csv).toMatchInlineSnapshot(`
"Members,Role,Teams,Attribute 1,Attribute 2
test@example.com,MEMBER,"Team1,Team2",,"
"Members,Link,Role,Teams,Attribute 1,Attribute 2
test@example.com,https://acme.cal.com/testuser,MEMBER,"Team1,Team2",,"
`);
});
@@ -169,15 +177,15 @@ describe("generate Csv for Org Users Table", () => {
];
const mockTable = createMockTable(mockData);
const csv = generateCsvRaw(
generateHeaderFromReactTable(mockTable, HEADER_IDS_TO_EXCLUDE) ?? [],
const csv = generateCsvRawForMembersTable(
generateHeaderFromReactTable(mockTable) ?? [],
mockData,
mockAttributeIds
);
expect(csv).toMatchInlineSnapshot(`
"Members,Role,Teams,Attribute 1,Attribute 2
test@example.com,MEMBER,"Team,1","value,1","
"Members,Link,Role,Teams,Attribute 1,Attribute 2
test@example.com,https://acme.cal.com/testuser,MEMBER,"Team,1","value,1","
`);
});
@@ -185,22 +193,23 @@ describe("generate Csv for Org Users Table", () => {
const roles: MembershipRole[] = ["OWNER", "ADMIN", "MEMBER"];
const mockData: UserTableUser[] = roles.map((role) => ({
...mockUser,
username: role.toLowerCase(),
role,
email: `${role.toLowerCase()}@example.com`,
}));
const mockTable = createMockTable(mockData);
const csv = generateCsvRaw(
generateHeaderFromReactTable(mockTable, HEADER_IDS_TO_EXCLUDE) ?? [],
const csv = generateCsvRawForMembersTable(
generateHeaderFromReactTable(mockTable) ?? [],
mockData,
mockAttributeIds
);
expect(csv).toMatchInlineSnapshot(`
"Members,Role,Teams,Attribute 1,Attribute 2
owner@example.com,OWNER,,,
admin@example.com,ADMIN,,,
member@example.com,MEMBER,,,"
"Members,Link,Role,Teams,Attribute 1,Attribute 2
owner@example.com,https://acme.cal.com/owner,OWNER,,,
admin@example.com,https://acme.cal.com/admin,ADMIN,,,
member@example.com,https://acme.cal.com/member,MEMBER,,,"
`);
});
@@ -208,21 +217,21 @@ describe("generate Csv for Org Users Table", () => {
const mockData: UserTableUser[] = [
{
...mockUser,
username: null,
username: "testuser",
avatarUrl: null,
},
];
const mockTable = createMockTable(mockData);
const csv = generateCsvRaw(
generateHeaderFromReactTable(mockTable, HEADER_IDS_TO_EXCLUDE) ?? [],
const csv = generateCsvRawForMembersTable(
generateHeaderFromReactTable(mockTable) ?? [],
mockData,
mockAttributeIds
);
expect(csv).toMatchInlineSnapshot(`
"Members,Role,Teams,Attribute 1,Attribute 2
test@example.com,MEMBER,,,"
"Members,Link,Role,Teams,Attribute 1,Attribute 2
test@example.com,https://acme.cal.com/testuser,MEMBER,,,"
`);
});
});
+133 -2
View File
@@ -223,8 +223,10 @@ describe("getSchedule", () => {
);
});
test("correctly get slots for event with round robin and fixed hosts", async () => {
const { dateString: plus1DateString } = getDate({ dateIncrement: 1 });
const { dateString: plus2DateString } = getDate({ dateIncrement: 2 });
vi.setSystemTime("2024-05-21T00:00:13Z");
const plus1DateString = "2024-05-22";
const plus2DateString = "2024-05-23";
const crmCredential = {
id: 1,
@@ -365,6 +367,135 @@ describe("getSchedule", () => {
}
);
});
test("correctly get slots for event with only round robin hosts", async () => {
vi.setSystemTime("2024-05-21T00:00:13Z");
const plus1DateString = "2024-05-22";
const plus2DateString = "2024-05-23";
const crmCredential = {
id: 1,
type: "salesforce_crm",
key: {
clientId: "test-client-id",
},
userId: 1,
teamId: null,
appId: "salesforce",
invalid: false,
user: { email: "test@test.com" },
};
await createCredentials([crmCredential]);
mockCrmApp("salesforce", {
getContacts: [
{
id: "contact-id",
email: "test@test.com",
ownerEmail: "example@example.com",
},
],
createContacts: [{ id: "contact-id", email: "test@test.com" }],
});
await createBookingScenario({
eventTypes: [
{
id: 1,
slotInterval: 60,
length: 60,
hosts: [
{
userId: 101,
isFixed: false,
},
{
userId: 102,
isFixed: false,
},
],
schedulingType: "ROUND_ROBIN",
metadata: {
apps: {
salesforce: {
enabled: true,
appCategories: ["crm"],
roundRobinLeadSkip: true,
},
},
},
},
],
users: [
{
...TestData.users.example,
email: "example@example.com",
id: 101,
schedules: [TestData.schedules.EmptyAvailability],
},
{
...TestData.users.example,
email: "example1@example.com",
id: 102,
schedules: [TestData.schedules.IstMorningShift],
defaultScheduleId: 2,
},
],
bookings: [],
});
const scheduleWithLeadSkip = await getSchedule({
input: {
eventTypeId: 1,
eventTypeSlug: "",
startTime: `${plus1DateString}T18:30:00.000Z`,
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: true,
teamMemberEmail: "example@example.com",
orgSlug: null,
},
});
// only slots where example@example.com is available
expect(scheduleWithLeadSkip).toHaveDateDisabled({
dateString: plus2DateString,
});
const scheduleWithoutLeadSkip = await getSchedule({
input: {
eventTypeId: 1,
eventTypeSlug: "",
startTime: `${plus1DateString}T18:30:00.000Z`,
endTime: `${plus2DateString}T18:29:59.999Z`,
timeZone: Timezones["+5:30"],
isTeamEvent: true,
orgSlug: null,
},
});
// slots where either one of the rr hosts is available
expect(scheduleWithoutLeadSkip).toHaveTimeSlots(
[
`04:30:00.000Z`,
`05:30:00.000Z`,
`06:30:00.000Z`,
`07:30:00.000Z`,
`08:30:00.000Z`,
`09:30:00.000Z`,
`10:30:00.000Z`,
`11:30:00.000Z`,
`12:30:00.000Z`,
`13:30:00.000Z`,
`14:30:00.000Z`,
`15:30:00.000Z`,
],
{
dateString: plus2DateString,
}
);
});
});
describe("User Event", () => {

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