Merge branch 'main' into teste2e-allQuestionsCollective

This commit is contained in:
GitStart-Cal.com 2023-11-13 03:02:29 +05:45 committed by GitHub
commit efa7c253ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 308 additions and 28 deletions

View File

@ -1,10 +1,11 @@
import type { IncomingMessage, OutgoingMessage } from "http";
import type { NextRequest, NextResponse } from "next/server";
import { z } from "zod";
import { IS_PRODUCTION } from "@calcom/lib/constants";
import { WEBAPP_URL } from "@calcom/lib/constants";
import { buildNonce } from "@lib/buildNonce";
import { buildNonce } from "./buildNonce";
function getCspPolicy(nonce: string) {
//TODO: Do we need to explicitly define it in turbo.json
@ -46,11 +47,12 @@ const isPagePathRequest = (url: URL) => {
return !isNonPagePathPrefix.test(pathname) && !isFile.test(pathname);
};
export function csp(req: IncomingMessage | null, res: OutgoingMessage | null) {
export function csp(req: IncomingMessage | NextRequest | null, res: OutgoingMessage | NextResponse | null) {
if (!req) {
return { nonce: undefined };
}
const existingNonce = req.headers["x-nonce"];
const existingNonce = "cache" in req ? req.headers.get("x-nonce") : req.headers["x-nonce"];
if (existingNonce) {
const existingNoneParsed = z.string().safeParse(existingNonce);
return { nonce: existingNoneParsed.success ? existingNoneParsed.data : "" };
@ -71,17 +73,28 @@ export function csp(req: IncomingMessage | null, res: OutgoingMessage | null) {
}
// Set x-nonce request header to be used by `getServerSideProps` or similar fns and `Document.getInitialProps` to read the nonce from
// It is generated for all page requests but only used by pages that need CSP
req.headers["x-nonce"] = nonce;
if ("cache" in req) {
req.headers.set("x-nonce", nonce);
} else {
req.headers["x-nonce"] = nonce;
}
if (res) {
res.setHeader(
req.headers["x-csp-enforce"] === "true"
? "Content-Security-Policy"
: "Content-Security-Policy-Report-Only",
getCspPolicy(nonce)
.replace(/\s{2,}/g, " ")
.trim()
);
const enforced =
"cache" in req ? req.headers.get("x-csp-enforce") === "true" : req.headers["x-csp-enforce"] === "true";
const name = enforced ? "Content-Security-Policy" : "Content-Security-Policy-Report-Only";
const value = getCspPolicy(nonce)
.replace(/\s{2,}/g, " ")
.trim();
if ("body" in res) {
res.headers.set(name, value);
} else {
res.setHeader(name, value);
}
}
return { nonce };

View File

@ -5,10 +5,14 @@ import { NextResponse } from "next/server";
import { extendEventData, nextCollectBasicSettings } from "@calcom/lib/telemetry";
import { csp } from "@lib/csp";
const middleware: NextMiddleware = async (req) => {
const url = req.nextUrl;
const requestHeaders = new Headers(req.headers);
requestHeaders.set("x-url", req.url);
if (!url.pathname.startsWith("/api")) {
//
// NOTE: When tRPC hits an error a 500 is returned, when this is received
@ -32,6 +36,18 @@ const middleware: NextMiddleware = async (req) => {
}
const res = routingForms.handle(url);
const { nonce } = csp(req, res ?? null);
if (!process.env.CSP_POLICY) {
req.headers.set("x-csp", "not-opted-in");
} else if (!req.headers.get("x-csp")) {
// If x-csp not set by gSSP, then it's initialPropsOnly
req.headers.set("x-csp", "initialPropsOnly");
} else {
req.headers.set("x-csp", nonce ?? "");
}
if (res) {
return res;
}

View File

@ -386,7 +386,7 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
type.metadata?.managedEventConfig !== undefined && type.schedulingType !== SchedulingType.MANAGED;
return (
<li key={type.id}>
<div className="hover:bg-muted flex w-full items-center justify-between">
<div className="hover:bg-muted flex w-full items-center justify-between transition">
<div className="group flex w-full max-w-full items-center justify-between overflow-hidden px-4 py-4 sm:px-6">
{!(firstItem && firstItem.id === type.id) && (
<ArrowButton onClick={() => moveEventType(index, -1)} arrowDirection="up" />

View File

@ -268,6 +268,7 @@
"set_availability": "تحديد الوقت الذي تكون فيه متاحًا",
"availability_settings": "إعدادات التوافرية",
"continue_without_calendar": "المتابعة من دون تقويم",
"continue_with": "الاستمرار مع {{appName}}",
"connect_your_calendar": "ربط التقويم لديك",
"connect_your_video_app": "اربط تطبيقات الفيديو لديك",
"connect_your_video_app_instructions": "قم بتوصيل تطبيقات الفيديو لديك لاستخدامها في أنواع الأحداث الخاصة بك.",
@ -288,6 +289,8 @@
"when": "متى",
"where": "أين",
"add_to_calendar": "إضافة إلى التقويم",
"add_to_calendar_description": "اختر أين ستُضاف الأحداث الجديدة عندما يتم الحجز لديك.",
"add_events_to": "إضافة أحداث إلى",
"add_another_calendar": "إضافة تقويم آخر",
"other": "آخر",
"email_sign_in_subject": "رابط تسجيل الدخول بك لـ{{appName}}",
@ -422,6 +425,7 @@
"booking_created": "تم إنشاء الحجز",
"booking_rejected": "تم رفض الحجز",
"booking_requested": "تم طلب الحجز",
"booking_payment_initiated": "بدء الدفع للحجز",
"meeting_ended": "انتهى الاجتماع",
"form_submitted": "تم إرسال النموذج",
"booking_paid": "تم الدفع لقاء الحجز",
@ -456,6 +460,7 @@
"no_event_types_have_been_setup": "لم يقم هذا المستخدم بإعداد أي أنواع للحدث حتى الآن.",
"edit_logo": "تعديل الشعار",
"upload_a_logo": "تحميل شعار",
"upload_logo": "تحميل شعار",
"remove_logo": "إزالة الشعار",
"enable": "تمكين",
"code": "الرمز",
@ -568,6 +573,7 @@
"your_team_name": "اسم فريقك",
"team_updated_successfully": "تم تحديث الفريق بنجاح",
"your_team_updated_successfully": "تم تحديث فريقك بنجاح.",
"your_org_updated_successfully": "تم تحديث منظمتك بنجاح.",
"about": "حول",
"team_description": "بضع جمل عن فريقك. ستظهر على صفحة رابط فريقك.",
"org_description": "بضع جمل عن منظمتك. ستظهر على صفحة رابط منظمتك.",
@ -599,6 +605,7 @@
"hide_book_a_team_member": "إخفاء الزر \"حجز عضو فريق\"",
"hide_book_a_team_member_description": "إخفاء الزر \"حجز عضو فريق\" من صفحاتك العامة.",
"danger_zone": "منطقة خطر",
"account_deletion_cannot_be_undone": "احترس. لا يمكن التراجع عن حذف الحساب.",
"back": "عودة",
"cancel": "إلغاء",
"cancel_all_remaining": "إلغاء كل ما تبقى",
@ -688,6 +695,7 @@
"people": "الأشخاص",
"your_email": "بريدك الإلكتروني",
"change_avatar": "تغيير الصورة الرمزية",
"upload_avatar": "تحميل صورة رمزية",
"language": "اللغة",
"timezone": "المنطقة الزمنية",
"first_day_of_week": "أول يوم في الأسبوع",
@ -778,6 +786,7 @@
"disable_guests": "تعطيل خاصية الضيوف",
"disable_guests_description": "قم بتعطيل إضافة مزيد من الضيوف أثناء الحجز.",
"private_link": "إنشاء رابط خاص",
"enable_private_url": "تمكين عنوان URL خاص",
"private_link_label": "رابط خاص",
"private_link_hint": "سيتم إعادة توليد الرابط الخاص بك بعد كل استخدام",
"copy_private_link": "نسخ الرابط الخاص",
@ -1213,6 +1222,7 @@
"organizer_name_variable": "اسم المنظم",
"app_upgrade_description": "لاستخدام هذه الميزة، تحتاج إلى الترقية إلى حساب Pro.",
"invalid_number": "رقم الهاتف غير صالح",
"invalid_url_error_message": "عنوان URL غير صالح من أجل {{label}}. عنوان URL للعينة: {{sampleUrl}}",
"navigate": "تنقّل",
"open": "فتح",
"close": "إغلاق",
@ -1276,6 +1286,7 @@
"personal_cal_url": "عنوان {{appName}} URL الخاص بي",
"bio_hint": "اكتب بضع جمل عن نفسك، والتي ستظهر على صفحة عنوان Url الشخصية لديك.",
"user_has_no_bio": "لم يُضف هذا المستخدم لمحة عنه بعد.",
"bio": "سيرة ذاتية",
"delete_account_modal_title": "حذف الحساب",
"confirm_delete_account_modal": "هل أنت متأكد من أنك تريد حذف حساب {{appName}} الخاص بك؟",
"delete_my_account": "حذف حسابي",
@ -1286,6 +1297,7 @@
"select_calendars": "حدد الرزنامات التي تريد التحقق منها بحثًا عن تضاربات لمنع الحجوزات المزدوجة.",
"check_for_conflicts": "التحقق من وجود تضاربات",
"view_recordings": "عرض التسجيلات",
"check_for_recordings": "تحقق من وجود تسجيلات",
"adding_events_to": "إضافة أحداث إلى",
"follow_system_preferences": "اتبع تفضيلات النظام",
"custom_brand_colors": "ألوان العلامة التجارية المخصصة",
@ -1530,6 +1542,7 @@
"problem_registering_domain": "حدثت مشكلة في تسجيل المجال الفرعي، يُرجى المحاولة لاحقاً أو الاتصال بالمشرف",
"team_publish": "نشر فريق",
"number_text_notifications": "رقم الهاتف (إشعارات الرسائل النصية)",
"number_sms_notifications": "رقم الهاتف (إشعارات الرسائل النصية)",
"attendee_email_variable": "اسم الحاضر",
"attendee_email_info": "البريد الإلكتروني للشخص الحجز",
"kbar_search_placeholder": "اكتب أمرًا أو بحثًا...",
@ -1594,6 +1607,7 @@
"options": "خيارات",
"enter_option": "أدخل خيار {{index}}",
"add_an_option": "إضافة خيار",
"location_already_exists": "هذا الموقع موجود بالفعل. الرجاء اختيار موقع جديد",
"radio": "الراديو",
"google_meet_warning": "من أجل استخدام Google Meet، يجب عليك تعيين تقويم وجهتك على تقويم Google",
"individual": "فرد",
@ -1613,6 +1627,7 @@
"date_overrides_mark_all_day_unavailable_other": "وضع علامة غير متاح على التواريخ المحددة",
"date_overrides_add_btn": "إضافة تجاوز",
"date_overrides_update_btn": "تحديث التجاوز",
"date_successfully_added": "تم إضافة تخطّي التاريخ بنجاح",
"event_type_duplicate_copy_text": "{{slug}}-نسخ",
"set_as_default": "تعيين كافتراضي",
"hide_eventtype_details": "إخفاء تفاصيل نوع الحدث",
@ -1639,6 +1654,7 @@
"minimum_round_robin_hosts_count": "عدد المضيفين المطلوب حضورهم",
"hosts": "المضيفون",
"upgrade_to_enable_feature": "تحتاج إلى إنشاء فريق لتمكين هذه الميزة. انقر لإنشاء فريق.",
"orgs_upgrade_to_enable_feature": "تحتاج إلى الترقية إلى خطة enterprise لتفعيل هذه الميزة.",
"new_attendee": "حضور جديد",
"awaiting_approval": "في انتظار الموافقة",
"requires_google_calendar": "يتطلب هذا التطبيق اتصال تقويم Google",
@ -1743,6 +1759,7 @@
"show_on_booking_page": "إظهار في صفحة الحجز",
"get_started_zapier_templates": "البدء في استخدام قوالب Zapier",
"team_is_unpublished": "لم يُنشر {{team}}",
"org_is_unpublished_description": "رابط هذه المنظمة غير متاح حاليًا. يرجى الاتصال بمالك المنظمة أو طلب النشر منه.",
"team_is_unpublished_description": "رابط هذا {{entity}} غير متاح حاليًا. يرجى الاتصال بمالك {{entity}} أو طلب نشره منه.",
"team_member": "عضو الفريق",
"a_routing_form": "نموذج توجيه",
@ -1877,6 +1894,7 @@
"edit_invite_link": "تعديل إعدادات الرابط",
"invite_link_copied": "تم نسخ رابط الدعوة",
"invite_link_deleted": "تم حذف رابط الدعوة",
"api_key_deleted": "تم حذف مفتاح API",
"invite_link_updated": "تم حفظ إعدادات رابط الدعوة",
"link_expires_after": "تم تعيين انتهاء صلاحية الروابط بعد...",
"one_day": "1 يوم",
@ -2009,7 +2027,13 @@
"attendee_last_name_variable": "اسم العائلة للحاضر",
"attendee_first_name_info": "الاسم الأول للشخص صاحب الحجز",
"attendee_last_name_info": "اسم العائلة للشخص صاحب الحجز",
"your_monthly_digest": "موجزك الشهري",
"member_name": "اسم العضو",
"most_popular_events": "الأحداث الأكثر شعبية",
"summary_of_events_for_your_team_for_the_last_30_days": "إليك ملخصك للأحداث الشعبية لفريقك {{teamName}} خلال آخر 30 يومًا",
"me": "أنا",
"monthly_digest_email": "الرسالة الإلكترونية للموجز الشهري",
"monthly_digest_email_for_teams": "رسالة إلكترونية بالموجز الشهري للفرق",
"verify_team_tooltip": "تأكيد فريقك لتمكين إرسال الرسائل إلى الحاضرين",
"member_removed": "تمت إزالة العضو",
"my_availability": "أوقاتي المتاحة",
@ -2039,12 +2063,40 @@
"team_no_event_types": "ليس لدى هذا الفريق أنواع من الفعاليات",
"seat_options_doesnt_multiple_durations": "لا يدعم خيار المقعد فترات متعددة",
"include_calendar_event": "إدراج فعاليات في التقويم",
"oAuth": "OAuth",
"recently_added": "تمت الإضافة مؤخراً",
"no_members_found": "لم يُعثر على أعضاء",
"event_setup_length_error": "إعداد الفعالية: يجب أن تكون المدة لدقيقة على الأقل.",
"availability_schedules": "جدولة التوافر",
"unauthorized": "غير مصرح به",
"access_cal_account": "يرغب {{clientName}} في الوصول إلى حسابك على {{appName}}",
"select_account_team": "اختر حسابًا أو فريق",
"allow_client_to": "سيمنح هذا {{clientName}} القدرة على",
"associate_with_cal_account": "رافق نفسك بمعلوماتك الشخصية من {{clientName}}",
"see_personal_info": "شاهد معلوماتك الشخصية، بما في ذلك أي معلومات شخصية جعلتها متاحة للجمهور",
"see_primary_email_address": "طالع عنوان بريدك الإلكتروني الأساسي",
"connect_installed_apps": "قم بالارتباط بتطبيقاتك المثبتة",
"access_event_type": "اقرأ وعدّل واحذف أنواع الأحداث لديك",
"access_availability": "اقرأ وعّدل واحذف توافرك",
"access_bookings": "اقرأ وعدّل واحذف الحجوزات لديك",
"allow_client_to_do": "السماح لـ {{clientName}} بالقيام بهذا؟",
"oauth_access_information": "عبر نقرك على السماح، ستسمح لهذا التطبيق باستخدام معلوماتك وفقاً لشروط الخدمة وسياسة الخصوصية لديه. يمكنك إزالة هذا الوصول من متجر التطبيقات {{appName}}.",
"allow": "السماح",
"view_only_edit_availability_not_onboarded": "لم يكمل هذا المستخدم عملية الانضمام. لن تتمكن من تعيين توافره حتى يكتمل انضمامه.",
"view_only_edit_availability": "أنت تشاهد توافر هذا المستخدم. يمكنك تعديل توافرك فقط.",
"you_can_override_calendar_in_advanced_tab": "يمكنك تجاوز هذا لكل حدث على حدة في الإعدادات المتقدمة في كل نوع من أنواع الأحداث.",
"edit_users_availability": "تعديل توافر المستخدم: {{username}}",
"resend_invitation": "إعادة إرسال الدعوة",
"invitation_resent": "تم إعادة إرسال الدعوة.",
"add_client": "إضافة عميل",
"copy_client_secret_info": "لن تتمكن من مطالعة السر بعد نسخه بعد الآن",
"add_new_client": "إضافة عميل جديد",
"this_app_is_not_setup_already": "لم يتم إعداد هذا التطبيق بعد",
"as_csv": "كـ CSV",
"overlay_my_calendar": "تركيب تقويمي",
"overlay_my_calendar_toc": "من خلال الارتباط بتقويمك، أنت تقبل سياسة الخصوصية وشروط الاستخدام. يمكنك إلغاء الوصول في أي وقت.",
"view_overlay_calendar_events": "طالع أحداث تقويمك لمنع التضارب بين الحجوزات.",
"lock_timezone_toggle_on_booking_page": "قفل المنطقة الزمنية في صفحة الحجز",
"description_lock_timezone_toggle_on_booking_page": "تقفل المنطقة الزمنية على صفحة الحجز، وهذا مفيد للأحداث وجهاً لوجه.",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ أضف السلاسل الجديدة أعلاه هنا ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -268,6 +268,7 @@
"set_availability": "언제 여유가 있는지 설정하세요.",
"availability_settings": "사용 가능한 설정",
"continue_without_calendar": "캘린더 없이 계속하기",
"continue_with": "{{appName}}에서 계속",
"connect_your_calendar": "캘린더 연결하기",
"connect_your_video_app": "비디오 앱 연결",
"connect_your_video_app_instructions": "해당 이벤트 타입에서 사용하기 위한 비디오 앱을 연결해주세요.",
@ -288,6 +289,8 @@
"when": "언제",
"where": "어디서",
"add_to_calendar": "캘린더에 추가하기",
"add_to_calendar_description": "예약 시 이벤트를 추가할 위치를 선택합니다.",
"add_events_to": "이벤트 추가:",
"add_another_calendar": "다른 캘린더 추가",
"other": "더 보기",
"email_sign_in_subject": "{{appName}}의 로그인 링크",
@ -422,6 +425,7 @@
"booking_created": "예약 생성",
"booking_rejected": "예약 거부됨",
"booking_requested": "예약 요청됨",
"booking_payment_initiated": "예약 결제가 시작되었습니다",
"meeting_ended": "회의 종료됨",
"form_submitted": "양식 제출됨",
"booking_paid": "예약 결제됨",
@ -456,6 +460,7 @@
"no_event_types_have_been_setup": "사용자가 이벤트 타입을 설정하지 않았습니다.",
"edit_logo": "로고 수정하기",
"upload_a_logo": "로고 업로드",
"upload_logo": "로고 업로드",
"remove_logo": "로고 제거",
"enable": "활성화",
"code": "코드",
@ -568,6 +573,7 @@
"your_team_name": "팀 이름",
"team_updated_successfully": "팀이 성공적으로 업데이트되었습니다.",
"your_team_updated_successfully": "Your team has been updated successfully.",
"your_org_updated_successfully": "조직이 성공적으로 업데이트되었습니다.",
"about": "대하여",
"team_description": "팀 URL 페이지에 나타날 팀 소개를 해주세요.",
"org_description": "귀하의 조직에 대한 몇 자 남겨주세요. 이 내용은 귀하 조직의 URL 페이지에 표시됩니다.",
@ -599,6 +605,7 @@
"hide_book_a_team_member": "팀원 예약 버튼 숨기기",
"hide_book_a_team_member_description": "공개 페이지에서 팀원 예약 버튼을 숨깁니다.",
"danger_zone": "위험 구역",
"account_deletion_cannot_be_undone": "주의하세요. 계정 삭제 후에는 되돌릴 수 없습니다.",
"back": "뒤로 가기",
"cancel": "취소",
"cancel_all_remaining": "나머지 모두 취소",
@ -688,6 +695,7 @@
"people": "인원",
"your_email": "이메일 주소",
"change_avatar": "아바타 변경하기",
"upload_avatar": "아바타 업로드",
"language": "언어",
"timezone": "시간대",
"first_day_of_week": "첫 번째 요일",
@ -778,6 +786,7 @@
"disable_guests": "게스트 비활성화",
"disable_guests_description": "예약하는 동안 손님 추가를 비활성화하십시오.",
"private_link": "비공개 링크 생성",
"enable_private_url": "비공개 URL 활성화",
"private_link_label": "비공개 링크",
"private_link_hint": "비공개 링크는 매 사용 시마다 다시 생성됩니다",
"copy_private_link": "비공개 링크 복사",
@ -1213,6 +1222,7 @@
"organizer_name_variable": "주최자 이름",
"app_upgrade_description": "이 기능을 사용하려면 Pro 계정으로 업그레이드해야 합니다.",
"invalid_number": "유효하지 않은 전화 번호",
"invalid_url_error_message": "{{label}}에 대한 URL이 유효하지 않습니다. 샘플 URL: {{sampleUrl}}",
"navigate": "탐색하기",
"open": "열기",
"close": "닫기",
@ -1276,6 +1286,7 @@
"personal_cal_url": "내 개인 {{appName}} URL",
"bio_hint": "자신에 대해 몇 마디를 써보세요. 개인 URL 페이지에 보이는 내용입니다.",
"user_has_no_bio": "이 사용자는 아직 사용자 정보를 추가하지 않았습니다.",
"bio": "사용자 정보",
"delete_account_modal_title": "계정 삭제",
"confirm_delete_account_modal": "{{appName}} 계정을 삭제하시겠습니까?",
"delete_my_account": "내 계정 삭제",
@ -1286,6 +1297,7 @@
"select_calendars": "중복 예약을 방지하기 위해 충돌을 확인하려는 캘린더를 선택합니다.",
"check_for_conflicts": "충돌 확인",
"view_recordings": "녹음 보기",
"check_for_recordings": "기록 확인",
"adding_events_to": "이벤트 추가:",
"follow_system_preferences": "시스템 추적 기본 설정",
"custom_brand_colors": "사용자 정의 브랜드 색상",
@ -1530,6 +1542,7 @@
"problem_registering_domain": "하위 도메인 등록에 문제가 있습니다. 다시 시도하거나 관리자에게 문의하세요.",
"team_publish": "팀 게시",
"number_text_notifications": "전화번호(문자 알림)",
"number_sms_notifications": "전화번호(SMS 알림)",
"attendee_email_variable": "참석자 이메일",
"attendee_email_info": "예약자 이메일",
"kbar_search_placeholder": "명령어를 입력하거나 검색하세요...",
@ -1594,6 +1607,7 @@
"options": "선택사항",
"enter_option": "선택사항 {{index}} 입력",
"add_an_option": "선택사항 추가",
"location_already_exists": "이 위치는 이미 존재합니다. 새 위치를 선택하세요.",
"radio": "라디오",
"google_meet_warning": "Google Meet을 사용하려면 대상 캘린더를 Google Calendar로 설정해야 합니다",
"individual": "개인",
@ -1613,6 +1627,7 @@
"date_overrides_mark_all_day_unavailable_other": "선택 날짜에 이용 불가로 표시",
"date_overrides_add_btn": "재정의 추가",
"date_overrides_update_btn": "재정의 업데이트",
"date_successfully_added": "날짜 재정의가 추가되었습니다",
"event_type_duplicate_copy_text": "{{slug}}-카피",
"set_as_default": "기본값으로 설정",
"hide_eventtype_details": "이벤트 타입 세부정보 숨기기",
@ -1639,6 +1654,7 @@
"minimum_round_robin_hosts_count": "참석에 필요한 호스트 수",
"hosts": "호스트",
"upgrade_to_enable_feature": "이 기능을 사용하려면 팀을 만들어야 합니다. 팀을 만들려면 클릭하세요.",
"orgs_upgrade_to_enable_feature": "이 기능을 활성화하려면 엔터프라이즈 플랜으로 업그레이드해야 합니다.",
"new_attendee": "새 참석자",
"awaiting_approval": "승인 기다리는 중",
"requires_google_calendar": "이 앱은 Google Calendar 연결이 필요합니다",
@ -1743,6 +1759,7 @@
"show_on_booking_page": "예약 페이지에 표시",
"get_started_zapier_templates": "Zapier 템플릿 시작하기",
"team_is_unpublished": "{{team}} 팀은 게시되지 않았습니다",
"org_is_unpublished_description": "이 조직 링크는 현재 사용할 수 없습니다. 조직 소유자에게 문의하거나 게시해 달라고 요청하세요.",
"team_is_unpublished_description": "이 {{entity}} 링크는 현재 사용할 수 없습니다. {{entity}} 소유자에게 연락하거나 게시하라고 요청하십시오.",
"team_member": "팀원",
"a_routing_form": "라우팅 양식",
@ -1877,6 +1894,7 @@
"edit_invite_link": "링크 설정 편집",
"invite_link_copied": "초대 링크가 복사되었습니다",
"invite_link_deleted": "초대 링크가 삭제되었습니다",
"api_key_deleted": "API 키 삭제됨",
"invite_link_updated": "초대 링크 설정이 저장되었습니다",
"link_expires_after": "링크 만료 기한...",
"one_day": "1일",
@ -2009,7 +2027,13 @@
"attendee_last_name_variable": "참석자 성",
"attendee_first_name_info": "예약자 이름",
"attendee_last_name_info": "예약자 성",
"your_monthly_digest": "내 월간 다이제스트",
"member_name": "구성원 이름",
"most_popular_events": "가장 인기 있는 이벤트",
"summary_of_events_for_your_team_for_the_last_30_days": "지난 30일간 {{teamName}} 팀의 인기 이벤트 요약은 다음과 같습니다",
"me": "나",
"monthly_digest_email": "월간 다이제스트 이메일",
"monthly_digest_email_for_teams": "팀의 월간 다이제스트 이메일",
"verify_team_tooltip": "참석자에게 메시지를 보낼 수 있도록 팀을 인증하세요",
"member_removed": "구성원 제거됨",
"my_availability": "내 가용성",
@ -2039,12 +2063,40 @@
"team_no_event_types": "이 팀에는 이벤트 유형이 없습니다",
"seat_options_doesnt_multiple_durations": "좌석 옵션은 여러 기간을 지원하지 않습니다",
"include_calendar_event": "캘린더 이벤트 포함",
"oAuth": "OAuth",
"recently_added": "최근 추가됨",
"no_members_found": "구성원 없음",
"event_setup_length_error": "이벤트 설정: 지속 시간은 1분 이상이어야 합니다.",
"availability_schedules": "사용 가능한 일정",
"unauthorized": "미승인",
"access_cal_account": "{{clientName}} 님이 귀하의 {{appName}} 계정에 액세스하려고 합니다",
"select_account_team": "계정 또는 팀 선택",
"allow_client_to": "이것으로 {{clientName}} 님이 다음 작업을 수행할 수 있습니다",
"associate_with_cal_account": "귀하를 {{clientName}} 님의 개인 정보와 연결하세요",
"see_personal_info": "공개적으로 사용 가능한 개인 정보를 포함한 개인 정보를 확인하세요",
"see_primary_email_address": "기본 이메일 주소 보기",
"connect_installed_apps": "설치된 앱에 연결",
"access_event_type": "이벤트 유형 읽기, 편집, 삭제",
"access_availability": "가용 여부 읽기, 편집, 삭제",
"access_bookings": "예약 읽기, 편집, 삭제",
"allow_client_to_do": "{{clientName}}님이 이 작업을 수행하도록 허용하시겠습니까?",
"oauth_access_information": "허용을 클릭하면 이 앱이 서비스 약관 및 개인정보 보호정책에 따라 귀하의 정보를 사용할 수 있도록 허용하게 됩니다. 액세스 권한은 {{appName}} App Store에서 삭제할 수 있습니다.",
"allow": "허용",
"view_only_edit_availability_not_onboarded": "이 사용자는 온보딩을 완료하지 않았습니다. 온보딩이 완료될 때까지는 가용성을 설정할 수 없습니다.",
"view_only_edit_availability": "이 사용자의 가용성을 보고 계십니다. 본인의 가용성만 편집할 수 있습니다.",
"you_can_override_calendar_in_advanced_tab": "이것은 각 이벤트 유형의 고급 설정에서 이벤트별로 재정의할 수 있습니다.",
"edit_users_availability": "사용자 가용성 편집: {{username}}",
"resend_invitation": "초대장 다시 보내기",
"invitation_resent": "초대장을 다시 보냈습니다.",
"add_client": "클라이언트 추가",
"copy_client_secret_info": "비밀글을 복사한 후에는 더 이상 볼 수 없습니다",
"add_new_client": "새 클라이언트 추가",
"this_app_is_not_setup_already": "이 앱은 아직 설정되지 않았습니다",
"as_csv": "CSV 형식",
"overlay_my_calendar": "내 캘린더 오버레이",
"overlay_my_calendar_toc": "캘린더에 연결하면 당사의 개인정보 보호정책 및 이용 약관에 동의하게 됩니다. 액세스 권한은 언제든 취소할 수 있습니다.",
"view_overlay_calendar_events": "예약 충돌을 방지하려면 캘린더 이벤트를 확인하십시오.",
"lock_timezone_toggle_on_booking_page": "예약 페이지의 시간대 잠금",
"description_lock_timezone_toggle_on_booking_page": "예약 페이지에서 시간대를 잠그는 기능은 대면 이벤트에 유용합니다.",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 여기에 새 문자열을 추가하세요 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -268,6 +268,7 @@
"set_availability": "Podesite svoju dostupnost",
"availability_settings": "Podešavanja dostuposti",
"continue_without_calendar": "Nastavite bez kalendara",
"continue_with": "Nastavite sa {{appName}}",
"connect_your_calendar": "Povežite vaš kalendar",
"connect_your_video_app": "Povežite svoje video aplikacije",
"connect_your_video_app_instructions": "Povežite svoje video aplikacije da biste ih koristili u vašim tipovima događaja.",
@ -288,6 +289,8 @@
"when": "Kad",
"where": "Gde",
"add_to_calendar": "Dodaj u kalendar",
"add_to_calendar_description": "Izaberite gde da dodate događaje kada ste rezervisani.",
"add_events_to": "Dodajte događaje u",
"add_another_calendar": "Dodaj još jedan kalendar",
"other": "Drugo",
"email_sign_in_subject": "Vaša veza za prijavu na {{appName}}",
@ -422,6 +425,7 @@
"booking_created": "Rezervacija Napravljena",
"booking_rejected": "Rezevacija je odbijena",
"booking_requested": "Zahtev za rezervaciju je poslat",
"booking_payment_initiated": "Plaćanje rezervisanja je inicirano",
"meeting_ended": "Sastanak se završio",
"form_submitted": "Formular poslat",
"booking_paid": "Rezervacija je plaćena",
@ -456,6 +460,7 @@
"no_event_types_have_been_setup": "Ovaj korisnik još nije podesio tipove događaja.",
"edit_logo": "Uredi logo",
"upload_a_logo": "Prikači logo",
"upload_logo": "Otpremite logotip",
"remove_logo": "Ukloni logo",
"enable": "Omogući",
"code": "Kod",
@ -568,6 +573,7 @@
"your_team_name": "Ime vašeg tima",
"team_updated_successfully": "Tim uspešno ažuriran",
"your_team_updated_successfully": "Vaš tim je uspešno ažuriran.",
"your_org_updated_successfully": "Vaša Organizacija je uspešno ažurirana.",
"about": "Opis",
"team_description": "Par rečenica o vašem timu. Ovo će se pojaviti na stranici URL adrese vašeg tima.",
"org_description": "Nekoliko rečenica o vašoj organizaciji. Ovo će se pojaviti na url stranici vaše organizacije.",
@ -599,6 +605,7 @@
"hide_book_a_team_member": "Sakrij dugme „Rezerviši člana tima”",
"hide_book_a_team_member_description": "Sakrij sa javnih strana dugme „Rezerviši člana tima”.",
"danger_zone": "Opasna Zona",
"account_deletion_cannot_be_undone": "Budite pažljivi. Brisanje naloga ne može da se opozove.",
"back": "Nazad",
"cancel": "Otkaži",
"cancel_all_remaining": "Otkaži sve preostalo",
@ -688,6 +695,7 @@
"people": "Ljudi",
"your_email": "Vaša E-pošta",
"change_avatar": "Promenite Avatara",
"upload_avatar": "Otpremite avatar",
"language": "Jezik",
"timezone": "Vremenska zona",
"first_day_of_week": "Prvi dan u nedelji",
@ -778,6 +786,7 @@
"disable_guests": "Onemogući Goste",
"disable_guests_description": "Onemogući dodavanje dodatnih gostiju prilikom rezervacije.",
"private_link": "Generiši privatni link",
"enable_private_url": "Omogućite privatni URL",
"private_link_label": "Privatni link",
"private_link_hint": "Vaš privatni link će se ponovo generisati nakon svake upotrebe",
"copy_private_link": "Kopiraj privatni link",
@ -1213,6 +1222,7 @@
"organizer_name_variable": "Ime organizatora",
"app_upgrade_description": "Da biste koristili ovu funkciju, morate izvršiti nadogradnju na Pro nalog.",
"invalid_number": "Neispravan broj telefona",
"invalid_url_error_message": "Neispravan URL za {{label}}. Primer URL-a: {{sampleUrl}}",
"navigate": "Navigacija",
"open": "Otvori",
"close": "Zatvori",
@ -1276,6 +1286,7 @@
"personal_cal_url": "Moj lični {{appName}} URL",
"bio_hint": "Par rečenica o vama. Ovo će se pojaviti na vašoj ličnoj url stranici.",
"user_has_no_bio": "Ovaj korisnik još nije dodao svoju biografiju.",
"bio": "Biografija",
"delete_account_modal_title": "Izbriši nalog",
"confirm_delete_account_modal": "Jeste li sigurni da želite da izbrišete vaš {{appName}} nalog?",
"delete_my_account": "Izbriši moj nalog",
@ -1286,6 +1297,7 @@
"select_calendars": "Izaberite kalendare koje želite da proverite da li imaju konflikta da biste sprečili dvostruka zakazivanja.",
"check_for_conflicts": "Proverite konflikte",
"view_recordings": "Pregledaj snimke",
"check_for_recordings": "Proverite snimke",
"adding_events_to": "Dodavanje događaja u",
"follow_system_preferences": "Prati sistemska podešavanja",
"custom_brand_colors": "Prilagođene boje brenda",
@ -1530,6 +1542,7 @@
"problem_registering_domain": "Postoji problem sa registracijom poddomena, pokušajte ponovo ili se obratite administratoru",
"team_publish": "Objavite tim",
"number_text_notifications": "Broj telefona (obaveštenja putem SMS-a)",
"number_sms_notifications": "Broj telefona (obaveštenja putem SMS-a)",
"attendee_email_variable": "Imejl polaznika",
"attendee_email_info": "Imejl osobe koja rezerviše",
"kbar_search_placeholder": "Unesite komandu ili pretražite...",
@ -1594,6 +1607,7 @@
"options": "Opcije",
"enter_option": "Unesite opciju {{index}}",
"add_an_option": "Dodajte opciju",
"location_already_exists": "Ova lokacija već postoji. Izaberite novu lokaciju",
"radio": "Radio",
"google_meet_warning": "Da biste koristili Google Meet morate da podesite Google Calendar kao odredišni kalendar",
"individual": "Pojedinac",
@ -1613,6 +1627,7 @@
"date_overrides_mark_all_day_unavailable_other": "Označi kao nedostupno za sledeće datume",
"date_overrides_add_btn": "Dodaj zamenu",
"date_overrides_update_btn": "Ažuriraj zamenu",
"date_successfully_added": "Datum zamene je uspešno dodat",
"event_type_duplicate_copy_text": "{{slug}}-kopija",
"set_as_default": "Postavi kao podrazumevano",
"hide_eventtype_details": "Sakrij detalje tipa događaja",
@ -1639,6 +1654,7 @@
"minimum_round_robin_hosts_count": "Broj domaćina potrebnih da učestvuju",
"hosts": "Domaćini",
"upgrade_to_enable_feature": "Potrebno je da kreirate tim da biste omogućili ovu funkciju. Kliknite da kreirate tim.",
"orgs_upgrade_to_enable_feature": "Morate da nadogradite na naš Enterprise plan da biste omogućili ovu funkciju.",
"new_attendee": "Novi učesnik",
"awaiting_approval": "Čeka na odobrenje",
"requires_google_calendar": "Ova aplikacija zahteva vezu sa Google kalendarom",
@ -1743,6 +1759,7 @@
"show_on_booking_page": "Prikaži na stranici zakazivanja",
"get_started_zapier_templates": "Započnite sa Zapier predlošcima",
"team_is_unpublished": "Opozvano je objavljivanje tima {{team}}",
"org_is_unpublished_description": "Ovaj link Organizacije trenutno nije dostupan. Obratite se vlasniku Organizacije i zamolite ga da ga objavi.",
"team_is_unpublished_description": "Ovaj link {{entity}} više nije dostupan. Obratite se vlasniku {{entity}} i zamolite ga da objavi.",
"team_member": "Član tima",
"a_routing_form": "Obrazac za usmeravanje",
@ -1877,6 +1894,7 @@
"edit_invite_link": "Izmeni podešavanja linka",
"invite_link_copied": "Link pozivnice je kopiran",
"invite_link_deleted": "Link pozivnice je izbrisan",
"api_key_deleted": "API ključ je obrisan",
"invite_link_updated": "Podešavanja linka pozivnice su sačuvana",
"link_expires_after": "Linkovi su podešeni da isteknu za...",
"one_day": "1 dan",
@ -2009,7 +2027,13 @@
"attendee_last_name_variable": "Prezime učesnika",
"attendee_first_name_info": "Ime osobe koja rezerviše",
"attendee_last_name_info": "Prezime osobe koja rezerviše",
"your_monthly_digest": "Vaš mesečni presek",
"member_name": "Ime člana",
"most_popular_events": "Najpopularniji događaji",
"summary_of_events_for_your_team_for_the_last_30_days": "Evo preseka popularnih događaja za vaš tim {{teamName}} u poslednjih 30 dana",
"me": "Ja",
"monthly_digest_email": "Imejl sa mesečnih presekom",
"monthly_digest_email_for_teams": "Imejl sa mesečnim presekom za timove",
"verify_team_tooltip": "Verifikujte svoj tim da biste omogućili slanje poruka učesnicima",
"member_removed": "Član je uklonjen",
"my_availability": "Moja dostupnost",
@ -2039,12 +2063,40 @@
"team_no_event_types": "Ovaj tim nema tipove događaja",
"seat_options_doesnt_multiple_durations": "Opcije za mesta ne podržavaju višestruko trajanje",
"include_calendar_event": "Uključite događaj u kalendaru",
"oAuth": "OAuth",
"recently_added": "Nedavno dodato",
"no_members_found": "Članovi nisu pronađeni",
"event_setup_length_error": "Podešavanje događaja: Trajanje mora da bude barem 1 minut.",
"availability_schedules": "Raspored dostupnosti",
"unauthorized": "Neovlašćeno",
"access_cal_account": "{{clientName}} bi želeo da pristupi vašem {{appName}} nalogu",
"select_account_team": "Izaberite nalog ili tim",
"allow_client_to": "Ovo će dozvoliti {{clientName}} da",
"associate_with_cal_account": "Da vas poveže sa vašim ličnim informacijama na {{clientName}}",
"see_personal_info": "Da vidi vaše lične informacije, uključujući bilo koje privatne informacije koje ste učili javno dostupnim",
"see_primary_email_address": "Da vidi vašu primarnu imejl adresu",
"connect_installed_apps": "Da se poveže sa vašim instaliranim aplikacijiama",
"access_event_type": "Da pročita, izmeni i izbriše vaše tipove događaja",
"access_availability": "Da pročita, izmeni i izbriše vašu dostupnost",
"access_bookings": "Da pročita, izmeni i izbriše vaša zakazivanja",
"allow_client_to_do": "Da li dozvoljavate {{clientName}} da to uradi?",
"oauth_access_information": "Klikom na „Dozvoli”, dozvoljavate ovoj aplikaciji da koristi vaše informacije u skladu sa njihovim Uslovima usluge i Politikom privatnosti. Možete da uklonite pristup u {{appName}} prodavnici aplikacija.",
"allow": "Dozvoli",
"view_only_edit_availability_not_onboarded": "Ovaj korisnik nije završio uvodnu obuku. Nećete moći da podesite dostupnost dok ne dovrši uvodnu obuku.",
"view_only_edit_availability": "Pregledate dostupnost ovog korisnika. Možete da uredite samo svoju dostupnost.",
"you_can_override_calendar_in_advanced_tab": "Možete da promenite ovo za svaki događaj u Napredim podešavanjima u svakom tipu događaja.",
"edit_users_availability": "Uredi dostupnost korisnika: {{username}}",
"resend_invitation": "Ponovo pošaljite pozivnicu",
"invitation_resent": "Pozivnica je ponovo poslata.",
"add_client": "Dodajte klijenta",
"copy_client_secret_info": "Nakon kopiranja tajne, nećete moći više da je vidite",
"add_new_client": "Dodajte novog klijenta",
"this_app_is_not_setup_already": "Ova aplikacija još uvek nije podešena",
"as_csv": "kao CSV",
"overlay_my_calendar": "Prikaži preko mog kalendara",
"overlay_my_calendar_toc": "Povezivanjem sa vašim kalendarom, prihvatate našu Politiku privatnosti i Uslove korišćenja. Možete da povučete pristup u bilo kom trenutku.",
"view_overlay_calendar_events": "Pregledajte događaje u vašem kalendaru da biste sprečili dvostruka zakazivanja.",
"lock_timezone_toggle_on_booking_page": "Zaključajte vremensku zonu na stranici za zakazivanja",
"description_lock_timezone_toggle_on_booking_page": "Za zaključavanje vremenske zone na stranici za zakazivanja, korisno za događaje licem u lice.",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Dodajte svoje nove stringove iznad ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -268,6 +268,7 @@
"set_availability": "Ställ in din tillgänglighet",
"availability_settings": "Tillgänglighetsinställningar",
"continue_without_calendar": "Fortsätt utan kalender",
"continue_with": "Fortsätt med {{appName}}",
"connect_your_calendar": "Anslut din kalender",
"connect_your_video_app": "Anslut dina videoappar",
"connect_your_video_app_instructions": "Anslut dina videoappar för att använda dem i dina händelsetyper.",
@ -288,6 +289,8 @@
"when": "När",
"where": "Var",
"add_to_calendar": "Lägg till i kalender",
"add_to_calendar_description": "Välj var du vill lägga till händelser när du är bokad.",
"add_events_to": "Lägg till händelser till",
"add_another_calendar": "Lägg till en annan kalender",
"other": "Annat",
"email_sign_in_subject": "Din inloggningslänk för {{appName}}",
@ -422,6 +425,7 @@
"booking_created": "Bokning skapad",
"booking_rejected": "Bokning avvisad",
"booking_requested": "Bokning begärd",
"booking_payment_initiated": "Bokningsbetalning initierad",
"meeting_ended": "Mötet avslutat",
"form_submitted": "Formulär skickat",
"booking_paid": "Bokning betald",
@ -456,6 +460,7 @@
"no_event_types_have_been_setup": "Den här användaren har inte skapat några händelsetyper ännu.",
"edit_logo": "Ändra logotyp",
"upload_a_logo": "Ladda upp en logotyp",
"upload_logo": "Ladda upp logotyp",
"remove_logo": "Ta bort logotyp",
"enable": "Aktivera",
"code": "Kod",
@ -568,6 +573,7 @@
"your_team_name": "Ditt team-namn",
"team_updated_successfully": "Teamet har uppdaterats",
"your_team_updated_successfully": "Ditt team har uppdaterats.",
"your_org_updated_successfully": "Din organisation har uppdaterats.",
"about": "Om",
"team_description": "Några meningar om ditt team. Detta visas på ditt teams URL-sida.",
"org_description": "Några meningar om din organisation. Detta kommer att visas på din organisations webbsida.",
@ -599,6 +605,7 @@
"hide_book_a_team_member": "Dölj knappen Boka en teammedlem",
"hide_book_a_team_member_description": "Dölj knappen Boka en teammedlem från dina offentliga sidor.",
"danger_zone": "Farozon",
"account_deletion_cannot_be_undone": "Var försiktig. Borttagning av konto kan inte ångras.",
"back": "Tillbaka",
"cancel": "Avbryt",
"cancel_all_remaining": "Avbryt alla återstående",
@ -688,6 +695,7 @@
"people": "Personer",
"your_email": "Din e-postadress",
"change_avatar": "Ändra avatar",
"upload_avatar": "Ladda upp avatar",
"language": "Språk",
"timezone": "Tidszon",
"first_day_of_week": "Första dagen i veckan",
@ -778,6 +786,7 @@
"disable_guests": "Inaktivera gäster",
"disable_guests_description": "Inaktivera möjligheten att lägga till ytterligare gäster vid bokning.",
"private_link": "Generera privat länk",
"enable_private_url": "Aktivera privat URL",
"private_link_label": "Privat länk",
"private_link_hint": "Din privata länk kommer att regenerera efter varje användning",
"copy_private_link": "Kopiera privat länk",
@ -1213,6 +1222,7 @@
"organizer_name_variable": "Arrangörens namn",
"app_upgrade_description": "För att kunna använda den här funktionen måste du uppgradera till ett Pro-konto.",
"invalid_number": "Ogiltigt telefonnummer",
"invalid_url_error_message": "Ogiltig URL för {{label}}. Exempel-URL: {{sampleUrl}}",
"navigate": "Navigera",
"open": "Öppna",
"close": "Stäng",
@ -1276,6 +1286,7 @@
"personal_cal_url": "Min personliga {{appName}}-URL",
"bio_hint": "Några meningar om dig själv. Detta kommer att visas på din personliga webbsida.",
"user_has_no_bio": "Den här användaren har inte lagt till en biografi ännu.",
"bio": "Bio",
"delete_account_modal_title": "Radera konto",
"confirm_delete_account_modal": "Är du säker på att du vill radera ditt {{appName}}-konto?",
"delete_my_account": "Radera mitt konto",
@ -1286,6 +1297,7 @@
"select_calendars": "Välj vilka kalendrar du vill kontrollera för konflikter för att förhindra dubbelbokningar.",
"check_for_conflicts": "Kontrollera om konflikter",
"view_recordings": "Visa inspelningar",
"check_for_recordings": "Sök efter inspelningar",
"adding_events_to": "Lägger till händelser till",
"follow_system_preferences": "Följ systeminställningar",
"custom_brand_colors": "Anpassade märkesfärger",
@ -1530,6 +1542,7 @@
"problem_registering_domain": "Ett problem inträffade när underdomänen registrerades, försök igen eller kontakta en administratör",
"team_publish": "Publicera team",
"number_text_notifications": "Telefonnummer (SMS-aviseringar)",
"number_sms_notifications": "Telefonnummer (SMS-aviseringar)",
"attendee_email_variable": "Deltagarens e-postadress",
"attendee_email_info": "Personens e-postadress för bokning",
"kbar_search_placeholder": "Ange ett kommando eller sök ...",
@ -1594,6 +1607,7 @@
"options": "Alternativ",
"enter_option": "Ange alternativ {{index}}",
"add_an_option": "Lägg till ett alternativ",
"location_already_exists": "Platsen finns redan. Välj en ny plats",
"radio": "Menyknapp",
"google_meet_warning": "För att använda Google Meet måste du ställa in din målkalender till en Google Kalender",
"individual": "Individ",
@ -1613,6 +1627,7 @@
"date_overrides_mark_all_day_unavailable_other": "Markera som otillgänglig på valda datum",
"date_overrides_add_btn": "Lägg till åsidosättning",
"date_overrides_update_btn": "Uppdatera åsidosättning",
"date_successfully_added": "Åsidosättande av datum har lagts till",
"event_type_duplicate_copy_text": "{{slug}}-kopia",
"set_as_default": "Ange som standard",
"hide_eventtype_details": "Dölj information om händelse",
@ -1639,6 +1654,7 @@
"minimum_round_robin_hosts_count": "Antal värdar som krävs för att delta",
"hosts": "Värdar",
"upgrade_to_enable_feature": "Du måste skapa ett team för att aktivera den här funktionen. Klicka för att skapa ett team.",
"orgs_upgrade_to_enable_feature": "Du behöver uppgradera till vår företagsplan för att aktivera den här funktionen.",
"new_attendee": "Ny deltagare",
"awaiting_approval": "Väntar på godkännande",
"requires_google_calendar": "Den här appen kräver en Google Kalender-anslutning",
@ -1743,6 +1759,7 @@
"show_on_booking_page": "Visa på bokningssidan",
"get_started_zapier_templates": "Kom igång med Zapier-mallar",
"team_is_unpublished": "{{team}} har avpublicerats",
"org_is_unpublished_description": "Den här organisationslänken är för närvarande inte tillgänglig. Kontakta organisationens ägare eller be denne att publicera den.",
"team_is_unpublished_description": "Den här {{entity}}-länken är för närvarande inte tillgänglig. Kontakta ägaren till {{entity}} eller be vederbörande att publicera den.",
"team_member": "Teammedlem",
"a_routing_form": "Ett omdirigeringsformulär",
@ -1877,6 +1894,7 @@
"edit_invite_link": "Redigera länkinställningar",
"invite_link_copied": "Inbjudningslänk kopierad",
"invite_link_deleted": "Inbjudningslänk borttagen",
"api_key_deleted": "API nyckel borttagen",
"invite_link_updated": "Inställningar för inbjudningslänk har sparats",
"link_expires_after": "Länkarna upphör att gälla efter ...",
"one_day": "1 dag",
@ -2009,7 +2027,13 @@
"attendee_last_name_variable": "Deltagarens efternamn",
"attendee_first_name_info": "Förnamnet på personen som bokat",
"attendee_last_name_info": "Efternamnet på personen som bokat",
"your_monthly_digest": "Din månatliga sammanfattning",
"member_name": "Medlemsnamn",
"most_popular_events": "Mest populära händelser",
"summary_of_events_for_your_team_for_the_last_30_days": "Här är din sammanfattning av populära händelser för ditt team {{teamName}} de senaste 30 dagarna",
"me": "Jag",
"monthly_digest_email": "E-post med månadssammandrag",
"monthly_digest_email_for_teams": "E-post med månadssammandrag för teams",
"verify_team_tooltip": "Verifiera ditt team för att aktivera att skicka meddelanden till deltagare",
"member_removed": "Medlem borttagen",
"my_availability": "Min tillgänglighet",
@ -2039,12 +2063,40 @@
"team_no_event_types": "Detta team har inga händelsetyper",
"seat_options_doesnt_multiple_durations": "Platsalternativet stöder inte flera varaktigheter",
"include_calendar_event": "Inkludera kalenderhändelse",
"oAuth": "OAuth",
"recently_added": "Nyligen tillagda",
"no_members_found": "Inga medlemmar hittades",
"event_setup_length_error": "Konfigurering av evenemang: Längden måste vara minst 1 minut.",
"availability_schedules": "Scheman för tillgänglighet",
"unauthorized": "Obehörig",
"access_cal_account": "{{clientName}} vill ha tillgång till ditt {{appName}}-konto",
"select_account_team": "Välj konto eller team",
"allow_client_to": "Detta tillåter {{clientName}} att",
"associate_with_cal_account": "Koppla dig till dina personuppgifter från {{clientName}}",
"see_personal_info": "Se dina personuppgifter, inklusive personuppgifter som du har gjort tillgängliga för allmänheten",
"see_primary_email_address": "Se din primära e-postadress",
"connect_installed_apps": "Ansluta till dina installerade appar",
"access_event_type": "Läsa, redigera, ta bort dina händelsetyper",
"access_availability": "Läsa, redigera, ta bort din tillgänglighet",
"access_bookings": "Läsa, redigera, ta bort dina bokningar",
"allow_client_to_do": "Tillåt {{clientName}} att göra detta?",
"oauth_access_information": "Genom att klicka på tillåt tillåter du denna app att använda dina uppgifter i enlighet med deras användarvillkor och integritetspolicy. Du kan ta bort åtkomst i {{appName}} App Store.",
"allow": "Tillåt",
"view_only_edit_availability_not_onboarded": "Den här användaren har inte slutfört introduktionen. Du kommer inte att kunna ange deras tillgänglighet förrän de har slutfört introduktionen.",
"view_only_edit_availability": "Du tittar på användarens tillgänglighet. Du kan bara redigera din egen tillgänglighet.",
"you_can_override_calendar_in_advanced_tab": "Du kan åsidosätta det här för varje enskild händelse i Avancerade inställningar för varje händelsetyp.",
"edit_users_availability": "Redigera användarens tillgänglighet: {{username}}",
"resend_invitation": "Skicka inbjudan igen",
"invitation_resent": "Inbjudan skickades på nytt.",
"add_client": "Lägg till kund",
"copy_client_secret_info": "När du har kopierat hemligheten kommer du inte att kunna se den längre",
"add_new_client": "Lägg till ny kund",
"this_app_is_not_setup_already": "Den här appen har inte installerats än",
"as_csv": "som CSV",
"overlay_my_calendar": "Lägg över min kalender",
"overlay_my_calendar_toc": "Genom att ansluta till din kalender godkänner du vår sekretesspolicy och våra användarvillkor. Du kan när som helst återkalla åtkomsten.",
"view_overlay_calendar_events": "Se dina kalenderhändelser för att förhindra krockade bokningar.",
"lock_timezone_toggle_on_booking_page": "Lås tidszon på bokningssidan",
"description_lock_timezone_toggle_on_booking_page": "För att låsa tidszonen på bokningssidan, användbart för personliga händelser.",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -2032,6 +2032,8 @@
"most_popular_events": "Найпопулярніші заходи",
"summary_of_events_for_your_team_for_the_last_30_days": "Ось зведена інформація про популярні заходи для вашої команди «{{teamName}}» за останні 30 днів",
"me": "Я",
"monthly_digest_email": "Ел. лист із місячним дайджестом",
"monthly_digest_email_for_teams": "Ел. лист із місячним дайджестом для команд",
"verify_team_tooltip": "Верифікуйте свою команду, щоб увімкнути надсилання повідомлень відвідувачам",
"member_removed": "Учасника вилучено",
"my_availability": "Моя доступність",
@ -2061,12 +2063,40 @@
"team_no_event_types": "У цієї команди немає типів заходів",
"seat_options_doesnt_multiple_durations": "Параметр «Місця» не підтримує декілька варіантів тривалості",
"include_calendar_event": "Включити календарний захід",
"oAuth": "OAuth",
"recently_added": "Нещодавно додані",
"no_members_found": "Учасників не знайдено",
"event_setup_length_error": "Налаштування заходу: мінімальна тривалість — 1 хвилина.",
"availability_schedules": "Розклад доступності",
"unauthorized": "Неавторизовано",
"access_cal_account": "{{clientName}} хоче отримати доступ до вашого облікового запису {{appName}}",
"select_account_team": "Виберіть обліковий запис або команду",
"allow_client_to": "Це дозволить клієнту {{clientName}} робити таке:",
"associate_with_cal_account": "Пов’язувати вас із персональною інформацією, отриманою від {{clientName}}.",
"see_personal_info": "Переглядати особисту інформацію, включно з інформацією, яку ви зробили загальнодоступною.",
"see_primary_email_address": "Встановити основну електронну адресу.",
"connect_installed_apps": "Під’єднатися до встановлених додатків.",
"access_event_type": "Читати, змінювати, видаляти типи заходів.",
"access_availability": "Читати, змінювати, видаляти інформацію про доступність.",
"access_bookings": "Читати, змінювати, видаляти ваші бронювання.",
"allow_client_to_do": "Дозволити {{clientName}} це робити?",
"oauth_access_information": "Натискаючи кнопку «Дозволити», ви дозволяєте цьому застосунку використовувати вашу інформацію відповідно до його умов використання і політики конфіденційності. Ви можете видалити доступ в магазині застосунків {{appName}}.",
"allow": "Дозволити",
"view_only_edit_availability_not_onboarded": "Цей користувач не завершив ознайомлення. Доки він не зробить цього, ви не зможете налаштувати доступність для нього.",
"view_only_edit_availability": "Ви переглядаєте доступність цього користувача. Ви можете редагувати лише свою доступність.",
"you_can_override_calendar_in_advanced_tab": "Ви можете перевизначити це для кожного заходу в додаткових параметрах кожного типу заходу.",
"edit_users_availability": "Редагувати доступність користувача: {{username}}",
"resend_invitation": "Повторно надіслати запрошення",
"invitation_resent": "Запрошення надіслано повторно.",
"add_client": "Додати клієнта",
"copy_client_secret_info": "Скопіювавши секрет, ви більше не зможете його переглянути",
"add_new_client": "Додати нового клієнта",
"this_app_is_not_setup_already": "Цей застосунок ще не налаштовано",
"as_csv": "як CSV",
"overlay_my_calendar": "Накласти мій календар",
"overlay_my_calendar_toc": "Під’єднуючи свій календар, ви приймаєте нашу політику конфіденційності й правила використання. Ви можете відкликати доступ будь-коли.",
"view_overlay_calendar_events": "Переглядайте заходи у своєму календарі, щоб уникнути накладання бронювань.",
"lock_timezone_toggle_on_booking_page": "Заблокуйте часовий пояс на сторінці бронювання",
"description_lock_timezone_toggle_on_booking_page": "Для блокування часового поясу на сторінці бронювання (корисне для окремих заходів)",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}

View File

@ -4,6 +4,7 @@ import dayjs from "@calcom/dayjs";
import { Calendar } from "@calcom/features/calendars/weeklyview";
import type { CalendarEvent } from "@calcom/features/calendars/weeklyview/types/events";
import type { CalendarAvailableTimeslots } from "@calcom/features/calendars/weeklyview/types/state";
import { localStorage } from "@calcom/lib/webstorage";
import { useBookerStore } from "../store";
import { useEvent, useScheduleForEvent } from "../utils/event";

View File

@ -8,6 +8,7 @@ import { useIsEmbed } from "@calcom/embed-core/embed-iframe";
import { useTimePreferences } from "@calcom/features/bookings/lib";
import { classNames } from "@calcom/lib";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { localStorage } from "@calcom/lib/webstorage";
import { trpc } from "@calcom/trpc/react";
import { Button, Switch } from "@calcom/ui";
import { Settings } from "@calcom/ui/components/icon";

View File

@ -1,5 +1,7 @@
import { useEffect, useState } from "react";
import { localStorage } from "@calcom/lib/webstorage";
export interface HasExternalId {
externalId: string;
}

View File

@ -8,6 +8,7 @@ import dayjs from "@calcom/dayjs";
import type { Slots } from "@calcom/features/schedules";
import { classNames } from "@calcom/lib";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { localStorage } from "@calcom/lib/webstorage";
import { Button, SkeletonText } from "@calcom/ui";
import { useBookerStore } from "../Booker/store";

View File

@ -273,7 +273,7 @@ export const KBarTrigger = () => {
<button
color="minimal"
onClick={query.toggle}
className="text-default hover:bg-subtle lg:hover:bg-emphasis lg:hover:text-emphasis group flex rounded-md px-3 py-2 text-sm font-medium lg:px-2">
className="text-default hover:bg-subtle lg:hover:bg-emphasis lg:hover:text-emphasis group flex rounded-md px-3 py-2 text-sm font-medium transition lg:px-2">
<Search className="h-4 w-4 flex-shrink-0 text-inherit" />
</button>
</Tooltip>

View File

@ -41,7 +41,7 @@ export function ScheduleListItem({
return (
<li key={schedule.id}>
<div className="hover:bg-muted flex items-center justify-between py-5 ltr:pl-4 rtl:pr-4 sm:ltr:pl-0 sm:rtl:pr-0">
<div className="hover:bg-muted flex items-center justify-between py-5 transition ltr:pl-4 rtl:pr-4 sm:ltr:pl-0 sm:rtl:pr-0">
<div className="group flex w-full items-center justify-between sm:px-6">
<Link
href={`/availability/${schedule.id}`}

View File

@ -362,7 +362,7 @@ function UserDropdown({ small }: UserDropdownProps) {
<DropdownMenuTrigger asChild onClick={() => setMenuOpen((menuOpen) => !menuOpen)}>
<button
className={classNames(
"hover:bg-emphasis group mx-0 flex cursor-pointer appearance-none items-center rounded-full text-left outline-none focus:outline-none focus:ring-0 md:rounded-none lg:rounded",
"hover:bg-emphasis group mx-0 flex cursor-pointer appearance-none items-center rounded-full text-left outline-none transition focus:outline-none focus:ring-0 md:rounded-none lg:rounded",
small ? "p-2" : "px-2 py-1.5"
)}>
<span
@ -658,7 +658,7 @@ const NavigationItem: React.FC<{
href={item.href}
aria-label={t(item.name)}
className={classNames(
"text-default group flex items-center rounded-md px-2 py-1.5 text-sm font-medium",
"text-default group flex items-center rounded-md px-2 py-1.5 text-sm font-medium transition",
item.child ? `[&[aria-current='page']]:bg-transparent` : `[&[aria-current='page']]:bg-emphasis`,
isChild
? `[&[aria-current='page']]:text-emphasis [&[aria-current='page']]:bg-emphasis hidden h-8 pl-16 lg:flex lg:pl-11 ${
@ -761,7 +761,7 @@ const MobileNavigationMoreItem: React.FC<{
return (
<li className="border-subtle border-b last:border-b-0" key={item.name}>
<Link href={item.href} className="hover:bg-subtle flex items-center justify-between p-5">
<Link href={item.href} className="hover:bg-subtle flex items-center justify-between p-5 transition">
<span className="text-default flex items-center font-semibold ">
{item.icon && <item.icon className="h-5 w-5 flex-shrink-0 ltr:mr-3 rtl:ml-3" aria-hidden="true" />}
{isLocaleReady ? t(item.name) : <SkeletonText />}
@ -897,7 +897,7 @@ function SideBar({ bannersHeight, user }: SideBarProps) {
target={item.target}
className={classNames(
"text-left",
"[&[aria-current='page']]:bg-emphasis text-default justify-right group flex items-center rounded-md px-2 py-1.5 text-sm font-medium",
"[&[aria-current='page']]:bg-emphasis text-default justify-right group flex items-center rounded-md px-2 py-1.5 text-sm font-medium transition",
"[&[aria-current='page']]:text-emphasis mt-0.5 w-full text-sm",
isLocaleReady ? "hover:bg-emphasis hover:text-emphasis" : "",
index === 0 && "mt-3"

View File

@ -1,5 +1,5 @@
/**
* Provides a wrapper around localStorage to avoid errors in case of restricted storage access.
* Provides a wrapper around localStorage(and sessionStorage(TODO when needed)) to avoid errors in case of restricted storage access.
*
* TODO: In case of an embed if localStorage is not available(third party), use localStorage of parent(first party) that contains the iframe.
*/
@ -25,4 +25,12 @@ export const localStorage = {
return;
}
},
removeItem: (key: string) => {
try {
// eslint-disable-next-line @calcom/eslint/avoid-web-storage
window.localStorage.removeItem(key);
} catch (e) {
return;
}
},
};

View File

@ -13,7 +13,7 @@ import { SkeletonText } from "../skeleton";
const SliderButton: FC<ComponentProps<"button">> = (props) => {
const { children, ...rest } = props;
return (
<button className="hover:bg-subtle text-default rounded p-2.5" {...rest}>
<button className="hover:bg-subtle text-default rounded p-2.5 transition" {...rest}>
{children}
</button>
);

View File

@ -38,13 +38,13 @@ export type ButtonProps = ButtonBaseProps &
);
export const buttonClasses = cva(
"whitespace-nowrap inline-flex items-center text-sm font-medium relative rounded-md transition-colors disabled:cursor-not-allowed",
"whitespace-nowrap inline-flex items-center text-sm font-medium relative rounded-md transition disabled:cursor-not-allowed",
{
variants: {
variant: {
button: "",
icon: "flex justify-center",
fab: "rounded-full justify-center md:rounded-md radix-state-open:rotate-45 md:radix-state-open:rotate-0 transition-transform radix-state-open:shadown-none radix-state-open:ring-0 !shadow-none",
fab: "rounded-full justify-center md:rounded-md radix-state-open:rotate-45 md:radix-state-open:rotate-0 radix-state-open:shadown-none radix-state-open:ring-0 !shadow-none",
},
color: {
primary:

View File

@ -137,7 +137,7 @@ export const DropdownItem = (props: DropdownItemProps) => {
<ButtonOrLink
{...rest}
className={classNames(
"hover:text-emphasis text-default inline-flex w-full items-center space-x-2 px-3 py-2 disabled:cursor-not-allowed",
"hover:text-emphasis text-default inline-flex w-full items-center space-x-2 px-3 py-2 transition disabled:cursor-not-allowed",
color === "destructive"
? "hover:bg-error hover:text-red-700 dark:hover:text-red-100"
: "hover:bg-subtle",

View File

@ -99,7 +99,7 @@ export const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(function
ref={ref}
{...props}
className={classNames(
"hover:border-emphasis border-default bg-default placeholder:text-muted text-emphasis disabled:hover:border-default disabled:bg-subtle focus:ring-brand-default mb-2 block w-full rounded-md border px-3 py-2 text-sm focus:border-neutral-300 focus:outline-none focus:ring-2 focus:ring-offset-1 disabled:cursor-not-allowed",
"hover:border-emphasis border-default bg-default placeholder:text-muted text-emphasis disabled:hover:border-default disabled:bg-subtle focus:ring-brand-default mb-2 block w-full rounded-md border px-3 py-2 text-sm transition focus:border-neutral-300 focus:outline-none focus:ring-2 focus:ring-offset-1 disabled:cursor-not-allowed",
props.className
)}
/>

View File

@ -18,7 +18,7 @@ export const Input = forwardRef<HTMLInputElement, InputProps>(function Input(
{...props}
ref={ref}
className={classNames(
"hover:border-emphasis dark:focus:border-emphasis border-default bg-default placeholder:text-muted text-emphasis disabled:hover:border-default disabled:bg-subtle focus:ring-brand-default mb-2 block h-9 rounded-md border px-3 py-2 text-sm leading-4 focus:border-neutral-300 focus:outline-none focus:ring-2 disabled:cursor-not-allowed",
"hover:border-emphasis dark:focus:border-emphasis border-default bg-default placeholder:text-muted text-emphasis disabled:hover:border-default disabled:bg-subtle focus:ring-brand-default mb-2 block h-9 rounded-md border px-3 py-2 text-sm leading-4 transition focus:border-neutral-300 focus:outline-none focus:ring-2 disabled:cursor-not-allowed",
isFullWidth && "w-full",
props.className
)}

View File

@ -39,7 +39,7 @@ const HorizontalTabItem = function ({
scroll={linkScroll}
className={classNames(
isCurrent ? "bg-emphasis text-emphasis" : "hover:bg-subtle hover:text-emphasis text-default",
"inline-flex items-center justify-center whitespace-nowrap rounded-[6px] p-2 text-sm font-medium leading-4 md:mb-0",
"inline-flex items-center justify-center whitespace-nowrap rounded-[6px] p-2 text-sm font-medium leading-4 transition md:mb-0",
props.disabled && "pointer-events-none !opacity-30",
props.className
)}

View File

@ -53,7 +53,7 @@ const VerticalTabItem = ({
target={props.isExternalLink ? "_blank" : "_self"}
className={classNames(
props.textClassNames || "text-default text-sm font-medium leading-none",
"min-h-8 hover:bg-subtle [&[aria-current='page']]:bg-emphasis [&[aria-current='page']]:text-emphasis group-hover:text-default group flex w-64 flex-row items-center rounded-md px-3 py-[10px]",
"min-h-8 hover:bg-subtle [&[aria-current='page']]:bg-emphasis [&[aria-current='page']]:text-emphasis group-hover:text-default group flex w-64 flex-row items-center rounded-md px-3 py-[10px] transition",
props.disabled && "pointer-events-none !opacity-30",
(isChild || !props.icon) && "ml-7 w-auto ltr:mr-5 rtl:ml-5",
!info ? "h-6" : "h-14",