Compare commits

...
69 Commits
Author SHA1 Message Date
Alex van Andel e521bf6f0b v3.0.3
release.yml / release (push) Canceled after 0s
2023-06-20 12:26:14 +02:00
Jeroen Reumkensandalannnc a91a0f86e0 CAL-1904: Fixed bg color for all booked days as per design (#9630)
Co-authored-by: alannnc <alannnc@gmail.com>
2023-06-20 12:20:40 +02:00
GitStart-Cal.comandgitstart-calcom f654003f95 fix: settings: skeleton issues (CALCOM-9627) (#9641)
Co-authored-by: gitstart-calcom <gitstart@users.noreply.github.com>
2023-06-20 12:20:13 +02:00
Hariom Balhara 4cc8a6fbf4 fix: embed booking 404 (#9652) 2023-06-20 15:42:39 +05:30
Peer Richelsenandalannnc 5167608404 chore: added commercial API to LICENSE (#9635)
Co-authored-by: alannnc <alannnc@gmail.com>
2023-06-20 09:33:43 +00:00
Crowdin Bot 9c93685431 New Crowdin translations by Github Action 2023-06-20 08:40:54 +00:00
Hariom Balhara a380087c9b reschedule_reason is used by Booking Form (#9656) 2023-06-20 10:39:46 +02:00
alannnc 3559e0d082 Improved with some try catch and removed old behaviour (#9650) 2023-06-20 00:10:47 +00:00
4323b0c2d1 chore: Upgrades Next.js to 13.4.6 (#9578)
* Upgrades Next.js to 13.4.6

* API handlers no longer receive a payload with req.method=DELETE

* Use DELETE with query params in Calendar Switch component

---------

Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
Co-authored-by: Efraín Rochín <roae.85@gmail.com>
2023-06-19 14:22:30 -07:00
Crowdin Bot 3a800f7511 New Crowdin translations by Github Action 2023-06-19 21:16:33 +00:00
Ujwal Kumarandalannnc c203e5a38b Fix margins in booking page (#9639)
Co-authored-by: alannnc <alannnc@gmail.com>
2023-06-19 21:15:44 +00:00
Crowdin Bot 3f5b3f06a2 New Crowdin translations by Github Action 2023-06-19 20:33:22 +00:00
Leo Giovanetti d52635efbb Org labels and typos (#9646) 2023-06-19 13:32:21 -07:00
Omar López 4add4df08e fix: regression of username case sensitivity (#9642) 2023-06-19 17:34:31 +00:00
Crowdin Bot df6d7e8df7 New Crowdin translations by Github Action 2023-06-19 17:16:51 +00:00
Samuel StroscheinandPeer Richelsen dc61640118 chore: add inlang ide extension for i18n (#9599)
* add: inlang for i18n

* chore: format file

* chore: re-add comments

VSCode removed them for unknown reasons.

---------

Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2023-06-19 10:15:45 -07:00
Alex van Andel 361108246e Created secondary function to read the owner from users array (#9638) 2023-06-19 08:53:31 -07:00
Abdurrahman RajabandKeith Williams a5e25b9b28 docs: improving developer experience (#9432)
* feat: add feedback to semantic commits

* feat: welcome new contributors

* feat: add triggers welcome message

* chore: fix lint issue

* chore: typos

* Fixed spacing

* Temporarily making this runnable via Actions page

* Removed workflow_call

---------

Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2023-06-19 16:45:41 +02:00
Leo Giovanetti ccff528765 fix: Creating teams for organizations in wizard (#9632)
* Expanding org slug check and adding proper error msg

* Duh &&
2023-06-19 14:37:23 +00:00
Peer Richelsen 24a1ef6721 Create LICENSE 2023-06-19 16:18:02 +02:00
Ninad Trivediandsean-brydon b89919129e Copy link button repositioned (#9613)
Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com>
2023-06-19 16:15:48 +02:00
Keith Williams cbf3edefc7 chore: Added unit tests for CalendarManager->getCalendarCredentials (#9618)
* Added unit tests for CalendarManager->getCalendarCredentials

* Fixed spacing

* Made test data more accurate
2023-06-19 16:10:06 +02:00
Crowdin Bot 909ae5f2fb New Crowdin translations by Github Action 2023-06-19 14:01:31 +00:00
Syed Ali Shahbaz 0bbe5173dc docs: Update API documentation for Bookings endpoint (_post & _patch) (#9511)
* Fix swagger in _post bookings

* Update swagger doc for _patch

* Resolves two NITs

* Resolves metadata mistake
2023-06-19 14:00:36 +00:00
Jeroen Reumkens 84ad133077 Removed full height which incorrectly limited height in booker sidebar. Tested in Chrome, FF and Safari. (#9628) 2023-06-19 13:14:51 +00:00
Udit Takkar 43647a797f fix: remove enable_new_call_ui prop (#9625)
Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in>
2023-06-19 15:03:40 +02:00
Ritik KumarandUdit Takkar f469a9c127 fix: redirect to 404 page for invalid email verification token (#9499)
* fix:redirect to 404 page for invalid email token

* update 404 page to include invalid token error

* fix: use i18n

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

---------

Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in>
Co-authored-by: Udit Takkar <udit.07814802719@cse.mait.ac.in>
2023-06-19 13:24:10 +01:00
Carina WollendorferandCarinaWolli 212f7a374f fix name dropdown (#9621)
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
2023-06-19 11:44:47 +00:00
Alex van Andel 1929d5c7d4 v3.0.2
release.yml / release (push) Canceled after 0s
2023-06-19 13:33:13 +02:00
Papageorgiou Nikos 8ae54cd7cc fix: Storybook build and fix cal brand colors (#9588)
Storybook failed with satisfies operator
Fix cal brand colors in storybook
2023-06-19 13:28:49 +02:00
Hariom Balhara bb13009e64 + is %2B as well (#9624) 2023-06-19 11:22:13 +00:00
Jeroen Reumkens 648dd862f5 Tweaks to booker grid sizing to prevent buttons from overflow booker wrapper in Safari (#9620) 2023-06-19 11:34:49 +01:00
sean-brydonandzomars 8eccd3658e feat: Upstash implementation for rate limiting/redis (#9514)
* Introduce rate limiting that works on the edge

* typo

* Log once on init

* Update rateLimit.ts

---------

Co-authored-by: zomars <zomars@me.com>
2023-06-19 10:01:06 +00:00
Ujwal KumarandJeroen Reumkens ed65b2a3ab fix: Hide layout switcher when only 1 layout is enabled (#9610)
* Hide layout switcher when only 1 layouts is enabled

* Ran prettier

---------

Co-authored-by: Jeroen Reumkens <hello@jeroenreumkens.nl>
2023-06-19 08:55:25 +00:00
Manav Guptaandsean-brydon 0930121680 fix: event type filter in Mobile view (#9619)
Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com>
2023-06-18 21:11:41 +00:00
Crowdin Bot 1068873f27 New Crowdin translations by Github Action 2023-06-18 20:55:42 +00:00
Udit TakkarandPeer Richelsen a1ece0be63 fix: sidebar ui (#9581)
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2023-06-18 20:54:57 +00:00
Crowdin Bot c550b4c8fc New Crowdin translations by Github Action 2023-06-18 19:22:51 +00:00
VIvek ChavanandKeith Williams e95650637c fix: changes "cancelled" to canceled (#9505)
* fixed #9502 changes cancelled to cenceled

* fixed cancelled to cancelled from all places in common.json

---------

Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2023-06-18 19:21:52 +00:00
0f3e0a1554 fix: Alert component fixed (#9605)
* fix: Alert Component Fixed

* Update packages/ui/components/alert/Alert.tsx

---------

Co-authored-by: Peer Richelsen <peer@cal.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2023-06-17 20:57:15 +00:00
Peer Richelsen 761dfac033 3.0.1
release.yml / release (push) Canceled after 0s
2023-06-17 22:48:38 +02:00
Crowdin Bot 9fda4acc5b New Crowdin translations by Github Action 2023-06-17 20:45:08 +00:00
Jaideep Guntupalli 0470708aad refactor: translated request_password_reset in dutch (#9601) 2023-06-17 22:44:36 +02:00
Crowdin Bot bee392ba1a New Crowdin translations by Github Action 2023-06-17 20:43:01 +00:00
Hariom BalharaandPeer Richelsen 448f57442b Use the old booker redirect approach (#9589)
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2023-06-17 20:42:15 +00:00
Crowdin Bot 856b090b4b New Crowdin translations by Github Action 2023-06-17 20:28:18 +00:00
Ujwal Kumar b99661a411 Fix typo in email verification banner (#9595) 2023-06-17 22:27:24 +02:00
Crowdin Bot d96a26eb3c New Crowdin translations by Github Action 2023-06-17 15:48:23 +00:00
Eric Dantas 9d08f5c7c8 chore: Create add-PRs-to-project-reviewing-PRs.yml (#9597)
* Create add-PRs-to-project-eric.yml

* Update and rename add-PRs-to-project-eric.yml to add-PRs-to-project-reviewing-PRs.yml

* Update add-PRs-to-project-reviewing-PRs.yml
2023-06-17 17:47:29 +02:00
Crowdin Bot 4fe5f6ca6f New Crowdin translations by Github Action 2023-06-17 01:06:55 +00:00
Esaú MoraisandAlex van Andel af505935bd fix: update top banner (#9580)
* fix: update wrong banner message in english

* fix: update `resend_email` translation in pt-BR

* chore: add `Icon` prop to `TopBanner` component

* fix: remove unnecessary variant scope

* Remove translations so they can be retranslated, complete design

* Changed key of already translated entry

---------

Co-authored-by: Alex van Andel <me@alexvanandel.com>
2023-06-17 01:06:04 +00:00
Leo Giovanetti 4a30f60622 Configuring totp code when verifying too (#9584) 2023-06-16 20:08:12 +00:00
Alex van Andel 24ed04e6c7 v3.0.0.2
release.yml / release (push) Canceled after 0s
2023-06-16 19:21:26 +02:00
Hariom Balhara bed3595314 fix: Dynamic Group Links on vercel (#9576)
* Potential fix

* Debug

* Debug

* Use the same logic in new-booker
2023-06-16 19:00:23 +02:00
Alex van Andel 74671263bf fix: New booker selected date issues (#9570)
* Pick correct selected date

* Commented out unused booking page revalidation

* Fixed selected default bookerLayout not being applied

* Use the right weekdayOfFirst - date(1) of browsingDate
2023-06-16 18:08:58 +02:00
Crowdin Bot bdc5e9c7e9 New Crowdin translations by Github Action 2023-06-16 14:39:35 +00:00
Leo Giovanetti 8fa1c70a97 Adding more time to org admin email verif step (#9574) 2023-06-16 14:38:40 +00:00
Hariom Balhara 1343c8fa8d fix: Booking Page crash with prefilling guests (#9566)
* Fix Booking Page crash with prefilling guests

* Update packages/features/bookings/Booker/components/BookEventForm/BookEventForm.tsx
2023-06-16 15:02:59 +02:00
Crowdin Bot 5c0f9510a1 New Crowdin translations by Github Action 2023-06-16 12:46:06 +00:00
b2801170fa fix: Default tab selected issue (#9546)
* default tab selected issue

* refactor: improve cde

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

* fix: use onSuccess

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

* fix: move onsuccess and onerror

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

---------

Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in>
Co-authored-by: Vinoth Kumar V <vinoth_kumar_v@Vinoths-MacBook-Pro.local>
Co-authored-by: Udit Takkar <udit.07814802719@cse.mait.ac.in>
2023-06-16 12:45:20 +00:00
Alex van Andel 6ac19e8307 v3.0.0.1
release.yml / release (push) Canceled after 0s
2023-06-16 12:48:20 +02:00
Hariom Balhara 344241cfbf fix: New Booker Rewrites (#9557)
* Solve the problem using Next.config.js only

* Debug

* Avoid infinite rewritees

* Apply suggestions from code review

* Apply suggestions from code review

* Remove stale comments

* Update packages/embeds/embed-core/src/embed-iframe.ts
2023-06-16 12:31:57 +02:00
Carina WollendorferandCarinaWolli 66ebf18fa9 add team slug to team event link (#9558)
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
2023-06-16 11:05:47 +02:00
Crowdin Bot e6d6f3317e New Crowdin translations by Github Action 2023-06-16 08:38:03 +00:00
Carina WollendorferandCarinaWolli 55f66e6bcd remove slash (#9556)
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
2023-06-16 08:37:06 +00:00
Crowdin Bot 22e2b0a6a9 New Crowdin translations by Github Action 2023-06-16 06:27:50 +00:00
sydwardrae e24f3828cb Spelling chore common.json (#9550)
Fixed occured to occurred
2023-06-16 08:26:59 +02:00
Crowdin Bot 70f5bdc499 New Crowdin translations by Github Action 2023-06-15 22:38:02 +00:00
zomars 8731a39c3c fix: api build 2023-06-15 15:36:59 -07:00
102 changed files with 1083 additions and 1265 deletions
+2
View File
@@ -23,6 +23,8 @@ CALCOM_LICENSE_KEY=
# - DATABASE ************************************************************************************************
DATABASE_URL="postgresql://postgres:@localhost:5450/calendso"
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
# Uncomment to enable a dedicated connection pool for Prisma using Prisma Data Proxy
# Cold boots will be faster and you'll be able to scale your DB independently of your app.
@@ -0,0 +1,16 @@
name: Add PRs to project Reviewing PRs
on:
pull_request:
types:
- opened
jobs:
add-PR-to-project:
name: Add PRs to project Reviewing PRs
runs-on: ubuntu-latest
steps:
- uses: actions/add-to-project@v0.1.0
with:
project-url: https://github.com/orgs/calcom/projects/11
github-token: ${{ secrets.GH_ACCESS_TOKEN }}
+28 -2
View File
@@ -9,7 +9,7 @@ on:
- synchronize
permissions:
pull-requests: read
pull-requests: write
jobs:
validate-pr:
@@ -17,5 +17,31 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
id: lint_pr_title
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: marocchino/sticky-pull-request-comment@v2
# When the previous steps fails, the workflow would stop. By adding this
# condition you can continue the execution with the populated error message.
if: always() && (steps.lint_pr_title.outputs.error_message != null)
with:
header: pr-title-lint-error
message: |
Hey there and thank you for opening this pull request! 👋🏼
We require pull request titles to follow the [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/) and it looks like your proposed title needs to be adjusted.
Details:
```
${{ steps.lint_pr_title.outputs.error_message }}
```
# Delete a previous comment when the issue has been resolved
- if: ${{ steps.lint_pr_title.outputs.error_message == null }}
uses: marocchino/sticky-pull-request-comment@v2
with:
header: pr-title-lint-error
message: |
Thank you for following the naming conventions! 🙏
@@ -0,0 +1,28 @@
name: "Welcome new contributors"
on:
issues:
types: opened
pull_request:
types: opened
permissions:
pull-requests: write
issues: write
jobs:
welcome-message:
name: Welcoming New Users
runs-on: ubuntu-latest
timeout-minutes: 10
needs: semantics
if: github.event.action == 'opened'
steps:
- uses: actions/first-interaction@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
pr-message: |-
Thank you for making your first Pull Request and taking the time to improve Cal.com ! ❤️🎉
Feel free to join the conversation at [slack](https://calendso.slack.com/)
issue-message: |
Thank you for opening your first issue, one of our team members will review it as soon as it possible. ❤️🎉
+2 -1
View File
@@ -8,6 +8,7 @@
"ban.spellright", // Spell check for docs
"stripe.vscode-stripe", // stripe VSCode extension
"Prisma.prisma", // syntax|format|completion for prisma
"rebornix.project-snippets" // Share useful snippets between collaborators
"rebornix.project-snippets", // Share useful snippets between collaborators
"inlang.vs-code-extension" // improved i18n DX
]
}
+1 -1
View File
@@ -2,7 +2,7 @@ Copyright (c) 2020-present Cal.com, Inc.
Portions of this software are licensed as follows:
* All content that resides under https://github.com/calcom/cal.com/tree/main/packages/features/ee directory of this repository (Commercial License) is licensed under the license defined in "ee/LICENSE".
* All content that resides under https://github.com/calcom/cal.com/tree/main/packages/features/ee and https://github.com/calcom/cal.com/tree/main/apps/api/ directory of this repository (Commercial License) is licensed under the license defined in "ee/LICENSE".
* All third party components incorporated into the Cal.com Software are licensed under the original license provided by the owner of the applicable component.
* Content outside of the above mentioned directories or restrictions above is available under the "AGPLv3" license as defined below.
+42
View File
@@ -0,0 +1,42 @@
The Cal.com Commercial License (the “Commercial License”)
Copyright (c) 2020-present Cal.com, Inc
With regard to the Cal.com Software:
This software and associated documentation files (the "Software") may only be
used in production, if you (and any entity that you represent) have agreed to,
and are in compliance with, the Cal.com Subscription Terms available
at https://cal.com/terms, or other agreements governing
the use of the Software, as mutually agreed by you and Cal.com, Inc ("Cal.com"),
and otherwise have a valid Cal.com Enterprise Edition subscription ("Commercial Subscription")
for the correct number of hosts as defined in the "Commercial Terms ("Hosts"). Subject to the foregoing sentence,
you are free to modify this Software and publish patches to the Software. You agree
that Cal.com and/or its licensors (as applicable) retain all right, title and interest in
and to all such modifications and/or patches, and all such modifications and/or
patches may only be used, copied, modified, displayed, distributed, or otherwise
exploited with a valid Commercial Subscription for the correct number of hosts.
Notwithstanding the foregoing, you may copy and modify the Software for development
and testing purposes, without requiring a subscription. You agree that Cal.com and/or
its licensors (as applicable) retain all right, title and interest in and to all such
modifications. You are not granted any other rights beyond what is expressly stated herein.
Subject to the foregoing, it is forbidden to copy, merge, publish, distribute, sublicense,
and/or sell the Software.
This Commercial License applies only to the part of this Software that is not distributed under
the AGPLv3 license. Any part of this Software distributed under the MIT license or which
is served client-side as an image, font, cascading stylesheet (CSS), file which produces
or is compiled, arranged, augmented, or combined into client-side JavaScript, in whole or
in part, is copyrighted under the AGPLv3 license. The full text of this Commercial License shall
be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
For all third party components incorporated into the Cal.com Software, those
components are licensed under the original license provided by the owner of the
applicable component.
+1 -1
View File
@@ -32,7 +32,7 @@
"@sentry/nextjs": "^7.20.0",
"bcryptjs": "^2.4.3",
"memory-cache": "^0.2.0",
"next": "~13.2.1",
"next": "~13.4.6",
"next-api-middleware": "^1.0.1",
"next-axiom": "^0.16.0",
"next-swagger-doc": "^0.3.6",
+1 -1
View File
@@ -123,7 +123,7 @@ async function handler(req: NextApiRequest) {
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(req.headers.host ?? "");
if (!teamId)
return getUserAvailability({
orgSlug: isValidOrgDomain ? currentOrgDomain : undefined,
orgSlug: isValidOrgDomain ? currentOrgDomain || undefined : undefined,
username,
dateFrom,
dateTo,
+12 -1
View File
@@ -35,6 +35,9 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform
* status:
* type: string
* description: 'Acceptable values one of ["ACCEPTED", "PENDING", "CANCELLED", "REJECTED"]'
* description:
* type: string
* description: 'Description of the meeting'
* examples:
* editBooking:
* value:
@@ -79,7 +82,15 @@ import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransform
* "startTime": "2023-05-24T13:00:00.000Z",
* "endTime": "2023-05-24T13:30:00.000Z",
* "metadata": {},
* "status": "CANCELLED"
* "status": "CANCELLED",
* "responses": {
* "email": "john.doe@example.com",
* "name": "John Doe",
* "location": {
* "optionValue": "",
* "value": "inPerson"
* }
* }
* }
* }
* 400:
+69 -70
View File
@@ -26,13 +26,10 @@ import { defaultResponder } from "@calcom/lib/server";
* required:
* - eventTypeId
* - start
* - name
* - email
* - responses
* - timeZone
* - language
* - metadata
* - customInputs
* - location
* properties:
* eventTypeId:
* type: integer
@@ -45,29 +42,33 @@ import { defaultResponder } from "@calcom/lib/server";
* type: string
* format: date-time
* description: 'End time of the Event'
* name:
* type: string
* description: 'Name of the Attendee'
* email:
* type: string
* format: email
* description: 'Email ID of the Attendee'
* responses:
* type: object
* required:
* - name
* - email
* - location
* properties:
* name:
* type: string
* description: 'Attendee full name'
* email:
* type: string
* format: email
* description: 'Attendee email address'
* location:
* type: string
* description: 'Meeting location'
* metadata:
* type: object
* properties: {}
* description: 'Any metadata associated with the booking'
* timeZone:
* type: string
* description: 'TimeZone of the Attendee'
* language:
* type: string
* description: 'Language of the Attendee'
* metadata:
* type: object
* properties: {}
* description: 'Any metadata associated with the booking'
* customInputs:
* type: array
* items: {}
* location:
* type: string
* description: 'Meeting location'
* title:
* type: string
* description: 'Booking event title'
@@ -96,13 +97,14 @@ import { defaultResponder } from "@calcom/lib/server";
* "eventTypeId": 2323232,
* "start": "2023-05-24T13:00:00.000Z",
* "end": "2023-05-24T13:30:00.000Z",
* "name": "Hello Hello",
* "email": "hello@gmail.com",
* "responses":{
* "name": "Hello Hello",
* "email": "hello@gmail.com",
* "metadata": {},
* "location": "Calcom HQ",
* },
* "timeZone": "Europe/London",
* "language": "en",
* "metadata": {},
* "customInputs": [],
* "location": "Calcom HQ",
* "title": "Debugging between Syed Ali Shahbaz and Hello Hello",
* "description": null,
* "status": "PENDING",
@@ -117,53 +119,50 @@ import { defaultResponder } from "@calcom/lib/server";
* content:
* application/json:
* examples:
* bookings:
* booking created successfully example:
* value:
* {
* "id": 11223344,
* "uid": "5yUjmAYTDF6MXo98re8SkX",
* "userId": 123,
* "eventTypeId": 2323232,
* "title": "Debugging between Syed Ali Shahbaz and Hello Hello",
* "description": null,
* "customInputs": {},
* "responses": null,
* "startTime": "2023-05-24T13:00:00.000Z",
* "endTime": "2023-05-24T13:30:00.000Z",
* "location": "Calcom HQ",
* "createdAt": "2023-04-19T10:17:58.580Z",
* "updatedAt": null,
* "status": "PENDING",
* "paid": false,
* "destinationCalendarId": 2180,
* "cancellationReason": null,
* "rejectionReason": null,
* "dynamicEventSlugRef": null,
* "dynamicGroupSlugRef": null,
* "rescheduled": null,
* "fromReschedule": null,
* "recurringEventId": null,
* "smsReminderNumber": null,
* "scheduledJobs": [],
* "metadata": {},
* "isRecorded": false,
* "user": {
* "email": "test@cal.com",
* "name": "Syed Ali Shahbaz",
* "timeZone": "Asia/Calcutta"
* },
* "attendees": [
* {
* "id": 12345,
* "email": "hello@gmail.com",
* "name": "Hello Hello",
* "timeZone": "Europe/London",
* "locale": "en",
* "bookingId": 11223344
* "booking": {
* "id": 91,
* "userId": 5,
* "description": "",
* "eventTypeId": 7,
* "uid": "bFJeNb2uX8ANpT3JL5EfXw",
* "title": "60min between Pro Example and John Doe",
* "startTime": "2023-05-25T09:30:00.000Z",
* "endTime": "2023-05-25T10:30:00.000Z",
* "attendees": [
* {
* "email": "john.doe@example.com",
* "name": "John Doe",
* "timeZone": "Asia/Kolkata",
* "locale": "en"
* }
* ],
* "user": {
* "email": "pro@example.com",
* "name": "Pro Example",
* "timeZone": "Asia/Kolkata",
* "locale": "en"
* },
* "payment": [
* {
* "id": 1,
* "success": true,
* "paymentOption": "ON_BOOKING"
* }
* ],
* "metadata": {},
* "status": "ACCEPTED",
* "responses": {
* "email": "john.doe@example.com",
* "name": "John Doe",
* "location": {
* "optionValue": "",
* "value": "inPerson"
* }
* }
* ],
* "payment": [],
* "references": []
* }
* }
* 400:
* description: |
+1 -1
View File
@@ -20,7 +20,7 @@
"@radix-ui/react-slider": "^1.0.0",
"@radix-ui/react-switch": "^1.0.0",
"@radix-ui/react-tooltip": "^1.0.0",
"next": "^13.2.1",
"next": "^13.4.6",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"storybook-addon-rtl-direction": "^0.0.19"
+4 -2
View File
@@ -235,6 +235,7 @@
*/
--cal-brand:#111827;
--cal-brand-emphasis:#101010;
--cal-brand-text: white;
}
.dark {
/* background */
@@ -274,7 +275,8 @@
/* Brand shenanigans
-> These will be computed for the users theme at runtime.
*/
--cal-brand: #111827;
--cal-brand-emphasis: #101010;
--cal-brand: white;
--cal-brand-emphasis: #e1e1e1;
--cal-brand-text: black;
}
}
+1 -1
View File
@@ -14,7 +14,7 @@
"dependencies": {
"highlight.js": "^11.6.0",
"isarray": "2.0.5",
"next": "^13.2.1",
"next": "^13.4.6",
"openapi-snippet": "^0.13.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -93,7 +93,7 @@ export default function CancelBooking(props: Props) {
headers: {
"Content-Type": "application/json",
},
method: "DELETE",
method: "POST",
});
if (res.status >= 200 && res.status < 300) {
@@ -24,9 +24,9 @@ interface UsernameAvailabilityFieldProps {
function useUserNamePrefix(organization: RouterOutputs["viewer"]["me"]["organization"]): string {
return organization
? organization.slug
? `${organization.slug}.${subdomainSuffix()}`
? `${organization.slug}.${subdomainSuffix()}/`
: organization.metadata && organization.metadata.requestedSlug
? `${organization.metadata.requestedSlug}.${subdomainSuffix()}`
? `${organization.metadata.requestedSlug}.${subdomainSuffix()}/`
: process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "")
: process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "");
}
-18
View File
@@ -12,21 +12,10 @@ const middleware: NextMiddleware = async (req) => {
const url = req.nextUrl;
const requestHeaders = new Headers(req.headers);
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(req.headers.get("host") ?? "");
const isEmbedRequest = typeof url.searchParams.get("embed") === "string";
/**
* We are using env variable to toggle new-booker because using flags would be an unnecessary delay for booking pages
* Also, we can't easily identify the booker page requests here(to just fetch the flags for those requests)
*/
// Enable New Booker for All but embed Requests
if (process.env.NEW_BOOKER_ENABLED_FOR_NON_EMBED === "1" && !isEmbedRequest) {
requestHeaders.set("new-booker-enabled", "1");
}
// Enable New Booker for Embed Requests
if (process.env.NEW_BOOKER_ENABLED_FOR_EMBED === "1" && isEmbedRequest) {
requestHeaders.set("new-booker-enabled", "1");
}
// Make sure we are in the presence of an organization
if (isValidOrgDomain && url.pathname === "/") {
@@ -79,13 +68,6 @@ const middleware: NextMiddleware = async (req) => {
}
}
// Ensure that embed query param is there in when /embed is added.
// query param is the way in which client side code knows that it is in embed mode.
if (url.pathname.endsWith("/embed") && typeof url.searchParams.get("embed") !== "string") {
url.searchParams.set("embed", "");
return NextResponse.redirect(url);
}
// Don't 404 old routing_forms links
if (url.pathname.startsWith("/apps/routing_forms")) {
url.pathname = url.pathname.replace("/apps/routing_forms", "/apps/routing-forms");
+77 -54
View File
@@ -183,7 +183,13 @@ const nextConfig = {
return config;
},
async rewrites() {
return [
// .* matches / as well(Note: *(i.e wildcard) doesn't match / but .*(i.e. RegExp) does)
// It would match /free/30min but not /bookings/upcoming because 'bookings' is an item in pages
// It would also not match /free/30min/embed because we are ensuring just two slashes
// ?!book ensures it doesn't match /free/book page which doesn't have a corresponding new-booker page.
// [^/]+ makes the RegExp match the full path, it seems like a partial match doesn't work.
const userTypeRouteRegExp = `/:user((?!${pages.join("|")})[^/]*)/:type((?!book)[^/]+)`;
let rewrites = [
{
source: "/org/:slug",
destination: "/team/:slug",
@@ -219,68 +225,85 @@ const nextConfig = {
source: "/cancel/:path*",
destination: "/booking/:path*",
},
// Keep cookie based booker enabled just in case we disable new-booker globally
...[
{
source: userTypeRouteRegExp,
destination: "/new-booker/:user/:type",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
{
source: "/team/:slug/:type",
destination: "/new-booker/team/:slug/:type",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
{
source: "/d/:link/:slug",
destination: "/new-booker/d/:link/:slug",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
],
// Keep cookie based booker enabled to test new-booker embed in production
...[
{
source: `/:user((?!${pages.join("|")}).*)/:type/embed`,
destination: "/new-booker/:user/:type/embed",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
{
source: "/team/:slug/:type/embed",
destination: "/new-booker/team/:slug/:type/embed",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
],
/* TODO: have these files being served from another deployment or CDN {
source: "/embed/embed.js",
destination: process.env.NEXT_PUBLIC_EMBED_LIB_URL?,
}, */
/**
* Header allows us to enable new-booker using middleware which uses env variables to enable/disable new booker
*/
{
source: `/:user((?!${pages.join("|")}).*)/:type`,
destination: "/new-booker/:user/:type",
has: [{ type: "header", key: "new-booker-enabled" }],
},
{
source: `/:user((?!${pages.join("|")}).*)/:type/embed`,
destination: "/new-booker/:user/:type/embed",
has: [{ type: "header", key: "new-booker-enabled" }],
},
{
source: "/team/:slug/:type",
destination: "/new-booker/team/:slug/:type",
has: [{ type: "header", key: "new-booker-enabled" }],
},
{
source: "/team/:slug/:type/embed",
destination: "/new-booker/team/:slug/:type/embed",
has: [{ type: "header", key: "new-booker-enabled" }],
},
{
source: "/d/:link/:slug",
destination: "/new-booker/d/:link/:slug",
has: [{ type: "header", key: "new-booker-enabled" }],
},
/**
* Enables new booker using cookie. It works even if NEW_BOOKER_ENABLED_FOR_NON_EMBED, NEW_BOOKER_ENABLED_FOR_EMBED are disabled
*/
{
source: `/:user((?!${pages.join("|")}).*)/:type`,
destination: "/new-booker/:user/:type",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
{
source: `/:user((?!${pages.join("|")}).*)/:type/embed`,
destination: "/new-booker/:user/:type/embed",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
{
source: "/team/:slug/:type",
destination: "/new-booker/team/:slug/:type",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
{
source: "/team/:slug/:type/embed",
destination: "/new-booker/team/:slug/:type/embed",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
{
source: "/d/:link/:slug",
destination: "/new-booker/d/:link/:slug",
has: [{ type: "cookie", key: "new-booker-enabled" }],
},
];
// Enable New Booker for all Embed Requests
if (process.env.NEW_BOOKER_ENABLED_FOR_EMBED === "1") {
console.log("Enabling New Booker for Embed");
rewrites.push(
...[
{
source: `/:user((?!${pages.join("|")}).*)/:type/embed`,
destination: "/new-booker/:user/:type/embed",
},
{
source: "/team/:slug/:type/embed",
destination: "/new-booker/team/:slug/:type/embed",
},
]
);
}
// Enable New Booker for All but embed Requests
if (process.env.NEW_BOOKER_ENABLED_FOR_NON_EMBED === "1") {
console.log("Enabling New Booker for Non-Embed");
rewrites.push(
...[
{
source: userTypeRouteRegExp,
destination: "/new-booker/:user/:type",
},
{
source: "/team/:slug/:type",
destination: "/new-booker/team/:slug/:type",
},
{
source: "/d/:link/:slug",
destination: "/new-booker/d/:link/:slug",
},
]
);
}
return rewrites;
},
async headers() {
return [
+4 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@calcom/web",
"version": "3.0.0",
"version": "3.0.3",
"private": true,
"scripts": {
"analyze": "ANALYZE=true next build",
@@ -61,6 +61,8 @@
"@tanstack/react-query": "^4.3.9",
"@tremor/react": "^2.0.0",
"@types/turndown": "^5.0.1",
"@upstash/ratelimit": "^0.4.3",
"@upstash/redis": "^1.21.0",
"@vercel/edge-config": "^0.1.1",
"@vercel/edge-functions-ui": "^0.2.1",
"@vercel/og": "^0.5.0",
@@ -86,7 +88,7 @@
"memory-cache": "^0.2.0",
"micro": "^10.0.1",
"mime-types": "^2.1.35",
"next": "^13.2.1",
"next": "^13.4.6",
"next-auth": "^4.20.1",
"next-axiom": "^0.16.0",
"next-collect": "^0.2.1",
+11 -1
View File
@@ -42,6 +42,10 @@ export default function Custom404() {
const isSubpage = router.asPath.includes("/", 2) || isSuccessPage;
const isSignup = router.asPath.startsWith("/signup");
const isCalcom = process.env.NEXT_PUBLIC_WEBAPP_URL === "https://app.cal.com";
// In case of invalid email verification token, we intentionally redirect to 404 from the API
const isInvalidToken = router.asPath === "/404";
/**
* If we're on 404 and the route is insights it means it is disabled
* TODO: Abstract this for all disabled features
@@ -200,12 +204,18 @@ export default function Custom404() {
{t("error_404")}
</p>
<h1 className="font-cal text-emphasis mt-2 text-4xl font-extrabold sm:text-5xl">
{isSuccessPage ? "Booking not found" : t("page_doesnt_exist")}
{isSuccessPage
? t("booking_not_found")
: isInvalidToken
? t("invalid_verification_link")
: t("page_doesnt_exist")}
</h1>
{isSubpage ? (
<span className="mt-2 inline-block text-lg ">
{t("check_spelling_mistakes_or_go_back")}
</span>
) : isInvalidToken ? (
<span className="mt-2 inline-block text-lg">{t("token_invalid_expired")}</span>
) : isCalcom ? (
<a target="_blank" href={url} className="mt-2 inline-block text-lg" rel="noreferrer">
{t("the_username")}{" "}
+4 -3
View File
@@ -4,6 +4,7 @@ import { z } from "zod";
import type { LocationObject } from "@calcom/app-store/locations";
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
import { IS_TEAM_BILLING_ENABLED, WEBAPP_URL } from "@calcom/lib/constants";
import { getUsernameList } from "@calcom/lib/defaultEvents";
import hasKeyInMetadata from "@calcom/lib/hasKeyInMetadata";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { markdownToSafeHTML } from "@calcom/lib/markdownToSafeHTML";
@@ -236,7 +237,7 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) {
const { getAppFromSlug } = await import("@calcom/app-store/utils");
const { type: typeParam, user: userParam } = paramsSchema.parse(context.query);
const { type: typeParam, user: userParam } = paramsSchema.parse(context.params);
const usernameList = getUsernameList(userParam);
const length = parseInt(typeParam);
const eventType = getDefaultEvent("" + length);
@@ -358,9 +359,9 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) {
}
export async function getServerSideProps(context: GetServerSidePropsContext) {
const { user: userParam } = paramsSchema.parse(context.query);
const { user: userParam } = paramsSchema.parse(context.params);
// dynamic groups are not generated at build time, but otherwise are probably cached until infinity.
const isDynamicGroup = userParam.includes("+");
const isDynamicGroup = getUsernameList(userParam).length > 1;
if (isDynamicGroup) {
return await getDynamicGroupPageProps(context);
} else {
+9 -9
View File
@@ -5,15 +5,12 @@ import { z } from "zod";
import dayjs from "@calcom/dayjs";
import { sendPasswordResetEmail } from "@calcom/emails";
import { PASSWORD_RESET_EXPIRY_HOURS } from "@calcom/emails/templates/forgot-password-email";
import rateLimit from "@calcom/lib/rateLimit";
import { ErrorCode } from "@calcom/features/auth/lib/ErrorCode";
import rateLimiter from "@calcom/lib/rateLimit";
import { defaultHandler } from "@calcom/lib/server";
import { getTranslation } from "@calcom/lib/server/i18n";
import prisma from "@calcom/prisma";
const limiter = rateLimit({
intervalInMs: 60 * 1000, // 1 minute
});
async function handler(req: NextApiRequest, res: NextApiResponse) {
const t = await getTranslation(req.body.language ?? "en", "common");
@@ -37,10 +34,13 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
// 10 requests per minute
try {
limiter.check(10, ip);
} catch (e) {
return res.status(429).json({ message: "Too Many Requests." });
const limiter = await rateLimiter();
const limit = await limiter({
identifier: ip,
});
if (!limit.success) {
throw new Error(ErrorCode.RateLimitExceeded);
}
try {
+2 -2
View File
@@ -19,11 +19,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
});
if (!foundToken) {
return res.status(401).json({ message: "No token found" });
return res.redirect(`${WEBAPP_URL}/404`);
}
if (dayjs(foundToken?.expires).isBefore(dayjs())) {
return res.status(401).json({ message: "Token expired" });
return res.redirect(`${WEBAPP_URL}/404`);
}
const user = await prisma.user.update({
+14 -6
View File
@@ -1,4 +1,5 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { z } from "zod";
import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager";
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
@@ -6,6 +7,11 @@ import notEmpty from "@calcom/lib/notEmpty";
import { revalidateCalendarCache } from "@calcom/lib/server/revalidateCalendarCache";
import prisma from "@calcom/prisma";
const selectedCalendarSelectSchema = z.object({
integration: z.string(),
externalId: z.string(),
});
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const session = await getServerSession({ req, res });
@@ -32,18 +38,19 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
const { credentials, ...user } = userWithCredentials;
if (req.method === "POST") {
const { integration, externalId } = selectedCalendarSelectSchema.parse(req.body);
await prisma.selectedCalendar.upsert({
where: {
userId_integration_externalId: {
userId: user.id,
integration: req.body.integration,
externalId: req.body.externalId,
integration,
externalId,
},
},
create: {
userId: user.id,
integration: req.body.integration,
externalId: req.body.externalId,
integration,
externalId,
},
// already exists
update: {},
@@ -52,12 +59,13 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
}
if (req.method === "DELETE") {
const { integration, externalId } = selectedCalendarSelectSchema.parse(req.query);
await prisma.selectedCalendar.delete({
where: {
userId_integration_externalId: {
userId: user.id,
externalId: req.body.externalId,
integration: req.body.integration,
externalId,
integration,
},
},
});
+1 -1
View File
@@ -394,7 +394,7 @@ export default function Success(props: SuccessProps) {
{(isCancelled || reschedule) && cancellationReason && (
<>
<div className="font-medium">
{isCancelled ? t("reason") : t("reschedule_reason_success_page")}
{isCancelled ? t("reason") : t("reschedule_reason")}
</div>
<div className="col-span-2 mb-6 last:mb-0">{cancellationReason}</div>
</>
+1 -1
View File
@@ -799,7 +799,7 @@ const CTA = () => {
const Actions = () => {
return (
<div className="flex items-center">
<div className="hidden items-center md:flex">
<OrganizationEventTypeFilter />
<VerticalDivider />
</div>
+3 -2
View File
@@ -101,7 +101,8 @@ async function getUserPageProps(context: GetServerSidePropsContext) {
const ssr = await ssrInit(context);
const user = await prisma.user.findFirst({
where: {
username,
/** TODO: We should standarize this */
username: username.toLowerCase().replace(/( |%20)/g, "+"),
organization: isValidOrgDomain
? {
slug: currentOrgDomain,
@@ -154,7 +155,7 @@ const paramsSchema = z.object({ type: z.string(), user: z.string() });
// whether the page should show an away state or dynamic booking not allowed.
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
const { user } = paramsSchema.parse(context.params);
const isDynamicGroup = user.includes("+");
const isDynamicGroup = getUsernameList(user).length > 1;
return isDynamicGroup ? await getDynamicGroupPageProps(context) : await getUserPageProps(context);
};
@@ -50,7 +50,7 @@ const SkeletonLoader = ({ title, description }: { title: string; description: st
<Meta title={title} description={description} />
<div className="mt-6 mb-8 space-y-6">
<div className="flex items-center">
<SkeletonAvatar className="h-12 w-12 px-4" />
<SkeletonAvatar className="me-4 h-16 w-16 px-4" />
<SkeletonButton className="h-6 w-32 rounded-md p-5" />
</div>
<SkeletonText className="h-8 w-full" />
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "هل لديك أسئلة؟ نحن هنا للمساعدة.",
"reset_password_subject": "{{appName}}: إرشادات إعادة تعيين كلمة المرور",
"event_declined_subject": "تم الرفض: {{title}} في {{date}}",
"event_cancelled_subject": "تم الإلغاء: {{title}} في {{date}}",
"event_request_declined": "تم رفض طلب الحدث الخاص بك",
"event_request_declined_recurring": "تم رفض طلب الحدث المتكرر الخاص بك",
"event_request_cancelled": "تم إلغاء حدثك المُجَدْوَل",
"organizer": "المنظِّم",
"need_to_reschedule_or_cancel": "هل تحتاج إلى إعادة جدولة أو إلغاء؟",
"cancellation_reason": "سبب الإلغاء (اختياري)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "لقد تم حجز الاجتماع الخاص بك",
"event_type_has_been_rescheduled_on_time_date": "تم إعادة جدولة {{title}} إلى {{date}}.",
"event_has_been_rescheduled": "تم التحديث - تم إعادة جدولة الحدث الخاص بك",
"request_reschedule_subtitle": "ألغى {{organizer}} الحجز وطلب منك اختيار حجز في وقت آخر.",
"request_reschedule_title_organizer": "لقد طلبت من {{attendee}} إعادة جدولة موعد",
"request_reschedule_subtitle_organizer": "لقد ألغيت الحجز ويجب أن يختار {{attendee}} وقتًا جديداً للحجز معك.",
"rescheduled_event_type_subject": "تم إرسال طلب لإعادة الجدولة: {{eventType}} مع {{name}} في {{date}}",
"requested_to_reschedule_subject_attendee": "الإجراء المطلوب إعادة الجدولة: يُرجى حجز وقت جديد لمدة {{eventType}} مع {{name}}",
"hi_user_name": "مرحبا {{name}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "لا يمكن أن يكون وقت الانتهاء أطول من 24 ساعة",
"back_to_bookings": "العودة إلى عمليات الحجز",
"free_to_pick_another_event_type": "لا تتردد في اختيار حدث آخر في أي وقت.",
"cancelled": "تم الإلغاء",
"cancellation_successful": "تم الإلغاء بنجاح",
"really_cancel_booking": "هل تريد حقًا إلغاء الحجز؟",
"cannot_cancel_booking": "لا يمكنك إلغاء هذا الحجز",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "إن هذا الحدث أحد الأمثلة على حدث متكرر.",
"cancelling_all_recurring": "هذه هي كل الأمثلة المتبقية في الحدث المتكرر.",
"error_with_status_code_occured": "حدث خطأ برمز الحالة {{status}}.",
"booking_already_cancelled": "تم إلغاء هذا الحجز بالفعل",
"booking_already_accepted_rejected": "تم بالفعل قبول هذا الحجز أو رفضه",
"go_back_home": "العودة إلى الشاشة الرئيسية",
"or_go_back_home": "أو العودة إلى الشاشة الرئيسية",
@@ -326,7 +320,6 @@
"upcoming_bookings": "بمجرد أن يحجز شخص ما موعدًا معك، سيظهر هنا.",
"recurring_bookings": "بمجرد أن يحجز شخص ما اجتماعًا متكررًا معك، سيظهر هنا.",
"past_bookings": "ستظهر هنا عمليات حجزك السابقة.",
"cancelled_bookings": "ستظهر هنا عمليات حجزك التي تم إلغاؤها.",
"unconfirmed_bookings": "ستظهر هنا كل حجوزات غير المؤكدة بعد.",
"unconfirmed_bookings_tooltip": "الحجوزات غير المؤكدة",
"on": "في",
@@ -366,7 +359,6 @@
"browse_api_documentation": "استعراض مستندات واجهة برمجة التطبيقات (API) لدينا",
"leverage_our_api": "استفد من واجهة برمجة التطبيقات (API) لدينا من أجل قدرة كاملة على التحكم والتخصيص.",
"create_webhook": "إنشاء الويب هوك",
"booking_cancelled": "تم إلغاء الحجز",
"booking_rescheduled": "تمت إعادة جدولة الحجز",
"recording_ready": "رابط تنزيل التسجيل جاهز",
"booking_created": "تم إنشاء الحجز",
@@ -379,8 +371,6 @@
"team_webhooks": "فريق ويبهوكس",
"create_new_webhook_to_account": "إنشاء ويب هوك جديد لحسابك",
"new_webhook": "ويب هوك جديد",
"receive_cal_meeting_data": "تلقَّ بيانات اجتماعات {{appName}} على عنوان URL محدد، وفي الوقت الفعلي، عندما تتم جدولة حدث ما أو يتم إلغاؤه.",
"receive_cal_event_meeting_data": "تلقي بيانات اجتماعات {{appName}} على عنوان URL محدد، وفي الوقت الحقيقي، عندما تتم جدولة حدث ما أو إلغاؤه.",
"responsive_fullscreen_iframe": "إطار iframe سريع الاستجابة بكامل الشاشة",
"loading": "يجري التحميل...",
"deleting": "جارٍ الحذف...",
@@ -1018,14 +1008,12 @@
"event_location": "موقع الحدث",
"reschedule_optional": "سبب إعادة الجدولة (اختياري)",
"reschedule_placeholder": "أخبر الآخرين لماذا تحتاج إلى إعادة جدولة",
"event_cancelled": "تم إلغاء هذا الحدث",
"emailed_information_about_cancelled_event": "لقد أرسلنا إليك وإلى الحاضرين الآخرين بريداً إلكترونياً لإعلامهم.",
"this_input_will_shown_booking_this_event": "سيُعرَض هذا المُدخَل عند حجز هذا الحدث",
"meeting_url_in_conformation_email": "عنوان رابط الاجتماع موجود في رسالة التأكيد الإلكترونية",
"url_start_with_https": "يجب أن يبدأ العنوان بـ http:// أو https://",
"number_provided": "سيتم توفير رقم الهاتف",
"before_event_trigger": "قبل بدء الحدث",
"event_cancelled_trigger": "متى تم إلغاء هذا الحدث",
"new_event_trigger": "متى تم حجز الحدث الجديد",
"email_host_action": "إرسال رسالة إلكترونية إلى المضيف",
"email_attendee_action": "إرسال رسالة إلكترونية إلى الحضور",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "تم حل فريقك بنجاح",
"error_creating_team": "خطأ في إنشاء فريق",
"you": "أنت",
"send_email": "إرسال بريد إلكتروني",
"member_already_invited": "تمت دعوة العضو بالفعل",
"enter_email_or_username": "أدخل بريد إلكتروني أو اسم مستخدم",
"team_name_taken": "هذا الاسم مأخوذ بالفعل",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "البريد الإلكتروني للشخص الحجز",
"kbar_search_placeholder": "اكتب أمرًا أو بحثًا...",
"invalid_credential": "لا! يبدو أن الصلاحية انتهت أو تم إلغاؤها. يرجى إعادة التثبيت مرة أخرى.",
"reschedule_reason_success_page": "سبب إعادة الجدولة",
"reschedule_reason": "سبب إعادة الجدولة",
"choose_common_schedule_team_event": "اختر جدولًا زمنيًا مشتركًا",
"choose_common_schedule_team_event_description": "قم بتمكين هذا الخيار إذا كنت ترغب في استخدام جدول زمني مشترك بين المضيفين. عند تعطيل هذا الخيار، سيتم حجز كل مضيف على أساس جدوله الافتراضي.",
"reason": "السبب",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "لن تحضر هذا الحدث",
"attendee_no_longer_attending_subject": "أحد الحضور لن يحضر {{title}} في {{date}}",
"attendee_no_longer_attending": "أحد الحضور لن يحضر الحدث الخاص بك",
"attendee_no_longer_attending_subtitle": "تم إلغاء الحدث {{name}}، وهو ما يعني توافر معقد شاغر في هذا التوقيت",
"create_event_on": "إنشاء حدث في",
"default_app_link_title": "تعيين رابط تطبيق افتراضي",
"default_app_link_description": "يسمح تعيين رابط التطبيق الافتراضي لجميع أنواع الأحداث التي تم إنشاؤها حديثًا باستخدام رابط التطبيق الذي عينته.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "تعرف أي أنواع من الأحداث لديك تتلقى أكبر عدد من النقرات والحجوزات",
"no_responses_yet": "لا توجد ردود بعد",
"this_will_be_the_placeholder": "سيكون هذا هو العنصر النائب",
"error_booking_event": "حدث خطأ عند حجز الحدث، الرجاء تحديث الصفحة والمحاولة ثانيةً",
"timeslot_missing_title": "لم يتم تحديد مساحة زمنية",
"timeslot_missing_description": "الرجاء تحديد فترة زمنية لحجز الحدث.",
"timeslot_missing_cta": "حدد الوقت",
@@ -1714,7 +1699,6 @@
"least_booked_members": "الأعضاء الأقل حجزًا",
"events_created": "تم إنشاء الأحداث",
"events_completed": "تم اكتمال الأحداث",
"events_cancelled": "تم إلغاء الأحداث",
"events_rescheduled": "تمت إعادة جدولة الأحداث",
"from_last_period": "من آخر فترة",
"from_to_date_period": "من: {{startDate}} إلى: {{endDate}}",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Máte otázky? Jsme tu, abychom vám pomohli.",
"reset_password_subject": "{{appName}}: Pokyny pro obnovení hesla",
"event_declined_subject": "Odmítnuto: {{title}} v {{date}}",
"event_cancelled_subject": "Zrušeno: {{title}} v {{date}}",
"event_request_declined": "Žádost o událost byla zamítnuta",
"event_request_declined_recurring": "Žádost o opakovanou událost byla zamítnuta",
"event_request_cancelled": "Vaše naplánovaná událost byla zrušena",
"organizer": "Organizátor",
"need_to_reschedule_or_cancel": "Přeplánovat nebo zrušit?",
"cancellation_reason": "Důvod zrušení",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Vaše schůzka byla rezervována",
"event_type_has_been_rescheduled_on_time_date": "Váš {{title}} byl přeplánován na {{date}}.",
"event_has_been_rescheduled": "Změna - Vaše událost byla přesunuta na jindy",
"request_reschedule_subtitle": "Organizátor {{organizer}} zrušil rezervaci a požádal vás, abyste si vybrali jiný čas.",
"request_reschedule_title_organizer": "Požádali jste uživatele {{attendee}} o změnu časového plánu",
"request_reschedule_subtitle_organizer": "Zrušili jste rezervaci a uživatel {{attendee}} by si s vámi měl zarezervovat nový čas.",
"rescheduled_event_type_subject": "Žádost o přesunutí schůzky: {{eventType}} s {{name}} dne {{date}}",
"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}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "Čas konce nemůže být delší než 24 hodin",
"back_to_bookings": "Zpět na rezervace",
"free_to_pick_another_event_type": "Kdykoliv si můžete vybrat jinou událost.",
"cancelled": "Zrušeno",
"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",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "Tato událost je jedním z případů opakující se události.",
"cancelling_all_recurring": "Toto jsou všechny zbývající instance opakující se události.",
"error_with_status_code_occured": "Došlo k chybě se stavovým kódem {{status}}.",
"booking_already_cancelled": "Tato rezervace již byla zrušena",
"booking_already_accepted_rejected": "Tato rezervace již byla přijata nebo zamítnuta",
"go_back_home": "Přejít na úvod",
"or_go_back_home": "Nebo přejít na úvod",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Jakmile si někdo rezervuje váš čas, zobrazí se to zde.",
"recurring_bookings": "Jakmile si někdo s vámi zarezervuje opakovanou schůzku, zobrazí se to zde.",
"past_bookings": "Vaše proběhlé rezervace se zobrazí zde.",
"cancelled_bookings": "Vaše zrušené rezervace se zobrazí zde.",
"unconfirmed_bookings": "Vaše nepotvrzené rezervace se zobrazí zde.",
"unconfirmed_bookings_tooltip": "Nepotvrzené rezervace",
"on": "dne",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Procházejte naši API dokumentaci",
"leverage_our_api": "Pro plnou kontrolu a přizpůsobení využijte naše API.",
"create_webhook": "Vytvořit webhook",
"booking_cancelled": "Rezervace zrušena",
"booking_rescheduled": "Rezervace přesunuta",
"recording_ready": "Odkaz ke stažení záznamu je připraven",
"booking_created": "Rezervace vytvořena",
@@ -379,8 +371,6 @@
"team_webhooks": "Týmové Webhooky",
"create_new_webhook_to_account": "Vytvořit nový webhook pro váš účet",
"new_webhook": "Nový webhook",
"receive_cal_meeting_data": "Přijímat v reálném čase data schůzky na zadanou adresu URL, když je událost naplánována nebo zrušena.",
"receive_cal_event_meeting_data": "Přijmout real-time data o {{appName}} události na určené URL adrese, jakmile je událost naplánována nebo zrušena.",
"responsive_fullscreen_iframe": "Responzivní iframe na celou obrazovku",
"loading": "Načítám...",
"deleting": "Odstraňování...",
@@ -1018,14 +1008,12 @@
"event_location": "Místo události",
"reschedule_optional": "Důvod pro změnu plánu (volitelné)",
"reschedule_placeholder": "Dejte ostatním vědět, proč potřebujete změnit plán",
"event_cancelled": "Tato událost je zrušena",
"emailed_information_about_cancelled_event": "Poslali jsme vám a ostatním účastníkům informační e-mail.",
"this_input_will_shown_booking_this_event": "Toto pole se zobrazí při rezervaci této události",
"meeting_url_in_conformation_email": "Adresa URL schůzky je v potvrzovacím e-mailu",
"url_start_with_https": "Adresa URL musí začínat http:// nebo https://",
"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",
"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",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Váš tým byl úspěšně rozpuštěn",
"error_creating_team": "Chyba při vytváření týmu",
"you": "Vy",
"send_email": "Odeslat e-mail",
"member_already_invited": "Člen byl už pozván",
"enter_email_or_username": "Zadejte e-mail nebo uživatelské jméno",
"team_name_taken": "Toto jméno je už obsazeno",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "E-mail osoby provádějící rezervaci",
"kbar_search_placeholder": "Zadejte příkaz nebo vyhledejte...",
"invalid_credential": "Ale ne! Zdá se, že platnost oprávnění vypršela nebo byla zrušena. Proveďte novou instalaci.",
"reschedule_reason_success_page": "Důvod změny termínu",
"reschedule_reason": "Důvod změny termínu",
"choose_common_schedule_team_event": "Vyberte společný plán",
"choose_common_schedule_team_event_description": "Tuto možnost povolte, pokud chcete používat společný plán mezi hostiteli. Při zakázání této možnosti bude každý hostitel rezervován na základě svého výchozího plánu.",
"reason": "Důvod",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Této události se již neúčastníte",
"attendee_no_longer_attending_subject": "Účastník se již neúčastní události {{title}} v den {{date}}",
"attendee_no_longer_attending": "Účastník se již neúčastní vaší události",
"attendee_no_longer_attending_subtitle": "Uživatel {{name}} zrušil svou účast. V tomto časovém intervalu se tedy uvolnilo místo",
"create_event_on": "Vytvořit událost v:",
"default_app_link_title": "Nastavte výchozí odkaz na aplikaci",
"default_app_link_description": "Nastavení výchozího odkazu na aplikaci umožní, aby všechny nově vytvořené typy událostí používaly vámi nastavený odkaz na aplikaci.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Zjistěte, které typy vašich událostí získávají nejvíce kliknutí a rezervací",
"no_responses_yet": "Zatím žádné odpovědi",
"this_will_be_the_placeholder": "Toto bude zástupný znak",
"error_booking_event": "Při rezervaci události došlo k chybě, obnovte prosím stránku a zkuste to znovu",
"timeslot_missing_title": "Nebyl vybrán žádný časový slot",
"timeslot_missing_description": "Vyberte časový slot, aby mohla být událost zaregistrována.",
"timeslot_missing_cta": "Vybrat časový slot",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Nejméně rezervovaných členů",
"events_created": "Události vytvořeny",
"events_completed": "Události dokončeny",
"events_cancelled": "Události zrušeny",
"events_rescheduled": "Události přesunuty",
"from_last_period": "z posledního období",
"from_to_date_period": "Od: {{startDate}} do: {{endDate}}",
+1 -14
View File
@@ -11,10 +11,8 @@
"have_any_questions": "Har du spørgsmål? Vi er her for at hjælpe.",
"reset_password_subject": "{{appName}}: Nulstil adgangskodeinstruktioner",
"event_declined_subject": "Afvist: {{title}} den {{date}}",
"event_cancelled_subject": "Aflyst: {{title}} den {{date}}",
"event_request_declined": "Din begivenhedsanmodning er blevet afvist",
"event_request_declined_recurring": "Din tilbagevendende begivenhedsanmodning er blevet afvist",
"event_request_cancelled": "Din planlagte begivenhed blev aflyst",
"organizer": "Arrangør",
"need_to_reschedule_or_cancel": "Behov for at omlægge eller annullere?",
"cancellation_reason": "Årsag til aflysning (valgfri)",
@@ -72,9 +70,7 @@
"your_meeting_has_been_booked": "Dit møde er blevet booket",
"event_type_has_been_rescheduled_on_time_date": "Din {{title}} er blevet flyttet til {{date}}.",
"event_has_been_rescheduled": "Opdateret - Din begivenhed er blevet flyttet",
"request_reschedule_subtitle": "{{organizer}} har annulleret bookingen og anmodet dig om at vælge et andet tidspunkt.",
"request_reschedule_title_organizer": "Du har anmodet {{attendee}} om at omlægge",
"request_reschedule_subtitle_organizer": "Du har annulleret bookingen og {{attendee}} bør vælge en ny bookingtid med dig.",
"rescheduled_event_type_subject": "Anmodning om omlægning sendt: {{eventType}} med {{name}} den {{date}}",
"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}}",
@@ -292,7 +288,6 @@
"error_end_time_next_day": "Sluttidspunktet kan ikke være længere end 24 timer",
"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": "Annullerede",
"cancellation_successful": "Annullering lykkedes",
"really_cancel_booking": "Vil du virkelig annullere din booking?",
"cannot_cancel_booking": "Du kan ikke annullere denne booking",
@@ -301,7 +296,6 @@
"cancelling_event_recurring": "Begivenheden er en forekomst af en tilbagevendende begivenhed.",
"cancelling_all_recurring": "Disse er alle resterende forekomster i den tilbagevendende begivenhed.",
"error_with_status_code_occured": "Der opstod en fejl med statuskoden {{status}}.",
"booking_already_cancelled": "Denne booking er allerede aflyst",
"booking_already_accepted_rejected": "Denne booking er allerede accepteret eller afvist",
"go_back_home": "Gå tilbage til hjem",
"or_go_back_home": "Eller gå tilbage til hjem",
@@ -315,7 +309,6 @@
"upcoming_bookings": "Så snart nogen booker en tid med dig, vil det dukke op her.",
"recurring_bookings": "Så snart nogen booker et tilbagevendende møde med dig, vil det dukke op her.",
"past_bookings": "Dine tidligere bookinger vil blive vist her.",
"cancelled_bookings": "Dine annullerede bookinger vil blive vist her.",
"unconfirmed_bookings": "Dine ubekræftede bookinger vil dukke op her.",
"unconfirmed_bookings_tooltip": "Ubekræftede bookinger",
"on": "den",
@@ -355,7 +348,6 @@
"browse_api_documentation": "Gennemse vores API-dokumentation",
"leverage_our_api": "Udnyt vores API til fuld kontrol og tilpasning.",
"create_webhook": "Opret Webhook",
"booking_cancelled": "Booking Aflyst",
"booking_rescheduled": "Booking Omlagt",
"booking_created": "Booking Oprettet",
"meeting_ended": "Møde Afsluttet",
@@ -367,8 +359,6 @@
"team_webhooks": "Team Webhooks",
"create_new_webhook_to_account": "Opret en ny webhook til din konto",
"new_webhook": "Ny Webhook",
"receive_cal_meeting_data": "Modtag {{appName}} mødedata på en specificeret URL, i realtid, når en begivenhed bliver planlagt eller aflyst.",
"receive_cal_event_meeting_data": "Modtag {{appName}} mødedata på en specificeret URL, i realtid, når denne begivenhed bliver planlagt eller aflyst.",
"responsive_fullscreen_iframe": "Responsiv fuldskærms-iframe",
"loading": "Indlæser...",
"deleting": "Sletter...",
@@ -976,14 +966,12 @@
"event_location": "Begivenhedens placering",
"reschedule_optional": "Årsag til omlægning (valgfri)",
"reschedule_placeholder": "Lad andre vide, hvorfor du har brug for at omlægge",
"event_cancelled": "Denne begivenhed er aflyst",
"emailed_information_about_cancelled_event": "Vi har sendt en e-mail til dig og de andre deltagere for at give dem besked.",
"this_input_will_shown_booking_this_event": "Dette input vil blive vist ved booking af denne begivenhed",
"meeting_url_in_conformation_email": "Møde-url er i bekræftelses-mailen",
"url_start_with_https": "URL'en skal starte med http:// eller https://",
"number_provided": "Telefonnummer vil blive angivet",
"before_event_trigger": "før begivenheden starter",
"event_cancelled_trigger": "når begivenheden er aflyst",
"new_event_trigger": "når ny begivenhed er booket",
"email_host_action": "send e-mail til vært",
"sms_number_action": "send SMS til et specifikt nummer",
@@ -1349,7 +1337,6 @@
"your_team_disbanded_successfully": "Dit team er blevet opløst",
"error_creating_team": "Fejl ved oprettelse af team",
"you": "Dig",
"send_email": "Send e-mail",
"member_already_invited": "Medlemmet er allerede blevet inviteret",
"enter_email_or_username": "Indtast e-mail eller brugernavn",
"team_name_taken": "Dette navn er allerede i brug",
@@ -1362,7 +1349,7 @@
"attendee_email_info": "Personen der booker's e-mail",
"kbar_search_placeholder": "Indtast en kommando eller søgning...",
"invalid_credential": "Åh nej! Det ser ud til at tilladelsen er udløbet eller blevet tilbagekaldt. Geninstaller venligst igen.",
"reschedule_reason_success_page": "Årsag til omlægning",
"reschedule_reason": "Årsag til omlægning",
"choose_common_schedule_team_event": "Vælg en fælles tidsplan",
"choose_common_schedule_team_event_description": "Aktivér dette hvis du ønsker at bruge en fælles tidsplan mellem værter. Når deaktiveret, vil hver vært blive booket baseret på deres standardtidsplan.",
"reason": "Årsag",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Haben Sie Fragen? Wir sind hier um Ihnen zu helfen.",
"reset_password_subject": "{{appName}}: Anleitung zum Zurücksetzen des Passworts",
"event_declined_subject": "Abgelehnt: {{title}} am {{date}}",
"event_cancelled_subject": "Storniert: {{title}} um {{date}}",
"event_request_declined": "Ihre Event-Anfrage wurde abgelehnt",
"event_request_declined_recurring": "Ihre wiederkehrende Terminanfrage wurde abgelehnt",
"event_request_cancelled": "Ihr geplanter Termin wurde abgesagt",
"organizer": "Organisator",
"need_to_reschedule_or_cancel": "Möchten Sie einen neuen Termin finden oder absagen?",
"cancellation_reason": "Grund für Ihre Absage (optional)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Dein Termin wurde gebucht",
"event_type_has_been_rescheduled_on_time_date": "Ihr {{title}} wurde auf den {{date}} verschoben.",
"event_has_been_rescheduled": "Ihr Termin wurde verschoben.",
"request_reschedule_subtitle": "{{organizer}} hat die Buchung storniert und Sie gebeten, eine andere Zeit auszuwählen.",
"request_reschedule_title_organizer": "Sie haben {{attendee}} zur Neuplanung aufgefordert",
"request_reschedule_subtitle_organizer": "Sie haben die Buchung storniert und {{attendee}} muss eine neue Buchungszeit mit Ihnen vereinbaren.",
"rescheduled_event_type_subject": "Anfrage für Neuplanung gesendet: {{eventType}} mit {{name}} am {{date}}",
"requested_to_reschedule_subject_attendee": "Aktion erforderlich - Neuplanung: Bitte buchen Sie eine neue Zeit für „{{eventType}}“ mit {{name}}",
"hi_user_name": "Hallo, {{name}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "Die Endzeit darf nicht größer als 24 Stunden sein",
"back_to_bookings": "Zurück zu den Buchungen",
"free_to_pick_another_event_type": "Sie können jederzeit einen anderen Termin wählen.",
"cancelled": "Abgesagte",
"cancellation_successful": "Stornierung erfolgreich",
"really_cancel_booking": "Möchten Sie wirklich stornieren?",
"cannot_cancel_booking": "Sie können diese Buchung nicht stornieren",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "Der Termin ist eine Instanz eines wiederkehrenden Termins.",
"cancelling_all_recurring": "Dies sind alle verbleibende Instanzen im wiederkehrenden Termin.",
"error_with_status_code_occured": "Ein Fehler mit dem Statuscode {{status}} ist aufgetreten.",
"booking_already_cancelled": "Dieser Termin wurde bereits storniert",
"booking_already_accepted_rejected": "Diese Buchung wurde bereits angenommen oder abgelehnt",
"go_back_home": "Zurück zum Anfang",
"or_go_back_home": "Oder navigieren Sie zurück",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Sobald jemand eine Zeit bei Ihnen bucht können Sie das hier sehen.",
"recurring_bookings": "Sobald jemand einen wiederkehrenden Termin mit Ihnen bucht wird er hier erscheinen.",
"past_bookings": "Ihre früheren Buchungen werden hier angezeigt.",
"cancelled_bookings": "Ihre stornierten Buchungen werden hier angezeigt.",
"unconfirmed_bookings": "Ihre unbestätigten Buchungen werden hier angezeigt.",
"unconfirmed_bookings_tooltip": "Unbestätigte Buchungen",
"on": "auf",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Durchsuchen Sie unsere API Dokumentation",
"leverage_our_api": "Nutzen Sie unsere API für die volle Kontrolle und Anpassbarkeit.",
"create_webhook": "Webhook erstellen",
"booking_cancelled": "Termin abgesagt",
"booking_rescheduled": "Termin verlegt",
"recording_ready": "Download-Link der Aufnahme bereit",
"booking_created": "Termin erstellt",
@@ -379,8 +371,6 @@
"team_webhooks": "Team-Webhooks",
"create_new_webhook_to_account": "Erstellen Sie einen neuen Webhook in Ihrem Account",
"new_webhook": "Neuer Webhook",
"receive_cal_meeting_data": "Erhalte {{appName}} Termindaten unter einer bestimmten URL in Echtzeit, wenn ein Termin geplant oder abgesagt wird.",
"receive_cal_event_meeting_data": "Erhalte {{appName}} Termindaten unter einer bestimmten URL in Echtzeit, wenn dieser Termin geplant oder abgesagt wird.",
"responsive_fullscreen_iframe": "Responsives Vollbild-iFrame",
"loading": "Wird geladen...",
"deleting": "Lösche...",
@@ -1018,14 +1008,12 @@
"event_location": "Ort des Ereignisses",
"reschedule_optional": "Grund für die Verschiebung (optional)",
"reschedule_placeholder": "Lassen Sie andere wissen, warum Sie den Termin verschieben müssen",
"event_cancelled": "Dieser Termin ist abgesagt",
"emailed_information_about_cancelled_event": "Wir haben Ihnen und den anderen Teilnehmern eine E-Mail gesendet, damit alle Bescheid wissen.",
"this_input_will_shown_booking_this_event": "Diese Eingabe wird bei der Buchung dieses Termins angezeigt",
"meeting_url_in_conformation_email": "Termin-URL ist in der Bestätigungsmail",
"url_start_with_https": "URL muss mit http:// oder https:// beginnen",
"number_provided": "Telefonnummer wird angegeben",
"before_event_trigger": "vor Beginn des Termins",
"event_cancelled_trigger": "wenn das Ereignis abgesagt wird",
"new_event_trigger": "wenn ein neer Termin gebucht wird",
"email_host_action": "E-Mail an den Veranstalter senden",
"email_attendee_action": "E-Mail an Teilnehmende senden",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Ihr Team wurde erfolgreich aufgelöst",
"error_creating_team": "Fehler beim Erstellen des Teams",
"you": "Sie",
"send_email": "E-Mail senden",
"member_already_invited": "Mitglied wurde bereits eingeladen",
"enter_email_or_username": "E-Mail oder Benutzername eingeben",
"team_name_taken": "Dieser Name ist bereits vergeben",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "Die E-Mail-Adresse der buchenden Person",
"kbar_search_placeholder": "Geben Sie einen Befehl ein oder suchen Sie ...",
"invalid_credential": "Oh nein! Es sieht so aus, als ob die Berechtigung abgelaufen ist oder entzogen wurden. Bitte erneut installieren.",
"reschedule_reason_success_page": "Verlegungsgrund",
"reschedule_reason": "Verlegungsgrund",
"choose_common_schedule_team_event": "Gemeinsamen Zeitplan auswählen",
"choose_common_schedule_team_event_description": "Aktivieren Sie dies, wenn Sie einen gemeinsamen Zeitplan zwischen Hosts verwenden möchten. Wenn deaktiviert, ist jeder Host basierend auf seinen Standardplan buchbar.",
"reason": "Grund",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Sie nehmen an diesem Termin nicht mehr teil",
"attendee_no_longer_attending_subject": "Ein Teilnehmer nimmt nicht mehr an {{title}} am {{date}} teil",
"attendee_no_longer_attending": "Ein Teilnehmer nimmt nicht mehr an Ihrem Termin teil",
"attendee_no_longer_attending_subtitle": "{{name}} hat abgesagt. Das bedeutet, dass ein Platz für dieses Zeitfenster geöffnet wurde",
"create_event_on": "Erstelle Termin am",
"default_app_link_title": "Standard-App-Link festlegen",
"default_app_link_description": "Mit dem Festlegen eines Standard-App-Links können alle neu erstellten Ereignistypen den App-Link verwenden, den Sie gesetzt haben.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Sehen Sie, welche Ihrer Ereignistypen die meisten Klicks und Buchungen erhalten",
"no_responses_yet": "Noch keine Antworten",
"this_will_be_the_placeholder": "Dies wird der Platzhalter sein",
"error_booking_event": "Bei der Buchung dieses Termins ist ein Fehler aufgetreten, bitte aktualisieren Sie die Seite und versuchen Sie es erneut",
"timeslot_missing_title": "Kein Zeitfenster ausgewählt",
"timeslot_missing_description": "Bitte wählen Sie einen Zeitraum aus, um den Termin zu buchen.",
"timeslot_missing_cta": "Zeitfenster auswählen",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Am wenigsten gebuchte Mitglieder",
"events_created": "Ereignisse erstellt",
"events_completed": "Ereignisse abgeschlossen",
"events_cancelled": "Ereignisse abgesagt",
"events_rescheduled": "Ereignisse neu geplant",
"from_last_period": "seit dem letzten Zeitraum",
"from_to_date_period": "Von: {{startDate}} Bis: {{endDate}}",
@@ -8,7 +8,6 @@
"have_any_questions": "Έχετε ερωτήσεις? Είμαστε εδώ για να βοηθήσουμε.",
"reset_password_subject": "{{appName}}: Οδηγίες επαναφοράς κωδικού πρόσβασης",
"event_declined_subject": "Απορρίφθηκε: {{title}} στις {{date}}",
"event_cancelled_subject": "Ακύρωση: {{title}} στις {{date}}",
"need_to_reschedule_or_cancel": "Χρειάζεται να επαναπρογραμματίσετε ή να ακυρώσετε;",
"cancellation_reason": "Λόγος ακύρωσης (προαιρετικό)",
"rejection_reason": "Λόγος απόρριψης",
@@ -152,7 +151,6 @@
"friday_time_error": "Μη έγκυρη ώρα την Παρασκευή",
"saturday_time_error": "Μη έγκυρη ώρα το Σάββατο",
"error_with_status_code_occured": "Παρουσιάστηκε ένα σφάλμα με κωδικό κατάστασης {{status}}.",
"booking_already_cancelled": "Αυτή η κράτηση είχε ήδη ακυρωθεί",
"booking_already_accepted_rejected": "Αυτή η κράτηση έγινε ήδη αποδεκτή ή απορρίφθηκε",
"go_back_home": "Επιστροφή στην αρχική σελίδα",
"or_go_back_home": "Ή επιστροφή στην αρχική σελίδα",
+31 -25
View File
@@ -14,17 +14,17 @@
"verify_email_subject": "{{appName}}: Verify your account",
"check_your_email": "Check your email",
"verify_email_page_body": "We've sent an email to {{email}}. It is important to verify your email address to guarantee the best email and calendar deliverability from {{appName}}.",
"verify_email_banner_body": "Please verify your email adress to guarantee the best email and calendar deliverability from {{appName}}.",
"verify_email_banner_body": "Verify your email address to guarantee the best email and calendar deliverability",
"verify_email_email_header": "Verify your email address",
"verify_email_email_button": "Verify email",
"verify_email_email_body": "Please verify your email address by clicking the button below.",
"verify_email_email_link_text": "Here's the link in case you don't like clicking buttons:",
"email_sent": "Email sent successfully",
"event_declined_subject": "Declined: {{title}} at {{date}}",
"event_cancelled_subject": "Cancelled: {{title}} at {{date}}",
"event_cancelled_subject": "Canceled: {{title}} at {{date}}",
"event_request_declined": "Your event request has been declined",
"event_request_declined_recurring": "Your recurring event request has been declined",
"event_request_cancelled": "Your scheduled event was cancelled",
"event_request_cancelled": "Your scheduled event was canceled",
"organizer": "Organizer",
"need_to_reschedule_or_cancel": "Need to reschedule or cancel?",
"cancellation_reason": "Reason for cancellation (optional)",
@@ -86,9 +86,9 @@
"your_meeting_has_been_booked": "Your meeting has been booked",
"event_type_has_been_rescheduled_on_time_date": "Your {{title}} has been rescheduled to {{date}}.",
"event_has_been_rescheduled": "Updated - Your event has been rescheduled",
"request_reschedule_subtitle": "{{organizer}} has cancelled the booking and requested you to pick another time.",
"request_reschedule_subtitle": "{{organizer}} has canceled the booking and requested you to pick another time.",
"request_reschedule_title_organizer": "You have requested {{attendee}} to reschedule",
"request_reschedule_subtitle_organizer": "You have cancelled the booking and {{attendee}} should pick a new booking time with you.",
"request_reschedule_subtitle_organizer": "You have canceled the booking and {{attendee}} should pick a new booking time with you.",
"rescheduled_event_type_subject": "Request for reschedule sent: {{eventType}} with {{name}} at {{date}}",
"requested_to_reschedule_subject_attendee": "Action Required Reschedule: Please book a new time for {{eventType}} with {{name}}",
"hi_user_name": "Hi {{name}}",
@@ -330,7 +330,7 @@
"error_end_time_next_day": "End time cannot be greater than 24 hours",
"back_to_bookings": "Back to bookings",
"free_to_pick_another_event_type": "Feel free to pick another event anytime.",
"cancelled": "Cancelled",
"cancelled": "Canceled",
"cancellation_successful": "Cancellation successful",
"really_cancel_booking": "Really cancel your booking?",
"cannot_cancel_booking": "You cannot cancel this booking",
@@ -339,7 +339,7 @@
"cancelling_event_recurring": "The event is one instance of a recurring event.",
"cancelling_all_recurring": "These are all remaining instances in the recurring event.",
"error_with_status_code_occured": "An error with status code {{status}} occurred.",
"booking_already_cancelled": "This booking was already cancelled",
"booking_already_cancelled": "This booking was already canceled",
"booking_already_accepted_rejected": "This booking was already accepted or rejected",
"go_back_home": "Go back home",
"or_go_back_home": "Or go back home",
@@ -349,11 +349,12 @@
"no_status_bookings_yet_description": "You have no {{status}} bookings. {{description}}",
"event_between_users": "{{eventName}} between {{host}} and {{attendeeName}}",
"bookings": "Bookings",
"booking_not_found":"Booking not found",
"bookings_description": "See upcoming and past events booked through your event type links.",
"upcoming_bookings": "As soon as someone books a time with you it will show up here.",
"recurring_bookings": "As soon as someone books a recurring meeting with you it will show up here.",
"past_bookings": "Your past bookings will show up here.",
"cancelled_bookings": "Your cancelled bookings will show up here.",
"cancelled_bookings": "Your canceled bookings will show up here.",
"unconfirmed_bookings": "Your unconfirmed bookings will show up here.",
"unconfirmed_bookings_tooltip": "Unconfirmed bookings",
"on": "on",
@@ -394,7 +395,7 @@
"browse_api_documentation": "Browse our API documentation",
"leverage_our_api": "Leverage our API for full control and customizability.",
"create_webhook": "Create Webhook",
"booking_cancelled": "Booking Cancelled",
"booking_cancelled": "Booking Canceled",
"booking_rescheduled": "Booking Rescheduled",
"recording_ready": "Recording Download Link Ready",
"booking_created": "Booking Created",
@@ -409,8 +410,8 @@
"team_webhooks": "Team Webhooks",
"create_new_webhook_to_account": "Create a new webhook to your account",
"new_webhook": "New Webhook",
"receive_cal_meeting_data": "Receive {{appName}} meeting data at a specified URL, in real-time, when an event is scheduled or cancelled.",
"receive_cal_event_meeting_data": "Receive {{appName}} meeting data at a specified URL, in real-time, when this event is scheduled or cancelled.",
"receive_cal_meeting_data": "Receive {{appName}} meeting data at a specified URL, in real-time, when an event is scheduled or canceled.",
"receive_cal_event_meeting_data": "Receive {{appName}} meeting data at a specified URL, in real-time, when this event is scheduled or canceled.",
"responsive_fullscreen_iframe": "Responsive full screen iframe",
"loading": "Loading...",
"deleting": "Deleting...",
@@ -546,7 +547,7 @@
"team_description": "A few sentences about your team. This will appear on your team's url page.",
"org_description": "A few sentances about your organization. This will appear on your organization's url page.",
"members": "Members",
"organization_members":"Organisation members",
"organization_members":"Organization members",
"member": "Member",
"number_member_one": "{{count}} member",
"number_member_other": "{{count}} members",
@@ -1054,14 +1055,14 @@
"event_location": "Event's location",
"reschedule_optional": "Reason for rescheduling (optional)",
"reschedule_placeholder": "Let others know why you need to reschedule",
"event_cancelled": "This event is cancelled",
"event_cancelled": "This event is canceled",
"emailed_information_about_cancelled_event": "We emailed you and the other attendees to let them know.",
"this_input_will_shown_booking_this_event": "This input will be shown when booking this event",
"meeting_url_in_conformation_email": "Meeting url is in the confirmation email",
"url_start_with_https": "URL needs to start with http:// or https://",
"number_provided": "Phone number will be provided",
"before_event_trigger": "before event starts",
"event_cancelled_trigger": "when event is cancelled",
"event_cancelled_trigger": "when event is canceled",
"new_event_trigger": "when new event is booked",
"email_host_action": "send email to host",
"email_attendee_action": "send email to attendees",
@@ -1457,7 +1458,7 @@
"your_org_disbanded_successfully": "Your organization has been disbanded successfully",
"error_creating_team": "Error creating team",
"you": "You",
"send_email": "Send email",
"resend_email": "Resend email",
"member_already_invited": "Member has already been invited",
"enter_email_or_username": "Enter an email or username",
"team_name_taken": "This name is already taken",
@@ -1470,7 +1471,7 @@
"attendee_email_info": "The person booking's email",
"kbar_search_placeholder": "Type a command or search...",
"invalid_credential": "Oh no! Looks like permission expired or was revoked. Please reinstall again.",
"reschedule_reason_success_page": "Reschedule reason",
"reschedule_reason": "Reschedule reason",
"choose_common_schedule_team_event": "Choose a common schedule",
"choose_common_schedule_team_event_description": "Enable this if you want to use a common schedule between hosts. When disabled, each host will be booked based on their default schedule.",
"reason": "Reason",
@@ -1642,7 +1643,7 @@
"scheduler": "{Scheduler}",
"no_workflows": "No workflows",
"change_filter": "Change filter to see your personal and team workflows.",
"change_filter_common":"Change filter to see the results.",
"change_filter_common": "Change filter to see the results.",
"no_results_for_filter": "No results for the filter",
"recommended_next_steps": "Recommended next steps",
"create_a_managed_event": "Create a managed event type",
@@ -1654,7 +1655,7 @@
"no_longer_attending": "You are no longer attending this event",
"attendee_no_longer_attending_subject": "An attendee is no longer attending {{title}} at {{date}}",
"attendee_no_longer_attending": "An attendee is no longer attending your event",
"attendee_no_longer_attending_subtitle": "{{name}} has cancelled. This means a seat has opened up for this time slot",
"attendee_no_longer_attending_subtitle": "{{name}} has canceled. This means a seat has opened up for this time slot",
"create_event_on": "Create event on",
"create_routing_form_on": "Create routing form on",
"default_app_link_title": "Set a default app link",
@@ -1709,7 +1710,7 @@
"no_responses_yet": "No responses yet",
"no_routes_defined": "No routes defined",
"this_will_be_the_placeholder": "This will be the placeholder",
"error_booking_event": "An error occured when booking the event, please refresh the page and try again",
"error_booking_event": "An error occurred when booking the event, please refresh the page and try again",
"timeslot_missing_title": "No timeslot selected",
"timeslot_missing_description": "Please select a timeslot to book the event.",
"timeslot_missing_cta": "Select timeslot",
@@ -1725,6 +1726,7 @@
"app_is_connected": "{{dependencyName}} is connected",
"requires_app": "Requires {{dependencyName}}",
"verification_code": "Verification code",
"invalid_verification_link": "Invalid verification link",
"can_you_try_again": "Can you try again with a different time?",
"verify": "Verify",
"timezone_info": "The timezone of the person receiving",
@@ -1771,7 +1773,7 @@
"least_booked_members": "Least Booked Members",
"events_created": "Events Created",
"events_completed": "Events Completed",
"events_cancelled": "Events Cancelled",
"events_cancelled": "Events Canceled",
"events_rescheduled": "Events Rescheduled",
"from_last_period": "from last period",
"from_to_date_period": "From: {{startDate}} To: {{endDate}}",
@@ -1832,8 +1834,8 @@
"open_dialog_with_element_click": "Open your Cal dialog when someone clicks an element.",
"need_help_embedding": "Need help? See our guides for embedding Cal on Wix, Squarespace, or WordPress, check our common questions, or explore advanced embed options.",
"book_my_cal": "Book my Cal",
"invite_as":"Invite as",
"form_updated_successfully":"Form updated successfully.",
"invite_as": "Invite as",
"form_updated_successfully": "Form updated successfully.",
"disable_attendees_confirmation_emails": "Disable default confirmation emails for attendees",
"disable_attendees_confirmation_emails_description": "At least one workflow is active on this event type that sends an email to the attendees when the event is booked.",
"disable_host_confirmation_emails": "Disable default confirmation emails for host",
@@ -1856,13 +1858,13 @@
"admin_username": "Administrator's username",
"organization_name": "Organization name",
"organization_url": "Organization URL",
"organization_verify_header" :"Verify your organization email",
"organization_verify_email_body":"Please use the code below to verify your email address to continue setting up your organization.",
"organization_verify_header": "Verify your organization email",
"organization_verify_email_body": "Please use the code below to verify your email address to continue setting up your organization.",
"additional_url_parameters": "Additional URL parameters",
"about_your_organization": "About your organization",
"about_your_organization_description": "Organizations are shared environments where you can create multiple teams with shared members, event types, apps, workflows and more.",
"create_your_teams": "Create your teams",
"create_your_teams_description": "Start scheduling together by adding your team members to your organisation",
"create_your_teams_description": "Start scheduling together by adding your team members to your organization",
"invite_organization_admins": "Invite your organization admins",
"invite_organization_admins_description": "These admins will have access to all teams in your organization. You can add team admins and members later.",
"set_a_password": "Set a password",
@@ -1887,5 +1889,9 @@
"my_profile": "My Profile",
"my_settings": "My Settings",
"sender_id_info": "Name or number shown as the sender of an SMS (some countries do not allow alphanumeric sender IDs)",
"no_organization_slug": "There was an error creating teams for this organization. Missing URL slug.",
"org_name": "Organization name",
"org_url": "Organization URL",
"copy_link_org": "Copy link to organization",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "¿Tienes preguntas? Estamos aquí para ayudar.",
"reset_password_subject": "{{appName}}: Instrucciones para restablecer la contraseña",
"event_declined_subject": "Rechazado: {{title}} en {{date}}",
"event_cancelled_subject": "Cancelado: {{title}} en {{date}}",
"event_request_declined": "Su solicitud de reunión ha sido rechazada",
"event_request_declined_recurring": "Su solicitud de evento recurrente se ha rechazado",
"event_request_cancelled": "Tu evento programado fue cancelado",
"organizer": "Organizador",
"need_to_reschedule_or_cancel": "¿Necesita reprogramar o cancelar?",
"cancellation_reason": "Motivo de la cancelación (opcional)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Su reunión ha sido reservada",
"event_type_has_been_rescheduled_on_time_date": "Tu {{title}} ha sido reprogramado para el {{date}}.",
"event_has_been_rescheduled": "Tu evento ha sido reprogramado.",
"request_reschedule_subtitle": "{{organizer}} ha cancelado la reserva y le ha solicitado que elija otra hora.",
"request_reschedule_title_organizer": "Le ha solicitado a {{attendee}} que reprograme",
"request_reschedule_subtitle_organizer": "Ha cancelado la reserva y {{attendee}} deberá seleccionar una nueva hora de reserva con usted.",
"rescheduled_event_type_subject": "Solicitud de reprogramación enviada: {{eventType}} con {{name}} el {{date}}",
"requested_to_reschedule_subject_attendee": "Reprogramar acción requerida: reserva una nueva hora para {{eventType}} con {{name}}",
"hi_user_name": "Hola {{name}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "La hora final no puede ser mayor de 24 horas",
"back_to_bookings": "Volver a Reservas",
"free_to_pick_another_event_type": "No dude en elegir otro evento en cualquier momento.",
"cancelled": "Cancelado",
"cancellation_successful": "Cancelación Realizada",
"really_cancel_booking": "¿Realmente deseas cancelar tu reserva?",
"cannot_cancel_booking": "No puedes cancelar esta reserva",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "El evento es un caso de un evento recurrente.",
"cancelling_all_recurring": "Todas estas son instancias restantes en el evento recurrente.",
"error_with_status_code_occured": "Se produjo un error con el código de estado {{status}}.",
"booking_already_cancelled": "Esta reserva ya fue cancelada",
"booking_already_accepted_rejected": "Esta reserva ya se aceptó o rechazó",
"go_back_home": "Volver a Inicio",
"or_go_back_home": "O Volver al Inicio",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Tan pronto como alguien reserve una hora contigo, aparecerá aquí.",
"recurring_bookings": "Tan pronto como alguien reserve una reunión recurrente con usted, aparecerá aquí.",
"past_bookings": "Sus reservas pasadas aparecerán aquí.",
"cancelled_bookings": "Las reservas canceladas aparecerán aquí.",
"unconfirmed_bookings": "Las reservas sin confirmar aparecerán aquí.",
"unconfirmed_bookings_tooltip": "Reservas sin confirmar",
"on": "en",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Consulte la documentación de nuestra API",
"leverage_our_api": "Aproveche nuestra API para un control total y personalización.",
"create_webhook": "Crear Webhook",
"booking_cancelled": "Reserva Cancelada",
"booking_rescheduled": "Reserva habilitada",
"recording_ready": "Enlace de descarga de grabación listo",
"booking_created": "Reserva Creada",
@@ -379,8 +371,6 @@
"team_webhooks": "Webhooks del equipo",
"create_new_webhook_to_account": "Crear un nuevo webhook en tu cuenta",
"new_webhook": "Nuevo Webhook",
"receive_cal_meeting_data": "Reciba datos de reuniones de {{appName}} en una URL específica, en tiempo real, cuando se programe o cancele un evento.",
"receive_cal_event_meeting_data": "Reciba los datos de la reunión de {{appName}} en una URL especificada, en tiempo real, cuando este evento se programe o se cancele.",
"responsive_fullscreen_iframe": "Iframe receptivo a pantalla completa",
"loading": "Cargando...",
"deleting": "Eliminando...",
@@ -1018,14 +1008,12 @@
"event_location": "Ubicación del evento",
"reschedule_optional": "Razón para reagendar (opcional)",
"reschedule_placeholder": "Informa a los demás la razón por la que necesitas reagendar",
"event_cancelled": "Este evento se canceló",
"emailed_information_about_cancelled_event": "Le enviamos un correo electrónico a usted y a los demás asistentes para informarles.",
"this_input_will_shown_booking_this_event": "Esta entrada se mostrará al reservar este evento.",
"meeting_url_in_conformation_email": "La URL de la reunión está en el correo de confirmación",
"url_start_with_https": "La URL debe empezar por http:// o https://",
"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",
"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",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Su equipo se ha disuelto con éxito",
"error_creating_team": "Error al crear el equipo",
"you": "Usted",
"send_email": "Enviar correo electrónico",
"member_already_invited": "El miembro ya se ha invitado",
"enter_email_or_username": "Introduzca un correo electrónico o nombre de usuario",
"team_name_taken": "Este nombre ya está en uso",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "El correo electrónico de la persona que reserva",
"kbar_search_placeholder": "Escriba un comando o búsqueda...",
"invalid_credential": "¡Oh no! Parece que el permiso ha caducado o se ha revocado. Vuelva a instalarlo.",
"reschedule_reason_success_page": "Razón de la reprogramación",
"reschedule_reason": "Razón de la reprogramación",
"choose_common_schedule_team_event": "Elige un horario común para todos",
"choose_common_schedule_team_event_description": "Habilite esto si desea utilizar un cronograma común entre anfitriones. Cuando esté desactivado, cada anfitrión se reservará en relación a su horario predeterminado.",
"reason": "Motivo",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Ya no asistirá a este evento",
"attendee_no_longer_attending_subject": "Un asistente ya no asistirá a {{title}} a las {{date}}",
"attendee_no_longer_attending": "Un asistente ya no asistirá a su evento",
"attendee_no_longer_attending_subtitle": "{{name}} ha cancelado. Esto significa que está disponible una plaza para esta franja horaria",
"create_event_on": "Crear evento en",
"default_app_link_title": "Establecer un enlace de aplicación predeterminado",
"default_app_link_description": "Establecer un enlace de aplicación predeterminado permite que todos los tipos de eventos recién creados utilicen el enlace de aplicación que establezca.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Consulte cuál de sus tipos de eventos están recibiendo más clics y reservas",
"no_responses_yet": "Aún no hay respuestas",
"this_will_be_the_placeholder": "Este será el marcador de posición",
"error_booking_event": "Ocurrió un error al reservar el evento, actualice la página e intente nuevamente",
"timeslot_missing_title": "No hay intervalo de tiempo seleccionado",
"timeslot_missing_description": "Seleccione un intervalo de tiempo para reservar el evento.",
"timeslot_missing_cta": "Seleccionar intervalo de tiempo",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Miembros con menos reservas",
"events_created": "Eventos creados",
"events_completed": "Eventos completados",
"events_cancelled": "Eventos cancelados",
"events_rescheduled": "Eventos reprogramados",
"from_last_period": "desde el último período",
"from_to_date_period": "Desde: {{startDate}} Hasta: {{endDate}}",
@@ -14,10 +14,8 @@
"verify_email_email_header": "Egiaztatu zure email helbidea",
"verify_email_email_button": "Egiaztatu emaila",
"event_declined_subject": "Baztertua: {{title}} {{date}}(e)an",
"event_cancelled_subject": "Bertan behera: {{title}} {{date}}(e)an",
"event_request_declined": "Zure gertaera-eskaera baztertua izan da",
"event_request_declined_recurring": "Zure gertaera errepikari-eskaera baztertua izan da",
"event_request_cancelled": "Zure programatutako gertaera baztertua izan da",
"organizer": "Antolatzailea",
"need_to_reschedule_or_cancel": "Programazioa aldatu edo bertan behera utzi behar duzu?",
"cancellation_reason": "Bertan behera uztearen arrazoia (aukerakoa)",
@@ -62,14 +60,11 @@
"back_to_bookings": "Itzuli erreserbatara",
"really_cancel_booking": "Benetan bertan behera utzi nahi duzu zure erreserba?",
"cannot_cancel_booking": "Ezin duzu erreserba hau bertan behera utzi",
"booking_already_cancelled": "Erreserba hau bertan behera utzi da dagoeneko",
"booking_already_accepted_rejected": "Erreserba hau onartu edo errefusatu da dagoeneko",
"bookings": "Erreserbak",
"past_bookings": "Zure iraganeko erreserbak agertuko dira hemen.",
"cancelled_bookings": "Zure bertan behera utzitako erreserbak agertuko dira hemen.",
"unconfirmed_bookings": "Zure baieztatu gabeko erreserbak agertuko dira hemen.",
"unconfirmed_bookings_tooltip": "Baieztatu gabeko erreserbak",
"booking_cancelled": "Erreserba bertan behera",
"booking_rescheduled": "Erreserbaren programazioa aldatuta",
"booking_created": "Erreserba sortuta",
"edit_booking": "Aldatu erreserba",
+22 -15
View File
@@ -14,7 +14,7 @@
"verify_email_subject": "{{appName}} : Vérifiez votre compte",
"check_your_email": "Vérifiez votre e-mail",
"verify_email_page_body": "Nous avons envoyé un e-mail à {{email}}. Il est important de vérifier votre adresse e-mail pour garantir la meilleure délivrabilité des e-mails et des calendriers de {{appName}}.",
"verify_email_banner_body": "Veuillez vérifier votre adresse e-mail pour garantir la meilleure délivrabilité des e-mails et des calendriers de {{appName}}.",
"verify_email_banner_body": "Vérifiez votre adresse e-mail pour garantir la meilleure délivrabilité des e-mails et des calendriers",
"verify_email_email_header": "Vérifiez votre adresse e-mail",
"verify_email_email_button": "Vérifier l'adresse e-mail",
"verify_email_email_body": "Veuillez vérifier votre adresse e-mail en cliquant sur le bouton ci-dessous.",
@@ -241,7 +241,8 @@
"done": "Terminé",
"all_done": "Terminé !",
"all_apps": "Toutes",
"all": "Toutes",
"all": "Tous",
"yours": "Les vôtres",
"available_apps": "Applications disponibles",
"check_email_reset_password": "Vérifiez vos e-mails. Nous vous avons envoyé un lien pour réinitialiser votre mot de passe.",
"finish": "Terminer",
@@ -312,7 +313,7 @@
"bookerlayout_user_settings_description": "Vous pouvez en sélectionner plusieurs, les utilisateurs peuvent basculer entre les vues. Cela peut être remplacé individuellement pour événement.",
"bookerlayout_month_view": "Mensuelle",
"bookerlayout_week_view": "Hebdomadaire",
"bookerlayout_column_view": "Colonne",
"bookerlayout_column_view": "Colonnes",
"bookerlayout_error_min_one_enabled": "Au moins une mise en page doit être activée.",
"bookerlayout_error_default_not_enabled": "La mise en page sélectionnée comme vue par défaut ne fait pas partie des mises en page activées.",
"bookerlayout_error_unknown_layout": "La mise en page que vous avez sélectionnée n'est pas une mise en page valide.",
@@ -348,6 +349,7 @@
"no_status_bookings_yet_description": "Vous n'avez pas de réservations {{status}}. {{description}}",
"event_between_users": "{{eventName}} entre {{host}} et {{attendeeName}}",
"bookings": "Réservations",
"booking_not_found": "Réservation introuvable",
"bookings_description": "Consultez les événements à venir et passés réservés via vos liens de type d'événement.",
"upcoming_bookings": "Dès que quelqu'un réservera un rendez-vous avec vous, il apparaîtra ici.",
"recurring_bookings": "Dès que quelqu'un réserve un rendez-vous récurrent avec vous, il apparaît ici.",
@@ -395,7 +397,7 @@
"create_webhook": "Créer un webhook",
"booking_cancelled": "Réservation annulée",
"booking_rescheduled": "Réservation replanifiée",
"recording_ready": "Lien de téléchargement d'enregistrement prêt",
"recording_ready": "Lien de téléchargement de l'enregistrement prêt",
"booking_created": "Réservation créée",
"booking_rejected": "Réservation rejetée",
"booking_requested": "Réservation demandée",
@@ -468,7 +470,7 @@
"password_hint_caplow": "Mélange de lettres majuscules et minuscules",
"password_hint_min": "7 caractères minimum",
"password_hint_admin_min": "Minimum 15 caractères",
"password_hint_num": "Contient au moins 1 chiffre",
"password_hint_num": "Doit contenir au moins 1 chiffre",
"max_limit_allowed_hint": "Doit contenir {{limit}} caractères ou moins",
"invalid_password_hint": "Le mot de passe doit contenir au moins {{passwordLength}} caractères, un chiffre et un mélange de lettres majuscules et minuscules.",
"incorrect_password": "Le mot de passe est incorrect.",
@@ -789,7 +791,7 @@
"slot_interval_default": "Utiliser la durée de l'événement (par défaut)",
"delete_event_type": "Supprimer le type d'événement ?",
"delete_managed_event_type": "Supprimer le type d'événement géré ?",
"delete_event_type_description": "Toute personne avec qui vous avez partagé ce lien ne pourra plus réserver en l'utilisant.",
"delete_event_type_description": "Toute personne avec qui vous avez partagé ce lien ne pourra plus réserver avec.",
"delete_managed_event_type_description": "<ul><li>Les membres affectés à ce type d'événement verront également leurs types d'événement supprimés.</li><li>Toute personne avec qui ils ont partagé leur lien ne pourra plus réserver en l'utilisant.</li></ul>",
"confirm_delete_event_type": "Oui, supprimer",
"delete_account": "Supprimer le compte",
@@ -903,7 +905,7 @@
"the_infrastructure_plan": "Le plan d'infrastructure est basé sur l'utilisation et propose des réductions adaptées aux startups.",
"prisma_studio_tip": "Créer un compte via Prisma Studio",
"prisma_studio_tip_description": "Découvrez comment configurer votre premier utilisateur",
"contact_sales": "Contacter les ventes",
"contact_sales": "Contacter le service commercial",
"error_404": "Erreur 404",
"default": "Par défaut",
"set_to_default": "Définir par défaut",
@@ -1305,7 +1307,7 @@
"for_a_maximum_of": "Pour un maximum de",
"event_one": "événement",
"event_other": "événements",
"profile_team_description": "Gérez les paramètres de votre profil d'équipe.",
"profile_team_description": "Gérez les paramètres du profil de votre équipe.",
"profile_org_description": "Gérez les paramètres de votre profil d'organisation.",
"members_team_description": "Utilisateurs présents dans le groupe.",
"organization_description": "Gérez les administrateurs et les membres de votre organisation.",
@@ -1456,7 +1458,7 @@
"your_org_disbanded_successfully": "Votre organisation a bien été dissoute",
"error_creating_team": "Erreur lors de la création de l'équipe",
"you": "Vous",
"send_email": "Envoyer un e-mail",
"resend_email": "Renvoyer l’e-mail",
"member_already_invited": "Le membre a déjà été invité",
"enter_email_or_username": "Saisissez une adresse e-mail ou un nom d'utilisateur",
"team_name_taken": "Ce nom est déjà pris",
@@ -1469,7 +1471,7 @@
"attendee_email_info": "Adresse e-mail du participant",
"kbar_search_placeholder": "Saisissez une commande ou une recherche...",
"invalid_credential": "Oh non ! On dirait que l’autorisation a expiré ou a été révoquée. Veuillez la réinstaller.",
"reschedule_reason_success_page": "Raison de la replanification",
"reschedule_reason": "Raison de la replanification",
"choose_common_schedule_team_event": "Choisissez un horaire commun",
"choose_common_schedule_team_event_description": "Activez cette option si vous souhaitez utiliser des disponibilités communes entre les hôtes. Si cette option est désactivée, chaque hôte recevra les réservations en fonction de ses disponibilités par défaut.",
"reason": "Raison",
@@ -1497,7 +1499,7 @@
"event_replaced_notice": "Un administrateur a remplacé l'un de vos types d'événements",
"email_subject_slug_replacement": "Un administrateur d'équipe a remplacé votre événement /{{slug}}",
"email_body_slug_replacement_notice": "Un administrateur de l'équipe <strong>{{teamName}}</strong> a remplacé votre type d'événement <strong>/{{slug}}</strong> par un type d'événement géré qu'il contrôle.",
"email_body_slug_replacement_info": "Votre lien continuera à fonctionner, mais certains de ses paramètres peuvent avoir changé. Vous pouvez l'examiner dans les types d'événements.",
"email_body_slug_replacement_info": "Votre lien continuera de fonctionner, mais certains de ses paramètres peuvent avoir changé. Vous pouvez l'examiner dans les types d'événements.",
"email_body_slug_replacement_suggestion": "Si vous avez des questions sur le type d'événement, veuillez contacter votre administrateur.<br /><br />Bonne planification, <br />L'équipe Cal.com",
"disable_payment_app": "L'administrateur a désactivé {{appName}} qui affecte votre type d'événement {{title}}. Les participants sont toujours en mesure de réserver ce type d'événement, mais ne seront pas invités à payer. Vous pouvez masquer le type d'événement pour l'empêcher jusqu'à ce que votre administrateur réactive votre moyen de paiement.",
"payment_disabled_still_able_to_book": "Les participants sont toujours en mesure de réserver ce type d'événement, mais ne seront pas invités à payer. Vous pouvez masquer le type d'événement pour l'empêcher jusqu'à ce que votre administrateur réactive votre mode de paiement.",
@@ -1715,7 +1717,7 @@
"switch_monthly": "Passer en vue mensuelle",
"switch_weekly": "Passer en vue hebdomadaire",
"switch_multiday": "Passer en vue journalière",
"switch_columnview": "Passer en vue colonne",
"switch_columnview": "Passer en vue colonnes",
"num_locations": "{{num}} options de lieu",
"select_on_next_step": "Sélectionner à l'étape suivante",
"this_meeting_has_not_started_yet": "Ce rendez-vous n'a pas encore commencé",
@@ -1724,6 +1726,7 @@
"app_is_connected": "{{dependencyName}} est connectée",
"requires_app": "Requiert {{dependencyName}}",
"verification_code": "Code de vérification",
"invalid_verification_link": "Lien de vérification introuvable",
"can_you_try_again": "Pouvez-vous réessayer avec un autre créneau ?",
"verify": "Vérifier",
"timezone_info": "Le fuseau horaire du destinataire",
@@ -1801,8 +1804,8 @@
"acknowledge_booking_no_show_fee": "Je reconnais que si je ne participe pas à cet événement, des frais d'absence de {{amount, currency}} seront appliqués à ma carte.",
"card_details": "Détails de la carte",
"seats_and_no_show_fee_error": "Il n'est pas possible d'activer les places et de facturer des frais d'absence pour le moment",
"complete_your_booking": "Terminer votre réservation",
"complete_your_booking_subject": "Terminer votre réservation : {{title}} le {{date}}",
"complete_your_booking": "Terminez votre réservation",
"complete_your_booking_subject": "Terminez votre réservation : {{title}} le {{date}}",
"confirm_your_details": "Confirmez vos coordonnées",
"copy_invite_link": "Copier le lien d'invitation",
"edit_invite_link": "Modifier les paramètres du lien",
@@ -1820,7 +1823,7 @@
"payment_app_commission": "Exiger un paiement ({{paymentFeePercentage}} % + {{fee, currency}} de commission par transaction)",
"email_invite_team": "{{email}} a été invité",
"email_invite_team_bulk": "{{userCount}} utilisateurs ont été invités",
"error_collecting_card": "Erreur lors de la collecte de la carte",
"error_collecting_card": "Erreur lors de la récupération de la carte",
"image_size_limit_exceed": "L'image téléchargée ne doit pas dépasser 5 Mo",
"unauthorized_workflow_error_message": "{{errorCode}} : Vous n'êtes pas autorisé à activer ou désactiver ce workflow",
"inline_embed": "Intégration en ligne",
@@ -1885,5 +1888,9 @@
"my_profile": "Mon profil",
"my_settings": "Mes paramètres",
"sender_id_info": "Nom ou numéro affiché comme expéditeur d'un SMS (certains pays n'autorisent pas les ID d'expéditeur alphanumériques)",
"no_organization_slug": "Une erreur s'est produite lors de la création des équipes pour cette organisation. Le slug du lien est manquant.",
"org_name": "Nom de l'organisation",
"org_url": "Lien de l'organisation",
"copy_link_org": "Copier le lien vers l’organisation",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Ajoutez vos nouvelles chaînes ci-dessus ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
+1 -18
View File
@@ -14,16 +14,13 @@
"verify_email_subject": "{{appName}}: אמת את החשבון",
"check_your_email": "בדוק את הדוא״ל שלך",
"verify_email_page_body": "שלחנו מייל ל- {{email}}. חשוב שתאמת את כתובת הדוא״ל שלך כדי להבטיח את תעבורת הדוא״ל והיומן מ- {{appName}}.",
"verify_email_banner_body": "אנא אמת את חשבון הדוא״ל שלך כדי להבטיח את תעבורת מ- {{appName}}.",
"verify_email_email_header": "אמת את חשבון הדוא״ל שלך",
"verify_email_email_button": "אמת דוא״ל",
"verify_email_email_body": "אנא אמת את חשבון הדוא״ל שלך על ידי לחיצה על הכפתור מטה.",
"email_sent": "מייל נשלח בהצלחה",
"event_declined_subject": "נדחה: {{title}} ב- {{date}}",
"event_cancelled_subject": "בוטל: {{title}} ב- {{date}}",
"event_request_declined": "בקשת האירוע שלך נדחתה",
"event_request_declined_recurring": "בקשת האירוע החוזר שלך נדחתה",
"event_request_cancelled": "האירוע המתוכנן בוטל",
"organizer": "מארגן",
"need_to_reschedule_or_cancel": "רוצה לקבוע מועד חדש או לבטל?",
"cancellation_reason": "הסיבה לביטול (לא חובה)",
@@ -85,9 +82,7 @@
"your_meeting_has_been_booked": "הפגישה שלך הוזמנה",
"event_type_has_been_rescheduled_on_time_date": "{{title}} תוזמן מחדש לתאריך {{date}}.",
"event_has_been_rescheduled": "עודכן – מועד האירוע שלך השתנה",
"request_reschedule_subtitle": "{{organizer}} ביטל/ה את ההזמנה וביקש/ה שתבחר/י מועד אחר.",
"request_reschedule_title_organizer": "ביקשת מ{{attendee}} לקבוע מועד חדש",
"request_reschedule_subtitle_organizer": "ביטלת את ההזמנה ו-{{attendee}} צריך/ה לתאם איתך מועד חדש.",
"rescheduled_event_type_subject": "נשלחה בקשה לקביעת מועד חדש: {{eventType}} עם {{name}} בתאריך {{date}}",
"requested_to_reschedule_subject_attendee": "הפעולה חייבה קביעת מועד חדש: יש לקבוע מועד חדש עבור {{eventType}} עם {{name}}",
"hi_user_name": "שלום {{name}}",
@@ -317,7 +312,6 @@
"error_end_time_next_day": "שעת הסיום לא יכולה לחרוג מ-24 שעות",
"back_to_bookings": "בחזרה להזמנות",
"free_to_pick_another_event_type": "ניתן לבחור אירוע אחר בכל עת.",
"cancelled": "בוטלו",
"cancellation_successful": "פעולת הביטול בוצעה בהצלחה",
"really_cancel_booking": "בטוח שברצונך לבטל את ההזמנה?",
"cannot_cancel_booking": "לא ניתן לבטל את ההזמנה הזו",
@@ -326,7 +320,6 @@
"cancelling_event_recurring": "האירוע הוא מופע אחד מתוך אירוע חוזר.",
"cancelling_all_recurring": "כל אלה הם יתר המופעים של האירוע החוזר.",
"error_with_status_code_occured": "אירעה שגיאה עם קוד הסטטוס {{status}}.",
"booking_already_cancelled": "ההזמנה הזו כבר בוטלה",
"booking_already_accepted_rejected": "ההזמנה הזו כבר אושרה או נדחתה",
"go_back_home": "חזרה אל מסך הבית",
"or_go_back_home": "או חזור אל מסך הבית",
@@ -340,7 +333,6 @@
"upcoming_bookings": "ברגע שמישהו יקבע איתך פגישה, המועד שנקבע יוצג כאן.",
"recurring_bookings": "ברגע שמישהו יקבע איתך פגישה חוזרת, המועד שנקבע יוצג כאן.",
"past_bookings": "ההזמנות הקודמות שלך יוצגו כאן.",
"cancelled_bookings": "ההזמנות המבוטלות שלך יוצגו כאן.",
"unconfirmed_bookings": "ההזמנות שלך שלא אושרו יוצגו כאן.",
"unconfirmed_bookings_tooltip": "הזמנות שלא אושרו",
"on": "בתאריך",
@@ -380,7 +372,6 @@
"browse_api_documentation": "עיון במסמכי ממשק תכנות היישומים (API) שלנו",
"leverage_our_api": "מומלץ להיעזר בממשק תכנות היישומים (API) שלנו לקבלת שליטה מלאה ויכולת התאמה אישית.",
"create_webhook": "יצירת Webhook",
"booking_cancelled": "ההזמנה בוטלה",
"booking_rescheduled": "מועד ההזמנה השתנה",
"recording_ready": "הקישור להורדת ההקלטה מוכן",
"booking_created": "ההזמנה נוצרה",
@@ -393,8 +384,6 @@
"team_webhooks": "רכיבי Webhook של הצוות",
"create_new_webhook_to_account": "יצירת Webhook חדש לחשבון",
"new_webhook": "Webhook חדש",
"receive_cal_meeting_data": "קבל נתוני פגישות מ-{{appName}} בכתובת URL שציינת ובזמן אמת, כאשר נקבע מועד לאירוע או כאשר אירוע מבוטל.",
"receive_cal_event_meeting_data": "קבל/י נתוני פגישות מ-{{appName}} בכתובת URL שציינת ובזמן אמת, כאשר נקבע מועד לאירוע זה או כאשר הוא מבוטל.",
"responsive_fullscreen_iframe": "iframe רספונסיבי על מסך מלא",
"loading": "טוען...",
"deleting": "מתבצעת מחיקה...",
@@ -1032,14 +1021,12 @@
"event_location": "מיקום האירוע",
"reschedule_optional": "הסיבה לשינוי המועד (לא חובה)",
"reschedule_placeholder": "אפשר לאחרים לדעת מדוע עליך לשנות את המועד",
"event_cancelled": "אירוע זה מבוטל",
"emailed_information_about_cancelled_event": "שלחנו לך ולשאר המשתתפים הודעת דוא״ל כדי ליידע אותם על כך.",
"this_input_will_shown_booking_this_event": "הקלט יוצג בעת הזמנת אירוע זה",
"meeting_url_in_conformation_email": "כתובת ה-URL של הפגישה נמצאת בהודעת הדוא״ל שנשלחה לאישור הפגישה",
"url_start_with_https": "כתובת ה-URL צריכה להתחיל עם הקידומת http://‎ או https://‎",
"number_provided": "מספר הטלפון יסופק",
"before_event_trigger": "לפני שהאירוע מתחיל",
"event_cancelled_trigger": "כאשר אירוע מבוטל",
"new_event_trigger": "כאשר אירוע חדש מוזמן",
"email_host_action": "שלח מייל למארח",
"email_attendee_action": "שליחת דוא\"ל למשתתפים",
@@ -1427,7 +1414,6 @@
"your_team_disbanded_successfully": "פיזור הצוות שלך בוצע בהצלחה",
"error_creating_team": "אירעה שגיאה במהלך יצירת הצוות",
"you": "את/ה",
"send_email": "שליחת דוא\"ל",
"member_already_invited": "החבר כבר הוזמן",
"enter_email_or_username": "יש להזין כתובת דוא\"ל או שם משתמש",
"team_name_taken": "השם הזה כבר תפוס",
@@ -1440,7 +1426,7 @@
"attendee_email_info": "כתובת הדוא\"ל של האדם שביצע את ההזמנה",
"kbar_search_placeholder": "הקלד/י פקודה או חפש/י...",
"invalid_credential": "נראה שתוקף ההרשאה פג או שההרשאה בוטלה. יש להתקין מחדש שוב.",
"reschedule_reason_success_page": "הסיבה לקביעת מועד חדש",
"reschedule_reason": "הסיבה לקביעת מועד חדש",
"choose_common_schedule_team_event": "בחירת לוח זמנים משותף",
"choose_common_schedule_team_event_description": "יש להפעיל אפשרות זו אם רוצים להשתמש בלוח זמנים משותף בין המארחים. אם האפשרות הזו מבוטלת, כל מארח יוזמן לפי לוח הזמנים המשמש כברירת המחדל שלו.",
"reason": "סיבה",
@@ -1616,7 +1602,6 @@
"no_longer_attending": "אתה לא משתתף יותר בארוע זה",
"attendee_no_longer_attending_subject": "משתתף מסויים אינו משתתף עוד ב- {{title}} במועד {{date}}",
"attendee_no_longer_attending": "משתתף מסויים אינו משתתף עוד בארוע שלך",
"attendee_no_longer_attending_subtitle": "{{name}} ביטל. פירוש הדבר שהתפנה מושב לשעה זו",
"create_event_on": "צור ארוע ב-",
"default_app_link_title": "צור קישור אפליקציה ברירת מחדל",
"default_app_link_description": "הגדרת קישור אפליקציה ברירת מחדל מאפשר לכל הארועים החדשים להשתמש בקישור שהגדרת.",
@@ -1667,7 +1652,6 @@
"spot_popular_event_types_description": "צפה איזה ארועים מקבלים הכי הרבה גישות ותזמונים",
"no_responses_yet": "אין עדיין תגובות",
"this_will_be_the_placeholder": "זה יהיה הממלא מקום",
"error_booking_event": "אירעה שגיאה בעת הזמנת האירוע, רענן/י את הדף ונסה/י שוב",
"timeslot_missing_title": "לא נבחר חלון זמן",
"timeslot_missing_description": "כדי להזמין את האירוע, יש לבחור חלון זמן.",
"timeslot_missing_cta": "חלון הזמן שנבחר",
@@ -1728,7 +1712,6 @@
"least_booked_members": "החברים שמתוזמנים הכי פחות",
"events_created": "ארועים שנוצרו",
"events_completed": "ארועים שהושלמו",
"events_cancelled": "ארועים שבוטלו",
"events_rescheduled": "ארועים שתוזמנו מחדש",
"from_last_period": "מפרק הזמן האחרון",
"from_to_date_period": "מ: {{startDate}} עד: {{endDate}}",
@@ -10,10 +10,8 @@
"have_any_questions": "Imate pitanja? Tu smo da pomognemo.",
"reset_password_subject": "{{appName}}: Uputstva za resetiranje lozinke",
"event_declined_subject": "Odbijeno: {{title}} u {{date}}",
"event_cancelled_subject": "Otkazano: {{title}} u {{date}}",
"event_request_declined": "Vaš zahtjev za događaj je odbijen",
"event_request_declined_recurring": "Vaš zahtjev za ponavljajući događaj je odbijen",
"event_request_cancelled": "Vaš zakazan događaj je odbijen",
"organizer": "Organizator",
"need_to_reschedule_or_cancel": "Trebate odgoditi ili otkazati?",
"cancellation_reason": "Razlog otkazivanja (neobavezno)",
@@ -68,9 +66,7 @@
"your_meeting_has_been_booked": "Vaš sastanak je zakazan",
"event_type_has_been_rescheduled_on_time_date": "Vaš {{title}} je odgođen za {{date}}.",
"event_has_been_rescheduled": "Ažurirano - Vaš događaj je odgođen",
"request_reschedule_subtitle": "{{organizer}} je otkazao/la rezervaciju i zatražio/la da odaberete drugi termin.",
"request_reschedule_title_organizer": "Zatražili ste da {{attendee}} promijeni termin",
"request_reschedule_subtitle_organizer": "Otkazali ste rezervaciju i {{attendee}} bi trebao odabrati novi termin s vama.",
"rescheduled_event_type_subject": "Zahtjev za odgodu poslan: {{eventType}} s {{name}} u {{date}}",
"requested_to_reschedule_subject_attendee": "Potrebna radnja za promjenu termina: rezervirajte novi termin za {{eventType}} s {{name}}",
"hi_user_name": "Pozdrav {{name}}",
@@ -288,7 +284,6 @@
"error_end_time_next_day": "Vrijeme završetka ne može biti dulje od 24 sata",
"back_to_bookings": "Povratak na rezervacije",
"free_to_pick_another_event_type": "Slobodno odaberite neki drugi događaj bilo kada.",
"cancelled": "Otkazano",
"cancellation_successful": "Otkazivanje uspješno",
"really_cancel_booking": "Stvarno otkazujete svoju rezervaciju?",
"cannot_cancel_booking": "Ne možete otkazati ovu rezervaciju",
@@ -297,7 +292,6 @@
"cancelling_event_recurring": "Događaj je jedan od ponavljajućih događaja.",
"cancelling_all_recurring": "Ovo su svi preostali događaji u ponavljajućem događaju.",
"error_with_status_code_occured": "Došlo je do pogreške sa statusnim kodom {{status}}.",
"booking_already_cancelled": "Ova rezervacija je već otkazana",
"booking_already_accepted_rejected": "Ova rezervacija je već prihvaćena ili odbijena",
"go_back_home": "Nazad na početnu stranicu",
"or_go_back_home": "Ili nazad na početnu stranicu",
@@ -311,7 +305,6 @@
"upcoming_bookings": "Čim netko rezervira termin s vama, pokazat će se ovdje.",
"recurring_bookings": "Čim netko rezervira ponavljajući sastanak s vama, pokazat će se ovdje.",
"past_bookings": "Ovdje će se prikazati vaše prethodne rezervacije.",
"cancelled_bookings": "Ovdje će se prikazati vaše otkazane rezervacije.",
"unconfirmed_bookings": "Ovdje će se prikazati vaše nepotvrđene rezervacije.",
"unconfirmed_bookings_tooltip": "Nepotvrđene rezervacije",
"on": "u",
@@ -82,7 +82,6 @@
"try_again": "Próbáld újra",
"login": "Bejelentkezés",
"success": "Siker",
"cancelled": "Lemondva",
"and": "és",
"light": "Világos",
"dark": "Sötét",
@@ -11,10 +11,8 @@
"have_any_questions": "Punya pertanyaan? Kami siap membantu.",
"reset_password_subject": "{{appName}}: Petunjuk pengaturan ulang kata sandi",
"event_declined_subject": "Ditolak: {{title}} pada {{date}}",
"event_cancelled_subject": "Dibatalkan: {{title}} pada {{date}}",
"event_request_declined": "Permintaan acara kamu telah ditolak",
"event_request_declined_recurring": "Acara berulang kamu telah ditolak",
"event_request_cancelled": "Acara terjadwal kamu telah dibatalkan",
"organizer": "Pengelola",
"need_to_reschedule_or_cancel": "Perlu penjadwalan ulang atau pembatalan?",
"cancellation_reason": "Alasan pembatalan (opsional)",
@@ -71,9 +69,7 @@
"your_meeting_has_been_booked": "Pertemuanmu telah terdaftar",
"event_type_has_been_rescheduled_on_time_date": "{{title}} kamu telah dijadwalkan ulang menjadi {{date}}.",
"event_has_been_rescheduled": "Terkini - Acara kamu telah dijadwalkan ulang",
"request_reschedule_subtitle": "{{organizer}} telah membatalkan acara dan meminta kamu untuk memilih waktu lain.",
"request_reschedule_title_organizer": "Kamu telah meminta {{attendee}} untuk menjadwalkan ulang",
"request_reschedule_subtitle_organizer": "Kamu telah membatalkan acara dan {{attendee}} akan memilih waktu lain.",
"rescheduled_event_type_subject": "Permintaan penjadwalan ulang terkirim: {{eventType}} dengan {{name}} pada {{date}}",
"team_info": "Informasi Tim",
"request_another_invitation_email": "Jika kamu lebih suka tidak menggukan {{toEmail}} sebagai email {{appName}} atau telah memiliki akun {{appName}} silakan membuat permintaan lain kepada email tersebut.",
+1 -18
View File
@@ -14,17 +14,14 @@
"verify_email_subject": "{{appName}}: verifica il tuo account",
"check_your_email": "Controlla la tua e-mail",
"verify_email_page_body": "Abbiamo inviato un'e-mail a {{email}}. È importante verificare il tuo indirizzo e-mail per garantire un migliore funzionamento dell'e-mail e del calendario {{appName}}.",
"verify_email_banner_body": "Verifica il tuo indirizzo e-mail per garantire un migliore funzionamento dell'e-mail e del calendario {{appName}}.",
"verify_email_email_header": "Verifica il tuo indirizzo e-mail",
"verify_email_email_button": "Verifica l'e-mail",
"verify_email_email_body": "Verifica il tuo indirizzo e-mail cliccando sul pulsante qui in basso.",
"verify_email_email_link_text": "Ecco il link nel caso tu non voglia fare clic su pulsanti:",
"email_sent": "Email inviata con successo",
"event_declined_subject": "Rifiutato: {{title}} il {{date}}",
"event_cancelled_subject": "Cancellato: {{title}} il {{date}}",
"event_request_declined": "La tua richiesta per l'evento è stata rifiutata",
"event_request_declined_recurring": "La tua richiesta per l'evento ricorrente è stata rifiutata",
"event_request_cancelled": "Il tuo evento programmato è stato cancellato",
"organizer": "Organizzatore",
"need_to_reschedule_or_cancel": "È necessario riprogrammare o annullare?",
"cancellation_reason": "Motivo dell'annullamento (facoltativo)",
@@ -86,9 +83,7 @@
"your_meeting_has_been_booked": "Il tuo meeting è stata prenotato",
"event_type_has_been_rescheduled_on_time_date": "Il tuo {{title}} è stato riprogrammato per il {{date}}.",
"event_has_been_rescheduled": "Aggiornato: il tuo evento è stato riprogrammato",
"request_reschedule_subtitle": "{{organizer}} ha annullato la prenotazione e ti ha chiesto di scegliere un altro orario.",
"request_reschedule_title_organizer": "Hai richiesto a {{attendee}} di riprogrammare",
"request_reschedule_subtitle_organizer": "Hai annullato la prenotazione e {{attendee}} deve selezionare un nuovo orario per la prenotazione.",
"rescheduled_event_type_subject": "Richiesta di riprogrammazione inviata: {{eventType}} con {{name}} il {{date}}",
"requested_to_reschedule_subject_attendee": "Azione richiesta per la riprogrammazione: prenota un nuovo orario per {{eventType}} con {{name}}",
"hi_user_name": "Ciao {{name}}",
@@ -326,7 +321,6 @@
"error_end_time_next_day": "L'ora di conclusione non può essere maggiore di 24 ore",
"back_to_bookings": "Torna alle prenotazioni",
"free_to_pick_another_event_type": "Sentiti libero di scegliere un altro evento in qualsiasi momento.",
"cancelled": "Annullato",
"cancellation_successful": "Cancellazione riuscita",
"really_cancel_booking": "Davvero vuoi annullare la prenotazione?",
"cannot_cancel_booking": "Non puoi annullare questa prenotazione",
@@ -335,7 +329,6 @@
"cancelling_event_recurring": "L'evento è un'istanza di un evento ricorrente.",
"cancelling_all_recurring": "Queste sono tutte le istanze rimanenti dell'evento ricorrente.",
"error_with_status_code_occured": "Si è verificato un errore con il codice di stato {{status}}.",
"booking_already_cancelled": "Questa prenotazione è stata già annullata",
"booking_already_accepted_rejected": "Questa prenotazione è già stata accettata o rifiutata",
"go_back_home": "Torna alla home",
"or_go_back_home": "Torna alla home",
@@ -349,7 +342,6 @@
"upcoming_bookings": "Non appena qualcuno prenota una riunione con voi apparirà qui.",
"recurring_bookings": "Quando qualcuno prenoterà una riunione ricorrente con te, la riunione apparirà qui.",
"past_bookings": "Le tue prenotazioni passate appariranno qui.",
"cancelled_bookings": "Le tue prenotazioni passate appariranno qui.",
"unconfirmed_bookings": "Le tue prenotazioni non confermate appariranno qui.",
"unconfirmed_bookings_tooltip": "Prenotazioni non confermate",
"on": "su",
@@ -390,7 +382,6 @@
"browse_api_documentation": "Sfoglia la nostra documentazione API",
"leverage_our_api": "Sfrutta la nostra API per il pieno controllo e la personalizzabilità.",
"create_webhook": "Crea Webhook",
"booking_cancelled": "Prenotazione Annullata",
"booking_rescheduled": "Prenotazione Riprogrammata",
"recording_ready": "Link per scaricare la registrazione pronto",
"booking_created": "Prenotazione Creata",
@@ -405,8 +396,6 @@
"team_webhooks": "Webhook del team",
"create_new_webhook_to_account": "Crea un nuovo webhook sul tuo account",
"new_webhook": "Nuovo Webhook",
"receive_cal_meeting_data": "Ricevi i dati di riunione {{appName}} ad un URL specificato, in tempo reale, quando un evento è programmato o annullato.",
"receive_cal_event_meeting_data": "Ricevi i dati della riunione {{appName}} a un URL specificato, in tempo reale, quando questo evento viene programmato o annullato.",
"responsive_fullscreen_iframe": "Iframe full screen responsive",
"loading": "Caricamento...",
"deleting": "Eliminazione...",
@@ -1045,14 +1034,12 @@
"event_location": "Luogo dell'evento",
"reschedule_optional": "Motivo della riprogrammazione (facoltativo)",
"reschedule_placeholder": "Fai sapere agli alti perché hai bisogno di riprogrammare",
"event_cancelled": "Questo evento è stato annullato",
"emailed_information_about_cancelled_event": "Abbiamo inviato un'e-mail di notifica a te e agli altri partecipanti.",
"this_input_will_shown_booking_this_event": "Questo input verrà mostrato durante la prenotazione di questo evento",
"meeting_url_in_conformation_email": "L'URL della riunione è riportato nell'e-mail di conferma",
"url_start_with_https": "L'URL deve iniziare con http:// o https://",
"number_provided": "Verrà fornito il numero di telefono",
"before_event_trigger": "prima dell'inizio dell'evento",
"event_cancelled_trigger": "quando l'evento viene annullato",
"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",
@@ -1444,7 +1431,6 @@
"your_team_disbanded_successfully": "Il tuo team è stato sciolto correttamente",
"error_creating_team": "Errore durante la creazione del team",
"you": "Tu",
"send_email": "Invia e-mail",
"member_already_invited": "Membro già invitato",
"enter_email_or_username": "Immettere un indirizzo e-mail o un nome utente",
"team_name_taken": "Nome già utilizzato",
@@ -1457,7 +1443,7 @@
"attendee_email_info": "E-mail della persona che prenota",
"kbar_search_placeholder": "Digita un comando o esegui una ricerca...",
"invalid_credential": "Errore! Sembra che l'autorizzazione sia scaduta o che sia stata revocata. Prova a reinstallare.",
"reschedule_reason_success_page": "Motivo della riprogrammazione",
"reschedule_reason": "Motivo della riprogrammazione",
"choose_common_schedule_team_event": "Scegli un programma comune",
"choose_common_schedule_team_event_description": "Abilita questa opzione se desideri utilizzare un programma comune per tutti gli organizzatori. Quando l'opzione è disabilitata, ciascun organizzatore verrà prenotato in base al proprio programma predefinito.",
"reason": "Motivo",
@@ -1636,7 +1622,6 @@
"no_longer_attending": "Non partecipi più a questo evento",
"attendee_no_longer_attending_subject": "Un partecipante non partecipa più a {{title}} con il seguente orario {{date}}",
"attendee_no_longer_attending": "Un partecipante non partecipa più al tuo evento",
"attendee_no_longer_attending_subtitle": "{{name}} ha disdetto. Di conseguenza, si è liberato un posto in questa fascia oraria",
"create_event_on": "Crea evento in",
"default_app_link_title": "Imposta il link dell'app predefinita",
"default_app_link_description": "L'impostazione di un link dell'app predefinita permette a tutti i nuovi tipi di eventi di usare il link dell'app impostato.",
@@ -1689,7 +1674,6 @@
"no_responses_yet": "Per ora non ci sono risposte",
"no_routes_defined": "Nessun percorso definito",
"this_will_be_the_placeholder": "Questo sarà il segnaposto",
"error_booking_event": "Si è verificato un errore durante la prenotazione dell'evento. Aggiornare la pagina e riprovare",
"timeslot_missing_title": "Nessuna fascia oraria selezionata",
"timeslot_missing_description": "Selezionare una fascia oraria per prenotare l'evento.",
"timeslot_missing_cta": "Seleziona fascia oraria",
@@ -1751,7 +1735,6 @@
"least_booked_members": "Membri meno prenotati",
"events_created": "Eventi creati",
"events_completed": "Eventi completati",
"events_cancelled": "Eventi annullati",
"events_rescheduled": "Eventi riprogrammati",
"from_last_period": "dal periodo precedente",
"from_to_date_period": "Da: {{startDate}} A: {{endDate}}",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "ご不明な点があれば、お気軽にお問い合わせください。",
"reset_password_subject": "{{appName}}: パスワードのリセット手順",
"event_declined_subject": "却下: {{title}} {{date}}",
"event_cancelled_subject": "キャンセル: {{title}} {{date}}",
"event_request_declined": "イベントのリクエストが拒否されました",
"event_request_declined_recurring": "繰り返しイベントのリクエストが拒否されました",
"event_request_cancelled": "スケジュールされていた予定がキャンセルされました",
"organizer": "主催者",
"need_to_reschedule_or_cancel": "再スケジュールまたはキャンセルが必要ですか?",
"cancellation_reason": "キャンセルの理由 (オプション)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "ミーティングが予約されました",
"event_type_has_been_rescheduled_on_time_date": "あなたの {{title}} は {{date}} に再スケジュールされました。",
"event_has_been_rescheduled": "更新 - イベントのスケジュールが変更されました",
"request_reschedule_subtitle": "{{organizer}} が予約をキャンセルしました。別の時間を選択することをあなたにリクエストしています。",
"request_reschedule_title_organizer": "{{attendee}} にスケジュールの変更をリクエストしました",
"request_reschedule_subtitle_organizer": "予約をキャンセルしました。{{attendee}} はあなたとの予約の時間を新しく選択する必要があります。",
"rescheduled_event_type_subject": "スケジュール変更のリクエストを送信しました: {{date}} の {{name}} との {{eventType}}",
"requested_to_reschedule_subject_attendee": "スケジュール変更のアクションが必要です: {{name}} との {{eventType}} に新しい時間を予約してください",
"hi_user_name": "こんにちは、{{name}} さん",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "終了時刻に 24 時を超える時刻を設定することはできません",
"back_to_bookings": "予約に戻る",
"free_to_pick_another_event_type": "他の好きなイベントを選んでください。",
"cancelled": "キャンセル済み",
"cancellation_successful": "キャンセルしました",
"really_cancel_booking": "本当に予約をキャンセルしますか?",
"cannot_cancel_booking": "この予約はキャンセルできません",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "このイベントは、繰り返しイベントに含まれている 1 つのインスタンスです。",
"cancelling_all_recurring": "これらはすべて、繰り返しイベントに含まれているインスタンスの残りです。",
"error_with_status_code_occured": "ステータスコード {{status}} に関するエラーが発生しました。",
"booking_already_cancelled": "この予約はすでにキャンセルされています",
"booking_already_accepted_rejected": "この予約はすでに承認または拒否が行われています。",
"go_back_home": "ホームに戻る",
"or_go_back_home": "またはホームに戻る",
@@ -326,7 +320,6 @@
"upcoming_bookings": "誰かがあなたとの時間を予約すると、すぐにここに表示されます。",
"recurring_bookings": "別のユーザーがあなたとの繰り返しイベントを予約すると、ここに表示されます。",
"past_bookings": "過去の予約はここに表示されます。",
"cancelled_bookings": "キャンセルされた予約はここに表示されます。",
"unconfirmed_bookings": "未確認の予約はここに表示されます。",
"unconfirmed_bookings_tooltip": "未確認の予約",
"on": "上",
@@ -366,7 +359,6 @@
"browse_api_documentation": "APIドキュメントを参照する",
"leverage_our_api": "APIを活用して、完全な制御とカスタマイズが可能です。",
"create_webhook": "Webhook を作成",
"booking_cancelled": "予約がキャンセルされました",
"booking_rescheduled": "予約の再スケジュール済",
"recording_ready": "レコーディングのダウンロード リンクの準備ができています",
"booking_created": "予約を作成しました",
@@ -379,8 +371,6 @@
"team_webhooks": "チームのウェブフック",
"create_new_webhook_to_account": "アカウントに新しいウェブフックを作成します",
"new_webhook": "新しいウェブフック",
"receive_cal_meeting_data": "イベントが予定またはキャンセルされた場合、特定の URL で開かれる {{appName}} ミーティングデータをリアルタイムに受信する。",
"receive_cal_event_meeting_data": "このイベントが予定またはキャンセルされた場合、特定の URL で開かれる {{appName}} ミーティングデータをリアルタイムに受信する。",
"responsive_fullscreen_iframe": "レスポンシブフルスクリーン iframe",
"loading": "読み込み中...",
"deleting": "削除中...",
@@ -1018,14 +1008,12 @@
"event_location": "イベントの場所",
"reschedule_optional": "スケジュール変更の理由 (任意)",
"reschedule_placeholder": "スケジュール変更が必要な理由を他の人に知らせる",
"event_cancelled": "このイベントはキャンセルされました",
"emailed_information_about_cancelled_event": "あなたと他の出席者に電子メールでお知らせしました。",
"this_input_will_shown_booking_this_event": "この入力は、このイベントを予約する際に表示されます",
"meeting_url_in_conformation_email": "ミーティングURLは確認メールに記載されています",
"url_start_with_https": "URLは、http://またはhttps://で始まる必要があります",
"number_provided": "電話番号が提供されます",
"before_event_trigger": "イベント開始前に",
"event_cancelled_trigger": "イベントキャンセル時に",
"new_event_trigger": "新しいイベント予約時に",
"email_host_action": "ホストにメールを送信",
"email_attendee_action": "出席者にメールを送る",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "チームは正常に解散されました",
"error_creating_team": "チームの作成中にエラーが発生しました",
"you": "あなた",
"send_email": "メールを送信",
"member_already_invited": "メンバーは既に招待されています",
"enter_email_or_username": "メールアドレスまたはユーザー名を入力してください",
"team_name_taken": "この名前は既に使用されています",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "予約者のメールアドレス",
"kbar_search_placeholder": "コマンドを入力するか、検索してください...",
"invalid_credential": "アクセス許可の有効期限が切れたか、取り消されたようです。もう一度インストールしてください。",
"reschedule_reason_success_page": "スケジュール変更の理由",
"reschedule_reason": "スケジュール変更の理由",
"choose_common_schedule_team_event": "共通のスケジュールを選択",
"choose_common_schedule_team_event_description": "ホスト間で共通のスケジュールを使用する場合には、これを有効にしてください。無効にすると、各ホストに対してはデフォルトのスケジュールに基づいて予約が行われます。",
"reason": "理由",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "このイベントには出席しなくなりました",
"attendee_no_longer_attending_subject": "出席者は {{date}} の {{title}} には出席しなくなりました",
"attendee_no_longer_attending": "出席者はあなたのイベントに出席しなくなりました",
"attendee_no_longer_attending_subtitle": "{{name}} がキャンセルしました。これにより、この時間帯の座席が 1 つ利用可能になりました",
"create_event_on": "次のカレンダーにイベントを作成",
"default_app_link_title": "デフォルトのアプリリンクを設定",
"default_app_link_description": "デフォルトのアプリリンクを設定することで、新たに作成するすべてのイベントの種類が設定したアプリリンクを使用できるようになります。",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "どのイベントの種類が最もクリックされ、予約されているのかを確認します",
"no_responses_yet": "回答はまだありません",
"this_will_be_the_placeholder": "これがプレースホルダーになります",
"error_booking_event": "イベントを予約する際にエラーが発生しました。ページを再読み込みして、もう一度お試しください",
"timeslot_missing_title": "時間帯が選択されていません",
"timeslot_missing_description": "イベントを予約するには時間帯を選んでください。",
"timeslot_missing_cta": "時間帯を選ぶ",
@@ -1714,7 +1699,6 @@
"least_booked_members": "最も予約数が少ないメンバー",
"events_created": "イベントが作成されました",
"events_completed": "イベントが完了しました",
"events_cancelled": "イベントがキャンセルされました",
"events_rescheduled": "イベントのスケジュールが変更されました",
"from_last_period": "最後の期間から",
"from_to_date_period": "開始: {{startDate}} 終了: {{endDate}}",
+1 -17
View File
@@ -13,10 +13,8 @@
"reset_password_subject": "{{appName}}: 비밀번호 재설정 방법",
"email_sent": "이메일이 성공적으로 전송되었습니다",
"event_declined_subject": "거절됨: {{date}} {{title}}",
"event_cancelled_subject": "취소됨: {{date}} {{title}}",
"event_request_declined": "회의 요청이 거절되었습니다.",
"event_request_declined_recurring": "되풀이 이벤트 요청이 거부되었습니다",
"event_request_cancelled": "회의 일정이 취소되었습니다.",
"organizer": "주최자",
"need_to_reschedule_or_cancel": "다시 일정을 잡거나 취소하시겠습니까?",
"cancellation_reason": "취소 사유(선택사항)",
@@ -78,9 +76,7 @@
"your_meeting_has_been_booked": "회의가 예약되었습니다.",
"event_type_has_been_rescheduled_on_time_date": "귀하의 {{title}} 일정이 {{date}}로 변경되었습니다.",
"event_has_been_rescheduled": "업데이트 - 이벤트 일정이 변경되었습니다.",
"request_reschedule_subtitle": "{{organizer}}에서 예약을 취소했고 다른 시간을 선택할 것을 요청했습니다.",
"request_reschedule_title_organizer": "{{attendee}}에게 일정 변경을 요청하셨습니다",
"request_reschedule_subtitle_organizer": "예약을 취소하셨기 때문에 {{attendee}} 님이 새 예약 시간을 선택해야 합니다.",
"rescheduled_event_type_subject": "일정 변경 요청이 보내짐: {{date}}에 {{name}}(으)로 {{eventType}}",
"requested_to_reschedule_subject_attendee": "일정 변경 조치 필요: {{name}} 님과 함께 새로운 {{eventType}} 시간을 예약하십시오",
"hi_user_name": "안녕하세요 {{name}}",
@@ -304,7 +300,6 @@
"error_end_time_next_day": "종료 시간은 24시간보다 클 수 없습니다",
"back_to_bookings": "예약으로 돌아가기",
"free_to_pick_another_event_type": "언제든지 다른 이벤트를 선택할 수 있습니다.",
"cancelled": "취소됨",
"cancellation_successful": "취소 성공",
"really_cancel_booking": "예약을 정말 취소하시겠습니까?",
"cannot_cancel_booking": "예약을 취소하실 수 없습니다.",
@@ -313,7 +308,6 @@
"cancelling_event_recurring": "이 이벤트는 되풀이 이벤트의 한 인스턴스입니다.",
"cancelling_all_recurring": "이들은 모두 되풀이 이벤트의 나머지 인스턴스입니다.",
"error_with_status_code_occured": "상태 코드가 {{status}}인 오류가 발생했습니다.",
"booking_already_cancelled": "이 예약은 이미 취소되었습니다",
"booking_already_accepted_rejected": "이 예약은 이미 승인 또는 거부되었습니다",
"go_back_home": "홈으로 돌아가기",
"or_go_back_home": "또는 홈으로 돌아가기",
@@ -327,7 +321,6 @@
"upcoming_bookings": "누군가 당신과 회의를 예약하는 즉시 여기에 표시됩니다.",
"recurring_bookings": "누군가가 귀하와 되풀이 회의를 예약하는 즉시 여기에 표시됩니다.",
"past_bookings": "과거 예약이 여기에 표시됩니다.",
"cancelled_bookings": "취소된 예약이 여기에 표시됩니다.",
"unconfirmed_bookings": "확인되지 않은 예약은 여기에 표시됩니다.",
"unconfirmed_bookings_tooltip": "미확인된 예약",
"on": "-",
@@ -367,7 +360,6 @@
"browse_api_documentation": "API 문서 찾아보기",
"leverage_our_api": "API를 활용하여 전체 제어 및 사용자 정의",
"create_webhook": "웹훅 만들기",
"booking_cancelled": "예약 취소",
"booking_rescheduled": "예약 변경",
"recording_ready": "녹화 다운로드 링크 준비됨",
"booking_created": "예약 생성",
@@ -380,8 +372,6 @@
"team_webhooks": "팀 웹훅",
"create_new_webhook_to_account": "내 계정에 새 웹훅 만들기",
"new_webhook": "새 웹훅",
"receive_cal_meeting_data": "일정이 잡히거나 취소될 때 지정된 URL에서 실시간으로 {{appName}} 회의 데이터를 수신합니다.",
"receive_cal_event_meeting_data": "일정이 잡혔거나 취소되었을 때 지정된 URL에서 실시간으로 {{appName}} 회의 데이터를 수신합니다.",
"responsive_fullscreen_iframe": "반응형 전체 화면 iframe",
"loading": "로드 중",
"deleting": "삭제 중...",
@@ -1019,14 +1009,12 @@
"event_location": "이벤트 위치",
"reschedule_optional": "일정 변경 사유(선택사항)",
"reschedule_placeholder": "일정을 조정해야 하는 사유를 다른 사람들에게 알리십시오",
"event_cancelled": "이 이벤트는 취소되었습니다",
"emailed_information_about_cancelled_event": "귀하와 다른 참석자들에게 이메일로 알려 드렸습니다.",
"this_input_will_shown_booking_this_event": "이 입력은 이 이벤트를 예약할 때 표시됩니다.",
"meeting_url_in_conformation_email": "회의 URL은 확인 이메일에 있습니다",
"url_start_with_https": "URL은 http:// 또는 https://로 시작해야 합니다",
"number_provided": "전화 번호는 제공됩니다",
"before_event_trigger": "이벤트 시작 전",
"event_cancelled_trigger": "이벤트 취소 시",
"new_event_trigger": "새 이벤트 예약 시",
"email_host_action": "호스트에게 이메일 발송",
"email_attendee_action": "참석자들에게 이메일 전송",
@@ -1414,7 +1402,6 @@
"your_team_disbanded_successfully": "귀하의 팀이 성공적으로 해산되었습니다",
"error_creating_team": "팀을 만드는 중 오류 발생",
"you": "귀하",
"send_email": "이메일 보내기",
"member_already_invited": "구성원이 이미 초대되었습니다",
"enter_email_or_username": "이메일 또는 사용자 이름을 입력하세요",
"team_name_taken": "이미 사용 중인 이름입니다",
@@ -1427,7 +1414,7 @@
"attendee_email_info": "예약자 이메일",
"kbar_search_placeholder": "명령어를 입력하거나 검색하세요...",
"invalid_credential": "죄송합니다! 권한이 만료되었거나 취소된 것 같습니다. 다시 설치하십시오.",
"reschedule_reason_success_page": "일정 변경 사유",
"reschedule_reason": "일정 변경 사유",
"choose_common_schedule_team_event": "공통 일정 선택",
"choose_common_schedule_team_event_description": "호스트 간에 공통 일정을 사용하려면 이 옵션을 활성화하세요. 비활성화되면 각 호스트는 기본 일정에 따라 예약됩니다.",
"reason": "사유",
@@ -1603,7 +1590,6 @@
"no_longer_attending": "더 이상 이 이벤트에 참석하지 않고 계십니다",
"attendee_no_longer_attending_subject": "참석자가 더 이상 {{date}} 날짜에 {{title}}에 참석하지 않습니다",
"attendee_no_longer_attending": "참석자가 더 이상 이벤트에 참석하고 있지 않습니다",
"attendee_no_longer_attending_subtitle": "{{name}}이(가) 취소되었습니다. 즉, 이 시간 슬롯에 좌석이 비어 있습니다",
"create_event_on": "이벤트 생성일:",
"default_app_link_title": "기본 앱 링크 설정",
"default_app_link_description": "기본 앱 링크를 설정하면 새로 생성된 모든 이벤트 유형에서 설정된 앱 링크를 사용할 수 있습니다.",
@@ -1654,7 +1640,6 @@
"spot_popular_event_types_description": "어떤 이벤트 타입이 가장 많은 클릭과 예약을 받고 있는지 확인",
"no_responses_yet": "아직 응답 없음",
"this_will_be_the_placeholder": "이것은 자리 표시자가 됩니다",
"error_booking_event": "이벤트를 예약하는 도중 오류가 발생했습니다. 페이지를 새로고침한 후 다시 시도해주세요.",
"timeslot_missing_title": "시간대가 선택되지 않았습니다",
"timeslot_missing_description": "이벤트를 예약 할 시간대를 선택해주세요.",
"timeslot_missing_cta": "시간대 선택",
@@ -1715,7 +1700,6 @@
"least_booked_members": "예약이 가장 적은 회원",
"events_created": "생성된 이벤트",
"events_completed": "완료된 이벤트",
"events_cancelled": "취소된 이벤트",
"events_rescheduled": "일정이 변경된 이벤트",
"from_last_period": "마지막 기간부터",
"from_to_date_period": "시작일: {{startDate}} 종료일: {{endDate}}",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Heeft u vragen? We zijn er om te helpen.",
"reset_password_subject": "{{appName}}: Instructies voor het opnieuw instellen van uw wachtwoord",
"event_declined_subject": "Afgewezen: {{title}}",
"event_cancelled_subject": "Geannuleerd: {{title}} op {{date}}",
"event_request_declined": "Uw gebeurtenisverzoek is geweigerd",
"event_request_declined_recurring": "Uw verzoek voor een terugkerende gebeurtenis is geweigerd",
"event_request_cancelled": "Uw geplande gebeurtenis is geannuleerd",
"organizer": "Organisator",
"need_to_reschedule_or_cancel": "Moet u verplaatsen of annuleren?",
"cancellation_reason": "Reden voor annulering (optioneel)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Uw afspraak is geboekt",
"event_type_has_been_rescheduled_on_time_date": "Uw {{title}} is verplaatst naar {{date}}.",
"event_has_been_rescheduled": "Bijgewerkt - Uw gebeurtenis is verplaatst",
"request_reschedule_subtitle": "{{organizer}} heeft de boeking geannuleerd en u verzocht een andere tijd te kiezen.",
"request_reschedule_title_organizer": "U heeft {{attendee}} gevraagd om te verplaatsen",
"request_reschedule_subtitle_organizer": "U heeft de boeking geannuleerd en {{attendee}} moet samen met u een nieuwe boekingstijd kiezen.",
"rescheduled_event_type_subject": "Verplaatst: {{eventType}} met {{name}} op {{date}}",
"requested_to_reschedule_subject_attendee": "Actie vereist voor verplaatsing: boek een nieuwe tijd voor {{eventType}} met {{name}}",
"hi_user_name": "Hallo {{name}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "De eindtijd mag niet meer dan 24 uur later zijn",
"back_to_bookings": "Terug naar afspraken",
"free_to_pick_another_event_type": "U kunt op elk moment een andere afspraak maken.",
"cancelled": "Geannuleerd",
"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",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "De gebeurtenis is één exemplaar van een terugkerende gebeurtenis.",
"cancelling_all_recurring": "Dit zijn alle resterende exemplaren van de terugkerende gebeurtenis.",
"error_with_status_code_occured": "Er is een fout opgetreden met de code {{status}}.",
"booking_already_cancelled": "Deze afspraak is reeds geannuleerd",
"booking_already_accepted_rejected": "Deze boeking is al geaccepteerd of geweigerd",
"go_back_home": "Terug naar startpagina",
"or_go_back_home": "Of ga terug naar de startpagina",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Zodra iemand een tijd boekt zal deze hier verschijnen.",
"recurring_bookings": "Zodra iemand een terugkerende afspraak met u boekt, verschijnt die hier.",
"past_bookings": "Uw oude afspraken zullen hier verschijnen.",
"cancelled_bookings": "Uw geannuleerde afspraken zullen hier verschijnen.",
"unconfirmed_bookings": "Uw niet-bevestigde afspraken zullen hier verschijnen.",
"unconfirmed_bookings_tooltip": "Niet-bevestigde boekingen",
"on": "aan",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Bekijk onze API-documentatie",
"leverage_our_api": "Gebruik onze API voor volledige controle en aanpasbaarheid.",
"create_webhook": "Webhook maken",
"booking_cancelled": "Afspraak Geannuleerd",
"booking_rescheduled": "Afspraak verplaatst",
"recording_ready": "Downloadlink opname gereed",
"booking_created": "Boeking aangemaakt",
@@ -379,8 +371,6 @@
"team_webhooks": "Teamwebhooks",
"create_new_webhook_to_account": "Maak een nieuwe webhook aan voor uw account",
"new_webhook": "Maak een Webhook",
"receive_cal_meeting_data": "Direct {{appName}} afspraakgegevens ontvangen via een opgegeven URL wanneer een event is gepland of geannuleerd.",
"receive_cal_event_meeting_data": "Ontvang {{appName}}-afspraakgegevens in realtime via een opgegeven URL wanneer een gebeurtenis wordt gepland of geannuleerd.",
"responsive_fullscreen_iframe": "Responsieve iframe",
"loading": "Laden...",
"deleting": "Verwijderen...",
@@ -1018,14 +1008,12 @@
"event_location": "Locatie gebeurtenis",
"reschedule_optional": "Reden voor verplaatsen (optioneel)",
"reschedule_placeholder": "Informeer anderen waarom u het moet verplaatsen",
"event_cancelled": "Deze gebeurtenis is geannuleerd",
"emailed_information_about_cancelled_event": "We hebben u en de andere deelnemers een e-mail gestuurd om hen te informeren.",
"this_input_will_shown_booking_this_event": "Deze invoer wordt getoond tijdens het boeken van dit evenement",
"meeting_url_in_conformation_email": "De vergader-URL wordt vermeld in de bevestigings-e-mail",
"url_start_with_https": "URL moet beginnen met http:// of https://",
"number_provided": "Telefoonnummer wordt verstrekt",
"before_event_trigger": "voordat de gebeurtenis begint",
"event_cancelled_trigger": "wanneer de gebeurtenis is geannuleerd",
"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",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Uw team is ontbonden",
"error_creating_team": "Fout bij het aanmaken van team",
"you": "U",
"send_email": "E-mail versturen",
"member_already_invited": "Lid is al uitgenodigd",
"enter_email_or_username": "Voer een e-mailadres of gebruikersnaam in",
"team_name_taken": "Deze naam is al in gebruik",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "Het e-mailadres van de persoon die boekt",
"kbar_search_placeholder": "Typ een opdracht of zoek...",
"invalid_credential": "Oh nee! Het lijkt erop dat de machtiging is verlopen of is ingetrokken. Installeer het opnieuw.",
"reschedule_reason_success_page": "Reden voor opnieuw plannen",
"reschedule_reason": "Reden voor opnieuw plannen",
"choose_common_schedule_team_event": "Kies een gezamenlijke planning",
"choose_common_schedule_team_event_description": "Schakel dit in als u een gemeenschappelijke planning tussen organisatoren wilt gebruiken. Indien uitgeschakeld, wordt elke organisator geboekt op basis van zijn standaardplanning.",
"reason": "Reden",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "U neemt niet langer deel aan deze gebeurtenis",
"attendee_no_longer_attending_subject": "Een deelnemer neemt niet langer deel aan {{title}} op {{date}}",
"attendee_no_longer_attending": "Een deelnemer neemt niet langer deel aan uw gebeurtenis",
"attendee_no_longer_attending_subtitle": "{{name}} heeft geannuleerd. Dit betekent dat er een plaats is vrijgekomen voor dit tijdslot",
"create_event_on": "Gebeurtenis aanmaken op",
"default_app_link_title": "Stel een standaard app-link in",
"default_app_link_description": "Door een standaard app-link in te stellen kunnen alle nieuw gemaakte gebeurtenistypes de door u ingestelde app-link gebruiken.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Bekijk welke van uw gebeurtenistypen de meeste kliks en boekingen ontvangen",
"no_responses_yet": "Nog geen reacties",
"this_will_be_the_placeholder": "Dit wordt de plaatshouder",
"error_booking_event": "Er is een fout opgetreden bij het boeken van de gebeurtenis, vernieuw de pagina en probeer het opnieuw",
"timeslot_missing_title": "Geen tijdslot geselecteerd",
"timeslot_missing_description": "Selecteer een tijdslot om de gebeurtenis te boeken.",
"timeslot_missing_cta": "Tijdslot selecteren",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Minst geboekte leden",
"events_created": "Gemaakte gebeurtenissen",
"events_completed": "Voltooide gebeurtenissen",
"events_cancelled": "Geannuleerde gebeurtenissen",
"events_rescheduled": "Verplaatste gebeurtenissen",
"from_last_period": "van afgelopen periode",
"from_to_date_period": "Van: {{startDate}} Tot: {{endDate}}",
+1 -14
View File
@@ -10,10 +10,8 @@
"have_any_questions": "Har du spørsmål? Vi er her for å hjelpe.",
"reset_password_subject": "{{appName}}: Instruksjoner for tilbakestilling av passord",
"event_declined_subject": "Avslått: {{title}} kl. {{date}}",
"event_cancelled_subject": "Avbrutt: {{title}} kl. {{date}}",
"event_request_declined": "Din hendelsesforespørsel har blitt avvist",
"event_request_declined_recurring": "Din gjentagende hendelsesforespørsel har blitt avvist",
"event_request_cancelled": "Din planlagte hendelse ble kansellert",
"organizer": "Arrangør",
"need_to_reschedule_or_cancel": "Trenger du å velge ny tid eller kansellere?",
"cancellation_reason": "Årsak til kansellering (valgfritt)",
@@ -69,9 +67,7 @@
"your_meeting_has_been_booked": "Møtet ditt er booket",
"event_type_has_been_rescheduled_on_time_date": "Din {{title}} har blitt flyttet til {{date}}.",
"event_has_been_rescheduled": "Oppdatert – Hendelsen din har blitt endret",
"request_reschedule_subtitle": "{{organizer}} har kansellert bookingen og bedt deg om å velge et annet tidspunkt.",
"request_reschedule_title_organizer": "Du har bedt {{attendee}} om å endre tidspunkt",
"request_reschedule_subtitle_organizer": "Du har kansellert bookingen og {{attendee}} bør velge et nytt tidspunkt for bookingen.",
"rescheduled_event_type_subject": "Forespørsel om endring av tidspunkt sendt: {{eventType}} med {{name}} kl. {{date}}",
"requested_to_reschedule_subject_attendee": "Handling Påkrevd: Vennligst book en ny tid for {{eventType}} med {{name}}",
"hi_user_name": "Hei {{name}}",
@@ -289,7 +285,6 @@
"error_end_time_next_day": "Slutttiden kan ikke være lengre enn 24 timer",
"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": "Avbrutt",
"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",
@@ -298,7 +293,6 @@
"cancelling_event_recurring": "Hendelsen er en forekomst av en gjentakende hendelse.",
"cancelling_all_recurring": "Dette er alle gjenværende forekomster i den gjentakende hendelsen.",
"error_with_status_code_occured": "Det oppstod en feil med statuskoden {{status}}.",
"booking_already_cancelled": "Denne bookingen var allerede kansellert",
"booking_already_accepted_rejected": "Denne bookingen var allerede akseptert eller avvist",
"go_back_home": "Gå til hjem",
"or_go_back_home": "Eller gå tilbake til hjem",
@@ -312,7 +306,6 @@
"upcoming_bookings": "Så snart noen booker en tid hos deg vil den dukke opp her.",
"recurring_bookings": "Så snart noen booker et gjentakende møte med deg, vil det dukke opp her.",
"past_bookings": "Dine tidligere bookinger vil vises her.",
"cancelled_bookings": "Dine kansellerte bookinger vil vises her.",
"unconfirmed_bookings": "Dine ubekreftede bookinger vil vises her.",
"unconfirmed_bookings_tooltip": "Ubekreftede bookinger",
"on": "på",
@@ -352,7 +345,6 @@
"browse_api_documentation": "Se gjennom API-dokumentasjonen vår",
"leverage_our_api": "Bruk vår API for full kontroll og tilpasningsmuligheter.",
"create_webhook": "Opprett Webhook",
"booking_cancelled": "Booking kansellert",
"booking_rescheduled": "Booking Flyttet",
"booking_created": "Booking Opprettet",
"meeting_ended": "Møte Avsluttet",
@@ -364,8 +356,6 @@
"team_webhooks": "Team Webhooker",
"create_new_webhook_to_account": "Opprett en ny webhook til kontoen din",
"new_webhook": "Ny Webhook",
"receive_cal_meeting_data": "Motta {{appName}}-møtedata på en spesifisert URL, i sanntid, når en hendelse er planlagt eller kansellert.",
"receive_cal_event_meeting_data": "Motta {{appName}}-møtedata på en spesifisert URL, i sanntid, når denne hendelsen er planlagt eller kansellert.",
"responsive_fullscreen_iframe": "Responsiv fullskjerms iFrame",
"loading": "Laster inn...",
"deleting": "Sletter...",
@@ -956,14 +946,12 @@
"event_location": "Hendelsens sted",
"reschedule_optional": "Årsak til endring av tid (valgfritt)",
"reschedule_placeholder": "Fortell andre hvorfor du må endre tidspunktet",
"event_cancelled": "Denne hendelsen er avlyst",
"emailed_information_about_cancelled_event": "Vi sendte deg og de andre deltakerne en e-post for å informere.",
"this_input_will_shown_booking_this_event": "Dette inputfeltet vil vises når man booker denne hendelsen",
"meeting_url_in_conformation_email": "Møte-url ligger i e-postbekreftelsen",
"url_start_with_https": "URL må begynne med http:// eller https://",
"number_provided": "Telefonnummer vil bli oppgitt",
"before_event_trigger": "før hendelsen starter",
"event_cancelled_trigger": "når hendelsen er avlyst",
"new_event_trigger": "når en ny hendelse er booket",
"email_host_action": "send e-post til vert",
"sms_number_action": "send SMS til et bestemt nummer",
@@ -1323,7 +1311,6 @@
"your_team_disbanded_successfully": "Teamet ditt har blitt oppløst",
"error_creating_team": "Feil ved opprettelse av team",
"you": "Deg",
"send_email": "Send e-post",
"member_already_invited": "Medlemmet er allerede invitert",
"enter_email_or_username": "Skriv inn en e-post eller brukernavn",
"team_name_taken": "Dette navnet er allerede tatt",
@@ -1336,7 +1323,7 @@
"attendee_email_info": "Den som booker sin e-post",
"kbar_search_placeholder": "Skriv inn en kommando eller søk...",
"invalid_credential": "Å nei! Det ser ut til at tillatelsen er utløpt eller tilbakekalt. Vennligst installer på nytt.",
"reschedule_reason_success_page": "Årsak for endring av tidspunkt",
"reschedule_reason": "Årsak for endring av tidspunkt",
"choose_common_schedule_team_event": "Velg en felles timeplan",
"choose_common_schedule_team_event_description": "Aktiver dette hvis du vil bruke en felles tidsplan mellom verter. Når den er deaktivert, vil hver vert bookes basert på deres standard tidsplan.",
"reason": "Årsak",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Masz pytania? Jesteśmy tutaj, aby pomóc.",
"reset_password_subject": "{{appName}}: Instrukcje resetowania hasła",
"event_declined_subject": "Odrzucono: {{title}} w dniu {{date}}",
"event_cancelled_subject": "Anulowano: {{title}} w {{date}}",
"event_request_declined": "Twoja prośba o wydarzenie została odrzucona",
"event_request_declined_recurring": "Twoja prośba o wydarzenie cykliczne została odrzucona",
"event_request_cancelled": "Twoje zaplanowane wydarzenie zostało anulowane",
"organizer": "Organizator",
"need_to_reschedule_or_cancel": "Potrzebujesz zmienić harmonogram lub anulować?",
"cancellation_reason": "Powód anulowania (opcjonalnie)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Twoje spotkanie zostało zarezerwowane",
"event_type_has_been_rescheduled_on_time_date": "Twój {{title}} został przełożony na {{date}}.",
"event_has_been_rescheduled": "Zaktualizowano - Twoje wydarzenie zostało przełożone",
"request_reschedule_subtitle": "{{organizer}} anulował(a) rezerwację i prosi Cię o wybranie innego terminu.",
"request_reschedule_title_organizer": "{{attendee}} poproszono o zmianę harmonogramu",
"request_reschedule_subtitle_organizer": "Rezerwacja została przez Ciebie anulowana i {{attendee}} musi wybrać z Tobą nowy czas rezerwacji.",
"rescheduled_event_type_subject": "Wysłano prośbę o zmianę terminu: {{eventType}} o nazwie {{name}}, z {{date}}",
"requested_to_reschedule_subject_attendee": "Działanie wymagało zmiany harmonogramu: Zarezerwuj nową godzinę na wydarzenie {{eventType}} z {{name}}",
"hi_user_name": "Cześć {{name}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "Czas zakończenia nie może być dłuższy niż 24 godziny",
"back_to_bookings": "Powrót do rezerwacji",
"free_to_pick_another_event_type": "Możesz wybrać inne wydarzenie w dowolnym momencie.",
"cancelled": "Anulowane",
"cancellation_successful": "Anulowano pomyślnie",
"really_cancel_booking": "Czy na pewno anulować Twoją rezerwację?",
"cannot_cancel_booking": "Nie możesz anulować tej rezerwacji",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "Wydarzenie jest jednym z wystąpień wydarzenia cyklicznego.",
"cancelling_all_recurring": "Są to wszystkie pozostałe wystąpienia wydarzenia cyklicznego.",
"error_with_status_code_occured": "Wystąpił błąd z kodem statusu {{status}}.",
"booking_already_cancelled": "Ta rezerwacja została już anulowana",
"booking_already_accepted_rejected": "Ta rezerwacja została już zaakceptowana lub odrzucona",
"go_back_home": "Wróć do strony głównej",
"or_go_back_home": "Lub wróć do strony głównej",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Jak tylko ktoś zarezerwuje czas z Tobą, to pojawi się tutaj.",
"recurring_bookings": "Jak tylko ktoś zarezerwuje cykliczne spotkanie z Tobą, to pojawi się ono tutaj.",
"past_bookings": "Twoje zarchiwizowane rezerwacje pojawią się tutaj.",
"cancelled_bookings": "Twoje anulowane rezerwacje pojawią się tutaj.",
"unconfirmed_bookings": "Twoje niepotwierdzone rezerwacje pojawią się tutaj.",
"unconfirmed_bookings_tooltip": "Niepotwierdzone rezerwacje",
"on": "na",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Przeglądaj naszą dokumentację API",
"leverage_our_api": "Wykorzystaj nasze API dla pełnej kontroli i dopasowania do swoich potrzeb.",
"create_webhook": "Utwórz Webhook",
"booking_cancelled": "Rezerwacja anulowana",
"booking_rescheduled": "Rezerwacja Przełożona",
"recording_ready": "Link do pobrania nagrania gotowy",
"booking_created": "Rezerwacja Utworzona",
@@ -379,8 +371,6 @@
"team_webhooks": "Webhooki zespołu",
"create_new_webhook_to_account": "Utwórz nowy webhook do swojego konta",
"new_webhook": "Nowy Webhook",
"receive_cal_meeting_data": "Otrzymuj dane ze spotkania {{appName}} pod określonym adresem URL, w czasie rzeczywistym, gdy wydarzenie jest zaplanowane lub anulowane.",
"receive_cal_event_meeting_data": "Otrzymuj dane ze spotkania {{appName}} pod określonym adresem URL, w czasie rzeczywistym, gdy wydarzenie jest zaplanowane lub anulowane.",
"responsive_fullscreen_iframe": "Responsywny pełnoekranowy iframe",
"loading": "Wczytywanie...",
"deleting": "Usuwanie...",
@@ -1018,14 +1008,12 @@
"event_location": "Lokalizacja wydarzenia",
"reschedule_optional": "Powód przełożenia (opcjonalnie)",
"reschedule_placeholder": "Poinformuj innych o powodach przełożenia wydarzenia",
"event_cancelled": "To wydarzenie zostało anulowane",
"emailed_information_about_cancelled_event": "Wysłaliśmy wiadomość e-mail Tobie i innym uczestnikom, aby ich o tym poinformować.",
"this_input_will_shown_booking_this_event": "To wejście zostanie wyświetlone podczas rezerwacji tego wydarzenia",
"meeting_url_in_conformation_email": "Adres URL spotkania znajduje się w wiadomości e-mail z potwierdzeniem",
"url_start_with_https": "Adres URL musi zaczynać się od http:// lub https://",
"number_provided": "Numer telefonu zostanie podany.",
"before_event_trigger": "przed rozpoczęciem wydarzenia",
"event_cancelled_trigger": "gdy wydarzenie zostanie odwołane",
"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",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Twój zespół został rozwiązany.",
"error_creating_team": "Podczas tworzenia zespołu wystąpił błąd",
"you": "Ty",
"send_email": "Wyślij wiadomość e-mail",
"member_already_invited": "Członek został już zaproszony",
"enter_email_or_username": "Wprowadź adres e-mail lub nazwę użytkownika",
"team_name_taken": "Ta nazwa jest już zajęta",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "Adres e-mail osoby rezerwującej",
"kbar_search_placeholder": "Wpisz polecenie lub wyszukaj...",
"invalid_credential": "O nie! Wygląda na to, że uprawnienia wygasły lub zostały cofnięte. Zainstaluj aplikację ponownie.",
"reschedule_reason_success_page": "Powód zmiany terminu",
"reschedule_reason": "Powód zmiany terminu",
"choose_common_schedule_team_event": "Wybierz wspólny harmonogram",
"choose_common_schedule_team_event_description": "Włącz tę opcję, jeśli chcesz używać wspólnego harmonogramu gospodarzy. Jeśli ją wyłączysz, rezerwacje u każdego gospodarza będą dokonywane na podstawie jego domyślnego harmonogramu.",
"reason": "Powód",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Nie bierzesz już udziału w tym wydarzeniu",
"attendee_no_longer_attending_subject": "Uczestnik nie bierze już udziału w wydarzeniu {{title}} odbywającym się {{date}}",
"attendee_no_longer_attending": "Uczestnik nie bierze już udziału w Twoim wydarzeniu.",
"attendee_no_longer_attending_subtitle": "Użytkownik {{name}} anulował rezerwację. To znaczy, że zwolniło się miejsce w tym terminie",
"create_event_on": "Utwórz wydarzenie w kalendarzu",
"default_app_link_title": "Ustaw domyślny link do aplikacji",
"default_app_link_description": "Ustawienie domyślnego linku do aplikacji pozwala wszystkim nowo utworzonym typom wydarzeń na używanie ustawionego przez Ciebie linku do aplikacji.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Zobacz, które typy wydarzeń są najczęściej klikane i rezerwowane",
"no_responses_yet": "Nie ma jeszcze odpowiedzi",
"this_will_be_the_placeholder": "To będzie symbol zastępczy",
"error_booking_event": "Podczas rezerwacji wydarzenia wystąpił błąd, odśwież stronę i spróbuj ponownie.",
"timeslot_missing_title": "Nie wybrano przedziału czasowego",
"timeslot_missing_description": "Wybierz przedział czasowy, aby zarezerwować wydarzenie.",
"timeslot_missing_cta": "Wybierz przedział czasowy",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Najrzadziej rezerwowani członkowie",
"events_created": "Utworzone wydarzenia",
"events_completed": "Ukończone wydarzenia",
"events_cancelled": "Anulowane wydarzenia",
"events_rescheduled": "Przełożone wydarzenia",
"from_last_period": "od ostatniego okresu",
"from_to_date_period": "Od: {{startDate}} Do: {{endDate}}",
@@ -12,10 +12,8 @@
"have_any_questions": "Precisa de ajuda? Estamos aqui para ajudar.",
"reset_password_subject": "{{appName}}: Instruções para redefinir sua senha",
"event_declined_subject": "Recusado: {{title}} em {{date}}",
"event_cancelled_subject": "Cancelado: {{title}} em {{date}}",
"event_request_declined": "Sua solicitação de reunião foi recusada",
"event_request_declined_recurring": "Sua solicitação de evento recorrente foi recusada",
"event_request_cancelled": "Seu evento agendado foi cancelado",
"organizer": "Organizador",
"need_to_reschedule_or_cancel": "Precisa reagendar ou cancelar?",
"cancellation_reason": "Motivo do cancelamento",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "A sua reunião foi agendada",
"event_type_has_been_rescheduled_on_time_date": "Seu {{title}} foi remarcado para {{date}}.",
"event_has_been_rescheduled": "Atualização - O seu evento foi reagendado",
"request_reschedule_subtitle": "{{organizer}} cancelou a reserva e solicitou que você escolhesse outro horário.",
"request_reschedule_title_organizer": "Você solicitou que {{attendee}} reagendasse",
"request_reschedule_subtitle_organizer": "Você cancelou a reserva e {{attendee}} deve escolher outro horário de reserva com você.",
"rescheduled_event_type_subject": "Solicitação de reagendamento enviado: {{eventType}} com {{name}} às {{date}}",
"requested_to_reschedule_subject_attendee": "Ação de reagendamento necessária: reserve outro horário para {{eventType}} com {{name}}",
"hi_user_name": "Olá {{name}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "O horário de término não pode ser maior do que 24 horas",
"back_to_bookings": "Voltar às Reservas",
"free_to_pick_another_event_type": "Sinta-se à vontade para escolher outro evento a qualquer hora.",
"cancelled": "Cancelado",
"cancellation_successful": "Cancelado com Sucesso",
"really_cancel_booking": "Deseja realmente cancelar a sua reserva?",
"cannot_cancel_booking": "Você não pode cancelar esta reserva",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "O evento é uma instância de um evento recorrente.",
"cancelling_all_recurring": "Estas são todas as instâncias restantes no evento recorrente.",
"error_with_status_code_occured": "Ocorreu um erro com o status code {{status}}.",
"booking_already_cancelled": "Esta reserva já foi cancelada",
"booking_already_accepted_rejected": "Esta reserva já foi aceita ou recusada",
"go_back_home": "Voltar à Página Inicial",
"or_go_back_home": "Ou volte à página inicial",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Assim que alguém reservar uma hora, ela aparecerá aqui.",
"recurring_bookings": "Assim que alguém reservar uma reunião recorrente com você, essa pessoa aparecerá aqui.",
"past_bookings": "As suas reservas anteriores aparecerão aqui.",
"cancelled_bookings": "As suas reservas canceladas aparecerão aqui.",
"unconfirmed_bookings": "Suas reservas não confirmadas aparecerão aqui.",
"unconfirmed_bookings_tooltip": "Reservas não confirmadas",
"on": "em",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Consulte a nossa documentação da API",
"leverage_our_api": "Utilize nossa API para controle e personalização completa.",
"create_webhook": "Criar Webhook",
"booking_cancelled": "Reserva Cancelada",
"booking_rescheduled": "Reserva Reagendada",
"recording_ready": "Link para download de gravação pronto",
"booking_created": "Reserva Criada",
@@ -379,8 +371,6 @@
"team_webhooks": "Webhooks da equipe",
"create_new_webhook_to_account": "Criar um webhook para sua conta",
"new_webhook": "Novo Webhook",
"receive_cal_meeting_data": "Receba dados da reunião {{appName}} em uma, URL especificada, em tempo real, quando um evento for agendado ou cancelado.",
"receive_cal_event_meeting_data": "Receba em tempo real dados da reunião do {{appName}} em um URL especificada quando este evento for agendado ou cancelado.",
"responsive_fullscreen_iframe": "Iframe responsivo de tela inteira",
"loading": "Carregando...",
"deleting": "Excluindo...",
@@ -1018,14 +1008,12 @@
"event_location": "Local do evento",
"reschedule_optional": "Motivo de reagendamento (opcional)",
"reschedule_placeholder": "Diga por que você precisa reagendar",
"event_cancelled": "Este evento foi cancelado",
"emailed_information_about_cancelled_event": "Avisamos por e-mail aos outros participantes e a você.",
"this_input_will_shown_booking_this_event": "Este campo será mostrado na reserva deste evento",
"meeting_url_in_conformation_email": "O URL da reunião está no e-mail de confirmação",
"url_start_with_https": "O URL precisa começar com http:// ou https://",
"number_provided": "O número de telefone será fornecido",
"before_event_trigger": "antes do início do evento",
"event_cancelled_trigger": "quando o evento é cancelado",
"new_event_trigger": "quando um novo evento for reservado",
"email_host_action": "enviar e-mail para o host",
"email_attendee_action": "enviar e-mail aos participantes",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Sua equipe foi desfeita com êxito",
"error_creating_team": "Erro ao criar equipe",
"you": "Você",
"send_email": "Enviar e-mail",
"member_already_invited": "O membro já foi convidado",
"enter_email_or_username": "Insira um e-mail ou nome de usuário",
"team_name_taken": "Este nome já está em uso",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "O e-mail da pessoa que fez a reserva",
"kbar_search_placeholder": "Digite um comando ou procure...",
"invalid_credential": "Ah, não! Parece que a permissão expirou ou foi revogada. Reinstale novamente.",
"reschedule_reason_success_page": "Motivo de reagendamento",
"reschedule_reason": "Motivo de reagendamento",
"choose_common_schedule_team_event": "Escolha uma agenda compartilhada",
"choose_common_schedule_team_event_description": "Ative esta opção se você quiser usar uma agenda compartilhada entre os hosts. Ao desativar esta opção, cada host será reservado conforme seu horário padrão.",
"reason": "Motivo",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Você não está mais participando deste evento",
"attendee_no_longer_attending_subject": "Um participante não está mais participando de {{title}} às {{date}}",
"attendee_no_longer_attending": "Um participante não está mais participando do seu evento",
"attendee_no_longer_attending_subtitle": "{{name}} cancelou. Quer dizer que um assento foi liberado para este período de tempo",
"create_event_on": "Criar evento em",
"default_app_link_title": "Defina um link padrão para o app",
"default_app_link_description": "Definir um link padrão para o app permite que todos os tipos de evento recém-criados usem o link definido para o app.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Veja quais tipos de eventos estão recebendo a maioria dos cliques e reservas",
"no_responses_yet": "Sem respostas por enquanto",
"this_will_be_the_placeholder": "Este será o espaço reservado",
"error_booking_event": "Ocorreu um erro ao reservar o evento, atualize a página e tente novamente",
"timeslot_missing_title": "Nenhuma alocação de tempo selecionada",
"timeslot_missing_description": "Selecione uma alocação de tempo para reservar o evento.",
"timeslot_missing_cta": "Selecione a alocação de tempo",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Membros com menos reservas",
"events_created": "Eventos criados",
"events_completed": "Eventos concluídos",
"events_cancelled": "Eventos cancelados",
"events_rescheduled": "Eventos reagendados",
"from_last_period": "do último período",
"from_to_date_period": "De: {{startDate}} Para: {{endDate}}",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Tem perguntas? Estamos disponíveis para ajudar.",
"reset_password_subject": "{{appName}}: Instruções de redefinição da senha",
"event_declined_subject": "Declinado: {{title}} em {{date}}",
"event_cancelled_subject": "Cancelado: {{title}} em {{date}}",
"event_request_declined": "O seu pedido de evento foi declinado",
"event_request_declined_recurring": "O seu pedido de evento recorrente foi recusado",
"event_request_cancelled": "O seu evento agendado foi cancelado",
"organizer": "Organizador",
"need_to_reschedule_or_cancel": "Precisa reagendar ou cancelar?",
"cancellation_reason": "Motivo do cancelamento",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "A sua reunião foi reservada",
"event_type_has_been_rescheduled_on_time_date": "Seu {{title}} foi remarcado para {{date}}.",
"event_has_been_rescheduled": "O seu evento foi reagendado.",
"request_reschedule_subtitle": "{{organizer}} cancelou a reserva e pediu para que escolhesse outro horário.",
"request_reschedule_title_organizer": "Solicitou um reagendamento a {{attendee}}",
"request_reschedule_subtitle_organizer": "Cancelou a reserva e {{attendee}} deve escolher um novo horário para a reserva consigo.",
"rescheduled_event_type_subject": "Pedido de reagendamento enviado: {{eventType}} com {{name}} em {{date}}",
"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}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "A hora de fim não pode ser superior a 24 horas",
"back_to_bookings": "Voltar às Reservas",
"free_to_pick_another_event_type": "Sinta-se à vontade para escolher outro evento a qualquer hora.",
"cancelled": "Canceladas",
"cancellation_successful": "Cancelado com Sucesso",
"really_cancel_booking": "Deseja realmente cancelar a sua reserva?",
"cannot_cancel_booking": "Não pode cancelar esta reserva",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "O evento é uma instância de um evento recorrente.",
"cancelling_all_recurring": "Estas são todas as restantes instâncias do evento recorrente.",
"error_with_status_code_occured": "Ocorreu um erro com o código de estado {{status}}",
"booking_already_cancelled": "Esta reserva já foi cancelada",
"booking_already_accepted_rejected": "Esta reserva já foi aceite ou rejeitada",
"go_back_home": "Voltar à Página Inicial",
"or_go_back_home": "Ou volte à página inicial",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Assim que alguém reservar uma hora, ela aparecerá aqui.",
"recurring_bookings": "Assim que alguém reservar uma reunião recorrente, será mostrada aqui.",
"past_bookings": "As suas reservas anteriores aparecerão aqui.",
"cancelled_bookings": "As suas reservas canceladas aparecerão aqui.",
"unconfirmed_bookings": "As suas marcações não confirmadas irão aparecer aqui.",
"unconfirmed_bookings_tooltip": "Reservas não confirmadas",
"on": "em",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Consulte a nossa documentação da API",
"leverage_our_api": "Tire partido da nossa API para controlo e personalização total.",
"create_webhook": "Criar Webhook",
"booking_cancelled": "Reserva Cancelada",
"booking_rescheduled": "Reserva Reagendada",
"recording_ready": "Ligação de transferência da gravação pronta",
"booking_created": "Reserva Criada",
@@ -379,8 +371,6 @@
"team_webhooks": "Webhooks da equipa",
"create_new_webhook_to_account": "Criar um webhook na sua conta",
"new_webhook": "Novo Webhook",
"receive_cal_meeting_data": "Receba dados da reunião {{appName}} em uma, URL especificada, em tempo real, quando um evento for programado ou cancelado.",
"receive_cal_event_meeting_data": "Receba dados da reunião {{appName}} num URL especificado, em tempo real, assim que o evento for agendado ou cancelado.",
"responsive_fullscreen_iframe": "Iframe responsivo de ecrã inteiro",
"loading": "A carregar...",
"deleting": "A eliminar...",
@@ -1018,14 +1008,12 @@
"event_location": "Localização do evento",
"reschedule_optional": "Razão do reagendamento (opcional)",
"reschedule_placeholder": "Informe os restantes para que saibam porque precisa de reagendar",
"event_cancelled": "Este evento foi cancelado",
"emailed_information_about_cancelled_event": "Enviámos um email com o aviso para si e para os restantes participantes.",
"this_input_will_shown_booking_this_event": "Este campo será mostrado na reserva deste evento",
"meeting_url_in_conformation_email": "O URL da reunião está no email de confirmação",
"url_start_with_https": "O URL tem de começar por http:// ou https://",
"number_provided": "Será fornecido um número de telefone",
"before_event_trigger": "antes do evento iniciar",
"event_cancelled_trigger": "quando o evento for cancelado",
"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",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "A sua equipa foi dissolvida com sucesso",
"error_creating_team": "Erro ao criar a equipa",
"you": "Você",
"send_email": "Enviar e-mail",
"member_already_invited": "O membro já foi convidado",
"enter_email_or_username": "Especifique um e-mail ou nome de utilizador",
"team_name_taken": "Este nome já está a ser utilizado",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "O e-mail do responsável pela reserva",
"kbar_search_placeholder": "Digite um comando ou pesquise...",
"invalid_credential": "Oh não! Parece que a permissão expirou ou foi revogada. Por favor, reinstale novamente.",
"reschedule_reason_success_page": "Motivo do reagendamento",
"reschedule_reason": "Motivo do reagendamento",
"choose_common_schedule_team_event": "Escolha uma agenda comum",
"choose_common_schedule_team_event_description": "Ative esta opção se quiser utilizar uma agenda comum entre anfitriões. Quando desativada, cada anfitrião será reservado com base na respetiva agenda pré-definida.",
"reason": "Motivo",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Você já não vai estar presente neste evento",
"attendee_no_longer_attending_subject": "Um participante não irá estar presente em {{title}} em {{date}}",
"attendee_no_longer_attending": "Um participante já não irá participar no seu evento",
"attendee_no_longer_attending_subtitle": "{{name}} cancelou. Isto significa que existe uma nova disponibilidade para este horário",
"create_event_on": "Criar evento em",
"default_app_link_title": "Definir uma ligação predefinida de aplicação",
"default_app_link_description": "Ao definir uma ligação predefinida da aplicação, permite que todos os tipos de eventos recém-criados utilizem a ligação de aplicação que definiu.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Veja quais os tipos de eventos que estão a receber mais cliques e reservas",
"no_responses_yet": "Ainda sem respostas",
"this_will_be_the_placeholder": "Isto será o marcador de posição",
"error_booking_event": "Ocorreu um erro ao reservar o evento. Atualize a página e tente novamente",
"timeslot_missing_title": "Nenhuma janela horária selecionada",
"timeslot_missing_description": "Selecione uma janela horária para reservar o evento.",
"timeslot_missing_cta": "Selecionar janela horária",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Membros com menos reservas",
"events_created": "Eventos criados",
"events_completed": "Eventos concluídos",
"events_cancelled": "Eventos cancelados",
"events_rescheduled": "Eventos reagendados",
"from_last_period": "do último período",
"from_to_date_period": "De: {{startDate}} A: {{endDate}}",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Aveți întrebări? Suntem aici pentru a vă ajuta.",
"reset_password_subject": "{{appName}}: instrucțiuni de resetare a parolei",
"event_declined_subject": "Refuzat: {{title}} în {{date}}",
"event_cancelled_subject": "Anulat: {{title}} în {{date}}",
"event_request_declined": "Solicitarea pentru eveniment a fost refuzată",
"event_request_declined_recurring": "Solicitarea dvs. pentru evenimentul recurent a fost refuzată",
"event_request_cancelled": "Evenimentul programat a fost anulat",
"organizer": "Organizator",
"need_to_reschedule_or_cancel": "Trebuie să reprogramați sau să anulați?",
"cancellation_reason": "Motivul anulării (opțional)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Întâlnirea dvs. a fost programată",
"event_type_has_been_rescheduled_on_time_date": "{{title}} dvs. a fost reprogramat la {{date}}.",
"event_has_been_rescheduled": "Evenimentul dvs. a fost reprogramat.",
"request_reschedule_subtitle": "{{organizer}} a anulat rezervarea și v-a cerut să alegeți o altă dată.",
"request_reschedule_title_organizer": "I-ați cerut lui {{attendee}} să reprogrameze",
"request_reschedule_subtitle_organizer": "Ați anulat rezervarea și {{attendee}} trebuie să aleagă o nouă dată pentru rezervarea cu dvs.",
"rescheduled_event_type_subject": "Cerere de reprogramare trimisă: {{eventType}} cu {{name}} în {{date}}",
"requested_to_reschedule_subject_attendee": "Acțiunea necesită reprogramare: rezervați o nouă dată pentru {{eventType}} cu {{name}}",
"hi_user_name": "Salut {{name}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "Ora de încheiere nu poate depăși 24 de ore",
"back_to_bookings": "Înapoi la rezervări",
"free_to_pick_another_event_type": "Puteți alege un alt eveniment oricând.",
"cancelled": "Anulat",
"cancellation_successful": "Anulare cu succes",
"really_cancel_booking": "Chiar doriți să anulați rezervarea?",
"cannot_cancel_booking": "Nu puteți anula această rezervare",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "Evenimentul este un exemplu de eveniment recurent.",
"cancelling_all_recurring": "Toate acestea sunt exemple rămase pentru evenimentul recurent.",
"error_with_status_code_occured": "A apărut o eroare la codul de stare {{status}}.",
"booking_already_cancelled": "Această rezervare a fost deja anulată",
"booking_already_accepted_rejected": "Această rezervare a fost deja acceptată sau refuzată",
"go_back_home": "Întoarce-te la prima pagină",
"or_go_back_home": "Sau întoarce-te la prima pagină",
@@ -326,7 +320,6 @@
"upcoming_bookings": "De îndată ce cineva rezervă o dată cu tine, va apărea aici.",
"recurring_bookings": "De îndată ce o persoană rezervă o întâlnire recurentă cu dvs., întâlnirea va apărea aici.",
"past_bookings": "Rezervările anterioare vor apărea aici.",
"cancelled_bookings": "Rezervările tale anulate vor apărea aici.",
"unconfirmed_bookings": "Rezervările dvs. neconfirmate vor apărea aici.",
"unconfirmed_bookings_tooltip": "Rezervări neconfirmate",
"on": "pe",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Navigați documentația noastră API",
"leverage_our_api": "Folosiți API-ul nostru pentru control complet și personalizare.",
"create_webhook": "Creează Webhook",
"booking_cancelled": "Rezervare anulată",
"booking_rescheduled": "Rezervare reprogramată",
"recording_ready": "Link de descărcare înregistrare pregătit",
"booking_created": "Rezervare creată",
@@ -379,8 +371,6 @@
"team_webhooks": "Webhooks de echipă",
"create_new_webhook_to_account": "Creați un nou webhook pentru contul dvs",
"new_webhook": "Webhook nou",
"receive_cal_meeting_data": "Primiți date {{appName}} ședință la un URL specificat, în timp real, atunci când un eveniment este programat sau anulat.",
"receive_cal_event_meeting_data": "Primiți date despre ședința {{appName}} la un URL specificat, în timp real, atunci când acest eveniment este programat sau anulat.",
"responsive_fullscreen_iframe": "Iframe ecran complet Responsive",
"loading": "Încărcare...",
"deleting": "În curs de ștergere...",
@@ -1018,14 +1008,12 @@
"event_location": "Locul evenimentului",
"reschedule_optional": "Motiv pentru reprogramare (opțional)",
"reschedule_placeholder": "Informați-i pe ceilalți de ce trebuie să reprogramați",
"event_cancelled": "Acest eveniment este anulat",
"emailed_information_about_cancelled_event": "V-am trimis un e-mail de informare dvs. și celorlalți participanți.",
"this_input_will_shown_booking_this_event": "Datele introduse vor fi afișate la rezervarea acestui eveniment",
"meeting_url_in_conformation_email": "Adresa URL a întâlnirii este în e-mailul de confirmare",
"url_start_with_https": "Adresa URL trebuie să înceapă cu http:// or https://",
"number_provided": "Numărul de telefon va fi furnizat",
"before_event_trigger": "înainte de începerea evenimentului",
"event_cancelled_trigger": "când se anulează evenimentul",
"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 către participanți",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Echipa dvs. a fost desființată cu succes",
"error_creating_team": "Eroare la crearea echipei",
"you": "Dvs.",
"send_email": "Trimiteți un e-mail",
"member_already_invited": "Membrul a fost deja invitat",
"enter_email_or_username": "Introduceți un e-mail sau un nume de utilizator",
"team_name_taken": "Acest nume este folosit deja",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "E-mailul persoanei care efectuează rezervarea",
"kbar_search_placeholder": "Scrie o comandă sau caută...",
"invalid_credential": "Vai, nu! Se pare că permisiunea a expirat sau a fost revocată. Reinstalați din nou.",
"reschedule_reason_success_page": "Motiv reprogramare",
"reschedule_reason": "Motiv reprogramare",
"choose_common_schedule_team_event": "Alegeți un program comun",
"choose_common_schedule_team_event_description": "Activați această opțiune dacă doriți să folosiți un program comun între gazde. Atunci când este dezactivată, fiecare gazdă va fi rezervată în funcție de programul său implicit.",
"reason": "Motiv",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Nu mai participați la acest eveniment",
"attendee_no_longer_attending_subject": "Un participant nu mai ia parte la {{title}} de la {{date}}",
"attendee_no_longer_attending": "Un participant nu mai ia parte la evenimentul dvs.",
"attendee_no_longer_attending_subtitle": "{{name}} a anulat. Acest lucru înseamnă că s-a eliberat un loc pentru acest interval de timp",
"create_event_on": "Creați eveniment pe",
"default_app_link_title": "Setați un link implicit pentru aplicații",
"default_app_link_description": "Setarea unui link implicit pentru aplicații permite tuturor tipurilor de evenimente nou-create să utilizeze linkul pentru aplicații pe care l-ați setat.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Vedeți care dintre tipurile de evenimente primesc cele mai multe clicuri și rezervări",
"no_responses_yet": "Nu există încă răspunsuri",
"this_will_be_the_placeholder": "Acesta va fi substituentul",
"error_booking_event": "A survenit o eroare la rezervarea evenimentului. Reîmprospătați pagina și încercați din nou",
"timeslot_missing_title": "Nu există niciun interval de timp selectat",
"timeslot_missing_description": "Selectați un interval de timp pentru a rezerva evenimentul.",
"timeslot_missing_cta": "Selectare interval de timp",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Membrii cu cele mai puține rezervări",
"events_created": "Evenimente create",
"events_completed": "Evenimente finalizate",
"events_cancelled": "Evenimente anulate",
"events_rescheduled": "Evenimente reprogramate",
"from_last_period": "din ultima perioadă",
"from_to_date_period": "De la: {{startDate}} La: {{endDate}}",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Есть вопросы? Мы здесь, чтобы помочь.",
"reset_password_subject": "{{appName}}: Инструкция по сбросу пароля",
"event_declined_subject": "Отклонено: {{title}} {{date}}",
"event_cancelled_subject": "Отменено: {{title}} {{date}}",
"event_request_declined": "Ваш запрос на встречу отклонен",
"event_request_declined_recurring": "Ваш запрос на повторяющееся событие отклонен",
"event_request_cancelled": "Ваша запланированная встреча была отменена",
"organizer": "Организатор",
"need_to_reschedule_or_cancel": "Хотите перенести или отменить?",
"cancellation_reason": "Причина отмены (необязательно)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Ваша встреча была забронирована",
"event_type_has_been_rescheduled_on_time_date": "Ваше {{title}} было перенесено на {{date}}.",
"event_has_been_rescheduled": "Ваше событие было перенесено.",
"request_reschedule_subtitle": "{{organizer}} отменил(-а) бронирование и попросил(-а) вас выбрать другое время.",
"request_reschedule_title_organizer": "Вы запросили у {{attendee}} изменение расписания",
"request_reschedule_subtitle_organizer": "Вы отменили бронирование, и {{attendee}} теперь должен(-на) выбрать новое время бронирования.",
"rescheduled_event_type_subject": "Запрос на перенос отправлен: {{eventType}} с {{name}}, {{date}}",
"requested_to_reschedule_subject_attendee": "Требуется перенести бронирование: забронируйте новое время для {{eventType}} с {{name}}",
"hi_user_name": "Привет {{name}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "Время окончания не может позже 24 часов",
"back_to_bookings": "Вернуться к списку бронирований",
"free_to_pick_another_event_type": "Вы можете выбрать любое другое событие.",
"cancelled": "Отменено",
"cancellation_successful": "Отмена прошла успешно",
"really_cancel_booking": "Вы действительно хотите отменить бронирование?",
"cannot_cancel_booking": "Вы не можете отменить это бронирование",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "Данное событие — один из экземпляров повторяющегося события.",
"cancelling_all_recurring": "Это все оставшиеся экземпляры повторяющегося события.",
"error_with_status_code_occured": "Произошла ошибка с кодом состояния {{status}}.",
"booking_already_cancelled": "Это бронирование уже отменено",
"booking_already_accepted_rejected": "Это бронирование уже принято или отклонено",
"go_back_home": "Вернуться домой",
"or_go_back_home": "Или вернитесь домой",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Как только кто-то забронирует встречу с вами она будет отображена здесь.",
"recurring_bookings": "Как только кто-то забронирует повторяющуюся встречу с вами, она будет отображена здесь.",
"past_bookings": "Здесь появятся ваши прошлые бронирования.",
"cancelled_bookings": "Здесь появятся ваши отменённые бронирования.",
"unconfirmed_bookings": "Здесь можно увидеть бронирования, которые вы еще не подтвердили.",
"unconfirmed_bookings_tooltip": "Неподтвержденные бронирования",
"on": "на",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Посмотрите нашу документацию API",
"leverage_our_api": "Используйте наш API для возможности полного управления и настройки.",
"create_webhook": "Создать веб-хук",
"booking_cancelled": "Бронирование отменено",
"booking_rescheduled": "Бронирование изменено",
"recording_ready": "Готова ссылка для загрузки записи",
"booking_created": "Бронирование создано",
@@ -379,8 +371,6 @@
"team_webhooks": "Командные вебхуки",
"create_new_webhook_to_account": "Создайте новый вебхук для вашей учетной записи",
"new_webhook": "Новый веб-хук",
"receive_cal_meeting_data": "Получайте данные встреч от {{appName}} по указанному URL в режиме реального времени при создании или отмене встреч.",
"receive_cal_event_meeting_data": "В реальном времени получайте по указанному URL-адресу данные встречи из {{appName}}, когда происходит бронирование или отмена события.",
"responsive_fullscreen_iframe": "Адаптивный полноэкранный iframe",
"loading": "Загрузка...",
"deleting": "Выполняется удаление...",
@@ -1018,14 +1008,12 @@
"event_location": "Местоположение события",
"reschedule_optional": "Причина переноса (дополнительно)",
"reschedule_placeholder": "Расскажите другим, почему вам нужно изменить расписание",
"event_cancelled": "Это событие отменено",
"emailed_information_about_cancelled_event": "Мы сообщили об этом вам и другим участникам по электронной почте.",
"this_input_will_shown_booking_this_event": "Этот вопрос будет показан при бронировании события по этому шаблону",
"meeting_url_in_conformation_email": "Ссылка на встречу находится в письме с подтверждением",
"url_start_with_https": "URL-адрес должен начинаться с http:// или https://",
"number_provided": "Будет указан номер телефона",
"before_event_trigger": "до начала события",
"event_cancelled_trigger": "когда событие отменено",
"new_event_trigger": "когда будет забронировано новое событие",
"email_host_action": "отправить письмо организатору",
"email_attendee_action": "отправить письмо участникам",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Ваша команда расформирована",
"error_creating_team": "Ошибка при создании команды",
"you": "Вы",
"send_email": "Отправить письмо",
"member_already_invited": "Участник уже приглашен",
"enter_email_or_username": "Введите адрес электронной почты или имя пользователя",
"team_name_taken": "Это название уже занято",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "Электронная почта участника, на которого оформляется бронирование",
"kbar_search_placeholder": "Введите команду или начните поиск...",
"invalid_credential": "Похоже, разрешение истекло или было отозвано. Необходима переустановка.",
"reschedule_reason_success_page": "Причина переноса",
"reschedule_reason": "Причина переноса",
"choose_common_schedule_team_event": "Выберите общее расписание",
"choose_common_schedule_team_event_description": "Позволяет организаторам использовать общее расписание. Если общее расписание отключено, то для каждого организатора бронирование выполняется в соответствии с его индивидуальным расписанием по умолчанию.",
"reason": "Причина",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Вы отказались от посещения этого мероприятия",
"attendee_no_longer_attending_subject": "Участник отказался от посещения мероприятия {{title}} в {{date}}",
"attendee_no_longer_attending": "Участник отказался от посещения вашего мероприятия",
"attendee_no_longer_attending_subtitle": "{{name}} отказался(-ась) от посещения мероприятия. Этот промежуток времени снова свободен",
"create_event_on": "Создать событие в календаре",
"default_app_link_title": "Установить ссылку на приложение по умолчанию",
"default_app_link_description": "Если установить ссылку на приложение по умолчанию, она будет присваиваться всем вновь создаваемым событиям.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Узнайте, какие типы событий собирают больше всего кликов и бронирований",
"no_responses_yet": "Ответов пока нет",
"this_will_be_the_placeholder": "Это текст-заполнитель",
"error_booking_event": "При бронировании события произошла ошибка. Обновите страницу и повторите попытку",
"timeslot_missing_title": "Не выбран интервал времени",
"timeslot_missing_description": "Чтобы забронировать событие, выберите интервал времени.",
"timeslot_missing_cta": "Выбрать интервал времени",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Участники с наименьшим числом бронирований",
"events_created": "Созданные события",
"events_completed": "Завершенные события",
"events_cancelled": "Отмененные события",
"events_rescheduled": "Перенесенные события",
"from_last_period": "с последнего периода",
"from_to_date_period": "С: {{startDate}} По: {{endDate}}",
+1 -18
View File
@@ -14,16 +14,13 @@
"verify_email_subject": "{{appName}}: Potvrdi svoj nalog",
"check_your_email": "Proveri imejl",
"verify_email_page_body": "Poslali smo imejl na {{email}}. Važno je da potvrdite svoju imejl adresu da biste obezbedili najbolju isporuku imejla i kalendara od aplikacije {{appName}}.",
"verify_email_banner_body": "Potvrdite svoju imejl adresu da biste obezbedili najbolju isporuku imejla i kalendara od aplikacije {{appName}}.",
"verify_email_email_header": "Potvrdite svoju imejl adresu",
"verify_email_email_button": "Potvrdi imejl",
"verify_email_email_body": "Potvrdite svoju imejl adresu klikom na dugme ispod.",
"email_sent": "Imejl je uspešno poslat",
"event_declined_subject": "Odbijeno: {{title}} datuma {{date}}",
"event_cancelled_subject": "Otkazano: {{title}} datuma {{date}}",
"event_request_declined": "Vaš zahtev za događaj je odbijen",
"event_request_declined_recurring": "Vaš zahtev za ponavljajući događaj je odbijen",
"event_request_cancelled": "Vaš zakazani događaj je odbijen",
"organizer": "Organizator",
"need_to_reschedule_or_cancel": "Morate da odložite ili otkažete?",
"cancellation_reason": "Razlog otkazivanja (opciono)",
@@ -85,9 +82,7 @@
"your_meeting_has_been_booked": "Sastanak je zakazan",
"event_type_has_been_rescheduled_on_time_date": "Ваш {{титле}} је померен за {{дате}}.",
"event_has_been_rescheduled": "Ažurirano - Vaš dogadjaj je odložen",
"request_reschedule_subtitle": "{{organizer}} je otkazao/la rezervaciju i tražio/la je da odaberete drugo vreme.",
"request_reschedule_title_organizer": "Zatražili ste da {{attendee}} promeni vreme rezervacije",
"request_reschedule_subtitle_organizer": "Otkazali ste rezervaciju i {{attendee}} treba da odabere novo vreme rezervacije sa vama.",
"rescheduled_event_type_subject": "Odloženo: {{eventType}} sa {{name}} datuma {{date}}",
"requested_to_reschedule_subject_attendee": "Promena vremena zahteva radnju: zakažite novo vreme za {{eventType}} sa {{name}}",
"hi_user_name": "Zdravo {{name}}",
@@ -325,7 +320,6 @@
"error_end_time_next_day": "Krajnje vreme ne može biti veće od 24 sata",
"back_to_bookings": "Nazad na rezervacije",
"free_to_pick_another_event_type": "Slobodno izaberite drugi dogadjaj u bilo kom trenutku.",
"cancelled": "Otkazano",
"cancellation_successful": "Otkazivanje uspešno",
"really_cancel_booking": "Zaista želite da otkažete rezervaciju?",
"cannot_cancel_booking": "Ne možete otkazati ovu rezervaciju",
@@ -334,7 +328,6 @@
"cancelling_event_recurring": "Događaj je jedna instanca ponavljajućeg događaja.",
"cancelling_all_recurring": "Ovo su sve preostale instance u ponavljajućem događaju.",
"error_with_status_code_occured": "Došlo je do greške sa kodom statusa {{status}}.",
"booking_already_cancelled": "Ova rezervacija je već otkazana",
"booking_already_accepted_rejected": "Ova rezervacija je već prihvaćena ili odbijena",
"go_back_home": "Idite nazad na početnu stranicu",
"or_go_back_home": "Ili idite nazad na početnu stranicu",
@@ -348,7 +341,6 @@
"upcoming_bookings": "Čim neko rezerviše termin sa vama to će se pokazati ovde.",
"recurring_bookings": "Čim neko zakaže ponavljajući sastanak sa vama, to će se pokazati ovde.",
"past_bookings": "Vaše prethodne rezervacije će se pojaviti ovde.",
"cancelled_bookings": "Vaše otkazane rezervacije će se pokazati ovde.",
"unconfirmed_bookings": "Vaše nepotvrđene rezervacije će se pokazati ovde.",
"unconfirmed_bookings_tooltip": "Nepotvrđene rezervacije",
"on": "u",
@@ -389,7 +381,6 @@
"browse_api_documentation": "Pregledajte našu API dokumentaciju",
"leverage_our_api": "Iskoristite naš API za punu kontrolu i prilagodljivost.",
"create_webhook": "Napravite Webhook",
"booking_cancelled": "Rezervacija Otkazana",
"booking_rescheduled": "Rezervacija Odložena",
"recording_ready": "Link za preuzimanje snimka je spreman",
"booking_created": "Rezervacija Napravljena",
@@ -404,8 +395,6 @@
"team_webhooks": "Timski Webhooks",
"create_new_webhook_to_account": "Napravite novi webhook za vaš nalog",
"new_webhook": "Novi Webhook",
"receive_cal_meeting_data": "Primite podatke o {{appName}} sastancima na odredjenom URL, istovremeno kad je dogadjaj rezervisan ili otkazan.",
"receive_cal_event_meeting_data": "Primite podatke o {{appName}} sastancima na određenoj URL adresi istovremeno sa rezervacijom ili otkazivanjem ovog događaja.",
"responsive_fullscreen_iframe": "Prilagodljiv iframe preko celog ekrana",
"loading": "Učitavanje...",
"deleting": "Brisanje...",
@@ -1043,14 +1032,12 @@
"event_location": "Mesto događaja",
"reschedule_optional": "Razlog za zakazivanje (opciono)",
"reschedule_placeholder": "Obavestite druge zašto je potrebno zakazati drugi datum",
"event_cancelled": "Ovaj događaj je otkazan",
"emailed_information_about_cancelled_event": "Poslali smo imejl vama i drugim polaznicima kao obaveštenje.",
"this_input_will_shown_booking_this_event": "Ovaj unos će biti prikazan kad se rezerviše ovaj događaj",
"meeting_url_in_conformation_email": "Url za sastanak je u imejlu za potvrdu",
"url_start_with_https": "Potrebno je URL da počinje sa http:// or https://",
"number_provided": "Broj telefona će biti dostavljen",
"before_event_trigger": "pre početka događaja",
"event_cancelled_trigger": "kada je događaj otkazan",
"new_event_trigger": "kada je zakazan novi događaj",
"email_host_action": "pošalji imejl domaćinu",
"email_attendee_action": "pošalji imejl polaznicima",
@@ -1441,7 +1428,6 @@
"your_team_disbanded_successfully": "Vaš tim je uspešno rasformiran",
"error_creating_team": "Greška prilikom kreiranja tima",
"you": "Vi",
"send_email": "Pošaljite imejl",
"member_already_invited": "Član je već pozvan",
"enter_email_or_username": "Unesite imejl ili korisničko ime",
"team_name_taken": "Ime je zauzeto",
@@ -1454,7 +1440,7 @@
"attendee_email_info": "Imejl osobe koja rezerviše",
"kbar_search_placeholder": "Unesite komandu ili pretražite...",
"invalid_credential": "O, ne! Izgleda da je dozvola istekla ili je povučena. Instalirajte ponovo.",
"reschedule_reason_success_page": "Razlog za promenu rasporeda",
"reschedule_reason": "Razlog za promenu rasporeda",
"choose_common_schedule_team_event": "Izaberite zajednički raspored",
"choose_common_schedule_team_event_description": "Omogućite to ako želite da koristite zajednički raspored između domaćina. Kada je onemogućen, svaki domaćin može rezervisati na osnovu svog podrazumevanog rasporeda.",
"reason": "Razlog",
@@ -1633,7 +1619,6 @@
"no_longer_attending": "Više ne pohađate ovaj događaj",
"attendee_no_longer_attending_subject": "Polaznik više ne pohađa {{title}} dana {{date}}",
"attendee_no_longer_attending": "Polaznik više ne pohađa vaš događaj",
"attendee_no_longer_attending_subtitle": "Korisnik {{name}} je otkazao. To znači da se otvorilo mesto za ovaj vremenski period",
"create_event_on": "Kreirajte događaj na",
"default_app_link_title": "Podesite podrazumevani link aplikacije",
"default_app_link_description": "Podešavanje podrazumevanog linka aplikacije omogućava novokreiranim tipovima događaja da koriste link aplikacije koji ste postavili.",
@@ -1686,7 +1671,6 @@
"no_responses_yet": "Još uvek nema odgovora",
"no_routes_defined": "Nema definisanih ruta",
"this_will_be_the_placeholder": "Ovo će biti čuvar mesta",
"error_booking_event": "Došlo je do greške prilikom zakazivanja događaja, osvežite stranicu i pokušajte ponovo",
"timeslot_missing_title": "Nisu izabrani termini",
"timeslot_missing_description": "Izaberite termin da biste zakazali događaj.",
"timeslot_missing_cta": "Izaberite termin",
@@ -1747,7 +1731,6 @@
"least_booked_members": "Članovi koji su najmanje zakazali",
"events_created": "Kreirani događaji",
"events_completed": "Završeni događaji",
"events_cancelled": "Otkazani događaji",
"events_rescheduled": "Pomereni događaji",
"from_last_period": "iz prošlog perioda",
"from_to_date_period": "Od: {{startDate}} Do: {{endDate}}",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Har du frågor? Vi är här för att hjälpa till.",
"reset_password_subject": "{{appName}}: Instruktioner för att återställa ditt lösenord",
"event_declined_subject": "Avvisades: {{title}} kl. {{date}}",
"event_cancelled_subject": "Avbröt: {{title}} kl. {{date}}",
"event_request_declined": "Din bokningsförfrågan har avbjöts",
"event_request_declined_recurring": "Din återkommande händelse har avböjts",
"event_request_cancelled": "Din schemalagda bokning ställdes in",
"organizer": "Arrangör",
"need_to_reschedule_or_cancel": "Behöver du boka om eller avboka?",
"cancellation_reason": "Orsaker till annullering (valfritt)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Ditt möte har bokats",
"event_type_has_been_rescheduled_on_time_date": "Din {{title}} har ändrats till {{date}}.",
"event_has_been_rescheduled": "Uppdatering - Din bokning har blivit omplanerad",
"request_reschedule_subtitle": "{{organizer}} har avbokat bokningen och bett dig att välja en annan tid.",
"request_reschedule_title_organizer": "Du har begärt att {{attendee}} ska boka om",
"request_reschedule_subtitle_organizer": "Du har avbokat bokningen och {{attendee}} ska välja en ny bokningstid hos dig.",
"rescheduled_event_type_subject": "Begäran om ny schemaläggning har skickats: {{eventType}} med {{name}} {{date}}",
"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}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "Sluttiden kan inte vara över 24 timmar",
"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",
"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",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "Händelsen är i en återkommande händelse.",
"cancelling_all_recurring": "Dessa är alla kvarvarande instanser i den återkommande händelsen.",
"error_with_status_code_occured": "Ett fel med statuskoden {{status}} inträffade.",
"booking_already_cancelled": "Denna bokning har redan avbokats",
"booking_already_accepted_rejected": "Bokningen har redan accepterats eller avvisats",
"go_back_home": "Gå tillbaka hem",
"or_go_back_home": "Eller gå tillbaka hem",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Så fort någon bokar en tid med dig kommer den att dyka upp här.",
"recurring_bookings": "Så fort någon bokar ett återkommande möte med dig visas det här.",
"past_bookings": "Dina tidigare bokningar kommer att visas här.",
"cancelled_bookings": "Dina inställda bokningar kommer att visas här.",
"unconfirmed_bookings": "Dina obekräftade bokningar kommer att visas här.",
"unconfirmed_bookings_tooltip": "Obekräftade bokningar",
"on": "den",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Bläddra i vår API-dokumentation",
"leverage_our_api": "Utnyttja vår API för full kontroll och anpassningsbarhet.",
"create_webhook": "Skapa webhook",
"booking_cancelled": "Bokning inställd",
"booking_rescheduled": "Bokning ombokad",
"recording_ready": "Länk för nedladdning av inspelning klar",
"booking_created": "Bokning skapad",
@@ -379,8 +371,6 @@
"team_webhooks": "Team Webbhookar",
"create_new_webhook_to_account": "Skapa en ny webhook till ditt konto",
"new_webhook": "Ny webhook",
"receive_cal_meeting_data": "Ta emot {{appName}} mötesdata på en angiven webbadress, i realtid, när en händelse är schemalagd eller avbruten.",
"receive_cal_event_meeting_data": "Ta emot {{appName}} mötesdata på en angiven webbadress, i realtid, när denna händelse är schemalagd eller avbokad.",
"responsive_fullscreen_iframe": "Responsiv helskärms-iframe",
"loading": "Laddar...",
"deleting": "Raderar...",
@@ -1018,14 +1008,12 @@
"event_location": "Evenemangsplats",
"reschedule_optional": "Anledning till ombokning (frivilligt)",
"reschedule_placeholder": "Låt andra veta varför du behöver boka en ny tid",
"event_cancelled": "Det här evenemanget är inställt",
"emailed_information_about_cancelled_event": "Vi mejlade dig och de andra deltagarna för att informera om detta.",
"this_input_will_shown_booking_this_event": "Detta visas vid bokning av denna händelse",
"meeting_url_in_conformation_email": "Mötets webbadress finns i bekräftelsemejlet",
"url_start_with_https": "Webbadress behöver inledas med http:// eller https://",
"number_provided": "Telefonnummer kommer att anges",
"before_event_trigger": "innan händelsen startar",
"event_cancelled_trigger": "när händelsen ställs in",
"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",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Ditt team har upplösts",
"error_creating_team": "Det gick inte att skapa team",
"you": "Du",
"send_email": "Skicka e-post",
"member_already_invited": "Medlemmen har redan bjudits in",
"enter_email_or_username": "Ange en e-postadress eller ett användarnamn",
"team_name_taken": "Det här namnet används redan",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "Personens e-postadress för bokning",
"kbar_search_placeholder": "Ange ett kommando eller sök ...",
"invalid_credential": "Åh nej! Det verkar som om behörigheten löpt ut eller återkallats. Installera om igen.",
"reschedule_reason_success_page": "Anledning till ombokning",
"reschedule_reason": "Anledning till ombokning",
"choose_common_schedule_team_event": "Välj ett gemensamt schema",
"choose_common_schedule_team_event_description": "Aktivera den här funktionen om du vill använda ett gemensamt schema mellan värdarna. När den är inaktiverad bokas varje värd enligt sitt standardschema.",
"reason": "Orsak",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Du deltar inte längre i denna händelse",
"attendee_no_longer_attending_subject": "En deltagare deltar inte längre i {{title}} den {{date}}",
"attendee_no_longer_attending": "En deltagare deltar inte längre i din händelse",
"attendee_no_longer_attending_subtitle": "{{name}} har avbokat. Detta innebär att en plats har blivit ledig för denna tid",
"create_event_on": "Skapa händelse i",
"default_app_link_title": "Skapa en standardapplänk",
"default_app_link_description": "Om du skapar en standardapplänk kan alla händelsetyper som nyligen skapats använda den applänk som du har angett.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Se vilka av dina händelsetyper som får flest klick och bokningar",
"no_responses_yet": "Inga svar ännu",
"this_will_be_the_placeholder": "Det här blir platshållaren",
"error_booking_event": "Ett fel uppstod när du bokade evenemanget, uppdatera sidan och försök igen",
"timeslot_missing_title": "Ingen tidslucka vald",
"timeslot_missing_description": "Välj en tidslucka för att boka evenemanget.",
"timeslot_missing_cta": "Välj tidslucka",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Minst bokade medlemmar",
"events_created": "Skapade händelser",
"events_completed": "Slutförda händelser",
"events_cancelled": "Avbrutna händelser",
"events_rescheduled": "Ombokade händelser",
"from_last_period": "från senaste perioden",
"from_to_date_period": "Från: {{startDate}} till: {{endDate}}",
@@ -12,10 +12,8 @@
"have_any_questions": "கேள்விகள் உள்ளதா? நாங்கள் உதவ தயாராக இருக்கிறோம்.",
"reset_password_subject": "{{appName}}: கடவுச்சொல் மீட்டமைக்கும் வழிமுறைகள்",
"event_declined_subject": "{{title}} {{date}} அன்று நிராகரிக்கப்பட்டது",
"event_cancelled_subject": "{{title}} {{date}} அன்று ரத்துசெய்யப்பட்டது",
"event_request_declined": "உங்கள் தொடர் நிகழ்வு கோரிக்கை நிராகரிக்கப்பட்டது",
"event_request_declined_recurring": "உங்கள் தொடர் நிகழ்வு கோரிக்கை நிராகரிக்கப்பட்டது",
"event_request_cancelled": "உங்கள் திட்டமிடப்பட்ட நிகழ்வு ரத்து செய்யப்பட்டது",
"organizer": "அமைப்பாளர்",
"need_to_reschedule_or_cancel": "சந்திப்பு நேரம்/தேதியை மாற்றி அமைக்க வேண்டுமா அல்லது ரத்து செய்ய வேண்டுமா?",
"cancellation_reason": "ரத்து செய்வதற்கான காரணம் (தெரிவிக்கவும்)",
@@ -73,9 +71,7 @@
"your_meeting_has_been_booked": "உங்கள் சந்திப்பு பதிவு செய்யப்பட்டுள்ளது",
"event_type_has_been_rescheduled_on_time_date": "உங்கள் {{title}}, {{date}} க்கு மாற்றியமைக்கப்பட்டுள்ளது.",
"event_has_been_rescheduled": "புதுப்பிக்கப்பட்டது - உங்கள் நிகழ்வு மீண்டும் திட்டமிடப்பட்டது",
"request_reschedule_subtitle": "{{organizer}} முன்பதிவை ரத்துசெய்துவிட்டு, மற்றொரு நேரத்தைத் தேர்ந்தெடுக்கும்படி கோரியுள்ளார்.",
"request_reschedule_title_organizer": "நீங்கள் {{attendee}} ஐ மறுஅட்டவணைக்குக் கோரியுள்ளீர்கள்",
"request_reschedule_subtitle_organizer": "நீங்கள் முன்பதிவை ரத்து செய்துவிட்டீர்கள், {{attendee}} உங்களுடன் புதிய முன்பதிவு நேரத்தைத் தேர்ந்தெடுக்க வேண்டும்.",
"rescheduled_event_type_subject": "மறுஅட்டவணைக்கான கோரிக்கை அனுப்பப்பட்டது: {{eventType}} உடன் {{name}} உடன் {{date}}",
"requested_to_reschedule_subject_attendee": "மறுஅட்டவணை செயல் தேவை: {{eventType}} க்கு {{name}} உடன் புதிய நேரத்தை முன்பதிவு செய்யவும்",
"hi_user_name": "வணக்கம் {{name}}",
@@ -100,7 +96,6 @@
"no_longer_attending": "நீங்கள் இனி இந்த நிகழ்வில் கலந்து கொள்ள மாட்டீர்கள்",
"attendee_no_longer_attending_subject": "ஒரு பங்கேற்பாளர் இனி {{title}} இல் {{date}} இல் கலந்து கொள்ளமாட்டார்",
"attendee_no_longer_attending": "ஒரு பங்கேற்பாளர் இனி உங்கள் நிகழ்வில் கலந்து கொள்ளமாட்டார்",
"attendee_no_longer_attending_subtitle": "{{name}} ரத்துசெய்யப்பட்டது. அதாவது இந்த நேர ஸ்லாட்டுக்கு ஒரு இருக்கை திறக்கப்பட்டுள்ளது",
"create_event_on": "நிகழ்வை உருவாக்கவும்",
"default_app_link_title": "இயல்புநிலை பயன்பாட்டு இணைப்பை அமைக்கவும்",
"under_maintenance": "பராமரிப்புக்காக நிறுத்தம் செய்யப்பட்டுள்ளது",
@@ -172,7 +167,6 @@
"least_booked_members": "குறைவாகப் பதிவு செய்யப்பட்ட உறுப்பினர்கள்",
"events_created": "நிகழ்வுகள் உருவாக்கப்பட்டன",
"events_completed": "நிகழ்வுகள் முடிந்தது",
"events_cancelled": "நிகழ்வுகள் ரத்து செய்யப்பட்டன",
"events_rescheduled": "நிகழ்வுகள் மீண்டும் திட்டமிடப்பட்டுள்ளன",
"from_last_period": "கடந்த காலத்திலிருந்து",
"from_to_date_period": "{{startDate}} லிருந்து {{endDate}} வரை",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Sorularınız mı var? Size yardımcı olmak için buradayız.",
"reset_password_subject": "{{appName}}: Şifre sıfırlama talimatları",
"event_declined_subject": "Reddedildi: {{title}}, {{date}} tarihinde",
"event_cancelled_subject": "İptal edildi: {{title}}, {{date}} tarihinde",
"event_request_declined": "Etkinlik talebiniz reddedildi",
"event_request_declined_recurring": "Yinelenen etkinlik talebiniz reddedildi",
"event_request_cancelled": "Planlanan etkinliğiniz iptal edildi",
"organizer": "Organizatör",
"need_to_reschedule_or_cancel": "Yeniden planlamanız veya iptal etmeniz mi gerekiyor?",
"cancellation_reason": "İptal nedeni (isteğe bağlı)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Toplantı rezervasyonunuz yapıldı",
"event_type_has_been_rescheduled_on_time_date": "{{title}}, {{date}} olarak yeniden planlandı.",
"event_has_been_rescheduled": "Güncellendi - Etkinliğiniz yeniden planlandı",
"request_reschedule_subtitle": "{{organizer}} rezervasyonu iptal etti ve sizden başka bir saat seçmenizi istiyor.",
"request_reschedule_title_organizer": "{{attendee}} adlı kişiye yeniden planlama talebinde bulundunuz",
"request_reschedule_subtitle_organizer": "Rezervasyonu iptal ettiniz ve {{attendee}} isimli kişinin sizinle yeni bir rezervasyon saati belirlemesi gerekiyor.",
"rescheduled_event_type_subject": "Yeniden planlama isteği gönderildi: {{date}} tarihinde {{name}} ile {{eventType}}",
"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}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "Bitiş zamanı 24 saatten fazla olamaz",
"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",
"cancellation_successful": "İptal işlemi başarılı",
"really_cancel_booking": "Rezervasyonunuz gerçekten iptal edilsin mi?",
"cannot_cancel_booking": "Bu rezervasyonu iptal edemezsiniz",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "Etkinlik, yinelenen etkinliğin bir örneğidir.",
"cancelling_all_recurring": "Bunların tümü, yinelenen etkinlikteki kalan örneklerdir.",
"error_with_status_code_occured": "{{status}} durum koduyla ilgili bir hata oluştu.",
"booking_already_cancelled": "Bu rezervasyon zaten iptal edildi",
"booking_already_accepted_rejected": "Bu rezervasyon zaten kabul edildi veya reddedildi",
"go_back_home": "Ana sayfaya geri dönün",
"or_go_back_home": "Veya ana sayfaya geri dönün",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Biri sizinle bir zaman dilimini rezerve ettiğinde bilgiler burada görünür.",
"recurring_bookings": "Birisi sizinle yinelenen bir toplantı rezerve ettiğinde burada görünür.",
"past_bookings": "Geçmiş rezervasyonlarınız burada görünür.",
"cancelled_bookings": "İptal ettiğiniz rezervasyonlarınız burada görünecektir.",
"unconfirmed_bookings": "Onaylanmamış rezervasyonlarınız burada görünecektir.",
"unconfirmed_bookings_tooltip": "Onaylanmamış rezervasyonlar",
"on": "/",
@@ -366,7 +359,6 @@
"browse_api_documentation": "API belgelerimize göz atın",
"leverage_our_api": "Tam kontrol ve özelleştirilebilirlik için API'mizden yararlanın.",
"create_webhook": "Web kancası oluştur",
"booking_cancelled": "Rezervasyon İptal Edildi",
"booking_rescheduled": "Rezervasyon Yeniden Planlandı",
"recording_ready": "Kayıt İndirme Bağlantısı Hazır",
"booking_created": "Rezervasyon Oluşturuldu",
@@ -379,8 +371,6 @@
"team_webhooks": "Ekip Web Kancaları",
"create_new_webhook_to_account": "Hesabınız için yeni bir web kancası oluşturun",
"new_webhook": "Yeni Web Kancası",
"receive_cal_meeting_data": "Bir etkinlik planlandığında veya iptal edildiğinde, {{appName}} toplantı verilerini gerçek zamanlı olarak belirtilen bir URL'de alın.",
"receive_cal_event_meeting_data": "Bu etkinlik planlandığında veya iptal edildiğinde, {{appName}} toplantı verilerini gerçek zamanlı olarak hedef bir URL'de alın.",
"responsive_fullscreen_iframe": "Duyarlı tam ekran iframe",
"loading": "Yükleniyor...",
"deleting": "Siliniyor...",
@@ -1018,14 +1008,12 @@
"event_location": "Etkinliğin konumu",
"reschedule_optional": "Yeniden planlama nedeni (isteğe bağlı)",
"reschedule_placeholder": "Neden yeniden planlama ihtiyacı duyduğunuzu diğer kişilere bildirin",
"event_cancelled": "Bu etkinlik iptal edildi",
"emailed_information_about_cancelled_event": "Sizi ve diğer katılımcıları bilgilendirmek için bir e-posta gönderdik.",
"this_input_will_shown_booking_this_event": "Bu girdi, bu etkinlik için rezervasyon yapılırken gösterilecek",
"meeting_url_in_conformation_email": "Toplantı URL'si onay e-postasında mevcut",
"url_start_with_https": "URL'nin http:// veya https:// ile başlaması gerekiyor",
"number_provided": "Telefon numarası sağlanacaktır",
"before_event_trigger": "etkinlik başlamadan önce",
"event_cancelled_trigger": "etkinlik iptal edildiğinde",
"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",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Ekibiniz başarıyla dağıtıldı",
"error_creating_team": "Ekip oluşturulurken bir hata oluştu",
"you": "Siz",
"send_email": "E-posta gönder",
"member_already_invited": "Üye zaten davet edildi",
"enter_email_or_username": "Bir e-posta veya kullanıcı adı girin",
"team_name_taken": "Bu ad zaten kullanılıyor",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "Rezervasyon yaptıran kişinin e-postası",
"kbar_search_placeholder": "Komut girin veya arayın...",
"invalid_credential": "Hata! İznin süresi dolmuş veya iptal edilmiş gibi görünüyor. Lütfen yeniden yükleyin.",
"reschedule_reason_success_page": "Yeniden planlama nedeni",
"reschedule_reason": "Yeniden planlama nedeni",
"choose_common_schedule_team_event": "Ortak bir program seçin",
"choose_common_schedule_team_event_description": "Toplantı sahipleri arasında ortak bir plan kullanmak istiyorsanız bunu etkinleştirin. Devre dışı bırakıldığında, her toplantı sahibi varsayılan programına göre rezerve edilir.",
"reason": "Sebep",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Artık bu etkinliğe katılmıyorsunuz",
"attendee_no_longer_attending_subject": "Bir katılımcı, {{date}} tarihli {{title}} etkinliğine artık katılmıyor",
"attendee_no_longer_attending": "Bir katılımcı artık etkinliğinize katılmıyor",
"attendee_no_longer_attending_subtitle": "{{name}} etkinlik katılımını iptal etti. Bu, bu zaman aralığı için bir yerin açıldığı anlamına gelir",
"create_event_on": "Şu tarih için etkinlik oluşturun:",
"default_app_link_title": "Varsayılan uygulama bağlantısını ayarlayın",
"default_app_link_description": "Varsayılan uygulama bağlantısını ayarlamak, yeni oluşturulan tüm etkinlik türlerinin ayarladığınız uygulama bağlantısını kullanmasına olanak tanır.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Hangi etkinlik türünüzün en çok tıklandığını ve rezervasyon aldığını görün",
"no_responses_yet": "Henüz yanıt yok",
"this_will_be_the_placeholder": "Bu, yer tutucu olacak",
"error_booking_event": "Etkinlik rezervasyonu yapılırken bir hata oluştu, lütfen sayfayı yenileyerek tekrar deneyin",
"timeslot_missing_title": "Zaman aralığı seçilmedi",
"timeslot_missing_description": "Etkinlik rezervasyonu için lütfen bir zaman aralığı seçin.",
"timeslot_missing_cta": "Zaman aralığını seçin",
@@ -1714,7 +1699,6 @@
"least_booked_members": "En Az Rezerve Edilen Üyeler",
"events_created": "Oluşturulan Etkinlikler",
"events_completed": "Tamamlanan Etkinlikler",
"events_cancelled": "İptal Edilen Etkinlikler",
"events_rescheduled": "Yeniden Planlanan Etkinlikler",
"from_last_period": "son dönemden itibaren",
"from_to_date_period": "Başlangıç: {{startDate}} Bitiş: {{endDate}}",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Маєте запитання? Ми допоможемо.",
"reset_password_subject": "{{appName}}: інструкції зі скидання пароля",
"event_declined_subject": "Відхилено: {{title}}, {{date}}",
"event_cancelled_subject": "Скасовано: {{title}}, {{date}}",
"event_request_declined": "Ваш запит на захід відхилено",
"event_request_declined_recurring": "Ваш запит на періодичний захід відхилено",
"event_request_cancelled": "Ваш запланований захід скасовано",
"organizer": "Організатор",
"need_to_reschedule_or_cancel": "Потрібно перенести чи скасувати?",
"cancellation_reason": "Причина скасування",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Вашу нараду заброньовано",
"event_type_has_been_rescheduled_on_time_date": "Ваш {{title}} перенесено на {{date}}.",
"event_has_been_rescheduled": "Оновлено – ваш захід перенесено",
"request_reschedule_subtitle": "{{organizer}} скасував(-ла) бронювання та попросив(-ла) вас вибрати інший час.",
"request_reschedule_title_organizer": "Ви попросили учасника {{attendee}} перенести бронювання",
"request_reschedule_subtitle_organizer": "Ви скасували бронювання. {{attendee}} має забронювати інший час.",
"rescheduled_event_type_subject": "Запит на перенесення надіслано: {{eventType}} «{{name}}», {{date}}",
"requested_to_reschedule_subject_attendee": "Потрібно перенести бронювання: забронюйте новий час для заходу «{{eventType}}» із користувачем {{name}}",
"hi_user_name": "Привіт, {{name}}!",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "Час завершення не може виходити за межі 24 годин",
"back_to_bookings": "Повернутися до бронювань",
"free_to_pick_another_event_type": "Ви можете будь-коли вибрати інший захід.",
"cancelled": "Скасовано",
"cancellation_successful": "Скасовано",
"really_cancel_booking": "Справді скасувати ваше бронювання?",
"cannot_cancel_booking": "Ви не можете скасувати це бронювання",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "Подія – це один екземпляр повторюваної події.",
"cancelling_all_recurring": "Усе це решта екземплярів повторюваної події.",
"error_with_status_code_occured": "Сталася помилка з кодом стану: {{status}}.",
"booking_already_cancelled": "Це бронювання вже скасовано",
"booking_already_accepted_rejected": "Це бронювання вже прийнято або відхилено",
"go_back_home": "На головну",
"or_go_back_home": "Або поверніться на головну",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Одразу, як хтось забронює у вас певний час, ці відомості з’являться тут.",
"recurring_bookings": "Щойно хтось забронює періодичну нараду з вами, дані про неї з’являться тут.",
"past_bookings": "Тут з’являтимуться ваші минулі бронювання.",
"cancelled_bookings": "Тут з’являтимуться ваші скасовані бронювання.",
"unconfirmed_bookings": "Тут з’являтимуться ваші непідтверджені бронювання.",
"unconfirmed_bookings_tooltip": "Непідтверджені бронювання",
"on": "дата:",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Переглянути нашу документацію з API",
"leverage_our_api": "Використовуйте наш інтерфейс API, щоб отримати повний контроль і можливості налаштування.",
"create_webhook": "Створити вебгук",
"booking_cancelled": "Бронювання скасовано",
"booking_rescheduled": "Бронювання перенесено",
"recording_ready": "Посилання для завантаження запису готове",
"booking_created": "Бронювання створено",
@@ -379,8 +371,6 @@
"team_webhooks": "Вебгуки команди",
"create_new_webhook_to_account": "Створіть новий вебгук у своєму обліковому записі",
"new_webhook": "Новий вебгук",
"receive_cal_meeting_data": "Отримуйте дані про нараду в {{appName}} за вказаною URL-адресою: у реальному часі, а також під час планування та скасовування.",
"receive_cal_event_meeting_data": "Отримуйте дані про нараду в {{appName}} за вказаною URL-адресою: у реальному часі, а також під час її планування та скасовування.",
"responsive_fullscreen_iframe": "Адаптивний повноекранний компонент iframe",
"loading": "Завантаження…",
"deleting": "Видалення…",
@@ -1018,14 +1008,12 @@
"event_location": "Розташування заходу",
"reschedule_optional": "Причина перенесення (необов’язково)",
"reschedule_placeholder": "Повідомте інших, чому вам потрібно перенести захід",
"event_cancelled": "Цей захід скасовано",
"emailed_information_about_cancelled_event": "Ми сповістили вас та інших учасників електронною поштою.",
"this_input_will_shown_booking_this_event": "Це поле введення буде показано під час бронювання часу для цього заходу",
"meeting_url_in_conformation_email": "URL-адресу наради вказано в листі з підтвердженням",
"url_start_with_https": "URL-адреса має починатися з http:// або https://",
"number_provided": "Номер телефону буде надано",
"before_event_trigger": "до початку заходу",
"event_cancelled_trigger": "у момент скасування заходу",
"new_event_trigger": "у момент бронювання нового заходу",
"email_host_action": "надсилати електронний лист ведучому",
"email_attendee_action": "надсилати ел. листи учасникам",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Вашу команду розформовано",
"error_creating_team": "Помилка створення команди",
"you": "Ви",
"send_email": "Надіслати лист",
"member_already_invited": "Учасника вже запрошено",
"enter_email_or_username": "Введіть електронну адресу або ім’я користувача",
"team_name_taken": "Це ім’я вже зайнято",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "Адреса ел. пошти особи, яка бронює",
"kbar_search_placeholder": "Введіть команду або пошуковий запит…",
"invalid_credential": "Отакої! Схоже, дозвіл більше не дійсний або його відкликано. Перевстановіть додаток знову.",
"reschedule_reason_success_page": "Причина перенесення",
"reschedule_reason": "Причина перенесення",
"choose_common_schedule_team_event": "Виберіть спільний розклад",
"choose_common_schedule_team_event_description": "Увімкніть цей параметр, щоб використовувати спільний для двох ведучих розклад. Якщо цей параметр вимкнено, бронювання для кожного з ведучих відбуватиметься за їхніми власними графіками.",
"reason": "Причина",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Ви більше не відвідуєте цей захід",
"attendee_no_longer_attending_subject": "Учасник більше не відвідує захід «{{title}}», запланований на {{date}}",
"attendee_no_longer_attending": "Учасник більше не відвідує ваш захід",
"attendee_no_longer_attending_subtitle": "{{name}} скасував(-ла) участь. Це означає, що на цей час з’явилося вільне місце.",
"create_event_on": "Створити захід у календарі",
"default_app_link_title": "Установити посилання на додаток за замовчуванням",
"default_app_link_description": "Посилання на додаток за замовчуванням використовуватиметься для всіх новостворених типів подій.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Дізнайтеся, які типи заходів мають найбільшу кількість переходів і бронювань",
"no_responses_yet": "Поки немає відповідей",
"this_will_be_the_placeholder": "Це заповнювач",
"error_booking_event": "Сталася помилка під час бронювання заходу, оновіть сторінку й повторіть спробу",
"timeslot_missing_title": "Не вибрано проміжок часу",
"timeslot_missing_description": "Виберіть проміжок часу для бронювання заходу.",
"timeslot_missing_cta": "Вибрати проміжок часу",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Учасники з найменшою кількістю бронювань",
"events_created": "Створені заходи",
"events_completed": "Завершені заходи",
"events_cancelled": "Скасовані заходи",
"events_rescheduled": "Перенесені заходи",
"from_last_period": "після останнього періоду",
"from_to_date_period": "З: {{startDate}} До: {{endDate}}",
+1 -17
View File
@@ -12,10 +12,8 @@
"have_any_questions": "Có câu hỏi? Chúng tôi luôn ở đây để giúp bạn.",
"reset_password_subject": "{{appName}}: Hướng dẫn thay đổi mật khẩu",
"event_declined_subject": "Đã từ chối: {{title}} tại {{date}}",
"event_cancelled_subject": "Đã huỷ: {{title}} tại {{date}}",
"event_request_declined": "Lời mời sự kiện của bạn đã bị từ chối",
"event_request_declined_recurring": "Lời mời sự kiện định kỳ của bạn đã bị từ chối",
"event_request_cancelled": "Sự kiện của bạn đã bị huỷ",
"organizer": "Tổ chức",
"need_to_reschedule_or_cancel": "Cần phải đổi lịch hẹn hoặc huỷ?",
"cancellation_reason": "Lý do hủy",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "Cuộc họp của bạn đã được đặt",
"event_type_has_been_rescheduled_on_time_date": "{{title}} của bạn đã được chuyển sang ngày {{date}}.",
"event_has_been_rescheduled": "Đã cập nhật - Sự kiện của bạn đã được đổi",
"request_reschedule_subtitle": "{{organizer}} đã huỷ đặt chỗ đó và yêu cầu bạn chọn thời gian khác.",
"request_reschedule_title_organizer": "Bạn đã yêu cầu {{attendee}} xếp lại lịch",
"request_reschedule_subtitle_organizer": "Bạn đã huỷ mục đặt chỗ này và {{attendee}} nên chọn thời gian đặt chỗ mới với bạn.",
"rescheduled_event_type_subject": "Đã gửi yêu cầu xếp lại lịch: {{eventType}} với {{name}} lúc {{date}}",
"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}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "Thời gian kết thúc không được lớn hơn 24 giờ",
"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",
"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",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "Sự kiện này là một trường hợp về một sự kiện định kỳ.",
"cancelling_all_recurring": "Đây là tất cả những trường hợp còn lại trong sự kiện định kỳ.",
"error_with_status_code_occured": "Đã xảy ra lỗi với mã trạng thái {{status}}.",
"booking_already_cancelled": "Lịch hẹn này đã bị hủy",
"booking_already_accepted_rejected": "Lịch hẹn này đã được chấp nhận hoặc từ chối",
"go_back_home": "Trở về trang chủ",
"or_go_back_home": "Hoặc trở về trang chủ",
@@ -326,7 +320,6 @@
"upcoming_bookings": "Ngay sau khi ai đó đặt lịch với bạn, nó sẽ hiển thị ở đây.",
"recurring_bookings": "Ngay sau khi ai đó đặt hẹn một cuộc họp định kỳ với bạn, nó sẽ hiển thị ở đây.",
"past_bookings": "Các lịch hẹn trước đây của bạn sẽ hiển thị ở đây.",
"cancelled_bookings": "Các lịch hẹn đã hủy của bạn sẽ hiển thị ở đây.",
"unconfirmed_bookings": "Lịch hẹn chưa xác nhận của bạn sẽ hiển thị ở đây.",
"unconfirmed_bookings_tooltip": "Lịch hẹn chưa xác nhận",
"on": "vào",
@@ -366,7 +359,6 @@
"browse_api_documentation": "Xem qua tài liệu API của chúng tôi",
"leverage_our_api": "Tận dụng API của chúng tôi để có toàn quyền kiểm soát và chỉnh sửa theo ý bạn.",
"create_webhook": "Tạo Webhook",
"booking_cancelled": "Lịch hẹn đã bị hủy",
"booking_rescheduled": "Lịch hẹn đã được đổi",
"recording_ready": "Đã sẵn sàng liên kết tải xuống bản ghi",
"booking_created": "Lịch hẹn đã được tạo",
@@ -379,8 +371,6 @@
"team_webhooks": "Webhooks Nhóm",
"create_new_webhook_to_account": "Tạo một webhook mới cho tài khoản của bạn",
"new_webhook": "Webhook mới",
"receive_cal_meeting_data": "Nhận dữ liệu cuộc họp {{appName}} tại một URL được chỉ định, trong thời gian thực, khi một sự kiện được lên lịch hoặc hủy bỏ.",
"receive_cal_event_meeting_data": "Nhận dữ liệu cuộc họp {{appName}} tại một URL được chỉ định, trong thời gian thực, khi sự kiện này được lên lịch hoặc hủy bỏ.",
"responsive_fullscreen_iframe": "Iframe responsive toàn màn hình",
"loading": "Đang tải...",
"deleting": "Đang xóa...",
@@ -1018,14 +1008,12 @@
"event_location": "Địa điểm sự kiện",
"reschedule_optional": "Lí do xếp lịch lại (tuỳ chọn)",
"reschedule_placeholder": "Cho người khác biết nguyên do bạn cần xếp lịch lại",
"event_cancelled": "Sự kiệnn này bị huỷ",
"emailed_information_about_cancelled_event": "Chúng tôi đã gửi email cho bạn và những người tham dự khác để cho họ biết.",
"this_input_will_shown_booking_this_event": "Trường này sẽ được hiển thị khi đặt sự kiện này",
"meeting_url_in_conformation_email": "Url cuộc họp nằm trong email xác nhận",
"url_start_with_https": "URL cần bắt đầu bằng http:// hoặc https://",
"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ỷ",
"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",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "Nhóm của bạn đã được giải tán thành công",
"error_creating_team": "Lỗi khi tạo nhóm",
"you": "Bạn",
"send_email": "Gửi email",
"member_already_invited": "Thành viên đã được mời rồi",
"enter_email_or_username": "Nhập một email hoặc tên người dùng",
"team_name_taken": "Tên này đã có người lấy rồi",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "Email người tham gia lịch hẹn",
"kbar_search_placeholder": "Nhập một lệnh hoặc tìm kiếm...",
"invalid_credential": "Ôi không! Có vẻ như quyền đã hết hạn hoặc đã bị thu hồi. Vui lòng cài đặt lại.",
"reschedule_reason_success_page": "Lý do dời lịch",
"reschedule_reason": "Lý do dời lịch",
"choose_common_schedule_team_event": "Chọn một lịch chung",
"choose_common_schedule_team_event_description": "Bật mục này nếu bạn muốn dùng lịch thông thường giữa các chủ sự kiện. Khi tắt đi, mỗi chủ sự kiện sẽ được đặt lịch theo lịch mặc định của họ.",
"reason": "Lý do",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "Bạn không còn tham gia sự kiện này nữa",
"attendee_no_longer_attending_subject": "Một người tham dự không còn tham dự {{title}} vào {{date}}",
"attendee_no_longer_attending": "Một người tham dự không còn tham dự sự kiện của bạn",
"attendee_no_longer_attending_subtitle": "{{name}} đã hủy. Điều này nghĩa là còn lại một suất cho thời điểm này",
"create_event_on": "Tạo sự kiện vào",
"default_app_link_title": "Đặt một liên kết ứng dụng mặc định",
"default_app_link_description": "Thao tác đặt liên kết ứng dụng mặc định sẽ giúp cho phép tất cả các loại sự kiện mới tạo có thể dùng liên kết ứng dụng mà bạn đã đặt.",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "Xem loại sự kiện nào của bạn nhận được nhiều lần nhấp chuột và nhiều lịch hẹn nhất",
"no_responses_yet": "Chưa có hồi đáp",
"this_will_be_the_placeholder": "Đây sẽ là mã giữ chỗ",
"error_booking_event": "Có lỗi khi đặt lịch sự kiện, hãy làm mới trang rồi thử lại",
"timeslot_missing_title": "Chưa chọn suất thời gian nào",
"timeslot_missing_description": "Vui lòng chọn một suất thời gian để đặt lịch sự kiện.",
"timeslot_missing_cta": "Chọn suất thời gian",
@@ -1714,7 +1699,6 @@
"least_booked_members": "Thành viên được đặt lịch hẹn ít nhất",
"events_created": "Những sự kiện đã tạo",
"events_completed": "Những sự kiện đã hoàn thành",
"events_cancelled": "Những sự kiện đã hủy",
"events_rescheduled": "Những sự kiện đã đặt lịch lại",
"from_last_period": "từ thời gian gần nhất",
"from_to_date_period": "Từ: {{startDate}} Đến: {{endDate}}",
@@ -12,10 +12,8 @@
"have_any_questions": "有疑问?获取我们的帮助。",
"reset_password_subject": "{{appName}}: 重置密码教程",
"event_declined_subject": "拒绝:{{title}} 在 {{date}}",
"event_cancelled_subject": "取消:{{title}} 在 {{date}}",
"event_request_declined": "您的活动预约请求已被拒绝",
"event_request_declined_recurring": "您的定期活动请求已被拒绝",
"event_request_cancelled": "您预约的活动已被取消",
"organizer": "组织者",
"need_to_reschedule_or_cancel": "需要重新安排还是取消?",
"cancellation_reason": "取消原因(选填)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "您的会议已预定",
"event_type_has_been_rescheduled_on_time_date": "您的 {{title}} 已改期至 {{date}}。",
"event_has_been_rescheduled": "已更新 - 您的活动已被重新安排",
"request_reschedule_subtitle": "{{organizer}} 取消了预约并要求您选择其他时间。",
"request_reschedule_title_organizer": "您已请求 {{attendee}} 重新安排",
"request_reschedule_subtitle_organizer": "您已取消预约,{{attendee}} 应该与您一起选择新的预约时间。",
"rescheduled_event_type_subject": "重新安排请求已发送: 和 {{name}} 在 {{date}} 的 {{eventType}}",
"requested_to_reschedule_subject_attendee": "需要重新安排操作: 请为名称为 {{name}} 的 {{eventType}} 预约新的时间",
"hi_user_name": "您好 {{name}}",
@@ -316,7 +312,6 @@
"error_end_time_next_day": "结束时间不能超过 24 小时",
"back_to_bookings": "返回预约",
"free_to_pick_another_event_type": "随时可以选择另一个活动。",
"cancelled": "已取消",
"cancellation_successful": "取消成功",
"really_cancel_booking": "真的要取消您的预约吗?",
"cannot_cancel_booking": "您不能取消此预约",
@@ -325,7 +320,6 @@
"cancelling_event_recurring": "该活动是定期活动的一个实例。",
"cancelling_all_recurring": "这些是定期活动中的所有剩余实例。",
"error_with_status_code_occured": "发生错误,状态码 {{status}}",
"booking_already_cancelled": "此预约已被取消",
"booking_already_accepted_rejected": "此预约已被接受或拒绝",
"go_back_home": "返回首页",
"or_go_back_home": "或者返回首页",
@@ -339,7 +333,6 @@
"upcoming_bookings": "一旦有人与你预约,它就会出现在这里。",
"recurring_bookings": "一旦有人与您预约定期会议,其会显示在这里。",
"past_bookings": "您过去的预约将显示在这里。",
"cancelled_bookings": "您已取消的预约将显示在这里。",
"unconfirmed_bookings": "您的未确认的预约将显示在这里。",
"unconfirmed_bookings_tooltip": "未确认的预约",
"on": "在",
@@ -379,7 +372,6 @@
"browse_api_documentation": "浏览我们的 API 文档",
"leverage_our_api": "利用我们的 API 来实现完全控制和高度定制。",
"create_webhook": "创建 Webhook",
"booking_cancelled": "预约已取消",
"booking_rescheduled": "预约已重新安排",
"recording_ready": "录制内容下载链接就绪",
"booking_created": "预约已创建",
@@ -392,8 +384,6 @@
"team_webhooks": "团队 Webhook",
"create_new_webhook_to_account": "为您的账户创建一个新的Webhook",
"new_webhook": "新建 Webhook",
"receive_cal_meeting_data": "当活动被安排或取消时,在指定的链接实时接收{{appName}}会议数据。",
"receive_cal_event_meeting_data": "当此活动被安排或取消后,会在指定的 URL 实时接收 {{appName}} 会议数据。",
"responsive_fullscreen_iframe": "全屏响应式iframe",
"loading": "加载中...",
"deleting": "正在删除...",
@@ -1031,14 +1021,12 @@
"event_location": "活动的位置",
"reschedule_optional": "重新安排的原因(可选)",
"reschedule_placeholder": "让其他人知道您为什么需要重新安排",
"event_cancelled": "此活动已取消",
"emailed_information_about_cancelled_event": "我们已向您和其他参与者发送电子邮件来通知他们。",
"this_input_will_shown_booking_this_event": "在预约此活动时将显示该输入框",
"meeting_url_in_conformation_email": "会议链接含在确认电子邮件中",
"url_start_with_https": "链接需要以 http:// 或 https:// 开头",
"number_provided": "将提供电话号码",
"before_event_trigger": "活动开始前",
"event_cancelled_trigger": "取消活动时",
"new_event_trigger": "预约新活动时",
"email_host_action": "向主持人发送电子邮件",
"email_attendee_action": "向参与者发送电子邮件",
@@ -1426,7 +1414,6 @@
"your_team_disbanded_successfully": "您的团队已成功解散",
"error_creating_team": "创建团队时出错",
"you": "您",
"send_email": "发送电子邮件",
"member_already_invited": "成员已被邀请",
"enter_email_or_username": "输入电子邮件或用户名",
"team_name_taken": "此名称已被使用",
@@ -1439,7 +1426,7 @@
"attendee_email_info": "预约人的电子邮件",
"kbar_search_placeholder": "输入命令或搜索...",
"invalid_credential": "哦不!看起来权限已过期或被撤销。请重新安装。",
"reschedule_reason_success_page": "重新安排原因",
"reschedule_reason": "重新安排原因",
"choose_common_schedule_team_event": "选择通用时间表",
"choose_common_schedule_team_event_description": "如果您希望在主持人之间使用通用时间表,请启用此选项。如果禁用,将根据主持人的默认时间表预约每个主持人。",
"reason": "原因",
@@ -1615,7 +1602,6 @@
"no_longer_attending": "您不再参加此活动",
"attendee_no_longer_attending_subject": "一名参与者不再参加于 {{date}} 举行的 {{title}} ",
"attendee_no_longer_attending": "一名参与者不再参加您的活动",
"attendee_no_longer_attending_subtitle": "{{name}} 已取消。这意味着该时段有一个位置空出来",
"create_event_on": "创建活动于",
"default_app_link_title": "设置默认应用链接",
"default_app_link_description": "设置默认应用链接可以让所有新创建的活动类型使用您设置的应用链接。",
@@ -1667,7 +1653,6 @@
"spot_popular_event_types_description": "查看获得最多点击和预约的活动类型",
"no_responses_yet": "尚无回复",
"this_will_be_the_placeholder": "这将是占位符",
"error_booking_event": "预订活动时发生错误,请刷新页面并重试",
"timeslot_missing_title": "未选择时间段",
"timeslot_missing_description": "请选择要预约活动的时间段。",
"timeslot_missing_cta": "选择时间段",
@@ -1728,7 +1713,6 @@
"least_booked_members": "预约最少的成员",
"events_created": "已创建的活动",
"events_completed": "已完成的活动",
"events_cancelled": "已取消的活动",
"events_rescheduled": "已重新安排的活动",
"from_last_period": "从上一时段开始",
"from_to_date_period": "开始日期: {{startDate}} 结束日期: {{endDate}}",
@@ -12,10 +12,8 @@
"have_any_questions": "有問題嗎?我們隨時在此幫助。",
"reset_password_subject": "{{appName}}: 重新設置密碼說明",
"event_declined_subject": "已拒絕:{{date}} 與 {{title}}",
"event_cancelled_subject": "已取消:{{date}} 與 {{title}}",
"event_request_declined": "活動請求遭到拒絕",
"event_request_declined_recurring": "您的定期活動請求已遭到拒絕",
"event_request_cancelled": "預定的活動取消了",
"organizer": "主辦",
"need_to_reschedule_or_cancel": "要重新規劃還是取消嗎?",
"cancellation_reason": "取消原因(選填)",
@@ -77,9 +75,7 @@
"your_meeting_has_been_booked": "會議已經預定",
"event_type_has_been_rescheduled_on_time_date": "您的 {{title}} 已改期至 {{date}}。",
"event_has_been_rescheduled": "已更新 - 已經重新預定活動時間",
"request_reschedule_subtitle": "{{organizer}} 已取消預約,並要求您選擇其他時間。",
"request_reschedule_title_organizer": "您已要求 {{attendee}} 重新預約",
"request_reschedule_subtitle_organizer": "您已取消預約,{{attendee}} 應和您重新挑選新的預約時間。",
"rescheduled_event_type_subject": "已送出重新預定的申請:在 {{date}} 與 {{name}} 的 {{eventType}}",
"requested_to_reschedule_subject_attendee": "需進行重新預約操作:請為與 {{name}} 的 {{eventType}} 預訂新時間",
"hi_user_name": "哈囉 {{name}}",
@@ -303,7 +299,6 @@
"error_end_time_next_day": "結束時間不應多於 24 小時",
"back_to_bookings": "回去預約列表",
"free_to_pick_another_event_type": "請自由挑選其它活動。",
"cancelled": "已取消",
"cancellation_successful": "成功取消",
"really_cancel_booking": "真的要取消預約嗎?",
"cannot_cancel_booking": "無法取消這次的預約",
@@ -312,7 +307,6 @@
"cancelling_event_recurring": "此活動為定期活動的一個實例。",
"cancelling_all_recurring": "這些是定期活動中的所有剩餘實例。",
"error_with_status_code_occured": "發生代號是 {{status}} 的錯誤。",
"booking_already_cancelled": "預約已經取消",
"booking_already_accepted_rejected": "已接受或拒絕此預約",
"go_back_home": "回到首頁",
"or_go_back_home": "或者回到首頁",
@@ -326,7 +320,6 @@
"upcoming_bookings": "只要有人預約了時段,立即會在這裡顯示。",
"recurring_bookings": "只要有人預約定期會議即會在此處顯示。",
"past_bookings": "這裡會顯示之前的預約。",
"cancelled_bookings": "這裡會顯示取消的預約。",
"unconfirmed_bookings": "您未確認的預約會顯示在這裡。",
"unconfirmed_bookings_tooltip": "未確認的預約",
"on": "在",
@@ -366,7 +359,6 @@
"browse_api_documentation": "瀏覽 API 文件",
"leverage_our_api": "請充分利用 API 徹底掌握與客製化。",
"create_webhook": "建立 Webhook",
"booking_cancelled": "預約已取消",
"booking_rescheduled": "已重新安排預約",
"recording_ready": "錄製內容下載連結已準備就緒",
"booking_created": "已建立預約",
@@ -379,8 +371,6 @@
"team_webhooks": "團隊 Webhook",
"create_new_webhook_to_account": "建立這個帳號的新 Webhook",
"new_webhook": "新 Webhook",
"receive_cal_meeting_data": "活動預定或取消的時候,即時在指定的網址收到 {{appName}} 會議資料。",
"receive_cal_event_meeting_data": "當此活動預定或取消的時候,即時在指定的網址收到 {{appName}} 會議資料。",
"responsive_fullscreen_iframe": "全螢幕響應式 Iframe",
"loading": "讀取中...",
"deleting": "正在刪除......",
@@ -1018,14 +1008,12 @@
"event_location": "活動地點",
"reschedule_optional": "重新預約的原因 (選填)",
"reschedule_placeholder": "讓其他人知道您為什麼需要重新預約",
"event_cancelled": "此活動已取消",
"emailed_information_about_cancelled_event": "我們已給您和其他與會者發送通知電子郵件。",
"this_input_will_shown_booking_this_event": "輸入欄會在預約此活動的時候顯示",
"meeting_url_in_conformation_email": "會議網址請參見確認電子郵件",
"url_start_with_https": "URL 需要以 http:// 或 https:// 開頭",
"number_provided": "將提供電話號碼",
"before_event_trigger": "活動開始前",
"event_cancelled_trigger": "活動取消時",
"new_event_trigger": "預約新活動時",
"email_host_action": "傳送電子郵件給主辦者",
"email_attendee_action": "傳送電子郵件給與會者",
@@ -1413,7 +1401,6 @@
"your_team_disbanded_successfully": "已成功解散您的團隊",
"error_creating_team": "建立團隊時發生錯誤",
"you": "您",
"send_email": "傳送電子郵件",
"member_already_invited": "已邀請成員",
"enter_email_or_username": "輸入電子郵件或使用者名稱",
"team_name_taken": "已有人使用此名稱",
@@ -1426,7 +1413,7 @@
"attendee_email_info": "預約人電子郵件",
"kbar_search_placeholder": "輸入指令或搜尋…",
"invalid_credential": "糟糕!權限似乎過期或遭到撤銷。請重新安裝。",
"reschedule_reason_success_page": "重新預約的原因",
"reschedule_reason": "重新預約的原因",
"choose_common_schedule_team_event": "選擇公用行程表",
"choose_common_schedule_team_event_description": "若要在多個主辦者之間使用公用行程表,請啟用此選項。停用時,會根據每個主辦者預設的行程表預約對方的時間。",
"reason": "原因",
@@ -1602,7 +1589,6 @@
"no_longer_attending": "您不再參加這個活動",
"attendee_no_longer_attending_subject": "一位與會者不再參加 {{date}} 的 {{title}}",
"attendee_no_longer_attending": "一位與會者不再參加您的活動",
"attendee_no_longer_attending_subtitle": "{{name}} 已取消,這代表此時段空出了一個座位",
"create_event_on": "活動建立日期",
"default_app_link_title": "設定預設應用程式連結",
"default_app_link_description": "設定預設應用程式連結,即可讓所有全新建立的活動類型使用您設定的應用程式連結。",
@@ -1653,7 +1639,6 @@
"spot_popular_event_types_description": "查看哪種活動類型的點閱次數及預約次數最多",
"no_responses_yet": "還沒有回應",
"this_will_be_the_placeholder": "此處會是佔位符",
"error_booking_event": "預約活動時發生錯誤,請重新整理頁面然後再試一次",
"timeslot_missing_title": "未選擇任何時段",
"timeslot_missing_description": "請選擇要預約活動的時段。",
"timeslot_missing_cta": "選擇時段",
@@ -1714,7 +1699,6 @@
"least_booked_members": "最少預約的成員",
"events_created": "已建立的活動",
"events_completed": "已完成的活動",
"events_cancelled": "已取消的活動",
"events_rescheduled": "已重新預定的活動",
"from_last_period": "從上一個時段",
"from_to_date_period": "開始:{{startDate}} 結束:{{endDate}}",
+27
View File
@@ -0,0 +1,27 @@
// see https://inlang.com/
export async function defineConfig(env) {
const { default: i18nextPlugin } = await env.$import(
"https://cdn.jsdelivr.net/npm/@inlang/plugin-i18next@2/dist/index.js",
)
const { default: standardLintRules } = await env.$import(
"https://cdn.jsdelivr.net/npm/@inlang/plugin-standard-lint-rules@3/dist/index.js",
)
return {
referenceLanguage: "en",
plugins: [
i18nextPlugin({
pathPattern: "./apps/web/public/static/locales/{language}/common.json",
}),
standardLintRules({
// deactivating identical pattern because of nested
// resources like "de-DE" and "de-AT" where "de-AT"
// contrains overwrites but the majority are identical patterns.
identicalPattern: "off"
}),
],
}
}
@@ -30,7 +30,6 @@ const dailyReturnTypeSchema = z.object({
enable_chat: z.boolean(),
enable_knocking: z.boolean(),
enable_prejoin_ui: z.boolean(),
enable_new_call_ui: z.boolean(),
}),
});
@@ -123,7 +122,6 @@ const DailyVideoApiAdapter = (): VideoApiAdapter => {
return {
privacy: "public",
properties: {
enable_new_call_ui: true,
enable_prejoin_ui: true,
enable_knocking: true,
enable_screenshare: true,
@@ -136,7 +134,6 @@ const DailyVideoApiAdapter = (): VideoApiAdapter => {
return {
privacy: "public",
properties: {
enable_new_call_ui: true,
enable_prejoin_ui: true,
enable_knocking: true,
enable_screenshare: true,
+35
View File
@@ -0,0 +1,35 @@
import { describe, expect, it } from "vitest";
import { getCalendarCredentials } from "./CalendarManager";
describe("CalendarManager tests", () => {
describe("fn: getCalendarCredentials", () => {
it("should only return credentials for calendar apps", () => {
const googleCalendarCredentials = {
id: "1",
appId: "google-calendar",
type: "google_calendar",
userId: "3",
key: {
access_token: "google_calendar_key"
},
invalid: false
};
const credentials = [googleCalendarCredentials, {
id: "2",
appId: "office365-video",
type: "office365_video",
userId: "4",
key: {
access_token: "office365_video_key"
},
invalid: false
}];
const calendarCredentials = getCalendarCredentials(credentials);
expect(calendarCredentials).toHaveLength(1);
expect(calendarCredentials[0].credential).toBe(googleCalendarCredentials);
});
});
});
@@ -5,7 +5,10 @@ export default function EmbedInitIframe() {
return;
}
const embedNameSpaceFromQueryParam = new URL(document.URL).searchParams.get("embed");
const url = new URL(document.URL);
const embedNameSpaceFromQueryParam = url.searchParams.get("embed");
const hasEmbedPath = url.pathname.endsWith("/embed");
const defaultNamespace = "";
// Namespace is initially set in query param `embed` but the query param might get lost during soft navigation
// So, we also check for the namespace in `window.name` which is set when iframe is created by embed.ts and persists for the duration of iframe's life
@@ -17,6 +20,8 @@ export default function EmbedInitIframe() {
? embedNameSpaceFromQueryParam
: window.name.includes("cal-embed=")
? window.name.replace(/cal-embed=(.*)/, "$1").trim()
: hasEmbedPath
? defaultNamespace // If query param is not there but /embed is used then assume default namespace.
: null;
window.isEmbed = () => {
@@ -2,7 +2,6 @@ import { useRouter } from "next/router";
import type { CSSProperties } from "react";
import { useState, useEffect } from "react";
import embedInit from "@calcom/embed-core/embed-iframe-init";
import type { BookerStore } from "@calcom/features/bookings/Booker/store";
import type { BookerLayouts } from "@calcom/prisma/zod-utils";
@@ -439,8 +438,6 @@ function keepParentInformedAboutDimensionChanges() {
if (isBrowser) {
log("Embed SDK loaded", { isEmbed: window?.isEmbed?.() || false });
// Exposes certain global variables/fns that are used by the app to get interface with the embed.
embedInit();
const url = new URL(document.URL);
embedStore.theme = window?.getEmbedTheme?.();
if (url.searchParams.get("prerender") !== "true" && window?.isEmbed?.()) {
+4 -1
View File
@@ -2,9 +2,12 @@
* @file
* This module is supposed to instantiate the SDK with appropriate namespace
*/
import embedInit from "@calcom/embed-core/embed-iframe-init";
import { SdkActionManager } from "./sdk-action-manager";
export let sdkActionManager: SdkActionManager | null = null;
if (typeof window !== "undefined") {
sdkActionManager = new SdkActionManager(new URL(document.URL).searchParams.get("embed"));
embedInit();
sdkActionManager = new SdkActionManager(window.getEmbedNamespace());
}
@@ -14,7 +14,7 @@ import { symmetricDecrypt } from "@calcom/lib/crypto";
import { defaultCookies } from "@calcom/lib/default-cookies";
import { isENVDev } from "@calcom/lib/env";
import { randomString } from "@calcom/lib/random";
import rateLimit from "@calcom/lib/rateLimit";
import rateLimiter from "@calcom/lib/rateLimit";
import slugify from "@calcom/lib/slugify";
import prisma from "@calcom/prisma";
import { IdentityProvider } from "@calcom/prisma/enums";
@@ -102,11 +102,14 @@ const providers: Provider[] = [
if (!user) {
throw new Error(ErrorCode.IncorrectUsernamePassword);
}
const limiter = rateLimit({
intervalInMs: 60 * 1000, // 1 minute
const limiter = await rateLimiter();
const rateLimit = await limiter({
identifier: user.email,
});
await limiter.check(10, user.email); // 10 requests per minute
if (!rateLimit.success) {
throw new Error(ErrorCode.RateLimitExceeded);
}
if (user.identityProvider !== IdentityProvider.CAL && !credentials.totpCode) {
throw new Error(ErrorCode.ThirdPartyIdentityProviderEnabled);
+6 -7
View File
@@ -4,17 +4,13 @@ import { sendEmailVerificationLink } from "@calcom/emails/email-manager";
import { getFeatureFlagMap } from "@calcom/features/flags/server/utils";
import { WEBAPP_URL } from "@calcom/lib/constants";
import logger from "@calcom/lib/logger";
import rateLimit from "@calcom/lib/rateLimit";
import rateLimiter from "@calcom/lib/rateLimit";
import { getTranslation } from "@calcom/lib/server/i18n";
import { prisma } from "@calcom/prisma";
import { TRPCError } from "@calcom/trpc/server";
const log = logger.getChildLogger({ prefix: [`[[Auth] `] });
const limiter = rateLimit({
intervalInMs: 60 * 1000, // 1 minute
});
interface VerifyEmailType {
username?: string;
email: string;
@@ -43,9 +39,12 @@ export const sendEmailVerification = async ({ email, language, username }: Verif
token,
});
const { isRateLimited } = limiter.check(10, email); // 10 requests per minute
const limiter = await rateLimiter();
const rateLimit = await limiter({
identifier: email,
});
if (isRateLimited) {
if (!rateLimit.success) {
throw new TRPCError({
code: "TOO_MANY_REQUESTS",
message: "An unexpected error occurred, please try again later.",
+2 -2
View File
@@ -139,7 +139,7 @@ const BookerComponent = ({
<StickyOnDesktop
key="meta"
className={classNames(
"relative z-10 flex",
"relative z-10 flex [grid-area:meta]",
layout !== BookerLayouts.MONTH_VIEW && "sm:min-h-screen"
)}>
<BookerSection
@@ -158,7 +158,7 @@ const BookerComponent = ({
<BookerSection
key="book-event-form"
area="main"
className="border-subtle sticky top-0 ml-[-1px] h-full px-5 py-3 md:w-[var(--booker-main-width)] md:border-l"
className="border-subtle sticky top-0 ml-[-1px] h-full p-6 md:w-[var(--booker-main-width)] md:border-l"
{...fadeInLeft}
visible={bookerState === "booking" && layout === BookerLayouts.MONTH_VIEW}>
<BookEventForm onCancel={() => setSelectedTimeslot(null)} />
@@ -73,7 +73,7 @@ export const AvailableTimeSlots = ({ extraDays, limitHeight, seatsPerTimeslot }:
<div
className={classNames(
limitHeight && "flex-grow md:h-[400px]",
!limitHeight && "flex w-full flex-row gap-4"
!limitHeight && "flex h-full w-full flex-row gap-4"
)}>
{schedule.isLoading
? // Shows exact amount of days as skeleton.
@@ -19,7 +19,10 @@ import {
mapRecurringBookingToMutationInput,
} from "@calcom/features/bookings/lib";
import { getBookingFieldsWithSystemFields } from "@calcom/features/bookings/lib/getBookingFields";
import getBookingResponsesSchema from "@calcom/features/bookings/lib/getBookingResponsesSchema";
import getBookingResponsesSchema, {
getBookingResponsesPartialSchema,
} from "@calcom/features/bookings/lib/getBookingResponsesSchema";
import { bookingSuccessRedirect } from "@calcom/lib/bookingSuccessRedirect";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { HttpError } from "@calcom/lib/http-error";
import { Form, Button, Alert, EmptyScreen } from "@calcom/ui";
@@ -27,7 +30,6 @@ import { Calendar } from "@calcom/ui/components/icon";
import { useBookerStore } from "../../store";
import { useEvent } from "../../utils/event";
import { getQueryParam } from "../../utils/query-param";
import { BookingFields } from "./BookingFields";
import { FormSkeleton } from "./Skeleton";
@@ -35,34 +37,11 @@ type BookEventFormProps = {
onCancel?: () => void;
};
const getSuccessPath = ({
uid,
email,
slug,
formerTime,
isRecurring,
}: {
uid: string;
email: string;
slug: string;
formerTime?: string;
isRecurring: boolean;
}) => ({
pathname: `/booking/${uid}`,
query: {
[isRecurring ? "allRemainingBookings" : "isSuccessBookingPage"]: true,
email: email,
eventTypeSlug: slug,
formerTime: formerTime,
},
});
export const BookEventForm = ({ onCancel }: BookEventFormProps) => {
const router = useRouter();
const { t, i18n } = useLocale();
const { timezone } = useTimePreferences();
const errorRef = useRef<HTMLDivElement>(null);
const rescheduleUid = useBookerStore((state) => state.rescheduleUid);
const rescheduleBooking = useBookerStore((state) => state.rescheduleBooking);
const eventSlug = useBookerStore((state) => state.eventSlug);
@@ -82,10 +61,23 @@ export const BookEventForm = ({ onCancel }: BookEventFormProps) => {
if (!eventType?.bookingFields) {
return {};
}
const querySchema = getBookingResponsesPartialSchema({
eventType: {
bookingFields: eventType.bookingFields,
},
view: rescheduleUid ? "reschedule" : "booking",
});
const parsedQuery = querySchema.parse({
...router.query,
// `guest` because we need to support legacy URL with `guest` query param support
// `guests` because the `name` of the corresponding bookingField is `guests`
guests: router.query.guests || router.query.guest,
});
const defaultUserValues = {
email: rescheduleUid ? rescheduleBooking?.attendees[0].email : getQueryParam("email") || "",
name: rescheduleUid ? rescheduleBooking?.attendees[0].name : getQueryParam("name") || "",
email: rescheduleUid ? rescheduleBooking?.attendees[0].email : parsedQuery["email"] || "",
name: rescheduleUid ? rescheduleBooking?.attendees[0].name : parsedQuery["name"] || "",
};
if (!isRescheduling) {
@@ -96,9 +88,10 @@ export const BookEventForm = ({ onCancel }: BookEventFormProps) => {
const responses = eventType.bookingFields.reduce((responses, field) => {
return {
...responses,
[field.name]: getQueryParam(field.name) || undefined,
[field.name]: parsedQuery[field.name] || undefined,
};
}, {});
defaults.responses = {
...responses,
name: defaultUserValues.name,
@@ -179,17 +172,20 @@ export const BookEventForm = ({ onCancel }: BookEventFormProps) => {
return;
}
return await router.push(
getSuccessPath({
uid,
email: bookingForm.getValues("responses.email"),
formerTime: rescheduleBooking?.startTime
? dayjs(rescheduleBooking?.startTime).toISOString()
: undefined,
slug: `${eventSlug}`,
isRecurring: false,
})
);
const query = {
isSuccessBookingPage: true,
email: bookingForm.getValues("responses.email"),
eventTypeSlug: eventSlug,
seatReferenceUid: "seatReferenceUid" in responseData ? responseData.seatReferenceUid : null,
formerTime: rescheduleBooking?.startTime ? dayjs(rescheduleBooking.startTime).toString() : undefined,
};
return bookingSuccessRedirect({
router,
successRedirectUrl: eventType?.successRedirectUrl || "",
query,
bookingUid: uid,
});
},
onError: () => {
errorRef && errorRef.current?.scrollIntoView({ behavior: "smooth" });
@@ -205,14 +201,20 @@ export const BookEventForm = ({ onCancel }: BookEventFormProps) => {
return;
}
return await router.push(
getSuccessPath({
uid,
email: bookingForm.getValues("responses.email"),
slug: `${eventSlug}`,
isRecurring: true,
})
);
const query = {
isSuccessBookingPage: true,
allRemainingBookings: true,
email: bookingForm.getValues("responses.email"),
eventTypeSlug: eventSlug,
formerTime: rescheduleBooking?.startTime ? dayjs(rescheduleBooking.startTime).toString() : undefined,
};
return bookingSuccessRedirect({
router,
successRedirectUrl: eventType?.successRedirectUrl || "",
query,
bookingUid: uid,
});
},
});
@@ -40,13 +40,14 @@ export function Header({
// Only reason we create this component, is because it is used 3 times in this component,
// and this way we can't forget to update one of the props in all places :)
const LayoutToggleWithData = () => (
<LayoutToggle onLayoutToggle={onLayoutToggle} layout={layout} enabledLayouts={enabledLayouts} />
);
const LayoutToggleWithData = () => {
return enabledLayouts.length <= 1 ? null : (
<LayoutToggle onLayoutToggle={onLayoutToggle} layout={layout} enabledLayouts={enabledLayouts} />
);
};
// In month view we only show the layout toggle.
if (isMonthView) {
if (enabledLayouts.length <= 1) return null;
return <LayoutToggleWithData />;
}
+2 -2
View File
@@ -70,7 +70,7 @@ export const resizeAnimationConfig: ResizeAnimationConfig = {
"meta main main"
`,
gridTemplateColumns: "var(--booker-meta-width) var(--booker-main-width)",
gridTemplateRows: "auto",
gridTemplateRows: "1fr 0fr",
},
selecting_time: {
width: "calc(var(--booker-meta-width) + var(--booker-main-width) + var(--booker-timeslots-width))",
@@ -81,7 +81,7 @@ export const resizeAnimationConfig: ResizeAnimationConfig = {
"meta main timeslots"
`,
gridTemplateColumns: "var(--booker-meta-width) 1fr var(--booker-timeslots-width)",
gridTemplateRows: "auto",
gridTemplateRows: "1fr 0fr",
},
},
week_view: {
+2 -3
View File
@@ -167,9 +167,8 @@ export const useBookerStore = create<BookerStore>((set, get) => ({
layout: layout || BookerLayouts.MONTH_VIEW,
// Preselect today's date in week / column view, since they use this to show the week title.
selectedDate:
selectedDateInStore || ["week_view", "column_view"].includes(layout)
? dayjs().format("YYYY-MM-DD")
: null,
selectedDateInStore ||
(["week_view", "column_view"].includes(layout) ? dayjs().format("YYYY-MM-DD") : null),
});
// Unset selected timeslot if user is rescheduling. This could happen
@@ -68,7 +68,7 @@ export const AvailableTimes = ({
</header>
<div className="h-full pb-4">
{!slots.length && (
<div className="bg-subtle flex h-full flex-col items-center rounded-md p-6">
<div className="bg-subtle border-subtle flex h-full flex-col items-center rounded-md border p-6 dark:bg-transparent">
<CalendarX2 className="text-muted mb-2 h-4 w-4" />
<p className={classNames("text-muted", showTimeformatToggle ? "-mt-1 text-lg" : "text-sm")}>
{t("all_booked_today")}
@@ -278,18 +278,23 @@ async function handler(req: CustomRequest) {
}
}
await Promise.all(integrationsToDelete).then(async () => {
if (lastAttendee) {
await prisma.booking.update({
where: {
id: bookingToDelete.id,
},
data: {
status: BookingStatus.CANCELLED,
},
});
}
});
try {
await Promise.all(integrationsToDelete).then(async () => {
if (lastAttendee) {
await prisma.booking.update({
where: {
id: bookingToDelete.id,
},
data: {
status: BookingStatus.CANCELLED,
},
});
}
});
} catch (error) {
// Shouldn't stop code execution if integrations fail
// as integrations was already deleted
}
const tAttendees = await getTranslation(attendee.locale ?? "en", "common");
@@ -510,14 +515,6 @@ async function handler(req: CustomRequest) {
apiDeletes.push(deleteMeeting(videoCredential, uid));
}
}
// For bookings made before this refactor we go through the old behaviour of running through each video credential
} else {
bookingToDelete.user.credentials
.filter((credential) => credential.type.endsWith("_video"))
.forEach((credential) => {
const uidToDelete = bookingToDelete?.references?.[0]?.uid ?? bookingToDelete.uid;
apiDeletes.push(deleteMeeting(credential, uidToDelete));
});
}
// Avoiding taking care of recurrence for now as Payments are not supported with Recurring Events at the moment
@@ -626,7 +623,11 @@ async function handler(req: CustomRequest) {
});
// We skip the deletion of the event, because that would also delete the payment reference, which we should keep
await apiDeletes;
try {
await apiDeletes;
} catch (error) {
console.error("Error deleting event", error);
}
req.statusCode = 200;
return { message: "Booking successfully cancelled." };
}
@@ -655,10 +656,15 @@ async function handler(req: CustomRequest) {
const prismaPromises: Promise<unknown>[] = [bookingReferenceDeletes];
await Promise.all(prismaPromises.concat(apiDeletes));
await sendCancelledEmails(evt, { eventName: bookingToDelete?.eventType?.eventName });
// @TODO: find a way in the future if a promise fails don't stop the rest of the promises
// Also if emails fails try to requeue them
try {
await Promise.all(prismaPromises.concat(apiDeletes));
await sendCancelledEmails(evt, { eventName: bookingToDelete?.eventType?.eventName });
} catch (error) {
console.error("Error deleting event", error);
}
req.statusCode = 200;
return { message: "Booking successfully cancelled." };
}
@@ -47,12 +47,11 @@ const CalendarSwitch = (props: ICalendarSwitchProps) => {
throw new Error("Something went wrong");
}
} else {
const res = await fetch("/api/availability/calendar", {
const res = await fetch("/api/availability/calendar?" + new URLSearchParams(body), {
method: "DELETE",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (!res.ok) {
+1 -1
View File
@@ -109,7 +109,7 @@ const Days = ({
nextMonthButton: () => void;
}) => {
// Create placeholder elements for empty days in first week
const weekdayOfFirst = browsingDate.day();
const weekdayOfFirst = browsingDate.date(1).day();
const currentDate = minDate.utcOffset(browsingDate.utcOffset());
const availableDates = (includedDates: string[] | undefined) => {
const dates = [];
@@ -1,8 +1,8 @@
import create from "zustand";
import { create } from "zustand";
import dayjs from "@calcom/dayjs";
import {
import type {
CalendarComponentProps,
CalendarPublicActions,
CalendarState,
@@ -50,7 +50,7 @@ export const AddNewTeamsForm = () => {
}
},
onError: (error) => {
showToast(error.message, "error");
showToast(t(error.message), "error");
},
});
@@ -7,6 +7,8 @@ import { useState, useLayoutEffect } from "react";
import { Controller, useForm } from "react-hook-form";
import { z } from "zod";
import { useOrgBrandingValues } from "@calcom/features/ee/organizations/hooks";
import { subdomainSuffix } from "@calcom/features/ee/organizations/lib/orgDomains";
import { WEBAPP_URL } from "@calcom/lib/constants";
import { getPlaceholderAvatar } from "@calcom/lib/defaultAvatarImage";
import { useLocale } from "@calcom/lib/hooks/useLocale";
@@ -31,7 +33,6 @@ import {
} from "@calcom/ui";
import { getLayout } from "../../../../settings/layouts/SettingsLayout";
import { extractDomainFromWebsiteUrl } from "../../lib/utils";
const regex = new RegExp("^[a-zA-Z0-9-]*$");
@@ -47,6 +48,7 @@ const OrgProfileView = () => {
const utils = trpc.useContext();
const session = useSession();
const [firstRender, setFirstRender] = useState(true);
const orgBranding = useOrgBrandingValues();
useLayoutEffect(() => {
document.body.focus();
@@ -88,7 +90,9 @@ const OrgProfileView = () => {
(currentOrganisation.user.role === MembershipRole.OWNER ||
currentOrganisation.user.role === MembershipRole.ADMIN);
const permalink = `${currentOrganisation?.slug}.cal.com`;
const permalink = `${new URL(process.env.NEXT_PUBLIC_WEBSITE_URL || "").protocol}//${
orgBranding?.slug
}.${subdomainSuffix()}`;
const isBioEmpty =
!currentOrganisation ||
@@ -163,7 +167,7 @@ const OrgProfileView = () => {
<div className="mt-8">
<TextField
name="name"
label={t("team_name")}
label={t("org_name")}
value={value}
onChange={(e) => {
form.setValue("name", e?.target.value);
@@ -175,10 +179,10 @@ const OrgProfileView = () => {
<div className="mt-8">
<TextField
name="slug"
label={t("team_url")}
label={t("org_url")}
value={currentOrganisation.slug ?? ""}
disabled
addOnSuffix={`.${extractDomainFromWebsiteUrl}`}
addOnSuffix={`.${subdomainSuffix()}`}
/>
</div>
<div className="mt-8">
@@ -201,7 +205,7 @@ const OrgProfileView = () => {
<div className="flex">
<div className="flex-grow">
<div>
<Label className="text-emphasis">{t("team_name")}</Label>
<Label className="text-emphasis">{t("org_name")}</Label>
<p className="text-default text-sm">{currentOrganisation?.name}</p>
</div>
{currentOrganisation && !isBioEmpty && (
@@ -221,7 +225,7 @@ const OrgProfileView = () => {
navigator.clipboard.writeText(permalink);
showToast("Copied to clipboard", "success");
}}>
{t("copy_link_team")}
{t("copy_link_org")}
</LinkIconButton>
</div>
</div>
@@ -59,32 +59,7 @@ export const AddNewTeamMembersForm = ({
const { data: team, isLoading } = trpc.viewer.teams.get.useQuery({ teamId });
const inviteMemberMutation = trpc.viewer.teams.inviteMember.useMutation({
async onSuccess(data) {
await utils.viewer.teams.get.invalidate();
setMemberInviteModal(false);
if (data.sendEmailInvitation) {
if (Array.isArray(data.usernameOrEmail)) {
showToast(
t("email_invite_team_bulk", {
userCount: data.usernameOrEmail.length,
}),
"success"
);
} else {
showToast(
t("email_invite_team", {
email: data.usernameOrEmail,
}),
"success"
);
}
}
},
onError: (error) => {
showToast(error.message, "error");
},
});
const inviteMemberMutation = trpc.viewer.teams.inviteMember.useMutation();
const publishTeamMutation = trpc.viewer.teams.publish.useMutation({
onSuccess(data) {
@@ -121,14 +96,43 @@ export const AddNewTeamMembersForm = ({
teamId={teamId}
token={team?.inviteToken?.token}
onExit={() => setMemberInviteModal(false)}
onSubmit={(values) => {
inviteMemberMutation.mutate({
teamId,
language: i18n.language,
role: values.role,
usernameOrEmail: values.emailOrUsername,
sendEmailInvitation: values.sendInviteEmail,
});
onSubmit={(values, resetFields) => {
inviteMemberMutation.mutate(
{
teamId,
language: i18n.language,
role: values.role,
usernameOrEmail: values.emailOrUsername,
sendEmailInvitation: values.sendInviteEmail,
},
{
onSuccess: async (data) => {
await utils.viewer.teams.get.invalidate();
setMemberInviteModal(false);
if (data.sendEmailInvitation) {
if (Array.isArray(data.usernameOrEmail)) {
showToast(
t("email_invite_team_bulk", {
userCount: data.usernameOrEmail.length,
}),
"success"
);
resetFields();
} else {
showToast(
t("email_invite_team", {
email: data.usernameOrEmail,
}),
"success"
);
}
}
},
onError: (error) => {
showToast(error.message, "error");
},
}
);
}}
onSettingsOpen={() => {
setMemberInviteModal(false);
@@ -31,7 +31,7 @@ import { GoogleWorkspaceInviteButton } from "./GoogleWorkspaceInviteButton";
type MemberInvitationModalProps = {
isOpen: boolean;
onExit: () => void;
onSubmit: (values: NewMemberForm) => void;
onSubmit: (values: NewMemberForm, resetFields: () => void) => void;
onSettingsOpen?: () => void;
teamId: number;
members: PendingMember[];
@@ -114,6 +114,12 @@ export default function MemberInvitationModal(props: MemberInvitationModalProps)
}
};
const resetFields = () => {
newMemberFormMethods.reset();
newMemberFormMethods.setValue("emailOrUsername", "");
setModalInputMode("INDIVIDUAL");
};
return (
<Dialog
name="inviteModal"
@@ -154,7 +160,7 @@ export default function MemberInvitationModal(props: MemberInvitationModalProps)
/>
</div>
<Form form={newMemberFormMethods} handleSubmit={(values) => props.onSubmit(values)}>
<Form form={newMemberFormMethods} handleSubmit={(values) => props.onSubmit(values, resetFields)}>
<div className="mt-6 mb-10 space-y-6">
{/* Indivdual Invite */}
{modalImportMode === "INDIVIDUAL" && (
@@ -273,20 +279,6 @@ export default function MemberInvitationModal(props: MemberInvitationModalProps)
)}
/>
<div className="flex">
<Button
type="button"
color="minimal"
variant="icon"
onClick={() =>
props.token
? copyInviteLinkToClipboard(props.token)
: createInviteMutation.mutate({ teamId: props.teamId })
}
className={classNames("gap-2", props.token && "opacity-50")}
data-testid="copy-invite-link-button">
<Link className="text-default h-4 w-4" aria-hidden="true" />
{t("copy_invite_link")}
</Button>
{props.token && (
<Button
type="button"
@@ -303,12 +295,29 @@ export default function MemberInvitationModal(props: MemberInvitationModalProps)
</div>
</div>
<DialogFooter showDivider>
<div className= "relative right-40">
<Button
type="button"
color="minimal"
variant="icon"
onClick={() =>
props.token
? copyInviteLinkToClipboard(props.token)
: createInviteMutation.mutate({ teamId: props.teamId })
}
className={classNames("gap-2", props.token && "opacity-50")}
data-testid="copy-invite-link-button">
<Link className="text-default h-4 w-4" aria-hidden="true" />
{t("copy_invite_link")}
</Button>
</div>
<Button
type="button"
color="minimal"
onClick={() => {
props.onExit();
newMemberFormMethods.reset();
resetFields();
}}>
{t("cancel")}
</Button>
@@ -64,32 +64,7 @@ export default function TeamListItem(props: Props) {
const [openInviteLinkSettingsModal, setOpenInviteLinkSettingsModal] = useState(false);
const teamQuery = trpc.viewer.teams.get.useQuery({ teamId: team?.id });
const inviteMemberMutation = trpc.viewer.teams.inviteMember.useMutation({
async onSuccess(data) {
await utils.viewer.teams.get.invalidate();
setOpenMemberInvitationModal(false);
if (data.sendEmailInvitation) {
if (Array.isArray(data.usernameOrEmail)) {
showToast(
t("email_invite_team_bulk", {
userCount: data.usernameOrEmail.length,
}),
"success"
);
} else {
showToast(
t("email_invite_team", {
email: data.usernameOrEmail,
}),
"success"
);
}
}
},
onError: (error) => {
showToast(error.message, "error");
},
});
const inviteMemberMutation = trpc.viewer.teams.inviteMember.useMutation();
const acceptOrLeaveMutation = trpc.viewer.teams.acceptOrLeave.useMutation({
onSuccess: () => {
@@ -146,14 +121,43 @@ export default function TeamListItem(props: Props) {
onExit={() => {
setOpenMemberInvitationModal(false);
}}
onSubmit={(values) => {
inviteMemberMutation.mutate({
teamId: team.id,
language: i18n.language,
role: values.role,
usernameOrEmail: values.emailOrUsername,
sendEmailInvitation: values.sendInviteEmail,
});
onSubmit={(values, resetFields) => {
inviteMemberMutation.mutate(
{
teamId: team.id,
language: i18n.language,
role: values.role,
usernameOrEmail: values.emailOrUsername,
sendEmailInvitation: values.sendInviteEmail,
},
{
onSuccess: async (data) => {
await utils.viewer.teams.get.invalidate();
setOpenMemberInvitationModal(false);
if (data.sendEmailInvitation) {
if (Array.isArray(data.usernameOrEmail)) {
showToast(
t("email_invite_team_bulk", {
userCount: data.usernameOrEmail.length,
}),
"success"
);
resetFields();
} else {
showToast(
t("email_invite_team", {
email: data.usernameOrEmail,
}),
"success"
);
}
}
},
onError: (error) => {
showToast(error.message, "error");
},
}
);
}}
onSettingsOpen={() => {
setOpenMemberInvitationModal(false);
@@ -67,7 +67,6 @@ const MembersView = () => {
const router = useRouter();
const session = useSession();
const utils = trpc.useContext();
const teamId = Number(router.query.id);
@@ -84,32 +83,7 @@ const MembersView = () => {
}
);
const inviteMemberMutation = trpc.viewer.teams.inviteMember.useMutation({
async onSuccess(data) {
await utils.viewer.teams.get.invalidate();
setShowMemberInvitationModal(false);
if (data.sendEmailInvitation) {
if (Array.isArray(data.usernameOrEmail)) {
showToast(
t("email_invite_team_bulk", {
userCount: data.usernameOrEmail.length,
}),
"success"
);
} else {
showToast(
t("email_invite_team", {
email: data.usernameOrEmail,
}),
"success"
);
}
}
},
onError: (error) => {
showToast(error.message, "error");
},
});
const inviteMemberMutation = trpc.viewer.teams.inviteMember.useMutation();
const isInviteOpen = !team?.membership.accepted;
@@ -177,14 +151,43 @@ const MembersView = () => {
teamId={team.id}
token={team.inviteToken?.token}
onExit={() => setShowMemberInvitationModal(false)}
onSubmit={(values) => {
inviteMemberMutation.mutate({
teamId,
language: i18n.language,
role: values.role,
usernameOrEmail: values.emailOrUsername,
sendEmailInvitation: values.sendInviteEmail,
});
onSubmit={(values, resetFields) => {
inviteMemberMutation.mutate(
{
teamId,
language: i18n.language,
role: values.role,
usernameOrEmail: values.emailOrUsername,
sendEmailInvitation: values.sendInviteEmail,
},
{
onSuccess: async (data) => {
await utils.viewer.teams.get.invalidate();
setShowMemberInvitationModal(false);
if (data.sendEmailInvitation) {
if (Array.isArray(data.usernameOrEmail)) {
showToast(
t("email_invite_team_bulk", {
userCount: data.usernameOrEmail.length,
}),
"success"
);
resetFields();
} else {
showToast(
t("email_invite_team", {
email: data.usernameOrEmail,
}),
"success"
);
}
}
},
onError: (error) => {
showToast(error.message, "error");
},
}
);
}}
onSettingsOpen={() => {
setShowMemberInvitationModal(false);
@@ -16,7 +16,7 @@ import {
EventTypeMetaDataSchema,
customInputSchema,
userMetadata as userMetadataSchema,
bookerLayouts,
bookerLayouts as bookerLayoutsSchema,
BookerLayouts,
} from "@calcom/prisma/zod-utils";
@@ -39,6 +39,7 @@ const publicEventSelect = Prisma.validator<Prisma.EventTypeSelect>()({
seatsPerTimeSlot: true,
bookingFields: true,
team: true,
successRedirectUrl: true,
workflows: {
include: {
workflow: {
@@ -69,6 +70,7 @@ const publicEventSelect = Prisma.validator<Prisma.EventTypeSelect>()({
username: true,
name: true,
theme: true,
metadata: true,
},
},
hidden: true,
@@ -132,7 +134,7 @@ export const getPublicEvent = async (username: string, eventSlug: string, prisma
brandColor: users[0].brandColor,
darkBrandColor: users[0].darkBrandColor,
theme: null,
bookerLayouts: bookerLayouts.parse(
bookerLayouts: bookerLayoutsSchema.parse(
firstUsersMetadata?.defaultBookerLayouts || defaultEventBookerLayouts
),
},
@@ -165,9 +167,14 @@ export const getPublicEvent = async (username: string, eventSlug: string, prisma
const eventMetaData = EventTypeMetaDataSchema.parse(event.metadata || {});
const users = getUsersFromEvent(event) || (await getOwnerFromUsersArray(prisma, event.id));
if (users === null) {
throw new Error("Event has no owner");
}
return {
...event,
bookerLayouts: bookerLayouts.parse(eventMetaData?.bookerLayouts || null),
bookerLayouts: bookerLayoutsSchema.parse(eventMetaData?.bookerLayouts || null),
description: markdownToSafeHTML(event.description),
metadata: eventMetaData,
customInputs: customInputSchema.array().parse(event.customInputs || []),
@@ -176,7 +183,7 @@ export const getPublicEvent = async (username: string, eventSlug: string, prisma
recurringEvent: isRecurringEvent(event.recurringEvent) ? parseRecurringEvent(event.recurringEvent) : null,
// Sets user data on profile object for easier access
profile: getProfileFromEvent(event),
users: getUsersFromEvent(event),
users,
};
};
@@ -220,7 +227,7 @@ function getProfileFromEvent(event: Event) {
brandColor: profile.brandColor,
darkBrandColor: profile.darkBrandColor,
theme: profile.theme,
bookerLayouts: bookerLayouts.parse(
bookerLayouts: bookerLayoutsSchema.parse(
eventMetaData?.bookerLayouts ||
(userMetaData && "defaultBookerLayouts" in userMetaData ? userMetaData.defaultBookerLayouts : null)
),
@@ -232,13 +239,22 @@ function getUsersFromEvent(event: Event) {
if (team) {
return (hosts || []).map(mapHostsToUsers);
}
if (!owner) throw new Error("Event has no owner");
if (!owner) {
return null;
}
const { username, name, weekStart } = owner;
return [{ username, name, weekStart }];
}
async function getOwnerFromUsersArray(prisma: PrismaClient, eventTypeId: number) {
const { users } = await prisma.eventType.findUniqueOrThrow({
where: { id: eventTypeId },
select: { users: { select: { username: true, name: true, weekStart: true } } },
});
if (!users.length) return null;
return [users[0]];
}
function mapHostsToUsers(host: { user: Pick<User, "username" | "name" | "weekStart"> }) {
return {
username: host.user.username,
@@ -178,7 +178,7 @@ const BackButtonInSidebar = ({ name }: { name: string }) => {
className="hover:bg-subtle [&[aria-current='page']]:bg-emphasis [&[aria-current='page']]:text-emphasis group-hover:text-default text-emphasis group my-6 flex h-6 max-h-6 w-full flex-row items-center rounded-md py-2 px-3 text-sm font-medium leading-4"
data-testid={`vertical-tab-${name}`}>
<ArrowLeft className="h-4 w-4 stroke-[2px] ltr:mr-[10px] rtl:ml-[10px] rtl:rotate-180 md:mt-0" />
<Skeleton title={name} as="p" className="max-w-36 min-h-4 truncate">
<Skeleton title={name} as="p" className="max-w-36 min-h-4 truncate" loadingClassName="ms-3">
{name}
</Skeleton>
</Link>
@@ -245,7 +245,13 @@ const SettingsSidebarContainer = ({
alt="User Avatar"
/>
)}
<p className="truncate text-sm font-medium leading-5">{t(tab.name)}</p>
<Skeleton
title={tab.name}
as="p"
className="truncate text-sm font-medium leading-5"
loadingClassName="ms-3">
{t(tab.name)}
</Skeleton>
</div>
</div>
<div className="my-3 space-y-0.5">
@@ -270,7 +276,13 @@ const SettingsSidebarContainer = ({
{tab && tab.icon && (
<tab.icon className="h-[16px] w-[16px] stroke-[2px] ltr:mr-3 rtl:ml-3 md:mt-0" />
)}
<p className="truncate text-sm font-medium leading-5">{t(tab.name)}</p>
<Skeleton
title={tab.name}
as="p"
className="truncate text-sm font-medium leading-5"
loadingClassName="ms-3">
{t(tab.name)}
</Skeleton>
</div>
</Link>
{teams &&
@@ -386,6 +398,7 @@ const SettingsSidebarContainer = ({
href={`${WEBAPP_URL}/settings/teams/new`}
textClassNames="px-3 items-center mt-2 text-emphasis font-medium text-sm"
icon={Plus}
iconClassName="me-3"
disableChevron
/>
</div>
+51 -43
View File
@@ -23,6 +23,7 @@ import AdminPasswordBanner from "@calcom/features/users/components/AdminPassword
import VerifyEmailBanner from "@calcom/features/users/components/VerifyEmailBanner";
import classNames from "@calcom/lib/classNames";
import { APP_NAME, DESKTOP_APP_LINK, JOIN_SLACK, ROADMAP, WEBAPP_URL } from "@calcom/lib/constants";
import { getPlaceholderAvatar } from "@calcom/lib/defaultAvatarImage";
import getBrandColours from "@calcom/lib/getBrandColours";
import { useIsomorphicLayoutEffect } from "@calcom/lib/hooks/useIsomorphicLayoutEffect";
import { useLocale } from "@calcom/lib/hooks/useLocale";
@@ -335,45 +336,44 @@ function UserDropdown({ small }: UserDropdownProps) {
}
return (
<Dropdown open={menuOpen}>
<div className="ltr:sm:-ml-5 rtl:sm:-mr-5">
<DropdownMenuTrigger asChild onClick={() => setMenuOpen((menuOpen) => !menuOpen)}>
<button
<DropdownMenuTrigger asChild onClick={() => setMenuOpen((menuOpen) => !menuOpen)}>
<button
className={classNames(
"hover:bg-emphasis group mx-0 flex cursor-pointer appearance-none items-center rounded-full text-left outline-none focus:outline-none focus:ring-0 md:rounded-none lg:rounded",
small ? "p-2" : "px-2 py-1"
)}>
<span
className={classNames(
"hover:bg-emphasis group mx-0 ml-7 flex cursor-pointer appearance-none items-center rounded-full text-left outline-none focus:outline-none focus:ring-0 md:rounded-none lg:rounded",
small ? "p-2" : "px-2 py-1"
small ? "h-4 w-4" : "h-6 w-6 ltr:mr-2 rtl:ml-2",
"relative flex-shrink-0 rounded-full bg-gray-300"
)}>
<Avatar
size={small ? "xs" : "sm"}
imageSrc={avatar?.avatar || WEBAPP_URL + "/" + user.username + "/avatar.png"}
alt={user.username || "Nameless User"}
className="overflow-hidden"
/>
<span
className={classNames(
small ? "h-4 w-4" : "h-6 w-6 ltr:mr-2 rtl:ml-2",
"relative flex-shrink-0 rounded-full bg-gray-300 "
)}>
<Avatar
size={small ? "xs" : "sm"}
imageSrc={avatar?.avatar || WEBAPP_URL + "/" + user.username + "/avatar.png"}
alt={user.username || "Nameless User"}
/>
<span
className={classNames(
"border-muted absolute -bottom-1 -right-1 rounded-full border-2 bg-green-500",
user.away ? "bg-yellow-500" : "bg-green-500",
small ? "-bottom-0.5 -right-0.5 h-2.5 w-2.5" : "bottom-0 right-0 h-3 w-3"
)}
"border-muted absolute -bottom-1 -right-1 rounded-full border-2 bg-green-500",
user.away ? "bg-yellow-500" : "bg-green-500",
small ? "-bottom-0.5 -right-0.5 h-2.5 w-2.5" : "bottom-0 right-0 h-3 w-3"
)}
/>
</span>
{!small && (
<span className="flex flex-grow items-center">
<span className="line-clamp-1 flex-grow text-sm leading-none">
<span className="text-emphasis block font-medium">{user.name || "Nameless User"}</span>
</span>
<ChevronDown
className="group-hover:text-subtle text-muted h-4 w-4 flex-shrink-0 rtl:mr-4"
aria-hidden="true"
/>
</span>
{!small && (
<span className="flex flex-grow items-center">
<span className="line-clamp-1 flex-grow text-sm leading-none">
<span className="text-emphasis block font-medium">{user.name || "Nameless User"}</span>
</span>
<ChevronDown
className="group-hover:text-subtle text-muted h-4 w-4 flex-shrink-0 rtl:mr-4"
aria-hidden="true"
/>
</span>
)}
</button>
</DropdownMenuTrigger>
</div>
)}
</button>
</DropdownMenuTrigger>
<DropdownMenuPortal>
<FreshChatProvider>
@@ -836,13 +836,17 @@ function SideBar({ bannersHeight, user }: SideBarProps) {
<aside
style={{ maxHeight: `calc(100vh - ${bannersHeight}px)`, top: `${bannersHeight}px` }}
className="desktop-transparent bg-muted border-muted fixed left-0 hidden h-full max-h-screen w-14 flex-col overflow-y-auto overflow-x-hidden border-r dark:bg-gradient-to-tr dark:from-[#2a2a2a] dark:to-[#1c1c1c] md:sticky md:flex lg:w-56 lg:px-3">
<div className="flex h-full flex-col justify-between py-3 lg:pt-6 ">
<div className="flex h-full flex-col justify-between py-3 lg:pt-4">
<header className="items-center justify-between md:hidden lg:flex">
{orgBranding ? (
<Link href="/event-types" className="px-2">
<Link href="/event-types" className="px-1.5">
{orgBranding ? (
<div className="flex items-center gap-2 font-medium">
{orgBranding.logo && <Avatar alt="" imageSrc={orgBranding.logo} size="sm" />}
<Avatar
alt={`${orgBranding.name} logo`}
imageSrc={getPlaceholderAvatar(orgBranding.logo, orgBranding.name)}
size="xsm"
/>
<p className="text line-clamp-1 text-sm">
<span>{orgBranding.name}</span>
</p>
@@ -861,7 +865,7 @@ function SideBar({ bannersHeight, user }: SideBarProps) {
</span>
</div>
)}
<div className="flex space-x-1 rtl:space-x-reverse">
<div className="flex space-x-0.5 rtl:space-x-reverse">
<button
color="minimal"
onClick={() => window.history.back()}
@@ -895,7 +899,7 @@ function SideBar({ bannersHeight, user }: SideBarProps) {
<div>
<Tips />
{bottomNavItems.map(({ icon: Icon, ...item }) => (
{bottomNavItems.map(({ icon: Icon, ...item }, index) => (
<Tooltip side="right" content={t(item.name)} className="lg:hidden" key={item.name}>
<ButtonOrLink
href={item.href || undefined}
@@ -903,9 +907,10 @@ function SideBar({ bannersHeight, user }: SideBarProps) {
target={item.target}
className={classNames(
"text-left",
"[&[aria-current='page']]:bg-emphasis text-default group flex items-center rounded-md py-2 px-3 text-sm font-medium",
"[&[aria-current='page']]:text-emphasis mt-0.5 text-sm",
isLocaleReady ? "hover:bg-emphasis hover:text-emphasis" : ""
"[&[aria-current='page']]:bg-emphasis text-default justify-right group flex items-center rounded-md py-2 px-3 text-sm font-medium",
"[&[aria-current='page']]:text-emphasis mt-0.5 w-full text-sm",
isLocaleReady ? "hover:bg-emphasis hover:text-emphasis" : "",
index === 0 && "mt-3"
)}
aria-current={
defaultIsCurrent && defaultIsCurrent({ item: { href: item.href }, router })
@@ -915,7 +920,10 @@ function SideBar({ bannersHeight, user }: SideBarProps) {
onClick={item.onClick}>
{!!Icon && (
<Icon
className="mr-2 h-4 w-4 flex-shrink-0 ltr:mr-2 rtl:ml-2 [&[aria-current='page']]:text-inherit"
className={classNames(
"h-4 w-4 flex-shrink-0 [&[aria-current='page']]:text-inherit",
"mx-auto md:ltr:mr-2 md:rtl:ml-2"
)}
aria-hidden="true"
aria-current={
defaultIsCurrent && defaultIsCurrent({ item: { href: item.href }, router })
@@ -1020,7 +1028,7 @@ function MainContainer({
<main className="bg-default relative z-0 flex-1 focus:outline-none">
{/* show top navigation for md and smaller (tablet and phones) */}
{TopNavContainerProp}
<div className="max-w-full py-4 px-4 md:py-8 lg:px-12">
<div className="max-w-full px-4 py-4 md:py-8 lg:px-12">
<ErrorBoundary>
{!props.withoutMain ? <ShellMain {...props}>{props.children}</ShellMain> : props.children}
</ErrorBoundary>
@@ -4,7 +4,8 @@ import { APP_NAME } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc";
import useEmailVerifyCheck from "@calcom/trpc/react/hooks/useEmailVerifyCheck";
import { Button, TopBanner, showToast } from "@calcom/ui";
import { TopBanner, showToast } from "@calcom/ui";
import { Mail } from "@calcom/ui/components/icon";
import { useFlagMap } from "../../flags/context/provider";
@@ -21,16 +22,18 @@ function VerifyEmailBanner() {
return (
<>
<TopBanner
Icon={Mail}
text={t("verify_email_banner_body", { appName: APP_NAME })}
variant="warning"
actions={
<Button
<a
className="underline hover:cursor-pointer"
onClick={() => {
mutation.mutate();
showToast(t("email_sent"), "success");
}}>
{t("send_email")}
</Button>
{t("resend_email")}
</a>
}
/>
</>
+1 -1
View File
@@ -180,7 +180,7 @@ export const getUsernameList = (users: string | string[] | undefined): string[]
const allUsers = users.map((user) =>
user
.toLowerCase()
.replace(/( |%20)/g, "+")
.replace(/( |%20|%2b)/g, "+")
.split("+")
);
+10
View File
@@ -28,3 +28,13 @@ export function isIpInBanlist(request: Request | NextApiRequest) {
}
return false;
}
export function isIpInBanListString(identifer: string) {
const rawBanListJson = process.env.IP_BANLIST || "[]";
const banList = banlistSchema.parse(JSON.parse(rawBanListJson));
if (banList.includes(identifer)) {
console.log(`Found banned IP: ${identifer} in IP_BANLIST`);
return true;
}
return false;
}
+44 -22
View File
@@ -1,27 +1,49 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import cache from "memory-cache";
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
import { ErrorCode } from "@calcom/features/auth/lib/ErrorCode";
import { isIpInBanListString } from "./getIP";
import logger from "./logger";
const rateLimit = (options: { intervalInMs: number }) => {
return {
check: (requestLimit: number, uniqueIdentifier: string) => {
const count = cache.get(uniqueIdentifier) || [0];
if (count[0] === 0) {
cache.put(uniqueIdentifier, count, options.intervalInMs);
}
count[0] += 1;
const log = logger.getChildLogger({ prefix: ["RateLimit"] });
const currentUsage = count[0];
const isRateLimited = currentUsage >= requestLimit;
if (isRateLimited) {
throw new Error(ErrorCode.RateLimitExceeded);
}
return { isRateLimited, requestLimit, remaining: isRateLimited ? 0 : requestLimit - currentUsage };
},
};
type RateLimitHelper = {
rateLimitingType?: "core" | "forcedSlowMode";
identifier: string;
};
export default rateLimit;
function rateLimiter() {
const UPSATCH_ENV_FOUND = process.env.UPSTASH_REDIS_REST_URL && process.env.UPSTASH_REDIS_REST_TOKEN;
if (!UPSATCH_ENV_FOUND) {
log.warn("Disabled due to not finding UPSTASH env variables");
return () => ({ success: true });
}
const redis = Redis.fromEnv();
const limiter = {
core: new Ratelimit({
redis,
analytics: true,
prefix: "ratelimit",
limiter: Ratelimit.fixedWindow(10, "60s"),
}),
forcedSlowMode: new Ratelimit({
redis,
analytics: true,
prefix: "ratelimit:slowmode",
limiter: Ratelimit.fixedWindow(1, "30s"),
}),
};
async function rateLimit({ rateLimitingType = "core", identifier }: RateLimitHelper) {
if (isIpInBanListString(identifier)) {
return await limiter.forcedSlowMode.limit(identifier);
}
return await limiter[rateLimitingType].limit(identifier);
}
return rateLimit;
}
export default rateLimiter;
@@ -129,13 +129,13 @@ export const updateProfileHandler = async ({ ctx, input }: UpdateProfileOptions)
});
}
// Revalidate booking pages
const res = ctx.res as NextApiResponse;
// Disabled because the booking pages are currently not using getStaticProps
/*const res = ctx.res as NextApiResponse;
if (typeof res?.revalidate !== "undefined") {
const eventTypes = await prisma.eventType.findMany({
where: {
userId: user.id,
team: null,
hidden: false,
},
select: {
id: true,
@@ -143,9 +143,11 @@ export const updateProfileHandler = async ({ ctx, input }: UpdateProfileOptions)
},
});
// waiting for this isn't needed
Promise.all(eventTypes.map((eventType) => res?.revalidate(`/${ctx.user.username}/${eventType.slug}`)))
Promise.all(
eventTypes.map((eventType) => res?.revalidate(`/new-booker/${ctx.user.username}/${eventType.slug}`))
)
.then(() => console.info("Booking pages revalidated"))
.catch((e) => console.error(e));
}
}*/
return input;
};
@@ -226,7 +226,7 @@ export const getByViewerHandler = async ({ ctx }: GetByViewerOptions) => {
image: `${CAL_URL}/team/${membership.team.slug}/avatar.png`,
slug: membership.team.slug
? !membership.team.parentId
? `/team`
? `team/${membership.team.slug}`
: "" + membership.team.slug
: null,
},
@@ -86,7 +86,7 @@ export const createHandler = async ({ input }: CreateOptions) => {
name,
...(!IS_TEAM_BILLING_ENABLED && { slug }),
metadata: {
requestedSlug: slug,
...(IS_TEAM_BILLING_ENABLED && { requestedSlug: slug }),
isOrganization: true,
},
},
@@ -113,7 +113,7 @@ export const createHandler = async ({ input }: CreateOptions) => {
.update(adminEmail + process.env.CALENDSO_ENCRYPTION_KEY)
.digest("hex");
totp.options = { step: 90 };
totp.options = { step: 900 };
const code = totp.generate(secret);
await sendOrganizationEmailVerification({
@@ -18,10 +18,14 @@ type CreateTeamsOptions = {
export const createTeamsHandler = async ({ ctx, input }: CreateTeamsOptions) => {
const { teamNames, orgId } = input;
const organization = await prisma.team.findFirst({ where: { id: orgId }, select: { metadata: true } });
const organization = await prisma.team.findFirst({
where: { id: orgId },
select: { slug: true, metadata: true },
});
const metadata = teamMetadataSchema.parse(organization?.metadata);
if (!metadata?.requestedSlug) throw new TRPCError({ code: "BAD_REQUEST", message: "no_organization" });
if (!metadata?.requestedSlug && !organization?.slug)
throw new TRPCError({ code: "BAD_REQUEST", message: "no_organization_slug" });
const userMembership = await prisma.membership.findFirst({
where: {
@@ -24,6 +24,7 @@ export const verifyCodeHandler = async ({ ctx, input }: VerifyCodeOptions) => {
.update(email + process.env.CALENDSO_ENCRYPTION_KEY)
.digest("hex");
totp.options = { step: 900 };
const isValidToken = totp.check(code, secret);
if (!isValidToken) throw new TRPCError({ code: "BAD_REQUEST", message: "invalid_code" });
+7 -7
View File
@@ -32,7 +32,7 @@ export const Alert = forwardRef<HTMLDivElement, AlertProps>((props, ref) => {
severity === "success" && "bg-inverted text-inverted",
severity === "neutral" && "bg-subtle text-default"
)}>
<div className="relative flex flex-col md:flex-row">
<div className="relative flex md:flex-row">
{CustomIcon ? (
<div className="flex-shrink-0">
<CustomIcon aria-hidden="true" className={classNames("text-default h-5 w-5", iconClassName)} />
@@ -71,13 +71,13 @@ export const Alert = forwardRef<HTMLDivElement, AlertProps>((props, ref) => {
)}
</div>
)}
<div className="ml-3 flex-grow">
<h3 className="text-sm font-medium">{props.title}</h3>
<div className="text-sm">{props.message}</div>
<div className="flex flex-grow flex-col sm:flex-row">
<div className="ml-3 ">
<h3 className="text-sm font-medium">{props.title}</h3>
<div className="text-sm">{props.message}</div>
</div>
{props.actions && <div className="ml-auto mt-2 text-sm sm:mt-0 md:relative">{props.actions}</div>}
</div>
{/* @TODO: Shouldn't be absolute. This makes it harder to give margin etc. */}
{props.actions && <div className="absolute top-1 right-1 text-sm md:relative">{props.actions}</div>}
</div>
</div>
);
+3 -2
View File
@@ -12,7 +12,7 @@ import { Tooltip } from "../tooltip";
export type AvatarProps = {
className?: string;
size: "xs" | "sm" | "md" | "mdLg" | "lg" | "xl";
size: "xs" | "xsm" | "sm" | "md" | "mdLg" | "lg" | "xl";
imageSrc?: Maybe<string>;
title?: string;
alt: string;
@@ -24,7 +24,8 @@ export type AvatarProps = {
};
const sizesPropsBySize = {
xs: "w-4 h-4 min-w-4 min-h-4", // 16px
xs: "w-4 h-4 min-w-4 min-h-4 max-h-4", // 16px
xsm: "w-5 h-5 min-w-5 min-h-5", // 20px
sm: "w-6 h-6 min-w-6 min-h-6", // 24px
md: "w-8 h-8 min-w-8 min-h-8", // 32px
mdLg: "w-10 h-10 min-w-10 min-h-10", //40px
@@ -1,10 +1,12 @@
import classNames from "classnames";
import { noop } from "lodash";
import type { ReactNode } from "react";
import type { ComponentType, ReactNode } from "react";
import type { LucideIcon, LucideProps } from "@calcom/ui/components/icon";
import { X, AlertTriangle, Info } from "@calcom/ui/components/icon";
export type TopBannerProps = {
Icon?: ComponentType<LucideProps> & LucideIcon;
text: string;
variant?: keyof typeof variantClassName;
actions?: ReactNode;
@@ -17,8 +19,26 @@ const variantClassName = {
error: "bg-red-400",
};
const defaultIconProps = {
className: "text-emphasis h-4 w-4 stroke-[2.5px]",
"aria-hidden": "true",
} as LucideProps;
export function TopBanner(props: TopBannerProps) {
const { variant = "default", text, actions, onClose } = props;
const { Icon, variant = "default", text, actions, onClose } = props;
const renderDefaultIconByVariant = () => {
switch (variant) {
case "error":
return <AlertTriangle {...defaultIconProps} />;
case "warning":
return <Info {...defaultIconProps} />;
default:
return null;
}
};
const defaultIcon = renderDefaultIconByVariant();
return (
<div
data-testid="banner"
@@ -28,12 +48,7 @@ export function TopBanner(props: TopBannerProps) {
)}>
<div className="flex flex-1 flex-col items-start justify-center gap-2 p-1 lg:flex-row lg:items-center">
<p className="text-emphasis flex flex-col items-start justify-center gap-2 text-left font-sans text-sm font-medium leading-4 lg:flex-row lg:items-center">
{variant === "error" && (
<AlertTriangle className="text-emphasis h-4 w-4 stroke-[2.5px]" aria-hidden="true" />
)}
{variant === "warning" && (
<Info className="text-emphasis h-4 w-4 stroke-[2.5px]" aria-hidden="true" />
)}
{Icon ? <Icon {...defaultIconProps} /> : defaultIcon}
{text}
</p>
{actions && <div className="text-sm font-medium">{actions}</div>}
+1 -1
View File
@@ -30,7 +30,7 @@
"@wojtekmaj/react-daterange-picker": "^3.3.1",
"class-variance-authority": "^0.4.0",
"downshift": "^6.1.9",
"next": "^13.2.1",
"next": "^13.4.6",
"react": "^18.2.0",
"react-colorful": "^5.6.0",
"react-feather": "^2.0.10",

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