Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a6e5ce427 | ||
|
|
b2382211db | ||
|
|
12148506bd | ||
|
|
b5666fd4c3 | ||
|
|
bc7da563d8 | ||
|
|
d3acf4160d | ||
|
|
65e0c0e4c5 | ||
|
|
2dda6a509b | ||
|
|
7238414864 | ||
|
|
bab41ca8a6 | ||
|
|
376f023e0f | ||
|
|
0cbf525a78 | ||
|
|
f56fefec4d | ||
|
|
66eccd6dd8 | ||
|
|
c4b9a9e2f4 | ||
|
|
38921e58cd | ||
|
|
2c9c6c77f7 | ||
|
|
46605e049d | ||
|
|
01e1e82ced | ||
|
|
8e17716094 | ||
|
|
7c028b6479 | ||
|
|
cba4bae5cd | ||
|
|
55046f3017 | ||
|
|
4836621c31 | ||
|
|
6743aa4609 | ||
|
|
bbad0fbc18 | ||
|
|
8f6812ecb2 | ||
|
|
303b09f341 | ||
|
|
1f3ee41eb4 | ||
|
|
01c711a81e | ||
|
|
16bb5c3384 | ||
|
|
c55d97368e | ||
|
|
ef193aca31 | ||
|
|
c36a6797a9 | ||
|
|
f393fd4ad4 | ||
|
|
8987b9bdbc | ||
|
|
68bf426af0 | ||
|
|
1125900013 | ||
|
|
d272e823c3 | ||
|
|
3ea11d4f38 | ||
|
|
b4dc64594c | ||
|
|
6a763b3720 | ||
|
|
252ac1c704 | ||
|
|
c51e42a061 | ||
|
|
e3f9e477fe | ||
|
|
b265970b01 | ||
|
|
7b7b2ffc9a | ||
|
|
d019062709 | ||
|
|
ad9d728314 | ||
|
|
b564fb9a2f | ||
|
|
9c05f6839c | ||
|
|
4dea38f06d | ||
|
|
c4fc222204 | ||
|
|
00c3a2dd80 | ||
|
|
46fa0088f2 | ||
|
|
a19fd9b889 | ||
|
|
d379c10510 | ||
|
|
f3a58145ee | ||
|
|
e6125dc361 | ||
|
|
b78f718e9e | ||
|
|
53e87f7769 | ||
|
|
86eb40e0fd | ||
|
|
51caa6834a | ||
|
|
7a7a5b5285 | ||
|
|
f14ffb9e44 | ||
|
|
001b524005 | ||
|
|
a8cf4fb309 | ||
|
|
155775556d | ||
|
|
d66095bf9c | ||
|
|
0ddab30340 | ||
|
|
2a9e061575 | ||
|
|
351dce5cfd | ||
|
|
3255d9012c | ||
|
|
226dcb3fcf | ||
|
|
f80e9b2558 | ||
|
|
3f273235a6 | ||
|
|
e8554ed5c5 | ||
|
|
a03744008c | ||
|
|
fe8b13885c | ||
|
|
8995dcc82a | ||
|
|
e8e0d03265 | ||
|
|
56031f0358 | ||
|
|
1ef0f830d3 | ||
|
|
59e2f6e4a7 | ||
|
+15 |
67bb2ed798 | ||
|
|
ea4618a244 | ||
|
|
201a9d9356 | ||
|
|
40b0d57024 | ||
|
|
761f66fc5a | ||
|
|
2403d77166 | ||
|
|
b44f4d66f9 | ||
|
|
d178962c37 | ||
|
|
cf4d2b4ef5 | ||
|
|
3e4139ac23 | ||
|
|
9fb736f67a | ||
|
|
afc738141f | ||
|
|
efa195059e | ||
|
|
0f2b6bbe1a | ||
|
|
28b94a865f | ||
|
|
f45803fcfa | ||
|
|
053da1ec32 | ||
|
|
f0dcfc83c8 | ||
|
|
5eb3af54b3 | ||
|
|
3552bbc6cf | ||
|
|
028bd77c91 | ||
|
|
65a1aa6100 | ||
|
|
a09401c203 | ||
|
|
7c23773636 | ||
|
|
56ba8c0a07 | ||
|
|
5924bc0990 | ||
|
+27 |
10ffd9bacd | ||
|
|
20c45b5d88 | ||
|
|
3cab37ed8d | ||
|
|
98799b50f0 | ||
|
|
8071016848 | ||
|
|
aa5e2ac9a5 | ||
|
|
06857a4a69 | ||
|
|
b0d1720d92 | ||
|
|
e148ee7823 | ||
|
|
bb9a039931 | ||
|
|
053f93ea0a | ||
|
|
2a982c6b6d | ||
|
|
85490fef4d | ||
|
|
57afd7a2b1 | ||
|
|
0f9c3571fe | ||
|
|
1b3f676e57 | ||
|
|
3e17b1c5ef | ||
|
|
a466e71d4c | ||
|
|
5a7030d277 | ||
|
|
e72c25f02e | ||
|
|
06bc5facf3 | ||
|
|
9c8dc1b92c | ||
|
|
cfef92a7bc | ||
|
|
26149e2b04 | ||
|
|
3ca43ce3f3 | ||
|
|
7603ea6184 | ||
|
|
9c45da565e | ||
|
|
f84f1f5dda | ||
|
|
07f803e758 | ||
|
|
268ab882cd | ||
|
|
8052e6f6d4 | ||
|
|
99e9425257 | ||
|
|
471b2687c4 | ||
|
|
9f7152c4eb | ||
|
|
e819a31dd6 | ||
|
|
8356cb7d34 | ||
|
|
ceb18167cf | ||
|
|
4d5697f5a5 | ||
|
|
afe180a0ec | ||
|
|
851a388853 | ||
|
|
07e20144df | ||
|
|
1535e48ce5 | ||
|
|
0dce391f46 | ||
|
|
cfe7ea45ec | ||
|
|
c244f0fc8e | ||
|
|
5301af2e9f | ||
|
|
a4e7ca91b5 | ||
|
|
64e6e1a19a | ||
|
|
a6daf17909 | ||
|
|
c7dfa7bc89 |
@@ -1,6 +1,7 @@
|
||||
# ********** INDEX **********
|
||||
#
|
||||
# - APP STORE
|
||||
# - BASECAMP
|
||||
# - DAILY.CO VIDEO
|
||||
# - GOOGLE CALENDAR/MEET/LOGIN
|
||||
# - HUBSPOT
|
||||
@@ -20,6 +21,14 @@
|
||||
|
||||
# - APP STORE **********************************************************************************************
|
||||
# ⚠️ ⚠️ ⚠️ THESE WILL BE MIGRATED TO THE DATABASE TO PREVENT AWS's 4KB ENV QUOTA ⚠️ ⚠️ ⚠️
|
||||
|
||||
# - BASECAMP
|
||||
# Used to enable Basecamp integration with Cal.com
|
||||
# @see https://github.com/calcom/cal.com#obtaining-basecamp-client-id-and-secret
|
||||
BASECAMP3_CLIENT_ID=
|
||||
BASECAMP3_CLIENT_SECRET=
|
||||
BASECAMP3_USER_AGENT=
|
||||
|
||||
# - DAILY.CO VIDEO
|
||||
# Enables Cal Video. to get your key
|
||||
# 1. Visit our [Daily.co Partnership Form](https://go.cal.com/daily) and enter your information
|
||||
|
||||
+12
-2
@@ -126,8 +126,7 @@ TWILIO_WHATSAPP_PHONE_NUMBER=
|
||||
NEXT_PUBLIC_SENDER_ID=
|
||||
TWILIO_VERIFY_SID=
|
||||
|
||||
# This is used so we can bypass emails in auth flows for E2E testing
|
||||
# Set it to "1" if you need to run E2E tests locally
|
||||
# Set it to "1" if you need to run E2E tests locally.
|
||||
NEXT_PUBLIC_IS_E2E=
|
||||
|
||||
# Used for internal billing system
|
||||
@@ -172,6 +171,12 @@ EMAIL_SERVER_PORT=1025
|
||||
## You will need to provision an App Password.
|
||||
## @see https://support.google.com/accounts/answer/185833
|
||||
# EMAIL_SERVER_PASSWORD='<gmail_app_password>'
|
||||
|
||||
# Used for E2E for email testing
|
||||
# Set it to "1" if you need to email checks in E2E tests locally
|
||||
# Make sure to run mailhog container manually or with `yarn dx`
|
||||
E2E_TEST_MAILHOG_ENABLED=
|
||||
|
||||
# **********************************************************************************************************
|
||||
|
||||
# Set the following value to true if you wish to enable Team Impersonation
|
||||
@@ -215,3 +220,8 @@ PROJECT_ID_VERCEL=
|
||||
TEAM_ID_VERCEL=
|
||||
# Get it from: https://vercel.com/account/tokens
|
||||
AUTH_BEARER_TOKEN_VERCEL=
|
||||
|
||||
# - APPLE CALENDAR
|
||||
# Used for E2E tests on Apple Calendar
|
||||
E2E_TEST_APPLE_CALENDAR_EMAIL=""
|
||||
E2E_TEST_APPLE_CALENDAR_PASSWORD=""
|
||||
|
||||
@@ -5,16 +5,15 @@ on:
|
||||
types:
|
||||
- opened
|
||||
|
||||
|
||||
jobs:
|
||||
label_on_pr:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
|
||||
permissions:
|
||||
contents: none
|
||||
issues: read
|
||||
pull-requests: write
|
||||
|
||||
|
||||
steps:
|
||||
- name: Apply labels from linked issue to PR
|
||||
uses: actions/github-script@v5
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# .github/workflows/chromatic.yml
|
||||
|
||||
# Workflow name
|
||||
name: 'Chromatic'
|
||||
name: "Chromatic"
|
||||
|
||||
# Event for the workflow
|
||||
on:
|
||||
|
||||
@@ -4,8 +4,8 @@ on:
|
||||
# "Scheduled workflows run on the latest commit on the default or base branch."
|
||||
# — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule
|
||||
schedule:
|
||||
# Runs “At minute 0, 15, 30, and 45.” (see https://crontab.guru)
|
||||
- cron: "0,15,30,45 * * * *"
|
||||
# Runs "At every 15th minute." (see https://crontab.guru)
|
||||
- cron: "*/15 * * * *"
|
||||
jobs:
|
||||
cron-bookingReminder:
|
||||
env:
|
||||
@@ -20,4 +20,4 @@ jobs:
|
||||
-X POST \
|
||||
-H 'content-type: application/json' \
|
||||
-H 'authorization: ${{ secrets.CRON_API_KEY }}' \
|
||||
--fail
|
||||
-sSf
|
||||
|
||||
@@ -5,7 +5,7 @@ on:
|
||||
# "Scheduled workflows run on the latest commit on the default or base branch."
|
||||
# — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule
|
||||
schedule:
|
||||
# Runs “Every month at 1st (see https://crontab.guru)
|
||||
# Runs "At 00:00 on day-of-month 1." (see https://crontab.guru)
|
||||
- cron: "0 0 1 * *"
|
||||
jobs:
|
||||
cron-downgradeUsers:
|
||||
@@ -21,4 +21,4 @@ jobs:
|
||||
-X POST \
|
||||
-H 'content-type: application/json' \
|
||||
-H 'authorization: ${{ secrets.CRON_API_KEY }}' \
|
||||
--fail
|
||||
-sSf
|
||||
|
||||
@@ -4,8 +4,8 @@ on:
|
||||
# "Scheduled workflows run on the latest commit on the default or base branch."
|
||||
# — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule
|
||||
schedule:
|
||||
# Runs “At minute 0, 15, 30, and 45.” (see https://crontab.guru)
|
||||
- cron: "0,15,30,45 * * * *"
|
||||
# Runs "At every 15th minute." (see https://crontab.guru)
|
||||
- cron: "*/15 * * * *"
|
||||
jobs:
|
||||
cron-scheduleEmailReminders:
|
||||
env:
|
||||
@@ -20,4 +20,4 @@ jobs:
|
||||
-X POST \
|
||||
-H 'content-type: application/json' \
|
||||
-H 'authorization: ${{ secrets.CRON_API_KEY }}' \
|
||||
--fail
|
||||
-sSf
|
||||
|
||||
@@ -4,8 +4,8 @@ on:
|
||||
# "Scheduled workflows run on the latest commit on the default or base branch."
|
||||
# — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule
|
||||
schedule:
|
||||
# Runs “At minute 0, 15, 30, and 45.” (see https://crontab.guru)
|
||||
- cron: "0,15,30,45 * * * *"
|
||||
# Runs "At every 15th minute." (see https://crontab.guru)
|
||||
- cron: "*/15 * * * *"
|
||||
jobs:
|
||||
cron-scheduleSMSReminders:
|
||||
env:
|
||||
@@ -20,4 +20,4 @@ jobs:
|
||||
-X POST \
|
||||
-H 'content-type: application/json' \
|
||||
-H 'authorization: ${{ secrets.CRON_API_KEY }}' \
|
||||
--fail
|
||||
-sSf
|
||||
|
||||
@@ -4,8 +4,8 @@ on:
|
||||
# "Scheduled workflows run on the latest commit on the default or base branch."
|
||||
# — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule
|
||||
schedule:
|
||||
# Runs “At minute 0, 15, 30, and 45.” (see https://crontab.guru)
|
||||
- cron: "0,15,30,45 * * * *"
|
||||
# Runs "At every 15th minute." (see https://crontab.guru)
|
||||
- cron: "*/15 * * * *"
|
||||
jobs:
|
||||
cron-scheduleWhatsappReminders:
|
||||
env:
|
||||
@@ -20,4 +20,4 @@ jobs:
|
||||
-X POST \
|
||||
-H 'content-type: application/json' \
|
||||
-H 'authorization: ${{ secrets.CRON_API_KEY }}' \
|
||||
--fail
|
||||
-sSf
|
||||
|
||||
@@ -8,7 +8,7 @@ on:
|
||||
# "Scheduled workflows run on the latest commit on the default or base branch."
|
||||
# — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule
|
||||
schedule:
|
||||
# Runs every day (see https://crontab.guru)
|
||||
# Runs "At 00:00." every day (see https://crontab.guru)
|
||||
- cron: "0 0 * * *"
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
|
||||
@@ -5,7 +5,7 @@ on:
|
||||
# "Scheduled workflows run on the latest commit on the default or base branch."
|
||||
# — https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule
|
||||
schedule:
|
||||
# Runs “Every month at 1st (see https://crontab.guru)
|
||||
# Runs "At 00:00 on day-of-month 1." (see https://crontab.guru)
|
||||
- cron: "0 0 1 * *"
|
||||
jobs:
|
||||
cron-syncAppMeta:
|
||||
@@ -21,4 +21,4 @@ jobs:
|
||||
-X POST \
|
||||
-H 'content-type: application/json' \
|
||||
-H 'authorization: ${{ secrets.CRON_API_KEY }}' \
|
||||
--fail
|
||||
-sSf
|
||||
|
||||
@@ -41,6 +41,9 @@ jobs:
|
||||
CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }}
|
||||
DATABASE_URL: ${{ secrets.CI_DATABASE_URL }}
|
||||
DEPLOYSENTINEL_API_KEY: ${{ secrets.DEPLOYSENTINEL_API_KEY }}
|
||||
E2E_TEST_APPLE_CALENDAR_EMAIL: ${{ secrets.E2E_TEST_APPLE_CALENDAR_EMAIL }}
|
||||
E2E_TEST_APPLE_CALENDAR_PASSWORD: ${{ secrets.E2E_TEST_APPLE_CALENDAR_PASSWORD }}
|
||||
E2E_TEST_MAILHOG_ENABLED: ${{ vars.E2E_TEST_MAILHOG_ENABLED }}
|
||||
GOOGLE_API_CREDENTIALS: ${{ secrets.CI_GOOGLE_API_CREDENTIALS }}
|
||||
GOOGLE_LOGIN_ENABLED: ${{ vars.CI_GOOGLE_LOGIN_ENABLED }}
|
||||
NEXTAUTH_SECRET: ${{ secrets.CI_NEXTAUTH_SECRET }}
|
||||
|
||||
@@ -38,6 +38,8 @@ jobs:
|
||||
CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }}
|
||||
DATABASE_URL: ${{ secrets.CI_DATABASE_URL }}
|
||||
DEPLOYSENTINEL_API_KEY: ${{ secrets.DEPLOYSENTINEL_API_KEY }}
|
||||
E2E_TEST_APPLE_CALENDAR_EMAIL: ${{ secrets.E2E_TEST_APPLE_CALENDAR_EMAIL }}
|
||||
E2E_TEST_APPLE_CALENDAR_PASSWORD: ${{ secrets.E2E_TEST_APPLE_CALENDAR_PASSWORD }}
|
||||
GOOGLE_API_CREDENTIALS: ${{ secrets.CI_GOOGLE_API_CREDENTIALS }}
|
||||
GOOGLE_LOGIN_ENABLED: ${{ vars.CI_GOOGLE_LOGIN_ENABLED }}
|
||||
NEXTAUTH_SECRET: ${{ secrets.CI_NEXTAUTH_SECRET }}
|
||||
|
||||
@@ -41,6 +41,9 @@ jobs:
|
||||
CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }}
|
||||
DATABASE_URL: ${{ secrets.CI_DATABASE_URL }}
|
||||
DEPLOYSENTINEL_API_KEY: ${{ secrets.DEPLOYSENTINEL_API_KEY }}
|
||||
E2E_TEST_APPLE_CALENDAR_EMAIL: ${{ secrets.E2E_TEST_APPLE_CALENDAR_EMAIL }}
|
||||
E2E_TEST_APPLE_CALENDAR_PASSWORD: ${{ secrets.E2E_TEST_APPLE_CALENDAR_PASSWORD }}
|
||||
E2E_TEST_MAILHOG_ENABLED: ${{ vars.E2E_TEST_MAILHOG_ENABLED }}
|
||||
GOOGLE_API_CREDENTIALS: ${{ secrets.CI_GOOGLE_API_CREDENTIALS }}
|
||||
GOOGLE_LOGIN_ENABLED: ${{ vars.CI_GOOGLE_LOGIN_ENABLED }}
|
||||
NEXTAUTH_SECRET: ${{ secrets.CI_NEXTAUTH_SECRET }}
|
||||
|
||||
@@ -40,11 +40,14 @@ jobs:
|
||||
CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }}
|
||||
DATABASE_URL: ${{ secrets.CI_DATABASE_URL }}
|
||||
DEPLOYSENTINEL_API_KEY: ${{ secrets.DEPLOYSENTINEL_API_KEY }}
|
||||
E2E_TEST_APPLE_CALENDAR_EMAIL: ${{ secrets.E2E_TEST_APPLE_CALENDAR_EMAIL }}
|
||||
E2E_TEST_APPLE_CALENDAR_PASSWORD: ${{ secrets.E2E_TEST_APPLE_CALENDAR_PASSWORD }}
|
||||
E2E_TEST_MAILHOG_ENABLED: ${{ vars.E2E_TEST_MAILHOG_ENABLED }}
|
||||
GOOGLE_API_CREDENTIALS: ${{ secrets.CI_GOOGLE_API_CREDENTIALS }}
|
||||
EMAIL_SERVER_HOST: ${{ secrets.CI_EMAIL_SERVER_HOST }}
|
||||
EMAIL_SERVER_PORT: ${{ secrets.CI_EMAIL_SERVER_PORT }}
|
||||
EMAIL_SERVER_USER: ${{ secrets.CI_EMAIL_SERVER_USER }}
|
||||
EMAIL_SERVER_PASSWORD: ${{ secrets.CI_EMAIL_SERVER_PASSWORD}}
|
||||
EMAIL_SERVER_PASSWORD: ${{ secrets.CI_EMAIL_SERVER_PASSWORD}}
|
||||
GOOGLE_LOGIN_ENABLED: ${{ vars.CI_GOOGLE_LOGIN_ENABLED }}
|
||||
NEXTAUTH_SECRET: ${{ secrets.CI_NEXTAUTH_SECRET }}
|
||||
NEXTAUTH_URL: ${{ secrets.CI_NEXTAUTH_URL }}
|
||||
|
||||
@@ -7,6 +7,8 @@ env:
|
||||
ALLOWED_HOSTNAMES: ${{ vars.CI_ALLOWED_HOSTNAMES }}
|
||||
CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }}
|
||||
DATABASE_URL: ${{ secrets.CI_DATABASE_URL }}
|
||||
E2E_TEST_APPLE_CALENDAR_EMAIL: ${{ secrets.E2E_TEST_APPLE_CALENDAR_EMAIL }}
|
||||
E2E_TEST_APPLE_CALENDAR_PASSWORD: ${{ secrets.E2E_TEST_APPLE_CALENDAR_PASSWORD }}
|
||||
GOOGLE_API_CREDENTIALS: ${{ secrets.CI_GOOGLE_API_CREDENTIALS }}
|
||||
GOOGLE_LOGIN_ENABLED: ${{ vars.CI_GOOGLE_LOGIN_ENABLED }}
|
||||
NEXTAUTH_SECRET: ${{ secrets.CI_NEXTAUTH_SECRET }}
|
||||
|
||||
@@ -7,6 +7,8 @@ env:
|
||||
ALLOWED_HOSTNAMES: ${{ vars.CI_ALLOWED_HOSTNAMES }}
|
||||
CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }}
|
||||
DATABASE_URL: ${{ secrets.CI_DATABASE_URL }}
|
||||
E2E_TEST_APPLE_CALENDAR_EMAIL: ${{ secrets.E2E_TEST_APPLE_CALENDAR_EMAIL }}
|
||||
E2E_TEST_APPLE_CALENDAR_PASSWORD: ${{ secrets.E2E_TEST_APPLE_CALENDAR_PASSWORD }}
|
||||
GOOGLE_API_CREDENTIALS: ${{ secrets.CI_GOOGLE_API_CREDENTIALS }}
|
||||
GOOGLE_LOGIN_ENABLED: ${{ vars.CI_GOOGLE_LOGIN_ENABLED }}
|
||||
NEXTAUTH_SECRET: ${{ secrets.CI_NEXTAUTH_SECRET }}
|
||||
|
||||
@@ -8,7 +8,7 @@ on: # yamllint disable-line rule:truthy
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
RELEASE_TAG:
|
||||
description: 'v{Major}.{Minor}.{Patch}'
|
||||
description: "v{Major}.{Minor}.{Patch}"
|
||||
|
||||
jobs:
|
||||
release:
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: "Determine tag"
|
||||
run: "echo \"RELEASE_TAG=${GITHUB_REF#refs/tags/}\" >> $GITHUB_ENV"
|
||||
run: 'echo "RELEASE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV'
|
||||
|
||||
- name: "Run remote release workflow"
|
||||
uses: "actions/github-script@v6"
|
||||
|
||||
@@ -29,11 +29,11 @@ jobs:
|
||||
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 }}
|
||||
```
|
||||
@@ -41,7 +41,7 @@ jobs:
|
||||
# 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:
|
||||
with:
|
||||
header: pr-title-lint-error
|
||||
message: |
|
||||
Thank you for following the naming conventions! 🙏
|
||||
Thank you for following the naming conventions! 🙏
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
name: Submodule Sync
|
||||
on:
|
||||
schedule:
|
||||
# Runs "At minute 15 past every 4th hour." (see https://crontab.guru)
|
||||
- cron: "15 */4 * * *"
|
||||
workflow_dispatch: ~
|
||||
jobs:
|
||||
|
||||
+1
-1
@@ -40,4 +40,4 @@ vscode:
|
||||
- bradlc.vscode-tailwindcss
|
||||
- ban.spellright
|
||||
- stripe.vscode-stripe
|
||||
- Prisma.prisma
|
||||
- Prisma.prisma
|
||||
|
||||
@@ -221,6 +221,7 @@ echo 'NEXT_PUBLIC_DEBUG=1' >> .env
|
||||
```
|
||||
|
||||
1. Run [mailhog](https://github.com/mailhog/MailHog) to view emails sent during development
|
||||
> **_NOTE:_** Required when `E2E_TEST_MAILHOG_ENABLED` is "1"
|
||||
|
||||
```sh
|
||||
docker pull mailhog/mailhog
|
||||
@@ -461,6 +462,18 @@ following
|
||||
4. Now paste the API key to your `.env` file into the `DAILY_API_KEY` field in your `.env` file.
|
||||
5. If you have the [Daily Scale Plan](https://daily.co/pricing) set the `DAILY_SCALE_PLAN` variable to `true` in order to use features like video recording.
|
||||
|
||||
### Obtaining Basecamp Client ID and Secret
|
||||
|
||||
1. Visit the [37 Signals Integrations Dashboard](launchpad.37signals.com/integrations) and sign in.
|
||||
2. Register a new application by clicking the Register one now link.
|
||||
3. Fill in your company details.
|
||||
4. Select Basecamp 4 as the product to integrate with.
|
||||
5. Set the Redirect URL for OAuth `<Cal.com URL>/api/integrations/basecamp3/callback` replacing Cal.com URL with the URI at which your application runs.
|
||||
6. Click on done and copy the Client ID and secret into the `BASECAMP3_CLIENT_ID` and `BASECAMP3_CLIENT_SECRET` fields.
|
||||
7. Set the `BASECAMP3_CLIENT_SECRET` env variable to `{your_domain} ({support_email})`.
|
||||
For example, `Cal.com (support@cal.com)`.
|
||||
|
||||
|
||||
### Obtaining HubSpot Client ID and Secret
|
||||
|
||||
1. Open [HubSpot Developer](https://developer.hubspot.com/) and sign into your account, or create a new one.
|
||||
|
||||
@@ -67,6 +67,7 @@ const schemaEventTypeCreateParams = z
|
||||
seatsPerTimeSlot: z.number().optional(),
|
||||
seatsShowAttendees: z.boolean().optional(),
|
||||
bookingFields: eventTypeBookingFields.optional(),
|
||||
scheduleId: z.number().optional(),
|
||||
})
|
||||
.strict();
|
||||
|
||||
@@ -85,6 +86,7 @@ const schemaEventTypeEditParams = z
|
||||
seatsPerTimeSlot: z.number().optional(),
|
||||
seatsShowAttendees: z.boolean().optional(),
|
||||
bookingFields: eventTypeBookingFields.optional(),
|
||||
scheduleId: z.number().optional(),
|
||||
})
|
||||
.strict();
|
||||
|
||||
@@ -98,6 +100,7 @@ export const schemaEventTypeReadPublic = EventType.pick({
|
||||
position: true,
|
||||
userId: true,
|
||||
teamId: true,
|
||||
scheduleId: true,
|
||||
eventName: true,
|
||||
timeZone: true,
|
||||
periodType: true,
|
||||
|
||||
@@ -29,7 +29,7 @@ enum locales {
|
||||
RO = "ro",
|
||||
NL = "nl",
|
||||
PT_BR = "pt-BR",
|
||||
ES_419 = "es-419",
|
||||
// ES_419 = "es-419", // Disabled until Crowdin reaches at least 80% completion
|
||||
KO = "ko",
|
||||
JA = "ja",
|
||||
PL = "pl",
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import type { NextApiRequest } from "next";
|
||||
|
||||
import { HttpError } from "@calcom/lib/http-error";
|
||||
import { defaultResponder } from "@calcom/lib/server";
|
||||
|
||||
import { schemaEventTypeReadPublic } from "~/lib/validations/event-type";
|
||||
import { schemaQueryIdParseInt } from "~/lib/validations/shared/queryIdTransformParseInt";
|
||||
import { checkPermissions as canAccessTeamEventOrThrow } from "~/pages/api/teams/[teamId]/_auth-middleware";
|
||||
|
||||
import getCalLink from "../_utils/getCalLink";
|
||||
|
||||
@@ -42,7 +44,8 @@ import getCalLink from "../_utils/getCalLink";
|
||||
export async function getHandler(req: NextApiRequest) {
|
||||
const { prisma, query } = req;
|
||||
const { id } = schemaQueryIdParseInt.parse(query);
|
||||
const event_type = await prisma.eventType.findUnique({
|
||||
|
||||
const eventType = await prisma.eventType.findUnique({
|
||||
where: { id },
|
||||
include: {
|
||||
customInputs: true,
|
||||
@@ -51,10 +54,43 @@ export async function getHandler(req: NextApiRequest) {
|
||||
owner: { select: { username: true, id: true } },
|
||||
},
|
||||
});
|
||||
await checkPermissions(req, eventType);
|
||||
|
||||
const link = event_type ? getCalLink(event_type) : null;
|
||||
const link = eventType ? getCalLink(eventType) : null;
|
||||
// user.defaultScheduleId doesn't work the same for team events.
|
||||
if (!eventType?.scheduleId && eventType?.userId && !eventType?.teamId) {
|
||||
const user = await prisma.user.findUniqueOrThrow({
|
||||
where: {
|
||||
id: eventType.userId,
|
||||
},
|
||||
select: {
|
||||
defaultScheduleId: true,
|
||||
},
|
||||
});
|
||||
eventType.scheduleId = user.defaultScheduleId;
|
||||
}
|
||||
|
||||
return { event_type: schemaEventTypeReadPublic.parse({ ...event_type, link }) };
|
||||
// TODO: eventType when not found should be a 404
|
||||
// but API consumers may depend on the {} behaviour.
|
||||
return { event_type: schemaEventTypeReadPublic.parse({ ...eventType, link }) };
|
||||
}
|
||||
|
||||
type BaseEventTypeCheckPermissions = {
|
||||
userId: number | null;
|
||||
teamId: number | null;
|
||||
};
|
||||
|
||||
async function checkPermissions<T extends BaseEventTypeCheckPermissions>(
|
||||
req: NextApiRequest,
|
||||
eventType: (T & Partial<Omit<T, keyof BaseEventTypeCheckPermissions>>) | null
|
||||
) {
|
||||
if (req.isAdmin) return true;
|
||||
if (eventType?.teamId) {
|
||||
req.query.teamId = String(eventType.teamId);
|
||||
await canAccessTeamEventOrThrow(req, "MEMBER");
|
||||
}
|
||||
if (eventType?.userId === req.userId) return true; // is owner.
|
||||
throw new HttpError({ statusCode: 403, message: "Forbidden" });
|
||||
}
|
||||
|
||||
export default defaultResponder(getHandler);
|
||||
|
||||
@@ -52,6 +52,9 @@ import checkTeamEventEditPermission from "../_utils/checkTeamEventEditPermission
|
||||
* slug:
|
||||
* type: string
|
||||
* description: Unique slug for the event type
|
||||
* scheduleId:
|
||||
* type: number
|
||||
* description: The ID of the schedule for this event type
|
||||
* hosts:
|
||||
* type: array
|
||||
* items:
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import type { Prisma } from "@prisma/client";
|
||||
import type { NextApiRequest } from "next";
|
||||
|
||||
import { HttpError } from "@calcom/lib/http-error";
|
||||
import { defaultResponder } from "@calcom/lib/server";
|
||||
import type { PrismaClient } from "@calcom/prisma/client";
|
||||
|
||||
import { schemaEventTypeReadPublic } from "~/lib/validations/event-type";
|
||||
import { schemaQuerySingleOrMultipleUserIds } from "~/lib/validations/shared/queryUserId";
|
||||
@@ -35,20 +35,12 @@ import getCalLink from "./_utils/getCalLink";
|
||||
* description: No event types were found
|
||||
*/
|
||||
async function getHandler(req: NextApiRequest) {
|
||||
const { userId, isAdmin, prisma } = req;
|
||||
|
||||
const args: Prisma.EventTypeFindManyArgs = {
|
||||
where: { userId },
|
||||
};
|
||||
/** Only admins can query other users */
|
||||
if (!isAdmin && req.query.userId) throw new HttpError({ statusCode: 401, message: "ADMIN required" });
|
||||
if (isAdmin && req.query.userId) {
|
||||
const query = schemaQuerySingleOrMultipleUserIds.parse(req.query);
|
||||
const userIds = Array.isArray(query.userId) ? query.userId : [query.userId || userId];
|
||||
args.where = { userId: { in: userIds } };
|
||||
}
|
||||
const { userId, prisma } = req;
|
||||
const userIds = req.query.userId ? extractUserIdsFromQuery(req) : [userId];
|
||||
const data = await prisma.eventType.findMany({
|
||||
...args,
|
||||
where: {
|
||||
userId: { in: userIds },
|
||||
},
|
||||
include: {
|
||||
customInputs: true,
|
||||
team: { select: { slug: true } },
|
||||
@@ -56,13 +48,74 @@ async function getHandler(req: NextApiRequest) {
|
||||
owner: { select: { username: true, id: true } },
|
||||
},
|
||||
});
|
||||
// this really should return [], but backwards compatibility..
|
||||
if (data.length === 0) new HttpError({ statusCode: 404, message: "No event types were found" });
|
||||
return {
|
||||
event_types: data.map((eventType) => {
|
||||
const link = getCalLink(eventType);
|
||||
return schemaEventTypeReadPublic.parse({ ...eventType, link });
|
||||
}),
|
||||
event_types: (await defaultScheduleId<(typeof data)[number]>({ eventTypes: data, prisma, userIds })).map(
|
||||
(eventType) => {
|
||||
const link = getCalLink(eventType);
|
||||
return schemaEventTypeReadPublic.parse({ ...eventType, link });
|
||||
}
|
||||
),
|
||||
};
|
||||
}
|
||||
// TODO: Extract & reuse.
|
||||
function extractUserIdsFromQuery({ isAdmin, query }: NextApiRequest) {
|
||||
/** Guard: Only admins can query other users */
|
||||
if (!isAdmin) {
|
||||
throw new HttpError({ statusCode: 401, message: "ADMIN required" });
|
||||
}
|
||||
const { userId: userIdOrUserIds } = schemaQuerySingleOrMultipleUserIds.parse(query);
|
||||
return Array.isArray(userIdOrUserIds) ? userIdOrUserIds : [userIdOrUserIds];
|
||||
}
|
||||
|
||||
type DefaultScheduleIdEventTypeBase = {
|
||||
scheduleId: number | null;
|
||||
userId: number | null;
|
||||
};
|
||||
// If an eventType is given w/o a scheduleId
|
||||
// Then we associate the default user schedule id to the eventType
|
||||
async function defaultScheduleId<T extends DefaultScheduleIdEventTypeBase>({
|
||||
prisma,
|
||||
eventTypes,
|
||||
userIds,
|
||||
}: {
|
||||
prisma: PrismaClient;
|
||||
eventTypes: (T & Partial<Omit<T, keyof DefaultScheduleIdEventTypeBase>>)[];
|
||||
userIds: number[];
|
||||
}) {
|
||||
// there is no event types without a scheduleId, skip the user query
|
||||
if (eventTypes.every((eventType) => eventType.scheduleId)) return eventTypes;
|
||||
|
||||
const users = await prisma.user.findMany({
|
||||
where: {
|
||||
id: {
|
||||
in: userIds,
|
||||
},
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
defaultScheduleId: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (!users.length) {
|
||||
return eventTypes;
|
||||
}
|
||||
|
||||
const defaultScheduleIds = users.reduce((result, user) => {
|
||||
result[user.id] = user.defaultScheduleId;
|
||||
return result;
|
||||
}, {} as { [x: number]: number | null });
|
||||
|
||||
return eventTypes.map((eventType) => {
|
||||
// realistically never happens, userId should't be null on personal event types.
|
||||
if (!eventType.userId) return eventType;
|
||||
return {
|
||||
...eventType,
|
||||
scheduleId: eventType.scheduleId || defaultScheduleIds[eventType.userId],
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
export default defaultResponder(getHandler);
|
||||
|
||||
@@ -60,6 +60,9 @@ import ensureOnlyMembersAsHosts from "./_utils/ensureOnlyMembersAsHosts";
|
||||
* hidden:
|
||||
* type: boolean
|
||||
* description: If the event type should be hidden from your public booking page
|
||||
* scheduleId:
|
||||
* type: number
|
||||
* description: The ID of the schedule for this event type
|
||||
* position:
|
||||
* type: integer
|
||||
* description: The position of the event type on the public booking page
|
||||
@@ -178,6 +181,7 @@ import ensureOnlyMembersAsHosts from "./_utils/ensureOnlyMembersAsHosts";
|
||||
* position: 0
|
||||
* eventName: null
|
||||
* timeZone: null
|
||||
* scheduleId: 5
|
||||
* periodType: UNLIMITED
|
||||
* periodStartDate: 2023-02-15T08:46:16.000Z
|
||||
* periodEndDate: 2023-0-15T08:46:16.000Z
|
||||
|
||||
@@ -59,7 +59,7 @@ async function getHandler(req: NextApiRequest) {
|
||||
};
|
||||
|
||||
const data = await prisma.eventType.findMany(args);
|
||||
return { event_types: data.map((attendee) => schemaEventTypeReadPublic.parse(attendee)) };
|
||||
return { event_types: data.map((eventType) => schemaEventTypeReadPublic.parse(eventType)) };
|
||||
}
|
||||
|
||||
export default defaultResponder(getHandler);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Set the version of docker compose to use
|
||||
version: '3.9'
|
||||
version: "3.9"
|
||||
|
||||
# The containers that compose the project
|
||||
services:
|
||||
@@ -8,8 +8,8 @@ services:
|
||||
restart: always
|
||||
container_name: integration-tests-prisma
|
||||
ports:
|
||||
- '5433:5432'
|
||||
- "5433:5432"
|
||||
environment:
|
||||
POSTGRES_USER: prisma
|
||||
POSTGRES_PASSWORD: prisma
|
||||
POSTGRES_DB: tests
|
||||
POSTGRES_DB: tests
|
||||
|
||||
@@ -15,6 +15,7 @@ module.exports = {
|
||||
"storybook-addon-rtl-direction",
|
||||
"storybook-react-i18next",
|
||||
"storybook-addon-next",
|
||||
"storybook-addon-next-router",
|
||||
/*{
|
||||
name: "storybook-addon-next",
|
||||
options: {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<script>
|
||||
window.global = window;
|
||||
window.isEmbed = ()=> {
|
||||
return location.search.includes("embed=")
|
||||
}
|
||||
window.isEmbed = () => {
|
||||
return location.search.includes("embed=");
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@500&display=swap');
|
||||
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@500&display=swap");
|
||||
</style>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { addDecorator } from "@storybook/react";
|
||||
import { AppRouterContext } from "next/dist/shared/lib/app-router-context";
|
||||
import { I18nextProvider } from "react-i18next";
|
||||
|
||||
import "../styles/globals.css";
|
||||
@@ -13,6 +14,13 @@ export const parameters = {
|
||||
date: /Date$/,
|
||||
},
|
||||
},
|
||||
nextRouter: {
|
||||
pathname: "/",
|
||||
asPath: "/",
|
||||
query: {},
|
||||
push() {},
|
||||
Provider: AppRouterContext.Provider,
|
||||
},
|
||||
};
|
||||
|
||||
addDecorator((storyFn) => (
|
||||
|
||||
@@ -1,11 +1,21 @@
|
||||
import { Meta } from '@storybook/addon-docs';
|
||||
import { Meta } from "@storybook/addon-docs";
|
||||
|
||||
<Meta title="Introduction" />
|
||||
|
||||
<div className="text-center flex flex-col items-center">
|
||||
<h1 style={{marginBottom: '24px', marginTop: '36px'}}>Welcome to Cal.com UI</h1>
|
||||
<p>This is the beginning of our storybook improvements to match Figma as close as possible. Like our Figma library, we will be adding more components as we go along.</p>
|
||||
<p>Our <a href="https://www.figma.com/file/9MOufQNLtdkpnDucmNX10R/%E2%9D%96-Cal-DS" target="_blank">Figma</a> library is avalible for anyone to view and use. If you have any questions or concerns, please reach out to the design team.</p>
|
||||
<div className="flex flex-col items-center text-center">
|
||||
<h1 style={{ marginBottom: "24px", marginTop: "36px" }}>Welcome to Cal.com UI</h1>
|
||||
<p>
|
||||
This is the beginning of our storybook improvements to match Figma as close as possible. Like our Figma
|
||||
library, we will be adding more components as we go along.
|
||||
</p>
|
||||
<p>
|
||||
Our{" "}
|
||||
<a href="https://www.figma.com/file/9MOufQNLtdkpnDucmNX10R/%E2%9D%96-Cal-DS" target="_blank">
|
||||
Figma
|
||||
</a>{" "}
|
||||
library is avalible for anyone to view and use. If you have any questions or concerns, please reach out to
|
||||
the design team.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<img src="/sb-cover.jpg" />
|
||||
<img src="/sb-cover.jpg" />
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
"next": "^13.4.6",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"storybook-addon-next-router": "^4.0.2",
|
||||
"storybook-addon-rtl-direction": "^0.0.19"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
@import url("../../../packages/features/calendars/weeklyview/styles/styles.css");
|
||||
|
||||
.sbdocs {
|
||||
font-family: 'Inter var' !important;
|
||||
padding: 0!important;
|
||||
font-family: "Inter var" !important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
#docs-root {
|
||||
@@ -21,8 +21,8 @@
|
||||
font-weight: 500;
|
||||
border: none;
|
||||
border-top: 2px solid rgba(0, 0, 0, 0.12);
|
||||
padding-top: 12px!important;
|
||||
padding-bottom: 12px!important;
|
||||
padding-top: 12px !important;
|
||||
padding-bottom: 12px !important;
|
||||
margin: 82px 0 0 0;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
}
|
||||
|
||||
/** Docs table **/
|
||||
.custom-args-wrapper{
|
||||
.custom-args-wrapper {
|
||||
max-height: 400px;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
@@ -45,7 +45,7 @@
|
||||
}
|
||||
|
||||
.docblock-argstable-body {
|
||||
box-shadow: none!important;
|
||||
box-shadow: none !important;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
.docblock-argstable-body div p,
|
||||
.docblock-argstable-body div span {
|
||||
color: #8F8F8F !important;
|
||||
color: #8f8f8f !important;
|
||||
}
|
||||
|
||||
/** Custom components **/
|
||||
@@ -83,8 +83,8 @@
|
||||
}
|
||||
|
||||
.story-title h1 span {
|
||||
color: #9CA3AF;
|
||||
font-family: 'Inter var';
|
||||
color: #9ca3af;
|
||||
font-family: "Inter var";
|
||||
font-weight: normal;
|
||||
display: inline-block;
|
||||
margin-left: 8px;
|
||||
@@ -96,7 +96,7 @@
|
||||
}
|
||||
|
||||
.examples {
|
||||
background-color: #F9FAFB;
|
||||
background-color: #f9fafb;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -111,14 +111,14 @@
|
||||
}
|
||||
|
||||
.examples-title {
|
||||
color: #8F8F8F;
|
||||
color: #8f8f8f;
|
||||
font-size: 14px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.examples-item-title {
|
||||
font-size: 12px;
|
||||
color: #8F8F8F;
|
||||
color: #8f8f8f;
|
||||
margin-bottom: 12px;
|
||||
display: block;
|
||||
}
|
||||
@@ -130,7 +130,7 @@
|
||||
.examples-footnote p,
|
||||
.examples-footnote ul,
|
||||
.examples-footnote li {
|
||||
color: #8F8F8F;
|
||||
color: #8f8f8f;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
@@ -139,11 +139,11 @@
|
||||
}
|
||||
|
||||
.examples-footnote li {
|
||||
margin: 0!important;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
.story-note {
|
||||
background-color: #F9FAFB;
|
||||
background-color: #f9fafb;
|
||||
font-size: 14px;
|
||||
padding: 20px;
|
||||
margin-bottom: 12px;
|
||||
@@ -161,12 +161,12 @@
|
||||
box-shadow: none !important;
|
||||
margin: 0 !important;
|
||||
border: none !important;
|
||||
border-radius: none!important;
|
||||
border-radius: none !important;
|
||||
}
|
||||
|
||||
.docs-story > div:first-child {
|
||||
padding: 0!important;
|
||||
margin: 0!important;
|
||||
padding: 0 !important;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
.docs-story .innerZoomElementWrapper > div {
|
||||
@@ -174,7 +174,7 @@
|
||||
}
|
||||
|
||||
.sb-main-padded {
|
||||
padding: 0!important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1200px) {
|
||||
@@ -198,74 +198,72 @@
|
||||
:root {
|
||||
/* background */
|
||||
|
||||
--cal-bg-emphasis: #E5E7EB;
|
||||
--cal-bg-emphasis: #e5e7eb;
|
||||
--cal-bg: white;
|
||||
--cal-bg-subtle: #F3F4F6;
|
||||
--cal-bg-muted: #F9FAFB;
|
||||
--cal-bg-subtle: #f3f4f6;
|
||||
--cal-bg-muted: #f9fafb;
|
||||
--cal-bg-inverted: #111827;
|
||||
|
||||
/* background -> components*/
|
||||
--cal-bg-info: #DEE9FC;
|
||||
--cal-bg-success: #E2FBE8;
|
||||
--cal-bg-attention: #FCEED8;
|
||||
--cal-bg-error: #F9E3E2;
|
||||
--cal-bg-info: #dee9fc;
|
||||
--cal-bg-success: #e2fbe8;
|
||||
--cal-bg-attention: #fceed8;
|
||||
--cal-bg-error: #f9e3e2;
|
||||
--cal-bg-dark-error: #752522;
|
||||
|
||||
|
||||
/* Borders */
|
||||
--cal-border-emphasis:#9CA3AF;
|
||||
--cal-border: #D1D5DB;
|
||||
--cal-border-subtle:#E5E7EB;
|
||||
--cal-border-muted:#F3F4F6;
|
||||
--cal-border-emphasis: #9ca3af;
|
||||
--cal-border: #d1d5db;
|
||||
--cal-border-subtle: #e5e7eb;
|
||||
--cal-border-muted: #f3f4f6;
|
||||
--cal-border-error: #aa2e26;
|
||||
|
||||
/* Content/Text */
|
||||
--cal-text-emphasis: #111827;
|
||||
--cal-text:#374151;
|
||||
--cal-text-subtle:#6B7280;
|
||||
--cal-text-muted:#9CA3AF;
|
||||
--cal-text-inverted:white;
|
||||
--cal-text: #374151;
|
||||
--cal-text-subtle: #6b7280;
|
||||
--cal-text-muted: #9ca3af;
|
||||
--cal-text-inverted: white;
|
||||
|
||||
/* Content/Text -> components */
|
||||
--cal-text-info:#253985;
|
||||
--cal-text-success:#285231;
|
||||
--cal-text-attention:#73321B;
|
||||
--cal-text-error:#752522;
|
||||
--cal-text-info: #253985;
|
||||
--cal-text-success: #285231;
|
||||
--cal-text-attention: #73321b;
|
||||
--cal-text-error: #752522;
|
||||
|
||||
/* Brand shinanigans
|
||||
-> These will be computed for the users theme at runtime.
|
||||
*/
|
||||
--cal-brand:#111827;
|
||||
--cal-brand-emphasis:#101010;
|
||||
--cal-brand: #111827;
|
||||
--cal-brand-emphasis: #101010;
|
||||
--cal-brand-text: white;
|
||||
}
|
||||
.dark {
|
||||
/* background */
|
||||
|
||||
--cal-bg-emphasis: #2B2B2B;
|
||||
--cal-bg-emphasis: #2b2b2b;
|
||||
--cal-bg: #101010;
|
||||
--cal-bg-subtle: #2B2B2B;
|
||||
--cal-bg-muted: #1C1C1C;
|
||||
--cal-bg-inverted: #F3F4F6;
|
||||
--cal-bg-subtle: #2b2b2b;
|
||||
--cal-bg-muted: #1c1c1c;
|
||||
--cal-bg-inverted: #f3f4f6;
|
||||
|
||||
/* background -> components*/
|
||||
--cal-bg-info: #DEE9FC;
|
||||
--cal-bg-success: #E2FBE8;
|
||||
--cal-bg-attention: #FCEED8;
|
||||
--cal-bg-error: #F9E3E2;
|
||||
--cal-bg-info: #dee9fc;
|
||||
--cal-bg-success: #e2fbe8;
|
||||
--cal-bg-attention: #fceed8;
|
||||
--cal-bg-error: #f9e3e2;
|
||||
--cal-bg-dark-error: #752522;
|
||||
|
||||
|
||||
/* Borders */
|
||||
--cal-border-emphasis: #575757;
|
||||
--cal-border: #444444;
|
||||
--cal-border-subtle: #2B2B2B;
|
||||
--cal-border-muted: #1C1C1C;
|
||||
--cal-border-subtle: #2b2b2b;
|
||||
--cal-border-muted: #1c1c1c;
|
||||
--cal-border-error: #aa2e26;
|
||||
|
||||
/* Content/Text */
|
||||
--cal-text-emphasis: #F3F4F6;
|
||||
--cal-text: #D6D6D6;
|
||||
--cal-text-emphasis: #f3f4f6;
|
||||
--cal-text: #d6d6d6;
|
||||
--cal-text-subtle: #757575;
|
||||
--cal-text-muted: #575757;
|
||||
--cal-text-inverted: #101010;
|
||||
@@ -273,7 +271,7 @@
|
||||
/* Content/Text -> components */
|
||||
--cal-text-info: #253985;
|
||||
--cal-text-success: #285231;
|
||||
--cal-text-attention: #73321B;
|
||||
--cal-text-attention: #73321b;
|
||||
--cal-text-error: #752522;
|
||||
|
||||
/* Brand shenanigans
|
||||
|
||||
@@ -2,8 +2,8 @@ html,
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
|
||||
Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
|
||||
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans,
|
||||
Droid Sans, Helvetica Neue, sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
@@ -21,7 +21,7 @@ a {
|
||||
}
|
||||
.swagger-ui .opblock .opblock-summary {
|
||||
display: grid;
|
||||
flex-direction: column;
|
||||
flex-direction: column;
|
||||
}
|
||||
.opblock-summary-path {
|
||||
flex-shrink: 0;
|
||||
@@ -43,22 +43,22 @@ a {
|
||||
font-size: 22px;
|
||||
}
|
||||
.swagger-ui .scheme-container {
|
||||
padding: 14px 0;
|
||||
padding: 14px 0;
|
||||
}
|
||||
.swagger-ui .info {
|
||||
margin: 10px 0;
|
||||
margin: 10px 0;
|
||||
}
|
||||
.swagger-ui .auth-wrapper {
|
||||
margin: 10px 0;
|
||||
}
|
||||
.swagger-ui .authorization__btn {
|
||||
display: none;
|
||||
display: none;
|
||||
}
|
||||
.swagger-ui .opblock {
|
||||
margin: 0 0 5px;
|
||||
}
|
||||
button.opblock-summary-control > svg {
|
||||
display: none;
|
||||
display: none;
|
||||
}
|
||||
.swagger-ui .filter .operation-filter-input {
|
||||
border: 2px solid #d8dde7;
|
||||
@@ -73,15 +73,16 @@ a {
|
||||
.swagger-ui .info .title small {
|
||||
top: 5px;
|
||||
}
|
||||
.swagger-ui a.nostyle, .swagger-ui a.nostyle:visited {
|
||||
.swagger-ui a.nostyle,
|
||||
.swagger-ui a.nostyle:visited {
|
||||
width: 100%;
|
||||
}
|
||||
div.request-snippets > div.curl-command > div:nth-child(1) {
|
||||
overscroll-behavior: contain;
|
||||
overflow-x: scroll;
|
||||
}
|
||||
.swagger-ui .opblock-body pre.microlight {
|
||||
font-size: 9px;
|
||||
.swagger-ui .opblock-body pre.microlight {
|
||||
font-size: 9px;
|
||||
}
|
||||
.swagger-ui table tbody tr td {
|
||||
padding: 0px 0 0;
|
||||
@@ -91,7 +92,7 @@ a {
|
||||
font-size: 12px;
|
||||
}
|
||||
div.no-margin > div > div.responses-wrapper > div.responses-inner > div > div > table > tbody > tr {
|
||||
display: flex;
|
||||
display: flex;
|
||||
width: 100vw;
|
||||
flex-direction: column;
|
||||
font-size: 60%;
|
||||
@@ -99,4 +100,4 @@ a {
|
||||
div.no-margin > div > div.responses-wrapper > div.responses-inner > div > div > table > thead > tr {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1,51 @@
|
||||
import { lookup } from "bcp-47-match";
|
||||
import { useSession } from "next-auth/react";
|
||||
import { useTranslation } from "next-i18next";
|
||||
import { useEffect } from "react";
|
||||
|
||||
import { CALCOM_VERSION } from "@calcom/lib/constants";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
|
||||
export function useViewerI18n() {
|
||||
return trpc.viewer.public.i18n.useQuery(undefined, {
|
||||
staleTime: Infinity,
|
||||
/**
|
||||
* i18n should never be clubbed with other queries, so that it's caching can be managed independently.
|
||||
* We intend to not cache i18n query
|
||||
**/
|
||||
trpc: {
|
||||
context: { skipBatch: true },
|
||||
},
|
||||
});
|
||||
function useViewerI18n(locale: string) {
|
||||
return trpc.viewer.public.i18n.useQuery(
|
||||
{ locale, CalComVersion: CALCOM_VERSION },
|
||||
{
|
||||
/**
|
||||
* i18n should never be clubbed with other queries, so that it's caching can be managed independently.
|
||||
**/
|
||||
trpc: {
|
||||
context: { skipBatch: true },
|
||||
},
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function useClientLocale(locales: string[]) {
|
||||
const session = useSession();
|
||||
// If the user is logged in, use their locale
|
||||
if (session.data?.user.locale) return session.data.user.locale;
|
||||
// If the user is not logged in, use the browser locale
|
||||
if (typeof window !== "undefined") {
|
||||
// This is the only way I found to ensure the prefetched locale is used on first render
|
||||
// FIXME: Find a better way to pick the best matching locale from the browser
|
||||
return lookup(locales, window.navigator.language) || window.navigator.language;
|
||||
}
|
||||
// If the browser is not available, use English
|
||||
return "en";
|
||||
}
|
||||
|
||||
export function useClientViewerI18n(locales: string[]) {
|
||||
const clientLocale = useClientLocale(locales);
|
||||
return useViewerI18n(clientLocale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Auto-switches locale client-side to the logged in user's preference
|
||||
*/
|
||||
const I18nLanguageHandler = () => {
|
||||
const I18nLanguageHandler = (props: { locales: string[] }) => {
|
||||
const { locales } = props;
|
||||
const { i18n } = useTranslation("common");
|
||||
const locale = useViewerI18n().data?.locale || i18n.language;
|
||||
const locale = useClientViewerI18n(locales).data?.locale || i18n.language;
|
||||
|
||||
useEffect(() => {
|
||||
// bail early when i18n = {}
|
||||
|
||||
@@ -6,7 +6,7 @@ import Script from "next/script";
|
||||
|
||||
import "@calcom/embed-core/src/embed-iframe";
|
||||
import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
|
||||
import { WEBAPP_URL, IS_CALCOM } from "@calcom/lib/constants";
|
||||
import { IS_CALCOM, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { buildCanonical } from "@calcom/lib/next-seo.config";
|
||||
|
||||
import type { AppProps } from "@lib/app-providers";
|
||||
@@ -72,7 +72,7 @@ function PageWrapper(props: AppProps) {
|
||||
}
|
||||
{...seoConfig.defaultNextSeo}
|
||||
/>
|
||||
<I18nLanguageHandler />
|
||||
<I18nLanguageHandler locales={props.router.locales || []} />
|
||||
<Script
|
||||
nonce={nonce}
|
||||
id="page-status"
|
||||
|
||||
@@ -112,7 +112,7 @@ export const InstallAppButtonChild = ({
|
||||
);
|
||||
}}>
|
||||
<p>
|
||||
{team.name} {isInstalled && `(${t("installed")})`}
|
||||
{t(team.name)} {isInstalled && `(${t("installed")})`}
|
||||
</p>
|
||||
</DropdownItem>
|
||||
);
|
||||
|
||||
@@ -368,7 +368,7 @@ function BookingListItem(booking: BookingItemProps) {
|
||||
{t("error_collecting_card")}
|
||||
</Badge>
|
||||
) : booking.paid ? (
|
||||
<Badge className="ltr:mr-2 rtl:ml-2" variant="green">
|
||||
<Badge className="ltr:mr-2 rtl:ml-2" variant="green" data-testid="paid_badge">
|
||||
{booking.payment[0].paymentOption === "HOLD" ? t("card_held") : t("paid")}
|
||||
</Badge>
|
||||
) : null}
|
||||
|
||||
@@ -338,6 +338,7 @@ export const EventAdvancedTab = ({ eventType, team }: Pick<EventTypeSetupProps,
|
||||
toggleGuests(false);
|
||||
formMethods.setValue("requiresConfirmation", false);
|
||||
setRequiresConfirmation(false);
|
||||
formMethods.setValue("metadata.multipleDuration", undefined);
|
||||
formMethods.setValue("seatsPerTimeSlot", 2);
|
||||
} else {
|
||||
formMethods.setValue("seatsPerTimeSlot", null);
|
||||
|
||||
@@ -138,7 +138,7 @@ const EventTypeScheduleDetails = memo(
|
||||
<Globe className="h-3.5 w-3.5 ltr:mr-2 rtl:ml-2" />
|
||||
{schedule?.timeZone || <SkeletonText className="block h-5 w-32" />}
|
||||
</span>
|
||||
{!!schedule?.id && !schedule.isManaged && (
|
||||
{!!schedule?.id && !schedule.isManaged && !schedule.readOnly && (
|
||||
<Button
|
||||
href={`/availability/${schedule.id}`}
|
||||
disabled={isLoading}
|
||||
@@ -202,6 +202,15 @@ const EventTypeSchedule = ({ eventType }: { eventType: EventTypeSetup }) => {
|
||||
isManaged: false,
|
||||
});
|
||||
}
|
||||
// We push the selected schedule from the event type if it's not part of the list response. This happens if the user is an admin but not the schedule owner.
|
||||
else if (eventType.schedule && !schedules.find((schedule) => schedule.id === eventType.schedule)) {
|
||||
options.push({
|
||||
value: eventType.schedule,
|
||||
label: eventType.scheduleName ?? t("default_schedule_name"),
|
||||
isDefault: false,
|
||||
isManaged: false,
|
||||
});
|
||||
}
|
||||
|
||||
setOptions(options);
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ import { z } from "zod";
|
||||
import type { EventLocationType } from "@calcom/app-store/locations";
|
||||
import { getEventLocationType, MeetLocationType, LocationType } from "@calcom/app-store/locations";
|
||||
import useLockedFieldsManager from "@calcom/features/ee/managed-event-types/hooks/useLockedFieldsManager";
|
||||
import { useOrgBranding } from "@calcom/features/ee/organizations/context/provider";
|
||||
import cx from "@calcom/lib/classNames";
|
||||
import { CAL_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
@@ -116,6 +117,8 @@ export const EventSetupTab = (
|
||||
const [editingLocationType, setEditingLocationType] = useState<string>("");
|
||||
const [selectedLocation, setSelectedLocation] = useState<LocationOption | undefined>(undefined);
|
||||
const [multipleDuration, setMultipleDuration] = useState(eventType.metadata?.multipleDuration);
|
||||
const orgBranding = useOrgBranding();
|
||||
const seatsEnabled = formMethods.watch("seatsPerTimeSlotEnabled");
|
||||
|
||||
const locationOptions = props.locationOptions.map((locationOption) => {
|
||||
const options = locationOption.options.filter((option) => {
|
||||
@@ -129,10 +132,12 @@ export const EventSetupTab = (
|
||||
};
|
||||
});
|
||||
|
||||
const multipleDurationOptions = [5, 10, 15, 20, 25, 30, 45, 50, 60, 75, 80, 90, 120, 180].map((mins) => ({
|
||||
value: mins,
|
||||
label: t("multiple_duration_mins", { count: mins }),
|
||||
}));
|
||||
const multipleDurationOptions = [5, 10, 15, 20, 25, 30, 45, 50, 60, 75, 80, 90, 120, 150, 180].map(
|
||||
(mins) => ({
|
||||
value: mins,
|
||||
label: t("multiple_duration_mins", { count: mins }),
|
||||
})
|
||||
);
|
||||
|
||||
const [selectedMultipleDuration, setSelectedMultipleDuration] = useState<
|
||||
MultiValue<{
|
||||
@@ -383,6 +388,9 @@ export const EventSetupTab = (
|
||||
|
||||
const lengthLockedProps = shouldLockDisableProps("length");
|
||||
const descriptionLockedProps = shouldLockDisableProps("description");
|
||||
const urlPrefix = orgBranding
|
||||
? orgBranding?.fullDomain.replace(/^(https?:|)\/\//, "")
|
||||
: `${CAL_URL?.replace(/^(https?:|)\/\//, "")}`;
|
||||
|
||||
return (
|
||||
<div>
|
||||
@@ -411,10 +419,10 @@ export const EventSetupTab = (
|
||||
defaultValue={eventType.slug}
|
||||
addOnLeading={
|
||||
<>
|
||||
{CAL_URL?.replace(/^(https?:|)\/\//, "")}/
|
||||
{urlPrefix}/
|
||||
{!isManagedEventType
|
||||
? team
|
||||
? "team/" + team.slug
|
||||
? (orgBranding ? "" : "team/") + team.slug
|
||||
: eventType.users[0].username
|
||||
: t("username_placeholder")}
|
||||
/
|
||||
@@ -501,6 +509,8 @@ export const EventSetupTab = (
|
||||
<SettingsToggle
|
||||
title={t("allow_booker_to_select_duration")}
|
||||
checked={multipleDuration !== undefined}
|
||||
disabled={seatsEnabled}
|
||||
tooltip={seatsEnabled ? t("seat_options_doesnt_multiple_durations") : undefined}
|
||||
onCheckedChange={() => {
|
||||
if (multipleDuration !== undefined) {
|
||||
setMultipleDuration(undefined);
|
||||
|
||||
@@ -20,10 +20,11 @@ const SetupAvailability = (props: ISetupAvailabilityProps) => {
|
||||
const { t } = useLocale();
|
||||
const { nextStep } = props;
|
||||
|
||||
const scheduleId = defaultScheduleId === null ? undefined : defaultScheduleId;
|
||||
const queryAvailability = trpc.viewer.availability.schedule.get.useQuery(
|
||||
{ scheduleId: defaultScheduleId! },
|
||||
{ scheduleId },
|
||||
{
|
||||
enabled: !!defaultScheduleId,
|
||||
enabled: !!scheduleId,
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -12,9 +12,6 @@ const DisableUserImpersonation = ({ disableImpersonation }: { disableImpersonati
|
||||
showToast(t("your_user_profile_updated_successfully"), "success");
|
||||
await utils.viewer.me.invalidate();
|
||||
},
|
||||
async onSettled() {
|
||||
await utils.viewer.public.i18n.invalidate();
|
||||
},
|
||||
});
|
||||
|
||||
return (
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { zodResolver } from "@hookform/resolvers/zod";
|
||||
// eslint-disable-next-line no-restricted-imports
|
||||
import { noop } from "lodash";
|
||||
import { useCallback, useState } from "react";
|
||||
import { Controller, FormProvider, useForm, useFormState } from "react-hook-form";
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import classNames from "classnames";
|
||||
// eslint-disable-next-line no-restricted-imports
|
||||
import { debounce, noop } from "lodash";
|
||||
import { useSession } from "next-auth/react";
|
||||
import { usePathname, useRouter, useSearchParams } from "next/navigation";
|
||||
@@ -50,7 +51,7 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
|
||||
const pathname = usePathname();
|
||||
const router = useRouter();
|
||||
const { t } = useLocale();
|
||||
const { data: session, update } = useSession();
|
||||
const { update } = useSession();
|
||||
const {
|
||||
currentUsername,
|
||||
setCurrentUsername = noop,
|
||||
@@ -94,7 +95,6 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
|
||||
debouncedApiCall(inputUsernameValue);
|
||||
}, [debouncedApiCall, inputUsernameValue]);
|
||||
|
||||
const utils = trpc.useContext();
|
||||
const updateUsername = trpc.viewer.updateProfile.useMutation({
|
||||
onSuccess: async () => {
|
||||
onSuccessMutation && (await onSuccessMutation());
|
||||
@@ -104,9 +104,6 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
|
||||
onError: (error) => {
|
||||
onErrorMutation && onErrorMutation(error);
|
||||
},
|
||||
async onSettled() {
|
||||
await utils.viewer.public.i18n.invalidate();
|
||||
},
|
||||
});
|
||||
|
||||
// when current username isn't set - Go to stripe to check what username he wanted to buy and was it a premium and was it paid for
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import classNames from "classnames";
|
||||
// eslint-disable-next-line no-restricted-imports
|
||||
import { debounce, noop } from "lodash";
|
||||
import { useSession } from "next-auth/react";
|
||||
import type { RefCallback } from "react";
|
||||
@@ -24,7 +25,7 @@ interface ICustomUsernameProps {
|
||||
|
||||
const UsernameTextfield = (props: ICustomUsernameProps & Partial<React.ComponentProps<typeof TextField>>) => {
|
||||
const { t } = useLocale();
|
||||
const { data: session, update } = useSession();
|
||||
const { update } = useSession();
|
||||
|
||||
const {
|
||||
currentUsername,
|
||||
@@ -65,8 +66,6 @@ const UsernameTextfield = (props: ICustomUsernameProps & Partial<React.Component
|
||||
}
|
||||
}, [inputUsernameValue, debouncedApiCall, currentUsername]);
|
||||
|
||||
const utils = trpc.useContext();
|
||||
|
||||
const updateUsernameMutation = trpc.viewer.updateProfile.useMutation({
|
||||
onSuccess: async () => {
|
||||
onSuccessMutation && (await onSuccessMutation());
|
||||
@@ -77,9 +76,6 @@ const UsernameTextfield = (props: ICustomUsernameProps & Partial<React.Component
|
||||
onError: (error) => {
|
||||
onErrorMutation && onErrorMutation(error);
|
||||
},
|
||||
async onSettled() {
|
||||
await utils.viewer.public.i18n.invalidate();
|
||||
},
|
||||
});
|
||||
|
||||
const ActionButtons = () => {
|
||||
|
||||
@@ -1,35 +1,26 @@
|
||||
import dynamic from "next/dynamic";
|
||||
import { useSearchParams } from "next/navigation";
|
||||
import { useState } from "react";
|
||||
import { Controller, useForm } from "react-hook-form";
|
||||
|
||||
import { getOrgFullDomain } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { IS_SELF_HOSTED } from "@calcom/lib/constants";
|
||||
import { useOrgBranding } from "@calcom/features/ee/organizations/context/provider";
|
||||
import { CAL_URL, IS_SELF_HOSTED } from "@calcom/lib/constants";
|
||||
import type { TRPCClientErrorLike } from "@calcom/trpc/client";
|
||||
import type { RouterOutputs } from "@calcom/trpc/react";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import type { AppRouter } from "@calcom/trpc/server/routers/_app";
|
||||
|
||||
import useRouterQuery from "@lib/hooks/useRouterQuery";
|
||||
|
||||
import { PremiumTextfield } from "./PremiumTextfield";
|
||||
import { UsernameTextfield } from "./UsernameTextfield";
|
||||
|
||||
export const UsernameAvailability = IS_SELF_HOSTED ? UsernameTextfield : PremiumTextfield;
|
||||
|
||||
interface UsernameAvailabilityFieldProps {
|
||||
onSuccessMutation?: () => void;
|
||||
onErrorMutation?: (error: TRPCClientErrorLike<AppRouter>) => void;
|
||||
}
|
||||
|
||||
function useUserNamePrefix(organization: RouterOutputs["viewer"]["me"]["organization"]): string {
|
||||
return organization
|
||||
? organization.slug
|
||||
? getOrgFullDomain(organization.slug, { protocol: false })
|
||||
: organization.metadata && organization.metadata.requestedSlug
|
||||
? getOrgFullDomain(organization.metadata.requestedSlug, { protocol: false })
|
||||
: process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "")
|
||||
: process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "");
|
||||
}
|
||||
export const getUsernameAvailabilityComponent = (isPremium: boolean) => {
|
||||
if (isPremium)
|
||||
return dynamic(() => import("./PremiumTextfield").then((m) => m.PremiumTextfield), { ssr: false });
|
||||
return dynamic(() => import("./UsernameTextfield").then((m) => m.UsernameTextfield), { ssr: false });
|
||||
};
|
||||
|
||||
export const UsernameAvailabilityField = ({
|
||||
onSuccessMutation,
|
||||
@@ -49,7 +40,12 @@ export const UsernameAvailabilityField = ({
|
||||
},
|
||||
});
|
||||
|
||||
const usernamePrefix = useUserNamePrefix(user.organization);
|
||||
const UsernameAvailability = getUsernameAvailabilityComponent(!IS_SELF_HOSTED && !user.organization?.id);
|
||||
const orgBranding = useOrgBranding();
|
||||
|
||||
const usernamePrefix = orgBranding
|
||||
? orgBranding?.fullDomain.replace(/^(https?:|)\/\//, "")
|
||||
: `${CAL_URL?.replace(/^(https?:|)\/\//, "")}`;
|
||||
|
||||
return (
|
||||
<Controller
|
||||
@@ -65,7 +61,8 @@ export const UsernameAvailabilityField = ({
|
||||
setInputUsernameValue={onChange}
|
||||
onSuccessMutation={onSuccessMutation}
|
||||
onErrorMutation={onErrorMutation}
|
||||
addOnLeading={usernamePrefix}
|
||||
disabled={!!user.organization?.id}
|
||||
addOnLeading={`${usernamePrefix}/`}
|
||||
/>
|
||||
);
|
||||
}}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { TooltipProvider } from "@radix-ui/react-tooltip";
|
||||
import type { Session } from "next-auth";
|
||||
import { SessionProvider } from "next-auth/react";
|
||||
import { useSession } from "next-auth/react";
|
||||
import { SessionProvider, useSession } from "next-auth/react";
|
||||
import { EventCollectionProvider } from "next-collect/client";
|
||||
import type { SSRConfig } from "next-i18next";
|
||||
import { appWithTranslation } from "next-i18next";
|
||||
@@ -21,7 +20,7 @@ import { MetaProvider } from "@calcom/ui";
|
||||
import useIsBookingPage from "@lib/hooks/useIsBookingPage";
|
||||
import type { WithNonceProps } from "@lib/withNonce";
|
||||
|
||||
import { useViewerI18n } from "@components/I18nLanguageHandler";
|
||||
import { useClientViewerI18n } from "@components/I18nLanguageHandler";
|
||||
|
||||
const I18nextAdapter = appWithTranslation<
|
||||
NextJsAppProps<SSRConfig> & {
|
||||
@@ -69,11 +68,9 @@ type AppPropsWithoutNonce = Omit<AppPropsWithChildren, "pageProps"> & {
|
||||
const CustomI18nextProvider = (props: AppPropsWithoutNonce) => {
|
||||
/**
|
||||
* i18n should never be clubbed with other queries, so that it's caching can be managed independently.
|
||||
* We intend to not cache i18n query
|
||||
**/
|
||||
const { i18n, locale } = useViewerI18n().data ?? {
|
||||
locale: "en",
|
||||
};
|
||||
const clientViewerI18n = useClientViewerI18n(props.router.locales || []);
|
||||
const { i18n, locale } = clientViewerI18n.data || {};
|
||||
|
||||
const passedProps = {
|
||||
...props,
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
import parser from "accept-language-parser";
|
||||
import type { IncomingMessage } from "http";
|
||||
import type { GetServerSidePropsContext } from "next";
|
||||
|
||||
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
|
||||
import type { Maybe } from "@calcom/trpc/server";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const { i18n } = require("@calcom/config/next-i18next.config");
|
||||
|
||||
export function getLocaleFromHeaders(req: IncomingMessage): string {
|
||||
let preferredLocale: string | null | undefined;
|
||||
if (req.headers["accept-language"]) {
|
||||
preferredLocale = parser.pick(i18n.locales, req.headers["accept-language"]) as Maybe<string>;
|
||||
}
|
||||
return preferredLocale ?? i18n.defaultLocale;
|
||||
}
|
||||
|
||||
export const getOrSetUserLocaleFromHeaders = async (
|
||||
req: GetServerSidePropsContext["req"],
|
||||
res: GetServerSidePropsContext["res"]
|
||||
): Promise<string> => {
|
||||
const { default: prisma } = await import("@calcom/prisma");
|
||||
|
||||
const session = await getServerSession({ req, res });
|
||||
const preferredLocale = getLocaleFromHeaders(req);
|
||||
|
||||
if (session?.user?.id) {
|
||||
const user = await prisma.user.findUnique({
|
||||
where: {
|
||||
id: session.user.id,
|
||||
},
|
||||
select: {
|
||||
locale: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (user?.locale) {
|
||||
return user.locale;
|
||||
}
|
||||
|
||||
await prisma.user.update({
|
||||
where: {
|
||||
id: session.user.id,
|
||||
},
|
||||
data: {
|
||||
locale: preferredLocale,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
return preferredLocale;
|
||||
};
|
||||
@@ -3,6 +3,7 @@ const CopyWebpackPlugin = require("copy-webpack-plugin");
|
||||
const os = require("os");
|
||||
const englishTranslation = require("./public/static/locales/en/common.json");
|
||||
const { withAxiom } = require("next-axiom");
|
||||
const { version } = require("./package.json");
|
||||
const { i18n } = require("./next-i18next.config");
|
||||
const {
|
||||
orgHostPath,
|
||||
@@ -14,6 +15,9 @@ const {
|
||||
if (!process.env.NEXTAUTH_SECRET) throw new Error("Please set NEXTAUTH_SECRET");
|
||||
if (!process.env.CALENDSO_ENCRYPTION_KEY) throw new Error("Please set CALENDSO_ENCRYPTION_KEY");
|
||||
|
||||
// To be able to use the version in the app without having to import package.json
|
||||
process.env.NEXT_PUBLIC_CALCOM_VERSION = version;
|
||||
|
||||
// So we can test deploy previews preview
|
||||
if (process.env.VERCEL_URL && !process.env.NEXT_PUBLIC_WEBAPP_URL) {
|
||||
process.env.NEXT_PUBLIC_WEBAPP_URL = "https://" + process.env.VERCEL_URL;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@calcom/web",
|
||||
"version": "3.1.8",
|
||||
"version": "3.2.2",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"analyze": "ANALYZE=true next build",
|
||||
@@ -68,6 +68,7 @@
|
||||
"@vercel/og": "^0.5.0",
|
||||
"accept-language-parser": "^1.5.0",
|
||||
"async": "^3.2.4",
|
||||
"bcp-47-match": "^2.0.3",
|
||||
"bcryptjs": "^2.4.3",
|
||||
"classnames": "^2.3.1",
|
||||
"dotenv-cli": "^6.0.0",
|
||||
@@ -166,6 +167,7 @@
|
||||
"msw": "^0.42.3",
|
||||
"postcss": "^8.4.18",
|
||||
"tailwindcss": "^3.3.1",
|
||||
"tailwindcss-animate": "^1.0.6",
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "^4.9.4"
|
||||
},
|
||||
|
||||
@@ -36,6 +36,7 @@ import { ssrInit } from "@server/lib/ssr";
|
||||
|
||||
export function UserPage(props: InferGetServerSidePropsType<typeof getServerSideProps>) {
|
||||
const { users, profile, eventTypes, markdownStrippedBio, entity } = props;
|
||||
|
||||
const [user] = users; //To be used when we only have a single user, not dynamic group
|
||||
useTheme(profile.theme);
|
||||
const { t } = useLocale();
|
||||
@@ -82,6 +83,10 @@ export function UserPage(props: InferGetServerSidePropsType<typeof getServerSide
|
||||
profile: { name: `${profile.name}`, image: null },
|
||||
users: [{ username: `${user.username}`, name: `${user.name}` }],
|
||||
}}
|
||||
nextSeoProps={{
|
||||
noindex: !profile.allowSEOIndexing,
|
||||
nofollow: !profile.allowSEOIndexing,
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className={classNames(shouldAlignCentrally ? "mx-auto" : "", isEmbed ? "max-w-3xl" : "")}>
|
||||
@@ -93,7 +98,7 @@ export function UserPage(props: InferGetServerSidePropsType<typeof getServerSide
|
||||
)}>
|
||||
<div className="mb-8 text-center">
|
||||
<Avatar imageSrc={profile.image} size="xl" alt={profile.name} />
|
||||
<h1 className="font-cal text-emphasis mb-1 text-3xl">
|
||||
<h1 className="font-cal text-emphasis mb-1 text-3xl" data-testid="name-title">
|
||||
{profile.name}
|
||||
{user.verified && (
|
||||
<Verified className=" mx-1 -mt-1 inline h-6 w-6 fill-blue-500 text-white dark:text-black" />
|
||||
@@ -214,6 +219,7 @@ export type UserPageProps = {
|
||||
theme: string | null;
|
||||
brandColor: string;
|
||||
darkBrandColor: string;
|
||||
allowSEOIndexing: boolean;
|
||||
};
|
||||
users: Pick<User, "away" | "name" | "username" | "bio" | "verified">[];
|
||||
themeBasis: string | null;
|
||||
@@ -276,6 +282,7 @@ export const getServerSideProps: GetServerSideProps<UserPageProps> = async (cont
|
||||
away: true,
|
||||
verified: true,
|
||||
allowDynamicBooking: true,
|
||||
allowSEOIndexing: true,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -315,6 +322,7 @@ export const getServerSideProps: GetServerSideProps<UserPageProps> = async (cont
|
||||
theme: user.theme,
|
||||
brandColor: user.brandColor,
|
||||
darkBrandColor: user.darkBrandColor,
|
||||
allowSEOIndexing: user.allowSEOIndexing ?? true,
|
||||
};
|
||||
|
||||
const eventTypesWithHidden = await getEventTypesWithHiddenFromDB(user.id);
|
||||
|
||||
@@ -4,7 +4,11 @@ import { z } from "zod";
|
||||
import { Booker } from "@calcom/atoms";
|
||||
import { getBookerWrapperClasses } from "@calcom/features/bookings/Booker/utils/getBookerWrapperClasses";
|
||||
import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo";
|
||||
import { getBookingForReschedule, getBookingForSeatedEvent } from "@calcom/features/bookings/lib/get-booking";
|
||||
import {
|
||||
getBookingForReschedule,
|
||||
getBookingForSeatedEvent,
|
||||
getMultipleDurationValue,
|
||||
} from "@calcom/features/bookings/lib/get-booking";
|
||||
import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking";
|
||||
import { getSlugOrRequestedSlug } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
@@ -26,8 +30,10 @@ export default function Type({
|
||||
booking,
|
||||
away,
|
||||
isBrandingHidden,
|
||||
isSEOIndexable,
|
||||
rescheduleUid,
|
||||
entity,
|
||||
duration,
|
||||
}: PageProps) {
|
||||
return (
|
||||
<main className={getBookerWrapperClasses({ isEmbed: !!isEmbed })}>
|
||||
@@ -36,6 +42,7 @@ export default function Type({
|
||||
eventSlug={slug}
|
||||
rescheduleUid={rescheduleUid ?? undefined}
|
||||
hideBranding={isBrandingHidden}
|
||||
isSEOIndexable={isSEOIndexable ?? true}
|
||||
entity={entity}
|
||||
/>
|
||||
<Booker
|
||||
@@ -45,6 +52,7 @@ export default function Type({
|
||||
isAway={away}
|
||||
hideBranding={isBrandingHidden}
|
||||
entity={entity}
|
||||
duration={duration}
|
||||
/>
|
||||
</main>
|
||||
);
|
||||
@@ -55,7 +63,7 @@ Type.PageWrapper = PageWrapper;
|
||||
|
||||
async function getDynamicGroupPageProps(context: GetServerSidePropsContext) {
|
||||
const { user: usernames, type: slug } = paramsSchema.parse(context.params);
|
||||
const { rescheduleUid, bookingUid } = context.query;
|
||||
const { rescheduleUid, bookingUid, duration: queryDuration } = context.query;
|
||||
|
||||
const { ssrInit } = await import("@server/lib/ssr");
|
||||
const ssr = await ssrInit(context);
|
||||
@@ -111,12 +119,18 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) {
|
||||
return {
|
||||
props: {
|
||||
entity: eventData.entity,
|
||||
duration: getMultipleDurationValue(
|
||||
eventData.metadata?.multipleDuration,
|
||||
queryDuration,
|
||||
eventData.length
|
||||
),
|
||||
booking,
|
||||
user: usernames.join("+"),
|
||||
slug,
|
||||
away: false,
|
||||
trpcState: ssr.dehydrate(),
|
||||
isBrandingHidden: false,
|
||||
isSEOIndexable: true,
|
||||
themeBasis: null,
|
||||
bookingUid: bookingUid ? `${bookingUid}` : null,
|
||||
rescheduleUid: rescheduleUid ? `${rescheduleUid}` : null,
|
||||
@@ -127,7 +141,7 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) {
|
||||
async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
const { user: usernames, type: slug } = paramsSchema.parse(context.params);
|
||||
const username = usernames[0];
|
||||
const { rescheduleUid, bookingUid } = context.query;
|
||||
const { rescheduleUid, bookingUid, duration: queryDuration } = context.query;
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(
|
||||
context.req.headers.host ?? "",
|
||||
context.params?.orgSlug
|
||||
@@ -143,6 +157,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
select: {
|
||||
away: true,
|
||||
hideBranding: true,
|
||||
allowSEOIndexing: true,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -177,12 +192,18 @@ async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
return {
|
||||
props: {
|
||||
booking,
|
||||
duration: getMultipleDurationValue(
|
||||
eventData.metadata?.multipleDuration,
|
||||
queryDuration,
|
||||
eventData.length
|
||||
),
|
||||
away: user?.away,
|
||||
user: username,
|
||||
slug,
|
||||
entity: eventData.entity,
|
||||
trpcState: ssr.dehydrate(),
|
||||
isBrandingHidden: user?.hideBranding,
|
||||
isSEOIndexable: user?.allowSEOIndexing,
|
||||
themeBasis: username,
|
||||
bookingUid: bookingUid ? `${bookingUid}` : null,
|
||||
rescheduleUid: rescheduleUid ? `${rescheduleUid}` : null,
|
||||
|
||||
@@ -8,7 +8,7 @@ import { sendEmailVerification } from "@calcom/features/auth/lib/verifyEmail";
|
||||
import { IS_CALCOM } from "@calcom/lib/constants";
|
||||
import slugify from "@calcom/lib/slugify";
|
||||
import { closeComUpsertTeamUser } from "@calcom/lib/sync/SyncServiceManager";
|
||||
import { validateUsernameInOrg } from "@calcom/lib/validateUsernameInOrg";
|
||||
import { validateUsernameInTeam, validateUsername } from "@calcom/lib/validateUsername";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { IdentityProvider } from "@calcom/prisma/enums";
|
||||
import { teamMetadataSchema } from "@calcom/prisma/zod-utils";
|
||||
@@ -39,6 +39,19 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
const username = slugify(data.username);
|
||||
const userEmail = email.toLowerCase();
|
||||
|
||||
const validationResponse = (
|
||||
incomingEmail: string,
|
||||
validation: { isValid: boolean; email: string | undefined }
|
||||
) => {
|
||||
const { isValid, email } = validation;
|
||||
if (!isValid) {
|
||||
const message: string =
|
||||
email !== incomingEmail ? "Username already taken" : "Email address is already registered";
|
||||
|
||||
return res.status(409).json({ message });
|
||||
}
|
||||
};
|
||||
|
||||
if (!username) {
|
||||
res.status(422).json({ message: "Invalid username" });
|
||||
return;
|
||||
@@ -65,42 +78,12 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
return res.status(401).json({ message: "Token expired" });
|
||||
}
|
||||
if (foundToken?.teamId) {
|
||||
const isValidUsername = await validateUsernameInOrg(username, foundToken?.teamId);
|
||||
|
||||
if (!isValidUsername) {
|
||||
return res.status(409).json({ message: "Username already taken" });
|
||||
}
|
||||
const teamUserValidation = await validateUsernameInTeam(username, userEmail, foundToken?.teamId);
|
||||
return validationResponse(userEmail, teamUserValidation);
|
||||
}
|
||||
} else {
|
||||
// There is an existingUser if the username matches
|
||||
// OR if the email matches AND either the email is verified
|
||||
// or both username and password are set
|
||||
const existingUser = await prisma.user.findFirst({
|
||||
where: {
|
||||
OR: [
|
||||
{ username },
|
||||
{
|
||||
AND: [
|
||||
{ email: userEmail },
|
||||
{
|
||||
OR: [
|
||||
{ emailVerified: { not: null } },
|
||||
{
|
||||
AND: [{ password: { not: null } }, { username: { not: null } }],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
if (existingUser) {
|
||||
const message: string =
|
||||
existingUser.email !== userEmail ? "Username already taken" : "Email address is already registered";
|
||||
|
||||
return res.status(409).json({ message });
|
||||
}
|
||||
const userValidation = await validateUsername(username, userEmail);
|
||||
return validationResponse(userEmail, userValidation);
|
||||
}
|
||||
|
||||
const hashedPassword = await hashPassword(password);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { authenticator } from "otplib";
|
||||
|
||||
import { ErrorCode } from "@calcom/features/auth/lib/ErrorCode";
|
||||
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
|
||||
import { verifyPassword } from "@calcom/features/auth/lib/verifyPassword";
|
||||
import { symmetricDecrypt } from "@calcom/lib/crypto";
|
||||
import { totpAuthenticatorCheck } from "@calcom/lib/totp";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { IdentityProvider } from "@calcom/prisma/client";
|
||||
|
||||
@@ -69,7 +69,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
}
|
||||
|
||||
// If user has 2fa enabled, check if body.code is correct
|
||||
const isValidToken = authenticator.check(req.body.code, secret);
|
||||
const isValidToken = totpAuthenticatorCheck(req.body.code, secret);
|
||||
if (!isValidToken) {
|
||||
return res.status(400).json({ error: ErrorCode.IncorrectTwoFactorCode });
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { authenticator } from "otplib";
|
||||
|
||||
import { ErrorCode } from "@calcom/features/auth/lib/ErrorCode";
|
||||
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
|
||||
import { symmetricDecrypt } from "@calcom/lib/crypto";
|
||||
import { totpAuthenticatorCheck } from "@calcom/lib/totp";
|
||||
import prisma from "@calcom/prisma";
|
||||
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
@@ -48,7 +48,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
return res.status(500).json({ error: ErrorCode.InternalServerError });
|
||||
}
|
||||
|
||||
const isValidToken = authenticator.check(req.body.code, secret);
|
||||
const isValidToken = totpAuthenticatorCheck(req.body.code, secret);
|
||||
if (!isValidToken) {
|
||||
return res.status(400).json({ error: ErrorCode.IncorrectTwoFactorCode });
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export { default, config } from "@calcom/features/ee/payments/api/paypal-webhook";
|
||||
@@ -0,0 +1,4 @@
|
||||
import appBasecamp3 from "@calcom/app-store/basecamp3/trpc-router";
|
||||
import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler";
|
||||
|
||||
export default createNextApiHandler(appBasecamp3);
|
||||
@@ -0,0 +1,4 @@
|
||||
import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler";
|
||||
import { kycVerificationRouter } from "@calcom/trpc/server/routers/viewer/kycVerification/_router";
|
||||
|
||||
export default createNextApiHandler(kycVerificationRouter);
|
||||
@@ -40,9 +40,11 @@ export default function Apps({ apps }: InferGetStaticPropsType<typeof getStaticP
|
||||
}>
|
||||
<div className="mb-16">
|
||||
<div className="grid-col-1 grid grid-cols-1 gap-3 md:grid-cols-3">
|
||||
{apps.map((app) => {
|
||||
return <AppCard key={app.slug} app={app} />;
|
||||
})}
|
||||
{apps
|
||||
.sort((a, b) => (b.installCount || 0) - (a.installCount || 0))
|
||||
.map((app) => {
|
||||
return <AppCard key={app.slug} app={app} />;
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</Shell>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// eslint-disable-next-line no-restricted-imports
|
||||
import { debounce } from "lodash";
|
||||
import type { GetServerSidePropsContext } from "next";
|
||||
import { getCsrfToken } from "next-auth/react";
|
||||
|
||||
@@ -74,7 +74,7 @@ const DateOverride = ({ workingHours }: { workingHours: WorkingHours[] }) => {
|
||||
<DateOverrideInputDialog
|
||||
workingHours={workingHours}
|
||||
excludedDates={excludedDates}
|
||||
onChange={(ranges) => append({ ranges })}
|
||||
onChange={(ranges) => ranges.forEach((range) => append({ ranges: [range] }))}
|
||||
Trigger={
|
||||
<Button color="secondary" StartIcon={Plus} data-testid="add-override">
|
||||
{t("add_an_override")}
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
import { useAutoAnimate } from "@formkit/auto-animate/react";
|
||||
import { useRouter } from "next/navigation";
|
||||
import { useRouter, useSearchParams, usePathname } from "next/navigation";
|
||||
import { useCallback } from "react";
|
||||
|
||||
import { useOrgBranding } from "@calcom/ee/organizations/context/provider";
|
||||
import { getLayout } from "@calcom/features/MainLayout";
|
||||
import { NewScheduleButton, ScheduleListItem } from "@calcom/features/schedules";
|
||||
import { ShellMain } from "@calcom/features/shell/Shell";
|
||||
import { AvailabilitySliderTable } from "@calcom/features/timezone-buddy/components/AvailabilitySliderTable";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { HttpError } from "@calcom/lib/http-error";
|
||||
import type { RouterOutputs } from "@calcom/trpc/react";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import { EmptyScreen, showToast } from "@calcom/ui";
|
||||
import { EmptyScreen, showToast, ToggleGroup } from "@calcom/ui";
|
||||
import { Clock } from "@calcom/ui/components/icon";
|
||||
|
||||
import { withQuery } from "@lib/QueryCell";
|
||||
@@ -129,14 +132,54 @@ const WithQuery = withQuery(trpc.viewer.availability.list as any);
|
||||
|
||||
export default function AvailabilityPage() {
|
||||
const { t } = useLocale();
|
||||
const searchParams = useSearchParams();
|
||||
const router = useRouter();
|
||||
const pathname = usePathname();
|
||||
const orgBranding = useOrgBranding();
|
||||
|
||||
// Get a new searchParams string by merging the current
|
||||
// searchParams with a provided key/value pair
|
||||
const createQueryString = useCallback(
|
||||
(name: string, value: string) => {
|
||||
const params = new URLSearchParams(searchParams ?? undefined);
|
||||
params.set(name, value);
|
||||
|
||||
return params.toString();
|
||||
},
|
||||
[searchParams]
|
||||
);
|
||||
return (
|
||||
<div>
|
||||
<ShellMain
|
||||
heading={t("availability")}
|
||||
hideHeadingOnMobile
|
||||
subtitle={t("configure_availability")}
|
||||
CTA={<NewScheduleButton />}>
|
||||
<WithQuery success={({ data }) => <AvailabilityList {...data} />} customLoader={<SkeletonLoader />} />
|
||||
CTA={
|
||||
<div className="flex gap-2">
|
||||
{orgBranding && (
|
||||
<ToggleGroup
|
||||
className="hidden md:block"
|
||||
defaultValue={searchParams?.get("type") ?? "mine"}
|
||||
onValueChange={(value) => {
|
||||
router.push(`${pathname}?${createQueryString("type", value)}`);
|
||||
}}
|
||||
options={[
|
||||
{ value: "mine", label: t("my_availability") },
|
||||
{ value: "team", label: t("team_availability") },
|
||||
]}
|
||||
/>
|
||||
)}
|
||||
<NewScheduleButton />
|
||||
</div>
|
||||
}>
|
||||
{searchParams?.get("type") === "team" && orgBranding ? (
|
||||
<AvailabilitySliderTable />
|
||||
) : (
|
||||
<WithQuery
|
||||
success={({ data }) => <AvailabilityList {...data} />}
|
||||
customLoader={<SkeletonLoader />}
|
||||
/>
|
||||
)}
|
||||
</ShellMain>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -23,12 +23,9 @@ import {
|
||||
useIsEmbed,
|
||||
} from "@calcom/embed-core/embed-iframe";
|
||||
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
|
||||
import { SystemField } from "@calcom/features/bookings/lib/SystemField";
|
||||
import { SMS_REMINDER_NUMBER_FIELD, SystemField } from "@calcom/features/bookings/lib/SystemField";
|
||||
import { getBookingWithResponses } from "@calcom/features/bookings/lib/get-booking";
|
||||
import {
|
||||
getBookingFieldsWithSystemFields,
|
||||
SMS_REMINDER_NUMBER_FIELD,
|
||||
} from "@calcom/features/bookings/lib/getBookingFields";
|
||||
import { getBookingFieldsWithSystemFields } from "@calcom/features/bookings/lib/getBookingFields";
|
||||
import { parseRecurringEvent } from "@calcom/lib";
|
||||
import { APP_NAME } from "@calcom/lib/constants";
|
||||
import {
|
||||
@@ -96,7 +93,7 @@ const querySchema = z.object({
|
||||
});
|
||||
|
||||
export default function Success(props: SuccessProps) {
|
||||
const { t } = useLocale();
|
||||
const { t, i18n } = useLocale();
|
||||
const router = useRouter();
|
||||
const routerQuery = useRouterQuery();
|
||||
const pathname = usePathname();
|
||||
@@ -113,7 +110,8 @@ export default function Success(props: SuccessProps) {
|
||||
const attendeeTimeZone = props?.bookingInfo?.attendees.find(
|
||||
(attendee) => attendee.email === email
|
||||
)?.timeZone;
|
||||
const tz = isSuccessBookingPage && attendeeTimeZone ? attendeeTimeZone : props.tz ? props.tz : timeZone();
|
||||
|
||||
const tz = props.tz ? props.tz : isSuccessBookingPage && attendeeTimeZone ? attendeeTimeZone : timeZone();
|
||||
|
||||
const location = props.bookingInfo.location as ReturnType<typeof getEventLocationValue>;
|
||||
|
||||
@@ -314,7 +312,7 @@ export default function Success(props: SuccessProps) {
|
||||
<Link
|
||||
href={allRemainingBookings ? "/bookings/recurring" : "/bookings/upcoming"}
|
||||
className="hover:bg-subtle text-subtle hover:text-default mt-2 inline-flex px-1 py-2 text-sm dark:hover:bg-transparent">
|
||||
<ChevronLeft className="h-5 w-5" /> {t("back_to_bookings")}
|
||||
<ChevronLeft className="h-5 w-5 rtl:rotate-180" /> {t("back_to_bookings")}
|
||||
</Link>
|
||||
</div>
|
||||
)}
|
||||
@@ -394,7 +392,7 @@ export default function Success(props: SuccessProps) {
|
||||
</h4>
|
||||
)}
|
||||
|
||||
<div className="border-subtle text-default mt-8 grid grid-cols-3 border-t pt-8 text-left">
|
||||
<div className="border-subtle text-default mt-8 grid grid-cols-3 border-t pt-8 text-left rtl:text-right">
|
||||
{(isCancelled || reschedule) && cancellationReason && (
|
||||
<>
|
||||
<div className="font-medium">
|
||||
@@ -480,6 +478,21 @@ export default function Success(props: SuccessProps) {
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{props.paymentStatus && (
|
||||
<>
|
||||
<div className="mt-3 font-medium">
|
||||
{props.paymentStatus.paymentOption === "HOLD"
|
||||
? t("complete_your_booking")
|
||||
: t("payment")}
|
||||
</div>
|
||||
<div className="col-span-2 mb-2 mt-3">
|
||||
{new Intl.NumberFormat(i18n.language, {
|
||||
style: "currency",
|
||||
currency: props.paymentStatus.currency,
|
||||
}).format(props.paymentStatus.amount / 100.0)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{bookingInfo?.description && (
|
||||
<>
|
||||
<div className="mt-9 font-medium">{t("additional_notes")}</div>
|
||||
@@ -715,7 +728,7 @@ export default function Success(props: SuccessProps) {
|
||||
</div>
|
||||
{isGmail && (
|
||||
<Alert
|
||||
className="main -mb-20 mt-4 inline-block text-left sm:-mt-4 sm:mb-4 sm:w-full sm:max-w-xl sm:align-middle"
|
||||
className="main -mb-20 mt-4 inline-block ltr:text-left rtl:text-right sm:-mt-4 sm:mb-4 sm:w-full sm:max-w-xl sm:align-middle"
|
||||
severity="warning"
|
||||
message={
|
||||
<div>
|
||||
@@ -1117,6 +1130,9 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||
select: {
|
||||
success: true,
|
||||
refunded: true,
|
||||
currency: true,
|
||||
amount: true,
|
||||
paymentOption: true,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import { z } from "zod";
|
||||
import { Booker } from "@calcom/atoms";
|
||||
import { getBookerWrapperClasses } from "@calcom/features/bookings/Booker/utils/getBookerWrapperClasses";
|
||||
import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo";
|
||||
import { getBookingForReschedule } from "@calcom/features/bookings/lib/get-booking";
|
||||
import { getBookingForReschedule, getMultipleDurationValue } from "@calcom/features/bookings/lib/get-booking";
|
||||
import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import slugify from "@calcom/lib/slugify";
|
||||
@@ -26,6 +26,7 @@ export default function Type({
|
||||
isBrandingHidden,
|
||||
isTeamEvent,
|
||||
entity,
|
||||
duration,
|
||||
}: PageProps) {
|
||||
return (
|
||||
<main className={getBookerWrapperClasses({ isEmbed: !!isEmbed })}>
|
||||
@@ -44,6 +45,7 @@ export default function Type({
|
||||
hideBranding={isBrandingHidden}
|
||||
isTeamEvent={isTeamEvent}
|
||||
entity={entity}
|
||||
duration={duration}
|
||||
/>
|
||||
</main>
|
||||
);
|
||||
@@ -54,7 +56,7 @@ Type.isBookingPage = true;
|
||||
|
||||
async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
const { link, slug } = paramsSchema.parse(context.params);
|
||||
const { rescheduleUid } = context.query;
|
||||
const { rescheduleUid, duration: queryDuration } = context.query;
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(context.req.headers.host ?? "");
|
||||
const org = isValidOrgDomain ? currentOrgDomain : null;
|
||||
|
||||
@@ -133,6 +135,11 @@ async function getUserPageProps(context: GetServerSidePropsContext) {
|
||||
return {
|
||||
props: {
|
||||
entity: eventData.entity,
|
||||
duration: getMultipleDurationValue(
|
||||
eventData.metadata?.multipleDuration,
|
||||
queryDuration,
|
||||
eventData.length
|
||||
),
|
||||
booking,
|
||||
away: user?.away,
|
||||
user: username,
|
||||
|
||||
@@ -132,6 +132,7 @@ export type FormValues = {
|
||||
bookingFields: z.infer<typeof eventTypeBookingFields>;
|
||||
availability?: AvailabilityOption;
|
||||
bookerLayouts: BookerLayoutSettings;
|
||||
multipleDurationEnabled: boolean;
|
||||
};
|
||||
|
||||
export type CustomInputParsed = typeof customInputSchema._output;
|
||||
@@ -278,6 +279,7 @@ const EventTypePage = (props: EventTypeSetupProps) => {
|
||||
.filter((slug) => slug !== eventType.slug) ?? [],
|
||||
},
|
||||
})),
|
||||
seatsPerTimeSlotEnabled: eventType.seatsPerTimeSlot,
|
||||
};
|
||||
}, [eventType, periodDates, metadata]);
|
||||
|
||||
@@ -375,7 +377,10 @@ const EventTypePage = (props: EventTypeSetupProps) => {
|
||||
seatsPerTimeSlotEnabled,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
minimumBookingNoticeInDurationType,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
bookerLayouts,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
multipleDurationEnabled,
|
||||
...input
|
||||
} = values;
|
||||
|
||||
@@ -463,6 +468,8 @@ const EventTypePage = (props: EventTypeSetupProps) => {
|
||||
// We don't need to send send these values to the backend
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
seatsPerTimeSlotEnabled,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
multipleDurationEnabled,
|
||||
...input
|
||||
} = values;
|
||||
|
||||
|
||||
@@ -737,7 +737,9 @@ const EventTypeListHeading = ({
|
||||
</span>
|
||||
)}
|
||||
{profile?.slug && (
|
||||
<Link href={`${CAL_URL}/${profile.slug}`} className="text-subtle block text-xs">
|
||||
<Link
|
||||
href={`${orgBranding ? orgBranding.fullDomain : CAL_URL}/${profile.slug}`}
|
||||
className="text-subtle block text-xs">
|
||||
{`${bookerUrl.replace("https://", "").replace("http://", "")}/${profile.slug}`}
|
||||
</Link>
|
||||
)}
|
||||
@@ -830,13 +832,13 @@ const SetupProfileBanner = ({ closeAction }: { closeAction: () => void }) => {
|
||||
|
||||
const Main = ({
|
||||
status,
|
||||
error,
|
||||
errorMessage,
|
||||
data,
|
||||
filters,
|
||||
}: {
|
||||
status: string;
|
||||
data: GetByViewerResponse;
|
||||
error: any;
|
||||
errorMessage?: string;
|
||||
filters: ReturnType<typeof getTeamsFiltersFromQuery>;
|
||||
}) => {
|
||||
const isMobile = useMediaQuery("(max-width: 768px)");
|
||||
@@ -848,7 +850,7 @@ const Main = ({
|
||||
}
|
||||
|
||||
if (status === "error") {
|
||||
return <Alert severity="error" title="Something went wrong" message={error.message} />;
|
||||
return <Alert severity="error" title="Something went wrong" message={errorMessage} />;
|
||||
}
|
||||
|
||||
const isFilteredByOnlyOneItem =
|
||||
@@ -945,7 +947,7 @@ const EventTypesPage = () => {
|
||||
title="Event Types"
|
||||
description="Create events to share for people to book on your calendar."
|
||||
/>
|
||||
<Main data={data} status={status} error={error} filters={filters} />
|
||||
<Main data={data} status={status} errorMessage={error?.message} filters={filters} />
|
||||
</ShellMain>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
import { getLayout } from "@components/auth/layouts/AdminLayout";
|
||||
|
||||
import KYCVerificationView from "./kycVerificationView";
|
||||
|
||||
const KYCVerificationPage = () => <KYCVerificationView />;
|
||||
|
||||
KYCVerificationPage.getLayout = getLayout;
|
||||
KYCVerificationPage.PageWrapper = PageWrapper;
|
||||
|
||||
export default KYCVerificationPage;
|
||||
@@ -0,0 +1,80 @@
|
||||
import { useForm } from "react-hook-form";
|
||||
|
||||
import { trpc } from "@calcom/trpc";
|
||||
import { Meta, Form, Button, TextField, showToast } from "@calcom/ui";
|
||||
|
||||
type FormValues = {
|
||||
name?: string | null;
|
||||
};
|
||||
|
||||
export default function KYCVerificationView() {
|
||||
const teamForm = useForm<FormValues>();
|
||||
const userForm = useForm<FormValues>();
|
||||
|
||||
const mutation = trpc.viewer.kycVerification.verify.useMutation({
|
||||
onSuccess: async (data) => {
|
||||
showToast(`Successfully verified ${data.isTeam ? "team" : "user"} ${data.name}`, "success");
|
||||
},
|
||||
onError: (error) => {
|
||||
showToast(`Verification failed: ${error.message}`, "error");
|
||||
},
|
||||
});
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Meta
|
||||
title="KYC Verification"
|
||||
description="Here you can verify users and teams. This verification is needed for sending sms/whatsapp messages to attendees."
|
||||
/>
|
||||
<div>
|
||||
<div className="mb-2 font-medium">Verify Team</div>
|
||||
|
||||
<Form
|
||||
form={teamForm}
|
||||
handleSubmit={(values) => {
|
||||
mutation.mutate({
|
||||
name: values.name || "",
|
||||
isTeam: true,
|
||||
});
|
||||
}}>
|
||||
<div className="flex space-x-2">
|
||||
<TextField
|
||||
{...teamForm.register("name")}
|
||||
label=""
|
||||
type="text"
|
||||
id="name"
|
||||
placeholder="team slug"
|
||||
className="-mt-2 "
|
||||
required
|
||||
/>
|
||||
<Button type="submit">Verify</Button>
|
||||
</div>
|
||||
</Form>
|
||||
</div>
|
||||
<div>
|
||||
<div className="mb-2 mt-6 font-medium">Verify User</div>
|
||||
<Form
|
||||
form={userForm}
|
||||
handleSubmit={(values) => {
|
||||
mutation.mutate({
|
||||
name: values.name || "",
|
||||
isTeam: false,
|
||||
});
|
||||
}}>
|
||||
<div className="flex space-x-2">
|
||||
<TextField
|
||||
{...userForm.register("name")}
|
||||
label=""
|
||||
type="text"
|
||||
id="name"
|
||||
placeholder="user name"
|
||||
className="-mt-2"
|
||||
required
|
||||
/>
|
||||
<Button type="submit">Verify</Button>
|
||||
</div>
|
||||
</Form>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -57,7 +57,7 @@ const ApiKeysView = () => {
|
||||
<div>
|
||||
{isLoading ? null : data?.length ? (
|
||||
<>
|
||||
<div className="mb-8 mt-6 rounded-md border">
|
||||
<div className="border-subtle mb-8 mt-6 rounded-md border">
|
||||
{data.map((apiKey, index) => (
|
||||
<ApiKeyListItem
|
||||
key={apiKey.id}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { useSession } from "next-auth/react";
|
||||
import { Controller, useForm } from "react-hook-form";
|
||||
|
||||
import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout";
|
||||
@@ -20,8 +21,6 @@ import {
|
||||
TimezoneSelect,
|
||||
} from "@calcom/ui";
|
||||
|
||||
import { withQuery } from "@lib/QueryCell";
|
||||
|
||||
import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
const SkeletonLoader = ({ title, description }: { title: string; description: string }) => {
|
||||
@@ -45,11 +44,6 @@ interface GeneralViewProps {
|
||||
user: RouterOutputs["viewer"]["me"];
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const WithQuery = withQuery(trpc.viewer.public.i18n as any, undefined, {
|
||||
trpc: { context: { skipBatch: true } },
|
||||
});
|
||||
|
||||
const GeneralQueryView = () => {
|
||||
const { t } = useLocale();
|
||||
|
||||
@@ -58,30 +52,26 @@ const GeneralQueryView = () => {
|
||||
if (!user) {
|
||||
throw new Error(t("something_went_wrong"));
|
||||
}
|
||||
return (
|
||||
<WithQuery
|
||||
success={({ data }) => <GeneralView user={user} localeProp={data.locale} />}
|
||||
customLoader={<SkeletonLoader title={t("general")} description={t("general_description")} />}
|
||||
/>
|
||||
);
|
||||
return <GeneralView user={user} localeProp={user.locale} />;
|
||||
};
|
||||
|
||||
const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
const utils = trpc.useContext();
|
||||
const { t } = useLocale();
|
||||
const { update } = useSession();
|
||||
|
||||
const mutation = trpc.viewer.updateProfile.useMutation({
|
||||
onSuccess: async () => {
|
||||
// Invalidate our previous i18n cache
|
||||
await utils.viewer.public.i18n.invalidate();
|
||||
onSuccess: async (res) => {
|
||||
await utils.viewer.me.invalidate();
|
||||
reset(getValues());
|
||||
showToast(t("settings_updated_successfully"), "success");
|
||||
update(res);
|
||||
},
|
||||
onError: () => {
|
||||
showToast(t("error_updating_settings"), "error");
|
||||
},
|
||||
onSettled: async () => {
|
||||
await utils.viewer.public.i18n.invalidate();
|
||||
await utils.viewer.me.invalidate();
|
||||
},
|
||||
});
|
||||
|
||||
@@ -116,6 +106,7 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
label: nameOfDay(localeProp, user.weekStart === "Sunday" ? 0 : 1),
|
||||
},
|
||||
allowDynamicBooking: user.allowDynamicBooking ?? true,
|
||||
allowSEOIndexing: user.allowSEOIndexing ?? true,
|
||||
},
|
||||
});
|
||||
const {
|
||||
@@ -124,6 +115,7 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
getValues,
|
||||
} = formMethods;
|
||||
const isDisabled = isSubmitting || !isDirty;
|
||||
|
||||
return (
|
||||
<Form
|
||||
form={formMethods}
|
||||
@@ -225,6 +217,24 @@ const GeneralView = ({ localeProp, user }: GeneralViewProps) => {
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="mt-8">
|
||||
<Controller
|
||||
name="allowSEOIndexing"
|
||||
control={formMethods.control}
|
||||
render={() => (
|
||||
<SettingsToggle
|
||||
title={t("seo_indexing")}
|
||||
description={t("allow_seo_indexing")}
|
||||
checked={formMethods.getValues("allowSEOIndexing")}
|
||||
onCheckedChange={(checked) => {
|
||||
formMethods.setValue("allowSEOIndexing", checked, { shouldDirty: true });
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
loading={mutation.isLoading}
|
||||
disabled={isDisabled}
|
||||
|
||||
+31
-23
@@ -14,6 +14,7 @@ import { useFlagMap } from "@calcom/features/flags/context/provider";
|
||||
import { getFeatureFlagMap } from "@calcom/features/flags/server/utils";
|
||||
import { IS_SELF_HOSTED, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import slugify from "@calcom/lib/slugify";
|
||||
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry";
|
||||
import { teamMetadataSchema } from "@calcom/prisma/zod-utils";
|
||||
import type { inferSSRProps } from "@calcom/types/inferSSRProps";
|
||||
@@ -130,10 +131,11 @@ export default function Signup({ prepopulateFormValues, token, orgSlug }: Signup
|
||||
<TextField
|
||||
addOnLeading={
|
||||
orgSlug
|
||||
? getOrgFullDomain(orgSlug, { protocol: false })
|
||||
? getOrgFullDomain(orgSlug, { protocol: true })
|
||||
: `${process.env.NEXT_PUBLIC_WEBSITE_URL}/`
|
||||
}
|
||||
{...register("username")}
|
||||
disabled={!!orgSlug}
|
||||
required
|
||||
/>
|
||||
<EmailField
|
||||
@@ -192,8 +194,6 @@ export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
|
||||
};
|
||||
|
||||
if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === "true" || flags["disable-signup"]) {
|
||||
console.log({ flag: flags["disable-signup"] });
|
||||
|
||||
return {
|
||||
notFound: true,
|
||||
};
|
||||
@@ -210,6 +210,20 @@ export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
|
||||
where: {
|
||||
token,
|
||||
},
|
||||
include: {
|
||||
team: {
|
||||
select: {
|
||||
metadata: true,
|
||||
parentId: true,
|
||||
parent: {
|
||||
select: {
|
||||
slug: true,
|
||||
},
|
||||
},
|
||||
slug: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (!verificationToken || verificationToken.expires < new Date()) {
|
||||
@@ -249,41 +263,35 @@ export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
|
||||
|
||||
let username = guessUsernameFromEmail(verificationToken.identifier);
|
||||
|
||||
const orgInfo = await prisma.user.findFirst({
|
||||
where: {
|
||||
email: verificationToken?.identifier,
|
||||
},
|
||||
select: {
|
||||
organization: {
|
||||
select: {
|
||||
slug: true,
|
||||
metadata: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
const tokenTeam = {
|
||||
...verificationToken?.team,
|
||||
metadata: teamMetadataSchema.parse(verificationToken?.team?.metadata),
|
||||
};
|
||||
|
||||
const userOrgMetadata = teamMetadataSchema.parse(orgInfo?.organization?.metadata ?? {});
|
||||
// Detect if the team is an org by either the metadata flag or if it has a parent team
|
||||
const isOrganization = tokenTeam.metadata?.isOrganization || tokenTeam?.parentId !== null;
|
||||
// If we are dealing with an org, the slug may come from the team itself or its parent
|
||||
const orgSlug = isOrganization
|
||||
? tokenTeam.slug || tokenTeam.metadata?.requestedSlug || tokenTeam.parent?.slug
|
||||
: null;
|
||||
|
||||
if (!IS_SELF_HOSTED) {
|
||||
// Org context shouldn't check if a username is premium
|
||||
if (!IS_SELF_HOSTED && !isOrganization) {
|
||||
// Im not sure we actually hit this because of next redirects signup to website repo - but just in case this is pretty cool :)
|
||||
const { available, suggestion } = await checkPremiumUsername(username);
|
||||
|
||||
username = available ? username : suggestion || username;
|
||||
}
|
||||
|
||||
// Transform all + to - in username
|
||||
username = username.replace(/\+/g, "-");
|
||||
|
||||
return {
|
||||
props: {
|
||||
...props,
|
||||
token,
|
||||
prepopulateFormValues: {
|
||||
email: verificationToken.identifier,
|
||||
username,
|
||||
username: slugify(username),
|
||||
},
|
||||
orgSlug: (orgInfo?.organization?.slug || userOrgMetadata?.requestedSlug) ?? null,
|
||||
orgSlug,
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
@@ -182,7 +182,7 @@ function TeamPage({ team, isUnpublished, markdownStrippedBio, isValidOrgDomain }
|
||||
size="lg"
|
||||
/>
|
||||
</div>
|
||||
<p className="font-cal text-emphasis mb-2 text-2xl tracking-wider">
|
||||
<p className="font-cal text-emphasis mb-2 text-2xl tracking-wider" data-testid="team-name">
|
||||
{team.parent && `${team.parent.name} `}
|
||||
{teamName}
|
||||
</p>
|
||||
|
||||
@@ -4,7 +4,7 @@ import { z } from "zod";
|
||||
import { Booker } from "@calcom/atoms";
|
||||
import { getBookerWrapperClasses } from "@calcom/features/bookings/Booker/utils/getBookerWrapperClasses";
|
||||
import { BookerSeo } from "@calcom/features/bookings/components/BookerSeo";
|
||||
import { getBookingForReschedule } from "@calcom/features/bookings/lib/get-booking";
|
||||
import { getBookingForReschedule, getMultipleDurationValue } from "@calcom/features/bookings/lib/get-booking";
|
||||
import type { GetBookingType } from "@calcom/features/bookings/lib/get-booking";
|
||||
import { getSlugOrRequestedSlug } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
import { orgDomainConfig } from "@calcom/features/ee/organizations/lib/orgDomains";
|
||||
@@ -18,7 +18,16 @@ import PageWrapper from "@components/PageWrapper";
|
||||
|
||||
export type PageProps = inferSSRProps<typeof getServerSideProps> & EmbedProps;
|
||||
|
||||
export default function Type({ slug, user, booking, away, isEmbed, isBrandingHidden, entity }: PageProps) {
|
||||
export default function Type({
|
||||
slug,
|
||||
user,
|
||||
booking,
|
||||
away,
|
||||
isEmbed,
|
||||
isBrandingHidden,
|
||||
entity,
|
||||
duration,
|
||||
}: PageProps) {
|
||||
return (
|
||||
<main className={getBookerWrapperClasses({ isEmbed: !!isEmbed })}>
|
||||
<BookerSeo
|
||||
@@ -37,6 +46,7 @@ export default function Type({ slug, user, booking, away, isEmbed, isBrandingHid
|
||||
hideBranding={isBrandingHidden}
|
||||
isTeamEvent
|
||||
entity={entity}
|
||||
duration={duration}
|
||||
/>
|
||||
</main>
|
||||
);
|
||||
@@ -55,7 +65,7 @@ const paramsSchema = z.object({
|
||||
// 2. If rescheduling, get the booking details
|
||||
export const getServerSideProps = async (context: GetServerSidePropsContext) => {
|
||||
const { slug: teamSlug, type: meetingSlug } = paramsSchema.parse(context.params);
|
||||
const { rescheduleUid } = context.query;
|
||||
const { rescheduleUid, duration: queryDuration } = context.query;
|
||||
const { ssrInit } = await import("@server/lib/ssr");
|
||||
const ssr = await ssrInit(context);
|
||||
const { currentOrgDomain, isValidOrgDomain } = orgDomainConfig(
|
||||
@@ -104,6 +114,11 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
|
||||
return {
|
||||
props: {
|
||||
entity: eventData.entity,
|
||||
duration: getMultipleDurationValue(
|
||||
eventData.metadata?.multipleDuration,
|
||||
queryDuration,
|
||||
eventData.length
|
||||
),
|
||||
booking,
|
||||
away: false,
|
||||
user: teamSlug,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { expect } from "@playwright/test";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
import { installAppleCalendar } from "./lib/testUtils";
|
||||
|
||||
test.describe.configure({ mode: "parallel" });
|
||||
|
||||
@@ -10,10 +11,9 @@ test.describe("App Store - Authed", () => {
|
||||
test("Browse apple-calendar and try to install", async ({ page, users }) => {
|
||||
const pro = await users.create();
|
||||
await pro.apiLogin();
|
||||
await page.goto("/apps/categories/calendar");
|
||||
await page.click('[data-testid="app-store-app-card-apple-calendar"]');
|
||||
await page.waitForURL("/apps/apple-calendar");
|
||||
await page.click('[data-testid="install-app-button"]');
|
||||
|
||||
await installAppleCalendar(page);
|
||||
|
||||
await expect(page.locator(`text=Connect to Apple Server`)).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -31,9 +31,8 @@ test.describe("App Store - Authed", () => {
|
||||
|
||||
test.describe("App Store - Unauthed", () => {
|
||||
test("Browse apple-calendar and try to install", async ({ page }) => {
|
||||
await page.goto("/apps/categories/calendar");
|
||||
await page.click('[data-testid="app-store-app-card-apple-calendar"]');
|
||||
await page.click('[data-testid="install-app-button"]');
|
||||
await installAppleCalendar(page);
|
||||
|
||||
await expect(page.locator(`[data-testid="login-form"]`)).toBeVisible();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
||||
import { expect } from "@playwright/test";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
import { installAppleCalendar } from "./lib/testUtils";
|
||||
|
||||
test.describe.configure({ mode: "parallel" });
|
||||
|
||||
test.afterEach(({ users }) => users.deleteAll());
|
||||
|
||||
const APPLE_CALENDAR_EMAIL = process.env.E2E_TEST_APPLE_CALENDAR_EMAIL!;
|
||||
const APPLE_CALENDAR_PASSWORD = process.env.E2E_TEST_APPLE_CALENDAR_PASSWORD!;
|
||||
|
||||
const SHOULD_SKIP_TESTS = !APPLE_CALENDAR_EMAIL || !APPLE_CALENDAR_PASSWORD;
|
||||
|
||||
test.describe("Apple Calendar", () => {
|
||||
// eslint-disable-next-line playwright/no-skipped-test
|
||||
test.skip(SHOULD_SKIP_TESTS, "Skipping due to missing the testing credentials");
|
||||
|
||||
test("Should be able to install and login on Apple Calendar", async ({ page, users }) => {
|
||||
const user = await users.create();
|
||||
await user.apiLogin();
|
||||
|
||||
await installAppleCalendar(page);
|
||||
|
||||
await expect(page.locator('[data-testid="apple-calendar-form"]')).toBeVisible();
|
||||
|
||||
await page.fill('[data-testid="apple-calendar-email"]', APPLE_CALENDAR_EMAIL);
|
||||
await page.fill('[data-testid="apple-calendar-password"]', APPLE_CALENDAR_PASSWORD);
|
||||
await page.click('[data-testid="apple-calendar-login-button"]');
|
||||
|
||||
await expect(page.getByText("Apple Calendar")).toBeVisible();
|
||||
await expect(page.getByText(APPLE_CALENDAR_EMAIL)).toBeVisible();
|
||||
});
|
||||
});
|
||||
@@ -1,39 +1,53 @@
|
||||
import { expect } from "@playwright/test";
|
||||
|
||||
import { randomString } from "@calcom/lib/random";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
import {
|
||||
bookFirstEvent,
|
||||
bookOptinEvent,
|
||||
bookTimeSlot,
|
||||
expectEmailsToHaveSubject,
|
||||
selectFirstAvailableTimeSlotNextMonth,
|
||||
testEmail,
|
||||
testName,
|
||||
} from "./lib/testUtils";
|
||||
|
||||
const freeUserObj = { name: `Free-user-${randomString(3)}` };
|
||||
test.describe.configure({ mode: "parallel" });
|
||||
test.afterEach(async ({ users }) => users.deleteAll());
|
||||
test.afterEach(async ({ users }) => {
|
||||
await users.deleteAll();
|
||||
});
|
||||
|
||||
test.describe("free user", () => {
|
||||
test.beforeEach(async ({ page, users }) => {
|
||||
const free = await users.create();
|
||||
const free = await users.create(freeUserObj);
|
||||
await page.goto(`/${free.username}`);
|
||||
});
|
||||
|
||||
test("cannot book same slot multiple times", async ({ page }) => {
|
||||
test("cannot book same slot multiple times", async ({ page, users, emails }) => {
|
||||
const [user] = users.get();
|
||||
const bookerObj = { email: `testEmail-${randomString(4)}@example.com`, name: "testBooker" };
|
||||
// Click first event type
|
||||
await page.click('[data-testid="event-type-link"]');
|
||||
|
||||
await selectFirstAvailableTimeSlotNextMonth(page);
|
||||
|
||||
await bookTimeSlot(page);
|
||||
await bookTimeSlot(page, bookerObj);
|
||||
|
||||
// save booking url
|
||||
const bookingUrl: string = page.url();
|
||||
|
||||
// Make sure we're navigated to the success page
|
||||
await expect(page.locator("[data-testid=success-page]")).toBeVisible();
|
||||
const { title: eventTitle } = await user.getFirstEventAsOwner();
|
||||
|
||||
// return to same time spot booking page
|
||||
await expectEmailsToHaveSubject({
|
||||
emails,
|
||||
organizer: user,
|
||||
booker: bookerObj,
|
||||
eventTitle,
|
||||
});
|
||||
await page.goto(bookingUrl);
|
||||
|
||||
// book same time spot again
|
||||
|
||||
@@ -9,10 +9,7 @@ import {
|
||||
|
||||
test.afterEach(({ users }) => users.deleteAll());
|
||||
|
||||
// Due to some reason for Dynamic booking cancellation, daily video api_key is not set which causes cancellation to fail.
|
||||
// This test is skipped until the issue is resolved in GH actions.
|
||||
// eslint-disable-next-line playwright/no-skipped-test
|
||||
test.skip("dynamic booking", async ({ page, users }) => {
|
||||
test("dynamic booking", async ({ page, users }) => {
|
||||
const pro = await users.create();
|
||||
await pro.apiLogin();
|
||||
|
||||
@@ -20,10 +17,13 @@ test.skip("dynamic booking", async ({ page, users }) => {
|
||||
await page.goto(`/${pro.username}+${free.username}`);
|
||||
|
||||
await test.step("book an event first day in next month", async () => {
|
||||
// Click first event type
|
||||
await page.click('[data-testid="event-type-link"]');
|
||||
await selectFirstAvailableTimeSlotNextMonth(page);
|
||||
|
||||
// Fill what is this meeting about? title
|
||||
await page.locator('[name="title"]').fill("Test meeting");
|
||||
|
||||
await bookTimeSlot(page);
|
||||
|
||||
await expect(page.locator("[data-testid=success-page]")).toBeVisible();
|
||||
});
|
||||
|
||||
@@ -37,7 +37,8 @@ test.skip("dynamic booking", async ({ page, users }) => {
|
||||
return !!bookingId;
|
||||
});
|
||||
await selectSecondAvailableTimeSlotNextMonth(page);
|
||||
// --- fill form
|
||||
|
||||
// No need to fill fields since they should be already filled
|
||||
await page.locator('[data-testid="confirm-reschedule-button"]').click();
|
||||
await page.waitForURL((url) => {
|
||||
return url.pathname.startsWith("/booking");
|
||||
|
||||
@@ -2,8 +2,10 @@ import type { Page, WorkerInfo } from "@playwright/test";
|
||||
import type Prisma from "@prisma/client";
|
||||
import { Prisma as PrismaType } from "@prisma/client";
|
||||
import { hashSync as hash } from "bcryptjs";
|
||||
import type { API } from "mailhog";
|
||||
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import stripe from "@calcom/features/ee/payments/server/stripe";
|
||||
import { DEFAULT_SCHEDULE, getAvailabilityFromSchedule } from "@calcom/lib/availability";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
import { MembershipRole, SchedulingType } from "@calcom/prisma/enums";
|
||||
@@ -116,7 +118,7 @@ const createTeamAndAddUser = async (
|
||||
};
|
||||
|
||||
// creates a user fixture instance and stores the collection
|
||||
export const createUsersFixture = (page: Page, workerInfo: WorkerInfo) => {
|
||||
export const createUsersFixture = (page: Page, emails: API | undefined, workerInfo: WorkerInfo) => {
|
||||
const store = { users: [], page } as { users: UserFixture[]; page: typeof page };
|
||||
return {
|
||||
create: async (
|
||||
@@ -331,6 +333,21 @@ export const createUsersFixture = (page: Page, workerInfo: WorkerInfo) => {
|
||||
},
|
||||
deleteAll: async () => {
|
||||
const ids = store.users.map((u) => u.id);
|
||||
if (emails) {
|
||||
const emailMessageIds: string[] = [];
|
||||
for (const user of store.users) {
|
||||
const emailMessages = await emails.search(user.email);
|
||||
if (emailMessages && emailMessages.count > 0) {
|
||||
emailMessages.items.forEach((item) => {
|
||||
emailMessageIds.push(item.ID);
|
||||
});
|
||||
}
|
||||
}
|
||||
for (const id of emailMessageIds) {
|
||||
await emails.deleteMessage(id);
|
||||
}
|
||||
}
|
||||
|
||||
await prisma.user.deleteMany({ where: { id: { in: ids } } });
|
||||
store.users = [];
|
||||
},
|
||||
@@ -387,6 +404,12 @@ const createUserFixture = (user: UserWithIncludes, page: Page) => {
|
||||
include: { team: { select: { children: true, metadata: true, name: true } } },
|
||||
});
|
||||
},
|
||||
getFirstEventAsOwner: async () =>
|
||||
prisma.eventType.findFirstOrThrow({
|
||||
where: {
|
||||
userId: user.id,
|
||||
},
|
||||
}),
|
||||
getFirstTeamEvent: async (teamId: number) => {
|
||||
return prisma.eventType.findFirstOrThrow({
|
||||
where: {
|
||||
@@ -397,8 +420,8 @@ const createUserFixture = (user: UserWithIncludes, page: Page) => {
|
||||
getPaymentCredential: async () => getPaymentCredential(store.page),
|
||||
setupEventWithPrice: async (eventType: Pick<Prisma.EventType, "id">) =>
|
||||
setupEventWithPrice(eventType, store.page),
|
||||
bookAndPaidEvent: async (eventType: Pick<Prisma.EventType, "slug">) =>
|
||||
bookAndPaidEvent(user, eventType, store.page),
|
||||
bookAndPayEvent: async (eventType: Pick<Prisma.EventType, "slug">) =>
|
||||
bookAndPayEvent(user, eventType, store.page),
|
||||
makePaymentUsingStripe: async () => makePaymentUsingStripe(store.page),
|
||||
// ths is for developemnt only aimed to inject debugging messages in the metadata field of the user
|
||||
debug: async (message: string | Record<string, JSONValue>) => {
|
||||
@@ -408,6 +431,7 @@ const createUserFixture = (user: UserWithIncludes, page: Page) => {
|
||||
});
|
||||
},
|
||||
delete: async () => await prisma.user.delete({ where: { id: store.user.id } }),
|
||||
confirmPendingPayment: async () => confirmPendingPayment(store.page),
|
||||
};
|
||||
};
|
||||
|
||||
@@ -418,12 +442,18 @@ type CustomUserOptsKeys = "username" | "password" | "completedOnboarding" | "loc
|
||||
type CustomUserOpts = Partial<Pick<Prisma.User, CustomUserOptsKeys>> & {
|
||||
timeZone?: TimeZoneEnum;
|
||||
eventTypes?: SupportedTestEventTypes[];
|
||||
// ignores adding the worker-index after username
|
||||
useExactUsername?: boolean;
|
||||
};
|
||||
|
||||
// creates the actual user in the db.
|
||||
const createUser = (workerInfo: WorkerInfo, opts?: CustomUserOpts | null): PrismaType.UserCreateInput => {
|
||||
// build a unique name for our user
|
||||
const uname = `${opts?.username || "user"}-${workerInfo.workerIndex}-${Date.now()}`;
|
||||
const uname =
|
||||
opts?.useExactUsername && opts?.username
|
||||
? opts.username
|
||||
: `${opts?.username || "user"}-${workerInfo.workerIndex}-${Date.now()}`;
|
||||
|
||||
return {
|
||||
username: uname,
|
||||
name: opts?.name,
|
||||
@@ -449,6 +479,36 @@ const createUser = (workerInfo: WorkerInfo, opts?: CustomUserOpts | null): Prism
|
||||
};
|
||||
};
|
||||
|
||||
async function confirmPendingPayment(page: Page) {
|
||||
await page.waitForURL(new RegExp("/booking/*"));
|
||||
|
||||
const url = page.url();
|
||||
|
||||
const params = new URLSearchParams(url.split("?")[1]);
|
||||
|
||||
const id = params.get("payment_intent");
|
||||
|
||||
if (!id) throw new Error(`Payment intent not found in url ${url}`);
|
||||
|
||||
const payload = JSON.stringify(
|
||||
{ type: "payment_intent.succeeded", data: { object: { id } }, account: "e2e_test" },
|
||||
null,
|
||||
2
|
||||
);
|
||||
|
||||
const signature = stripe.webhooks.generateTestHeaderString({
|
||||
payload,
|
||||
secret: process.env.STRIPE_WEBHOOK_SECRET as string,
|
||||
});
|
||||
|
||||
const response = await page.request.post("/api/integrations/stripepayment/webhook", {
|
||||
data: payload,
|
||||
headers: { "stripe-signature": signature },
|
||||
});
|
||||
|
||||
if (response.status() !== 200) throw new Error(`Failed to confirm payment. Response: ${response.text()}`);
|
||||
}
|
||||
|
||||
// login using a replay of an E2E routine.
|
||||
export async function login(
|
||||
user: Pick<Prisma.User, "username"> & Partial<Pick<Prisma.User, "password" | "email">>,
|
||||
@@ -500,7 +560,7 @@ export async function setupEventWithPrice(eventType: Pick<Prisma.EventType, "id"
|
||||
await page.getByTestId("update-eventtype").click();
|
||||
}
|
||||
|
||||
export async function bookAndPaidEvent(
|
||||
export async function bookAndPayEvent(
|
||||
user: Pick<Prisma.User, "username">,
|
||||
eventType: Pick<Prisma.EventType, "slug">,
|
||||
page: Page
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { expect } from "@playwright/test";
|
||||
import type Prisma from "@prisma/client";
|
||||
|
||||
import type { Fixtures } from "./lib/fixtures";
|
||||
import { test } from "./lib/fixtures";
|
||||
import { todo, selectFirstAvailableTimeSlotNextMonth } from "./lib/testUtils";
|
||||
|
||||
@@ -41,7 +42,7 @@ test.describe("Stripe integration", () => {
|
||||
|
||||
await user.getPaymentCredential();
|
||||
await user.setupEventWithPrice(eventType);
|
||||
await user.bookAndPaidEvent(eventType);
|
||||
await user.bookAndPayEvent(eventType);
|
||||
// success
|
||||
await expect(page.locator("[data-testid=success-page]")).toBeVisible();
|
||||
});
|
||||
@@ -78,7 +79,7 @@ test.describe("Stripe integration", () => {
|
||||
|
||||
await user.getPaymentCredential();
|
||||
await user.setupEventWithPrice(eventType);
|
||||
await user.bookAndPaidEvent(eventType);
|
||||
await user.bookAndPayEvent(eventType);
|
||||
|
||||
// Rescheduling the event
|
||||
await Promise.all([page.waitForURL("/booking/*"), page.click('[data-testid="reschedule-link"]')]);
|
||||
@@ -92,8 +93,57 @@ test.describe("Stripe integration", () => {
|
||||
|
||||
await user.makePaymentUsingStripe();
|
||||
});
|
||||
todo("Payment should confirm pending payment booking");
|
||||
todo("Payment should trigger a BOOKING_PAID webhook");
|
||||
todo("Paid booking should be able to be cancelled");
|
||||
todo("Cancelled paid booking should be refunded");
|
||||
|
||||
test("Paid booking should be able to be cancelled", async ({ page, users }) => {
|
||||
const user = await users.create();
|
||||
const eventType = user.eventTypes.find((e) => e.slug === "paid") as Prisma.EventType;
|
||||
await user.apiLogin();
|
||||
await page.goto("/apps/installed");
|
||||
|
||||
await user.getPaymentCredential();
|
||||
await user.setupEventWithPrice(eventType);
|
||||
await user.bookAndPayEvent(eventType);
|
||||
|
||||
await page.click('[data-testid="cancel"]');
|
||||
await page.click('[data-testid="confirm_cancel"]');
|
||||
|
||||
await expect(await page.locator('[data-testid="cancelled-headline"]').first()).toBeVisible();
|
||||
});
|
||||
|
||||
test.describe("When event is paid and confirmed", () => {
|
||||
let user: Awaited<ReturnType<Fixtures["users"]["create"]>>;
|
||||
let eventType: Prisma.EventType;
|
||||
|
||||
test.beforeEach(async ({ page, users }) => {
|
||||
user = await users.create();
|
||||
eventType = user.eventTypes.find((e) => e.slug === "paid") as Prisma.EventType;
|
||||
await user.apiLogin();
|
||||
await page.goto("/apps/installed");
|
||||
|
||||
await user.getPaymentCredential();
|
||||
await user.setupEventWithPrice(eventType);
|
||||
await user.bookAndPayEvent(eventType);
|
||||
await user.confirmPendingPayment();
|
||||
});
|
||||
|
||||
test("Cancelled paid booking should be refunded", async ({ page, users, request }) => {
|
||||
await page.click('[data-testid="cancel"]');
|
||||
await page.click('[data-testid="confirm_cancel"]');
|
||||
|
||||
await expect(await page.locator('[data-testid="cancelled-headline"]').first()).toBeVisible();
|
||||
await expect(page.getByText("This booking payment has been refunded")).toBeVisible();
|
||||
});
|
||||
|
||||
test("Payment should confirm pending payment booking", async ({ page, users }) => {
|
||||
await page.goto("/bookings/upcoming");
|
||||
|
||||
const paidBadge = page.locator('[data-testid="paid_badge"]').first();
|
||||
|
||||
await expect(paidBadge).toBeVisible();
|
||||
expect(await paidBadge.innerText()).toBe("Paid");
|
||||
});
|
||||
|
||||
todo("Payment should trigger a BOOKING_PAID webhook");
|
||||
todo("Paid and confirmed booking should be able to be rescheduled");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import type { Page } from "@playwright/test";
|
||||
import { test as base } from "@playwright/test";
|
||||
import type { API } from "mailhog";
|
||||
import mailhog from "mailhog";
|
||||
|
||||
import { IS_MAILHOG_ENABLED } from "@calcom/lib/constants";
|
||||
import prisma from "@calcom/prisma";
|
||||
|
||||
import type { ExpectedUrlDetails } from "../../../../playwright.config";
|
||||
@@ -19,6 +22,7 @@ export interface Fixtures {
|
||||
getActionFiredDetails: ReturnType<typeof createGetActionFiredDetails>;
|
||||
servers: ReturnType<typeof createServersFixture>;
|
||||
prisma: typeof prisma;
|
||||
emails?: API;
|
||||
}
|
||||
|
||||
declare global {
|
||||
@@ -40,8 +44,8 @@ declare global {
|
||||
* @see https://playwright.dev/docs/test-fixtures
|
||||
*/
|
||||
export const test = base.extend<Fixtures>({
|
||||
users: async ({ page, context }, use, workerInfo) => {
|
||||
const usersFixture = createUsersFixture(page, workerInfo);
|
||||
users: async ({ page, context, emails }, use, workerInfo) => {
|
||||
const usersFixture = createUsersFixture(page, emails, workerInfo);
|
||||
await use(usersFixture);
|
||||
},
|
||||
bookings: async ({ page }, use) => {
|
||||
@@ -67,4 +71,12 @@ export const test = base.extend<Fixtures>({
|
||||
prisma: async ({}, use) => {
|
||||
await use(prisma);
|
||||
},
|
||||
emails: async ({}, use) => {
|
||||
if (IS_MAILHOG_ENABLED) {
|
||||
const mailhogAPI = mailhog();
|
||||
await use(mailhogAPI);
|
||||
} else {
|
||||
await use(undefined);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
@@ -2,7 +2,9 @@ import type { Page } from "@playwright/test";
|
||||
import { expect } from "@playwright/test";
|
||||
import type { IncomingMessage, ServerResponse } from "http";
|
||||
import { createServer } from "http";
|
||||
// eslint-disable-next-line no-restricted-imports
|
||||
import { noop } from "lodash";
|
||||
import type { API, Messages } from "mailhog";
|
||||
|
||||
import { test } from "./fixtures";
|
||||
|
||||
@@ -183,3 +185,46 @@ export async function gotoRoutingLink({
|
||||
// HACK: There seems to be some issue with the inputs to the form getting reset if we don't wait.
|
||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||
}
|
||||
|
||||
export async function installAppleCalendar(page: Page) {
|
||||
await page.goto("/apps/categories/calendar");
|
||||
await page.click('[data-testid="app-store-app-card-apple-calendar"]');
|
||||
await page.waitForURL("/apps/apple-calendar");
|
||||
await page.click('[data-testid="install-app-button"]');
|
||||
}
|
||||
export async function getEmailsReceivedByUser({
|
||||
emails,
|
||||
userEmail,
|
||||
}: {
|
||||
emails?: API;
|
||||
userEmail: string;
|
||||
}): Promise<Messages | null> {
|
||||
if (!emails) return null;
|
||||
return emails.search(userEmail, "to");
|
||||
}
|
||||
|
||||
export async function expectEmailsToHaveSubject({
|
||||
emails,
|
||||
organizer,
|
||||
booker,
|
||||
eventTitle,
|
||||
}: {
|
||||
emails?: API;
|
||||
organizer: { name?: string | null; email: string };
|
||||
booker: { name: string; email: string };
|
||||
eventTitle: string;
|
||||
}) {
|
||||
if (!emails) return null;
|
||||
const emailsOrganizerReceived = await getEmailsReceivedByUser({ emails, userEmail: organizer.email });
|
||||
const emailsBookerReceived = await getEmailsReceivedByUser({ emails, userEmail: booker.email });
|
||||
|
||||
expect(emailsOrganizerReceived?.total).toBe(1);
|
||||
expect(emailsBookerReceived?.total).toBe(1);
|
||||
|
||||
const [organizerFirstEmail] = (emailsOrganizerReceived as Messages).items;
|
||||
const [bookerFirstEmail] = (emailsBookerReceived as Messages).items;
|
||||
const emailSubject = `${eventTitle} between ${organizer.name ?? "Nameless"} and ${booker.name}`;
|
||||
|
||||
expect(organizerFirstEmail.subject).toBe(emailSubject);
|
||||
expect(bookerFirstEmail.subject).toBe(emailSubject);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import { expect } from "@playwright/test";
|
||||
import { authenticator } from "otplib";
|
||||
|
||||
import { symmetricDecrypt } from "@calcom/lib/crypto";
|
||||
import { totpAuthenticatorCheck } from "@calcom/lib/totp";
|
||||
|
||||
import { test } from "./lib/fixtures";
|
||||
|
||||
@@ -141,7 +142,7 @@ test.describe("2FA Tests", async () => {
|
||||
|
||||
async function fillOtp({ page, secret, noRetry }: { page: Page; secret: string; noRetry?: boolean }) {
|
||||
let token = authenticator.generate(secret);
|
||||
if (!noRetry && !authenticator.check(token, secret)) {
|
||||
if (!noRetry && !totpAuthenticatorCheck(token, secret)) {
|
||||
console.log("Token expired, Renerating.");
|
||||
// Maybe token was just about to expire, try again just once more
|
||||
token = authenticator.generate(secret);
|
||||
|
||||
@@ -202,7 +202,7 @@ async function runTestStepsCommonForTeamAndUserEventType(
|
||||
await addQuestionAndSave({
|
||||
page,
|
||||
question: {
|
||||
name: "how_are_you",
|
||||
name: "how-are-you",
|
||||
type: "Address",
|
||||
label: "How are you?",
|
||||
placeholder: "I'm fine, thanks",
|
||||
@@ -214,7 +214,7 @@ async function runTestStepsCommonForTeamAndUserEventType(
|
||||
const allFieldsLocator = await expectSystemFieldsToBeThereOnBookingPage({ page });
|
||||
const userFieldLocator = allFieldsLocator.nth(5);
|
||||
|
||||
await expect(userFieldLocator.locator('[name="how_are_you"]')).toBeVisible();
|
||||
await expect(userFieldLocator.locator('[name="how-are-you"]')).toBeVisible();
|
||||
// There are 2 labels right now. Will be one in future. The second one is hidden
|
||||
expect(await getLabelText(userFieldLocator)).toBe("How are you?");
|
||||
await expect(userFieldLocator.locator("input")).toBeVisible();
|
||||
@@ -223,18 +223,18 @@ async function runTestStepsCommonForTeamAndUserEventType(
|
||||
|
||||
await test.step("Hide Question and see that it's not shown on Booking Page", async () => {
|
||||
await toggleQuestionAndSave({
|
||||
name: "how_are_you",
|
||||
name: "how-are-you",
|
||||
page,
|
||||
});
|
||||
await doOnFreshPreview(page, context, async (page) => {
|
||||
const formBuilderFieldLocator = page.locator('[data-fob-field-name="how_are_you"]');
|
||||
const formBuilderFieldLocator = page.locator('[data-fob-field-name="how-are-you"]');
|
||||
await expect(formBuilderFieldLocator).toBeHidden();
|
||||
});
|
||||
});
|
||||
|
||||
await test.step("Show Question Again", async () => {
|
||||
await toggleQuestionAndSave({
|
||||
name: "how_are_you",
|
||||
name: "how-are-you",
|
||||
page,
|
||||
});
|
||||
});
|
||||
@@ -242,7 +242,7 @@ async function runTestStepsCommonForTeamAndUserEventType(
|
||||
await test.step('Try to book without providing "How are you?" response', async () => {
|
||||
await doOnFreshPreview(page, context, async (page) => {
|
||||
await bookTimeSlot({ page, name: "Booker", email: "booker@example.com" });
|
||||
await expectErrorToBeThereFor({ page, name: "how_are_you" });
|
||||
await expectErrorToBeThereFor({ page, name: "how-are-you" });
|
||||
});
|
||||
});
|
||||
|
||||
@@ -260,18 +260,18 @@ async function runTestStepsCommonForTeamAndUserEventType(
|
||||
page,
|
||||
context,
|
||||
async (page) => {
|
||||
const formBuilderFieldLocator = page.locator('[data-fob-field-name="how_are_you"]');
|
||||
const formBuilderFieldLocator = page.locator('[data-fob-field-name="how-are-you"]');
|
||||
await expect(formBuilderFieldLocator).toBeVisible();
|
||||
expect(
|
||||
await formBuilderFieldLocator.locator('[name="how_are_you"]').getAttribute("placeholder")
|
||||
await formBuilderFieldLocator.locator('[name="how-are-you"]').getAttribute("placeholder")
|
||||
).toBe("I'm fine, thanks");
|
||||
expect(await getLabelText(formBuilderFieldLocator)).toBe("How are you?");
|
||||
await formBuilderFieldLocator.locator('[name="how_are_you"]').fill("I am great!");
|
||||
await formBuilderFieldLocator.locator('[name="how-are-you"]').fill("I am great!");
|
||||
await bookTimeSlot({ page, name: "Booker", email: "booker@example.com" });
|
||||
await expect(page.locator("[data-testid=success-page]")).toBeVisible();
|
||||
|
||||
expect(
|
||||
await page.locator('[data-testid="field-response"][data-fob-field="how_are_you"]').innerText()
|
||||
await page.locator('[data-testid="field-response"][data-fob-field="how-are-you"]').innerText()
|
||||
).toBe("I am great!");
|
||||
|
||||
await waitFor(() => {
|
||||
@@ -287,7 +287,7 @@ async function runTestStepsCommonForTeamAndUserEventType(
|
||||
label: "email_address",
|
||||
value: "booker@example.com",
|
||||
},
|
||||
how_are_you: {
|
||||
"how-are-you": {
|
||||
label: "How are you?",
|
||||
value: "I am great!",
|
||||
},
|
||||
@@ -303,7 +303,7 @@ async function runTestStepsCommonForTeamAndUserEventType(
|
||||
});
|
||||
|
||||
expect(payload.userFieldsResponses).toMatchObject({
|
||||
how_are_you: {
|
||||
"how-are-you": {
|
||||
label: "How are you?",
|
||||
value: "I am great!",
|
||||
},
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { expect } from "@playwright/test";
|
||||
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import prisma from "@calcom/prisma";
|
||||
import { BookingStatus } from "@calcom/prisma/enums";
|
||||
|
||||
@@ -239,4 +240,33 @@ test.describe("Reschedule Tests", async () => {
|
||||
expect(newBooking).not.toBeNull();
|
||||
expect(newBooking?.status).toBe(BookingStatus.ACCEPTED);
|
||||
});
|
||||
|
||||
test("Should be able to book slot that overlaps with original rescheduled booking", async ({
|
||||
page,
|
||||
users,
|
||||
bookings,
|
||||
}) => {
|
||||
const user = await users.create();
|
||||
const eventType = user.eventTypes[0];
|
||||
|
||||
let firstOfNextMonth = dayjs().add(1, "month").startOf("month");
|
||||
|
||||
// find first available slot of next month (available monday-friday)
|
||||
while (firstOfNextMonth.day() < 1 || firstOfNextMonth.day() > 5) {
|
||||
firstOfNextMonth = firstOfNextMonth.add(1, "day");
|
||||
}
|
||||
|
||||
// set startTime to first available slot
|
||||
const startTime = firstOfNextMonth.set("hour", 9).set("minute", 0).toDate();
|
||||
const endTime = firstOfNextMonth.set("hour", 9).set("minute", 30).toDate();
|
||||
|
||||
const booking = await bookings.create(user.id, user.username, eventType.id, {}, startTime, endTime);
|
||||
|
||||
await page.goto(`/reschedule/${booking.uid}`);
|
||||
|
||||
await selectFirstAvailableTimeSlotNextMonth(page);
|
||||
|
||||
await page.locator('[data-testid="confirm-reschedule-button"]').click();
|
||||
await expect(page).toHaveURL(/.*booking/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -135,6 +135,48 @@ test.describe("Teams", () => {
|
||||
expect(teamMatesObj.some(({ name }) => name === chosenUser)).toBe(true);
|
||||
// TODO: Assert whether the user received an email
|
||||
});
|
||||
test("Can create team with same name as user", async ({ page, users }) => {
|
||||
// Name to be used for both user and team
|
||||
const uniqueName = "test-unique-name";
|
||||
const ownerObj = { username: uniqueName, name: uniqueName, useExactUsername: true };
|
||||
|
||||
const user = await users.create(ownerObj);
|
||||
await user.apiLogin();
|
||||
await page.goto("/teams");
|
||||
|
||||
await test.step("Can create team with same name", async () => {
|
||||
// Click text=Create Team
|
||||
await page.locator("text=Create Team").click();
|
||||
await page.waitForURL("/settings/teams/new");
|
||||
// Fill input[name="name"]
|
||||
await page.locator('input[name="name"]').fill(uniqueName);
|
||||
// Click text=Continue
|
||||
await page.locator("text=Continue").click();
|
||||
await page.waitForURL(/\/settings\/teams\/(\d+)\/onboard-members$/i);
|
||||
// Click text=Continue
|
||||
await page.locator("text=Publish team").click();
|
||||
await page.waitForURL(/\/settings\/teams\/(\d+)\/profile$/i);
|
||||
});
|
||||
|
||||
await test.step("Can access user and team with same slug", async () => {
|
||||
// Go to team page and confirm name
|
||||
const teamUrl = `/team/${uniqueName}`;
|
||||
await page.goto(teamUrl);
|
||||
await page.waitForURL(teamUrl);
|
||||
await expect(page.locator("[data-testid=team-name]")).toHaveText(uniqueName);
|
||||
|
||||
// Go to user page and confirm name
|
||||
const userUrl = `/${uniqueName}`;
|
||||
await page.goto(userUrl);
|
||||
await page.waitForURL(userUrl);
|
||||
await expect(page.locator("[data-testid=name-title]")).toHaveText(uniqueName);
|
||||
|
||||
// cleanup team
|
||||
const team = await prisma.team.findFirst({ where: { slug: uniqueName } });
|
||||
await prisma.team.delete({ where: { id: team?.id } });
|
||||
});
|
||||
});
|
||||
|
||||
todo("Create a Round Robin with different leastRecentlyBooked hosts");
|
||||
todo("Reschedule a Collective EventType booking");
|
||||
todo("Reschedule a Round Robin EventType booking");
|
||||
|
||||
@@ -184,6 +184,7 @@ test.describe("BOOKING_REJECTED", async () => {
|
||||
expect(webhookReceiver.requestList.length).toBe(1);
|
||||
});
|
||||
const [request] = webhookReceiver.requestList;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const body = request.body as any;
|
||||
|
||||
// remove dynamic properties that differs depending on where you run the tests
|
||||
|
||||
@@ -13,15 +13,15 @@
|
||||
"reset_password_subject": "{{appName}}: إرشادات إعادة تعيين كلمة المرور",
|
||||
"verify_email_subject": "{{appName}}: تأكيد حسابك",
|
||||
"check_your_email": "تحقق من بريدك الإلكتروني",
|
||||
"verify_email_page_body": "أرسلنا رسالة إلكترونية إلى {{email}}. من المهم تأكيد عنوان بريدك الإلكتروني لضمان أفضل قابلية تسليم للبريد الإلكتروني والرزنامة من {{appName}}.",
|
||||
"verify_email_banner_body": "قم بتأكيد عنوان بريدك الإلكتروني لضمان أفضل تسليم للبريد الإلكتروني والرزنامة",
|
||||
"verify_email_page_body": "أرسلنا رسالة إلكترونية إلى {{email}}. من المهم تأكيد عنوان بريدك الإلكتروني لضمان أفضل تسليم للبريد الإلكتروني والتقويم من {{appName}}.",
|
||||
"verify_email_banner_body": "قم بتأكيد عنوان بريدك الإلكتروني لضمان أفضل تسليم للبريد الإلكتروني والتقويم",
|
||||
"verify_email_email_header": "تأكيد عنوان بريدك الإلكتروني",
|
||||
"verify_email_email_button": "تأكيد البريد الإلكتروني",
|
||||
"verify_email_email_body": "الرجاء تأكيد عنوان بريدك الإلكتروني بالنقر على الزر أدناه.",
|
||||
"verify_email_email_link_text": "إليك الرابط في حال لم تكن ترغب بالنقر على أي أزرار:",
|
||||
"verify_email_email_body": "الرجاء تأكيد عنوان بريدك الإلكتروني بالنقر فوق الزر أدناه.",
|
||||
"verify_email_email_link_text": "إليك الرابط في حال لم تكن ترغب بالنقر فوق أي أزرار:",
|
||||
"email_sent": "تم إرسال الرسالة الإلكترونية بنجاح",
|
||||
"event_declined_subject": "تم الرفض: {{title}} في {{date}}",
|
||||
"event_cancelled_subject": "تم إلغاء: {{title}} في {{date}}",
|
||||
"event_cancelled_subject": "تم الإلغاء: {{title}} في {{date}}",
|
||||
"event_request_declined": "تم رفض طلب الحدث الخاص بك",
|
||||
"event_request_declined_recurring": "تم رفض طلب الحدث المتكرر الخاص بك",
|
||||
"event_request_cancelled": "تم إلغاء حدثك المُجَدْوَل",
|
||||
@@ -89,7 +89,7 @@
|
||||
"event_has_been_rescheduled": "تم التحديث - تم إعادة جدولة الحدث الخاص بك",
|
||||
"request_reschedule_subtitle": "ألغى {{organizer}} الحجز وطلب منك اختيار حجز في وقت آخر.",
|
||||
"request_reschedule_title_organizer": "لقد طلبت من {{attendee}} إعادة جدولة موعد",
|
||||
"request_reschedule_subtitle_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}}",
|
||||
@@ -129,8 +129,8 @@
|
||||
"team_upgrade_banner_description": "شكراً لك على تجربة خطة الفريق الجديدة التي نقدمها. لقد لاحظنا أن فريقك \"{{teamName}}\" بحاجة إلى الترقية.",
|
||||
"upgrade_banner_action": "قم بالترقية هنا",
|
||||
"team_upgraded_successfully": "تمت ترقية فريقك بنجاح!",
|
||||
"org_upgrade_banner_description": "شكراً لك على تجربة الخطة الجديدة لمؤسستنا التي نقدمها. لقد لاحظنا أن مؤسستك \"{{teamName}}\" بحاجة إلى الترقية.",
|
||||
"org_upgraded_successfully": "تمت ترقية مؤسستك بنجاح!",
|
||||
"org_upgrade_banner_description": "شكرًا لك على تجربة خطة Organization الجديدة التي نقدمها. لقد لاحظنا أن منظمتك \"{{teamName}}\" بحاجة إلى الترقية.",
|
||||
"org_upgraded_successfully": "تمت ترقية منظمتك بنجاح!",
|
||||
"use_link_to_reset_password": "استخدم الرابط أدناه لإعادة تعيين كلمة المرور",
|
||||
"hey_there": "مرحبًا،",
|
||||
"forgot_your_password_calcom": "نسيت كلمة المرور الخاصة بك؟ - {{appName}}",
|
||||
@@ -248,7 +248,7 @@
|
||||
"organization_general_description": "إدارة الإعدادات للغة فريقك ومنطقته الزمنية",
|
||||
"few_sentences_about_yourself": "اكتب بضع جمل عن نفسك. سيظهر هذا على صفحة عنوان URL الشخصية لديك.",
|
||||
"nearly_there": "أوشكت على الانتهاء!",
|
||||
"nearly_there_instructions": "وفي نهاية المطاف: يساعدك كتابة وصف موجز عنك ووضع صورة في الحصول على عمليات حجز وأن يعرف الأشخاص مع من سيحجزون حقًا.",
|
||||
"nearly_there_instructions": "وأخيرًا، يساعدك الوصف الموجز عنك والصورة في الحصول على الحجوزات والسماح للأشخاص بمعرفة الشخص الذين يحجزون معه.",
|
||||
"set_availability_instructions": "حدد الفترات الزمنية التي تكون متاحًا فيها بشكل متكرر. يمكنك لاحقًا تحديد المزيد منها وربطها مع تقاويم مختلفة.",
|
||||
"set_availability": "تحديد الوقت الذي تكون فيه متاحًا",
|
||||
"continue_without_calendar": "المتابعة من دون تقويم",
|
||||
@@ -304,18 +304,18 @@
|
||||
"success": "تم بنجاح",
|
||||
"failed": "فشل",
|
||||
"password_has_been_reset_login": "تمت إعادة تعيين كلمة المرور الخاصة بك. يمكنك الآن تسجيل الدخول باستخدام كلمة المرور التي تم إنشاؤها حديثًا.",
|
||||
"layout": "تخطيط",
|
||||
"layout": "التخطيط",
|
||||
"bookerlayout_default_title": "العرض الافتراضي",
|
||||
"bookerlayout_description": "يمكنك اختيار خيارات متعددة، ويمكن لمن يقومون بالحجز لديك تبديل طرق العرض.",
|
||||
"bookerlayout_user_settings_title": "تخطيط الحجز",
|
||||
"bookerlayout_user_settings_description": "يمكنك تحديد خيارات متعددة ويمكن لمن يقومون بالحجز لديك تبديل طرق العرض. يمكن إبطال هذا بحسب وضع كل فعالية.",
|
||||
"bookerlayout_user_settings_description": "يمكنك تحديد خيارات متعددة ويمكن لمن يقومون بالحجز لديك تبديل طرق العرض. يمكن تجاوز هذا على أساس كل حدث.",
|
||||
"bookerlayout_month_view": "شهر",
|
||||
"bookerlayout_week_view": "أسبوعياً",
|
||||
"bookerlayout_week_view": "أسبوعيًا",
|
||||
"bookerlayout_column_view": "عمود",
|
||||
"bookerlayout_error_min_one_enabled": "يجب تمكين تخطيط واحد على الأقل.",
|
||||
"bookerlayout_error_default_not_enabled": "التخطيط الذي حددته كطريقة عرض افتراضية ليس جزءاً من التخطيطات التي تم تمكينها.",
|
||||
"bookerlayout_error_unknown_layout": "التخطيط الذي اخترته ليس تخطيطاً صالحاً.",
|
||||
"bookerlayout_override_global_settings": "يمكنك إدارة هذا لجميع أنواع فعالياتك في <2>إعدادات/المظهر</2> أو <6>إبطال لهذا الحدث فقط</6>.",
|
||||
"bookerlayout_error_default_not_enabled": "التخطيط الذي حددته كطريقة عرض افتراضية ليس جزءًا من التخطيطات التي تم تمكينها.",
|
||||
"bookerlayout_error_unknown_layout": "التخطيط الذي اخترته ليس تخطيطًا صالحًا.",
|
||||
"bookerlayout_override_global_settings": "يمكنك إدارة هذا لجميع أنواع الأحداث لديك في <2>الإعدادات/المظهر</2> أو <6>التجاوز لهذا الحدث فقط</6>.",
|
||||
"unexpected_error_try_again": "حدث خطأ غير متوقع. حاول مجددًا.",
|
||||
"sunday_time_error": "وقت غير صالح يوم الأحد",
|
||||
"monday_time_error": "وقت غير صالح يوم الاثنين",
|
||||
@@ -337,9 +337,9 @@
|
||||
"cancelling_event_recurring": "إن هذا الحدث أحد الأمثلة على حدث متكرر.",
|
||||
"cancelling_all_recurring": "هذه هي كل الأمثلة المتبقية في الحدث المتكرر.",
|
||||
"error_with_status_code_occured": "حدث خطأ برمز الحالة {{status}}.",
|
||||
"error_event_type_url_duplicate": "يوجد بالفعل نوع فعالية مع هذا الرابط.",
|
||||
"error_event_type_unauthorized_create": "أنت غير قادر على إنشاء هذه الفعالية",
|
||||
"error_event_type_unauthorized_update": "أنت غير قادر على تعديل هذه الفعالية",
|
||||
"error_event_type_url_duplicate": "يوجد بالفعل نوع حدث بهذا الرابط.",
|
||||
"error_event_type_unauthorized_create": "أنت غير قادر على إنشاء هذا الحدث",
|
||||
"error_event_type_unauthorized_update": "أنت غير قادر على تعديل هذا الحدث",
|
||||
"error_workflow_unauthorized_create": "أنت غير قادر على إنشاء سير العمل هذا",
|
||||
"error_schedule_unauthorized_create": "أنت غير قادر على إنشاء هذا الجدول الزمني",
|
||||
"booking_already_cancelled": "تم إلغاء هذا الحجز بالفعل",
|
||||
@@ -352,7 +352,7 @@
|
||||
"no_status_bookings_yet_description": "ليست لديك عمليات حجز في حالة {{status}}. {{description}}",
|
||||
"event_between_users": "{{eventName}} بين {{host}} و{{attendeeName}}",
|
||||
"bookings": "عمليات الحجز",
|
||||
"booking_not_found": "الحجز غير موجود",
|
||||
"booking_not_found": "لم يتم العثور على الحجز",
|
||||
"bookings_description": "اطلع على الأحداث القادمة والسابقة المحجوزة لديك من خلال روابط أنواع الحدث.",
|
||||
"upcoming_bookings": "بمجرد أن يحجز شخص ما موعدًا معك، سيظهر هنا.",
|
||||
"recurring_bookings": "بمجرد أن يحجز شخص ما اجتماعًا متكررًا معك، سيظهر هنا.",
|
||||
@@ -413,8 +413,8 @@
|
||||
"team_webhooks": "فريق ويبهوكس",
|
||||
"create_new_webhook_to_account": "إنشاء ويب هوك جديد لحسابك",
|
||||
"new_webhook": "ويب هوك جديد",
|
||||
"receive_cal_meeting_data": "تلقَّ بيانات اجتماعات {{appName}} على عنوان URL محدد، وفي الوقت الفعلي، عندما تتم جدولة حدث ما أو يتم إلغاؤه.",
|
||||
"receive_cal_event_meeting_data": "تلقي بيانات اجتماعات {{appName}} على عنوان URL محدد، وفي الوقت الحقيقي، عندما تتم جدولة حدث ما أو إلغاؤه.",
|
||||
"receive_cal_meeting_data": "احصل على بيانات اجتماع {{appName}} على رابط محدد، في الوقت الفعلي، عند جدولة حدث أو إلغائه.",
|
||||
"receive_cal_event_meeting_data": "احصل على بيانات اجتماع {{appName}} على رابط محدد، في الوقت الفعلي، عند جدولة حدث أو إلغائه.",
|
||||
"responsive_fullscreen_iframe": "إطار iframe سريع الاستجابة بكامل الشاشة",
|
||||
"loading": "يجري التحميل...",
|
||||
"deleting": "جارٍ الحذف...",
|
||||
@@ -554,7 +554,7 @@
|
||||
"member": "العضو",
|
||||
"number_member_one": "{{count}} عضو",
|
||||
"number_member_other": "{{count}} من الأعضاء",
|
||||
"number_selected": "{{count}} تم اختيارها",
|
||||
"number_selected": "تم تحديد {{count}}",
|
||||
"owner": "المالك",
|
||||
"admin": "المشرف",
|
||||
"administrator_user": "المستخدم المسؤول",
|
||||
@@ -872,16 +872,16 @@
|
||||
"no_category_apps_description_automation": "إضافة تطبيق أتمتة لاستخدامه",
|
||||
"no_category_apps_description_other": "أضف أي نوع آخر من التطبيقات للقيام بأي شيء",
|
||||
"no_category_apps_description_web3": "إضافة تطبيق web3 لصفحات الحجز لديك",
|
||||
"no_category_apps_description_messaging": "إضافة تطبيق مراسلة لإعداد التنبيهات والمذكرات المخصصة",
|
||||
"no_category_apps_description_messaging": "إضافة تطبيق مراسلة لإعداد الإشعارات والتذكيرات المخصصة",
|
||||
"no_category_apps_description_crm": "إضافة تطبيق CRM لتتبع من قابلته",
|
||||
"installed_app_calendar_description": "قم بتعيين التقويمات للتحقق من وجود تعارضات لمنع الحجوزات المزدوجة.",
|
||||
"installed_app_payment_description": "قم بإعداد أي خدمات معالجة دفع تود استخدامها عند التحصيل من العملاء.",
|
||||
"installed_app_analytics_description": "تهيئة أي تطبيقات تستخدم لصفحات الحجز الخاصة بك",
|
||||
"installed_app_other_description": "جميع تطبيقاتك المثبتة من الفئات الأخرى.",
|
||||
"installed_app_conferencing_description": "تهيئة أي تطبيقات المؤتمرات لاستخدامها",
|
||||
"installed_app_conferencing_description": "تكوين تطبيقات المؤتمرات المراد استخدامها",
|
||||
"installed_app_automation_description": "تهيئة تطبيقات الأتمتة التي سيتم استخدامها",
|
||||
"installed_app_web3_description": "تهيئة تطبيقات web3 التي يمكن استخدامها لصفحات الحجز لديك",
|
||||
"installed_app_messaging_description": "تكوين أي تطبيقات الرسائل لاستخدامها لإعداد الإشعارات والمذكرات المخصصة",
|
||||
"installed_app_messaging_description": "تكوين تطبيقات المراسلة المراد استخدامها لإعداد الإشعارات والتذكيرات المخصصة",
|
||||
"installed_app_crm_description": "تهيئة تطبيقات CRM التي يمكن استخدامها لتتبع من قابلته",
|
||||
"analytics": "التحليلات",
|
||||
"empty_installed_apps_headline": "لم يتم تثبيت أي تطبيق",
|
||||
@@ -908,7 +908,7 @@
|
||||
"create_events_on": "إنشاء أحداث في",
|
||||
"enterprise_license": "هذه هي ميزة للمؤسسات",
|
||||
"enterprise_license_description": "لتمكين هذه الميزة، احصل على مفتاح نشر في وحدة التحكم {{consoleUrl}} وأضفه إلى وحدة التحكم الخاصة بك. nv باسم CALCOM_LICENSE_KEY. إذا كان لدى فريقك بالفعل ترخيص، يرجى الاتصال بـ {{supportMail}} للحصول على المساعدة.",
|
||||
"enterprise_license_development": "يمكنك اختبار هذه الميزة في وضع التطوير. لاستخدام الإنتاج يرجى جعل المسؤول يذهب إلى <2>/auth/setup</2> لإدخال مفتاح الترخيص.",
|
||||
"enterprise_license_development": "يمكنك اختبار هذه الميزة في وضع التطوير. لاستخدام الإنتاج، يرجى مطالبة المسؤول بالذهاب إلى <2>/auth/setup</2> لإدخال مفتاح الترخيص.",
|
||||
"missing_license": "الترخيص مفقود",
|
||||
"signup_requires": "يلزم ترخيص تجاري",
|
||||
"signup_requires_description": "لا تقدم شركة {{companyName}} حاليًا إصدارًا مجانيًا مفتوح المصدر لصفحة التسجيل. للحصول على حق الوصول الكامل إلى مكونات التسجيل، يجب أن تحصل على ترخيص تجاري. للاستخدام الشخصي، نوصي باستخدام منصة Prisma Data أو أي واجهة أخرى من واجهات Postgres لإنشاء الحسابات.",
|
||||
@@ -1001,9 +1001,9 @@
|
||||
"user_impersonation_heading": "انتحال شخصية مستخدم",
|
||||
"user_impersonation_description": "يسمح لفريق الدعم الخاص بنا بتسجيل الدخول مؤقتًا نيابة عنك لمساعدتنا على حل أي مشاكل تبلغ عنها بسرعة.",
|
||||
"team_impersonation_description": "يسمح لمالكي/مشرفي فريقك بتسجيل الدخول مؤقتًا نيابة عنك.",
|
||||
"make_team_private": "اجعل الفريق سري",
|
||||
"make_team_private_description": "لن يتمكن أعضاء فريقك من رؤية أعضاء الفريق الآخرين عند تشغيل هذا.",
|
||||
"you_cannot_see_team_members": "لا يمكنك رؤية جميع أعضاء فريق سري.",
|
||||
"make_team_private": "اجعل الفريق خاصًا",
|
||||
"make_team_private_description": "لن يتمكن أعضاء فريقك من رؤية أعضاء الفريق الآخرين عند تشغيل هذا الإعداد.",
|
||||
"you_cannot_see_team_members": "لا يمكنك رؤية جميع أعضاء الفريق السري.",
|
||||
"allow_booker_to_select_duration": "السماح لمن يقوم بالحجز بتحديد المدة",
|
||||
"impersonate_user_tip": "يتم مراجعة جميع استخدامات هذه الميزة.",
|
||||
"impersonating_user_warning": "انتحال اسم مستخدم \"{{user}}\".",
|
||||
@@ -1071,18 +1071,18 @@
|
||||
"event_location": "موقع الحدث",
|
||||
"reschedule_optional": "سبب إعادة الجدولة (اختياري)",
|
||||
"reschedule_placeholder": "أخبر الآخرين لماذا تحتاج إلى إعادة جدولة",
|
||||
"event_cancelled": "تم إلغاء هذه الفعالية",
|
||||
"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": "متى تم إلغاء هذه الفعالية",
|
||||
"event_cancelled_trigger": "متى تم إلغاء هذا الحدث",
|
||||
"new_event_trigger": "متى تم حجز الحدث الجديد",
|
||||
"email_host_action": "إرسال رسالة إلكترونية إلى المضيف",
|
||||
"email_attendee_action": "إرسال رسالة إلكترونية إلى الحضور",
|
||||
"sms_attendee_action": "إرسال رسالة نصية قصيرة إلى واحد من الحضور",
|
||||
"sms_attendee_action": "إرسال رسالة نصية قصيرة إلى أحد الحضور",
|
||||
"sms_number_action": "إرسال رسالة نصية قصيرة إلى رقم محدد",
|
||||
"workflows": "سير العمل",
|
||||
"new_workflow_btn": "سير عمل جديد",
|
||||
@@ -1331,9 +1331,9 @@
|
||||
"event_one": "حدث",
|
||||
"event_other": "أحداث",
|
||||
"profile_team_description": "إدارة إعدادات الملف الشخصي لفريقك",
|
||||
"profile_org_description": "إدارة الإعدادات لملف مؤسستك",
|
||||
"profile_org_description": "إدارة الإعدادات لملف منظمتك",
|
||||
"members_team_description": "المستخدمين الموجودين في المجموعة",
|
||||
"organization_description": "إدارة المشرفين والأعضاء في مؤسستك",
|
||||
"organization_description": "إدارة المسؤولين والأعضاء في منظمتك",
|
||||
"team_url": "رابط الفريق",
|
||||
"team_members": "أعضاء الفريق",
|
||||
"more": "المزيد",
|
||||
@@ -1479,10 +1479,10 @@
|
||||
"yearly": "سنويًا",
|
||||
"checkout": "الدفع",
|
||||
"your_team_disbanded_successfully": "تم حل فريقك بنجاح",
|
||||
"your_org_disbanded_successfully": "تم حل مؤسستك بنجاح",
|
||||
"your_org_disbanded_successfully": "تم حل منظمتك بنجاح",
|
||||
"error_creating_team": "خطأ في إنشاء فريق",
|
||||
"you": "أنت",
|
||||
"resend_email": "إعادة إرسال رسالة إلكترونية",
|
||||
"resend_email": "إعادة إرسال رسالة البريد الإلكتروني",
|
||||
"member_already_invited": "تمت دعوة العضو بالفعل",
|
||||
"enter_email_or_username": "أدخل بريد إلكتروني أو اسم مستخدم",
|
||||
"team_name_taken": "هذا الاسم مأخوذ بالفعل",
|
||||
@@ -1548,7 +1548,7 @@
|
||||
"no_apps": "لا توجد تطبيقات مفعلة لهذا المثال من Cal",
|
||||
"no_apps_configured": "لم يتم تكوين أي تطبيق بعد",
|
||||
"enable_in_settings": "يمكنك تمكين التطبيقات في الإعدادات",
|
||||
"please_contact_admin": "الرجاء الاتصال بالمشرف",
|
||||
"please_contact_admin": "يرجى الاتصال بالمسؤول",
|
||||
"apps_settings": "إعدادات التطبيقات",
|
||||
"fill_this_field": "يرجى ملء هذا الحقل",
|
||||
"options": "خيارات",
|
||||
@@ -1652,10 +1652,10 @@
|
||||
"delete_sso_configuration_confirmation_description": "هل تريد بالتأكيد حذف تكوين {{connectionType}}؟ لن يتمكن أعضاء فريقك الذين يستخدمون معلومات تسجيل الدخول إلى {{connectionType}} من الوصول إلى Cal.com بعد الآن.",
|
||||
"organizer_timezone": "منظم المناطق الزمنية",
|
||||
"email_user_cta": "عرض الدعوة",
|
||||
"email_no_user_invite_heading": "تم دعوتك للانضمام إلى {{appName}} {{entity}}",
|
||||
"email_no_user_invite_heading": "تمت دعوتك للانضمام إلى {{appName}} {{entity}}",
|
||||
"email_no_user_invite_subheading": "دعاك {{invitedBy}} للانضمام إلى فريقه على {{appName}}. إن {{appName}} هو برنامج جدولة الأحداث الذي يمكّنك أنت وفريقك من جدولة الاجتماعات دون الحاجة إلى المراسلة عبر البريد الإلكتروني.",
|
||||
"email_user_invite_subheading": "دعاك {{invitedBy}} للانضمام إلى فريقه {{teamName}} لدى {{entity}} على {{appName}}. إن {{appName}} هو برنامج جدولة الأحداث الذي يمكّنك أنت و{{entity}} من جدولة الاجتماعات من دون الحاجة إلى المراسلة عبر البريد الإلكتروني.",
|
||||
"email_no_user_invite_steps_intro": "سنرشدك خلال بضع خطوات قصيرة وستستمتع بجدولة سريعة خالية من الإجهاد مع {{entity}}.",
|
||||
"email_user_invite_subheading": "لقد دعاك {{invitedBy}} للانضمام إلى {{entity}} `{{teamName}}` على {{appName}}. إن {{appName}} هو برنامج جدولة الأحداث الذي يمكّنك أنت و{{entity}} من جدولة الاجتماعات دون الحاجة إلى المراسلة عبر البريد الإلكتروني.",
|
||||
"email_no_user_invite_steps_intro": "سنرشدك خلال بضع خطوات قصيرة وستستمتع بجدول زمني خالٍ من التوتر مع {{entity}} في لمح البصر.",
|
||||
"email_no_user_step_one": "اختر اسم المستخدم الخاص بك",
|
||||
"email_no_user_step_two": "ربط حساب التقويم الخاص بك",
|
||||
"email_no_user_step_three": "تعيين أوقاتك المتاحة",
|
||||
@@ -1666,8 +1666,8 @@
|
||||
"scheduler": "{Scheduler}",
|
||||
"no_workflows": "لا يوجد أي سير عمل",
|
||||
"change_filter": "قم بتغيير عامل التصفية لمشاهدة سير العمل الشخصي وفريقك.",
|
||||
"change_filter_common": "تغيير عامل الفرز لرؤية النتائج.",
|
||||
"no_results_for_filter": "لا توجد نتائج لعامل الفرز",
|
||||
"change_filter_common": "تغيير عامل التصفية لرؤية النتائج.",
|
||||
"no_results_for_filter": "لا توجد نتائج لعامل التصفية",
|
||||
"recommended_next_steps": "الخطوات التالية الموصى بها",
|
||||
"create_a_managed_event": "إنشاء نوع من الأحداث المُدارة",
|
||||
"meetings_are_better_with_the_right": "الاجتماعات أفضل مع وجود أعضاء الفريق المناسبين. قم بدعوتهم الآن.",
|
||||
@@ -1678,7 +1678,7 @@
|
||||
"no_longer_attending": "لن تحضر هذا الحدث",
|
||||
"attendee_no_longer_attending_subject": "أحد الحضور لن يحضر {{title}} في {{date}}",
|
||||
"attendee_no_longer_attending": "أحد الحضور لن يحضر الحدث الخاص بك",
|
||||
"attendee_no_longer_attending_subtitle": "تم إلغاء الحدث {{name}}، وهو ما يعني توافر معقد شاغر في هذا التوقيت",
|
||||
"attendee_no_longer_attending_subtitle": "تم إلغاء {{name}}. هذا يعني أنه تم فتح مقعد لهذه الفترة الزمنية",
|
||||
"create_event_on": "إنشاء حدث في",
|
||||
"create_routing_form_on": "إنشاء نموذج توجيه على",
|
||||
"default_app_link_title": "تعيين رابط تطبيق افتراضي",
|
||||
@@ -1690,7 +1690,7 @@
|
||||
"booking_questions_title": "أسئلة حول الحجز",
|
||||
"booking_questions_description": "يمكنك تخصيص الأسئلة المطروحة في صفحة الحجز",
|
||||
"add_a_booking_question": "اطرح سؤالاً",
|
||||
"identifier": "مُعرِّف",
|
||||
"identifier": "المُعرِّف",
|
||||
"duplicate_email": "البريد الإلكتروني مكرر",
|
||||
"booking_with_payment_cancelled": "لم يعد الدفع لهذا الحدث ممكنًا",
|
||||
"booking_with_payment_cancelled_already_paid": "استرداد المبلغ المدفوع لهذا الحجز قيد التنفيذ.",
|
||||
@@ -1733,14 +1733,14 @@
|
||||
"no_responses_yet": "لا توجد ردود بعد",
|
||||
"no_routes_defined": "لا توجد مسارات محددة",
|
||||
"this_will_be_the_placeholder": "سيكون هذا هو العنصر النائب",
|
||||
"error_booking_event": "حدث خطأ عند حجز الفعالية، الرجاء تحديث الصفحة والمحاولة ثانيةً",
|
||||
"error_booking_event": "حدث خطأ عند حجز الحدث، يرجى تحديث الصفحة والمحاولة ثانيةً",
|
||||
"timeslot_missing_title": "لم يتم تحديد فترة زمنية",
|
||||
"timeslot_missing_description": "يرجى تحديد فترة زمنية لحجز الحدث.",
|
||||
"timeslot_missing_cta": "حدد فترة زمنية",
|
||||
"switch_monthly": "التبديل إلى العرض الشهري",
|
||||
"switch_weekly": "التبديل إلى العرض الأسبوعي",
|
||||
"switch_multiday": "التبديل إلى العرض اليومي",
|
||||
"switch_columnview": "التبديل إلى العرض العمود",
|
||||
"switch_columnview": "التبديل إلى عرض العمود",
|
||||
"num_locations": "{{num}} من خيارات الموقع",
|
||||
"select_on_next_step": "حدد في الخطوة التالية",
|
||||
"this_meeting_has_not_started_yet": "لم يبدأ هذا الاجتماع بعد",
|
||||
@@ -1795,7 +1795,7 @@
|
||||
"least_booked_members": "الأعضاء الأقل حجزًا",
|
||||
"events_created": "تم إنشاء الأحداث",
|
||||
"events_completed": "تم اكتمال الأحداث",
|
||||
"events_cancelled": "تم إلغاء الفعاليات",
|
||||
"events_cancelled": "تم إلغاء الأحداث",
|
||||
"events_rescheduled": "تمت إعادة جدولة الأحداث",
|
||||
"from_last_period": "من آخر فترة",
|
||||
"from_to_date_period": "من: {{startDate}} إلى: {{endDate}}",
|
||||
@@ -1834,13 +1834,13 @@
|
||||
"invite_link_copied": "تم نسخ رابط الدعوة",
|
||||
"invite_link_deleted": "تم حذف رابط الدعوة",
|
||||
"invite_link_updated": "تم حفظ إعدادات رابط الدعوة",
|
||||
"link_expires_after": "روابط تم تعيينها للانتهاء بعد...",
|
||||
"link_expires_after": "تم تعيين الروابط للانتهاء بعد...",
|
||||
"one_day": "1 يوم",
|
||||
"seven_days": "7 أيام",
|
||||
"thirty_days": "30 يوم",
|
||||
"thirty_days": "30 يومًا",
|
||||
"three_months": "3 أشهر",
|
||||
"one_year": "1 سنة",
|
||||
"team_invite_received": "تم دعوتك للانضمام إلى {{teamName}}",
|
||||
"team_invite_received": "تمت دعوتك للانضمام إلى {{teamName}}",
|
||||
"currency_string": "{{amount, currency}}",
|
||||
"charge_card_dialog_body": "أنت على وشك تحصيل مبلغ {{amount, currency}} من أحد الحضور. هل أنت متأكد من أنك تريد المتابعة؟",
|
||||
"charge_attendee": "تحصيل مبلغ {{amount, currency}} من أحد الحضور",
|
||||
@@ -1849,7 +1849,7 @@
|
||||
"email_invite_team_bulk": "تم دعوة {{userCount}} من المستخدمين",
|
||||
"error_collecting_card": "خطأ في التحصيل من البطاقة",
|
||||
"image_size_limit_exceed": "يجب ألا يتجاوز حجم الصورة التي تم تحميلها 5 ميغابايت",
|
||||
"unauthorized_workflow_error_message": "{{errorCode}}: أنت غير مخوّل لك بتمكين أو تعطيل سير العمل هذا",
|
||||
"unauthorized_workflow_error_message": "{{errorCode}}: غير مصرح لك بتمكين سير العمل هذا أو تعطيله",
|
||||
"inline_embed": "التضمين",
|
||||
"load_inline_content": "تحميل نوع الحدث مع محتوى آخر من موقعكبشكل مباشر.",
|
||||
"floating_pop_up_button": "زر منبثق عائم",
|
||||
@@ -1871,66 +1871,66 @@
|
||||
"first_event_type_webhook_description": "قم بإنشاء أول شبكة ويب هوك لهذا النوع من الأحداث",
|
||||
"install_app_on": "تثبيت التطبيق على",
|
||||
"create_for": "إنشاء من أجل",
|
||||
"setup_organization": "إعداد مؤسسة",
|
||||
"organization_banner_description": "إنشاء بيئات حيث يمكن لفرقك إنشاء تطبيقات مشتركة، ومسارات عمل وأنواع فعاليات مع جدولة دورية وجماعية.",
|
||||
"organization_banner_title": "إدارة المنظمات مع فرق متعددة",
|
||||
"setup_organization": "إعداد منظمة",
|
||||
"organization_banner_description": "إنشاء بيئات حيث يمكن لفرقك إنشاء تطبيقات مشتركة ومهام سير العمل وأنواع الأحداث باستخدام الجدولة الدوارة والجماعية.",
|
||||
"organization_banner_title": "إدارة المنظمات ذات الفرق المتعددة",
|
||||
"set_up_your_organization": "إعداد منظمتك",
|
||||
"organizations_description": "المنظمات هي بيئات مشتركة حيث يمكن للفرق إنشاء أنواع الفعاليات المشتركة والتطبيقات ومسارات العمل والمزيد.",
|
||||
"organizations_description": "المنظمات هي بيئات مشتركة حيث يمكن للفرق إنشاء أنواع الأحداث المشتركة والتطبيقات ومهام سير العمل والمزيد.",
|
||||
"must_enter_organization_name": "يجب إدخال اسم المنظمة",
|
||||
"must_enter_organization_admin_email": "يجب إدخال عنوان البريد الإلكتروني لمؤسستك",
|
||||
"admin_email": "عنوان البريد الإلكتروني لمؤسستك",
|
||||
"must_enter_organization_admin_email": "يجب إدخال عنوان البريد الإلكتروني لمنظمتك",
|
||||
"admin_email": "عنوان البريد الإلكتروني لمنظمتك",
|
||||
"admin_username": "اسم المستخدم للمسؤول",
|
||||
"organization_name": "اسم المنظمة",
|
||||
"organization_url": "رابط المنظمة",
|
||||
"organization_verify_header": "تأكيد البريد الإلكتروني لمؤسستك",
|
||||
"organization_verify_email_body": "الرجاء استخدام الرمز أدناه لتأكيد عنوان بريدك الإلكتروني لمواصلة إعداد مؤسستك.",
|
||||
"additional_url_parameters": "مقاييس URL إضافية",
|
||||
"about_your_organization": "حول مؤسستك",
|
||||
"about_your_organization_description": "المنظمات هي بيئات مشتركة فيها يمكنك إنشاء فرق متعدد مع أعضاء مشتركين، وأنواع الفعاليات، والتطبيقات، ومسارات العمل والمزيد.",
|
||||
"organization_verify_header": "تأكيد البريد الإلكتروني لمنظمتك",
|
||||
"organization_verify_email_body": "الرجاء استخدام الرمز أدناه لتأكيد عنوان بريدك الإلكتروني لمواصلة إعداد منظمتك.",
|
||||
"additional_url_parameters": "معلمات الرابط الإضافية",
|
||||
"about_your_organization": "حول منظمتك",
|
||||
"about_your_organization_description": "المنظمات هي بيئات مشتركة حيث يمكنك إنشاء فرق متعددة مع أعضاء مشتركين وأنواع الأحداث والتطبيقات ومهام سير العمل والمزيد.",
|
||||
"create_your_teams": "إنشاء فرقك",
|
||||
"create_your_teams_description": "البدء في الجدولة معاً بإضافة أعضاء فريقك إلى مؤسستك",
|
||||
"invite_organization_admins": "قم بدعوة مشرفي مؤسستك",
|
||||
"invite_organization_admins_description": "سيتمكن هؤلاء المشرفون من الوصول إلى جميع الفرق في مؤسستك. يمكنك إضافة مشرفين وأعضاء في وقت لاحق.",
|
||||
"create_your_teams_description": "ابدأوا الجدولة معًا عن طريق إضافة أعضاء فريقك إلى منظمتك",
|
||||
"invite_organization_admins": "دعوة مشرفي منظمتك",
|
||||
"invite_organization_admins_description": "سيتمكن هؤلاء المسؤولون من الوصول إلى جميع الفرق في منظمتك. يمكنك إضافة مسؤولي الفريق والأعضاء لاحقًا.",
|
||||
"set_a_password": "تعيين كلمة مرور",
|
||||
"set_a_password_description": "سيؤدي هذا إلى إنشاء حساب مستخدم جديد مع البريد الإلكتروني لمؤسستك وكلمة المرور هذه.",
|
||||
"set_a_password_description": "سيؤدي هذا إلى إنشاء حساب مستخدم جديد بالبريد الإلكتروني لمنظمتك وكلمة المرور هذه.",
|
||||
"organization_logo": "شعار المنظمة",
|
||||
"organization_about_description": "بضع جمل عن منظمتك. ستظهر على الصفحة المتاحجة للعموم لمنظمتك.",
|
||||
"ill_do_this_later": "سأفعل هذا لاحقاً",
|
||||
"organization_about_description": "بضع جمل عن منطمتك. سيظهر هذا في صفحة الملف الشخصي العامة لمنظمتك.",
|
||||
"ill_do_this_later": "سأفعل هذا لاحقًا",
|
||||
"verify_your_email": "تأكيد بريدك الإلكتروني",
|
||||
"enter_digit_code": "أدخل الرمز المكون من 6 أرقام الذي أرسلناه إلى {{email}}",
|
||||
"verify_email_organization": "تأكيد بريدك الإلكتروني لإنشاء مؤسسة",
|
||||
"verify_email_organization": "أكد بريدك الإلكتروني لإنشاء منظمة",
|
||||
"code_provided_invalid": "الرمز المقدم غير صالح، حاول ثانيةً",
|
||||
"email_already_used": "البريد الإلكتروني مستخدم بالفعل",
|
||||
"organization_admin_invited_heading": "تم دعوتك للانضمام إلى {{orgName}}",
|
||||
"organization_admin_invited_body": "انضم إلى فريقك في {{orgName}} وابدأ بالتركيز على الاجتماع، وليس عقد الاجتماعات!",
|
||||
"duplicated_slugs_warning": "لا يمكن إنشاء الفرق التالية بسبب التكرار: {{slugs}}",
|
||||
"organization_admin_invited_heading": "تمت دعوتك للانضمام إلى {{orgName}}",
|
||||
"organization_admin_invited_body": "انضم إلى فريقك في {{orgName}} وابدأ الانشغال بالاجتماعاتك، وليس بكيفية الإعداد لها!",
|
||||
"duplicated_slugs_warning": "لا يمكن إنشاء الفرق التالية بسبب تكرار الكلمات اللطيفة (Slug): {{slugs}}",
|
||||
"team_names_empty": "لا يمكن أن تكون أسماء الفرق فارغة",
|
||||
"team_names_repeated": "لا يمكن تكرار أسماء الفرق",
|
||||
"user_belongs_organization": "المستخدم ينتمي إلى منظمة",
|
||||
"org_no_teams_yet": "هذه المنظمة ليس لديها فرق بعد",
|
||||
"org_no_teams_yet_description": "إذا كنت مسؤول، تأكد من إنشاء فرق لعرضها هنا.",
|
||||
"set_up": "إعداد",
|
||||
"set_up_your_profile": "إعداد ملفك التعريفي",
|
||||
"set_up": "الإعداد",
|
||||
"set_up_your_profile": "إعداد ملفك الشخصي",
|
||||
"set_up_your_profile_description": "دع الناس يعرفون من أنت داخل {{orgName}}، ومتى يتعاملون مع الرابط العام الخاص بك.",
|
||||
"my_profile": "ملفي التعريفي",
|
||||
"my_settings": "إعداداتي",
|
||||
"my_profile": "الملف الشخصي",
|
||||
"my_settings": "الإعدادات",
|
||||
"crm": "CRM",
|
||||
"messaging": "المراسلة",
|
||||
"sender_id_info": "الاسم أو الرقم المبين كمرسل لرسالة نصية قصيرة (بعض البلدان لا تسمح بأن تكون هويات المرسل أبجدية رقمية)",
|
||||
"org_admins_can_create_new_teams": "يمكن فقط لمشرف مؤسستك إنشاء فرق جديدة",
|
||||
"sender_id_info": "الاسم أو الرقم الظاهر على أنه مرسل الرسالة النصية القصيرة (بعض البلدان لا تسمح بمعرفات المرسل الأبجدية الرقمية)",
|
||||
"org_admins_can_create_new_teams": "يمكن فقط لمسؤول منظمتك إنشاء فرق جديدة",
|
||||
"google_new_spam_policy": "يمكن أن تمنعك سياسة Google الجديدة للرسائل غير المرغوب فيها من تلقي أي إشعارات بالبريد الإلكتروني والتقويم حول هذا الحجز.",
|
||||
"resolve": "حل",
|
||||
"no_organization_slug": "حدث خطأ أثناء إنشاء فرق لهذه المؤسسة. ربط الرابط مفقود.",
|
||||
"no_organization_slug": "حدث خطأ أثناء إنشاء فرق لهذه المنظمة. الكلمة اللطيفة للرابط مفقودة.",
|
||||
"org_name": "اسم المنظمة",
|
||||
"org_url": "رابط المنظمة",
|
||||
"copy_link_org": "نسخ الرابط إلى المنظمة",
|
||||
"404_the_org": "المنظمة",
|
||||
"404_the_team": "الفريق",
|
||||
"404_claim_entity_org": "المطالبة بنطاقك الفرعي لمؤسستك",
|
||||
"404_claim_entity_org": "المطالبة بنطاقك الفرعي لمنظمتك",
|
||||
"404_claim_entity_team": "المطالبة بهذا الفريق والبدء في إدارة الجداول الزمنية بشكل جماعي",
|
||||
"insights_all_org_filter": "الكل",
|
||||
"insights_team_filter": "الفريق: {{teamName}}",
|
||||
"insights_user_filter": "المستخدم: {{userName}}",
|
||||
"insights_subtitle": "عرض رؤى الحجز عبر فعالياتك",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ أضف خيوطك الجديدة أعلاه هنا ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
"insights_subtitle": "عرض Insights الحجز عبر أحداثك",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ أضف السلاسل الجديدة أعلاه هنا ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"verify_email_email_link_text": "Zde je odkaz pro případ, že nemáte rádi klikání na tlačítka:",
|
||||
"email_sent": "E-mail byl odeslán",
|
||||
"event_declined_subject": "Odmítnuto: {{title}} v {{date}}",
|
||||
"event_cancelled_subject": "Zrušeno: {{title}} ({{date}})",
|
||||
"event_cancelled_subject": "Zrušeno: {{title}} dne {{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 plánovaná událost byla zrušena",
|
||||
@@ -89,7 +89,7 @@
|
||||
"event_has_been_rescheduled": "Změna - Vaše událost byla přesunuta na jindy",
|
||||
"request_reschedule_subtitle": "{{organizer}} zrušil rezervaci a požádal vás, abyste si vybrali jiný termín.",
|
||||
"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 účastník {{attendee}} by si s vámi měl rezervovat nový čas.",
|
||||
"request_reschedule_subtitle_organizer": "Zrušili jste rezervaci a účastník {{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}}",
|
||||
@@ -129,7 +129,7 @@
|
||||
"team_upgrade_banner_description": "Děkujeme vám za vyzkoušení našeho nového týmového plánu. Všimli jsme si, že váš tým „{{teamName}}“ je nutné upgradovat.",
|
||||
"upgrade_banner_action": "Upgradovat zde",
|
||||
"team_upgraded_successfully": "Váš tým byl úspěšně přešel na vyšší verzi!",
|
||||
"org_upgrade_banner_description": "Děkujeme, že jste vyzkoušeli tarif naší organizace. Všimli jsme si, že vaše organizace „{{teamName}}“ vyžaduje upgrade.",
|
||||
"org_upgrade_banner_description": "Děkujeme, že jste vyzkoušeli náš tarif Organizace. Všimli jsme si, že vaše organizace „{{teamName}}“ vyžaduje upgrade.",
|
||||
"org_upgraded_successfully": "Vaše organizace byla upgradována!",
|
||||
"use_link_to_reset_password": "Pro obnovení hesla použijte odkaz níž",
|
||||
"hey_there": "Zdravíme,",
|
||||
@@ -248,7 +248,7 @@
|
||||
"organization_general_description": "Správa nastavení jazyka a časového pásma vašeho týmu",
|
||||
"few_sentences_about_yourself": "Pár vět o vás. Budou se zobrazovat na URL vaší osobní stránky.",
|
||||
"nearly_there": "Téměř hotovo!",
|
||||
"nearly_there_instructions": "Poslední věc... stručný popis o vás a fotografie vám pomůžou získat rezervace a lidi aspoň budou vědět, koho si rezervují.",
|
||||
"nearly_there_instructions": "Poslední věc... pár slov o vás a fotografie vám pomůžou získat rezervace a lidi aspoň budou vědět, koho si rezervují.",
|
||||
"set_availability_instructions": "Určete si časové intervaly, kdy jste pravidelně dostupní. Později můžete vytvořit další a přiřadit je různým kalendářům.",
|
||||
"set_availability": "Nastavte, jak jste dostupní",
|
||||
"continue_without_calendar": "Pokračovat bez kalendáře",
|
||||
@@ -314,8 +314,8 @@
|
||||
"bookerlayout_column_view": "Sloupec",
|
||||
"bookerlayout_error_min_one_enabled": "Musí být povoleno alespoň jedno rozvržení.",
|
||||
"bookerlayout_error_default_not_enabled": "Rozvržení, které jste vybrali jako výchozí zobrazení, není součástí povolených rozvržení.",
|
||||
"bookerlayout_error_unknown_layout": "Vámi vybrané rozvržení není platné rozvržení.",
|
||||
"bookerlayout_override_global_settings": "Tohle lze nastavit pro všechny typy událostí v <2>nastavení / vzhledu</2> nebo <6>nadefinovat pouze pro tuto událost</6>.",
|
||||
"bookerlayout_error_unknown_layout": "Vámi vybrané rozvržení není platné.",
|
||||
"bookerlayout_override_global_settings": "Toto lze nastavit pro všechny typy událostí v <2>nastavení / vzhled</2> nebo <6>nadefinovat pouze pro tuto událost</6>.",
|
||||
"unexpected_error_try_again": "Došlo k neočekávané chybě. Zkuste to znovu.",
|
||||
"sunday_time_error": "Neplatný čas v neděli",
|
||||
"monday_time_error": "Neplatný čas v pondělí",
|
||||
@@ -341,7 +341,7 @@
|
||||
"error_event_type_unauthorized_create": "Tuto událost nelze vytvořit",
|
||||
"error_event_type_unauthorized_update": "Tuto událost nelze upravit",
|
||||
"error_workflow_unauthorized_create": "Tento pracovní postup nelze vytvořit",
|
||||
"error_schedule_unauthorized_create": "Nejste schopni vytvořit tento plán",
|
||||
"error_schedule_unauthorized_create": "Tento plán nelze vytvořit",
|
||||
"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",
|
||||
@@ -352,7 +352,7 @@
|
||||
"no_status_bookings_yet_description": "Nemáte žádné {{status}} rezervace. {{description}}",
|
||||
"event_between_users": "{{eventName}} mezi {{host}} a {{attendeeName}}",
|
||||
"bookings": "Rezervace",
|
||||
"booking_not_found": "Rezervace nenalezena",
|
||||
"booking_not_found": "Rezervace nebyla nalezena",
|
||||
"bookings_description": "Zobrazte si nadcházející a proběhlé události rezervovaní prostřednictvím odkazu na typ události.",
|
||||
"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.",
|
||||
@@ -398,12 +398,12 @@
|
||||
"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_cancelled": "Rezervace byla zrušena",
|
||||
"booking_rescheduled": "Rezervace přesunuta",
|
||||
"recording_ready": "Odkaz ke stažení záznamu je připraven",
|
||||
"booking_created": "Rezervace vytvořena",
|
||||
"booking_rejected": "Rezervace zamítnuta",
|
||||
"booking_requested": "Rezervace vyžádána",
|
||||
"booking_rejected": "Rezervace byla zamítnuta",
|
||||
"booking_requested": "Byla vyžádána rezervace",
|
||||
"meeting_ended": "Schůzka skončila",
|
||||
"form_submitted": "Formulář byl odeslán",
|
||||
"event_triggers": "Eventy na základě akce",
|
||||
@@ -867,7 +867,7 @@
|
||||
"no_category_apps": "Žádné aplikace v kategorii {{category}}",
|
||||
"all_apps": "Všechny aplikace",
|
||||
"no_category_apps_description_calendar": "Přidejte aplikaci kalendáře, ať máte přehled v zájmu prevence dvojích rezervací",
|
||||
"no_category_apps_description_conferencing": "Zkuste přidat aplikaci pro videokonference s klienty.",
|
||||
"no_category_apps_description_conferencing": "Zkuste přidat aplikaci pro videokonference s klienty",
|
||||
"no_category_apps_description_payment": "Přidejte platební aplikaci, která usnadní provádění transakcí mezi vámi a vašimi klienty",
|
||||
"no_category_apps_description_analytics": "Přidejte analytickou aplikaci pro vaše rezervační stránky",
|
||||
"no_category_apps_description_automation": "Přidejte aplikaci pro automatizaci",
|
||||
@@ -1002,8 +1002,8 @@
|
||||
"user_impersonation_heading": "Přizpůsobení uživatele",
|
||||
"user_impersonation_description": "Náš tým podpory se bude moci dočasně přihlásit místo vás, aby nám pomohl rychle vyřešit jakékoli problémy, které nám nahlásíte.",
|
||||
"team_impersonation_description": "Umožňuje vašim vlastníkům/správcům týmu dočasně se přihlásit jako vy.",
|
||||
"make_team_private": "Soukromý tým",
|
||||
"make_team_private_description": "Po zapnutí této funkce nebudou členové vašeho týmu vidět ostatní členy týmu.",
|
||||
"make_team_private": "Nastavit tým jako soukromý",
|
||||
"make_team_private_description": "Po zapnutí této funkce neuvidí členové vašeho týmu ostatní členy týmu.",
|
||||
"you_cannot_see_team_members": "V soukromém týmu nelze vidět všechny členy týmu.",
|
||||
"allow_booker_to_select_duration": "Umožnit rezervující osobě vybrat dobu trvání",
|
||||
"impersonate_user_tip": "Všechna použití této funkce jsou kontrolována.",
|
||||
@@ -1327,7 +1327,7 @@
|
||||
"download_responses_description": "Stáhněte si všechny odpovědi do formuláře ve formátu CSV.",
|
||||
"download": "Stáhnout",
|
||||
"download_recording": "Stáhnout nahrávku",
|
||||
"recording_from_your_recent_call": "Nahrávka z vašeho nedávného hovoru v {{appName}} je připravena ke stažení.",
|
||||
"recording_from_your_recent_call": "Nahrávka z vašeho nedávného hovoru v {{appName}} je připravena ke stažení",
|
||||
"create_your_first_form": "Vytvořte svůj první formulář",
|
||||
"create_your_first_form_description": "Pomocí adresných formulářů můžete klást kvalifikační otázky a adresovat je správné osobě nebo typu události.",
|
||||
"create_your_first_webhook": "Vytvořte svůj první webhook",
|
||||
@@ -1659,10 +1659,10 @@
|
||||
"delete_sso_configuration_confirmation_description": "Opravdu chcete odstranit konfiguraci {{connectionType}}? Členové vašeho týmu, kteří používají přihlášení {{connectionType}}, ztratí přístup k webu Cal.com.",
|
||||
"organizer_timezone": "Časové pásmo organizátora",
|
||||
"email_user_cta": "Zobrazit pozvánku",
|
||||
"email_no_user_invite_heading": "Byli jste pozváni, abyste se připojili k subjektu {{{entity}} v aplikaci {{appName}}",
|
||||
"email_no_user_invite_heading": "Byli jste pozváni, abyste se připojili k subjektu {{entity}} v aplikaci {{appName}}",
|
||||
"email_no_user_invite_subheading": "Uživatel {{invitedBy}} vás pozval, abyste se připojili k jeho týmu v aplikaci {{appName}}. {{appName}} je plánovač událostí, který vám a vašemu týmu umožňuje plánovat schůzky bez e-mailového ping-pongu.",
|
||||
"email_user_invite_subheading": "Uživatel {{invitedBy}} vás pozval, abyste se připojili k týmu {{teamName}} subjektu ({{entity}}) v aplikaci {{appName}}. {{appName}} je plánovač událostí, který vám a vašemu subjektu ({{entity}}) umožňuje plánovat schůzky bez e-mailového pingpongu.",
|
||||
"email_no_user_invite_steps_intro": "Provedeme vás několika krátkými kroky a za malou chvíli si budete se svým subjektem ({{entity}}) užívat plánování bez stresu.",
|
||||
"email_user_invite_subheading": "Uživatel {{invitedBy}} vás pozval, abyste se připojili k týmu {{teamName}} subjektu {{entity}} v aplikaci {{appName}}. {{appName}} je plánovač událostí, který vám a vašemu subjektu {{entity}} umožňuje plánovat schůzky bez e-mailového pingpongu.",
|
||||
"email_no_user_invite_steps_intro": "Provedeme vás několika krátkými kroky a za malou chvíli si budete se svým subjektem {{entity}} užívat plánování bez stresu.",
|
||||
"email_no_user_step_one": "Vyberte si uživatelské jméno",
|
||||
"email_no_user_step_two": "Připojte svůj účet kalendáře",
|
||||
"email_no_user_step_three": "Nastavte si dostupnost",
|
||||
@@ -1740,7 +1740,7 @@
|
||||
"no_responses_yet": "Zatím žádné odpovědi",
|
||||
"no_routes_defined": "Není definováno žádné směrování",
|
||||
"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.",
|
||||
"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",
|
||||
@@ -1802,7 +1802,7 @@
|
||||
"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_cancelled": "Zrušené události",
|
||||
"events_rescheduled": "Události přesunuty",
|
||||
"from_last_period": "z posledního období",
|
||||
"from_to_date_period": "Od: {{startDate}} do: {{endDate}}",
|
||||
@@ -1838,9 +1838,9 @@
|
||||
"confirm_your_details": "Potvrďte své údaje",
|
||||
"copy_invite_link": "Zkopírovat odkaz pozvánky",
|
||||
"edit_invite_link": "Upravit nastavení odkazu",
|
||||
"invite_link_copied": "Odkaz pozvánky zkopírován",
|
||||
"invite_link_deleted": "Odkaz pozvánky odstraněn",
|
||||
"invite_link_updated": "Nastavení odkazu pozvánky uloženo",
|
||||
"invite_link_copied": "Odkaz pozvánky byl zkopírován",
|
||||
"invite_link_deleted": "Odkaz pozvánky byl odstraněn",
|
||||
"invite_link_updated": "Nastavení odkazu pozvánky bylo uloženo",
|
||||
"link_expires_after": "Platnost odkazů vyprší za...",
|
||||
"one_day": "1 den",
|
||||
"seven_days": "7 dní",
|
||||
@@ -1856,7 +1856,7 @@
|
||||
"email_invite_team_bulk": "Počet pozvaných uživatelů: {{userCount}}",
|
||||
"error_collecting_card": "Chyba při výběru karty",
|
||||
"image_size_limit_exceed": "Velikost nahraného obrázku by neměla překročit limit 5 MB",
|
||||
"unauthorized_workflow_error_message": "{{errorCode}}: Nejste oprávněni zapnout nebo vypnout tento pracovní postup.",
|
||||
"unauthorized_workflow_error_message": "{{errorCode}}: Nejste oprávněni zapnout nebo vypnout tento pracovní postup",
|
||||
"inline_embed": "Vložit na řádek",
|
||||
"load_inline_content": "Načte váš typ události přímo do řádků s ostatním obsahem webu.",
|
||||
"floating_pop_up_button": "Plovoucí překryvné tlačítko",
|
||||
@@ -1895,10 +1895,10 @@
|
||||
"about_your_organization": "Informace o vaší organizaci",
|
||||
"about_your_organization_description": "Organizace jsou sdílená prostředí, ve kterých můžete vytvořit několik týmů se sdílenými členy, typy událostí, aplikacemi, pracovními postupy a mnoha dalšími věcmi.",
|
||||
"create_your_teams": "Vytvoření týmů",
|
||||
"create_your_teams_description": "Přidejte do své organizace členy a pusťte se do společného plánování.",
|
||||
"create_your_teams_description": "Přidejte do své organizace členy a pusťte se do společného plánování",
|
||||
"invite_organization_admins": "Pozvěte správce své organizace",
|
||||
"invite_organization_admins_description": "Tito správci budou mít přístup ke všem týmům ve vaší organizaci. Správce a členy týmů můžete přidat později.",
|
||||
"set_a_password": "Nastavte heslo",
|
||||
"set_a_password": "Nastavte si heslo",
|
||||
"set_a_password_description": "Tím se vytvoří nový uživatelský účet s e-mailem vaší organizace a tímto heslem.",
|
||||
"organization_logo": "Logo organizace",
|
||||
"organization_about_description": "Několik vět o vaší organizaci. Objeví se na veřejné stránce profilu vaší organizace.",
|
||||
@@ -1923,7 +1923,7 @@
|
||||
"my_settings": "Moje nastavení",
|
||||
"crm": "CRM",
|
||||
"messaging": "Zasílání zpráv",
|
||||
"sender_id_info": "Jméno nebo číslo zobrazené jako odesílatel SMS (některé země nepovolují alfanumerické ID odesílatele).",
|
||||
"sender_id_info": "Jméno nebo číslo zobrazené jako odesílatel SMS (některé země nepovolují alfanumerické ID odesílatele)",
|
||||
"org_admins_can_create_new_teams": "Nové týmy může vytvářet pouze správce vaší organizace",
|
||||
"google_new_spam_policy": "Nové zásady společnosti Google týkající se nevyžádané pošty by mohly zabránit tomu, abyste dostávali e-mailová oznámení a oznámení kalendáře o této rezervaci.",
|
||||
"resolve": "Vyřešit",
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
"reset_password_subject": "{{appName}}: Anleitung zum Zurücksetzen des Passworts",
|
||||
"verify_email_subject": "{{appName}}: Bestätigen Sie Ihr Konto",
|
||||
"check_your_email": "Schauen Sie in Ihrem E-Mail-Postfach nach",
|
||||
"verify_email_page_body": "Wir haben eine E-Mail an {{email}} gesendet. Es ist wichtig, Ihre E-Mail-Adresse zu bestätigen, um die beste Zustellbarkeit für E-Mails und Kalender von {{appName}} zu gewährleisten.",
|
||||
"verify_email_banner_body": "Bestätigen Sie Ihre E-Mail-Adresse, um die beste Zustellbarkeit von E-Mails und Kalenderdaten zu gewährleisten",
|
||||
"verify_email_page_body": "Wir haben eine E-Mail an {{email}} gesendet. Es ist wichtig, Ihre E-Mail-Adresse zu bestätigen, um die Zustellbarkeit für E-Mails und Kalenderbenachrichtigungen von {{appName}} zu gewährleisten.",
|
||||
"verify_email_banner_body": "Bestätigen Sie Ihre E-Mail-Adresse, um die Zustellbarkeit von E-Mails und Kalenderbenachrichtigungen zu gewährleisten",
|
||||
"verify_email_email_header": "Bestätigen Sie Ihre E-Mail-Adresse",
|
||||
"verify_email_email_button": "E-Mail bestätigen",
|
||||
"copy_somewhere_safe": "Speichern Sie diesen API-Schlüssel an einem sicheren Ort. Sie können ihn nicht erneut ansehen.",
|
||||
@@ -137,11 +137,11 @@
|
||||
"upgrade_banner_action": "Hier aufrüsten",
|
||||
"team_upgraded_successfully": "Das Update für Ihr Team war erfolgreich!",
|
||||
"org_upgrade_banner_description": "Vielen Dank, dass Sie unseren neuen Organisationsplan getestet haben. Wir haben festgestellt, dass Ihre Organisation „{{teamName}}“ ein Upgrade benötigt.",
|
||||
"org_upgraded_successfully": "Das Update für Ihre Organisation war erfolgreich!",
|
||||
"org_upgraded_successfully": "Das Upgrade für Ihre Organization war erfolgreich!",
|
||||
"use_link_to_reset_password": "Benutzen Sie den Link, um Ihr Passwort zurückzusetzen",
|
||||
"hey_there": "Hallo,",
|
||||
"forgot_your_password_calcom": "Passwort vergessen? - {{appName}}",
|
||||
"delete_webhook_confirmation_message": "Sind Sie sicher, dass Sie diesen Webhook löschen möchten? Sie werden keine {{appName}} Meetingdaten mehr unter einer bestimmten URL, in Echtzeit erhalten, wenn ein Ereignis geplant oder abgesagt wird.",
|
||||
"delete_webhook_confirmation_message": "Sind Sie sicher, dass Sie diesen Webhook löschen möchten? Sie werden keine {{appName}}-Meetingdaten mehr unter einer bestimmten URL, in Echtzeit erhalten, wenn ein Ereignis geplant oder abgesagt wird.",
|
||||
"confirm_delete_webhook": "Ja, Webhook löschen",
|
||||
"edit_webhook": "Webhook bearbeiten",
|
||||
"delete_webhook": "Webhook löschen",
|
||||
@@ -260,7 +260,7 @@
|
||||
"organization_general_description": "Einstellungen für die Sprache und Zeitzone Ihres Teams verwalten",
|
||||
"few_sentences_about_yourself": "Schreiben Sie eine kurze Beschreibung, welche auf Ihrer persönlichen URL-Seite erscheinen wird.",
|
||||
"nearly_there": "Fast fertig",
|
||||
"nearly_there_instructions": "Zu guter Letzt: Ein Foto und eine Kurzbeschreibung zu Ihnen helfen, öfter gebucht zu werden, da Kunden dann besser wissen, wen sie buchen.",
|
||||
"nearly_there_instructions": "Zu guter Letzt: Ein Foto und eine Kurzbeschreibung zu Ihnen helfen, öfter gebucht zu werden, da Kunden dann genauer wissen, bei wem sie einen Termin buchen.",
|
||||
"set_availability_instructions": "Definieren Sie Zeiträume, wenn Sie wiederkehrend verfügbar sind. Sie können später weitere Zeiträume erstellen und verschiedenen Kalendern zuordnen.",
|
||||
"set_availability": "Verfügbarkeit festlegen",
|
||||
"continue_without_calendar": "Ohne Kalender fortfahren",
|
||||
@@ -318,11 +318,11 @@
|
||||
"password_has_been_reset_login": "Ihr Passwort wurde zurückgesetzt. Sie können sich jetzt mit Ihrem neu erstellten Passwort anmelden.",
|
||||
"layout": "Layout",
|
||||
"bookerlayout_default_title": "Standardansicht",
|
||||
"bookerlayout_description": "Sie können mehrere auswählen und Ihre Bucher können die Ansicht wechseln.",
|
||||
"bookerlayout_description": "Sie können mehrere auswählen und Ihre Bucher können anschließend die Ansicht wechseln.",
|
||||
"bookerlayout_user_settings_title": "Buchungslayout",
|
||||
"bookerlayout_user_settings_description": "Sie können mehrere auswählen und Bucher können die Ansicht wechseln. Dies kann pro Termin überschrieben werden.",
|
||||
"bookerlayout_user_settings_description": "Sie können mehrere auswählen und Bucher können anschließend die Ansicht wechseln. Dies kann pro Termin überschrieben werden.",
|
||||
"bookerlayout_month_view": "Monat",
|
||||
"bookerlayout_week_view": "Woche",
|
||||
"bookerlayout_week_view": "Wöchentlich",
|
||||
"bookerlayout_column_view": "Spalte",
|
||||
"bookerlayout_error_min_one_enabled": "Es muss mindestens ein Layout aktiviert sein.",
|
||||
"bookerlayout_error_default_not_enabled": "Das Layout, das Sie als Standardansicht ausgewählt haben, ist nicht Teil der aktivierten Layouts.",
|
||||
@@ -404,6 +404,8 @@
|
||||
"allow_dynamic_booking_tooltip": "Gruppenbuchungslinks, die dynamisch durch Hinzufügen mehrerer Benutzernamen mit einem '+' erstellt werden können. Beispiel: '{{appName}}/bailey+peer'",
|
||||
"allow_dynamic_booking": "Ermöglichen Sie es den Teilnehmenden, Sie über dynamische Gruppenbuchungen zu buchen",
|
||||
"dynamic_booking": "Dynamische Gruppenlinks",
|
||||
"allow_seo_indexing": "Suchmaschinen erlauben, auf Ihre öffentlichen Inhalte zuzugreifen",
|
||||
"seo_indexing": "Suchmaschinen-Indexierung erlauben",
|
||||
"email": "E-Mail",
|
||||
"email_placeholder": "max@example.com",
|
||||
"full_name": "Vollständiger Name",
|
||||
@@ -426,8 +428,8 @@
|
||||
"team_webhooks": "Team-Webhooks",
|
||||
"create_new_webhook_to_account": "Erstellen Sie einen neuen Webhook in Ihrem Account",
|
||||
"new_webhook": "Neuer Webhook",
|
||||
"receive_cal_meeting_data": "Erhalten Sie {{appName}} Termindaten unter einer bestimmten URL in Echtzeit, wenn ein Termin geplant oder abgesagt wird.",
|
||||
"receive_cal_event_meeting_data": "Erhalten Sie {{appName}} Termindaten unter einer bestimmten URL in Echtzeit, wenn dieser Termin geplant oder abgesagt wird.",
|
||||
"receive_cal_meeting_data": "Erhalten Sie in Echtzeit {{appName}}-Termindaten unter einer bestimmten URL, wenn ein Termin geplant oder abgesagt wird.",
|
||||
"receive_cal_event_meeting_data": "Erhalten Sie in Echtzeit {{appName}}-Termindaten unter einer bestimmten URL, wenn dieser Termin geplant oder abgesagt wird.",
|
||||
"responsive_fullscreen_iframe": "Responsives Vollbild-iFrame",
|
||||
"loading": "Wird geladen...",
|
||||
"deleting": "Lösche...",
|
||||
@@ -565,7 +567,7 @@
|
||||
"team_description": "Ein paar Sätze über Ihr Team auf der öffentlichen Teamseite.",
|
||||
"org_description": "Ein paar Sätze zu Ihrer Organisation. Dies wird auf der URL-Seite Ihrer Organisation erscheinen.",
|
||||
"members": "Mitglieder",
|
||||
"organization_members": "Organisationsmitglieder",
|
||||
"organization_members": "Mitglieder der Organization",
|
||||
"member": "Mitglied",
|
||||
"number_member_one": "{{count}} Mitglied",
|
||||
"number_member_other": "{{count}} Mitglieder",
|
||||
@@ -600,7 +602,7 @@
|
||||
"confirm_all": "Alle bestätigen",
|
||||
"disband_team": "Team auflösen",
|
||||
"disband_team_confirmation_message": "Bist du sicher, dass du dieses Team auflösen möchtest? Jeder der diesen Team-Link erhalten hat, kann Sie nicht mehr buchen.",
|
||||
"disband_org": "Organisation auflösen",
|
||||
"disband_org": "Organization auflösen",
|
||||
"disband_org_confirmation_message": "Sind Sie sicher, dass Sie diese Organisation auflösen möchten? Alle Teams und Mitglieder werden gelöscht.",
|
||||
"remove_member_confirmation_message": "Sind Sie sicher, dass Sie dieses Mitglied aus dem Team entfernen möchten?",
|
||||
"confirm_disband_team": "Ja, Team auflösen",
|
||||
@@ -713,7 +715,7 @@
|
||||
"create_team_to_get_started": "Erstellen Sie ein Team um loszulegen",
|
||||
"teams": "Teams",
|
||||
"team": "Team",
|
||||
"organization": "Organisation",
|
||||
"organization": "Organization",
|
||||
"team_billing": "Abrechnung der Teams",
|
||||
"team_billing_description": "Verwalte die Abrechungen deines Teams",
|
||||
"upgrade_to_flexible_pro_title": "Wir haben die Abrechnung für Teams geändert",
|
||||
@@ -924,7 +926,7 @@
|
||||
"create_events_on": "Erstelle Termine in:",
|
||||
"enterprise_license": "Das ist eine Enterprise-Funktion",
|
||||
"enterprise_license_description": "Um diese Funktion zu aktivieren, holen Sie sich einen Deployment-Schlüssel von der {{consoleUrl}}-Konsole und fügen Sie ihn als CALCOM_LICENSE_KEY zu Ihrer .env hinzu. Wenn Ihr Team bereits eine Lizenz hat, wenden Sie sich bitte an {{supportMail}} für Hilfe.",
|
||||
"enterprise_license_development": "Sie können diese Funktion im Entwicklungsmodus testen. Zur Nutzung im Produktionsmodus, besuchen Sie bitte <2>/auth/setup</2>, um einen Lizenzschlüssel einzugeben.",
|
||||
"enterprise_license_development": "Sie können diese Funktion im Entwicklungsmodus testen. Zur Nutzung im regulären Arbeitsumfeld, besuchen Sie bitte <2>/auth/setup</2>, um einen Lizenzschlüssel einzugeben.",
|
||||
"missing_license": "Lizenz fehlt",
|
||||
"signup_requires": "Kommerzielle Lizenz erforderlich",
|
||||
"signup_requires_description": "{{companyName}} bietet zur Zeit keine kostenlose Open-Source-Version der Anmeldeseite an. Um vollen Zugriff auf die Registrierungskomponenten zu erhalten, müssen Sie eine kommerzielle Lizenz erwerben. Für den persönlichen Gebrauch empfehlen wir die Prisma Data Platform oder jede andere Postgres-Schnittstelle zur Erstellung von Accounts.",
|
||||
@@ -1018,7 +1020,7 @@
|
||||
"user_impersonation_description": "Erlaubt es unserem Support-Team, sich vorübergehend mit Ihrem Konto anzumelden, um jegliche Probleme, die Sie gemeldet haben, schneller zu lösen.",
|
||||
"team_impersonation_description": "Ermöglicht den Team-Administratoren, sich vorübergehend als Sie einzuloggen.",
|
||||
"make_team_private": "Team privat stellen",
|
||||
"make_team_private_description": "Deine Teammitglieder können keine anderen Teammitglieder sehen, wenn dies aktiviert ist.",
|
||||
"make_team_private_description": "Wenn diese Einstellung aktiv ist, können deine Teammitglieder keine anderen Teammitglieder sehen.",
|
||||
"you_cannot_see_team_members": "Sie können nicht alle Teammitglieder eines privaten Teams sehen.",
|
||||
"allow_booker_to_select_duration": "Bucher erlauben, die Länge zu wählen",
|
||||
"impersonate_user_tip": "Alle Verwendungen dieser Funktion werden geprüft.",
|
||||
@@ -1351,9 +1353,9 @@
|
||||
"event_one": "Ereignis",
|
||||
"event_other": "Ereignisse",
|
||||
"profile_team_description": "Einstellungen für Ihr Teamprofil verwalten",
|
||||
"profile_org_description": "Einstellungen für Ihr Organisationsprofil verwalten",
|
||||
"profile_org_description": "Einstellungen für Ihr Organization-Profil verwalten",
|
||||
"members_team_description": "Benutzer in der Gruppe",
|
||||
"organization_description": "Administratoren und Mitglieder in Ihrer Organisation verwalten",
|
||||
"organization_description": "Administratoren und Mitglieder in Ihrer Organization verwalten",
|
||||
"team_url": "Team-URL",
|
||||
"team_members": "Teammitglieder",
|
||||
"more": "Mehr",
|
||||
@@ -1499,7 +1501,7 @@
|
||||
"yearly": "Jährlich",
|
||||
"checkout": "Kasse",
|
||||
"your_team_disbanded_successfully": "Ihr Team wurde erfolgreich aufgelöst",
|
||||
"your_org_disbanded_successfully": "Ihre Organisation wurde erfolgreich aufgelöst",
|
||||
"your_org_disbanded_successfully": "Ihre Organization wurde erfolgreich aufgelöst",
|
||||
"error_creating_team": "Fehler beim Erstellen des Teams",
|
||||
"you": "Sie",
|
||||
"resend_email": "E-Mail erneut senden",
|
||||
@@ -1511,7 +1513,7 @@
|
||||
"url_taken": "Diese URL ist bereits vergeben",
|
||||
"problem_registering_domain": "Es gab ein Problem bei der Registrierung der Subdomain, bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator",
|
||||
"team_publish": "Team veröffentlichen",
|
||||
"number_text_notifications": "Telefonnummer (Text-Benachrichtigungen)",
|
||||
"number_text_notifications": "Telefonnummer (Textbenachrichtigungen)",
|
||||
"attendee_email_variable": "Teilnehmer E-Mail",
|
||||
"attendee_email_info": "Die E-Mail-Adresse der buchenden Person",
|
||||
"kbar_search_placeholder": "Geben Sie einen Befehl ein oder suchen Sie ...",
|
||||
@@ -1534,8 +1536,8 @@
|
||||
"find_the_best_person": "Finden Sie die beste verfügbare Person und rotieren Sie durch Ihr Team.",
|
||||
"fixed_round_robin": "Festgelegter Round Robin",
|
||||
"add_one_fixed_attendee": "Fügen Sie einen festen Teilnehmer und einen Round Robin mit einer Reihe von Teilnehmern hinzu.",
|
||||
"calcom_is_better_with_team": "{{appName}} ist mit Teams besser",
|
||||
"the_calcom_team": "Das {{companyName}} Team",
|
||||
"calcom_is_better_with_team": "{{appName}} ist mit Teams noch besser",
|
||||
"the_calcom_team": "Das {{companyName}}-Team",
|
||||
"add_your_team_members": "Fügen Sie Ihre Teammitglieder zu Ihren Termintypen hinzu. Nutzen Sie kollektive Planung, um alle einzubinden oder finden Sie die geeignetste Person mit der Round Robin Planung.",
|
||||
"booking_limit_reached": "Das Buchungslimit für diesen Termintyp wurde erreicht",
|
||||
"duration_limit_reached": "Das Zeitlimit für diesen Termintyp wurde erreicht",
|
||||
@@ -1688,7 +1690,7 @@
|
||||
"scheduler": "{Scheduler}",
|
||||
"no_workflows": "Keine Workflows",
|
||||
"change_filter": "Ändern Sie den Filter, um Ihre eigenen und Ihre Team-Workflows anzuzeigen.",
|
||||
"change_filter_common": "Ändern Sie Ihre Filteroptionen um die Ergebnisse zu sehen.",
|
||||
"change_filter_common": "Passen Sie Ihre Filteroptionen an, um die Ergebnisse zu sehen.",
|
||||
"no_results_for_filter": "Keine Ergebnisse für diesen Filter",
|
||||
"recommended_next_steps": "Empfohlene nächste Schritte",
|
||||
"create_a_managed_event": "Einen verwalteten Ereignistyp erstellen",
|
||||
@@ -1700,7 +1702,7 @@
|
||||
"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",
|
||||
"attendee_no_longer_attending_subtitle": "{{name}} hat abgesagt. Dies bedeutet, dass ein Platz in diesem Zeitfenster frei wurde",
|
||||
"create_event_on": "Erstelle Termin am",
|
||||
"create_routing_form_on": "Weiterleitungsformular erstellen am",
|
||||
"default_app_link_title": "Standard-App-Link festlegen",
|
||||
@@ -1753,7 +1755,7 @@
|
||||
"spot_popular_event_types": "Machen Sie beliebte Ereignistypen ausfindig",
|
||||
"spot_popular_event_types_description": "Sehen Sie, welche Ihrer Ereignistypen die meisten Klicks und Buchungen erhalten",
|
||||
"no_responses_yet": "Noch keine Antworten",
|
||||
"no_routes_defined": "Keine Routen definiert",
|
||||
"no_routes_defined": "Keine Weiterleitungsrouten definiert",
|
||||
"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",
|
||||
@@ -1896,68 +1898,69 @@
|
||||
"first_event_type_webhook_description": "Erstellen Sie Ihren ersten Webhook für diesen Termintypen",
|
||||
"install_app_on": "App installieren auf",
|
||||
"create_for": "Erstellen für",
|
||||
"setup_organization": "Eine Organisation einrichten",
|
||||
"organization_banner_description": "Schaffen Sie eine Umgebung, in der Teams gemeinsame Apps, Workflows und Termintypen mit Round Robin und kollektiver Terminplanung erstellen können.",
|
||||
"organization_banner_title": "Verwalten Sie Organisationen mit mehreren Teams",
|
||||
"set_up_your_organization": "Ihre Organisation einrichten",
|
||||
"organizations_description": "Organisationen sind geteilte Umgebungen, in denen Teams gemeinsame Termintypen, Apps, Workflows und mehr erstellen können.",
|
||||
"must_enter_organization_name": "Es muss ein Organisationsname eingegeben werden",
|
||||
"must_enter_organization_admin_email": "Sie müssen Ihre Organisations-Mailadresse eingeben",
|
||||
"admin_email": "Ihre Organisations-E-Mail-Adresse",
|
||||
"currency": "Währung",
|
||||
"setup_organization": "Eine Organization einrichten",
|
||||
"organization_banner_description": "Schaffen Sie Umgebungen, in der Teams gemeinsame Apps, Workflows und Termintypen mit Round Robin und kollektiver Terminplanung erstellen können.",
|
||||
"organization_banner_title": "Verwalten Sie Organizations mit mehreren Teams",
|
||||
"set_up_your_organization": "Ihre Organization einrichten",
|
||||
"organizations_description": "Organizations sind geteilte Umgebungen, in denen Teams gemeinsame Termintypen, Apps, Workflows und mehr erstellen können.",
|
||||
"must_enter_organization_name": "Es muss ein Name für die Organization eingegeben werden",
|
||||
"must_enter_organization_admin_email": "Sie müssen Ihre Organization-Mailadresse eingeben\n",
|
||||
"admin_email": "Ihre Organization-E-Mail-Adresse",
|
||||
"admin_username": "Benutzername des Administrators",
|
||||
"organization_name": "Name der Organisation",
|
||||
"organization_url": "URL der Organisation",
|
||||
"organization_verify_header": "Bestätigen Sie Ihre Organisations-Mailadresse",
|
||||
"organization_verify_email_body": "Bitte verwenden Sie den folgenden Code, um Ihre E-Mail-Adresse zu bestätigen, um die Einrichtung Ihrer Organisation fortzusetzen.",
|
||||
"organization_name": "Name der Organization",
|
||||
"organization_url": "URL der Organization ",
|
||||
"organization_verify_header": "Bestätigen Sie Ihre Organization-Mailadresse",
|
||||
"organization_verify_email_body": "Bitte verwenden Sie den folgenden Code, um Ihre E-Mail-Adresse zu bestätigen, um die Einrichtung Ihrer Organization fortzusetzen.",
|
||||
"additional_url_parameters": "Zusätzliche URL-Parameter",
|
||||
"about_your_organization": "Über Ihre Organisation",
|
||||
"about_your_organization_description": "Organisationen sind geteilte Umgebungen, in denen Sie mehrere Teams mit gemeinsamen Mitgliedern, Termintypen, Apps, Workflows und mehr erstellen können.",
|
||||
"about_your_organization": "Über Ihre Organization",
|
||||
"about_your_organization_description": "Organizations sind geteilte Umgebungen, in denen Sie mehrere Teams mit gemeinsamen Mitgliedern, Termintypen, Apps, Workflows und mehr erstellen können.\n",
|
||||
"create_your_teams": "Erstellen Sie Ihre Teams",
|
||||
"create_your_teams_description": "Fangen Sie an, gemeinsam zu planen, indem Sie Ihre Teammitglieder zu Ihrer Organisation hinzufügen",
|
||||
"invite_organization_admins": "Laden Sie die Administratoren Ihrer Organisation ein",
|
||||
"invite_organization_admins_description": "Diese Administratoren haben Zugriff auf alle Teams in Ihrer Organisation. Sie können Team-Administratoren und -mitglieder später hinzufügen.",
|
||||
"create_your_teams_description": "Fangen Sie an, gemeinsam zu planen, indem Sie Ihre Teammitglieder zu Ihrer Organization hinzufügen",
|
||||
"invite_organization_admins": "Laden Sie die Administratoren Ihrer Organization ein",
|
||||
"invite_organization_admins_description": "Diese Administratoren haben Zugriff auf alle Teams in Ihrer Organization. Sie können Team-Administratoren und -mitglieder später hinzufügen.",
|
||||
"set_a_password": "Legen Sie ein Passwort fest",
|
||||
"set_a_password_description": "Dies wird ein neues Benutzerkonto mit Ihrer Organisations-Mailadresse und diesem Passwort erstellen.",
|
||||
"organization_logo": "Logo der Organisation",
|
||||
"organization_about_description": "Ein paar Sätze zu Ihrer Organisation. Dies wird auf der öffentlichen Profilseite Ihrer Organisation erscheinen.",
|
||||
"set_a_password_description": "Dies wird ein neues Benutzerkonto mit Ihrer Organization-Mailadresse und diesem Passwort erstellen.",
|
||||
"organization_logo": "Logo der Organization",
|
||||
"organization_about_description": "Ein paar Sätze zu Ihrer Organization. Dies wird auf der öffentlichen Profilseite Ihrer Organization erscheinen.",
|
||||
"ill_do_this_later": "Ich werde das später tun",
|
||||
"verify_your_email": "Bestätigen Sie Ihre E-Mail",
|
||||
"verify_your_email": "Bestätigen Sie Ihre E-Mail-Adresse",
|
||||
"enter_digit_code": "Geben Sie den 6-stelligen Code ein, den wir an {{email}} gesendet haben",
|
||||
"verify_email_organization": "Bestätigen Sie Ihre E-Mail, um eine Organisation zu erstellen",
|
||||
"verify_email_organization": "Bestätigen Sie Ihre E-Mail-Adresse, um eine Organization zu erstellen",
|
||||
"code_provided_invalid": "Der eingegebene Code ist ungültig, versuchen Sie es erneut",
|
||||
"email_already_used": "Die E-Mail-Adresse wird bereits verwendet",
|
||||
"organization_admin_invited_heading": "Sie wurden eingeladen, ein Mitglied von {{orgName}} zu werden",
|
||||
"organization_admin_invited_body": "Schließen Sie sich Ihrem Team bei {{orgName}} an und konzentrieren Sie sich auf Ihre Meetings, nicht auf das Planen von Meetings!",
|
||||
"duplicated_slugs_warning": "Die folgenden Teams konnten aufgrund von doppelten Slugs nicht erstellt werden: {{slugs}}",
|
||||
"team_names_empty": "Teamnamen dürfen nicht leer sein",
|
||||
"team_names_repeated": "Teamnamen dürfen nicht wiederholt vorkommen",
|
||||
"user_belongs_organization": "Der Benutzer gehört einer Organisation an",
|
||||
"org_no_teams_yet": "Diese Organisation hat noch keine Teams",
|
||||
"team_names_repeated": "Teamnamen dürfen nicht bereits verwendet werden",
|
||||
"user_belongs_organization": "Der Benutzer gehört einer Organization an",
|
||||
"org_no_teams_yet": "Diese Organization hat noch keine Teams",
|
||||
"org_no_teams_yet_description": "Falls Sie ein Administrator sind, sollten Sie unbedingt Teams erstellen, welche hier angezeigt werden können.",
|
||||
"set_up": "Einrichten",
|
||||
"set_up_your_profile": "Richten Sie Ihr Profil ein",
|
||||
"set_up_your_profile_description": "Lassen Sie Leute wissen, wer Sie innerhalb von {{orgName}} sind und wann sie mit Ihrem öffentlichen Link arbeiten.",
|
||||
"set_up_your_profile_description": "Lassen Sie Leute beim Klicken auf Ihren öffentlichen Link wissen, welche Funktion Sie innerhalb von {{orgName}} haben.",
|
||||
"my_profile": "Mein Profil",
|
||||
"my_settings": "Meine Einstellungen",
|
||||
"crm": "CRM",
|
||||
"messaging": "Nachrichten",
|
||||
"sender_id_info": "Name oder Nummer, welcher bzw. welche als Absender einer SMS angezeigt wird (einige Länder erlauben keine alphanumerischen Absender-IDs)",
|
||||
"org_admins_can_create_new_teams": "Nur der Administrator Ihrer Organisation kann neue Teams erstellen",
|
||||
"org_admins_can_create_new_teams": "Nur der Administrator Ihrer Organization kann neue Teams erstellen",
|
||||
"google_new_spam_policy": "Die neuen Spam-Richtlinien von Google könnten verhindern, dass Sie E-Mail- und Kalenderbenachrichtigungen zu dieser Buchung erhalten.",
|
||||
"resolve": "Beheben",
|
||||
"no_organization_slug": "Beim Erstellen von Teams für diese Organisation ist ein Fehler aufgetreten. URL Slug fehlt.",
|
||||
"org_name": "Name der Organisation",
|
||||
"org_url": "URL der Organisation",
|
||||
"copy_link_org": "Link zur Organisation kopieren",
|
||||
"404_the_org": "Die Organisation",
|
||||
"resolve": "Problem lösen",
|
||||
"no_organization_slug": "Beim Erstellen von Teams für diese Organization ist ein Fehler aufgetreten. URL-Slug fehlt.",
|
||||
"org_name": "Name der Organization",
|
||||
"org_url": "URL der Organization",
|
||||
"copy_link_org": "Link zur Organization kopieren",
|
||||
"404_the_org": "Die Organization",
|
||||
"404_the_team": "Das Team",
|
||||
"404_claim_entity_org": "Beanspruchen Sie Ihre Subdomain für Ihre Organisation",
|
||||
"404_claim_entity_org": "Beanspruchen Sie Ihre Subdomain für Ihre Organization",
|
||||
"404_claim_entity_team": "Dieses Team beanspruchen und gemeinsam mit der Verwaltung von Verfügbarkeitsplänen beginnen",
|
||||
"insights_all_org_filter": "Alle Apps",
|
||||
"insights_team_filter": "Team: {{teamName}}",
|
||||
"insights_user_filter": "Benutzer: {{userName}}",
|
||||
"insights_subtitle": "Sehen Sie sich Buchungs-Insights über Ihre Termine an",
|
||||
"custom_plan": "Benutzerdefinierter Plan",
|
||||
"insights_subtitle": "Sehen Sie sich Buchungs-Insights zu Ihren Termine an",
|
||||
"custom_plan": "Maßgeschneiderter Tarif",
|
||||
"email_embed": "E-Mail Einbettung",
|
||||
"add_times_to_your_email": "Zeiten zur E-Mail hinzufügen",
|
||||
"select_time": "Zeit auswählen",
|
||||
@@ -1971,10 +1974,13 @@
|
||||
"org_team_names_example_5": "z.B. Data Analytics Team",
|
||||
"org_max_team_warnings": "Weitere Teams können Sie zu einem späteren Zeitpunkt hinzufügen.",
|
||||
"what_is_this_meeting_about": "Worum geht es in diesem Termin?",
|
||||
"kyc_verification_information": "Aus Sicherheitsgründen müssen Sie Ihren {{teamOrAccount}} verifizieren, bevor Sie Textnachrichten an die Teilnehmer senden können. Bitte kontaktieren Sie uns unter <a>{{supportEmail}}</a> und geben Sie folgende Informationen an:",
|
||||
"org_admin_other_teams": "Weitere Teams",
|
||||
"no_other_teams_found": "Keine weiteren Teams gefunden",
|
||||
"no_other_teams_found_description": "Es gibt keine weiteren Teams in dieser Organisation.",
|
||||
"attendee_first_name_variable": "Vorname des Teilnehmers",
|
||||
"attendee_last_name_variable": "Nachname des Teilnehmers",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Fügen Sie Ihre neuen Zeichenketten über dieser hinzu ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
"my_availability": "Meine Verfügbarkeit",
|
||||
"team_availability": "Teamverfügbarkeit",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Fügen Sie Ihre neuen Code-Zeilen über dieser hinzu ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -407,6 +407,8 @@
|
||||
"allow_dynamic_booking_tooltip": "Group booking links that can be created dynamically by adding multiple usernames with a '+'. example: '{{appName}}/bailey+peer'",
|
||||
"allow_dynamic_booking": "Allow attendees to book you through dynamic group bookings",
|
||||
"dynamic_booking": "Dynamic group links",
|
||||
"allow_seo_indexing": "Allow search engines to access your public content",
|
||||
"seo_indexing": "Allow SEO Indexing",
|
||||
"email": "Email",
|
||||
"email_placeholder": "jdoe@example.com",
|
||||
"full_name": "Full name",
|
||||
@@ -560,6 +562,7 @@
|
||||
"leave": "Leave",
|
||||
"profile": "Profile",
|
||||
"my_team_url": "My team URL",
|
||||
"my_teams": "My teams",
|
||||
"team_name": "Team Name",
|
||||
"your_team_name": "Your team name",
|
||||
"team_updated_successfully": "Team updated successfully",
|
||||
@@ -806,7 +809,6 @@
|
||||
"add_new_event_type": "Add a new event type",
|
||||
"new_event_type_to_book_description": "Create a new event type for people to book times with.",
|
||||
"length": "Length",
|
||||
"people":"People",
|
||||
"minimum_booking_notice": "Minimum Notice",
|
||||
"offset_toggle": "Offset start times",
|
||||
"offset_toggle_description": "Offset timeslots shown to bookers by a specified number of minutes",
|
||||
@@ -870,6 +872,7 @@
|
||||
"account_managed_by_identity_provider_description": "To change your email, password, enable two-factor authentication and more, please visit your {{provider}} account settings.",
|
||||
"signin_with_google": "Sign in with Google",
|
||||
"signin_with_saml": "Sign in with SAML",
|
||||
"signin_with_saml_oidc": "Sign in with SAML/OIDC",
|
||||
"you_will_need_to_generate": "You will need to generate an access token from your old scheduling tool.",
|
||||
"import": "Import",
|
||||
"import_from": "Import from",
|
||||
@@ -927,7 +930,7 @@
|
||||
"verify_wallet": "Verify Wallet",
|
||||
"create_events_on": "Create events on",
|
||||
"enterprise_license": "This is an enterprise feature",
|
||||
"enterprise_license_description": "To enable this feature, have an administrator go to {{setupUrl}} to enter a license key. If a license key is already in place, please contact {{supportMail}} for help.",
|
||||
"enterprise_license_description": "To enable this feature, have an administrator go to <2>/auth/setup</2> to enter a license key. If a license key is already in place, please contact <5>{{SUPPORT_MAIL_ADDRESS}}</5> for help.",
|
||||
"enterprise_license_development": "You can test this feature on development mode. For production usage please have an administrator go to <2>/auth/setup</2> to enter a license key.",
|
||||
"missing_license": "Missing License",
|
||||
"signup_requires": "Commercial license required",
|
||||
@@ -1263,6 +1266,7 @@
|
||||
"error_updating_settings": "Error updating settings",
|
||||
"personal_cal_url": "My personal {{appName}} URL",
|
||||
"bio_hint": "A few sentences about yourself. this will appear on your personal url page.",
|
||||
"user_has_no_bio": "This user has not added a bio yet.",
|
||||
"delete_account_modal_title": "Delete Account",
|
||||
"confirm_delete_account_modal": "Are you sure you want to delete your {{appName}} account?",
|
||||
"delete_my_account": "Delete my account",
|
||||
@@ -1578,7 +1582,6 @@
|
||||
"apps_settings": "Apps settings",
|
||||
"fill_this_field": "Please fill in this field",
|
||||
"options": "Options",
|
||||
"no_options_available":"No options available",
|
||||
"enter_option": "Enter Option {{index}}",
|
||||
"add_an_option": "Add an option",
|
||||
"radio": "Radio",
|
||||
@@ -1720,7 +1723,7 @@
|
||||
"identifier": "Identifier",
|
||||
"duplicate_email": "Email is duplicate",
|
||||
"booking_with_payment_cancelled": "Paying for this event is no longer possible",
|
||||
"booking_with_payment_cancelled_already_paid": "A refund for this booking payment it's on the way.",
|
||||
"booking_with_payment_cancelled_already_paid": "A refund for this booking payment is on its way.",
|
||||
"booking_with_payment_cancelled_refunded": "This booking payment has been refunded.",
|
||||
"booking_confirmation_failed": "Booking confirmation failed",
|
||||
"not_enough_seats": "Not enough seats",
|
||||
@@ -1903,6 +1906,7 @@
|
||||
"first_event_type_webhook_description": "Create your first webhook for this event type",
|
||||
"install_app_on": "Install app on",
|
||||
"create_for": "Create for",
|
||||
"currency": "Currency",
|
||||
"setup_organization": "Setup an Organization",
|
||||
"organization_banner_description": "Create an environments where your teams can create shared apps, workflows and event types with round-robin and collective scheduling.",
|
||||
"organization_banner_title": "Manage organizations with multiple teams",
|
||||
@@ -1979,15 +1983,33 @@
|
||||
"org_team_names_example_5": "e.g. Data Analytics Team",
|
||||
"org_max_team_warnings": "You will be able to add more teams later on.",
|
||||
"what_is_this_meeting_about": "What is this meeting about?",
|
||||
"add_to_team":"Add to team",
|
||||
"remove_users_from_org": "Remove users from organization",
|
||||
"remove_users_from_org_confirm":"Are you sure you want to remove {{userCount}} users from this organization?",
|
||||
"user_has_no_schedules":"This user has not setup any schedules yet",
|
||||
"user_isnt_in_any_teams":"This user is not in any teams",
|
||||
"requires_booker_email_verification": "Requires booker email verification",
|
||||
"description_requires_booker_email_verification": "To ensure booker's email verification before scheduling events",
|
||||
"requires_confirmation_mandatory": "Text messages can only be sent to attendees when event type requires confirmation.",
|
||||
"kyc_verification_information": "To ensure security, you have to verify your {{teamOrAccount}} before sending text messages to attendees. Please contact us at <a>{{supportEmail}}</a> and provide the following information:",
|
||||
"kyc_verification_documents": "<ul><li>Your {{teamOrUser}}</li><li>For businesses: Attach your Business Verification Documentation</li><li>For individuals: Attach a government-issued ID</li></ul>",
|
||||
"verify_team_or_account": "Verify {{teamOrAccount}}",
|
||||
"verify_account": "Verify Account",
|
||||
"kyc_verification": "KYC Verification",
|
||||
"organizations": "Organizations",
|
||||
"org_admin_other_teams": "Other teams",
|
||||
"org_admin_other_teams_description": "Here you can see teams inside your organization but that you are not part of. You can add yourself to them if needed.",
|
||||
"org_admin_other_teams_description": "Here you can see teams inside your organization that you are not part of. You can add yourself to them if needed.",
|
||||
"no_other_teams_found": "No other teams found",
|
||||
"no_other_teams_found_description": "There are no other teams in this organization.",
|
||||
"attendee_first_name_variable": "Attendee first name",
|
||||
"attendee_last_name_variable": "Attendee last name",
|
||||
"attendee_first_name_info": "The person booking's first name",
|
||||
"attendee_last_name_info": "The person booking's last name",
|
||||
"me": "Me",
|
||||
"verify_team_tooltip": "Verify your team to enable sending messages to attendees",
|
||||
"member_removed": "Member removed",
|
||||
"my_availability": "My Availability",
|
||||
"team_availability": "Team Availability",
|
||||
"seat_options_doesnt_multiple_durations": "Seat option doesn't support multiple durations",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -11,14 +11,14 @@
|
||||
"calcom_explained_new_user": "¡Termine de configurar su cuenta de {{appName}}! Solo le faltan unos pasos para resolver todos sus problemas de programación.",
|
||||
"have_any_questions": "¿Tienes preguntas? Estamos aquí para ayudar.",
|
||||
"reset_password_subject": "{{appName}}: Instrucciones para restablecer la contraseña",
|
||||
"verify_email_subject": "{{appName}}: verifique su cuenta",
|
||||
"verify_email_subject": "{{appName}}: Verifique su cuenta",
|
||||
"check_your_email": "Revise su correo electrónico",
|
||||
"verify_email_page_body": "Enviamos un correo electrónico a {{email}}. Es importante que verifique su dirección de correo electrónico para garantizar que {{appName}} le ofrezca el mejor servicio de entrega de correos y calendarios.",
|
||||
"verify_email_banner_body": "Verifique su dirección de correo electrónico para garantizar la mejor entrega de correo electrónico y calendario",
|
||||
"verify_email_email_header": "Verifique su dirección de correo electrónico",
|
||||
"verify_email_email_button": "Verificar correo electrónico",
|
||||
"verify_email_email_body": "Verifique su dirección de correo electrónico al hacer clic en el botón a continuación.",
|
||||
"verify_email_email_link_text": "Este es el enlace en caso de que no le guste hacer clic en los botones:",
|
||||
"verify_email_email_link_text": "Este es el enlace en caso de que no prefiera hacer clic en los botones:",
|
||||
"email_sent": "Correo electrónico enviado correctamente",
|
||||
"event_declined_subject": "Rechazado: {{title}} en {{date}}",
|
||||
"event_cancelled_subject": "Cancelado: {{title}} el {{date}}",
|
||||
@@ -130,7 +130,7 @@
|
||||
"upgrade_banner_action": "Actualizar aquí",
|
||||
"team_upgraded_successfully": "¡Tu equipo se actualizó con éxito!",
|
||||
"org_upgrade_banner_description": "Gracias por probar nuestro nuevo plan de equipo. Notamos que su equipo \"{{teamName}}\" necesita actualizarse.",
|
||||
"org_upgraded_successfully": "Su organización se actualizó con éxito.",
|
||||
"org_upgraded_successfully": "Su Organization se actualizó con éxito.",
|
||||
"use_link_to_reset_password": "Utilice el enlace de abajo para restablecer su contraseña",
|
||||
"hey_there": "Hola,",
|
||||
"forgot_your_password_calcom": "¿Olvidaste tu contraseña? - {{appName}}",
|
||||
@@ -248,7 +248,7 @@
|
||||
"organization_general_description": "Administre los ajustes para el idioma y la zona horaria de su equipo",
|
||||
"few_sentences_about_yourself": "Unas pocas frases sobre ti mismo. Esto aparecerá en tu página de url personal.",
|
||||
"nearly_there": "¡Ya casi está!",
|
||||
"nearly_there_instructions": "Lo último, una breve descripción sobre usted y una foto realmente lo ayudan a obtener reservas y a que las personas sepan con quién están reservando.",
|
||||
"nearly_there_instructions": "Lo último, una breve descripción sobre usted y una foto lo ayudan a obtener reservas y a que las personas sepan con quién están reservando.",
|
||||
"set_availability_instructions": "Defina los intervalos de tiempo cuando esté disponible de forma recurrente. Puede crear más tarde y asignarlos a diferentes calendarios.",
|
||||
"set_availability": "Establecer Disponibilidad",
|
||||
"continue_without_calendar": "Continuar sin calendario",
|
||||
@@ -306,9 +306,9 @@
|
||||
"password_has_been_reset_login": "Su contraseña ha sido restablecida. Ahora puede iniciar sesión con su nueva contraseña.",
|
||||
"layout": "Diseño",
|
||||
"bookerlayout_default_title": "Vista predeterminada",
|
||||
"bookerlayout_description": "Puede seleccionar varios y sus reservadores pueden cambiar de vista.",
|
||||
"bookerlayout_description": "Puede seleccionar varios y quienes le reserven pueden cambiar de vista.",
|
||||
"bookerlayout_user_settings_title": "Diseño de reserva",
|
||||
"bookerlayout_user_settings_description": "Puede seleccionar varios y los reservadores pueden cambiar de vista. Esto se puede anular por evento.",
|
||||
"bookerlayout_user_settings_description": "Puede seleccionar varios y quienes le reservan pueden cambiar de vista. Esto se puede anular por evento.",
|
||||
"bookerlayout_month_view": "Mes",
|
||||
"bookerlayout_week_view": "Semanal",
|
||||
"bookerlayout_column_view": "Columna",
|
||||
@@ -1327,7 +1327,7 @@
|
||||
"download_responses_description": "Descargue todas las respuestas de su formulario en formato CSV.",
|
||||
"download": "Descargar",
|
||||
"download_recording": "Descargar grabación",
|
||||
"recording_from_your_recent_call": "Una grabación de su llamada reciente en {{appName}} está lista para descargarla",
|
||||
"recording_from_your_recent_call": "Una grabación de su llamada reciente en {{appName}} está lista para descargar",
|
||||
"create_your_first_form": "Crea tu primer formulario",
|
||||
"create_your_first_form_description": "Con los formularios de orientación puedes hacer preguntas calificadoras y encaminarte hacia la persona o tipo de evento correctos.",
|
||||
"create_your_first_webhook": "Crea tu primer Webhook",
|
||||
@@ -1661,7 +1661,7 @@
|
||||
"email_user_cta": "Ver la invitación",
|
||||
"email_no_user_invite_heading": "Lo invitaron a unirse a {{appName}} {{entity}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} lo invitó a unirse a su equipo en {{appName}}. {{appName}} es el programador de eventos que les permite a usted y a su equipo programar reuniones sin necesidad de enviar correos electrónicos.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} lo ha invitado a unirse a su {{entity}} \"{{teamName}}\" en {{appName}}. {{appName}} es el planificador de eventos que le permite a usted y a su {{entity}} programar reuniones sin correos electrónicos de ida y vuelta.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} lo ha invitado a unirse a su {{entity}} \"{{teamName}}\" en {{appName}}. {{appName}} es el planificador de eventos que le permite a usted y a su {{entity}} programar reuniones sin necesidad de correos electrónicos.",
|
||||
"email_no_user_invite_steps_intro": "Lo guiaremos a través de unos pocos pasos y disfrutará de una programación sin estrés con su {{entity}} en muy poco tiempo.",
|
||||
"email_no_user_step_one": "Elija su nombre de usuario",
|
||||
"email_no_user_step_two": "Conecte su cuenta de calendario",
|
||||
@@ -1687,7 +1687,7 @@
|
||||
"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",
|
||||
"create_routing_form_on": "Crear formulario de enrutamiento el",
|
||||
"create_routing_form_on": "Crear formulario de enrutamiento 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.",
|
||||
"organizer_default_conferencing_app": "Aplicación por defecto del organizador",
|
||||
@@ -1934,7 +1934,7 @@
|
||||
"404_the_org": "La organización",
|
||||
"404_the_team": "El equipo",
|
||||
"404_claim_entity_org": "Reclame su subdominio para su organización",
|
||||
"404_claim_entity_team": "Reclama este equipo y empiece a gestionar los horarios de forma colectiva",
|
||||
"404_claim_entity_team": "Reclame este equipo y empiece a gestionar los horarios de forma colectiva",
|
||||
"insights_all_org_filter": "Todas las aplicaciones",
|
||||
"insights_team_filter": "Equipo: {{teamName}}",
|
||||
"insights_user_filter": "Usuario: {{userName}}",
|
||||
|
||||
@@ -225,6 +225,7 @@
|
||||
"create_account": "Créer un compte",
|
||||
"confirm_password": "Confirmer le mot de passe",
|
||||
"confirm_auth_change": "Cela changera la façon dont vous vous connectez",
|
||||
"confirm_auth_email_change": "La modification de l'adresse e-mail déconnectera votre méthode d'authentification actuelle pour vous connecter à Cal.com. Nous vous demanderons de vérifier votre nouvelle adresse e-mail. Ensuite, vous serez déconnecté et devrez utiliser votre nouvelle adresse e-mail pour vous connecter après avoir défini votre mot de passe en suivant les instructions qui seront envoyées à votre adresse e-mail.",
|
||||
"reset_your_password": "Définissez votre nouveau mot de passe avec les instructions envoyées à votre adresse e-mail.",
|
||||
"email_change": "Reconnectez-vous avec votre nouvelle adresse e-mail et votre nouveau mot de passe.",
|
||||
"create_your_account": "Créez votre compte",
|
||||
@@ -255,6 +256,8 @@
|
||||
"available_apps": "Applications disponibles",
|
||||
"available_apps_lower_case": "Applications disponibles",
|
||||
"available_apps_desc": "Aucune application installée. Consultez les applications populaires ci-dessous et découvrez-en plus dans notre <1>App Store</1>.",
|
||||
"fixed_host_helper": "Ajouter toute personne qui doit assister à l'événement. <1>En savoir plus</1>",
|
||||
"round_robin_helper": "Les membres du groupe se relaient et une seule personne se présentera à l'événement.",
|
||||
"check_email_reset_password": "Vérifiez vos e-mails. Nous vous avons envoyé un lien pour réinitialiser votre mot de passe.",
|
||||
"finish": "Terminer",
|
||||
"organization_general_description": "Gérez les paramètres de langue et de fuseau horaire de votre équipe.",
|
||||
@@ -404,6 +407,8 @@
|
||||
"allow_dynamic_booking_tooltip": "Les liens de réservation de groupe peuvent être créés dynamiquement en ajoutant plusieurs noms d'utilisateur séparés par un « + ». Exemple : « {{appName}}/bailey+peer ».",
|
||||
"allow_dynamic_booking": "Autoriser les participants à prendre rendez-vous avec vous via des réservations de groupe dynamiques",
|
||||
"dynamic_booking": "Liens de groupe dynamiques",
|
||||
"allow_seo_indexing": "Autorisez les moteurs de recherche à accéder à votre contenu public.",
|
||||
"seo_indexing": "Autoriser l'indexation SEO",
|
||||
"email": "E-mail",
|
||||
"email_placeholder": "jdoe@exemple.com",
|
||||
"full_name": "Nom complet",
|
||||
@@ -557,6 +562,7 @@
|
||||
"leave": "Quitter",
|
||||
"profile": "Profil",
|
||||
"my_team_url": "Lien de mon équipe",
|
||||
"my_teams": "Mes équipes",
|
||||
"team_name": "Nom de l'équipe",
|
||||
"your_team_name": "Nom de votre équipe",
|
||||
"team_updated_successfully": "Équipe mise à jour avec succès",
|
||||
@@ -604,7 +610,7 @@
|
||||
"disband_org_confirmation_message": "Voulez-vous vraiment dissoudre cette organisation ? Toutes les équipes et tous les membres seront supprimés.",
|
||||
"remove_member_confirmation_message": "Voulez-vous vraiment supprimer ce membre de l'équipe ?",
|
||||
"confirm_disband_team": "Oui, dissoudre l'équipe",
|
||||
"confirm_remove_member": "Oui, retirer le membre",
|
||||
"confirm_remove_member": "Oui, supprimer le membre",
|
||||
"remove_member": "Supprimer le membre",
|
||||
"manage_your_team": "Gérez votre équipe",
|
||||
"no_teams": "Vous n'avez pas encore d'équipe.",
|
||||
@@ -866,6 +872,7 @@
|
||||
"account_managed_by_identity_provider_description": "Pour modifier votre adresse e-mail et/ou votre mot de passe, activez l'authentification à deux facteurs et plus, veuillez consulter les paramètres de votre compte {{provider}}.",
|
||||
"signin_with_google": "Se connecter avec Google",
|
||||
"signin_with_saml": "Se connecter avec SAML",
|
||||
"signin_with_saml_oidc": "Se connecter avec SAML/OIDC",
|
||||
"you_will_need_to_generate": "Vous devrez générer un token d'accès à partir de votre ancien outil de planification.",
|
||||
"import": "Importer",
|
||||
"import_from": "Importer depuis",
|
||||
@@ -923,7 +930,7 @@
|
||||
"verify_wallet": "Vérifier le portefeuille",
|
||||
"create_events_on": "Créer des événements dans :",
|
||||
"enterprise_license": "Il s'agit d'une fonctionnalité d'entreprise",
|
||||
"enterprise_license_description": "Pour activer cette fonctionnalité, demandez à un administrateur d'accéder à {{setupUrl}} pour saisir une clé de licence. Si une clé de licence est déjà en place, veuillez contacter {{supportMail}} pour obtenir de l'aide.",
|
||||
"enterprise_license_description": "Pour activer cette fonctionnalité, demandez à un administrateur d'accéder à <2>/auth/setup</2> pour saisir une clé de licence. Si une clé de licence est déjà en place, veuillez contacter <5>{{SUPPORT_MAIL_ADDRESS}}</5> pour obtenir de l'aide.",
|
||||
"enterprise_license_development": "Vous pouvez tester cette fonctionnalité en mode développement. Pour une utilisation en production, veuillez demander à un administrateur d'aller à <2>/auth/setup</2> pour entrer une clé de licence.",
|
||||
"missing_license": "Licence manquante",
|
||||
"signup_requires": "Licence commerciale requise",
|
||||
@@ -1259,6 +1266,7 @@
|
||||
"error_updating_settings": "Erreur lors de la mise à jour des paramètres",
|
||||
"personal_cal_url": "Mon lien {{appName}} personnel",
|
||||
"bio_hint": "Quelques mots à propos de vous. Ces informations apparaîtront sur votre page publique.",
|
||||
"user_has_no_bio": "Cet utilisateur n'a pas encore ajouté de description.",
|
||||
"delete_account_modal_title": "Supprimer le compte",
|
||||
"confirm_delete_account_modal": "Voulez-vous vraiment supprimer votre compte {{appName}} ?",
|
||||
"delete_my_account": "Supprimer mon compte",
|
||||
@@ -1847,6 +1855,8 @@
|
||||
"insights_no_data_found_for_filter": "Aucune donnée trouvée pour le filtre ou les dates sélectionnés.",
|
||||
"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",
|
||||
"something_went_wrong_on_our_end": "Quelque chose s'est mal passé de notre côté. Contactez notre équipe de support, et nous le réparerons immédiatement.",
|
||||
"please_provide_following_text_to_suppport": "Veuillez fournir le texte suivant lorsque vous contactez le support pour mieux vous aider",
|
||||
"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": "Terminez votre réservation",
|
||||
"complete_your_booking_subject": "Terminez votre réservation : {{title}} le {{date}}",
|
||||
@@ -1896,6 +1906,7 @@
|
||||
"first_event_type_webhook_description": "Créez votre premier webhook pour ce type d'événement",
|
||||
"install_app_on": "Installer l’application sur",
|
||||
"create_for": "Créer pour",
|
||||
"currency": "Devise",
|
||||
"setup_organization": "Configurer une organisation",
|
||||
"organization_banner_description": "Créez un environnement où vos équipes peuvent créer des applications partagées, des workflows et des types d'événements avec une planification round-robin et collective.",
|
||||
"organization_banner_title": "Gérer les organisations avec plusieurs équipes",
|
||||
@@ -1972,11 +1983,28 @@
|
||||
"org_team_names_example_5": "p. ex. Équipe d'analyse de données",
|
||||
"org_max_team_warnings": "Vous pourrez ajouter plus d'équipes plus tard.",
|
||||
"what_is_this_meeting_about": "En quoi consiste ce rendez-vous ?",
|
||||
"add_to_team": "Ajouter à l'équipe",
|
||||
"remove_users_from_org": "Supprimer des utilisateurs de l'organisation",
|
||||
"remove_users_from_org_confirm": "Voulez-vous vraiment supprimer {{userCount}} utilisateurs de cette organisation ?",
|
||||
"user_has_no_schedules": "Cet utilisateur n'a pas encore configuré de planning",
|
||||
"user_isnt_in_any_teams": "Cet utilisateur n'est dans aucune équipe",
|
||||
"requires_confirmation_mandatory": "Les messages ne peuvent être envoyés aux participants que lorsque le type d'événement nécessite une confirmation.",
|
||||
"kyc_verification_information": "Pour garantir la sécurité, vous devez vérifier votre {{teamOrAccount}} avant d'envoyer des messages aux participants. Veuillez nous contacter à <a>{{supportEmail}}</a> et fournir les informations suivantes :",
|
||||
"kyc_verification_documents": "<ul><li>Votre {{teamOrUser}}</li><li>Pour les entreprises : Joignez votre document de vérification d'entreprise</li><li>Pour les particuliers : Joignez une pièce d'identité</li></ul>",
|
||||
"verify_team_or_account": "Vérifier {{teamOrAccount}}",
|
||||
"verify_account": "Vérifier le compte",
|
||||
"kyc_verification": "Vérification KYC",
|
||||
"organizations": "Organisations",
|
||||
"org_admin_other_teams": "Autres équipes",
|
||||
"org_admin_other_teams_description": "Ici, vous pouvez voir les équipes au sein de votre organisation dont vous ne faites pas partie. Vous pouvez vous y ajouter si nécessaire.",
|
||||
"no_other_teams_found": "Aucune autre équipe trouvée",
|
||||
"no_other_teams_found_description": "Il n'y a pas d'autres équipes dans cette organisation.",
|
||||
"attendee_first_name_variable": "Prénom du participant",
|
||||
"attendee_last_name_variable": "Nom du participant",
|
||||
"me": "Moi",
|
||||
"verify_team_tooltip": "Vérifiez votre équipe pour activer l'envoi de messages aux participants",
|
||||
"member_removed": "Membre supprimé",
|
||||
"my_availability": "Mes disponibilités",
|
||||
"team_availability": "Disponibilités de l'équipe",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Ajoutez vos nouvelles chaînes ci-dessus ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -11,15 +11,15 @@
|
||||
"calcom_explained_new_user": "סיים להגדיר את החשבון של {{appName}}! אתה רק מספר צעדים מפתרון כל בעיות התזמון שלך.",
|
||||
"have_any_questions": "יש לך שאלות? אנחנו כאן כדי לעזור.",
|
||||
"reset_password_subject": "{{appName}}: הנחיות לאיפוס סיסמה",
|
||||
"verify_email_subject": "{{appName}}: אמת את החשבון",
|
||||
"check_your_email": "בדוק את הדוא״ל שלך",
|
||||
"verify_email_page_body": "שלחנו מייל ל- {{email}}. חשוב שתאמת את כתובת הדוא״ל שלך כדי להבטיח את תעבורת הדוא״ל והיומן מ- {{appName}}.",
|
||||
"verify_email_banner_body": "יש לאמת את כתובת הדוא״ל כדי להבטיח תעבורת דוא\"ל ולוחות שנה מיטבית",
|
||||
"verify_email_email_header": "אמת את חשבון הדוא״ל שלך",
|
||||
"verify_email_email_button": "אמת דוא״ל",
|
||||
"verify_email_email_body": "אנא אמת את חשבון הדוא״ל שלך על ידי לחיצה על הכפתור מטה.",
|
||||
"verify_email_subject": "{{appName}}: יש לאמת את החשבון",
|
||||
"check_your_email": "בדוק/בדקי את הדוא״ל שלך",
|
||||
"verify_email_page_body": "שלחנו הודעת דוא״ל לכתובת {{email}}. חשוב שתאמת/י את כתובת הדוא״ל שלך כדי להבטיח שתוכל/י לקבל הודעות מ-{{appName}} לכתובת הדוא״ל וללוח השנה שלך.",
|
||||
"verify_email_banner_body": "יש לאמת את כתובת הדוא״ל כדי להבטיח שתוכל/י לקבל הודעות לכתובת הדוא״ל וללוח השנה בצורה הטובה ביותר",
|
||||
"verify_email_email_header": "יש לאמת את כתובת הדוא״ל שלך",
|
||||
"verify_email_email_button": "אימות כתובת דוא״ל",
|
||||
"verify_email_email_body": "נא לאמת את כתובת הדוא״ל שלך על ידי לחיצה על הכפתור להלן.",
|
||||
"verify_email_email_link_text": "הנה הקישור, למקרה שאינך אוהב/ת ללחוץ על כפתורים:",
|
||||
"email_sent": "מייל נשלח בהצלחה",
|
||||
"email_sent": "הודעת הדוא״ל נשלחה בהצלחה",
|
||||
"event_declined_subject": "נדחה: {{title}} ב- {{date}}",
|
||||
"event_cancelled_subject": "בוטל: {{title}} ב-{{date}}",
|
||||
"event_request_declined": "בקשת האירוע שלך נדחתה",
|
||||
@@ -129,8 +129,8 @@
|
||||
"team_upgrade_banner_description": "אנחנו מודים לך על כך שניסית את החבילה החדשה שלנו לצוותים. שמנו לב שהצוות שלך, \"{{teamName}}\", זקוק לשדרוג.",
|
||||
"upgrade_banner_action": "כאן משדרגים",
|
||||
"team_upgraded_successfully": "הצוות שלך שודרג בהצלחה!",
|
||||
"org_upgrade_banner_description": "אנחנו מודים לך על כך שניסית את החבילה החדשה שלנו לארגונים. שמנו לב שה-Organization שלך, \"{{teamName}}\", זקוק לשדרוג.",
|
||||
"org_upgraded_successfully": "השדרוג של הארגון שלך בוצע בהצלחה!",
|
||||
"org_upgrade_banner_description": "אנחנו מודים לך על כך שניסית את חבילת Organization החדשה שלנו. שמנו לב שה-Organization שלך, ״{{teamName}}״, זקוק לשדרוג.",
|
||||
"org_upgraded_successfully": "ה-Organization שלך שודרג בהצלחה!",
|
||||
"use_link_to_reset_password": "נא להשתמש בקישור הבא כדי לאפס את הסיסמה",
|
||||
"hey_there": "שלום,",
|
||||
"forgot_your_password_calcom": "שכחתה את הסיסמה? - {{appName}}",
|
||||
@@ -205,7 +205,7 @@
|
||||
"page_doesnt_exist": "דף זה אינו קיים.",
|
||||
"check_spelling_mistakes_or_go_back": "ודא כי שאין שגיאות איות או חזור/י לדף הקודם.",
|
||||
"404_page_not_found": "404: לא ניתן למצוא את הדף הזה.",
|
||||
"booker_event_not_found": "לא מצאנו את הארוע שניסית להזמין.",
|
||||
"booker_event_not_found": "לא מצאנו את האירוע שניסית להזמין.",
|
||||
"getting_started": "תחילת העבודה",
|
||||
"15min_meeting": "פגישה של 15 דקות",
|
||||
"30min_meeting": "פגישה של 30 דקות",
|
||||
@@ -248,7 +248,7 @@
|
||||
"organization_general_description": "ניהול הגדרות השפה ואזור הזמן של הצוות",
|
||||
"few_sentences_about_yourself": "מספר משפטים אודותיך. המידע הזה יופיע בדף ה-URL האישי שלך.",
|
||||
"nearly_there": "כמעט סיימנו!",
|
||||
"nearly_there_instructions": "דבר אחרון: תיאור קצר אודותיך בתוספת תמונה ממש עוזרים להשיג הזמנות ומאפשרים לאנשים לדעת עם מי הם עומדים להיפגש.",
|
||||
"nearly_there_instructions": "דבר אחרון: תיאור קצר אודותיך/ייך בתוספת תמונה עוזרים מאוד להשיג הזמנות ומאפשרים לאנשים לדעת עם מי הם עומדים להיפגש.",
|
||||
"set_availability_instructions": "הגדר טווחי זמן שבהם אתה זמין באופן קבוע. ניתן יהיה ליצור טווחי זמן נוספים מאוחר יותר ולהקצות אותם ללוחות שנה אחרים.",
|
||||
"set_availability": "ציין את הזמינות שלך",
|
||||
"continue_without_calendar": "להמשיך בלי לוח שנה",
|
||||
@@ -306,11 +306,11 @@
|
||||
"password_has_been_reset_login": "הסיסמה שלך אופסה. עכשיו ניתן להיכנס עם הסיסמה החדשה.",
|
||||
"layout": "פריסה",
|
||||
"bookerlayout_default_title": "תצוגת ברירת מחדל",
|
||||
"bookerlayout_description": "אתה יכול לבחור כמה והמתזמנים שלך יכולים לשנות תצוגות.",
|
||||
"bookerlayout_user_settings_title": "פריסת תזמון",
|
||||
"bookerlayout_user_settings_description": "אפשר לבחור מזמינים מרובים והמזמינים יכולים לשנות תצוגות. ניתן לעקוף זאת על בסיס כל אירוע לחוד.",
|
||||
"bookerlayout_description": "אפשר לבחור מספר אפשרויות תצוגה והמזמינים שלך יוכלו להחליף ביניהן.",
|
||||
"bookerlayout_user_settings_title": "פריסת הזמנות",
|
||||
"bookerlayout_user_settings_description": "אפשר לבחור אפשרויות תצוגה מרובות והמזמינים יוכלו להחליף ביניהן. ניתן לעקוף זאת עבור כל אירוע נפרד.",
|
||||
"bookerlayout_month_view": "חודש",
|
||||
"bookerlayout_week_view": "אחת לשבוע",
|
||||
"bookerlayout_week_view": "שבועית",
|
||||
"bookerlayout_column_view": "עמודה",
|
||||
"bookerlayout_error_min_one_enabled": "יש להפעיל לפחות פריסה אחת.",
|
||||
"bookerlayout_error_default_not_enabled": "הפריסה שבחרת כתצוגת ברירת המחדל לא שייכת לפריסות המופעלות.",
|
||||
@@ -328,7 +328,7 @@
|
||||
"error_end_time_next_day": "שעת הסיום לא יכולה לחרוג מ-24 שעות",
|
||||
"back_to_bookings": "בחזרה להזמנות",
|
||||
"free_to_pick_another_event_type": "ניתן לבחור אירוע אחר בכל עת.",
|
||||
"cancelled": "בוטל",
|
||||
"cancelled": "בוטלה",
|
||||
"cancellation_successful": "פעולת הביטול בוצעה בהצלחה",
|
||||
"really_cancel_booking": "בטוח שברצונך לבטל את ההזמנה?",
|
||||
"cannot_cancel_booking": "לא ניתן לבטל את ההזמנה הזו",
|
||||
@@ -403,7 +403,7 @@
|
||||
"recording_ready": "הקישור להורדת ההקלטה מוכן",
|
||||
"booking_created": "ההזמנה נוצרה",
|
||||
"booking_rejected": "ההזמנה נדחתה",
|
||||
"booking_requested": "ההזמנה התבקשה",
|
||||
"booking_requested": "התקבלה בקשת הזמנה",
|
||||
"meeting_ended": "הפגישה הסתיימה",
|
||||
"form_submitted": "הטופס נשלח",
|
||||
"event_triggers": "גורמים מפעילים של אירועים",
|
||||
@@ -413,8 +413,8 @@
|
||||
"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 שציינת ובזמן אמת, כאשר נקבע מועד לאירוע זה או כאשר הוא מבוטל.",
|
||||
"receive_cal_meeting_data": "קבל/י נתוני פגישות בזמן אמת מ-{{appName}} בכתובת URL שציינת, כאשר נקבע מועד לאירוע או כאשר אירוע מבוטל.",
|
||||
"receive_cal_event_meeting_data": "קבל/י נתוני פגישות בזמן אמת מ-{{appName}} בכתובת URL שציינת, כאשר נקבע מועד לאירוע הזה או כאשר הוא מבוטל.",
|
||||
"responsive_fullscreen_iframe": "iframe רספונסיבי על מסך מלא",
|
||||
"loading": "טוען...",
|
||||
"deleting": "מתבצעת מחיקה...",
|
||||
@@ -477,7 +477,7 @@
|
||||
"max_limit_allowed_hint": "חייב להיות באורך של עד {{limit}} תווים",
|
||||
"invalid_password_hint": "הסיסמה חייבת להיות באורך של {{passwordLength}} תווים לפחות ולכלול לפחות ספרה אחת ושילוב של אותיות רישיות וקטנות",
|
||||
"incorrect_password": "הסיסמה שגויה.",
|
||||
"incorrect_email_password": "כתובת הדוא\"ל או הסיסמה שגויות.",
|
||||
"incorrect_email_password": "כתובת הדוא״ל או הסיסמה שגויות.",
|
||||
"use_setting": "השתמש בהגדרה",
|
||||
"am_pm": "לפנה\"צ/אחה\"צ",
|
||||
"time_options": "אפשרויות זמן",
|
||||
@@ -586,8 +586,8 @@
|
||||
"confirm_all": "לאשר הכל",
|
||||
"disband_team": "פיזור הצוות",
|
||||
"disband_team_confirmation_message": "בטוח שברצונך לפזר את הצוות הזה? כל מי ששיתפת איתו את הקישור לצוות לא יוכל להזמין יותר באמצעותו.",
|
||||
"disband_org": "פיזור הארגון",
|
||||
"disband_org_confirmation_message": "בטוח שברצונך לפזר את הארגון הזה? כל הצוותים והחברים יימחקו.",
|
||||
"disband_org": "פירוק Organization",
|
||||
"disband_org_confirmation_message": "בטוח/ה שברצונך לפרק את הארגון הזה? כל הצוותים והחברים יימחקו.",
|
||||
"remove_member_confirmation_message": "בטוח שברצונך להסיר חבר/ה זה/ו מהצוות?",
|
||||
"confirm_disband_team": "כן, לפזר את הצוות",
|
||||
"confirm_remove_member": "כן, להסיר את החבר/ה",
|
||||
@@ -699,7 +699,7 @@
|
||||
"create_team_to_get_started": "צור צוות כדי להתחיל",
|
||||
"teams": "צוותים",
|
||||
"team": "צוות",
|
||||
"organization": "Organization",
|
||||
"organization": "ארגון",
|
||||
"team_billing": "חיוב צוותים",
|
||||
"team_billing_description": "ניהול החיוב עבור הצוות",
|
||||
"upgrade_to_flexible_pro_title": "שינינו את החיוב בעבור צוותים",
|
||||
@@ -867,23 +867,23 @@
|
||||
"no_category_apps": "אין אפליקציות בקטגוריה {{category}}",
|
||||
"all_apps": "כל האפליקציות",
|
||||
"no_category_apps_description_calendar": "הוסף/י אפליקציית לוח שנה כדי לבדוק אם יש התנגשויות על מנת למנוע כפל הזמנות",
|
||||
"no_category_apps_description_conferencing": "נסה/י להוסיף אפליקציית שיחות ועידה לצורך שיחות וידאו עם הלקוחות",
|
||||
"no_category_apps_description_conferencing": "נסה/י להוסיף אפליקציית שיחות ועידה לצורך ביצוע שיחות וידאו עם הלקוחות",
|
||||
"no_category_apps_description_payment": "הוסף/י אפליקציית תשלומים על מנת להפוך את ביצוע העסקאות בינך לבין הלקוחות לפשוט יותר",
|
||||
"no_category_apps_description_analytics": "להוסיף אפליקציה לניתוח נתונים עבור דפי ההזמנות שלך",
|
||||
"no_category_apps_description_automation": "להוסיף אפליקציית אוטומציה שברצונך להשתמש בה",
|
||||
"no_category_apps_description_other": "הוסף/הוסיפי אפליקציה מכל סוג אחר לביצוע פעולות שונות",
|
||||
"no_category_apps_description_web3": "הוסף אפליקצית web3 לעמודי תזמון הפגישות שלך",
|
||||
"no_category_apps_description_messaging": "הוסף/י אפליקציה להעברת הודעות כדי להגדיר עדכונים ותזכורות בהתאמה אישית",
|
||||
"no_category_apps_description_messaging": "הוסף/הוסיפי אפליקציית מסרים מידיים כדי להגדיר התראות ותזכורות בהתאמה אישית",
|
||||
"no_category_apps_description_crm": "הוסף/י אפליקציית CRM כדי לנהל מעקב אחר האנשים שנפגשת איתם",
|
||||
"installed_app_calendar_description": "הגדר/הגדירח את לוחות השנה כדי לבדוק אם יש התנגשויות על מנת למנוע כפל הזמנות.",
|
||||
"installed_app_payment_description": "הגדר/הגידירי את השירותים לעיבוד תשלומים שבהם יש להשתמש לחיוב הלקוחות.",
|
||||
"installed_app_analytics_description": "הגדרת האפליקציות לניתוח נתונים שבהן יש להשתמש עבור דפי ההזמנות שלך",
|
||||
"installed_app_other_description": "כל האפליקציות המותקנות שלך מקטגוריות אחרות.",
|
||||
"installed_app_conferencing_description": "הגדר/י את האפליקציות לשיחות ועידה שבהן ברצונך להשתמש",
|
||||
"installed_app_conferencing_description": "הגדר/הגדירי את האפליקציות לשיחות ועידה שבהן ברצונך להשתמש",
|
||||
"installed_app_automation_description": "הגדרת אפליקציות האוטומציה שבהן ברצונך להשתמש",
|
||||
"installed_app_web3_description": "הגדר באיזה אפליקציות web3 להשתמש בעמודי תזמון הפגישות שלך",
|
||||
"installed_app_messaging_description": "הגדר/י את האפליקציות להעברת הודעות שבהן ברצונך להשתמש להגדרת עדכונים ותזכורות",
|
||||
"installed_app_crm_description": "הגדר/י את אפליקציות ה-CRM שבהן ברצונך להשתמש לניהול מעקב אחר האנשים שנפגשת איתם",
|
||||
"installed_app_messaging_description": "הגדר/הגדירי את אפליקציות המסרים המידיים שבהן ברצונך להשתמש להגדרת עדכונים ותזכורות",
|
||||
"installed_app_crm_description": "הגדר/הגדירי את אפליקציות ה-CRM שבהן ברצונך להשתמש לניהול מעקב אחר האנשים שנפגשת איתם",
|
||||
"analytics": "ניתוח נתונים",
|
||||
"empty_installed_apps_headline": "אין אפליקציות מותקנות",
|
||||
"empty_installed_apps_description": "יישומים מאפשרים לך לשפר את תהליכי העבודה שלך ואת פשטות ניהול התזמונים שלך משמעותית.",
|
||||
@@ -909,7 +909,7 @@
|
||||
"create_events_on": "ליצור אירועים ב-",
|
||||
"enterprise_license": "תכונה זו זמינה רק במינוי Enterprise",
|
||||
"enterprise_license_description": "כדי להפעיל את יכולת זו, בקש ממנהל לגשת אל הקישור {{setupUrl}} והקלדת הרישיון. אם כבר יש רישיון מוגדר, צור קשר עם {{supportMail}} לעזרה.",
|
||||
"enterprise_license_development": "ניתן לבדוק את התכונה הזו בשלב פיתוח. לשימוש בשלב הייצור, מנהל/ת מערכת צריך/ה לעבור אל <2>/auth/setup</2> ולהזין מפתח רישיון.",
|
||||
"enterprise_license_development": "ניתן לבדוק את התכונה הזו במצב פיתוח. לשימוש מצב הייצור, מנהל/ת מערכת צריך/ה לעבור אל <2>/auth/setup</2> ולהזין מפתח רישיון.",
|
||||
"missing_license": "חסר רישיון",
|
||||
"signup_requires": "נדרש רישיון לשימוש מסחרי",
|
||||
"signup_requires_description": "בשלב זה, {{companyName}} אינה מציעה גרסת קוד פתוח חינמית של דף ההרשמה. לקבלת גישה מלאה לרכיבי ההרשמה, תצטרך לקנות רישיון לשימוש מסחרי. לצרכים אישיים אנו ממליצים על Prisma Data Platform או כל ממשק Postgres אחר ליצירת חשבונות.",
|
||||
@@ -1003,7 +1003,7 @@
|
||||
"user_impersonation_description": "מצב זה מאפשר לצוות התמיכה שלנו להתחבר באופן זמני לחשבונך כדי שנוכל לפתור במהירות את הבעיות שתדווח/י לנו עליהם.",
|
||||
"team_impersonation_description": "מאפשר לבעלים של הצוות/מנהלים להיכנס זמנית בשמך.",
|
||||
"make_team_private": "להגדיר את הצוות כפרטי",
|
||||
"make_team_private_description": "כשההגדרה הזו מופעלת, חברי הצוות לא יוכלו לראות חברי צוות אחרים.",
|
||||
"make_team_private_description": "כשההגדרה הזו מופעלת, חברי הצוות שלך לא יוכלו לראות חברי צוות אחרים.",
|
||||
"you_cannot_see_team_members": "אין לך אפשרות לראות את כל חברי הצוות של צוות פרטי.",
|
||||
"allow_booker_to_select_duration": "אפשר למזמין לבחור את משך הזמן",
|
||||
"impersonate_user_tip": "כל השימושים בתכונה זו נבדקים.",
|
||||
@@ -1072,7 +1072,7 @@
|
||||
"event_location": "מיקום האירוע",
|
||||
"reschedule_optional": "הסיבה לשינוי המועד (לא חובה)",
|
||||
"reschedule_placeholder": "אפשר לאחרים לדעת מדוע עליך לשנות את המועד",
|
||||
"event_cancelled": "אירוע זה מבוטל",
|
||||
"event_cancelled": "האירוע בוטל",
|
||||
"emailed_information_about_cancelled_event": "שלחנו לך ולשאר המשתתפים הודעת דוא״ל כדי ליידע אותם על כך.",
|
||||
"this_input_will_shown_booking_this_event": "הקלט יוצג בעת הזמנת אירוע זה",
|
||||
"meeting_url_in_conformation_email": "כתובת ה-URL של הפגישה נמצאת בהודעת הדוא״ל שנשלחה לאישור הפגישה",
|
||||
@@ -1306,7 +1306,7 @@
|
||||
"connect_analytics_apps": "קישור אפליקציות ניתוח נתונים",
|
||||
"connect_other_apps": "חיבור אפליקציות אחרות",
|
||||
"connect_web3_apps": "חבר אפליקציות web3",
|
||||
"connect_messaging_apps": "קישור אפליקציות להעברת הודעות",
|
||||
"connect_messaging_apps": "קישור אפליקציות מסרים מידיים",
|
||||
"connect_crm_apps": "קישור אפליקציות CRM",
|
||||
"current_step_of_total": "שלב {{currentStep}} מתוך {{maxSteps}}",
|
||||
"add_variable": "להוסיף משתנה",
|
||||
@@ -1336,7 +1336,7 @@
|
||||
"event_one": "אירוע",
|
||||
"event_other": "אירועים",
|
||||
"profile_team_description": "ניהול ההגדרות של פרופיל הצוות",
|
||||
"profile_org_description": "ניהול הגדרות עבור הפרופיל שלך בארגון",
|
||||
"profile_org_description": "ניהול הגדרות עבור פרופיל הארגון שלך",
|
||||
"members_team_description": "משתמשים שמשתייכים לקבוצה",
|
||||
"organization_description": "ניהול מנהלי המערכת והחברים בארגון",
|
||||
"team_url": "כתובת ה-URL של הצוות",
|
||||
@@ -1484,17 +1484,17 @@
|
||||
"yearly": "אחת לשנה",
|
||||
"checkout": "תשלום",
|
||||
"your_team_disbanded_successfully": "פיזור הצוות שלך בוצע בהצלחה",
|
||||
"your_org_disbanded_successfully": "פיזור הארגון שלך בוצע בהצלחה",
|
||||
"your_org_disbanded_successfully": "פירוק הארגון שלך בוצע בהצלחה",
|
||||
"error_creating_team": "אירעה שגיאה במהלך יצירת הצוות",
|
||||
"you": "את/ה",
|
||||
"resend_email": "שליחה חוזרת של הדוא\"ל",
|
||||
"resend_email": "לשלוח שוב את הדוא״ל",
|
||||
"member_already_invited": "החבר כבר הוזמן",
|
||||
"enter_email_or_username": "יש להזין כתובת דוא\"ל או שם משתמש",
|
||||
"team_name_taken": "השם הזה כבר תפוס",
|
||||
"must_enter_team_name": "יש להזין שם צוות",
|
||||
"team_url_required": "יש להזין כתובת URL של הצוות",
|
||||
"url_taken": "כתובת ה-URL הזו כבר תפוסה",
|
||||
"problem_registering_domain": "היתה בעיה ברישום תת-הדומיין; אפשר לנסות שוב או לפנות למנהל/ת מערכת",
|
||||
"problem_registering_domain": "הייתה בעיה ברישום תת-הדומיין; אפשר לנסות שוב או לפנות למנהל/ת מערכת",
|
||||
"team_publish": "פרסום צוות",
|
||||
"number_text_notifications": "מספר טלפון (להודעות טקסט)",
|
||||
"attendee_email_variable": "כתובת הדוא\"ל של המשתתף",
|
||||
@@ -1519,7 +1519,7 @@
|
||||
"find_the_best_person": "למצוא את האדם הכי מתאים שגם זמין לפגישה, ולעבור בסבב דרך כל חברי הצוות.",
|
||||
"fixed_round_robin": "סבב קבוע",
|
||||
"add_one_fixed_attendee": "הוסף/י משתתף/ת קבוע/ה אחד/ת ועבור/י בסבב בין מספר משתתפים.",
|
||||
"calcom_is_better_with_team": "{{appName}} טוב יותר לשימוש עם צוותים",
|
||||
"calcom_is_better_with_team": "{{appName}} טובה יותר לשימוש עם צוותים",
|
||||
"the_calcom_team": "הצוות של {{companyName}}",
|
||||
"add_your_team_members": "הוסף/י את חברי הצוות לסוגי האירועים שלך. השתמש/י בתזמון שיתופי כדי לכלול את כולם או מצא/י את האדם הכי מתאים בעזרת תזמון בסבב.",
|
||||
"booking_limit_reached": "הגעת להגבלת ההזמנות עבור סוג אירוע זה",
|
||||
@@ -1539,7 +1539,7 @@
|
||||
"navigate_installed_apps": "מעבר לאפליקציות המותקנות",
|
||||
"disabled_calendar": "אם התקנת לוח שנה אחר, ההזמנות החדשות יתווספו אליו. אם לא, קשר/י לוח שנה חדש כדי לא להחמיץ הזמנות חדשות.",
|
||||
"enable_apps": "הפעלת אפליקציות",
|
||||
"enable_apps_description": "הפעל/י אפליקציות שמשתמשים יכולים לשלב עם {{appName}}",
|
||||
"enable_apps_description": "הפעל/הפעילי אפליקציות שמשתמשים יוכלו לשלב עם {{appName}}",
|
||||
"purchase_license": "רכוש רישיון",
|
||||
"already_have_key": "כבר יש לי מפתח:",
|
||||
"already_have_key_suggestion": "אנא העתק את משתנה הסביבה CALCOM_LICENSE_KEY הקיים שלך לכאן.",
|
||||
@@ -1554,8 +1554,8 @@
|
||||
"no_available_apps_description": "ודא/י שיש אפליקציות בפריסה שלך בנתיב 'packages/app-store'",
|
||||
"no_apps": "אף אפליקציה לא מופעלת במופע הזה של Cal",
|
||||
"no_apps_configured": "עוד לא הוגדרה אף אפליקציה",
|
||||
"enable_in_settings": "ניתן להפעיל אפליקציות ב'הגדרות'",
|
||||
"please_contact_admin": "יש לפנות אל מנהל/ת המערכת",
|
||||
"enable_in_settings": "ניתן להפעיל אפליקציות ב״הגדרות״",
|
||||
"please_contact_admin": "יש לפנות למנהל/ת המערכת שלך",
|
||||
"apps_settings": "הגדרות אפליקציות",
|
||||
"fill_this_field": "נא מלא שדה זה",
|
||||
"options": "אפשרויות",
|
||||
@@ -1661,8 +1661,8 @@
|
||||
"email_user_cta": "צפה בהזמנה",
|
||||
"email_no_user_invite_heading": "הוזמנת להצטרף ל{{entity}} של {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} הזמין אותך להצטרף לצוות שלו ב- {{appName}}. {{appName}} הינה מתזמן זימונים שמאפשר לך ולצוות שלך לזמן פגישות בלי כל הפינג פונג במיילים.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} הזמין/ה אותך להצטרף ל-{{entity}} שלו/ה בשם '{{teamName}}' באפליקציה {{appName}}. אפליקציית {{appName}} היא כלי לקביעת מועדים לאירועים שמאפשר לך ול-{{entity}} שלך לתזמן פגישות בלי כל הפינג פונג במיילים.",
|
||||
"email_no_user_invite_steps_intro": "נדריך אותך במספר קטן של צעדים ותוכל/י להתחיל ליהנות מקביעת מועדים עם ה-{{entity}} שלך בלי בעיות.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} הזמין/ה אותך להצטרף ל-{{entity}} שלו/ה בשם ״{{teamName}}״ באפליקציה {{appName}}. אפליקציית {{appName}} היא כלי לקביעת מועדים לאירועים שמאפשר לך ול-{{entity}} שלך לתזמן פגישות בלי הצורך לנהל התכתבויות ארוכות בדוא״ל.",
|
||||
"email_no_user_invite_steps_intro": "נדריך אותך במספר קטן של צעדים ותוכל/י להתחיל ליהנות מקביעת מועדים עם ה-{{entity}} שלך במהירות ובלי בעיות.",
|
||||
"email_no_user_step_one": "בחר שם משתמש",
|
||||
"email_no_user_step_two": "קשר את לוח השנה שלך",
|
||||
"email_no_user_step_three": "הגדר את הזמינות שלך",
|
||||
@@ -1738,9 +1738,9 @@
|
||||
"spot_popular_event_types": "זהה ארועים פופולרים",
|
||||
"spot_popular_event_types_description": "צפה איזה ארועים מקבלים הכי הרבה גישות ותזמונים",
|
||||
"no_responses_yet": "אין עדיין תגובות",
|
||||
"no_routes_defined": "לא הוגדר אף נתיב",
|
||||
"no_routes_defined": "לא הוגדרו נתיבים",
|
||||
"this_will_be_the_placeholder": "זה יהיה הממלא מקום",
|
||||
"error_booking_event": "אירעה שגיאה בעת הזמנת האירוע, רענן/י את הדף ונסה/י שוב",
|
||||
"error_booking_event": "אירעה שגיאה בעת הזמנת האירוע. רענן/י את הדף ונסה/י שוב",
|
||||
"timeslot_missing_title": "לא נבחר חלון זמן",
|
||||
"timeslot_missing_description": "כדי להזמין את האירוע, יש לבחור חלון זמן.",
|
||||
"timeslot_missing_cta": "בחר/י חלון זמן",
|
||||
@@ -1809,7 +1809,7 @@
|
||||
"redirect_url_warning": "הוספת כתובת URL להפניה אוטומטית תגרום להשבתת הדף \"הפעולה הצליחה\". חשוב להוסיף את ההודעה \"ההזמנה אושרה בהצלחה'\"בדף המותאם אישית לציון שהפעולה הצליחה.",
|
||||
"event_trends": "מגמות ארוע",
|
||||
"clear_filters": "ניקוי המסננים",
|
||||
"clear": "נקה",
|
||||
"clear": "ניקוי",
|
||||
"hold": "החזקה",
|
||||
"on_booking_option": "גביית תשלום בעת ההזמנה",
|
||||
"hold_option": "חיוב דמי אי-הגעה",
|
||||
@@ -1878,41 +1878,41 @@
|
||||
"first_event_type_webhook_description": "צור/צרי את ה-Webhook הראשון שלך עבור סוג האירוע הזה",
|
||||
"install_app_on": "התקנת האפליקציה ב-",
|
||||
"create_for": "צור/צרי עבור",
|
||||
"setup_organization": "הגדרת ארגון",
|
||||
"organization_banner_description": "צור/י סביבות שבהן הצוותים שלך יכולים ליצור אפליקציות, תהליכי עבודה וסוגי אירועים משותפים, עם תכונות כמו סבב וקביעת מועדים שיתופית.",
|
||||
"setup_organization": "הגדרת Organization",
|
||||
"organization_banner_description": "צור/צרי סביבות שבהן הצוותים שלך יוכלו ליצור אפליקציות, תהליכי עבודה וסוגי אירועים משותפים, עם תכונות כמו סבב וקביעת מועדים שיתופית.",
|
||||
"organization_banner_title": "ניהול ארגונים עם צוותים מרובים",
|
||||
"set_up_your_organization": "הגדרת הארגון",
|
||||
"set_up_your_organization": "הגדרת הארגון שלך",
|
||||
"organizations_description": "ארגונים הם סביבות משותפות שבהן צוותים יכולים ליצור משאבים משותפים, כמו סוגי אירועים, אפליקציות, תהליכי עבודה ועוד.",
|
||||
"must_enter_organization_name": "יש להזין את שם הארגון",
|
||||
"must_enter_organization_admin_email": "יש להזין את כתובת הדוא\"ל של הארגון",
|
||||
"admin_email": "כתובת הדוא\"ל של הארגון",
|
||||
"must_enter_organization_name": "יש להזין שם ארגון",
|
||||
"must_enter_organization_admin_email": "יש להזין את כתובת הדוא״ל של הארגון",
|
||||
"admin_email": "כתובת הדוא״ל של הארגון",
|
||||
"admin_username": "שם המשתמש/ת המוגדר/ת כמנהל/ת מערכת",
|
||||
"organization_name": "שם הארגון",
|
||||
"organization_url": "כתובת ה-URL של הארגון",
|
||||
"organization_verify_header": "אימות כתובת הדוא\"ל של הארגון",
|
||||
"organization_verify_email_body": "השתמש/י בקוד הבא כדי לאמת את כתובת הדוא\"ל שלך לצורך המשך הגדרת הארגון.",
|
||||
"organization_verify_header": "אימות כתובת הדוא״ל של הארגון",
|
||||
"organization_verify_email_body": "השתמש/י בקוד שלהלן כדי לאמת את כתובת הדוא״ל שלך לצורך המשך הגדרת הארגון.",
|
||||
"additional_url_parameters": "פרמטרי URL נוספים",
|
||||
"about_your_organization": "מידע על הארגון",
|
||||
"about_your_organization_description": "ארגונים הם סביבות משותפות שבהן ניתן ליצור צוותים מרובים עם משאבים משותפים, כמו חברים, סוגי אירועים, אפליקציות, תהליכי עבודה ועוד.",
|
||||
"create_your_teams": "יצירת הצוותים שלך",
|
||||
"create_your_teams_description": "מוסיפים את חברי הצוות לארגון ומתחילים לקבוע מועדים לפגישות ביחד",
|
||||
"invite_organization_admins": "הזמנת מנהלי המערכת בארגון",
|
||||
"invite_organization_admins_description": "למנהלי המערכת האלה תהיה גישה לכל הצוותים בארגון. ניתן להוסיף לצוותים מנהלי מערכת וחברים מאוחר יותר.",
|
||||
"create_your_teams_description": "מוסיפים את חברי הצוות לארגון ומתחילים לקבוע מועדים ביחד",
|
||||
"invite_organization_admins": "הזמנת מנהלי המערכת של הארגון שלך",
|
||||
"invite_organization_admins_description": "למנהלי המערכת האלה תהיה גישה לכל הצוותים בארגון. ניתן יהיה להוסיף לצוותים מנהלי מערכת וחברים מאוחר יותר.",
|
||||
"set_a_password": "הגדרת סיסמה",
|
||||
"set_a_password_description": "פעולה זו תיצור חשבון משתמש חדש עם כתובת הדוא\"ל של הארגון ועם הסיסמה הזו.",
|
||||
"organization_logo": "הסמל של הארגון",
|
||||
"set_a_password_description": "פעולה זו תיצור חשבון משתמש חדש עם כתובת הדוא״ל של הארגון ועם הסיסמה הזו.",
|
||||
"organization_logo": "הלוגו של הארגון",
|
||||
"organization_about_description": "מספר משפטים אודות הארגון. הם יופיעו בדף הפרופיל הציבורי של הארגון.",
|
||||
"ill_do_this_later": "אעשה זאת מאוחר יותר",
|
||||
"verify_your_email": "אימות כתובת הדוא״ל",
|
||||
"enter_digit_code": "הזן/י את הקוד בן 6 הספרות ששלחנו לכתובת {{email}}",
|
||||
"verify_email_organization": "אמת/י את כתובת הדוא\"ל שלך כדי ליצור ארגון",
|
||||
"enter_digit_code": "הזן/הזיני את הקוד בן 6 הספרות ששלחנו לכתובת {{email}}",
|
||||
"verify_email_organization": "אמת/י את כתובת הדוא״ל שלך כדי ליצור ארגון",
|
||||
"code_provided_invalid": "הקוד לא תקין, נסה/י שוב",
|
||||
"email_already_used": "כתובת הדוא\"ל הזו כבר בשימוש",
|
||||
"email_already_used": "כתובת הדוא״ל הזו כבר נמצאת בשימוש",
|
||||
"organization_admin_invited_heading": "הוזמנת להצטרף אל {{orgName}}",
|
||||
"organization_admin_invited_body": "מצטרפים לצוות ב-{{orgName}} ומתחילים להתמקד בפגישות, ולא בפרטים הטכניים שלהן!",
|
||||
"duplicated_slugs_warning": "לא ניתן היה ליצור את הצוותים הבאים עקב רכיבי slug כפולים: {{slugs}}",
|
||||
"team_names_empty": "שמות צוותים לא יכולים להיות ריקים",
|
||||
"team_names_repeated": "אי אפשר לעשות שימוש חוזר בשמות צוותים",
|
||||
"team_names_repeated": "שמות הצוותים צריכים להיות ייחודיים",
|
||||
"user_belongs_organization": "המשתמש/ת שייך/ת לארגון",
|
||||
"org_no_teams_yet": "בארגון הזה עדיין אין צוותים",
|
||||
"org_no_teams_yet_description": "אם את/ה מנהל/ת מערכת, צור/צרי צוותים שיוצגו כאן.",
|
||||
@@ -1925,20 +1925,20 @@
|
||||
"messaging": "העברת הודעות",
|
||||
"sender_id_info": "השם או המספר שמוצגים כשולח של הודעת SMS (חלק מהמדינות אינן מתירות שימוש במזהי שולח אלפאנומריים)",
|
||||
"org_admins_can_create_new_teams": "רק מנהל/ת המערכת בארגון יכול/ה ליצור צוותים חדשים",
|
||||
"google_new_spam_policy": "מדיניות הספאם החדשה של Google עלולה לגרום לך שלא תקבל/י עדכונים בדוא\"ל ובלוח השנה לגבי הפגישה הזו.",
|
||||
"google_new_spam_policy": "מדיניות הספאם החדשה של Google עלולה לגרום לכך שלא תקבל/י עדכונים בדוא״ל ובלוח השנה לגבי הפגישה הזו.",
|
||||
"resolve": "פתרון",
|
||||
"no_organization_slug": "היתה שגיאה במהלך ניסיון ליצור צוותים עבור הארגון הזה. חסר רכיב slug של URL.",
|
||||
"no_organization_slug": "אירעה שגיאה במהלך הניסיון ליצור צוותים עבור הארגון הזה. חסר רכיב slug של URL.",
|
||||
"org_name": "שם הארגון",
|
||||
"org_url": "כתובת ה-URL של הארגון",
|
||||
"copy_link_org": "העתקת הקישור לארגון",
|
||||
"404_the_org": "הארגון",
|
||||
"404_the_team": "הצוות",
|
||||
"404_claim_entity_org": "תבע/י את תת-הדומיין עבור הארגון שלך",
|
||||
"404_claim_entity_team": "תבע/י את הצוות הזה והתחל/י לנהל קביעת מועדים ביחד",
|
||||
"404_claim_entity_org": "קבל/י את תת-הדומיין עבור הארגון שלך",
|
||||
"404_claim_entity_team": "הצטרף/י לצוות הזה והתחל/התחילי לנהל קביעת מועדים ביחד",
|
||||
"insights_all_org_filter": "כל האפליקציות",
|
||||
"insights_team_filter": "צוות: {{teamName}}",
|
||||
"insights_user_filter": "משתמש: {{userName}}",
|
||||
"insights_subtitle": "הצגת insights לגבי הזמנות מתוך האירועים שלך",
|
||||
"insights_subtitle": "הצגת insights לגבי ההזמנות באירועים שלך",
|
||||
"custom_plan": "חבילה בהתאמה אישית",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
"reset_password_subject": "{{appName}}: istruzioni per reimpostare la password",
|
||||
"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",
|
||||
"verify_email_page_body": "Abbiamo inviato un'e-mail a {{email}}. È importante verificare il tuo indirizzo e-mail per garantire la consegna delle e-mail e delle notifiche del calendario {{appName}}.",
|
||||
"verify_email_banner_body": "Verifica il tuo indirizzo e-mail per garantire la consegna delle e-mail e delle notifiche del calendario",
|
||||
"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",
|
||||
"verify_email_email_body": "Verifica il tuo indirizzo e-mail facendo clic sul pulsante qui sotto.",
|
||||
"verify_email_email_link_text": "Se non ti piacciono i pulsanti, puoi usare questo link:",
|
||||
"email_sent": "Email inviata",
|
||||
"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",
|
||||
@@ -197,7 +197,7 @@
|
||||
"blog": "Blog",
|
||||
"blog_description": "Leggi le nostre ultime notizie e articoli",
|
||||
"join_our_community": "Unisciti alla nostra community",
|
||||
"join_our_discord": "Unisciti al nostro Discord",
|
||||
"join_our_discord": "Partecipa al nostro Discord",
|
||||
"404_claim_entity_user": "Richiedi il tuo nome utente e pianifica eventi",
|
||||
"popular_pages": "Pagine popolari",
|
||||
"register_now": "Registrati ora",
|
||||
@@ -205,7 +205,7 @@
|
||||
"page_doesnt_exist": "Questa pagina non esiste.",
|
||||
"check_spelling_mistakes_or_go_back": "Controlla gli errori di ortografia o torna alla pagina precedente.",
|
||||
"404_page_not_found": "404: Questa pagina non è stata trovata.",
|
||||
"booker_event_not_found": "Non siamo riusciti a trovare l'evento che stai cercando di fissare.",
|
||||
"booker_event_not_found": "Non siamo riusciti a trovare l'evento che stai cercando di prenotare.",
|
||||
"getting_started": "Stiamo iniziando",
|
||||
"15min_meeting": "Meeting di 15 minuti",
|
||||
"30min_meeting": "Meeting di 30 minuti",
|
||||
@@ -245,10 +245,10 @@
|
||||
"available_apps": "Applicazioni disponibili",
|
||||
"check_email_reset_password": "Controlla la tua email. Ti abbiamo inviato un link per reimpostare la password.",
|
||||
"finish": "Fine",
|
||||
"organization_general_description": "Gestisci le impostazioni di lingua e fuso orario del tuo team",
|
||||
"organization_general_description": "Gestisci le impostazioni della lingua e del fuso orario per il tuo team",
|
||||
"few_sentences_about_yourself": "Alcune frasi su di te. Questo apparirà sulla tua pagina url personale.",
|
||||
"nearly_there": "Ci siamo quasi",
|
||||
"nearly_there_instructions": "Ultima cosa, un po' di informazioni su di te e una foto sono utili per ottenere prenotazioni e far sapere alle persone con chi stanno prenotando.",
|
||||
"nearly_there_instructions": "Infine: qualche informazione su di te e una foto sono utili per ottenere prenotazioni e per far capire alle persone con chi stanno prenotando.",
|
||||
"set_availability_instructions": "Definisci intervalli di tempo di quando sei disponibile su una base ricorrente. Puoi crearne di più in seguito e assegnarli a calendari diversi.",
|
||||
"set_availability": "Imposta la tua disponibilità",
|
||||
"continue_without_calendar": "Continua senza calendario",
|
||||
@@ -306,16 +306,16 @@
|
||||
"password_has_been_reset_login": "La tua password è stata reimpostata. Ora puoi accedere con la tua password appena creata.",
|
||||
"layout": "Layout",
|
||||
"bookerlayout_default_title": "Vista predefinita",
|
||||
"bookerlayout_description": "È possibile selezionarne vari e chi fissa gli appuntamenti può cambiare visualizzazione.",
|
||||
"bookerlayout_user_settings_title": "Layout di programmazione appuntamenti",
|
||||
"bookerlayout_user_settings_description": "È possibile selezionare più librerie e chi fissa gli appuntamenti può cambiare vista. Il tutto può poi essere cambiato in base agli eventi.",
|
||||
"bookerlayout_description": "Puoi selezionarne diverse e le persone che prenotano possono cambiare visualizzazione.",
|
||||
"bookerlayout_user_settings_title": "Layout prenotazioni",
|
||||
"bookerlayout_user_settings_description": "Puoi selezionarne diverse e le persone che prenotano possono cambiare visualizzazione. È possibile definire impostazioni specifiche per ciascun evento.",
|
||||
"bookerlayout_month_view": "Mese",
|
||||
"bookerlayout_week_view": "Settimanale",
|
||||
"bookerlayout_column_view": "Colonna",
|
||||
"bookerlayout_error_min_one_enabled": "Deve essere abilitato almeno un layout.",
|
||||
"bookerlayout_error_default_not_enabled": "Il layout selezionato come vista predefinita non fa parte dei layout abilitati.",
|
||||
"bookerlayout_error_default_not_enabled": "Il layout selezionato come vista predefinita non è tra quelli abilitati.",
|
||||
"bookerlayout_error_unknown_layout": "Il layout selezionato non è un layout valido.",
|
||||
"bookerlayout_override_global_settings": "Puoi gestirlo per tutti i tipi di eventi in <2>impostazioni / aspetto</2> o <6>sostituire solo per questo evento</6>.",
|
||||
"bookerlayout_override_global_settings": "Puoi definire questa impostazione per tutti i tipi di evento in <2>impostazioni / aspetto</2> oppure <6>solo per questo evento</6>.",
|
||||
"unexpected_error_try_again": "Si è verificato un errore imprevisto. Riprova.",
|
||||
"sunday_time_error": "Ora non valida la domenica",
|
||||
"monday_time_error": "Ora non valida il lunedì",
|
||||
@@ -357,7 +357,7 @@
|
||||
"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 cancellate compariranno qui.",
|
||||
"cancelled_bookings": "Le prenotazioni cancellate appariranno qui.",
|
||||
"unconfirmed_bookings": "Le tue prenotazioni non confermate appariranno qui.",
|
||||
"unconfirmed_bookings_tooltip": "Prenotazioni non confermate",
|
||||
"on": "su",
|
||||
@@ -774,7 +774,7 @@
|
||||
"cal_provide_huddle01_meeting_url": "{{appName}} fornirà un URL di riunione Huddle01 web3 video.",
|
||||
"cal_provide_teams_meeting_url": "{{appName}} fornirà un URL per la riunione MS Teams. NOTA: È NECESSARIO POSSEDERE UN ACCOUNT LAVORATIVO O SCOLASTICO",
|
||||
"require_payment": "Richiedi Pagamento",
|
||||
"you_need_to_add_a_name": "Aggiungere un nome",
|
||||
"you_need_to_add_a_name": "Indica un nome",
|
||||
"commission_per_transaction": "commissione per transazione",
|
||||
"event_type_updated_successfully_description": "Il tuo team è stato aggiornato con successo.",
|
||||
"hide_event_type": "Nascondi tipo evento",
|
||||
@@ -867,23 +867,23 @@
|
||||
"no_category_apps": "Nessuna app {{category}}",
|
||||
"all_apps": "Tutte le app",
|
||||
"no_category_apps_description_calendar": "Aggiungi un'app di calendario per controllare i conflitti ed evitare doppie prenotazioni",
|
||||
"no_category_apps_description_conferencing": "Prova ad aggiungere un'app di conferenza per effettuare le videochiamate con i clienti",
|
||||
"no_category_apps_description_conferencing": "Prova ad aggiungere un'app di conferenza per effettuare videochiamate con i clienti",
|
||||
"no_category_apps_description_payment": "Aggiungi un'app di pagamento per facilitare le transazioni con i clienti",
|
||||
"no_category_apps_description_analytics": "Aggiungi un'app di analisi per le tue pagine di prenotazione",
|
||||
"no_category_apps_description_automation": "Aggiungi un'app di automazione da usare",
|
||||
"no_category_apps_description_other": "Aggiungi qualsiasi altra app per fare altre attività",
|
||||
"no_category_apps_description_web3": "Aggiungi un'app Web3 per le tue pagine di prenotazione",
|
||||
"no_category_apps_description_messaging": "Aggiungi un'app di messaggistica per impostare notifiche e promemoria personalizzati",
|
||||
"no_category_apps_description_crm": "Aggiungi un'app CRM per tenere traccia degli utenti che hai incontrato",
|
||||
"no_category_apps_description_crm": "Aggiungi un'app CRM per tenere traccia delle persone che hai incontrato",
|
||||
"installed_app_calendar_description": "Imposta uno o più calendari per controllare i conflitti ed evitare doppie prenotazioni.",
|
||||
"installed_app_payment_description": "Configura quale servizio di elaborazione dei pagamenti usare per addebitare i clienti.",
|
||||
"installed_app_analytics_description": "Imposta quali app di analisi usare per le tue pagine di prenotazione",
|
||||
"installed_app_other_description": "Tutte le app installate appartenenti ad altre categorie.",
|
||||
"installed_app_conferencing_description": "Configura quali app di conferenza utilizzare",
|
||||
"installed_app_conferencing_description": "Scegli quali app di conferenza utilizzare",
|
||||
"installed_app_automation_description": "Imposta quali app di automazione usare",
|
||||
"installed_app_web3_description": "Imposta quali app Web3 usare per le tue pagine di prenotazione",
|
||||
"installed_app_messaging_description": "Configura le app di messaggistica da usare per impostare notifiche e promemoria personalizzati",
|
||||
"installed_app_crm_description": "Configura le app CRM per tenere traccia degli utenti che hai incontrato",
|
||||
"installed_app_messaging_description": "Scegli le app di messaggistica da usare per impostare notifiche e promemoria personalizzati",
|
||||
"installed_app_crm_description": "Scegli quali app CRM utilizzare per tenere traccia delle persone che hai incontrato",
|
||||
"analytics": "Analisi",
|
||||
"empty_installed_apps_headline": "Nessuna app installata",
|
||||
"empty_installed_apps_description": "Le app consentono di ottimizzare il flusso di lavoro e di migliorare significativamente la pianificazione.",
|
||||
@@ -1327,7 +1327,7 @@
|
||||
"download_responses_description": "Scarica tutte le risposte al tuo modulo in formato CSV.",
|
||||
"download": "Scarica",
|
||||
"download_recording": "Scarica registrazione",
|
||||
"recording_from_your_recent_call": "Una registrazione della tua recente chiamata su {{appName}} è pronta per il download",
|
||||
"recording_from_your_recent_call": "La registrazione della tua recente chiamata su {{appName}} è pronta per il download",
|
||||
"create_your_first_form": "Crea il tuo primo modulo",
|
||||
"create_your_first_form_description": "I Moduli di instradamento consentono di porre domande qualificanti agli utenti per indirizzarli a persone o eventi pertinenti.",
|
||||
"create_your_first_webhook": "Crea il tuo primo Webhook",
|
||||
@@ -1659,10 +1659,10 @@
|
||||
"delete_sso_configuration_confirmation_description": "Eliminare la configurazione {{connectionType}}? I membri del tuo team che utilizzano l'accesso {{connectionType}} non saranno più in grado di accedere a Cal.com.",
|
||||
"organizer_timezone": "Fuso orario organizzatore",
|
||||
"email_user_cta": "Visualizza invito",
|
||||
"email_no_user_invite_heading": "Hai ricevuto un invito a unirti a {{entity}} di {{appName}}",
|
||||
"email_no_user_invite_heading": "Hai ricevuto un invito a partecipare a un/una {{entity}} di {{appName}}",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} ti ha invitato a unirti al suo team su {{appName}}. {{appName}} è uno strumento di pianificazione di eventi che permette al tuo team di pianificare le riunioni senza scambiare decine di e-mail.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} ti ha invitato a unirti a {{entity}} `{{teamName}}` su {{appName}}. {{appName}} è uno strumento di pianificazione di eventi che permette a te e al tuo {{entity}} di pianificare le riunioni senza scambiare decine di e-mail.",
|
||||
"email_no_user_invite_steps_intro": "Ti assisteremo nei passaggi iniziali in modo che tu possa pianificare eventi per il tuo {{entity}} senza stress e in pochissimo tempo.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} ti ha invitato a partecipare al/alla {{entity}} `{{teamName}}` su {{appName}}. {{appName}} è uno strumento di pianificazione di eventi che permette a te e al tuo/tua {{entity}} di pianificare le riunioni senza scambiarvi decine di e-mail.",
|
||||
"email_no_user_invite_steps_intro": "Ti assisteremo nei passaggi iniziali e potrai rapidamente pianificare eventi per il/la {{entity}} senza fatica.",
|
||||
"email_no_user_step_one": "Scegli il tuo nome utente",
|
||||
"email_no_user_step_two": "Collega il tuo account di calendario",
|
||||
"email_no_user_step_three": "Imposta la tua disponibilità",
|
||||
@@ -1879,42 +1879,42 @@
|
||||
"install_app_on": "Installa l'app su",
|
||||
"create_for": "Crea per",
|
||||
"setup_organization": "Imposta un'organizzazione",
|
||||
"organization_banner_description": "Crea un ambiente dove i tuoi team potranno creare applicazioni condivise, flussi di lavoro e tipi di eventi con pianificazioni di gruppo e round robin.",
|
||||
"organization_banner_description": "Crea ambienti dove i tuoi team potranno creare e condividere applicazioni, flussi di lavoro e tipi di eventi con pianificazioni di gruppo e round robin.",
|
||||
"organization_banner_title": "Gestisci organizzazioni con più team",
|
||||
"set_up_your_organization": "Imposta la tua organizzazione",
|
||||
"organizations_description": "Le organizzazioni sono ambienti condivisi dove i team possono creare tipi di eventi, applicazioni, flussi di lavoro condivisi e tanto altro.",
|
||||
"must_enter_organization_name": "È necessario inserire un nome di organizzazione",
|
||||
"organizations_description": "Le organizzazioni sono ambienti condivisi dove i team possono creare e condividere tipi di eventi, applicazioni, flussi di lavoro e altro ancora.",
|
||||
"must_enter_organization_name": "È necessario inserire il nome dell'organizzazione",
|
||||
"must_enter_organization_admin_email": "È necessario inserire l'indirizzo e-mail dell'organizzazione",
|
||||
"admin_email": "Indirizzo e-mail dell'organizzazione",
|
||||
"admin_email": "Il tuo indirizzo e-mail nell'organizzazione",
|
||||
"admin_username": "Nome utente dell'amministratore",
|
||||
"organization_name": "Nome dell'organizzazione",
|
||||
"organization_url": "URL dell'organizzazione",
|
||||
"organization_verify_header": "Verifica l'e-mail della tua organizzazione",
|
||||
"organization_verify_email_body": "Usa il codice sottostante per verificare il tuo indirizzo e-mail e continuare a impostare l'organizzazione.",
|
||||
"additional_url_parameters": "Parametri URL aggiuntivi",
|
||||
"organization_verify_email_body": "Usa il codice sottostante per verificare il tuo indirizzo e-mail e proseguire la configurazione dell'organizzazione.",
|
||||
"additional_url_parameters": "Parametri aggiuntivi dell'URL",
|
||||
"about_your_organization": "Informazioni sulla tua organizzazione",
|
||||
"about_your_organization_description": "Le organizzazioni sono ambienti condivisi dove è possibile creare più team con membri, tipi di eventi, applicazioni, flussi di lavoro condivisi e tanto altro.",
|
||||
"about_your_organization_description": "Le organizzazioni sono ambienti condivisi dove è possibile creare dei team con condivisione di membri, tipi di eventi, applicazioni, flussi di lavoro e altro ancora.",
|
||||
"create_your_teams": "Crea i tuoi team",
|
||||
"create_your_teams_description": "Inizia la pianificazione condivisa aggiungendo i membri del tuo team alla tua organizzazione",
|
||||
"invite_organization_admins": "Invita gli amministratori dell'organizzazione",
|
||||
"invite_organization_admins_description": "Gli amministratori avranno l'accesso a tutti i team della tua organizzazione. Puoi aggiungere amministratori e membri dei team in un secondo tempo.",
|
||||
"invite_organization_admins_description": "Gli amministratori avranno accesso a tutti i team della tua organizzazione. Puoi aggiungere amministratori e membri dei team in un secondo tempo.",
|
||||
"set_a_password": "Imposta una password",
|
||||
"set_a_password_description": "Verrà creato un nuovo account utente con l'indirizzo e-mail della tua organizzazione e questa password.",
|
||||
"organization_logo": "Logo dell'organizzazione",
|
||||
"organization_about_description": "Qualche informazione sulla tua organizzazione. Le informazioni appariranno nella pagina di profilo dell'organizzazione.",
|
||||
"organization_about_description": "Qualche informazione sulla tua organizzazione. Le informazioni appariranno nella pagina del profilo pubblico dell'organizzazione.",
|
||||
"ill_do_this_later": "Lo farò più tardi",
|
||||
"verify_your_email": "Verifica l'e-mail",
|
||||
"enter_digit_code": "Immetti il codice di 6 cifre che ti è stato inviato a {{email}}",
|
||||
"verify_email_organization": "Verifica il tuo indirizzo email per creare un'organizzazione",
|
||||
"enter_digit_code": "Immetti il codice di 6 cifre che è stato inviato a {{email}}",
|
||||
"verify_email_organization": "Verifica il tuo indirizzo e-mail per creare un'organizzazione",
|
||||
"code_provided_invalid": "Il codice immesso non è valido, riprova",
|
||||
"email_already_used": "Indirizzo email già in uso",
|
||||
"email_already_used": "Indirizzo e-mail già in uso",
|
||||
"organization_admin_invited_heading": "Hai ricevuto un invito a unirti a {{orgName}}",
|
||||
"organization_admin_invited_body": "Unisciti al tuo team su {{orgName}} per concentrarti sulle riunioni, non sulla loro pianificazione!",
|
||||
"organization_admin_invited_body": "Unisciti al tuo team su {{orgName}}, per concentrarti sulle riunioni e non sulla loro pianificazione!",
|
||||
"duplicated_slugs_warning": "Non è stato possibile creare i seguenti team a causa di slug duplicati: {{slugs}}",
|
||||
"team_names_empty": "I nomi di team non possono essere vuoti",
|
||||
"team_names_repeated": "I nomi di team devono essere unici",
|
||||
"user_belongs_organization": "L'utente appartiene a un'organizzazione",
|
||||
"org_no_teams_yet": "Questa organizzazione non ha ancora nessun team",
|
||||
"org_no_teams_yet": "Questa organizzazione non ha ancora alcun team",
|
||||
"org_no_teams_yet_description": "Se sei un amministratore, assicurati di creare dei team da mostrare qui.",
|
||||
"set_up": "Imposta",
|
||||
"set_up_your_profile": "Imposta il tuo profilo",
|
||||
@@ -1927,7 +1927,7 @@
|
||||
"org_admins_can_create_new_teams": "Solo l'amministratore della tua organizzazione può creare nuovi team",
|
||||
"google_new_spam_policy": "Le nuove norme sullo spam di Google potrebbero impedirti di ricevere email e notifiche di calendario in merito a questa prenotazione.",
|
||||
"resolve": "Risolvi",
|
||||
"no_organization_slug": "Si è verificato un errore durante la creazione di team per questa organizzazione. Slug di URL mancante.",
|
||||
"no_organization_slug": "Si è verificato un errore durante la creazione dei team per questa organizzazione. Slug URL mancante.",
|
||||
"org_name": "Nome dell'organizzazione",
|
||||
"org_url": "URL dell'organizzazione",
|
||||
"copy_link_org": "Copia link all'organizzazione",
|
||||
@@ -1938,7 +1938,7 @@
|
||||
"insights_all_org_filter": "Tutte le app",
|
||||
"insights_team_filter": "Team: {{teamName}}",
|
||||
"insights_user_filter": "Utente: {{userName}}",
|
||||
"insights_subtitle": "Visualizza le informazioni sulle prenotazioni per tutti i tuoi eventi",
|
||||
"insights_subtitle": "Visualizza insight sulle prenotazioni per tutti i tuoi eventi",
|
||||
"custom_plan": "Piano personalizzato",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑↑ Aggiungi qui le tue nuove stringhe al di sopra di questa riga ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑"
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Aggiungi le tue nuove stringhe qui sopra ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -11,23 +11,23 @@
|
||||
"calcom_explained_new_user": "{{appName}} アカウントのセットアップを完了してください。あと数ステップでスケジューリングの問題をすべて解決できます。",
|
||||
"have_any_questions": "ご不明な点があれば、お気軽にお問い合わせください。",
|
||||
"reset_password_subject": "{{appName}}: パスワードのリセット手順",
|
||||
"verify_email_subject": "{{appName}}:アカウントを確認",
|
||||
"check_your_email": "メールを確認してください",
|
||||
"verify_email_page_body": "{{email}} にメールを送信しました。{{appName}} からのメール配信とカレンダー通知が確実に連携するようにするには、メールアドレスの確認が重要です。",
|
||||
"verify_email_banner_body": "メール配信とカレンダー通知が確実に連携するようにするには、メールアドレスを確認してください。",
|
||||
"verify_email_email_header": "メールアドレスの確認",
|
||||
"verify_email_email_button": "メールを確認",
|
||||
"verify_email_email_body": "以下のボタンをクリックして、メールアドレスを確認してください。",
|
||||
"verify_email_email_link_text": "ボタンをクリックしたくない場合は、こちらにリンクがあります:",
|
||||
"verify_email_subject": "{{appName}}: アカウントをご確認ください",
|
||||
"check_your_email": "メールをご確認ください",
|
||||
"verify_email_page_body": "{{email}} にメールを送信しました。{{appName}} からのメール配信とカレンダー通知が確実に機能するようにするには、メールアドレスの確認が重要です。",
|
||||
"verify_email_banner_body": "メール配信とカレンダー通知が確実に機能するようにするには、メールアドレスをご確認ください。",
|
||||
"verify_email_email_header": "メールアドレスをご確認ください",
|
||||
"verify_email_email_button": "メールを確認する",
|
||||
"verify_email_email_body": "以下のボタンをクリックして、メールアドレスをご確認ください。",
|
||||
"verify_email_email_link_text": "ボタンをクリックしたくない場合には、こちらのリンクをご利用ください。",
|
||||
"email_sent": "メールが正常に送信されました",
|
||||
"event_declined_subject": "却下: {{title}} {{date}}",
|
||||
"event_cancelled_subject": "キャンセル済み:{{date}} の{{title}}",
|
||||
"event_cancelled_subject": "{{date}} に {{title}} がキャンセルされました",
|
||||
"event_request_declined": "イベントのリクエストが拒否されました",
|
||||
"event_request_declined_recurring": "繰り返しイベントのリクエストが拒否されました",
|
||||
"event_request_cancelled": "予定されたイベントがキャンセルされました",
|
||||
"event_request_cancelled": "スケジュール設定済みのイベントがキャンセルされました",
|
||||
"organizer": "主催者",
|
||||
"need_to_reschedule_or_cancel": "再スケジュールまたはキャンセルが必要ですか?",
|
||||
"no_options_available": "利用できるオプションがありません",
|
||||
"no_options_available": "利用可能なオプションがありません",
|
||||
"cancellation_reason": "キャンセルの理由 (オプション)",
|
||||
"cancellation_reason_placeholder": "キャンセルが必要な理由をお教えください",
|
||||
"rejection_reason": "拒否の理由",
|
||||
@@ -87,9 +87,9 @@
|
||||
"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_subtitle": "{{organizer}} が予約をキャンセルし、別の時間帯を選ぶようにリクエストしています。",
|
||||
"request_reschedule_title_organizer": "{{attendee}} にスケジュールの変更をリクエストしました",
|
||||
"request_reschedule_subtitle_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}} さん",
|
||||
@@ -118,7 +118,7 @@
|
||||
"team_info": "チームの情報",
|
||||
"request_another_invitation_email": "{{toEmail}} を {{appName}} のメールアドレスとして使用しない場合、または {{appName}} アカウントをすでに持っている場合は、そのメールへの招待を別にリクエストしてください。",
|
||||
"you_have_been_invited": "チーム {{teamName}} への参加を招待されました。",
|
||||
"user_invited_you": "{{entity}}の{{team}}に参加するよう、{{user}}が {{appName}} であなたを招待しました",
|
||||
"user_invited_you": "{{entity}} の {{team}} に参加するよう、{{user}} が {{appName}} であなたを招待しました",
|
||||
"hidden_team_member_title": "あなたはこのチームで非表示にされています",
|
||||
"hidden_team_member_message": "座席料の支払いが完了していません。Pro へとアップグレードするか、チームのオーナーにあなたの座席料の支払いをご依頼ください。",
|
||||
"hidden_team_owner_message": "チームをご利用いただくためには、Pro アカウントが必要です。アップグレードするまでは非表示となります。",
|
||||
@@ -129,8 +129,8 @@
|
||||
"team_upgrade_banner_description": "新しいチームプランをお試しいただき、ありがとうございます。あなたのチーム「{{teamName}}」には、アップグレードが必要なようです。",
|
||||
"upgrade_banner_action": "アップグレードはこちら",
|
||||
"team_upgraded_successfully": "チームのアップグレードが正常に完了しました!",
|
||||
"org_upgrade_banner_description": "Organization プランをお試しいただきありがとうございます。Organization「{{teamName}}」はアップグレードが必要です。",
|
||||
"org_upgraded_successfully": "あなたのOrganizationは正常にアップグレードされました!",
|
||||
"org_upgrade_banner_description": "Organization プランをお試しいただきありがとうございます。ご利用の「{{teamName}}」の Organization プランには、アップグレードが必要です。",
|
||||
"org_upgraded_successfully": "あなたの Organization プランは正常にアップグレードされました!",
|
||||
"use_link_to_reset_password": "以下のリンクを使用してパスワードをリセットしてください",
|
||||
"hey_there": "こんにちは!",
|
||||
"forgot_your_password_calcom": "パスワードをお忘れですか? - {{appName}}",
|
||||
@@ -197,7 +197,7 @@
|
||||
"blog": "ブログ",
|
||||
"blog_description": "最新のニュースや記事を読む",
|
||||
"join_our_community": "コミュニティーに参加する",
|
||||
"join_our_discord": "私たちのDiscordに参加する",
|
||||
"join_our_discord": "私たちの Discord に参加する",
|
||||
"404_claim_entity_user": "ユーザー名を獲得してイベントをスケジュールする",
|
||||
"popular_pages": "人気のページ",
|
||||
"register_now": "今すぐ登録",
|
||||
@@ -205,7 +205,7 @@
|
||||
"page_doesnt_exist": "このページは存在しません。",
|
||||
"check_spelling_mistakes_or_go_back": "スペルミスを確認するか、前のページに戻ってください。",
|
||||
"404_page_not_found": "404: このページは見つかりませんでした。",
|
||||
"booker_event_not_found": "予約しようとしているイベントは見つかりませんでした。",
|
||||
"booker_event_not_found": "あなたが予約を試みているイベントは見つかりませんでした。",
|
||||
"getting_started": "はじめに",
|
||||
"15min_meeting": "15 分間のミーティング",
|
||||
"30min_meeting": "30 分間のミーティング",
|
||||
@@ -241,7 +241,7 @@
|
||||
"done": "完了",
|
||||
"all_done": "すべて完了!",
|
||||
"all": "すべて",
|
||||
"yours": "アカウント",
|
||||
"yours": "ご利用のアカウント",
|
||||
"available_apps": "利用可能なアプリ",
|
||||
"check_email_reset_password": "メールをご確認ください。パスワードをリセットするためのリンクを送信しました。",
|
||||
"finish": "完了",
|
||||
@@ -306,16 +306,16 @@
|
||||
"password_has_been_reset_login": "パスワードがリセットされました。新しく作成したパスワードでログインできるようになりました。",
|
||||
"layout": "レイアウト",
|
||||
"bookerlayout_default_title": "デフォルトの表示",
|
||||
"bookerlayout_description": "複数を選択することができ、予約者は表示を切り替えることができます。",
|
||||
"bookerlayout_description": "複数のものを選択することができ、予約者は表示を切り替えることができます。",
|
||||
"bookerlayout_user_settings_title": "予約のレイアウト",
|
||||
"bookerlayout_user_settings_description": "複数を選択することができ、予約者は表示を切り替えられます。これはイベントごとに上書きできます。",
|
||||
"bookerlayout_user_settings_description": "複数のものを選択することができ、予約者は表示を切り替えることができます。これはイベントごとに上書きが可能です。",
|
||||
"bookerlayout_month_view": "月",
|
||||
"bookerlayout_week_view": "週",
|
||||
"bookerlayout_column_view": "カラム",
|
||||
"bookerlayout_column_view": "列",
|
||||
"bookerlayout_error_min_one_enabled": "少なくとも 1 つのレイアウトを有効にする必要があります。",
|
||||
"bookerlayout_error_default_not_enabled": "デフォルト表示として選択したレイアウトは、有効なレイアウトに含まれていません。",
|
||||
"bookerlayout_error_unknown_layout": "選択したレイアウトは有効なレイアウトではありません。",
|
||||
"bookerlayout_override_global_settings": "<2>設定 / 外観</2>または<6>このイベントのみ上書き</6>ですべてのイベントの種類を管理できます。",
|
||||
"bookerlayout_error_default_not_enabled": "デフォルト表示として選択したレイアウトが、有効なレイアウトに含まれていません。",
|
||||
"bookerlayout_error_unknown_layout": "選択したレイアウトが有効なレイアウトではありません。",
|
||||
"bookerlayout_override_global_settings": "「<2>設定/外観</2>」または「<6>このイベントのみ上書き</6>」で、すべてのイベントの種類を管理できます。",
|
||||
"unexpected_error_try_again": "予期しないエラーが発生しました。もう一度お試しください。",
|
||||
"sunday_time_error": "日曜日の時間が無効です",
|
||||
"monday_time_error": "月曜日の時間が無効です",
|
||||
@@ -337,11 +337,11 @@
|
||||
"cancelling_event_recurring": "このイベントは、繰り返しイベントに含まれている 1 つのインスタンスです。",
|
||||
"cancelling_all_recurring": "これらはすべて、繰り返しイベントに含まれているインスタンスの残りです。",
|
||||
"error_with_status_code_occured": "ステータスコード {{status}} に関するエラーが発生しました。",
|
||||
"error_event_type_url_duplicate": "この URL のイベントの種類はすでに存在します。",
|
||||
"error_event_type_unauthorized_create": "このイベントを作成することができません",
|
||||
"error_event_type_unauthorized_update": "このイベントを編集することができません",
|
||||
"error_workflow_unauthorized_create": "このワークフローを作成することができません",
|
||||
"error_schedule_unauthorized_create": "このスケジュールを作成することができません",
|
||||
"error_event_type_url_duplicate": "この URL を持つイベントの種類はすでに存在します。",
|
||||
"error_event_type_unauthorized_create": "このイベントを作成することはできません",
|
||||
"error_event_type_unauthorized_update": "このイベントを編集することはできません",
|
||||
"error_workflow_unauthorized_create": "このワークフローを作成することはできません",
|
||||
"error_schedule_unauthorized_create": "このスケジュールを作成することはできません",
|
||||
"booking_already_cancelled": "この予約はすでにキャンセルされています",
|
||||
"booking_already_accepted_rejected": "この予約はすでに承認または拒否が行われています。",
|
||||
"go_back_home": "ホームに戻る",
|
||||
@@ -357,7 +357,7 @@
|
||||
"upcoming_bookings": "誰かがあなたとの時間を予約すると、すぐにここに表示されます。",
|
||||
"recurring_bookings": "別のユーザーがあなたとの繰り返しイベントを予約すると、ここに表示されます。",
|
||||
"past_bookings": "過去の予約はここに表示されます。",
|
||||
"cancelled_bookings": "キャンセルされた予約はここに表示されます",
|
||||
"cancelled_bookings": "キャンセルされた予約はこちらに表示されます。",
|
||||
"unconfirmed_bookings": "未確認の予約はここに表示されます。",
|
||||
"unconfirmed_bookings_tooltip": "未確認の予約",
|
||||
"on": "上",
|
||||
@@ -398,12 +398,12 @@
|
||||
"browse_api_documentation": "APIドキュメントを参照する",
|
||||
"leverage_our_api": "APIを活用して、完全な制御とカスタマイズが可能です。",
|
||||
"create_webhook": "Webhook を作成",
|
||||
"booking_cancelled": "キャンセルされた予約",
|
||||
"booking_cancelled": "予約がキャンセルされました",
|
||||
"booking_rescheduled": "予約の再スケジュール済",
|
||||
"recording_ready": "録音をダウンロードするためのリンクが準備できています",
|
||||
"booking_created": "予約を作成しました",
|
||||
"booking_rejected": "拒否された予約",
|
||||
"booking_requested": "リクエストされた予約",
|
||||
"booking_rejected": "予約が拒否されました",
|
||||
"booking_requested": "予約がリクエストされました",
|
||||
"meeting_ended": "ミーティングが終了しました",
|
||||
"form_submitted": "フォームが送信されました",
|
||||
"event_triggers": "イベントトリガー",
|
||||
@@ -413,8 +413,8 @@
|
||||
"team_webhooks": "チームのウェブフック",
|
||||
"create_new_webhook_to_account": "アカウントに新しいウェブフックを作成します",
|
||||
"new_webhook": "新しいウェブフック",
|
||||
"receive_cal_meeting_data": "イベントが予定またはキャンセルされた場合、特定の URL で開かれる {{appName}} ミーティングデータをリアルタイムに受信する。",
|
||||
"receive_cal_event_meeting_data": "このイベントが予定またはキャンセルされた場合、特定の URL で開かれる {{appName}} ミーティングデータをリアルタイムに受信する。",
|
||||
"receive_cal_meeting_data": "イベントのスケジュール設定またはキャンセルが行われた際に、特定の URL にある {{appName}} のミーティングデータをリアルタイムに受信します。",
|
||||
"receive_cal_event_meeting_data": "このイベントのスケジュール設定またはキャンセルが行われた際に、特定の URL にある {{appName}} のミーティングデータをリアルタイムに受信します。",
|
||||
"responsive_fullscreen_iframe": "レスポンシブフルスクリーン iframe",
|
||||
"loading": "読み込み中...",
|
||||
"deleting": "削除中...",
|
||||
@@ -477,7 +477,7 @@
|
||||
"max_limit_allowed_hint": "{{limit}} 文字以下で入力してください",
|
||||
"invalid_password_hint": "パスワードには少なくとも 1 文字以上数字を含め、アルファベットの大文字と小文字を両方使用した上で {{passwordLength}} 文字以上の長さに設定してください",
|
||||
"incorrect_password": "パスワードが正しくありません。",
|
||||
"incorrect_email_password": "ユーザー名またはパスワードが正しくありません。",
|
||||
"incorrect_email_password": "メールまたはパスワードが正しくありません。",
|
||||
"use_setting": "設定を使用",
|
||||
"am_pm": "午前/午後",
|
||||
"time_options": "時刻オプション",
|
||||
@@ -586,8 +586,8 @@
|
||||
"confirm_all": "すべて確認",
|
||||
"disband_team": "チームを解散する",
|
||||
"disband_team_confirmation_message": "このチームを解散しますか? あなたがこのチームのリンクを共有した人は、それを使って予約することができなくなります。",
|
||||
"disband_org": "Organization を解散する",
|
||||
"disband_org_confirmation_message": "この Organization を解散しますか?すべてのチームとメンバーが削除されます。",
|
||||
"disband_org": "組織を解散する",
|
||||
"disband_org_confirmation_message": "この組織を解散しますか?すべてのチームとメンバーが削除されます。",
|
||||
"remove_member_confirmation_message": "このメンバーをチームから削除してもよろしいですか?",
|
||||
"confirm_disband_team": "はい、チームを解散します。",
|
||||
"confirm_remove_member": "はい、メンバーを削除します",
|
||||
@@ -695,11 +695,11 @@
|
||||
"create_new_team": "新しいチームを作成",
|
||||
"open_invitations": "招待状を開く",
|
||||
"new_team": "新しいチーム",
|
||||
"create_first_team_and_invite_others": "最初のチームを作成し、一緒に仕事をするために他のユーザーを招待してください。",
|
||||
"create_first_team_and_invite_others": "最初のチームを作成し、一緒に仕事をする他のユーザーを招待してください。",
|
||||
"create_team_to_get_started": "始めるためにチームを作成",
|
||||
"teams": "チーム",
|
||||
"team": "チーム",
|
||||
"organization": "Organization",
|
||||
"organization": "組織",
|
||||
"team_billing": "チームの請求",
|
||||
"team_billing_description": "チームの請求情報を管理します",
|
||||
"upgrade_to_flexible_pro_title": "チームへの請求内容を変更しました",
|
||||
@@ -867,14 +867,14 @@
|
||||
"no_category_apps": "{{category}} アプリはありません",
|
||||
"all_apps": "すべてのアプリ",
|
||||
"no_category_apps_description_calendar": "ダブルブッキングを防ぐために、スケジュールの重複をチェックするカレンダーアプリを追加しましょう",
|
||||
"no_category_apps_description_conferencing": "顧客とのビデオ通話には会議アプリを追加します",
|
||||
"no_category_apps_description_conferencing": "顧客とのビデオ通話には会議アプリを追加しましょう",
|
||||
"no_category_apps_description_payment": "決済アプリを追加して、顧客との取引を容易にしましょう",
|
||||
"no_category_apps_description_analytics": "予約ページに分析アプリを追加する",
|
||||
"no_category_apps_description_automation": "使用する自動化アプリを追加する",
|
||||
"no_category_apps_description_other": "その他のアプリを追加して、様々なことを実現しましょう",
|
||||
"no_category_apps_description_web3": "予約ページに Web3 アプリを追加",
|
||||
"no_category_apps_description_messaging": "カスタム通知とリマインダーを設定するにはメッセージングアプリを追加します",
|
||||
"no_category_apps_description_crm": "会った人を記録するには CRM アプリを追加します",
|
||||
"no_category_apps_description_messaging": "カスタム通知とリマインダーを設定するには、メッセージングアプリを追加します",
|
||||
"no_category_apps_description_crm": "会った人を記録するには、CRM アプリを追加します",
|
||||
"installed_app_calendar_description": "ダブルブッキングを防ぐために、カレンダーの重複をチェックするように設定します。",
|
||||
"installed_app_payment_description": "顧客に請求をする際に使用する決済処理サービスを設定しましょう。",
|
||||
"installed_app_analytics_description": "予約ページでどの分析アプリを使用するかを構成する",
|
||||
@@ -883,7 +883,7 @@
|
||||
"installed_app_automation_description": "どの自動化アプリを使用するかを構成する",
|
||||
"installed_app_web3_description": "予約ページでどの Web3 アプリを使用するかを構成します",
|
||||
"installed_app_messaging_description": "カスタム通知とリマインダーの設定にどのメッセージングアプリを使用するかを設定します",
|
||||
"installed_app_crm_description": "会った人の記録にどの CRM アプリを使用するかを設定します",
|
||||
"installed_app_crm_description": "会った人を記録するのにどの CRM アプリを使用するかを設定します",
|
||||
"analytics": "分析",
|
||||
"empty_installed_apps_headline": "アプリがインストールされていません",
|
||||
"empty_installed_apps_description": "アプリを使えば、ワークフローの質を高め、スケジュールライフを大幅に改善することができます。",
|
||||
@@ -909,7 +909,7 @@
|
||||
"create_events_on": "以下にイベントを作成する:",
|
||||
"enterprise_license": "これは企業向けの機能です",
|
||||
"enterprise_license_description": "この機能を有効にするには、{{consoleUrl}} コンソールでデプロイメントキーを入手して .env に CALCOM_LICENSE_KEY として追加してください。既にチームがライセンスを持っている場合は {{supportMail}} にお問い合わせください。",
|
||||
"enterprise_license_development": "この機能は開発モードでテストできます。本番環境で使用するには管理者に<2>/権限/設定</2>に行ってライセンスキーを入力してもらってください。",
|
||||
"enterprise_license_development": "この機能は開発モードでテストできます。本番環境で使用するには、管理者に <2>/auth/setup</2> にアクセスするよう依頼し、ライセンスキーを入力してもらってください。",
|
||||
"missing_license": "ライセンスが見つかりません",
|
||||
"signup_requires": "商用ライセンスが必要です",
|
||||
"signup_requires_description": "{{companyName}} は、現時点ではサインアップページの無料のオープンソース版を提供しておりません。サインアップコンポーネントへのフルアクセスをご利用いただくためには、商用ライセンスを取得する必要があります。個人での利用につきましては、Prisma Data Platform またはその他の Postgres インターフェースを使用してアカウントの作成を行うことをお勧めしております。",
|
||||
@@ -979,7 +979,7 @@
|
||||
"confirm_delete_api_key": "この API キーを取り消す",
|
||||
"revoke_api_key": "API キーの取り消し",
|
||||
"api_key_copied": "API キーをコピーしました!",
|
||||
"api_key_expires_on": "APIキーの期限が切れるのは",
|
||||
"api_key_expires_on": "API キーの期限:",
|
||||
"delete_api_key_confirm_title": "この API キーをご利用のアカウントから完全に削除しますか?",
|
||||
"copy": "コピー",
|
||||
"expire_date": "有効期限",
|
||||
@@ -1004,7 +1004,7 @@
|
||||
"team_impersonation_description": "チームの所有者/管理者が一時的にあなたとしてサインインできるようにします。",
|
||||
"make_team_private": "チームを非公開にする",
|
||||
"make_team_private_description": "これをオンにすると、チームメンバーは他のチームメンバーを確認することができなくなります。",
|
||||
"you_cannot_see_team_members": "非公開チームではすべてのチームメンバーを確認できません。",
|
||||
"you_cannot_see_team_members": "非公開チームでは、チームメンバーを確認することができません。",
|
||||
"allow_booker_to_select_duration": "予約者が時間を選択できるようにする",
|
||||
"impersonate_user_tip": "この機能の使用はすべて監査されています。",
|
||||
"impersonating_user_warning": "ユーザー名 \"{{user}}\" になりすましています。",
|
||||
@@ -1079,11 +1079,11 @@
|
||||
"url_start_with_https": "URLは、http://またはhttps://で始まる必要があります",
|
||||
"number_provided": "電話番号が提供されます",
|
||||
"before_event_trigger": "イベント開始前に",
|
||||
"event_cancelled_trigger": "イベントキャンセル時に",
|
||||
"event_cancelled_trigger": "イベントキャンセル時",
|
||||
"new_event_trigger": "新しいイベント予約時に",
|
||||
"email_host_action": "ホストにメールを送信",
|
||||
"email_attendee_action": "出席者にメールを送る",
|
||||
"sms_attendee_action": "出席者に SMS を送信",
|
||||
"sms_attendee_action": "出席者に SMS を送信する",
|
||||
"sms_number_action": "特定の番号に SMS を送信",
|
||||
"whatsapp_number_action": "特定の番号に Whatsapp メッセージを送信",
|
||||
"whatsapp_attendee_action": "出席者に Whatsapp メッセージを送信",
|
||||
@@ -1150,8 +1150,8 @@
|
||||
"choose_template": "テンプレートを選択する",
|
||||
"custom": "カスタム",
|
||||
"reminder": "リマインダー",
|
||||
"rescheduled": "スケジュールを変更済み",
|
||||
"completed": "完了済み",
|
||||
"rescheduled": "スケジュール変更済み",
|
||||
"completed": "完了",
|
||||
"reminder_email": "リマインダー:{{date}} の {{name}} との {{eventType}}",
|
||||
"not_triggering_existing_bookings": "イベントの予約時に電話番号の入力を求められるため、すでにある予約はトリガーされません。",
|
||||
"minute_one": "{{count}} 分",
|
||||
@@ -1306,8 +1306,8 @@
|
||||
"connect_analytics_apps": "分析アプリを接続する",
|
||||
"connect_other_apps": "その他のアプリを接続",
|
||||
"connect_web3_apps": "Web3 アプリを接続",
|
||||
"connect_messaging_apps": "メッセージングアプリを接続",
|
||||
"connect_crm_apps": "CRM アプリを接続",
|
||||
"connect_messaging_apps": "メッセージングアプリを接続する",
|
||||
"connect_crm_apps": "CRM アプリを接続する",
|
||||
"current_step_of_total": "ステップ {{currentStep}}/{{maxSteps}}",
|
||||
"add_variable": "変数を追加",
|
||||
"custom_phone_number": "カスタム電話番号",
|
||||
@@ -1379,7 +1379,7 @@
|
||||
"routing_forms_send_email_owner": "所有者にメールを送信",
|
||||
"routing_forms_send_email_owner_description": "フォームの送信時に所有者にメールを送信します",
|
||||
"add_new_form": "新しいフォームを追加",
|
||||
"add_new_team_form": "新しいフォームをチームに追加",
|
||||
"add_new_team_form": "新しいフォームをチームに追加する",
|
||||
"create_your_first_route": "最初のルートを作成",
|
||||
"route_to_the_right_person": "フォームへの回答に基づいて適切なユーザーにルーティングする",
|
||||
"form_description": "予約者をルーティングするフォームを作成します",
|
||||
@@ -1487,16 +1487,16 @@
|
||||
"your_org_disbanded_successfully": "組織は正常に解散されました",
|
||||
"error_creating_team": "チームの作成中にエラーが発生しました",
|
||||
"you": "あなた",
|
||||
"resend_email": "メールを再送信",
|
||||
"resend_email": "メールを再送する",
|
||||
"member_already_invited": "メンバーは既に招待されています",
|
||||
"enter_email_or_username": "メールアドレスまたはユーザー名を入力してください",
|
||||
"team_name_taken": "この名前は既に使用されています",
|
||||
"must_enter_team_name": "チーム名の入力は必須です",
|
||||
"team_url_required": "チームの URL の入力は必須です",
|
||||
"url_taken": "この URL は既に使用されています",
|
||||
"problem_registering_domain": "サブドメインの登録に問題がありました。もう一度やり直すか、管理者にお問い合せください",
|
||||
"problem_registering_domain": "サブドメインの登録時に問題が発生しました。もう一度お試しいただくか、管理者までお問い合せください",
|
||||
"team_publish": "チームを公開",
|
||||
"number_text_notifications": "電話番号(テキスト通知)",
|
||||
"number_text_notifications": "電話番号 (テキスト通知)",
|
||||
"attendee_email_variable": "出席者のメールアドレス",
|
||||
"attendee_email_info": "予約者のメールアドレス",
|
||||
"kbar_search_placeholder": "コマンドを入力するか、検索してください...",
|
||||
@@ -1555,7 +1555,7 @@
|
||||
"no_apps": "Cal のこのインスタンスで有効化されているアプリはありません",
|
||||
"no_apps_configured": "まだアプリが設定されていません",
|
||||
"enable_in_settings": "設定でアプリを有効にできます",
|
||||
"please_contact_admin": "管理者に連絡してください",
|
||||
"please_contact_admin": "管理者までお問い合わせください",
|
||||
"apps_settings": "アプリ設定",
|
||||
"fill_this_field": "このフィールドに入力してください",
|
||||
"options": "オプション",
|
||||
@@ -1659,10 +1659,10 @@
|
||||
"delete_sso_configuration_confirmation_description": "{{connectionType}} の構成を削除してもよろしいですか?{{connectionType}} でのログインを使用しているチームメンバーは、Cal.com にアクセスできなくなります。",
|
||||
"organizer_timezone": "主催者のタイムゾーン",
|
||||
"email_user_cta": "招待を表示",
|
||||
"email_no_user_invite_heading": "{{appName}} の {{entity}} に参加するよう招待されました",
|
||||
"email_no_user_invite_heading": "{{appName}} の {{entity}} への参加に招待されました",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} は {{appName}} のチームに参加するようあなたを招待しました。{{appName}} は、イベント調整スケジューラーです。チームと延々とメールのやりとりをすることなくミーティングのスケジュール設定を行うことができます。",
|
||||
"email_user_invite_subheading": "{{invitedBy}}から {{entity}} の「{{teamName}}」に参加するよう招待されました。{{appName}} はイベント調整スケジューラーで、{{entity}} 内で延々とメールのやりとりをすることなく、ミーティングのスケジュールを設定できます。",
|
||||
"email_no_user_invite_steps_intro": "いくつかの短い手順を踏むだけで、すぐに {{entity}} とのストレスフリーなスケジュール設定をお楽しみいただけます。",
|
||||
"email_user_invite_subheading": "{{invitedBy}} から {{appName}} の {{entity}} \"{{teamName}}\" に参加するよう招待されました。{{appName}} はイベント調整スケジューラーであり、{{entity}} 内で延々とメールのやりとりを続けることなくミーティングのスケジュールを設定できます。",
|
||||
"email_no_user_invite_steps_intro": "いくつかの短い手順を踏むだけで、すぐに {{entity}} のストレスフリーなスケジュール設定をお楽しみいただけます。",
|
||||
"email_no_user_step_one": "ユーザー名を選択",
|
||||
"email_no_user_step_two": "カレンダーアカウントを接続",
|
||||
"email_no_user_step_three": "空き状況を設定する",
|
||||
@@ -1674,7 +1674,7 @@
|
||||
"no_workflows": "ワークフローがありません",
|
||||
"change_filter": "個人やチームのワークフローを表示するためのフィルターを変更します。",
|
||||
"change_filter_common": "結果を表示するフィルターを変更します。",
|
||||
"no_results_for_filter": "このフィルターの結果はありません",
|
||||
"no_results_for_filter": "このフィルターに該当する結果はありません",
|
||||
"recommended_next_steps": "推奨される次のステップ",
|
||||
"create_a_managed_event": "管理されたイベントの種類を作成",
|
||||
"meetings_are_better_with_the_right": "ミーティングは適切なチームメンバーの参加によってより良いものになります。今すぐ彼らを招待しましょう。",
|
||||
@@ -1687,7 +1687,7 @@
|
||||
"attendee_no_longer_attending": "出席者はあなたのイベントに出席しなくなりました",
|
||||
"attendee_no_longer_attending_subtitle": "{{name}} がキャンセルしました。これにより、この時間帯の座席が 1 つ利用可能になりました",
|
||||
"create_event_on": "次のカレンダーにイベントを作成",
|
||||
"create_routing_form_on": "次のことについてルーティングフォームを作成",
|
||||
"create_routing_form_on": "以下についてルーティングフォームを作成する",
|
||||
"default_app_link_title": "デフォルトのアプリリンクを設定",
|
||||
"default_app_link_description": "デフォルトのアプリリンクを設定することで、新たに作成するすべてのイベントの種類が設定したアプリリンクを使用できるようになります。",
|
||||
"organizer_default_conferencing_app": "主催者のデフォルトのアプリ",
|
||||
@@ -1738,16 +1738,16 @@
|
||||
"spot_popular_event_types": "人気のあるイベントの種類を見つける",
|
||||
"spot_popular_event_types_description": "どのイベントの種類が最もクリックされ、予約されているのかを確認します",
|
||||
"no_responses_yet": "回答はまだありません",
|
||||
"no_routes_defined": "ルーティングが定義されていません",
|
||||
"no_routes_defined": "ルートが定義されていません",
|
||||
"this_will_be_the_placeholder": "これがプレースホルダーになります",
|
||||
"error_booking_event": "イベントを予約する際にエラーが発生しました。ページを再読み込みして、もう一度お試しください",
|
||||
"error_booking_event": "イベントを予約する際にエラーが発生しました。ページを更新してからもう一度お試しください",
|
||||
"timeslot_missing_title": "時間帯が選択されていません",
|
||||
"timeslot_missing_description": "イベントを予約するには時間帯を選択してください。",
|
||||
"timeslot_missing_cta": "時間帯を選択",
|
||||
"switch_monthly": "月単位の表示に切り替える",
|
||||
"switch_weekly": "週単位の表示に切り替える",
|
||||
"switch_multiday": "1 日単位の表示に切り替える",
|
||||
"switch_columnview": "カラム表示に切り替える",
|
||||
"switch_columnview": "列表示に切り替える",
|
||||
"num_locations": "{{num}} か所の場所のオプション",
|
||||
"select_on_next_step": "次のステップで選択",
|
||||
"this_meeting_has_not_started_yet": "このミーティングはまだ開始されていません",
|
||||
@@ -1786,7 +1786,7 @@
|
||||
"managed_event_dialog_title_one": "{{count}} 人のメンバーがすでに URL /{{slug}} を使用しています。置き換えますか?",
|
||||
"managed_event_dialog_title_other": "{{count}} 人のメンバーがすでに URL /{{slug}} を使用しています。置き換えますか?",
|
||||
"managed_event_dialog_information_one": "<strong>{{names}}</strong> がすでに URL <strong>/{{slug}}</strong> を使用しています。",
|
||||
"managed_event_dialog_information_other": "<strong>{{names}}</strong>はすでに<strong>/{{slug}}</strong>の URL を使用しています。",
|
||||
"managed_event_dialog_information_other": "<strong>{{names}}</strong> はすでに <strong>/{{slug}}</strong> の URL を使用しています。",
|
||||
"managed_event_dialog_clarification": "置き換えを選択すると、通知が送られます。上書きしたくない場合には、戻って削除してください。",
|
||||
"review_event_type": "イベントの種類を確認",
|
||||
"looking_for_more_analytics": "詳しい分析情報をお探しですか?",
|
||||
@@ -1837,7 +1837,7 @@
|
||||
"complete_your_booking_subject": "次の予約を完了する: {{date}} の {{title}}",
|
||||
"confirm_your_details": "詳細を確認",
|
||||
"copy_invite_link": "招待リンクをコピー",
|
||||
"edit_invite_link": "リンクの設定を編集",
|
||||
"edit_invite_link": "リンクの設定を編集する",
|
||||
"invite_link_copied": "招待リンクをコピーしました",
|
||||
"invite_link_deleted": "招待リンクを削除しました",
|
||||
"invite_link_updated": "招待リンクの設定を保存しました",
|
||||
@@ -1845,9 +1845,9 @@
|
||||
"one_day": "1 日",
|
||||
"seven_days": "7 日",
|
||||
"thirty_days": "30 日",
|
||||
"three_months": "3 ヶ月",
|
||||
"three_months": "3 か月",
|
||||
"one_year": "1 年",
|
||||
"team_invite_received": "{{teamName}} に参加するよう招待されました",
|
||||
"team_invite_received": "{{teamName}} への参加に招待されています",
|
||||
"currency_string": "{{amount, currency}}",
|
||||
"charge_card_dialog_body": "出席者に {{amount, currency}} を請求しようとしています。続けてもよろしいですか?",
|
||||
"charge_attendee": "出席者に {{amount, currency}} を請求",
|
||||
@@ -1856,7 +1856,7 @@
|
||||
"email_invite_team_bulk": "{{userCount}} 人のユーザーが招待されました",
|
||||
"error_collecting_card": "カードの収集中にエラーが発生しました",
|
||||
"image_size_limit_exceed": "アップロードする画像のサイズは 5 MB 以下にする必要があります",
|
||||
"unauthorized_workflow_error_message": "{{errorCode}}:このワークフローを有効または無効にする権限がありません",
|
||||
"unauthorized_workflow_error_message": "{{errorCode}}: このワークフローの有効/無効を切り替える権限がありません",
|
||||
"inline_embed": "インライン埋め込み",
|
||||
"load_inline_content": "イベントの種類を他のウェブサイト内コンテンツにインラインで直接読み込みます。",
|
||||
"floating_pop_up_button": "フローティングポップアップボタン",
|
||||
@@ -1876,69 +1876,69 @@
|
||||
"connect_google_workspace": "Google Workspace を接続",
|
||||
"google_workspace_admin_tooltip": "この機能を使うには Workspace の管理者になる必要があります",
|
||||
"first_event_type_webhook_description": "このイベントの種類の最初の Webhook を作成",
|
||||
"install_app_on": "次にアプリをインストール",
|
||||
"install_app_on": "次のアカウントにアプリをインストール",
|
||||
"create_for": "作成対象",
|
||||
"setup_organization": "Organization をセットアップ",
|
||||
"organization_banner_description": "チームがラウンドロビンスケジューリングや一括スケジューリングで、共有アプリ、ワークフロー、イベントの種類を作成できる環境を作成します。",
|
||||
"organization_banner_title": "複数のチームを持つ組織を管理",
|
||||
"set_up_your_organization": "組織をセットアップ",
|
||||
"organizations_description": "組織はチームが共有するイベントの種類、アプリ、ワークフローなどを作成できる共有環境です。",
|
||||
"must_enter_organization_name": "組織の名前の入力は必須です",
|
||||
"must_enter_organization_admin_email": "組織のメールアドレスの入力は必須です",
|
||||
"setup_organization": "組織をセットアップする",
|
||||
"organization_banner_description": "チームがラウンドロビンスケジューリングや一括スケジューリングを活用して、共有アプリ、ワークフロー、イベントの種類を作成できる環境を作成します。",
|
||||
"organization_banner_title": "複数のチームを持つ組織を管理する",
|
||||
"set_up_your_organization": "組織をセットアップする",
|
||||
"organizations_description": "組織は、チームが共有するイベントの種類、アプリ、ワークフローなどが作成可能な共有環境です。",
|
||||
"must_enter_organization_name": "組織名は必須項目です",
|
||||
"must_enter_organization_admin_email": "組織のメールアドレスは必須項目です",
|
||||
"admin_email": "組織のメールアドレス",
|
||||
"admin_username": "管理者のユーザー名",
|
||||
"organization_name": "組織の名前",
|
||||
"organization_url": "Organization の URL",
|
||||
"organization_verify_header": "組織のメールアドレスを確認してください",
|
||||
"organization_verify_email_body": "組織のセットアップを続行するには、以下のコードを使ってメールアドレスを確認してください。",
|
||||
"organization_name": "組織名",
|
||||
"organization_url": "組織の URL",
|
||||
"organization_verify_header": "組織のメールアドレスをご確認ください",
|
||||
"organization_verify_email_body": "組織のセットアップを続行するには、以下のコードを使用してメールアドレスを確認してください。",
|
||||
"additional_url_parameters": "追加の URL パラメータ",
|
||||
"about_your_organization": "あなたの組織について",
|
||||
"about_your_organization_description": "組織は共有するメンバー、イベントの種類、アプリ、ワークフローなどを含む複数のチームを作成できる共有環境です。",
|
||||
"create_your_teams": "チームを作成",
|
||||
"create_your_teams_description": "組織にチームメンバーを追加して、共同のスケジューリングを開始します",
|
||||
"invite_organization_admins": "組織の管理者を招待",
|
||||
"invite_organization_admins_description": "これらの管理者は組織のすべてのチームにアクセスできます。チームの管理者とメンバーは後で追加できます。",
|
||||
"set_a_password": "パスワードを設定",
|
||||
"set_a_password_description": "これにより、組織のメールアドレスとこのパスワードを使って、新規ユーザーアカウントが作成されます。",
|
||||
"organization_logo": "Organization のロゴ",
|
||||
"organization_about_description": "あなたの組織についての簡単な説明文です。あなたの組織の公開 プロフィールページに表示されます。",
|
||||
"ill_do_this_later": "これは後でする",
|
||||
"verify_your_email": "メールを確認",
|
||||
"enter_digit_code": "{{email}} に送信した6桁のコードを入力してください",
|
||||
"about_your_organization_description": "組織は、共有メンバー、イベントの種類、アプリ、ワークフローなどを含む複数のチームを作成可能な共有環境です。",
|
||||
"create_your_teams": "チームを作成する",
|
||||
"create_your_teams_description": "組織にチームメンバーを追加して、一緒にスケジュール設定を開始しましょう",
|
||||
"invite_organization_admins": "組織の管理者を招待する",
|
||||
"invite_organization_admins_description": "これらの管理者は組織内のすべてのチームにアクセスできます。チームの管理者とメンバーは、後から追加することが可能です。",
|
||||
"set_a_password": "パスワードを設定する",
|
||||
"set_a_password_description": "これにより、組織のメールアドレスとこのパスワードを用いて新しいユーザーアカウントが作成されます。",
|
||||
"organization_logo": "組織のロゴ",
|
||||
"organization_about_description": "あなたの組織についての簡単な説明文です。あなたの組織の公開プロフィールページに表示されます。",
|
||||
"ill_do_this_later": "後で行う",
|
||||
"verify_your_email": "メールを確認する",
|
||||
"enter_digit_code": "{{email}} に送信した 6 桁のコードを入力してください",
|
||||
"verify_email_organization": "組織を作成するには、メールを確認してください",
|
||||
"code_provided_invalid": "提供されたコードは有効ではありません。もう一度お試しください",
|
||||
"code_provided_invalid": "提供されたコードは無効です。もう一度お試しください",
|
||||
"email_already_used": "メールはすでに使用されています",
|
||||
"organization_admin_invited_heading": "{{orgName}} に参加するよう招待されました",
|
||||
"organization_admin_invited_body": "{{orgName}} のチームに参加して、これからはスケジューリングではなくミーティングに集中しましょう!",
|
||||
"duplicated_slugs_warning": "次のチームはスラッグが重複しているため作成できませんでした:{{slugs}}",
|
||||
"organization_admin_invited_heading": "{{orgName}} への参加に招待されました",
|
||||
"organization_admin_invited_body": "{{orgName}} のチームに参加し、ミーティングの手配ではなくミーティングそのものに集中しましょう!",
|
||||
"duplicated_slugs_warning": "以下のチームについては、スラッグ {{slugs}} が重複しているため作成できませんでした。",
|
||||
"team_names_empty": "チーム名は空欄にできません",
|
||||
"team_names_repeated": "チーム名を繰り返し使用することはできません",
|
||||
"user_belongs_organization": "ユーザーは組織の一員です",
|
||||
"user_belongs_organization": "ユーザーは組織に属しています",
|
||||
"org_no_teams_yet": "この組織にはまだチームがありません",
|
||||
"org_no_teams_yet_description": "管理者である場合は、必ずここに表示されるチームを作成してください。",
|
||||
"org_no_teams_yet_description": "管理者である場合には、ここに表示されるチームを必ず作成してください。",
|
||||
"set_up": "設定",
|
||||
"set_up_your_profile": "プロフィールを設定",
|
||||
"set_up_your_profile_description": "あなたのことを {{orgName}} 内、そして公開リンクを見る人に知ってもらいます。",
|
||||
"set_up_your_profile": "プロフィールを設定する",
|
||||
"set_up_your_profile_description": "{{orgName}} 内で、公開リンクを使用するユーザーにあなたのことを知ってもらいましょう。",
|
||||
"my_profile": "プロフィール",
|
||||
"my_settings": "設定",
|
||||
"crm": "CRM",
|
||||
"messaging": "メッセージング",
|
||||
"sender_id_info": "SMS の送信者として表示される名前または番号(国によっては英数字の送信者 ID を許可しない場合があります)",
|
||||
"org_admins_can_create_new_teams": "組織の管理者のみが新規チームを作成できます",
|
||||
"google_new_spam_policy": "Goggleのスパムに関する新しいポリシーにより、この予約についてのメールやカレンダー通知を受け取れなくなる可能性があります。",
|
||||
"sender_id_info": "SMS の送信者として表示される名前または番号 (国によっては英数字の送信者 ID が許可されない場合もあります)",
|
||||
"org_admins_can_create_new_teams": "組織の管理者のみが新しいチームを作成できます",
|
||||
"google_new_spam_policy": "Google の新しい迷惑メールポリシーにより、この予約に関するメールやカレンダー通知を受け取れなくなる可能性があります。",
|
||||
"resolve": "解決する",
|
||||
"no_organization_slug": "この組織のチームの作成中にエラーが発生しました。URL スラッグがありません。",
|
||||
"org_name": "組織の名前",
|
||||
"no_organization_slug": "この組織でチームを作成する際にエラーが発生しました。URL スラッグがありません。",
|
||||
"org_name": "組織名",
|
||||
"org_url": "組織の URL",
|
||||
"copy_link_org": "組織へのリンクをコピー",
|
||||
"copy_link_org": "組織へのリンクをコピーする",
|
||||
"404_the_org": "組織",
|
||||
"404_the_team": "チーム",
|
||||
"404_claim_entity_org": "組織のサブドメインを取得",
|
||||
"404_claim_entity_team": "このチームの一員になって、これからはスケジュールをまとめて管理しましょう",
|
||||
"404_claim_entity_org": "組織のサブドメインを取得する",
|
||||
"404_claim_entity_team": "このチームの一員になって、今後はスケジュールをまとめて管理しましょう",
|
||||
"insights_all_org_filter": "すべて",
|
||||
"insights_team_filter": "チーム:{{teamName}}",
|
||||
"insights_user_filter": "ユーザー:{{userName}}",
|
||||
"insights_subtitle": "イベント全体の予約 Insights を表示",
|
||||
"insights_team_filter": "チーム: {{teamName}}",
|
||||
"insights_user_filter": "ユーザー: {{userName}}",
|
||||
"insights_subtitle": "イベント全体での予約に関する分析情報を表示する",
|
||||
"custom_plan": "カスタムプラン",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ この上に新しい文字列を追加 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ この上に新しい文字列を追加してください ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
@@ -13,18 +13,18 @@
|
||||
"reset_password_subject": "{{appName}}: 비밀번호 재설정 방법",
|
||||
"verify_email_subject": "{{appName}}: 계정 인증",
|
||||
"check_your_email": "이메일 확인",
|
||||
"verify_email_page_body": "{{email}}에 이메일을 발송했습니다. {{appName}}에서 최상의 이메일 및 캘린더 전송 가능성을 보장하려면 이메일 주소를 인증하는 것이 중요합니다.",
|
||||
"verify_email_banner_body": "최상의 이메일 및 일정 전달 가능성을 보장하려면 이메일 주소를 인증하십시오.",
|
||||
"verify_email_page_body": "{{email}}에 이메일을 발송했습니다. {{appName}}에서 이메일과 캘린더를 가능한 한 차질 없이 보내드리려면 이메일 주소를 인증하는 것이 중요합니다.",
|
||||
"verify_email_banner_body": "이메일 및 일정을 가능한 한 차질 없이 보내드릴 수 있도록 이메일 주소를 인증하세요.",
|
||||
"verify_email_email_header": "이메일 주소 인증",
|
||||
"verify_email_email_button": "이메일 인증",
|
||||
"verify_email_email_body": "아래 버튼을 클릭하여 이메일 주소를 인증하십시오.",
|
||||
"verify_email_email_link_text": "버튼 클릭이 마음에 들지 않는 경우 링크는 다음과 같습니다.",
|
||||
"verify_email_email_body": "아래 버튼을 클릭하여 이메일 주소를 인증하세요.",
|
||||
"verify_email_email_link_text": "버튼 클릭이 마음에 들지 않는 경우 다음 링크를 사용하세요.",
|
||||
"email_sent": "이메일이 성공적으로 전송되었습니다",
|
||||
"event_declined_subject": "거절됨: {{date}} {{title}}",
|
||||
"event_cancelled_subject": "취소됨: {{title}} 날짜 {{date}}",
|
||||
"event_request_declined": "회의 요청이 거절되었습니다.",
|
||||
"event_request_declined_recurring": "되풀이 이벤트 요청이 거부되었습니다",
|
||||
"event_request_cancelled": "회의 일정이 취소되었습니다",
|
||||
"event_request_cancelled": "예약된 일정이 취소되었습니다",
|
||||
"organizer": "주최자",
|
||||
"need_to_reschedule_or_cancel": "다시 일정을 잡거나 취소하시겠습니까?",
|
||||
"no_options_available": "사용 가능한 옵션 없음",
|
||||
@@ -87,7 +87,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_subtitle": "{{organizer}}에서 예약을 취소하고 다른 시간을 선택할 것을 요청했습니다.",
|
||||
"request_reschedule_title_organizer": "{{attendee}}에게 일정 변경을 요청하셨습니다",
|
||||
"request_reschedule_subtitle_organizer": "예약을 취소하셨기 때문에 {{attendee}} 님이 새 예약 시간을 선택해야 합니다.",
|
||||
"rescheduled_event_type_subject": "일정 변경 요청이 보내짐: {{date}}에 {{name}}(으)로 {{eventType}}",
|
||||
@@ -118,7 +118,7 @@
|
||||
"team_info": "팀 정보",
|
||||
"request_another_invitation_email": "{{toEmail}} 을 {{appName}} 계정에 사용하고 싶지 않거나 이미 {{appName}} 계정이 있는 경우, 그 메일로 초대를 요청하세요.",
|
||||
"you_have_been_invited": "{{teamName}} 팀에 초대되셨습니다.",
|
||||
"user_invited_you": "{{user}} 님께서 {{appName}}의 {{entity}} {{team}}에 초대하셨습니다.",
|
||||
"user_invited_you": "{{user}} 님께서 {{appName}}의 {{entity}} {{team}}에 귀하를 초대하셨습니다.",
|
||||
"hidden_team_member_title": "귀하는 이 팀에서 숨겨졌습니다",
|
||||
"hidden_team_member_message": "귀하의 시트 비용은 Pro로 업그레이드하거나 팀 소유자에게 그들이 귀하의 시트 비용을 지불할 수 있다고 알리는 어떤 경우에도 지불되지 않습니다.",
|
||||
"hidden_team_owner_message": "팀을 사용하려면 Pro 계정이 필요합니다. 귀하의 계정은 업그레이드할 때까지 숨겨졌습니다.",
|
||||
@@ -129,8 +129,8 @@
|
||||
"team_upgrade_banner_description": "당사의 새로운 팀 플랜을 사용해 주셔서 감사합니다. 귀하의 \"{{teamName}}\" 팀에 업그레이드가 필요한 것으로 확인되었습니다.",
|
||||
"upgrade_banner_action": "여기서 업그레이드",
|
||||
"team_upgraded_successfully": "팀이 성공적으로 업그레이드되었습니다!",
|
||||
"org_upgrade_banner_description": "당사의 조직 플랜을 사용해 주셔서 감사합니다. 귀하의 \"{{teamName}}\" 조직에 업그레이드가 필요한 것으로 확인되었습니다.",
|
||||
"org_upgraded_successfully": "조직이 성공적으로 업그레이드되었습니다!",
|
||||
"org_upgrade_banner_description": "당사의 Organization 플랜 체험을 선택해 주셔서 감사합니다. 귀하의 Organization \"{{teamName}}\"에 업그레이드가 필요한 것으로 확인되었습니다.",
|
||||
"org_upgraded_successfully": "Organization이 성공적으로 업그레이드되었습니다!",
|
||||
"use_link_to_reset_password": "비밀번호를 재설정하시려면 아래 링크를 사용하세요.",
|
||||
"hey_there": "안녕하세요.",
|
||||
"forgot_your_password_calcom": "비밀번호를 잊어버리셨나요? - {{appName}}",
|
||||
@@ -248,7 +248,7 @@
|
||||
"organization_general_description": "팀 언어 및 시간대 설정 관리",
|
||||
"few_sentences_about_yourself": "자신에 대해 몇 마디를 써보세요. 개인 URL 페이지에 보이는 내용입니다.",
|
||||
"nearly_there": "거의 다 되었습니다!",
|
||||
"nearly_there_instructions": "마지막으로, 당신에 대해 간단한 소개와 사진을 올려주세요. 소개와 사진은 예약에 도움을 줍니다.",
|
||||
"nearly_there_instructions": "마지막으로, 예약에 도움이 되고 사람들이 본인에 대해 알 수 있도록 본인에 대한 간단한 소개와 사진을 올려주세요.",
|
||||
"set_availability_instructions": "주기적으로 시간이 되는 때가 언제인지 알려주세요. 나중에 더 추가할 수 있습니다.",
|
||||
"set_availability": "언제 여유가 있는지 설정하세요.",
|
||||
"continue_without_calendar": "캘린더 없이 계속하기",
|
||||
@@ -306,16 +306,16 @@
|
||||
"password_has_been_reset_login": "비밀번호가 초기화되었습니다. 이제 새로 생성한 비밀번호로 로그인할 수 있습니다.",
|
||||
"layout": "레이아웃",
|
||||
"bookerlayout_default_title": "기본 보기",
|
||||
"bookerlayout_description": "여러 개를 선택할 수 있고 예약자는 보기를 전환할 수 있습니다.",
|
||||
"bookerlayout_description": "여러 개를 선택할 수 있고 예약자가 보기를 전환할 수 있습니다.",
|
||||
"bookerlayout_user_settings_title": "예약 레이아웃",
|
||||
"bookerlayout_user_settings_description": "여러 개를 선택할 수 있으고 예약자는 보기를 전환할 수 있습니다. 이벤트별로 재정의할 수 있습니다.",
|
||||
"bookerlayout_user_settings_description": "여러 개를 선택하고 예약자가 보기를 전환할 수 있습니다. 이벤트별로 재정의할 수 있습니다.",
|
||||
"bookerlayout_month_view": "월",
|
||||
"bookerlayout_week_view": "주별",
|
||||
"bookerlayout_column_view": "열",
|
||||
"bookerlayout_error_min_one_enabled": "하나 이상의 레이아웃을 활성화해야 합니다.",
|
||||
"bookerlayout_error_default_not_enabled": "기본 보기로 선택한 레이아웃은 활성화된 레이아웃의 일부가 아닙니다.",
|
||||
"bookerlayout_error_unknown_layout": "선택한 레이아웃은 유효한 레이아웃이 아닙니다.",
|
||||
"bookerlayout_override_global_settings": "<2>설정/표시</2> 또는 <6>이 이벤트에 대해서만 재정의</6>에서 모든 이벤트 유형에 대해 이를 관리할 수 있습니다.",
|
||||
"bookerlayout_override_global_settings": "<2>설정/모양</2> 또는 <6>이 이벤트에 대해서만 재정의</6>에서 모든 이벤트 유형에 대해 이를 관리할 수 있습니다.",
|
||||
"unexpected_error_try_again": "예기치 않은 오류가 발생했습니다. 다시 시도하십시오.",
|
||||
"sunday_time_error": "일요일 유효하지 않은 시간",
|
||||
"monday_time_error": "월요일 유효하지 않은 시간",
|
||||
@@ -339,7 +339,7 @@
|
||||
"error_with_status_code_occured": "상태 코드가 {{status}}인 오류가 발생했습니다.",
|
||||
"error_event_type_url_duplicate": "이 URL을 사용하는 이벤트 유형이 이미 존재합니다.",
|
||||
"error_event_type_unauthorized_create": "이 이벤트를 만들 수 없습니다.",
|
||||
"error_event_type_unauthorized_update": "이 일정을 편집할 수 없습니다.",
|
||||
"error_event_type_unauthorized_update": "이 이벤트를 편집할 수 없습니다.",
|
||||
"error_workflow_unauthorized_create": "이 워크플로를 만들 수 없습니다.",
|
||||
"error_schedule_unauthorized_create": "이 일정을 만들 수 없습니다.",
|
||||
"booking_already_cancelled": "이 예약은 이미 취소되었습니다",
|
||||
@@ -357,7 +357,7 @@
|
||||
"upcoming_bookings": "누군가 당신과 회의를 예약하는 즉시 여기에 표시됩니다.",
|
||||
"recurring_bookings": "누군가가 귀하와 되풀이 회의를 예약하는 즉시 여기에 표시됩니다.",
|
||||
"past_bookings": "과거 예약이 여기에 표시됩니다.",
|
||||
"cancelled_bookings": "취소된 예약은 여기에 표시됩니다.",
|
||||
"cancelled_bookings": "취소된 예약이 여기에 표시됩니다.",
|
||||
"unconfirmed_bookings": "확인되지 않은 예약은 여기에 표시됩니다.",
|
||||
"unconfirmed_bookings_tooltip": "미확인된 예약",
|
||||
"on": "-",
|
||||
@@ -413,8 +413,8 @@
|
||||
"team_webhooks": "팀 웹훅",
|
||||
"create_new_webhook_to_account": "내 계정에 새 웹훅 만들기",
|
||||
"new_webhook": "새 웹훅",
|
||||
"receive_cal_meeting_data": "일정이 잡히거나 취소될 때 지정된 URL에서 실시간으로 {{appName}} 회의 데이터를 수신합니다.",
|
||||
"receive_cal_event_meeting_data": "일정이 잡혔거나 취소되었을 때 지정된 URL에서 실시간으로 {{appName}} 회의 데이터를 수신합니다.",
|
||||
"receive_cal_meeting_data": "이벤트가 예약되거나 취소될 때 지정된 URL에서 실시간으로 {{appName}} 회의 데이터를 수신합니다.",
|
||||
"receive_cal_event_meeting_data": "이 이벤트가 예약되거나 취소될 때 지정된 URL에서 실시간으로 {{appName}} 회의 데이터를 수신합니다.",
|
||||
"responsive_fullscreen_iframe": "반응형 전체 화면 iframe",
|
||||
"loading": "로드 중",
|
||||
"deleting": "삭제 중...",
|
||||
@@ -551,11 +551,11 @@
|
||||
"team_description": "팀 URL 페이지에 나타날 팀 소개를 해주세요.",
|
||||
"org_description": "귀하의 조직에 대한 몇 자 남겨주세요. 이 내용은 귀하 조직의 URL 페이지에 표시됩니다.",
|
||||
"members": "회원",
|
||||
"organization_members": "조직 일원",
|
||||
"organization_members": "Organization 구성원",
|
||||
"member": "회원",
|
||||
"number_member_one": "회원 {{count}}명",
|
||||
"number_member_other": "회원 {{count}}명",
|
||||
"number_selected": "{{count}} 선택됨",
|
||||
"number_selected": "{{count}}개 선택됨",
|
||||
"owner": "소유자",
|
||||
"admin": "관리",
|
||||
"administrator_user": "관리자 사용자",
|
||||
@@ -867,13 +867,13 @@
|
||||
"no_category_apps": "{{category}} 앱 없음",
|
||||
"all_apps": "모든 앱",
|
||||
"no_category_apps_description_calendar": "중복 예약을 방지하기 위해 충돌을 확인하려는 캘린더 앱을 추가합니다",
|
||||
"no_category_apps_description_conferencing": "고객과 화상 통화를 통합하려면 회의 앱을 추가해 보세요",
|
||||
"no_category_apps_description_conferencing": "고객과 화상 통화하려면 회의 앱을 추가해 보세요",
|
||||
"no_category_apps_description_payment": "귀하와 귀하 고객 간의 거래를 용이하게 하는 결제 앱을 추가합니다",
|
||||
"no_category_apps_description_analytics": "예약 페이지에 대한 분석 앱 추가",
|
||||
"no_category_apps_description_automation": "사용할 자동화 앱 추가",
|
||||
"no_category_apps_description_other": "모든 종류의 작업을 수행하는 다른 유형의 앱을 추가합니다",
|
||||
"no_category_apps_description_web3": "예약 페이지에 web3 앱 추가",
|
||||
"no_category_apps_description_messaging": "맞춤 알림 및 미리 알림을 설정하려면 메시지 앱을 추가하세요",
|
||||
"no_category_apps_description_messaging": "사용자 정의 알림 및 미리 알림을 설정하려면 메시징 앱을 추가하세요",
|
||||
"no_category_apps_description_crm": "CRM 앱을 추가하여 만났던 사람을 추적하세요",
|
||||
"installed_app_calendar_description": "중복 예약을 방지하기 위해 충돌을 확인하도록 캘린더를 설정합니다.",
|
||||
"installed_app_payment_description": "고객에게 요금 청구 시 사용할 결제 처리 서비스를 구성합니다.",
|
||||
@@ -882,7 +882,7 @@
|
||||
"installed_app_conferencing_description": "사용할 회의 앱 구성",
|
||||
"installed_app_automation_description": "사용할 자동화 앱 구성",
|
||||
"installed_app_web3_description": "예약 페이지에 사용할 web3 앱 구성",
|
||||
"installed_app_messaging_description": "맞춤 알림 및 미리 알림 설정에 사용할 메시징 앱 구성",
|
||||
"installed_app_messaging_description": "사용자 정의 알림 및 미리 알림 설정에 사용할 메시징 앱 구성",
|
||||
"installed_app_crm_description": "만났던 사람을 추적하는 데 사용할 CRM 앱 구성",
|
||||
"analytics": "분석",
|
||||
"empty_installed_apps_headline": "설치된 앱 없음",
|
||||
@@ -1003,7 +1003,7 @@
|
||||
"user_impersonation_description": "신고하신 문제를 신속하게 해결할 수 있도록 지원 팀이 귀하의 계정에 일시적으로 로그인할 수 있게 허용합니다.",
|
||||
"team_impersonation_description": "팀 소유자/관리자가 일시적으로 귀하의 자격으로 로그인할 수 있게 합니다.",
|
||||
"make_team_private": "팀을 비공개로 설정",
|
||||
"make_team_private_description": "이 기능이 켜져 있으면 팀원은 다른 팀원을 볼 수 없게 됩니다.",
|
||||
"make_team_private_description": "이 기능을 켜면 팀원이 다른 팀원을 볼 수 없게 됩니다.",
|
||||
"you_cannot_see_team_members": "비공개 팀의 모든 팀원을 볼 수 없습니다.",
|
||||
"allow_booker_to_select_duration": "예약자가 기간을 선택하도록 허용",
|
||||
"impersonate_user_tip": "이 기능의 사용은 모두 감사됩니다.",
|
||||
@@ -1338,7 +1338,7 @@
|
||||
"profile_team_description": "팀 프로필 설정 관리",
|
||||
"profile_org_description": "사용자 조직 프로필 설정 관리",
|
||||
"members_team_description": "그룹 내 사용자",
|
||||
"organization_description": "조직의 관리자 및 일원 관리",
|
||||
"organization_description": "조직의 관리자 및 구성원 관리",
|
||||
"team_url": "팀 URL",
|
||||
"team_members": "팀원",
|
||||
"more": "더 보기",
|
||||
@@ -1494,9 +1494,9 @@
|
||||
"must_enter_team_name": "팀 이름을 입력하세요",
|
||||
"team_url_required": "팀 URL을 입력하세요",
|
||||
"url_taken": "이미 사용 중인 URL입니다",
|
||||
"problem_registering_domain": "하위 도메인 등록에 문제가 있습니다. 다시 시도하거나 관리자에게 문의하십시오.",
|
||||
"problem_registering_domain": "하위 도메인 등록에 문제가 있습니다. 다시 시도하거나 관리자에게 문의하세요.",
|
||||
"team_publish": "팀 게시",
|
||||
"number_text_notifications": "전화번호 (문자 알림)",
|
||||
"number_text_notifications": "전화번호(문자 알림)",
|
||||
"attendee_email_variable": "참석자 이메일",
|
||||
"attendee_email_info": "예약자 이메일",
|
||||
"kbar_search_placeholder": "명령어를 입력하거나 검색하세요...",
|
||||
@@ -1555,7 +1555,7 @@
|
||||
"no_apps": "Cal의 이 인스턴스에서 활성화된 앱이 없습니다",
|
||||
"no_apps_configured": "아직 구성된 앱이 없습니다",
|
||||
"enable_in_settings": "설정에서 앱을 활성화할 수 있습니다",
|
||||
"please_contact_admin": "관리자에게 문의하십시오",
|
||||
"please_contact_admin": "관리자에게 문의하세요",
|
||||
"apps_settings": "앱 설정",
|
||||
"fill_this_field": "이 필드에 입력하세요",
|
||||
"options": "선택사항",
|
||||
@@ -1659,10 +1659,10 @@
|
||||
"delete_sso_configuration_confirmation_description": "{{connectionType}} 구성을 삭제하시겠습니까? {{connectionType}} 로그인을 사용하는 팀원은 더 이상 Cal.com에 액세스할 수 없습니다.",
|
||||
"organizer_timezone": "주최자 시간대",
|
||||
"email_user_cta": "초대 보기",
|
||||
"email_no_user_invite_heading": "{{appName}} {{entity}} 가입 초대를 받으셨습니다",
|
||||
"email_no_user_invite_heading": "{{appName}} {{entity}}에 참여 초대를 받으셨습니다",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}} 님이 귀하를 {{appName}}에서 자신의 팀에 초대했습니다. {{appName}} 앱은 귀하와 귀하의 팀이 이메일을 주고 받지 않고 회의 일정을 잡을 수 있게 해주는 이벤트 정리 스케줄러입니다.",
|
||||
"email_user_invite_subheading": "{{invitedBy}}님이 {{appName}}에서 자신의 {{entity}} `{{teamName}}` 팀에 가입하도록 당신을 초대했습니다. {{appName}}은 유저와 {{entity}}에서 이메일을 주고 받지 않고도 회의 일정을 잡을 수 있게 하는 이벤트 조율 스케줄러입니다.",
|
||||
"email_no_user_invite_steps_intro": "안내해 드릴 몇 가지 간단한 단계만 거치면 곧 {{entity}}에 대해 스트레스 없이 편리하게 일정을 관리할 수 있게 될 것입니다.",
|
||||
"email_user_invite_subheading": "{{invitedBy}} 님이 {{appName}}에서 자신의 {{entity}} `{{teamName}}`에 귀하의 참여를 초대했습니다. {{appName}}은(는) 사용자와 {{entity}}이(가) 이메일을 주고 받지 않고도 회의 일정을 잡을 수 있게 해주는 이벤트 조정 스케줄러입니다.",
|
||||
"email_no_user_invite_steps_intro": "안내해 드릴 몇 가지 간단한 단계만 거치면 곧 스트레스 없이 편리하게 {{entity}} 일정을 관리할 수 있게 될 것입니다.",
|
||||
"email_no_user_step_one": "사용자 이름 선택",
|
||||
"email_no_user_step_two": "캘린더 계정 연결",
|
||||
"email_no_user_step_three": "언제 여유가 있는지 설정하세요",
|
||||
@@ -1687,7 +1687,7 @@
|
||||
"attendee_no_longer_attending": "참석자가 더 이상 이벤트에 참석하고 있지 않습니다",
|
||||
"attendee_no_longer_attending_subtitle": "{{name}}이(가) 취소되었습니다. 즉, 이 시간 슬롯에 좌석이 비어 있습니다",
|
||||
"create_event_on": "이벤트 생성일:",
|
||||
"create_routing_form_on": "회람 양식 만들기",
|
||||
"create_routing_form_on": "라우팅 양식을 만들 대상",
|
||||
"default_app_link_title": "기본 앱 링크 설정",
|
||||
"default_app_link_description": "기본 앱 링크를 설정하면 새로 생성된 모든 이벤트 유형에서 설정된 앱 링크를 사용할 수 있습니다.",
|
||||
"organizer_default_conferencing_app": "주최자의 기본 앱",
|
||||
@@ -1697,7 +1697,7 @@
|
||||
"booking_questions_title": "예약 질문",
|
||||
"booking_questions_description": "예약 페이지에서 묻는 질문을 사용자 정의합니다",
|
||||
"add_a_booking_question": "질문 추가",
|
||||
"identifier": "식별자",
|
||||
"identifier": "ID",
|
||||
"duplicate_email": "중복 이메일입니다",
|
||||
"booking_with_payment_cancelled": "이 이벤트는 더 이상 결제할 수 없습니다",
|
||||
"booking_with_payment_cancelled_already_paid": "이 예약 결제에 대한 환불 처리가 진행 중입니다.",
|
||||
@@ -1740,7 +1740,7 @@
|
||||
"no_responses_yet": "아직 응답 없음",
|
||||
"no_routes_defined": "정의된 경로 없음",
|
||||
"this_will_be_the_placeholder": "이것은 자리 표시자가 됩니다",
|
||||
"error_booking_event": "이벤트를 예약하는 도중 오류가 발생했습니다. 페이지를 새로고침한 후 다시 시도해주세요.",
|
||||
"error_booking_event": "이벤트를 예약하는 중 오류가 발생했습니다. 페이지를 새로 고치고 다시 시도하세요.",
|
||||
"timeslot_missing_title": "시간대가 선택되지 않았습니다",
|
||||
"timeslot_missing_description": "이벤트를 예약 할 시간대를 선택해주세요.",
|
||||
"timeslot_missing_cta": "시간대 선택",
|
||||
@@ -1841,11 +1841,11 @@
|
||||
"invite_link_copied": "초대 링크가 복사되었습니다",
|
||||
"invite_link_deleted": "초대 링크가 삭제되었습니다",
|
||||
"invite_link_updated": "초대 링크 설정이 저장되었습니다",
|
||||
"link_expires_after": "링크 만료 전까지 설정된 일 수...",
|
||||
"link_expires_after": "링크 만료 기한...",
|
||||
"one_day": "1일",
|
||||
"seven_days": "7일",
|
||||
"thirty_days": "30일",
|
||||
"three_months": "3개월ㄹ",
|
||||
"three_months": "3개월",
|
||||
"one_year": "1년",
|
||||
"team_invite_received": "{{teamName}}에 초대되셨습니다",
|
||||
"currency_string": "{{amount, currency}}",
|
||||
@@ -1876,7 +1876,7 @@
|
||||
"connect_google_workspace": "Google Workspace 연결",
|
||||
"google_workspace_admin_tooltip": "이 기능을 사용하려면 Workspace 관리자여야 합니다",
|
||||
"first_event_type_webhook_description": "이 이벤트 유형에 대한 첫 번째 웹훅 만들기",
|
||||
"install_app_on": "앱 설치",
|
||||
"install_app_on": "앱 설치 대상",
|
||||
"create_for": "작성 대상",
|
||||
"setup_organization": "조직 설정",
|
||||
"organization_banner_description": "팀이 라운드 로빈 및 공동 예약을 통해 공유 앱, 워크플로 및 이벤트 유형을 생성할 수 있는 환경을 만듭니다.",
|
||||
@@ -1890,35 +1890,35 @@
|
||||
"organization_name": "조직 이름",
|
||||
"organization_url": "조직 URL",
|
||||
"organization_verify_header": "조직 이메일 인증",
|
||||
"organization_verify_email_body": "조직 설정을 계속하려면 아래 코드를 사용하여 이메일 주소를 인증하십시오.",
|
||||
"organization_verify_email_body": "조직 설정을 계속하려면 아래 코드를 사용하여 이메일 주소를 인증하세요.",
|
||||
"additional_url_parameters": "추가 URL 매개변수",
|
||||
"about_your_organization": "조직 소개",
|
||||
"about_your_organization_description": "조직은 일원, 이벤트 유형, 앱, 워크플로 등을 공유하여 여러 팀을 만들 수 있는 공유 환경입니다.",
|
||||
"about_your_organization_description": "Organization은 구성원, 이벤트 유형, 앱, 워크플로 등을 공유하여 여러 팀을 만들 수 있는 공유 환경입니다.",
|
||||
"create_your_teams": "팀 만들기",
|
||||
"create_your_teams_description": "팀원을 조직에 추가하여 함께 일정을 시작하세요",
|
||||
"create_your_teams_description": "조직에 팀원을 추가하여 함께 일정 관리를 시작하세요",
|
||||
"invite_organization_admins": "조직 관리자 초대",
|
||||
"invite_organization_admins_description": "이러한 관리자는 조직의 모든 팀에 액세스할 수 있습니다. 나중에 팀 관리자와 팀원을 추가할 수 있습니다.",
|
||||
"set_a_password": "비밀번호 설정",
|
||||
"set_a_password_description": "이것으로 조직 이메일과 이 비밀번호를 사용하여 새 사용자 계정이 생성됩니다.",
|
||||
"set_a_password_description": "이렇게 하면 조직 이메일과 이 비밀번호를 사용하여 새 사용자 계정이 생성됩니다.",
|
||||
"organization_logo": "조직 로고",
|
||||
"organization_about_description": "귀하의 조직에 대해 몇 자 남겨주세요. 이 내용은 귀하 조직의 공개 프로필 페이지에 표시됩니다.",
|
||||
"ill_do_this_later": "나중에",
|
||||
"verify_your_email": "이메일 인증",
|
||||
"enter_digit_code": "{{email}} 주소로 보내드린 6자리 코드를 입력하세요",
|
||||
"verify_email_organization": "조직을 만들려면 이메일을 인증하세요",
|
||||
"code_provided_invalid": "입력하신 코드가 유효하지 않습니다. 다시 입력하십시오.",
|
||||
"code_provided_invalid": "입력하신 코드가 유효하지 않습니다. 다시 입력하세요.",
|
||||
"email_already_used": "이미 사용 중인 이메일입니다",
|
||||
"organization_admin_invited_heading": "{{orgName}}에 초대되셨습니다",
|
||||
"organization_admin_invited_body": "{{orgName}}에서 팀에 합류하여 회의 준비보다 회의 자체에 집중하세요!",
|
||||
"duplicated_slugs_warning": "중복된 슬러그로 인해 다음 팀을 생성할 수 없습니다. {{slugs}}",
|
||||
"team_names_empty": "팀 이름은 비어 있을 수 없습니다",
|
||||
"duplicated_slugs_warning": "중복된 슬러그로 인해 다음 팀을 생성할 수 없습니다: {{slugs}}",
|
||||
"team_names_empty": "팀 이름은 비워둘 수 없습니다",
|
||||
"team_names_repeated": "팀 이름은 중복될 수 없습니다",
|
||||
"user_belongs_organization": "사용자는 조직 소속입니다",
|
||||
"org_no_teams_yet": "이 조직에 아직 팀이 없습니다",
|
||||
"org_no_teams_yet_description": "관리자인 경우 여기에 표시할 팀을 만들어야 합니다.",
|
||||
"set_up": "설정",
|
||||
"set_up_your_profile": "사용자 프로필 설정",
|
||||
"set_up_your_profile_description": "{{orgName}} 내에서 귀하가 누구인지, 그리고 귀하의 공개 링크에 언제 참여하는지 사람들에게 알리십시오.",
|
||||
"set_up_your_profile_description": "{{orgName}} 내에서 귀하가 누구인지, 그리고 귀하의 공개 링크에 언제 참여하는지 사람들에게 알려주세요.",
|
||||
"my_profile": "내 프로필",
|
||||
"my_settings": "내 설정",
|
||||
"crm": "CRM",
|
||||
@@ -1930,7 +1930,7 @@
|
||||
"no_organization_slug": "이 조직의 팀을 만드는 중 오류가 발생했습니다. URL 슬러그가 없습니다.",
|
||||
"org_name": "조직 이름",
|
||||
"org_url": "조직 URL",
|
||||
"copy_link_org": "조직에 링크 복사",
|
||||
"copy_link_org": "조직 링크 복사",
|
||||
"404_the_org": "조직",
|
||||
"404_the_team": "팀",
|
||||
"404_claim_entity_org": "조직에 대한 하위 도메인 요청",
|
||||
@@ -1940,5 +1940,5 @@
|
||||
"insights_user_filter": "사용자: {{userName}}",
|
||||
"insights_subtitle": "이벤트 전반에 걸친 예약 Insights 보기",
|
||||
"custom_plan": "사용자 정의 플랜",
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 여기에 새 문자열을 추가하십시오 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 여기에 새 문자열을 추가하세요 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user