Compare commits

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

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

---------

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

* Use searchParams API to build cancelLink

* Fix cancel showSeats

* Added test for owner cancel attendee list

---------

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

* make sure videocallurl is not null

* Revert "fix error when videoCallUrl was null"

This reverts commit f23776ec8be1be334245b7e3f8a977f7e73591f1.

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

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

---------

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

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

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

* fixes skeletons, some wrong buttons, spacing, settings
2023-04-20 22:33:49 +00:00
36 changed files with 750 additions and 174 deletions
+9 -7
View File
@@ -1,7 +1,7 @@
import { isEmpty } from "lodash";
import { useTranslation } from "next-i18next";
import { useEffect } from "react";
import { getDirFromLang } from "@calcom/lib/i18n";
import { trpc } from "@calcom/trpc/react";
export function useViewerI18n() {
@@ -22,16 +22,18 @@ export function useViewerI18n() {
*/
const I18nLanguageHandler = (): null => {
const { i18n } = useTranslation("common");
const locale = useViewerI18n().data?.locale || "en";
const locale = useViewerI18n().data?.locale || i18n.language;
useEffect(() => {
if (locale && i18n.language && i18n.language !== locale) {
if (typeof i18n.changeLanguage === "function") i18n.changeLanguage(locale);
// bail early when i18n = {}
if (isEmpty(i18n)) return;
// if locale is ready and the i18n.language does != locale - changeLanguage
if (locale && i18n.language !== locale) {
i18n.changeLanguage(locale);
}
const dir = getDirFromLang(locale);
// set dir="rtl|ltr"
document.dir = i18n.dir();
document.documentElement.setAttribute("lang", locale);
document.documentElement.setAttribute("dir", dir);
}, [locale, i18n]);
return null;
@@ -106,7 +106,7 @@ export const EventAppsTab = ({ eventType }: { eventType: EventType }) => {
{!shouldLockDisableProps("apps").disabled && (
<div>
{!isLoading && notInstalledApps?.length ? (
<h2 className="text-emphasis mt-0 mb-2 text-lg font-semibold">{t("available_apps")}</h2>
<h2 className="text-emphasis my-2 text-lg font-semibold">{t("available_apps")}</h2>
) : null}
<div className="before:border-0">
{notInstalledApps?.map((app) => (
@@ -50,7 +50,7 @@ const SetupAvailability = (props: ISetupAvailabilityProps) => {
const updateSchedule = trpc.viewer.availability.schedule.update.useMutation(mutationOptions);
return (
<Form
className="bg-default dark:text-inverted text-emphasis w-full dark:bg-opacity-5"
className="bg-default dark:text-inverted text-emphasis w-full [--cal-brand-accent:#fafafa] dark:bg-opacity-5"
form={availabilityForm}
handleSubmit={async (values) => {
try {
@@ -195,7 +195,7 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
<span
className={classNames(
isInputUsernamePremium ? "border border-orange-400 " : "",
"border-default bg-muted text-subtle hidden h-9 items-center rounded-l-md border border-r-0 border-r-gray-300 px-3 text-sm md:inline-flex"
"border-default bg-muted text-subtle hidden h-9 items-center rounded-l-md border border-r-0 px-3 text-sm md:inline-flex"
)}>
{process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "")}/
</span>
@@ -215,7 +215,7 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
: "border focus:border",
markAsError
? "focus:shadow-0 focus:ring-shadow-0 border-red-500 focus:border-red-500 focus:outline-none"
: "border-l-gray-300",
: "border-l-default",
disabled ? "bg-subtle text-muted focus:border-0" : ""
)}
value={inputUsernameValue}
@@ -234,8 +234,8 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
isInputUsernamePremium ? "text-orange-400" : "",
usernameIsAvailable ? "" : ""
)}>
{isInputUsernamePremium ? <StarIconSolid className="mt-[2px] w-6" /> : <></>}
{!isInputUsernamePremium && usernameIsAvailable ? <Check className="mt-2 w-6" /> : <></>}
{isInputUsernamePremium ? <StarIconSolid className="mt-[2px] h-4 w-4" /> : <></>}
{!isInputUsernamePremium && usernameIsAvailable ? <Check className="mt-2 h-4 w-4" /> : <></>}
</span>
</div>
</div>
@@ -136,8 +136,8 @@ const UsernameTextfield = (props: ICustomUsernameProps) => {
/>
{currentUsername !== inputUsernameValue && (
<div className="absolute right-[2px] top-6 flex flex-row">
<span className={classNames("mx-2 py-2")}>
{usernameIsAvailable ? <Check className="w-6" /> : <></>}
<span className={classNames("mx-2 py-2.5")}>
{usernameIsAvailable ? <Check className="h-4 w-4" /> : <></>}
</span>
</div>
)}
+11
View File
@@ -98,6 +98,12 @@ const nextConfig = {
transform: "lucide-react/dist/esm/icons/{{ kebabCase member }}",
preventFullImport: true,
},
"@heroicons/react/solid": {
transform: "@heroicons/react/solid/esm/{{ member }}",
},
"@heroicons/react/outline": {
transform: "@heroicons/react/outline/esm/{{ member }}",
},
"@calcom/features/insights/components": {
transform: "@calcom/features/insights/components/{{member}}",
skipDefaultConversion: true,
@@ -291,6 +297,11 @@ const nextConfig = {
destination: "/api/link?action=:action&email=:email&bookingUid=:bookingUid&oldToken=:oldToken",
permanent: true,
},
{
source: "/support",
destination: "/event-types?openIntercom=true",
permanent: true,
},
];
if (process.env.NEXT_PUBLIC_WEBAPP_URL === "https://app.cal.com") {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@calcom/web",
"version": "2.8.7",
"version": "2.8.8",
"private": true,
"scripts": {
"analyze": "ANALYZE=true next build",
+3 -3
View File
@@ -59,7 +59,7 @@ export default function User(props: inferSSRProps<typeof getServerSideProps> & E
{eventTypes.map((type, index) => (
<li
key={index}
className=" border-subtle bg-default hover:bg-muted group relative border-b first:rounded-t-md last:rounded-b-md last:border-b-0">
className=" border-subtle bg-default dark:bg-muted dark:hover:bg-emphasis hover:bg-muted group relative border-b first:rounded-t-md last:rounded-b-md last:border-b-0">
<ArrowRight className="text-emphasis absolute right-3 top-3 h-4 w-4 opacity-0 transition-opacity group-hover:opacity-100" />
<Link
href={getUsernameSlugLink({ users: props.users, slug: type.slug })}
@@ -123,7 +123,7 @@ export default function User(props: inferSSRProps<typeof getServerSideProps> & E
<main
className={classNames(
shouldAlignCentrally ? "mx-auto" : "",
isEmbed ? " border-booker border-booker-width bg-default rounded-md border" : "",
isEmbed ? "border-booker border-booker-width bg-default rounded-md border" : "",
"max-w-3xl py-24 px-4"
)}>
{isSingleUser && ( // When we deal with a single user, not dynamic group
@@ -161,7 +161,7 @@ export default function User(props: inferSSRProps<typeof getServerSideProps> & E
<div
key={type.id}
style={{ display: "flex", ...eventTypeListItemEmbedStyles }}
className=" border-subtle bg-default hover:bg-muted group relative border-b first:rounded-t-md last:rounded-b-md last:border-b-0">
className="border-subtle dark:bg-muted dark:hover:bg-emphasis hover:bg-muted group relative border-b first:rounded-t-md last:rounded-b-md last:border-b-0">
<ArrowRight className="text-emphasis absolute right-4 top-4 h-4 w-4 opacity-0 transition-opacity group-hover:opacity-100" />
{/* Don't prefetch till the time we drop the amount of javascript in [user][type] page which is impacting score for [user] page */}
<div className="block w-full p-5">
+1 -4
View File
@@ -3,8 +3,6 @@ import type { DocumentContext, DocumentProps } from "next/document";
import Document, { Head, Html, Main, NextScript } from "next/document";
import { z } from "zod";
import { getDirFromLang } from "@calcom/lib/i18n";
import { csp } from "@lib/csp";
type Props = Record<string, unknown> & DocumentProps;
@@ -38,9 +36,8 @@ class MyDocument extends Document<Props> {
const { isEmbed } = this.props;
const nonceParsed = z.string().safeParse(this.props.nonce);
const nonce = nonceParsed.success ? nonceParsed.data : "";
const dir = getDirFromLang(locale);
return (
<Html lang={locale} dir={dir}>
<Html lang={locale}>
<Head nonce={nonce}>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
+46 -9
View File
@@ -891,16 +891,31 @@ const getEventTypesFromDB = async (id: number) => {
};
};
const handleSeatsEventTypeOnBooking = (
const handleSeatsEventTypeOnBooking = async (
eventType: {
seatsPerTimeSlot?: number | null;
seatsShowAttendees: boolean | null;
[x: string | number | symbol]: unknown;
},
bookingInfo: Partial<
Prisma.BookingGetPayload<{ include: { attendees: { select: { name: true; email: true } } } }>
Prisma.BookingGetPayload<{
include: {
attendees: { select: { name: true; email: true } };
seatsReferences: { select: { referenceUid: true } };
user: {
select: {
id: true;
name: true;
email: true;
username: true;
timeZone: true;
};
};
};
}>
>,
email: string
seatReferenceUid?: string,
userId?: number
) => {
if (eventType?.seatsPerTimeSlot !== null) {
// @TODO: right now bookings with seats doesn't save every description that its entered by every user
@@ -908,12 +923,34 @@ const handleSeatsEventTypeOnBooking = (
} else {
return;
}
// @TODO: If handling teams, we need to do more check ups for this.
if (bookingInfo?.user?.id === userId) {
return;
}
if (!eventType.seatsShowAttendees) {
const attendee = bookingInfo?.attendees?.find((a) => {
return a.email === email;
const seatAttendee = await prisma.bookingSeat.findFirst({
where: {
referenceUid: seatReferenceUid,
},
include: {
attendee: {
select: {
name: true,
email: true,
},
},
},
});
bookingInfo["attendees"] = attendee ? [attendee] : [];
if (seatAttendee) {
const attendee = bookingInfo?.attendees?.find((a) => {
return a.email === seatAttendee.attendee?.email;
});
bookingInfo["attendees"] = attendee ? [attendee] : [];
} else {
bookingInfo["attendees"] = [];
}
}
return bookingInfo;
};
@@ -931,7 +968,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
const parsedQuery = querySchema.safeParse(context.query);
if (!parsedQuery.success) return { notFound: true };
const { uid, email, eventTypeSlug, cancel, isSuccessBookingPage } = parsedQuery.data;
const { uid, eventTypeSlug, seatReferenceUid } = parsedQuery.data;
const bookingInfoRaw = await prisma.booking.findFirst({
where: {
@@ -1037,8 +1074,8 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
slug: eventType.team?.slug || eventType.users[0]?.username || null,
};
if (bookingInfo !== null && email && eventType.seatsPerTimeSlot) {
handleSeatsEventTypeOnBooking(eventType, bookingInfo, email);
if (bookingInfo !== null && eventType.seatsPerTimeSlot) {
await handleSeatsEventTypeOnBooking(eventType, bookingInfo, seatReferenceUid, session?.user.id);
}
const payment = await prisma.payment.findFirst({
+9 -1
View File
@@ -8,6 +8,7 @@ import type { FC } from "react";
import { useEffect, useState, memo } from "react";
import { z } from "zod";
import useIntercom from "@calcom/features/ee/support/lib/intercom/useIntercom";
import { EventTypeDescriptionLazy as EventTypeDescription } from "@calcom/features/eventtypes/components";
import CreateEventTypeDialog from "@calcom/features/eventtypes/components/CreateEventTypeDialog";
import { DuplicateDialog } from "@calcom/features/eventtypes/components/DuplicateDialog";
@@ -756,9 +757,16 @@ const WithQuery = withQuery(trpc.viewer.eventTypes.getByViewer);
const EventTypesPage = () => {
const { t } = useLocale();
const router = useRouter();
const { open } = useIntercom();
const { query } = router;
const isMobile = useMediaQuery("(max-width: 768px)");
useEffect(() => {
if (query?.openIntercom && query?.openIntercom === "true") {
open();
}
}, []);
return (
<div>
<HeadSeo
+140
View File
@@ -313,5 +313,145 @@ test.describe("Booking with Seats", () => {
// Validate that the number of seats its 10
expect(await page.locator("text=9 / 10 Seats available").count()).toEqual(0);
});
test("Should cancel with seats but event should be still accesible and with one less attendee/seat", async ({
page,
users,
bookings,
}) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Now we cancel the booking as the first attendee
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
);
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
);
// Page should not be 404
await page.locator('[data-testid="cancel"]').click();
await page.waitForLoadState("networkidle");
await expect(page).toHaveURL(/.*booking/);
});
test("Should book with seats and hide attendees info from showAttendees true", async ({
page,
users,
bookings,
}) => {
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
]);
await user.login();
const bookingWithEventType = await prisma.booking.findFirst({
where: { uid: booking.uid },
select: {
id: true,
eventTypeId: true,
},
});
await prisma.eventType.update({
data: {
seatsShowAttendees: false,
},
where: {
id: bookingWithEventType?.eventTypeId || -1,
},
});
const bookingAttendees = await prisma.attendee.findMany({
where: { bookingId: booking.id },
select: {
id: true,
},
});
const bookingSeats = [
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
];
await prisma.bookingSeat.createMany({
data: bookingSeats,
});
// Go to cancel page and see that attendees are listed and myself as I'm owner of the booking
await page.goto(`/booking/${booking.uid}?cancel=true&allRemainingBookings=false`);
const foundFirstAttendeeAsOwner = await page.locator('p[data-testid="attendee-first+seats@cal.com"]');
await expect(foundFirstAttendeeAsOwner).toHaveCount(1);
const foundSecondAttendeeAsOwner = await page.locator('p[data-testid="attendee-second+seats@cal.com"]');
await expect(foundSecondAttendeeAsOwner).toHaveCount(1);
await page.pause();
await page.goto("auth/logout");
// Now we cancel the booking as the first attendee
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
);
// No attendees should be displayed only the one that it's cancelling
const notFoundSecondAttendee = await page.locator('p[data-testid="attendee-second+seats@cal.com"]');
await expect(notFoundSecondAttendee).toHaveCount(0);
const foundFirstAttendee = await page.locator('p[data-testid="attendee-first+seats@cal.com"]');
await expect(foundFirstAttendee).toHaveCount(1);
await prisma.eventType.update({
data: {
seatsShowAttendees: true,
},
where: {
id: bookingWithEventType?.eventTypeId || -1,
},
});
await page.goto(
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
);
// Now attendees should be displayed
const foundSecondAttendee = await page.locator('p[data-testid="attendee-second+seats@cal.com"]');
await expect(foundSecondAttendee).toHaveCount(1);
const foundFirstAttendeeAgain = await page
.locator('p[data-testid="attendee-first+seats@cal.com"]')
.first();
await expect(foundFirstAttendeeAgain).toHaveCount(1);
});
});
});
+136 -1
View File
@@ -1,4 +1,5 @@
{
"identity_provider": "アイデンティティプロバイダー",
"trial_days_left": "PRO トライアル版は残り $t(day, {\"count\": {{days}} }) です",
"day_one": "{{count}} 日",
"day_other": "{{count}} 日",
@@ -69,6 +70,8 @@
"event_awaiting_approval_subject": "承認を待っています: {{date}} の {{title}}",
"event_still_awaiting_approval": "イベントはまだあなたの承認待ちです",
"booking_submitted_subject": "予約を送信しました: {{title}}、{{date}}",
"download_recording_subject": "録音のダウンロード: {{date}} の {{title}}",
"download_your_recording": "録音をダウンロード",
"your_meeting_has_been_booked": "ミーティングが予約されました",
"event_type_has_been_rescheduled_on_time_date": "あなたの {{title}} は {{date}} に再スケジュールされました。",
"event_has_been_rescheduled": "更新 - イベントのスケジュールが変更されました",
@@ -224,6 +227,7 @@
"done": "完了",
"all_done": "すべて完了!",
"all_apps": "すべて",
"available_apps": "利用可能なアプリ",
"check_email_reset_password": "メールをご確認ください。パスワードをリセットするためのリンクを送信しました。",
"finish": "完了",
"few_sentences_about_yourself": "あなたについてのいくつかの文章。これはあなたの個人URLページに表示されます。",
@@ -404,6 +408,7 @@
"add_time_availability": "新しい時間帯を追加",
"add_an_extra_layer_of_security": "パスワードが盗まれる場合に備えて、アカウントのセキュリティを強化します。",
"2fa": "二要素認証",
"2fa_disabled": "二要素認証はメールとパスワードの認証にのみ有効化できます",
"enable_2fa": "二要素認証を有効にする",
"disable_2fa": "二要素認証を無効にする",
"disable_2fa_recommendation": "2FA を無効にする必要がある場合は、その必要がなくなった後すぐに有効にしなおすことをおすすめします。",
@@ -585,6 +590,20 @@
"minutes": "分",
"round_robin": "ラウンドロビン",
"round_robin_description": "複数のチームメンバー間のミーティングを定期化する。",
"managed_event": "管理イベント",
"username_placeholder": "ユーザー名",
"managed_event_description": "イベントタイプを一括して作成し、チームメンバーに割り当てる",
"managed": "管理",
"managed_event_url_clarification": "「ユーザー名」には、割り当てられたメンバーのユーザー名が入ります",
"assign_to": "割り当て先",
"add_members": "メンバーを追加…",
"count_members_one": "{{count}} 人のメンバー",
"count_members_other": "{{count}} 人のメンバー",
"no_assigned_members": "割り当てられたメンバーはいません",
"assigned_to": "割り当て先",
"start_assigning_members_above": "上記のメンバーへの割り当てを開始する",
"locked_fields_admin_description": "メンバーはこれを編集できません",
"locked_fields_member_description": "このオプションはチーム管理者によってロックされました",
"url": "URL",
"hidden": "隠れている",
"readonly": "読み込み専用",
@@ -736,6 +755,11 @@
"minimum_booking_notice": "最低頻度の通知",
"slot_interval": "時間帯の間隔",
"slot_interval_default": "イベントの長さを使用する (デフォルト)",
"delete_event_type": "イベントタイプを削除しますか?",
"delete_managed_event_type": "管理イベントタイプを削除しますか?",
"delete_event_type_description": "これまでにこのリンクを共有された人は、リンクを使って予約することができなくなります。",
"delete_managed_event_type_description": "<ul><li>このイベントタイプを割り当てられたメンバーも、イベントタイプが削除されます。</li><li>これまでにこのリンクを共有された人は皆、このリンクを使った予約ができなくなります。</li></ul>",
"confirm_delete_event_type": "はい、削除します",
"delete_account": "アカウントを削除する",
"confirm_delete_account": "はい。アカウントを削除します",
"delete_account_confirmation_message": "あなたの {{appName}} アカウントを本当に削除してもよろしいですか?あなたのアカウントリンクを共有しているユーザーは、そのアカウントを使用して予約を行うことができなくなり、保存していた設定も失われます。",
@@ -1126,11 +1150,13 @@
"current_username": "現在のユーザー名",
"example_1": "例 1",
"example_2": "例 2",
"booking_question_identifier": "予約時の質問の識別子",
"company_size": "会社の規模",
"what_help_needed": "何かお困りですか?",
"variable_format": "変数の形式",
"webhook_subscriber_url_reserved": "ウェブフック購読者 URL は既に定義されています",
"custom_input_as_variable_info": "追加の入力ラベルに含まれている特殊文字はすべて無視し (アルファベットと数字のみを使用)、アルファベットをすべて大文字に、そして空白をアンダースコアへと変換します。",
"using_booking_questions_as_variables": "予約時の質問を変数として使う方法は?",
"download_desktop_app": "デスクトップアプリをダウンロード",
"set_ping_link": "Ping リンクを設定",
"rate_limit_exceeded": "試行回数の上限を超えました",
@@ -1176,6 +1202,7 @@
"start_of_week": "週の始まり",
"recordings_title": "録音",
"recording": "録音",
"happy_scheduling": "スケジュール設定をお楽しみください",
"select_calendars": "ダブルブッキングを防ぐために、スケジュールの重なりをチェックするカレンダーを選択してください。",
"check_for_conflicts": "スケジュールの重なりをチェック",
"view_recordings": "録音を表示",
@@ -1213,6 +1240,7 @@
"impersonation": "なりすまし",
"impersonation_description": "ユーザーのなりすましを管理するための設定です",
"users": "ユーザー",
"user": "ユーザー",
"profile_description": "{{appName}} プロフィールの設定を管理します",
"users_description": "こちらではすべてのユーザーの一覧をご確認いただけます",
"users_listing": "ユーザー一覧",
@@ -1253,6 +1281,8 @@
"download_responses": "回答をダウンロード",
"download_responses_description": "CSV 形式ですべての回答をフォームにダウンロードします。",
"download": "ダウンロード",
"download_recording": "録音をダウンロード",
"recording_from_your_recent_call": "Cal.com での最近の通話の録音がダウンロード可能です",
"create_your_first_form": "最初のフォームを作成",
"create_your_first_form_description": "ルーティングフォームを使用すれば、絞り込みの質問を通して適切な人物やイベントの種類へとルーティングを行うことができます。",
"create_your_first_webhook": "最初のウェブフックを作成",
@@ -1289,6 +1319,15 @@
"exchange_authentication_standard": "Basic 認証",
"exchange_authentication_ntlm": "NTLM 認証",
"exchange_compression": "GZip 圧縮",
"exchange_version": "Exchange のバージョン",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "作成したすべてのフォームとルートをここで確認できます。",
"routing_forms_send_email_owner": "所有者にメールを送信",
"routing_forms_send_email_owner_description": "フォームの送信時に所有者にメールを送信します",
@@ -1343,6 +1382,7 @@
"add_limit": "上限を追加する",
"team_name_required": "チーム名が必要です",
"show_attendees": "ゲスト間で出席者情報を共有する",
"how_booking_questions_as_variables": "予約時の質問を変数として使う方法は?",
"format": "書式",
"uppercase_for_letters": "すべての文字に大文字を使用する",
"replace_whitespaces_underscores": "空白をアンダーバー「 _ 」に置き換える",
@@ -1357,6 +1397,7 @@
"billing_help_title": "他にもお手伝いできることはありませんか?",
"billing_help_description": "請求に関してサポートが必要な場合には、サポートチームがお手伝いさせていただきます。",
"billing_help_cta": "サポートに問い合わせる",
"ignore_special_characters_booking_questions": "予約時の質問の識別子に含まれている特殊文字はすべて無視し、アルファベットと数字のみを使用してください",
"retry": "再試行",
"fetching_calendars_error": "カレンダーの取得中にエラーが発生しました。<1>もう一度お試しいただく</1>か、カスタマーサポートまでお問い合わせください。",
"calendar_connection_fail": "カレンダーの接続に失敗しました",
@@ -1439,11 +1480,17 @@
"fixed_round_robin": "固定ラウンドロビン",
"add_one_fixed_attendee": "固定された出席者を 1 人追加し、複数の出席者についてラウンドロビン方式で出席スケジュールを決定します。",
"calcom_is_better_with_team": "Cal.com はチームでの使用に適しています",
"the_calcom_team": "Cal.com チーム",
"add_your_team_members": "イベントの種類にチームメンバーを追加します。一括スケジューリングで全員を参加させたり、ラウンドロビンスケジューリングで最適な人を設定したりすることができます。",
"booking_limit_reached": "このイベントタイプの予約上限に達しました",
"duration_limit_reached": "このイベントタイプの時間上限に達しました",
"admin_has_disabled": "管理者が {{appName}} を無効にしています",
"disabled_app_affects_event_type": "管理者が {{appName}} を無効にしているため、あなたのイベントの種類 {{eventType}} に影響を与える可能性があります",
"event_replaced_notice": "管理者があなたのイベントタイプの1つを置き換えました",
"email_subject_slug_replacement": "チーム管理者があなたのイベントの /{{slug}} を置き換えました",
"email_body_slug_replacement_notice": "<strong>{{teamName}}</strong>チームの管理者が、あなたのイベントタイプの <strong>/{{slug}}</strong> を彼らが管理する管理イベントタイプに置き換えました。",
"email_body_slug_replacement_info": "あなたのリンクは引き続き機能しますが、リンクの設定の一部が変更された可能性があります。変更はイベントタイプで確認できます。",
"email_body_slug_replacement_suggestion": "イベントタイプについてご質問がある場合は、管理者までお問合せください。<br /><br />スケジュール設定をお楽しみください、<br />Cal.comチーム",
"disable_payment_app": "管理者が {{appName}} を無効にしたため、イベントの種類 {{title}} に影響を与える可能性があります。出席者がこの種類のイベントを予約することは可能ですが、支払いを促されることはありません。管理者が支払い方法を再度有効にするまでの間これを防ぐために、イベントの種類を非表示にすることができます。",
"payment_disabled_still_able_to_book": "出席者がこの種類のイベントを予約することは可能ですが、支払いを促されることはありません。管理者が支払い方法を再度有効にするまでの間これを防ぐために、イベントの種類を非表示にすることができます。",
"app_disabled_with_event_type": "管理者が {{appName}} を無効にしているため、あなたのイベントの種類 {{title}} に影響を与える可能性があります.",
@@ -1492,6 +1539,7 @@
"date_overrides_update_btn": "上書きを更新",
"event_type_duplicate_copy_text": "{{slug}}-copy",
"set_as_default": "デフォルトとして設定",
"hide_eventtype_details": "イベントタイプの詳細を非表示にする",
"show_navigation": "ナビゲーションを表示",
"hide_navigation": "ナビゲーションを非表示にする",
"verification_code_sent": "確認コードが送信されました",
@@ -1505,6 +1553,7 @@
"create_your_first_team_webhook_description": "このチームイベントの種類の初めての webhook を作成します",
"create_webhook_team_event_type": "このチームイベントの種類の webhook を作成します",
"disable_success_page": "予約完了ページを無効化する (リダイレクト URL がある場合にのみ有効)",
"invalid_admin_password": "あなたは管理者ですが、パスワードの長さが足りないか(15文字以上必要です)、まだ二要素認証をしていません",
"change_password_admin": "パスワードを変更して管理者アクセス権を取得する",
"username_already_taken": "ユーザー名が既に使用されています",
"assignment": "割り当て",
@@ -1537,6 +1586,7 @@
"ee_enterprise_license": "\"/ee\" Enterprise ライセンス",
"enterprise_booking_fee": "{{enterprise_booking_fee}}/月で開始する",
"enterprise_license_includes": "商用ユースケースで必要となるすべてのもの",
"no_need_to_keep_your_code_open_source": "コードをオープンソースにしておく必要はありません",
"repackage_rebrand_resell": "再パッケージ、リブランディング、再販売が簡単になります",
"a_vast_suite_of_enterprise_features": "膨大な量の企業向け機能パッケージ",
"free_license_fee": "0.00 ドル/月",
@@ -1598,6 +1648,7 @@
"default_app_link_title": "デフォルトのアプリリンクを設定",
"default_app_link_description": "デフォルトのアプリリンクを設定することで、新たに作成するすべてのイベントの種類が設定したアプリリンクを使用できるようになります。",
"change_default_conferencing_app": "デフォルトとして設定",
"organizer_default_conferencing_app": "主催者のデフォルトアプリ",
"under_maintenance": "メンテナンスのため停止中",
"under_maintenance_description": "{{appName}} チームが定期メンテナンスを行っています。質問がある場合には、サポートへとお問い合わせください。",
"event_type_seats": "{{numberOfSeats}} 席",
@@ -1612,6 +1663,7 @@
"not_enough_seats": "座席が足りません",
"form_builder_field_already_exists": "この名前のフィールドは既に存在します",
"form_builder_field_add_subtitle": "予約ページで尋ねる質問をカスタマイズする",
"show_on_booking_page": "予約ページに表示",
"get_started_zapier_templates": "Zapier テンプレートの使用を開始する",
"team_is_unpublished": "{{team}} は公開されていません",
"team_is_unpublished_description": "このチームのリンクは現在利用できません。チームの所有者に問い合わせるか、リンクを公開するように依頼してください。",
@@ -1635,6 +1687,14 @@
"add_1_option_per_line": "1 行に 1 つのオプションを追加する",
"select_a_router": "ルーターを選択",
"add_a_new_route": "新しいルートを追加",
"make_informed_decisions": "インサイトを使って情報に基づいた決定をする",
"make_informed_decisions_description": "インサイトダッシュボードではチーム全体のアクティビティがひと目でわかります。傾向もわかるので、チームはより良いスケジューリングと決定ができます。",
"view_bookings_across": "メンバー全体の予約を表示",
"view_bookings_across_description": "誰が最も予約されているか確認し、チーム全体で最適な配分ができるようにします",
"identify_booking_trends": "予約の傾向を明らかにする",
"identify_booking_trends_description": "週のどの期間と1日のどの時間帯が予約者に人気か確認します",
"spot_popular_event_types": "人気のイベントタイプを見つける",
"spot_popular_event_types_description": "どのイベントタイプが最もクリックされ、予約されているのか確認します",
"no_responses_yet": "回答はまだありません",
"this_will_be_the_placeholder": "これがプレースホルダーになります",
"this_meeting_has_not_started_yet": "このミーティングはまだ開始されていません",
@@ -1646,8 +1706,83 @@
"can_you_try_again": "別の時間帯でもう1度お試しください",
"verify": "確認する",
"timezone_variable": "タイムゾーン",
"timezone_info": "受け取る人のタイムゾーン",
"event_end_time_variable": "イベント終了時刻",
"event_end_time_info": "イベント終了時刻",
"cancel_url_variable": "キャンセル URL",
"cancel_url_info": "予約をキャンセルするための URL",
"reschedule_url_variable": "スケジュール変更 URL",
"reschedule_url_info": "予約をスケジュール変更するための URL",
"invalid_event_name_variables": "イベント名に無効な変数があります",
"select_all": "すべてを選択",
"default_conferencing_bulk_title": "既存のイベントタイプを一括更新する",
"default_conferencing_bulk_description": "選択したイベントタイプの場所を更新します"
"members_default_schedule": "メンバーのデフォルトスケジュール",
"set_by_admin": "チーム管理者により設定",
"members_default_location": "メンバーのデフォルトの場所",
"members_default_schedule_description": "各メンバーのデフォルトの空き状況スケジュールを使用します。メンバーはスケジュールを編集したり、変更したりできます。",
"requires_at_least_one_schedule": "少なくとも 1 つのスケジュールが必要です",
"default_conferencing_bulk_description": "選択したイベントタイプの場所を更新します",
"locked_for_members": "メンバーにはロックされています",
"locked_apps_description": "メンバーは有効なアプリを確認できますが、アプリの設定を編集することはできません",
"locked_webhooks_description": "メンバーは有効なウェブフックを確認できますが、ウェブフックの設定を編集することはできません",
"locked_workflows_description": "メンバーは有効なワークフローを確認できますが、ワークフローの設定を編集することはできません",
"locked_by_admin": "管理者によりロックされています",
"app_not_connected": "{{appName}} のアカウントに接続していません。",
"connect_now": "今すぐ接続",
"managed_event_dialog_confirm_button_one": "{{count}} 人のメンバーを置き換えて通知する",
"managed_event_dialog_confirm_button_other": "{{count}} 人のメンバーを置き換えて通知する",
"managed_event_dialog_title_one": "{{count}} 人のメンバーには url/{{slug}} が既に存在します。置き換えますか?",
"managed_event_dialog_title_other": "{{count}} 人のメンバーには url/{{slug}} が既に存在します。置き換えますか?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong>は既に <strong>/{{slug}}</strong> url を使用しています。",
"managed_event_dialog_information_other": "<strong>{{names}}</strong>は既に <string>/{{slug}}</strong> url を使用しています。",
"managed_event_dialog_clarification": "置き換えを選択すると、通知が送られます。上書きしたくない場合は、戻って削除してください。",
"review_event_type": "イベントタイプを確認",
"looking_for_more_analytics": "詳しい分析をお探しですか?",
"looking_for_more_insights": "詳しいインサイトをお探しですか?",
"add_filter": "フィルターを追加",
"select_user": "ユーザーを選択",
"select_event_type": "イベントタイプを選択",
"select_date_range": "日付範囲を選択",
"popular_events": "人気のイベント",
"no_event_types_found": "イベントタイプが見つかりません",
"average_event_duration": "イベントの平均時間",
"most_booked_members": "最も予約が多いメンバー",
"least_booked_members": "最も予約が少ないメンバー",
"events_created": "イベントが作成されました",
"events_completed": "イベントが完了しました",
"events_cancelled": "イベントがキャンセルされました",
"events_rescheduled": "イベントがスケジュール変更されました",
"from_last_period": "最後の期間から",
"from_to_date_period": "開始:{{startDate}} 終了:{{endDate}}",
"analytics_for_organisation": "インサイト",
"subtitle_analytics": "チームのアクティビティについてさらに詳しく知る",
"redirect_url_warning": "リダイレクトを追加すると予約完了ページが無効化されます。必ずカスタムの予約完了ページで「予約が確認されました」と伝えてください。",
"event_trends": "イベントのトレンド",
"clear_filters": "フィルターをクリア",
"hold": "保留",
"on_booking_option": "予約の支払いを受け取る",
"hold_option": "予約不参加料金を請求",
"card_held": "カードを保留",
"charge_card": "カードに請求",
"card_charged": "カードに請求されました",
"no_show_fee_amount": "{{amount, currency}} の予約不参加料金",
"no_show_fee": "予約不参加料金",
"submit_card": "カードを送信",
"submit_payment_information": "支払い情報を送信",
"meeting_awaiting_payment_method": "会議の支払い方法を待っています",
"no_show_fee_charged_email_subject": "{{date}} の {{title}} に {{amount, currency}} の予約不参加料金が請求されました",
"no_show_fee_charged_text_body": "予約不参加料金が請求されました",
"no_show_fee_charged_subtitle": "次のイベントに {{amount, currency}} の予約不参加料金が請求されました",
"error_charging_card": "予約不参加料金の請求に問題が発生しました。後でもう一度お試しください。",
"collect_no_show_fee": "予約不参加料金を受け取る",
"no_show_fee_charged": "予約不参加料金が請求されました",
"insights": "インサイト",
"testing_workflow_info_message": "このワークフローをテストする際は、少なくとも1時間前でないとメールとSMSをスケジュール設定できないことにご注意ください",
"insights_no_data_found_for_filter": "選択したフィルターまたは選択した日付のデータが見つかりません。",
"acknowledge_booking_no_show_fee": "このイベントに参加しない場合、{{amount, currency}} の予約不参加料金が私のカードに請求されることに同意します。",
"card_details": "カードの詳細",
"seats_and_no_show_fee_error": "現在、座席の有効化と予約不参加料金の請求はできません",
"complete_your_booking": "予約を完了する",
"complete_your_booking_subject": "次の予約を完了する:{{date}} の {{title}}",
"email_invite_team": "{{email}} は招待されました"
}
+140 -21
View File
@@ -69,6 +69,8 @@
"event_awaiting_approval_subject": "Oczekiwanie na zatwierdzenie: {{title}} w {{date}}",
"event_still_awaiting_approval": "Wydarzenie nadal oczekuje na Twoje zatwierdzenie",
"booking_submitted_subject": "Rezerwacja potwierdzona: {{title}} w {{date}}",
"download_recording_subject": "Pobierz nagranie: {{title}} z {{date}}",
"download_your_recording": "Pobierz nagranie",
"your_meeting_has_been_booked": "Twoje spotkanie zostało zarezerwowane",
"event_type_has_been_rescheduled_on_time_date": "Twój {{title}} został przełożony na {{date}}.",
"event_has_been_rescheduled": "Zaktualizowano - Twoje wydarzenie zostało przełożone",
@@ -111,7 +113,7 @@
"hidden_team_owner_message": "Potrzebujesz konta pro aby korzystać z zespołów, jesteś ukryty do czasu ulepszenia.",
"link_expires": "P.S. Wygasa za {{expiresIn}} godzin.",
"upgrade_to_per_seat": "Ulepsz do Per-Seat",
"seat_options_doesnt_support_confirmation": "Opcja miejsc nie obsługuje wymogu potwierdzenia.",
"seat_options_doesnt_support_confirmation": "Opcja miejsc nie obsługuje wymogu potwierdzenia",
"team_upgrade_seats_details": "Spośród {{memberCount}} członków Twojego zespołu, {{unpaidCount}} miejsc(e) nie jest opłacane. Szacowany całkowity koszt Twojego członkostwa w liczbie ${{seatPrice}} na miesiąc wynosi ${{totalCost}} na miesiąc.",
"team_upgrade_banner_description": "Dziękujemy za wypróbowanie naszego nowego planu zespołowego. Zauważyliśmy, że Twój zespół „{{teamName}}” trzeba ulepszyć.",
"team_upgrade_banner_action": "Ulepsz tutaj",
@@ -224,6 +226,7 @@
"done": "Gotowe",
"all_done": "Wszystko gotowe!",
"all_apps": "Wszystkie",
"available_apps": "Dostępne aplikacje",
"check_email_reset_password": "Sprawdź swój e-mail. Wysłaliśmy Ci link do zresetowania hasła.",
"finish": "Ukończ",
"few_sentences_about_yourself": "Kilka zdań o Tobie. To pojawi się na Twojej osobistej stronie URL.",
@@ -404,6 +407,7 @@
"add_time_availability": "Dodaj nowy przedział czasowy",
"add_an_extra_layer_of_security": "Dodaj dodatkową warstwę zabezpieczeń do swojego konta na wypadek kradzieży hasła.",
"2fa": "Uwierzytelnianie dwuetapowe",
"2fa_disabled": "Uwierzytelnianie dwuetapowe może zostać włączone tylko do uwierzytelniania adresu e-mail i hasła",
"enable_2fa": "Włącz uwierzytelnianie dwuskładnikowe",
"disable_2fa": "Wyłącz uwierzytelnianie dwuetapowe",
"disable_2fa_recommendation": "Jeśli chcesz wyłączyć 2FA, zalecamy ponowne włączenie go tak szybko, jak to możliwe.",
@@ -433,7 +437,7 @@
"password_hint_min": "Długość co najmniej 7 znaków",
"password_hint_admin_min": "Długość co najmniej 15 znaków",
"password_hint_num": "Zawrzyj co najmniej 1 cyfrę",
"max_limit_allowed_hint": "Może składać się maksymalnie z {{limit}} znaków.",
"max_limit_allowed_hint": "Może składać się z maksymalnie {{limit}} znaków",
"invalid_password_hint": "Hasło musi składać się z co najmniej {{passwordLength}} znaków, zawierać co najmniej jedną cyfrę oraz kombinację wielkich i małych liter",
"incorrect_password": "Hasło jest nieprawidłowe.",
"incorrect_username_password": "Nieprawidłowa nazwa użytkownika lub hasło.",
@@ -585,6 +589,19 @@
"minutes": "Minuty",
"round_robin": "Round Robin",
"round_robin_description": "Cykl spotkań między wieloma członkami zespołu.",
"username_placeholder": "nazwa użytkownika",
"managed_event_description": "Masowo twórz i udostępniaj rodzaje wydarzeń członkom zespołu",
"managed": "Zarządzane",
"managed_event_url_clarification": "Pole \"nazwa użytkownika\" zostanie uzupełnione nazwami przypisanych użytkowników",
"assign_to": "Przypisz do",
"add_members": "Dodaj członków...",
"count_members_one": "Liczba członków: {{count}}",
"count_members_other": "Liczba członków: {{count}}",
"no_assigned_members": "Brak przypisanych członków",
"assigned_to": "Przypisano do:",
"start_assigning_members_above": "Rozpocznij przypisywanie członków powyżej",
"locked_fields_admin_description": "Członkowie nie będą mogli tego edytować",
"locked_fields_member_description": "Ta opcja została zablokowana przez administratora zespołu",
"url": "Adres URL",
"hidden": "Ukryte",
"readonly": "Tylko do odczytu",
@@ -736,6 +753,11 @@
"minimum_booking_notice": "Minimalne powiadomienie",
"slot_interval": "Przedziały czasowe",
"slot_interval_default": "Użyj długości zdarzenia (domyślnie)",
"delete_event_type": "Usunąć typ wydarzenia?",
"delete_managed_event_type": "Usunąć typ zarządzanego wydarzenia?",
"delete_event_type_description": "Osoby, którym udostępniono ten link, nie będą już mogły dokonać rezerwacji za jego pomocą.",
"delete_managed_event_type_description": "<ul><li>Typy wydarzeń członków przypisanych do tego typu wydarzenia również zostaną usunięte.</li><li>Osoby, którym udostępniono linki, nie będą już mogły dokonać rezerwacji za ich pomocą.</li></ul>",
"confirm_delete_event_type": "Tak, usuń",
"delete_account": "Usuń konto",
"confirm_delete_account": "Tak, usuń konto",
"delete_account_confirmation_message": "Czy na pewno chcesz usunąć swój {{appName}}. umówić konto? Każdy, kto udostępnił link do Twojego konta, nie będzie już mógł zarezerwować za jego pomocą i wszystkie zapisane preferencje zostaną utracone.",
@@ -1176,6 +1198,7 @@
"start_of_week": "Początek tygodnia",
"recordings_title": "Nagrania",
"recording": "Nagranie",
"happy_scheduling": "Miłego planowania",
"select_calendars": "Wybierz kalendarze, które chcesz sprawdzić pod kątem konfliktów, aby uniknąć podwójnych rezerwacji.",
"check_for_conflicts": "Sprawdź konflikty",
"view_recordings": "Wyświetl nagrania",
@@ -1213,6 +1236,7 @@
"impersonation": "Podszywanie się",
"impersonation_description": "Ustawienia do zarządzania podszywaniem się pod użytkownika",
"users": "Użytkownicy",
"user": "Użytkownik",
"profile_description": "Zarządzaj ustawieniami swojego profilu {{appName}}",
"users_description": "Tutaj znajdziesz listę wszystkich użytkowników",
"users_listing": "Lista użytkowników",
@@ -1253,6 +1277,8 @@
"download_responses": "Pobierz odpowiedzi",
"download_responses_description": "Pobierz wszystkie odpowiedzi do formularza w formacie CSV.",
"download": "Pobierz",
"download_recording": "Pobierz nagranie",
"recording_from_your_recent_call": "Nagranie z ostatniego połączenia na Cal.com jest gotowe do pobrania",
"create_your_first_form": "Utwórz pierwszy formularz",
"create_your_first_form_description": "Za pomocą formularzy przekierowujących możesz zadawać pytania profilujące i przekierowywać użytkowników do odpowiednich osób lub typów wydarzeń.",
"create_your_first_webhook": "Utwórz pierwszy Webhook",
@@ -1289,6 +1315,14 @@
"exchange_authentication_standard": "Uwierzytelnianie podstawowe",
"exchange_authentication_ntlm": "Uwierzytelnianie NTLM",
"exchange_compression": "Kompresja gzip",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Możesz tutaj zobaczyć wszystkie utworzone przez siebie formularze i przekierowania.",
"routing_forms_send_email_owner": "Wyślij wiadomość e-mail do właściciela",
"routing_forms_send_email_owner_description": "Wysyła wiadomość e-mail do właściciela, gdy formularz zostanie przesłany.",
@@ -1339,7 +1373,7 @@
"limit_booking_frequency": "Ogranicz częstotliwość rezerwacji",
"limit_booking_frequency_description": "Ogranicz liczbę rezerwacji tego wydarzenia",
"limit_total_booking_duration": "Ogranicz całkowity czas trwania rezerwacji",
"limit_total_booking_duration_description": "Ogranicz całkowity czas, przez jaki to wydarzenie może być rezerwowane.",
"limit_total_booking_duration_description": "Ogranicz całkowity czas, przez jaki można rezerwować to wydarzenie",
"add_limit": "Dodaj limit",
"team_name_required": "Wymagana nazwa zespołu",
"show_attendees": "Udostępniaj gościom informacje o uczestnikach",
@@ -1439,11 +1473,16 @@
"fixed_round_robin": "Stały algorytm karuzelowy",
"add_one_fixed_attendee": "Dodaj jednego stałego uczestnika i przeglądaj uczestników zgodnie z algorytmem karuzelowym",
"calcom_is_better_with_team": "Usługa Cal.com jest lepsza z zespołami",
"the_calcom_team": "Zespół Cal.com",
"add_your_team_members": "Dodaj członków zespołu do typów wydarzeń. Użyj zbiorowego ustalania harmonogramu, aby uwzględnić wszystkich lub znajdź najodpowiedniejszą osobę za pomocą algorytmu karuzelowego.",
"booking_limit_reached": "Osiągnięto limit rezerwacji tego typu wydarzenia",
"duration_limit_reached": "Osiągnięto limit czasu trwania tego typu wydarzenia",
"admin_has_disabled": "Administrator wyłączył aplikację {{appName}}",
"disabled_app_affects_event_type": "Administrator wyłączył aplikację {{appName}}, która ma wpływ na Twój typ wydarzenia ({{eventType}})",
"event_replaced_notice": "Administrator zastąpił jeden z Twoich typów wydarzeń",
"email_subject_slug_replacement": "Administrator zespołu zastąpił Twoje wydarzenie /{{slug}}",
"email_body_slug_replacement_info": "Twój link nadal będzie działał, ale niektóre z jego ustawień mogły ulec zmianie. Możesz zobaczyć szczegóły w typach zdarzeń.",
"email_body_slug_replacement_suggestion": "Jeśli masz jakiekolwiek pytania dotyczące typu wydarzenia, skontaktuj się z administratorem.<br /><br />Miłego planowania, <br />zespół Cal.com",
"disable_payment_app": "Administrator wyłączył aplikację {{appName}}, która ma wpływ na Twój typ wydarzenia ({{title}}). Uczestnicy nadal mogą rezerwować wydarzenie tego typu, ale nie zostaną poproszeni o płatność. Możesz ukryć ten typ wydarzenia, aby temu zapobiec, póki administrator nie włączy ponownie Twojej metody płatności.",
"payment_disabled_still_able_to_book": "Uczestnicy nadal mogą rezerwować wydarzenie tego typu, ale nie zostaną poproszeni o płatność. Możesz ukryć ten typ wydarzenia, aby temu zapobiec, póki administrator nie włączy ponownie Twojej metody płatności.",
"app_disabled_with_event_type": "Administrator wyłączył aplikację {{appName}}, która ma wpływ na Twój typ wydarzenia ({{title}}).",
@@ -1492,6 +1531,7 @@
"date_overrides_update_btn": "Zaktualizuj zastąpienie",
"event_type_duplicate_copy_text": "{{slug}}-kopia",
"set_as_default": "Ustaw jako domyślne",
"hide_eventtype_details": "Ukryj szczegóły typu wydarzenia",
"show_navigation": "Pokaż nawigację",
"hide_navigation": "Ukryj nawigację",
"verification_code_sent": "Wysłano kod weryfikacyjny",
@@ -1505,6 +1545,7 @@
"create_your_first_team_webhook_description": "Utwórz swój pierwszy element webhook dla tego typu wydarzenia zespołowego",
"create_webhook_team_event_type": "Utwórz element webhook dla tego typu wydarzenia zespołowego",
"disable_success_page": "Wyłącz stronę powodzenia (działa tylko wtedy, gdy masz adres URL przekierowania)",
"invalid_admin_password": "Jesteś administratorem, ale Twoje hasło jest krótsze niż 15 znaków lub nie używasz jeszcze uwierzytelniania dwuetapowego",
"change_password_admin": "Zmień hasło, aby uzyskać uprawnienia dostępu administratora",
"username_already_taken": "Nazwa użytkownika jest już zajęta",
"assignment": "Przypisanie",
@@ -1586,44 +1627,46 @@
"recommended_next_steps": "Zalecane następne kroki",
"create_a_managed_event": "Utwórz typ zarządzanego wydarzenia",
"meetings_are_better_with_the_right": "Spotkania idą lepiej, gdy uczestniczą w nich właściwi członkowie zespołu. Zaproś ich teraz.",
"create_a_one_one_template": "Utwórz szablon jeden na jeden dla danego typu wydarzenia i udostępnij go wielu użytkownikom.",
"create_a_one_one_template": "Utwórz jeden szablon dla danego typu wydarzenia i udostępnij go wielu użytkownikom.",
"collective_or_roundrobin": "Zbiorowo lub według algorytmu karuzelowego",
"book_your_team_members": "Zarezerwuj wszystkich członków zespołu za pomocą wydarzeń zbiorowych lub przeglądaj dostępne osoby, aby znaleźć tę właściwą za pomocą algorytmu karuzelowego.",
"event_no_longer_attending_subject": "Nie bierzesz już udziału w wydarzeniu {{title}} odbywającym się {{date}}.",
"no_longer_attending": "Nie bierzesz już udziału w tym wydarzeniu.",
"attendee_no_longer_attending_subject": "Uczestnik nie bierze już udziału w wydarzeniu {{title}} odbywającym się {{date}}.",
"event_no_longer_attending_subject": "Nie bierzesz już udziału w wydarzeniu {{title}} odbywającym się {{date}}",
"no_longer_attending": "Nie bierzesz już udziału w tym wydarzeniu",
"attendee_no_longer_attending_subject": "Uczestnik nie bierze już udziału w wydarzeniu {{title}} odbywającym się {{date}}",
"attendee_no_longer_attending": "Uczestnik nie bierze już udziału w Twoim wydarzeniu.",
"attendee_no_longer_attending_subtitle": "Użytkownik {{name}} anulował rezerwację. To oznacza, że zwolniło się miejsce w tym terminie.",
"attendee_no_longer_attending_subtitle": "Użytkownik {{name}} anulował rezerwację. To znaczy, że zwolniło się miejsce w tym terminie",
"create_event_on": "Utwórz wydarzenie w kalendarzu",
"default_app_link_title": "Ustaw domyślny link do aplikacji",
"default_app_link_description": "Ustawienie domyślnego linku do aplikacji pozwala wszystkim nowo utworzonym typom wydarzeń na używanie ustawionego przez Ciebie linku do aplikacji.",
"change_default_conferencing_app": "Ustaw jako domyślne",
"organizer_default_conferencing_app": "Domyślna aplikacja organizatora",
"under_maintenance": "Przerwa konserwacyjna",
"under_maintenance_description": "Zespół {{appName}} przeprowadza zaplanowane prace konserwacyjne. Jeśli masz jakieś pytania, skontaktuj się z pomocą techniczną.",
"event_type_seats": "Liczba stanowisk: {{numberOfSeats}}",
"booking_questions_title": "Pytania dotyczące rezerwacji",
"booking_questions_description": "Dostosuj pytania zadawane na stronie rezerwacji",
"add_a_booking_question": "Dodaj pytanie",
"duplicate_email": "Adres e-mail jest zduplikowany.",
"duplicate_email": "Adres e-mail jest zduplikowany",
"booking_with_payment_cancelled": "Nie można już zapłacić za to wydarzenie",
"booking_with_payment_cancelled_already_paid": "Zwrot środków za tę rezerwację jest już w drodze.",
"booking_with_payment_cancelled_refunded": "Płatność za tę rezerwację została zwrócona.",
"booking_confirmation_failed": "Potwierdzenie rezerwacji nie powiodło się",
"not_enough_seats": "Za mało miejsc",
"form_builder_field_already_exists": "Pole o tej nazwie już istnieje.",
"form_builder_field_already_exists": "Pole o tej nazwie już istnieje",
"form_builder_field_add_subtitle": "Dostosuj pytania zadawane na stronie rezerwacji",
"show_on_booking_page": "Wyświetl na stronie rezerwacji",
"get_started_zapier_templates": "Zacznij korzystać z szablonów Zapier",
"team_is_unpublished": "Zespół {{team}} nie został opublikowany.",
"team_is_unpublished_description": "Ten link zespołu jest obecnie niedostępny. Skontaktuj się z właścicielem zespołu lub poproś o jego opublikowanie.",
"team_is_unpublished": "Zespół {{team}} nie został opublikowany",
"team_is_unpublished_description": "Link tego zespołu jest obecnie niedostępny. Skontaktuj się z właścicielem zespołu lub poproś o jego opublikowanie.",
"team_member": "Członek zespołu",
"a_routing_form": "Formularz przekierowania",
"form_description_placeholder": "Opis formularza",
"keep_me_connected_with_form": "Zachowaj połączenie z formularzem",
"fields_in_form_duplicated": "Duplikowanie zmian w formularzu przekierowania i jego polach zostanie odzwierciedlone w duplikacie.",
"form_deleted": "Formularz usunięty",
"delete_form": "Usuń formularz",
"delete_form": "Czy na pewno chcesz usunąć ten formularz?",
"delete_form_action": "Tak, usuń formularz",
"delete_form_confirmation": "Czy na pewno chcesz usunąć ten formularz? Osoby, którym udostępniono link, nie będą już mogły użyć go do rezerwacji. Ponadto wszystkie powiązane odpowiedzi zostaną usunięte.",
"delete_form_confirmation": "Osoby, którym udostępniono ten link, nie będą miały już do niego dostępu.",
"delete_form_confirmation_2": "Wszystkie powiązane odpowiedzi zostaną usunięte.",
"typeform_redirect_url_copied": "Skopiowano adres URL przekierowania z rozwiązania Typeform! Możesz teraz skonfigurować adres URL w formularzu Typeform.",
"modifications_in_fields_warning": "Zmiany w polach i przekierowaniach następujących formularzy zostaną odzwierciedlone w tym formularzu.",
@@ -1635,19 +1678,95 @@
"add_1_option_per_line": "Dodaj 1 opcję w każdym wierszu",
"select_a_router": "Wybierz formularz przekierowania",
"add_a_new_route": "Dodaj nowe przekierowanie",
"make_informed_decisions": "Dokonuj świadomych decyzji dzięki funkcji Insights",
"make_informed_decisions_description": "Panel Insights wyświetla całą aktywność zespołu i pokazuje trendy umożliwiające lepsze planowanie i podejmowanie decyzji w zespole.",
"view_bookings_across": "Zobacz rezerwacje wszystkich członków",
"view_bookings_across_description": "Zobacz, kto zapewnia najwięcej rezerwacji i upewnij się, że Twój zespół działa równomiernie",
"identify_booking_trends": "Identyfikuj trendy rezerwacji",
"identify_booking_trends_description": "Zobacz, jakie dni tygodnia i pory dnia są popularne wśród rezerwujących",
"spot_popular_event_types": "Przekonaj się, które typy wydarzeń są popularne",
"spot_popular_event_types_description": "Zobacz, które typy wydarzeń są najczęściej oglądane i rezerwowane",
"no_responses_yet": "Nie ma jeszcze odpowiedzi",
"this_will_be_the_placeholder": "To będzie symbol zastępczy",
"this_meeting_has_not_started_yet": "To spotkanie jeszcze się nie rozpoczęło.",
"this_app_requires_connected_account": "Aplikacja {{appName}} wymaga połączonego konta {{dependencyName}}.",
"connect_app": "Połącz {{dependencyName}}",
"app_is_connected": "Aplikacja {{dependencyName}} jest połączona.",
"requires_app": "Wymaga {{dependencyName}}",
"this_meeting_has_not_started_yet": "To spotkanie jeszcze się nie rozpoczęło",
"this_app_requires_connected_account": "Aplikacja {{appName}} wymaga podłączonego konta {{dependencyName}}",
"connect_app": "Podłącz {{dependencyName}}",
"app_is_connected": "Aplikacja {{dependencyName}} jest podłączona",
"requires_app": "Wymaga aplikacji {{dependencyName}}",
"verification_code": "Kod weryfikacyjny",
"can_you_try_again": "Możesz spróbować ponownie w innym terminie?",
"can_you_try_again": "Czy możesz spróbować ponownie w innym terminie?",
"verify": "Zweryfikuj",
"timezone_variable": "Strefa Czasowa",
"timezone_info": "Strefa czasowa osoby otrzymującej",
"event_end_time_variable": "Czas zakończenia wydarzenia",
"event_end_time_info": "Czas zakończenia wydarzenia",
"cancel_url_variable": "Adres URL do anulowania",
"cancel_url_info": "Adres URL do anulowania rezerwacji",
"reschedule_url_variable": "Adres URL do zmiany harmonogramu",
"reschedule_url_info": "Adres URL do zmiany terminu rezerwacji",
"invalid_event_name_variables": "W Twojej nazwie wydarzenia występuje nieprawidłowa zmienna.",
"select_all": "Zaznacz wszystko",
"default_conferencing_bulk_title": "Zbiorcza aktualizacja istniejących typów wydarzeń",
"default_conferencing_bulk_description": "Aktualizuj lokalizacje wybranych typów wydarzeń"
"members_default_schedule": "Domyślny harmonogram użytkownika",
"set_by_admin": "Ustalono przez administratora zespołu",
"members_default_location": "Domyślna lokalizacja członka",
"members_default_schedule_description": "Będziemy używać domyślnego harmonogramu dostępności każdego członka. Każdy z nich będzie mógł go edytować lub zmienić.",
"requires_at_least_one_schedule": "Musisz mieć co najmniej jeden harmonogram",
"default_conferencing_bulk_description": "Aktualizuj lokalizacje wybranych typów wydarzeń",
"locked_for_members": "Zablokowane dla członków",
"locked_apps_description": "Członkowie będą mogli zobaczyć aktywne aplikacje, ale nie będą mogli zmieniać ustawień aplikacji",
"locked_webhooks_description": "Członkowie będą mogli zobaczyć aktywne webhooki, ale nie będą mogli zmieniać żadnych ustawień webhooków",
"locked_workflows_description": "Członkowie będą mogli zobaczyć aktywne plany pracy, ale nie będą mogli zmieniać żadnych ustawień planów pracy",
"locked_by_admin": "Zablokowane przez administratora",
"app_not_connected": "Konto {{appName}} nie zostało połączone.",
"connect_now": "Połącz teraz",
"managed_event_dialog_confirm_button_one": "Zastąp i poinformuj {{count}} członka",
"managed_event_dialog_confirm_button_other": "Zastąp i poinformuj {{count}} członków",
"managed_event_dialog_title_one": "Adres URL /{{slug}} już istnieje dla {{count}} członka. Czy chcesz go zastąpić?",
"managed_event_dialog_title_other": "Adres URL /{{slug}} już istnieje dla {{count}} członków. Czy chcesz go zastąpić?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> używa już adresu URL <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> używają już adresu URL <strong>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "Jeśli zdecydujesz go zastąpić, powiadomimy ich. Jeśli nie chcesz nadpisywać adresu, wróć i usuń ich.",
"review_event_type": "Zobacz szczegóły typu wydarzenia",
"looking_for_more_analytics": "Szukasz większej ilości danych analitycznych?",
"add_filter": "Dodaj filtr",
"select_user": "Wybierz użytkownika",
"select_event_type": "Wybierz typ wydarzenia",
"select_date_range": "Wybierz zakres dat",
"popular_events": "Popularne wydarzenia",
"no_event_types_found": "Nie znaleziono typów wydarzeń",
"average_event_duration": "Średni czas trwania wydarzenia",
"most_booked_members": "Najczęściej rezerwowani członkowie",
"least_booked_members": "Najrzadziej rezerwowani członkowie",
"events_created": "Utworzone wydarzenia",
"events_completed": "Zakończone wydarzenia",
"events_cancelled": "Anulowane wydarzenia",
"events_rescheduled": "Przełożone wydarzenia",
"from_to_date_period": "Od: {{startDate}} Do: {{endDate}}",
"subtitle_analytics": "Dowiedz się więcej o aktywności Twojego zespołu",
"redirect_url_warning": "Dodanie przekierowania sprawi, że strona potwierdzenia zostanie wyłączona. Upewnij się, że na swojej spersonalizowanej stronie potwierdzenia umieścisz informację o potwierdzeniu rezerwacji.",
"event_trends": "Trendy wydarzeń",
"clear_filters": "Wyczyść filtry",
"on_booking_option": "Pobieraj płatność przy rezerwacji",
"hold_option": "Pobierz opłatę za niestawienie się",
"charge_card": "Obciąż kartę płatniczą",
"card_charged": "Obciążono kartę płatniczą",
"no_show_fee_amount": "Opłata za niestawienie się w wysokości {{amount, currency}}",
"no_show_fee": "Opłata za niestawienie się",
"submit_card": "Prześlij dane karty",
"submit_payment_information": "Prześlij informacje o płatności",
"no_show_fee_charged_email_subject": "Pobrano opłatę za niestawienie się na wydarzeniu: {{title}} dnia {{date}}",
"no_show_fee_charged_text_body": "Pobrano opłatę za niestawienie się",
"no_show_fee_charged_subtitle": "Za następujęce wydarzenie pobrano opłatę za niestawienie się w wysokości {{amount, currency}}",
"error_charging_card": "Coś poszło nie tak podczas pobierania opłaty za niestawienie się. Spróbuj ponownie później.",
"collect_no_show_fee": "Pobierz opłatę za niestawienie się",
"no_show_fee_charged": "Pobrano opłatę za niestawienie się",
"testing_workflow_info_message": "Podczas testowania tego planu pracy pamiętaj, że wiadomości e-mail i SMS mogą zostać zaplanowane najpóźniej godzinę przed ich dostarczeniem",
"insights_no_data_found_for_filter": "Nie znaleziono danych dla wybranego filtra lub dat.",
"acknowledge_booking_no_show_fee": "Rozumiem, że jeśli nie wezmę udziału w wydarzeniu, z mojej karty pobrana zostanie opłata w wysokości {{amount, currency}}.",
"card_details": "Dane karty",
"seats_and_no_show_fee_error": "Obecnie nie można udostępnić miejsc siedzących ani naliczyć opłaty za niestawienie się",
"complete_your_booking": "Ukończ rezerwację",
"complete_your_booking_subject": "Ukończ rezerwację: {{title}} dnia {{date}}",
"email_invite_team": "Zaproszono {{email}}"
}
+22 -22
View File
@@ -111,7 +111,7 @@
"hidden_team_owner_message": "Aveți nevoie de un cont Pro pentru a utiliza echipe. Sunteți ascuns până când faceți upgrade.",
"link_expires": "p.s. Expiră în {{expiresIn}} ore.",
"upgrade_to_per_seat": "Faceți upgrade la nivelul Per licență",
"seat_options_doesnt_support_confirmation": "Opțiunea pentru locuri nu este disponibilă dacă rezervarea solicită de confirmare",
"seat_options_doesnt_support_confirmation": "Opțiunea cu locuri nu este disponibilă dacă rezervarea necesită confirmare",
"team_upgrade_seats_details": "Printre cei {{memberCount}} (de) membri din echipa dvs., {{unpaidCount}} (de) locuri nu sunt plătite. La {{seatPrice}} USD/lună/licență, costul total estimat al abonamentului dvs. este de {{totalCost}} USD/lună.",
"team_upgrade_banner_description": "Vă mulțumim că ați încercat noul nostru plan pentru echipe. Am observat că planul echipei dvs. „{{teamName}}” necesită un upgrade.",
"team_upgrade_banner_action": "Realizați upgrade aici",
@@ -1338,8 +1338,8 @@
"report_app": "Raportați aplicația",
"limit_booking_frequency": "Limitați frecvența de rezervare",
"limit_booking_frequency_description": "Limitați numărul de rezervări posibile pentru acest eveniment",
"limit_total_booking_duration": "Limitează durata totală a rezervării",
"limit_total_booking_duration_description": "Limitează durata totală de timp pentru care poate fi rezervat acest eveniment",
"limit_total_booking_duration": "Limitare durată totală a rezervării",
"limit_total_booking_duration_description": "Limitare durată totală de timp pentru care poate fi rezervat acest eveniment",
"add_limit": "Adăugați o limită",
"team_name_required": "Este necesar numele echipei",
"show_attendees": "Distribuiți informațiile despre participanți între invitați",
@@ -1582,7 +1582,7 @@
"available_variables": "Variabile disponibile",
"scheduler": "{Scheduler}",
"no_workflows": "Niciun flux de lucru",
"change_filter": "Schimbă filtrul pentru a vedea fluxurile tale de lucru personale și de echipă.",
"change_filter": "Schimbați filtrul pentru a vedea fluxurile de lucru personale și de echipă.",
"recommended_next_steps": "Următorii pași recomandați",
"create_a_managed_event": "Creați un tip de eveniment gestionat",
"meetings_are_better_with_the_right": "Ședințele sunt mai agreabile dacă participă membrii potriviți ai echipei. Invitați-i acum.",
@@ -1590,9 +1590,9 @@
"collective_or_roundrobin": "Alocare colectivă sau prin rotație",
"book_your_team_members": "Efectuați rezervări comune pentru membrii echipei. Alegeți evenimente colective sau creați un ciclu pentru a găsi persoana potrivită în urma alocării prin rotație.",
"event_no_longer_attending_subject": "Nu mai participă la {{title}} de la {{date}}",
"no_longer_attending": "Nu mai participi la acest eveniment",
"no_longer_attending": "Nu mai participați la acest eveniment",
"attendee_no_longer_attending_subject": "Un participant nu mai ia parte la {{title}} de la {{date}}",
"attendee_no_longer_attending": "Un participant nu mai ia parte la evenimentul tău",
"attendee_no_longer_attending": "Un participant nu mai ia parte la evenimentul dvs.",
"attendee_no_longer_attending_subtitle": "{{name}} a anulat. Acest lucru înseamnă că s-a eliberat un loc pentru acest interval de timp",
"create_event_on": "Creați eveniment pe",
"default_app_link_title": "Setați un link implicit pentru aplicații",
@@ -1602,28 +1602,28 @@
"under_maintenance_description": "Echipa {{appName}} efectuează lucrări de întreținere programate. Dacă aveți întrebări, contactați serviciul de asistență.",
"event_type_seats": "{{numberOfSeats}} (de) locuri",
"booking_questions_title": "Întrebări legate de rezervare",
"booking_questions_description": "Personalizează întrebările adresate pe pagina de rezervare",
"add_a_booking_question": "Adaugă o întrebare",
"booking_questions_description": "Personalizați întrebările adresate pe pagina de rezervare",
"add_a_booking_question": "Adăugați o întrebare",
"duplicate_email": "E-mailul este duplicat",
"booking_with_payment_cancelled": "Nu se mai poate plăti pentru acest eveniment",
"booking_with_payment_cancelled_already_paid": "Există o rambursare în curs pentru plata acestei rezervări.",
"booking_with_payment_cancelled_refunded": "Plata pentru această rezervare a fost rambursată.",
"booking_confirmation_failed": "Confirmare rezervare nereușită",
"not_enough_seats": "Nu sunt destule locuri",
"form_builder_field_already_exists": "Deja exiztă un câmp cu acest nume",
"form_builder_field_add_subtitle": "Personalizează întrebările adresate pe pagina de rezervare",
"not_enough_seats": "Nu sunt suficiente locuri",
"form_builder_field_already_exists": "Există deja un câmp cu acest nume",
"form_builder_field_add_subtitle": "Personalizați întrebările adresate pe pagina de rezervare",
"get_started_zapier_templates": "Faceți primii pași cu șabloanele Zapier",
"team_is_unpublished": "{{team}} este nepublicată",
"team_is_unpublished_description": "Acest link de echipă nu este disponibil momentan. Te rugăm să contactezi proprietarul echipei sau să îi spui să îl publice.",
"team_is_unpublished": "Echipa {{team}} nu este publicată",
"team_is_unpublished_description": "Acest link de echipă nu este disponibil momentan. Contactați proprietarul echipei sau rugați-l să îl publice.",
"team_member": "Membru al echipei",
"a_routing_form": "Un formular de parcurs",
"form_description_placeholder": "Descriere formular",
"keep_me_connected_with_form": "Vreau să primesc actualizări privind formularul",
"fields_in_form_duplicated": "Orice modificări aduse parcursului și câmpurilor din formularul duplicat se vor reflecta în duplicat.",
"form_deleted": "Formular șters",
"delete_form": "Ștergere formular",
"delete_form": "Sigur doriți să ștergeți acest formular?",
"delete_form_action": "Da, șterg formularul",
"delete_form_confirmation": "Sigur doriți să ștergeți acest formular? Nicio persoană căreia i-ați transmis linkul nu va mai putea efectua rezervări pe baza lui. În plus, toate răspunsurile asociate vor fi șterse.",
"delete_form_confirmation": "Nicio persoană căreia i-ați transmis linkul nu îl va mai putea accesa.",
"delete_form_confirmation_2": "Toate răspunsurile asociate vor fi șterse.",
"typeform_redirect_url_copied": "URL-ul de redirecționare Typeform a fost copiat! Puteți accesa și seta URL-ul în formularul Typeform.",
"modifications_in_fields_warning": "Modificările aduse câmpurilor și parcursurilor pentru următoarele formulare vor fi reproduse în acest formular.",
@@ -1647,17 +1647,17 @@
"this_will_be_the_placeholder": "Acesta va fi substituentul",
"this_meeting_has_not_started_yet": "Această întâlnire nu a început încă",
"this_app_requires_connected_account": "{{appName}} necesită un cont {{dependencyName}} conectat",
"connect_app": "Conectează {{dependencyName}}",
"app_is_connected": "{{dependencyName}} este conectată",
"connect_app": "Conectare {{dependencyName}}",
"app_is_connected": "Aplicația {{dependencyName}} este conectată",
"requires_app": "Necesită {{dependencyName}}",
"verification_code": "Cod de verificare",
"can_you_try_again": "Poți încerca din nou cu o oră diferită?",
"verify": "Verifică",
"can_you_try_again": "Puteți încerca din nou cu o oră diferită?",
"verify": "Verificare",
"timezone_variable": "Timezone",
"invalid_event_name_variables": "Numele evenimentului include o variabilă nevalidă",
"select_all": "Selectează tot",
"default_conferencing_bulk_title": "Actualizează în masă tipurile de evenimente existente",
"default_conferencing_bulk_description": "Actualizează locațiile pentru tipurile de evenimente selectate",
"select_all": "Selectare tot",
"default_conferencing_bulk_title": "Actualizare în masă tipuri de evenimente existente",
"default_conferencing_bulk_description": "Actualizați locațiile pentru tipurile de evenimente selectate",
"looking_for_more_analytics": "Cauți mai multe analize?",
"add_filter": "Adaugă filtru",
"select_user": "Selectează utilizatorul",
@@ -438,7 +438,7 @@
"password_hint_min": "Minst 7 tecken",
"password_hint_admin_min": "Minst 15 tecken",
"password_hint_num": "Innehåller minst 1 siffra",
"max_limit_allowed_hint": "Måste vara {{limit}} eller färre tecken långt",
"max_limit_allowed_hint": "Måste innehålla {{limit}} eller färre tecken",
"invalid_password_hint": "Lösenordet måste innehålla minst {{passwordLength}} tecken och har minst en siffra samt en blandning av versaler och gemener",
"incorrect_password": "Lösenordet är felaktigt.",
"incorrect_username_password": "Felaktigt användarnamn eller lösenord.",
+22 -22
View File
@@ -592,15 +592,15 @@
"round_robin_description": "Кілька учасників команди призначаються для нарад циклічно й по черзі.",
"managed_event": "Керований захід",
"username_placeholder": "ім’я користувача",
"managed_event_description": "Створюйте й надсилайте типи заходів усім учасникам команди одночасно",
"managed": "Здійснюється керування",
"managed_event_url_clarification": "в полі «ім’я користувача» буде вказано імена користувачів призначених учасників",
"managed_event_description": "Створюйте й надсилайте типи заходів усім учасникам команди пакетом",
"managed": "Керований",
"managed_event_url_clarification": "у полі «ім’я користувача» буде вказано імена користувачів призначених учасників",
"assign_to": "Призначити",
"add_members": "Додати учасників…",
"count_members_one": "{{count}} учасник",
"count_members_other": "{{count}} учасники(-ів)",
"no_assigned_members": "Немає призначених учасників",
"assigned_to": "Призначити",
"assigned_to": "Призначено",
"start_assigning_members_above": "Почніть призначати учасників вище",
"locked_fields_admin_description": "Учасники не зможуть редагувати це",
"locked_fields_member_description": "Адміністратор команди заблокував цю опцію",
@@ -758,7 +758,7 @@
"delete_event_type": "Видалити тип заходу?",
"delete_managed_event_type": "Видалити захід керованого типу?",
"delete_event_type_description": "Користувачі, з якими ви поділилися цим посиланням, більше не зможуть здійснити бронювання з його допомогою.",
"delete_managed_event_type_description": "<ul><li>В учасників, призначених для цього типу заходу, також буде видалено їхні типи заходів.</li><li> Користувачі, з якими вони поділилися посиланням, більше не зможуть здійснити бронювання з його допомогою.</li></ul>",
"delete_managed_event_type_description": "<ul><li>В учасників, призначених для цього типу заходу, також буде видалено їхні типи заходів.</li><li> Користувачі, з якими вони поділилися своїм посиланням, більше не зможуть здійснити бронювання з його допомогою.</li></ul>",
"confirm_delete_event_type": "Так, видалити",
"delete_account": "Видалити обліковий запис",
"confirm_delete_account": "Так, видалити обліковий запис",
@@ -1487,8 +1487,8 @@
"admin_has_disabled": "Адміністратор вимкнув додаток {{appName}}",
"disabled_app_affects_event_type": "Адміністратор вимкнув додаток {{appName}}, що впливає на ваш тип заходу «{{eventType}}»",
"event_replaced_notice": "Адміністратор замінив один із типів ваших заходів",
"email_subject_slug_replacement": "Адміністратор команди замінив вашу подію /{{slug}}",
"email_body_slug_replacement_notice": "Адміністратор команди <strong>{{teamName}}</strong> замінив ваш тип події <strong>/{{slug}}</strong> на керований тип події, який він контролює.",
"email_subject_slug_replacement": "Адміністратор команди замінив ваш захід /{{slug}}",
"email_body_slug_replacement_notice": "Адміністратор команди <strong>{{teamName}}</strong> замінив ваш тип заходу<strong>/{{slug}}</strong> на керований тип заходу, який він контролює.",
"email_body_slug_replacement_info": "Ваше посилання продовжуватиме працювати, але деякі параметри можуть бути змінені. Дізнайтеся більше в типах подій.",
"email_body_slug_replacement_suggestion": "Якщо у вас виникли запитання щодо типу заходу, зверніться до свого адміністратора.<br /><br />Щасливого планування!<br />Команда Cal.com",
"disable_payment_app": "Адміністратор вимкнув додаток {{appName}}, що впливає на ваш тип заходу «{{title}}». Учасники все одно можуть бронювати події такого типу, але від них не вимагатиметься оплата. Ви можете приховати цей тип заходу, щоб уникнути цього, і дочекатись активації способу оплати адміністратором.",
@@ -1553,7 +1553,7 @@
"create_your_first_team_webhook_description": "Створіть свій перший вебгук для цього типу командного заходу",
"create_webhook_team_event_type": "Створити вебгук для цього типу командного заходу",
"disable_success_page": "Вимкнути сторінку, де показано результат бронювання (працює тільки з URL-адресою перенаправлення)",
"invalid_admin_password": "Ви адміністратор, але у вас немає пароля, що містить принаймні 15 символів, та не налаштовано двоетапну автентифікацію",
"invalid_admin_password": "Ви адміністратор, але у вас немає пароля, що містить принаймні 15 символів, або не налаштовано двоетапну автентифікацію",
"change_password_admin": "Змініть пароль, щоб отримати доступ адміністратора",
"username_already_taken": "Таке ім’я користувача вже існує",
"assignment": "Призначення",
@@ -1688,13 +1688,13 @@
"select_a_router": "Вибрати форму переспрямування",
"add_a_new_route": "Додати нове переспрямування",
"make_informed_decisions": "Приймайте обґрунтовані рішення за допомогою аналітики",
"make_informed_decisions_description": "У розділі «Аналітика» показано всю діяльність вашої команди та тенденції, які дають змогу краще планувати час команди й приймати рішення.",
"view_bookings_across": "Переглянути бронювання всіх учасників",
"make_informed_decisions_description": "У розділі «Аналітика» показано всю діяльність вашої команди й тенденції, які дають змогу краще планувати час команди й приймати рішення.",
"view_bookings_across": "Переглядайте бронювання всіх учасників",
"view_bookings_across_description": "Дізнайтеся, хто отримує найбільше бронювань і забезпечте найкращий розподіл у команді",
"identify_booking_trends": "Визначте тенденції бронювання",
"identify_booking_trends_description": "Дізнайтесь, які дні тижня і який час популярні в користувачів, які здійснюють бронювання",
"spot_popular_event_types": "Визначте популярні типи заходів",
"spot_popular_event_types_description": "Дізнайтеся, які типи заходів отримують найбільшу кількість кліків і бронювань",
"spot_popular_event_types_description": "Дізнайтеся, які типи заходів отримують найбільшу кількість переходів і бронювань",
"no_responses_yet": "Поки немає відповідей",
"this_will_be_the_placeholder": "Це заповнювач",
"this_meeting_has_not_started_yet": "Ця нарада ще не почалася",
@@ -1723,7 +1723,7 @@
"requires_at_least_one_schedule": "У вас має бути принаймні один розклад",
"default_conferencing_bulk_description": "Оновіть розташування для вибраних типів заходів",
"locked_for_members": "Заблоковано для учасників",
"locked_apps_description": "Учасники зможуть бачити активні додатки, але не зможуть редагувати будь-які налаштування додатка",
"locked_apps_description": "Учасники зможуть бачити активні додатки, але не зможуть редагувати налаштування додатка",
"locked_webhooks_description": "Учасники бачитимуть активні вебгуки, але не зможуть змінювати їх налаштування",
"locked_workflows_description": "Учасники бачитимуть активні робочі процеси, але не зможуть змінювати їх налаштування",
"locked_by_admin": "Заблоковано адміністратором",
@@ -1735,23 +1735,23 @@
"managed_event_dialog_title_other": "URL-адреса /{{slug}} вже існує для кількох учасників ({{count}}). Хочете замінити її?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> вже використовує URL-адресу <strong>/{{slug}}</strong>.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> вже використовують URL-адресу <string>/{{slug}}</strong>.",
"managed_event_dialog_clarification": "Якщо ви захочете замінити її, ми повідомимо їм. Поверніться й вилучіть їх, якщо ви не хочете перезаписувати її.",
"managed_event_dialog_clarification": "Якщо ви захочете замінити її, ми повідомимо їм. Поверніться і вилучіть їх, якщо ви не хочете перезаписувати її.",
"review_event_type": "Переглянути тип заходу",
"looking_for_more_analytics": "Вам потрібно більше аналітичних даних?",
"looking_for_more_insights": "Вам потрібно більше аналітики?",
"add_filter": "Додати фільтр",
"select_user": "Вибрати користувача",
"select_event_type": "Вибрати тип заходу",
"select_user": "Виберіть користувача",
"select_event_type": "Виберіть тип заходу",
"select_date_range": "Виберіть діапазон дат",
"popular_events": "Популярні заходи",
"no_event_types_found": "Типи заходів не знайдено",
"average_event_duration": "Середня тривалість заходу",
"most_booked_members": "Учасники з найбільшою кількістю бронювань",
"least_booked_members": "Учасники з найменшою кількістю бронювань",
"events_created": "Заходи створено",
"events_completed": "Заходи завершено",
"events_cancelled": "Заходи скасовано",
"events_rescheduled": "Заходи перенесено",
"events_created": "Створені заходи",
"events_completed": "Завершені заходи",
"events_cancelled": "Скасовані заходи",
"events_rescheduled": "Перенесені заходи",
"from_last_period": "після останнього періоду",
"from_to_date_period": "З: {{startDate}} До: {{endDate}}",
"analytics_for_organisation": "Аналітика",
@@ -1762,7 +1762,7 @@
"hold": "Утримати",
"on_booking_option": "Отримуйте оплату за бронювання",
"hold_option": "Стягнути плату за відсутність",
"card_held": "Карту утримано",
"card_held": "Здійснено попередню авторизацію",
"charge_card": "Списати з картки",
"card_charged": "Списано кошти з картки",
"no_show_fee_amount": "Плата за відсутність у розмірі {{amount, currency}}",
@@ -1777,9 +1777,9 @@
"collect_no_show_fee": "Стягнути плату за відсутність",
"no_show_fee_charged": "Стягнуто плату за відсутність",
"insights": "Аналітика",
"testing_workflow_info_message": "Тестуючи цей робочий процес, зважайте на те, що надсилання електронних листів і SMS-повідомлень можна запланувати принаймні за 1 годину",
"testing_workflow_info_message": "Тестуючи цей робочий процес, зважайте на те, що надсилання електронних листів і SMS-повідомлень можна запланувати мінімум за 1 годину",
"insights_no_data_found_for_filter": "Не знайдено жодних даних для вибраного фільтру або вибраних дат.",
"acknowledge_booking_no_show_fee": "Я підтверджую, що в разі відсутності на цьому заході з моєї картки буде стягнуто плату за відсутність у розмірі {{amount, currency}}.",
"acknowledge_booking_no_show_fee": "Я підтверджую, що в разі моєї відсутності на цьому заході з моєї картки буде стягнуто плату за відсутність у розмірі {{amount, currency}}.",
"card_details": "Інформація про картку",
"seats_and_no_show_fee_error": "Наразі неможливо ввімкнути місця і стягнути плату за відсутність",
"complete_your_booking": "Завершіть бронювання",
+129 -1
View File
@@ -592,6 +592,18 @@
"round_robin_description": "Luân phiên những cuộc họp giữa các thành viên trong nhóm.",
"managed_event": "Sự kiện được quản lý",
"username_placeholder": "tên người dùng",
"managed_event_description": "Tạo & phân phối cả cụm nhiều loại sự kiện đến các thành viên nhóm",
"managed": "Được quản lý",
"managed_event_url_clarification": "\"tên người dùng\" sẽ được điền vào theo tên người dùng của những thành viên được phân công",
"assign_to": "Phân công cho",
"add_members": "Thêm thành viên...",
"count_members_one": "{{count}} thành viên",
"count_members_other": "{{count}} thành viên",
"no_assigned_members": "Không thành viên nào được phân công",
"assigned_to": "Được phân công cho",
"start_assigning_members_above": "Bắt đầu phân công những thành viên bên trên",
"locked_fields_admin_description": "Các thành viên sẽ không sửa được phần này",
"locked_fields_member_description": "Tuỳ chọn này do quản trị nhóm khoá lại",
"url": "URL",
"hidden": "Ẩn giấu",
"readonly": "Chỉ đọc",
@@ -743,6 +755,11 @@
"minimum_booking_notice": "Thời gian đệm tối thiểu",
"slot_interval": "Khoảng thời gian giữa các lịch hẹn",
"slot_interval_default": "Sử dụng độ dài sự kiện (mặc định)",
"delete_event_type": "Xoá loại sự kiện?",
"delete_managed_event_type": "Xoá loại sự kiện được quản lý?",
"delete_event_type_description": "Đối với những người mà bạn chia sẻ liên kết này, họ sẽ không thể đặt lịch hẹn bằng liên kết đó được nữa.",
"delete_managed_event_type_description": "<ul><li>Những thành viên được phân công cho loại sự kiện này cũng sẽ khiến cho loại sự kiện của họ được xoá đi.</li><li>Đối với những người mà bạn chia sẻ liên kết này, họ sẽ không thể đặt lịch hẹn bằng liên kết đó được nữa.</li></ul>",
"confirm_delete_event_type": "Có, hãy xoá",
"delete_account": "Xóa tài khoản",
"confirm_delete_account": "Có, xóa tài khoản",
"delete_account_confirmation_message": "Bạn có chắc chắn muốn xóa tài khoản {{appName}} của mình không? Bất kỳ ai mà bạn đã chia sẻ liên kết tài khoản của mình sẽ không thể đặt trước bằng liên kết đó nữa và mọi tùy chọn bạn đã lưu sẽ bị mất.",
@@ -1133,11 +1150,13 @@
"current_username": "Tên người dùng hiện tại",
"example_1": "Ví dụ 1",
"example_2": "Ví dụ 2",
"booking_question_identifier": "Mã định danh câu hỏi lịch hẹn",
"company_size": "Quy mô công ty",
"what_help_needed": "Bạn cần giúp điều gì?",
"variable_format": "Định dạng biến số",
"webhook_subscriber_url_reserved": "Url ghi danh Webhook đã được lập định",
"custom_input_as_variable_info": "Bỏ qua tất cả các ký tự đặc biệt của nhãn thông tin đầu vào bổ sung (chỉ dùng chữ cái và con số), dùng chữ in hoa cho tất cả các chữ cái và thay thế khoảng trắng bằng dấu gạch dưới.",
"using_booking_questions_as_variables": "Làm cách nào tôi dùng những câu hỏi lịch hẹn ở dạng tham số?",
"download_desktop_app": "Tải ứng dụng trên máy tính bàn",
"set_ping_link": "Đặt liên kết Ping",
"rate_limit_exceeded": "Đã vượt quá giới hạn đăng nhập",
@@ -1183,6 +1202,7 @@
"start_of_week": "Khởi đầu tuần",
"recordings_title": "Bản ghi âm",
"recording": "Bản ghi âm",
"happy_scheduling": "Đặt lịch vui",
"select_calendars": "Chọn lịch nào mà bạn muốn kiểm tra xung đột nhằm tránh đặt lịch hẹn trùng.",
"check_for_conflicts": "Kiểm tra xung đột",
"view_recordings": "Xem các bản ghi âm",
@@ -1220,6 +1240,7 @@
"impersonation": "Mạo danh",
"impersonation_description": "Cài đặt để quản lý mạo danh người dùng",
"users": "Người dùng",
"user": "Người dùng",
"profile_description": "Quản lí cài đặt cho hồ sơ {{appName}} của bạn",
"users_description": "Tại đây bạn có thể tìm thấy danh sách tất cả người dùng",
"users_listing": "Danh sách người dùng",
@@ -1260,6 +1281,8 @@
"download_responses": "Tải xuống Phản hồi",
"download_responses_description": "Tải xuống tất cả phản hồi vào biểu mẫu của bạn ở định dạng CSV.",
"download": "Tải về",
"download_recording": "Tải xuống bản ghi âm",
"recording_from_your_recent_call": "Một bản ghi âm từ cuộc gọi gần đây trên Cal.com đã sẵn sàng để tải xuống",
"create_your_first_form": "Tạo biểu mẫu đầu tiên",
"create_your_first_form_description": "Với Biểu mẫu định hướng, bạn có thể hỏi một số câu sơ tuyển và định hướng đến đúng người hay đúng loại sự kiện.",
"create_your_first_webhook": "Tạo Webhook đầu tiên",
@@ -1296,6 +1319,15 @@
"exchange_authentication_standard": "Xác thực cơ bản",
"exchange_authentication_ntlm": "Xác thực NTLM",
"exchange_compression": "Giao thức nén GZip",
"exchange_version": "Phiên bản Exchange",
"exchange_version_2007_SP1": "2007 SP1",
"exchange_version_2010": "2010",
"exchange_version_2010_SP1": "2010 SP1",
"exchange_version_2010_SP2": "2010 SP2",
"exchange_version_2013": "2013",
"exchange_version_2013_SP1": "2013 SP1",
"exchange_version_2015": "2015",
"exchange_version_2016": "2016",
"routing_forms_description": "Bạn có thể thấy tất cả các biểu mẫu và định hướng mà bạn đã tạo ra ở đây.",
"routing_forms_send_email_owner": "Gửi email đến chủ sở hữu",
"routing_forms_send_email_owner_description": "Gửi một email đến chủ sở hữu khi biểu mẫu được gửi đi",
@@ -1350,6 +1382,7 @@
"add_limit": "Thêm giới hạn",
"team_name_required": "Cần có tên nhóm",
"show_attendees": "Chia sẻ thông tin người tham gia cho khách",
"how_booking_questions_as_variables": "Làm cách nào dùng những câu hỏi lịch hẹn ở dạng tham số?",
"format": "Định dạng",
"uppercase_for_letters": "In hoa hết tất cả các chữ cái",
"replace_whitespaces_underscores": "Thay thế khoảng trắng bằng dấu gạch dưới",
@@ -1364,6 +1397,7 @@
"billing_help_title": "Cần gì nữa không?",
"billing_help_description": "Nếu bạn cần thêm bất kỳ trợ giúp nào về thanh toán, nhóm hỗ trợ của chúng tôi luôn sẵn sàng trợ giúp.",
"billing_help_cta": "Liên hệ với bộ phận hỗ trợ",
"ignore_special_characters_booking_questions": "Bỏ qua những kí tự đặc biệt trong mã định danh câu hỏi lịch hẹn. Chỉ dùng chữ cái và số",
"retry": "Thử lại",
"fetching_calendars_error": "Có vấn đề khi tìm dữ liệu của bạn. Vui lòng <1>thử lại</1> hoặc liên hệ với bộ phận hỗ trợ khách hàng.",
"calendar_connection_fail": "Kết nối lịch bất thành",
@@ -1446,11 +1480,17 @@
"fixed_round_robin": "Round robin cố định",
"add_one_fixed_attendee": "Thêm một người tham dự và round robin cố định thông qua số người tham dự.",
"calcom_is_better_with_team": "Cal.com tốt hơn với nhóm",
"the_calcom_team": "Nhóm Cal.com",
"add_your_team_members": "Thêm những thành viên nhóm của bạn vào những loại sự kiện của bạn. Sử dụng lên lịch tập thể để bao gồm mọi người hoặc tìm người thích hợp nhất với chức năng lên lịch round robin.",
"booking_limit_reached": "Đã đạt mức giới hạn đặt hẹn cho loại sự kiện này",
"duration_limit_reached": "Đã đạt mức giới hạn thời gian cho loại sự kiện này",
"admin_has_disabled": "Một quản trị viên đã tắt {{appName}}",
"disabled_app_affects_event_type": "Một quản trị viên đã tắt {{appName}} vốn có ảnh hưởng đến loại sự kiện {{eventType}}",
"event_replaced_notice": "Một quản trị viên đã thay thế một trong những loại sự kiện của bạn",
"email_subject_slug_replacement": "Một quản trị viên của nhóm đã thay thế sự kiện của bạn /{{slug}}",
"email_body_slug_replacement_notice": "Một quản trị viên trên nhóm <strong>{{teamName}}</strong> đã thay thế loại sự kiện của bạn <strong>/{{slug}}</strong> bằng một loại sự kiện được quản lý mà họ kiểm soát.",
"email_body_slug_replacement_info": "Liên kết của bạn sẽ tiếp tục hoạt động nhưng một số thiết lập cho nó có thể thay đổi. Bạn có thể xem lại nó trong những loại sự kiện.",
"email_body_slug_replacement_suggestion": "Nếu bạn có thắc mắc gì về loại sự kiện này, vui lòng liên lạc với quản trị viên của bạn. <br /><br />Đặt lịch vui,<br /> Nhóm Cal.com",
"disable_payment_app": "Một quản trị viên đã tắt {{appName}} vốn có ảnh hưởng đến loại sự kiện {{title}}. Người tham dự vẫn có thể đặt hẹn cho loại sự kiện này nhưng sẽ được nhắc trả phí. Bạn có thể ẩn loại sự kiện này để tránh điều này cho đến khi quản trị viên kích hoạt lại phương thức thanh toán của bạn.",
"payment_disabled_still_able_to_book": "Người tham dự vẫn có thể đặt hẹn cho loại sự kiện này nhưng sẽ được nhắc trả phí. Bạn có thể ẩn loại sự kiện này để tránh điều này cho đến khi quản trị viên kích hoạt lại phương thức thanh toán của bạn.",
"app_disabled_with_event_type": "Quản trị viên đã tắt {{appName}} vốn có ảnh hưởng đến loại sự kiện {{title}}.",
@@ -1499,6 +1539,7 @@
"date_overrides_update_btn": "Cập nhận ngày ghi đè",
"event_type_duplicate_copy_text": "{{slug}}-bansao",
"set_as_default": "Đặt làm mặc định",
"hide_eventtype_details": "Ẩn chi tiết của loại sự kiện",
"show_navigation": "Hiển thị điều hướng",
"hide_navigation": "Ẩn điều hướng",
"verification_code_sent": "Đã gửi mã xác minh",
@@ -1512,6 +1553,7 @@
"create_your_first_team_webhook_description": "Tạo webhook đầu tiên của bạn cho loại sự kiện nhóm này",
"create_webhook_team_event_type": "Tạo webhook cho loại sự kiện nhóm này",
"disable_success_page": "Tắt trang báo hiệu đặt lịch thành công (chỉ hoạt động nếu bạn có URL chuyển hướng)",
"invalid_admin_password": "Bạn là quản trị viên nhưng bạn chưa đặt mật khẩu dài ít nhất 15 ký tự hoặc không có xác thực hai yếu tố",
"change_password_admin": "Hãy đổi Mật khẩu để lấy quyền quản trị viên",
"username_already_taken": "Tên này đã có người lấy rồi",
"assignment": "Phân công",
@@ -1544,6 +1586,7 @@
"ee_enterprise_license": "Giấy phép Enterprise \"/ee\"",
"enterprise_booking_fee": "Bắt đầu từ mức {{enterprise_booking_fee}}/tháng",
"enterprise_license_includes": "Mọi thứ cho trường hợp sử dụng thương mại",
"no_need_to_keep_your_code_open_source": "Không cần giữ mã của bạn ở dạng mã nguồn mở",
"repackage_rebrand_resell": "Đóng gói lại, tái cấu trúc thương hiệu và bán lại dễ dàng",
"a_vast_suite_of_enterprise_features": "Một bộ khổng lồ các tính năng doanh nghiệp",
"free_license_fee": "0,00$/tháng",
@@ -1605,6 +1648,7 @@
"default_app_link_title": "Đặt một liên kết ứng dụng mặc định",
"default_app_link_description": "Thao tác đặt liên kết ứng dụng mặc định sẽ giúp cho phép tất cả các loại sự kiện mới tạo có thể dùng liên kết ứng dụng mà bạn đã đặt.",
"change_default_conferencing_app": "Đặt làm mặc định",
"organizer_default_conferencing_app": "Ứng dụng mặc định của nhà tổ chức",
"under_maintenance": "Tạm ngừng để bảo trì",
"under_maintenance_description": "Nhóm {{appName}} đang thực hiện việc bảo trì theo lịch. Nếu bạn có thắc mắc gì, vui lòng liên hệ bộ phận hỗ trợ.",
"event_type_seats": "{{numberOfSeats}} chỗ ngồi",
@@ -1619,6 +1663,7 @@
"not_enough_seats": "Không đủ chỗ",
"form_builder_field_already_exists": "Đã tồn tại một trường có tên này",
"form_builder_field_add_subtitle": "Tùy chỉnh các câu hỏi ở trang đặt lịch hẹn",
"show_on_booking_page": "Hiện trên trang lịch hẹn",
"get_started_zapier_templates": "Bắt đầu với các mẫu Zapier",
"team_is_unpublished": "{{team}} chưa được công bố",
"team_is_unpublished_description": "Liên kết nhóm này hiện không khả dụng. Hãy liên lạc với chủ nhóm hoặc yêu cầu họ công bố liên kết đó.",
@@ -1642,6 +1687,14 @@
"add_1_option_per_line": "Thêm 1 tuỳ chọn cho mỗi hàng",
"select_a_router": "Chọn một định hướng",
"add_a_new_route": "Thêm một Định hướng mới",
"make_informed_decisions": "Đưa ra những quyết định sáng suốt với Insights",
"make_informed_decisions_description": "Bảng điều khiển Insights của chúng tôi nằm ở bề mặt xuyên suốt nhóm bạn và hiển thị cho bạn thấy những xu hướng giúp đặt lịch nhóm và ra quyết định tốt hơn.",
"view_bookings_across": "Xem lịch hẹn ở mọi thành viên",
"view_bookings_across_description": "Xem ai nhận được nhiều lịch hẹn nhất và bảo đảm việc phân phối tốt nhất cho khắp nhóm",
"identify_booking_trends": "Nhận diện xu hướng lịch hẹn",
"identify_booking_trends_description": "Xem thời điểm nào trong tuần và thời điểm nào trong ngày là thời điểm phổ biến cho người đặt lịch hẹn bên bạn",
"spot_popular_event_types": "Nhận ra các loại sự kiện phổ biến",
"spot_popular_event_types_description": "Xem loại sự kiện nào của bạn nhận được nhiều lần nhấp chuột và nhiều lịch hẹn nhất",
"no_responses_yet": "Chưa có hồi đáp",
"this_will_be_the_placeholder": "Đây sẽ là mã giữ chỗ",
"this_meeting_has_not_started_yet": "Cuộc hẹn này chưa được bắt đầu",
@@ -1653,8 +1706,83 @@
"can_you_try_again": "Bạn có thể thử lại lúc khác được chứ?",
"verify": "Xác minh",
"timezone_variable": "Múi giờ",
"timezone_info": "Múi giờ của người nhận",
"event_end_time_variable": "Thời gian kết thúc sự kiện",
"event_end_time_info": "Thời gian kết thúc sự kiện",
"cancel_url_variable": "URL huỷ lịch",
"cancel_url_info": "URL để huỷ lịch hẹn",
"reschedule_url_variable": "URL đặt lịch lại",
"reschedule_url_info": "URL để đặt lịch hẹn lại",
"invalid_event_name_variables": "Có biến số không hợp lệ trong tên sự kiện của bạn",
"select_all": "Chọn tất cả",
"default_conferencing_bulk_title": "Cập nhật hàng loại những loại sự kiện hiện có",
"default_conferencing_bulk_description": "Cập nhật địa điểm cho những loại sự kiện đã chọn"
"members_default_schedule": "Lịch biểu mặc định của thành viên",
"set_by_admin": "Đặt bởi quản trị viên của nhóm",
"members_default_location": "Vị trí mặc định của thành viên",
"members_default_schedule_description": "Chúng tôi sẽ dùng trạng thái trống lịch mặc định của mỗi thành viên. Họ sẽ có thể sửa hoặc thay đổi trạng thái này.",
"requires_at_least_one_schedule": "Bạn cần phải có ít nhất một lịch biểu",
"default_conferencing_bulk_description": "Cập nhật địa điểm cho những loại sự kiện đã chọn",
"locked_for_members": "Bị khoá đối với thành viên",
"locked_apps_description": "Các thành viên có thể thấy được những ứng dụng đang hoạt động nhưng không thể sửa bất kỳ thiết lập nào của ứng dụng",
"locked_webhooks_description": "Các thành viên có thể thấy được những webhook đang hoạt động nhưng không thể sửa bất kỳ thiết lập nào của webhook",
"locked_workflows_description": "Các thành viên có thể thấy được những tiến độ công việc đang hoạt động nhưng không thể sửa bất kỳ thiết lập nào của tiến độ công việc",
"locked_by_admin": "Bị khoá bởi quản trị viên",
"app_not_connected": "Bạn không có tài khoản {{appName}} đã được kết nối.",
"connect_now": "Kết nối ngay",
"managed_event_dialog_confirm_button_one": "Thay thế & thông báo cho {{count}} thành viên",
"managed_event_dialog_confirm_button_other": "Thay thế & thông báo cho {{count}} thành viên",
"managed_event_dialog_title_one": "URL / {{slug}} đã có sẵn cho {{count}} thành viên. Bạn có muốn thay thế nó?",
"managed_event_dialog_title_other": "URL /{{slug}} đã có sẵn cho {{count}} thành viên. Bạn có muốn thay thế nó?",
"managed_event_dialog_information_one": "<strong>{{names}}</strong> đã dùng URL <strong>/{{slug}}</strong> rồi.",
"managed_event_dialog_information_other": "<strong>{{names}}</strong> đã dùng URL <string>/{{slug}}</strong> rồi.",
"managed_event_dialog_clarification": "Nếu bạn chọn phương án thay thế nó, chúng tôi sẽ thông báo cho họ biết. Hãy quay lại và xoá bỏ họ nếu bạn không muốn ghi đè nó.",
"review_event_type": "Xem lại loại sự kiện",
"looking_for_more_analytics": "Đang tìm thêm công cụ phân tích?",
"looking_for_more_insights": "Đang tìm thêm Insights?",
"add_filter": "Thêm bộ lọc",
"select_user": "Chọn người dùng",
"select_event_type": "Chọn loại sự kiện",
"select_date_range": "Chọn khoảng ngày",
"popular_events": "Sự kiện phổ biến",
"no_event_types_found": "Không tìm thấy loại sự kiện nào",
"average_event_duration": "Thời lượng trung bình của sự kiện",
"most_booked_members": "Thành viên được đặt lịch hẹn nhiều nhất",
"least_booked_members": "Thành viên được đặt lịch hẹn ít nhất",
"events_created": "Những sự kiện đã tạo",
"events_completed": "Những sự kiện đã hoàn thành",
"events_cancelled": "Những sự kiện đã huỷ",
"events_rescheduled": "Những sự kiện đã đặt lịch lại",
"from_last_period": "từ thời gian gần nhất",
"from_to_date_period": "Từ: {{startDate}} Đến: {{endDate}}",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "Tìm hiểu thêm về hoạt động của nhóm bạn",
"redirect_url_warning": "Thêm mục chuyển hướng sẽ tắt đi trang thành công. Hãy bảo đảm có đề cập \"Lịch hẹn đã xác nhận\" trên trang thành công tuỳ chỉnh riêng của bạn.",
"event_trends": "Xu hướng sự kiện",
"clear_filters": "Xoá bộ lọc",
"hold": "Giữ đó",
"on_booking_option": "Thu tiền thanh toán cho lịch hẹn",
"hold_option": "Tính phí vắng mặt",
"card_held": "Thẻ đã được giữ",
"charge_card": "Tính phí cho thẻ",
"card_charged": "Thẻ đã thu phí",
"no_show_fee_amount": "Phí vắng mặt {{amount, currency}}",
"no_show_fee": "Phí vắng mặt",
"submit_card": "Gửi thẻ",
"submit_payment_information": "Gửi thông tin thanh toán",
"meeting_awaiting_payment_method": "Cuộc họp của bạn đang chờ phương thức thanh toán",
"no_show_fee_charged_email_subject": "Phí vắng mặt {{amount, currency}} sẽ được tính cho {{title}} vào ngày {{date}}",
"no_show_fee_charged_text_body": "Phí vắng mặt được tính",
"no_show_fee_charged_subtitle": "Phí vắng mặt {{amount, currency}} sẽ được tính cho sự kiện sau",
"error_charging_card": "Có sự cố khi tính phí vắng mặt. Vui lòng thử lại sau.",
"collect_no_show_fee": "Thu phí vắng mặt",
"no_show_fee_charged": "Phí vắng mặt đã tính",
"insights": "Insights",
"testing_workflow_info_message": "Khi kiểm tra tiến độ công việc này, hãy để ý rằng Email và SMS chỉ có thể được đặt lịch trước ít nhất 1 giờ",
"insights_no_data_found_for_filter": "Không tìm thấy dữ liệu cho bộ lọc hay ngày đã chọn.",
"acknowledge_booking_no_show_fee": "Tôi công nhận là nếu tôi không tham dự sự kiện này thì một khoản phí vắng mặt gồm {{amount, currency}} sẽ được áp dụng cho thẻ của tôi.",
"card_details": "Chi tiết thẻ",
"seats_and_no_show_fee_error": "Hiện không thể kích hoạt chỗ ngồi và tính khoản phí vắng mặt",
"complete_your_booking": "Hoàn thành lịch hẹn của bạn",
"complete_your_booking_subject": "Hoàn thành lịch hẹn của bạn: {{title}} vào {{date}}",
"email_invite_team": "{{email}} đã được mời"
}
@@ -884,7 +884,7 @@
"add_new_calendar": "添加新日历",
"set_calendar": "设置当您被预约后添加新活动的位置。",
"delete_schedule": "删除时间表",
"delete_schedule_description": "删除时间表会将其从所有活动类型中删除。此操作无法撤消。",
"delete_schedule_description": "删除日程安排会将其从所有活动类型中删除。此操作无法撤消。",
"schedule_created_successfully": "{{scheduleName}} 时间表已成功创建",
"availability_updated_successfully": "{{scheduleName}} 日程更新成功",
"schedule_deleted_successfully": "已成功删除时间表",
@@ -1636,7 +1636,7 @@
"recommended_next_steps": "建议的后续步骤",
"create_a_managed_event": "创建托管活动类型",
"meetings_are_better_with_the_right": "有合适的团队成员参加会议会更好。立即邀请他们。",
"create_a_one_one_template": "为活动类型创建一个一对一模板,并将其分发给多个成员。",
"create_a_one_one_template": "为活动类型创建一个一对一模板,并将其分配给多个成员。",
"collective_or_roundrobin": "集体或轮流",
"book_your_team_members": "以集体模式预约您的团队成员,或以轮流模式循环到合适的人员。",
"event_no_longer_attending_subject": "不再参加于 {{date}} 举行的 {{title}} ",
@@ -1673,10 +1673,10 @@
"keep_me_connected_with_form": "让我与表格保持连接",
"fields_in_form_duplicated": "所复制的途径表格本身和其字段的任何变化都会反映在副本中。",
"form_deleted": "表格已删除",
"delete_form": "删除表格",
"delete_form": "确定要删除此表格吗?",
"delete_form_action": "是,删除表格",
"delete_form_confirmation": "您确定要删除此表格吗?与您共享链接的任何人都将无法再使用它进行预约。此外,所有相关回复都将被删除。",
"delete_form_confirmation_2": "所有相关的回复都将被删除。",
"delete_form_confirmation": "与您共享链接的所有人都将无法再对其进行访问。",
"delete_form_confirmation_2": "所有关联的回复都将被删除。",
"typeform_redirect_url_copied": "Typeform 重定向链接已复制!您可以在 TypeForm 表格中设置链接。",
"modifications_in_fields_warning": "对以下表格中字段和途径的修改将反映在此表格中。",
"connected_forms": "连接的表格",
@@ -1715,7 +1715,7 @@
"reschedule_url_info": "重新安排预约的链接",
"invalid_event_name_variables": "活动名称中存在无效变量",
"select_all": "全选",
"default_conferencing_bulk_title": "批量更新现有事件类型",
"default_conferencing_bulk_title": "批量更新现有活动类型",
"members_default_schedule": "成员的默认时间表",
"set_by_admin": "由团队管理员设置",
"members_default_location": "成员的默认位置",
Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

After

Width:  |  Height:  |  Size: 155 KiB

@@ -57,7 +57,7 @@ export default function ZapierSetup(props: IZapierSetupProps) {
{!newApiKey ? (
<>
<div className="mt-1 text-xl">{t("generate_api_key")}:</div>
<Button onClick={() => createApiKey()} className="mt-4 mb-4">
<Button color="primary" onClick={() => createApiKey()} className="mt-4 mb-4">
{t("generate_api_key")}
</Button>
</>
@@ -1443,6 +1443,7 @@ async function handler(
* deep cloning evt to avoid this
*/
const copyEvent = cloneDeep(evt);
copyEvent.uid = booking.uid;
await sendScheduledSeatsEmails(copyEvent, invitee[0], newSeat, !!eventType.seatsShowAttendees);
const credentials = await refreshCredentials(organizerUser.credentials);
@@ -1503,7 +1504,7 @@ async function handler(
// Here we should handle every after action that needs to be done after booking creation
// Obtain event metadata that includes videoCallUrl
const metadata = { videoCallUrl: evt.videoCallData?.url };
const metadata = evt.videoCallData?.url ? { videoCallUrl: evt.videoCallData.url } : undefined;
try {
await scheduleWorkflowReminders({
workflows: eventType.workflows,
@@ -2119,7 +2120,7 @@ async function handler(
log.error("Error while creating booking references", error);
}
const metadataFromEvent = { videoCallUrl };
const metadataFromEvent = videoCallUrl ? { videoCallUrl } : undefined;
try {
await scheduleWorkflowReminders({
@@ -103,6 +103,7 @@ export const AddNewTeamMembersForm = ({
<hr className="border-subtle my-6" />
<Button
EndIcon={ArrowRight}
color="primary"
className="mt-6 w-full justify-center"
disabled={publishTeamMutation.isLoading}
onClick={() => {
@@ -118,7 +119,7 @@ export default AddNewTeamMembers;
const AddNewTeamMemberSkeleton = () => {
return (
<SkeletonContainer className="rounded-md border">
<SkeletonContainer className="border-subtle rounded-md border">
<div className="flex w-full justify-between p-4">
<div>
<p className="text-emphasis text-sm font-medium">
@@ -4,7 +4,7 @@ import { z } from "zod";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc/react";
import { Dialog, DialogContent, Form, DialogFooter, DialogClose, Button } from "@calcom/ui";
import { Dialog, DialogContent, Form, DialogFooter, DialogClose, Button, Checkbox } from "@calcom/ui";
export const BulkUpdateEventSchema = z.object({
eventTypeIds: z.array(z.number()),
@@ -47,41 +47,31 @@ export function BulkEditDefaultConferencingModal(props: { open: boolean; setOpen
<div className="flex flex-col space-y-2">
{data.eventTypes.length > 0 && (
<div className="flex items-center space-x-2 rounded-md py-2.5 px-3">
<label className="text-emphasis w-full text-sm font-medium leading-none">
<input
type="checkbox"
className="text-primary-600 focus:ring-primary-500 border-default hover:bg-subtle h-4 w-4 rounded checked:bg-gray-800 ltr:mr-2 rtl:ml-2"
onChange={(e) => {
form.setValue("eventTypeIds", e.target.checked ? data.eventTypes.map((e) => e.id) : []);
}}
checked={eventTypesSelected.length === data.eventTypes.length}
/>
{t("select_all")}
</label>
<Checkbox
description={t("select_all")}
descriptionAsLabel
onChange={(e) => {
form.setValue("eventTypeIds", e.target.checked ? data.eventTypes.map((e) => e.id) : []);
}}
checked={eventTypesSelected.length === data.eventTypes.length}
/>
</div>
)}
{data.eventTypes.map((eventType) => (
<div key={eventType.id} className="bg-muted flex items-center space-x-2 rounded-md py-2.5 px-3">
<label className="text-emphasis w-full text-sm font-medium leading-none">
<input
type="checkbox"
checked={eventTypesSelected.includes(eventType.id)}
className="text-primary-600 focus:ring-primary-500 border-default hover:bg-subtle h-4 w-4 rounded checked:bg-gray-800 ltr:mr-2 rtl:ml-2"
onChange={(e) => {
form.setValue(
"eventTypeIds",
e.target.checked
? [...eventTypesSelected, eventType.id]
: eventTypesSelected.filter((id) => id !== eventType.id)
);
}}
/>
{eventType.title}
</label>
<div className="ml-auto flex h-4 w-4 items-center">
<img src={eventType.logo} alt="#" />
</div>
<Checkbox
description={eventType.title}
descriptionAsLabel
checked={eventTypesSelected.includes(eventType.id)}
onChange={(e) => {
form.setValue(
"eventTypeIds",
e.target.checked
? [...eventTypesSelected, eventType.id]
: eventTypesSelected.filter((id) => id !== eventType.id)
);
}}
/>
</div>
))}
</div>
@@ -44,14 +44,16 @@ export const CheckedTeamSelect = ({
/>
{/* This class name conditional looks a bit odd but it allows a seemless transition when using autoanimate
- Slides down from the top instead of just teleporting in from nowhere*/}
<ul className={classNames("mt-3 rounded-md", value.length >= 1 && "border")} ref={animationRef}>
<ul
className={classNames("mt-3 rounded-md", value.length >= 1 && "border-subtle border")}
ref={animationRef}>
{value.map((option, index) => (
<li key={option.value} className={`flex py-2 px-3 ${index === value.length - 1 ? "" : "border-b"}`}>
<Avatar size="sm" imageSrc={option.avatar} alt={option.label} />
<p className="text-emphasis my-auto ml-3 text-sm">{option.label}</p>
<p className="text-emphasis ms-3 my-auto text-sm">{option.label}</p>
<X
onClick={() => props.onChange(value.filter((item) => item.value !== option.value))}
className="my-auto ml-auto"
className="my-auto ml-auto h-4 w-4"
/>
</li>
))}
@@ -255,7 +255,7 @@ export const Components: Record<BookingFieldType, Component> = {
}
setValue(newValue);
}}
className="dark:bg-darkgray-300 border-subtle border-default text-emphasis h-4 w-4 rounded focus:ring-black ltr:mr-2 rtl:ml-2"
className="dark:bg-darkgray-300 border-subtle text-emphasis h-4 w-4 rounded focus:ring-black ltr:mr-2 rtl:ml-2"
value={option.value}
checked={value.includes(option.value)}
/>
@@ -314,7 +314,7 @@ export const Components: Record<BookingFieldType, Component> = {
type="radio"
disabled={readOnly}
name={name}
className="dark:bg-darkgray-300 border-subtle border-default text-emphasis h-4 w-4 focus:ring-black ltr:mr-2 rtl:ml-2"
className="dark:bg-darkgray-300 border-subtle text-emphasis h-4 w-4 focus:ring-black ltr:mr-2 rtl:ml-2"
value={option.value}
onChange={(e) => {
setValue({
@@ -255,8 +255,12 @@ const SettingsSidebarContainer = ({
}),
])
}>
<div className="ltr:mr-3 rtl:ml-3">
{teamMenuState[index].teamMenuOpen ? <ChevronDown /> : <ChevronRight />}
<div className="me-3">
{teamMenuState[index].teamMenuOpen ? (
<ChevronDown className="h-4 w-4" />
) : (
<ChevronRight className="h-4 w-4" />
)}
</div>
<img
src={getPlaceholderAvatar(team.logo, team?.name as string)}
@@ -352,7 +356,7 @@ const MobileSettingsContainer = (props: { onSideContainerOpen?: () => void }) =>
<button
className="hover:bg-emphasis flex items-center space-x-2 rounded-md px-3 py-1 rtl:space-x-reverse"
onClick={() => router.back()}>
<ArrowLeft className="text-default" />
<ArrowLeft className="text-default h-4 w-4" />
<p className="text-emphasis font-semibold">{t("settings")}</p>
</button>
</div>
+1 -1
View File
@@ -44,7 +44,7 @@ export function UpgradeTip({
alt={title}
/>
</picture>
<div className="relative mt-4 px-8 sm:px-14">
<div className="relative my-4 px-8 sm:px-14">
<h1 className={classNames("font-cal text-3xl", dark && "text-inverted")}>{t(title)}</h1>
<p className={classNames("mt-4 mb-8 max-w-sm", dark ? "text-inverted" : "text-default")}>
{t(description)}
+7 -7
View File
@@ -150,7 +150,7 @@ export const getUid = (calEvent: CalendarEvent): string => {
};
const getSeatReferenceId = (calEvent: CalendarEvent): string => {
return calEvent.attendeeSeatId ? `seatReferenceUid=${calEvent.attendeeSeatId}` : "";
return calEvent.attendeeSeatId ? calEvent.attendeeSeatId : "";
};
export const getManageLink = (calEvent: CalendarEvent) => {
@@ -161,12 +161,12 @@ ${WEBAPP_URL + "/booking/" + getUid(calEvent) + "?changes=true"}
};
export const getCancelLink = (calEvent: CalendarEvent): string => {
return (
WEBAPP_URL +
`/booking/${getUid(
calEvent
)}?cancel=true&allRemainingBookings=${!!calEvent.recurringEvent}&${getSeatReferenceId}`
);
const cancelLink = new URL(WEBAPP_URL + `/booking/${getUid(calEvent)}`);
cancelLink.searchParams.append("cancel", "true");
cancelLink.searchParams.append("allRemainingBookings", String(!!calEvent.recurringEvent));
const seatReferenceUid = getSeatReferenceId(calEvent);
if (seatReferenceUid) cancelLink.searchParams.append("seatReferenceUid", seatReferenceUid);
return cancelLink.toString();
};
export const getRescheduleLink = (calEvent: CalendarEvent): string => {
+5 -4
View File
@@ -15,16 +15,17 @@ export default function useTheme(themeToSet?: Maybe<string>) {
useEffect(() => {
// If themeToSet is not provided the purpose is to just return the current the current values
if (themeToSet === undefined) return;
if (!themeToSet) return;
// Embed theme takes precedence over theme configured in app. This allows embeds to be themed differently
const finalThemeToSet = embedTheme || themeToSet || "system";
const finalThemeToSet = embedTheme || themeToSet;
if (!finalThemeToSet || finalThemeToSet === activeTheme) return;
setTheme(finalThemeToSet);
}, [themeToSet, setTheme, embedTheme, activeTheme]);
// We must not add `activeTheme` to the dependency list as it can cause an infinite loop b/w dark and theme switches
// because there might be another booking page with conflicting theme.
}, [themeToSet, setTheme, embedTheme]);
return {
resolvedTheme,
setTheme,
-3
View File
@@ -13,6 +13,3 @@ export function getLocaleFromHeaders(req: IncomingMessage): string {
}
return preferredLocale ?? i18n.defaultLocale;
}
export const getDirFromLang = (locale: string | undefined) =>
locale === "ar" || locale === "he" ? "rtl" : "ltr";
+2 -2
View File
@@ -94,7 +94,7 @@ function CategoryTab({ selectedCategory, categories, searchText }: CategoryTabPr
}}
className={classNames(
selectedCategory === null ? "bg-emphasis text-default" : "bg-muted text-emphasis",
"hover:bg-emphasis rounded-md px-4 py-2.5 text-sm font-medium hover:cursor-pointer hover:text-gray-50"
"hover:bg-emphasis min-w-max rounded-md px-4 py-2.5 text-sm font-medium hover:cursor-pointer hover:text-gray-50"
)}>
{t("all_apps")}
</li>
@@ -168,7 +168,7 @@ export function AllApps({ apps, searchText, categories }: AllAppsPropsType) {
<CategoryTab selectedCategory={selectedCategory} searchText={searchText} categories={categories} />
{filteredApps.length ? (
<div
className="grid gap-3 lg:grid-cols-4 [@media(max-width:1270px)]:grid-cols-3 [@media(max-width:730px)]:grid-cols-2 [@media(max-width:500px)]:grid-cols-1"
className="grid gap-3 lg:grid-cols-4 [@media(max-width:1270px)]:grid-cols-3 [@media(max-width:730px)]:grid-cols-1 [@media(max-width:500px)]:grid-cols-1"
ref={appsContainerRef}>
{filteredApps.map((app) => (
<AppCard key={app.name} app={app} searchText={searchText} credentials={app.credentials} />
@@ -31,9 +31,13 @@ function SkeletonItem() {
<div className="flex-grow truncate text-sm">
<div className="flex justify-start space-x-2 rtl:space-x-reverse">
<SkeletonText className="h-10 w-10" />
<div className="space-y-2">
<SkeletonText className="h-4 w-32" />
<SkeletonText className="h-4 w-16" />
<div className="space-y-1">
<div>
<SkeletonText className="h-4 w-16" />
</div>
<div>
<SkeletonText className="h-4 w-32" />
</div>
</div>
</div>
</div>
@@ -45,7 +45,7 @@ export const AvatarGroup = function AvatarGroup(props: AvatarGroupProps) {
{numTruncatedAvatars > 0 && (
<li
className={classNames(
"bg-darkgray-300 relative -mr-[4px] mb-1 inline-flex justify-center overflow-hidden rounded-full",
"bg-inverted relative -mr-[4px] mb-1 inline-flex justify-center overflow-hidden rounded-full",
props.size === "sm" ? "min-w-6 h-6" : "min-w-16 h-16"
)}>
<span
+1 -1
View File
@@ -99,7 +99,7 @@ export const DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps
{type === "confirmation" && (
<div className="flex">
{Icon && (
<div className="mr-4 inline-flex h-10 w-10 items-center justify-center rounded-full bg-gray-300">
<div className="bg-emphasis mr-4 inline-flex h-10 w-10 items-center justify-center rounded-full">
<Icon className="text-emphasis h-4 w-4" />
</div>
)}
@@ -1,6 +1,5 @@
.editor a {
color: #0000FF;
text-decoration: underline;
font-size: 14px;
}