diff --git a/CHANGELOG.md b/CHANGELOG.md
index a994536a34..57c5d81929 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@ Versioning](https://semver.org/spec/v2.0.0.html).
## [Unrealeased]
+## [2.14.0] - 2022-04-01
+
### Added
- Add a `CourseProductList` Component
@@ -1607,7 +1609,8 @@ us:
- finish integrating the missing pages and improve the sandbox environment;
- test and polish the use of richie as a django app / node dependency.
-[unreleased]: https://github.com/openfun/richie/compare/v2.13.0...master
+[unreleased]: https://github.com/openfun/richie/compare/v2.14.0...master
+[2.14.0]: https://github.com/openfun/richie/compare/v2.13.0...v2.14.0
[2.13.0]: https://github.com/openfun/richie/compare/v2.12.0...v2.13.0
[2.12.0]: https://github.com/openfun/richie/compare/v2.11.0...v2.12.0
[2.11.0]: https://github.com/openfun/richie/compare/v2.10.0...v2.11.0
diff --git a/UPGRADE.md b/UPGRADE.md
index 42a3cd0d46..f5767a4f27 100644
--- a/UPGRADE.md
+++ b/UPGRADE.md
@@ -16,16 +16,26 @@ $ make migrate
## Unreleased
+## 2.13.x to 2.14.x
+
- New frontend widgets has been added, you have to update stylesheets as follows:
- `_main.scss`
```diff
+ + @import 'richie-education/scss/tools/utils';
+
+ @import '../js/components/AddressesManagement/styles';
+ + @import '../js/components/CourseProductCertificateItem/styles';
+ + @import '../js/components/CourseProductCourseRuns/styles';
+ + @import '../js/components/CourseProductItem/styles';
+ @import '../js/components/PaymentButton/styles';
+ @import '../js/components/RegisteredCreditCard/styles';
+ @import '../js/components/SaleTunnel/styles';
+ @import '../js/components/SaleTunnelStepPayment/styles';
+ @import '../js/components/SaleTunnelStepResume/styles';
+ @import '../js/components/SaleTunnelStepValidation/styles';
+ + @import '../js/components/StepBreadcrumb/styles';
+ ...
+ + @import './components/templates/richie/multiple-columns';
```
- Only if you have overridden `_palette.scss`:
@@ -43,10 +53,49 @@ $ make migrate
+ active: $active-scheme,
)
...
+ +product-item: (
+ + base-background: r-color('white'),
+ + base-border: r-color('purplish-grey'),
+ + light-color: r-color('white'),
+ + base-color: r-color('charcoal'),
+ + lighter-color: r-color('battleship-grey'),
+ + button-color: r-color('white'),
+ + button-background: r-color('firebrick6'),
+ +),
+registered-credit-card: (
+ title-color: r-color('charcoal'),
+ base-color: r-color('purplish-grey'),
+),
+ ...
+ +shadowed-box: (
+ + base-background: r-color('white'),
+ + base-shadow: 0 2px 4px rgba(5, 18, 42, 0.19),
+ +),
+ ...
+ +steps-breadcrumb: (
+ + icon-background-active: r-color(purplish-grey),
+ + icon-background: transparent,
+ + icon-border-active: transparent,
+ + icon-border: r-color('light-grey'),
+ + icon-fill-active: r-color('white'),
+ + icon-fill: r-color('light-grey'),
+ + icon-outline: rgba(r-color(purplish-grey), 0.25),
+ + label-color-active: r-color('charcoal'),
+ + label-color: r-color('light-grey'),
+ + separator-background-active: rgba(r-color(purplish-grey), 0.6),
+ + separator-background: rgba(r-color(purplish-grey), 0.25),
+ +),
+ +steps-content: (
+ + content-color: r-color(purplish-grey),
+ + icon-background: r-color(indianred3),
+ + icon-color: r-color('white'),
+ + icon-big-background: transparent,
+ + icon-big-color: r-color('charcoal'),
+ + icon-success-background: r-color('mantis'),
+ + icon-success-color: r-color('white'),
+ + title-color: r-color('charcoal'),
+ + subtitle-color: r-color(purplish-grey),
+ +)
```
- The `get_placeholder_plugins` and `get_page_plugins` template tags were merged in a single
diff --git a/setup.cfg b/setup.cfg
index 81cc1050a1..f55fcd580d 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -3,7 +3,7 @@
;;
[metadata]
name = richie
-version = 2.13.0
+version = 2.14.0
description = A CMS to build learning portals for open education
long_description = file:README.md
long_description_content_type = text/markdown
diff --git a/src/frontend/i18n/locales/ar-SA.json b/src/frontend/i18n/locales/ar-SA.json
index aa05424acf..1d8bd9de17 100644
--- a/src/frontend/i18n/locales/ar-SA.json
+++ b/src/frontend/i18n/locales/ar-SA.json
@@ -1,12 +1,184 @@
{
+ "components.AddressesManagement.actionCreation": {
+ "description": "Action name for address creation.",
+ "message": "creation"
+ },
+ "components.AddressesManagement.actionDeletion": {
+ "description": "Action name for address deletion.",
+ "message": "deletion"
+ },
+ "components.AddressesManagement.actionPromotion": {
+ "description": "Action name for address promotion.",
+ "message": "promotion"
+ },
+ "components.AddressesManagement.actionUpdate": {
+ "description": "Action name for address update.",
+ "message": "update"
+ },
+ "components.AddressesManagement.addAddress": {
+ "description": "Title of the address creation form",
+ "message": "Add a new address"
+ },
+ "components.AddressesManagement.addressInput": {
+ "description": "Label of the \"address\" input",
+ "message": "Address"
+ },
+ "components.AddressesManagement.cancelButton": {
+ "description": "Label of the cancel button",
+ "message": "Cancel"
+ },
+ "components.AddressesManagement.cancelTitleButton": {
+ "description": "Title of the cancel button",
+ "message": "Cancel edition"
+ },
+ "components.AddressesManagement.cityInput": {
+ "description": "Label of the \"city\" input",
+ "message": "City"
+ },
+ "components.AddressesManagement.closeButton": {
+ "description": "Label of the close button",
+ "message": "Go back"
+ },
+ "components.AddressesManagement.countryInput": {
+ "description": "Label of the \"country\" input",
+ "message": "Country"
+ },
+ "components.AddressesManagement.deleteButton": {
+ "description": "Label of the delete button",
+ "message": "Delete"
+ },
+ "components.AddressesManagement.deleteButtonLabel": {
+ "description": "Title of the delete button",
+ "message": "Delete \"{title}\" address"
+ },
+ "components.AddressesManagement.deletionConfirmation": {
+ "description": "Confirmation message shown to the user when he wants to delete an address",
+ "message": "Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after."
+ },
+ "components.AddressesManagement.editAddress": {
+ "description": "Title of the address edit form",
+ "message": "Update address {title}"
+ },
+ "components.AddressesManagement.editButton": {
+ "description": "Label of the edit button",
+ "message": "Edit"
+ },
+ "components.AddressesManagement.editButtonLabel": {
+ "description": "Title of the edit button",
+ "message": "Edit \"{title}\" address"
+ },
+ "components.AddressesManagement.error": {
+ "description": "Error message shown to the user when address creation/update/deletion request fails.",
+ "message": "An error occurred while address {action}. Please retry later."
+ },
+ "components.AddressesManagement.first_nameInput": {
+ "description": "Label of the \"first_name\" input",
+ "message": "Recipient's first name"
+ },
+ "components.AddressesManagement.last_nameInput": {
+ "description": "Label of the \"last_name\" input",
+ "message": "Recipient's last name"
+ },
+ "components.AddressesManagement.postcodeInput": {
+ "description": "Label of the \"postcode\" input",
+ "message": "Postcode"
+ },
+ "components.AddressesManagement.promoteButtonLabel": {
+ "description": "Title of the button to set the address as the main one",
+ "message": "Define \"{title}\" address as main"
+ },
+ "components.AddressesManagement.registeredAddresses": {
+ "description": "Title of the registered addresses block",
+ "message": "Your addresses"
+ },
+ "components.AddressesManagement.saveInput": {
+ "description": "Label of the \"save\" input",
+ "message": "Save this address"
+ },
+ "components.AddressesManagement.selectButton": {
+ "description": "Label of the select button",
+ "message": "Use this address"
+ },
+ "components.AddressesManagement.selectButtonLabel": {
+ "description": "Title of the select button",
+ "message": "Select \"{title}\" address"
+ },
+ "components.AddressesManagement.titleInput": {
+ "description": "Label of the \"title\" input",
+ "message": "Address title"
+ },
+ "components.AddressesManagement.updateButton": {
+ "description": "Label of the update button",
+ "message": "Update this address"
+ },
+ "components.CourseGlimpse.categoryLabel": {
+ "description": "Category label text for screen reader users",
+ "message": "Category"
+ },
+ "components.CourseGlimpse.codeIconAlt": {
+ "description": "Course code logo alternative text for screen reader users",
+ "message": "Course code"
+ },
"components.CourseGlimpse.cover": {
"description": "Placeholder text when the course we are glimpsing at is missing a cover image",
"message": "Cover"
},
+ "components.CourseGlimpse.organizationIconAlt": {
+ "description": "Organization logo alternative text for screen reader users",
+ "message": "Organization"
+ },
+ "components.CourseGlimpseFooter.dateIconAlt": {
+ "description": "Course date logo alternative text for screen reader users",
+ "message": "Course date"
+ },
"components.CourseGlimpseList.courseCount": {
"description": "Result count & pagination information for course search. Appears right above search results",
"message": "Showing {start, number} to {end, number} of {courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search"
},
+ "components.CourseGlimpseList.offscreenCourseCount": {
+ "description": "Short result count information for course search. Only for screen readers",
+ "message": "{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search"
+ },
+ "components.CourseProductCertificateItem.certificateExplanation": {
+ "description": "Text displayed when the product certificate has no description",
+ "message": "You will be able to download your certificate once you will pass all course runs."
+ },
+ "components.CourseProductCertificateItem.congratulations": {
+ "description": "Congratulation message when user has passed the course.",
+ "message": "Congratulations, you passed this course!"
+ },
+ "components.CourseProductCertificateItem.download": {
+ "description": "Button label to download the certificate",
+ "message": "Download"
+ },
+ "components.CourseProductCertificateItem.generatingCertificate": {
+ "description": "Accessible label displayed while certificate is being generated.",
+ "message": "Certificate is being generated..."
+ },
+ "components.CourseProductItem.enrolled": {
+ "description": "Message displayed when authenticated user owned the product",
+ "message": "Enrolled"
+ },
+ "components.CourseProductsList.end": {
+ "description": "End label displayed in the header of course run dates section",
+ "message": "End"
+ },
+ "components.CourseProductsList.loadingInitial": {
+ "description": "Accessible text for the initial loading spinner displayed when course is fetching",
+ "message": "Loading course information..."
+ },
+ "components.CourseProductsList.start": {
+ "description": "Start label displayed in the header of course run dates section",
+ "message": "Start"
+ },
+ "components.CourseProductsLists.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseProductsLists.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
"components.CourseRunEnrollment.enroll": {
"description": "CTA for users who can enroll in the course run or could enroll if they logged in.",
"message": "Enroll now"
@@ -35,10 +207,58 @@
"description": "Helper text in the enroll button for non logged in users",
"message": "Log in to enroll"
},
+ "components.CourseRunList.enrollFromTo": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
"components.DesktopUserMenu.menuPurpose": {
"description": "Accessible label for user menu button",
"message": "Access to your profile settings"
},
+ "components.EnrollableCourseRunList.ariaSelectCourseRun": {
+ "description": "Accessible label used by screen reader when user checked a course run radio input.",
+ "message": "Select course run from {start} to {end}."
+ },
+ "components.EnrollableCourseRunList.enroll": {
+ "description": "Text label for the enroll button",
+ "message": "Enroll"
+ },
+ "components.EnrollableCourseRunList.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {enrollment_start} to {enrollment_end}"
+ },
+ "components.EnrollableCourseRunList.enrolling": {
+ "description": "Label displayed when a request to enroll to a course run is loading",
+ "message": "Enrolling..."
+ },
+ "components.EnrollableCourseRunList.enrollmentNotYetOpened": {
+ "description": "Text label for the enroll cta when enrollment is not yet opened",
+ "message": "Enrollment will open on {enrollment_start}"
+ },
+ "components.EnrollableCourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
+ "components.EnrollableCourseRunList.selectCourseRun": {
+ "description": "Label displayed when user do not have select a course run.",
+ "message": "Select a course run"
+ },
+ "components.EnrolledCourseRun.goToCourse": {
+ "description": "CTA displayed when user is enrolled to the course run.",
+ "message": "Go to course"
+ },
+ "components.EnrolledCourseRun.unroll": {
+ "description": "Button label to unroll.",
+ "message": "Unroll"
+ },
+ "components.EnrolledCourseRun.unrolling": {
+ "description": "Accessible label displayed when user is being unrolled.",
+ "message": "Unrolling..."
+ },
"components.LanguageSelector.currentlySelected": {
"description": "Accessible hint to mark the currently selected language in the language selector",
"message": "(currently selected)"
@@ -83,10 +303,138 @@
"description": "Accessibility helper for pagination, added on the previous page link.",
"message": "Previous page {page}"
},
+ "components.PaymentButton.errorAbort": {
+ "description": "Error message shown when user aborts the payment.",
+ "message": "You have aborted the payment."
+ },
+ "components.PaymentButton.errorAborting": {
+ "description": "Error message shown when user asks to abort the payment.",
+ "message": "Aborting the payment..."
+ },
+ "components.PaymentButton.errorDefault": {
+ "description": "Error message shown when payment creation request failed.",
+ "message": "An error occurred during payment. Please retry later."
+ },
+ "components.PaymentButton.pay": {
+ "description": "CTA label to proceed to the payment of the product",
+ "message": "Pay {price}"
+ },
+ "components.PaymentButton.payInOneClick": {
+ "description": "CTA label to proceed to the one click payment of the product",
+ "message": "Pay in one click {price}"
+ },
+ "components.PaymentButton.paymentInProgress": {
+ "description": "Label for screen reader when a payment is in progress.",
+ "message": "Payment in progress"
+ },
+ "components.PurchasedProductMenu.actionsRelated": {
+ "description": "Accessible label for the purchased product menu",
+ "message": "Other actions related to this product"
+ },
+ "components.PurchasedProductMenu.downloadInvoice": {
+ "description": "Label for selector item to download invoice",
+ "message": "Download invoice"
+ },
+ "components.PurchasedProductMenu.generatingInvoice": {
+ "description": "Accessible label when invoice is being generated",
+ "message": "Invoice is being generated..."
+ },
+ "components.RegisteredCreditCard.expirationDate": {
+ "description": "Credit card expiration date label",
+ "message": "Expiration date: {expirationDate}"
+ },
+ "components.RegisteredCreditCard.inputAriaLabel": {
+ "description": "ARIA Label read by screen reader to inform which card is focused",
+ "message": "{selected, select, true {Unselect} other {Select}} {title}'s card"
+ },
"components.RootSearchSuggestField.searchFieldPlaceholder": {
"description": "Placeholder text displayed in the search field when it is empty.",
"message": "Search for courses"
},
+ "components.SaleTunnel.closeDialog": {
+ "description": "ARIA label used by screenreader to inform that the close dialog button is selected",
+ "message": "Close the dialog"
+ },
+ "components.SaleTunnel.loginToPurchase": {
+ "description": "Label displayed inside the product's CTA when user is not logged in",
+ "message": "Login to purchase"
+ },
+ "components.SaleTunnel.stepPayment": {
+ "description": "Label of the Payment step",
+ "message": "Payment"
+ },
+ "components.SaleTunnel.stepResume": {
+ "description": "Label of the Resume step",
+ "message": "Resume"
+ },
+ "components.SaleTunnel.stepValidation": {
+ "description": "Label of the Validation step",
+ "message": "Validation"
+ },
+ "components.SaleTunnelStepPayment.registeredCardSectionTitle": {
+ "description": "Label for the registered credit cards section",
+ "message": "Your registered credit card"
+ },
+ "components.SaleTunnelStepPayment.resumeTile": {
+ "description": "Label for the resume tile",
+ "message": "You are about to purchase"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressAddLabel": {
+ "description": "Label for the billing address add button",
+ "message": "Add an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressCreateLabel": {
+ "description": "Label for the billing address create button",
+ "message": "Create an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressFieldset": {
+ "description": "Label for the billing address fieldset",
+ "message": "Billing address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressNoEntry": {
+ "description": "Message displayed when the user has no address.",
+ "message": "You have not yet a billing address."
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressSelectLabel": {
+ "description": "Label for the billing address select",
+ "message": "Select a billing address"
+ },
+ "components.SaleTunnelStepPayment.userTile": {
+ "description": "Label for the user information tile",
+ "message": "Your personal information"
+ },
+ "components.SaleTunnelStepResume.congratulations": {
+ "description": "Text displayed to thank user for his order",
+ "message": "Congratulations!"
+ },
+ "components.SaleTunnelStepResume.cta": {
+ "description": "Label to the call to action to close sale tunnel",
+ "message": "Start this course now!"
+ },
+ "components.SaleTunnelStepResume.successDetailMessage": {
+ "description": "Text to remind that order's invoice will be send by email soon",
+ "message": "You will receive your invoice by email in a few moments."
+ },
+ "components.SaleTunnelStepResume.successMessage": {
+ "description": "Message to confirm that order has been created",
+ "message": "Your order has been successfully created."
+ },
+ "components.SaleTunnelStepValidation.availableCourseRuns": {
+ "description": "Course runs available text",
+ "message": "{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available"
+ },
+ "components.SaleTunnelStepValidation.courseRunDates": {
+ "description": "Course run date text",
+ "message": "From {start} to {end}"
+ },
+ "components.SaleTunnelStepValidation.includingVAT": {
+ "description": "Text displayed next to the price to mention this is the price including VAT.",
+ "message": "including VAT"
+ },
+ "components.SaleTunnelStepValidation.proceedToPayment": {
+ "description": "CTA to go to payment step",
+ "message": "Proceed to payment"
+ },
"components.Search.errorMessage": {
"description": "Error message for Search view when the request to load courses fails",
"message": "Something's wrong! Courses could not be loaded."
@@ -95,6 +443,10 @@
"description": "Accessibility text for the button/icon that toggles *off* the filters pane on mobile",
"message": "Hide filters pane"
},
+ "components.Search.resultsTitle": {
+ "description": "Title for the search results pane in course search (not shown, made for screen reader users).",
+ "message": "Search results"
+ },
"components.Search.showFiltersPane": {
"description": "Accessibility text for the button/icon that toggles *on* the filters pane on mobile",
"message": "Show filters pane"
diff --git a/src/frontend/i18n/locales/es-ES.json b/src/frontend/i18n/locales/es-ES.json
index a330538249..c396682d00 100644
--- a/src/frontend/i18n/locales/es-ES.json
+++ b/src/frontend/i18n/locales/es-ES.json
@@ -1,12 +1,184 @@
{
+ "components.AddressesManagement.actionCreation": {
+ "description": "Action name for address creation.",
+ "message": "creation"
+ },
+ "components.AddressesManagement.actionDeletion": {
+ "description": "Action name for address deletion.",
+ "message": "deletion"
+ },
+ "components.AddressesManagement.actionPromotion": {
+ "description": "Action name for address promotion.",
+ "message": "promotion"
+ },
+ "components.AddressesManagement.actionUpdate": {
+ "description": "Action name for address update.",
+ "message": "update"
+ },
+ "components.AddressesManagement.addAddress": {
+ "description": "Title of the address creation form",
+ "message": "Add a new address"
+ },
+ "components.AddressesManagement.addressInput": {
+ "description": "Label of the \"address\" input",
+ "message": "Address"
+ },
+ "components.AddressesManagement.cancelButton": {
+ "description": "Label of the cancel button",
+ "message": "Cancel"
+ },
+ "components.AddressesManagement.cancelTitleButton": {
+ "description": "Title of the cancel button",
+ "message": "Cancel edition"
+ },
+ "components.AddressesManagement.cityInput": {
+ "description": "Label of the \"city\" input",
+ "message": "City"
+ },
+ "components.AddressesManagement.closeButton": {
+ "description": "Label of the close button",
+ "message": "Go back"
+ },
+ "components.AddressesManagement.countryInput": {
+ "description": "Label of the \"country\" input",
+ "message": "Country"
+ },
+ "components.AddressesManagement.deleteButton": {
+ "description": "Label of the delete button",
+ "message": "Delete"
+ },
+ "components.AddressesManagement.deleteButtonLabel": {
+ "description": "Title of the delete button",
+ "message": "Delete \"{title}\" address"
+ },
+ "components.AddressesManagement.deletionConfirmation": {
+ "description": "Confirmation message shown to the user when he wants to delete an address",
+ "message": "Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after."
+ },
+ "components.AddressesManagement.editAddress": {
+ "description": "Title of the address edit form",
+ "message": "Update address {title}"
+ },
+ "components.AddressesManagement.editButton": {
+ "description": "Label of the edit button",
+ "message": "Edit"
+ },
+ "components.AddressesManagement.editButtonLabel": {
+ "description": "Title of the edit button",
+ "message": "Edit \"{title}\" address"
+ },
+ "components.AddressesManagement.error": {
+ "description": "Error message shown to the user when address creation/update/deletion request fails.",
+ "message": "An error occurred while address {action}. Please retry later."
+ },
+ "components.AddressesManagement.first_nameInput": {
+ "description": "Label of the \"first_name\" input",
+ "message": "Recipient's first name"
+ },
+ "components.AddressesManagement.last_nameInput": {
+ "description": "Label of the \"last_name\" input",
+ "message": "Recipient's last name"
+ },
+ "components.AddressesManagement.postcodeInput": {
+ "description": "Label of the \"postcode\" input",
+ "message": "Postcode"
+ },
+ "components.AddressesManagement.promoteButtonLabel": {
+ "description": "Title of the button to set the address as the main one",
+ "message": "Define \"{title}\" address as main"
+ },
+ "components.AddressesManagement.registeredAddresses": {
+ "description": "Title of the registered addresses block",
+ "message": "Your addresses"
+ },
+ "components.AddressesManagement.saveInput": {
+ "description": "Label of the \"save\" input",
+ "message": "Save this address"
+ },
+ "components.AddressesManagement.selectButton": {
+ "description": "Label of the select button",
+ "message": "Use this address"
+ },
+ "components.AddressesManagement.selectButtonLabel": {
+ "description": "Title of the select button",
+ "message": "Select \"{title}\" address"
+ },
+ "components.AddressesManagement.titleInput": {
+ "description": "Label of the \"title\" input",
+ "message": "Address title"
+ },
+ "components.AddressesManagement.updateButton": {
+ "description": "Label of the update button",
+ "message": "Update this address"
+ },
+ "components.CourseGlimpse.categoryLabel": {
+ "description": "Category label text for screen reader users",
+ "message": "Category"
+ },
+ "components.CourseGlimpse.codeIconAlt": {
+ "description": "Course code logo alternative text for screen reader users",
+ "message": "Course code"
+ },
"components.CourseGlimpse.cover": {
"description": "Placeholder text when the course we are glimpsing at is missing a cover image",
"message": "Portada"
},
+ "components.CourseGlimpse.organizationIconAlt": {
+ "description": "Organization logo alternative text for screen reader users",
+ "message": "Organization"
+ },
+ "components.CourseGlimpseFooter.dateIconAlt": {
+ "description": "Course date logo alternative text for screen reader users",
+ "message": "Course date"
+ },
"components.CourseGlimpseList.courseCount": {
"description": "Result count & pagination information for course search. Appears right above search results",
"message": "Mostrando {start, number} a {end, number} de {courseCount, number} ¡ {courseCount, plural, one {curso} other {cursos}} que coinciden con su búsqueda"
},
+ "components.CourseGlimpseList.offscreenCourseCount": {
+ "description": "Short result count information for course search. Only for screen readers",
+ "message": "{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search"
+ },
+ "components.CourseProductCertificateItem.certificateExplanation": {
+ "description": "Text displayed when the product certificate has no description",
+ "message": "You will be able to download your certificate once you will pass all course runs."
+ },
+ "components.CourseProductCertificateItem.congratulations": {
+ "description": "Congratulation message when user has passed the course.",
+ "message": "Congratulations, you passed this course!"
+ },
+ "components.CourseProductCertificateItem.download": {
+ "description": "Button label to download the certificate",
+ "message": "Download"
+ },
+ "components.CourseProductCertificateItem.generatingCertificate": {
+ "description": "Accessible label displayed while certificate is being generated.",
+ "message": "Certificate is being generated..."
+ },
+ "components.CourseProductItem.enrolled": {
+ "description": "Message displayed when authenticated user owned the product",
+ "message": "Enrolled"
+ },
+ "components.CourseProductsList.end": {
+ "description": "End label displayed in the header of course run dates section",
+ "message": "End"
+ },
+ "components.CourseProductsList.loadingInitial": {
+ "description": "Accessible text for the initial loading spinner displayed when course is fetching",
+ "message": "Loading course information..."
+ },
+ "components.CourseProductsList.start": {
+ "description": "Start label displayed in the header of course run dates section",
+ "message": "Start"
+ },
+ "components.CourseProductsLists.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseProductsLists.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
"components.CourseRunEnrollment.enroll": {
"description": "CTA for users who can enroll in the course run or could enroll if they logged in.",
"message": "Inscribirse ahora"
@@ -35,10 +207,58 @@
"description": "Helper text in the enroll button for non logged in users",
"message": "Inicia sesión para inscribirse"
},
+ "components.CourseRunList.enrollFromTo": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
"components.DesktopUserMenu.menuPurpose": {
"description": "Accessible label for user menu button",
"message": "Acceso a la configuración de su perfil"
},
+ "components.EnrollableCourseRunList.ariaSelectCourseRun": {
+ "description": "Accessible label used by screen reader when user checked a course run radio input.",
+ "message": "Select course run from {start} to {end}."
+ },
+ "components.EnrollableCourseRunList.enroll": {
+ "description": "Text label for the enroll button",
+ "message": "Enroll"
+ },
+ "components.EnrollableCourseRunList.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {enrollment_start} to {enrollment_end}"
+ },
+ "components.EnrollableCourseRunList.enrolling": {
+ "description": "Label displayed when a request to enroll to a course run is loading",
+ "message": "Enrolling..."
+ },
+ "components.EnrollableCourseRunList.enrollmentNotYetOpened": {
+ "description": "Text label for the enroll cta when enrollment is not yet opened",
+ "message": "Enrollment will open on {enrollment_start}"
+ },
+ "components.EnrollableCourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
+ "components.EnrollableCourseRunList.selectCourseRun": {
+ "description": "Label displayed when user do not have select a course run.",
+ "message": "Select a course run"
+ },
+ "components.EnrolledCourseRun.goToCourse": {
+ "description": "CTA displayed when user is enrolled to the course run.",
+ "message": "Go to course"
+ },
+ "components.EnrolledCourseRun.unroll": {
+ "description": "Button label to unroll.",
+ "message": "Unroll"
+ },
+ "components.EnrolledCourseRun.unrolling": {
+ "description": "Accessible label displayed when user is being unrolled.",
+ "message": "Unrolling..."
+ },
"components.LanguageSelector.currentlySelected": {
"description": "Accessible hint to mark the currently selected language in the language selector",
"message": "(actualmente seleccionado)"
@@ -83,10 +303,138 @@
"description": "Accessibility helper for pagination, added on the previous page link.",
"message": "Página anterior {page}"
},
+ "components.PaymentButton.errorAbort": {
+ "description": "Error message shown when user aborts the payment.",
+ "message": "Ha cancelado el pago."
+ },
+ "components.PaymentButton.errorAborting": {
+ "description": "Error message shown when user asks to abort the payment.",
+ "message": "Cancelando el pago..."
+ },
+ "components.PaymentButton.errorDefault": {
+ "description": "Error message shown when payment creation request failed.",
+ "message": "Se ha producido un error durante el pago. Vuelva a intentarlo más tarde."
+ },
+ "components.PaymentButton.pay": {
+ "description": "CTA label to proceed to the payment of the product",
+ "message": "Pagar {price}€"
+ },
+ "components.PaymentButton.payInOneClick": {
+ "description": "CTA label to proceed to the one click payment of the product",
+ "message": "Pague en un solo clic {price}"
+ },
+ "components.PaymentButton.paymentInProgress": {
+ "description": "Label for screen reader when a payment is in progress.",
+ "message": "Pago en curso"
+ },
+ "components.PurchasedProductMenu.actionsRelated": {
+ "description": "Accessible label for the purchased product menu",
+ "message": "Other actions related to this product"
+ },
+ "components.PurchasedProductMenu.downloadInvoice": {
+ "description": "Label for selector item to download invoice",
+ "message": "Download invoice"
+ },
+ "components.PurchasedProductMenu.generatingInvoice": {
+ "description": "Accessible label when invoice is being generated",
+ "message": "Invoice is being generated..."
+ },
+ "components.RegisteredCreditCard.expirationDate": {
+ "description": "Credit card expiration date label",
+ "message": "Expiration date: {expirationDate}"
+ },
+ "components.RegisteredCreditCard.inputAriaLabel": {
+ "description": "ARIA Label read by screen reader to inform which card is focused",
+ "message": "{selected, select, true {Unselect} other {Select}} {title}'s card"
+ },
"components.RootSearchSuggestField.searchFieldPlaceholder": {
"description": "Placeholder text displayed in the search field when it is empty.",
"message": "Buscar cursos"
},
+ "components.SaleTunnel.closeDialog": {
+ "description": "ARIA label used by screenreader to inform that the close dialog button is selected",
+ "message": "Close the dialog"
+ },
+ "components.SaleTunnel.loginToPurchase": {
+ "description": "Label displayed inside the product's CTA when user is not logged in",
+ "message": "Login to purchase"
+ },
+ "components.SaleTunnel.stepPayment": {
+ "description": "Label of the Payment step",
+ "message": "Payment"
+ },
+ "components.SaleTunnel.stepResume": {
+ "description": "Label of the Resume step",
+ "message": "Resume"
+ },
+ "components.SaleTunnel.stepValidation": {
+ "description": "Label of the Validation step",
+ "message": "Validation"
+ },
+ "components.SaleTunnelStepPayment.registeredCardSectionTitle": {
+ "description": "Label for the registered credit cards section",
+ "message": "Your registered credit card"
+ },
+ "components.SaleTunnelStepPayment.resumeTile": {
+ "description": "Label for the resume tile",
+ "message": "You are about to purchase"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressAddLabel": {
+ "description": "Label for the billing address add button",
+ "message": "Add an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressCreateLabel": {
+ "description": "Label for the billing address create button",
+ "message": "Create an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressFieldset": {
+ "description": "Label for the billing address fieldset",
+ "message": "Billing address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressNoEntry": {
+ "description": "Message displayed when the user has no address.",
+ "message": "You have not yet a billing address."
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressSelectLabel": {
+ "description": "Label for the billing address select",
+ "message": "Select a billing address"
+ },
+ "components.SaleTunnelStepPayment.userTile": {
+ "description": "Label for the user information tile",
+ "message": "Your personal information"
+ },
+ "components.SaleTunnelStepResume.congratulations": {
+ "description": "Text displayed to thank user for his order",
+ "message": "Congratulations!"
+ },
+ "components.SaleTunnelStepResume.cta": {
+ "description": "Label to the call to action to close sale tunnel",
+ "message": "Start this course now!"
+ },
+ "components.SaleTunnelStepResume.successDetailMessage": {
+ "description": "Text to remind that order's invoice will be send by email soon",
+ "message": "You will receive your invoice by email in a few moments."
+ },
+ "components.SaleTunnelStepResume.successMessage": {
+ "description": "Message to confirm that order has been created",
+ "message": "Your order has been successfully created."
+ },
+ "components.SaleTunnelStepValidation.availableCourseRuns": {
+ "description": "Course runs available text",
+ "message": "{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available"
+ },
+ "components.SaleTunnelStepValidation.courseRunDates": {
+ "description": "Course run date text",
+ "message": "From {start} to {end}"
+ },
+ "components.SaleTunnelStepValidation.includingVAT": {
+ "description": "Text displayed next to the price to mention this is the price including VAT.",
+ "message": "including VAT"
+ },
+ "components.SaleTunnelStepValidation.proceedToPayment": {
+ "description": "CTA to go to payment step",
+ "message": "Proceed to payment"
+ },
"components.Search.errorMessage": {
"description": "Error message for Search view when the request to load courses fails",
"message": "¡Algo está mal! No se han podido cargar los cursos."
@@ -95,6 +443,10 @@
"description": "Accessibility text for the button/icon that toggles *off* the filters pane on mobile",
"message": "Ocultar panel de filtros"
},
+ "components.Search.resultsTitle": {
+ "description": "Title for the search results pane in course search (not shown, made for screen reader users).",
+ "message": "Resultados de búsqueda"
+ },
"components.Search.showFiltersPane": {
"description": "Accessibility text for the button/icon that toggles *on* the filters pane on mobile",
"message": "Mostrar panel de filtros"
diff --git a/src/frontend/i18n/locales/fa-IR.json b/src/frontend/i18n/locales/fa-IR.json
new file mode 100644
index 0000000000..1d8bd9de17
--- /dev/null
+++ b/src/frontend/i18n/locales/fa-IR.json
@@ -0,0 +1,542 @@
+{
+ "components.AddressesManagement.actionCreation": {
+ "description": "Action name for address creation.",
+ "message": "creation"
+ },
+ "components.AddressesManagement.actionDeletion": {
+ "description": "Action name for address deletion.",
+ "message": "deletion"
+ },
+ "components.AddressesManagement.actionPromotion": {
+ "description": "Action name for address promotion.",
+ "message": "promotion"
+ },
+ "components.AddressesManagement.actionUpdate": {
+ "description": "Action name for address update.",
+ "message": "update"
+ },
+ "components.AddressesManagement.addAddress": {
+ "description": "Title of the address creation form",
+ "message": "Add a new address"
+ },
+ "components.AddressesManagement.addressInput": {
+ "description": "Label of the \"address\" input",
+ "message": "Address"
+ },
+ "components.AddressesManagement.cancelButton": {
+ "description": "Label of the cancel button",
+ "message": "Cancel"
+ },
+ "components.AddressesManagement.cancelTitleButton": {
+ "description": "Title of the cancel button",
+ "message": "Cancel edition"
+ },
+ "components.AddressesManagement.cityInput": {
+ "description": "Label of the \"city\" input",
+ "message": "City"
+ },
+ "components.AddressesManagement.closeButton": {
+ "description": "Label of the close button",
+ "message": "Go back"
+ },
+ "components.AddressesManagement.countryInput": {
+ "description": "Label of the \"country\" input",
+ "message": "Country"
+ },
+ "components.AddressesManagement.deleteButton": {
+ "description": "Label of the delete button",
+ "message": "Delete"
+ },
+ "components.AddressesManagement.deleteButtonLabel": {
+ "description": "Title of the delete button",
+ "message": "Delete \"{title}\" address"
+ },
+ "components.AddressesManagement.deletionConfirmation": {
+ "description": "Confirmation message shown to the user when he wants to delete an address",
+ "message": "Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after."
+ },
+ "components.AddressesManagement.editAddress": {
+ "description": "Title of the address edit form",
+ "message": "Update address {title}"
+ },
+ "components.AddressesManagement.editButton": {
+ "description": "Label of the edit button",
+ "message": "Edit"
+ },
+ "components.AddressesManagement.editButtonLabel": {
+ "description": "Title of the edit button",
+ "message": "Edit \"{title}\" address"
+ },
+ "components.AddressesManagement.error": {
+ "description": "Error message shown to the user when address creation/update/deletion request fails.",
+ "message": "An error occurred while address {action}. Please retry later."
+ },
+ "components.AddressesManagement.first_nameInput": {
+ "description": "Label of the \"first_name\" input",
+ "message": "Recipient's first name"
+ },
+ "components.AddressesManagement.last_nameInput": {
+ "description": "Label of the \"last_name\" input",
+ "message": "Recipient's last name"
+ },
+ "components.AddressesManagement.postcodeInput": {
+ "description": "Label of the \"postcode\" input",
+ "message": "Postcode"
+ },
+ "components.AddressesManagement.promoteButtonLabel": {
+ "description": "Title of the button to set the address as the main one",
+ "message": "Define \"{title}\" address as main"
+ },
+ "components.AddressesManagement.registeredAddresses": {
+ "description": "Title of the registered addresses block",
+ "message": "Your addresses"
+ },
+ "components.AddressesManagement.saveInput": {
+ "description": "Label of the \"save\" input",
+ "message": "Save this address"
+ },
+ "components.AddressesManagement.selectButton": {
+ "description": "Label of the select button",
+ "message": "Use this address"
+ },
+ "components.AddressesManagement.selectButtonLabel": {
+ "description": "Title of the select button",
+ "message": "Select \"{title}\" address"
+ },
+ "components.AddressesManagement.titleInput": {
+ "description": "Label of the \"title\" input",
+ "message": "Address title"
+ },
+ "components.AddressesManagement.updateButton": {
+ "description": "Label of the update button",
+ "message": "Update this address"
+ },
+ "components.CourseGlimpse.categoryLabel": {
+ "description": "Category label text for screen reader users",
+ "message": "Category"
+ },
+ "components.CourseGlimpse.codeIconAlt": {
+ "description": "Course code logo alternative text for screen reader users",
+ "message": "Course code"
+ },
+ "components.CourseGlimpse.cover": {
+ "description": "Placeholder text when the course we are glimpsing at is missing a cover image",
+ "message": "Cover"
+ },
+ "components.CourseGlimpse.organizationIconAlt": {
+ "description": "Organization logo alternative text for screen reader users",
+ "message": "Organization"
+ },
+ "components.CourseGlimpseFooter.dateIconAlt": {
+ "description": "Course date logo alternative text for screen reader users",
+ "message": "Course date"
+ },
+ "components.CourseGlimpseList.courseCount": {
+ "description": "Result count & pagination information for course search. Appears right above search results",
+ "message": "Showing {start, number} to {end, number} of {courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search"
+ },
+ "components.CourseGlimpseList.offscreenCourseCount": {
+ "description": "Short result count information for course search. Only for screen readers",
+ "message": "{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search"
+ },
+ "components.CourseProductCertificateItem.certificateExplanation": {
+ "description": "Text displayed when the product certificate has no description",
+ "message": "You will be able to download your certificate once you will pass all course runs."
+ },
+ "components.CourseProductCertificateItem.congratulations": {
+ "description": "Congratulation message when user has passed the course.",
+ "message": "Congratulations, you passed this course!"
+ },
+ "components.CourseProductCertificateItem.download": {
+ "description": "Button label to download the certificate",
+ "message": "Download"
+ },
+ "components.CourseProductCertificateItem.generatingCertificate": {
+ "description": "Accessible label displayed while certificate is being generated.",
+ "message": "Certificate is being generated..."
+ },
+ "components.CourseProductItem.enrolled": {
+ "description": "Message displayed when authenticated user owned the product",
+ "message": "Enrolled"
+ },
+ "components.CourseProductsList.end": {
+ "description": "End label displayed in the header of course run dates section",
+ "message": "End"
+ },
+ "components.CourseProductsList.loadingInitial": {
+ "description": "Accessible text for the initial loading spinner displayed when course is fetching",
+ "message": "Loading course information..."
+ },
+ "components.CourseProductsList.start": {
+ "description": "Start label displayed in the header of course run dates section",
+ "message": "Start"
+ },
+ "components.CourseProductsLists.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseProductsLists.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
+ "components.CourseRunEnrollment.enroll": {
+ "description": "CTA for users who can enroll in the course run or could enroll if they logged in.",
+ "message": "Enroll now"
+ },
+ "components.CourseRunEnrollment.enrolled": {
+ "description": "Help text for users who see the \"Go to course\" CTA on course run enrollment",
+ "message": "You are enrolled in this course run"
+ },
+ "components.CourseRunEnrollment.enrollmentClosed": {
+ "description": "Help text replacing the CTA on a course run when enrollment is closed.",
+ "message": "Enrollment in this course run is closed at the moment"
+ },
+ "components.CourseRunEnrollment.enrollmentFailed": {
+ "description": "Help text below the \"Enroll now\" CTA when an enrollment attempt has already failed.",
+ "message": "Your enrollment request failed."
+ },
+ "components.CourseRunEnrollment.goToCourse": {
+ "description": "CTA for users who are already enrolled in a course run.",
+ "message": "Go to course"
+ },
+ "components.CourseRunEnrollment.loadingInitial": {
+ "description": "Accessible text for the initial loading spinner on the course run enrollment button.",
+ "message": "Loading enrollment information..."
+ },
+ "components.CourseRunEnrollment.loginToEnroll": {
+ "description": "Helper text in the enroll button for non logged in users",
+ "message": "Log in to enroll"
+ },
+ "components.CourseRunList.enrollFromTo": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
+ "components.DesktopUserMenu.menuPurpose": {
+ "description": "Accessible label for user menu button",
+ "message": "Access to your profile settings"
+ },
+ "components.EnrollableCourseRunList.ariaSelectCourseRun": {
+ "description": "Accessible label used by screen reader when user checked a course run radio input.",
+ "message": "Select course run from {start} to {end}."
+ },
+ "components.EnrollableCourseRunList.enroll": {
+ "description": "Text label for the enroll button",
+ "message": "Enroll"
+ },
+ "components.EnrollableCourseRunList.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {enrollment_start} to {enrollment_end}"
+ },
+ "components.EnrollableCourseRunList.enrolling": {
+ "description": "Label displayed when a request to enroll to a course run is loading",
+ "message": "Enrolling..."
+ },
+ "components.EnrollableCourseRunList.enrollmentNotYetOpened": {
+ "description": "Text label for the enroll cta when enrollment is not yet opened",
+ "message": "Enrollment will open on {enrollment_start}"
+ },
+ "components.EnrollableCourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
+ "components.EnrollableCourseRunList.selectCourseRun": {
+ "description": "Label displayed when user do not have select a course run.",
+ "message": "Select a course run"
+ },
+ "components.EnrolledCourseRun.goToCourse": {
+ "description": "CTA displayed when user is enrolled to the course run.",
+ "message": "Go to course"
+ },
+ "components.EnrolledCourseRun.unroll": {
+ "description": "Button label to unroll.",
+ "message": "Unroll"
+ },
+ "components.EnrolledCourseRun.unrolling": {
+ "description": "Accessible label displayed when user is being unrolled.",
+ "message": "Unrolling..."
+ },
+ "components.LanguageSelector.currentlySelected": {
+ "description": "Accessible hint to mark the currently selected language in the language selector",
+ "message": "(currently selected)"
+ },
+ "components.LanguageSelector.languages": {
+ "description": "Default text for the language selector button when the current language cannot be identified",
+ "message": "Languages"
+ },
+ "components.LanguageSelector.selectLanguage": {
+ "description": "Accessible label for the language selector button",
+ "message": "Select a language:"
+ },
+ "components.LanguageSelector.switchToLanguage": {
+ "description": "Accessible link title for the language switching links in language selector",
+ "message": "Switch to {language}"
+ },
+ "components.PaginateCourseSearch.currentlyReadingLastPageN": {
+ "description": "Accessibility helper in pagination, shown next to the current page number when it is the last page.",
+ "message": "Currently reading last page {page}"
+ },
+ "components.PaginateCourseSearch.currentlyReadingPageN": {
+ "description": "Accessibility helper in pagination, shown next to the current page number when it is not the last page.",
+ "message": "Currently reading page {page}"
+ },
+ "components.PaginateCourseSearch.lastPageN": {
+ "description": "Accessibility helper for pagination, added on the last page link.",
+ "message": "Last page {page}"
+ },
+ "components.PaginateCourseSearch.nextPageN": {
+ "description": "Accessibility helper for pagination, added on the next page link.",
+ "message": "Next page {page}"
+ },
+ "components.PaginateCourseSearch.pageN": {
+ "description": "Accessibility helper for pagination, added on all page links for screen readers,\n only shown next to \"page 1\" visually.",
+ "message": "Page {page}"
+ },
+ "components.PaginateCourseSearch.pagination": {
+ "description": "Label for the pagination navigation in course search results.",
+ "message": "Pagination"
+ },
+ "components.PaginateCourseSearch.previousPageN": {
+ "description": "Accessibility helper for pagination, added on the previous page link.",
+ "message": "Previous page {page}"
+ },
+ "components.PaymentButton.errorAbort": {
+ "description": "Error message shown when user aborts the payment.",
+ "message": "You have aborted the payment."
+ },
+ "components.PaymentButton.errorAborting": {
+ "description": "Error message shown when user asks to abort the payment.",
+ "message": "Aborting the payment..."
+ },
+ "components.PaymentButton.errorDefault": {
+ "description": "Error message shown when payment creation request failed.",
+ "message": "An error occurred during payment. Please retry later."
+ },
+ "components.PaymentButton.pay": {
+ "description": "CTA label to proceed to the payment of the product",
+ "message": "Pay {price}"
+ },
+ "components.PaymentButton.payInOneClick": {
+ "description": "CTA label to proceed to the one click payment of the product",
+ "message": "Pay in one click {price}"
+ },
+ "components.PaymentButton.paymentInProgress": {
+ "description": "Label for screen reader when a payment is in progress.",
+ "message": "Payment in progress"
+ },
+ "components.PurchasedProductMenu.actionsRelated": {
+ "description": "Accessible label for the purchased product menu",
+ "message": "Other actions related to this product"
+ },
+ "components.PurchasedProductMenu.downloadInvoice": {
+ "description": "Label for selector item to download invoice",
+ "message": "Download invoice"
+ },
+ "components.PurchasedProductMenu.generatingInvoice": {
+ "description": "Accessible label when invoice is being generated",
+ "message": "Invoice is being generated..."
+ },
+ "components.RegisteredCreditCard.expirationDate": {
+ "description": "Credit card expiration date label",
+ "message": "Expiration date: {expirationDate}"
+ },
+ "components.RegisteredCreditCard.inputAriaLabel": {
+ "description": "ARIA Label read by screen reader to inform which card is focused",
+ "message": "{selected, select, true {Unselect} other {Select}} {title}'s card"
+ },
+ "components.RootSearchSuggestField.searchFieldPlaceholder": {
+ "description": "Placeholder text displayed in the search field when it is empty.",
+ "message": "Search for courses"
+ },
+ "components.SaleTunnel.closeDialog": {
+ "description": "ARIA label used by screenreader to inform that the close dialog button is selected",
+ "message": "Close the dialog"
+ },
+ "components.SaleTunnel.loginToPurchase": {
+ "description": "Label displayed inside the product's CTA when user is not logged in",
+ "message": "Login to purchase"
+ },
+ "components.SaleTunnel.stepPayment": {
+ "description": "Label of the Payment step",
+ "message": "Payment"
+ },
+ "components.SaleTunnel.stepResume": {
+ "description": "Label of the Resume step",
+ "message": "Resume"
+ },
+ "components.SaleTunnel.stepValidation": {
+ "description": "Label of the Validation step",
+ "message": "Validation"
+ },
+ "components.SaleTunnelStepPayment.registeredCardSectionTitle": {
+ "description": "Label for the registered credit cards section",
+ "message": "Your registered credit card"
+ },
+ "components.SaleTunnelStepPayment.resumeTile": {
+ "description": "Label for the resume tile",
+ "message": "You are about to purchase"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressAddLabel": {
+ "description": "Label for the billing address add button",
+ "message": "Add an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressCreateLabel": {
+ "description": "Label for the billing address create button",
+ "message": "Create an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressFieldset": {
+ "description": "Label for the billing address fieldset",
+ "message": "Billing address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressNoEntry": {
+ "description": "Message displayed when the user has no address.",
+ "message": "You have not yet a billing address."
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressSelectLabel": {
+ "description": "Label for the billing address select",
+ "message": "Select a billing address"
+ },
+ "components.SaleTunnelStepPayment.userTile": {
+ "description": "Label for the user information tile",
+ "message": "Your personal information"
+ },
+ "components.SaleTunnelStepResume.congratulations": {
+ "description": "Text displayed to thank user for his order",
+ "message": "Congratulations!"
+ },
+ "components.SaleTunnelStepResume.cta": {
+ "description": "Label to the call to action to close sale tunnel",
+ "message": "Start this course now!"
+ },
+ "components.SaleTunnelStepResume.successDetailMessage": {
+ "description": "Text to remind that order's invoice will be send by email soon",
+ "message": "You will receive your invoice by email in a few moments."
+ },
+ "components.SaleTunnelStepResume.successMessage": {
+ "description": "Message to confirm that order has been created",
+ "message": "Your order has been successfully created."
+ },
+ "components.SaleTunnelStepValidation.availableCourseRuns": {
+ "description": "Course runs available text",
+ "message": "{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available"
+ },
+ "components.SaleTunnelStepValidation.courseRunDates": {
+ "description": "Course run date text",
+ "message": "From {start} to {end}"
+ },
+ "components.SaleTunnelStepValidation.includingVAT": {
+ "description": "Text displayed next to the price to mention this is the price including VAT.",
+ "message": "including VAT"
+ },
+ "components.SaleTunnelStepValidation.proceedToPayment": {
+ "description": "CTA to go to payment step",
+ "message": "Proceed to payment"
+ },
+ "components.Search.errorMessage": {
+ "description": "Error message for Search view when the request to load courses fails",
+ "message": "Something's wrong! Courses could not be loaded."
+ },
+ "components.Search.hideFiltersPane": {
+ "description": "Accessibility text for the button/icon that toggles *off* the filters pane on mobile",
+ "message": "Hide filters pane"
+ },
+ "components.Search.resultsTitle": {
+ "description": "Title for the search results pane in course search (not shown, made for screen reader users).",
+ "message": "Search results"
+ },
+ "components.Search.showFiltersPane": {
+ "description": "Accessibility text for the button/icon that toggles *on* the filters pane on mobile",
+ "message": "Show filters pane"
+ },
+ "components.Search.spinnerText": {
+ "description": "Accessibility text for the spinner while search results are being loaded",
+ "message": "Loading search results..."
+ },
+ "components.Search.textQueryLengthWarning": {
+ "description": "Warning message in search results when the text query is not long enough to be used.",
+ "message": "Text search requires at least 3 characters. { query } is not long enough to search. Search results will not be affected by this query."
+ },
+ "components.SearchFilterGroupModal.closeModal": {
+ "description": "Text for the button to close the search filters modal",
+ "message": "Close modal"
+ },
+ "components.SearchFilterGroupModal.error": {
+ "description": "Error message when the search for more filter value fails in the search filters modal.",
+ "message": "There was an error while searching for {filterName}."
+ },
+ "components.SearchFilterGroupModal.inputLabel": {
+ "description": "Accessible label for the search input in the search filter modal.",
+ "message": "Search for filters to add"
+ },
+ "components.SearchFilterGroupModal.inputPlaceholder": {
+ "description": "Placeholder message for the search input in the search filter modal.",
+ "message": "Search in { filterName }"
+ },
+ "components.SearchFilterGroupModal.loadMoreResults": {
+ "description": "Button to manually load more results for the current active filter",
+ "message": "Load more results"
+ },
+ "components.SearchFilterGroupModal.loadingResults": {
+ "description": "Loading message while loading more results in the search filter modal.",
+ "message": "Loading search results..."
+ },
+ "components.SearchFilterGroupModal.modalTitle": {
+ "description": "Title for the modal to add more filter values in the search filters modal.",
+ "message": "Add filters for {filterName}"
+ },
+ "components.SearchFilterGroupModal.moreOptionsButton": {
+ "description": "Test for the button to see more filter values than the top N that appear by default.",
+ "message": "More options"
+ },
+ "components.SearchFilterGroupModal.queryTooShort": {
+ "description": "Users need to enter at least 3 characters to search for more filter values; this message informs them when they start typing.",
+ "message": "Type at least 3 characters to start searching."
+ },
+ "components.SearchFilterValueParent.ariaHideChildren": {
+ "description": "Accessibility message for the button to hide children of the current filter",
+ "message": "Hide additional filters for {filterValueName}"
+ },
+ "components.SearchFilterValueParent.ariaShowChildren": {
+ "description": "Accessibility message for the button to show children of the current filter",
+ "message": "Show more filters for {filterValueName}"
+ },
+ "components.SearchFiltersPane.clearFilters": {
+ "description": "Helper button in search filters pane in search page to remove all active filters",
+ "message": "Clear {activeFilterCount, number} active {activeFilterCount, plural, one {filter} other {filters}}"
+ },
+ "components.SearchFiltersPane.title": {
+ "description": "Title for the search filters pane in course search.",
+ "message": "Filter courses"
+ },
+ "components.SearchInput.button": {
+ "description": "Accessibility text for the search button inside the Search input.",
+ "message": "Search"
+ },
+ "components.SearchSuggestField.searchFieldPlaceholder": {
+ "description": "Placeholder text displayed in the search field when it is empty.",
+ "message": "Search for courses, organizations, categories"
+ },
+ "components.UserLogin.logIn": {
+ "description": "Text for the login button.",
+ "message": "Log in"
+ },
+ "components.UserLogin.logOut": {
+ "description": "Text for the logout button.",
+ "message": "Log out"
+ },
+ "components.UserLogin.signup": {
+ "description": "Text for the signup button.",
+ "message": "Sign up"
+ },
+ "components.UserLogin.spinnerText": {
+ "description": "Accessibility text for the spinner in the login area.",
+ "message": "Loading login status..."
+ },
+ "components.useStaticFilters.courses": {
+ "description": "localized human_name label for coursesConfig filter name",
+ "message": "Courses"
+ }
+}
diff --git a/src/frontend/i18n/locales/fr-CA.json b/src/frontend/i18n/locales/fr-CA.json
index 50ab26a112..9437fa4ad2 100644
--- a/src/frontend/i18n/locales/fr-CA.json
+++ b/src/frontend/i18n/locales/fr-CA.json
@@ -1,12 +1,184 @@
{
+ "components.AddressesManagement.actionCreation": {
+ "description": "Action name for address creation.",
+ "message": "creation"
+ },
+ "components.AddressesManagement.actionDeletion": {
+ "description": "Action name for address deletion.",
+ "message": "deletion"
+ },
+ "components.AddressesManagement.actionPromotion": {
+ "description": "Action name for address promotion.",
+ "message": "promotion"
+ },
+ "components.AddressesManagement.actionUpdate": {
+ "description": "Action name for address update.",
+ "message": "update"
+ },
+ "components.AddressesManagement.addAddress": {
+ "description": "Title of the address creation form",
+ "message": "Add a new address"
+ },
+ "components.AddressesManagement.addressInput": {
+ "description": "Label of the \"address\" input",
+ "message": "Address"
+ },
+ "components.AddressesManagement.cancelButton": {
+ "description": "Label of the cancel button",
+ "message": "Cancel"
+ },
+ "components.AddressesManagement.cancelTitleButton": {
+ "description": "Title of the cancel button",
+ "message": "Cancel edition"
+ },
+ "components.AddressesManagement.cityInput": {
+ "description": "Label of the \"city\" input",
+ "message": "City"
+ },
+ "components.AddressesManagement.closeButton": {
+ "description": "Label of the close button",
+ "message": "Go back"
+ },
+ "components.AddressesManagement.countryInput": {
+ "description": "Label of the \"country\" input",
+ "message": "Country"
+ },
+ "components.AddressesManagement.deleteButton": {
+ "description": "Label of the delete button",
+ "message": "Delete"
+ },
+ "components.AddressesManagement.deleteButtonLabel": {
+ "description": "Title of the delete button",
+ "message": "Delete \"{title}\" address"
+ },
+ "components.AddressesManagement.deletionConfirmation": {
+ "description": "Confirmation message shown to the user when he wants to delete an address",
+ "message": "Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after."
+ },
+ "components.AddressesManagement.editAddress": {
+ "description": "Title of the address edit form",
+ "message": "Update address {title}"
+ },
+ "components.AddressesManagement.editButton": {
+ "description": "Label of the edit button",
+ "message": "Edit"
+ },
+ "components.AddressesManagement.editButtonLabel": {
+ "description": "Title of the edit button",
+ "message": "Edit \"{title}\" address"
+ },
+ "components.AddressesManagement.error": {
+ "description": "Error message shown to the user when address creation/update/deletion request fails.",
+ "message": "An error occurred while address {action}. Please retry later."
+ },
+ "components.AddressesManagement.first_nameInput": {
+ "description": "Label of the \"first_name\" input",
+ "message": "Recipient's first name"
+ },
+ "components.AddressesManagement.last_nameInput": {
+ "description": "Label of the \"last_name\" input",
+ "message": "Recipient's last name"
+ },
+ "components.AddressesManagement.postcodeInput": {
+ "description": "Label of the \"postcode\" input",
+ "message": "Postcode"
+ },
+ "components.AddressesManagement.promoteButtonLabel": {
+ "description": "Title of the button to set the address as the main one",
+ "message": "Define \"{title}\" address as main"
+ },
+ "components.AddressesManagement.registeredAddresses": {
+ "description": "Title of the registered addresses block",
+ "message": "Your addresses"
+ },
+ "components.AddressesManagement.saveInput": {
+ "description": "Label of the \"save\" input",
+ "message": "Save this address"
+ },
+ "components.AddressesManagement.selectButton": {
+ "description": "Label of the select button",
+ "message": "Use this address"
+ },
+ "components.AddressesManagement.selectButtonLabel": {
+ "description": "Title of the select button",
+ "message": "Select \"{title}\" address"
+ },
+ "components.AddressesManagement.titleInput": {
+ "description": "Label of the \"title\" input",
+ "message": "Address title"
+ },
+ "components.AddressesManagement.updateButton": {
+ "description": "Label of the update button",
+ "message": "Update this address"
+ },
+ "components.CourseGlimpse.categoryLabel": {
+ "description": "Category label text for screen reader users",
+ "message": "Category"
+ },
+ "components.CourseGlimpse.codeIconAlt": {
+ "description": "Course code logo alternative text for screen reader users",
+ "message": "Course code"
+ },
"components.CourseGlimpse.cover": {
"description": "Placeholder text when the course we are glimpsing at is missing a cover image",
"message": "Couverture"
},
+ "components.CourseGlimpse.organizationIconAlt": {
+ "description": "Organization logo alternative text for screen reader users",
+ "message": "Organization"
+ },
+ "components.CourseGlimpseFooter.dateIconAlt": {
+ "description": "Course date logo alternative text for screen reader users",
+ "message": "Course date"
+ },
"components.CourseGlimpseList.courseCount": {
"description": "Result count & pagination information for course search. Appears right above search results",
"message": "Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche"
},
+ "components.CourseGlimpseList.offscreenCourseCount": {
+ "description": "Short result count information for course search. Only for screen readers",
+ "message": "{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search"
+ },
+ "components.CourseProductCertificateItem.certificateExplanation": {
+ "description": "Text displayed when the product certificate has no description",
+ "message": "You will be able to download your certificate once you will pass all course runs."
+ },
+ "components.CourseProductCertificateItem.congratulations": {
+ "description": "Congratulation message when user has passed the course.",
+ "message": "Congratulations, you passed this course!"
+ },
+ "components.CourseProductCertificateItem.download": {
+ "description": "Button label to download the certificate",
+ "message": "Download"
+ },
+ "components.CourseProductCertificateItem.generatingCertificate": {
+ "description": "Accessible label displayed while certificate is being generated.",
+ "message": "Certificate is being generated..."
+ },
+ "components.CourseProductItem.enrolled": {
+ "description": "Message displayed when authenticated user owned the product",
+ "message": "Enrolled"
+ },
+ "components.CourseProductsList.end": {
+ "description": "End label displayed in the header of course run dates section",
+ "message": "End"
+ },
+ "components.CourseProductsList.loadingInitial": {
+ "description": "Accessible text for the initial loading spinner displayed when course is fetching",
+ "message": "Loading course information..."
+ },
+ "components.CourseProductsList.start": {
+ "description": "Start label displayed in the header of course run dates section",
+ "message": "Start"
+ },
+ "components.CourseProductsLists.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseProductsLists.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
"components.CourseRunEnrollment.enroll": {
"description": "CTA for users who can enroll in the course run or could enroll if they logged in.",
"message": "S’inscrire maintenant"
@@ -35,10 +207,58 @@
"description": "Helper text in the enroll button for non logged in users",
"message": "Connectez-vous pour vous inscrire"
},
+ "components.CourseRunList.enrollFromTo": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
"components.DesktopUserMenu.menuPurpose": {
"description": "Accessible label for user menu button",
"message": "Accéder aux préférences de votre profil"
},
+ "components.EnrollableCourseRunList.ariaSelectCourseRun": {
+ "description": "Accessible label used by screen reader when user checked a course run radio input.",
+ "message": "Select course run from {start} to {end}."
+ },
+ "components.EnrollableCourseRunList.enroll": {
+ "description": "Text label for the enroll button",
+ "message": "Enroll"
+ },
+ "components.EnrollableCourseRunList.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {enrollment_start} to {enrollment_end}"
+ },
+ "components.EnrollableCourseRunList.enrolling": {
+ "description": "Label displayed when a request to enroll to a course run is loading",
+ "message": "Enrolling..."
+ },
+ "components.EnrollableCourseRunList.enrollmentNotYetOpened": {
+ "description": "Text label for the enroll cta when enrollment is not yet opened",
+ "message": "Enrollment will open on {enrollment_start}"
+ },
+ "components.EnrollableCourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
+ "components.EnrollableCourseRunList.selectCourseRun": {
+ "description": "Label displayed when user do not have select a course run.",
+ "message": "Select a course run"
+ },
+ "components.EnrolledCourseRun.goToCourse": {
+ "description": "CTA displayed when user is enrolled to the course run.",
+ "message": "Go to course"
+ },
+ "components.EnrolledCourseRun.unroll": {
+ "description": "Button label to unroll.",
+ "message": "Unroll"
+ },
+ "components.EnrolledCourseRun.unrolling": {
+ "description": "Accessible label displayed when user is being unrolled.",
+ "message": "Unrolling..."
+ },
"components.LanguageSelector.currentlySelected": {
"description": "Accessible hint to mark the currently selected language in the language selector",
"message": "(actuellement sélectionné)"
@@ -83,10 +303,138 @@
"description": "Accessibility helper for pagination, added on the previous page link.",
"message": "Page précédente: {page}"
},
+ "components.PaymentButton.errorAbort": {
+ "description": "Error message shown when user aborts the payment.",
+ "message": "Vous avez annulé le paiement."
+ },
+ "components.PaymentButton.errorAborting": {
+ "description": "Error message shown when user asks to abort the payment.",
+ "message": "Paiement en cours d'annulation..."
+ },
+ "components.PaymentButton.errorDefault": {
+ "description": "Error message shown when payment creation request failed.",
+ "message": "Une erreur s'est produite lors du paiement. Veuillez réessayer plus tard."
+ },
+ "components.PaymentButton.pay": {
+ "description": "CTA label to proceed to the payment of the product",
+ "message": "Payer {price}"
+ },
+ "components.PaymentButton.payInOneClick": {
+ "description": "CTA label to proceed to the one click payment of the product",
+ "message": "Payer en un clic {price}"
+ },
+ "components.PaymentButton.paymentInProgress": {
+ "description": "Label for screen reader when a payment is in progress.",
+ "message": "Paiement en cours"
+ },
+ "components.PurchasedProductMenu.actionsRelated": {
+ "description": "Accessible label for the purchased product menu",
+ "message": "Other actions related to this product"
+ },
+ "components.PurchasedProductMenu.downloadInvoice": {
+ "description": "Label for selector item to download invoice",
+ "message": "Download invoice"
+ },
+ "components.PurchasedProductMenu.generatingInvoice": {
+ "description": "Accessible label when invoice is being generated",
+ "message": "Invoice is being generated..."
+ },
+ "components.RegisteredCreditCard.expirationDate": {
+ "description": "Credit card expiration date label",
+ "message": "Expiration date: {expirationDate}"
+ },
+ "components.RegisteredCreditCard.inputAriaLabel": {
+ "description": "ARIA Label read by screen reader to inform which card is focused",
+ "message": "{selected, select, true {Unselect} other {Select}} {title}'s card"
+ },
"components.RootSearchSuggestField.searchFieldPlaceholder": {
"description": "Placeholder text displayed in the search field when it is empty.",
"message": "Recherche de cours"
},
+ "components.SaleTunnel.closeDialog": {
+ "description": "ARIA label used by screenreader to inform that the close dialog button is selected",
+ "message": "Close the dialog"
+ },
+ "components.SaleTunnel.loginToPurchase": {
+ "description": "Label displayed inside the product's CTA when user is not logged in",
+ "message": "Login to purchase"
+ },
+ "components.SaleTunnel.stepPayment": {
+ "description": "Label of the Payment step",
+ "message": "Payment"
+ },
+ "components.SaleTunnel.stepResume": {
+ "description": "Label of the Resume step",
+ "message": "Resume"
+ },
+ "components.SaleTunnel.stepValidation": {
+ "description": "Label of the Validation step",
+ "message": "Validation"
+ },
+ "components.SaleTunnelStepPayment.registeredCardSectionTitle": {
+ "description": "Label for the registered credit cards section",
+ "message": "Your registered credit card"
+ },
+ "components.SaleTunnelStepPayment.resumeTile": {
+ "description": "Label for the resume tile",
+ "message": "You are about to purchase"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressAddLabel": {
+ "description": "Label for the billing address add button",
+ "message": "Add an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressCreateLabel": {
+ "description": "Label for the billing address create button",
+ "message": "Create an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressFieldset": {
+ "description": "Label for the billing address fieldset",
+ "message": "Billing address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressNoEntry": {
+ "description": "Message displayed when the user has no address.",
+ "message": "You have not yet a billing address."
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressSelectLabel": {
+ "description": "Label for the billing address select",
+ "message": "Select a billing address"
+ },
+ "components.SaleTunnelStepPayment.userTile": {
+ "description": "Label for the user information tile",
+ "message": "Your personal information"
+ },
+ "components.SaleTunnelStepResume.congratulations": {
+ "description": "Text displayed to thank user for his order",
+ "message": "Congratulations!"
+ },
+ "components.SaleTunnelStepResume.cta": {
+ "description": "Label to the call to action to close sale tunnel",
+ "message": "Start this course now!"
+ },
+ "components.SaleTunnelStepResume.successDetailMessage": {
+ "description": "Text to remind that order's invoice will be send by email soon",
+ "message": "You will receive your invoice by email in a few moments."
+ },
+ "components.SaleTunnelStepResume.successMessage": {
+ "description": "Message to confirm that order has been created",
+ "message": "Your order has been successfully created."
+ },
+ "components.SaleTunnelStepValidation.availableCourseRuns": {
+ "description": "Course runs available text",
+ "message": "{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available"
+ },
+ "components.SaleTunnelStepValidation.courseRunDates": {
+ "description": "Course run date text",
+ "message": "From {start} to {end}"
+ },
+ "components.SaleTunnelStepValidation.includingVAT": {
+ "description": "Text displayed next to the price to mention this is the price including VAT.",
+ "message": "including VAT"
+ },
+ "components.SaleTunnelStepValidation.proceedToPayment": {
+ "description": "CTA to go to payment step",
+ "message": "Proceed to payment"
+ },
"components.Search.errorMessage": {
"description": "Error message for Search view when the request to load courses fails",
"message": "Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés."
@@ -95,6 +443,10 @@
"description": "Accessibility text for the button/icon that toggles *off* the filters pane on mobile",
"message": "Cacher le menu des filtres"
},
+ "components.Search.resultsTitle": {
+ "description": "Title for the search results pane in course search (not shown, made for screen reader users).",
+ "message": "Résultats de recherche"
+ },
"components.Search.showFiltersPane": {
"description": "Accessibility text for the button/icon that toggles *on* the filters pane on mobile",
"message": "Montrer le menu des filtres"
diff --git a/src/frontend/i18n/locales/fr-FR.json b/src/frontend/i18n/locales/fr-FR.json
index 4a3eb9124f..501ac0f43f 100644
--- a/src/frontend/i18n/locales/fr-FR.json
+++ b/src/frontend/i18n/locales/fr-FR.json
@@ -1,12 +1,184 @@
{
+ "components.AddressesManagement.actionCreation": {
+ "description": "Action name for address creation.",
+ "message": "création"
+ },
+ "components.AddressesManagement.actionDeletion": {
+ "description": "Action name for address deletion.",
+ "message": "suppression"
+ },
+ "components.AddressesManagement.actionPromotion": {
+ "description": "Action name for address promotion.",
+ "message": "promotion"
+ },
+ "components.AddressesManagement.actionUpdate": {
+ "description": "Action name for address update.",
+ "message": "mise à jour"
+ },
+ "components.AddressesManagement.addAddress": {
+ "description": "Title of the address creation form",
+ "message": "Ajouter une nouvelle adresse"
+ },
+ "components.AddressesManagement.addressInput": {
+ "description": "Label of the \"address\" input",
+ "message": "Adresse"
+ },
+ "components.AddressesManagement.cancelButton": {
+ "description": "Label of the cancel button",
+ "message": "Annuler"
+ },
+ "components.AddressesManagement.cancelTitleButton": {
+ "description": "Title of the cancel button",
+ "message": "Annuler la modification"
+ },
+ "components.AddressesManagement.cityInput": {
+ "description": "Label of the \"city\" input",
+ "message": "Ville"
+ },
+ "components.AddressesManagement.closeButton": {
+ "description": "Label of the close button",
+ "message": "Retour"
+ },
+ "components.AddressesManagement.countryInput": {
+ "description": "Label of the \"country\" input",
+ "message": "Pays"
+ },
+ "components.AddressesManagement.deleteButton": {
+ "description": "Label of the delete button",
+ "message": "Supprimer"
+ },
+ "components.AddressesManagement.deleteButtonLabel": {
+ "description": "Title of the delete button",
+ "message": "Supprimer l'adresse \"{title}\""
+ },
+ "components.AddressesManagement.deletionConfirmation": {
+ "description": "Confirmation message shown to the user when he wants to delete an address",
+ "message": "Êtes-vous sûr de vouloir supprimer l'adresse \"{title}\" ? ⚠️ Vous ne pourrez pas annuler ce changement après."
+ },
+ "components.AddressesManagement.editAddress": {
+ "description": "Title of the address edit form",
+ "message": "Mettre à jour l'adresse {title}"
+ },
+ "components.AddressesManagement.editButton": {
+ "description": "Label of the edit button",
+ "message": "Modifier"
+ },
+ "components.AddressesManagement.editButtonLabel": {
+ "description": "Title of the edit button",
+ "message": "Modifier l'adresse \"{title}\""
+ },
+ "components.AddressesManagement.error": {
+ "description": "Error message shown to the user when address creation/update/deletion request fails.",
+ "message": "Une erreur s'est produire lors de la {action} de l'adresse. Veuillez réessayer plus tard."
+ },
+ "components.AddressesManagement.first_nameInput": {
+ "description": "Label of the \"first_name\" input",
+ "message": "Prénom du destinataire"
+ },
+ "components.AddressesManagement.last_nameInput": {
+ "description": "Label of the \"last_name\" input",
+ "message": "Nom du destinataire"
+ },
+ "components.AddressesManagement.postcodeInput": {
+ "description": "Label of the \"postcode\" input",
+ "message": "Code postal"
+ },
+ "components.AddressesManagement.promoteButtonLabel": {
+ "description": "Title of the button to set the address as the main one",
+ "message": "Utiliser l'adresse \"{title}\" comme adresse principale"
+ },
+ "components.AddressesManagement.registeredAddresses": {
+ "description": "Title of the registered addresses block",
+ "message": "Vos adresses"
+ },
+ "components.AddressesManagement.saveInput": {
+ "description": "Label of the \"save\" input",
+ "message": "Sauvegarder cette adresse"
+ },
+ "components.AddressesManagement.selectButton": {
+ "description": "Label of the select button",
+ "message": "Utiliser cette adresse"
+ },
+ "components.AddressesManagement.selectButtonLabel": {
+ "description": "Title of the select button",
+ "message": "Sélectionner l'adresse \"{title}\""
+ },
+ "components.AddressesManagement.titleInput": {
+ "description": "Label of the \"title\" input",
+ "message": "Titre de l'adresse"
+ },
+ "components.AddressesManagement.updateButton": {
+ "description": "Label of the update button",
+ "message": "Mettre à jour cette adresse"
+ },
+ "components.CourseGlimpse.categoryLabel": {
+ "description": "Category label text for screen reader users",
+ "message": "Catégorie"
+ },
+ "components.CourseGlimpse.codeIconAlt": {
+ "description": "Course code logo alternative text for screen reader users",
+ "message": "Code du cours"
+ },
"components.CourseGlimpse.cover": {
"description": "Placeholder text when the course we are glimpsing at is missing a cover image",
"message": "Couverture"
},
+ "components.CourseGlimpse.organizationIconAlt": {
+ "description": "Organization logo alternative text for screen reader users",
+ "message": "Établissement"
+ },
+ "components.CourseGlimpseFooter.dateIconAlt": {
+ "description": "Course date logo alternative text for screen reader users",
+ "message": "Date du cours"
+ },
"components.CourseGlimpseList.courseCount": {
"description": "Result count & pagination information for course search. Appears right above search results",
"message": "Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche"
},
+ "components.CourseGlimpseList.offscreenCourseCount": {
+ "description": "Short result count information for course search. Only for screen readers",
+ "message": "{courseCount, number} {courseCount, plural, one {cours correspond} other {cours correspondent}} à votre recherche"
+ },
+ "components.CourseProductCertificateItem.certificateExplanation": {
+ "description": "Text displayed when the product certificate has no description",
+ "message": "Vous pourrez télécharger votre certificat une fois que vous aurez réussi toutes les sessions."
+ },
+ "components.CourseProductCertificateItem.congratulations": {
+ "description": "Congratulation message when user has passed the course.",
+ "message": "Félicitations, vous avez terminé ce cours !"
+ },
+ "components.CourseProductCertificateItem.download": {
+ "description": "Button label to download the certificate",
+ "message": "Télécharger"
+ },
+ "components.CourseProductCertificateItem.generatingCertificate": {
+ "description": "Accessible label displayed while certificate is being generated.",
+ "message": "Certificat en cours de génération..."
+ },
+ "components.CourseProductItem.enrolled": {
+ "description": "Message displayed when authenticated user owned the product",
+ "message": "Inscrit"
+ },
+ "components.CourseProductsList.end": {
+ "description": "End label displayed in the header of course run dates section",
+ "message": "Fin"
+ },
+ "components.CourseProductsList.loadingInitial": {
+ "description": "Accessible text for the initial loading spinner displayed when course is fetching",
+ "message": "Chargement des informations du cours..."
+ },
+ "components.CourseProductsList.start": {
+ "description": "Start label displayed in the header of course run dates section",
+ "message": "Début"
+ },
+ "components.CourseProductsLists.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Inscription du {start} au {end}"
+ },
+ "components.CourseProductsLists.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "Aucune session disponible pour ce cours."
+ },
"components.CourseRunEnrollment.enroll": {
"description": "CTA for users who can enroll in the course run or could enroll if they logged in.",
"message": "S’inscrire maintenant"
@@ -35,10 +207,58 @@
"description": "Helper text in the enroll button for non logged in users",
"message": "Connectez-vous pour vous inscrire"
},
+ "components.CourseRunList.enrollFromTo": {
+ "description": "Text label for the enrollment dates",
+ "message": "Inscription du {start} au {end}"
+ },
+ "components.CourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "Aucune session disponible pour ce cours."
+ },
"components.DesktopUserMenu.menuPurpose": {
"description": "Accessible label for user menu button",
"message": "Accéder aux préférences de votre profil"
},
+ "components.EnrollableCourseRunList.ariaSelectCourseRun": {
+ "description": "Accessible label used by screen reader when user checked a course run radio input.",
+ "message": "Sélectionnez le cours se déroulant du {start} au {end}."
+ },
+ "components.EnrollableCourseRunList.enroll": {
+ "description": "Text label for the enroll button",
+ "message": "S'inscrire"
+ },
+ "components.EnrollableCourseRunList.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Inscription du {enrollment_start} au {enrollment_end}"
+ },
+ "components.EnrollableCourseRunList.enrolling": {
+ "description": "Label displayed when a request to enroll to a course run is loading",
+ "message": "Inscription en cours..."
+ },
+ "components.EnrollableCourseRunList.enrollmentNotYetOpened": {
+ "description": "Text label for the enroll cta when enrollment is not yet opened",
+ "message": "Les inscriptions ouvriront le {enrollment_start}"
+ },
+ "components.EnrollableCourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "Aucune session disponible pour ce cours."
+ },
+ "components.EnrollableCourseRunList.selectCourseRun": {
+ "description": "Label displayed when user do not have select a course run.",
+ "message": "Sélectionnez une session"
+ },
+ "components.EnrolledCourseRun.goToCourse": {
+ "description": "CTA displayed when user is enrolled to the course run.",
+ "message": "Accéder au cours"
+ },
+ "components.EnrolledCourseRun.unroll": {
+ "description": "Button label to unroll.",
+ "message": "Se désinscrire"
+ },
+ "components.EnrolledCourseRun.unrolling": {
+ "description": "Accessible label displayed when user is being unrolled.",
+ "message": "Unrolling..."
+ },
"components.LanguageSelector.currentlySelected": {
"description": "Accessible hint to mark the currently selected language in the language selector",
"message": "(actuellement sélectionné)"
@@ -83,10 +303,138 @@
"description": "Accessibility helper for pagination, added on the previous page link.",
"message": "Page précédente: {page}"
},
+ "components.PaymentButton.errorAbort": {
+ "description": "Error message shown when user aborts the payment.",
+ "message": "Vous avez annulé le paiement."
+ },
+ "components.PaymentButton.errorAborting": {
+ "description": "Error message shown when user asks to abort the payment.",
+ "message": "Paiement en cours d'annulation..."
+ },
+ "components.PaymentButton.errorDefault": {
+ "description": "Error message shown when payment creation request failed.",
+ "message": "Une erreur s'est produite lors du paiement. Veuillez réessayer plus tard."
+ },
+ "components.PaymentButton.pay": {
+ "description": "CTA label to proceed to the payment of the product",
+ "message": "Payer {price}"
+ },
+ "components.PaymentButton.payInOneClick": {
+ "description": "CTA label to proceed to the one click payment of the product",
+ "message": "Payer en un clic {price}"
+ },
+ "components.PaymentButton.paymentInProgress": {
+ "description": "Label for screen reader when a payment is in progress.",
+ "message": "Paiement en cours"
+ },
+ "components.PurchasedProductMenu.actionsRelated": {
+ "description": "Accessible label for the purchased product menu",
+ "message": "Autres actions liées à ce produit"
+ },
+ "components.PurchasedProductMenu.downloadInvoice": {
+ "description": "Label for selector item to download invoice",
+ "message": "Télécharger la facture"
+ },
+ "components.PurchasedProductMenu.generatingInvoice": {
+ "description": "Accessible label when invoice is being generated",
+ "message": "La facture est en cours de génération..."
+ },
+ "components.RegisteredCreditCard.expirationDate": {
+ "description": "Credit card expiration date label",
+ "message": "Date d'expiration : {expirationDate}"
+ },
+ "components.RegisteredCreditCard.inputAriaLabel": {
+ "description": "ARIA Label read by screen reader to inform which card is focused",
+ "message": "{selected, select, true {Déselectionner} other {Sélectionner}} la carte {title}"
+ },
"components.RootSearchSuggestField.searchFieldPlaceholder": {
"description": "Placeholder text displayed in the search field when it is empty.",
"message": "Recherche de cours"
},
+ "components.SaleTunnel.closeDialog": {
+ "description": "ARIA label used by screenreader to inform that the close dialog button is selected",
+ "message": "Fermer la fenêtre de dialogue"
+ },
+ "components.SaleTunnel.loginToPurchase": {
+ "description": "Label displayed inside the product's CTA when user is not logged in",
+ "message": "Connectez-vous pour acheter"
+ },
+ "components.SaleTunnel.stepPayment": {
+ "description": "Label of the Payment step",
+ "message": "Paiement"
+ },
+ "components.SaleTunnel.stepResume": {
+ "description": "Label of the Resume step",
+ "message": "Continuer"
+ },
+ "components.SaleTunnel.stepValidation": {
+ "description": "Label of the Validation step",
+ "message": "Validation"
+ },
+ "components.SaleTunnelStepPayment.registeredCardSectionTitle": {
+ "description": "Label for the registered credit cards section",
+ "message": "Vos cartes enregistrées"
+ },
+ "components.SaleTunnelStepPayment.resumeTile": {
+ "description": "Label for the resume tile",
+ "message": "Vous êtes sur le point d'acheter"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressAddLabel": {
+ "description": "Label for the billing address add button",
+ "message": "Ajouter une adresse"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressCreateLabel": {
+ "description": "Label for the billing address create button",
+ "message": "Créer une adresse"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressFieldset": {
+ "description": "Label for the billing address fieldset",
+ "message": "Adresse de facturation"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressNoEntry": {
+ "description": "Message displayed when the user has no address.",
+ "message": "You have not yet a billing address."
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressSelectLabel": {
+ "description": "Label for the billing address select",
+ "message": "Sélectionner une adresse de facturation"
+ },
+ "components.SaleTunnelStepPayment.userTile": {
+ "description": "Label for the user information tile",
+ "message": "Vos informations personnelles"
+ },
+ "components.SaleTunnelStepResume.congratulations": {
+ "description": "Text displayed to thank user for his order",
+ "message": "Félicitations !"
+ },
+ "components.SaleTunnelStepResume.cta": {
+ "description": "Label to the call to action to close sale tunnel",
+ "message": "Commencer ce cours dès maintenant !"
+ },
+ "components.SaleTunnelStepResume.successDetailMessage": {
+ "description": "Text to remind that order's invoice will be send by email soon",
+ "message": "Vous allez recevoir votre facture par mail dans quelques instants."
+ },
+ "components.SaleTunnelStepResume.successMessage": {
+ "description": "Message to confirm that order has been created",
+ "message": "Votre commande a été créée avec succès."
+ },
+ "components.SaleTunnelStepValidation.availableCourseRuns": {
+ "description": "Course runs available text",
+ "message": "{ count, plural, =0 {Aucune session disponible} one {Une session disponible} other {# sessions disponibles}}"
+ },
+ "components.SaleTunnelStepValidation.courseRunDates": {
+ "description": "Course run date text",
+ "message": "Du {start} au {end}"
+ },
+ "components.SaleTunnelStepValidation.includingVAT": {
+ "description": "Text displayed next to the price to mention this is the price including VAT.",
+ "message": "TTC"
+ },
+ "components.SaleTunnelStepValidation.proceedToPayment": {
+ "description": "CTA to go to payment step",
+ "message": "Procéder au paiement"
+ },
"components.Search.errorMessage": {
"description": "Error message for Search view when the request to load courses fails",
"message": "Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés."
@@ -95,6 +443,10 @@
"description": "Accessibility text for the button/icon that toggles *off* the filters pane on mobile",
"message": "Cacher le menu des filtres"
},
+ "components.Search.resultsTitle": {
+ "description": "Title for the search results pane in course search (not shown, made for screen reader users).",
+ "message": "Résultats de recherche"
+ },
"components.Search.showFiltersPane": {
"description": "Accessibility text for the button/icon that toggles *on* the filters pane on mobile",
"message": "Montrer le menu des filtres"
diff --git a/src/frontend/i18n/locales/pt-PT.json b/src/frontend/i18n/locales/pt-PT.json
index e653189ab3..89b8480326 100644
--- a/src/frontend/i18n/locales/pt-PT.json
+++ b/src/frontend/i18n/locales/pt-PT.json
@@ -1,12 +1,184 @@
{
+ "components.AddressesManagement.actionCreation": {
+ "description": "Action name for address creation.",
+ "message": "criação"
+ },
+ "components.AddressesManagement.actionDeletion": {
+ "description": "Action name for address deletion.",
+ "message": "exclusão"
+ },
+ "components.AddressesManagement.actionPromotion": {
+ "description": "Action name for address promotion.",
+ "message": "promoção"
+ },
+ "components.AddressesManagement.actionUpdate": {
+ "description": "Action name for address update.",
+ "message": "atualização"
+ },
+ "components.AddressesManagement.addAddress": {
+ "description": "Title of the address creation form",
+ "message": "Adicionar um novo endereço"
+ },
+ "components.AddressesManagement.addressInput": {
+ "description": "Label of the \"address\" input",
+ "message": "Endereço"
+ },
+ "components.AddressesManagement.cancelButton": {
+ "description": "Label of the cancel button",
+ "message": "Cancelar"
+ },
+ "components.AddressesManagement.cancelTitleButton": {
+ "description": "Title of the cancel button",
+ "message": "Cancelar edição"
+ },
+ "components.AddressesManagement.cityInput": {
+ "description": "Label of the \"city\" input",
+ "message": "Cidade"
+ },
+ "components.AddressesManagement.closeButton": {
+ "description": "Label of the close button",
+ "message": "Voltar"
+ },
+ "components.AddressesManagement.countryInput": {
+ "description": "Label of the \"country\" input",
+ "message": "País"
+ },
+ "components.AddressesManagement.deleteButton": {
+ "description": "Label of the delete button",
+ "message": "Eliminar"
+ },
+ "components.AddressesManagement.deleteButtonLabel": {
+ "description": "Title of the delete button",
+ "message": "Eliminar endereço de \"{title}\""
+ },
+ "components.AddressesManagement.deletionConfirmation": {
+ "description": "Confirmation message shown to the user when he wants to delete an address",
+ "message": "Tem certeza que deseja eliminar o endereço \"{title}? ⚠️ Não é possível desfazer essa alteração."
+ },
+ "components.AddressesManagement.editAddress": {
+ "description": "Title of the address edit form",
+ "message": "Atualizar endereço {title}"
+ },
+ "components.AddressesManagement.editButton": {
+ "description": "Label of the edit button",
+ "message": "Editar"
+ },
+ "components.AddressesManagement.editButtonLabel": {
+ "description": "Title of the edit button",
+ "message": "Editar endereço de \"{title}\""
+ },
+ "components.AddressesManagement.error": {
+ "description": "Error message shown to the user when address creation/update/deletion request fails.",
+ "message": "Ocorreu um erro durante o processo de {action} de endereço. Por favor, tente novamente mais tarde."
+ },
+ "components.AddressesManagement.first_nameInput": {
+ "description": "Label of the \"first_name\" input",
+ "message": "Primeiro nome do destinatário"
+ },
+ "components.AddressesManagement.last_nameInput": {
+ "description": "Label of the \"last_name\" input",
+ "message": "Apelido do destinatário"
+ },
+ "components.AddressesManagement.postcodeInput": {
+ "description": "Label of the \"postcode\" input",
+ "message": "Código Postal"
+ },
+ "components.AddressesManagement.promoteButtonLabel": {
+ "description": "Title of the button to set the address as the main one",
+ "message": "Defina o endereço \"{title}\" como principal"
+ },
+ "components.AddressesManagement.registeredAddresses": {
+ "description": "Title of the registered addresses block",
+ "message": "Os seus endereços"
+ },
+ "components.AddressesManagement.saveInput": {
+ "description": "Label of the \"save\" input",
+ "message": "Guardar este endereço"
+ },
+ "components.AddressesManagement.selectButton": {
+ "description": "Label of the select button",
+ "message": "Usar esta endereço"
+ },
+ "components.AddressesManagement.selectButtonLabel": {
+ "description": "Title of the select button",
+ "message": "Selecionar o endereço \"{title}\""
+ },
+ "components.AddressesManagement.titleInput": {
+ "description": "Label of the \"title\" input",
+ "message": "Título do Endereço"
+ },
+ "components.AddressesManagement.updateButton": {
+ "description": "Label of the update button",
+ "message": "Atualizar este endereço"
+ },
+ "components.CourseGlimpse.categoryLabel": {
+ "description": "Category label text for screen reader users",
+ "message": "Categoria"
+ },
+ "components.CourseGlimpse.codeIconAlt": {
+ "description": "Course code logo alternative text for screen reader users",
+ "message": "Código do curso"
+ },
"components.CourseGlimpse.cover": {
"description": "Placeholder text when the course we are glimpsing at is missing a cover image",
"message": "Capa"
},
+ "components.CourseGlimpse.organizationIconAlt": {
+ "description": "Organization logo alternative text for screen reader users",
+ "message": "Organização"
+ },
+ "components.CourseGlimpseFooter.dateIconAlt": {
+ "description": "Course date logo alternative text for screen reader users",
+ "message": "Data do curso"
+ },
"components.CourseGlimpseList.courseCount": {
"description": "Result count & pagination information for course search. Appears right above search results",
"message": "A mostrar de {start, number} a {end, number} de {courseCount, number} {courseCount, plural, one {curso} other {cursos}} de acordo com a sua pesquisa"
},
+ "components.CourseGlimpseList.offscreenCourseCount": {
+ "description": "Short result count information for course search. Only for screen readers",
+ "message": "{courseCount, number} {courseCount, plural, one {curso} other {cursos}} {courseCount, plural, one {corresponde} other {correspondem}} à sua pesquisa"
+ },
+ "components.CourseProductCertificateItem.certificateExplanation": {
+ "description": "Text displayed when the product certificate has no description",
+ "message": "Poderá descarregar o seu certificado assim que completar todas as edições de curso."
+ },
+ "components.CourseProductCertificateItem.congratulations": {
+ "description": "Congratulation message when user has passed the course.",
+ "message": "Parabéns, concluiu o curso com sucesso!"
+ },
+ "components.CourseProductCertificateItem.download": {
+ "description": "Button label to download the certificate",
+ "message": "Descarregar"
+ },
+ "components.CourseProductCertificateItem.generatingCertificate": {
+ "description": "Accessible label displayed while certificate is being generated.",
+ "message": "O certificado está a ser gerado..."
+ },
+ "components.CourseProductItem.enrolled": {
+ "description": "Message displayed when authenticated user owned the product",
+ "message": "Inscrito"
+ },
+ "components.CourseProductsList.end": {
+ "description": "End label displayed in the header of course run dates section",
+ "message": "Fim"
+ },
+ "components.CourseProductsList.loadingInitial": {
+ "description": "Accessible text for the initial loading spinner displayed when course is fetching",
+ "message": "A carregar informação do curso..."
+ },
+ "components.CourseProductsList.start": {
+ "description": "Start label displayed in the header of course run dates section",
+ "message": "Início"
+ },
+ "components.CourseProductsLists.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Inscrições de {start} a {end}"
+ },
+ "components.CourseProductsLists.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "Nenhuma sessão disponível para este curso."
+ },
"components.CourseRunEnrollment.enroll": {
"description": "CTA for users who can enroll in the course run or could enroll if they logged in.",
"message": "Inscreva-se já"
@@ -35,10 +207,58 @@
"description": "Helper text in the enroll button for non logged in users",
"message": "Faça login para se inscrever"
},
+ "components.CourseRunList.enrollFromTo": {
+ "description": "Text label for the enrollment dates",
+ "message": "Inscrição de {start} a {end}"
+ },
+ "components.CourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "Nenhuma sessão disponível para este curso."
+ },
"components.DesktopUserMenu.menuPurpose": {
"description": "Accessible label for user menu button",
"message": "Acesso às suas configurações de perfil"
},
+ "components.EnrollableCourseRunList.ariaSelectCourseRun": {
+ "description": "Accessible label used by screen reader when user checked a course run radio input.",
+ "message": "Escolher edição do curso de {start} a {end}."
+ },
+ "components.EnrollableCourseRunList.enroll": {
+ "description": "Text label for the enroll button",
+ "message": "Inscrever"
+ },
+ "components.EnrollableCourseRunList.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Inscrições de {enrollment_start} a {enrollment_end}"
+ },
+ "components.EnrollableCourseRunList.enrolling": {
+ "description": "Label displayed when a request to enroll to a course run is loading",
+ "message": "Inscrevendo..."
+ },
+ "components.EnrollableCourseRunList.enrollmentNotYetOpened": {
+ "description": "Text label for the enroll cta when enrollment is not yet opened",
+ "message": "Inscrições abertas a {enrollment_start}"
+ },
+ "components.EnrollableCourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "Nenhuma sessão disponível para este curso."
+ },
+ "components.EnrollableCourseRunList.selectCourseRun": {
+ "description": "Label displayed when user do not have select a course run.",
+ "message": "Selecione uma edição do curso"
+ },
+ "components.EnrolledCourseRun.goToCourse": {
+ "description": "CTA displayed when user is enrolled to the course run.",
+ "message": "Ir para o curso"
+ },
+ "components.EnrolledCourseRun.unroll": {
+ "description": "Button label to unroll.",
+ "message": "Desinscrever"
+ },
+ "components.EnrolledCourseRun.unrolling": {
+ "description": "Accessible label displayed when user is being unrolled.",
+ "message": "Desinscrevendo..."
+ },
"components.LanguageSelector.currentlySelected": {
"description": "Accessible hint to mark the currently selected language in the language selector",
"message": "(selecionado)"
@@ -83,10 +303,138 @@
"description": "Accessibility helper for pagination, added on the previous page link.",
"message": "Página anterior {page}"
},
+ "components.PaymentButton.errorAbort": {
+ "description": "Error message shown when user aborts the payment.",
+ "message": "O pagamento foi cancelado."
+ },
+ "components.PaymentButton.errorAborting": {
+ "description": "Error message shown when user asks to abort the payment.",
+ "message": "Cancelando o pagamento..."
+ },
+ "components.PaymentButton.errorDefault": {
+ "description": "Error message shown when payment creation request failed.",
+ "message": "Ocorreu um erro durante o pagamento. Por favor, tente novamente mais tarde."
+ },
+ "components.PaymentButton.pay": {
+ "description": "CTA label to proceed to the payment of the product",
+ "message": "Pagar {price}"
+ },
+ "components.PaymentButton.payInOneClick": {
+ "description": "CTA label to proceed to the one click payment of the product",
+ "message": "Pague com um clique {price}"
+ },
+ "components.PaymentButton.paymentInProgress": {
+ "description": "Label for screen reader when a payment is in progress.",
+ "message": "A processar pagamento"
+ },
+ "components.PurchasedProductMenu.actionsRelated": {
+ "description": "Accessible label for the purchased product menu",
+ "message": "Outras ações relacionadas com este produto"
+ },
+ "components.PurchasedProductMenu.downloadInvoice": {
+ "description": "Label for selector item to download invoice",
+ "message": "Descarregar fatura"
+ },
+ "components.PurchasedProductMenu.generatingInvoice": {
+ "description": "Accessible label when invoice is being generated",
+ "message": "A fatura está a ser gerada..."
+ },
+ "components.RegisteredCreditCard.expirationDate": {
+ "description": "Credit card expiration date label",
+ "message": "Expira a {expirationDate}"
+ },
+ "components.RegisteredCreditCard.inputAriaLabel": {
+ "description": "ARIA Label read by screen reader to inform which card is focused",
+ "message": "{selected, select, true {Não selecionado} other {Selecionado}} o cartão {title}"
+ },
"components.RootSearchSuggestField.searchFieldPlaceholder": {
"description": "Placeholder text displayed in the search field when it is empty.",
"message": "Pesquisar cursos"
},
+ "components.SaleTunnel.closeDialog": {
+ "description": "ARIA label used by screenreader to inform that the close dialog button is selected",
+ "message": "Fechar esta caixa de diálogo"
+ },
+ "components.SaleTunnel.loginToPurchase": {
+ "description": "Label displayed inside the product's CTA when user is not logged in",
+ "message": "Faça login para comprar"
+ },
+ "components.SaleTunnel.stepPayment": {
+ "description": "Label of the Payment step",
+ "message": "Pagamento"
+ },
+ "components.SaleTunnel.stepResume": {
+ "description": "Label of the Resume step",
+ "message": "Continuar"
+ },
+ "components.SaleTunnel.stepValidation": {
+ "description": "Label of the Validation step",
+ "message": "Validação"
+ },
+ "components.SaleTunnelStepPayment.registeredCardSectionTitle": {
+ "description": "Label for the registered credit cards section",
+ "message": "O seu cartão de crédito foi registado"
+ },
+ "components.SaleTunnelStepPayment.resumeTile": {
+ "description": "Label for the resume tile",
+ "message": "Está prestes a concluir a compra"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressAddLabel": {
+ "description": "Label for the billing address add button",
+ "message": "Adicionar um endereço"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressCreateLabel": {
+ "description": "Label for the billing address create button",
+ "message": "Criar novo endereço"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressFieldset": {
+ "description": "Label for the billing address fieldset",
+ "message": "Endereço de faturação"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressNoEntry": {
+ "description": "Message displayed when the user has no address.",
+ "message": "Você ainda não tem um endereço de faturação."
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressSelectLabel": {
+ "description": "Label for the billing address select",
+ "message": "Selecione o endereço de faturação"
+ },
+ "components.SaleTunnelStepPayment.userTile": {
+ "description": "Label for the user information tile",
+ "message": "A sua informação pessoal"
+ },
+ "components.SaleTunnelStepResume.congratulations": {
+ "description": "Text displayed to thank user for his order",
+ "message": "Parabéns!"
+ },
+ "components.SaleTunnelStepResume.cta": {
+ "description": "Label to the call to action to close sale tunnel",
+ "message": "Iniciar este curso agora!"
+ },
+ "components.SaleTunnelStepResume.successDetailMessage": {
+ "description": "Text to remind that order's invoice will be send by email soon",
+ "message": "Dentro de instantes receberá a sua fatura por e-mail."
+ },
+ "components.SaleTunnelStepResume.successMessage": {
+ "description": "Message to confirm that order has been created",
+ "message": "O seu pedido foi criado com sucesso."
+ },
+ "components.SaleTunnelStepValidation.availableCourseRuns": {
+ "description": "Course runs available text",
+ "message": "{count, plural, =0 {Sem edições de curso} one {Uma edição do curso} other {# edições do curso}} {count, plural, =0 {disponíveis} one {disponível} other {disponíveis}}"
+ },
+ "components.SaleTunnelStepValidation.courseRunDates": {
+ "description": "Course run date text",
+ "message": "De {start} a {end}"
+ },
+ "components.SaleTunnelStepValidation.includingVAT": {
+ "description": "Text displayed next to the price to mention this is the price including VAT.",
+ "message": "IVA incluído"
+ },
+ "components.SaleTunnelStepValidation.proceedToPayment": {
+ "description": "CTA to go to payment step",
+ "message": "Prosseguir para o pagamento"
+ },
"components.Search.errorMessage": {
"description": "Error message for Search view when the request to load courses fails",
"message": "Ocorreu um erro! Não foi possível carregar os cursos."
@@ -95,6 +443,10 @@
"description": "Accessibility text for the button/icon that toggles *off* the filters pane on mobile",
"message": "Ocultar painel de filtros"
},
+ "components.Search.resultsTitle": {
+ "description": "Title for the search results pane in course search (not shown, made for screen reader users).",
+ "message": "Resultados da pesquisa"
+ },
"components.Search.showFiltersPane": {
"description": "Accessibility text for the button/icon that toggles *on* the filters pane on mobile",
"message": "Mostrar painel de filtros"
diff --git a/src/frontend/i18n/locales/ru-RU.json b/src/frontend/i18n/locales/ru-RU.json
index 73461dadc9..2d91f4bc5a 100644
--- a/src/frontend/i18n/locales/ru-RU.json
+++ b/src/frontend/i18n/locales/ru-RU.json
@@ -1,12 +1,184 @@
{
+ "components.AddressesManagement.actionCreation": {
+ "description": "Action name for address creation.",
+ "message": "creation"
+ },
+ "components.AddressesManagement.actionDeletion": {
+ "description": "Action name for address deletion.",
+ "message": "deletion"
+ },
+ "components.AddressesManagement.actionPromotion": {
+ "description": "Action name for address promotion.",
+ "message": "promotion"
+ },
+ "components.AddressesManagement.actionUpdate": {
+ "description": "Action name for address update.",
+ "message": "update"
+ },
+ "components.AddressesManagement.addAddress": {
+ "description": "Title of the address creation form",
+ "message": "Add a new address"
+ },
+ "components.AddressesManagement.addressInput": {
+ "description": "Label of the \"address\" input",
+ "message": "Address"
+ },
+ "components.AddressesManagement.cancelButton": {
+ "description": "Label of the cancel button",
+ "message": "Cancel"
+ },
+ "components.AddressesManagement.cancelTitleButton": {
+ "description": "Title of the cancel button",
+ "message": "Cancel edition"
+ },
+ "components.AddressesManagement.cityInput": {
+ "description": "Label of the \"city\" input",
+ "message": "City"
+ },
+ "components.AddressesManagement.closeButton": {
+ "description": "Label of the close button",
+ "message": "Go back"
+ },
+ "components.AddressesManagement.countryInput": {
+ "description": "Label of the \"country\" input",
+ "message": "Country"
+ },
+ "components.AddressesManagement.deleteButton": {
+ "description": "Label of the delete button",
+ "message": "Delete"
+ },
+ "components.AddressesManagement.deleteButtonLabel": {
+ "description": "Title of the delete button",
+ "message": "Delete \"{title}\" address"
+ },
+ "components.AddressesManagement.deletionConfirmation": {
+ "description": "Confirmation message shown to the user when he wants to delete an address",
+ "message": "Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after."
+ },
+ "components.AddressesManagement.editAddress": {
+ "description": "Title of the address edit form",
+ "message": "Update address {title}"
+ },
+ "components.AddressesManagement.editButton": {
+ "description": "Label of the edit button",
+ "message": "Edit"
+ },
+ "components.AddressesManagement.editButtonLabel": {
+ "description": "Title of the edit button",
+ "message": "Edit \"{title}\" address"
+ },
+ "components.AddressesManagement.error": {
+ "description": "Error message shown to the user when address creation/update/deletion request fails.",
+ "message": "An error occurred while address {action}. Please retry later."
+ },
+ "components.AddressesManagement.first_nameInput": {
+ "description": "Label of the \"first_name\" input",
+ "message": "Recipient's first name"
+ },
+ "components.AddressesManagement.last_nameInput": {
+ "description": "Label of the \"last_name\" input",
+ "message": "Recipient's last name"
+ },
+ "components.AddressesManagement.postcodeInput": {
+ "description": "Label of the \"postcode\" input",
+ "message": "Postcode"
+ },
+ "components.AddressesManagement.promoteButtonLabel": {
+ "description": "Title of the button to set the address as the main one",
+ "message": "Define \"{title}\" address as main"
+ },
+ "components.AddressesManagement.registeredAddresses": {
+ "description": "Title of the registered addresses block",
+ "message": "Your addresses"
+ },
+ "components.AddressesManagement.saveInput": {
+ "description": "Label of the \"save\" input",
+ "message": "Save this address"
+ },
+ "components.AddressesManagement.selectButton": {
+ "description": "Label of the select button",
+ "message": "Use this address"
+ },
+ "components.AddressesManagement.selectButtonLabel": {
+ "description": "Title of the select button",
+ "message": "Select \"{title}\" address"
+ },
+ "components.AddressesManagement.titleInput": {
+ "description": "Label of the \"title\" input",
+ "message": "Address title"
+ },
+ "components.AddressesManagement.updateButton": {
+ "description": "Label of the update button",
+ "message": "Update this address"
+ },
+ "components.CourseGlimpse.categoryLabel": {
+ "description": "Category label text for screen reader users",
+ "message": "Category"
+ },
+ "components.CourseGlimpse.codeIconAlt": {
+ "description": "Course code logo alternative text for screen reader users",
+ "message": "Course code"
+ },
"components.CourseGlimpse.cover": {
"description": "Placeholder text when the course we are glimpsing at is missing a cover image",
"message": "Обложка"
},
+ "components.CourseGlimpse.organizationIconAlt": {
+ "description": "Organization logo alternative text for screen reader users",
+ "message": "Organization"
+ },
+ "components.CourseGlimpseFooter.dateIconAlt": {
+ "description": "Course date logo alternative text for screen reader users",
+ "message": "Course date"
+ },
"components.CourseGlimpseList.courseCount": {
"description": "Result count & pagination information for course search. Appears right above search results",
"message": "Показано от {start, number} до {end, number} на {courseCount, number} {courseCount, plural, one {курсе} few {курсах} many {курсах} other {курсах}} в соответствии с вашим поиском"
},
+ "components.CourseGlimpseList.offscreenCourseCount": {
+ "description": "Short result count information for course search. Only for screen readers",
+ "message": "{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search"
+ },
+ "components.CourseProductCertificateItem.certificateExplanation": {
+ "description": "Text displayed when the product certificate has no description",
+ "message": "You will be able to download your certificate once you will pass all course runs."
+ },
+ "components.CourseProductCertificateItem.congratulations": {
+ "description": "Congratulation message when user has passed the course.",
+ "message": "Congratulations, you passed this course!"
+ },
+ "components.CourseProductCertificateItem.download": {
+ "description": "Button label to download the certificate",
+ "message": "Download"
+ },
+ "components.CourseProductCertificateItem.generatingCertificate": {
+ "description": "Accessible label displayed while certificate is being generated.",
+ "message": "Certificate is being generated..."
+ },
+ "components.CourseProductItem.enrolled": {
+ "description": "Message displayed when authenticated user owned the product",
+ "message": "Enrolled"
+ },
+ "components.CourseProductsList.end": {
+ "description": "End label displayed in the header of course run dates section",
+ "message": "End"
+ },
+ "components.CourseProductsList.loadingInitial": {
+ "description": "Accessible text for the initial loading spinner displayed when course is fetching",
+ "message": "Loading course information..."
+ },
+ "components.CourseProductsList.start": {
+ "description": "Start label displayed in the header of course run dates section",
+ "message": "Start"
+ },
+ "components.CourseProductsLists.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseProductsLists.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
"components.CourseRunEnrollment.enroll": {
"description": "CTA for users who can enroll in the course run or could enroll if they logged in.",
"message": "Записаться сейчас"
@@ -35,10 +207,58 @@
"description": "Helper text in the enroll button for non logged in users",
"message": "Войти для записи"
},
+ "components.CourseRunList.enrollFromTo": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {start} to {end}"
+ },
+ "components.CourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
"components.DesktopUserMenu.menuPurpose": {
"description": "Accessible label for user menu button",
"message": "Доступ к настройкам вашего профиля"
},
+ "components.EnrollableCourseRunList.ariaSelectCourseRun": {
+ "description": "Accessible label used by screen reader when user checked a course run radio input.",
+ "message": "Select course run from {start} to {end}."
+ },
+ "components.EnrollableCourseRunList.enroll": {
+ "description": "Text label for the enroll button",
+ "message": "Enroll"
+ },
+ "components.EnrollableCourseRunList.enrollOn": {
+ "description": "Text label for the enrollment dates",
+ "message": "Enrollment from {enrollment_start} to {enrollment_end}"
+ },
+ "components.EnrollableCourseRunList.enrolling": {
+ "description": "Label displayed when a request to enroll to a course run is loading",
+ "message": "Enrolling..."
+ },
+ "components.EnrollableCourseRunList.enrollmentNotYetOpened": {
+ "description": "Text label for the enroll cta when enrollment is not yet opened",
+ "message": "Enrollment will open on {enrollment_start}"
+ },
+ "components.EnrollableCourseRunList.noCourseRunAvailable": {
+ "description": "Text displayed when no course run are opened for the course",
+ "message": "No session available for this course."
+ },
+ "components.EnrollableCourseRunList.selectCourseRun": {
+ "description": "Label displayed when user do not have select a course run.",
+ "message": "Select a course run"
+ },
+ "components.EnrolledCourseRun.goToCourse": {
+ "description": "CTA displayed when user is enrolled to the course run.",
+ "message": "Go to course"
+ },
+ "components.EnrolledCourseRun.unroll": {
+ "description": "Button label to unroll.",
+ "message": "Unroll"
+ },
+ "components.EnrolledCourseRun.unrolling": {
+ "description": "Accessible label displayed when user is being unrolled.",
+ "message": "Unrolling..."
+ },
"components.LanguageSelector.currentlySelected": {
"description": "Accessible hint to mark the currently selected language in the language selector",
"message": "(сейчас выбрано)"
@@ -83,10 +303,138 @@
"description": "Accessibility helper for pagination, added on the previous page link.",
"message": "Предыдущая страница {page}"
},
+ "components.PaymentButton.errorAbort": {
+ "description": "Error message shown when user aborts the payment.",
+ "message": "Вы прервали оплату."
+ },
+ "components.PaymentButton.errorAborting": {
+ "description": "Error message shown when user asks to abort the payment.",
+ "message": "Прерывание оплаты..."
+ },
+ "components.PaymentButton.errorDefault": {
+ "description": "Error message shown when payment creation request failed.",
+ "message": "Произошла ошибка во время оплаты. Пожалуйста, повторите попытку позже."
+ },
+ "components.PaymentButton.pay": {
+ "description": "CTA label to proceed to the payment of the product",
+ "message": "Оплатить {price}"
+ },
+ "components.PaymentButton.payInOneClick": {
+ "description": "CTA label to proceed to the one click payment of the product",
+ "message": "Оплатить в один клик {price}"
+ },
+ "components.PaymentButton.paymentInProgress": {
+ "description": "Label for screen reader when a payment is in progress.",
+ "message": "Оплата в процессе"
+ },
+ "components.PurchasedProductMenu.actionsRelated": {
+ "description": "Accessible label for the purchased product menu",
+ "message": "Other actions related to this product"
+ },
+ "components.PurchasedProductMenu.downloadInvoice": {
+ "description": "Label for selector item to download invoice",
+ "message": "Download invoice"
+ },
+ "components.PurchasedProductMenu.generatingInvoice": {
+ "description": "Accessible label when invoice is being generated",
+ "message": "Invoice is being generated..."
+ },
+ "components.RegisteredCreditCard.expirationDate": {
+ "description": "Credit card expiration date label",
+ "message": "Expiration date: {expirationDate}"
+ },
+ "components.RegisteredCreditCard.inputAriaLabel": {
+ "description": "ARIA Label read by screen reader to inform which card is focused",
+ "message": "{selected, select, true {Unselect} other {Select}} {title}'s card"
+ },
"components.RootSearchSuggestField.searchFieldPlaceholder": {
"description": "Placeholder text displayed in the search field when it is empty.",
"message": "Поиск курсов"
},
+ "components.SaleTunnel.closeDialog": {
+ "description": "ARIA label used by screenreader to inform that the close dialog button is selected",
+ "message": "Close the dialog"
+ },
+ "components.SaleTunnel.loginToPurchase": {
+ "description": "Label displayed inside the product's CTA when user is not logged in",
+ "message": "Login to purchase"
+ },
+ "components.SaleTunnel.stepPayment": {
+ "description": "Label of the Payment step",
+ "message": "Payment"
+ },
+ "components.SaleTunnel.stepResume": {
+ "description": "Label of the Resume step",
+ "message": "Resume"
+ },
+ "components.SaleTunnel.stepValidation": {
+ "description": "Label of the Validation step",
+ "message": "Validation"
+ },
+ "components.SaleTunnelStepPayment.registeredCardSectionTitle": {
+ "description": "Label for the registered credit cards section",
+ "message": "Your registered credit card"
+ },
+ "components.SaleTunnelStepPayment.resumeTile": {
+ "description": "Label for the resume tile",
+ "message": "You are about to purchase"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressAddLabel": {
+ "description": "Label for the billing address add button",
+ "message": "Add an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressCreateLabel": {
+ "description": "Label for the billing address create button",
+ "message": "Create an address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressFieldset": {
+ "description": "Label for the billing address fieldset",
+ "message": "Billing address"
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressNoEntry": {
+ "description": "Message displayed when the user has no address.",
+ "message": "You have not yet a billing address."
+ },
+ "components.SaleTunnelStepPayment.userBillingAddressSelectLabel": {
+ "description": "Label for the billing address select",
+ "message": "Select a billing address"
+ },
+ "components.SaleTunnelStepPayment.userTile": {
+ "description": "Label for the user information tile",
+ "message": "Your personal information"
+ },
+ "components.SaleTunnelStepResume.congratulations": {
+ "description": "Text displayed to thank user for his order",
+ "message": "Congratulations!"
+ },
+ "components.SaleTunnelStepResume.cta": {
+ "description": "Label to the call to action to close sale tunnel",
+ "message": "Start this course now!"
+ },
+ "components.SaleTunnelStepResume.successDetailMessage": {
+ "description": "Text to remind that order's invoice will be send by email soon",
+ "message": "You will receive your invoice by email in a few moments."
+ },
+ "components.SaleTunnelStepResume.successMessage": {
+ "description": "Message to confirm that order has been created",
+ "message": "Your order has been successfully created."
+ },
+ "components.SaleTunnelStepValidation.availableCourseRuns": {
+ "description": "Course runs available text",
+ "message": "{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available"
+ },
+ "components.SaleTunnelStepValidation.courseRunDates": {
+ "description": "Course run date text",
+ "message": "From {start} to {end}"
+ },
+ "components.SaleTunnelStepValidation.includingVAT": {
+ "description": "Text displayed next to the price to mention this is the price including VAT.",
+ "message": "including VAT"
+ },
+ "components.SaleTunnelStepValidation.proceedToPayment": {
+ "description": "CTA to go to payment step",
+ "message": "Proceed to payment"
+ },
"components.Search.errorMessage": {
"description": "Error message for Search view when the request to load courses fails",
"message": "Что-то не так! Курсы не могут быть загружены."
@@ -95,6 +443,10 @@
"description": "Accessibility text for the button/icon that toggles *off* the filters pane on mobile",
"message": "Скрыть панель фильтров"
},
+ "components.Search.resultsTitle": {
+ "description": "Title for the search results pane in course search (not shown, made for screen reader users).",
+ "message": "Результаты поиска"
+ },
"components.Search.showFiltersPane": {
"description": "Accessibility text for the button/icon that toggles *on* the filters pane on mobile",
"message": "Показать панель фильтров"
diff --git a/src/frontend/js/translations/ar-SA.json b/src/frontend/js/translations/ar-SA.json
index d7a37adfd4..cd43526d44 100644
--- a/src/frontend/js/translations/ar-SA.json
+++ b/src/frontend/js/translations/ar-SA.json
@@ -1 +1 @@
-{"components.CourseGlimpse.cover":"Cover","components.CourseGlimpseList.courseCount":"Showing {start, number} to {end, number} of {courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseRunEnrollment.enroll":"Enroll now","components.CourseRunEnrollment.enrolled":"You are enrolled in this course run","components.CourseRunEnrollment.enrollmentClosed":"Enrollment in this course run is closed at the moment","components.CourseRunEnrollment.enrollmentFailed":"Your enrollment request failed.","components.CourseRunEnrollment.goToCourse":"Go to course","components.CourseRunEnrollment.loadingInitial":"Loading enrollment information...","components.CourseRunEnrollment.loginToEnroll":"Log in to enroll","components.DesktopUserMenu.menuPurpose":"Access to your profile settings","components.LanguageSelector.currentlySelected":"(currently selected)","components.LanguageSelector.languages":"Languages","components.LanguageSelector.selectLanguage":"Select a language:","components.LanguageSelector.switchToLanguage":"Switch to {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Currently reading last page {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Currently reading page {page}","components.PaginateCourseSearch.lastPageN":"Last page {page}","components.PaginateCourseSearch.nextPageN":"Next page {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Previous page {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Search for courses","components.Search.errorMessage":"Something's wrong! Courses could not be loaded.","components.Search.hideFiltersPane":"Hide filters pane","components.Search.showFiltersPane":"Show filters pane","components.Search.spinnerText":"Loading search results...","components.Search.textQueryLengthWarning":"Text search requires at least 3 characters. { query } is not long enough to search. Search results will not be affected by this query.","components.SearchFilterGroupModal.closeModal":"Close modal","components.SearchFilterGroupModal.error":"There was an error while searching for {filterName}.","components.SearchFilterGroupModal.inputLabel":"Search for filters to add","components.SearchFilterGroupModal.inputPlaceholder":"Search in { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Load more results","components.SearchFilterGroupModal.loadingResults":"Loading search results...","components.SearchFilterGroupModal.modalTitle":"Add filters for {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"More options","components.SearchFilterGroupModal.queryTooShort":"Type at least 3 characters to start searching.","components.SearchFilterValueParent.ariaHideChildren":"Hide additional filters for {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Show more filters for {filterValueName}","components.SearchFiltersPane.clearFilters":"Clear {activeFilterCount, number} active {activeFilterCount, plural, one {filter} other {filters}}","components.SearchFiltersPane.title":"Filter courses","components.SearchInput.button":"Search","components.SearchSuggestField.searchFieldPlaceholder":"Search for courses, organizations, categories","components.UserLogin.logIn":"Log in","components.UserLogin.logOut":"Log out","components.UserLogin.signup":"Sign up","components.UserLogin.spinnerText":"Loading login status...","components.useStaticFilters.courses":"Courses"}
\ No newline at end of file
+{"components.AddressesManagement.actionCreation":"creation","components.AddressesManagement.actionDeletion":"deletion","components.AddressesManagement.actionPromotion":"promotion","components.AddressesManagement.actionUpdate":"update","components.AddressesManagement.addAddress":"Add a new address","components.AddressesManagement.addressInput":"Address","components.AddressesManagement.cancelButton":"Cancel","components.AddressesManagement.cancelTitleButton":"Cancel edition","components.AddressesManagement.cityInput":"City","components.AddressesManagement.closeButton":"Go back","components.AddressesManagement.countryInput":"Country","components.AddressesManagement.deleteButton":"Delete","components.AddressesManagement.deleteButtonLabel":"Delete \"{title}\" address","components.AddressesManagement.deletionConfirmation":"Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after.","components.AddressesManagement.editAddress":"Update address {title}","components.AddressesManagement.editButton":"Edit","components.AddressesManagement.editButtonLabel":"Edit \"{title}\" address","components.AddressesManagement.error":"An error occurred while address {action}. Please retry later.","components.AddressesManagement.first_nameInput":"Recipient's first name","components.AddressesManagement.last_nameInput":"Recipient's last name","components.AddressesManagement.postcodeInput":"Postcode","components.AddressesManagement.promoteButtonLabel":"Define \"{title}\" address as main","components.AddressesManagement.registeredAddresses":"Your addresses","components.AddressesManagement.saveInput":"Save this address","components.AddressesManagement.selectButton":"Use this address","components.AddressesManagement.selectButtonLabel":"Select \"{title}\" address","components.AddressesManagement.titleInput":"Address title","components.AddressesManagement.updateButton":"Update this address","components.CourseGlimpse.categoryLabel":"Category","components.CourseGlimpse.codeIconAlt":"Course code","components.CourseGlimpse.cover":"Cover","components.CourseGlimpse.organizationIconAlt":"Organization","components.CourseGlimpseFooter.dateIconAlt":"Course date","components.CourseGlimpseList.courseCount":"Showing {start, number} to {end, number} of {courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseGlimpseList.offscreenCourseCount":"{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseProductCertificateItem.certificateExplanation":"You will be able to download your certificate once you will pass all course runs.","components.CourseProductCertificateItem.congratulations":"Congratulations, you passed this course!","components.CourseProductCertificateItem.download":"Download","components.CourseProductCertificateItem.generatingCertificate":"Certificate is being generated...","components.CourseProductItem.enrolled":"Enrolled","components.CourseProductsList.end":"End","components.CourseProductsList.loadingInitial":"Loading course information...","components.CourseProductsList.start":"Start","components.CourseProductsLists.enrollOn":"Enrollment from {start} to {end}","components.CourseProductsLists.noCourseRunAvailable":"No session available for this course.","components.CourseRunEnrollment.enroll":"Enroll now","components.CourseRunEnrollment.enrolled":"You are enrolled in this course run","components.CourseRunEnrollment.enrollmentClosed":"Enrollment in this course run is closed at the moment","components.CourseRunEnrollment.enrollmentFailed":"Your enrollment request failed.","components.CourseRunEnrollment.goToCourse":"Go to course","components.CourseRunEnrollment.loadingInitial":"Loading enrollment information...","components.CourseRunEnrollment.loginToEnroll":"Log in to enroll","components.CourseRunList.enrollFromTo":"Enrollment from {start} to {end}","components.CourseRunList.noCourseRunAvailable":"No session available for this course.","components.DesktopUserMenu.menuPurpose":"Access to your profile settings","components.EnrollableCourseRunList.ariaSelectCourseRun":"Select course run from {start} to {end}.","components.EnrollableCourseRunList.enroll":"Enroll","components.EnrollableCourseRunList.enrollOn":"Enrollment from {enrollment_start} to {enrollment_end}","components.EnrollableCourseRunList.enrolling":"Enrolling...","components.EnrollableCourseRunList.enrollmentNotYetOpened":"Enrollment will open on {enrollment_start}","components.EnrollableCourseRunList.noCourseRunAvailable":"No session available for this course.","components.EnrollableCourseRunList.selectCourseRun":"Select a course run","components.EnrolledCourseRun.goToCourse":"Go to course","components.EnrolledCourseRun.unroll":"Unroll","components.EnrolledCourseRun.unrolling":"Unrolling...","components.LanguageSelector.currentlySelected":"(currently selected)","components.LanguageSelector.languages":"Languages","components.LanguageSelector.selectLanguage":"Select a language:","components.LanguageSelector.switchToLanguage":"Switch to {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Currently reading last page {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Currently reading page {page}","components.PaginateCourseSearch.lastPageN":"Last page {page}","components.PaginateCourseSearch.nextPageN":"Next page {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Previous page {page}","components.PaymentButton.errorAbort":"You have aborted the payment.","components.PaymentButton.errorAborting":"Aborting the payment...","components.PaymentButton.errorDefault":"An error occurred during payment. Please retry later.","components.PaymentButton.pay":"Pay {price}","components.PaymentButton.payInOneClick":"Pay in one click {price}","components.PaymentButton.paymentInProgress":"Payment in progress","components.PurchasedProductMenu.actionsRelated":"Other actions related to this product","components.PurchasedProductMenu.downloadInvoice":"Download invoice","components.PurchasedProductMenu.generatingInvoice":"Invoice is being generated...","components.RegisteredCreditCard.expirationDate":"Expiration date: {expirationDate}","components.RegisteredCreditCard.inputAriaLabel":"{selected, select, true {Unselect} other {Select}} {title}'s card","components.RootSearchSuggestField.searchFieldPlaceholder":"Search for courses","components.SaleTunnel.closeDialog":"Close the dialog","components.SaleTunnel.loginToPurchase":"Login to purchase","components.SaleTunnel.stepPayment":"Payment","components.SaleTunnel.stepResume":"Resume","components.SaleTunnel.stepValidation":"Validation","components.SaleTunnelStepPayment.registeredCardSectionTitle":"Your registered credit card","components.SaleTunnelStepPayment.resumeTile":"You are about to purchase","components.SaleTunnelStepPayment.userBillingAddressAddLabel":"Add an address","components.SaleTunnelStepPayment.userBillingAddressCreateLabel":"Create an address","components.SaleTunnelStepPayment.userBillingAddressFieldset":"Billing address","components.SaleTunnelStepPayment.userBillingAddressNoEntry":"You have not yet a billing address.","components.SaleTunnelStepPayment.userBillingAddressSelectLabel":"Select a billing address","components.SaleTunnelStepPayment.userTile":"Your personal information","components.SaleTunnelStepResume.congratulations":"Congratulations!","components.SaleTunnelStepResume.cta":"Start this course now!","components.SaleTunnelStepResume.successDetailMessage":"You will receive your invoice by email in a few moments.","components.SaleTunnelStepResume.successMessage":"Your order has been successfully created.","components.SaleTunnelStepValidation.availableCourseRuns":"{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available","components.SaleTunnelStepValidation.courseRunDates":"From {start} to {end}","components.SaleTunnelStepValidation.includingVAT":"including VAT","components.SaleTunnelStepValidation.proceedToPayment":"Proceed to payment","components.Search.errorMessage":"Something's wrong! Courses could not be loaded.","components.Search.hideFiltersPane":"Hide filters pane","components.Search.resultsTitle":"Search results","components.Search.showFiltersPane":"Show filters pane","components.Search.spinnerText":"Loading search results...","components.Search.textQueryLengthWarning":"Text search requires at least 3 characters. { query } is not long enough to search. Search results will not be affected by this query.","components.SearchFilterGroupModal.closeModal":"Close modal","components.SearchFilterGroupModal.error":"There was an error while searching for {filterName}.","components.SearchFilterGroupModal.inputLabel":"Search for filters to add","components.SearchFilterGroupModal.inputPlaceholder":"Search in { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Load more results","components.SearchFilterGroupModal.loadingResults":"Loading search results...","components.SearchFilterGroupModal.modalTitle":"Add filters for {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"More options","components.SearchFilterGroupModal.queryTooShort":"Type at least 3 characters to start searching.","components.SearchFilterValueParent.ariaHideChildren":"Hide additional filters for {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Show more filters for {filterValueName}","components.SearchFiltersPane.clearFilters":"Clear {activeFilterCount, number} active {activeFilterCount, plural, one {filter} other {filters}}","components.SearchFiltersPane.title":"Filter courses","components.SearchInput.button":"Search","components.SearchSuggestField.searchFieldPlaceholder":"Search for courses, organizations, categories","components.UserLogin.logIn":"Log in","components.UserLogin.logOut":"Log out","components.UserLogin.signup":"Sign up","components.UserLogin.spinnerText":"Loading login status...","components.useStaticFilters.courses":"Courses"}
\ No newline at end of file
diff --git a/src/frontend/js/translations/es-ES.json b/src/frontend/js/translations/es-ES.json
index fbc5249c41..dc4e0b485d 100644
--- a/src/frontend/js/translations/es-ES.json
+++ b/src/frontend/js/translations/es-ES.json
@@ -1 +1 @@
-{"components.CourseGlimpse.cover":"Portada","components.CourseGlimpseList.courseCount":"Mostrando {start, number} a {end, number} de {courseCount, number} ¡ {courseCount, plural, one {curso} other {cursos}} que coinciden con su búsqueda","components.CourseRunEnrollment.enroll":"Inscribirse ahora","components.CourseRunEnrollment.enrolled":"Se ha inscrito en este curso","components.CourseRunEnrollment.enrollmentClosed":"La inscripción en este curso está cerrada por el momento","components.CourseRunEnrollment.enrollmentFailed":"Su solicitud de inscripción ha fallado.","components.CourseRunEnrollment.goToCourse":"Ir al curso","components.CourseRunEnrollment.loadingInitial":"Cargando información de inscripción...","components.CourseRunEnrollment.loginToEnroll":"Inicia sesión para inscribirse","components.DesktopUserMenu.menuPurpose":"Acceso a la configuración de su perfil","components.LanguageSelector.currentlySelected":"(actualmente seleccionado)","components.LanguageSelector.languages":"Idiomas","components.LanguageSelector.selectLanguage":"Seleccione un idioma:","components.LanguageSelector.switchToLanguage":"Cambiar a {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Leyendo la última página {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actualmente leyendo la página {page}","components.PaginateCourseSearch.lastPageN":"Última página {page}","components.PaginateCourseSearch.nextPageN":"Página siguiente {page}","components.PaginateCourseSearch.pageN":"Página {page}","components.PaginateCourseSearch.pagination":"Paginación","components.PaginateCourseSearch.previousPageN":"Página anterior {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Buscar cursos","components.Search.errorMessage":"¡Algo está mal! No se han podido cargar los cursos.","components.Search.hideFiltersPane":"Ocultar panel de filtros","components.Search.showFiltersPane":"Mostrar panel de filtros","components.Search.spinnerText":"Cargando resultados de búsqueda...","components.Search.textQueryLengthWarning":"La búsqueda de texto requiere al menos 3 caracteres. { query } no es lo suficientemente larga para buscar. Los resultados de la búsqueda no se verán afectados por esta consulta.","components.SearchFilterGroupModal.closeModal":"Cerrar ventana modal","components.SearchFilterGroupModal.error":"Se ha producido un error al buscar {filterName}.","components.SearchFilterGroupModal.inputLabel":"Buscar filtros para añadir","components.SearchFilterGroupModal.inputPlaceholder":"Buscar en { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Cargar más resultados","components.SearchFilterGroupModal.loadingResults":"Cargando resultados de búsqueda...","components.SearchFilterGroupModal.modalTitle":"Añadir filtros para {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Más opciones","components.SearchFilterGroupModal.queryTooShort":"Escriba por lo menos 3 caracteres para iniciar la búsqueda.","components.SearchFilterValueParent.ariaHideChildren":"Ocultar filtros adicionales para {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Mostrar más filtros para {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirar {activeFilterCount, number} activo {activeFilterCount, plural, one {filtro} other {filtros}}","components.SearchFiltersPane.title":"Filtrar cursos","components.SearchInput.button":"Buscar","components.SearchSuggestField.searchFieldPlaceholder":"Buscar cursos, organizaciones, categorías","components.UserLogin.logIn":"Iniciar sesión","components.UserLogin.logOut":"Cerrar sesión","components.UserLogin.signup":"Registrarse","components.UserLogin.spinnerText":"Cargando estado de inicio de sesión...","components.useStaticFilters.courses":"Cursos"}
\ No newline at end of file
+{"components.AddressesManagement.actionCreation":"creation","components.AddressesManagement.actionDeletion":"deletion","components.AddressesManagement.actionPromotion":"promotion","components.AddressesManagement.actionUpdate":"update","components.AddressesManagement.addAddress":"Add a new address","components.AddressesManagement.addressInput":"Address","components.AddressesManagement.cancelButton":"Cancel","components.AddressesManagement.cancelTitleButton":"Cancel edition","components.AddressesManagement.cityInput":"City","components.AddressesManagement.closeButton":"Go back","components.AddressesManagement.countryInput":"Country","components.AddressesManagement.deleteButton":"Delete","components.AddressesManagement.deleteButtonLabel":"Delete \"{title}\" address","components.AddressesManagement.deletionConfirmation":"Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after.","components.AddressesManagement.editAddress":"Update address {title}","components.AddressesManagement.editButton":"Edit","components.AddressesManagement.editButtonLabel":"Edit \"{title}\" address","components.AddressesManagement.error":"An error occurred while address {action}. Please retry later.","components.AddressesManagement.first_nameInput":"Recipient's first name","components.AddressesManagement.last_nameInput":"Recipient's last name","components.AddressesManagement.postcodeInput":"Postcode","components.AddressesManagement.promoteButtonLabel":"Define \"{title}\" address as main","components.AddressesManagement.registeredAddresses":"Your addresses","components.AddressesManagement.saveInput":"Save this address","components.AddressesManagement.selectButton":"Use this address","components.AddressesManagement.selectButtonLabel":"Select \"{title}\" address","components.AddressesManagement.titleInput":"Address title","components.AddressesManagement.updateButton":"Update this address","components.CourseGlimpse.categoryLabel":"Category","components.CourseGlimpse.codeIconAlt":"Course code","components.CourseGlimpse.cover":"Portada","components.CourseGlimpse.organizationIconAlt":"Organization","components.CourseGlimpseFooter.dateIconAlt":"Course date","components.CourseGlimpseList.courseCount":"Mostrando {start, number} a {end, number} de {courseCount, number} ¡ {courseCount, plural, one {curso} other {cursos}} que coinciden con su búsqueda","components.CourseGlimpseList.offscreenCourseCount":"{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseProductCertificateItem.certificateExplanation":"You will be able to download your certificate once you will pass all course runs.","components.CourseProductCertificateItem.congratulations":"Congratulations, you passed this course!","components.CourseProductCertificateItem.download":"Download","components.CourseProductCertificateItem.generatingCertificate":"Certificate is being generated...","components.CourseProductItem.enrolled":"Enrolled","components.CourseProductsList.end":"End","components.CourseProductsList.loadingInitial":"Loading course information...","components.CourseProductsList.start":"Start","components.CourseProductsLists.enrollOn":"Enrollment from {start} to {end}","components.CourseProductsLists.noCourseRunAvailable":"No session available for this course.","components.CourseRunEnrollment.enroll":"Inscribirse ahora","components.CourseRunEnrollment.enrolled":"Se ha inscrito en este curso","components.CourseRunEnrollment.enrollmentClosed":"La inscripción en este curso está cerrada por el momento","components.CourseRunEnrollment.enrollmentFailed":"Su solicitud de inscripción ha fallado.","components.CourseRunEnrollment.goToCourse":"Ir al curso","components.CourseRunEnrollment.loadingInitial":"Cargando información de inscripción...","components.CourseRunEnrollment.loginToEnroll":"Inicia sesión para inscribirse","components.CourseRunList.enrollFromTo":"Enrollment from {start} to {end}","components.CourseRunList.noCourseRunAvailable":"No session available for this course.","components.DesktopUserMenu.menuPurpose":"Acceso a la configuración de su perfil","components.EnrollableCourseRunList.ariaSelectCourseRun":"Select course run from {start} to {end}.","components.EnrollableCourseRunList.enroll":"Enroll","components.EnrollableCourseRunList.enrollOn":"Enrollment from {enrollment_start} to {enrollment_end}","components.EnrollableCourseRunList.enrolling":"Enrolling...","components.EnrollableCourseRunList.enrollmentNotYetOpened":"Enrollment will open on {enrollment_start}","components.EnrollableCourseRunList.noCourseRunAvailable":"No session available for this course.","components.EnrollableCourseRunList.selectCourseRun":"Select a course run","components.EnrolledCourseRun.goToCourse":"Go to course","components.EnrolledCourseRun.unroll":"Unroll","components.EnrolledCourseRun.unrolling":"Unrolling...","components.LanguageSelector.currentlySelected":"(actualmente seleccionado)","components.LanguageSelector.languages":"Idiomas","components.LanguageSelector.selectLanguage":"Seleccione un idioma:","components.LanguageSelector.switchToLanguage":"Cambiar a {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Leyendo la última página {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actualmente leyendo la página {page}","components.PaginateCourseSearch.lastPageN":"Última página {page}","components.PaginateCourseSearch.nextPageN":"Página siguiente {page}","components.PaginateCourseSearch.pageN":"Página {page}","components.PaginateCourseSearch.pagination":"Paginación","components.PaginateCourseSearch.previousPageN":"Página anterior {page}","components.PaymentButton.errorAbort":"Ha cancelado el pago.","components.PaymentButton.errorAborting":"Cancelando el pago...","components.PaymentButton.errorDefault":"Se ha producido un error durante el pago. Vuelva a intentarlo más tarde.","components.PaymentButton.pay":"Pagar {price}€","components.PaymentButton.payInOneClick":"Pague en un solo clic {price}","components.PaymentButton.paymentInProgress":"Pago en curso","components.PurchasedProductMenu.actionsRelated":"Other actions related to this product","components.PurchasedProductMenu.downloadInvoice":"Download invoice","components.PurchasedProductMenu.generatingInvoice":"Invoice is being generated...","components.RegisteredCreditCard.expirationDate":"Expiration date: {expirationDate}","components.RegisteredCreditCard.inputAriaLabel":"{selected, select, true {Unselect} other {Select}} {title}'s card","components.RootSearchSuggestField.searchFieldPlaceholder":"Buscar cursos","components.SaleTunnel.closeDialog":"Close the dialog","components.SaleTunnel.loginToPurchase":"Login to purchase","components.SaleTunnel.stepPayment":"Payment","components.SaleTunnel.stepResume":"Resume","components.SaleTunnel.stepValidation":"Validation","components.SaleTunnelStepPayment.registeredCardSectionTitle":"Your registered credit card","components.SaleTunnelStepPayment.resumeTile":"You are about to purchase","components.SaleTunnelStepPayment.userBillingAddressAddLabel":"Add an address","components.SaleTunnelStepPayment.userBillingAddressCreateLabel":"Create an address","components.SaleTunnelStepPayment.userBillingAddressFieldset":"Billing address","components.SaleTunnelStepPayment.userBillingAddressNoEntry":"You have not yet a billing address.","components.SaleTunnelStepPayment.userBillingAddressSelectLabel":"Select a billing address","components.SaleTunnelStepPayment.userTile":"Your personal information","components.SaleTunnelStepResume.congratulations":"Congratulations!","components.SaleTunnelStepResume.cta":"Start this course now!","components.SaleTunnelStepResume.successDetailMessage":"You will receive your invoice by email in a few moments.","components.SaleTunnelStepResume.successMessage":"Your order has been successfully created.","components.SaleTunnelStepValidation.availableCourseRuns":"{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available","components.SaleTunnelStepValidation.courseRunDates":"From {start} to {end}","components.SaleTunnelStepValidation.includingVAT":"including VAT","components.SaleTunnelStepValidation.proceedToPayment":"Proceed to payment","components.Search.errorMessage":"¡Algo está mal! No se han podido cargar los cursos.","components.Search.hideFiltersPane":"Ocultar panel de filtros","components.Search.resultsTitle":"Resultados de búsqueda","components.Search.showFiltersPane":"Mostrar panel de filtros","components.Search.spinnerText":"Cargando resultados de búsqueda...","components.Search.textQueryLengthWarning":"La búsqueda de texto requiere al menos 3 caracteres. { query } no es lo suficientemente larga para buscar. Los resultados de la búsqueda no se verán afectados por esta consulta.","components.SearchFilterGroupModal.closeModal":"Cerrar ventana modal","components.SearchFilterGroupModal.error":"Se ha producido un error al buscar {filterName}.","components.SearchFilterGroupModal.inputLabel":"Buscar filtros para añadir","components.SearchFilterGroupModal.inputPlaceholder":"Buscar en { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Cargar más resultados","components.SearchFilterGroupModal.loadingResults":"Cargando resultados de búsqueda...","components.SearchFilterGroupModal.modalTitle":"Añadir filtros para {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Más opciones","components.SearchFilterGroupModal.queryTooShort":"Escriba por lo menos 3 caracteres para iniciar la búsqueda.","components.SearchFilterValueParent.ariaHideChildren":"Ocultar filtros adicionales para {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Mostrar más filtros para {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirar {activeFilterCount, number} activo {activeFilterCount, plural, one {filtro} other {filtros}}","components.SearchFiltersPane.title":"Filtrar cursos","components.SearchInput.button":"Buscar","components.SearchSuggestField.searchFieldPlaceholder":"Buscar cursos, organizaciones, categorías","components.UserLogin.logIn":"Iniciar sesión","components.UserLogin.logOut":"Cerrar sesión","components.UserLogin.signup":"Registrarse","components.UserLogin.spinnerText":"Cargando estado de inicio de sesión...","components.useStaticFilters.courses":"Cursos"}
\ No newline at end of file
diff --git a/src/frontend/js/translations/fa-IR.json b/src/frontend/js/translations/fa-IR.json
new file mode 100644
index 0000000000..cd43526d44
--- /dev/null
+++ b/src/frontend/js/translations/fa-IR.json
@@ -0,0 +1 @@
+{"components.AddressesManagement.actionCreation":"creation","components.AddressesManagement.actionDeletion":"deletion","components.AddressesManagement.actionPromotion":"promotion","components.AddressesManagement.actionUpdate":"update","components.AddressesManagement.addAddress":"Add a new address","components.AddressesManagement.addressInput":"Address","components.AddressesManagement.cancelButton":"Cancel","components.AddressesManagement.cancelTitleButton":"Cancel edition","components.AddressesManagement.cityInput":"City","components.AddressesManagement.closeButton":"Go back","components.AddressesManagement.countryInput":"Country","components.AddressesManagement.deleteButton":"Delete","components.AddressesManagement.deleteButtonLabel":"Delete \"{title}\" address","components.AddressesManagement.deletionConfirmation":"Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after.","components.AddressesManagement.editAddress":"Update address {title}","components.AddressesManagement.editButton":"Edit","components.AddressesManagement.editButtonLabel":"Edit \"{title}\" address","components.AddressesManagement.error":"An error occurred while address {action}. Please retry later.","components.AddressesManagement.first_nameInput":"Recipient's first name","components.AddressesManagement.last_nameInput":"Recipient's last name","components.AddressesManagement.postcodeInput":"Postcode","components.AddressesManagement.promoteButtonLabel":"Define \"{title}\" address as main","components.AddressesManagement.registeredAddresses":"Your addresses","components.AddressesManagement.saveInput":"Save this address","components.AddressesManagement.selectButton":"Use this address","components.AddressesManagement.selectButtonLabel":"Select \"{title}\" address","components.AddressesManagement.titleInput":"Address title","components.AddressesManagement.updateButton":"Update this address","components.CourseGlimpse.categoryLabel":"Category","components.CourseGlimpse.codeIconAlt":"Course code","components.CourseGlimpse.cover":"Cover","components.CourseGlimpse.organizationIconAlt":"Organization","components.CourseGlimpseFooter.dateIconAlt":"Course date","components.CourseGlimpseList.courseCount":"Showing {start, number} to {end, number} of {courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseGlimpseList.offscreenCourseCount":"{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseProductCertificateItem.certificateExplanation":"You will be able to download your certificate once you will pass all course runs.","components.CourseProductCertificateItem.congratulations":"Congratulations, you passed this course!","components.CourseProductCertificateItem.download":"Download","components.CourseProductCertificateItem.generatingCertificate":"Certificate is being generated...","components.CourseProductItem.enrolled":"Enrolled","components.CourseProductsList.end":"End","components.CourseProductsList.loadingInitial":"Loading course information...","components.CourseProductsList.start":"Start","components.CourseProductsLists.enrollOn":"Enrollment from {start} to {end}","components.CourseProductsLists.noCourseRunAvailable":"No session available for this course.","components.CourseRunEnrollment.enroll":"Enroll now","components.CourseRunEnrollment.enrolled":"You are enrolled in this course run","components.CourseRunEnrollment.enrollmentClosed":"Enrollment in this course run is closed at the moment","components.CourseRunEnrollment.enrollmentFailed":"Your enrollment request failed.","components.CourseRunEnrollment.goToCourse":"Go to course","components.CourseRunEnrollment.loadingInitial":"Loading enrollment information...","components.CourseRunEnrollment.loginToEnroll":"Log in to enroll","components.CourseRunList.enrollFromTo":"Enrollment from {start} to {end}","components.CourseRunList.noCourseRunAvailable":"No session available for this course.","components.DesktopUserMenu.menuPurpose":"Access to your profile settings","components.EnrollableCourseRunList.ariaSelectCourseRun":"Select course run from {start} to {end}.","components.EnrollableCourseRunList.enroll":"Enroll","components.EnrollableCourseRunList.enrollOn":"Enrollment from {enrollment_start} to {enrollment_end}","components.EnrollableCourseRunList.enrolling":"Enrolling...","components.EnrollableCourseRunList.enrollmentNotYetOpened":"Enrollment will open on {enrollment_start}","components.EnrollableCourseRunList.noCourseRunAvailable":"No session available for this course.","components.EnrollableCourseRunList.selectCourseRun":"Select a course run","components.EnrolledCourseRun.goToCourse":"Go to course","components.EnrolledCourseRun.unroll":"Unroll","components.EnrolledCourseRun.unrolling":"Unrolling...","components.LanguageSelector.currentlySelected":"(currently selected)","components.LanguageSelector.languages":"Languages","components.LanguageSelector.selectLanguage":"Select a language:","components.LanguageSelector.switchToLanguage":"Switch to {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Currently reading last page {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Currently reading page {page}","components.PaginateCourseSearch.lastPageN":"Last page {page}","components.PaginateCourseSearch.nextPageN":"Next page {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Previous page {page}","components.PaymentButton.errorAbort":"You have aborted the payment.","components.PaymentButton.errorAborting":"Aborting the payment...","components.PaymentButton.errorDefault":"An error occurred during payment. Please retry later.","components.PaymentButton.pay":"Pay {price}","components.PaymentButton.payInOneClick":"Pay in one click {price}","components.PaymentButton.paymentInProgress":"Payment in progress","components.PurchasedProductMenu.actionsRelated":"Other actions related to this product","components.PurchasedProductMenu.downloadInvoice":"Download invoice","components.PurchasedProductMenu.generatingInvoice":"Invoice is being generated...","components.RegisteredCreditCard.expirationDate":"Expiration date: {expirationDate}","components.RegisteredCreditCard.inputAriaLabel":"{selected, select, true {Unselect} other {Select}} {title}'s card","components.RootSearchSuggestField.searchFieldPlaceholder":"Search for courses","components.SaleTunnel.closeDialog":"Close the dialog","components.SaleTunnel.loginToPurchase":"Login to purchase","components.SaleTunnel.stepPayment":"Payment","components.SaleTunnel.stepResume":"Resume","components.SaleTunnel.stepValidation":"Validation","components.SaleTunnelStepPayment.registeredCardSectionTitle":"Your registered credit card","components.SaleTunnelStepPayment.resumeTile":"You are about to purchase","components.SaleTunnelStepPayment.userBillingAddressAddLabel":"Add an address","components.SaleTunnelStepPayment.userBillingAddressCreateLabel":"Create an address","components.SaleTunnelStepPayment.userBillingAddressFieldset":"Billing address","components.SaleTunnelStepPayment.userBillingAddressNoEntry":"You have not yet a billing address.","components.SaleTunnelStepPayment.userBillingAddressSelectLabel":"Select a billing address","components.SaleTunnelStepPayment.userTile":"Your personal information","components.SaleTunnelStepResume.congratulations":"Congratulations!","components.SaleTunnelStepResume.cta":"Start this course now!","components.SaleTunnelStepResume.successDetailMessage":"You will receive your invoice by email in a few moments.","components.SaleTunnelStepResume.successMessage":"Your order has been successfully created.","components.SaleTunnelStepValidation.availableCourseRuns":"{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available","components.SaleTunnelStepValidation.courseRunDates":"From {start} to {end}","components.SaleTunnelStepValidation.includingVAT":"including VAT","components.SaleTunnelStepValidation.proceedToPayment":"Proceed to payment","components.Search.errorMessage":"Something's wrong! Courses could not be loaded.","components.Search.hideFiltersPane":"Hide filters pane","components.Search.resultsTitle":"Search results","components.Search.showFiltersPane":"Show filters pane","components.Search.spinnerText":"Loading search results...","components.Search.textQueryLengthWarning":"Text search requires at least 3 characters. { query } is not long enough to search. Search results will not be affected by this query.","components.SearchFilterGroupModal.closeModal":"Close modal","components.SearchFilterGroupModal.error":"There was an error while searching for {filterName}.","components.SearchFilterGroupModal.inputLabel":"Search for filters to add","components.SearchFilterGroupModal.inputPlaceholder":"Search in { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Load more results","components.SearchFilterGroupModal.loadingResults":"Loading search results...","components.SearchFilterGroupModal.modalTitle":"Add filters for {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"More options","components.SearchFilterGroupModal.queryTooShort":"Type at least 3 characters to start searching.","components.SearchFilterValueParent.ariaHideChildren":"Hide additional filters for {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Show more filters for {filterValueName}","components.SearchFiltersPane.clearFilters":"Clear {activeFilterCount, number} active {activeFilterCount, plural, one {filter} other {filters}}","components.SearchFiltersPane.title":"Filter courses","components.SearchInput.button":"Search","components.SearchSuggestField.searchFieldPlaceholder":"Search for courses, organizations, categories","components.UserLogin.logIn":"Log in","components.UserLogin.logOut":"Log out","components.UserLogin.signup":"Sign up","components.UserLogin.spinnerText":"Loading login status...","components.useStaticFilters.courses":"Courses"}
\ No newline at end of file
diff --git a/src/frontend/js/translations/fr-CA.json b/src/frontend/js/translations/fr-CA.json
index a327552718..dd498f8e52 100644
--- a/src/frontend/js/translations/fr-CA.json
+++ b/src/frontend/js/translations/fr-CA.json
@@ -1 +1 @@
-{"components.CourseGlimpse.cover":"Couverture","components.CourseGlimpseList.courseCount":"Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche","components.CourseRunEnrollment.enroll":"S’inscrire maintenant","components.CourseRunEnrollment.enrolled":"Vous êtes inscrit à cette session","components.CourseRunEnrollment.enrollmentClosed":"L'inscription à ce cours est fermée pour le moment","components.CourseRunEnrollment.enrollmentFailed":"Votre demande d'inscription a échoué.","components.CourseRunEnrollment.goToCourse":"Accéder au cours","components.CourseRunEnrollment.loadingInitial":"Chargement des critères d'inscription...","components.CourseRunEnrollment.loginToEnroll":"Connectez-vous pour vous inscrire","components.DesktopUserMenu.menuPurpose":"Accéder aux préférences de votre profil","components.LanguageSelector.currentlySelected":"(actuellement sélectionné)","components.LanguageSelector.languages":"Langues","components.LanguageSelector.selectLanguage":"Sélectionnez une langue:","components.LanguageSelector.switchToLanguage":"Voir en {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Actuellement sur la dernière page: {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actuellement sur la page {page}","components.PaginateCourseSearch.lastPageN":"Dernière page: {page}","components.PaginateCourseSearch.nextPageN":"Page suivante: {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Page précédente: {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Recherche de cours","components.Search.errorMessage":"Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés.","components.Search.hideFiltersPane":"Cacher le menu des filtres","components.Search.showFiltersPane":"Montrer le menu des filtres","components.Search.spinnerText":"Chargement des résultats de recherche...","components.Search.textQueryLengthWarning":"La recherche de texte nécessite au moins 3 caractères. { query } n'est pas assez long. Les résultats de recherche ne seront pas affectés par cette requête.","components.SearchFilterGroupModal.closeModal":"Fermer le modal","components.SearchFilterGroupModal.error":"La recherche de filtres pour {filterName} a rencontré une erreur.","components.SearchFilterGroupModal.inputLabel":"Rechercher des filtres à ajouter","components.SearchFilterGroupModal.inputPlaceholder":"Rechercher parmi les { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Charger plus de résultats","components.SearchFilterGroupModal.loadingResults":"Chargement des résultats de recherche...","components.SearchFilterGroupModal.modalTitle":"Ajouter des filtres pour {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Plus de choix","components.SearchFilterGroupModal.queryTooShort":"Tapez 3 caractères ou plus pour commencer à chercher.","components.SearchFilterValueParent.ariaHideChildren":"Cacher les filtres supplémentaires pour {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Montrer plus de filtres pour {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirer {activeFilterCount, number} {activeFilterCount, plural, one {filtre actif} other {filtres actifs}}","components.SearchFiltersPane.title":"Filtrer les cours","components.SearchInput.button":"Chercher","components.SearchSuggestField.searchFieldPlaceholder":"Recherche des cours, des organisations, des catégories","components.UserLogin.logIn":"Connexion","components.UserLogin.logOut":"Déconnexion","components.UserLogin.signup":"Inscription","components.UserLogin.spinnerText":"Vérification de l'état de connexion...","components.useStaticFilters.courses":"Cours"}
\ No newline at end of file
+{"components.AddressesManagement.actionCreation":"creation","components.AddressesManagement.actionDeletion":"deletion","components.AddressesManagement.actionPromotion":"promotion","components.AddressesManagement.actionUpdate":"update","components.AddressesManagement.addAddress":"Add a new address","components.AddressesManagement.addressInput":"Address","components.AddressesManagement.cancelButton":"Cancel","components.AddressesManagement.cancelTitleButton":"Cancel edition","components.AddressesManagement.cityInput":"City","components.AddressesManagement.closeButton":"Go back","components.AddressesManagement.countryInput":"Country","components.AddressesManagement.deleteButton":"Delete","components.AddressesManagement.deleteButtonLabel":"Delete \"{title}\" address","components.AddressesManagement.deletionConfirmation":"Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after.","components.AddressesManagement.editAddress":"Update address {title}","components.AddressesManagement.editButton":"Edit","components.AddressesManagement.editButtonLabel":"Edit \"{title}\" address","components.AddressesManagement.error":"An error occurred while address {action}. Please retry later.","components.AddressesManagement.first_nameInput":"Recipient's first name","components.AddressesManagement.last_nameInput":"Recipient's last name","components.AddressesManagement.postcodeInput":"Postcode","components.AddressesManagement.promoteButtonLabel":"Define \"{title}\" address as main","components.AddressesManagement.registeredAddresses":"Your addresses","components.AddressesManagement.saveInput":"Save this address","components.AddressesManagement.selectButton":"Use this address","components.AddressesManagement.selectButtonLabel":"Select \"{title}\" address","components.AddressesManagement.titleInput":"Address title","components.AddressesManagement.updateButton":"Update this address","components.CourseGlimpse.categoryLabel":"Category","components.CourseGlimpse.codeIconAlt":"Course code","components.CourseGlimpse.cover":"Couverture","components.CourseGlimpse.organizationIconAlt":"Organization","components.CourseGlimpseFooter.dateIconAlt":"Course date","components.CourseGlimpseList.courseCount":"Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche","components.CourseGlimpseList.offscreenCourseCount":"{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseProductCertificateItem.certificateExplanation":"You will be able to download your certificate once you will pass all course runs.","components.CourseProductCertificateItem.congratulations":"Congratulations, you passed this course!","components.CourseProductCertificateItem.download":"Download","components.CourseProductCertificateItem.generatingCertificate":"Certificate is being generated...","components.CourseProductItem.enrolled":"Enrolled","components.CourseProductsList.end":"End","components.CourseProductsList.loadingInitial":"Loading course information...","components.CourseProductsList.start":"Start","components.CourseProductsLists.enrollOn":"Enrollment from {start} to {end}","components.CourseProductsLists.noCourseRunAvailable":"No session available for this course.","components.CourseRunEnrollment.enroll":"S’inscrire maintenant","components.CourseRunEnrollment.enrolled":"Vous êtes inscrit à cette session","components.CourseRunEnrollment.enrollmentClosed":"L'inscription à ce cours est fermée pour le moment","components.CourseRunEnrollment.enrollmentFailed":"Votre demande d'inscription a échoué.","components.CourseRunEnrollment.goToCourse":"Accéder au cours","components.CourseRunEnrollment.loadingInitial":"Chargement des critères d'inscription...","components.CourseRunEnrollment.loginToEnroll":"Connectez-vous pour vous inscrire","components.CourseRunList.enrollFromTo":"Enrollment from {start} to {end}","components.CourseRunList.noCourseRunAvailable":"No session available for this course.","components.DesktopUserMenu.menuPurpose":"Accéder aux préférences de votre profil","components.EnrollableCourseRunList.ariaSelectCourseRun":"Select course run from {start} to {end}.","components.EnrollableCourseRunList.enroll":"Enroll","components.EnrollableCourseRunList.enrollOn":"Enrollment from {enrollment_start} to {enrollment_end}","components.EnrollableCourseRunList.enrolling":"Enrolling...","components.EnrollableCourseRunList.enrollmentNotYetOpened":"Enrollment will open on {enrollment_start}","components.EnrollableCourseRunList.noCourseRunAvailable":"No session available for this course.","components.EnrollableCourseRunList.selectCourseRun":"Select a course run","components.EnrolledCourseRun.goToCourse":"Go to course","components.EnrolledCourseRun.unroll":"Unroll","components.EnrolledCourseRun.unrolling":"Unrolling...","components.LanguageSelector.currentlySelected":"(actuellement sélectionné)","components.LanguageSelector.languages":"Langues","components.LanguageSelector.selectLanguage":"Sélectionnez une langue:","components.LanguageSelector.switchToLanguage":"Voir en {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Actuellement sur la dernière page: {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actuellement sur la page {page}","components.PaginateCourseSearch.lastPageN":"Dernière page: {page}","components.PaginateCourseSearch.nextPageN":"Page suivante: {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Page précédente: {page}","components.PaymentButton.errorAbort":"Vous avez annulé le paiement.","components.PaymentButton.errorAborting":"Paiement en cours d'annulation...","components.PaymentButton.errorDefault":"Une erreur s'est produite lors du paiement. Veuillez réessayer plus tard.","components.PaymentButton.pay":"Payer {price}","components.PaymentButton.payInOneClick":"Payer en un clic {price}","components.PaymentButton.paymentInProgress":"Paiement en cours","components.PurchasedProductMenu.actionsRelated":"Other actions related to this product","components.PurchasedProductMenu.downloadInvoice":"Download invoice","components.PurchasedProductMenu.generatingInvoice":"Invoice is being generated...","components.RegisteredCreditCard.expirationDate":"Expiration date: {expirationDate}","components.RegisteredCreditCard.inputAriaLabel":"{selected, select, true {Unselect} other {Select}} {title}'s card","components.RootSearchSuggestField.searchFieldPlaceholder":"Recherche de cours","components.SaleTunnel.closeDialog":"Close the dialog","components.SaleTunnel.loginToPurchase":"Login to purchase","components.SaleTunnel.stepPayment":"Payment","components.SaleTunnel.stepResume":"Resume","components.SaleTunnel.stepValidation":"Validation","components.SaleTunnelStepPayment.registeredCardSectionTitle":"Your registered credit card","components.SaleTunnelStepPayment.resumeTile":"You are about to purchase","components.SaleTunnelStepPayment.userBillingAddressAddLabel":"Add an address","components.SaleTunnelStepPayment.userBillingAddressCreateLabel":"Create an address","components.SaleTunnelStepPayment.userBillingAddressFieldset":"Billing address","components.SaleTunnelStepPayment.userBillingAddressNoEntry":"You have not yet a billing address.","components.SaleTunnelStepPayment.userBillingAddressSelectLabel":"Select a billing address","components.SaleTunnelStepPayment.userTile":"Your personal information","components.SaleTunnelStepResume.congratulations":"Congratulations!","components.SaleTunnelStepResume.cta":"Start this course now!","components.SaleTunnelStepResume.successDetailMessage":"You will receive your invoice by email in a few moments.","components.SaleTunnelStepResume.successMessage":"Your order has been successfully created.","components.SaleTunnelStepValidation.availableCourseRuns":"{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available","components.SaleTunnelStepValidation.courseRunDates":"From {start} to {end}","components.SaleTunnelStepValidation.includingVAT":"including VAT","components.SaleTunnelStepValidation.proceedToPayment":"Proceed to payment","components.Search.errorMessage":"Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés.","components.Search.hideFiltersPane":"Cacher le menu des filtres","components.Search.resultsTitle":"Résultats de recherche","components.Search.showFiltersPane":"Montrer le menu des filtres","components.Search.spinnerText":"Chargement des résultats de recherche...","components.Search.textQueryLengthWarning":"La recherche de texte nécessite au moins 3 caractères. { query } n'est pas assez long. Les résultats de recherche ne seront pas affectés par cette requête.","components.SearchFilterGroupModal.closeModal":"Fermer le modal","components.SearchFilterGroupModal.error":"La recherche de filtres pour {filterName} a rencontré une erreur.","components.SearchFilterGroupModal.inputLabel":"Rechercher des filtres à ajouter","components.SearchFilterGroupModal.inputPlaceholder":"Rechercher parmi les { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Charger plus de résultats","components.SearchFilterGroupModal.loadingResults":"Chargement des résultats de recherche...","components.SearchFilterGroupModal.modalTitle":"Ajouter des filtres pour {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Plus de choix","components.SearchFilterGroupModal.queryTooShort":"Tapez 3 caractères ou plus pour commencer à chercher.","components.SearchFilterValueParent.ariaHideChildren":"Cacher les filtres supplémentaires pour {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Montrer plus de filtres pour {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirer {activeFilterCount, number} {activeFilterCount, plural, one {filtre actif} other {filtres actifs}}","components.SearchFiltersPane.title":"Filtrer les cours","components.SearchInput.button":"Chercher","components.SearchSuggestField.searchFieldPlaceholder":"Recherche des cours, des organisations, des catégories","components.UserLogin.logIn":"Connexion","components.UserLogin.logOut":"Déconnexion","components.UserLogin.signup":"Inscription","components.UserLogin.spinnerText":"Vérification de l'état de connexion...","components.useStaticFilters.courses":"Cours"}
\ No newline at end of file
diff --git a/src/frontend/js/translations/fr-FR.json b/src/frontend/js/translations/fr-FR.json
index 37fc44b942..8305016662 100644
--- a/src/frontend/js/translations/fr-FR.json
+++ b/src/frontend/js/translations/fr-FR.json
@@ -1 +1 @@
-{"components.CourseGlimpse.cover":"Couverture","components.CourseGlimpseList.courseCount":"Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche","components.CourseRunEnrollment.enroll":"S’inscrire maintenant","components.CourseRunEnrollment.enrolled":"Vous êtes inscrit à cette session","components.CourseRunEnrollment.enrollmentClosed":"L'inscription à ce cours est fermée pour le moment","components.CourseRunEnrollment.enrollmentFailed":"Votre demande d'inscription a échoué.","components.CourseRunEnrollment.goToCourse":"Accéder au cours","components.CourseRunEnrollment.loadingInitial":"Chargement des critères d'inscription...","components.CourseRunEnrollment.loginToEnroll":"Connectez-vous pour vous inscrire","components.DesktopUserMenu.menuPurpose":"Accéder aux préférences de votre profil","components.LanguageSelector.currentlySelected":"(actuellement sélectionné)","components.LanguageSelector.languages":"Langues","components.LanguageSelector.selectLanguage":"Sélectionnez une langue:","components.LanguageSelector.switchToLanguage":"Voir en {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Actuellement sur la dernière page: {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actuellement sur la page {page}","components.PaginateCourseSearch.lastPageN":"Dernière page: {page}","components.PaginateCourseSearch.nextPageN":"Page suivante: {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Page précédente: {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Recherche de cours","components.Search.errorMessage":"Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés.","components.Search.hideFiltersPane":"Cacher le menu des filtres","components.Search.showFiltersPane":"Montrer le menu des filtres","components.Search.spinnerText":"Chargement des résultats de recherche...","components.Search.textQueryLengthWarning":"La recherche de texte nécessite au moins 3 caractères. { query } n'est pas assez long pour la recherche. Les résultats de recherche ne seront pas affectés par cette requête.","components.SearchFilterGroupModal.closeModal":"Fermer la fenêtre modale","components.SearchFilterGroupModal.error":"La recherche de filtres pour {filterName} a rencontré une erreur.","components.SearchFilterGroupModal.inputLabel":"Rechercher des filtres à ajouter","components.SearchFilterGroupModal.inputPlaceholder":"Rechercher parmi les { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Charger plus de résultats","components.SearchFilterGroupModal.loadingResults":"Chargement des résultats de recherche...","components.SearchFilterGroupModal.modalTitle":"Ajouter des filtres pour {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Plus de choix","components.SearchFilterGroupModal.queryTooShort":"Tapez 3 caractères ou plus pour commencer à chercher.","components.SearchFilterValueParent.ariaHideChildren":"Cacher les filtres supplémentaires pour {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Montrer plus de filtres pour {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirer {activeFilterCount, number} {activeFilterCount, plural, one {filtre actif} other {filtres actifs}}","components.SearchFiltersPane.title":"Filtrer les cours","components.SearchInput.button":"Recherche","components.SearchSuggestField.searchFieldPlaceholder":"Recherche des cours, des organisations, des catégories","components.UserLogin.logIn":"Connexion","components.UserLogin.logOut":"Déconnexion","components.UserLogin.signup":"Inscription","components.UserLogin.spinnerText":"Vérification de l'état de connexion...","components.useStaticFilters.courses":"Cours"}
\ No newline at end of file
+{"components.AddressesManagement.actionCreation":"création","components.AddressesManagement.actionDeletion":"suppression","components.AddressesManagement.actionPromotion":"promotion","components.AddressesManagement.actionUpdate":"mise à jour","components.AddressesManagement.addAddress":"Ajouter une nouvelle adresse","components.AddressesManagement.addressInput":"Adresse","components.AddressesManagement.cancelButton":"Annuler","components.AddressesManagement.cancelTitleButton":"Annuler la modification","components.AddressesManagement.cityInput":"Ville","components.AddressesManagement.closeButton":"Retour","components.AddressesManagement.countryInput":"Pays","components.AddressesManagement.deleteButton":"Supprimer","components.AddressesManagement.deleteButtonLabel":"Supprimer l'adresse \"{title}\"","components.AddressesManagement.deletionConfirmation":"Êtes-vous sûr de vouloir supprimer l'adresse \"{title}\" ? ⚠️ Vous ne pourrez pas annuler ce changement après.","components.AddressesManagement.editAddress":"Mettre à jour l'adresse {title}","components.AddressesManagement.editButton":"Modifier","components.AddressesManagement.editButtonLabel":"Modifier l'adresse \"{title}\"","components.AddressesManagement.error":"Une erreur s'est produire lors de la {action} de l'adresse. Veuillez réessayer plus tard.","components.AddressesManagement.first_nameInput":"Prénom du destinataire","components.AddressesManagement.last_nameInput":"Nom du destinataire","components.AddressesManagement.postcodeInput":"Code postal","components.AddressesManagement.promoteButtonLabel":"Utiliser l'adresse \"{title}\" comme adresse principale","components.AddressesManagement.registeredAddresses":"Vos adresses","components.AddressesManagement.saveInput":"Sauvegarder cette adresse","components.AddressesManagement.selectButton":"Utiliser cette adresse","components.AddressesManagement.selectButtonLabel":"Sélectionner l'adresse \"{title}\"","components.AddressesManagement.titleInput":"Titre de l'adresse","components.AddressesManagement.updateButton":"Mettre à jour cette adresse","components.CourseGlimpse.categoryLabel":"Catégorie","components.CourseGlimpse.codeIconAlt":"Code du cours","components.CourseGlimpse.cover":"Couverture","components.CourseGlimpse.organizationIconAlt":"Établissement","components.CourseGlimpseFooter.dateIconAlt":"Date du cours","components.CourseGlimpseList.courseCount":"Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche","components.CourseGlimpseList.offscreenCourseCount":"{courseCount, number} {courseCount, plural, one {cours correspond} other {cours correspondent}} à votre recherche","components.CourseProductCertificateItem.certificateExplanation":"Vous pourrez télécharger votre certificat une fois que vous aurez réussi toutes les sessions.","components.CourseProductCertificateItem.congratulations":"Félicitations, vous avez terminé ce cours !","components.CourseProductCertificateItem.download":"Télécharger","components.CourseProductCertificateItem.generatingCertificate":"Certificat en cours de génération...","components.CourseProductItem.enrolled":"Inscrit","components.CourseProductsList.end":"Fin","components.CourseProductsList.loadingInitial":"Chargement des informations du cours...","components.CourseProductsList.start":"Début","components.CourseProductsLists.enrollOn":"Inscription du {start} au {end}","components.CourseProductsLists.noCourseRunAvailable":"Aucune session disponible pour ce cours.","components.CourseRunEnrollment.enroll":"S’inscrire maintenant","components.CourseRunEnrollment.enrolled":"Vous êtes inscrit à cette session","components.CourseRunEnrollment.enrollmentClosed":"L'inscription à ce cours est fermée pour le moment","components.CourseRunEnrollment.enrollmentFailed":"Votre demande d'inscription a échoué.","components.CourseRunEnrollment.goToCourse":"Accéder au cours","components.CourseRunEnrollment.loadingInitial":"Chargement des critères d'inscription...","components.CourseRunEnrollment.loginToEnroll":"Connectez-vous pour vous inscrire","components.CourseRunList.enrollFromTo":"Inscription du {start} au {end}","components.CourseRunList.noCourseRunAvailable":"Aucune session disponible pour ce cours.","components.DesktopUserMenu.menuPurpose":"Accéder aux préférences de votre profil","components.EnrollableCourseRunList.ariaSelectCourseRun":"Sélectionnez le cours se déroulant du {start} au {end}.","components.EnrollableCourseRunList.enroll":"S'inscrire","components.EnrollableCourseRunList.enrollOn":"Inscription du {enrollment_start} au {enrollment_end}","components.EnrollableCourseRunList.enrolling":"Inscription en cours...","components.EnrollableCourseRunList.enrollmentNotYetOpened":"Les inscriptions ouvriront le {enrollment_start}","components.EnrollableCourseRunList.noCourseRunAvailable":"Aucune session disponible pour ce cours.","components.EnrollableCourseRunList.selectCourseRun":"Sélectionnez une session","components.EnrolledCourseRun.goToCourse":"Accéder au cours","components.EnrolledCourseRun.unroll":"Se désinscrire","components.EnrolledCourseRun.unrolling":"Unrolling...","components.LanguageSelector.currentlySelected":"(actuellement sélectionné)","components.LanguageSelector.languages":"Langues","components.LanguageSelector.selectLanguage":"Sélectionnez une langue:","components.LanguageSelector.switchToLanguage":"Voir en {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Actuellement sur la dernière page: {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actuellement sur la page {page}","components.PaginateCourseSearch.lastPageN":"Dernière page: {page}","components.PaginateCourseSearch.nextPageN":"Page suivante: {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Page précédente: {page}","components.PaymentButton.errorAbort":"Vous avez annulé le paiement.","components.PaymentButton.errorAborting":"Paiement en cours d'annulation...","components.PaymentButton.errorDefault":"Une erreur s'est produite lors du paiement. Veuillez réessayer plus tard.","components.PaymentButton.pay":"Payer {price}","components.PaymentButton.payInOneClick":"Payer en un clic {price}","components.PaymentButton.paymentInProgress":"Paiement en cours","components.PurchasedProductMenu.actionsRelated":"Autres actions liées à ce produit","components.PurchasedProductMenu.downloadInvoice":"Télécharger la facture","components.PurchasedProductMenu.generatingInvoice":"La facture est en cours de génération...","components.RegisteredCreditCard.expirationDate":"Date d'expiration : {expirationDate}","components.RegisteredCreditCard.inputAriaLabel":"{selected, select, true {Déselectionner} other {Sélectionner}} la carte {title}","components.RootSearchSuggestField.searchFieldPlaceholder":"Recherche de cours","components.SaleTunnel.closeDialog":"Fermer la fenêtre de dialogue","components.SaleTunnel.loginToPurchase":"Connectez-vous pour acheter","components.SaleTunnel.stepPayment":"Paiement","components.SaleTunnel.stepResume":"Continuer","components.SaleTunnel.stepValidation":"Validation","components.SaleTunnelStepPayment.registeredCardSectionTitle":"Vos cartes enregistrées","components.SaleTunnelStepPayment.resumeTile":"Vous êtes sur le point d'acheter","components.SaleTunnelStepPayment.userBillingAddressAddLabel":"Ajouter une adresse","components.SaleTunnelStepPayment.userBillingAddressCreateLabel":"Créer une adresse","components.SaleTunnelStepPayment.userBillingAddressFieldset":"Adresse de facturation","components.SaleTunnelStepPayment.userBillingAddressNoEntry":"You have not yet a billing address.","components.SaleTunnelStepPayment.userBillingAddressSelectLabel":"Sélectionner une adresse de facturation","components.SaleTunnelStepPayment.userTile":"Vos informations personnelles","components.SaleTunnelStepResume.congratulations":"Félicitations !","components.SaleTunnelStepResume.cta":"Commencer ce cours dès maintenant !","components.SaleTunnelStepResume.successDetailMessage":"Vous allez recevoir votre facture par mail dans quelques instants.","components.SaleTunnelStepResume.successMessage":"Votre commande a été créée avec succès.","components.SaleTunnelStepValidation.availableCourseRuns":"{ count, plural, =0 {Aucune session disponible} one {Une session disponible} other {# sessions disponibles}}","components.SaleTunnelStepValidation.courseRunDates":"Du {start} au {end}","components.SaleTunnelStepValidation.includingVAT":"TTC","components.SaleTunnelStepValidation.proceedToPayment":"Procéder au paiement","components.Search.errorMessage":"Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés.","components.Search.hideFiltersPane":"Cacher le menu des filtres","components.Search.resultsTitle":"Résultats de recherche","components.Search.showFiltersPane":"Montrer le menu des filtres","components.Search.spinnerText":"Chargement des résultats de recherche...","components.Search.textQueryLengthWarning":"La recherche de texte nécessite au moins 3 caractères. { query } n'est pas assez long pour la recherche. Les résultats de recherche ne seront pas affectés par cette requête.","components.SearchFilterGroupModal.closeModal":"Fermer la fenêtre modale","components.SearchFilterGroupModal.error":"La recherche de filtres pour {filterName} a rencontré une erreur.","components.SearchFilterGroupModal.inputLabel":"Rechercher des filtres à ajouter","components.SearchFilterGroupModal.inputPlaceholder":"Rechercher parmi les { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Charger plus de résultats","components.SearchFilterGroupModal.loadingResults":"Chargement des résultats de recherche...","components.SearchFilterGroupModal.modalTitle":"Ajouter des filtres pour {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Plus de choix","components.SearchFilterGroupModal.queryTooShort":"Tapez 3 caractères ou plus pour commencer à chercher.","components.SearchFilterValueParent.ariaHideChildren":"Cacher les filtres supplémentaires pour {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Montrer plus de filtres pour {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirer {activeFilterCount, number} {activeFilterCount, plural, one {filtre actif} other {filtres actifs}}","components.SearchFiltersPane.title":"Filtrer les cours","components.SearchInput.button":"Recherche","components.SearchSuggestField.searchFieldPlaceholder":"Recherche des cours, des organisations, des catégories","components.UserLogin.logIn":"Connexion","components.UserLogin.logOut":"Déconnexion","components.UserLogin.signup":"Inscription","components.UserLogin.spinnerText":"Vérification de l'état de connexion...","components.useStaticFilters.courses":"Cours"}
\ No newline at end of file
diff --git a/src/frontend/js/translations/pt-PT.json b/src/frontend/js/translations/pt-PT.json
index 546ed5db45..a5820fa5ae 100644
--- a/src/frontend/js/translations/pt-PT.json
+++ b/src/frontend/js/translations/pt-PT.json
@@ -1 +1 @@
-{"components.CourseGlimpse.cover":"Capa","components.CourseGlimpseList.courseCount":"A mostrar de {start, number} a {end, number} de {courseCount, number} {courseCount, plural, one {curso} other {cursos}} de acordo com a sua pesquisa","components.CourseRunEnrollment.enroll":"Inscreva-se já","components.CourseRunEnrollment.enrolled":"Está inscrito nesta edição do curso","components.CourseRunEnrollment.enrollmentClosed":"A inscrição nesta edição do curso está fechada de momento","components.CourseRunEnrollment.enrollmentFailed":"Ocorreu um erro ao processar a inscrição.","components.CourseRunEnrollment.goToCourse":"Ir para o curso","components.CourseRunEnrollment.loadingInitial":"A carregar a informação da inscrição...","components.CourseRunEnrollment.loginToEnroll":"Faça login para se inscrever","components.DesktopUserMenu.menuPurpose":"Acesso às suas configurações de perfil","components.LanguageSelector.currentlySelected":"(selecionado)","components.LanguageSelector.languages":"Idiomas","components.LanguageSelector.selectLanguage":"Selecione um idioma:","components.LanguageSelector.switchToLanguage":"Mudar idioma para {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"A ler a última página {page}","components.PaginateCourseSearch.currentlyReadingPageN":"A ler a página {page}","components.PaginateCourseSearch.lastPageN":"Última página {page}","components.PaginateCourseSearch.nextPageN":"Página seguinte {page}","components.PaginateCourseSearch.pageN":"Página {page}","components.PaginateCourseSearch.pagination":"Paginação","components.PaginateCourseSearch.previousPageN":"Página anterior {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Pesquisar cursos","components.Search.errorMessage":"Ocorreu um erro! Não foi possível carregar os cursos.","components.Search.hideFiltersPane":"Ocultar painel de filtros","components.Search.showFiltersPane":"Mostrar painel de filtros","components.Search.spinnerText":"A carregar os resultados da pesquisa...","components.Search.textQueryLengthWarning":"A pesquisa de texto requer pelo menos 3 caracteres. { query } não é longo o suficiente para pesquisar. Os resultados da pesquisa não serão alterados por esta consulta.","components.SearchFilterGroupModal.closeModal":"Fechar modal","components.SearchFilterGroupModal.error":"Ocorreu um erro ao pesquisar por {filterName}.","components.SearchFilterGroupModal.inputLabel":"Pesquisar por filtros para adicionar","components.SearchFilterGroupModal.inputPlaceholder":"Pesquisar em { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Carregar mais resultados","components.SearchFilterGroupModal.loadingResults":"A carregar os resultados da pesquisa...","components.SearchFilterGroupModal.modalTitle":"Adicionar filtros para {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Mais opções","components.SearchFilterGroupModal.queryTooShort":"Digite pelo menos 3 caracteres para iniciar a pesquisa.","components.SearchFilterValueParent.ariaHideChildren":"Ocultar filtros adicionais para {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Mostrar mais filtros para {filterValueName}","components.SearchFiltersPane.clearFilters":"Limpar {activeFilterCount, number} {activeFilterCount, plural, one {filtro} other {filtros}} {activeFilterCount, plural, one {ativo} other {ativos}}","components.SearchFiltersPane.title":"Filtrar cursos","components.SearchInput.button":"Pesquisar","components.SearchSuggestField.searchFieldPlaceholder":"Pesquisar cursos, organizações, categorias","components.UserLogin.logIn":"Entrar","components.UserLogin.logOut":"Sair","components.UserLogin.signup":"Registar","components.UserLogin.spinnerText":"A carregar estado do login...","components.useStaticFilters.courses":"Cursos"}
\ No newline at end of file
+{"components.AddressesManagement.actionCreation":"criação","components.AddressesManagement.actionDeletion":"exclusão","components.AddressesManagement.actionPromotion":"promoção","components.AddressesManagement.actionUpdate":"atualização","components.AddressesManagement.addAddress":"Adicionar um novo endereço","components.AddressesManagement.addressInput":"Endereço","components.AddressesManagement.cancelButton":"Cancelar","components.AddressesManagement.cancelTitleButton":"Cancelar edição","components.AddressesManagement.cityInput":"Cidade","components.AddressesManagement.closeButton":"Voltar","components.AddressesManagement.countryInput":"País","components.AddressesManagement.deleteButton":"Eliminar","components.AddressesManagement.deleteButtonLabel":"Eliminar endereço de \"{title}\"","components.AddressesManagement.deletionConfirmation":"Tem certeza que deseja eliminar o endereço \"{title}? ⚠️ Não é possível desfazer essa alteração.","components.AddressesManagement.editAddress":"Atualizar endereço {title}","components.AddressesManagement.editButton":"Editar","components.AddressesManagement.editButtonLabel":"Editar endereço de \"{title}\"","components.AddressesManagement.error":"Ocorreu um erro durante o processo de {action} de endereço. Por favor, tente novamente mais tarde.","components.AddressesManagement.first_nameInput":"Primeiro nome do destinatário","components.AddressesManagement.last_nameInput":"Apelido do destinatário","components.AddressesManagement.postcodeInput":"Código Postal","components.AddressesManagement.promoteButtonLabel":"Defina o endereço \"{title}\" como principal","components.AddressesManagement.registeredAddresses":"Os seus endereços","components.AddressesManagement.saveInput":"Guardar este endereço","components.AddressesManagement.selectButton":"Usar esta endereço","components.AddressesManagement.selectButtonLabel":"Selecionar o endereço \"{title}\"","components.AddressesManagement.titleInput":"Título do Endereço","components.AddressesManagement.updateButton":"Atualizar este endereço","components.CourseGlimpse.categoryLabel":"Categoria","components.CourseGlimpse.codeIconAlt":"Código do curso","components.CourseGlimpse.cover":"Capa","components.CourseGlimpse.organizationIconAlt":"Organização","components.CourseGlimpseFooter.dateIconAlt":"Data do curso","components.CourseGlimpseList.courseCount":"A mostrar de {start, number} a {end, number} de {courseCount, number} {courseCount, plural, one {curso} other {cursos}} de acordo com a sua pesquisa","components.CourseGlimpseList.offscreenCourseCount":"{courseCount, number} {courseCount, plural, one {curso} other {cursos}} {courseCount, plural, one {corresponde} other {correspondem}} à sua pesquisa","components.CourseProductCertificateItem.certificateExplanation":"Poderá descarregar o seu certificado assim que completar todas as edições de curso.","components.CourseProductCertificateItem.congratulations":"Parabéns, concluiu o curso com sucesso!","components.CourseProductCertificateItem.download":"Descarregar","components.CourseProductCertificateItem.generatingCertificate":"O certificado está a ser gerado...","components.CourseProductItem.enrolled":"Inscrito","components.CourseProductsList.end":"Fim","components.CourseProductsList.loadingInitial":"A carregar informação do curso...","components.CourseProductsList.start":"Início","components.CourseProductsLists.enrollOn":"Inscrições de {start} a {end}","components.CourseProductsLists.noCourseRunAvailable":"Nenhuma sessão disponível para este curso.","components.CourseRunEnrollment.enroll":"Inscreva-se já","components.CourseRunEnrollment.enrolled":"Está inscrito nesta edição do curso","components.CourseRunEnrollment.enrollmentClosed":"A inscrição nesta edição do curso está fechada de momento","components.CourseRunEnrollment.enrollmentFailed":"Ocorreu um erro ao processar a inscrição.","components.CourseRunEnrollment.goToCourse":"Ir para o curso","components.CourseRunEnrollment.loadingInitial":"A carregar a informação da inscrição...","components.CourseRunEnrollment.loginToEnroll":"Faça login para se inscrever","components.CourseRunList.enrollFromTo":"Inscrição de {start} a {end}","components.CourseRunList.noCourseRunAvailable":"Nenhuma sessão disponível para este curso.","components.DesktopUserMenu.menuPurpose":"Acesso às suas configurações de perfil","components.EnrollableCourseRunList.ariaSelectCourseRun":"Escolher edição do curso de {start} a {end}.","components.EnrollableCourseRunList.enroll":"Inscrever","components.EnrollableCourseRunList.enrollOn":"Inscrições de {enrollment_start} a {enrollment_end}","components.EnrollableCourseRunList.enrolling":"Inscrevendo...","components.EnrollableCourseRunList.enrollmentNotYetOpened":"Inscrições abertas a {enrollment_start}","components.EnrollableCourseRunList.noCourseRunAvailable":"Nenhuma sessão disponível para este curso.","components.EnrollableCourseRunList.selectCourseRun":"Selecione uma edição do curso","components.EnrolledCourseRun.goToCourse":"Ir para o curso","components.EnrolledCourseRun.unroll":"Desinscrever","components.EnrolledCourseRun.unrolling":"Desinscrevendo...","components.LanguageSelector.currentlySelected":"(selecionado)","components.LanguageSelector.languages":"Idiomas","components.LanguageSelector.selectLanguage":"Selecione um idioma:","components.LanguageSelector.switchToLanguage":"Mudar idioma para {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"A ler a última página {page}","components.PaginateCourseSearch.currentlyReadingPageN":"A ler a página {page}","components.PaginateCourseSearch.lastPageN":"Última página {page}","components.PaginateCourseSearch.nextPageN":"Página seguinte {page}","components.PaginateCourseSearch.pageN":"Página {page}","components.PaginateCourseSearch.pagination":"Paginação","components.PaginateCourseSearch.previousPageN":"Página anterior {page}","components.PaymentButton.errorAbort":"O pagamento foi cancelado.","components.PaymentButton.errorAborting":"Cancelando o pagamento...","components.PaymentButton.errorDefault":"Ocorreu um erro durante o pagamento. Por favor, tente novamente mais tarde.","components.PaymentButton.pay":"Pagar {price}","components.PaymentButton.payInOneClick":"Pague com um clique {price}","components.PaymentButton.paymentInProgress":"A processar pagamento","components.PurchasedProductMenu.actionsRelated":"Outras ações relacionadas com este produto","components.PurchasedProductMenu.downloadInvoice":"Descarregar fatura","components.PurchasedProductMenu.generatingInvoice":"A fatura está a ser gerada...","components.RegisteredCreditCard.expirationDate":"Expira a {expirationDate}","components.RegisteredCreditCard.inputAriaLabel":"{selected, select, true {Não selecionado} other {Selecionado}} o cartão {title}","components.RootSearchSuggestField.searchFieldPlaceholder":"Pesquisar cursos","components.SaleTunnel.closeDialog":"Fechar esta caixa de diálogo","components.SaleTunnel.loginToPurchase":"Faça login para comprar","components.SaleTunnel.stepPayment":"Pagamento","components.SaleTunnel.stepResume":"Continuar","components.SaleTunnel.stepValidation":"Validação","components.SaleTunnelStepPayment.registeredCardSectionTitle":"O seu cartão de crédito foi registado","components.SaleTunnelStepPayment.resumeTile":"Está prestes a concluir a compra","components.SaleTunnelStepPayment.userBillingAddressAddLabel":"Adicionar um endereço","components.SaleTunnelStepPayment.userBillingAddressCreateLabel":"Criar novo endereço","components.SaleTunnelStepPayment.userBillingAddressFieldset":"Endereço de faturação","components.SaleTunnelStepPayment.userBillingAddressNoEntry":"Você ainda não tem um endereço de faturação.","components.SaleTunnelStepPayment.userBillingAddressSelectLabel":"Selecione o endereço de faturação","components.SaleTunnelStepPayment.userTile":"A sua informação pessoal","components.SaleTunnelStepResume.congratulations":"Parabéns!","components.SaleTunnelStepResume.cta":"Iniciar este curso agora!","components.SaleTunnelStepResume.successDetailMessage":"Dentro de instantes receberá a sua fatura por e-mail.","components.SaleTunnelStepResume.successMessage":"O seu pedido foi criado com sucesso.","components.SaleTunnelStepValidation.availableCourseRuns":"{count, plural, =0 {Sem edições de curso} one {Uma edição do curso} other {# edições do curso}} {count, plural, =0 {disponíveis} one {disponível} other {disponíveis}}","components.SaleTunnelStepValidation.courseRunDates":"De {start} a {end}","components.SaleTunnelStepValidation.includingVAT":"IVA incluído","components.SaleTunnelStepValidation.proceedToPayment":"Prosseguir para o pagamento","components.Search.errorMessage":"Ocorreu um erro! Não foi possível carregar os cursos.","components.Search.hideFiltersPane":"Ocultar painel de filtros","components.Search.resultsTitle":"Resultados da pesquisa","components.Search.showFiltersPane":"Mostrar painel de filtros","components.Search.spinnerText":"A carregar os resultados da pesquisa...","components.Search.textQueryLengthWarning":"A pesquisa de texto requer pelo menos 3 caracteres. { query } não é longo o suficiente para pesquisar. Os resultados da pesquisa não serão alterados por esta consulta.","components.SearchFilterGroupModal.closeModal":"Fechar modal","components.SearchFilterGroupModal.error":"Ocorreu um erro ao pesquisar por {filterName}.","components.SearchFilterGroupModal.inputLabel":"Pesquisar por filtros para adicionar","components.SearchFilterGroupModal.inputPlaceholder":"Pesquisar em { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Carregar mais resultados","components.SearchFilterGroupModal.loadingResults":"A carregar os resultados da pesquisa...","components.SearchFilterGroupModal.modalTitle":"Adicionar filtros para {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Mais opções","components.SearchFilterGroupModal.queryTooShort":"Digite pelo menos 3 caracteres para iniciar a pesquisa.","components.SearchFilterValueParent.ariaHideChildren":"Ocultar filtros adicionais para {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Mostrar mais filtros para {filterValueName}","components.SearchFiltersPane.clearFilters":"Limpar {activeFilterCount, number} {activeFilterCount, plural, one {filtro} other {filtros}} {activeFilterCount, plural, one {ativo} other {ativos}}","components.SearchFiltersPane.title":"Filtrar cursos","components.SearchInput.button":"Pesquisar","components.SearchSuggestField.searchFieldPlaceholder":"Pesquisar cursos, organizações, categorias","components.UserLogin.logIn":"Entrar","components.UserLogin.logOut":"Sair","components.UserLogin.signup":"Registar","components.UserLogin.spinnerText":"A carregar estado do login...","components.useStaticFilters.courses":"Cursos"}
\ No newline at end of file
diff --git a/src/frontend/js/translations/ru-RU.json b/src/frontend/js/translations/ru-RU.json
index 3940c5e93b..8c7ef23401 100644
--- a/src/frontend/js/translations/ru-RU.json
+++ b/src/frontend/js/translations/ru-RU.json
@@ -1 +1 @@
-{"components.CourseGlimpse.cover":"Обложка","components.CourseGlimpseList.courseCount":"Показано от {start, number} до {end, number} на {courseCount, number} {courseCount, plural, one {курсе} few {курсах} many {курсах} other {курсах}} в соответствии с вашим поиском","components.CourseRunEnrollment.enroll":"Записаться сейчас","components.CourseRunEnrollment.enrolled":"Вы зачислены на этот курс","components.CourseRunEnrollment.enrollmentClosed":"Регистрация на курс в данный момент закрыта","components.CourseRunEnrollment.enrollmentFailed":"Не удалось выполнить запрос на зачисление.","components.CourseRunEnrollment.goToCourse":"Перейти к курсу","components.CourseRunEnrollment.loadingInitial":"Загрузка информации о зачислении...","components.CourseRunEnrollment.loginToEnroll":"Войти для записи","components.DesktopUserMenu.menuPurpose":"Доступ к настройкам вашего профиля","components.LanguageSelector.currentlySelected":"(сейчас выбрано)","components.LanguageSelector.languages":"Языки","components.LanguageSelector.selectLanguage":"Выберите язык:","components.LanguageSelector.switchToLanguage":"Переключиться на {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"В настоящее время чтение последней страницы {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Сейчас чтение страницы {page}","components.PaginateCourseSearch.lastPageN":"Последняя страница {page}","components.PaginateCourseSearch.nextPageN":"Следующая страница {page}","components.PaginateCourseSearch.pageN":"Страница {page}","components.PaginateCourseSearch.pagination":"Постраничная навигация","components.PaginateCourseSearch.previousPageN":"Предыдущая страница {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Поиск курсов","components.Search.errorMessage":"Что-то не так! Курсы не могут быть загружены.","components.Search.hideFiltersPane":"Скрыть панель фильтров","components.Search.showFiltersPane":"Показать панель фильтров","components.Search.spinnerText":"Загрузка результатов поиска...","components.Search.textQueryLengthWarning":"Текстовый поиск требует не менее 3 символов. { query } не достаточно длинный, чтобы искать. Этот запрос не повлияет на результаты поиска.","components.SearchFilterGroupModal.closeModal":"Закрыть модальное окно","components.SearchFilterGroupModal.error":"Произошла ошибка при поиске {filterName}.","components.SearchFilterGroupModal.inputLabel":"Поиск фильтров для добавления","components.SearchFilterGroupModal.inputPlaceholder":"Искать в { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Загрузить больше результатов","components.SearchFilterGroupModal.loadingResults":"Загрузка результатов поиска...","components.SearchFilterGroupModal.modalTitle":"Добавить фильтры для {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Ещё опции","components.SearchFilterGroupModal.queryTooShort":"Введите минимум 3 символа, чтобы начать поиск.","components.SearchFilterValueParent.ariaHideChildren":"Скрыть дополнительные фильтры для {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Показать больше фильтров для {filterValueName}","components.SearchFiltersPane.clearFilters":"Очистите {activeFilterCount, number} {activeFilterCount, plural, one {активный фильтр} few {активных фильтра} many {активных фильтров} other {активных фильтров}}","components.SearchFiltersPane.title":"Фильтровать курсы","components.SearchInput.button":"Поиск","components.SearchSuggestField.searchFieldPlaceholder":"Поиск курсов, организаций, категорий","components.UserLogin.logIn":"Вход","components.UserLogin.logOut":"Выход","components.UserLogin.signup":"Зарегистрироваться","components.UserLogin.spinnerText":"Загрузка статуса входа...","components.useStaticFilters.courses":"Курсы"}
\ No newline at end of file
+{"components.AddressesManagement.actionCreation":"creation","components.AddressesManagement.actionDeletion":"deletion","components.AddressesManagement.actionPromotion":"promotion","components.AddressesManagement.actionUpdate":"update","components.AddressesManagement.addAddress":"Add a new address","components.AddressesManagement.addressInput":"Address","components.AddressesManagement.cancelButton":"Cancel","components.AddressesManagement.cancelTitleButton":"Cancel edition","components.AddressesManagement.cityInput":"City","components.AddressesManagement.closeButton":"Go back","components.AddressesManagement.countryInput":"Country","components.AddressesManagement.deleteButton":"Delete","components.AddressesManagement.deleteButtonLabel":"Delete \"{title}\" address","components.AddressesManagement.deletionConfirmation":"Are you sure you want to delete the \"{title}\" address ? ⚠️ You cannot undo this change after.","components.AddressesManagement.editAddress":"Update address {title}","components.AddressesManagement.editButton":"Edit","components.AddressesManagement.editButtonLabel":"Edit \"{title}\" address","components.AddressesManagement.error":"An error occurred while address {action}. Please retry later.","components.AddressesManagement.first_nameInput":"Recipient's first name","components.AddressesManagement.last_nameInput":"Recipient's last name","components.AddressesManagement.postcodeInput":"Postcode","components.AddressesManagement.promoteButtonLabel":"Define \"{title}\" address as main","components.AddressesManagement.registeredAddresses":"Your addresses","components.AddressesManagement.saveInput":"Save this address","components.AddressesManagement.selectButton":"Use this address","components.AddressesManagement.selectButtonLabel":"Select \"{title}\" address","components.AddressesManagement.titleInput":"Address title","components.AddressesManagement.updateButton":"Update this address","components.CourseGlimpse.categoryLabel":"Category","components.CourseGlimpse.codeIconAlt":"Course code","components.CourseGlimpse.cover":"Обложка","components.CourseGlimpse.organizationIconAlt":"Organization","components.CourseGlimpseFooter.dateIconAlt":"Course date","components.CourseGlimpseList.courseCount":"Показано от {start, number} до {end, number} на {courseCount, number} {courseCount, plural, one {курсе} few {курсах} many {курсах} other {курсах}} в соответствии с вашим поиском","components.CourseGlimpseList.offscreenCourseCount":"{courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseProductCertificateItem.certificateExplanation":"You will be able to download your certificate once you will pass all course runs.","components.CourseProductCertificateItem.congratulations":"Congratulations, you passed this course!","components.CourseProductCertificateItem.download":"Download","components.CourseProductCertificateItem.generatingCertificate":"Certificate is being generated...","components.CourseProductItem.enrolled":"Enrolled","components.CourseProductsList.end":"End","components.CourseProductsList.loadingInitial":"Loading course information...","components.CourseProductsList.start":"Start","components.CourseProductsLists.enrollOn":"Enrollment from {start} to {end}","components.CourseProductsLists.noCourseRunAvailable":"No session available for this course.","components.CourseRunEnrollment.enroll":"Записаться сейчас","components.CourseRunEnrollment.enrolled":"Вы зачислены на этот курс","components.CourseRunEnrollment.enrollmentClosed":"Регистрация на курс в данный момент закрыта","components.CourseRunEnrollment.enrollmentFailed":"Не удалось выполнить запрос на зачисление.","components.CourseRunEnrollment.goToCourse":"Перейти к курсу","components.CourseRunEnrollment.loadingInitial":"Загрузка информации о зачислении...","components.CourseRunEnrollment.loginToEnroll":"Войти для записи","components.CourseRunList.enrollFromTo":"Enrollment from {start} to {end}","components.CourseRunList.noCourseRunAvailable":"No session available for this course.","components.DesktopUserMenu.menuPurpose":"Доступ к настройкам вашего профиля","components.EnrollableCourseRunList.ariaSelectCourseRun":"Select course run from {start} to {end}.","components.EnrollableCourseRunList.enroll":"Enroll","components.EnrollableCourseRunList.enrollOn":"Enrollment from {enrollment_start} to {enrollment_end}","components.EnrollableCourseRunList.enrolling":"Enrolling...","components.EnrollableCourseRunList.enrollmentNotYetOpened":"Enrollment will open on {enrollment_start}","components.EnrollableCourseRunList.noCourseRunAvailable":"No session available for this course.","components.EnrollableCourseRunList.selectCourseRun":"Select a course run","components.EnrolledCourseRun.goToCourse":"Go to course","components.EnrolledCourseRun.unroll":"Unroll","components.EnrolledCourseRun.unrolling":"Unrolling...","components.LanguageSelector.currentlySelected":"(сейчас выбрано)","components.LanguageSelector.languages":"Языки","components.LanguageSelector.selectLanguage":"Выберите язык:","components.LanguageSelector.switchToLanguage":"Переключиться на {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"В настоящее время чтение последней страницы {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Сейчас чтение страницы {page}","components.PaginateCourseSearch.lastPageN":"Последняя страница {page}","components.PaginateCourseSearch.nextPageN":"Следующая страница {page}","components.PaginateCourseSearch.pageN":"Страница {page}","components.PaginateCourseSearch.pagination":"Постраничная навигация","components.PaginateCourseSearch.previousPageN":"Предыдущая страница {page}","components.PaymentButton.errorAbort":"Вы прервали оплату.","components.PaymentButton.errorAborting":"Прерывание оплаты...","components.PaymentButton.errorDefault":"Произошла ошибка во время оплаты. Пожалуйста, повторите попытку позже.","components.PaymentButton.pay":"Оплатить {price}","components.PaymentButton.payInOneClick":"Оплатить в один клик {price}","components.PaymentButton.paymentInProgress":"Оплата в процессе","components.PurchasedProductMenu.actionsRelated":"Other actions related to this product","components.PurchasedProductMenu.downloadInvoice":"Download invoice","components.PurchasedProductMenu.generatingInvoice":"Invoice is being generated...","components.RegisteredCreditCard.expirationDate":"Expiration date: {expirationDate}","components.RegisteredCreditCard.inputAriaLabel":"{selected, select, true {Unselect} other {Select}} {title}'s card","components.RootSearchSuggestField.searchFieldPlaceholder":"Поиск курсов","components.SaleTunnel.closeDialog":"Close the dialog","components.SaleTunnel.loginToPurchase":"Login to purchase","components.SaleTunnel.stepPayment":"Payment","components.SaleTunnel.stepResume":"Resume","components.SaleTunnel.stepValidation":"Validation","components.SaleTunnelStepPayment.registeredCardSectionTitle":"Your registered credit card","components.SaleTunnelStepPayment.resumeTile":"You are about to purchase","components.SaleTunnelStepPayment.userBillingAddressAddLabel":"Add an address","components.SaleTunnelStepPayment.userBillingAddressCreateLabel":"Create an address","components.SaleTunnelStepPayment.userBillingAddressFieldset":"Billing address","components.SaleTunnelStepPayment.userBillingAddressNoEntry":"You have not yet a billing address.","components.SaleTunnelStepPayment.userBillingAddressSelectLabel":"Select a billing address","components.SaleTunnelStepPayment.userTile":"Your personal information","components.SaleTunnelStepResume.congratulations":"Congratulations!","components.SaleTunnelStepResume.cta":"Start this course now!","components.SaleTunnelStepResume.successDetailMessage":"You will receive your invoice by email in a few moments.","components.SaleTunnelStepResume.successMessage":"Your order has been successfully created.","components.SaleTunnelStepValidation.availableCourseRuns":"{ count, plural, =0 {No course runs} one {One course run} other {# course runs} } available","components.SaleTunnelStepValidation.courseRunDates":"From {start} to {end}","components.SaleTunnelStepValidation.includingVAT":"including VAT","components.SaleTunnelStepValidation.proceedToPayment":"Proceed to payment","components.Search.errorMessage":"Что-то не так! Курсы не могут быть загружены.","components.Search.hideFiltersPane":"Скрыть панель фильтров","components.Search.resultsTitle":"Результаты поиска","components.Search.showFiltersPane":"Показать панель фильтров","components.Search.spinnerText":"Загрузка результатов поиска...","components.Search.textQueryLengthWarning":"Текстовый поиск требует не менее 3 символов. { query } не достаточно длинный, чтобы искать. Этот запрос не повлияет на результаты поиска.","components.SearchFilterGroupModal.closeModal":"Закрыть модальное окно","components.SearchFilterGroupModal.error":"Произошла ошибка при поиске {filterName}.","components.SearchFilterGroupModal.inputLabel":"Поиск фильтров для добавления","components.SearchFilterGroupModal.inputPlaceholder":"Искать в { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Загрузить больше результатов","components.SearchFilterGroupModal.loadingResults":"Загрузка результатов поиска...","components.SearchFilterGroupModal.modalTitle":"Добавить фильтры для {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Ещё опции","components.SearchFilterGroupModal.queryTooShort":"Введите минимум 3 символа, чтобы начать поиск.","components.SearchFilterValueParent.ariaHideChildren":"Скрыть дополнительные фильтры для {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Показать больше фильтров для {filterValueName}","components.SearchFiltersPane.clearFilters":"Очистите {activeFilterCount, number} {activeFilterCount, plural, one {активный фильтр} few {активных фильтра} many {активных фильтров} other {активных фильтров}}","components.SearchFiltersPane.title":"Фильтровать курсы","components.SearchInput.button":"Поиск","components.SearchSuggestField.searchFieldPlaceholder":"Поиск курсов, организаций, категорий","components.UserLogin.logIn":"Вход","components.UserLogin.logOut":"Выход","components.UserLogin.signup":"Зарегистрироваться","components.UserLogin.spinnerText":"Загрузка статуса входа...","components.useStaticFilters.courses":"Курсы"}
\ No newline at end of file
diff --git a/src/frontend/package.json b/src/frontend/package.json
index bac3fb2a5f..5ead530e67 100644
--- a/src/frontend/package.json
+++ b/src/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "richie-education",
- "version": "2.13.0",
+ "version": "2.14.0",
"description": "A CMS to build learning portals for Open Education",
"main": "sandbox/manage.py",
"scripts": {
diff --git a/src/richie/locale/ar_SA/LC_MESSAGES/django.mo b/src/richie/locale/ar_SA/LC_MESSAGES/django.mo
index 73052c2b08..163c84a87e 100644
Binary files a/src/richie/locale/ar_SA/LC_MESSAGES/django.mo and b/src/richie/locale/ar_SA/LC_MESSAGES/django.mo differ
diff --git a/src/richie/locale/ar_SA/LC_MESSAGES/django.po b/src/richie/locale/ar_SA/LC_MESSAGES/django.po
index 03f037532c..169748e161 100644
--- a/src/richie/locale/ar_SA/LC_MESSAGES/django.po
+++ b/src/richie/locale/ar_SA/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: richie\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-17 18:04+0000\n"
-"PO-Revision-Date: 2022-02-18 09:49\n"
+"POT-Creation-Date: 2022-04-01 15:01+0000\n"
+"PO-Revision-Date: 2022-04-04 07:53\n"
"Last-Translator: \n"
"Language-Team: Arabic, Saudi Arabia\n"
"Language: ar_SA\n"
@@ -103,29 +103,28 @@ msgstr ""
msgid "You are here:"
msgstr ""
-#: apps/core/templates/richie/base.html:74
+#: apps/core/templates/richie/base.html:78
msgid "Skip to main content"
msgstr ""
-#: apps/core/templates/richie/base.html:86
+#: apps/core/templates/richie/base.html:90
msgid "Go to homepage"
msgstr ""
-#: apps/core/templates/richie/base.html:111
-#: apps/courses/templates/courses/cms/course_detail.html:172
+#: apps/core/templates/richie/base.html:115
msgid "Contact us"
msgstr ""
-#: apps/core/templates/richie/base.html:143
+#: apps/core/templates/richie/base.html:147
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:32
msgid "Learn more"
msgstr ""
-#: apps/core/templates/richie/base.html:157
+#: apps/core/templates/richie/base.html:161
msgid "Life-changing learning!"
msgstr ""
-#: apps/core/templates/richie/base.html:171
+#: apps/core/templates/richie/base.html:175
msgid "Powered by"
msgstr ""
@@ -182,23 +181,31 @@ msgstr ""
msgid "Richie news: %(title)s %(url)s"
msgstr ""
-#: apps/core/templates/social-networks/blogpost-badges.html:10
-#: apps/core/templates/social-networks/course-badges.html:10
+#: apps/core/templates/social-networks/blogpost-badges.html:11
+#: apps/core/templates/social-networks/blogpost-badges.html:12
+#: apps/core/templates/social-networks/course-badges.html:11
+#: apps/core/templates/social-networks/course-badges.html:12
msgid "Share on Facebook"
msgstr ""
-#: apps/core/templates/social-networks/blogpost-badges.html:20
-#: apps/core/templates/social-networks/course-badges.html:20
+#: apps/core/templates/social-networks/blogpost-badges.html:21
+#: apps/core/templates/social-networks/blogpost-badges.html:22
+#: apps/core/templates/social-networks/course-badges.html:21
+#: apps/core/templates/social-networks/course-badges.html:22
msgid "Share on Twitter"
msgstr ""
-#: apps/core/templates/social-networks/blogpost-badges.html:30
-#: apps/core/templates/social-networks/course-badges.html:30
+#: apps/core/templates/social-networks/blogpost-badges.html:31
+#: apps/core/templates/social-networks/blogpost-badges.html:32
+#: apps/core/templates/social-networks/course-badges.html:31
+#: apps/core/templates/social-networks/course-badges.html:32
msgid "Share on Linkedin"
msgstr ""
-#: apps/core/templates/social-networks/blogpost-badges.html:40
-#: apps/core/templates/social-networks/course-badges.html:40
+#: apps/core/templates/social-networks/blogpost-badges.html:41
+#: apps/core/templates/social-networks/blogpost-badges.html:42
+#: apps/core/templates/social-networks/course-badges.html:41
+#: apps/core/templates/social-networks/course-badges.html:42
msgid "Share by Email"
msgstr ""
@@ -211,21 +218,19 @@ msgstr ""
msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s"
msgstr ""
+#: apps/core/templates/social-networks/footer-badges.html:7
#: apps/core/templates/social-networks/footer-badges.html:8
msgid "Facebook"
msgstr ""
-#: apps/core/templates/social-networks/footer-badges.html:16
+#: apps/core/templates/social-networks/footer-badges.html:17
+#: apps/core/templates/social-networks/footer-badges.html:18
msgid "Twitter page"
msgstr ""
-#: apps/core/templates/social-networks/footer-badges.html:19
-msgid "Twitter"
-msgstr ""
-
#: apps/core/templates/social-networks/footer-badges.html:27
-#: apps/core/templates/social-networks/footer-badges.html:30
-msgid "Linkedin"
+#: apps/core/templates/social-networks/footer-badges.html:28
+msgid "Linkedin page"
msgstr ""
#: apps/core/views/error.py:7
@@ -273,6 +278,8 @@ msgid "See filer folder"
msgstr ""
#: apps/courses/cms_plugins.py:27
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:55
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:56
msgid "Organization"
msgstr ""
@@ -281,6 +288,7 @@ msgid "Organization by Category"
msgstr ""
#: apps/courses/cms_plugins.py:87
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:29
msgid "Category"
msgstr ""
@@ -538,13 +546,13 @@ msgid "blog posts"
msgstr ""
#: apps/courses/models/blog.py:91 apps/courses/models/category.py:154
-#: apps/courses/models/course.py:981 apps/courses/models/organization.py:199
+#: apps/courses/models/course.py:983 apps/courses/models/organization.py:199
#: apps/courses/models/organization.py:233
msgid "variant"
msgstr ""
#: apps/courses/models/blog.py:94 apps/courses/models/category.py:157
-#: apps/courses/models/course.py:984 apps/courses/models/organization.py:202
+#: apps/courses/models/course.py:986 apps/courses/models/organization.py:202
#: apps/courses/models/organization.py:236
msgid "Optional glimpse variant for a custom look."
msgstr ""
@@ -737,55 +745,59 @@ msgstr ""
msgid "Course run translations"
msgstr ""
-#: apps/courses/models/course.py:991
+#: apps/courses/models/course.py:932
+msgid "Empty title"
+msgstr ""
+
+#: apps/courses/models/course.py:993
msgid "course plugin"
msgstr ""
-#: apps/courses/models/course.py:992
+#: apps/courses/models/course.py:994
msgid "course plugins"
msgstr ""
-#: apps/courses/models/course.py:1009 plugins/large_banner/models.py:38
+#: apps/courses/models/course.py:1011 plugins/large_banner/models.py:38
msgid "logo"
msgstr ""
-#: apps/courses/models/course.py:1011
+#: apps/courses/models/course.py:1013
msgid "url"
msgstr ""
-#: apps/courses/models/course.py:1014 apps/courses/models/course.py:1038
+#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1040
msgid "name"
msgstr ""
-#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1039
+#: apps/courses/models/course.py:1018 apps/courses/models/course.py:1041
msgid "content"
msgstr ""
-#: apps/courses/models/course.py:1021
+#: apps/courses/models/course.py:1023
msgid "licence"
msgstr ""
-#: apps/courses/models/course.py:1022
+#: apps/courses/models/course.py:1024
msgid "licences"
msgstr ""
-#: apps/courses/models/course.py:1044
+#: apps/courses/models/course.py:1046
msgid "Licence translation"
msgstr ""
-#: apps/courses/models/course.py:1045
+#: apps/courses/models/course.py:1047
msgid "licence translations"
msgstr ""
-#: apps/courses/models/course.py:1059
+#: apps/courses/models/course.py:1061
msgid "description"
msgstr ""
-#: apps/courses/models/course.py:1063
+#: apps/courses/models/course.py:1065
msgid "licence plugin"
msgstr ""
-#: apps/courses/models/course.py:1064
+#: apps/courses/models/course.py:1066
msgid "licence plugins"
msgstr ""
@@ -897,213 +909,241 @@ msgstr ""
msgid "{:s} | {:s}"
msgstr ""
-#: apps/courses/settings/__init__.py:35
+#: apps/courses/settings/__init__.py:77
msgid "Course page"
msgstr ""
-#: apps/courses/settings/__init__.py:36
+#: apps/courses/settings/__init__.py:78
msgid "Organization list"
msgstr ""
-#: apps/courses/settings/__init__.py:37
+#: apps/courses/settings/__init__.py:79
msgid "Organization page"
msgstr ""
-#: apps/courses/settings/__init__.py:38
+#: apps/courses/settings/__init__.py:80
msgid "Category list"
msgstr ""
-#: apps/courses/settings/__init__.py:39
+#: apps/courses/settings/__init__.py:81
msgid "Category page"
msgstr ""
-#: apps/courses/settings/__init__.py:40
+#: apps/courses/settings/__init__.py:82
msgid "Blog post list"
msgstr ""
-#: apps/courses/settings/__init__.py:41
+#: apps/courses/settings/__init__.py:83
msgid "Blog post page"
msgstr ""
-#: apps/courses/settings/__init__.py:42
+#: apps/courses/settings/__init__.py:84
msgid "Person page"
msgstr ""
-#: apps/courses/settings/__init__.py:43
+#: apps/courses/settings/__init__.py:85
msgid "Person list"
msgstr ""
-#: apps/courses/settings/__init__.py:44
+#: apps/courses/settings/__init__.py:86
msgid "Program page"
msgstr ""
-#: apps/courses/settings/__init__.py:45
+#: apps/courses/settings/__init__.py:87
msgid "Program list"
msgstr ""
-#: apps/courses/settings/__init__.py:46
+#: apps/courses/settings/__init__.py:88
msgid "Search"
msgstr ""
-#: apps/courses/settings/__init__.py:47
+#: apps/courses/settings/__init__.py:89
msgid "List of child pages"
msgstr ""
-#: apps/courses/settings/__init__.py:48
+#: apps/courses/settings/__init__.py:90
msgid "Homepage"
msgstr ""
-#: apps/courses/settings/__init__.py:49
+#: apps/courses/settings/__init__.py:91
msgid "Single column"
msgstr ""
-#: apps/courses/settings/__init__.py:56
+#: apps/courses/settings/__init__.py:92
+msgid "Three columns: (33% | 33% | 33%)"
+msgstr ""
+
+#: apps/courses/settings/__init__.py:93
+msgid "Two columns: (50% | 50%)"
+msgstr ""
+
+#: apps/courses/settings/__init__.py:94
+msgid "Two columns: (25% | 75%)"
+msgstr ""
+
+#: apps/courses/settings/__init__.py:95
+msgid "Two columns: (75% | 25%)"
+msgstr ""
+
+#: apps/courses/settings/__init__.py:102
msgid "Footer"
msgstr ""
-#: apps/courses/settings/__init__.py:61
+#: apps/courses/settings/__init__.py:107
msgid "Static headline"
msgstr ""
-#: apps/courses/settings/__init__.py:68 apps/courses/settings/__init__.py:90
-#: apps/courses/settings/__init__.py:317
+#: apps/courses/settings/__init__.py:114 apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:138 apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:155 apps/courses/settings/__init__.py:162
+#: apps/courses/settings/__init__.py:371
msgid "Main content"
msgstr ""
-#: apps/courses/settings/__init__.py:120 apps/courses/settings/__init__.py:278
-#: apps/courses/settings/__init__.py:298
+#: apps/courses/settings/__init__.py:141 apps/courses/settings/__init__.py:151
+#: apps/courses/settings/__init__.py:158 apps/courses/settings/__init__.py:165
+msgid "Secondary content"
+msgstr ""
+
+#: apps/courses/settings/__init__.py:144
+msgid "Third content"
+msgstr ""
+
+#: apps/courses/settings/__init__.py:169 apps/courses/settings/__init__.py:332
+#: apps/courses/settings/__init__.py:352
#: apps/courses/templates/courses/cms/blogpost_detail.html:108
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:10
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:41
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:76
-#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:9
-#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:8
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:10
+#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:9
#: apps/courses/templates/courses/cms/program_detail.html:40
msgid "Cover"
msgstr ""
-#: apps/courses/settings/__init__.py:125
+#: apps/courses/settings/__init__.py:174
msgid "Catch phrase"
msgstr ""
-#: apps/courses/settings/__init__.py:130
+#: apps/courses/settings/__init__.py:179
msgid "Teaser"
msgstr ""
-#: apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:184
msgid "About the course"
msgstr ""
-#: apps/courses/settings/__init__.py:140
+#: apps/courses/settings/__init__.py:189
msgid "What you will learn"
msgstr ""
-#: apps/courses/settings/__init__.py:144
+#: apps/courses/settings/__init__.py:193
msgid "Format"
msgstr ""
-#: apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:197
msgid "Prerequisites"
msgstr ""
-#: apps/courses/settings/__init__.py:152
+#: apps/courses/settings/__init__.py:201
msgid "Team"
msgstr ""
-#: apps/courses/settings/__init__.py:156
+#: apps/courses/settings/__init__.py:205
msgid "Plan"
msgstr ""
-#: apps/courses/settings/__init__.py:161
+#: apps/courses/settings/__init__.py:210
msgid "Complementary information"
msgstr ""
-#: apps/courses/settings/__init__.py:173
-#: apps/courses/templates/courses/cms/course_detail.html:464
+#: apps/courses/settings/__init__.py:222
+#: apps/courses/templates/courses/cms/course_detail.html:526
#: apps/courses/templates/courses/cms/fragment_course_relations.html:47
msgid "License for the course content"
msgstr ""
-#: apps/courses/settings/__init__.py:178
-#: apps/courses/templates/courses/cms/course_detail.html:475
+#: apps/courses/settings/__init__.py:227
+#: apps/courses/templates/courses/cms/course_detail.html:537
#: apps/courses/templates/courses/cms/fragment_course_relations.html:56
msgid "License for the content created by course participants"
msgstr ""
-#: apps/courses/settings/__init__.py:183 apps/courses/settings/__init__.py:211
-#: apps/courses/settings/__init__.py:242 apps/courses/settings/__init__.py:274
+#: apps/courses/settings/__init__.py:232 apps/courses/settings/__init__.py:260
+#: apps/courses/settings/__init__.py:296 apps/courses/settings/__init__.py:328
msgid "Categories"
msgstr ""
-#: apps/courses/settings/__init__.py:187 apps/courses/settings/__init__.py:231
+#: apps/courses/settings/__init__.py:236 apps/courses/settings/__init__.py:285
msgid "Icon"
msgstr ""
-#: apps/courses/settings/__init__.py:192 apps/courses/settings/__init__.py:264
+#: apps/courses/settings/__init__.py:241 apps/courses/settings/__init__.py:318
#: apps/courses/templates/courses/cms/fragment_course_relations.html:27
#: apps/courses/templates/courses/cms/person_detail.html:112
#: apps/search/defaults.py:115
msgid "Organizations"
msgstr ""
-#: apps/courses/settings/__init__.py:196
+#: apps/courses/settings/__init__.py:245
msgid "Assessment and Certification"
msgstr ""
-#: apps/courses/settings/__init__.py:201 apps/courses/settings/__init__.py:221
+#: apps/courses/settings/__init__.py:250 apps/courses/settings/__init__.py:275
#: apps/courses/templates/courses/cms/category_detail.html:35
msgid "Banner"
msgstr ""
-#: apps/courses/settings/__init__.py:206 apps/courses/settings/__init__.py:226
+#: apps/courses/settings/__init__.py:255 apps/courses/settings/__init__.py:280
#: apps/courses/templates/courses/cms/category_detail.html:53
-#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:40
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:41
msgid "Logo"
msgstr ""
-#: apps/courses/settings/__init__.py:215 apps/courses/settings/__init__.py:236
-#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:35
+#: apps/courses/settings/__init__.py:264 apps/courses/settings/__init__.py:290
msgid "Description"
msgstr ""
-#: apps/courses/settings/__init__.py:246
+#: apps/courses/settings/__init__.py:269 apps/courses/settings/__init__.py:337
+#: apps/courses/settings/__init__.py:357
+#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:46
+msgid "Excerpt"
+msgstr ""
+
+#: apps/courses/settings/__init__.py:300
msgid "Portrait"
msgstr ""
-#: apps/courses/settings/__init__.py:251
+#: apps/courses/settings/__init__.py:305
msgid "Bio"
msgstr ""
-#: apps/courses/settings/__init__.py:256
+#: apps/courses/settings/__init__.py:310
msgid "Main Content"
msgstr ""
-#: apps/courses/settings/__init__.py:269
+#: apps/courses/settings/__init__.py:323
msgid "Author"
msgstr ""
-#: apps/courses/settings/__init__.py:283 apps/courses/settings/__init__.py:303
-msgid "Excerpt"
-msgstr ""
-
-#: apps/courses/settings/__init__.py:288 apps/courses/settings/__init__.py:308
+#: apps/courses/settings/__init__.py:342 apps/courses/settings/__init__.py:362
msgid "Body"
msgstr ""
-#: apps/courses/settings/__init__.py:292
+#: apps/courses/settings/__init__.py:346
msgid "Headline"
msgstr ""
-#: apps/courses/settings/__init__.py:313
+#: apps/courses/settings/__init__.py:367
#: apps/courses/templates/courses/cms/person_detail.html:129
msgid "Courses"
msgstr ""
-#: apps/courses/settings/__init__.py:439
+#: apps/courses/settings/__init__.py:493
msgid "Button caesura"
msgstr ""
-#: apps/courses/settings/__init__.py:441
+#: apps/courses/settings/__init__.py:495
msgid "Full width"
msgstr ""
@@ -1124,6 +1164,7 @@ msgid "blog post cover image"
msgstr ""
#: apps/courses/templates/courses/cms/blogpost_detail.html:138
+#: apps/courses/templates/courses/cms/organization_detail.html:102
#: apps/courses/templates/courses/cms/program_detail.html:60
msgid "No excerpt content"
msgstr ""
@@ -1154,7 +1195,7 @@ msgid "Sub categories"
msgstr ""
#: apps/courses/templates/courses/cms/category_detail.html:118
-#: apps/courses/templates/courses/cms/organization_detail.html:106
+#: apps/courses/templates/courses/cms/organization_detail.html:120
#: apps/courses/templates/courses/cms/program_detail.html:78
msgid "Related courses"
msgstr ""
@@ -1192,12 +1233,12 @@ msgid "Related blogposts pagination"
msgstr ""
#: apps/courses/templates/courses/cms/category_detail.html:188
-#: apps/courses/templates/courses/cms/organization_detail.html:132
+#: apps/courses/templates/courses/cms/organization_detail.html:146
msgid "Related persons"
msgstr ""
#: apps/courses/templates/courses/cms/category_detail.html:193
-#: apps/courses/templates/courses/cms/organization_detail.html:139
+#: apps/courses/templates/courses/cms/organization_detail.html:153
msgid "Related persons pagination"
msgstr ""
@@ -1205,147 +1246,173 @@ msgstr ""
msgid "No categories"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:58
-#: apps/courses/templates/courses/cms/organization_detail.html:87
-#: apps/courses/templates/courses/cms/person_detail.html:47
-msgid "No associated categories"
+#: apps/courses/templates/courses/cms/course_detail.html:6
+#, python-format
+msgid "%(course_title)s - Course"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:72
+#: apps/courses/templates/courses/cms/course_detail.html:59
msgid "Ref. "
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:88
+#: apps/courses/templates/courses/cms/course_detail.html:73
+#: apps/courses/templates/courses/cms/organization_detail.html:91
+#: apps/courses/templates/courses/cms/person_detail.html:47
+msgid "No associated categories"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:94
msgid "Duration:"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:97
+#: apps/courses/templates/courses/cms/course_detail.html:103
msgid "Effort:"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:106
+#: apps/courses/templates/courses/cms/course_detail.html:112
msgid "Pace:"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:116
+#: apps/courses/templates/courses/cms/course_detail.html:122
msgid "Enter here a introduction of your course."
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:124
+#: apps/courses/templates/courses/cms/course_detail.html:130
#, python-format
msgid "\n"
" %(count)s already enrolled!\n"
" "
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:136
+#: apps/courses/templates/courses/cms/course_detail.html:142
msgid "Add a teaser video or add a cover image below and it will be used as teaser image as well."
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:148
-#: apps/courses/templates/courses/cms/course_detail.html:226
+#: apps/courses/templates/courses/cms/course_detail.html:154
+#: apps/courses/templates/courses/cms/course_detail.html:255
msgid "course cover image"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:198
+#: apps/courses/templates/courses/cms/course_detail.html:182
+msgid "No open course runs"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:192
+msgid "course runs are currently open for this course"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:196
+msgid "Choose now"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:227
#, python-format
msgid "\n"
" Archived on %(creation_date)s\n"
" "
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:202
+#: apps/courses/templates/courses/cms/course_detail.html:231
msgid "Go to current version"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:213
+#: apps/courses/templates/courses/cms/course_detail.html:242
msgid "Glimpse cover"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:215
+#: apps/courses/templates/courses/cms/course_detail.html:244
msgid "Add an image for course cover on its glimpse."
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:239
+#: apps/courses/templates/courses/cms/course_detail.html:268
msgctxt "course_detail__title"
msgid "What you will learn"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:240
+#: apps/courses/templates/courses/cms/course_detail.html:269
msgid "At the end of this course, you will be able to:"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:249
+#: apps/courses/templates/courses/cms/course_detail.html:278
msgctxt "course_detail__title"
msgid "Description"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:260
+#: apps/courses/templates/courses/cms/course_detail.html:289
msgctxt "course_detail__title"
msgid "Format"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:262
+#: apps/courses/templates/courses/cms/course_detail.html:291
msgid "How is the course structured?"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:271
+#: apps/courses/templates/courses/cms/course_detail.html:300
msgctxt "course_detail__title"
msgid "Prerequisites"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:274
+#: apps/courses/templates/courses/cms/course_detail.html:303
msgid "What are the prerequisites to follow this course?"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:284
+#: apps/courses/templates/courses/cms/course_detail.html:313
msgctxt "course_detail__title"
msgid "Assessment and certification"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:287
+#: apps/courses/templates/courses/cms/course_detail.html:316
msgid "How is progress evaluated and/or certified?"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:299
+#: apps/courses/templates/courses/cms/course_detail.html:328
msgctxt "course_detail__title"
msgid "Course plan"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:302
+#: apps/courses/templates/courses/cms/course_detail.html:331
msgid "Enter here the detailed course plan."
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:317
+#: apps/courses/templates/courses/cms/course_detail.html:349
+msgctxt "course_detail__title"
+msgid "Other course runs"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:351
msgctxt "course_detail__title"
msgid "Course runs"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:323
-msgid "No open course runs"
+#: apps/courses/templates/courses/cms/course_detail.html:361
+msgid "No course runs"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:363
+msgid "No other course runs"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:332
+#: apps/courses/templates/courses/cms/course_detail.html:387
msgctxt "Course runs to be scheduled (plural)"
msgid "To be scheduled"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:343
+#: apps/courses/templates/courses/cms/course_detail.html:400
msgctxt "Upcoming course runs (plural)"
msgid "Upcoming"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:354
+#: apps/courses/templates/courses/cms/course_detail.html:413
msgctxt "Ongoing course runs (plural)"
msgid "Ongoing"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:365
+#: apps/courses/templates/courses/cms/course_detail.html:426
msgctxt "Archived course runs (plural)"
msgid "Archived"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:389
+#: apps/courses/templates/courses/cms/course_detail.html:451
msgid "\n"
" This course is part of a program\n"
" "
@@ -1359,41 +1426,51 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: apps/courses/templates/courses/cms/course_detail.html:415
+#: apps/courses/templates/courses/cms/course_detail.html:477
msgctxt "course_detail__title"
msgid "Course team"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:420
+#: apps/courses/templates/courses/cms/course_detail.html:482
#: apps/courses/templates/courses/cms/fragment_course_relations.html:13
msgid "Who are the teachers in the course team?"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:434
+#: apps/courses/templates/courses/cms/course_detail.html:496
msgctxt "course_detail__title"
msgid "Organizations"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:439
+#: apps/courses/templates/courses/cms/course_detail.html:501
#: apps/courses/templates/courses/cms/fragment_course_relations.html:32
msgid "What are the organizations publishing this course?"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:460
+#: apps/courses/templates/courses/cms/course_detail.html:522
msgctxt "course_detail__title"
msgid "License"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:467
+#: apps/courses/templates/courses/cms/course_detail.html:529
#: apps/courses/templates/courses/cms/fragment_course_relations.html:50
msgid "What is the license for the course content?"
msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:478
+#: apps/courses/templates/courses/cms/course_detail.html:540
#: apps/courses/templates/courses/cms/fragment_course_relations.html:59
msgid "What is the license for the content created by course participants?"
msgstr ""
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:63
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:64
+msgid "Course code"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:83
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:84
+msgid "Course date"
+msgstr ""
+
#: apps/courses/templates/courses/cms/fragment_course_relations.html:8
msgid "Course team"
msgstr ""
@@ -1448,28 +1525,26 @@ msgid "\n"
" "
msgstr ""
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:16
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:39
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:8
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:9
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:17
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:40
msgid "Main organization"
msgstr ""
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:29
-msgid "main organization logo"
-msgstr ""
-
-#: apps/courses/templates/courses/cms/organization_detail.html:50
+#: apps/courses/templates/courses/cms/organization_detail.html:54
msgid "organization banner"
msgstr ""
-#: apps/courses/templates/courses/cms/organization_detail.html:71
+#: apps/courses/templates/courses/cms/organization_detail.html:75
msgid "organization logo"
msgstr ""
-#: apps/courses/templates/courses/cms/organization_detail.html:111
+#: apps/courses/templates/courses/cms/organization_detail.html:125
msgid "Related courses pagination"
msgstr ""
-#: apps/courses/templates/courses/cms/organization_detail.html:114
+#: apps/courses/templates/courses/cms/organization_detail.html:128
#, python-format
msgid "\n"
" See all courses related to %(organization_title)s\n"
@@ -1522,7 +1597,7 @@ msgstr ""
#. Translators: delay indicates when the course will start as a duration.
#. In english the string will be "The course will start in 3 days"
-#: apps/courses/templatetags/extra_tags.py:262
+#: apps/courses/templatetags/extra_tags.py:278
msgid "The course will start {delay:s}"
msgstr ""
diff --git a/src/richie/locale/es_ES/LC_MESSAGES/django.mo b/src/richie/locale/es_ES/LC_MESSAGES/django.mo
index fb1afb80e4..baab7f33dc 100644
Binary files a/src/richie/locale/es_ES/LC_MESSAGES/django.mo and b/src/richie/locale/es_ES/LC_MESSAGES/django.mo differ
diff --git a/src/richie/locale/es_ES/LC_MESSAGES/django.po b/src/richie/locale/es_ES/LC_MESSAGES/django.po
index 0f50257fec..00c4900432 100644
--- a/src/richie/locale/es_ES/LC_MESSAGES/django.po
+++ b/src/richie/locale/es_ES/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: richie\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-17 18:04+0000\n"
-"PO-Revision-Date: 2022-02-18 09:49\n"
+"POT-Creation-Date: 2022-04-01 15:01+0000\n"
+"PO-Revision-Date: 2022-04-04 07:53\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -99,29 +99,28 @@ msgstr "Su navegador no admite este formato de vídeo."
msgid "You are here:"
msgstr "Usted está aquí:"
-#: apps/core/templates/richie/base.html:74
+#: apps/core/templates/richie/base.html:78
msgid "Skip to main content"
msgstr "Saltar al contenido principal"
-#: apps/core/templates/richie/base.html:86
+#: apps/core/templates/richie/base.html:90
msgid "Go to homepage"
msgstr "Ir a la página de inicio"
-#: apps/core/templates/richie/base.html:111
-#: apps/courses/templates/courses/cms/course_detail.html:172
+#: apps/core/templates/richie/base.html:115
msgid "Contact us"
msgstr "Contáctenos"
-#: apps/core/templates/richie/base.html:143
+#: apps/core/templates/richie/base.html:147
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:32
msgid "Learn more"
msgstr "Saber más"
-#: apps/core/templates/richie/base.html:157
+#: apps/core/templates/richie/base.html:161
msgid "Life-changing learning!"
msgstr "¡Aprendizaje que cambia la vida!"
-#: apps/core/templates/richie/base.html:171
+#: apps/core/templates/richie/base.html:175
msgid "Powered by"
msgstr "Impulsado por"
@@ -178,23 +177,31 @@ msgstr "Noticias de Richie: %(title)s"
msgid "Richie news: %(title)s %(url)s"
msgstr "Noticias de Richie: %(title)s %(url)s"
-#: apps/core/templates/social-networks/blogpost-badges.html:10
-#: apps/core/templates/social-networks/course-badges.html:10
+#: apps/core/templates/social-networks/blogpost-badges.html:11
+#: apps/core/templates/social-networks/blogpost-badges.html:12
+#: apps/core/templates/social-networks/course-badges.html:11
+#: apps/core/templates/social-networks/course-badges.html:12
msgid "Share on Facebook"
msgstr "Compartir en Facebook"
-#: apps/core/templates/social-networks/blogpost-badges.html:20
-#: apps/core/templates/social-networks/course-badges.html:20
+#: apps/core/templates/social-networks/blogpost-badges.html:21
+#: apps/core/templates/social-networks/blogpost-badges.html:22
+#: apps/core/templates/social-networks/course-badges.html:21
+#: apps/core/templates/social-networks/course-badges.html:22
msgid "Share on Twitter"
msgstr "Compartir en Twitter"
-#: apps/core/templates/social-networks/blogpost-badges.html:30
-#: apps/core/templates/social-networks/course-badges.html:30
+#: apps/core/templates/social-networks/blogpost-badges.html:31
+#: apps/core/templates/social-networks/blogpost-badges.html:32
+#: apps/core/templates/social-networks/course-badges.html:31
+#: apps/core/templates/social-networks/course-badges.html:32
msgid "Share on Linkedin"
msgstr "Compartir en Linkedin"
-#: apps/core/templates/social-networks/blogpost-badges.html:40
-#: apps/core/templates/social-networks/course-badges.html:40
+#: apps/core/templates/social-networks/blogpost-badges.html:41
+#: apps/core/templates/social-networks/blogpost-badges.html:42
+#: apps/core/templates/social-networks/course-badges.html:41
+#: apps/core/templates/social-networks/course-badges.html:42
msgid "Share by Email"
msgstr "Compartir por Email"
@@ -207,22 +214,20 @@ msgstr "Sigua un curso en línea con Richie"
msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s"
msgstr "Acabo de inscribirme al curso \"%(title)s\" en Richie: %(url)s"
+#: apps/core/templates/social-networks/footer-badges.html:7
#: apps/core/templates/social-networks/footer-badges.html:8
msgid "Facebook"
msgstr "Facebook"
-#: apps/core/templates/social-networks/footer-badges.html:16
+#: apps/core/templates/social-networks/footer-badges.html:17
+#: apps/core/templates/social-networks/footer-badges.html:18
msgid "Twitter page"
msgstr "Página de Twitter"
-#: apps/core/templates/social-networks/footer-badges.html:19
-msgid "Twitter"
-msgstr "Twitter"
-
#: apps/core/templates/social-networks/footer-badges.html:27
-#: apps/core/templates/social-networks/footer-badges.html:30
-msgid "Linkedin"
-msgstr "Linkedin"
+#: apps/core/templates/social-networks/footer-badges.html:28
+msgid "Linkedin page"
+msgstr ""
#: apps/core/views/error.py:7
msgid "Bad request"
@@ -269,6 +274,8 @@ msgid "See filer folder"
msgstr "Ver carpeta de archivos"
#: apps/courses/cms_plugins.py:27
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:55
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:56
msgid "Organization"
msgstr "Organizaciones"
@@ -277,6 +284,7 @@ msgid "Organization by Category"
msgstr "Organización por categoría"
#: apps/courses/cms_plugins.py:87
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:29
msgid "Category"
msgstr "Categoría"
@@ -534,13 +542,13 @@ msgid "blog posts"
msgstr "entradas de blog"
#: apps/courses/models/blog.py:91 apps/courses/models/category.py:154
-#: apps/courses/models/course.py:981 apps/courses/models/organization.py:199
+#: apps/courses/models/course.py:983 apps/courses/models/organization.py:199
#: apps/courses/models/organization.py:233
msgid "variant"
msgstr "variante"
#: apps/courses/models/blog.py:94 apps/courses/models/category.py:157
-#: apps/courses/models/course.py:984 apps/courses/models/organization.py:202
+#: apps/courses/models/course.py:986 apps/courses/models/organization.py:202
#: apps/courses/models/organization.py:236
msgid "Optional glimpse variant for a custom look."
msgstr "Variante vista previa optional para un aspecto personalizado."
@@ -733,55 +741,59 @@ msgstr "Traducción de la sesión de curso"
msgid "Course run translations"
msgstr "Traducciones de la sesión de curso"
-#: apps/courses/models/course.py:991
+#: apps/courses/models/course.py:932
+msgid "Empty title"
+msgstr "Sin título"
+
+#: apps/courses/models/course.py:993
msgid "course plugin"
msgstr "plugin de curso"
-#: apps/courses/models/course.py:992
+#: apps/courses/models/course.py:994
msgid "course plugins"
msgstr "plugins de curso"
-#: apps/courses/models/course.py:1009 plugins/large_banner/models.py:38
+#: apps/courses/models/course.py:1011 plugins/large_banner/models.py:38
msgid "logo"
msgstr "logo"
-#: apps/courses/models/course.py:1011
+#: apps/courses/models/course.py:1013
msgid "url"
msgstr "url"
-#: apps/courses/models/course.py:1014 apps/courses/models/course.py:1038
+#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1040
msgid "name"
msgstr "nombre"
-#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1039
+#: apps/courses/models/course.py:1018 apps/courses/models/course.py:1041
msgid "content"
msgstr "contenido"
-#: apps/courses/models/course.py:1021
+#: apps/courses/models/course.py:1023
msgid "licence"
msgstr "licencia"
-#: apps/courses/models/course.py:1022
+#: apps/courses/models/course.py:1024
msgid "licences"
msgstr "licencias"
-#: apps/courses/models/course.py:1044
+#: apps/courses/models/course.py:1046
msgid "Licence translation"
msgstr "Traducción de la licencia"
-#: apps/courses/models/course.py:1045
+#: apps/courses/models/course.py:1047
msgid "licence translations"
msgstr "traducciones de licencias"
-#: apps/courses/models/course.py:1059
+#: apps/courses/models/course.py:1061
msgid "description"
msgstr "descripción"
-#: apps/courses/models/course.py:1063
+#: apps/courses/models/course.py:1065
msgid "licence plugin"
msgstr "plugin de licencia"
-#: apps/courses/models/course.py:1064
+#: apps/courses/models/course.py:1066
msgid "licence plugins"
msgstr "plugins de licencia"
@@ -893,213 +905,241 @@ msgstr "roles de página"
msgid "{:s} | {:s}"
msgstr "{:s} | {:s}"
-#: apps/courses/settings/__init__.py:35
+#: apps/courses/settings/__init__.py:77
msgid "Course page"
msgstr "Página de curso"
-#: apps/courses/settings/__init__.py:36
+#: apps/courses/settings/__init__.py:78
msgid "Organization list"
msgstr "Lista de organizaciones"
-#: apps/courses/settings/__init__.py:37
+#: apps/courses/settings/__init__.py:79
msgid "Organization page"
msgstr "Página organización"
-#: apps/courses/settings/__init__.py:38
+#: apps/courses/settings/__init__.py:80
msgid "Category list"
msgstr "Lista de categorías"
-#: apps/courses/settings/__init__.py:39
+#: apps/courses/settings/__init__.py:81
msgid "Category page"
msgstr "Página de categoría"
-#: apps/courses/settings/__init__.py:40
+#: apps/courses/settings/__init__.py:82
msgid "Blog post list"
msgstr "Lista de entradas de blog"
-#: apps/courses/settings/__init__.py:41
+#: apps/courses/settings/__init__.py:83
msgid "Blog post page"
msgstr "Página de entrada de blog"
-#: apps/courses/settings/__init__.py:42
+#: apps/courses/settings/__init__.py:84
msgid "Person page"
msgstr "Página persona"
-#: apps/courses/settings/__init__.py:43
+#: apps/courses/settings/__init__.py:85
msgid "Person list"
msgstr "Lista de personas"
-#: apps/courses/settings/__init__.py:44
+#: apps/courses/settings/__init__.py:86
msgid "Program page"
msgstr "Página de programa"
-#: apps/courses/settings/__init__.py:45
+#: apps/courses/settings/__init__.py:87
msgid "Program list"
msgstr "Lista de programas"
-#: apps/courses/settings/__init__.py:46
+#: apps/courses/settings/__init__.py:88
msgid "Search"
msgstr "Buscar"
-#: apps/courses/settings/__init__.py:47
+#: apps/courses/settings/__init__.py:89
msgid "List of child pages"
msgstr "Lista de páginas hijas"
-#: apps/courses/settings/__init__.py:48
+#: apps/courses/settings/__init__.py:90
msgid "Homepage"
msgstr "Página principal"
-#: apps/courses/settings/__init__.py:49
+#: apps/courses/settings/__init__.py:91
msgid "Single column"
msgstr "Columna única"
-#: apps/courses/settings/__init__.py:56
+#: apps/courses/settings/__init__.py:92
+msgid "Three columns: (33% | 33% | 33%)"
+msgstr "Tres columnas: (33% | 33% | 33%)"
+
+#: apps/courses/settings/__init__.py:93
+msgid "Two columns: (50% | 50%)"
+msgstr "Dos columnas: (50% | 50%)"
+
+#: apps/courses/settings/__init__.py:94
+msgid "Two columns: (25% | 75%)"
+msgstr "Dos columnas: (25% | 75%)"
+
+#: apps/courses/settings/__init__.py:95
+msgid "Two columns: (75% | 25%)"
+msgstr "Dos columnas: (75% | 25%)"
+
+#: apps/courses/settings/__init__.py:102
msgid "Footer"
msgstr "Pie de página"
-#: apps/courses/settings/__init__.py:61
+#: apps/courses/settings/__init__.py:107
msgid "Static headline"
msgstr "Encabezado estático"
-#: apps/courses/settings/__init__.py:68 apps/courses/settings/__init__.py:90
-#: apps/courses/settings/__init__.py:317
+#: apps/courses/settings/__init__.py:114 apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:138 apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:155 apps/courses/settings/__init__.py:162
+#: apps/courses/settings/__init__.py:371
msgid "Main content"
msgstr "Contenido principal"
-#: apps/courses/settings/__init__.py:120 apps/courses/settings/__init__.py:278
-#: apps/courses/settings/__init__.py:298
+#: apps/courses/settings/__init__.py:141 apps/courses/settings/__init__.py:151
+#: apps/courses/settings/__init__.py:158 apps/courses/settings/__init__.py:165
+msgid "Secondary content"
+msgstr "Contenido secundario"
+
+#: apps/courses/settings/__init__.py:144
+msgid "Third content"
+msgstr "Tercer contenido"
+
+#: apps/courses/settings/__init__.py:169 apps/courses/settings/__init__.py:332
+#: apps/courses/settings/__init__.py:352
#: apps/courses/templates/courses/cms/blogpost_detail.html:108
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:10
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:41
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:76
-#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:9
-#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:8
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:10
+#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:9
#: apps/courses/templates/courses/cms/program_detail.html:40
msgid "Cover"
msgstr "Portada"
-#: apps/courses/settings/__init__.py:125
+#: apps/courses/settings/__init__.py:174
msgid "Catch phrase"
msgstr "Eslogan"
-#: apps/courses/settings/__init__.py:130
+#: apps/courses/settings/__init__.py:179
msgid "Teaser"
msgstr "Teaser"
-#: apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:184
msgid "About the course"
msgstr "Acerca del curso"
-#: apps/courses/settings/__init__.py:140
+#: apps/courses/settings/__init__.py:189
msgid "What you will learn"
msgstr "Lo que aprenderás"
-#: apps/courses/settings/__init__.py:144
+#: apps/courses/settings/__init__.py:193
msgid "Format"
msgstr "Formato"
-#: apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:197
msgid "Prerequisites"
msgstr "Prerrequisitos"
-#: apps/courses/settings/__init__.py:152
+#: apps/courses/settings/__init__.py:201
msgid "Team"
msgstr "Equipo"
-#: apps/courses/settings/__init__.py:156
+#: apps/courses/settings/__init__.py:205
msgid "Plan"
msgstr "Plan"
-#: apps/courses/settings/__init__.py:161
+#: apps/courses/settings/__init__.py:210
msgid "Complementary information"
msgstr "Información complementaria"
-#: apps/courses/settings/__init__.py:173
-#: apps/courses/templates/courses/cms/course_detail.html:464
+#: apps/courses/settings/__init__.py:222
+#: apps/courses/templates/courses/cms/course_detail.html:526
#: apps/courses/templates/courses/cms/fragment_course_relations.html:47
msgid "License for the course content"
msgstr "Licencia para el contenido del curso"
-#: apps/courses/settings/__init__.py:178
-#: apps/courses/templates/courses/cms/course_detail.html:475
+#: apps/courses/settings/__init__.py:227
+#: apps/courses/templates/courses/cms/course_detail.html:537
#: apps/courses/templates/courses/cms/fragment_course_relations.html:56
msgid "License for the content created by course participants"
msgstr "Licencia para el contenido creado por los participantes del curso"
-#: apps/courses/settings/__init__.py:183 apps/courses/settings/__init__.py:211
-#: apps/courses/settings/__init__.py:242 apps/courses/settings/__init__.py:274
+#: apps/courses/settings/__init__.py:232 apps/courses/settings/__init__.py:260
+#: apps/courses/settings/__init__.py:296 apps/courses/settings/__init__.py:328
msgid "Categories"
msgstr "Categorías"
-#: apps/courses/settings/__init__.py:187 apps/courses/settings/__init__.py:231
+#: apps/courses/settings/__init__.py:236 apps/courses/settings/__init__.py:285
msgid "Icon"
msgstr "Icono"
-#: apps/courses/settings/__init__.py:192 apps/courses/settings/__init__.py:264
+#: apps/courses/settings/__init__.py:241 apps/courses/settings/__init__.py:318
#: apps/courses/templates/courses/cms/fragment_course_relations.html:27
#: apps/courses/templates/courses/cms/person_detail.html:112
#: apps/search/defaults.py:115
msgid "Organizations"
msgstr "Organizaciones"
-#: apps/courses/settings/__init__.py:196
+#: apps/courses/settings/__init__.py:245
msgid "Assessment and Certification"
msgstr "Evaluación y certificación"
-#: apps/courses/settings/__init__.py:201 apps/courses/settings/__init__.py:221
+#: apps/courses/settings/__init__.py:250 apps/courses/settings/__init__.py:275
#: apps/courses/templates/courses/cms/category_detail.html:35
msgid "Banner"
msgstr "Banner"
-#: apps/courses/settings/__init__.py:206 apps/courses/settings/__init__.py:226
+#: apps/courses/settings/__init__.py:255 apps/courses/settings/__init__.py:280
#: apps/courses/templates/courses/cms/category_detail.html:53
-#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:40
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:41
msgid "Logo"
msgstr "Logo"
-#: apps/courses/settings/__init__.py:215 apps/courses/settings/__init__.py:236
-#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:35
+#: apps/courses/settings/__init__.py:264 apps/courses/settings/__init__.py:290
msgid "Description"
msgstr "Descripción"
-#: apps/courses/settings/__init__.py:246
+#: apps/courses/settings/__init__.py:269 apps/courses/settings/__init__.py:337
+#: apps/courses/settings/__init__.py:357
+#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:46
+msgid "Excerpt"
+msgstr "Extracto"
+
+#: apps/courses/settings/__init__.py:300
msgid "Portrait"
msgstr "Retrato"
-#: apps/courses/settings/__init__.py:251
+#: apps/courses/settings/__init__.py:305
msgid "Bio"
msgstr "Biografía"
-#: apps/courses/settings/__init__.py:256
+#: apps/courses/settings/__init__.py:310
msgid "Main Content"
msgstr "Contenido principal"
-#: apps/courses/settings/__init__.py:269
+#: apps/courses/settings/__init__.py:323
msgid "Author"
msgstr "Autor"
-#: apps/courses/settings/__init__.py:283 apps/courses/settings/__init__.py:303
-msgid "Excerpt"
-msgstr "Extracto"
-
-#: apps/courses/settings/__init__.py:288 apps/courses/settings/__init__.py:308
+#: apps/courses/settings/__init__.py:342 apps/courses/settings/__init__.py:362
msgid "Body"
msgstr "Cuerpo"
-#: apps/courses/settings/__init__.py:292
+#: apps/courses/settings/__init__.py:346
msgid "Headline"
msgstr "Encabezado"
-#: apps/courses/settings/__init__.py:313
+#: apps/courses/settings/__init__.py:367
#: apps/courses/templates/courses/cms/person_detail.html:129
msgid "Courses"
msgstr "Cursos"
-#: apps/courses/settings/__init__.py:439
+#: apps/courses/settings/__init__.py:493
msgid "Button caesura"
msgstr "Botón cesura"
-#: apps/courses/settings/__init__.py:441
+#: apps/courses/settings/__init__.py:495
msgid "Full width"
msgstr "Anchura total"
@@ -1120,6 +1160,7 @@ msgid "blog post cover image"
msgstr "imagen de portada del post del blog"
#: apps/courses/templates/courses/cms/blogpost_detail.html:138
+#: apps/courses/templates/courses/cms/organization_detail.html:102
#: apps/courses/templates/courses/cms/program_detail.html:60
msgid "No excerpt content"
msgstr "No hay extracto de contenido"
@@ -1150,7 +1191,7 @@ msgid "Sub categories"
msgstr "Subcategorías"
#: apps/courses/templates/courses/cms/category_detail.html:118
-#: apps/courses/templates/courses/cms/organization_detail.html:106
+#: apps/courses/templates/courses/cms/organization_detail.html:120
#: apps/courses/templates/courses/cms/program_detail.html:78
msgid "Related courses"
msgstr "Cursos relacionados"
@@ -1190,12 +1231,12 @@ msgid "Related blogposts pagination"
msgstr "Paginación de entradas de blog relacionadas"
#: apps/courses/templates/courses/cms/category_detail.html:188
-#: apps/courses/templates/courses/cms/organization_detail.html:132
+#: apps/courses/templates/courses/cms/organization_detail.html:146
msgid "Related persons"
msgstr "Personas relacionadas"
#: apps/courses/templates/courses/cms/category_detail.html:193
-#: apps/courses/templates/courses/cms/organization_detail.html:139
+#: apps/courses/templates/courses/cms/organization_detail.html:153
msgid "Related persons pagination"
msgstr "Paginación de personas relacionadas"
@@ -1203,33 +1244,38 @@ msgstr "Paginación de personas relacionadas"
msgid "No categories"
msgstr "Sin categorías"
-#: apps/courses/templates/courses/cms/course_detail.html:58
-#: apps/courses/templates/courses/cms/organization_detail.html:87
-#: apps/courses/templates/courses/cms/person_detail.html:47
-msgid "No associated categories"
-msgstr "No hay categorías asociadas"
+#: apps/courses/templates/courses/cms/course_detail.html:6
+#, python-format
+msgid "%(course_title)s - Course"
+msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:72
+#: apps/courses/templates/courses/cms/course_detail.html:59
msgid "Ref. "
msgstr "Ref. "
-#: apps/courses/templates/courses/cms/course_detail.html:88
+#: apps/courses/templates/courses/cms/course_detail.html:73
+#: apps/courses/templates/courses/cms/organization_detail.html:91
+#: apps/courses/templates/courses/cms/person_detail.html:47
+msgid "No associated categories"
+msgstr "No hay categorías asociadas"
+
+#: apps/courses/templates/courses/cms/course_detail.html:94
msgid "Duration:"
msgstr "Duración:"
-#: apps/courses/templates/courses/cms/course_detail.html:97
+#: apps/courses/templates/courses/cms/course_detail.html:103
msgid "Effort:"
msgstr "Esfuerzo:"
-#: apps/courses/templates/courses/cms/course_detail.html:106
+#: apps/courses/templates/courses/cms/course_detail.html:112
msgid "Pace:"
msgstr "Ritmo:"
-#: apps/courses/templates/courses/cms/course_detail.html:116
+#: apps/courses/templates/courses/cms/course_detail.html:122
msgid "Enter here a introduction of your course."
msgstr "Introduzca aquí una descripción de su curso."
-#: apps/courses/templates/courses/cms/course_detail.html:124
+#: apps/courses/templates/courses/cms/course_detail.html:130
#, python-format
msgid "\n"
" %(count)s already enrolled!\n"
@@ -1238,16 +1284,28 @@ msgstr "\n"
" ¡%(count)s ya están inscritos!\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:136
+#: apps/courses/templates/courses/cms/course_detail.html:142
msgid "Add a teaser video or add a cover image below and it will be used as teaser image as well."
msgstr "Añada un video de teaser o añada una imagen de portada a continuación y se utilizará como imagen de teaser."
-#: apps/courses/templates/courses/cms/course_detail.html:148
-#: apps/courses/templates/courses/cms/course_detail.html:226
+#: apps/courses/templates/courses/cms/course_detail.html:154
+#: apps/courses/templates/courses/cms/course_detail.html:255
msgid "course cover image"
msgstr "imagen de portada del curso"
-#: apps/courses/templates/courses/cms/course_detail.html:198
+#: apps/courses/templates/courses/cms/course_detail.html:182
+msgid "No open course runs"
+msgstr "Ninguna sesión de curso abierta"
+
+#: apps/courses/templates/courses/cms/course_detail.html:192
+msgid "course runs are currently open for this course"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:196
+msgid "Choose now"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:227
#, python-format
msgid "\n"
" Archived on %(creation_date)s\n"
@@ -1256,98 +1314,107 @@ msgstr "\n"
" Archivado el %(creation_date)s\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:202
+#: apps/courses/templates/courses/cms/course_detail.html:231
msgid "Go to current version"
msgstr "Ir a la sesión actual"
-#: apps/courses/templates/courses/cms/course_detail.html:213
+#: apps/courses/templates/courses/cms/course_detail.html:242
msgid "Glimpse cover"
msgstr "Vista previa de la cobertura"
-#: apps/courses/templates/courses/cms/course_detail.html:215
+#: apps/courses/templates/courses/cms/course_detail.html:244
msgid "Add an image for course cover on its glimpse."
msgstr "Agrega una imagen para la portada del curso en la vista previa."
-#: apps/courses/templates/courses/cms/course_detail.html:239
+#: apps/courses/templates/courses/cms/course_detail.html:268
msgctxt "course_detail__title"
msgid "What you will learn"
msgstr "Lo que aprenderá"
-#: apps/courses/templates/courses/cms/course_detail.html:240
+#: apps/courses/templates/courses/cms/course_detail.html:269
msgid "At the end of this course, you will be able to:"
msgstr "Al final de este curso, podrá:"
-#: apps/courses/templates/courses/cms/course_detail.html:249
+#: apps/courses/templates/courses/cms/course_detail.html:278
msgctxt "course_detail__title"
msgid "Description"
msgstr "Descripción"
-#: apps/courses/templates/courses/cms/course_detail.html:260
+#: apps/courses/templates/courses/cms/course_detail.html:289
msgctxt "course_detail__title"
msgid "Format"
msgstr "Formato"
-#: apps/courses/templates/courses/cms/course_detail.html:262
+#: apps/courses/templates/courses/cms/course_detail.html:291
msgid "How is the course structured?"
msgstr "¿Cómo está estructurado el curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:271
+#: apps/courses/templates/courses/cms/course_detail.html:300
msgctxt "course_detail__title"
msgid "Prerequisites"
msgstr "Prerrequisitos"
-#: apps/courses/templates/courses/cms/course_detail.html:274
+#: apps/courses/templates/courses/cms/course_detail.html:303
msgid "What are the prerequisites to follow this course?"
msgstr "¿Cuáles son los perrequisitos para seguir este curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:284
+#: apps/courses/templates/courses/cms/course_detail.html:313
msgctxt "course_detail__title"
msgid "Assessment and certification"
msgstr "Evaluación y certificación"
-#: apps/courses/templates/courses/cms/course_detail.html:287
+#: apps/courses/templates/courses/cms/course_detail.html:316
msgid "How is progress evaluated and/or certified?"
msgstr "¿Cómo se evalúa y/o certifica el progreso?"
-#: apps/courses/templates/courses/cms/course_detail.html:299
+#: apps/courses/templates/courses/cms/course_detail.html:328
msgctxt "course_detail__title"
msgid "Course plan"
msgstr "Plan del curso"
-#: apps/courses/templates/courses/cms/course_detail.html:302
+#: apps/courses/templates/courses/cms/course_detail.html:331
msgid "Enter here the detailed course plan."
msgstr "Ingrese aquí el plan detallado del curso."
-#: apps/courses/templates/courses/cms/course_detail.html:317
+#: apps/courses/templates/courses/cms/course_detail.html:349
+msgctxt "course_detail__title"
+msgid "Other course runs"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:351
msgctxt "course_detail__title"
msgid "Course runs"
msgstr "Sesión de curso"
-#: apps/courses/templates/courses/cms/course_detail.html:323
-msgid "No open course runs"
-msgstr "Ninguna sesión de curso abierta"
+#: apps/courses/templates/courses/cms/course_detail.html:361
+msgid "No course runs"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:363
+msgid "No other course runs"
+msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:332
+#: apps/courses/templates/courses/cms/course_detail.html:387
msgctxt "Course runs to be scheduled (plural)"
msgid "To be scheduled"
msgstr "Por ser programado"
-#: apps/courses/templates/courses/cms/course_detail.html:343
+#: apps/courses/templates/courses/cms/course_detail.html:400
msgctxt "Upcoming course runs (plural)"
msgid "Upcoming"
msgstr "Próximo"
-#: apps/courses/templates/courses/cms/course_detail.html:354
+#: apps/courses/templates/courses/cms/course_detail.html:413
msgctxt "Ongoing course runs (plural)"
msgid "Ongoing"
msgstr "En progreso"
-#: apps/courses/templates/courses/cms/course_detail.html:365
+#: apps/courses/templates/courses/cms/course_detail.html:426
msgctxt "Archived course runs (plural)"
msgid "Archived"
msgstr "Archivado"
-#: apps/courses/templates/courses/cms/course_detail.html:389
+#: apps/courses/templates/courses/cms/course_detail.html:451
msgid "\n"
" This course is part of a program\n"
" "
@@ -1361,41 +1428,51 @@ msgstr[1] "\n"
" Este curso es parte de programas\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:415
+#: apps/courses/templates/courses/cms/course_detail.html:477
msgctxt "course_detail__title"
msgid "Course team"
msgstr "Equipo del curso"
-#: apps/courses/templates/courses/cms/course_detail.html:420
+#: apps/courses/templates/courses/cms/course_detail.html:482
#: apps/courses/templates/courses/cms/fragment_course_relations.html:13
msgid "Who are the teachers in the course team?"
msgstr "¿Quiénes son los profesores del equipo del curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:434
+#: apps/courses/templates/courses/cms/course_detail.html:496
msgctxt "course_detail__title"
msgid "Organizations"
msgstr "Organizaciones"
-#: apps/courses/templates/courses/cms/course_detail.html:439
+#: apps/courses/templates/courses/cms/course_detail.html:501
#: apps/courses/templates/courses/cms/fragment_course_relations.html:32
msgid "What are the organizations publishing this course?"
msgstr "¿Cuáles son las organizaciones que publican este curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:460
+#: apps/courses/templates/courses/cms/course_detail.html:522
msgctxt "course_detail__title"
msgid "License"
msgstr "Licencia"
-#: apps/courses/templates/courses/cms/course_detail.html:467
+#: apps/courses/templates/courses/cms/course_detail.html:529
#: apps/courses/templates/courses/cms/fragment_course_relations.html:50
msgid "What is the license for the course content?"
msgstr "¿Cuál es la licencia para el contenido del curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:478
+#: apps/courses/templates/courses/cms/course_detail.html:540
#: apps/courses/templates/courses/cms/fragment_course_relations.html:59
msgid "What is the license for the content created by course participants?"
msgstr "¿Cuál es la licencia para el contenido creado por los participantes del curso?"
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:63
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:64
+msgid "Course code"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:83
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:84
+msgid "Course date"
+msgstr ""
+
#: apps/courses/templates/courses/cms/fragment_course_relations.html:8
msgid "Course team"
msgstr "Equipo del curso"
@@ -1458,28 +1535,26 @@ msgstr "\n"
" Si lo que necesita es una página %(model)s, necesita crearlo a través del asistente y seleccione \"Nueva página %(model)s\".\n"
" "
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:16
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:39
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:8
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:9
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:17
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:40
msgid "Main organization"
msgstr "Organización principal"
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:29
-msgid "main organization logo"
-msgstr "logo principal de la organización"
-
-#: apps/courses/templates/courses/cms/organization_detail.html:50
+#: apps/courses/templates/courses/cms/organization_detail.html:54
msgid "organization banner"
msgstr "banner de la organización"
-#: apps/courses/templates/courses/cms/organization_detail.html:71
+#: apps/courses/templates/courses/cms/organization_detail.html:75
msgid "organization logo"
msgstr "logo de la organización"
-#: apps/courses/templates/courses/cms/organization_detail.html:111
+#: apps/courses/templates/courses/cms/organization_detail.html:125
msgid "Related courses pagination"
msgstr "Paginación de cursos relacionados"
-#: apps/courses/templates/courses/cms/organization_detail.html:114
+#: apps/courses/templates/courses/cms/organization_detail.html:128
#, python-format
msgid "\n"
" See all courses related to %(organization_title)s\n"
@@ -1536,7 +1611,7 @@ msgstr "No hay programas asociados"
#. Translators: delay indicates when the course will start as a duration.
#. In english the string will be "The course will start in 3 days"
-#: apps/courses/templatetags/extra_tags.py:262
+#: apps/courses/templatetags/extra_tags.py:278
msgid "The course will start {delay:s}"
msgstr "El curso comenzará {delay:s}"
diff --git a/src/richie/locale/fr_CA/LC_MESSAGES/django.mo b/src/richie/locale/fr_CA/LC_MESSAGES/django.mo
index 0c39752455..6dd40505ca 100644
Binary files a/src/richie/locale/fr_CA/LC_MESSAGES/django.mo and b/src/richie/locale/fr_CA/LC_MESSAGES/django.mo differ
diff --git a/src/richie/locale/fr_CA/LC_MESSAGES/django.po b/src/richie/locale/fr_CA/LC_MESSAGES/django.po
index 81a6c04b47..37e86c5000 100644
--- a/src/richie/locale/fr_CA/LC_MESSAGES/django.po
+++ b/src/richie/locale/fr_CA/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: richie\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-17 18:04+0000\n"
-"PO-Revision-Date: 2022-02-18 09:49\n"
+"POT-Creation-Date: 2022-04-01 15:01+0000\n"
+"PO-Revision-Date: 2022-04-04 07:53\n"
"Last-Translator: \n"
"Language-Team: French, Canada\n"
"Language: fr_CA\n"
@@ -99,29 +99,28 @@ msgstr "Votre navigateur ne supporte pas ce format de vidéo."
msgid "You are here:"
msgstr "Vous êtes ici:"
-#: apps/core/templates/richie/base.html:74
+#: apps/core/templates/richie/base.html:78
msgid "Skip to main content"
msgstr "Passer au contenu principal"
-#: apps/core/templates/richie/base.html:86
+#: apps/core/templates/richie/base.html:90
msgid "Go to homepage"
msgstr "Aller à la page d'accueil"
-#: apps/core/templates/richie/base.html:111
-#: apps/courses/templates/courses/cms/course_detail.html:172
+#: apps/core/templates/richie/base.html:115
msgid "Contact us"
msgstr "Contactez-nous"
-#: apps/core/templates/richie/base.html:143
+#: apps/core/templates/richie/base.html:147
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:32
msgid "Learn more"
msgstr "En savoir plus"
-#: apps/core/templates/richie/base.html:157
+#: apps/core/templates/richie/base.html:161
msgid "Life-changing learning!"
msgstr "Un apprentissage renversant!"
-#: apps/core/templates/richie/base.html:171
+#: apps/core/templates/richie/base.html:175
msgid "Powered by"
msgstr "Propulsé par"
@@ -178,23 +177,31 @@ msgstr "Actualités Richie : %(title)s"
msgid "Richie news: %(title)s %(url)s"
msgstr "Actualités Richie : %(title)s %(url)s"
-#: apps/core/templates/social-networks/blogpost-badges.html:10
-#: apps/core/templates/social-networks/course-badges.html:10
+#: apps/core/templates/social-networks/blogpost-badges.html:11
+#: apps/core/templates/social-networks/blogpost-badges.html:12
+#: apps/core/templates/social-networks/course-badges.html:11
+#: apps/core/templates/social-networks/course-badges.html:12
msgid "Share on Facebook"
msgstr "Partager sur Facebook"
-#: apps/core/templates/social-networks/blogpost-badges.html:20
-#: apps/core/templates/social-networks/course-badges.html:20
+#: apps/core/templates/social-networks/blogpost-badges.html:21
+#: apps/core/templates/social-networks/blogpost-badges.html:22
+#: apps/core/templates/social-networks/course-badges.html:21
+#: apps/core/templates/social-networks/course-badges.html:22
msgid "Share on Twitter"
msgstr "Partager sur Twitter"
-#: apps/core/templates/social-networks/blogpost-badges.html:30
-#: apps/core/templates/social-networks/course-badges.html:30
+#: apps/core/templates/social-networks/blogpost-badges.html:31
+#: apps/core/templates/social-networks/blogpost-badges.html:32
+#: apps/core/templates/social-networks/course-badges.html:31
+#: apps/core/templates/social-networks/course-badges.html:32
msgid "Share on Linkedin"
msgstr "Partager sur Linkedin"
-#: apps/core/templates/social-networks/blogpost-badges.html:40
-#: apps/core/templates/social-networks/course-badges.html:40
+#: apps/core/templates/social-networks/blogpost-badges.html:41
+#: apps/core/templates/social-networks/blogpost-badges.html:42
+#: apps/core/templates/social-networks/course-badges.html:41
+#: apps/core/templates/social-networks/course-badges.html:42
msgid "Share by Email"
msgstr "Partager par courriel"
@@ -207,22 +214,20 @@ msgstr "Suivre un cours en ligne avec Richie"
msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s"
msgstr "Je viens de m'inscrire au cours \"%(title)s\" sur Richie: %(url)s"
+#: apps/core/templates/social-networks/footer-badges.html:7
#: apps/core/templates/social-networks/footer-badges.html:8
msgid "Facebook"
msgstr "Facebook"
-#: apps/core/templates/social-networks/footer-badges.html:16
+#: apps/core/templates/social-networks/footer-badges.html:17
+#: apps/core/templates/social-networks/footer-badges.html:18
msgid "Twitter page"
msgstr "Page Twitter"
-#: apps/core/templates/social-networks/footer-badges.html:19
-msgid "Twitter"
-msgstr "Twitter"
-
#: apps/core/templates/social-networks/footer-badges.html:27
-#: apps/core/templates/social-networks/footer-badges.html:30
-msgid "Linkedin"
-msgstr "Linkedin"
+#: apps/core/templates/social-networks/footer-badges.html:28
+msgid "Linkedin page"
+msgstr ""
#: apps/core/views/error.py:7
msgid "Bad request"
@@ -269,6 +274,8 @@ msgid "See filer folder"
msgstr "Voir le dossier du classeur"
#: apps/courses/cms_plugins.py:27
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:55
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:56
msgid "Organization"
msgstr "Institution"
@@ -277,6 +284,7 @@ msgid "Organization by Category"
msgstr "Institution par catégorie"
#: apps/courses/cms_plugins.py:87
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:29
msgid "Category"
msgstr "Catégorie"
@@ -534,13 +542,13 @@ msgid "blog posts"
msgstr "messages de blog"
#: apps/courses/models/blog.py:91 apps/courses/models/category.py:154
-#: apps/courses/models/course.py:981 apps/courses/models/organization.py:199
+#: apps/courses/models/course.py:983 apps/courses/models/organization.py:199
#: apps/courses/models/organization.py:233
msgid "variant"
msgstr "variante"
#: apps/courses/models/blog.py:94 apps/courses/models/category.py:157
-#: apps/courses/models/course.py:984 apps/courses/models/organization.py:202
+#: apps/courses/models/course.py:986 apps/courses/models/organization.py:202
#: apps/courses/models/organization.py:236
msgid "Optional glimpse variant for a custom look."
msgstr "Variante de vue optionnelle pour une apparence personnalisé."
@@ -733,55 +741,59 @@ msgstr "Traduction de la session de cours"
msgid "Course run translations"
msgstr "Traductions de la session de cours"
-#: apps/courses/models/course.py:991
+#: apps/courses/models/course.py:932
+msgid "Empty title"
+msgstr "Titre vide"
+
+#: apps/courses/models/course.py:993
msgid "course plugin"
msgstr "plugin de cours"
-#: apps/courses/models/course.py:992
+#: apps/courses/models/course.py:994
msgid "course plugins"
msgstr "plugins de cours"
-#: apps/courses/models/course.py:1009 plugins/large_banner/models.py:38
+#: apps/courses/models/course.py:1011 plugins/large_banner/models.py:38
msgid "logo"
msgstr "logo"
-#: apps/courses/models/course.py:1011
+#: apps/courses/models/course.py:1013
msgid "url"
msgstr "url"
-#: apps/courses/models/course.py:1014 apps/courses/models/course.py:1038
+#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1040
msgid "name"
msgstr "nom"
-#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1039
+#: apps/courses/models/course.py:1018 apps/courses/models/course.py:1041
msgid "content"
msgstr "contenu"
-#: apps/courses/models/course.py:1021
+#: apps/courses/models/course.py:1023
msgid "licence"
msgstr "license"
-#: apps/courses/models/course.py:1022
+#: apps/courses/models/course.py:1024
msgid "licences"
msgstr "licences"
-#: apps/courses/models/course.py:1044
+#: apps/courses/models/course.py:1046
msgid "Licence translation"
msgstr "Traduction de la licence"
-#: apps/courses/models/course.py:1045
+#: apps/courses/models/course.py:1047
msgid "licence translations"
msgstr "traductions de la licence"
-#: apps/courses/models/course.py:1059
+#: apps/courses/models/course.py:1061
msgid "description"
msgstr "description"
-#: apps/courses/models/course.py:1063
+#: apps/courses/models/course.py:1065
msgid "licence plugin"
msgstr "plugin de licence"
-#: apps/courses/models/course.py:1064
+#: apps/courses/models/course.py:1066
msgid "licence plugins"
msgstr "plugins de licence"
@@ -893,213 +905,241 @@ msgstr "rôles de la page"
msgid "{:s} | {:s}"
msgstr "{:s} | {:s}"
-#: apps/courses/settings/__init__.py:35
+#: apps/courses/settings/__init__.py:77
msgid "Course page"
msgstr "Page de cours"
-#: apps/courses/settings/__init__.py:36
+#: apps/courses/settings/__init__.py:78
msgid "Organization list"
msgstr "Liste des institutions"
-#: apps/courses/settings/__init__.py:37
+#: apps/courses/settings/__init__.py:79
msgid "Organization page"
msgstr "Page d'institution"
-#: apps/courses/settings/__init__.py:38
+#: apps/courses/settings/__init__.py:80
msgid "Category list"
msgstr "Liste des catégories"
-#: apps/courses/settings/__init__.py:39
+#: apps/courses/settings/__init__.py:81
msgid "Category page"
msgstr "Page de catégorie"
-#: apps/courses/settings/__init__.py:40
+#: apps/courses/settings/__init__.py:82
msgid "Blog post list"
msgstr "Liste des articles"
-#: apps/courses/settings/__init__.py:41
+#: apps/courses/settings/__init__.py:83
msgid "Blog post page"
msgstr "Page d'article"
-#: apps/courses/settings/__init__.py:42
+#: apps/courses/settings/__init__.py:84
msgid "Person page"
msgstr "Page de personne"
-#: apps/courses/settings/__init__.py:43
+#: apps/courses/settings/__init__.py:85
msgid "Person list"
msgstr "Liste des personnes"
-#: apps/courses/settings/__init__.py:44
+#: apps/courses/settings/__init__.py:86
msgid "Program page"
msgstr "Page de parcours"
-#: apps/courses/settings/__init__.py:45
+#: apps/courses/settings/__init__.py:87
msgid "Program list"
msgstr "Liste des parcours"
-#: apps/courses/settings/__init__.py:46
+#: apps/courses/settings/__init__.py:88
msgid "Search"
msgstr "Recherche"
-#: apps/courses/settings/__init__.py:47
+#: apps/courses/settings/__init__.py:89
msgid "List of child pages"
msgstr "Liste des pages enfants"
-#: apps/courses/settings/__init__.py:48
+#: apps/courses/settings/__init__.py:90
msgid "Homepage"
msgstr "Page d'accueil"
-#: apps/courses/settings/__init__.py:49
+#: apps/courses/settings/__init__.py:91
msgid "Single column"
msgstr "Colonne unique"
-#: apps/courses/settings/__init__.py:56
+#: apps/courses/settings/__init__.py:92
+msgid "Three columns: (33% | 33% | 33%)"
+msgstr "Trois colonnes: (33% | 33% | 33%)"
+
+#: apps/courses/settings/__init__.py:93
+msgid "Two columns: (50% | 50%)"
+msgstr "Deux colonnes: (50% | 50%)"
+
+#: apps/courses/settings/__init__.py:94
+msgid "Two columns: (25% | 75%)"
+msgstr "Deux colonnes: (25% | 75%)"
+
+#: apps/courses/settings/__init__.py:95
+msgid "Two columns: (75% | 25%)"
+msgstr "Deux colonnes: (75% | 25%)"
+
+#: apps/courses/settings/__init__.py:102
msgid "Footer"
msgstr "Pied de page"
-#: apps/courses/settings/__init__.py:61
+#: apps/courses/settings/__init__.py:107
msgid "Static headline"
msgstr "Titre statique"
-#: apps/courses/settings/__init__.py:68 apps/courses/settings/__init__.py:90
-#: apps/courses/settings/__init__.py:317
+#: apps/courses/settings/__init__.py:114 apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:138 apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:155 apps/courses/settings/__init__.py:162
+#: apps/courses/settings/__init__.py:371
msgid "Main content"
msgstr "Contenu principal"
-#: apps/courses/settings/__init__.py:120 apps/courses/settings/__init__.py:278
-#: apps/courses/settings/__init__.py:298
+#: apps/courses/settings/__init__.py:141 apps/courses/settings/__init__.py:151
+#: apps/courses/settings/__init__.py:158 apps/courses/settings/__init__.py:165
+msgid "Secondary content"
+msgstr "Deuxième contenu"
+
+#: apps/courses/settings/__init__.py:144
+msgid "Third content"
+msgstr "Troisième contenu"
+
+#: apps/courses/settings/__init__.py:169 apps/courses/settings/__init__.py:332
+#: apps/courses/settings/__init__.py:352
#: apps/courses/templates/courses/cms/blogpost_detail.html:108
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:10
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:41
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:76
-#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:9
-#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:8
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:10
+#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:9
#: apps/courses/templates/courses/cms/program_detail.html:40
msgid "Cover"
msgstr "Couverture"
-#: apps/courses/settings/__init__.py:125
+#: apps/courses/settings/__init__.py:174
msgid "Catch phrase"
msgstr "Slogan"
-#: apps/courses/settings/__init__.py:130
+#: apps/courses/settings/__init__.py:179
msgid "Teaser"
msgstr "Accroche"
-#: apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:184
msgid "About the course"
msgstr "À propos du cours"
-#: apps/courses/settings/__init__.py:140
+#: apps/courses/settings/__init__.py:189
msgid "What you will learn"
msgstr "Ce que vous apprendrez"
-#: apps/courses/settings/__init__.py:144
+#: apps/courses/settings/__init__.py:193
msgid "Format"
msgstr "Format"
-#: apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:197
msgid "Prerequisites"
msgstr "Prérequis"
-#: apps/courses/settings/__init__.py:152
+#: apps/courses/settings/__init__.py:201
msgid "Team"
msgstr "Équipe"
-#: apps/courses/settings/__init__.py:156
+#: apps/courses/settings/__init__.py:205
msgid "Plan"
msgstr "Plan"
-#: apps/courses/settings/__init__.py:161
+#: apps/courses/settings/__init__.py:210
msgid "Complementary information"
msgstr "Informations complémentaires"
-#: apps/courses/settings/__init__.py:173
-#: apps/courses/templates/courses/cms/course_detail.html:464
+#: apps/courses/settings/__init__.py:222
+#: apps/courses/templates/courses/cms/course_detail.html:526
#: apps/courses/templates/courses/cms/fragment_course_relations.html:47
msgid "License for the course content"
msgstr "Licence pour le contenu du cours"
-#: apps/courses/settings/__init__.py:178
-#: apps/courses/templates/courses/cms/course_detail.html:475
+#: apps/courses/settings/__init__.py:227
+#: apps/courses/templates/courses/cms/course_detail.html:537
#: apps/courses/templates/courses/cms/fragment_course_relations.html:56
msgid "License for the content created by course participants"
msgstr "Licence pour le contenu créé par les participants du cours"
-#: apps/courses/settings/__init__.py:183 apps/courses/settings/__init__.py:211
-#: apps/courses/settings/__init__.py:242 apps/courses/settings/__init__.py:274
+#: apps/courses/settings/__init__.py:232 apps/courses/settings/__init__.py:260
+#: apps/courses/settings/__init__.py:296 apps/courses/settings/__init__.py:328
msgid "Categories"
msgstr "Catégories"
-#: apps/courses/settings/__init__.py:187 apps/courses/settings/__init__.py:231
+#: apps/courses/settings/__init__.py:236 apps/courses/settings/__init__.py:285
msgid "Icon"
msgstr "Icône"
-#: apps/courses/settings/__init__.py:192 apps/courses/settings/__init__.py:264
+#: apps/courses/settings/__init__.py:241 apps/courses/settings/__init__.py:318
#: apps/courses/templates/courses/cms/fragment_course_relations.html:27
#: apps/courses/templates/courses/cms/person_detail.html:112
#: apps/search/defaults.py:115
msgid "Organizations"
msgstr "Institutions"
-#: apps/courses/settings/__init__.py:196
+#: apps/courses/settings/__init__.py:245
msgid "Assessment and Certification"
msgstr "Évaluation et Attestation"
-#: apps/courses/settings/__init__.py:201 apps/courses/settings/__init__.py:221
+#: apps/courses/settings/__init__.py:250 apps/courses/settings/__init__.py:275
#: apps/courses/templates/courses/cms/category_detail.html:35
msgid "Banner"
msgstr "Bannière"
-#: apps/courses/settings/__init__.py:206 apps/courses/settings/__init__.py:226
+#: apps/courses/settings/__init__.py:255 apps/courses/settings/__init__.py:280
#: apps/courses/templates/courses/cms/category_detail.html:53
-#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:40
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:41
msgid "Logo"
msgstr "Logo"
-#: apps/courses/settings/__init__.py:215 apps/courses/settings/__init__.py:236
-#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:35
+#: apps/courses/settings/__init__.py:264 apps/courses/settings/__init__.py:290
msgid "Description"
msgstr "Description"
-#: apps/courses/settings/__init__.py:246
+#: apps/courses/settings/__init__.py:269 apps/courses/settings/__init__.py:337
+#: apps/courses/settings/__init__.py:357
+#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:46
+msgid "Excerpt"
+msgstr "Extrait"
+
+#: apps/courses/settings/__init__.py:300
msgid "Portrait"
msgstr "Portrait"
-#: apps/courses/settings/__init__.py:251
+#: apps/courses/settings/__init__.py:305
msgid "Bio"
msgstr "Bio"
-#: apps/courses/settings/__init__.py:256
+#: apps/courses/settings/__init__.py:310
msgid "Main Content"
msgstr "Contenu principal"
-#: apps/courses/settings/__init__.py:269
+#: apps/courses/settings/__init__.py:323
msgid "Author"
msgstr "Auteur"
-#: apps/courses/settings/__init__.py:283 apps/courses/settings/__init__.py:303
-msgid "Excerpt"
-msgstr "Extrait"
-
-#: apps/courses/settings/__init__.py:288 apps/courses/settings/__init__.py:308
+#: apps/courses/settings/__init__.py:342 apps/courses/settings/__init__.py:362
msgid "Body"
msgstr "Corps"
-#: apps/courses/settings/__init__.py:292
+#: apps/courses/settings/__init__.py:346
msgid "Headline"
msgstr "Titre"
-#: apps/courses/settings/__init__.py:313
+#: apps/courses/settings/__init__.py:367
#: apps/courses/templates/courses/cms/person_detail.html:129
msgid "Courses"
msgstr "Cours"
-#: apps/courses/settings/__init__.py:439
+#: apps/courses/settings/__init__.py:493
msgid "Button caesura"
msgstr "Bouton caesura"
-#: apps/courses/settings/__init__.py:441
+#: apps/courses/settings/__init__.py:495
msgid "Full width"
msgstr "Pleine largeur"
@@ -1120,6 +1160,7 @@ msgid "blog post cover image"
msgstr "image de couverture de billet de blog"
#: apps/courses/templates/courses/cms/blogpost_detail.html:138
+#: apps/courses/templates/courses/cms/organization_detail.html:102
#: apps/courses/templates/courses/cms/program_detail.html:60
msgid "No excerpt content"
msgstr "Aucun extrait de contenu"
@@ -1150,7 +1191,7 @@ msgid "Sub categories"
msgstr "Sous-catégories"
#: apps/courses/templates/courses/cms/category_detail.html:118
-#: apps/courses/templates/courses/cms/organization_detail.html:106
+#: apps/courses/templates/courses/cms/organization_detail.html:120
#: apps/courses/templates/courses/cms/program_detail.html:78
msgid "Related courses"
msgstr "Cours offerts"
@@ -1190,12 +1231,12 @@ msgid "Related blogposts pagination"
msgstr "Pagination des billets de blog liés"
#: apps/courses/templates/courses/cms/category_detail.html:188
-#: apps/courses/templates/courses/cms/organization_detail.html:132
+#: apps/courses/templates/courses/cms/organization_detail.html:146
msgid "Related persons"
msgstr "Personnes liées"
#: apps/courses/templates/courses/cms/category_detail.html:193
-#: apps/courses/templates/courses/cms/organization_detail.html:139
+#: apps/courses/templates/courses/cms/organization_detail.html:153
msgid "Related persons pagination"
msgstr "Pagination des personnes liées"
@@ -1203,33 +1244,38 @@ msgstr "Pagination des personnes liées"
msgid "No categories"
msgstr "Pas de catégories"
-#: apps/courses/templates/courses/cms/course_detail.html:58
-#: apps/courses/templates/courses/cms/organization_detail.html:87
-#: apps/courses/templates/courses/cms/person_detail.html:47
-msgid "No associated categories"
-msgstr "Aucune catégorie associée"
+#: apps/courses/templates/courses/cms/course_detail.html:6
+#, python-format
+msgid "%(course_title)s - Course"
+msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:72
+#: apps/courses/templates/courses/cms/course_detail.html:59
msgid "Ref. "
msgstr "Réf. "
-#: apps/courses/templates/courses/cms/course_detail.html:88
+#: apps/courses/templates/courses/cms/course_detail.html:73
+#: apps/courses/templates/courses/cms/organization_detail.html:91
+#: apps/courses/templates/courses/cms/person_detail.html:47
+msgid "No associated categories"
+msgstr "Aucune catégorie associée"
+
+#: apps/courses/templates/courses/cms/course_detail.html:94
msgid "Duration:"
msgstr "Durée :"
-#: apps/courses/templates/courses/cms/course_detail.html:97
+#: apps/courses/templates/courses/cms/course_detail.html:103
msgid "Effort:"
msgstr "Effort :"
-#: apps/courses/templates/courses/cms/course_detail.html:106
+#: apps/courses/templates/courses/cms/course_detail.html:112
msgid "Pace:"
msgstr "Rythme:"
-#: apps/courses/templates/courses/cms/course_detail.html:116
+#: apps/courses/templates/courses/cms/course_detail.html:122
msgid "Enter here a introduction of your course."
msgstr "Entrez une introduction pour votre cours."
-#: apps/courses/templates/courses/cms/course_detail.html:124
+#: apps/courses/templates/courses/cms/course_detail.html:130
#, python-format
msgid "\n"
" %(count)s already enrolled!\n"
@@ -1238,16 +1284,28 @@ msgstr "\n"
" %(count)s déjà inscrits!\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:136
+#: apps/courses/templates/courses/cms/course_detail.html:142
msgid "Add a teaser video or add a cover image below and it will be used as teaser image as well."
msgstr "Ajouter une vidéo de teasing ou une image de couverture ci-dessous, celle-ci sera également utilisée comme image de teasing."
-#: apps/courses/templates/courses/cms/course_detail.html:148
-#: apps/courses/templates/courses/cms/course_detail.html:226
+#: apps/courses/templates/courses/cms/course_detail.html:154
+#: apps/courses/templates/courses/cms/course_detail.html:255
msgid "course cover image"
msgstr "image de couverture du cours"
-#: apps/courses/templates/courses/cms/course_detail.html:198
+#: apps/courses/templates/courses/cms/course_detail.html:182
+msgid "No open course runs"
+msgstr "Aucun cours ouvert"
+
+#: apps/courses/templates/courses/cms/course_detail.html:192
+msgid "course runs are currently open for this course"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:196
+msgid "Choose now"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:227
#, python-format
msgid "\n"
" Archived on %(creation_date)s\n"
@@ -1256,98 +1314,107 @@ msgstr "\n"
" Archivé le %(creation_date)s\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:202
+#: apps/courses/templates/courses/cms/course_detail.html:231
msgid "Go to current version"
msgstr "Accédez à la version actuelle"
-#: apps/courses/templates/courses/cms/course_detail.html:213
+#: apps/courses/templates/courses/cms/course_detail.html:242
msgid "Glimpse cover"
msgstr "Image de l'aperçu"
-#: apps/courses/templates/courses/cms/course_detail.html:215
+#: apps/courses/templates/courses/cms/course_detail.html:244
msgid "Add an image for course cover on its glimpse."
msgstr "Ajouter une image pour la couverture du cours sur son aperçu."
-#: apps/courses/templates/courses/cms/course_detail.html:239
+#: apps/courses/templates/courses/cms/course_detail.html:268
msgctxt "course_detail__title"
msgid "What you will learn"
msgstr "Ce que vous apprendrez"
-#: apps/courses/templates/courses/cms/course_detail.html:240
+#: apps/courses/templates/courses/cms/course_detail.html:269
msgid "At the end of this course, you will be able to:"
msgstr "À la fin de ce cours, vous pourrez :"
-#: apps/courses/templates/courses/cms/course_detail.html:249
+#: apps/courses/templates/courses/cms/course_detail.html:278
msgctxt "course_detail__title"
msgid "Description"
msgstr "Description"
-#: apps/courses/templates/courses/cms/course_detail.html:260
+#: apps/courses/templates/courses/cms/course_detail.html:289
msgctxt "course_detail__title"
msgid "Format"
msgstr "Format"
-#: apps/courses/templates/courses/cms/course_detail.html:262
+#: apps/courses/templates/courses/cms/course_detail.html:291
msgid "How is the course structured?"
msgstr "Quelle est la structure du cours ?"
-#: apps/courses/templates/courses/cms/course_detail.html:271
+#: apps/courses/templates/courses/cms/course_detail.html:300
msgctxt "course_detail__title"
msgid "Prerequisites"
msgstr "Prérequis"
-#: apps/courses/templates/courses/cms/course_detail.html:274
+#: apps/courses/templates/courses/cms/course_detail.html:303
msgid "What are the prerequisites to follow this course?"
msgstr "Quels sont les prérequis pour suivre ce cours ?"
-#: apps/courses/templates/courses/cms/course_detail.html:284
+#: apps/courses/templates/courses/cms/course_detail.html:313
msgctxt "course_detail__title"
msgid "Assessment and certification"
msgstr "Évaluation et attestation"
-#: apps/courses/templates/courses/cms/course_detail.html:287
+#: apps/courses/templates/courses/cms/course_detail.html:316
msgid "How is progress evaluated and/or certified?"
msgstr "Comment les étudiants sont ils évalués ou attestés ?"
-#: apps/courses/templates/courses/cms/course_detail.html:299
+#: apps/courses/templates/courses/cms/course_detail.html:328
msgctxt "course_detail__title"
msgid "Course plan"
msgstr "Plan de cours"
-#: apps/courses/templates/courses/cms/course_detail.html:302
+#: apps/courses/templates/courses/cms/course_detail.html:331
msgid "Enter here the detailed course plan."
msgstr "Détaillez ici le plan du cours."
-#: apps/courses/templates/courses/cms/course_detail.html:317
+#: apps/courses/templates/courses/cms/course_detail.html:349
+msgctxt "course_detail__title"
+msgid "Other course runs"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:351
msgctxt "course_detail__title"
msgid "Course runs"
msgstr "Sessions de cours"
-#: apps/courses/templates/courses/cms/course_detail.html:323
-msgid "No open course runs"
-msgstr "Aucun cours ouvert"
+#: apps/courses/templates/courses/cms/course_detail.html:361
+msgid "No course runs"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:363
+msgid "No other course runs"
+msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:332
+#: apps/courses/templates/courses/cms/course_detail.html:387
msgctxt "Course runs to be scheduled (plural)"
msgid "To be scheduled"
msgstr "À planifier"
-#: apps/courses/templates/courses/cms/course_detail.html:343
+#: apps/courses/templates/courses/cms/course_detail.html:400
msgctxt "Upcoming course runs (plural)"
msgid "Upcoming"
msgstr "À venir"
-#: apps/courses/templates/courses/cms/course_detail.html:354
+#: apps/courses/templates/courses/cms/course_detail.html:413
msgctxt "Ongoing course runs (plural)"
msgid "Ongoing"
msgstr "En cours"
-#: apps/courses/templates/courses/cms/course_detail.html:365
+#: apps/courses/templates/courses/cms/course_detail.html:426
msgctxt "Archived course runs (plural)"
msgid "Archived"
msgstr "Archivées"
-#: apps/courses/templates/courses/cms/course_detail.html:389
+#: apps/courses/templates/courses/cms/course_detail.html:451
msgid "\n"
" This course is part of a program\n"
" "
@@ -1361,41 +1428,51 @@ msgstr[1] "\n"
" Ce cours fait partie de ces séries\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:415
+#: apps/courses/templates/courses/cms/course_detail.html:477
msgctxt "course_detail__title"
msgid "Course team"
msgstr "Équipe du cours"
-#: apps/courses/templates/courses/cms/course_detail.html:420
+#: apps/courses/templates/courses/cms/course_detail.html:482
#: apps/courses/templates/courses/cms/fragment_course_relations.html:13
msgid "Who are the teachers in the course team?"
msgstr "Qui sont les enseignants de l’équipe pédagogique ?"
-#: apps/courses/templates/courses/cms/course_detail.html:434
+#: apps/courses/templates/courses/cms/course_detail.html:496
msgctxt "course_detail__title"
msgid "Organizations"
msgstr "Institutions"
-#: apps/courses/templates/courses/cms/course_detail.html:439
+#: apps/courses/templates/courses/cms/course_detail.html:501
#: apps/courses/templates/courses/cms/fragment_course_relations.html:32
msgid "What are the organizations publishing this course?"
msgstr "Quelles sont les institutions publiant ce cours?"
-#: apps/courses/templates/courses/cms/course_detail.html:460
+#: apps/courses/templates/courses/cms/course_detail.html:522
msgctxt "course_detail__title"
msgid "License"
msgstr "Licence"
-#: apps/courses/templates/courses/cms/course_detail.html:467
+#: apps/courses/templates/courses/cms/course_detail.html:529
#: apps/courses/templates/courses/cms/fragment_course_relations.html:50
msgid "What is the license for the course content?"
msgstr "Quelle est la licence pour le contenu du cours ?"
-#: apps/courses/templates/courses/cms/course_detail.html:478
+#: apps/courses/templates/courses/cms/course_detail.html:540
#: apps/courses/templates/courses/cms/fragment_course_relations.html:59
msgid "What is the license for the content created by course participants?"
msgstr "Quelle est la licence pour le contenu créé par les participants du cours ?"
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:63
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:64
+msgid "Course code"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:83
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:84
+msgid "Course date"
+msgstr ""
+
#: apps/courses/templates/courses/cms/fragment_course_relations.html:8
msgid "Course team"
msgstr "Équipe pédagogique"
@@ -1458,28 +1535,26 @@ msgstr "\n"
" Si ce dont vous avez besoin est une page %(model)s , vous devez la créer via l'assistant et choisir \"Nouvelle page %(model)s \".\n"
" "
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:16
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:39
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:8
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:9
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:17
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:40
msgid "Main organization"
msgstr "Institution principale"
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:29
-msgid "main organization logo"
-msgstr "logo de l'organisation principale"
-
-#: apps/courses/templates/courses/cms/organization_detail.html:50
+#: apps/courses/templates/courses/cms/organization_detail.html:54
msgid "organization banner"
msgstr "bannière d'institution"
-#: apps/courses/templates/courses/cms/organization_detail.html:71
+#: apps/courses/templates/courses/cms/organization_detail.html:75
msgid "organization logo"
msgstr "logo de l'institution"
-#: apps/courses/templates/courses/cms/organization_detail.html:111
+#: apps/courses/templates/courses/cms/organization_detail.html:125
msgid "Related courses pagination"
msgstr "Pagination des cours liés"
-#: apps/courses/templates/courses/cms/organization_detail.html:114
+#: apps/courses/templates/courses/cms/organization_detail.html:128
#, python-format
msgid "\n"
" See all courses related to %(organization_title)s\n"
@@ -1536,7 +1611,7 @@ msgstr "Aucun parcours associé"
#. Translators: delay indicates when the course will start as a duration.
#. In english the string will be "The course will start in 3 days"
-#: apps/courses/templatetags/extra_tags.py:262
+#: apps/courses/templatetags/extra_tags.py:278
msgid "The course will start {delay:s}"
msgstr "Le cours commencera {delay:s}"
diff --git a/src/richie/locale/fr_FR/LC_MESSAGES/django.mo b/src/richie/locale/fr_FR/LC_MESSAGES/django.mo
index bebf9070df..98138eefbc 100644
Binary files a/src/richie/locale/fr_FR/LC_MESSAGES/django.mo and b/src/richie/locale/fr_FR/LC_MESSAGES/django.mo differ
diff --git a/src/richie/locale/fr_FR/LC_MESSAGES/django.po b/src/richie/locale/fr_FR/LC_MESSAGES/django.po
index 2161fbaa8f..6ec51da21b 100644
--- a/src/richie/locale/fr_FR/LC_MESSAGES/django.po
+++ b/src/richie/locale/fr_FR/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: richie\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-17 18:04+0000\n"
-"PO-Revision-Date: 2022-02-18 09:49\n"
+"POT-Creation-Date: 2022-04-01 15:01+0000\n"
+"PO-Revision-Date: 2022-04-04 07:53\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -99,29 +99,28 @@ msgstr "Votre navigateur ne supporte pas ce format de vidéo."
msgid "You are here:"
msgstr "Vous êtes ici:"
-#: apps/core/templates/richie/base.html:74
+#: apps/core/templates/richie/base.html:78
msgid "Skip to main content"
msgstr "Passer au contenu principal"
-#: apps/core/templates/richie/base.html:86
+#: apps/core/templates/richie/base.html:90
msgid "Go to homepage"
msgstr "Retour à la page d'accueil"
-#: apps/core/templates/richie/base.html:111
-#: apps/courses/templates/courses/cms/course_detail.html:172
+#: apps/core/templates/richie/base.html:115
msgid "Contact us"
msgstr "Nous contacter"
-#: apps/core/templates/richie/base.html:143
+#: apps/core/templates/richie/base.html:147
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:32
msgid "Learn more"
msgstr "En savoir plus"
-#: apps/core/templates/richie/base.html:157
+#: apps/core/templates/richie/base.html:161
msgid "Life-changing learning!"
msgstr "Apprendre pour changer de vie!"
-#: apps/core/templates/richie/base.html:171
+#: apps/core/templates/richie/base.html:175
msgid "Powered by"
msgstr "Propulsé par"
@@ -178,23 +177,31 @@ msgstr "Actualités Richie: %(title)s"
msgid "Richie news: %(title)s %(url)s"
msgstr "Actualités Richie: %(title)s %(url)s"
-#: apps/core/templates/social-networks/blogpost-badges.html:10
-#: apps/core/templates/social-networks/course-badges.html:10
+#: apps/core/templates/social-networks/blogpost-badges.html:11
+#: apps/core/templates/social-networks/blogpost-badges.html:12
+#: apps/core/templates/social-networks/course-badges.html:11
+#: apps/core/templates/social-networks/course-badges.html:12
msgid "Share on Facebook"
msgstr "Partager sur Facebook"
-#: apps/core/templates/social-networks/blogpost-badges.html:20
-#: apps/core/templates/social-networks/course-badges.html:20
+#: apps/core/templates/social-networks/blogpost-badges.html:21
+#: apps/core/templates/social-networks/blogpost-badges.html:22
+#: apps/core/templates/social-networks/course-badges.html:21
+#: apps/core/templates/social-networks/course-badges.html:22
msgid "Share on Twitter"
msgstr "Partager sur Twitter"
-#: apps/core/templates/social-networks/blogpost-badges.html:30
-#: apps/core/templates/social-networks/course-badges.html:30
+#: apps/core/templates/social-networks/blogpost-badges.html:31
+#: apps/core/templates/social-networks/blogpost-badges.html:32
+#: apps/core/templates/social-networks/course-badges.html:31
+#: apps/core/templates/social-networks/course-badges.html:32
msgid "Share on Linkedin"
msgstr "Partager sur Linkedin"
-#: apps/core/templates/social-networks/blogpost-badges.html:40
-#: apps/core/templates/social-networks/course-badges.html:40
+#: apps/core/templates/social-networks/blogpost-badges.html:41
+#: apps/core/templates/social-networks/blogpost-badges.html:42
+#: apps/core/templates/social-networks/course-badges.html:41
+#: apps/core/templates/social-networks/course-badges.html:42
msgid "Share by Email"
msgstr "Partager par Email"
@@ -207,22 +214,20 @@ msgstr "Suivre un cours en ligne avec Richie"
msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s"
msgstr "Je viens de m'inscrire au cours \"%(title)s\" sur Richie: %(url)s"
+#: apps/core/templates/social-networks/footer-badges.html:7
#: apps/core/templates/social-networks/footer-badges.html:8
msgid "Facebook"
msgstr "Facebook"
-#: apps/core/templates/social-networks/footer-badges.html:16
+#: apps/core/templates/social-networks/footer-badges.html:17
+#: apps/core/templates/social-networks/footer-badges.html:18
msgid "Twitter page"
msgstr "Page Twitter"
-#: apps/core/templates/social-networks/footer-badges.html:19
-msgid "Twitter"
-msgstr "Twitter"
-
#: apps/core/templates/social-networks/footer-badges.html:27
-#: apps/core/templates/social-networks/footer-badges.html:30
-msgid "Linkedin"
-msgstr "Linkedin"
+#: apps/core/templates/social-networks/footer-badges.html:28
+msgid "Linkedin page"
+msgstr "Page LinkedIn"
#: apps/core/views/error.py:7
msgid "Bad request"
@@ -269,6 +274,8 @@ msgid "See filer folder"
msgstr "Voir le dossier du classeur"
#: apps/courses/cms_plugins.py:27
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:55
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:56
msgid "Organization"
msgstr "Établissement"
@@ -277,6 +284,7 @@ msgid "Organization by Category"
msgstr "Établissement par catégorie"
#: apps/courses/cms_plugins.py:87
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:29
msgid "Category"
msgstr "Catégorie"
@@ -534,13 +542,13 @@ msgid "blog posts"
msgstr "articles de blog"
#: apps/courses/models/blog.py:91 apps/courses/models/category.py:154
-#: apps/courses/models/course.py:981 apps/courses/models/organization.py:199
+#: apps/courses/models/course.py:983 apps/courses/models/organization.py:199
#: apps/courses/models/organization.py:233
msgid "variant"
msgstr "variante"
#: apps/courses/models/blog.py:94 apps/courses/models/category.py:157
-#: apps/courses/models/course.py:984 apps/courses/models/organization.py:202
+#: apps/courses/models/course.py:986 apps/courses/models/organization.py:202
#: apps/courses/models/organization.py:236
msgid "Optional glimpse variant for a custom look."
msgstr "Variante d'aperçu optionnelle pour un affichage personnalisé."
@@ -733,55 +741,59 @@ msgstr "Traduction de session de cours"
msgid "Course run translations"
msgstr "Traductions de sessions de cours"
-#: apps/courses/models/course.py:991
+#: apps/courses/models/course.py:932
+msgid "Empty title"
+msgstr "Titre manquant"
+
+#: apps/courses/models/course.py:993
msgid "course plugin"
msgstr "plugin de cours"
-#: apps/courses/models/course.py:992
+#: apps/courses/models/course.py:994
msgid "course plugins"
msgstr "plugins de cours"
-#: apps/courses/models/course.py:1009 plugins/large_banner/models.py:38
+#: apps/courses/models/course.py:1011 plugins/large_banner/models.py:38
msgid "logo"
msgstr "logo"
-#: apps/courses/models/course.py:1011
+#: apps/courses/models/course.py:1013
msgid "url"
msgstr "url"
-#: apps/courses/models/course.py:1014 apps/courses/models/course.py:1038
+#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1040
msgid "name"
msgstr "nom"
-#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1039
+#: apps/courses/models/course.py:1018 apps/courses/models/course.py:1041
msgid "content"
msgstr "contenu"
-#: apps/courses/models/course.py:1021
+#: apps/courses/models/course.py:1023
msgid "licence"
msgstr "license"
-#: apps/courses/models/course.py:1022
+#: apps/courses/models/course.py:1024
msgid "licences"
msgstr "licences"
-#: apps/courses/models/course.py:1044
+#: apps/courses/models/course.py:1046
msgid "Licence translation"
msgstr "Traduction des Licences"
-#: apps/courses/models/course.py:1045
+#: apps/courses/models/course.py:1047
msgid "licence translations"
msgstr "traductions de licences"
-#: apps/courses/models/course.py:1059
+#: apps/courses/models/course.py:1061
msgid "description"
msgstr "description"
-#: apps/courses/models/course.py:1063
+#: apps/courses/models/course.py:1065
msgid "licence plugin"
msgstr "plugin de licence"
-#: apps/courses/models/course.py:1064
+#: apps/courses/models/course.py:1066
msgid "licence plugins"
msgstr "plugins de licences"
@@ -893,213 +905,241 @@ msgstr "rôles de page"
msgid "{:s} | {:s}"
msgstr "{:s} | {:s}"
-#: apps/courses/settings/__init__.py:35
+#: apps/courses/settings/__init__.py:77
msgid "Course page"
msgstr "Page de cours"
-#: apps/courses/settings/__init__.py:36
+#: apps/courses/settings/__init__.py:78
msgid "Organization list"
msgstr "Liste des établissements"
-#: apps/courses/settings/__init__.py:37
+#: apps/courses/settings/__init__.py:79
msgid "Organization page"
msgstr "Page d'établissement"
-#: apps/courses/settings/__init__.py:38
+#: apps/courses/settings/__init__.py:80
msgid "Category list"
msgstr "Liste des Catégories"
-#: apps/courses/settings/__init__.py:39
+#: apps/courses/settings/__init__.py:81
msgid "Category page"
msgstr "Page de catégorie"
-#: apps/courses/settings/__init__.py:40
+#: apps/courses/settings/__init__.py:82
msgid "Blog post list"
msgstr "Liste de billet de blog"
-#: apps/courses/settings/__init__.py:41
+#: apps/courses/settings/__init__.py:83
msgid "Blog post page"
msgstr "Page de billet de blog"
-#: apps/courses/settings/__init__.py:42
+#: apps/courses/settings/__init__.py:84
msgid "Person page"
msgstr "Page de personne"
-#: apps/courses/settings/__init__.py:43
+#: apps/courses/settings/__init__.py:85
msgid "Person list"
msgstr "Liste des personnes"
-#: apps/courses/settings/__init__.py:44
+#: apps/courses/settings/__init__.py:86
msgid "Program page"
msgstr "Page de parcours"
-#: apps/courses/settings/__init__.py:45
+#: apps/courses/settings/__init__.py:87
msgid "Program list"
msgstr "Liste des parcours"
-#: apps/courses/settings/__init__.py:46
+#: apps/courses/settings/__init__.py:88
msgid "Search"
msgstr "Recherche"
-#: apps/courses/settings/__init__.py:47
+#: apps/courses/settings/__init__.py:89
msgid "List of child pages"
msgstr "Liste des pages enfants"
-#: apps/courses/settings/__init__.py:48
+#: apps/courses/settings/__init__.py:90
msgid "Homepage"
msgstr "Page d'accueil"
-#: apps/courses/settings/__init__.py:49
+#: apps/courses/settings/__init__.py:91
msgid "Single column"
msgstr "Colonne unique"
-#: apps/courses/settings/__init__.py:56
+#: apps/courses/settings/__init__.py:92
+msgid "Three columns: (33% | 33% | 33%)"
+msgstr "Trois colonnes: (33% | 33% | 33%)"
+
+#: apps/courses/settings/__init__.py:93
+msgid "Two columns: (50% | 50%)"
+msgstr "Deux colonnes: (50% | 50%)"
+
+#: apps/courses/settings/__init__.py:94
+msgid "Two columns: (25% | 75%)"
+msgstr "Deux colonnes: (25% | 75%)"
+
+#: apps/courses/settings/__init__.py:95
+msgid "Two columns: (75% | 25%)"
+msgstr "Deux colonnes: (75% | 25%)"
+
+#: apps/courses/settings/__init__.py:102
msgid "Footer"
msgstr "Pied de page"
-#: apps/courses/settings/__init__.py:61
+#: apps/courses/settings/__init__.py:107
msgid "Static headline"
msgstr "Entête statique"
-#: apps/courses/settings/__init__.py:68 apps/courses/settings/__init__.py:90
-#: apps/courses/settings/__init__.py:317
+#: apps/courses/settings/__init__.py:114 apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:138 apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:155 apps/courses/settings/__init__.py:162
+#: apps/courses/settings/__init__.py:371
msgid "Main content"
msgstr "Contenu principal"
-#: apps/courses/settings/__init__.py:120 apps/courses/settings/__init__.py:278
-#: apps/courses/settings/__init__.py:298
+#: apps/courses/settings/__init__.py:141 apps/courses/settings/__init__.py:151
+#: apps/courses/settings/__init__.py:158 apps/courses/settings/__init__.py:165
+msgid "Secondary content"
+msgstr "Deuxième contenu"
+
+#: apps/courses/settings/__init__.py:144
+msgid "Third content"
+msgstr "Troisième contenu"
+
+#: apps/courses/settings/__init__.py:169 apps/courses/settings/__init__.py:332
+#: apps/courses/settings/__init__.py:352
#: apps/courses/templates/courses/cms/blogpost_detail.html:108
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:10
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:41
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:76
-#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:9
-#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:8
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:10
+#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:9
#: apps/courses/templates/courses/cms/program_detail.html:40
msgid "Cover"
msgstr "Couverture"
-#: apps/courses/settings/__init__.py:125
+#: apps/courses/settings/__init__.py:174
msgid "Catch phrase"
msgstr "Slogan"
-#: apps/courses/settings/__init__.py:130
+#: apps/courses/settings/__init__.py:179
msgid "Teaser"
msgstr "Accroche"
-#: apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:184
msgid "About the course"
msgstr "À propos du cours"
-#: apps/courses/settings/__init__.py:140
+#: apps/courses/settings/__init__.py:189
msgid "What you will learn"
msgstr "Ce que vous allez apprendre"
-#: apps/courses/settings/__init__.py:144
+#: apps/courses/settings/__init__.py:193
msgid "Format"
msgstr "Format"
-#: apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:197
msgid "Prerequisites"
msgstr "Prérequis"
-#: apps/courses/settings/__init__.py:152
+#: apps/courses/settings/__init__.py:201
msgid "Team"
msgstr "Équipe"
-#: apps/courses/settings/__init__.py:156
+#: apps/courses/settings/__init__.py:205
msgid "Plan"
msgstr "Plan"
-#: apps/courses/settings/__init__.py:161
+#: apps/courses/settings/__init__.py:210
msgid "Complementary information"
msgstr "Informations complémentaires"
-#: apps/courses/settings/__init__.py:173
-#: apps/courses/templates/courses/cms/course_detail.html:464
+#: apps/courses/settings/__init__.py:222
+#: apps/courses/templates/courses/cms/course_detail.html:526
#: apps/courses/templates/courses/cms/fragment_course_relations.html:47
msgid "License for the course content"
msgstr "Licence pour le contenu du cours"
-#: apps/courses/settings/__init__.py:178
-#: apps/courses/templates/courses/cms/course_detail.html:475
+#: apps/courses/settings/__init__.py:227
+#: apps/courses/templates/courses/cms/course_detail.html:537
#: apps/courses/templates/courses/cms/fragment_course_relations.html:56
msgid "License for the content created by course participants"
msgstr "Licence pour le contenu créé par les participants du cours"
-#: apps/courses/settings/__init__.py:183 apps/courses/settings/__init__.py:211
-#: apps/courses/settings/__init__.py:242 apps/courses/settings/__init__.py:274
+#: apps/courses/settings/__init__.py:232 apps/courses/settings/__init__.py:260
+#: apps/courses/settings/__init__.py:296 apps/courses/settings/__init__.py:328
msgid "Categories"
msgstr "Catégories"
-#: apps/courses/settings/__init__.py:187 apps/courses/settings/__init__.py:231
+#: apps/courses/settings/__init__.py:236 apps/courses/settings/__init__.py:285
msgid "Icon"
msgstr "Icône"
-#: apps/courses/settings/__init__.py:192 apps/courses/settings/__init__.py:264
+#: apps/courses/settings/__init__.py:241 apps/courses/settings/__init__.py:318
#: apps/courses/templates/courses/cms/fragment_course_relations.html:27
#: apps/courses/templates/courses/cms/person_detail.html:112
#: apps/search/defaults.py:115
msgid "Organizations"
msgstr "Établissements"
-#: apps/courses/settings/__init__.py:196
+#: apps/courses/settings/__init__.py:245
msgid "Assessment and Certification"
msgstr "Évaluation et certification"
-#: apps/courses/settings/__init__.py:201 apps/courses/settings/__init__.py:221
+#: apps/courses/settings/__init__.py:250 apps/courses/settings/__init__.py:275
#: apps/courses/templates/courses/cms/category_detail.html:35
msgid "Banner"
msgstr "Bannière"
-#: apps/courses/settings/__init__.py:206 apps/courses/settings/__init__.py:226
+#: apps/courses/settings/__init__.py:255 apps/courses/settings/__init__.py:280
#: apps/courses/templates/courses/cms/category_detail.html:53
-#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:40
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:41
msgid "Logo"
msgstr "Logo"
-#: apps/courses/settings/__init__.py:215 apps/courses/settings/__init__.py:236
-#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:35
+#: apps/courses/settings/__init__.py:264 apps/courses/settings/__init__.py:290
msgid "Description"
msgstr "Description"
-#: apps/courses/settings/__init__.py:246
+#: apps/courses/settings/__init__.py:269 apps/courses/settings/__init__.py:337
+#: apps/courses/settings/__init__.py:357
+#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:46
+msgid "Excerpt"
+msgstr "Extrait"
+
+#: apps/courses/settings/__init__.py:300
msgid "Portrait"
msgstr "Portrait"
-#: apps/courses/settings/__init__.py:251
+#: apps/courses/settings/__init__.py:305
msgid "Bio"
msgstr "Bio"
-#: apps/courses/settings/__init__.py:256
+#: apps/courses/settings/__init__.py:310
msgid "Main Content"
msgstr "Contenu principal"
-#: apps/courses/settings/__init__.py:269
+#: apps/courses/settings/__init__.py:323
msgid "Author"
msgstr "Auteur"
-#: apps/courses/settings/__init__.py:283 apps/courses/settings/__init__.py:303
-msgid "Excerpt"
-msgstr "Extrait"
-
-#: apps/courses/settings/__init__.py:288 apps/courses/settings/__init__.py:308
+#: apps/courses/settings/__init__.py:342 apps/courses/settings/__init__.py:362
msgid "Body"
msgstr "Corps"
-#: apps/courses/settings/__init__.py:292
+#: apps/courses/settings/__init__.py:346
msgid "Headline"
msgstr "Entête"
-#: apps/courses/settings/__init__.py:313
+#: apps/courses/settings/__init__.py:367
#: apps/courses/templates/courses/cms/person_detail.html:129
msgid "Courses"
msgstr "Cours"
-#: apps/courses/settings/__init__.py:439
+#: apps/courses/settings/__init__.py:493
msgid "Button caesura"
msgstr "Bouton caesura"
-#: apps/courses/settings/__init__.py:441
+#: apps/courses/settings/__init__.py:495
msgid "Full width"
msgstr "Pleine largeur"
@@ -1120,6 +1160,7 @@ msgid "blog post cover image"
msgstr "image de couverture de billet de blog"
#: apps/courses/templates/courses/cms/blogpost_detail.html:138
+#: apps/courses/templates/courses/cms/organization_detail.html:102
#: apps/courses/templates/courses/cms/program_detail.html:60
msgid "No excerpt content"
msgstr "Pas d'extrait"
@@ -1150,7 +1191,7 @@ msgid "Sub categories"
msgstr "Sous-catégories"
#: apps/courses/templates/courses/cms/category_detail.html:118
-#: apps/courses/templates/courses/cms/organization_detail.html:106
+#: apps/courses/templates/courses/cms/organization_detail.html:120
#: apps/courses/templates/courses/cms/program_detail.html:78
msgid "Related courses"
msgstr "Cours associés"
@@ -1190,12 +1231,12 @@ msgid "Related blogposts pagination"
msgstr "Pagination des articles de blog liés"
#: apps/courses/templates/courses/cms/category_detail.html:188
-#: apps/courses/templates/courses/cms/organization_detail.html:132
+#: apps/courses/templates/courses/cms/organization_detail.html:146
msgid "Related persons"
msgstr "Personnes liées"
#: apps/courses/templates/courses/cms/category_detail.html:193
-#: apps/courses/templates/courses/cms/organization_detail.html:139
+#: apps/courses/templates/courses/cms/organization_detail.html:153
msgid "Related persons pagination"
msgstr "Pagination des personnes liées"
@@ -1203,33 +1244,38 @@ msgstr "Pagination des personnes liées"
msgid "No categories"
msgstr "Pas de catégories"
-#: apps/courses/templates/courses/cms/course_detail.html:58
-#: apps/courses/templates/courses/cms/organization_detail.html:87
-#: apps/courses/templates/courses/cms/person_detail.html:47
-msgid "No associated categories"
-msgstr "Aucune catégorie associée"
+#: apps/courses/templates/courses/cms/course_detail.html:6
+#, python-format
+msgid "%(course_title)s - Course"
+msgstr "%(course_title)s - Cours"
-#: apps/courses/templates/courses/cms/course_detail.html:72
+#: apps/courses/templates/courses/cms/course_detail.html:59
msgid "Ref. "
msgstr "Réf. "
-#: apps/courses/templates/courses/cms/course_detail.html:88
+#: apps/courses/templates/courses/cms/course_detail.html:73
+#: apps/courses/templates/courses/cms/organization_detail.html:91
+#: apps/courses/templates/courses/cms/person_detail.html:47
+msgid "No associated categories"
+msgstr "Aucune catégorie associée"
+
+#: apps/courses/templates/courses/cms/course_detail.html:94
msgid "Duration:"
msgstr "Durée :"
-#: apps/courses/templates/courses/cms/course_detail.html:97
+#: apps/courses/templates/courses/cms/course_detail.html:103
msgid "Effort:"
msgstr "Effort :"
-#: apps/courses/templates/courses/cms/course_detail.html:106
+#: apps/courses/templates/courses/cms/course_detail.html:112
msgid "Pace:"
msgstr "Rythme:"
-#: apps/courses/templates/courses/cms/course_detail.html:116
+#: apps/courses/templates/courses/cms/course_detail.html:122
msgid "Enter here a introduction of your course."
msgstr "Saisissez ici une courte description du cours."
-#: apps/courses/templates/courses/cms/course_detail.html:124
+#: apps/courses/templates/courses/cms/course_detail.html:130
#, python-format
msgid "\n"
" %(count)s already enrolled!\n"
@@ -1238,16 +1284,28 @@ msgstr "\n"
" %(count)s déjà inscrits !\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:136
+#: apps/courses/templates/courses/cms/course_detail.html:142
msgid "Add a teaser video or add a cover image below and it will be used as teaser image as well."
msgstr "Ajouter une vidéo de teasing ou une image de couverture ci-dessous, celle-ci sera également utilisée comme image de teasing."
-#: apps/courses/templates/courses/cms/course_detail.html:148
-#: apps/courses/templates/courses/cms/course_detail.html:226
+#: apps/courses/templates/courses/cms/course_detail.html:154
+#: apps/courses/templates/courses/cms/course_detail.html:255
msgid "course cover image"
msgstr "image de couverture du cours"
-#: apps/courses/templates/courses/cms/course_detail.html:198
+#: apps/courses/templates/courses/cms/course_detail.html:182
+msgid "No open course runs"
+msgstr "Aucune session ouverte"
+
+#: apps/courses/templates/courses/cms/course_detail.html:192
+msgid "course runs are currently open for this course"
+msgstr "sessions sont actuellement ouvertes pour ce cours"
+
+#: apps/courses/templates/courses/cms/course_detail.html:196
+msgid "Choose now"
+msgstr "Choisir maintenant"
+
+#: apps/courses/templates/courses/cms/course_detail.html:227
#, python-format
msgid "\n"
" Archived on %(creation_date)s\n"
@@ -1256,98 +1314,107 @@ msgstr "\n"
" Archivé le %(creation_date)s\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:202
+#: apps/courses/templates/courses/cms/course_detail.html:231
msgid "Go to current version"
msgstr "Accédez à la version actuelle"
-#: apps/courses/templates/courses/cms/course_detail.html:213
+#: apps/courses/templates/courses/cms/course_detail.html:242
msgid "Glimpse cover"
msgstr "Image d'aperçu"
-#: apps/courses/templates/courses/cms/course_detail.html:215
+#: apps/courses/templates/courses/cms/course_detail.html:244
msgid "Add an image for course cover on its glimpse."
msgstr "Ajouter une image pour la couverture du cours sur son aperçu."
-#: apps/courses/templates/courses/cms/course_detail.html:239
+#: apps/courses/templates/courses/cms/course_detail.html:268
msgctxt "course_detail__title"
msgid "What you will learn"
msgstr "Ce que vous allez apprendre"
-#: apps/courses/templates/courses/cms/course_detail.html:240
+#: apps/courses/templates/courses/cms/course_detail.html:269
msgid "At the end of this course, you will be able to:"
msgstr "À la fin de ce cours, vous serez capable de :"
-#: apps/courses/templates/courses/cms/course_detail.html:249
+#: apps/courses/templates/courses/cms/course_detail.html:278
msgctxt "course_detail__title"
msgid "Description"
msgstr "Description"
-#: apps/courses/templates/courses/cms/course_detail.html:260
+#: apps/courses/templates/courses/cms/course_detail.html:289
msgctxt "course_detail__title"
msgid "Format"
msgstr "Format"
-#: apps/courses/templates/courses/cms/course_detail.html:262
+#: apps/courses/templates/courses/cms/course_detail.html:291
msgid "How is the course structured?"
msgstr "Quelle est la structure du cours ?"
-#: apps/courses/templates/courses/cms/course_detail.html:271
+#: apps/courses/templates/courses/cms/course_detail.html:300
msgctxt "course_detail__title"
msgid "Prerequisites"
msgstr "Prérequis"
-#: apps/courses/templates/courses/cms/course_detail.html:274
+#: apps/courses/templates/courses/cms/course_detail.html:303
msgid "What are the prerequisites to follow this course?"
msgstr "Quels sont les prérequis pour suivre ce cours ?"
-#: apps/courses/templates/courses/cms/course_detail.html:284
+#: apps/courses/templates/courses/cms/course_detail.html:313
msgctxt "course_detail__title"
msgid "Assessment and certification"
msgstr "Evaluation et Certification"
-#: apps/courses/templates/courses/cms/course_detail.html:287
+#: apps/courses/templates/courses/cms/course_detail.html:316
msgid "How is progress evaluated and/or certified?"
msgstr "Comment les étudiants sont ils évalués et/ou certifiés ?"
-#: apps/courses/templates/courses/cms/course_detail.html:299
+#: apps/courses/templates/courses/cms/course_detail.html:328
msgctxt "course_detail__title"
msgid "Course plan"
msgstr "Plan de cours"
-#: apps/courses/templates/courses/cms/course_detail.html:302
+#: apps/courses/templates/courses/cms/course_detail.html:331
msgid "Enter here the detailed course plan."
msgstr "Détaillez ici le plan du cours."
-#: apps/courses/templates/courses/cms/course_detail.html:317
+#: apps/courses/templates/courses/cms/course_detail.html:349
+msgctxt "course_detail__title"
+msgid "Other course runs"
+msgstr "Autres sessions"
+
+#: apps/courses/templates/courses/cms/course_detail.html:351
msgctxt "course_detail__title"
msgid "Course runs"
msgstr "Sessions de cours"
-#: apps/courses/templates/courses/cms/course_detail.html:323
-msgid "No open course runs"
-msgstr "Aucune session ouverte"
+#: apps/courses/templates/courses/cms/course_detail.html:361
+msgid "No course runs"
+msgstr "Aucune session"
-#: apps/courses/templates/courses/cms/course_detail.html:332
+#: apps/courses/templates/courses/cms/course_detail.html:363
+msgid "No other course runs"
+msgstr "Aucune autre session"
+
+#: apps/courses/templates/courses/cms/course_detail.html:387
msgctxt "Course runs to be scheduled (plural)"
msgid "To be scheduled"
msgstr "A programmer"
-#: apps/courses/templates/courses/cms/course_detail.html:343
+#: apps/courses/templates/courses/cms/course_detail.html:400
msgctxt "Upcoming course runs (plural)"
msgid "Upcoming"
msgstr "A venir"
-#: apps/courses/templates/courses/cms/course_detail.html:354
+#: apps/courses/templates/courses/cms/course_detail.html:413
msgctxt "Ongoing course runs (plural)"
msgid "Ongoing"
msgstr "En cours"
-#: apps/courses/templates/courses/cms/course_detail.html:365
+#: apps/courses/templates/courses/cms/course_detail.html:426
msgctxt "Archived course runs (plural)"
msgid "Archived"
msgstr "Archivées"
-#: apps/courses/templates/courses/cms/course_detail.html:389
+#: apps/courses/templates/courses/cms/course_detail.html:451
msgid "\n"
" This course is part of a program\n"
" "
@@ -1361,41 +1428,51 @@ msgstr[1] "\n"
" Ce cours fait partie de parcours\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:415
+#: apps/courses/templates/courses/cms/course_detail.html:477
msgctxt "course_detail__title"
msgid "Course team"
msgstr "Équipe pédagogique"
-#: apps/courses/templates/courses/cms/course_detail.html:420
+#: apps/courses/templates/courses/cms/course_detail.html:482
#: apps/courses/templates/courses/cms/fragment_course_relations.html:13
msgid "Who are the teachers in the course team?"
msgstr "Qui sont les enseignants de l’équipe pédagogique ?"
-#: apps/courses/templates/courses/cms/course_detail.html:434
+#: apps/courses/templates/courses/cms/course_detail.html:496
msgctxt "course_detail__title"
msgid "Organizations"
msgstr "Établissements"
-#: apps/courses/templates/courses/cms/course_detail.html:439
+#: apps/courses/templates/courses/cms/course_detail.html:501
#: apps/courses/templates/courses/cms/fragment_course_relations.html:32
msgid "What are the organizations publishing this course?"
msgstr "Qui sont les établissements publiant ce cours ?"
-#: apps/courses/templates/courses/cms/course_detail.html:460
+#: apps/courses/templates/courses/cms/course_detail.html:522
msgctxt "course_detail__title"
msgid "License"
msgstr "Licence"
-#: apps/courses/templates/courses/cms/course_detail.html:467
+#: apps/courses/templates/courses/cms/course_detail.html:529
#: apps/courses/templates/courses/cms/fragment_course_relations.html:50
msgid "What is the license for the course content?"
msgstr "Quelle est la licence pour le contenu du cours ?"
-#: apps/courses/templates/courses/cms/course_detail.html:478
+#: apps/courses/templates/courses/cms/course_detail.html:540
#: apps/courses/templates/courses/cms/fragment_course_relations.html:59
msgid "What is the license for the content created by course participants?"
msgstr "Quelle est la licence pour le contenu créé par les participants du cours ?"
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:63
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:64
+msgid "Course code"
+msgstr "Code du cours"
+
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:83
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:84
+msgid "Course date"
+msgstr "Date du cours"
+
#: apps/courses/templates/courses/cms/fragment_course_relations.html:8
msgid "Course team"
msgstr "Équipe pédagogique"
@@ -1458,28 +1535,26 @@ msgstr "\n"
" Si ce dont vous avez besoin est une page %(model)s , vous devez la créer via l'assistant et choisir \"Nouvelle page %(model)s \".\n"
" "
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:16
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:39
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:8
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:9
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:17
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:40
msgid "Main organization"
msgstr "Etablissement principal"
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:29
-msgid "main organization logo"
-msgstr "logo d'établissement principal"
-
-#: apps/courses/templates/courses/cms/organization_detail.html:50
+#: apps/courses/templates/courses/cms/organization_detail.html:54
msgid "organization banner"
msgstr "bannière d'établissement"
-#: apps/courses/templates/courses/cms/organization_detail.html:71
+#: apps/courses/templates/courses/cms/organization_detail.html:75
msgid "organization logo"
msgstr "logo d'établissement"
-#: apps/courses/templates/courses/cms/organization_detail.html:111
+#: apps/courses/templates/courses/cms/organization_detail.html:125
msgid "Related courses pagination"
msgstr "Pagination des cours liés"
-#: apps/courses/templates/courses/cms/organization_detail.html:114
+#: apps/courses/templates/courses/cms/organization_detail.html:128
#, python-format
msgid "\n"
" See all courses related to %(organization_title)s\n"
@@ -1536,7 +1611,7 @@ msgstr "Aucun parcours associé"
#. Translators: delay indicates when the course will start as a duration.
#. In english the string will be "The course will start in 3 days"
-#: apps/courses/templatetags/extra_tags.py:262
+#: apps/courses/templatetags/extra_tags.py:278
msgid "The course will start {delay:s}"
msgstr "Le cours commencera {delay:s}"
diff --git a/src/richie/locale/pt_PT/LC_MESSAGES/django.mo b/src/richie/locale/pt_PT/LC_MESSAGES/django.mo
index 06ed270d78..ac2a8381a4 100644
Binary files a/src/richie/locale/pt_PT/LC_MESSAGES/django.mo and b/src/richie/locale/pt_PT/LC_MESSAGES/django.mo differ
diff --git a/src/richie/locale/pt_PT/LC_MESSAGES/django.po b/src/richie/locale/pt_PT/LC_MESSAGES/django.po
index 7e75d28182..d8ee4f8425 100644
--- a/src/richie/locale/pt_PT/LC_MESSAGES/django.po
+++ b/src/richie/locale/pt_PT/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: richie\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-17 18:04+0000\n"
-"PO-Revision-Date: 2022-02-18 09:49\n"
+"POT-Creation-Date: 2022-04-01 15:01+0000\n"
+"PO-Revision-Date: 2022-04-04 07:53\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
@@ -99,29 +99,28 @@ msgstr "O seu navegador não suporta este formato de vídeo."
msgid "You are here:"
msgstr "Você está aqui:"
-#: apps/core/templates/richie/base.html:74
+#: apps/core/templates/richie/base.html:78
msgid "Skip to main content"
msgstr "Saltar para o conteúdo"
-#: apps/core/templates/richie/base.html:86
+#: apps/core/templates/richie/base.html:90
msgid "Go to homepage"
msgstr "Ir para a página inicial"
-#: apps/core/templates/richie/base.html:111
-#: apps/courses/templates/courses/cms/course_detail.html:172
+#: apps/core/templates/richie/base.html:115
msgid "Contact us"
msgstr "Contacte-nos"
-#: apps/core/templates/richie/base.html:143
+#: apps/core/templates/richie/base.html:147
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:32
msgid "Learn more"
msgstr "Saiba mais"
-#: apps/core/templates/richie/base.html:157
+#: apps/core/templates/richie/base.html:161
msgid "Life-changing learning!"
msgstr "Aprendizagem que muda a sua vida!"
-#: apps/core/templates/richie/base.html:171
+#: apps/core/templates/richie/base.html:175
msgid "Powered by"
msgstr "Desenvolvido por"
@@ -178,23 +177,31 @@ msgstr "Notícias do Richie: %(title)s"
msgid "Richie news: %(title)s %(url)s"
msgstr "Notícias de Richie: %(title)s %(url)s"
-#: apps/core/templates/social-networks/blogpost-badges.html:10
-#: apps/core/templates/social-networks/course-badges.html:10
+#: apps/core/templates/social-networks/blogpost-badges.html:11
+#: apps/core/templates/social-networks/blogpost-badges.html:12
+#: apps/core/templates/social-networks/course-badges.html:11
+#: apps/core/templates/social-networks/course-badges.html:12
msgid "Share on Facebook"
msgstr "Partilhar no Facebook"
-#: apps/core/templates/social-networks/blogpost-badges.html:20
-#: apps/core/templates/social-networks/course-badges.html:20
+#: apps/core/templates/social-networks/blogpost-badges.html:21
+#: apps/core/templates/social-networks/blogpost-badges.html:22
+#: apps/core/templates/social-networks/course-badges.html:21
+#: apps/core/templates/social-networks/course-badges.html:22
msgid "Share on Twitter"
msgstr "Partilhar no Twitter"
-#: apps/core/templates/social-networks/blogpost-badges.html:30
-#: apps/core/templates/social-networks/course-badges.html:30
+#: apps/core/templates/social-networks/blogpost-badges.html:31
+#: apps/core/templates/social-networks/blogpost-badges.html:32
+#: apps/core/templates/social-networks/course-badges.html:31
+#: apps/core/templates/social-networks/course-badges.html:32
msgid "Share on Linkedin"
msgstr "Partilhar no Linkedin"
-#: apps/core/templates/social-networks/blogpost-badges.html:40
-#: apps/core/templates/social-networks/course-badges.html:40
+#: apps/core/templates/social-networks/blogpost-badges.html:41
+#: apps/core/templates/social-networks/blogpost-badges.html:42
+#: apps/core/templates/social-networks/course-badges.html:41
+#: apps/core/templates/social-networks/course-badges.html:42
msgid "Share by Email"
msgstr "Partilhar por e-mail"
@@ -207,22 +214,20 @@ msgstr "Siga um curso online com o Richie"
msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s"
msgstr "Eu acabei de me inscrever no curso \"%(title)s\" no Richie: %(url)s"
+#: apps/core/templates/social-networks/footer-badges.html:7
#: apps/core/templates/social-networks/footer-badges.html:8
msgid "Facebook"
msgstr "Facebook"
-#: apps/core/templates/social-networks/footer-badges.html:16
+#: apps/core/templates/social-networks/footer-badges.html:17
+#: apps/core/templates/social-networks/footer-badges.html:18
msgid "Twitter page"
msgstr "Página do Twitter"
-#: apps/core/templates/social-networks/footer-badges.html:19
-msgid "Twitter"
-msgstr "Twitter"
-
#: apps/core/templates/social-networks/footer-badges.html:27
-#: apps/core/templates/social-networks/footer-badges.html:30
-msgid "Linkedin"
-msgstr "Linkedin"
+#: apps/core/templates/social-networks/footer-badges.html:28
+msgid "Linkedin page"
+msgstr "Página do Linkedin"
#: apps/core/views/error.py:7
msgid "Bad request"
@@ -269,6 +274,8 @@ msgid "See filer folder"
msgstr "Ver pasta do arquivador"
#: apps/courses/cms_plugins.py:27
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:55
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:56
msgid "Organization"
msgstr "Organização"
@@ -277,6 +284,7 @@ msgid "Organization by Category"
msgstr "Organização por Categoria"
#: apps/courses/cms_plugins.py:87
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:29
msgid "Category"
msgstr "Categoria"
@@ -534,13 +542,13 @@ msgid "blog posts"
msgstr "publicações"
#: apps/courses/models/blog.py:91 apps/courses/models/category.py:154
-#: apps/courses/models/course.py:981 apps/courses/models/organization.py:199
+#: apps/courses/models/course.py:983 apps/courses/models/organization.py:199
#: apps/courses/models/organization.py:233
msgid "variant"
msgstr "variante"
#: apps/courses/models/blog.py:94 apps/courses/models/category.py:157
-#: apps/courses/models/course.py:984 apps/courses/models/organization.py:202
+#: apps/courses/models/course.py:986 apps/courses/models/organization.py:202
#: apps/courses/models/organization.py:236
msgid "Optional glimpse variant for a custom look."
msgstr "Variante de visualização personalizada."
@@ -733,55 +741,59 @@ msgstr "Tradução da edição do curso"
msgid "Course run translations"
msgstr "Traduções da edição do curso"
-#: apps/courses/models/course.py:991
+#: apps/courses/models/course.py:932
+msgid "Empty title"
+msgstr "Título em branco"
+
+#: apps/courses/models/course.py:993
msgid "course plugin"
msgstr "plugin do curso"
-#: apps/courses/models/course.py:992
+#: apps/courses/models/course.py:994
msgid "course plugins"
msgstr "plugins do curso"
-#: apps/courses/models/course.py:1009 plugins/large_banner/models.py:38
+#: apps/courses/models/course.py:1011 plugins/large_banner/models.py:38
msgid "logo"
msgstr "logotipo"
-#: apps/courses/models/course.py:1011
+#: apps/courses/models/course.py:1013
msgid "url"
msgstr "url"
-#: apps/courses/models/course.py:1014 apps/courses/models/course.py:1038
+#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1040
msgid "name"
msgstr "nome"
-#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1039
+#: apps/courses/models/course.py:1018 apps/courses/models/course.py:1041
msgid "content"
msgstr "conteúdo"
-#: apps/courses/models/course.py:1021
+#: apps/courses/models/course.py:1023
msgid "licence"
msgstr "licença"
-#: apps/courses/models/course.py:1022
+#: apps/courses/models/course.py:1024
msgid "licences"
msgstr "licenças"
-#: apps/courses/models/course.py:1044
+#: apps/courses/models/course.py:1046
msgid "Licence translation"
msgstr "Tradução da licença"
-#: apps/courses/models/course.py:1045
+#: apps/courses/models/course.py:1047
msgid "licence translations"
msgstr "traduções da licença"
-#: apps/courses/models/course.py:1059
+#: apps/courses/models/course.py:1061
msgid "description"
msgstr "descrição"
-#: apps/courses/models/course.py:1063
+#: apps/courses/models/course.py:1065
msgid "licence plugin"
msgstr "plugin da licença"
-#: apps/courses/models/course.py:1064
+#: apps/courses/models/course.py:1066
msgid "licence plugins"
msgstr "plugins de licença"
@@ -893,213 +905,241 @@ msgstr "papéis de página"
msgid "{:s} | {:s}"
msgstr "{:s} | {:s}"
-#: apps/courses/settings/__init__.py:35
+#: apps/courses/settings/__init__.py:77
msgid "Course page"
msgstr "Página do curso"
-#: apps/courses/settings/__init__.py:36
+#: apps/courses/settings/__init__.py:78
msgid "Organization list"
msgstr "Lista de organizações"
-#: apps/courses/settings/__init__.py:37
+#: apps/courses/settings/__init__.py:79
msgid "Organization page"
msgstr "Página da organização"
-#: apps/courses/settings/__init__.py:38
+#: apps/courses/settings/__init__.py:80
msgid "Category list"
msgstr "Lista de categorias"
-#: apps/courses/settings/__init__.py:39
+#: apps/courses/settings/__init__.py:81
msgid "Category page"
msgstr "Página de categorias"
-#: apps/courses/settings/__init__.py:40
+#: apps/courses/settings/__init__.py:82
msgid "Blog post list"
msgstr "Lista de publicações"
-#: apps/courses/settings/__init__.py:41
+#: apps/courses/settings/__init__.py:83
msgid "Blog post page"
msgstr "Página de publicação"
-#: apps/courses/settings/__init__.py:42
+#: apps/courses/settings/__init__.py:84
msgid "Person page"
msgstr "Página da pessoa"
-#: apps/courses/settings/__init__.py:43
+#: apps/courses/settings/__init__.py:85
msgid "Person list"
msgstr "Lista de pessoas"
-#: apps/courses/settings/__init__.py:44
+#: apps/courses/settings/__init__.py:86
msgid "Program page"
msgstr "Página de programa"
-#: apps/courses/settings/__init__.py:45
+#: apps/courses/settings/__init__.py:87
msgid "Program list"
msgstr "Lista de programas"
-#: apps/courses/settings/__init__.py:46
+#: apps/courses/settings/__init__.py:88
msgid "Search"
msgstr "Pesquisa"
-#: apps/courses/settings/__init__.py:47
+#: apps/courses/settings/__init__.py:89
msgid "List of child pages"
msgstr "Lista de páginas filhas"
-#: apps/courses/settings/__init__.py:48
+#: apps/courses/settings/__init__.py:90
msgid "Homepage"
msgstr "Página inicial"
-#: apps/courses/settings/__init__.py:49
+#: apps/courses/settings/__init__.py:91
msgid "Single column"
msgstr "Coluna única"
-#: apps/courses/settings/__init__.py:56
+#: apps/courses/settings/__init__.py:92
+msgid "Three columns: (33% | 33% | 33%)"
+msgstr "Três colunas: (33% | 33% | 33%)"
+
+#: apps/courses/settings/__init__.py:93
+msgid "Two columns: (50% | 50%)"
+msgstr "Duas colunas: (50% | 50%)"
+
+#: apps/courses/settings/__init__.py:94
+msgid "Two columns: (25% | 75%)"
+msgstr "Duas colunas: (25% | 75%)"
+
+#: apps/courses/settings/__init__.py:95
+msgid "Two columns: (75% | 25%)"
+msgstr "Duas colunas: (75% | 25%)"
+
+#: apps/courses/settings/__init__.py:102
msgid "Footer"
msgstr "Rodapé"
-#: apps/courses/settings/__init__.py:61
+#: apps/courses/settings/__init__.py:107
msgid "Static headline"
msgstr "Cabeçalho estático"
-#: apps/courses/settings/__init__.py:68 apps/courses/settings/__init__.py:90
-#: apps/courses/settings/__init__.py:317
+#: apps/courses/settings/__init__.py:114 apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:138 apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:155 apps/courses/settings/__init__.py:162
+#: apps/courses/settings/__init__.py:371
msgid "Main content"
msgstr "Conteúdo principal"
-#: apps/courses/settings/__init__.py:120 apps/courses/settings/__init__.py:278
-#: apps/courses/settings/__init__.py:298
+#: apps/courses/settings/__init__.py:141 apps/courses/settings/__init__.py:151
+#: apps/courses/settings/__init__.py:158 apps/courses/settings/__init__.py:165
+msgid "Secondary content"
+msgstr "Conteúdo secundário"
+
+#: apps/courses/settings/__init__.py:144
+msgid "Third content"
+msgstr "Conteúdo terciário"
+
+#: apps/courses/settings/__init__.py:169 apps/courses/settings/__init__.py:332
+#: apps/courses/settings/__init__.py:352
#: apps/courses/templates/courses/cms/blogpost_detail.html:108
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:10
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:41
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:76
-#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:9
-#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:8
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:10
+#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:9
#: apps/courses/templates/courses/cms/program_detail.html:40
msgid "Cover"
msgstr "Capa"
-#: apps/courses/settings/__init__.py:125
+#: apps/courses/settings/__init__.py:174
msgid "Catch phrase"
msgstr "Frase-chave"
-#: apps/courses/settings/__init__.py:130
+#: apps/courses/settings/__init__.py:179
msgid "Teaser"
msgstr "Teaser"
-#: apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:184
msgid "About the course"
msgstr "Sobre o curso"
-#: apps/courses/settings/__init__.py:140
+#: apps/courses/settings/__init__.py:189
msgid "What you will learn"
msgstr "O que vai aprender"
-#: apps/courses/settings/__init__.py:144
+#: apps/courses/settings/__init__.py:193
msgid "Format"
msgstr "Formato"
-#: apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:197
msgid "Prerequisites"
msgstr "Pré-requisitos"
-#: apps/courses/settings/__init__.py:152
+#: apps/courses/settings/__init__.py:201
msgid "Team"
msgstr "Equipa"
-#: apps/courses/settings/__init__.py:156
+#: apps/courses/settings/__init__.py:205
msgid "Plan"
msgstr "Plano"
-#: apps/courses/settings/__init__.py:161
+#: apps/courses/settings/__init__.py:210
msgid "Complementary information"
msgstr "Informação complementar"
-#: apps/courses/settings/__init__.py:173
-#: apps/courses/templates/courses/cms/course_detail.html:464
+#: apps/courses/settings/__init__.py:222
+#: apps/courses/templates/courses/cms/course_detail.html:526
#: apps/courses/templates/courses/cms/fragment_course_relations.html:47
msgid "License for the course content"
msgstr "Licença para o conteúdo do curso"
-#: apps/courses/settings/__init__.py:178
-#: apps/courses/templates/courses/cms/course_detail.html:475
+#: apps/courses/settings/__init__.py:227
+#: apps/courses/templates/courses/cms/course_detail.html:537
#: apps/courses/templates/courses/cms/fragment_course_relations.html:56
msgid "License for the content created by course participants"
msgstr "Licença para o conteúdo criado pelos participantes do curso"
-#: apps/courses/settings/__init__.py:183 apps/courses/settings/__init__.py:211
-#: apps/courses/settings/__init__.py:242 apps/courses/settings/__init__.py:274
+#: apps/courses/settings/__init__.py:232 apps/courses/settings/__init__.py:260
+#: apps/courses/settings/__init__.py:296 apps/courses/settings/__init__.py:328
msgid "Categories"
msgstr "Categorias"
-#: apps/courses/settings/__init__.py:187 apps/courses/settings/__init__.py:231
+#: apps/courses/settings/__init__.py:236 apps/courses/settings/__init__.py:285
msgid "Icon"
msgstr "Ícone"
-#: apps/courses/settings/__init__.py:192 apps/courses/settings/__init__.py:264
+#: apps/courses/settings/__init__.py:241 apps/courses/settings/__init__.py:318
#: apps/courses/templates/courses/cms/fragment_course_relations.html:27
#: apps/courses/templates/courses/cms/person_detail.html:112
#: apps/search/defaults.py:115
msgid "Organizations"
msgstr "Organizações"
-#: apps/courses/settings/__init__.py:196
+#: apps/courses/settings/__init__.py:245
msgid "Assessment and Certification"
msgstr "Avaliação e Certificação"
-#: apps/courses/settings/__init__.py:201 apps/courses/settings/__init__.py:221
+#: apps/courses/settings/__init__.py:250 apps/courses/settings/__init__.py:275
#: apps/courses/templates/courses/cms/category_detail.html:35
msgid "Banner"
msgstr "Banner"
-#: apps/courses/settings/__init__.py:206 apps/courses/settings/__init__.py:226
+#: apps/courses/settings/__init__.py:255 apps/courses/settings/__init__.py:280
#: apps/courses/templates/courses/cms/category_detail.html:53
-#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:40
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:41
msgid "Logo"
msgstr "Logo"
-#: apps/courses/settings/__init__.py:215 apps/courses/settings/__init__.py:236
-#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:35
+#: apps/courses/settings/__init__.py:264 apps/courses/settings/__init__.py:290
msgid "Description"
msgstr "Descrição"
-#: apps/courses/settings/__init__.py:246
+#: apps/courses/settings/__init__.py:269 apps/courses/settings/__init__.py:337
+#: apps/courses/settings/__init__.py:357
+#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:46
+msgid "Excerpt"
+msgstr "Excerto"
+
+#: apps/courses/settings/__init__.py:300
msgid "Portrait"
msgstr "Retrato"
-#: apps/courses/settings/__init__.py:251
+#: apps/courses/settings/__init__.py:305
msgid "Bio"
msgstr "Bio"
-#: apps/courses/settings/__init__.py:256
+#: apps/courses/settings/__init__.py:310
msgid "Main Content"
msgstr "Conteúdo Principal"
-#: apps/courses/settings/__init__.py:269
+#: apps/courses/settings/__init__.py:323
msgid "Author"
msgstr "Autor"
-#: apps/courses/settings/__init__.py:283 apps/courses/settings/__init__.py:303
-msgid "Excerpt"
-msgstr "Excerto"
-
-#: apps/courses/settings/__init__.py:288 apps/courses/settings/__init__.py:308
+#: apps/courses/settings/__init__.py:342 apps/courses/settings/__init__.py:362
msgid "Body"
msgstr "Conteúdo"
-#: apps/courses/settings/__init__.py:292
+#: apps/courses/settings/__init__.py:346
msgid "Headline"
msgstr "Título"
-#: apps/courses/settings/__init__.py:313
+#: apps/courses/settings/__init__.py:367
#: apps/courses/templates/courses/cms/person_detail.html:129
msgid "Courses"
msgstr "Cursos"
-#: apps/courses/settings/__init__.py:439
+#: apps/courses/settings/__init__.py:493
msgid "Button caesura"
msgstr "Botão de quebra de secção"
-#: apps/courses/settings/__init__.py:441
+#: apps/courses/settings/__init__.py:495
msgid "Full width"
msgstr "Largura total"
@@ -1120,6 +1160,7 @@ msgid "blog post cover image"
msgstr "imagem de capa da publicação"
#: apps/courses/templates/courses/cms/blogpost_detail.html:138
+#: apps/courses/templates/courses/cms/organization_detail.html:102
#: apps/courses/templates/courses/cms/program_detail.html:60
msgid "No excerpt content"
msgstr "Sem conteúdo no excerto"
@@ -1150,7 +1191,7 @@ msgid "Sub categories"
msgstr "Subcategorias"
#: apps/courses/templates/courses/cms/category_detail.html:118
-#: apps/courses/templates/courses/cms/organization_detail.html:106
+#: apps/courses/templates/courses/cms/organization_detail.html:120
#: apps/courses/templates/courses/cms/program_detail.html:78
msgid "Related courses"
msgstr "Cursos relacionados"
@@ -1190,12 +1231,12 @@ msgid "Related blogposts pagination"
msgstr "Página de posts de blog relacionados"
#: apps/courses/templates/courses/cms/category_detail.html:188
-#: apps/courses/templates/courses/cms/organization_detail.html:132
+#: apps/courses/templates/courses/cms/organization_detail.html:146
msgid "Related persons"
msgstr "Pessoas relacionadas"
#: apps/courses/templates/courses/cms/category_detail.html:193
-#: apps/courses/templates/courses/cms/organization_detail.html:139
+#: apps/courses/templates/courses/cms/organization_detail.html:153
msgid "Related persons pagination"
msgstr "Paginação de pessoas relacionadas"
@@ -1203,33 +1244,38 @@ msgstr "Paginação de pessoas relacionadas"
msgid "No categories"
msgstr "Sem categorias"
-#: apps/courses/templates/courses/cms/course_detail.html:58
-#: apps/courses/templates/courses/cms/organization_detail.html:87
-#: apps/courses/templates/courses/cms/person_detail.html:47
-msgid "No associated categories"
-msgstr "Nenhuma categoria associada"
+#: apps/courses/templates/courses/cms/course_detail.html:6
+#, python-format
+msgid "%(course_title)s - Course"
+msgstr "%(course_title)s - Curso"
-#: apps/courses/templates/courses/cms/course_detail.html:72
+#: apps/courses/templates/courses/cms/course_detail.html:59
msgid "Ref. "
msgstr "Cód. "
-#: apps/courses/templates/courses/cms/course_detail.html:88
+#: apps/courses/templates/courses/cms/course_detail.html:73
+#: apps/courses/templates/courses/cms/organization_detail.html:91
+#: apps/courses/templates/courses/cms/person_detail.html:47
+msgid "No associated categories"
+msgstr "Nenhuma categoria associada"
+
+#: apps/courses/templates/courses/cms/course_detail.html:94
msgid "Duration:"
msgstr "Duração:"
-#: apps/courses/templates/courses/cms/course_detail.html:97
+#: apps/courses/templates/courses/cms/course_detail.html:103
msgid "Effort:"
msgstr "Esforço:"
-#: apps/courses/templates/courses/cms/course_detail.html:106
+#: apps/courses/templates/courses/cms/course_detail.html:112
msgid "Pace:"
msgstr "Ritmo:"
-#: apps/courses/templates/courses/cms/course_detail.html:116
+#: apps/courses/templates/courses/cms/course_detail.html:122
msgid "Enter here a introduction of your course."
msgstr "Escreva um texto introdutório para o curso."
-#: apps/courses/templates/courses/cms/course_detail.html:124
+#: apps/courses/templates/courses/cms/course_detail.html:130
#, python-format
msgid "\n"
" %(count)s already enrolled!\n"
@@ -1238,16 +1284,28 @@ msgstr "\n"
" %(count)s já inscritos!\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:136
+#: apps/courses/templates/courses/cms/course_detail.html:142
msgid "Add a teaser video or add a cover image below and it will be used as teaser image as well."
msgstr "Adicione um vídeo ou uma imagem de capa abaixo e será utilizada como imagem de teaser."
-#: apps/courses/templates/courses/cms/course_detail.html:148
-#: apps/courses/templates/courses/cms/course_detail.html:226
+#: apps/courses/templates/courses/cms/course_detail.html:154
+#: apps/courses/templates/courses/cms/course_detail.html:255
msgid "course cover image"
msgstr "imagem de capa do curso"
-#: apps/courses/templates/courses/cms/course_detail.html:198
+#: apps/courses/templates/courses/cms/course_detail.html:182
+msgid "No open course runs"
+msgstr "Sem edições disponíveis"
+
+#: apps/courses/templates/courses/cms/course_detail.html:192
+msgid "course runs are currently open for this course"
+msgstr "estão disponíveis edições deste curso"
+
+#: apps/courses/templates/courses/cms/course_detail.html:196
+msgid "Choose now"
+msgstr "Selecionar agora"
+
+#: apps/courses/templates/courses/cms/course_detail.html:227
#, python-format
msgid "\n"
" Archived on %(creation_date)s\n"
@@ -1256,98 +1314,107 @@ msgstr "\n"
" Arquivado em %(creation_date)s\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:202
+#: apps/courses/templates/courses/cms/course_detail.html:231
msgid "Go to current version"
msgstr "Ir para a versão atual"
-#: apps/courses/templates/courses/cms/course_detail.html:213
+#: apps/courses/templates/courses/cms/course_detail.html:242
msgid "Glimpse cover"
msgstr "Capa da perspectiva"
-#: apps/courses/templates/courses/cms/course_detail.html:215
+#: apps/courses/templates/courses/cms/course_detail.html:244
msgid "Add an image for course cover on its glimpse."
msgstr "Adicione uma imagem para a capa do curso na perspectiva."
-#: apps/courses/templates/courses/cms/course_detail.html:239
+#: apps/courses/templates/courses/cms/course_detail.html:268
msgctxt "course_detail__title"
msgid "What you will learn"
msgstr "O que vai aprender"
-#: apps/courses/templates/courses/cms/course_detail.html:240
+#: apps/courses/templates/courses/cms/course_detail.html:269
msgid "At the end of this course, you will be able to:"
msgstr "No final deste curso, será capaz de:"
-#: apps/courses/templates/courses/cms/course_detail.html:249
+#: apps/courses/templates/courses/cms/course_detail.html:278
msgctxt "course_detail__title"
msgid "Description"
msgstr "Descrição"
-#: apps/courses/templates/courses/cms/course_detail.html:260
+#: apps/courses/templates/courses/cms/course_detail.html:289
msgctxt "course_detail__title"
msgid "Format"
msgstr "Formato"
-#: apps/courses/templates/courses/cms/course_detail.html:262
+#: apps/courses/templates/courses/cms/course_detail.html:291
msgid "How is the course structured?"
msgstr "Como está estruturado o curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:271
+#: apps/courses/templates/courses/cms/course_detail.html:300
msgctxt "course_detail__title"
msgid "Prerequisites"
msgstr "Pré-requisitos"
-#: apps/courses/templates/courses/cms/course_detail.html:274
+#: apps/courses/templates/courses/cms/course_detail.html:303
msgid "What are the prerequisites to follow this course?"
msgstr "Quais são os pré-requisitos para este curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:284
+#: apps/courses/templates/courses/cms/course_detail.html:313
msgctxt "course_detail__title"
msgid "Assessment and certification"
msgstr "Avaliação e certificação"
-#: apps/courses/templates/courses/cms/course_detail.html:287
+#: apps/courses/templates/courses/cms/course_detail.html:316
msgid "How is progress evaluated and/or certified?"
msgstr "Como é avaliado o progresso e/ou certificado?"
-#: apps/courses/templates/courses/cms/course_detail.html:299
+#: apps/courses/templates/courses/cms/course_detail.html:328
msgctxt "course_detail__title"
msgid "Course plan"
msgstr "Plano de curso"
-#: apps/courses/templates/courses/cms/course_detail.html:302
+#: apps/courses/templates/courses/cms/course_detail.html:331
msgid "Enter here the detailed course plan."
msgstr "Descreva aqui o plano detalhado do curso."
-#: apps/courses/templates/courses/cms/course_detail.html:317
+#: apps/courses/templates/courses/cms/course_detail.html:349
+msgctxt "course_detail__title"
+msgid "Other course runs"
+msgstr "Outras edições do curso"
+
+#: apps/courses/templates/courses/cms/course_detail.html:351
msgctxt "course_detail__title"
msgid "Course runs"
msgstr "Edições do curso"
-#: apps/courses/templates/courses/cms/course_detail.html:323
-msgid "No open course runs"
+#: apps/courses/templates/courses/cms/course_detail.html:361
+msgid "No course runs"
msgstr "Sem edições disponíveis"
-#: apps/courses/templates/courses/cms/course_detail.html:332
+#: apps/courses/templates/courses/cms/course_detail.html:363
+msgid "No other course runs"
+msgstr "Sem outras edições disponíveis"
+
+#: apps/courses/templates/courses/cms/course_detail.html:387
msgctxt "Course runs to be scheduled (plural)"
msgid "To be scheduled"
msgstr "A agendar"
-#: apps/courses/templates/courses/cms/course_detail.html:343
+#: apps/courses/templates/courses/cms/course_detail.html:400
msgctxt "Upcoming course runs (plural)"
msgid "Upcoming"
msgstr "Brevemente"
-#: apps/courses/templates/courses/cms/course_detail.html:354
+#: apps/courses/templates/courses/cms/course_detail.html:413
msgctxt "Ongoing course runs (plural)"
msgid "Ongoing"
msgstr "A decorrer"
-#: apps/courses/templates/courses/cms/course_detail.html:365
+#: apps/courses/templates/courses/cms/course_detail.html:426
msgctxt "Archived course runs (plural)"
msgid "Archived"
msgstr "Arquivado"
-#: apps/courses/templates/courses/cms/course_detail.html:389
+#: apps/courses/templates/courses/cms/course_detail.html:451
msgid "\n"
" This course is part of a program\n"
" "
@@ -1361,41 +1428,51 @@ msgstr[1] "\n"
" Este curso é parte dos programas\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:415
+#: apps/courses/templates/courses/cms/course_detail.html:477
msgctxt "course_detail__title"
msgid "Course team"
msgstr "Equipa do curso"
-#: apps/courses/templates/courses/cms/course_detail.html:420
+#: apps/courses/templates/courses/cms/course_detail.html:482
#: apps/courses/templates/courses/cms/fragment_course_relations.html:13
msgid "Who are the teachers in the course team?"
msgstr "Quem são os professores da equipa do curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:434
+#: apps/courses/templates/courses/cms/course_detail.html:496
msgctxt "course_detail__title"
msgid "Organizations"
msgstr "Organizações"
-#: apps/courses/templates/courses/cms/course_detail.html:439
+#: apps/courses/templates/courses/cms/course_detail.html:501
#: apps/courses/templates/courses/cms/fragment_course_relations.html:32
msgid "What are the organizations publishing this course?"
msgstr "Quem são as organizações responsáveis por este curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:460
+#: apps/courses/templates/courses/cms/course_detail.html:522
msgctxt "course_detail__title"
msgid "License"
msgstr "Licença"
-#: apps/courses/templates/courses/cms/course_detail.html:467
+#: apps/courses/templates/courses/cms/course_detail.html:529
#: apps/courses/templates/courses/cms/fragment_course_relations.html:50
msgid "What is the license for the course content?"
msgstr "Qual é a licença para o conteúdo do curso?"
-#: apps/courses/templates/courses/cms/course_detail.html:478
+#: apps/courses/templates/courses/cms/course_detail.html:540
#: apps/courses/templates/courses/cms/fragment_course_relations.html:59
msgid "What is the license for the content created by course participants?"
msgstr "Qual é a licença para o conteúdo criado pelos participantes do curso?"
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:63
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:64
+msgid "Course code"
+msgstr "Código do curso"
+
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:83
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:84
+msgid "Course date"
+msgstr "Data do curso"
+
#: apps/courses/templates/courses/cms/fragment_course_relations.html:8
msgid "Course team"
msgstr "Equipa do curso"
@@ -1458,28 +1535,26 @@ msgstr "\n"
" Se o que precisa é de uma página de %(model)s deve criá-la através do assistente, escolhendo \"Nova página %(model)s.\n"
" "
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:16
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:39
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:8
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:9
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:17
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:40
msgid "Main organization"
msgstr "Organização principal"
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:29
-msgid "main organization logo"
-msgstr "logotipo principal da organização"
-
-#: apps/courses/templates/courses/cms/organization_detail.html:50
+#: apps/courses/templates/courses/cms/organization_detail.html:54
msgid "organization banner"
msgstr "banner da organização"
-#: apps/courses/templates/courses/cms/organization_detail.html:71
+#: apps/courses/templates/courses/cms/organization_detail.html:75
msgid "organization logo"
msgstr "logotipo da organização"
-#: apps/courses/templates/courses/cms/organization_detail.html:111
+#: apps/courses/templates/courses/cms/organization_detail.html:125
msgid "Related courses pagination"
msgstr "Paginação de cursos relacionados"
-#: apps/courses/templates/courses/cms/organization_detail.html:114
+#: apps/courses/templates/courses/cms/organization_detail.html:128
#, python-format
msgid "\n"
" See all courses related to %(organization_title)s\n"
@@ -1536,9 +1611,9 @@ msgstr "Sem programas associados"
#. Translators: delay indicates when the course will start as a duration.
#. In english the string will be "The course will start in 3 days"
-#: apps/courses/templatetags/extra_tags.py:262
+#: apps/courses/templatetags/extra_tags.py:278
msgid "The course will start {delay:s}"
-msgstr "O curso iniciará em {delay:s}"
+msgstr "O curso iniciará {delay:s}"
#: apps/demo/management/commands/create_demo_site.py:384
#, python-brace-format
diff --git a/src/richie/locale/ru_RU/LC_MESSAGES/django.mo b/src/richie/locale/ru_RU/LC_MESSAGES/django.mo
index 5efbc923f2..93976d30b9 100644
Binary files a/src/richie/locale/ru_RU/LC_MESSAGES/django.mo and b/src/richie/locale/ru_RU/LC_MESSAGES/django.mo differ
diff --git a/src/richie/locale/ru_RU/LC_MESSAGES/django.po b/src/richie/locale/ru_RU/LC_MESSAGES/django.po
index e1e8bc8932..6ccebfe501 100644
--- a/src/richie/locale/ru_RU/LC_MESSAGES/django.po
+++ b/src/richie/locale/ru_RU/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: richie\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-17 18:04+0000\n"
-"PO-Revision-Date: 2022-02-18 09:49\n"
+"POT-Creation-Date: 2022-04-01 15:01+0000\n"
+"PO-Revision-Date: 2022-04-04 07:53\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -101,29 +101,28 @@ msgstr "Ваш браузер не поддерживает этот форма
msgid "You are here:"
msgstr "Вы находитесь здесь:"
-#: apps/core/templates/richie/base.html:74
+#: apps/core/templates/richie/base.html:78
msgid "Skip to main content"
msgstr "Перейти к основному содержимому"
-#: apps/core/templates/richie/base.html:86
+#: apps/core/templates/richie/base.html:90
msgid "Go to homepage"
msgstr "Вернуться на главную страницу"
-#: apps/core/templates/richie/base.html:111
-#: apps/courses/templates/courses/cms/course_detail.html:172
+#: apps/core/templates/richie/base.html:115
msgid "Contact us"
msgstr "Свяжитесь с нами"
-#: apps/core/templates/richie/base.html:143
+#: apps/core/templates/richie/base.html:147
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:32
msgid "Learn more"
msgstr "Узнать больше"
-#: apps/core/templates/richie/base.html:157
+#: apps/core/templates/richie/base.html:161
msgid "Life-changing learning!"
msgstr "Обучение, меняющее жизнь!"
-#: apps/core/templates/richie/base.html:171
+#: apps/core/templates/richie/base.html:175
msgid "Powered by"
msgstr "Работает на"
@@ -180,23 +179,31 @@ msgstr "Новости Richie: %(title)s"
msgid "Richie news: %(title)s %(url)s"
msgstr "Новости Richie: %(title)s %(url)s"
-#: apps/core/templates/social-networks/blogpost-badges.html:10
-#: apps/core/templates/social-networks/course-badges.html:10
+#: apps/core/templates/social-networks/blogpost-badges.html:11
+#: apps/core/templates/social-networks/blogpost-badges.html:12
+#: apps/core/templates/social-networks/course-badges.html:11
+#: apps/core/templates/social-networks/course-badges.html:12
msgid "Share on Facebook"
msgstr "Поделитесь на Facebook"
-#: apps/core/templates/social-networks/blogpost-badges.html:20
-#: apps/core/templates/social-networks/course-badges.html:20
+#: apps/core/templates/social-networks/blogpost-badges.html:21
+#: apps/core/templates/social-networks/blogpost-badges.html:22
+#: apps/core/templates/social-networks/course-badges.html:21
+#: apps/core/templates/social-networks/course-badges.html:22
msgid "Share on Twitter"
msgstr "Поделиться через Twitter"
-#: apps/core/templates/social-networks/blogpost-badges.html:30
-#: apps/core/templates/social-networks/course-badges.html:30
+#: apps/core/templates/social-networks/blogpost-badges.html:31
+#: apps/core/templates/social-networks/blogpost-badges.html:32
+#: apps/core/templates/social-networks/course-badges.html:31
+#: apps/core/templates/social-networks/course-badges.html:32
msgid "Share on Linkedin"
msgstr "Поделиться на LinkedIn"
-#: apps/core/templates/social-networks/blogpost-badges.html:40
-#: apps/core/templates/social-networks/course-badges.html:40
+#: apps/core/templates/social-networks/blogpost-badges.html:41
+#: apps/core/templates/social-networks/blogpost-badges.html:42
+#: apps/core/templates/social-networks/course-badges.html:41
+#: apps/core/templates/social-networks/course-badges.html:42
msgid "Share by Email"
msgstr "Поделиться по электронной почте"
@@ -209,22 +216,20 @@ msgstr "Пройдите курс обучения онлайн вместе с
msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s"
msgstr "Я записался на курс \"%(title)s\" на Richie\": %(url)s"
+#: apps/core/templates/social-networks/footer-badges.html:7
#: apps/core/templates/social-networks/footer-badges.html:8
msgid "Facebook"
msgstr "Facebook"
-#: apps/core/templates/social-networks/footer-badges.html:16
+#: apps/core/templates/social-networks/footer-badges.html:17
+#: apps/core/templates/social-networks/footer-badges.html:18
msgid "Twitter page"
msgstr "Страничка Twitter"
-#: apps/core/templates/social-networks/footer-badges.html:19
-msgid "Twitter"
-msgstr "Twitter"
-
#: apps/core/templates/social-networks/footer-badges.html:27
-#: apps/core/templates/social-networks/footer-badges.html:30
-msgid "Linkedin"
-msgstr "Linkedin"
+#: apps/core/templates/social-networks/footer-badges.html:28
+msgid "Linkedin page"
+msgstr ""
#: apps/core/views/error.py:7
msgid "Bad request"
@@ -271,6 +276,8 @@ msgid "See filer folder"
msgstr "Смотреть папку filer"
#: apps/courses/cms_plugins.py:27
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:55
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:56
msgid "Organization"
msgstr "Организация"
@@ -279,6 +286,7 @@ msgid "Organization by Category"
msgstr "Организация по категориям"
#: apps/courses/cms_plugins.py:87
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:29
msgid "Category"
msgstr "Категория"
@@ -536,13 +544,13 @@ msgid "blog posts"
msgstr "записи в блоге"
#: apps/courses/models/blog.py:91 apps/courses/models/category.py:154
-#: apps/courses/models/course.py:981 apps/courses/models/organization.py:199
+#: apps/courses/models/course.py:983 apps/courses/models/organization.py:199
#: apps/courses/models/organization.py:233
msgid "variant"
msgstr "вариант"
#: apps/courses/models/blog.py:94 apps/courses/models/category.py:157
-#: apps/courses/models/course.py:984 apps/courses/models/organization.py:202
+#: apps/courses/models/course.py:986 apps/courses/models/organization.py:202
#: apps/courses/models/organization.py:236
msgid "Optional glimpse variant for a custom look."
msgstr "Дополнительный вариант с проблеском для придания индивидуального вида."
@@ -735,55 +743,59 @@ msgstr "Перевод запуска курса"
msgid "Course run translations"
msgstr "Переводы запуска курса"
-#: apps/courses/models/course.py:991
+#: apps/courses/models/course.py:932
+msgid "Empty title"
+msgstr "Пустой заголовок"
+
+#: apps/courses/models/course.py:993
msgid "course plugin"
msgstr "плагин курса"
-#: apps/courses/models/course.py:992
+#: apps/courses/models/course.py:994
msgid "course plugins"
msgstr "плагины курса"
-#: apps/courses/models/course.py:1009 plugins/large_banner/models.py:38
+#: apps/courses/models/course.py:1011 plugins/large_banner/models.py:38
msgid "logo"
msgstr "лого"
-#: apps/courses/models/course.py:1011
+#: apps/courses/models/course.py:1013
msgid "url"
msgstr "url"
-#: apps/courses/models/course.py:1014 apps/courses/models/course.py:1038
+#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1040
msgid "name"
msgstr "имя"
-#: apps/courses/models/course.py:1016 apps/courses/models/course.py:1039
+#: apps/courses/models/course.py:1018 apps/courses/models/course.py:1041
msgid "content"
msgstr "контент"
-#: apps/courses/models/course.py:1021
+#: apps/courses/models/course.py:1023
msgid "licence"
msgstr "лицензия"
-#: apps/courses/models/course.py:1022
+#: apps/courses/models/course.py:1024
msgid "licences"
msgstr "лицензии"
-#: apps/courses/models/course.py:1044
+#: apps/courses/models/course.py:1046
msgid "Licence translation"
msgstr "Перевод лицензии"
-#: apps/courses/models/course.py:1045
+#: apps/courses/models/course.py:1047
msgid "licence translations"
msgstr "переводы лицензий"
-#: apps/courses/models/course.py:1059
+#: apps/courses/models/course.py:1061
msgid "description"
msgstr "описание"
-#: apps/courses/models/course.py:1063
+#: apps/courses/models/course.py:1065
msgid "licence plugin"
msgstr "плагин лицензии"
-#: apps/courses/models/course.py:1064
+#: apps/courses/models/course.py:1066
msgid "licence plugins"
msgstr "плагины лицензии"
@@ -895,213 +907,241 @@ msgstr "роли страницы"
msgid "{:s} | {:s}"
msgstr "{:s} | {:s}"
-#: apps/courses/settings/__init__.py:35
+#: apps/courses/settings/__init__.py:77
msgid "Course page"
msgstr "Страница курса"
-#: apps/courses/settings/__init__.py:36
+#: apps/courses/settings/__init__.py:78
msgid "Organization list"
msgstr "Список организаций"
-#: apps/courses/settings/__init__.py:37
+#: apps/courses/settings/__init__.py:79
msgid "Organization page"
msgstr "Страница организации"
-#: apps/courses/settings/__init__.py:38
+#: apps/courses/settings/__init__.py:80
msgid "Category list"
msgstr "Список категорий"
-#: apps/courses/settings/__init__.py:39
+#: apps/courses/settings/__init__.py:81
msgid "Category page"
msgstr "Страница категории"
-#: apps/courses/settings/__init__.py:40
+#: apps/courses/settings/__init__.py:82
msgid "Blog post list"
msgstr "Список записей блога"
-#: apps/courses/settings/__init__.py:41
+#: apps/courses/settings/__init__.py:83
msgid "Blog post page"
msgstr "Страница записи блога"
-#: apps/courses/settings/__init__.py:42
+#: apps/courses/settings/__init__.py:84
msgid "Person page"
msgstr "Страница человека"
-#: apps/courses/settings/__init__.py:43
+#: apps/courses/settings/__init__.py:85
msgid "Person list"
msgstr "Список людей"
-#: apps/courses/settings/__init__.py:44
+#: apps/courses/settings/__init__.py:86
msgid "Program page"
msgstr "Страница программы"
-#: apps/courses/settings/__init__.py:45
+#: apps/courses/settings/__init__.py:87
msgid "Program list"
msgstr "Список программ"
-#: apps/courses/settings/__init__.py:46
+#: apps/courses/settings/__init__.py:88
msgid "Search"
msgstr "Поиск"
-#: apps/courses/settings/__init__.py:47
+#: apps/courses/settings/__init__.py:89
msgid "List of child pages"
msgstr "Список дочерних страниц"
-#: apps/courses/settings/__init__.py:48
+#: apps/courses/settings/__init__.py:90
msgid "Homepage"
msgstr "Домашняя страница"
-#: apps/courses/settings/__init__.py:49
+#: apps/courses/settings/__init__.py:91
msgid "Single column"
msgstr "Одна колонка"
-#: apps/courses/settings/__init__.py:56
+#: apps/courses/settings/__init__.py:92
+msgid "Three columns: (33% | 33% | 33%)"
+msgstr "Три колонки: (33% | 33% | 33%)"
+
+#: apps/courses/settings/__init__.py:93
+msgid "Two columns: (50% | 50%)"
+msgstr "Две колонки: (50% | 50%)"
+
+#: apps/courses/settings/__init__.py:94
+msgid "Two columns: (25% | 75%)"
+msgstr "Две колонки: (25% | 75%)"
+
+#: apps/courses/settings/__init__.py:95
+msgid "Two columns: (75% | 25%)"
+msgstr "Две колонки: (75% | 25%)"
+
+#: apps/courses/settings/__init__.py:102
msgid "Footer"
msgstr "Подвал"
-#: apps/courses/settings/__init__.py:61
+#: apps/courses/settings/__init__.py:107
msgid "Static headline"
msgstr "Статический заголовок"
-#: apps/courses/settings/__init__.py:68 apps/courses/settings/__init__.py:90
-#: apps/courses/settings/__init__.py:317
+#: apps/courses/settings/__init__.py:114 apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:138 apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:155 apps/courses/settings/__init__.py:162
+#: apps/courses/settings/__init__.py:371
msgid "Main content"
msgstr "Основной контент"
-#: apps/courses/settings/__init__.py:120 apps/courses/settings/__init__.py:278
-#: apps/courses/settings/__init__.py:298
+#: apps/courses/settings/__init__.py:141 apps/courses/settings/__init__.py:151
+#: apps/courses/settings/__init__.py:158 apps/courses/settings/__init__.py:165
+msgid "Secondary content"
+msgstr "Дополнительное содержимое"
+
+#: apps/courses/settings/__init__.py:144
+msgid "Third content"
+msgstr "Третье содержимое"
+
+#: apps/courses/settings/__init__.py:169 apps/courses/settings/__init__.py:332
+#: apps/courses/settings/__init__.py:352
#: apps/courses/templates/courses/cms/blogpost_detail.html:108
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:10
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:41
#: apps/courses/templates/courses/cms/fragment_blogpost_glimpse.html:76
-#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:9
-#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:8
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:10
+#: apps/courses/templates/courses/cms/fragment_program_glimpse.html:9
#: apps/courses/templates/courses/cms/program_detail.html:40
msgid "Cover"
msgstr "Обложка"
-#: apps/courses/settings/__init__.py:125
+#: apps/courses/settings/__init__.py:174
msgid "Catch phrase"
msgstr "Меткая фраза"
-#: apps/courses/settings/__init__.py:130
+#: apps/courses/settings/__init__.py:179
msgid "Teaser"
msgstr "Тизер"
-#: apps/courses/settings/__init__.py:135
+#: apps/courses/settings/__init__.py:184
msgid "About the course"
msgstr "О курсе"
-#: apps/courses/settings/__init__.py:140
+#: apps/courses/settings/__init__.py:189
msgid "What you will learn"
msgstr "Чему вы научитесь"
-#: apps/courses/settings/__init__.py:144
+#: apps/courses/settings/__init__.py:193
msgid "Format"
msgstr "Формат"
-#: apps/courses/settings/__init__.py:148
+#: apps/courses/settings/__init__.py:197
msgid "Prerequisites"
msgstr "Предварительные условия"
-#: apps/courses/settings/__init__.py:152
+#: apps/courses/settings/__init__.py:201
msgid "Team"
msgstr "Команда"
-#: apps/courses/settings/__init__.py:156
+#: apps/courses/settings/__init__.py:205
msgid "Plan"
msgstr "План"
-#: apps/courses/settings/__init__.py:161
+#: apps/courses/settings/__init__.py:210
msgid "Complementary information"
msgstr "Дополнительная информация"
-#: apps/courses/settings/__init__.py:173
-#: apps/courses/templates/courses/cms/course_detail.html:464
+#: apps/courses/settings/__init__.py:222
+#: apps/courses/templates/courses/cms/course_detail.html:526
#: apps/courses/templates/courses/cms/fragment_course_relations.html:47
msgid "License for the course content"
msgstr "Лицензия на содержимое курса"
-#: apps/courses/settings/__init__.py:178
-#: apps/courses/templates/courses/cms/course_detail.html:475
+#: apps/courses/settings/__init__.py:227
+#: apps/courses/templates/courses/cms/course_detail.html:537
#: apps/courses/templates/courses/cms/fragment_course_relations.html:56
msgid "License for the content created by course participants"
msgstr "Лицензия на контент, созданный участниками курса"
-#: apps/courses/settings/__init__.py:183 apps/courses/settings/__init__.py:211
-#: apps/courses/settings/__init__.py:242 apps/courses/settings/__init__.py:274
+#: apps/courses/settings/__init__.py:232 apps/courses/settings/__init__.py:260
+#: apps/courses/settings/__init__.py:296 apps/courses/settings/__init__.py:328
msgid "Categories"
msgstr "Категории"
-#: apps/courses/settings/__init__.py:187 apps/courses/settings/__init__.py:231
+#: apps/courses/settings/__init__.py:236 apps/courses/settings/__init__.py:285
msgid "Icon"
msgstr "Иконка"
-#: apps/courses/settings/__init__.py:192 apps/courses/settings/__init__.py:264
+#: apps/courses/settings/__init__.py:241 apps/courses/settings/__init__.py:318
#: apps/courses/templates/courses/cms/fragment_course_relations.html:27
#: apps/courses/templates/courses/cms/person_detail.html:112
#: apps/search/defaults.py:115
msgid "Organizations"
msgstr "Организации"
-#: apps/courses/settings/__init__.py:196
+#: apps/courses/settings/__init__.py:245
msgid "Assessment and Certification"
msgstr "Оценка и сертификация"
-#: apps/courses/settings/__init__.py:201 apps/courses/settings/__init__.py:221
+#: apps/courses/settings/__init__.py:250 apps/courses/settings/__init__.py:275
#: apps/courses/templates/courses/cms/category_detail.html:35
msgid "Banner"
msgstr "Баннер"
-#: apps/courses/settings/__init__.py:206 apps/courses/settings/__init__.py:226
+#: apps/courses/settings/__init__.py:255 apps/courses/settings/__init__.py:280
#: apps/courses/templates/courses/cms/category_detail.html:53
-#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:40
+#: apps/courses/templates/courses/cms/fragment_category_glimpse.html:41
msgid "Logo"
msgstr "Лого"
-#: apps/courses/settings/__init__.py:215 apps/courses/settings/__init__.py:236
-#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:35
+#: apps/courses/settings/__init__.py:264 apps/courses/settings/__init__.py:290
msgid "Description"
msgstr "Описание"
-#: apps/courses/settings/__init__.py:246
+#: apps/courses/settings/__init__.py:269 apps/courses/settings/__init__.py:337
+#: apps/courses/settings/__init__.py:357
+#: apps/courses/templates/courses/cms/fragment_organization_glimpse.html:46
+msgid "Excerpt"
+msgstr "Выдержка"
+
+#: apps/courses/settings/__init__.py:300
msgid "Portrait"
msgstr "Портрет"
-#: apps/courses/settings/__init__.py:251
+#: apps/courses/settings/__init__.py:305
msgid "Bio"
msgstr "О себе"
-#: apps/courses/settings/__init__.py:256
+#: apps/courses/settings/__init__.py:310
msgid "Main Content"
msgstr "Основной Контент"
-#: apps/courses/settings/__init__.py:269
+#: apps/courses/settings/__init__.py:323
msgid "Author"
msgstr "Автор"
-#: apps/courses/settings/__init__.py:283 apps/courses/settings/__init__.py:303
-msgid "Excerpt"
-msgstr "Выдержка"
-
-#: apps/courses/settings/__init__.py:288 apps/courses/settings/__init__.py:308
+#: apps/courses/settings/__init__.py:342 apps/courses/settings/__init__.py:362
msgid "Body"
msgstr "Тело"
-#: apps/courses/settings/__init__.py:292
+#: apps/courses/settings/__init__.py:346
msgid "Headline"
msgstr "Заголовок"
-#: apps/courses/settings/__init__.py:313
+#: apps/courses/settings/__init__.py:367
#: apps/courses/templates/courses/cms/person_detail.html:129
msgid "Courses"
msgstr "Курсы"
-#: apps/courses/settings/__init__.py:439
+#: apps/courses/settings/__init__.py:493
msgid "Button caesura"
msgstr "Кнопка цезура"
-#: apps/courses/settings/__init__.py:441
+#: apps/courses/settings/__init__.py:495
msgid "Full width"
msgstr "Во всю ширину"
@@ -1122,6 +1162,7 @@ msgid "blog post cover image"
msgstr "обложка записи в блоге"
#: apps/courses/templates/courses/cms/blogpost_detail.html:138
+#: apps/courses/templates/courses/cms/organization_detail.html:102
#: apps/courses/templates/courses/cms/program_detail.html:60
msgid "No excerpt content"
msgstr "Контент без выдержки"
@@ -1152,7 +1193,7 @@ msgid "Sub categories"
msgstr "Подкатегории"
#: apps/courses/templates/courses/cms/category_detail.html:118
-#: apps/courses/templates/courses/cms/organization_detail.html:106
+#: apps/courses/templates/courses/cms/organization_detail.html:120
#: apps/courses/templates/courses/cms/program_detail.html:78
msgid "Related courses"
msgstr "Связанные курсы"
@@ -1160,7 +1201,7 @@ msgstr "Связанные курсы"
#: apps/courses/templates/courses/cms/category_detail.html:123
#: apps/courses/templates/courses/cms/person_detail.html:134
msgid "Courses pagination"
-msgstr ""
+msgstr "Пагинация курсов"
#: apps/courses/templates/courses/cms/category_detail.html:127
#, python-format
@@ -1181,7 +1222,7 @@ msgstr "Связанные организации"
#: apps/courses/templates/courses/cms/category_detail.html:155
msgid "Related organizations pagination"
-msgstr ""
+msgstr "Пагинация связанных курсов"
#: apps/courses/templates/courses/cms/category_detail.html:169
msgid "Related blogposts"
@@ -1189,49 +1230,54 @@ msgstr "Похожие блоги"
#: apps/courses/templates/courses/cms/category_detail.html:174
msgid "Related blogposts pagination"
-msgstr ""
+msgstr "Пагинация связанных блогов"
#: apps/courses/templates/courses/cms/category_detail.html:188
-#: apps/courses/templates/courses/cms/organization_detail.html:132
+#: apps/courses/templates/courses/cms/organization_detail.html:146
msgid "Related persons"
msgstr "Связанные люди"
#: apps/courses/templates/courses/cms/category_detail.html:193
-#: apps/courses/templates/courses/cms/organization_detail.html:139
+#: apps/courses/templates/courses/cms/organization_detail.html:153
msgid "Related persons pagination"
-msgstr ""
+msgstr "Пагинация связанных персон"
#: apps/courses/templates/courses/cms/category_list.html:26
msgid "No categories"
msgstr "Нет категорий"
-#: apps/courses/templates/courses/cms/course_detail.html:58
-#: apps/courses/templates/courses/cms/organization_detail.html:87
-#: apps/courses/templates/courses/cms/person_detail.html:47
-msgid "No associated categories"
-msgstr "Нет связанных категорий"
+#: apps/courses/templates/courses/cms/course_detail.html:6
+#, python-format
+msgid "%(course_title)s - Course"
+msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:72
+#: apps/courses/templates/courses/cms/course_detail.html:59
msgid "Ref. "
msgstr "Ссылка. "
-#: apps/courses/templates/courses/cms/course_detail.html:88
+#: apps/courses/templates/courses/cms/course_detail.html:73
+#: apps/courses/templates/courses/cms/organization_detail.html:91
+#: apps/courses/templates/courses/cms/person_detail.html:47
+msgid "No associated categories"
+msgstr "Нет связанных категорий"
+
+#: apps/courses/templates/courses/cms/course_detail.html:94
msgid "Duration:"
msgstr "Длительность:"
-#: apps/courses/templates/courses/cms/course_detail.html:97
+#: apps/courses/templates/courses/cms/course_detail.html:103
msgid "Effort:"
msgstr "Усилие:"
-#: apps/courses/templates/courses/cms/course_detail.html:106
+#: apps/courses/templates/courses/cms/course_detail.html:112
msgid "Pace:"
msgstr "Темп:"
-#: apps/courses/templates/courses/cms/course_detail.html:116
+#: apps/courses/templates/courses/cms/course_detail.html:122
msgid "Enter here a introduction of your course."
msgstr "Введите введение к вашему курсу."
-#: apps/courses/templates/courses/cms/course_detail.html:124
+#: apps/courses/templates/courses/cms/course_detail.html:130
#, python-format
msgid "\n"
" %(count)s already enrolled!\n"
@@ -1240,16 +1286,28 @@ msgstr "\n"
" %(count)s уже зачислены!\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:136
+#: apps/courses/templates/courses/cms/course_detail.html:142
msgid "Add a teaser video or add a cover image below and it will be used as teaser image as well."
msgstr "Добавьте видео тизер или добавьте обложку ниже и оно также будет использоваться в качестве тизерного изображения."
-#: apps/courses/templates/courses/cms/course_detail.html:148
-#: apps/courses/templates/courses/cms/course_detail.html:226
+#: apps/courses/templates/courses/cms/course_detail.html:154
+#: apps/courses/templates/courses/cms/course_detail.html:255
msgid "course cover image"
msgstr "обложка курса"
-#: apps/courses/templates/courses/cms/course_detail.html:198
+#: apps/courses/templates/courses/cms/course_detail.html:182
+msgid "No open course runs"
+msgstr "Нет запущенных курсов"
+
+#: apps/courses/templates/courses/cms/course_detail.html:192
+msgid "course runs are currently open for this course"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:196
+msgid "Choose now"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:227
#, python-format
msgid "\n"
" Archived on %(creation_date)s\n"
@@ -1258,98 +1316,107 @@ msgstr "\n"
" Архивировано %(creation_date)s\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:202
+#: apps/courses/templates/courses/cms/course_detail.html:231
msgid "Go to current version"
msgstr "Перейти к текущей версии"
-#: apps/courses/templates/courses/cms/course_detail.html:213
+#: apps/courses/templates/courses/cms/course_detail.html:242
msgid "Glimpse cover"
msgstr "Glimpse обложка"
-#: apps/courses/templates/courses/cms/course_detail.html:215
+#: apps/courses/templates/courses/cms/course_detail.html:244
msgid "Add an image for course cover on its glimpse."
msgstr "Добавить изображение для обложки курса на его glimpse."
-#: apps/courses/templates/courses/cms/course_detail.html:239
+#: apps/courses/templates/courses/cms/course_detail.html:268
msgctxt "course_detail__title"
msgid "What you will learn"
msgstr "Чему вы научитесь"
-#: apps/courses/templates/courses/cms/course_detail.html:240
+#: apps/courses/templates/courses/cms/course_detail.html:269
msgid "At the end of this course, you will be able to:"
msgstr "По окончании этого курса вы сможете:"
-#: apps/courses/templates/courses/cms/course_detail.html:249
+#: apps/courses/templates/courses/cms/course_detail.html:278
msgctxt "course_detail__title"
msgid "Description"
msgstr "Описание"
-#: apps/courses/templates/courses/cms/course_detail.html:260
+#: apps/courses/templates/courses/cms/course_detail.html:289
msgctxt "course_detail__title"
msgid "Format"
msgstr "Формат"
-#: apps/courses/templates/courses/cms/course_detail.html:262
+#: apps/courses/templates/courses/cms/course_detail.html:291
msgid "How is the course structured?"
msgstr "Как структурирован курс?"
-#: apps/courses/templates/courses/cms/course_detail.html:271
+#: apps/courses/templates/courses/cms/course_detail.html:300
msgctxt "course_detail__title"
msgid "Prerequisites"
msgstr "Предварительные условия"
-#: apps/courses/templates/courses/cms/course_detail.html:274
+#: apps/courses/templates/courses/cms/course_detail.html:303
msgid "What are the prerequisites to follow this course?"
msgstr "Каковы предварительные условия для прохождения этого курса?"
-#: apps/courses/templates/courses/cms/course_detail.html:284
+#: apps/courses/templates/courses/cms/course_detail.html:313
msgctxt "course_detail__title"
msgid "Assessment and certification"
msgstr "Оценка и сертификация"
-#: apps/courses/templates/courses/cms/course_detail.html:287
+#: apps/courses/templates/courses/cms/course_detail.html:316
msgid "How is progress evaluated and/or certified?"
msgstr "Как оценивается и/или сертифицируется прогресс?"
-#: apps/courses/templates/courses/cms/course_detail.html:299
+#: apps/courses/templates/courses/cms/course_detail.html:328
msgctxt "course_detail__title"
msgid "Course plan"
msgstr "План курса"
-#: apps/courses/templates/courses/cms/course_detail.html:302
+#: apps/courses/templates/courses/cms/course_detail.html:331
msgid "Enter here the detailed course plan."
msgstr "Введите подробный план курса."
-#: apps/courses/templates/courses/cms/course_detail.html:317
+#: apps/courses/templates/courses/cms/course_detail.html:349
+msgctxt "course_detail__title"
+msgid "Other course runs"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:351
msgctxt "course_detail__title"
msgid "Course runs"
msgstr "Запуски курса"
-#: apps/courses/templates/courses/cms/course_detail.html:323
-msgid "No open course runs"
-msgstr "Нет запущенных курсов"
+#: apps/courses/templates/courses/cms/course_detail.html:361
+msgid "No course runs"
+msgstr ""
-#: apps/courses/templates/courses/cms/course_detail.html:332
+#: apps/courses/templates/courses/cms/course_detail.html:363
+msgid "No other course runs"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/course_detail.html:387
msgctxt "Course runs to be scheduled (plural)"
msgid "To be scheduled"
msgstr "Будет запланировано"
-#: apps/courses/templates/courses/cms/course_detail.html:343
+#: apps/courses/templates/courses/cms/course_detail.html:400
msgctxt "Upcoming course runs (plural)"
msgid "Upcoming"
msgstr "Предстоящие"
-#: apps/courses/templates/courses/cms/course_detail.html:354
+#: apps/courses/templates/courses/cms/course_detail.html:413
msgctxt "Ongoing course runs (plural)"
msgid "Ongoing"
msgstr "Текущий"
-#: apps/courses/templates/courses/cms/course_detail.html:365
+#: apps/courses/templates/courses/cms/course_detail.html:426
msgctxt "Archived course runs (plural)"
msgid "Archived"
msgstr "В архиве"
-#: apps/courses/templates/courses/cms/course_detail.html:389
+#: apps/courses/templates/courses/cms/course_detail.html:451
msgid "\n"
" This course is part of a program\n"
" "
@@ -1369,41 +1436,51 @@ msgstr[3] "\n"
" Этот курс является частью программ\n"
" "
-#: apps/courses/templates/courses/cms/course_detail.html:415
+#: apps/courses/templates/courses/cms/course_detail.html:477
msgctxt "course_detail__title"
msgid "Course team"
msgstr "Команда курса"
-#: apps/courses/templates/courses/cms/course_detail.html:420
+#: apps/courses/templates/courses/cms/course_detail.html:482
#: apps/courses/templates/courses/cms/fragment_course_relations.html:13
msgid "Who are the teachers in the course team?"
msgstr "Кто является преподавателями в команде курсов?"
-#: apps/courses/templates/courses/cms/course_detail.html:434
+#: apps/courses/templates/courses/cms/course_detail.html:496
msgctxt "course_detail__title"
msgid "Organizations"
msgstr "Организации"
-#: apps/courses/templates/courses/cms/course_detail.html:439
+#: apps/courses/templates/courses/cms/course_detail.html:501
#: apps/courses/templates/courses/cms/fragment_course_relations.html:32
msgid "What are the organizations publishing this course?"
msgstr "Какие организации публикуют этот курс?"
-#: apps/courses/templates/courses/cms/course_detail.html:460
+#: apps/courses/templates/courses/cms/course_detail.html:522
msgctxt "course_detail__title"
msgid "License"
msgstr "Лицензия"
-#: apps/courses/templates/courses/cms/course_detail.html:467
+#: apps/courses/templates/courses/cms/course_detail.html:529
#: apps/courses/templates/courses/cms/fragment_course_relations.html:50
msgid "What is the license for the course content?"
msgstr "Какова лицензия на содержимое курса?"
-#: apps/courses/templates/courses/cms/course_detail.html:478
+#: apps/courses/templates/courses/cms/course_detail.html:540
#: apps/courses/templates/courses/cms/fragment_course_relations.html:59
msgid "What is the license for the content created by course participants?"
msgstr "Какова лицензия на контент, созданный участниками курса?"
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:63
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:64
+msgid "Course code"
+msgstr ""
+
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:83
+#: apps/courses/templates/courses/cms/fragment_course_glimpse.html:84
+msgid "Course date"
+msgstr ""
+
#: apps/courses/templates/courses/cms/fragment_course_relations.html:8
msgid "Course team"
msgstr "Команда курса"
@@ -1466,28 +1543,26 @@ msgstr "\n"
" Если вам нужна страница %(model)s, вы должны создать его через мастер и выбрать \"Новая %(model)s страница\".\n"
" "
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:16
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:39
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:8
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:9
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:17
+#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:40
msgid "Main organization"
msgstr "Основная организация"
-#: apps/courses/templates/courses/cms/fragment_organization_main_logo.html:29
-msgid "main organization logo"
-msgstr "лого основной организации"
-
-#: apps/courses/templates/courses/cms/organization_detail.html:50
+#: apps/courses/templates/courses/cms/organization_detail.html:54
msgid "organization banner"
msgstr "баннер организации"
-#: apps/courses/templates/courses/cms/organization_detail.html:71
+#: apps/courses/templates/courses/cms/organization_detail.html:75
msgid "organization logo"
msgstr "лого организации"
-#: apps/courses/templates/courses/cms/organization_detail.html:111
+#: apps/courses/templates/courses/cms/organization_detail.html:125
msgid "Related courses pagination"
-msgstr ""
+msgstr "Пагинация связанных курсов"
-#: apps/courses/templates/courses/cms/organization_detail.html:114
+#: apps/courses/templates/courses/cms/organization_detail.html:128
#, python-format
msgid "\n"
" See all courses related to %(organization_title)s\n"
@@ -1528,7 +1603,7 @@ msgstr "Записи в блогах"
#: apps/courses/templates/courses/cms/person_detail.html:160
msgid "Blogposts pagination"
-msgstr ""
+msgstr "Пагинация блогов"
#: apps/courses/templates/courses/cms/person_list.html:26
msgid "No persons"
@@ -1544,7 +1619,7 @@ msgstr "Нет связанных программ"
#. Translators: delay indicates when the course will start as a duration.
#. In english the string will be "The course will start in 3 days"
-#: apps/courses/templatetags/extra_tags.py:262
+#: apps/courses/templatetags/extra_tags.py:278
msgid "The course will start {delay:s}"
msgstr "Курс начнется {delay:s}"
diff --git a/tests_e2e/package.json b/tests_e2e/package.json
index 48fd4adfd9..99741b4dee 100644
--- a/tests_e2e/package.json
+++ b/tests_e2e/package.json
@@ -1,6 +1,6 @@
{
"name": "richie-tests-e2e",
- "version": "2.13.0",
+ "version": "2.14.0",
"description": "End-to-end tests for the Richie project",
"repository": "https://github.com/openfun/richie",
"author": "Open FUN (France Université Numérique)",
diff --git a/website/package.json b/website/package.json
index 3484cb75f2..e996fbad7c 100644
--- a/website/package.json
+++ b/website/package.json
@@ -1,6 +1,6 @@
{
"name": "richie-education-docs",
- "version": "2.13.0",
+ "version": "2.14.0",
"description": "Documentation website for the Richie project",
"scripts": {
"build": "docusaurus-build",
diff --git a/website/versioned_docs/version-2.14.0/web-analytics.md b/website/versioned_docs/version-2.14.0/web-analytics.md
new file mode 100644
index 0000000000..24e383978e
--- /dev/null
+++ b/website/versioned_docs/version-2.14.0/web-analytics.md
@@ -0,0 +1,96 @@
+---
+id: version-2.14.0-web-analytics
+title: Add web analytics to your site
+sidebar_label: Web Analytics
+original_id: web-analytics
+---
+
+Richie has native support to [Google Analytics](#google-analytics) and [Google Tag Manager](#google-tag-manager) Web Analytics solutions.
+The purpose of this file is to explain how you can enable one of the supported Web Analytics providers
+and how you can extend Richie with an alternative solution.
+
+## Google Analytics
+Next, it is described how you can configure the **Google Analytics** on your Richie site.
+
+- Add the `WEB_ANALYTICS_ID` setting, with your Google Analytics tracking id code.
+
+The current Google Analytics implementation also includes custom dimensions. Those dimensions permit you to create further analyses on Google Analytics or even use them to create custom reports.
+Custom dimensions with a value as example:
+* Organizations codes - `UNIV_LISBON | UNIV_PORTO`
+* Course code - `COURSE_XPTO`
+* Course runs titles - `Summer edition | Winter edition`
+* Course runs resource links - `http://example.edx:8073/courses/course-v1:edX+DemoX+Demo_Course/info`
+* Page title - `Introduction to Programming`
+
+## Google Tag Manager
+Next, it is described how you can configure the **Google Tag Manager** on your Richie site.
+
+- Add the `WEB_ANALYTICS_ID` setting, with your Google Tag Manager tracking id code.
+- Add the `WEB_ANALYTICS_PROVIDER` setting with the `google_tag_manager` value.
+
+The current Google Tag Manager implementation also defines a custom dimensions like the [Google Analytics](#google-analytics).
+
+## Location of the web analytics javascript
+Use the `WEB_ANALYTICS_LOCATION` settings to decide where do you want to put the Javascript code. Use `head` (**default** value), to put the Javascript on HTML header, or `footer`, to put the Javascript code to the bottom of the body.
+
+## Add a new Web Analytics solution
+
+In this section it's described how you can add support to a different Web Analytics solution.
+
+* override the `richie/web_analytics.html` template
+* define the `WEB_ANALYTICS_ID` setting with your tracking identification
+* define the `WEB_ANALYTICS_PROVIDER` setting with a value that represents your solution, eg. `my-custom-web-analytics-software`
+* optionally change `WEB_ANALYTICS_LOCATION` setting with `head` (default) or `footer` value
+
+- Example of a `richie/web_analytics.html` file customization that prints to the browser console log the dimension keys and values:
+```javascript
+
+```
+
+Output:
+```
+dimension: index '1' with key 'organizations_codes' with value 'COMPATIBLE-EVEN-KEELED-UTILIZATION-19 | FOCUSED-NEXT-GENERATION-FUNCTIONALITIES-22 | UNIVERSAL-MODULAR-LOCAL-AREA-NETWORK-23'
+dimension: index '2' with key 'course_code' with value '00017'
+dimension: index '3' with key 'course_runs_titles' with value 'Run 0'
+dimension: index '4' with key 'course_runs_resource_links' with value ''
+dimension: index '5' with key 'page_title' with value 'Business-focused zero-defect application'
+```
+
+But you can also contribute to Richie by creating a pull request to add support for a different web analytics solution. In this last case, you have to edit directly the `richie/web_analytics.html` template.
+
+Example of an override of the `richie/web_analytics.html` file:
+```html
+{% block web_analytics %}
+ {% if WEB_ANALYTICS_ID %}
+ {% if WEB_ANALYTICS_PROVIDER == "my_custom_web_analytics_software" %}
+
+ {% endif %}
+ {% endif %}
+{% endblock web_analytics %}
+```
+
+The web analytics dimensions are being added to the django context using the `WEB_ANALYTICS.DIMENSIONS` dictionary. Because each dimension value could have multiple values, then each dictionary value is a list. Web analytics dimensions dictionary keys:
+* `organizations_codes`
+* `course_code`
+* `course_runs_titles`
+* `course_runs_resource_links`
+* `page_title`
+
+Example, if you only need the organization codes on your custom `richie/web_analytics.html` file:
+```javascript
+
+```
+
+The frontend code also sends **events** to the web analytics provider.
+Richie sends events when the user is enrolled on a course run.
+To support different providers, you need to create a similar file
+of `src/frontend/js/utils/api/web-analytics/google_analytics.ts` and change the `src/frontend/js/utils/api/web-analytics/index.ts` file to include that newer provider.
diff --git a/website/versions.json b/website/versions.json
index 487f1691e7..53ffd61bc5 100644
--- a/website/versions.json
+++ b/website/versions.json
@@ -1,4 +1,5 @@
[
+ "2.14.0",
"2.13.0",
"2.12.0",
"2.11.0",