fix: remove duplicate value i18n (#8547)

* fix: remove duplicate value i18n

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

* feat: add duplicate check in next config

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

* fix: remove more duplicates

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

* fix: description on two factor page

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

* Update apps/web/next.config.js

* Update apps/web/next.config.js

---------

Signed-off-by: Udit Takkar <udit.07814802719@cse.mait.ac.in>
Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
Co-authored-by: Keith Williams <keithwillcode@gmail.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
This commit is contained in:
Udit Takkar 2023-06-08 19:07:54 +05:30 committed by GitHub
parent 4417097f97
commit 9b28b7f78a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 57 additions and 91 deletions

View File

@ -24,7 +24,7 @@ export function AvailableEventLocations({ locations }: { locations: Props["event
} }
const translateAbleKeys = [ const translateAbleKeys = [
"attendee_in_person", "in_person_attendee_address",
"in_person", "in_person",
"attendee_phone_number", "attendee_phone_number",
"link_meeting", "link_meeting",

View File

@ -55,7 +55,7 @@ export const RescheduleDialog = (props: IRescheduleDialog) => {
</p> </p>
<TextArea <TextArea
data-testid="reschedule_reason" data-testid="reschedule_reason"
name={t("reschedule_reason")} name={t("reason_for_reschedule")}
value={rescheduleReason} value={rescheduleReason}
onChange={(e) => setRescheduleReason(e.target.value)} onChange={(e) => setRescheduleReason(e.target.value)}
className="mb-5 sm:mb-6" className="mb-5 sm:mb-6"

View File

@ -185,7 +185,7 @@ function EventTypeSingleLayout({
info: info:
isManagedEventType || isChildrenManagedEventType isManagedEventType || isChildrenManagedEventType
? eventType.schedule === null ? eventType.schedule === null
? "member_default_schedule" ? "members_default_schedule"
: isChildrenManagedEventType : isChildrenManagedEventType
? `${ ? `${
eventType.scheduleName eventType.scheduleName

View File

@ -2,7 +2,7 @@ require("dotenv").config({ path: "../../.env" });
const CopyWebpackPlugin = require("copy-webpack-plugin"); const CopyWebpackPlugin = require("copy-webpack-plugin");
const os = require("os"); const os = require("os");
const glob = require("glob"); const glob = require("glob");
const englishTranslation = require("./public/static/locales/en/common.json");
const { withAxiom } = require("next-axiom"); const { withAxiom } = require("next-axiom");
const { i18n } = require("./next-i18next.config"); const { i18n } = require("./next-i18next.config");
@ -57,6 +57,20 @@ if (process.env.GOOGLE_API_CREDENTIALS && !validJson(process.env.GOOGLE_API_CRED
); );
} }
const informAboutDuplicateTranslations = () => {
const valueSet = new Set();
for (const key in englishTranslation) {
if (valueSet.has(englishTranslation[key])) {
console.warn("\x1b[33mDuplicate value found in:", "\x1b[0m", key);
} else {
valueSet.add(englishTranslation[key]);
}
}
};
informAboutDuplicateTranslations();
const plugins = []; const plugins = [];
if (process.env.ANALYZE === "true") { if (process.env.ANALYZE === "true") {
// only load dependency if env `ANALYZE` was set // only load dependency if env `ANALYZE` was set

View File

@ -182,7 +182,7 @@ const IntegrationsList = ({ data, handleDisconnect, variant }: IntegrationsListP
setBulkUpdateModal(true); setBulkUpdateModal(true);
} }
}}> }}>
{t("change_default_conferencing_app")} {t("set_as_default")}
</DropdownItem> </DropdownItem>
</DropdownMenuItem> </DropdownMenuItem>
)} )}

View File

@ -363,7 +363,7 @@ export default function Success(props: SuccessProps) {
id="modal-headline"> id="modal-headline">
{needsConfirmation && !isCancelled {needsConfirmation && !isCancelled
? props.recurringBookings ? props.recurringBookings
? t("submitted_recurring") ? t("booking_submitted_recurring")
: t("booking_submitted") : t("booking_submitted")
: isCancelled : isCancelled
? seatReferenceUid ? seatReferenceUid

View File

@ -25,7 +25,7 @@ const Heading = () => {
return ( return (
<div className="min-w-52 hidden md:block"> <div className="min-w-52 hidden md:block">
<h3 className="font-cal max-w-28 sm:max-w-72 md:max-w-80 text-emphasis truncate text-xl font-semibold tracking-wide xl:max-w-full"> <h3 className="font-cal max-w-28 sm:max-w-72 md:max-w-80 text-emphasis truncate text-xl font-semibold tracking-wide xl:max-w-full">
{t("analytics_for_organisation")} {t("insights")}
</h3> </h3>
<p className="text-default hidden text-sm md:block">{t("subtitle_analytics")}</p> <p className="text-default hidden text-sm md:block">{t("subtitle_analytics")}</p>
</div> </div>

View File

@ -47,15 +47,13 @@ const BillingView = () => {
<> <>
<Meta title={t("billing")} description={t("manage_billing_description")} /> <Meta title={t("billing")} description={t("manage_billing_description")} />
<div className="space-y-6 text-sm sm:space-y-8"> <div className="space-y-6 text-sm sm:space-y-8">
<CtaRow <CtaRow title={t("view_and_manage_billing_details")} description={t("view_and_edit_billing_details")}>
title={t("billing_manage_details_title")}
description={t("billing_manage_details_description")}>
<Button color="primary" href={billingHref} target="_blank" EndIcon={ExternalLink}> <Button color="primary" href={billingHref} target="_blank" EndIcon={ExternalLink}>
{t("billing_portal")} {t("billing_portal")}
</Button> </Button>
</CtaRow> </CtaRow>
<CtaRow title={t("billing_help_title")} description={t("billing_help_description")}> <CtaRow title={t("need_anything_else")} description={t("further_billing_help")}>
<Button color="secondary" onClick={onContactSupportClick}> <Button color="secondary" onClick={onContactSupportClick}>
{t("contact_support")} {t("contact_support")}
</Button> </Button>

View File

@ -129,14 +129,14 @@ const AppearanceView = () => {
<ThemeLabel <ThemeLabel
variant="light" variant="light"
value="light" value="light"
label={t("theme_light")} label={t("light")}
defaultChecked={user.theme === "light"} defaultChecked={user.theme === "light"}
register={formMethods.register} register={formMethods.register}
/> />
<ThemeLabel <ThemeLabel
variant="dark" variant="dark"
value="dark" value="dark"
label={t("theme_dark")} label={t("dark")}
defaultChecked={user.theme === "dark"} defaultChecked={user.theme === "dark"}
register={formMethods.register} register={formMethods.register}
/> />

View File

@ -149,7 +149,7 @@ const ConferencingLayout = () => {
}); });
} }
}}> }}>
{t("change_default_conferencing_app")} {t("set_as_default")}
</DropdownItem> </DropdownItem>
</DropdownMenuItem> </DropdownMenuItem>
)} )}

View File

@ -36,7 +36,7 @@ const TwoFactorAuthView = () => {
const isCalProvider = user?.identityProvider === "CAL"; const isCalProvider = user?.identityProvider === "CAL";
return ( return (
<> <>
<Meta title={t("2fa")} description={t("2fa_description")} /> <Meta title={t("2fa")} description={t("set_up_two_factor_authentication")} />
{!isCalProvider && <Alert severity="neutral" message={t("2fa_disabled")} />} {!isCalProvider && <Alert severity="neutral" message={t("2fa_disabled")} />}
<div className="mt-6 flex items-start space-x-4"> <div className="mt-6 flex items-start space-x-4">
<Switch <Switch

View File

@ -15,7 +15,6 @@
"check_your_email": "Check your email", "check_your_email": "Check your email",
"verify_email_page_body": "We've sent an email to {{email}}. It is important to verify your email address to guarantee the best email and calendar deliverability from {{appName}}.", "verify_email_page_body": "We've sent an email to {{email}}. It is important to verify your email address to guarantee the best email and calendar deliverability from {{appName}}.",
"verify_email_banner_body": "Please verify your email adress to guarantee the best email and calendar deliverability from {{appName}}.", "verify_email_banner_body": "Please verify your email adress to guarantee the best email and calendar deliverability from {{appName}}.",
"verify_email_banner_button": "Send email",
"verify_email_email_header": "Verify your email address", "verify_email_email_header": "Verify your email address",
"verify_email_email_button": "Verify email", "verify_email_email_button": "Verify email",
"verify_email_email_body": "Please verify your email address by clicking the button below.", "verify_email_email_body": "Please verify your email address by clicking the button below.",
@ -87,13 +86,11 @@
"your_meeting_has_been_booked": "Your meeting has been booked", "your_meeting_has_been_booked": "Your meeting has been booked",
"event_type_has_been_rescheduled_on_time_date": "Your {{title}} has been rescheduled to {{date}}.", "event_type_has_been_rescheduled_on_time_date": "Your {{title}} has been rescheduled to {{date}}.",
"event_has_been_rescheduled": "Updated - Your event has been rescheduled", "event_has_been_rescheduled": "Updated - Your event has been rescheduled",
"request_reschedule_title_attendee": "Request to reschedule your booking",
"request_reschedule_subtitle": "{{organizer}} has cancelled the booking and requested you to pick another time.", "request_reschedule_subtitle": "{{organizer}} has cancelled the booking and requested you to pick another time.",
"request_reschedule_title_organizer": "You have requested {{attendee}} to reschedule", "request_reschedule_title_organizer": "You have requested {{attendee}} to reschedule",
"request_reschedule_subtitle_organizer": "You have cancelled the booking and {{attendee}} should pick a new booking time with you.", "request_reschedule_subtitle_organizer": "You have cancelled the booking and {{attendee}} should pick a new booking time with you.",
"rescheduled_event_type_subject": "Request for reschedule sent: {{eventType}} with {{name}} at {{date}}", "rescheduled_event_type_subject": "Request for reschedule sent: {{eventType}} with {{name}} at {{date}}",
"requested_to_reschedule_subject_attendee": "Action Required Reschedule: Please book a new time for {{eventType}} with {{name}}", "requested_to_reschedule_subject_attendee": "Action Required Reschedule: Please book a new time for {{eventType}} with {{name}}",
"reschedule_reason": "Reason for reschedule",
"hi_user_name": "Hi {{name}}", "hi_user_name": "Hi {{name}}",
"ics_event_title": "{{eventType}} with {{name}}", "ics_event_title": "{{eventType}} with {{name}}",
"new_event_subject": "New event: {{attendeeName}} - {{date}} - {{eventType}}", "new_event_subject": "New event: {{attendeeName}} - {{date}} - {{eventType}}",
@ -262,7 +259,6 @@
"welcome_to_calcom": "Welcome to {{appName}}", "welcome_to_calcom": "Welcome to {{appName}}",
"welcome_instructions": "Tell us what to call you and let us know what timezone youre in. Youll be able to edit this later.", "welcome_instructions": "Tell us what to call you and let us know what timezone youre in. Youll be able to edit this later.",
"connect_caldav": "Connect to CalDav (Beta)", "connect_caldav": "Connect to CalDav (Beta)",
"credentials_stored_and_encrypted": "Your credentials will be stored and encrypted.",
"connect": "Connect", "connect": "Connect",
"try_for_free": "Try it for free", "try_for_free": "Try it for free",
"create_booking_link_with_calcom": "Create your own booking link with {{appName}}", "create_booking_link_with_calcom": "Create your own booking link with {{appName}}",
@ -283,7 +279,6 @@
"user_needs_to_confirm_or_reject_booking_recurring": "{{user}} still needs to confirm or reject each booking of the recurring meeting.", "user_needs_to_confirm_or_reject_booking_recurring": "{{user}} still needs to confirm or reject each booking of the recurring meeting.",
"meeting_is_scheduled": "This meeting is scheduled", "meeting_is_scheduled": "This meeting is scheduled",
"meeting_is_scheduled_recurring": "The recurring events are scheduled", "meeting_is_scheduled_recurring": "The recurring events are scheduled",
"submitted_recurring": "Your recurring meeting has been submitted",
"booking_submitted": "Your booking has been submitted", "booking_submitted": "Your booking has been submitted",
"booking_submitted_recurring": "Your recurring meeting has been submitted", "booking_submitted_recurring": "Your recurring meeting has been submitted",
"booking_confirmed": "Your booking has been confirmed", "booking_confirmed": "Your booking has been confirmed",
@ -341,7 +336,6 @@
"booking_already_accepted_rejected": "This booking was already accepted or rejected", "booking_already_accepted_rejected": "This booking was already accepted or rejected",
"go_back_home": "Go back home", "go_back_home": "Go back home",
"or_go_back_home": "Or go back home", "or_go_back_home": "Or go back home",
"no_availability": "Unavailable",
"no_meeting_found": "No Meeting Found", "no_meeting_found": "No Meeting Found",
"no_meeting_found_description": "This meeting does not exist. Contact the meeting owner for an updated link.", "no_meeting_found_description": "This meeting does not exist. Contact the meeting owner for an updated link.",
"no_status_bookings_yet": "No {{status}} bookings", "no_status_bookings_yet": "No {{status}} bookings",
@ -473,7 +467,6 @@
"invalid_password_hint": "The password must be a minimum of {{passwordLength}} characters long containing at least one number and have a mixture of uppercase and lowercase letters", "invalid_password_hint": "The password must be a minimum of {{passwordLength}} characters long containing at least one number and have a mixture of uppercase and lowercase letters",
"incorrect_password": "Password is incorrect.", "incorrect_password": "Password is incorrect.",
"incorrect_username_password": "Username or password is incorrect.", "incorrect_username_password": "Username or password is incorrect.",
"24_h": "24h",
"use_setting": "Use setting", "use_setting": "Use setting",
"am_pm": "am/pm", "am_pm": "am/pm",
"time_options": "Time options", "time_options": "Time options",
@ -516,15 +509,11 @@
"booking_confirmation": "Confirm your {{eventTypeTitle}} with {{profileName}}", "booking_confirmation": "Confirm your {{eventTypeTitle}} with {{profileName}}",
"booking_reschedule_confirmation": "Reschedule your {{eventTypeTitle}} with {{profileName}}", "booking_reschedule_confirmation": "Reschedule your {{eventTypeTitle}} with {{profileName}}",
"in_person_meeting": "In-person meeting", "in_person_meeting": "In-person meeting",
"attendee_in_person": "In Person (Attendee Address)",
"in_person": "In Person (Organizer Address)", "in_person": "In Person (Organizer Address)",
"link_meeting": "Link meeting", "link_meeting": "Link meeting",
"phone_call": "Attendee Phone Number",
"your_number": "Your phone number",
"phone_number": "Phone Number", "phone_number": "Phone Number",
"attendee_phone_number": "Attendee Phone Number", "attendee_phone_number": "Attendee Phone Number",
"organizer_phone_number": "Organizer Phone Number", "organizer_phone_number": "Organizer Phone Number",
"host_phone_number": "Your Phone Number",
"enter_phone_number": "Enter phone number", "enter_phone_number": "Enter phone number",
"reschedule": "Reschedule", "reschedule": "Reschedule",
"reschedule_this": "Reschedule instead", "reschedule_this": "Reschedule instead",
@ -650,9 +639,6 @@
"new_event_type_btn": "New event type", "new_event_type_btn": "New event type",
"new_event_type_heading": "Create your first event type", "new_event_type_heading": "Create your first event type",
"new_event_type_description": "Event types enable you to share links that show available times on your calendar and allow people to make bookings with you.", "new_event_type_description": "Event types enable you to share links that show available times on your calendar and allow people to make bookings with you.",
"new_event_title": "Add a new event type",
"new_team_event": "Add a new team event type",
"new_event_description": "Create a new event type for people to book times with.",
"event_type_created_successfully": "{{eventTypeTitle}} event type created successfully", "event_type_created_successfully": "{{eventTypeTitle}} event type created successfully",
"event_type_updated_successfully": "{{eventTypeTitle}} event type updated successfully", "event_type_updated_successfully": "{{eventTypeTitle}} event type updated successfully",
"event_type_deleted_successfully": "Event type deleted successfully", "event_type_deleted_successfully": "Event type deleted successfully",
@ -821,7 +807,6 @@
"automation": "Automation", "automation": "Automation",
"configure_how_your_event_types_interact": "Configure how your event types should interact with your calendars.", "configure_how_your_event_types_interact": "Configure how your event types should interact with your calendars.",
"toggle_calendars_conflict": "Toggle the calendars you want to check for conflicts to prevent double bookings.", "toggle_calendars_conflict": "Toggle the calendars you want to check for conflicts to prevent double bookings.",
"select_destination_calendar": "Create events on",
"connect_additional_calendar": "Connect additional calendar", "connect_additional_calendar": "Connect additional calendar",
"calendar_updated_successfully": "Calendar updated successfully", "calendar_updated_successfully": "Calendar updated successfully",
"conferencing": "Conferencing", "conferencing": "Conferencing",
@ -855,7 +840,6 @@
"number_apps_other": "{{count}} Apps", "number_apps_other": "{{count}} Apps",
"trending_apps": "Trending Apps", "trending_apps": "Trending Apps",
"most_popular": "Most Popular", "most_popular": "Most Popular",
"explore_apps": "{{category}} apps",
"installed_apps": "Installed Apps", "installed_apps": "Installed Apps",
"free_to_use_apps": "Free", "free_to_use_apps": "Free",
"no_category_apps": "No {{category}} apps", "no_category_apps": "No {{category}} apps",
@ -867,7 +851,6 @@
"no_category_apps_description_other": "Add any other type of app to do all sorts of things", "no_category_apps_description_other": "Add any other type of app to do all sorts of things",
"no_category_apps_description_web3": "Add a web3 app for your booking pages", "no_category_apps_description_web3": "Add a web3 app for your booking pages",
"installed_app_calendar_description": "Set the calendars to check for conflicts to prevent double bookings.", "installed_app_calendar_description": "Set the calendars to check for conflicts to prevent double bookings.",
"installed_app_conferencing_description": "Add your favourite video conferencing apps for your meetings",
"installed_app_payment_description": "Configure which payment processing services to use when charging your clients.", "installed_app_payment_description": "Configure which payment processing services to use when charging your clients.",
"installed_app_analytics_description": "Configure which analytics apps to use for your booking pages", "installed_app_analytics_description": "Configure which analytics apps to use for your booking pages",
"installed_app_other_description": "All your installed apps from other categories.", "installed_app_other_description": "All your installed apps from other categories.",
@ -893,7 +876,6 @@
"terms_of_service": "Terms of Service", "terms_of_service": "Terms of Service",
"remove": "Remove", "remove": "Remove",
"add": "Add", "add": "Add",
"installed_one": "Installed",
"installed_other": "{{count}} installed", "installed_other": "{{count}} installed",
"verify_wallet": "Verify Wallet", "verify_wallet": "Verify Wallet",
"create_events_on": "Create events on", "create_events_on": "Create events on",
@ -921,7 +903,6 @@
"availability_updated_successfully": "{{scheduleName}} schedule updated successfully", "availability_updated_successfully": "{{scheduleName}} schedule updated successfully",
"schedule_deleted_successfully": "Schedule deleted successfully", "schedule_deleted_successfully": "Schedule deleted successfully",
"default_schedule_name": "Working Hours", "default_schedule_name": "Working Hours",
"member_default_schedule":"Member's default schedule",
"new_schedule_heading": "Create an availability schedule", "new_schedule_heading": "Create an availability schedule",
"new_schedule_description": "Creating availability schedules allows you to manage availability across event types. They can be applied to one or more event types.", "new_schedule_description": "Creating availability schedules allows you to manage availability across event types. They can be applied to one or more event types.",
"requires_ownership_of_a_token": "Requires ownership of a token belonging to the following address:", "requires_ownership_of_a_token": "Requires ownership of a token belonging to the following address:",
@ -958,8 +939,6 @@
"api_key_no_note": "Nameless API key", "api_key_no_note": "Nameless API key",
"api_key_never_expires": "This API key has no expiration date", "api_key_never_expires": "This API key has no expiration date",
"edit_api_key": "Edit API key", "edit_api_key": "Edit API key",
"never_expire_key": "Never expires",
"delete_api_key": "Revoke API key",
"success_api_key_created": "API key created successfully", "success_api_key_created": "API key created successfully",
"success_api_key_edited": "API key updated successfully", "success_api_key_edited": "API key updated successfully",
"create": "Create", "create": "Create",
@ -1000,7 +979,6 @@
"event_location_changed": "Updated - Your event changed the location", "event_location_changed": "Updated - Your event changed the location",
"location_changed_event_type_subject": "Location Changed: {{eventType}} with {{name}} at {{date}}", "location_changed_event_type_subject": "Location Changed: {{eventType}} with {{name}} at {{date}}",
"current_location": "Current Location", "current_location": "Current Location",
"user_phone": "Your phone number",
"new_location": "New Location", "new_location": "New Location",
"session": "Session", "session": "Session",
"session_description": "Control your account session", "session_description": "Control your account session",
@ -1026,7 +1004,6 @@
"zapier_setup_instructions": "<0>Log into your Zapier account and create a new Zap.</0><1>Select Cal.com as your Trigger app. Also choose a Trigger event.</1><2>Choose your account and then enter your Unique API Key.</2><3>Test your Trigger.</3><4>You're set!</4>", "zapier_setup_instructions": "<0>Log into your Zapier account and create a new Zap.</0><1>Select Cal.com as your Trigger app. Also choose a Trigger event.</1><2>Choose your account and then enter your Unique API Key.</2><3>Test your Trigger.</3><4>You're set!</4>",
"install_zapier_app": "Please first install the Zapier App in the app store.", "install_zapier_app": "Please first install the Zapier App in the app store.",
"connect_apple_server": "Connect to Apple Server", "connect_apple_server": "Connect to Apple Server",
"connect_caldav_server": "Connect to CalDav (Beta)",
"calendar_url": "Calendar URL", "calendar_url": "Calendar URL",
"apple_server_generate_password": "Generate an app specific password to use with {{appName}} at", "apple_server_generate_password": "Generate an app specific password to use with {{appName}} at",
"credentials_stored_encrypted": "Your credentials will be stored and encrypted.", "credentials_stored_encrypted": "Your credentials will be stored and encrypted.",
@ -1058,7 +1035,6 @@
"go_to": "Go to: ", "go_to": "Go to: ",
"zapier_invite_link": "Zapier Invite Link", "zapier_invite_link": "Zapier Invite Link",
"meeting_url_provided_after_confirmed": "A Meeting URL will be created once the event is confirmed.", "meeting_url_provided_after_confirmed": "A Meeting URL will be created once the event is confirmed.",
"attendees_name": "Attendee's name",
"dynamically_display_attendee_or_organizer": "Dynamically display the name of your attendee for you, or your name if it's viewed by your attendee", "dynamically_display_attendee_or_organizer": "Dynamically display the name of your attendee for you, or your name if it's viewed by your attendee",
"event_location": "Event's location", "event_location": "Event's location",
"reschedule_optional": "Reason for rescheduling (optional)", "reschedule_optional": "Reason for rescheduling (optional)",
@ -1133,7 +1109,6 @@
"add_exchange2016": "Connect Exchange 2016 Server", "add_exchange2016": "Connect Exchange 2016 Server",
"custom_template": "Custom template", "custom_template": "Custom template",
"email_body": "Email body", "email_body": "Email body",
"subject": "Email subject",
"text_message": "Text message", "text_message": "Text message",
"specific_issue": "Have a specific issue?", "specific_issue": "Have a specific issue?",
"browse_our_docs": "browse our docs", "browse_our_docs": "browse our docs",
@ -1161,12 +1136,9 @@
"new_seat_title": "Someone has added themselves to an event", "new_seat_title": "Someone has added themselves to an event",
"variable": "Variable", "variable": "Variable",
"event_name_variable": "Event name", "event_name_variable": "Event name",
"organizer_name_variable": "Organizer",
"attendee_name_variable": "Attendee", "attendee_name_variable": "Attendee",
"event_date_variable": "Event date", "event_date_variable": "Event date",
"event_time_variable": "Event time", "event_time_variable": "Event time",
"location_variable": "Location",
"additional_notes_variable": "Additional notes",
"app_upgrade_description": "In order to use this feature, you need to upgrade to a Pro account.", "app_upgrade_description": "In order to use this feature, you need to upgrade to a Pro account.",
"invalid_number": "Invalid phone number", "invalid_number": "Invalid phone number",
"navigate": "Navigate", "navigate": "Navigate",
@ -1260,7 +1232,6 @@
"recurring_event_tab_description": "Set up a repeating schedule", "recurring_event_tab_description": "Set up a repeating schedule",
"today": "today", "today": "today",
"appearance": "Appearance", "appearance": "Appearance",
"appearance_subtitle": "Manage settings for your booking appearance",
"my_account": "My account", "my_account": "My account",
"general": "General", "general": "General",
"calendars": "Calendars", "calendars": "Calendars",
@ -1280,7 +1251,7 @@
"conferencing_description": "Add your favourite video conferencing apps for your meetings", "conferencing_description": "Add your favourite video conferencing apps for your meetings",
"add_conferencing_app": "Add Conferencing App", "add_conferencing_app": "Add Conferencing App",
"password_description": "Manage settings for your account passwords", "password_description": "Manage settings for your account passwords",
"2fa_description": "Manage settings for your account passwords", "set_up_two_factor_authentication": "Set up your Two-factor authentication",
"we_just_need_basic_info": "We just need some basic info to get your profile setup.", "we_just_need_basic_info": "We just need some basic info to get your profile setup.",
"skip": "Skip", "skip": "Skip",
"do_this_later": "Do this later", "do_this_later": "Do this later",
@ -1304,7 +1275,6 @@
"event_date_info": "The event date", "event_date_info": "The event date",
"event_time_info": "The event start time", "event_time_info": "The event start time",
"location_info": "The location of the event", "location_info": "The location of the event",
"organizer_name_info": "Your name",
"additional_notes_info": "The additional notes of booking", "additional_notes_info": "The additional notes of booking",
"attendee_name_info": "The person booking's name", "attendee_name_info": "The person booking's name",
"to": "To", "to": "To",
@ -1369,8 +1339,6 @@
"copy_link_to_form": "Copy link to form", "copy_link_to_form": "Copy link to form",
"theme": "Theme", "theme": "Theme",
"theme_applies_note": "This only applies to your public booking pages", "theme_applies_note": "This only applies to your public booking pages",
"theme_light": "Light",
"theme_dark": "Dark",
"theme_system": "System default", "theme_system": "System default",
"add_a_team": "Add a team", "add_a_team": "Add a team",
"add_webhook_description": "Receive meeting data in real-time when something happens in {{appName}}", "add_webhook_description": "Receive meeting data in real-time when something happens in {{appName}}",
@ -1379,7 +1347,6 @@
"enable_webhook": "Enable Webhook", "enable_webhook": "Enable Webhook",
"add_webhook": "Add Webhook", "add_webhook": "Add Webhook",
"webhook_edited_successfully": "Webhook saved", "webhook_edited_successfully": "Webhook saved",
"webhooks_description": "Receive meeting data in real-time when something happens in {{appName}}",
"api_keys_description": "Generate API keys for accessing your own account", "api_keys_description": "Generate API keys for accessing your own account",
"new_api_key": "New API key", "new_api_key": "New API key",
"active": "active", "active": "active",
@ -1421,11 +1388,7 @@
"billing_freeplan_title": "You're currently on the FREE plan", "billing_freeplan_title": "You're currently on the FREE plan",
"billing_freeplan_description": "We work better in teams. Extend your workflows with round-robin and collective events and make advanced routing forms", "billing_freeplan_description": "We work better in teams. Extend your workflows with round-robin and collective events and make advanced routing forms",
"billing_freeplan_cta": "Try now", "billing_freeplan_cta": "Try now",
"billing_manage_details_title": "View and manage your billing details",
"billing_manage_details_description": "View and edit your billing details, as well as cancel your subscription.",
"billing_portal": "Billing portal", "billing_portal": "Billing portal",
"billing_help_title": "Need anything else?",
"billing_help_description": "If you need any further help with billing, our support team are here to help.",
"billing_help_cta": "Contact support", "billing_help_cta": "Contact support",
"ignore_special_characters_booking_questions": "Ignore special characters in your booking question identifier. Use only letters and numbers", "ignore_special_characters_booking_questions": "Ignore special characters in your booking question identifier. Use only letters and numbers",
"retry": "Retry", "retry": "Retry",
@ -1433,7 +1396,6 @@
"calendar_connection_fail": "Calendar connection failed", "calendar_connection_fail": "Calendar connection failed",
"booking_confirmation_success": "Booking confirmation succeeded", "booking_confirmation_success": "Booking confirmation succeeded",
"booking_rejection_success": "Booking rejection succeeded", "booking_rejection_success": "Booking rejection succeeded",
"booking_confirmation_fail": "Booking confirmation failed",
"booking_tentative": "This booking is tentative", "booking_tentative": "This booking is tentative",
"booking_accept_intent": "Oops, I want to accept", "booking_accept_intent": "Oops, I want to accept",
"we_wont_show_again": "We won't show this again", "we_wont_show_again": "We won't show this again",
@ -1456,7 +1418,6 @@
"new_event_type_availability": "{{eventTypeTitle}} Availability", "new_event_type_availability": "{{eventTypeTitle}} Availability",
"error_editing_availability": "Error editing availability", "error_editing_availability": "Error editing availability",
"dont_have_permission": "You don't have permission to access this resource.", "dont_have_permission": "You don't have permission to access this resource.",
"saml_config": "Single Sign-On",
"saml_configuration_placeholder": "Please paste the SAML metadata from your Identity Provider here", "saml_configuration_placeholder": "Please paste the SAML metadata from your Identity Provider here",
"saml_email_required": "Please enter an email so we can find your SAML Identity Provider", "saml_email_required": "Please enter an email so we can find your SAML Identity Provider",
"saml_sp_title": "Service Provider Details", "saml_sp_title": "Service Provider Details",
@ -1465,7 +1426,6 @@
"saml_sp_entity_id": "SP Entity ID", "saml_sp_entity_id": "SP Entity ID",
"saml_sp_acs_url_copied": "ACS URL copied!", "saml_sp_acs_url_copied": "ACS URL copied!",
"saml_sp_entity_id_copied": "SP Entity ID copied!", "saml_sp_entity_id_copied": "SP Entity ID copied!",
"saml_btn_configure": "Configure",
"add_calendar": "Add Calendar", "add_calendar": "Add Calendar",
"limit_future_bookings": "Limit future bookings", "limit_future_bookings": "Limit future bookings",
"limit_future_bookings_description": "Limit how far in the future this event can be booked", "limit_future_bookings_description": "Limit how far in the future this event can be booked",
@ -1648,7 +1608,6 @@
"delete_sso_configuration_confirmation": "Yes, delete {{connectionType}} configuration", "delete_sso_configuration_confirmation": "Yes, delete {{connectionType}} configuration",
"delete_sso_configuration_confirmation_description": "Are you sure you want to delete the {{connectionType}} configuration? Your team members who use {{connectionType}} login will no longer be able to access Cal.com.", "delete_sso_configuration_confirmation_description": "Are you sure you want to delete the {{connectionType}} configuration? Your team members who use {{connectionType}} login will no longer be able to access Cal.com.",
"organizer_timezone": "Organizer timezone", "organizer_timezone": "Organizer timezone",
"email_no_user_cta": "Create your account",
"email_user_cta": "View Invitation", "email_user_cta": "View Invitation",
"email_no_user_invite_heading": "Youve been invited to join a team on {{appName}}", "email_no_user_invite_heading": "Youve been invited to join a team on {{appName}}",
"email_no_user_invite_subheading": "{{invitedBy}} has invited you to join their team on {{appName}}. {{appName}} is the event-juggling scheduler that enables you and your team to schedule meetings without the email tennis.", "email_no_user_invite_subheading": "{{invitedBy}} has invited you to join their team on {{appName}}. {{appName}} is the event-juggling scheduler that enables you and your team to schedule meetings without the email tennis.",
@ -1678,7 +1637,6 @@
"create_event_on": "Create event on", "create_event_on": "Create event on",
"default_app_link_title": "Set a default app link", "default_app_link_title": "Set a default app link",
"default_app_link_description": "Setting a default app link allows all newly created event types to use the app link you set.", "default_app_link_description": "Setting a default app link allows all newly created event types to use the app link you set.",
"change_default_conferencing_app": "Set as default",
"organizer_default_conferencing_app": "Organizer's default app", "organizer_default_conferencing_app": "Organizer's default app",
"under_maintenance": "Down for maintenance", "under_maintenance": "Down for maintenance",
"under_maintenance_description": "The {{appName}} team are performing scheduled maintenance. If you have any questions, please contact support.", "under_maintenance_description": "The {{appName}} team are performing scheduled maintenance. If you have any questions, please contact support.",
@ -1694,8 +1652,7 @@
"booking_confirmation_failed": "Booking confirmation failed", "booking_confirmation_failed": "Booking confirmation failed",
"not_enough_seats": "Not enough seats", "not_enough_seats": "Not enough seats",
"form_builder_field_already_exists": "A field with this name already exists", "form_builder_field_already_exists": "A field with this name already exists",
"form_builder_field_add_subtitle": "Customize the questions asked on the booking page", "show_on_booking_page":"Show on booking page",
"show_on_booking_page": "Show on booking page",
"get_started_zapier_templates": "Get started with Zapier templates", "get_started_zapier_templates": "Get started with Zapier templates",
"team_is_unpublished": "{{team}} is unpublished", "team_is_unpublished": "{{team}} is unpublished",
"team_is_unpublished_description": "This team link is currently not available. Please contact the team owner or ask them publish it.", "team_is_unpublished_description": "This team link is currently not available. Please contact the team owner or ask them publish it.",
@ -1747,7 +1704,6 @@
"verification_code": "Verification code", "verification_code": "Verification code",
"can_you_try_again": "Can you try again with a different time?", "can_you_try_again": "Can you try again with a different time?",
"verify": "Verify", "verify": "Verify",
"timezone_variable": "Timezone",
"timezone_info": "The timezone of the person receiving", "timezone_info": "The timezone of the person receiving",
"event_end_time_variable": "Event end time", "event_end_time_variable": "Event end time",
"event_end_time_info": "The event end time", "event_end_time_info": "The event end time",
@ -1796,7 +1752,6 @@
"events_rescheduled": "Events Rescheduled", "events_rescheduled": "Events Rescheduled",
"from_last_period": "from last period", "from_last_period": "from last period",
"from_to_date_period": "From: {{startDate}} To: {{endDate}}", "from_to_date_period": "From: {{startDate}} To: {{endDate}}",
"analytics_for_organisation": "Insights",
"subtitle_analytics": "Learn more about your team's activity", "subtitle_analytics": "Learn more about your team's activity",
"redirect_url_warning": "Adding a redirect will disable the success page. Make sure to mention \"Booking Confirmed\" on your custom success page.", "redirect_url_warning": "Adding a redirect will disable the success page. Make sure to mention \"Booking Confirmed\" on your custom success page.",
"event_trends": "Event Trends", "event_trends": "Event Trends",
@ -1836,7 +1791,6 @@
"one_day": "1 day", "one_day": "1 day",
"seven_days": "7 days", "seven_days": "7 days",
"thirty_days": "30 days", "thirty_days": "30 days",
"never_expire": "Never expires",
"team_invite_received": "You have been invited to join {{teamName}}", "team_invite_received": "You have been invited to join {{teamName}}",
"currency_string": "{{amount, currency}}", "currency_string": "{{amount, currency}}",
"charge_card_dialog_body": "You are about to charge the attendee {{amount, currency}}. Are you sure you want to continue?", "charge_card_dialog_body": "You are about to charge the attendee {{amount, currency}}. Are you sure you want to continue?",

View File

@ -33,7 +33,7 @@ export default function CalDavCalendarSetup() {
/> />
</div> </div>
<div className="flex w-10/12 flex-col"> <div className="flex w-10/12 flex-col">
<h1 className="text-default">{t("connect_caldav_server")}</h1> <h1 className="text-default">{t("connect_caldav")}</h1>
<div className="mt-1 text-sm">{t("credentials_stored_encrypted")}</div> <div className="mt-1 text-sm">{t("credentials_stored_encrypted")}</div>
<div className="my-2 mt-3"> <div className="my-2 mt-3">
<Form <Form

View File

@ -74,7 +74,7 @@ export const defaultLocations: DefaultEventLocationType[] = [
{ {
default: true, default: true,
type: DefaultEventLocationTypeEnum.AttendeeInPerson, type: DefaultEventLocationTypeEnum.AttendeeInPerson,
label: "attendee_in_person", label: "in_person_attendee_address",
variable: "address", variable: "address",
organizerInputType: null, organizerInputType: null,
messageForOrganizer: "Cal will ask your invitee to enter an address before scheduling.", messageForOrganizer: "Cal will ask your invitee to enter an address before scheduling.",

View File

@ -8,7 +8,7 @@ export const AttendeeWasRequestedToRescheduleEmail = (
return ( return (
<OrganizerScheduledEmail <OrganizerScheduledEmail
t={t} t={t}
title="request_reschedule_title_attendee" title="request_reschedule_booking"
subtitle={ subtitle={
<> <>
{t("request_reschedule_subtitle", { {t("request_reschedule_subtitle", {

View File

@ -67,7 +67,7 @@ export const BaseScheduledEmail = (
<Info <Info
label={t( label={t(
props.calEvent.cancellationReason.startsWith("$RCH$") props.calEvent.cancellationReason.startsWith("$RCH$")
? "reschedule_reason" ? "reason_for_reschedule"
: "cancellation_reason" : "cancellation_reason"
)} )}
description={ description={

View File

@ -59,7 +59,7 @@ export const TeamInviteEmail = (
</p> </p>
<div style={{ display: "flex", justifyContent: "center" }}> <div style={{ display: "flex", justifyContent: "center" }}>
<CallToAction <CallToAction
label={props.language(props.isCalcomMember ? "email_user_cta" : "email_not_cal_member_cta")} label={props.language(props.isCalcomMember ? "email_user_cta" : "create_your_account")}
href={props.joinLink} href={props.joinLink}
endIconName="linkIcon" endIconName="linkIcon"
/> />

View File

@ -86,7 +86,7 @@ export default class AttendeeWasRequestedToRescheduleEmail extends OrganizerSche
protected getTextBody(): string { protected getTextBody(): string {
return ` return `
${this.t("request_reschedule_title_attendee")} ${this.t("request_reschedule_booking")}
${this.t("request_reschedule_subtitle", { ${this.t("request_reschedule_subtitle", {
organizer: this.calEvent.organizer.name, organizer: this.calEvent.organizer.name,
})}, })},

View File

@ -241,7 +241,7 @@ export const ensureBookingInputsHaveSystemFields = ({
], ],
}, },
{ {
defaultLabel: "reschedule_reason", defaultLabel: "reason_for_reschedule",
type: "textarea", type: "textarea",
editable: "system-but-optional", editable: "system-but-optional",
name: "rescheduleReason", name: "rescheduleReason",

View File

@ -66,7 +66,7 @@ const DestinationCalendarSelector = ({
width: "100%", width: "100%",
display: "flex", display: "flex",
":before": { ":before": {
content: `'${t("select_destination_calendar")}:'`, content: `'${t("create_events_on")}:'`,
display: "block", display: "block",
marginRight: 8, marginRight: 8,
}, },
@ -121,12 +121,12 @@ const DestinationCalendarSelector = ({
const queryDestinationCalendar = query.data.destinationCalendar; const queryDestinationCalendar = query.data.destinationCalendar;
return ( return (
<div className="relative" title={`${t("select_destination_calendar")}: ${selectedOption?.label || ""}`}> <div className="relative" title={`${t("create_events_on")}: ${selectedOption?.label || ""}`}>
<Select <Select
name="primarySelectedCalendar" name="primarySelectedCalendar"
placeholder={ placeholder={
!hidePlaceholder ? ( !hidePlaceholder ? (
`${t("select_destination_calendar")}` `${t("create_events_on")}`
) : ( ) : (
<span className="text-default min-w-0 overflow-hidden truncate whitespace-nowrap"> <span className="text-default min-w-0 overflow-hidden truncate whitespace-nowrap">
{t("default_calendar_selected")}{" "} {t("default_calendar_selected")}{" "}

View File

@ -81,7 +81,7 @@ export default function ApiKeyDialogForm({
</div> </div>
<span className="text-muted text-sm"> <span className="text-muted text-sm">
{apiKeyDetails.neverExpires {apiKeyDetails.neverExpires
? t("never_expire_key") ? t("never_expires")
: `${t("expires")} ${apiKeyDetails?.expiresAt?.toLocaleDateString()}`} : `${t("expires")} ${apiKeyDetails?.expiresAt?.toLocaleDateString()}`}
</span> </span>
</div> </div>
@ -140,7 +140,7 @@ export default function ApiKeyDialogForm({
control={form.control} control={form.control}
render={({ field: { onChange, value } }) => ( render={({ field: { onChange, value } }) => (
<Switch <Switch
label={t("never_expire_key")} label={t("never_expires")}
onCheckedChange={onChange} onCheckedChange={onChange}
checked={value} checked={value}
disabled={!!defaultValues} disabled={!!defaultValues}

View File

@ -28,7 +28,7 @@ export default function SSOConfiguration({ teamId }: { teamId: number | null })
if (errorMessage) { if (errorMessage) {
return ( return (
<> <>
<Meta title={t("saml_config")} description={t("saml_description")} /> <Meta title={t("sso_configuration")} description={t("saml_description")} />
<Alert severity="warning" message={t(errorMessage)} className="mb-4 " /> <Alert severity="warning" message={t(errorMessage)} className="mb-4 " />
</> </>
); );

View File

@ -49,7 +49,7 @@ export default function InviteLinkSettingsModal(props: InvitationLinkSettingsMod
{ value: 1, label: t("one_day") }, { value: 1, label: t("one_day") },
{ value: 7, label: t("seven_days") }, { value: 7, label: t("seven_days") },
{ value: 30, label: t("thirty_days") }, { value: 30, label: t("thirty_days") },
{ value: undefined, label: t("never_expire") }, { value: undefined, label: t("never_expires") },
]; ];
}, [t]); }, [t]);

View File

@ -105,7 +105,7 @@ export default function TeamList(props: Props) {
icon={<Edit className="h-5 w-5 text-purple-700" />} icon={<Edit className="h-5 w-5 text-purple-700" />}
variant="basic" variant="basic"
title={t("appearance")} title={t("appearance")}
description={t("appearance_subtitle")} description={t("appearance_description")}
actionButton={{ actionButton={{
href: "/settings/teams/" + team.id + "/appearance", href: "/settings/teams/" + team.id + "/appearance",
child: t("edit"), child: t("edit"),

View File

@ -120,14 +120,14 @@ const ProfileView = () => {
<ThemeLabel <ThemeLabel
variant="light" variant="light"
value="light" value="light"
label={t("theme_light")} label={t("light")}
defaultChecked={team.theme === "light"} defaultChecked={team.theme === "light"}
register={form.register} register={form.register}
/> />
<ThemeLabel <ThemeLabel
variant="dark" variant="dark"
value="dark" value="dark"
label={t("theme_dark")} label={t("dark")}
defaultChecked={team.theme === "dark"} defaultChecked={team.theme === "dark"}
register={form.register} register={form.register}
/> />

View File

@ -17,8 +17,8 @@ const BillingView = () => {
<Meta title={t("team_billing")} description={t("team_billing_description")} /> <Meta title={t("team_billing")} description={t("team_billing_description")} />
<div className="text-default flex flex-col text-sm sm:flex-row"> <div className="text-default flex flex-col text-sm sm:flex-row">
<div> <div>
<h2 className="font-medium">{t("billing_manage_details_title")}</h2> <h2 className="font-medium">{t("view_and_manage_billing_details")}</h2>
<p>{t("billing_manage_details_description")}</p> <p>{t("view_and_edit_billing_details")}</p>
</div> </div>
<div className="flex-shrink-0 pt-3 sm:ml-auto sm:pt-0 sm:pl-3"> <div className="flex-shrink-0 pt-3 sm:ml-auto sm:pt-0 sm:pl-3">
<Button color="primary" href={billingHref} target="_blank" EndIcon={ExternalLink}> <Button color="primary" href={billingHref} target="_blank" EndIcon={ExternalLink}>

View File

@ -86,7 +86,7 @@ const WorkflowListItem = (props: ItemProps) => {
workflow.steps.forEach((step) => { workflow.steps.forEach((step) => {
switch (step.action) { switch (step.action) {
case WorkflowActions.EMAIL_HOST: case WorkflowActions.EMAIL_HOST:
sendTo.add(t("organizer_name_variable")); sendTo.add(t("organizer"));
break; break;
case WorkflowActions.EMAIL_ATTENDEE: case WorkflowActions.EMAIL_ATTENDEE:
sendTo.add(t("attendee_name_variable")); sendTo.add(t("attendee_name_variable"));

View File

@ -674,7 +674,7 @@ export default function WorkflowStepContainer(props: WorkflowStepProps) {
<div className="mb-6"> <div className="mb-6">
<div className="flex items-center"> <div className="flex items-center">
<Label className={classNames("flex-none", props.readOnly ? "mb-2" : "mb-0")}> <Label className={classNames("flex-none", props.readOnly ? "mb-2" : "mb-0")}>
{t("subject")} {t("email_subject")}
</Label> </Label>
{!props.readOnly && ( {!props.readOnly && (
<div className="flex-grow text-right"> <div className="flex-grow text-right">

View File

@ -425,10 +425,10 @@ export const FormBuilder = function FormBuilder({
}) })
}> }>
<DialogContent className="max-h-none p-0" data-testid="edit-field-dialog"> <DialogContent className="max-h-none p-0" data-testid="edit-field-dialog">
<div className="h-auto max-h-[85vh] overflow-auto px-8 pt-8 pb-10"> <div className="h-auto max-h-[85vh] overflow-auto px-8 pt-8 pb-7">
<DialogHeader <DialogHeader
title={t("add_a_booking_question")} title={t("add_a_booking_question")}
subtitle={t("form_builder_field_add_subtitle")} subtitle={t("booking_questions_description")}
/> />
<Form <Form
id="form-builder" id="form-builder"

View File

@ -98,7 +98,7 @@ const tabs: VerticalTabItemProps[] = [
tabs.find((tab) => { tabs.find((tab) => {
// Add "SAML SSO" to the tab // Add "SAML SSO" to the tab
if (tab.name === "security" && !HOSTED_CAL_FEATURES) { if (tab.name === "security" && !HOSTED_CAL_FEATURES) {
tab.children?.push({ name: "saml_config", href: "/settings/security/sso" }); tab.children?.push({ name: "sso_configuration", href: "/settings/security/sso" });
} }
}); });
@ -321,7 +321,7 @@ const SettingsSidebarContainer = ({
/> />
{HOSTED_CAL_FEATURES && ( {HOSTED_CAL_FEATURES && (
<VerticalTabItem <VerticalTabItem
name={t("saml_config")} name={t("sso_configuration")}
href={`/settings/teams/${team.id}/sso`} href={`/settings/teams/${team.id}/sso`}
textClassNames="px-3 text-emphasis font-medium text-sm" textClassNames="px-3 text-emphasis font-medium text-sm"
disableChevron disableChevron

View File

@ -25,7 +25,7 @@ function VerifyEmailBanner() {
mutation.mutate(); mutation.mutate();
showToast(t("email_sent"), "success"); showToast(t("email_sent"), "success");
}}> }}>
{t("verify_email_banner_button")} {t("send_email")}
</Button> </Button>
} }
/> />

View File

@ -39,7 +39,7 @@ const WebhooksView = () => {
<> <>
<Meta <Meta
title="Webhooks" title="Webhooks"
description={t("webhooks_description", { appName: APP_NAME })} description={t("add_webhook_description", { appName: APP_NAME })}
CTA={data && data.webhookGroups.length > 0 ? <NewWebhookButton profiles={profiles} /> : <></>} CTA={data && data.webhookGroups.length > 0 ? <NewWebhookButton profiles={profiles} /> : <></>}
/> />
<div> <div>

View File

@ -70,7 +70,7 @@ function CategoryTab({ selectedCategory, categories, searchText }: CategoryTabPr
<h2 className="text-emphasis hidden text-base font-semibold leading-none sm:block"> <h2 className="text-emphasis hidden text-base font-semibold leading-none sm:block">
{searchText {searchText
? t("search") ? t("search")
: t("explore_apps", { : t("category_apps", {
category: category:
(selectedCategory && selectedCategory[0].toUpperCase() + selectedCategory.slice(1)) || (selectedCategory && selectedCategory[0].toUpperCase() + selectedCategory.slice(1)) ||
t("all_apps"), t("all_apps"),