Merge pull request #32063 from overleaf/oa-group-plans

[web] Rename group plans

GitOrigin-RevId: 8a3097dc1724709b5d7b163e0f9d968c21d63831
This commit is contained in:
Olzhas Askar
2026-04-29 11:02:19 +02:00
committed by Copybot
parent 92bbba5e50
commit 7c0595f9a9
41 changed files with 93 additions and 99 deletions

View File

@@ -16,8 +16,6 @@ const data = fs.readFileSync(
)
const groups = JSON.parse(data.toString())
const capitalize = string => string.charAt(0).toUpperCase() + string.slice(1)
// With group accounts in Recurly, we end up with a lot of plans to manage.
// Rather than hand coding them in the settings file, and then needing to keep
// that data in sync with the data in groups.json, we can auto generate the
@@ -35,17 +33,16 @@ for (const [usage, planData] of Object.entries(groups)) {
}
}
const planName =
planCode === 'collaborator' ? 'Standard' : capitalize(planCode)
const planName = planCode === 'collaborator' ? 'Standard' : 'Pro'
// Generate plans in settings
for (const size of sizes) {
const plan = {
planCode: `group_${planCode}_${size}_${usage}`,
name:
usage === 'enterprise'
? `Group ${planName} Plan (${size} licenses)`
: `Group ${planName} Plan (${size} licenses) - ${capitalize(usage)}`,
usage === 'educational'
? `${planName} group with edu discount (${size} licenses)`
: `${planName} group (${size} licenses)`,
hideFromUsers: true,
price_in_cents: groups[usage][planCode].USD[size].price_in_cents,
annual: true,

View File

@@ -1170,10 +1170,10 @@ function getPlanNameForDisplay(planName, planCode) {
if (!match) return planName
const [, type, category] = match
const prefix = type === 'collaborator' ? 'Standard' : 'Professional'
const suffix = category === 'educational' ? ' Educational' : ''
const prefix = type === 'collaborator' ? 'Standard' : 'Pro'
const suffix = category === 'educational' ? ' with edu discount' : ''
return `Overleaf ${prefix} Group${suffix}`
return `${prefix} group${suffix}`
}
/**

View File

@@ -572,7 +572,7 @@ function buildGroupSubscriptionForView(groupSubscription) {
// most group plans in Recurly should be in form "group_plancode_size_usage"
const planLevelFromGroupPlanCode = groupSubscription.planCode.substr(6, 12)
if (planLevelFromGroupPlanCode === 'professional') {
groupSubscription.planLevelName = 'Professional'
groupSubscription.planLevelName = 'Pro'
} else if (planLevelFromGroupPlanCode === 'collaborator') {
groupSubscription.planLevelName = 'Standard'
}
@@ -580,7 +580,7 @@ function buildGroupSubscriptionForView(groupSubscription) {
// this fallback tries to still show the right thing in these cases:
if (!groupSubscription.planLevelName) {
if (groupSubscription.planCode.startsWith('professional')) {
groupSubscription.planLevelName = 'Professional'
groupSubscription.planLevelName = 'Pro'
} else if (groupSubscription.planCode.startsWith('collaborator')) {
groupSubscription.planLevelName = 'Standard'
} else {

View File

@@ -215,7 +215,7 @@ mixin overleafGroupPlans
.collapse(id='overleafGroupPlansQ1')
.custom-accordion-body
div On any of our group plans, the number of users refers to the number of people you can invite to join your group. All of these people will have access to the plans paid-for features across all their projects, such as real-time track changes and document history.
.mt-2 Collaborators are people that your group users may invite to work with them on their projects. So, for example, if you have the Group Standard plan, the users in your group can invite up to 10 people to work with them on a project. And if you have the Group Professional plan, your users can invite as many people to work with them as they want.
.mt-2 Collaborators are people that your group users may invite to work with them on their projects. So, for example, if you have the Standard group plan, the users in your group can invite up to 10 people to work with them on a project. And if you have the Pro group plan, your users can invite as many people to work with them as they want.
.custom-accordion-item
button.custom-accordion-header.collapsed(
type='button'
@@ -315,12 +315,12 @@ mixin overleafGroupPlans
aria-expanded='false'
aria-controls='overleafGroupPlansQ5'
)
| How do I upgrade my plan from Group Standard to Group Professional?
| How do I upgrade my plan from Standard group to Pro group?
span.custom-accordion-icon
+material-symbol('keyboard_arrow_down')
.collapse(id='overleafGroupPlansQ5')
.custom-accordion-body
span You can upgrade your plan from Group Standard to Group Professional on the
span You can upgrade your plan from Standard group to Pro group on the
|  
a.inline-green-link(
target='_blank'

View File

@@ -101,7 +101,6 @@
"add_unlimited_ai_to_your_overleaf_plan": "",
"add_unlimited_ai_to_your_plan": "",
"add_your_comment_here": "",
"add_your_first_group_member_now": "",
"added_by_on": "",
"adding": "",
"additional_certificate": "",
@@ -188,7 +187,7 @@
"autocomplete_references": "",
"automatically_insert_closing_brackets_and_parentheses": "",
"automatically_recompile_the_project_as_you_edit": "",
"available_with_group_professional": "",
"available_for_pro_groups": "",
"back": "",
"back_to_configuration": "",
"back_to_editing": "",
@@ -961,6 +960,7 @@
"invert_pdf_preview_colors_when_in_dark_mode": "",
"invite": "",
"invite_expired": "",
"invite_group_members": "",
"invite_more_collabs": "",
"invite_more_members": "",
"invite_not_accepted": "",

View File

@@ -9,9 +9,9 @@ type GroupPlanProps = Pick<
>
function getFriendlyPlanName(planName: string): string {
if (planName.toLowerCase().includes('professional')) {
return 'Professional'
} else if (planName.toLowerCase().includes('collaborator')) {
if (planName.toLowerCase().includes('pro group')) {
return 'Pro'
} else if (planName.toLowerCase().includes('standard')) {
return 'Standard'
}
// fallback on plan name

View File

@@ -26,7 +26,7 @@ function AvailableWithGroupProfessionalBadge() {
onClick: handleUpgradeClick,
}}
>
<strong>{t('available_with_group_professional')}</strong>
<strong>{t('available_for_pro_groups')}</strong>
</OLTag>
)
}

View File

@@ -32,7 +32,7 @@ function InstitutionMemberships() {
<Trans
i18nKey="you_are_on_x_plan_as_a_confirmed_member_of_institution_y"
values={{
planName: 'Professional',
planName: 'Pro',
institutionName: institution.name || '',
}}
shouldUnescape

View File

@@ -151,7 +151,7 @@ export default function ManagedGroupSubscriptions() {
{isAdmin && (
<>
{isSharingUpdatesEnabled &&
subscription.planLevelName === 'Professional' && (
subscription.planLevelName === 'Pro' && (
<RowLink
href={`/manage/groups/${subscription._id}/sharing-permissions`}
heading={t('sharing_permissions')}

View File

@@ -56,13 +56,11 @@ export function ActiveSubscription({
if (onStandalonePlan) {
planName = 'Overleaf Free'
if (institutionMemberships && institutionMemberships.length > 0) {
planName = 'Overleaf Professional'
planName = 'Overleaf Pro'
}
if (memberGroupSubscriptions.length > 0) {
if (
memberGroupSubscriptions.some(s => s.planLevelName === 'Professional')
) {
planName = 'Overleaf Professional'
if (memberGroupSubscriptions.some(s => s.planLevelName === 'Pro')) {
planName = 'Overleaf Pro'
} else {
planName = 'Overleaf Standard'
}

View File

@@ -72,7 +72,7 @@ function SuccessfulSubscription() {
href={`/manage/groups/${subscription._id}/members`}
className="btn btn-primary btn-large"
>
{t('add_your_first_group_member_now')}
{t('invite_group_members')}
</a>
</p>
)}

View File

@@ -8,7 +8,6 @@
"account_settings": "Nastavení účtu",
"actions": "Akce",
"add": "Přidat",
"add_your_first_group_member_now": "Přidejte do vaší skupiny prvního člena",
"added": "přidáno",
"admin": "administrátor",
"all_projects": "Všechny projekty",
@@ -124,6 +123,7 @@
"importing_and_merging_changes_in_github": "Importuji a merguji změny v GitHubu",
"info": "Informace",
"institution": "Instituce",
"invite_group_members": "Pozvat členy skupiny",
"it": "Italština",
"join_sl_to_view_project": "Pro zobrazení tohoto projektu se přihlašte do __appName__.",
"keybindings": "Klávesové zkratky",

View File

@@ -76,7 +76,6 @@
"add_to_dictionary": "Tilføj til ordbog",
"add_to_tag": "Tilføj til tag",
"add_your_comment_here": "Tilføj din kommentar her",
"add_your_first_group_member_now": "Tilføj de første medlemmer til din gruppe nu",
"added": "tilføjet",
"added_by_on": "Tilføjet af __name__ d. __date__",
"adding": "Tilføjer",
@@ -712,11 +711,11 @@
"group_plan_admins_can_easily_add_and_remove_users_from_a_group": "Gruppeadministratorer kan nemt tilføje og slette medlemmer fra en gruppe. For organisationsdækkende abonnementer bliver brugere automatisk opgraderet når de registrerer sig eller tilføjer deres e-mailadresse til Overleaf (domænebaseret tilknytning eller SSO).",
"group_plan_tooltip": "Du er på __plan__ abonnementet som medlem af et gruppeabonnement. Klik for at finde ud af hvordan du får det meste ud af dine Overleaf Premium-funktioner.",
"group_plan_with_name_tooltip": "Du er på __plan__ abonnementet som medlem af et gruppeabonnement, __groupName__. Klik for at finde ud af hvordan du får det meste ud af dine Overleaf Premium-funktioner.",
"group_professional": "Gruppe Professionel",
"group_professional": "Pro gruppe",
"group_sso_configuration_idp_metadata": "Informationen du udfylder her kommer fra din Identity Provider (IdP). Det bliver ofte benævnt som <0>SAML metadata</0>. Du kan udfylde det manuelt eller klikke på <1>Importer IdP metadata</1> for at importere en XML fil.",
"group_sso_configure_service_provider_in_idp": "Hos nogle IdPs skal du konfigurere Overleaf som en Service Provider for at tilgå dataen til at udfylde denne forumlar. For at gøre dette, skal du download Overleafs metadata.",
"group_sso_documentation_links": "Se venligst vores <0>dokumentation</0> og <1>fejlsøgningsguide</1> for mere hjælp.",
"group_standard": "Gruppe Standard",
"group_standard": "Standard gruppe",
"group_subscription": "Gruppeabonnement",
"groups": "Grupper",
"have_an_extra_backup": "Hav en ekstra backup",
@@ -858,6 +857,7 @@
"invalid_zip_file": "Ugyldig zip-fil",
"invite": "Inviter",
"invite_expired": "Invitationen kan være udløbet",
"invite_group_members": "Inviter gruppemedlemmer",
"invite_more_collabs": "Inviter flere samarbejdspartnere",
"invite_not_accepted": "Invitationen er endnu ikke accepteret",
"invite_not_valid": "Dette er ikke en gyldig projekt invitation",

View File

@@ -60,7 +60,6 @@
"add_role_and_department": "Rolle und Abteilung hinzufügen",
"add_to_tag": "Zu Stichwort hinzufügen",
"add_your_comment_here": "Füge hier einen Kommentar hinzu",
"add_your_first_group_member_now": "Füge jetzt dein erstes Gruppenmitglied hinzu",
"added": "hinzugefügt",
"added_by_on": "Hinzugefügt von __name__ am __date__",
"adding": "Hinzufügen",
@@ -508,8 +507,8 @@
"group_managed_by_group_administrator": "Die Benutzerkonten in diesem Team werden vom Gruppenadministrator verwaltet.",
"group_plan_tooltip": "Du nutzt ein __plan__-Abonnement als Mitglied eines Gruppen-Abonnements. Klicke hier um herauszufinden, was Dir die Overleaf-Premiumfunktionen ermöglichen.",
"group_plan_with_name_tooltip": "Du nutzt ein __plan__-Abonnement als Mitglied des Gruppen-Abonnements __groupName__. Klicke hier um herauszufinden, was Dir die Overleaf Premiumfunktionen ermöglichen.",
"group_professional": "Gruppe Professionell",
"group_standard": "Gruppe Standard",
"group_professional": "Pro Gruppe",
"group_standard": "Standard Gruppe",
"group_subscription": "Gruppen-Abonnement",
"groups": "Gruppen",
"have_an_extra_backup": "Zusätzliche Sicherung vorhanden",
@@ -621,6 +620,7 @@
"invalid_password_too_similar": "Passwort ist zu ähnlich zu Teilen deiner E-Mail-Adresse.",
"invalid_request": "Ungültige Anfrage. Bitte korrigiere die Daten und versuche es erneut.",
"invalid_zip_file": "Ungültige ZIP-Datei",
"invite_group_members": "Gruppenmitglieder einladen",
"invite_more_collabs": "Lade weitere Mitarbeiter ein",
"invite_not_accepted": "Einladung noch nicht angenommen",
"invite_not_valid": "Dies ist keine gültige Projekteinladung",

View File

@@ -118,7 +118,6 @@
"add_unlimited_ai_to_your_overleaf_plan": "Add unlimited AI* to your Overleaf __planName__ plan",
"add_unlimited_ai_to_your_plan": "Add unlimited AI* to your __planName__ plan",
"add_your_comment_here": "Add your comment here",
"add_your_first_group_member_now": "Add your first group members now",
"added": "added",
"added_by_on": "Added by __name__ on __date__",
"adding": "Adding",
@@ -170,7 +169,7 @@
"all": "All",
"all_borders": "All borders",
"all_events": "All events",
"all_features_in_group_standard_plus": "All features in Group Standard, plus:",
"all_features_in_group_standard_plus": "All features in Standard group, plus:",
"all_logs": "All logs",
"all_premium_features": "All premium features",
"all_premium_features_including": "All premium features, including:",
@@ -249,7 +248,7 @@
"automatic_user_registration_uppercase": "Automatic user registration",
"automatically_insert_closing_brackets_and_parentheses": "Automatically insert closing brackets and parentheses",
"automatically_recompile_the_project_as_you_edit": "Automatically recompile the project as you edit",
"available_with_group_professional": "Available with Group Professional",
"available_for_pro_groups": "Available for Pro groups",
"back": "Back",
"back_to_account_settings": "Back to account settings",
"back_to_all_posts": "Back to all posts",
@@ -608,7 +607,7 @@
"details": "Details",
"details_provided_by_google_explanation": "Your details were provided by your Google account. Please check youre happy with them.",
"dictionary": "Dictionary",
"did_you_know_institution_providing_professional": "Did you know that __institutionName__ is providing <0>free __appName__ Professional features</0> to everyone at __institutionName__?",
"did_you_know_institution_providing_professional": "Did you know that __institutionName__ is providing <0>free __appName__ Pro features</0> to everyone at __institutionName__?",
"disable": "Disable",
"disable_ai_features": "Disable AI features",
"disable_equation_preview": "Disable equation preview",
@@ -808,8 +807,8 @@
"event_type": "Event type",
"every": "per",
"everything_in_free_plus": "Everything in Free, plus…",
"everything_in_group_professional_plus": "Everything in Group Professional, plus…",
"everything_in_group_standard_plus": "Everything in Group Standard, plus…",
"everything_in_group_professional_plus": "Everything in Pro group, plus…",
"everything_in_group_standard_plus": "Everything in Standard group, plus…",
"everything_in_standard_plus": "Everything in Standard, plus…",
"example": "Example",
"example_project": "Example project",
@@ -833,7 +832,7 @@
"export_project_to_github": "Export Project to GitHub",
"failed": "Failed",
"failed_to_consent_to_workbench_terms": "Failed to consent to workbench terms. Please try again later.",
"failed_to_send_group_invite_to_email": "Failed to send Group invite to <0>__email__</0>. Please try again later.",
"failed_to_send_group_invite_to_email": "Failed to send group invite to <0>__email__</0>. Please try again later.",
"failed_to_send_managed_user_invite_to_email": "Failed to send Managed User invite to <0>__email__</0>. Please try again later.",
"failed_to_send_sso_link_invite_to_email": "Failed to send SSO invite reminder to <0>__email__</0>. Please try again later.",
"fair_usage_policy_applies": "Fair usage policy applies.",
@@ -1065,12 +1064,12 @@
"group_plan_tooltip": "You are on the __plan__ plan as a member of a group subscription. Click to find out how to make the most of your Overleaf premium features.",
"group_plan_upgrade_description": "Youre on the <0>__currentPlan__</0> plan and youre upgrading to the <0>__nextPlan__</0> plan. If youre interested in a site-wide Overleaf Commons plan, please <1>get in touch</1>.",
"group_plan_with_name_tooltip": "You are on the __plan__ plan as a member of a group subscription, __groupName__. Click to find out how to make the most of your Overleaf premium features.",
"group_professional": "Group Professional",
"group_professional": "Pro group",
"group_settings": "Group settings",
"group_sso_configuration_idp_metadata": "The information you provide here comes from your Identity Provider (IdP). This is often referred to as its <0>SAML metadata</0>. You can add this manually or click <1>Import IdP metadata</1> to import an XML file.",
"group_sso_configure_service_provider_in_idp": "For some IdPs, you must configure Overleaf as a Service Provider to get the data you need to fill out this form. To do this, you will need to download the Overleaf metadata.",
"group_sso_documentation_links": "Please see our <0>documentation</0> and <1>troubleshooting guide</1> for more help.",
"group_standard": "Group Standard",
"group_standard": "Standard group",
"group_subscription": "Group Subscription",
"groups": "Groups",
"have_an_extra_backup": "Have an extra backup",
@@ -1224,7 +1223,7 @@
"institution_acct_successfully_linked_2": "Your <0>__appName__</0> account was successfully linked to your <0>__institutionName__</0> institutional account.",
"institution_and_role": "Institution and role",
"institution_email_new_to_app": "Your <b>__institutionName__</b> email (<b>__email__</b>) is new to __appName__.",
"institution_has_overleaf_subscription": "<0>__institutionName__</0> has an Overleaf subscription. Click the confirmation link sent to __emailAddress__ to upgrade to <0>Overleaf Professional</0>.",
"institution_has_overleaf_subscription": "<0>__institutionName__</0> has an Overleaf subscription. Click the confirmation link sent to __emailAddress__ to upgrade to <0>Overleaf Pro</0>.",
"institution_templates": "Institution Templates",
"institutional": "Institutional",
"institutional_login_unknown": "Sorry, we dont know which institution issued that email address. You can browse our <a href=\"__link__\">list of institutions</a> to find yours, or you can use one of the other options below.",
@@ -1255,6 +1254,7 @@
"invert_pdf_preview_colors_when_in_dark_mode": "Invert PDF preview colors when in dark mode",
"invite": "Invite",
"invite_expired": "The invite may have expired",
"invite_group_members": "Invite group members",
"invite_more_collabs": "Invite more collaborators",
"invite_more_members": "Invite more members",
"invite_not_accepted": "Invite not yet accepted",
@@ -1659,10 +1659,10 @@
"not_registered": "Not registered",
"note_features_under_development": "<0>Please note</0> that features in this program are still being tested and actively developed. This means that they might <0>change</0>, be <0>removed</0> or <0>become part of a premium plan</0>",
"notification": "Notification",
"notification_features_upgraded_by_affiliation": "Good news! Your affiliated organization __institutionName__ has an Overleaf subscription, and you now have access to all of Overleafs Professional features.",
"notification_features_upgraded_by_affiliation": "Good news! Your affiliated organization __institutionName__ has an Overleaf subscription, and you now have access to all of Overleafs Pro features.",
"notification_old_debug_projects": "You have some old debug projects that you should delete, if you no longer need them.",
"notification_personal_and_group_subscriptions": "Weve spotted that youve got <0>more than one active __appName__ subscription</0>. To avoid paying more than you need to, <1>review your subscriptions</1>.",
"notification_personal_subscription_not_required_due_to_affiliation": " Good news! Your affiliated organization __institutionName__ has an Overleaf subscription, and you now have access to Overleafs Professional features through your affiliation. You can cancel your individual subscription without losing access to any features.",
"notification_personal_subscription_not_required_due_to_affiliation": " Good news! Your affiliated organization __institutionName__ has an Overleaf subscription, and you now have access to Overleafs Pro features through your affiliation. You can cancel your individual subscription without losing access to any features.",
"notification_project_invite_accepted_message": "Youve joined <b>__projectName__</b>",
"notification_project_invite_message": "<b>__userName__</b> would like you to join <b>__projectName__</b>",
"november": "November",
@@ -1686,7 +1686,7 @@
"one_collaborator_per_project": "1 collaborator per project",
"one_free_collab": "One free collaborator",
"one_per_project": "1 per project",
"one_step_away_from_professional_features": "You are one step away from accessing <0>Overleaf Professional features</0>!",
"one_step_away_from_professional_features": "You are one step away from accessing <0>Overleaf Pro features</0>!",
"one_user": "1 user",
"ongoing_experiments": "Ongoing experiments",
"online_latex_editor": "Online LaTeX Editor",
@@ -2848,7 +2848,7 @@
"upload_project": "Upload project",
"upload_zipped_project": "Upload Zipped Project",
"url_to_fetch_the_file_from": "URL to fetch the file from",
"us_gov_banner_fedramp": "<0>Now FedRAMP® authorized for LI-SaaS: </0>Overleafs Group Professional subscription. Need an air-gapped deployment? We offer an on-premises solution too. Talk to our US federal government team.",
"us_gov_banner_fedramp": "<0>Now FedRAMP® authorized for LI-SaaS: </0>Overleafs Pro group subscription. Need an air-gapped deployment? We offer an on-premises solution too. Talk to our US federal government team.",
"us_gov_banner_government_purchasing": "<0>Get __appName__ for US federal government. </0>Move faster through procurement with our tailored purchasing options. Talk to our government team.",
"us_gov_banner_small_business_reseller": "<0>Easy procurement for US federal government. </0>We partner with small business resellers to help you buy Overleaf organizational plans. Talk to our government team.",
"usage_limit_reached": "Usage limit reached",
@@ -3025,7 +3025,7 @@
"you_can_buy_this_plan_but_not_as_a_trial": "You can buy this plan but not as a trial, as youve completed a trial before.",
"you_can_link_x_in_your_account_settings": "You can link __managers__ in your <0>account settings</0>.",
"you_can_now_enable_sso": "You can now enable SSO on your group settings page.",
"you_can_now_log_in_sso": "You can now log in through your institution and if eligible you will receive <0>__appName__ Professional features</0>.",
"you_can_now_log_in_sso": "You can now log in through your institution and if eligible you will receive <0>__appName__ Pro features</0>.",
"you_can_now_search_and_add_references_from_your_rm_library_without_needing_to_import_files": "You can now search and add references from your __referenceManager__ library without needing to import files—just type <code>\\cite{}</code> in your .tex file. <a>Learn more</a>",
"you_can_now_sign_in_with_new_password": "You can now sign in with your new password.",
"you_can_only_be_affiliated_with_one_group": "You can only be affiliated with one group.",

View File

@@ -70,7 +70,6 @@
"add_role_and_department": "Añadir rol y departamento",
"add_to_tag": "Añadir a etiqueta",
"add_your_comment_here": "Añade tu comentario aquí",
"add_your_first_group_member_now": "Agrega tu primer grupo de miembros ahora",
"added": "agregado",
"added_by_on": "Añadido por __name__ el __date__",
"adding": "Añadiendo",
@@ -338,6 +337,7 @@
"importing_and_merging_changes_in_github": "Importando y uniendo cambios en GitHub",
"info": "Información",
"institution": "Institución",
"invite_group_members": "Invitar miembros del grupo",
"it": "Italiano",
"ja": "Japonés",
"january": "Enero",

View File

@@ -7,7 +7,6 @@
"account_settings": "Tilin asetukset",
"actions": "Toiminnot",
"add": "Lisää",
"add_your_first_group_member_now": "Lisää ensimmäiset ryhmäsi jäsenet nyt",
"added": "lisätty",
"address": "Osoite",
"admin": "ylläpitäjä",
@@ -126,6 +125,7 @@
"importing_and_merging_changes_in_github": "Tuodaan ja yhdistetään muutoksia GitHubissa",
"info": "Tietoa",
"institution": "Instituutio",
"invite_group_members": "Kutsu ryhmän jäseniä",
"it": "Italia",
"ja": "Japani",
"january": "Tammikuu",

View File

@@ -72,7 +72,6 @@
"add_to_dictionary": "Ajouter au Dictionnaire",
"add_to_tag": "Ajouter à létiquette",
"add_your_comment_here": "Ajoutez votre commentaire ici",
"add_your_first_group_member_now": "Ajouter le premier membre de votre groupe maintenant",
"added": "ajouté",
"added_by_on": "Ajouté par __name__ le __date__",
"adding": "Ajout",
@@ -597,6 +596,7 @@
"invalid_password": "Mot de passe invalide.",
"invalid_request": "Requête invalide. Veuillez corriger les données et réessayer.",
"invalid_zip_file": "Archive invalide",
"invite_group_members": "Inviter des membres du groupe",
"invite_not_accepted": "Invitation en attente",
"invite_not_valid": "Cette invitation à un projet nest pas valable",
"invite_not_valid_description": "Linvitation a peut-être expiré. Veuillez contacter le propriétaire du projet",

View File

@@ -15,7 +15,6 @@
"account_settings": "Impostazioni Account",
"actions": "Azioni",
"add": "Aggiungi",
"add_your_first_group_member_now": "Aggiungi ora i primi membri del gruppo",
"added": "aggiunto",
"adding": "Aggiunta",
"address": "Indirizzo",
@@ -147,6 +146,7 @@
"importing_and_merging_changes_in_github": "Importazione e unione modifiche in GitHub",
"info": "Info",
"institution": "Istituzione",
"invite_group_members": "Invita i membri del gruppo",
"it": "Italiano",
"ja": "Giapponese",
"january": "Gennaio",

View File

@@ -20,7 +20,6 @@
"activating": "アクティベート中",
"activation_token_expired": "アクティベーショントークンの期限が切れています。新しいトークンが必要となります。",
"add": "追加",
"add_your_first_group_member_now": "最初のグループメンバーを今すぐ追加",
"added": "追加",
"adding": "追加中",
"address": "住所",
@@ -184,6 +183,7 @@
"institution": "組織",
"invalid_file_name": "無効なファイル名",
"invalid_password": "パスワードの入力に誤りがあります。",
"invite_group_members": "グループメンバーを招待",
"invite_not_accepted": "招待はまだ承認されていません",
"invite_not_valid": "これは有効なプロジェクト招待ではありません",
"invite_not_valid_description": "招待の有効期限が切れている可能性があります。プロジェクトオーナーにお問い合わせください",

View File

@@ -23,7 +23,6 @@
"add": "추가",
"add_comment": "코멘트 추가",
"add_your_comment_here": "여기에 코멘트 추가",
"add_your_first_group_member_now": "지금 첫 그룹 멤버 추가",
"added": "추가완료",
"adding": "추가하기",
"address": "주소",
@@ -211,6 +210,7 @@
"invalid_email": "이메일 주소가 잘못되었습니다.",
"invalid_file_name": "파일 이름이 부적절합니다.",
"invalid_password": "비밀번호 틀림.",
"invite_group_members": "그룹 멤버 초대",
"invite_not_accepted": "받지 않은 초대장",
"invite_not_valid": "프로젝트 초대가 유효하지 않습니다.",
"invite_not_valid_description": "초대가 만료되었습니다. 프로젝트 소유자에게 연락하십시오.",

View File

@@ -29,7 +29,6 @@
"add_new_email": "Voeg nieuwe email toe",
"add_role_and_department": "Voeg rol en afdeling toe",
"add_your_comment_here": "Voeg uw opmerking hier toe",
"add_your_first_group_member_now": "Voeg je eerste groepsleden nu toe",
"added": "toegevoegd",
"adding": "Toevoegen",
"address": "Straat",
@@ -221,6 +220,7 @@
"institution_and_role": "Instelling en rol",
"invalid_file_name": "Ongeldige Bestandsnaam",
"invalid_password": "Onjuist Wachtwoord.",
"invite_group_members": "Groepsleden uitnodigen",
"invite_not_accepted": "Uitnodiging nog niet geaccepteerd",
"invite_not_valid": "Dit is geen valide projectuitnodiging",
"invite_not_valid_description": "De uitnodiging kan verlopen zijn. Neem contact op met de projecteigenaar",

View File

@@ -16,7 +16,6 @@
"actions": "Handlinger",
"activate_account": "Aktiver din konto",
"add": "Legg til",
"add_your_first_group_member_now": "Legg til ditt første gruppemedlem nå",
"added": "lagt til",
"adding": "Legge til",
"address": "Adresse",
@@ -148,6 +147,7 @@
"importing_and_merging_changes_in_github": "Importerer og merger endringer i GitHub",
"info": "Info",
"institution": "Institusjon",
"invite_group_members": "Inviter gruppemedlemmer",
"it": "Italiensk",
"ja": "Japansk",
"january": "Januar",

View File

@@ -30,7 +30,6 @@
"add_new_email": "Adicionar novo e-mail",
"add_role_and_department": "Adicionar perfil e departamento",
"add_your_comment_here": "Adicione seu comentário aqui",
"add_your_first_group_member_now": "Adicione seu primeiro membro no grupo agora",
"added": "adicionado",
"adding": "Adicionando",
"address": "Endereço",
@@ -262,6 +261,7 @@
"invalid_email": "Algum email está inválido",
"invalid_file_name": "Nome de Arquivo Inválido",
"invalid_password": "Senha inválida.",
"invite_group_members": "Convidar membros do grupo",
"invite_not_accepted": "Convite ainda não aceito",
"invite_not_valid": "Esse não é um convite válido do projeto",
"invite_not_valid_description": "Talvez o convite tenha expirado. Por favor, entre em contato com o dono do projeto.",

View File

@@ -38,7 +38,6 @@
"activating": "Активация",
"activation_token_expired": "Срок действия Вашего ключа истёк. Вам необходимо запросить новый ключ активации.",
"add": "Добавить",
"add_your_first_group_member_now": "Добавьте первых участников группы сейчас",
"added": "добавлены",
"adding": "Добавление",
"address": "Адрес",
@@ -191,6 +190,7 @@
"info": "Информация",
"institution": "Организация",
"invalid_file_name": "Неверное имя файла",
"invite_group_members": "Пригласить участников группы",
"invite_not_accepted": "Приглашение еще не было принято",
"invite_not_valid": "Приглашение недействительно",
"invite_not_valid_description": "Вышел срок приглашения. Пожалуйста, обратитесь к владельцу проекта",

View File

@@ -39,7 +39,6 @@
"add_new_email": "Lägg till ny e-postadress",
"add_role_and_department": "Lägg till befattning och avdelning",
"add_your_comment_here": "Skriv din kommentar här",
"add_your_first_group_member_now": "Lägg till dina första gruppmedlemmar nu",
"added": "lagst till",
"adding": "Lägger till",
"address": "Adress",
@@ -375,6 +374,7 @@
"invalid_password_too_long": "Maximal lösenordslängd __maxLength__ överskrids.",
"invalid_password_too_short": "Lösenordet är för kort, minimum __minLength__.",
"invalid_zip_file": "Ogiltig zip-fil",
"invite_group_members": "Bjud in gruppmedlemmar",
"invite_more_collabs": "Bjuda in fler medarbetare",
"invite_not_accepted": "Inbjudan ännu inte accepterad",
"invite_not_valid": "Detta är inte en giltig inbjudan till ett projekt",

View File

@@ -19,7 +19,6 @@
"activating": "Aktifleştiriliyor",
"activation_token_expired": "Aktivasyon kodunuzun süresi geçmiş, size tekrar yollayacağımız kodu kullanın.",
"add": "Ekle",
"add_your_first_group_member_now": "Grubunuza ilk üyeleri ekleyin",
"added": "eklenmiş",
"adding": "Ekleniyor",
"address": "Adres",
@@ -148,6 +147,7 @@
"importing_and_merging_changes_in_github": "Değişiklikler GitHuba aktarılıyor",
"info": "Bilgi",
"institution": "Enstitü",
"invite_group_members": "Grup üyelerini davet edin",
"it": "İtalyanca",
"ja": "Japonca",
"january": "Ocak",

View File

@@ -91,7 +91,6 @@
"add_to_dictionary": "添加到词典",
"add_to_tag": "添加到标记",
"add_your_comment_here": "在此添加评论",
"add_your_first_group_member_now": "现在添加您的第一个组成员",
"added": "已添加",
"added_by_on": "由 __name__ 在 __date__ 添加",
"adding": "添加",
@@ -184,7 +183,7 @@
"automatic_user_registration_uppercase": "自动用户注册",
"automatically_insert_closing_brackets_and_parentheses": "自动插入右括号和圆括号",
"automatically_recompile_the_project_as_you_edit": "编辑时自动重新编译项目",
"available_with_group_professional": "适用于 Group Professional",
"available_for_pro_groups": "适用于 Pro 群组",
"back": "返回",
"back_to_account_settings": "返回帐户设置",
"back_to_all_posts": "回到所有帖子",
@@ -1005,6 +1004,7 @@
"invalid_zip_file": "zip文件无效",
"invite": "邀请",
"invite_expired": "此邀请已经过期",
"invite_group_members": "邀请群组成员",
"invite_more_collabs": "邀请更多的协作者",
"invite_more_members": "邀请更多成员",
"invite_not_accepted": "邀请尚未接受",

View File

@@ -206,7 +206,7 @@ module.exports = {
},
{
planCode: 'group_professional',
name: 'Professional - Group Account - Enterprise',
name: 'Pro group',
hideFromUsers: true,
price_in_cents: 0,
annual: true,
@@ -218,7 +218,7 @@ module.exports = {
},
{
planCode: 'group_collaborator',
name: 'Collaborator - Group Account - Enterprise',
name: 'Standard group',
hideFromUsers: true,
price_in_cents: 0,
annual: true,

View File

@@ -284,7 +284,7 @@ describe('<AddSeats />', function () {
nextInvoice: {
date: '2025-12-01T00:00:00.000Z',
plan: {
name: 'Overleaf Standard Group',
name: 'Standard group',
amount: 0,
},
subtotal: 895,

View File

@@ -14,7 +14,7 @@ describe('<UpgradeSubscription />', function () {
this.preview = {
change: {
type: 'group-plan-upgrade',
prevPlan: { name: 'Overleaf Standard Group' },
prevPlan: { name: 'Standard group' },
},
currency: 'USD',
immediateCharge: {
@@ -27,7 +27,7 @@ describe('<UpgradeSubscription />', function () {
nextPlan: { annual: true },
nextInvoice: {
date: '2025-11-05T11:35:32.000Z',
plan: { name: 'Overleaf Professional Group', amount: 0 },
plan: { name: 'Pro group', amount: 0 },
addOns: [
{
code: 'additional-license',

View File

@@ -836,10 +836,10 @@ describe('<UserNotifications />', function () {
const alert = await screen.findByRole('alert')
const email = unconfirmedCommonsUserData.email
expect(alert.textContent).to.contain(
'You are one step away from accessing Overleaf Professional features'
'You are one step away from accessing Overleaf Pro features'
)
expect(alert.textContent).to.contain(
`Overleaf has an Overleaf subscription. Click the confirmation link sent to ${email} to upgrade to Overleaf Professional`
`Overleaf has an Overleaf subscription. Click the confirmation link sent to ${email} to upgrade to Overleaf Pro`
)
})
}

View File

@@ -24,7 +24,7 @@ const memberGroupSubscriptions: MemberGroupSubscription[] = [
{
...groupActiveSubscription,
userIsGroupManager: false,
planLevelName: 'Professional',
planLevelName: 'Pro',
admin_id: {
id: 'abc123abc123' as UserId,
email: 'you@example.com',
@@ -33,7 +33,7 @@ const memberGroupSubscriptions: MemberGroupSubscription[] = [
{
...groupActiveSubscriptionWithPendingLicenseChange,
userIsGroupManager: true,
planLevelName: 'Collaborator',
planLevelName: 'Standard',
admin_id: {
id: 'bcd456bcd456' as UserId,
email: 'someone@example.com',
@@ -68,7 +68,7 @@ describe('<GroupSubscriptionMemberships />', function () {
})
expect(elements.length).to.equal(1)
expect(elements[0].textContent).to.equal(
'You are on our Professional plan as a member of the group subscription GAS administered by you@example.com'
'You are on our Pro plan as a member of the group subscription GAS administered by you@example.com'
)
})

View File

@@ -49,10 +49,10 @@ describe('<InstitutionMemberships />', function () {
})
expect(elements.length).to.equal(2)
expect(elements[0].textContent).to.equal(
'You are on our Professional plan as a confirmed member of Test University'
'You are on our Pro plan as a confirmed member of Test University'
)
expect(elements[1].textContent).to.equal(
'You are on our Professional plan as a confirmed member of Example Institution'
'You are on our Pro plan as a confirmed member of Example Institution'
)
})

View File

@@ -14,7 +14,7 @@ function getManagedGroupSubscriptions(
const subscriptionOne = {
_id: 'bcd567',
userIsGroupMember: true,
planLevelName: 'Professional',
planLevelName: 'Pro',
admin_id: {
email: 'you@example.com',
},
@@ -28,7 +28,7 @@ function getManagedGroupSubscriptions(
const subscriptionTwo = {
_id: 'def456',
userIsGroupMember: false,
planLevelName: 'Collaborator',
planLevelName: 'Standard',
admin_id: {
email: 'someone@example.com',
},
@@ -42,7 +42,7 @@ function getManagedGroupSubscriptions(
const subscriptionMemberAndAdmin = {
_id: 'group2abc',
userIsGroupMember: true,
planLevelName: 'Collaborator',
planLevelName: 'Standard',
admin_id: {
email: 'admin@example.com',
},
@@ -56,7 +56,7 @@ function getManagedGroupSubscriptions(
const subscriptionAdmin = {
_id: 'group123abc',
userIsGroupMember: false,
planLevelName: 'Collaborator',
planLevelName: 'Standard',
admin_id: {
email: 'admin@example.com',
},
@@ -105,16 +105,16 @@ describe('<ManagedGroupSubscriptions />', function () {
})
expect(elements.length).to.equal(4)
expect(elements[0].textContent).to.equal(
'You are a manager and member of the Professional group subscription GAS administered by you@example.com.'
'You are a manager and member of the Pro group subscription GAS administered by you@example.com.'
)
expect(elements[1].textContent).to.equal(
'You are a manager of the Collaborator group subscription GASWPLC administered by someone@example.com.'
'You are a manager of the Standard group subscription GASWPLC administered by someone@example.com.'
)
expect(elements[2].textContent).to.equal(
'You are a manager and member of the Collaborator group subscription Testing administered by you (admin@example.com).'
'You are a manager and member of the Standard group subscription Testing administered by you (admin@example.com).'
)
expect(elements[3].textContent).to.equal(
'You are a manager of the Collaborator group subscription Testing Another administered by you (admin@example.com).'
'You are a manager of the Standard group subscription Testing Another administered by you (admin@example.com).'
)
const links = screen.getAllByRole('link')

View File

@@ -410,8 +410,7 @@ describe('<ChangePlanModal />', function () {
renderActiveSubscription(annualActiveSubscription)
await openModal()
const professionalPlanOption =
within(modal).getByLabelText('Professional')
const professionalPlanOption = within(modal).getByLabelText('Pro')
fireEvent.click(professionalPlanOption)
await within(modal).findByText(professionalPlanCollaboratorText)
@@ -461,7 +460,7 @@ describe('<ChangePlanModal />', function () {
) as HTMLInputElement
expect(standardPlanRadioInput.checked).to.be.true
let professionalPlanRadioInput = within(modal).getByLabelText(
'Professional'
'Pro'
) as HTMLInputElement
expect(professionalPlanRadioInput.checked).to.be.false
@@ -472,7 +471,7 @@ describe('<ChangePlanModal />', function () {
) as HTMLInputElement
expect(standardPlanRadioInput.checked).to.be.false
professionalPlanRadioInput = within(modal).getByLabelText(
'Professional'
'Pro'
) as HTMLInputElement
expect(professionalPlanRadioInput.checked).to.be.true
@@ -516,7 +515,7 @@ describe('<ChangePlanModal />', function () {
await openModal()
const standardPlanRadioInput = within(modal).getByLabelText(
'Professional'
'Pro'
) as HTMLInputElement
expect(standardPlanRadioInput.checked).to.be.true
})

View File

@@ -226,7 +226,7 @@ export const groupPlans: GroupPlans = {
code: 'collaborator',
},
{
display: 'Professional',
display: 'Pro',
code: 'professional',
},
],

View File

@@ -540,7 +540,7 @@ export const groupActiveSubscription: GroupSubscription = {
planCode: 'group_collaborator_10_enterprise',
plan: {
planCode: 'group_collaborator_10_enterprise',
name: 'Overleaf Standard - Group Account (10 licenses) - Enterprise',
name: 'Standard group (10 licenses)',
hideFromUsers: true,
price_in_cents: 129000,
annual: true,
@@ -588,7 +588,7 @@ export const groupProfessionalActiveSubscription: GroupSubscription = {
planCode: 'group_professional_2_enterprise',
plan: {
planCode: 'group_professional_2_enterprise',
name: 'Group Professional Plan (2 licenses)',
name: 'Pro group (2 licenses)',
hideFromUsers: true,
price_in_cents: 129000,
annual: true,
@@ -637,7 +637,7 @@ export const groupActiveSubscriptionWithPendingLicenseChange: GroupSubscription
planCode: 'group_collaborator_10_enterprise',
plan: {
planCode: 'group_collaborator_10_enterprise',
name: 'Overleaf Standard - Group Account (10 licenses) - Enterprise',
name: 'Standard group (10 licenses)',
hideFromUsers: true,
price_in_cents: 129000,
annual: true,
@@ -674,7 +674,7 @@ export const groupActiveSubscriptionWithPendingLicenseChange: GroupSubscription
},
pendingPlan: {
planCode: 'group_collaborator_10_enterprise',
name: 'Overleaf Standard - Group Account (10 licenses) - Enterprise',
name: 'Standard group (10 licenses)',
hideFromUsers: true,
price_in_cents: 129000,
annual: true,

View File

@@ -762,7 +762,7 @@ describe('PaymentProviderEntities', function () {
new PaymentProviderSubscriptionChange({
subscription: ctx.subscription,
nextPlanCode: 'group_professional_10_educational',
nextPlanName: 'Group Professional Educational',
nextPlanName: 'Pro group with edu discount',
nextPlanPrice: 100,
nextAddOns: [additionalLicenseAddOn],
})
@@ -805,7 +805,7 @@ describe('PaymentProviderEntities', function () {
new PaymentProviderSubscriptionChange({
subscription: ctx.subscription,
nextPlanCode: 'group_professional_10_educational',
nextPlanName: 'Group Professional Educational',
nextPlanName: 'Pro group with edu discount',
nextPlanPrice: 100,
nextAddOns: [aiAddOn, additionalLicenseAddOn],
})

View File

@@ -77,7 +77,7 @@ describe('SubscriptionController', function () {
},
immediateCharge: { amount: 0 },
nextPlanCode: 'professional',
nextPlanName: 'Professional',
nextPlanName: 'Pro',
nextPlanPrice: 2000,
nextAddOns: [],
subtotal: 2000,

View File

@@ -1002,7 +1002,7 @@ describe('SubscriptionViewModelBuilder', function () {
{
subscription: ctx.paymentRecord,
nextPlanCode: ctx.groupPlanCode,
nextPlanName: 'Group Collaborator (Annual) 4 licenses',
nextPlanName: 'Standard group',
nextPlanPrice: 1400,
nextAddOns: [
new PaymentProviderSubscriptionAddOn({