From 88cc197b1eedc0d2db7a204f089203858ba56005 Mon Sep 17 00:00:00 2001 From: jbpenrath Date: Fri, 1 Apr 2022 17:01:33 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=96(chore)=20bump=20release=20to=20ver?= =?UTF-8?q?sion=202.14.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added - Add a `CourseProductList` Component - Add a `SaleTunnel` component - Add an `AddressesManagement` component - Add a `PaymentButton` component - Add a `PaymentInterface` component to lazy load the right payment component according to the provider used - Create a `StepBreadcrumb` component to display progress within a step process - Create a `useStepManager` hook to manage step process - Create a React `Icon` component that can optionally take alternative text for screen reader users. - Add a heading for screen reader users on the search results page to have a more understandable navigation. - Add new page templates for various multiple columns and their own CSS to adjust every possible plugins to fit correctly; - Add theme variable to change checkmark color. - Add new placeholder 'excerpt' to Organization detail template - Add the website's name by default in every page title, that can be changed or disabled by overriding the new `site_title` and `site_title_separator` blocks - Add alternative text on course glimpse icons for screen reader users - On search page, warn screen reader users when the search results change - On search page, the "clear filters" button now have details on current filters for screen reader users - Add a `__stretched-link` element to the card css block to help make screen reader-friendly card links Changed - Remove the use of Google Fonts - Improve overall accessibility in Richie templates - Move enroll button for the first open course run below the contact block. If there are more than one open run, they're all still shown on course detail aside block. - Update frontend overriding system to allow to override any frontend module. - Improve React search suggestion field labels for screen readers. - Removed usage of deprecated Sass division '/' operator in favor of 'math.div'. - Organization plugin variant 'row' now use excerpt if not empty else the description with every markup removed - Set font size to 1rem on some detail pages contents: Organization excerpt, Program body and Person main content - Use anchors instead of buttons in search pagination to let users open pages in new tabs if they want - Improve the `offscreen` class implementation to prevent potential visual issues for sighted user keyboards - Change how course glimpse anchor is structured (allows text selection in the course glimpse + better screen reader user experience) - Add context for screen reader users on search filters "more options" buttons - On course page, make the organization image link clearer for screen reader users with a better alternative text - Change how program glimpses HTML is structured to be clearer when using a screen reader - Specify that we are on a course page in the course detail page title - Remove contact block on course detail page Fixed - Clear session cache on login and register - Make useCourseSearch hook locale sensitive - Stop using {% blockplugin %} template tags in
and replace them by simple {% if %} tags that do the same and don't inject frontend editing markup - Fix `get_placeholder_plugins` when placed in
by refactoring and introducing new `placeholder_as_plugins` template tag - Prevent context processor error when WEB_ANALYTICS_ID setting is not defined. - Fix autocomplete views tests that may failed because of result order. - Fix section tile title with richtext and special character escaping. - Change blogpost detail template to display author even in published mode except if its placeholder is empty. - Fix missing styles for Organization plugin 'row' variant link wrapper - Fix course glimpse layout when organization logo is too narrow - Fix course run deletion when translation title is empty - Reordered course glimpse text order in the DOM for better screen reader support. - On course page, make the course title the first thing that is read to screen readers (instead of the badges) - Fix program glimpse heading level being too high on course detail page - Hide title _To be scheduled_, _Upcoming_, _Ongoing_ and _Archived_ when all course runs have catalog visibility `hidden`. --- CHANGELOG.md | 5 +- UPGRADE.md | 49 ++ setup.cfg | 2 +- src/frontend/i18n/locales/ar-SA.json | 352 ++++++++++++ src/frontend/i18n/locales/es-ES.json | 352 ++++++++++++ src/frontend/i18n/locales/fa-IR.json | 542 ++++++++++++++++++ src/frontend/i18n/locales/fr-CA.json | 352 ++++++++++++ src/frontend/i18n/locales/fr-FR.json | 352 ++++++++++++ src/frontend/i18n/locales/pt-PT.json | 352 ++++++++++++ src/frontend/i18n/locales/ru-RU.json | 352 ++++++++++++ src/frontend/js/translations/ar-SA.json | 2 +- src/frontend/js/translations/es-ES.json | 2 +- src/frontend/js/translations/fa-IR.json | 1 + src/frontend/js/translations/fr-CA.json | 2 +- src/frontend/js/translations/fr-FR.json | 2 +- src/frontend/js/translations/pt-PT.json | 2 +- src/frontend/js/translations/ru-RU.json | 2 +- src/frontend/package.json | 2 +- src/richie/locale/ar_SA/LC_MESSAGES/django.mo | Bin 562 -> 562 bytes src/richie/locale/ar_SA/LC_MESSAGES/django.po | 385 ++++++++----- src/richie/locale/es_ES/LC_MESSAGES/django.mo | Bin 33573 -> 33898 bytes src/richie/locale/es_ES/LC_MESSAGES/django.po | 391 ++++++++----- src/richie/locale/fr_CA/LC_MESSAGES/django.mo | Bin 33410 -> 33738 bytes src/richie/locale/fr_CA/LC_MESSAGES/django.po | 391 ++++++++----- src/richie/locale/fr_FR/LC_MESSAGES/django.mo | Bin 33490 -> 34377 bytes src/richie/locale/fr_FR/LC_MESSAGES/django.po | 391 ++++++++----- src/richie/locale/pt_PT/LC_MESSAGES/django.mo | Bin 33123 -> 34042 bytes src/richie/locale/pt_PT/LC_MESSAGES/django.po | 391 ++++++++----- src/richie/locale/ru_RU/LC_MESSAGES/django.mo | Bin 41470 -> 42434 bytes src/richie/locale/ru_RU/LC_MESSAGES/django.po | 403 +++++++------ tests_e2e/package.json | 2 +- website/package.json | 2 +- .../version-2.14.0/web-analytics.md | 96 ++++ website/versions.json | 1 + 34 files changed, 4216 insertions(+), 962 deletions(-) create mode 100644 src/frontend/i18n/locales/fa-IR.json create mode 100644 src/frontend/js/translations/fa-IR.json create mode 100644 website/versioned_docs/version-2.14.0/web-analytics.md 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 73052c2b087d46648a651240d9bedfdac7ade5fd..163c84a87ee23dd34c81534ed6ac2dcffca091ee 100644 GIT binary patch delta 21 ccmdnQvWaCvGna|3fr)~Fxs|E$#@?lj07jt(TmS$7 delta 21 ccmdnQvWaCvGnbLBp@o8hrIm^0#@?lj07m5oW&i*H 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 fb1afb80e4a416ddbb8d3072db973b3fce3f5a73..baab7f33dc079227ea1c045786248330eecc9fbf 100644 GIT binary patch delta 9804 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 YGfz$LnKS>HU-^Y8VLs(SC4L_N1_lk16951J delta 9527 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 delta 9505 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 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 bebf9070df3fb4c6b28fa227cf84f0fdbcb33091..98138eefbc7f178b0cb552a34f118f6354ffa4f0 100644 GIT binary patch delta 10363 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 QqIg%#jdyrI@!WL$FTP+#-T(jq delta 9535 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 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",