From d0b9946d847714ec9c31f3f2e279f06f97339a12 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Wed, 10 Sep 2025 16:08:53 +0000 Subject: [PATCH 1/2] feat: add Open Graph sharing metadata to program certs Adding Open Graph sharing metadata deprogram certificates so they look good on social media. FIXES: APER-3403 --- credentials/apps/credentials/views.py | 5 +++++ credentials/templates/base.html | 3 +++ credentials/templates/credentials/base.html | 9 +++++++++ 3 files changed, 17 insertions(+) diff --git a/credentials/apps/credentials/views.py b/credentials/apps/credentials/views.py index 8a1505c25..fbb32661f 100644 --- a/credentials/apps/credentials/views.py +++ b/credentials/apps/credentials/views.py @@ -188,6 +188,11 @@ def get_context_data(self, **kwargs): "program_name": program_details.title, "credential_title": program_details.credential_title, "org_name_string": org_name_string, + "share_url": self.request.build_absolute_uri(), + "share_image_url": program_details.organizations[0].certificate_logo_image_url, + "share_text": _("I completed a course at {platform_name}.").format( + platform_name=self.site_configuration.platform_name + ), } ) if program_details.hours_of_effort: diff --git a/credentials/templates/base.html b/credentials/templates/base.html index 8d758ae18..05845b839 100644 --- a/credentials/templates/base.html +++ b/credentials/templates/base.html @@ -30,6 +30,9 @@ {% block theme_meta %} {% endblock %} + {% block open_graph %} + {% endblock %} + {% block stylesheets %} {% endblock %} diff --git a/credentials/templates/credentials/base.html b/credentials/templates/credentials/base.html index df7cf7f7e..71c05be6d 100644 --- a/credentials/templates/credentials/base.html +++ b/credentials/templates/credentials/base.html @@ -6,6 +6,15 @@ {{ page_title }} | {% firstof site.name platform_name %} {% endblock %} +{% block open_graph %} + + + + + + +{% endblock %} + {% block content %}
From a6a9297ecd37eb094c6b4006673100986ea9dca5 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Wed, 10 Sep 2025 19:35:22 +0000 Subject: [PATCH 2/2] feat: dummy translations and tests * adding more tests for the functionality * fixing a couple of tests because of the new metadata * updating the dummy translations --- .../apps/credentials/tests/test_views.py | 17 +- .../conf/locale/en/LC_MESSAGES/django.mo | Bin 0 -> 420 bytes .../conf/locale/en/LC_MESSAGES/django.po | 974 ++++++++++++++++++ .../conf/locale/en/LC_MESSAGES/djangojs.mo | Bin 0 -> 420 bytes .../conf/locale/en/LC_MESSAGES/djangojs.po | 22 + .../conf/locale/eo/LC_MESSAGES/django.mo | Bin 42157 -> 42333 bytes .../conf/locale/eo/LC_MESSAGES/django.po | 7 + .../conf/locale/rtl/LC_MESSAGES/django.mo | Bin 27962 -> 28074 bytes .../conf/locale/rtl/LC_MESSAGES/django.po | 5 + 9 files changed, 1023 insertions(+), 2 deletions(-) create mode 100644 credentials/conf/locale/en/LC_MESSAGES/django.mo create mode 100644 credentials/conf/locale/en/LC_MESSAGES/django.po create mode 100644 credentials/conf/locale/en/LC_MESSAGES/djangojs.mo create mode 100644 credentials/conf/locale/en/LC_MESSAGES/djangojs.po diff --git a/credentials/apps/credentials/tests/test_views.py b/credentials/apps/credentials/tests/test_views.py index 2c73e1104..a1e735af2 100644 --- a/credentials/apps/credentials/tests/test_views.py +++ b/credentials/apps/credentials/tests/test_views.py @@ -150,6 +150,19 @@ def test_sharing_bar_with_staff_user(self): self.assertContains(response, "Print or share your certificate") + @responses.activate + def test_open_graph_metadata(self): + """Verify that the anonymous view contains OpenGraph metadata.""" + self.client.logout() + response = self._render_user_credential() + + self.assertContains(response, "og:url") + self.assertContains(response, "og:title") + self.assertContains(response, "og:description") + self.assertContains(response, '"og:type" content="image/png"') + self.assertContains(response, self.user_credential.get_absolute_url()) + self.assertContains(response, "I completed a course at ") + @responses.activate def test_awarded_with_logged_in_user(self): """Verify that the view renders awarded certificates with sharing bar.""" @@ -160,7 +173,7 @@ def test_awarded_with_logged_in_user(self): self.assertContains(response, "Print or share your certificate") self.assertContains(response, "Print this certificate") - self.assertContains(response=response, text=self.PROGRAM_NAME, count=2) + self.assertContains(response=response, text=self.PROGRAM_NAME, count=3) self.assertNotContains(response=response, text=self.CREDENTIAL_TITLE) self.assertEqual(response_context_data["user_credential"], self.user_credential) @@ -226,7 +239,7 @@ def test_awarded_with_custom_title(self): self.assertContains(response, "Print or share your certificate") self.assertNotContains(response=response, text=self.PROGRAM_NAME) - self.assertContains(response=response, text=self.CREDENTIAL_TITLE, count=2) + self.assertContains(response=response, text=self.CREDENTIAL_TITLE, count=3) def test_revoked(self): """Verify that the view returns 404 when the uuid is valid but certificate status diff --git a/credentials/conf/locale/en/LC_MESSAGES/django.mo b/credentials/conf/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..d695284d174e273d4336e6e3aca2f6a10e3a591b GIT binary patch literal 420 zcma)%%}N6?6oo6g%F?xq2rd-8HPeE$sUxDcP_S6a=swO|M96-V$ZN?r&Njv(WN21@PLr4asc^MP(h{ARO=sin_mZv>x8x!^ zp8j5Qy@>00URS1cBbmP%A26nm*#rh#U)%BpJ&avWMd_@TgXc1edDVDR!G!!OXzA+j UV@P`=`Lj)rojgosaxxN~FJbq7u>b%7 literal 0 HcmV?d00001 diff --git a/credentials/conf/locale/en/LC_MESSAGES/django.po b/credentials/conf/locale/en/LC_MESSAGES/django.po new file mode 100644 index 000000000..e54b902b8 --- /dev/null +++ b/credentials/conf/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,974 @@ +# edX translation file. +# Copyright (C) 2025 EdX +# This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. +# EdX Team , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.1a\n" +"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" +"POT-Creation-Date: 2023-06-13 08:00+0000\n" +"PO-Revision-Date: 2023-06-13 09:00+0000\n" +"Last-Translator: \n" +"Language-Team: openedx-translation \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: apps/badges/admin.py +msgid "No rules specified." +msgstr "" + +#: apps/badges/admin.py +msgid "Badge templates were successfully updated." +msgstr "" + +#: apps/badges/admin.py +msgid "API key" +msgstr "" + +#: apps/badges/admin.py +msgid "Pre-configured from the environment." +msgstr "" + +#: apps/badges/admin.py +msgid "" +"\n" +" WARNING: avoid configuration updates on activated badges.\n" +" Active badge templates are continuously processed and learners may already have progress on them.\n" +" Any changes in badge template requirements (including data rules) will affect learners' experience!\n" +" " +msgstr "" + +#: apps/badges/admin.py +msgid "Active badge template cannot be deleted." +msgstr "" + +#: apps/badges/admin.py +msgid "Active badge templates cannot be deleted." +msgstr "" + +#: apps/badges/admin.py +msgid "icon" +msgstr "" + +#: apps/badges/admin.py +msgid "Active badge template must have at least one requirement." +msgstr "" + +#: apps/badges/admin.py +msgid "badge template" +msgstr "" + +#: apps/badges/admin.py +msgid "Failed to sync groups for API config: {}. {}" +msgstr "" + +#: apps/badges/admin.py +msgid "Accredible groups were successfully updated." +msgstr "" + +#: apps/badges/admin_forms.py +msgid "You can't provide an API key for a configured organization." +msgstr "" + +#: apps/badges/admin_forms.py +msgid "All requirements must belong to the same template." +msgstr "" + +#: apps/badges/admin_forms.py +msgid "Value must be a boolean." +msgstr "" + +#: apps/badges/issuers.py +msgid "Open edX internal user credential was revoked" +msgstr "" + +#: apps/badges/models.py +msgid "Put your Credly Organization ID here." +msgstr "" + +#: apps/badges/models.py +msgid "Credly API shared secret for Credly Organization." +msgstr "" + +#: apps/badges/models.py +msgid "Verbose name for Credly Organization." +msgstr "" + +#: apps/badges/models.py +msgid "Unique badge template ID." +msgstr "" + +#: apps/badges/models.py +msgid "Badge template name." +msgstr "" + +#: apps/badges/models.py +msgid "Badge template description." +msgstr "" + +#: apps/badges/models.py +msgid "Badge template type." +msgstr "" + +#: apps/badges/models.py +msgid "Synchronized state (auto-managed)." +msgstr "" + +#: apps/badges/models.py +msgid "Credly Organization - template owner." +msgstr "" + +#: apps/badges/models.py +msgid "Badge template this requirement serves for." +msgstr "" + +#: apps/badges/models.py +msgid "" +"Public signal type. Available events are configured in \"BADGES_CONFIG\" " +"setting. The crucial aspect for event to carry UserData in its payload." +msgstr "" + +#: apps/badges/models.py +msgid "Provide more details if needed." +msgstr "" + +#: apps/badges/models.py +msgid "" +"Optional. Group requirements together using the same Group ID for " +"interchangeable (OR processing logic)." +msgstr "" + +#: apps/badges/models.py +msgid "group" +msgstr "" + +#: apps/badges/models.py +msgid "" +"Public signal's data payload nested property path, e.g: " +"\"user.pii.username\"." +msgstr "" + +#: apps/badges/models.py +msgid "key path" +msgstr "" + +#: apps/badges/models.py +msgid "" +"Expected value comparison operator. " +"https://docs.python.org/3/library/operator.html" +msgstr "" + +#: apps/badges/models.py +msgid "Expected value for the nested property, e.g: \"cucumber1997\"." +msgstr "" + +#: apps/badges/models.py +msgid "expected value" +msgstr "" + +#: apps/badges/models.py +msgid "Parent requirement for this data rule." +msgstr "" + +#: apps/badges/models.py +msgid "Badge template this penalty serves for." +msgstr "" + +#: apps/badges/models.py +msgid "" +"Public signal type. Use namespaced types, e.g: " +"\"org.openedx.learning.student.registration.completed.v1\"" +msgstr "" + +#: apps/badges/models.py +msgid "Badge requirements for which this penalty is defined." +msgstr "" + +#: apps/badges/models.py +msgid "Badge penalties" +msgstr "" + +#: apps/badges/models.py +msgid "Parent penalty for this data rule." +msgstr "" + +#: apps/badges/models.py +msgid "badge progress records" +msgstr "" + +#: apps/badges/models.py +msgid "Group ID for the requirement." +msgstr "" + +#: apps/badges/models.py +msgid "Credly badge issuing state" +msgstr "" + +#: apps/badges/models.py +msgid "Credly service badge identifier" +msgstr "" + +#: apps/badges/models.py +msgid "Accredible API configuration name." +msgstr "" + +#: apps/badges/models.py +msgid "Accredible API key." +msgstr "" + +#: apps/badges/models.py +msgid "Accredible API configuration." +msgstr "" + +#: apps/badges/models.py +msgid "Accredible badge issuing state" +msgstr "" + +#: apps/badges/models.py +msgid "Accredible service badge identifier" +msgstr "" + +#: apps/core/admin.py +msgid "Activate selected entries" +msgstr "" + +#: apps/core/admin.py +#, python-brace-format +msgid "1 {model_name} entry was successfully activated." +msgstr "" + +#: apps/core/admin.py +#, python-brace-format +msgid "{count} {model_name} entries were successfully activated." +msgstr "" + +#: apps/core/admin.py +msgid "Deactivate selected entries" +msgstr "" + +#: apps/core/admin.py +#, python-brace-format +msgid "1 {model_name} entry was successfully deactivated." +msgstr "" + +#: apps/core/admin.py +#, python-brace-format +msgid "{count} {model_name} entries were successfully deactivated." +msgstr "" + +#: apps/core/admin.py +msgid "Add is_staff to selected entries" +msgstr "" + +#: apps/core/admin.py +#, python-brace-format +msgid "1 {model_name} entry was successfully changed." +msgstr "" + +#: apps/core/admin.py +#, python-brace-format +msgid "{count} {model_name} entries were successfully changed." +msgstr "" + +#: apps/core/admin.py +msgid "Remove is_staff from selected entries" +msgstr "" + +#: apps/core/admin.py +msgid "Add is_superuser to selected entries" +msgstr "" + +#: apps/core/admin.py +msgid "Remove is_superuser from selected entries" +msgstr "" + +#: apps/core/admin.py +msgid "Personal info" +msgstr "" + +#: apps/core/admin.py +msgid "Permissions" +msgstr "" + +#: apps/core/admin.py +msgid "Important dates" +msgstr "" + +#: apps/core/admin.py +msgid "URLs" +msgstr "" + +#: apps/core/admin.py +msgid "Social Sharing" +msgstr "" + +#: apps/core/forms.py +msgid "A Facebook app ID is required to enable Facebook sharing." +msgstr "" + +#: apps/core/models.py +msgid "Platform Name" +msgstr "" + +#: apps/core/models.py +msgid "Name of your Open edX platform" +msgstr "" + +#: apps/core/models.py +msgid "Segment Key" +msgstr "" + +#: apps/core/models.py +msgid "Segment write/API key." +msgstr "" + +#: apps/core/models.py +msgid "Theme Name" +msgstr "" + +#: apps/core/models.py +msgid "" +"Name of of the theme to use for this site. This value should be lower-cased." +msgstr "" + +#: apps/core/models.py +msgid "LMS base url for custom site" +msgstr "" + +#: apps/core/models.py +msgid "Root URL of this site's LMS (e.g. https://courses.stage.edx.org)" +msgstr "" + +#: apps/core/models.py +msgid "Catalog API URL" +msgstr "" + +#: apps/core/models.py +msgid "Root URL of the Catalog API (e.g. https://api.edx.org/catalog/v1/)" +msgstr "" + +#: apps/core/models.py +msgid "Terms of Service URL" +msgstr "" + +#: apps/core/models.py +msgid "Privacy Policy URL" +msgstr "" + +#: apps/core/models.py +msgid "Homepage URL" +msgstr "" + +#: apps/core/models.py +msgid "Company Name" +msgstr "" + +#: apps/core/models.py +msgid "Verified Certificate URL" +msgstr "" + +#: apps/core/models.py +msgid "Certificate Help URL" +msgstr "" + +#: apps/core/models.py +msgid "URL of page for questions about certificates" +msgstr "" + +#: apps/core/models.py +msgid "Enable Learner Records" +msgstr "" + +#: apps/core/models.py +msgid "Enable the Records feature. The LMS has a similar setting." +msgstr "" + +#: apps/core/models.py +msgid "Learner Records Help URL" +msgstr "" + +#: apps/core/models.py +msgid "URL of page for questions about Learner Records" +msgstr "" + +#: apps/core/models.py +msgid "Facebook App ID" +msgstr "" + +#: apps/core/models.py +msgid "Facebook app ID used for sharing" +msgstr "" + +#: apps/core/models.py +msgid "Twitter Username" +msgstr "" + +#: apps/core/models.py +msgid "Twitter username included in tweeted credentials. Do NOT include @." +msgstr "" + +#: apps/core/models.py +msgid "Enable Facebook sharing" +msgstr "" + +#: apps/core/models.py +msgid "Enable sharing via Facebook" +msgstr "" + +#: apps/core/models.py +msgid "Enable LinkedIn sharing" +msgstr "" + +#: apps/core/models.py +msgid "Enable sharing via LinkedIn" +msgstr "" + +#: apps/core/models.py +msgid "Enable Twitter sharing" +msgstr "" + +#: apps/core/models.py +msgid "Enable sharing via Twitter" +msgstr "" + +#: apps/core/models.py +msgid "Full Name" +msgstr "" + +#: apps/credentials/forms.py +msgid "" +"All authoring organizations of the program MUST have a certificate image " +"defined!" +msgstr "" + +#: apps/credentials/models.py +msgid "The image file size must be less than 250KB." +msgstr "" + +#: apps/credentials/models.py +msgid "Invalid course key." +msgstr "" + +#: apps/credentials/models.py +msgid "" +"Signatory organization name if its different from issuing organization." +msgstr "" + +#: apps/credentials/models.py +msgid "Image must be square PNG files. The file size should be under 250KB." +msgstr "" + +#: apps/credentials/models.py +msgid "awarded" +msgstr "" + +#: apps/credentials/models.py +msgid "revoked" +msgstr "" + +#: apps/credentials/models.py +msgid "" +"The certificate available date and time that is set in Studio and copied to " +"Credentials. This should be edited in Studio." +msgstr "" + +#: apps/credentials/models.py +msgid "Program UUID" +msgstr "" + +#: apps/credentials/models.py +msgid "" +"Display the associated organization's name (e.g. ACME University) instead of" +" its short name (e.g. ACMEx)" +msgstr "" + +#: apps/credentials/models.py +msgid "Use organization name" +msgstr "" + +#: apps/credentials/views.py +#, python-brace-format +msgid "{first_org} and {second_org}" +msgstr "" + +#: apps/credentials/views.py +#, python-brace-format +msgid "{series_of_orgs}, and {last_org}" +msgstr "" + +#: apps/credentials/views.py +#, python-brace-format +msgid "" +"I completed a course at {platform_name}. Take a look at my certificate:" +msgstr "" + +#: apps/credentials/views.py +#, python-brace-format +msgid "I completed a course at {platform_name}." +msgstr "" + +#: apps/credentials_theme_openedx/templates/openedx/credentials/programs/professional-certificate/certificate.html +msgid "" +"successfully completed all courses and received passing grades for a " +"Professional Certificate in" +msgstr "" + +#: apps/credentials_theme_openedx/templates/openedx/credentials/programs/professional-certificate/certificate.html +msgid "Professional Certificate" +msgstr "" + +#: apps/edx_django_extensions/views.py +msgid "Cache cleared." +msgstr "" + +#: apps/edx_django_extensions/views.py +#, python-brace-format +msgid "{action} is not a valid action." +msgstr "" + +#: apps/records/api.py +msgid "N/A" +msgstr "" + +#: apps/records/models.py +msgid "sent" +msgstr "" + +#: apps/records/models.py +msgid "other" +msgstr "" + +#: apps/records/models.py +msgid "User credit pathways can only be connected to credit pathways." +msgstr "" + +#: apps/verifiable_credentials/admin.py +msgid "Issuer ID" +msgstr "" + +#: apps/verifiable_credentials/admin.py +msgid "At least one Issuer must be always enabled!" +msgstr "" + +#: apps/verifiable_credentials/composition/open_badges.py +msgid "Open Badges Specification v3.0" +msgstr "" + +#: apps/verifiable_credentials/composition/open_badges.py +msgid "Open Badges Specification v3.0.1" +msgstr "" + +#: apps/verifiable_credentials/composition/status_list.py +#: apps/verifiable_credentials/storages/status_list.py +msgid "Status List 2021" +msgstr "" + +#: apps/verifiable_credentials/composition/verifiable_credentials.py +msgid "Verifiable Credentials Data Model v1.1" +msgstr "" + +#: apps/verifiable_credentials/issuance/main.py +#, python-brace-format +msgid "Couldn't find such issuance line: [{issuance_uuid}]" +msgstr "" + +#: apps/verifiable_credentials/issuance/main.py +#, python-brace-format +msgid "Seems credential isn't active anymore: [{credential_id}]" +msgstr "" + +#: apps/verifiable_credentials/issuance/main.py +msgid "Provided data didn't validate" +msgstr "" + +#: apps/verifiable_credentials/issuance/main.py +msgid "Issued verifiable credential can't be verified!" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "Related Open edX learner credential" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "Completeness indicator" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "Issuer DID" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "Target storage identifier" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "Verifiable credential subject DID" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "Verifiable credential specification to use" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "Defines a position in the Status List sequence" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "Keeps track on a corresponding user credential's status" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "program certificate" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "course certificate" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +#, python-brace-format +msgid "program certificate for passing a program {program_title}" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +#, python-brace-format +msgid ", with total {hours_of_effort} Hours of effort required to complete it" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +#, python-brace-format +msgid "" +"{credential_type} is granted on program {program_title} completion offered " +"by {organizations}, in collaboration with {platform_name}. The " +"{program_title} program includes {course_count} course(s){effort_info}." +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +#, python-brace-format +msgid "" +"{credential_type} is granted on course {course_title} completion offered by " +"{organization}, in collaboration with {platform_name}" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +#, python-brace-format +msgid "" +"{recipient_fullname} successfully completed all courses and received passing" +" grades for a Professional Certificate in {program_title} a program offered " +"by {organizations}, in collaboration with {platform_name}." +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "recipient" +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +#, python-brace-format +msgid "" +"{recipient_fullname} successfully completed a course and received a passing " +"grade for a Course Certificate in {course_title} a course offered by " +"{organization}, in collaboration with {platform_name}. " +msgstr "" + +#: apps/verifiable_credentials/issuance/models.py +msgid "" +"Issuer secret key. See: https://w3c-ccg.github.io/did-method-" +"key/#ed25519-x25519" +msgstr "" + +#: apps/verifiable_credentials/issuance/status_list.py +#, python-brace-format +msgid "Status List generation failed: [{issuer_id}]" +msgstr "" + +#: apps/verifiable_credentials/issuance/utils.py +msgid "" +"There are no enabled Issuance Configurations for some reason! At least one " +"must be always active." +msgstr "" + +#: apps/verifiable_credentials/management/commands/create_default_issuer.py +#, python-brace-format +msgid "Verifiable Credentials feature is not enabled [{feature_name}]" +msgstr "" + +#: apps/verifiable_credentials/rest_api/v1/views.py +msgid "Mandatory data is missing" +msgstr "" + +#: apps/verifiable_credentials/rest_api/v1/views.py +msgid "Credential identifier must be valid UUID: ['credential_uuid']" +msgstr "" + +#: apps/verifiable_credentials/rest_api/v1/views.py +#, python-format +msgid "No such user credential [%(credential_uuid)s]" +msgstr "" + +#: apps/verifiable_credentials/rest_api/v1/views.py +#, python-brace-format +msgid "" +"Provided storage backend ({storage_id}) isn't active. " +"Storages: {active_storages}" +msgstr "" + +#: apps/verifiable_credentials/rest_api/v1/views.py +#, python-brace-format +msgid "Can't find an Issuer with such ID [{issuer_id}]" +msgstr "" + +#: apps/verifiable_credentials/storages/learner_credential_wallet.py +msgid "Learner Credential Wallet" +msgstr "" + +#: templates/404.html +msgid "Page Not Found" +msgstr "" + +#: templates/500.html +msgid "Server Error" +msgstr "" + +#: templates/_actions.html +msgid "Print or share your certificate" +msgstr "" + +#: templates/_actions.html +msgid "Share this certificate via Facebook" +msgstr "" + +#: templates/_actions.html +msgid "Tweet this certificate" +msgstr "" + +#: templates/_actions.html +msgid "Add to LinkedIn profile" +msgstr "" + +#: templates/_actions.html +msgid "Add this certificate to your LinkedIn profile" +msgstr "" + +#: templates/_actions.html +msgid "Print" +msgstr "" + +#: templates/_actions.html +msgid "Print this certificate" +msgstr "" + +#: templates/_footer.html +msgid "Legal Policies" +msgstr "" + +#: templates/_footer.html +msgid "Terms of Service & Honor Code" +msgstr "" + +#: templates/_footer.html +msgid "Privacy Policy" +msgstr "" + +#: templates/_footer.html +msgid "" +"All rights reserved except where noted. edX, Open edX and the edX and Open " +"edX logos are registered trademarks or trademarks of edX Inc." +msgstr "" + +#: templates/_footer.html +msgid "Powered by" +msgstr "" + +#: templates/base.html templates/credentials/base.html +msgid "Skip to main content" +msgstr "" + +#: templates/credentials/base.html +#, python-format +msgid "Congratulations, %(user_name)s!" +msgstr "" + +#: templates/credentials/base.html +#, python-format +msgid "" +"You worked hard to earn your certificate from %(platform_name)s — share it " +"with colleagues, friends, and family to get the word out about what you " +"mastered in %(program_display_name)s." +msgstr "" + +#: templates/credentials/edx_ace/common/base_body.html +#, python-format +msgid "Go to %(platform_name)s Home Page" +msgstr "" + +#: templates/credentials/edx_ace/common/base_body.html +msgid "All rights reserved" +msgstr "" + +#: templates/credentials/edx_ace/programcertificateissuedmessage/email/body.html +#: templates/credentials/edx_ace/programcertificateissuedmessage/email/body.txt +msgid "Hello" +msgstr "" + +#: templates/credentials/edx_ace/programcertificateissuedmessage/email/body.html +#: templates/credentials/edx_ace/programcertificateissuedmessage/email/body.txt +#, python-format +msgid "" +"Congratulations on completing the %(program_title)s %(program_type)s " +"Program!" +msgstr "" + +#: templates/credentials/edx_ace/programcertificateissuedmessage/email/body.html +#, python-format +msgid "Sincerely,
The %(platform_name)s Team" +msgstr "" + +#: templates/credentials/edx_ace/programcertificateissuedmessage/email/body.txt +msgid "Sincerely" +msgstr "" + +#: templates/credentials/edx_ace/programcertificateissuedmessage/email/body.txt +#: templates/records/edx_ace/programcreditrequest/email/body.html +#: templates/records/edx_ace/programcreditrequest/email/body.txt +#, python-format +msgid "The %(platform_name)s Team" +msgstr "" + +#: templates/credentials/edx_ace/programcertificateissuedmessage/email/subject.txt +#, python-format +msgid "" +"Congratulations for finishing your %(program_title)s %(program_type)s " +"Program!" +msgstr "" + +#: templates/credentials/programs/base.html +msgid "Supported by the following organizations" +msgstr "" + +#: templates/credentials/programs/base.html +msgid "logo" +msgstr "" + +#. Translators: This phrase is followed by a statement of the learner's +#. achievement. e.g. 'has completed the course' +#: templates/credentials/programs/base.html +#, python-brace-format +msgid "" +"{start_span}This is to certify that{end_span} {start_strong} {user_name} " +"{end_strong}" +msgstr "" + +#. Translators: organization_name is the display name for the provided +#. organization e.g (e.g., Test Organization). +#: templates/credentials/programs/base.html +#, python-format +msgid "" +"a program offered by %(org_name_string)s, in collaboration with " +"%(platform_name)s." +msgstr "" + +#: templates/credentials/programs/base.html +msgid "Noted by" +msgstr "" + +#. Translators: This phrase appears on certificates to show the issue date +#: templates/credentials/programs/base.html +#, python-brace-format +msgid "Issued {month} {year}" +msgstr "" + +#: templates/credentials/programs/base.html +msgid "Valid Certificate ID" +msgstr "" + +#: templates/credentials/programs/base.html +msgid "Effort" +msgstr "" + +#: templates/credentials/programs/base.html +#, python-format +msgid "%(num_hours)s hour" +msgid_plural "%(num_hours)s hours" +msgstr[0] "" +msgstr[1] "" + +#: templates/credentials/programs/base.html +#, python-brace-format +msgid "" +"For tips and tricks on printing your certificate, view the {start_anchor}Web" +" Certificates help documentation{end_anchor}." +msgstr "" + +#: templates/management.html +msgid "Management View" +msgstr "" + +#: templates/management.html +msgid "Clear cache" +msgstr "" + +#: templates/records/edx_ace/programcreditrequest/email/body.html +#: templates/records/edx_ace/programcreditrequest/email/body.txt +#, python-format +msgid "" +"%(user_full_name)s has sent an updated program record for %(program_name)s." +msgstr "" + +#: templates/records/edx_ace/programcreditrequest/email/body.html +#: templates/records/edx_ace/programcreditrequest/email/body.txt +#, python-format +msgid "" +"%(user_full_name)s has sent their completed program record for " +"%(program_name)s." +msgstr "" + +#: templates/records/edx_ace/programcreditrequest/email/body.html +#: templates/records/edx_ace/programcreditrequest/email/body.txt +#, python-format +msgid "" +"%(user_full_name)s has sent their partially completed program record for " +"%(program_name)s." +msgstr "" + +#: templates/records/edx_ace/programcreditrequest/email/body.html +#: templates/records/edx_ace/programcreditrequest/email/body.txt +#, python-format +msgid "" +"%(user_full_name)s would like to apply for credit in the %(pathway_name)s." +msgstr "" + +#: templates/records/edx_ace/programcreditrequest/email/body.html +#: templates/records/edx_ace/programcreditrequest/email/body.txt +#, python-format +msgid "" +"Please view or download %(user_full_name)s’s public program record to " +"determine their credit eligibility status." +msgstr "" + +#: templates/records/edx_ace/programcreditrequest/email/body.html +#: templates/records/edx_ace/programcreditrequest/email/body.txt +msgid "View Program Record" +msgstr "" + +#: templates/records/edx_ace/programcreditrequest/email/body.html +#: templates/records/edx_ace/programcreditrequest/email/body.txt +msgid "Download Record (CSV)" +msgstr "" + +#: templates/records/edx_ace/programcreditrequest/email/subject.txt +#, python-format +msgid "%(program_name)s Updated Credit Request for %(user_full_name)s" +msgstr "" + +#: templates/records/edx_ace/programcreditrequest/email/subject.txt +#, python-format +msgid "%(program_name)s Credit Request for %(user_full_name)s" +msgstr "" + +#: urls.py +msgid "Credentials Administration" +msgstr "" diff --git a/credentials/conf/locale/en/LC_MESSAGES/djangojs.mo b/credentials/conf/locale/en/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000000000000000000000000000000000000..d695284d174e273d4336e6e3aca2f6a10e3a591b GIT binary patch literal 420 zcma)%%}N6?6oo6g%F?xq2rd-8HPeE$sUxDcP_S6a=swO|M96-V$ZN?r&Njv(WN21@PLr4asc^MP(h{ARO=sin_mZv>x8x!^ zp8j5Qy@>00URS1cBbmP%A26nm*#rh#U)%BpJ&avWMd_@TgXc1edDVDR!G!!OXzA+j UV@P`=`Lj)rojgosaxxN~FJbq7u>b%7 literal 0 HcmV?d00001 diff --git a/credentials/conf/locale/en/LC_MESSAGES/djangojs.po b/credentials/conf/locale/en/LC_MESSAGES/djangojs.po new file mode 100644 index 000000000..b6338fef5 --- /dev/null +++ b/credentials/conf/locale/en/LC_MESSAGES/djangojs.po @@ -0,0 +1,22 @@ +# edX translation file. +# Copyright (C) 2025 EdX +# This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. +# EdX Team , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.1a\n" +"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" +"POT-Creation-Date: 2023-06-13 08:00+0000\n" +"PO-Revision-Date: 2023-06-13 09:00+0000\n" +"Last-Translator: \n" +"Language-Team: openedx-translation \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: static/components/Utils.jsx +msgid "{firstItems}, and {lastItem}" +msgstr "" diff --git a/credentials/conf/locale/eo/LC_MESSAGES/django.mo b/credentials/conf/locale/eo/LC_MESSAGES/django.mo index b8fdb03b708bb436478c78dca1bafdb6ee18a0fe..38f651d08c5ea49584d05ed3cd39859965b72b16 100644 GIT binary patch delta 4527 zcmZA32ar|O9S7h8EZ{~dqKFh_k*X9$iXy!&hF(NmP?{oy*bpoj+=bX^D!Rc22^{d#f6?;>dLR!i_K0-X$U8CB%kJZ9^+tM za&k(=e1hljD|TSx`YD~8Qdt^oqnjPKvL?6l48F|M_$i$$rBhNm9VfFLJFz(@vmtM1 z8$QZ7-&;JBRT`vJ#I|g~p={4tY~cE7wT)4BY^N5b!c(&g_TWPGk!;I9unw!cS{K%5 zV-BI4O4Hez^BBih_cMC%0E_s^>H0s$GMY6P?ODk6Y{t!W zuJk^u^IJyG{F5=(1w|4wVEt2Ux#`xy;5!Z^{l9K`z05@U54;ZaVP6om)qEm zZ_-cGQAQ6ovG!u9dNXdQgz@{E*eKTjQX4V()-z7ftZmkn!x?v8!f4C{BE3&0^ZKJ;3CGPdxE|AJmbRuV)S?|G`N(}L(3UsU6HSEXLa>ASr#qcXX7{?WYj;%AMgp| zf}gV+zh@ykd6372dNPh5$jKbcm^;5^9KV;bs;YY$MT2{C0q61{f9RJ1v z72o65PTBIfvvW#g)z@=o70ZWHtGeT^*=pHqCe8DGXIHzAo4KC-J$*LuFMN@YxO(g# z*CVA3{E7MB74;ejioAF!DFImdci?jX5I6FFR>Nwrv zi$h$-K9{7llLzUXX_>1w(MLxR4VjWs~p-t+=#(a(0KGGcM47O7@P}#BS<)c_XV&^(N#z#w2U+ z>V`cXVsw2Y-4Q);H3zWTH17}BPZ!$gz+3n`KFJjfP7Ayb z_$;+Cb+*+{UNWkMVwP z@S}U!ePQ+v*u%@!|3oV;4P2B>&XpXiUN&%X*5xZW-;QI{xKz5tn~POUh&bU|#vOFF z$YY2$awO~caxEvbZh`+B?{#^4m z`_a71{gZ>-vm&?t8%IrfMWRa=NED0Vr!qFbwT~OcG|4S7!=9UnLuur4J+hFMth)5P=$Kr&#%FselKm3H6+P2SUX`b%r)-f9Vy>pG z67wm_1sS=2RCn6GGR8kjbnA3^Tz1GDIY(ZSD6#ZfNzDAVGFZk*l({lM;!Iaal-d$w ze4fPEHHDey?MH9mm&Fmb@`@T9j!i7CP~cl%JQ0xF_jfwB_~O&fXXt{M)Q2-0AG{}Db4S@ zkmt*ZGEEvttdPA@Q=-K6bN`jTz=={#E|VK1$|hMN>!qFie_3b86e*PX(nAKxbMmMx zlH;Y0jF%|4OH+BMa{Ql&y~+rgEfeH4iPBBpl08w$mwWTRQMrTV(o7o4Zi&)0BNgO* zIBzgY9*g_$ZsQEOR8~kISt`rqW{I*!-jz0TpPVI=!b;(3;PZC}fJ^0Gv^ zC?oeYeI~!%xy7g~UUg`H=(d|4C delta 4501 zcmZA33$#{K9suxN-AbYNLsDJ66iFrN-7O^()xAQ>tGv?tfl*Xnks+z58+k;jgi4Vz z(?lT#ku?vqW*TG6ux6|w!!itGS!;g(@0`|Z&0hEa{r2AHJ7>So{r>!R)va$;EqvIZ zWL1*h6DNtv8YwldlG1Uu>ZeqpJf7{9cQi<;2M@77>o-j4e3rAEk8&&za~RKS zl+w9e$u2y^&OEkpO5IW_q~0>UR7_<}ZenY0V+;O=N;_wiKa_gRPO#FWlJUDnlp8Xyx77|COKEsx_2>U^5V5v=5Je#}si;R@4>jQf-a?*EW}zYmAQd?XqHnu^KKiYJ~SC=5Thew z^YYBRyqNKzwYhs34gG<=`87wevvups+Zi*sm!*8KrTLGw{8Ggnw$Qy=e2^z|9X%tx z#_IelV`l!rq5L-ovu|nk;DwB(yPq+|8yN$7pSAfJ*4C$g3;95&@FwquNJHT|XaK4PZcq{&GK8B6yC4bYL^%K|kkEe!y6(ww@Lb?Cc{>$)${uOl3XJWhXABTheaE41Ua5 z${NmI45*ZGe}Bd%9mP3u{-?>r13qPKHgJ0-r@oBELE(Edsr7&pAZ*i?UEAAZf}LMolzFb3_dIVsGdmu`yQg%q z@-$AW;`s3Dsz%%+J1r~hq`9vD!23B{tD9KcTjyCm&pjNk^{8*zH>Ice2A6PpKW|I^ z(9irYmsx23H?aPIY;AUNp7IBr!Lem2UBm;N#nOSLozGQV$q_@dcmCh_c{RuEysYOfFUa0_&+tLt`xme0 zUBk1z@C6qr4;+zo0;V;E0~ zsU6ELtTig7E4YhG*~rZ?)lV>HVwm+?#ciC=A(v$J`+1{s$I&TGjLBOgbDxTum!|YG zSJN}oXsx#5W?snyjE)vBdsypAaJ%1mCc5ugt{B+0=i_0m?h4r1aDH0vB+~)a)0}VLCyn zjaK?_91rqQcH?AEzm1QvIZvFC?fM?Hs_ALQ=Bqk0`}aF!rumPNJfI?`^gH@a>NYEz z^7VXKxsL9BTP>w`xkq{bE!l_{&dxg6eNHygot)=-7sI}b&vFBM=+#>Oi4Sn@+-yJ% z=b8W5L_cv?Pp;#99^y8RQ8wrNkwSr7UsL z7=Dqe2SmbNldF2XM5)}E>JEEzbEVYL9SO(;r$p7{Dv`tMK(w*(T^6O_jn$8pA{NF3n!G(=%%7ghA{?53u znllt@b_ruC4l^2Rp)y81h+o0UaPdMx$%TdL%9**N`{klKm zfkrZ$&A8@q`@t7qG##5+WrLu0i@)ViOlH2AoT6gd{Fra$+In4Ny&Inh}x63>f;B2w>+;;*Wg ztg+XA#pxy5j@r3mxQNX%L|iN)#qqgc)DTt0kQ*p79C! zg#m0Sc8T-zx_W$FOc5Q$mEt53?HAK4K1b#GV6tc^;shK?6J^@ug@gR1STDS*is?L` zJw<(St%%dqM7%9(iX*9!%x-aoC{*)txwuJ0+A8i5Pl`_B|II(-XNP;}NqI#)=ksWiP%V-pb3tvOK^4sJa#MCyQp{&Ah%x zZb|Oy+@M0N6@5f&ahZ5HhEOK6L@XD#h)9o%_e2MApEy-qC2kh)iWfwrO0iPhAf|~1 n;$?AkTB@)kuQ-d3iQ~m>QMY4i{k?T|TwMCez#ZGK-a6=ii{mS0 diff --git a/credentials/conf/locale/eo/LC_MESSAGES/django.po b/credentials/conf/locale/eo/LC_MESSAGES/django.po index fa3f0e771..496cf2f21 100644 --- a/credentials/conf/locale/eo/LC_MESSAGES/django.po +++ b/credentials/conf/locale/eo/LC_MESSAGES/django.po @@ -621,6 +621,13 @@ msgstr "" "Ì çömplétéd ä çöürsé ät {platform_name}. Täké ä löök ät mý çértïfïçäté: " "Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#" +#: apps/credentials/views.py +#, python-brace-format +msgid "I completed a course at {platform_name}." +msgstr "" +"Ì çömplétéd ä çöürsé ät {platform_name}. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " +"¢σηѕє¢#" + #: apps/credentials_theme_openedx/templates/openedx/credentials/programs/professional-certificate/certificate.html msgid "" "successfully completed all courses and received passing grades for a " diff --git a/credentials/conf/locale/rtl/LC_MESSAGES/django.mo b/credentials/conf/locale/rtl/LC_MESSAGES/django.mo index a04d2741183e77c505d919a89f8e36b08e4fa661..86fa7d72e79d320e7d1ebdb3e77467639aace4ca 100644 GIT binary patch delta 4514 zcmZA4X^>Ra83y1p!Z4t0BH*wHGYA8+iU^8qBPba5#SH=sqaq?|Kykr<4Tyk>f<_3q zk}#3Pg`h}4G(o|*f-J@#QP8SHD~1xQlpkst%RFD-o~l$%@%D4h?e2TeJjyNjWHOo2N9Kn|L;lu_xQKNa>uEa%rSWe+L$^gge-QyLkrxLFY=TWlHVPoZZ=nXL1Hx zaT&YtNyho!;#n*@J*6^sV@Hl=56QQP?nq6=pS89)EH~yVXSnO(j z*@A62if$^+VrMR7e7>e|{2;q(f6m5i+B&6PY|kdHpT?=g395Js=d&Rf(@mrYIF>aW z!xL=J3thbrt2u~k>8tERWo66Rtqo=~}t`)IUNU*m2Wq){{| zX(FQ|*B9DL3hfPy6KyTHk8zN5pQK&U>9S}yvrEsPZ&4W*hx=jN5*w}mFKcm+uwon z9Jr4LA?=~*N}tlSr|%ha*UZX{3zRe7@69?K#nBu`H4=vYu_6n=V5Jhq z6n18ue=zOflpCWGcQ}JFvT6n4XurhR zejjlt>zc1hj^O!RNjH>Bud77Q_A@&08RJA>a|ByBOU%_Y#tCP6iQV!L<4&GtQ*LK> zzDZwACm18x*4~S$8p61t$&Byc&epO2SE6@x3d&)a5e91@C1nx=kF+ml+rSjxpkm%zG!-PZcUL$D<3ygRHzmA{(c!xoBea$=*ENOq4i;;_$z1e!pGtimVzfUheBe{Y z1wUthe$NK%<3S!58pQbg#hk&BjJ5MDt%9%mJM zxyVqirh7<-sjsOdHza!iRWjDVLtM?Bj61rdG8>8Y{G0a6^j3P%*<0~_PT?1{4AL-H zDd)|smAhR%mZ# zN4{TZpI~S0)^0OKU}(X4j1FvM6%TSb&mNhL*bbJ)>S#79`x)&B36YxF8k zJde@QjjYeZjBWNYt;h5YZ{k^FvPb!P#uOEe&2~i_j@KT*_*GrSrmmlAR2p+T@8BD} zl7lROZd}J0vOVm=<7~s0&eodeFy0@-y1avTauIv+JGNt&3E9u`2sYGS%3Q4C)hg$5 z4~=H}md~?tVs?jL(OjkCN!h9%%y_abX57g-mU0WX^DQ>xA`@T9H9UofXoIDrj9t>| zGUFdT8)1`o;{TZ*V(ke9%|0xj3GYh=h>ZiW9*KhjH$YZO<6oOd$P4;2ko(J#d(Yo zxu14q+Qj(&=ZqWaGA;WnxQe~C*W^@UHSb~U+kf#LHkh9M+57=xC|g(gqk=uyo$oS6 z?pxl#mNT-y4e#b??L#bKyXx$QDi|X?j@R;5#%{_TQHeXKb5*uKD+1ecEe1@ z9n9y+T*wNppjk>=7$ehQR`wTBTh`O=$|u>IJ$aDUbNY#KBNML69!O8{`IyviRGRAf z#@X2)2rpc3*t8F@7r(M%%6+ljjebB_Nr%%qiH_Hn6@^MHuqeM5J2^cd#WGZWDKRQh zwn}f;&+p|p@S51F`JYJShcS#|1LVs-ug}Zf5<6nK%$1n)`y_VHN~tY2LjLJEtoFeF z7|)2@?Ot9e9Q+;MDAa?SMRK)R zR{1i-Yi!jW5(_X&Q+ZQvj9#B5Rnk^!%N~_@Fx8eDR8EtLwFhW@=C@KDIv}q~joc+s zE|GW&o+>ltbg|{qdr~4%;`;d~-z%Ihb!3{v<21?^xnDL*clrPFv;)=BKo-kD86i96 zNx4@}ktQ-lqAZj4vc7iyH^ot9oZKRwviZN&k$>pC#do7oD60$pwe|piCFRme-jOK% zGV;HQQQc5z2k}h!P2B$gl@2mh9+OI0C2QmkiLy}+N*8%Zy2=c>P2QL75@oGCBD3We r(oA+sluI-6|BHI5Q19DNBgiSkSr*RrLa}E#j zR8DG_(#hPwfqaks*{pp^gHtM`kt!o})UpxpWluiLu6%>8l|E-TmL8r`UmnRLIgOoo z3H$H{#`T`$(fkX`*||eXy*QfvSi=tPpVp~V>A06hl>W)MVc(7^t!5>U!y_KHlAb!Z+Y-L@ee;DI?RrFT6h=o{-wJHnw49#-tZQgBzG>Rr8 zjbjXCPTsyKZ?9oo=#JcH7&rPgNAe5KV1Mg2nkyMIxSQoX(9QhET7Ir$DZ3h86W+oe z+(Oq#&$9tPX3Wg*Igx+kc#ba5E_^j(>DDu*_#Vasz0Icl6XW_{F*a-JQAp`{R=Jyp zPittI(pFmLw1=@~?=nXIN&fync$jt@J9P>Vr)Nm#G6t}cvB_>`W4@5T{~F7+Kh587 zUa*B@>PIndbT_@1b})|HuNZsc-;5L4#1;-a@M896JlU=EU%Jan%+$*?IcYy*={{pz zzkvr~q_`+1il-II`*YgG*;sRb}RPn^WrLHu{mN&LEi_yN4aqPBm z9QU!3E&8N1oToD$Xf+M2km^)o0NWWC+R2H0pRrcGTrDox-%Fg5vlvfO%T~OKeYuvt zl6Em>@E~I;8#;UOK;?|@k7aDq8C)9Ye~C(5;1f1wdxtlkyqqz0D;YQ1#FMyw&< zk{yq!LsOcmy@ZQO93LLyz+w56+ext$lX*JVv4$UU2~RYNnAt}-p9B3GE#d}_=YJV9 zK7N!>#b&$4Fz0d~W9s_&xf;Xcc^ofgY^v=v*0i57fD#|7D;G{&@_)7YqRLUzv2;yNACjwfnanaxBs-_l+|Z>5>8-iaGIhY!>8r>5@GgCkhU zvv~?P=l#FS`x_f|NByTzS1Qa`>7sHE;|FIi+wl*%|H=E?nzsw}kK|%*XKdDv6SA2& ziRWvtqHU56@eFo7Ih*Q>8J~ZYF$3?@HYlX_=6{NgiQLXQma}qF_PbES3hgEA#f^D; z7mw2Zm@xxQJZ?CgF@OcE<}JLAe`n0t@>8=Jc$Y(Bm;6=5!=#GI&L|hLjK>;P@q#qc zw1ADdiE+&CG&-g`aH6weH3dSZH%f~s3ZP?s`SF)VVSi?B~wd}|H83TKVz4_G{ z=08T<#bJ*NPN5^7&gWom<~2OPPdVdE)6U9SjwBDVlCw?UaNfpfzsXqAcC)i{Kbz-j zzer=Z3#JirEyW#Ngu@+A#24V|C;J-?nKv_D`xK?m~} z$8QqPXDvIGm}*|6edxSwlT~~3NbSXpU4LWVzK=1(ud*=@W){+?DsddXWIREs;WlL% zE7*ZnBaLNjvQ2Ex2iTCicsrkCf6iNw{W-smPICH~_FL+=Fx%uS*~-8Nemnjyu*fG~ zU}|+#a{!kw%GTx~^XxO}b?QzVB}QIfuFEUFRxI~=b%N6mrGbo-E2K=KJS?#XI!8m< zEz{gTt&k`eW)xpz#8LLi1F}-$L|iN1ktwo9;`FSN`r<$oe-%%v@A#Ta)xRf? zv?UJNQ!3w;*ksR0l!v539OL3I;;B4SqFgTHWx3dU#nQs-k0g%h&2ogamncIsipTTk z>O=B&Z{8p4U!$^DPL`<>$8LhmlqmPfdTA)%kowX~<#D-6=8Jt+EGKyFCQnFgz$mTc zMOiFI%Q@0Tia#>pa}vKy^~D}6{s}g{zJswD<7h?MFHg%|vP_~(lHt-?&XYKPhs!Ud zk<^#?<=Z8Ga#G`Tuf{j(O5VV)KrciSnfUSXN6jX(_WM$~Dqm zZi$9+XGZ*?Qz-sl%p4tE^Ue``NnXj@!3}x+g|GG9q~1e1$;)~Fu-wwzTXTadxkE-t zPdQs|i$|zbxn9=EWfJ8lazOgXjdF}s%cb&~JSI`b}CDKNICSNaWHFo43$MJS) ZE>}k1j@s6{TkM!w{$}4D)l(;z{|{da?u7sV diff --git a/credentials/conf/locale/rtl/LC_MESSAGES/django.po b/credentials/conf/locale/rtl/LC_MESSAGES/django.po index aec207abe..3389d2cfe 100644 --- a/credentials/conf/locale/rtl/LC_MESSAGES/django.po +++ b/credentials/conf/locale/rtl/LC_MESSAGES/django.po @@ -530,6 +530,11 @@ msgid "" msgstr "" "Ɨ ɔøɯdlǝʇǝd ɐ ɔønɹsǝ ɐʇ {platform_name}. Ŧɐʞǝ ɐ løøʞ ɐʇ ɯʎ ɔǝɹʇᴉɟᴉɔɐʇǝ:" +#: apps/credentials/views.py +#, python-brace-format +msgid "I completed a course at {platform_name}." +msgstr "Ɨ ɔøɯdlǝʇǝd ɐ ɔønɹsǝ ɐʇ {platform_name}." + #: apps/credentials_theme_openedx/templates/openedx/credentials/programs/professional-certificate/certificate.html msgid "" "successfully completed all courses and received passing grades for a "