Compare commits
123 Commits
open-relea
...
open-relea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7424b60a90 | ||
|
|
1c0e6fd4b5 | ||
|
|
bc3faa4105 | ||
|
|
a94942a36e | ||
|
|
ab7c51994c | ||
|
|
67967a92cf | ||
|
|
6efa8c5356 | ||
|
|
c28669f5b2 | ||
|
|
270f4a8a12 | ||
|
|
641a169e6f | ||
|
|
25e254bbfb | ||
|
|
af0ddf532a | ||
|
|
eaf76c8dee | ||
|
|
5c0ca7b706 | ||
|
|
530b247c33 | ||
|
|
a5bc86e948 | ||
|
|
9910937269 | ||
|
|
1344c289df | ||
|
|
7f4111c12c | ||
|
|
105fdea8ef | ||
|
|
9d91e3f242 | ||
|
|
fdcb3a5e7f | ||
|
|
86974b76a9 | ||
|
|
835915750c | ||
|
|
fe8a125d1a | ||
|
|
f82e572ad2 | ||
|
|
8aa03496fb | ||
|
|
3c2c347bb9 | ||
|
|
0d166288cc | ||
|
|
f8954ef870 | ||
|
|
66afd4ddac | ||
|
|
a99eb8a44a | ||
|
|
b2981318b0 | ||
|
|
5142f3afd4 | ||
|
|
b7b3601337 | ||
|
|
50e5ca86c6 | ||
|
|
fe9a9a37e7 | ||
|
|
1c5ab42ea6 | ||
|
|
74fcbe426d | ||
|
|
6a65826fd5 | ||
|
|
ad47bfacd4 | ||
|
|
9e9bac997b | ||
|
|
014fbeac71 | ||
|
|
0b214faeca | ||
|
|
abff65a11a | ||
|
|
2f6eed237a | ||
|
|
7253c9bba3 | ||
|
|
a84d3c09e8 | ||
|
|
f5e1f1cf6b | ||
|
|
8096a389da | ||
|
|
1a21850fc4 | ||
|
|
efae5ecd4b | ||
|
|
1e043325d6 | ||
|
|
0bfce5594d | ||
|
|
dbe2787785 | ||
|
|
20e98319af | ||
|
|
2063049747 | ||
|
|
a7def9ce25 | ||
|
|
2418207149 | ||
|
|
5da5967e97 | ||
|
|
45b2bf5b13 | ||
|
|
7527f6c764 | ||
|
|
bdfa1fdeb3 | ||
|
|
79f58cc8d0 | ||
|
|
437d0a37a9 | ||
|
|
0e24a0767b | ||
|
|
91abf56977 | ||
|
|
f0734d86db | ||
|
|
3581d633c1 | ||
|
|
b8895bef33 | ||
|
|
89d0d12559 | ||
|
|
34fe291268 | ||
|
|
4b1e292e1c | ||
|
|
90eb6fd0c3 | ||
|
|
50da8a0f0b | ||
|
|
7dcd328f2e | ||
|
|
e2d66cc605 | ||
|
|
f5fc721b3b | ||
|
|
c4bbb6fa70 | ||
|
|
748aee2cff | ||
|
|
31473d3f49 | ||
|
|
4de727791a | ||
|
|
d1d04d5585 | ||
|
|
6f41a14012 | ||
|
|
f54dc17788 | ||
|
|
7954baf6bd | ||
|
|
1ff270f6e6 | ||
|
|
4ec612dd67 | ||
|
|
a7b0b46e37 | ||
|
|
ce66be7678 | ||
|
|
3567b36ece | ||
|
|
9db3ded793 | ||
|
|
4755ae4d67 | ||
|
|
022502c2a3 | ||
|
|
8a69e51526 | ||
|
|
38f9f689c9 | ||
|
|
7922ceb711 | ||
|
|
b142befdc1 | ||
|
|
ca6848693a | ||
|
|
ce7fd1593f | ||
|
|
21c7250672 | ||
|
|
8dfac206c5 | ||
|
|
2965508ad1 | ||
|
|
4bd251d849 | ||
|
|
325f8727c8 | ||
|
|
2f212919bd | ||
|
|
f88411adee | ||
|
|
f1830dd63e | ||
|
|
5f73e4277f | ||
|
|
9fce8ab363 | ||
|
|
6bc682565c | ||
|
|
0faba86890 | ||
|
|
154c4ba629 | ||
|
|
e0e3347cda | ||
|
|
c94a94c08e | ||
|
|
fcb9e91aa2 | ||
|
|
21c36a45fa | ||
|
|
26a7974cd1 | ||
|
|
d6997b8b4f | ||
|
|
1bd884c7ca | ||
|
|
e8dd28b490 | ||
|
|
9898a00c70 | ||
|
|
6fa312f7b4 |
3
.env
3
.env
@@ -5,6 +5,7 @@ CREDENTIALS_BASE_URL=''
|
||||
CSRF_TOKEN_API_PATH=''
|
||||
DISCOVERY_API_BASE_URL=''
|
||||
ECOMMERCE_BASE_URL=''
|
||||
EXAMS_BASE_URL=''
|
||||
FAVICON_URL=''
|
||||
LANGUAGE_PREFERENCE_COOKIE_NAME=''
|
||||
LMS_BASE_URL=''
|
||||
@@ -26,3 +27,5 @@ USER_INFO_COOKIE_NAME=''
|
||||
ENABLE_PROGRESS_GRAPH_SETTINGS=false
|
||||
ENABLE_TEAM_TYPE_SETTING=false
|
||||
ENABLE_NEW_EDITOR_PAGES=true
|
||||
BBB_LEARN_MORE_URL=''
|
||||
ENABLE_VIDEO_UPLOAD_PAGE_LINK_IN_CONTENT_DROPDOWN=false
|
||||
|
||||
@@ -4,6 +4,7 @@ BASE_URL='localhost:2001'
|
||||
CREDENTIALS_BASE_URL='http://localhost:18150'
|
||||
CSRF_TOKEN_API_PATH='/csrf/api/v1/token'
|
||||
DISCOVERY_API_BASE_URL=
|
||||
EXAMS_BASE_URL=
|
||||
ECOMMERCE_BASE_URL='http://localhost:18130'
|
||||
FAVICON_URL='https://edx-cdn.org/v3/default/favicon.ico'
|
||||
LANGUAGE_PREFERENCE_COOKIE_NAME='openedx-language-preference'
|
||||
@@ -28,3 +29,5 @@ USER_INFO_COOKIE_NAME='edx-user-info'
|
||||
ENABLE_PROGRESS_GRAPH_SETTINGS=false
|
||||
ENABLE_TEAM_TYPE_SETTING=false
|
||||
ENABLE_NEW_EDITOR_PAGES=true
|
||||
BBB_LEARN_MORE_URL=''
|
||||
ENABLE_VIDEO_UPLOAD_PAGE_LINK_IN_CONTENT_DROPDOWN=false
|
||||
|
||||
@@ -4,6 +4,7 @@ CREDENTIALS_BASE_URL='http://localhost:18150'
|
||||
CSRF_TOKEN_API_PATH='/csrf/api/v1/token'
|
||||
DISCOVERY_API_BASE_URL='http://localhost:18381'
|
||||
ECOMMERCE_BASE_URL='http://localhost:18130'
|
||||
EXAMS_BASE_URL=
|
||||
FAVICON_URL='https://edx-cdn.org/v3/default/favicon.ico'
|
||||
LANGUAGE_PREFERENCE_COOKIE_NAME='openedx-language-preference'
|
||||
LMS_BASE_URL='http://localhost:18000'
|
||||
@@ -27,3 +28,5 @@ USER_INFO_COOKIE_NAME='edx-user-info'
|
||||
ENABLE_PROGRESS_GRAPH_SETTINGS=false
|
||||
ENABLE_TEAM_TYPE_SETTING=false
|
||||
ENABLE_NEW_EDITOR_PAGES=true
|
||||
BBB_LEARN_MORE_URL=''
|
||||
ENABLE_VIDEO_UPLOAD_PAGE_LINK_IN_CONTENT_DROPDOWN=true
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||
const { createConfig } = require('@edx/frontend-build');
|
||||
|
||||
module.exports = createConfig('eslint',
|
||||
module.exports = createConfig(
|
||||
'eslint',
|
||||
{
|
||||
rules: {
|
||||
'jsx-a11y/label-has-associated-control': [2, {
|
||||
controlComponents: ['Input'],
|
||||
}],
|
||||
'template-curly-spacing': 'off',
|
||||
'react-hooks/exhaustive-deps': 'off',
|
||||
indent: 'off',
|
||||
'no-restricted-exports': 'off',
|
||||
},
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
@@ -16,4 +16,4 @@ jobs:
|
||||
secrets:
|
||||
GITHUB_APP_ID: ${{ secrets.GRAPHQL_AUTH_APP_ID }}
|
||||
GITHUB_APP_PRIVATE_KEY: ${{ secrets.GRAPHQL_AUTH_APP_PEM }}
|
||||
SLACK_BOT_TOKEN: ${{ secrets.SLACK_ISSUE_BOT_TOKEN }}
|
||||
SLACK_BOT_TOKEN: ${{ secrets.SLACK_ISSUE_BOT_TOKEN }}
|
||||
|
||||
20
.github/workflows/add-remove-label-on-comment.yml
vendored
Normal file
20
.github/workflows/add-remove-label-on-comment.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
# This workflow runs when a comment is made on the ticket
|
||||
# If the comment starts with "label: " it tries to apply
|
||||
# the label indicated in rest of comment.
|
||||
# If the comment starts with "remove label: ", it tries
|
||||
# to remove the indicated label.
|
||||
# Note: Labels are allowed to have spaces and this script does
|
||||
# not parse spaces (as often a space is legitimate), so the command
|
||||
# "label: really long lots of words label" will apply the
|
||||
# label "really long lots of words label"
|
||||
|
||||
name: Allows for the adding and removing of labels via comment
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
add_remove_labels:
|
||||
uses: openedx/.github/.github/workflows/add-remove-label-on-comment.yml@master
|
||||
|
||||
2
.github/workflows/commitlint.yml
vendored
2
.github/workflows/commitlint.yml
vendored
@@ -7,4 +7,4 @@ on:
|
||||
|
||||
jobs:
|
||||
commitlint:
|
||||
uses: edx/.github/.github/workflows/commitlint.yml@master
|
||||
uses: openedx/.github/.github/workflows/commitlint.yml@master
|
||||
|
||||
2
.github/workflows/lockfileversion-check.yml
vendored
2
.github/workflows/lockfileversion-check.yml
vendored
@@ -10,4 +10,4 @@ on:
|
||||
|
||||
jobs:
|
||||
version-check:
|
||||
uses: edx/.github/.github/workflows/lockfileversion-check.yml@master
|
||||
uses: openedx/.github/.github/workflows/lockfileversion-check-v3.yml@master
|
||||
|
||||
12
.github/workflows/self-assign-issue.yml
vendored
Normal file
12
.github/workflows/self-assign-issue.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# This workflow runs when a comment is made on the ticket
|
||||
# If the comment starts with "assign me" it assigns the author to the
|
||||
# ticket (case insensitive)
|
||||
|
||||
name: Assign comment author to ticket if they say "assign me"
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
self_assign_by_comment:
|
||||
uses: openedx/.github/.github/workflows/self-assign-issue.yml@master
|
||||
12
.github/workflows/update-browserslist-db.yml
vendored
Normal file
12
.github/workflows/update-browserslist-db.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
name: Update Browserslist DB
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * 1'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
update-browserslist:
|
||||
uses: openedx/.github/.github/workflows/update-browserslist-db.yml@master
|
||||
|
||||
secrets:
|
||||
requirements_bot_github_token: ${{ secrets.requirements_bot_github_token }}
|
||||
13
.github/workflows/validate.yml
vendored
13
.github/workflows/validate.yml
vendored
@@ -9,16 +9,15 @@ on:
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node: [16]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
- uses: actions/checkout@v3
|
||||
- name: Setup Nodejs Env
|
||||
run: echo "NODE_VER=`cat .nvmrc`" >> $GITHUB_ENV
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
node-version: ${{ env.NODE_VER }}
|
||||
- run: make validate.ci
|
||||
- name: Upload coverage
|
||||
uses: codecov/codecov-action@v2
|
||||
uses: codecov/codecov-action@v3
|
||||
with:
|
||||
fail_ci_if_error: true
|
||||
|
||||
6
Makefile
Executable file → Normal file
6
Makefile
Executable file → Normal file
@@ -1,12 +1,10 @@
|
||||
transifex_resource = frontend-app-course-authoring
|
||||
export TRANSIFEX_RESOURCE = ${transifex_resource}
|
||||
transifex_langs = "ar,fr,es_419,zh_CN"
|
||||
transifex_langs = "ar,fr,es_419,zh_CN,pt,it,de,uk,ru,hi,fr_CA"
|
||||
|
||||
transifex_utils = ./node_modules/.bin/transifex-utils.js
|
||||
i18n = ./src/i18n
|
||||
transifex_input = $(i18n)/transifex_input.json
|
||||
tx_url1 = https://www.transifex.com/api/2/project/edx-platform/resource/$(transifex_resource)/translation/en/strings/
|
||||
tx_url2 = https://www.transifex.com/api/2/project/edx-platform/resource/$(transifex_resource)/source/
|
||||
|
||||
# This directory must match .babelrc .
|
||||
transifex_temp = ./temp/babel-plugin-react-intl
|
||||
@@ -47,7 +45,7 @@ push_translations:
|
||||
|
||||
# Pulls translations from Transifex.
|
||||
pull_translations:
|
||||
tx pull -f --mode reviewed --languages=$(transifex_langs)
|
||||
tx pull -t -f --mode reviewed --languages=$(transifex_langs)
|
||||
|
||||
# This target is used by Travis.
|
||||
validate-no-uncommitted-package-lock-changes:
|
||||
|
||||
164
README.rst
164
README.rst
@@ -1,21 +1,162 @@
|
||||
|Build Status| |Codecov| |license|
|
||||
|
||||
#############################
|
||||
frontend-app-course-authoring
|
||||
=============================
|
||||
#############################
|
||||
|
||||
Please tag `@edx/teaching-and-learning <https://github.com/orgs/edx/teams/teaching-and-learning>`_ on any PRs or issues. Thanks.
|
||||
|
||||
Prerequisite
|
||||
************
|
||||
Introduction
|
||||
************
|
||||
|
||||
This is the Course Authoring micro-frontend, currently under development by `2U <https://2u.com>`_.
|
||||
|
||||
Its purpose is to provide both a framework and UI for new or replacement React-based authoring features outside ``edx-platform``. You can find the current set described below.
|
||||
|
||||
********
|
||||
Features
|
||||
********
|
||||
|
||||
Feature: Pages and Resources Studio Tab
|
||||
=======================================
|
||||
|
||||
Enables a "Pages & Resources" menu item in Studio, under the "Content" menu.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
The following are external requirements for this feature to function correctly:
|
||||
|
||||
* ``edx-platform`` Django settings:
|
||||
|
||||
* ``COURSE_AUTHORING_MICROFRONTEND_URL``: must be set in the CMS environment and point to this MFE's deployment URL.
|
||||
|
||||
* ``edx-platform`` Waffle flags:
|
||||
|
||||
* ``discussions.pages_and_resources_mfe``: must be enabled for the set of users meant to access this feature.
|
||||
|
||||
* `frontend-app-learning <https://github.com/openedx/frontend-app-learning>`_: This MFE expects it to be the LMS frontend.
|
||||
* `frontend-app-discussions <https://github.com/openedx/frontend-app-discussions/>`_: This is what the "Discussions" configuration provided by this feature actually configures. Without it, discussion settings are ignored.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
In additional to the standard settings, the following local configuration items are required:
|
||||
|
||||
* ``LEARNING_BASE_URL``: points to Learning MFE; necessary so that the `View Live` button works
|
||||
* ``ENABLE_PROGRESS_GRAPH_SETTINGS``: allow enabling or disabling the learner progress graph course-wide
|
||||
|
||||
Feature Description
|
||||
-------------------
|
||||
|
||||
Clicking on the "Pages & Resources" menu item takes the user to the course's ``pages-and-resources`` standalone page in this MFE. (In a devstack, for instance: http://localhost:2001/course/course-v1:edX+DemoX+Demo_Course/pages-and-resources.)
|
||||
|
||||
UX-wise, **Pages & Resources** is meant to look like a Studio tab, so reproduces Studio's header.
|
||||
|
||||
For a particular course, this page allows one to:
|
||||
|
||||
* Configure the new Discussions MFE (making this a requirement for it). This includes:
|
||||
|
||||
* Enabling/disabling the feature entirely
|
||||
* Picking a different discussion provider, while showing a comparison matrix between them:
|
||||
|
||||
* edX
|
||||
* Ed Discussion
|
||||
* InScribe
|
||||
* Piazza
|
||||
* Yellowdig
|
||||
|
||||
* Allowing to configure the selected provider
|
||||
|
||||
* Enable/Disable learner progress
|
||||
* Enable/Disable learner notes
|
||||
* Enable/Disable the learner wiki
|
||||
* Enable/Disable the LMS calculator
|
||||
* Go to the textbook management page in Studio (in a devstack: http://localhost:18010/textbooks/course-v1:edX+DemoX+Demo_Course)
|
||||
* Go to the custom page management page in Studio(in a devstack http://localhost:18010/tabs/course-v1:edX+DemoX+Demo_Course)
|
||||
|
||||
Feature: New React XBlock Editors
|
||||
=================================
|
||||
|
||||
This allows an operator to enable the use of new React editors for the HTML, Video, and Problem XBlocks, all of which are provided here.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
* ``edx-platform`` Django settings:
|
||||
|
||||
* ``COURSE_AUTHORING_MICROFRONTEND_URL``: must be set in the CMS environment and point to this MFE's deployment URL.
|
||||
|
||||
* ``edx-platform`` Waffle flags:
|
||||
|
||||
* ``new_core_editors.use_new_text_editor``: must be enabled for the new HTML Xblock editor to be used in Studio
|
||||
* ``new_core_editors.use_new_video_editor``: must be enabled for the new Video Xblock editor to be used in Studio
|
||||
* ``new_core_editors.use_new_problem_editor``: must be enabled for the new Problem Xblock editor to be used in Studio
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
In additional to the standard settings, the following local configuration item is required:
|
||||
|
||||
* ``ENABLE_NEW_EDITOR_PAGES``: must be enabled in order to actually present the new XBlock editors
|
||||
|
||||
Feature Description
|
||||
-------------------
|
||||
|
||||
When a corresponding waffle flag is set, upon editing a block in Studio, the view is rendered by this MFE instead of by the XBlock's authoring view. The user remains in Studio.
|
||||
|
||||
.. note::
|
||||
|
||||
The new editors themselves are currently implemented in a repository outside ``openedx``: `frontend-lib-content-components <https://github.com/edx/frontend-lib-content-components/>`_, a dependency of this MFE. This repository is slated to be moved to the ``openedx`` org, however.
|
||||
|
||||
Feature: New Proctoring Exams View
|
||||
==================================
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
* ``edx-platform`` Django settings:
|
||||
|
||||
* ``COURSE_AUTHORING_MICROFRONTEND_URL``: must be set in the CMS environment and point to this MFE's deployment URL.
|
||||
* ``ZENDESK_*``: necessary if automatic ZenDesk ticket creation is desired
|
||||
|
||||
* ``edx-platform`` Feature flags:
|
||||
|
||||
* ``ENABLE_EXAM_SETTINGS_HTML_VIEW``: this feature flag must be enabled for the link to the settings view to be shown
|
||||
|
||||
* `edx-exams <https://github.com/edx/edx-exams>`_: for this feature to work, the ``edx-exams`` IDA must be deployed and its API accessible by the browser
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
In additional to the standard settings, the following local configuration item is required:
|
||||
|
||||
* ``EXAMS_BASE_URL``: URL to the ``edx-exams`` deployment
|
||||
|
||||
Feature Description
|
||||
-------------------
|
||||
|
||||
In Studio, a new item ("Proctored Exam Settings") is added to "Other Course Settings" in the course's "Certificates" settings page. When clicked, this takes the author to the corresponding page in the Course Authoring MFE, where one can:
|
||||
|
||||
* Enable proctored exams for the course
|
||||
* Allow opting out of proctored exams
|
||||
* Select a proctoring provider
|
||||
* Enable automatic creation of Zendesk tickets for "suspicious" proctored exam attempts
|
||||
|
||||
|
||||
**********
|
||||
Developing
|
||||
**********
|
||||
|
||||
`Devstack <https://edx.readthedocs.io/projects/edx-installing-configuring-and-running/en/latest/installation/index.html>`_. If you start Devstack with ``make dev.up.studio`` that should give you everything you need as a companion to this frontend.
|
||||
|
||||
Installation and Startup
|
||||
------------------------
|
||||
========================
|
||||
|
||||
1. Clone the repo:
|
||||
|
||||
``git clone https://github.com/edx/frontend-app-course-authoring.git``
|
||||
``git clone https://github.com/openedx/frontend-app-course-authoring.git``
|
||||
|
||||
2. Install npm dependencies:
|
||||
|
||||
@@ -32,8 +173,21 @@ If your devstack includes the default Demo course, you can visit the following U
|
||||
- `Proctored Exam Settings <http://localhost:2001/course/course-v1:edX+DemoX+Demo_Course/proctored-exam-settings>`_
|
||||
- `Pages and Resources <http://localhost:2001/course/course-v1:edX+DemoX+Demo_Course/pages-and-resources>`_ (work in progress)
|
||||
|
||||
Troubleshooting
|
||||
========================
|
||||
|
||||
* ``npm ERR! gyp ERR! build error`` while running npm install on Macs with M1 processors: Probably due to a compatibility issue of node-canvas with M1.
|
||||
|
||||
Run ``brew install pkg-config pixman cairo pango libpng jpeg giflib librsvg`` before ``npm install`` to get the correct versions of the dependencies.
|
||||
If there is still an error, look for "no package [...] found" in the error message and install missing package via brew.
|
||||
(https://github.com/Automattic/node-canvas/issues/1733)
|
||||
|
||||
*********
|
||||
Deploying
|
||||
*********
|
||||
|
||||
Production Build
|
||||
----------------
|
||||
================
|
||||
|
||||
The production build is created with ``npm run build``.
|
||||
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
React App i18n HOWTO
|
||||
####################
|
||||
|
||||
This document has moved to the frontend-platform repo: https://github.com/edx/frontend-platform/blob/master/docs/how_tos/i18n.rst
|
||||
This document has moved to the frontend-platform repo: https://github.com/openedx/frontend-platform/blob/master/docs/how_tos/i18n.rst
|
||||
|
||||
52909
package-lock.json
generated
52909
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
28
package.json
28
package.json
@@ -4,7 +4,7 @@
|
||||
"description": "Frontend application template",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/edx/frontend-app-course-authoring.git"
|
||||
"url": "git+https://github.com/openedx/frontend-app-course-authoring.git"
|
||||
},
|
||||
"browserslist": [
|
||||
"extends @edx/browserslist-config"
|
||||
@@ -25,20 +25,19 @@
|
||||
},
|
||||
"author": "edX",
|
||||
"license": "AGPL-3.0",
|
||||
"homepage": "https://github.com/edx/frontend-app-course-authoring#readme",
|
||||
"homepage": "https://github.com/openedx/frontend-app-course-authoring#readme",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/edx/frontend-app-course-authoring/issues"
|
||||
"url": "https://github.com/openedx/frontend-app-course-authoring/issues"
|
||||
},
|
||||
"dependencies": {
|
||||
"@edx/frontend-build": "8.0.4",
|
||||
"@edx/brand": "npm:@edx/brand-openedx@1.1.0",
|
||||
"@edx/frontend-component-footer": "10.1.6",
|
||||
"@edx/frontend-lib-content-components": "1.20.0",
|
||||
"@edx/frontend-platform": "1.15.5",
|
||||
"@edx/paragon": "19.9.0",
|
||||
"@edx/frontend-component-footer": "11.1.1",
|
||||
"@edx/frontend-lib-content-components": "^1.131.0",
|
||||
"@edx/frontend-platform": "2.5.1",
|
||||
"@edx/paragon": "^20.38.0",
|
||||
"@fortawesome/fontawesome-svg-core": "1.2.28",
|
||||
"@fortawesome/free-brands-svg-icons": "5.11.2",
|
||||
"@fortawesome/free-regular-svg-icons": "5.11.2",
|
||||
@@ -54,6 +53,7 @@
|
||||
"prop-types": "15.7.2",
|
||||
"react": "16.14.0",
|
||||
"react-dom": "16.14.0",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-redux": "7.1.3",
|
||||
"react-responsive": "8.1.0",
|
||||
"react-router": "5.1.2",
|
||||
@@ -66,19 +66,17 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@edx/browserslist-config": "1.0.0",
|
||||
"@edx/frontend-build": "8.0.4",
|
||||
"@edx/frontend-build": "12.8.38",
|
||||
"@edx/reactifex": "^1.0.3",
|
||||
"enzyme": "3.11.0",
|
||||
"enzyme-adapter-react-16": "1.15.6",
|
||||
"enzyme-to-json": "^3.6.2",
|
||||
"@testing-library/jest-dom": "5.14.1",
|
||||
"@testing-library/jest-dom": "5.16.4",
|
||||
"@testing-library/react": "12.1.1",
|
||||
"@testing-library/user-event": "^13.2.1",
|
||||
"axios-mock-adapter": "1.20.0",
|
||||
"codecov": "3.8.3",
|
||||
"enzyme": "3.11.0",
|
||||
"enzyme-adapter-react-16": "1.15.6",
|
||||
"enzyme-to-json": "^3.6.2",
|
||||
"glob": "7.1.6",
|
||||
"husky": "3.1.0",
|
||||
"jest": "24.9.0",
|
||||
"react-test-renderer": "16.9.0",
|
||||
"reactifex": "1.1.1"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<!doctype html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<title>Course Authoring | edX</title>
|
||||
<title>Course Authoring | <%= process.env.SITE_NAME %></title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="shortcut icon" href="<%= process.env.FAVICON_URL %>" type="image/x-icon" />
|
||||
|
||||
@@ -1,9 +1,19 @@
|
||||
{
|
||||
"extends": [
|
||||
"config:base"
|
||||
"config:base",
|
||||
"schedule:daily",
|
||||
":rebaseStalePrs",
|
||||
":semanticCommits"
|
||||
],
|
||||
"patch": {
|
||||
"automerge": true
|
||||
},
|
||||
"rebaseStalePrs": true
|
||||
"rebaseStalePrs": true,
|
||||
"packageRules": [
|
||||
{
|
||||
"matchPackagePatterns": ["@edx"],
|
||||
"matchUpdateTypes": ["minor", "patch"],
|
||||
"automerge": true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -14,7 +14,36 @@ import { getCourseAppsApiStatus, getLoadingStatus } from './pages-and-resources/
|
||||
import { RequestStatus } from './data/constants';
|
||||
import Loading from './generic/Loading';
|
||||
|
||||
export default function CourseAuthoringPage({ courseId, children }) {
|
||||
const AppHeader = ({
|
||||
courseNumber, courseOrg, courseTitle, courseId,
|
||||
}) => (
|
||||
<Header
|
||||
courseNumber={courseNumber}
|
||||
courseOrg={courseOrg}
|
||||
courseTitle={courseTitle}
|
||||
courseId={courseId}
|
||||
/>
|
||||
);
|
||||
|
||||
AppHeader.propTypes = {
|
||||
courseId: PropTypes.string.isRequired,
|
||||
courseNumber: PropTypes.string,
|
||||
courseOrg: PropTypes.string,
|
||||
courseTitle: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
AppHeader.defaultProps = {
|
||||
courseNumber: null,
|
||||
courseOrg: null,
|
||||
};
|
||||
|
||||
const AppFooter = () => (
|
||||
<div className="mt-6">
|
||||
<Footer />
|
||||
</div>
|
||||
);
|
||||
|
||||
const CourseAuthoringPage = ({ courseId, children }) => {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
useEffect(() => {
|
||||
@@ -28,40 +57,33 @@ export default function CourseAuthoringPage({ courseId, children }) {
|
||||
const courseTitle = courseDetail ? courseDetail.name : courseId;
|
||||
const courseAppsApiStatus = useSelector(getCourseAppsApiStatus);
|
||||
const inProgress = useSelector(getLoadingStatus) === RequestStatus.IN_PROGRESS;
|
||||
const { pathname } = useLocation();
|
||||
if (courseAppsApiStatus === RequestStatus.DENIED) {
|
||||
return (
|
||||
<PermissionDeniedAlert />
|
||||
);
|
||||
}
|
||||
|
||||
const AppHeader = () => (
|
||||
<Header
|
||||
courseNumber={courseNumber}
|
||||
courseOrg={courseOrg}
|
||||
courseTitle={courseTitle}
|
||||
courseId={courseId}
|
||||
/>
|
||||
);
|
||||
|
||||
const AppFooter = () => (
|
||||
<div className="mt-6">
|
||||
<Footer />
|
||||
</div>
|
||||
);
|
||||
|
||||
const { pathname } = useLocation();
|
||||
return (
|
||||
<div className="bg-light-200">
|
||||
<div className={pathname.includes('/editor/') ? '' : 'bg-light-200'}>
|
||||
{/* While V2 Editors are tempoarily served from thier own pages
|
||||
using url pattern containing /editor/,
|
||||
we shouldn't have the header and footer on these pages.
|
||||
This functionality will be removed in TNL-9591 */}
|
||||
{inProgress ? !pathname.includes('/editor/') && <Loading /> : <AppHeader />}
|
||||
{inProgress ? !pathname.includes('/editor/') && <Loading />
|
||||
: (
|
||||
<AppHeader
|
||||
courseNumber={courseNumber}
|
||||
courseOrg={courseOrg}
|
||||
courseTitle={courseTitle}
|
||||
courseId={courseId}
|
||||
/>
|
||||
)}
|
||||
{children}
|
||||
{!inProgress && <AppFooter />}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
CourseAuthoringPage.propTypes = {
|
||||
children: PropTypes.node,
|
||||
@@ -71,3 +93,5 @@ CourseAuthoringPage.propTypes = {
|
||||
CourseAuthoringPage.defaultProps = {
|
||||
children: null,
|
||||
};
|
||||
|
||||
export default CourseAuthoringPage;
|
||||
|
||||
@@ -23,7 +23,7 @@ import EditorContainer from './editors/EditorContainer';
|
||||
* can move the Header/Footer rendering to this component and likely pull the course detail loading
|
||||
* in as well, and it'd feel a bit better-factored and the roles would feel more clear.
|
||||
*/
|
||||
export default function CourseAuthoringRoutes({ courseId }) {
|
||||
const CourseAuthoringRoutes = ({ courseId }) => {
|
||||
const { path } = useRouteMatch();
|
||||
return (
|
||||
<CourseAuthoringPage courseId={courseId}>
|
||||
@@ -45,8 +45,10 @@ export default function CourseAuthoringRoutes({ courseId }) {
|
||||
</Switch>
|
||||
</CourseAuthoringPage>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
CourseAuthoringRoutes.propTypes = {
|
||||
courseId: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default CourseAuthoringRoutes;
|
||||
|
||||
34
src/data/services/ExamsApiService.js
Normal file
34
src/data/services/ExamsApiService.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
|
||||
import { getConfig } from '@edx/frontend-platform';
|
||||
|
||||
class ExamsApiService {
|
||||
static isAvailable() {
|
||||
return !!this.getExamsBaseUrl();
|
||||
}
|
||||
|
||||
static getExamsBaseUrl() {
|
||||
return getConfig().EXAMS_BASE_URL;
|
||||
}
|
||||
|
||||
static getExamConfigurationUrl(courseId) {
|
||||
return `${ExamsApiService.getExamsBaseUrl()}/api/v1/configs/course_id/${courseId}`;
|
||||
}
|
||||
|
||||
static getAvailableProviders() {
|
||||
const apiClient = getAuthenticatedHttpClient();
|
||||
const providersUrl = `${ExamsApiService.getExamsBaseUrl()}/api/v1/providers`;
|
||||
return apiClient.get(providersUrl);
|
||||
}
|
||||
|
||||
static getCourseExamConfiguration(courseId) {
|
||||
const apiClient = getAuthenticatedHttpClient();
|
||||
return apiClient.get(this.getExamConfigurationUrl(courseId));
|
||||
}
|
||||
|
||||
static saveCourseExamConfiguration(courseId, dataToSave) {
|
||||
const apiClient = getAuthenticatedHttpClient();
|
||||
return apiClient.patch(this.getExamConfigurationUrl(courseId), dataToSave);
|
||||
}
|
||||
}
|
||||
|
||||
export default ExamsApiService;
|
||||
@@ -2,6 +2,7 @@ import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { useParams } from 'react-router';
|
||||
import { EditorPage } from '@edx/frontend-lib-content-components';
|
||||
import { getConfig } from '@edx/frontend-platform';
|
||||
|
||||
const EditorContainer = ({
|
||||
courseId,
|
||||
@@ -13,8 +14,8 @@ const EditorContainer = ({
|
||||
courseId={courseId}
|
||||
blockType={blockType}
|
||||
blockId={blockId}
|
||||
studioEndpointUrl={process.env.STUDIO_BASE_URL}
|
||||
lmsEndpointUrl={process.env.LMS_BASE_URL}
|
||||
studioEndpointUrl={getConfig().STUDIO_BASE_URL}
|
||||
lmsEndpointUrl={getConfig().LMS_BASE_URL}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -56,7 +56,7 @@ const CollapsableEditor = ({
|
||||
</Collapsible.Trigger>
|
||||
<Collapsible.Body className="collapsible-body rounded px-0">{children}</Collapsible.Body>
|
||||
</Collapsible.Advanced>
|
||||
);
|
||||
);
|
||||
|
||||
CollapsableEditor.propTypes = {
|
||||
open: PropTypes.bool,
|
||||
|
||||
@@ -2,11 +2,11 @@ import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Button, Card } from '@edx/paragon';
|
||||
|
||||
const DeletePopup = ({
|
||||
const ConfirmationPopup = ({
|
||||
label,
|
||||
bodyText,
|
||||
onDelete,
|
||||
deleteLabel,
|
||||
onConfirm,
|
||||
confirmLabel,
|
||||
onCancel,
|
||||
cancelLabel,
|
||||
}) => (
|
||||
@@ -22,21 +22,21 @@ const DeletePopup = ({
|
||||
<Button variant="tertiary" onClick={onCancel}>
|
||||
{cancelLabel}
|
||||
</Button>
|
||||
<Button variant="outline-brand" className="ml-2" onClick={onDelete}>
|
||||
{deleteLabel}
|
||||
<Button variant="outline-brand" className="ml-2" onClick={onConfirm}>
|
||||
{confirmLabel}
|
||||
</Button>
|
||||
</Card.Footer>
|
||||
</Card.Body>
|
||||
</Card>
|
||||
);
|
||||
);
|
||||
|
||||
DeletePopup.propTypes = {
|
||||
ConfirmationPopup.propTypes = {
|
||||
label: PropTypes.string.isRequired,
|
||||
bodyText: PropTypes.string.isRequired,
|
||||
onDelete: PropTypes.func.isRequired,
|
||||
onConfirm: PropTypes.func.isRequired,
|
||||
onCancel: PropTypes.func.isRequired,
|
||||
deleteLabel: PropTypes.string.isRequired,
|
||||
confirmLabel: PropTypes.string.isRequired,
|
||||
cancelLabel: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default DeletePopup;
|
||||
export default ConfirmationPopup;
|
||||
@@ -5,23 +5,21 @@ import { getConfig } from '@edx/frontend-platform';
|
||||
|
||||
import messages from '../messages';
|
||||
|
||||
function ConnectionErrorAlert({ intl }) {
|
||||
return (
|
||||
<Alert variant="danger" data-testid="connectionErrorAlert">
|
||||
<FormattedMessage
|
||||
id="authoring.alert.error.connection"
|
||||
defaultMessage="We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help."
|
||||
values={{
|
||||
const ConnectionErrorAlert = ({ intl }) => (
|
||||
<Alert variant="danger" data-testid="connectionErrorAlert">
|
||||
<FormattedMessage
|
||||
id="authoring.alert.error.connection"
|
||||
defaultMessage="We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help."
|
||||
values={{
|
||||
supportLink: (
|
||||
<Alert.Link href={getConfig().SUPPORT_URL}>
|
||||
{intl.formatMessage(messages.supportText)}
|
||||
</Alert.Link>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</Alert>
|
||||
/>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
|
||||
ConnectionErrorAlert.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
@@ -2,38 +2,36 @@ import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Form, TransitionReplace } from '@edx/paragon';
|
||||
|
||||
function FieldFeedback({
|
||||
const FieldFeedback = ({
|
||||
feedbackClasses,
|
||||
transitionClasses,
|
||||
errorCondition,
|
||||
feedbackCondition,
|
||||
feedbackMessage,
|
||||
errorMessage,
|
||||
}) {
|
||||
return (
|
||||
<>
|
||||
<TransitionReplace className={transitionClasses}>
|
||||
{feedbackCondition ? (
|
||||
<React.Fragment key="open1">
|
||||
<Form.Control.Feedback type="default" hasIcon={false} key={`${feedbackMessage}-feedback`}>
|
||||
<div className={`small ${feedbackClasses}`}>{feedbackMessage}</div>
|
||||
</Form.Control.Feedback>
|
||||
</React.Fragment>
|
||||
}) => (
|
||||
<>
|
||||
<TransitionReplace className={transitionClasses}>
|
||||
{feedbackCondition ? (
|
||||
<React.Fragment key="open1">
|
||||
<Form.Control.Feedback type="default" hasIcon={false} key={`${feedbackMessage}-feedback`}>
|
||||
<div className={`small ${feedbackClasses}`}>{feedbackMessage}</div>
|
||||
</Form.Control.Feedback>
|
||||
</React.Fragment>
|
||||
) : <React.Fragment key="close1" />}
|
||||
</TransitionReplace>
|
||||
</TransitionReplace>
|
||||
|
||||
<TransitionReplace>
|
||||
{errorCondition ? (
|
||||
<React.Fragment key="open">
|
||||
<Form.Control.Feedback type="invalid" hasIcon={false} key={`${errorMessage}-feedback`}>
|
||||
<div className={`small ${feedbackClasses}`}>{errorMessage}</div>
|
||||
</Form.Control.Feedback>
|
||||
</React.Fragment>
|
||||
<TransitionReplace>
|
||||
{errorCondition ? (
|
||||
<React.Fragment key="open">
|
||||
<Form.Control.Feedback type="invalid" hasIcon={false} key={`${errorMessage}-feedback`}>
|
||||
<div className={`small ${feedbackClasses}`}>{errorMessage}</div>
|
||||
</Form.Control.Feedback>
|
||||
</React.Fragment>
|
||||
) : <React.Fragment key="close" />}
|
||||
</TransitionReplace>
|
||||
</>
|
||||
</TransitionReplace>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
FieldFeedback.propTypes = {
|
||||
errorCondition: PropTypes.bool.isRequired,
|
||||
|
||||
@@ -4,7 +4,7 @@ import { Form, SwitchControl } from '@edx/paragon';
|
||||
|
||||
import './FormSwitchGroup.scss';
|
||||
|
||||
export default function FormSwitchGroup({
|
||||
const FormSwitchGroup = ({
|
||||
id,
|
||||
name,
|
||||
label,
|
||||
@@ -13,7 +13,8 @@ export default function FormSwitchGroup({
|
||||
onChange,
|
||||
onBlur,
|
||||
checked,
|
||||
}) {
|
||||
disabled,
|
||||
}) => {
|
||||
const helpTextId = `${id}HelpText`;
|
||||
|
||||
// Note that we use controlId here _and_ set some IDs and aria-describedby attributes manually.
|
||||
@@ -36,6 +37,7 @@ export default function FormSwitchGroup({
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
checked={checked}
|
||||
disabled={disabled}
|
||||
/>
|
||||
</div>
|
||||
<Form.Text
|
||||
@@ -47,7 +49,7 @@ export default function FormSwitchGroup({
|
||||
</div>
|
||||
</Form.Group>
|
||||
);
|
||||
}
|
||||
};
|
||||
FormSwitchGroup.propTypes = {
|
||||
id: PropTypes.string.isRequired,
|
||||
label: PropTypes.node.isRequired,
|
||||
@@ -57,9 +59,13 @@ FormSwitchGroup.propTypes = {
|
||||
onChange: PropTypes.func.isRequired,
|
||||
onBlur: PropTypes.func,
|
||||
checked: PropTypes.bool.isRequired,
|
||||
disabled: PropTypes.bool,
|
||||
};
|
||||
FormSwitchGroup.defaultProps = {
|
||||
className: null,
|
||||
onBlur: null,
|
||||
name: null,
|
||||
disabled: false,
|
||||
};
|
||||
|
||||
export default FormSwitchGroup;
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
/* eslint-disable react/jsx-no-useless-fragment */
|
||||
import { Form } from '@edx/paragon';
|
||||
import { getIn, useFormikContext } from 'formik';
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import FormikErrorFeedback from './FormikErrorFeedback';
|
||||
|
||||
function FormikControl({
|
||||
const FormikControl = ({
|
||||
name,
|
||||
label,
|
||||
help,
|
||||
className,
|
||||
...params
|
||||
}) {
|
||||
}) => {
|
||||
const {
|
||||
touched, errors, handleChange, handleBlur, setFieldError,
|
||||
} = useFormikContext();
|
||||
@@ -35,7 +36,7 @@ function FormikControl({
|
||||
</FormikErrorFeedback>
|
||||
</Form.Group>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
FormikControl.propTypes = {
|
||||
name: PropTypes.element.isRequired,
|
||||
|
||||
@@ -3,7 +3,7 @@ import { getIn, useFormikContext } from 'formik';
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
|
||||
function FormikErrorFeedback({ name, children }) {
|
||||
const FormikErrorFeedback = ({ name, children }) => {
|
||||
const { touched, errors } = useFormikContext();
|
||||
const fieldTouched = getIn(touched, name);
|
||||
const fieldError = getIn(errors, name);
|
||||
@@ -23,7 +23,7 @@ function FormikErrorFeedback({ name, children }) {
|
||||
)}
|
||||
</TransitionReplace>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
FormikErrorFeedback.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
|
||||
@@ -2,28 +2,28 @@ import React from 'react';
|
||||
import { Spinner } from '@edx/paragon';
|
||||
import { FormattedMessage } from '@edx/frontend-platform/i18n';
|
||||
|
||||
export default function Loading() {
|
||||
return (
|
||||
<div
|
||||
className="d-flex justify-content-center align-items-center flex-column"
|
||||
style={{
|
||||
const Loading = () => (
|
||||
<div
|
||||
className="d-flex justify-content-center align-items-center flex-column"
|
||||
style={{
|
||||
height: '50vh',
|
||||
}}
|
||||
>
|
||||
<Spinner
|
||||
animation="border"
|
||||
role="status"
|
||||
variant="primary"
|
||||
screenReaderText={(
|
||||
<span className="sr-only">
|
||||
<FormattedMessage
|
||||
id="authoring.loading"
|
||||
defaultMessage="Loading..."
|
||||
description="Screen-reader message for when a page is loading."
|
||||
/>
|
||||
</span>
|
||||
>
|
||||
<Spinner
|
||||
animation="border"
|
||||
role="status"
|
||||
variant="primary"
|
||||
screenReaderText={(
|
||||
<span className="sr-only">
|
||||
<FormattedMessage
|
||||
id="authoring.loading"
|
||||
defaultMessage="Loading..."
|
||||
description="Screen-reader message for when a page is loading."
|
||||
/>
|
||||
</span>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Loading;
|
||||
|
||||
@@ -2,15 +2,13 @@ import React from 'react';
|
||||
import { FormattedMessage } from '@edx/frontend-platform/i18n';
|
||||
import { Alert } from '@edx/paragon';
|
||||
|
||||
function PermissionDeniedAlert() {
|
||||
return (
|
||||
<Alert variant="danger" data-testid="permissionDeniedAlert">
|
||||
<FormattedMessage
|
||||
id="authoring.alert.error.permission"
|
||||
defaultMessage="You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access."
|
||||
/>
|
||||
</Alert>
|
||||
const PermissionDeniedAlert = () => (
|
||||
<Alert variant="danger" data-testid="permissionDeniedAlert">
|
||||
<FormattedMessage
|
||||
id="authoring.alert.error.permission"
|
||||
defaultMessage="You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access."
|
||||
/>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
|
||||
export default PermissionDeniedAlert;
|
||||
|
||||
@@ -5,23 +5,21 @@ import { getConfig } from '@edx/frontend-platform';
|
||||
|
||||
import messages from '../messages';
|
||||
|
||||
function SaveFormConnectionErrorAlert({ intl }) {
|
||||
return (
|
||||
<Alert variant="danger" data-testid="connectionErrorAlert">
|
||||
<FormattedMessage
|
||||
id="authoring.alert.save.error.connection"
|
||||
defaultMessage="We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help."
|
||||
values={{
|
||||
const SaveFormConnectionErrorAlert = ({ intl }) => (
|
||||
<Alert variant="danger" data-testid="connectionErrorAlert">
|
||||
<FormattedMessage
|
||||
id="authoring.alert.save.error.connection"
|
||||
defaultMessage="We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help."
|
||||
values={{
|
||||
supportLink: (
|
||||
<Alert.Link href={getConfig().SUPPORT_URL}>
|
||||
{intl.formatMessage(messages.supportText)}
|
||||
</Alert.Link>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</Alert>
|
||||
/>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
|
||||
SaveFormConnectionErrorAlert.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
21
src/head/Head.jsx
Normal file
21
src/head/Head.jsx
Normal file
@@ -0,0 +1,21 @@
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import { getConfig } from '@edx/frontend-platform';
|
||||
|
||||
import messages from './messages';
|
||||
|
||||
const Head = ({ intl }) => (
|
||||
<Helmet>
|
||||
<title>
|
||||
{intl.formatMessage(messages['course-authoring.page.title'], { siteName: getConfig().SITE_NAME })}
|
||||
</title>
|
||||
<link rel="shortcut icon" href={getConfig().FAVICON_URL} type="image/x-icon" />
|
||||
</Helmet>
|
||||
);
|
||||
|
||||
Head.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
};
|
||||
|
||||
export default injectIntl(Head);
|
||||
17
src/head/Head.test.jsx
Normal file
17
src/head/Head.test.jsx
Normal file
@@ -0,0 +1,17 @@
|
||||
import React from 'react';
|
||||
import { IntlProvider } from '@edx/frontend-platform/i18n';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { mount } from 'enzyme';
|
||||
import { getConfig } from '@edx/frontend-platform';
|
||||
import Head from './Head';
|
||||
|
||||
describe('Head', () => {
|
||||
const props = {};
|
||||
it('should match render title tag and favicon with the site configuration values', () => {
|
||||
mount(<IntlProvider locale="en"><Head {...props} /></IntlProvider>);
|
||||
const helmet = Helmet.peek();
|
||||
expect(helmet.title).toEqual(`Course Authoring | ${getConfig().SITE_NAME}`);
|
||||
expect(helmet.linkTags[0].rel).toEqual('shortcut icon');
|
||||
expect(helmet.linkTags[0].href).toEqual(getConfig().FAVICON_URL);
|
||||
});
|
||||
});
|
||||
11
src/head/messages.js
Normal file
11
src/head/messages.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import { defineMessages } from '@edx/frontend-platform/i18n';
|
||||
|
||||
const messages = defineMessages({
|
||||
'course-authoring.page.title': {
|
||||
id: 'course-authoring.page.title',
|
||||
defaultMessage: 'Course Authoring | {siteName}',
|
||||
description: 'Title tag',
|
||||
},
|
||||
});
|
||||
|
||||
export default messages;
|
||||
@@ -1,31 +1,27 @@
|
||||
import arMessages from './messages/ar.json';
|
||||
import caMessages from './messages/ca.json';
|
||||
// no need to import en messages-- they are in the defaultMessage field
|
||||
import es419Messages from './messages/es_419.json';
|
||||
import frMessages from './messages/fr.json';
|
||||
import es419Messages from './messages/es_419.json';
|
||||
import zhcnMessages from './messages/zh_CN.json';
|
||||
import heMessages from './messages/he.json';
|
||||
import idMessages from './messages/id.json';
|
||||
import kokrMessages from './messages/ko_kr.json';
|
||||
import plMessages from './messages/pl.json';
|
||||
import ptbrMessages from './messages/pt_br.json';
|
||||
import ruMessages from './messages/ru.json';
|
||||
import thMessages from './messages/th.json';
|
||||
import ptMessages from './messages/pt.json';
|
||||
import itMessages from './messages/it.json';
|
||||
import ukMessages from './messages/uk.json';
|
||||
import deMessages from './messages/de.json';
|
||||
import ruMessages from './messages/ru.json';
|
||||
import hiMessages from './messages/hi.json';
|
||||
import frCAMessages from './messages/fr_CA.json';
|
||||
// no need to import en messages-- they are in the defaultMessage field
|
||||
|
||||
const messages = {
|
||||
ar: arMessages,
|
||||
'es-419': es419Messages,
|
||||
fr: frMessages,
|
||||
'zh-cn': zhcnMessages,
|
||||
ca: caMessages,
|
||||
he: heMessages,
|
||||
id: idMessages,
|
||||
'ko-kr': kokrMessages,
|
||||
pl: plMessages,
|
||||
'pt-br': ptbrMessages,
|
||||
pt: ptMessages,
|
||||
it: itMessages,
|
||||
de: deMessages,
|
||||
hi: hiMessages,
|
||||
'fr-ca': frCAMessages,
|
||||
ru: ruMessages,
|
||||
th: thMessages,
|
||||
uk: ukMessages,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,52 +1,58 @@
|
||||
{
|
||||
"authoring.alert.error.connection": "We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"authoring.loading": "Loading...",
|
||||
"authoring.alert.error.permission": "You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access.",
|
||||
"authoring.alert.save.error.connection": "We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"authoring.alert.support.text": "Support Page",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Cancel",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Save",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saving": "Saving",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saved": "Saved",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.retry": "Retry",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.enabled": "Enabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.disabled": "Disabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.title": "We couldn't apply your changes.",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.message": "Please check your entries and try again.",
|
||||
"course-authoring.pages-resources.calculator.heading": "Configure calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.label": "Calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.help": "The calculator supports numbers, operators, constants,\n functions, and other mathematical concepts. When enabled, an icon to\n access the calculator appears on all pages in the body of your course.",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.link": "Learn more about the calculator",
|
||||
"authoring.discussions.documentationPage": "Visit the {name} documentation page",
|
||||
"authoring.discussions.formInstructions": "Complete the fields below to set up your discussion tool.",
|
||||
"authoring.discussions.consumerKey": "Consumer Key",
|
||||
"authoring.discussions.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.discussions.consumerSecret": "Consumer Secret",
|
||||
"authoring.discussions.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.discussions.launchUrl": "Launch URL",
|
||||
"authoring.discussions.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.discussions.stuffOnlyConfigInfo": "To enable {providerName} for your course, please contact their support team at {supportEmail} to learn more about pricing and usage.",
|
||||
"authoring.discussions.stuffOnlyConfigGuide": "To fully configure {providerName} will also require sharing usernames and emails for learners and course team. Please contact your edX project coordinator to enable PII sharing for this course.",
|
||||
"authoring.discussions.piiSharing": "Optionally share a user's username and/or email with the LTI provider:",
|
||||
"authoring.discussions.piiShareUsername": "Share username",
|
||||
"authoring.discussions.piiShareEmail": "Share email",
|
||||
"authoring.discussions.appDocInstructions.contact": "Contact: {link}",
|
||||
"authoring.discussions.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.discussions.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.discussions.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.discussions.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.discussions.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.alert.error.connection": "واجهنا خطأ تقنيًا أثناء تحميل هذه الصفحة. قد تكون هذه مشكلة عارضة، لذا يرجى المحاولة مجددًا خلال بضع دقائق. إن استمرت المشكلة فيرجى الذهاب إلى {support_link} للحصول على المساعدة.",
|
||||
"authoring.loading": "التحميل جارٍ...",
|
||||
"authoring.alert.error.permission": "لست مخوّلا بمشاهدة هذه الصفحة. إن كنت ترى أن لديك حقًا في ذلك، فيرجى التواصل مع مدير فريق مساقك ليمنحك حق الوصول.",
|
||||
"authoring.alert.save.error.connection": "واجهنا خطأ تقنيًا أثناء تطبيق التغييرات. قد تكون هذه مشكلة عارضة، لذا يرجى المحاولة مجددًا خلال بضع دقائق. إن استمرت المشكلة فيرجى الذهاب إلى {support_link} للحصول على المساعدة.",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "صفحة الدعم",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "إلغاء",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "حفظ",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saving": "الحفظ جارٍ",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saved": "تم الحفظ",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.retry": "إعادة المحاولة",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.enabled": "مفعّل",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.disabled": "معطل",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.title": "لم نتمكن من تطبيق تغييراتك.",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.message": "رجاءً تحقق من مدخلاتك و حاول مجددًا.",
|
||||
"course-authoring.pages-resources.calculator.heading": "تهيئة الآلة الحاسبة",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.label": "الآلة الحاسبة",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.help": "تقبل الحاسبة الأرقام، العمليات، الثوابت، الدوال، و مفاهيم رياضية أخرى. عند تمكينها، ستظهر أيقونة للوصول إلى الآلة الحاسبة في كل صفحة من متن مساقك.",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.link": "معرفة المزيد عن الآلة الحاسبة",
|
||||
"authoring.discussions.documentationPage": "زيارة صفجة وثائق {name}.",
|
||||
"authoring.discussions.formInstructions": "أكمل الحقول أدناه لتثبيت أداة المناقشة.",
|
||||
"authoring.discussions.consumerKey": "مفتاح المستهلك (Consumer Key)",
|
||||
"authoring.discussions.consumerKey.required": "حقل مفتاح المستهلك مطلوب",
|
||||
"authoring.discussions.consumerSecret": "سر المستهلك (Consumer Secret)",
|
||||
"authoring.discussions.consumerSecret.required": "حقل سر المستهلك مطلوب",
|
||||
"authoring.discussions.launchUrl": "عنوان التشغيل (Launch URL)",
|
||||
"authoring.discussions.launchUrl.required": "حقل تفعيل عنوان التشغيل مطلوب",
|
||||
"authoring.discussions.stuffOnlyConfigInfo": "لتفعيل {providerName} لمساقك، يرجى الاتصال بفريق الدعم الخاص بهم {supportEmail} لمعرفة المزيد حول الأسعار و الاستخدام.",
|
||||
"authoring.discussions.stuffOnlyConfigGuide": "إتمام تهيئة {providerName} يتطلب كذلك مشاركة أسماء المستخدمين و عناوين البريد الإلكتروني الخاصة بالمتعلمي و بفريق المساق. يرجى الاتصال بمنسق مشروعك على edX لتفعيل مشاركة معلومات التعريف الشخصية لهذا المساق.",
|
||||
"authoring.discussions.piiSharing": "شارك اختياريًا اسم المستخدم و / أو بريده الالكتروني مع مزود LTI.",
|
||||
"authoring.discussions.piiShareUsername": "مشاركة اسم المستخدم",
|
||||
"authoring.discussions.piiShareEmail": "مشاركة البريد الإلكتروني",
|
||||
"authoring.discussions.appDocInstructions.contact": "اتصل بـ: {link}",
|
||||
"authoring.discussions.appDocInstructions.documentationLink": "الوثائق العامة",
|
||||
"authoring.discussions.appDocInstructions.accessibilityDocumentationLink": "وثائق قابلية الوصول",
|
||||
"authoring.discussions.appDocInstructions.configurationLink": "وثائق التهيئة",
|
||||
"authoring.discussions.appDocInstructions.learnMoreLink": "معرفة المزيد عن {providerName}",
|
||||
"authoring.discussions.appDocInstructions.linkTextHeading": "مساعدة و وثائق خارجية",
|
||||
"authoring.discussions.appDocInstructions.linkText": "{link}",
|
||||
"authoring.discussions.configurationChangeConsequences": "Students will lose access to any active or previous discussion posts for your course.",
|
||||
"authoring.discussions.configure.app": "Configure {name}",
|
||||
"authoring.discussions.configure": "Configure discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Cancel",
|
||||
"authoring.discussions.confirmConfigurationChange": "Are you sure you want to change the discussion settings?",
|
||||
"authoring.discussions.backButton": "Back",
|
||||
"authoring.discussions.saveButton": "Save",
|
||||
"authoring.discussions.savingButton": "Saving",
|
||||
"authoring.discussions.savedButton": "Saved",
|
||||
"authoring.discussions.configurationChangeConsequences": "سيفقد الطلبة امكانية الوصول لأي منشورات مناقشة حالية أو سابقة في مساقك.",
|
||||
"authoring.discussions.configure.app": "تهيئة {name}",
|
||||
"authoring.discussions.configure": "تهيئة المناقشات",
|
||||
"authoring.discussions.ok": "حسناً",
|
||||
"authoring.discussions.cancel": "إلغاء",
|
||||
"authoring.discussions.confirm": "تأكيد",
|
||||
"authoring.discussions.confirmConfigurationChange": "أمتأكد أنك تريد تغيير إعدادات المناقشة؟",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "هل تريد تفعيل المناقشات على الوحدات في الأقسام الفرعية المنقّطة؟",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "هل تريد تعطيل المناقشات على الوحدات في الأقسام الفرعية المنقّطة؟",
|
||||
"authoring.discussions.confirmEnableDiscussions": "سيؤدي تفعيل هذا الخيار إلى تمكين المناقشة تلقائيًا على جميع وحدات الأقسام الفرعية المنقطّة باستثناء الامتحانات الموقوتة.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "سيؤدي تعطيل هذا الخيار إلى تعطيل المناقشة تلقائيًا في جميع وحدات الأقسام الفرعية المنقّطة. سيتم إدراج مواضيع المناقشة التي تحتوي رسالة واحدة على الأقل ضمن \"المواضيع المؤرشفة\" تحت تبويب المواضيع على صفحة المناقشات.",
|
||||
"authoring.discussions.backButton": "رجوع",
|
||||
"authoring.discussions.saveButton": "حفظ",
|
||||
"authoring.discussions.savingButton": "الحفظ جارٍ",
|
||||
"authoring.discussions.savedButton": "تم الحفظ",
|
||||
"authoring.discussions.appConfigForm.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appConfigForm.appName-yellowdig": "Yellowdig",
|
||||
"authoring.discussions.appConfigForm.appName-inscribe": "InScribe",
|
||||
@@ -54,290 +60,294 @@
|
||||
"authoring.discussions.appConfigForm.appName-ed-discuss": "Ed Discussion",
|
||||
"authoring.discussions.appConfigForm.appName-legacy": "edX",
|
||||
"authoring.discussions.appConfigForm.appName-openedx": "edX",
|
||||
"authoring.discussions.builtIn.divisionByGroup": "Cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.label": "Divide discussions by cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.help": "Learners will only be able to view and respond to discussions posted by members of their cohort.",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.label": "Divide course-wide discussion topics",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choose which of your general course-wide discussion topics you would like to divide.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "General",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions for the TAs",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibility of in-context discussions",
|
||||
"authoring.discussions.builtIn.inContextDiscussion.label": "In-context discussion",
|
||||
"authoring.discussions.builtIn.inContextDiscussion.help": "Learners will be able to view or hide a discussion side panel to engage with discussion on the course unit page.",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Graded unit pages",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Allow learners to engage with discussion on all graded unit pages except timed exams.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Group in context discussion at the subsection level",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.",
|
||||
"authoring.discussions.builtIn.allowUnitLevelVisibility.label": "Allow visibility configuration for each course unit",
|
||||
"authoring.discussions.builtIn.allowUnitLevelVisibility.help": "With this advanced setting enabled you will be able to override the global visibility setting and turn discussions on or off for each unit from the course outline view..",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Anonymous posting",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Allow anonymous discussion posts",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "If enabled, learners can create posts that are anonymous to all users.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.label": "Allow anonymous discussion posts to peers",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.help": "Learners will be able to post anonymously to other peers but all posts will be visible to course staff.",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications": "Notifications",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.label": "Email notifications for reported content",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.help": "Discussion Admins, Moderators, Community TAs and Group Community TAs (only for their own cohort) will receive an email notification when content is reported.",
|
||||
"authoring.discussions.discussionTopics": "Discussion topics",
|
||||
"authoring.discussions.discussionTopics.label": "General discussion topics",
|
||||
"authoring.discussions.discussionTopics.help": "Discussions can include general topics not contained to the course structure. All courses have a general topic by default.",
|
||||
"authoring.discussions.discussionTopic.required": "Topic name is a required field",
|
||||
"authoring.discussions.discussionTopic.alreadyExistError": "It looks like this name is already in use",
|
||||
"authoring.discussions.addTopicButton": "Add topic",
|
||||
"authoring.discussions.deleteButton": "Delete",
|
||||
"authoring.discussions.cancelButton": "Cancel",
|
||||
"authoring.discussions.discussionTopicDeletion.help": "edX recommends that you do not delete discussion topics once your course is running.",
|
||||
"authoring.discussions.discussionTopicDeletion.label": "Delete this topic?",
|
||||
"authoring.discussions.builtIn.renameGeneralTopic.label": "Rename general topic",
|
||||
"authoring.discussions.generalTopicHelp.help": "This is the default discussion topic for your course.",
|
||||
"authoring.discussions.builtIn.configureAdditionalTopic.label": "Configure topic",
|
||||
"authoring.discussions.addTopicHelpText": "Choose a unique name for your topic",
|
||||
"authoring.discussions.blackoutDates": "Discussion blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.label": "Blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.help": "If added, learners will not be able to post in discussions between these dates.",
|
||||
"authoring.discussions.addBlackoutDatesButton": "Add blackout date range",
|
||||
"authoring.discussions.builtIn.configureBlackoutDates.label": "Configure blackout date range",
|
||||
"authoring.discussions.blackoutStartDate.help": "Enter a start date, e.g. 12/10/2023",
|
||||
"authoring.discussions.blackoutEndDate.help": "Enter an end date, e.g. 12/17/2023",
|
||||
"authoring.discussions.blackoutStartTime.help": "Enter a start time, e.g. 09:00 AM",
|
||||
"authoring.discussions.blackoutEndTime.help": "Enter an end time, e.g. 05:00 PM",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.help": "These blackout dates are currently active. If deleted, learners will be able to post in discussions during these dates. Are you sure you want to proceed?",
|
||||
"authoring.discussions.blackoutDatesDeletion.help": "If deleted, learners will be able to post in discussions during these dates.",
|
||||
"authoring.discussions.completeBlackoutDatesDeletion.help": "Are you sure you want to delete these blackout dates?",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.label": "Delete active blackout dates?",
|
||||
"authoring.discussions.blackoutDatesDeletion.label": "Delete blackout dates?",
|
||||
"authoring.blackoutDates.delete": "Delete Blackout Dates",
|
||||
"authoring.discussions.builtIn.divisionByGroup": "الأفواج",
|
||||
"authoring.discussions.builtIn.divideByCohorts.label": "تقسيم المناقشات حسب الأفواج",
|
||||
"authoring.discussions.builtIn.divideByCohorts.help": "سيستطيع المتعلمون القراءة و الرد على المناقشات التي ينشرها أعضاء فوجهم فقط.",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.label": "تقسيم مناقشات المساق العامة",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "اختر من بين مواضيع المناقشة العامة على مستوى مساقك، أي المواضيع تريد أن تقسّم.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "عام",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "أسئلة للأساتذة المساعدين",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "لضبط هذه الإعدادات، قم بتفعيل الأفواج على ",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "لوحة معلومات الأستاذ",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "رؤية المناقشات ذات السياق.",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "تفعيل المناقشات على الوحدات المتواجدة في أقسام فرعية منقّطة",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "السماح للطلاب بالتفاعل مع المناقشات على جميع صفحات الوحدات باستثناء الامتحانات الموقوتة.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "تجميع المناقشات ذات السياق على مستوى الأقسام الفرعية.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "سيستطيع المتعلمون عرض أي منشور في القسم الفرعي بغض النظر عن صفحة الوحدة التي يشاهدونها. رغم أن هذا غير مستحسن، فإنه قد يزيد من المشاركة إن كان مساقك يحتوي على سلاسل تعلبمية قصيرة أو يتضمن أفواجًا صغيرة من المسجلين.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "النشر كمجهول",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "السماح بمنشورات المناقشة مجهولة الكاتب",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "عند التفعيل، سيستطيع الطلاب إنشاء منشورات تبدو لجميع المستخدمين مجهولة الكاتب.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.label": "السماح للأقران بنشر مناقشات مجهولة الكاتب.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.help": "سيستطيع المتعلمون النشر دون الكشف عن هويتهم لأقرانهم، لكن جميع المنشورات ستكون مرئية لطاقم المساق.",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications": "الإشعارات",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.label": "بريد إلكتروني للإشعار بالمحتوى المبلغ عنه",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.help": "سيتلقى مدراء المناقشة، المشرفون، أساتذة المجتمع المساعدون، و أساتذة الفوج المساعدون (فقط في أفواجهم) بريدًا إلكترونيا عند التبليغ عن محتوى.",
|
||||
"authoring.discussions.discussionTopics": "مواضيع المناقشة",
|
||||
"authoring.discussions.discussionTopics.label": "مواضيع المناقشة العامة",
|
||||
"authoring.discussions.discussionTopics.help": "قد تحتوى المناقشات مواضيع عامة ليست ضمن هيكل المساق. لدى جميع المساقات موضوع عام بشكل افتراضي.",
|
||||
"authoring.discussions.discussionTopic.required": "حقل اسم الموضوع مطلوب",
|
||||
"authoring.discussions.discussionTopic.alreadyExistError": "يبدو أن هذا الاسم مستخدم من قبل",
|
||||
"authoring.discussions.addTopicButton": "إضافة موضوع",
|
||||
"authoring.discussions.deleteButton": "حذف",
|
||||
"authoring.discussions.cancelButton": "إلغاء",
|
||||
"authoring.discussions.discussionTopicDeletion.help": "ننصح في edX بعدم حذف مواضيع المناقشة بعد إنطلاق مساقك.",
|
||||
"authoring.discussions.discussionTopicDeletion.label": "هل تريد حذف هذا الموضوع؟",
|
||||
"authoring.discussions.builtIn.renameGeneralTopic.label": "تعديل اسم الموضوع العام",
|
||||
"authoring.discussions.generalTopicHelp.help": "هذا هو موضوع المناقشة الافتراضي لمساقك.",
|
||||
"authoring.discussions.builtIn.configureAdditionalTopic.label": "تهيئة الموضوع",
|
||||
"authoring.discussions.addTopicHelpText": "اختر اسما فريدًا لموضوعك",
|
||||
"authoring.discussions.blackoutDates": "مواعيد تعطيل المناقشة",
|
||||
"authoring.discussions.builtIn.blackoutDates.label": "مواعيد التعطيل",
|
||||
"authoring.discussions.builtIn.blackoutDates.help": "عند الإضافة لن يستطيع المتعلمون النشر في المناقشات بين هذه التواريخ.",
|
||||
"authoring.discussions.addBlackoutDatesButton": "إضافة نطاق زمني للتعطيل",
|
||||
"authoring.discussions.builtIn.configureBlackoutDates.label": "تهيئة النطاق الزمني للتعطيل",
|
||||
"authoring.discussions.blackoutStartDate.help": "أدخل تاريخ بدء، مثلا 12/10/2023",
|
||||
"authoring.discussions.blackoutEndDate.help": "أدخل تاريخ انتهاء، مثلا 12/17/2023",
|
||||
"authoring.discussions.blackoutStartTime.help": "أدخل وقت البدء، مثلا 09:00 صباحًا",
|
||||
"authoring.discussions.blackoutEndTime.help": "أدخل وقت الانتهاء، مثلا 05:00 مساءً",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.help": "مواعيد التعطيل هذه مفعّلة حاليا. إن تم حذفها، فسيستطيع المتعلمون النشر في المناقشات خلال هذه التواريخ. هل انت متأكد أنك تريد المواصلة؟",
|
||||
"authoring.discussions.blackoutDatesDeletion.help": "عند الحذف سيستطيع المتعلمون النشر في المناقشات خلال هذه التواريخ.",
|
||||
"authoring.discussions.completeBlackoutDatesDeletion.help": "هل أنت متأكد أنك تريد حذف تواريخ التعطيل هذه؟",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.label": "هل تريد حذف تواريخ التعطيل المفعّلة؟",
|
||||
"authoring.discussions.blackoutDatesDeletion.label": "هل تريد حذف تواريخ التعطيل؟",
|
||||
"authoring.blackoutDates.delete": "حذف تواريخ التعطيل",
|
||||
"authoring.blackoutDates.status": "{status}",
|
||||
"authoring.blackoutDates.startDate.required": "Start date is a required field",
|
||||
"authoring.blackoutDates.endDate.required": "End date is a required field",
|
||||
"authoring.blackoutDates.startDate.inPast": "Start date cannot be after end date",
|
||||
"authoring.blackoutDates.endDate.inPast": "End date cannot be before start date",
|
||||
"authoring.blackoutDates.startTime.inPast": "Start time cannot be after end time",
|
||||
"authoring.blackoutDates.endTime.inPast": "End time cannot be before start time",
|
||||
"authoring.blackoutDates.startTime.inValidFormat": "Enter a valid start time",
|
||||
"authoring.blackoutDates.endTime.inValidFormat": "Enter a valid end time",
|
||||
"authoring.blackoutDates.startDate.inValidFormat": "Enter a valid start Date",
|
||||
"authoring.blackoutDates.endDate.inValidFormat": "Enter a valid end date",
|
||||
"authoring.topics.delete": "Delete Topic",
|
||||
"authoring.topics.expand": "Expand",
|
||||
"authoring.topics.collapse": "Collapse",
|
||||
"authoring.blackoutDates.start.date": "Start date",
|
||||
"authoring.blackoutDates.start.time": "Start time (optional) ({zone})",
|
||||
"authoring.blackoutDates.end.date": "End date",
|
||||
"authoring.blackoutDates.end.time": "End time (optional) ({zone})",
|
||||
"authoring.discussions.heading": "Select a discussion tool for this course",
|
||||
"authoring.discussions.supportedFeatures": "Supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-show": "Show supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-hide": "Hide supported features",
|
||||
"authoring.discussions.noApps": "There are no discussions providers available for your course.",
|
||||
"authoring.discussions.nextButton": "Next",
|
||||
"authoring.discussions.appFullSupport": "Full support",
|
||||
"authoring.discussions.appBasicSupport": "Basic support",
|
||||
"authoring.discussions.selectApp": "Select {appName}",
|
||||
"authoring.blackoutDates.startDate.required": "حقل تاريخ البدء مطلوب",
|
||||
"authoring.blackoutDates.endDate.required": "حقل تاريخ الانتهاء مطلوب",
|
||||
"authoring.blackoutDates.startDate.inPast": "لا يمكن لتاريخ البدء أن يأتي بعد تاريخ الانتهاء",
|
||||
"authoring.blackoutDates.endDate.inPast": "لا يمكن لتاريخ الانتهاء أن يسبق تاريخ البدء",
|
||||
"authoring.blackoutDates.startTime.inPast": "لا يمكن لوقت البدء أن يأتي بعد وقت الانتهاء",
|
||||
"authoring.blackoutDates.endTime.inPast": "لا يمكن لوقت الانتهاء أن يسبق وقت البدء",
|
||||
"authoring.blackoutDates.startTime.inValidFormat": "أدخل وقت بدء صالحًا",
|
||||
"authoring.blackoutDates.endTime.inValidFormat": "أدخل وقت انتهاء صالحًا",
|
||||
"authoring.blackoutDates.startDate.inValidFormat": "أدخل تاريخ بدء صالحًا",
|
||||
"authoring.blackoutDates.endDate.inValidFormat": "أدخل تاريخ انتهاء صالحًا",
|
||||
"authoring.topics.delete": "حذف الموضوع",
|
||||
"authoring.topics.expand": "توسيع",
|
||||
"authoring.topics.collapse": "طي",
|
||||
"authoring.blackoutDates.start.date": "تاريخ البدء",
|
||||
"authoring.blackoutDates.start.time": "وقت البدء (اختياري) ({zone})",
|
||||
"authoring.blackoutDates.end.date": "تاريخ الانتهاء",
|
||||
"authoring.blackoutDates.end.time": "وقت الانتهاء (اختياري) ({zone})",
|
||||
"authoring.discussions.heading": "حدد أداة مناقشة لهذا المساق.",
|
||||
"authoring.discussions.supportedFeatures": "الميزات المدعومة",
|
||||
"authoring.discussions.supportedFeatureList-mobile-show": "إظهار الميزات المدعومة",
|
||||
"authoring.discussions.supportedFeatureList-mobile-hide": "إخفاء الميزات المدعومة",
|
||||
"authoring.discussions.noApps": "لا يوجد أي مزود مناقشات متوفّر لمساقك.",
|
||||
"authoring.discussions.nextButton": "التالي",
|
||||
"authoring.discussions.appFullSupport": "دعم كامل",
|
||||
"authoring.discussions.appBasicSupport": "دعم قاعدي",
|
||||
"authoring.discussions.selectApp": "اختيار {اسم تطبيق}",
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appDescription-legacy": "ابدأ مناقشات مع متعلمين آخرين، اطرح أسئلة، و تفاعل مع المتعلمين في المساق.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Enable participation in discussion topics alongside course content.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza is designed to connect students, TAs, and professors so every student can get the help they need when they need it.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offers educators a gameful learning digital solution to improve student engagement by building learning communities for any course modality.",
|
||||
"authoring.discussions.appList.appDescription-inscribe": "InScribe leverages the power of community + artificial intelligence to connect individuals to the answers, resources, and people they need to succeed.",
|
||||
"authoring.discussions.appList.appDescription-discourse": "Discourse is modern forum software for your community. Use it as a mailing list, discussion forum, long-form chat room, and more!",
|
||||
"authoring.discussions.appList.appDescription-ed-discus": "Ed Discussion helps scale class communication in a beautiful and intuitive interface. Questions reach and benefit the whole class. Less emails, more time saved.",
|
||||
"authoring.discussions.featureName-discussion-page": "Discussion page",
|
||||
"authoring.discussions.featureName-embedded-course-sections": "Embedded course sections",
|
||||
"authoring.discussions.featureName-advanced-in-context-discussion": "Advanced in context discussion",
|
||||
"authoring.discussions.featureName-anonymous-posting": "Anonymous posting",
|
||||
"authoring.discussions.featureName-automatic-learner-enrollment": "Automatic learner enrollment",
|
||||
"authoring.discussions.featureName-blackout-discussion-dates": "Blackout discussion dates",
|
||||
"authoring.discussions.featureName-community-ta-support": "Community TA support",
|
||||
"authoring.discussions.featureName-course-cohort-support": "Course cohort support",
|
||||
"authoring.discussions.featureName-direct-messages-from-instructors": "Direct messages from instructors",
|
||||
"authoring.discussions.featureName-discussion-content-prompts": "Discussion content prompts",
|
||||
"authoring.discussions.featureName-email-notifications": "Email notifications",
|
||||
"authoring.discussions.featureName-graded-discussions": "Graded discussions",
|
||||
"authoring.discussions.featureName-in-platform-notifications": "In-platform notifications",
|
||||
"authoring.discussions.featureName-internationalization-support": "Internationalization support",
|
||||
"authoring.discussions.featureName-lti-advanced-sharing-mode": "LTI advanced sharing",
|
||||
"authoring.discussions.featureName-basic-configuration": "Basic configuration",
|
||||
"authoring.discussions.featureName-primary-discussion-app-experience": "Primary discussion app experience",
|
||||
"authoring.discussions.featureName-question-&-discussion-support": "Question & discussion support",
|
||||
"authoring.discussions.featureName-report/flag-content-to-moderators": "Report content to moderators",
|
||||
"authoring.discussions.featureName-research-data-events": "Research data events",
|
||||
"authoring.discussions.featureName-simplified-in-context-discussion": "Simplified in-context discussion",
|
||||
"authoring.discussions.featureName-user-mentions": "User mentions",
|
||||
"authoring.discussions.featureName-wcag-2.1": "WCAG 2.1 support",
|
||||
"authoring.discussions.wcag-2.0-support": "WCAG 2.0 support",
|
||||
"authoring.discussions.basic-support": "Basic support",
|
||||
"authoring.discussions.partial-support": "Partial support",
|
||||
"authoring.discussions.full-support": "Full support",
|
||||
"authoring.discussions.common-support": "Commonly requested",
|
||||
"authoring.discussions.settings": "Settings",
|
||||
"authoring.discussions.applyButton": "Apply",
|
||||
"authoring.discussions.applyingButton": "Applying",
|
||||
"authoring.discussions.appliedButton": "Applied",
|
||||
"authoring.discussions.noProviderSwitchAfterCourseStarted": "Discussion provider can't be changed after course has started, please reach out to partner support.",
|
||||
"authoring.discussions.providerSelection": "Provider selection",
|
||||
"authoring.discussions.Incomplete": "Incomplete",
|
||||
"course-authoring.pages-resources.notes.heading": "Configure notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Learners can access their notes either in the body of the\n course of on a notes page. On the notes page, a learner can see all the\n notes made during the course. The page also contains links to the location\n of the notes in the course body.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Learn more about notes",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configure Live",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Schedule meetings and conduct live course sessions with learners.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "Learn more about live",
|
||||
"authoring.live.selectProvider": "Select a video conferencing tool",
|
||||
"authoring.live.formInstructions": "Complete the fields below to set up your video conferencing tool.",
|
||||
"authoring.live.consumerKey": "Consumer Key",
|
||||
"authoring.live.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.live.consumerSecret": "Consumer Secret",
|
||||
"authoring.live.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.live.launchUrl": "Launch URL",
|
||||
"authoring.live.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.live.launchEmail": "Launch Email",
|
||||
"authoring.live.launchEmail.required": "Launch Email is a required field",
|
||||
"authoring.live.provider.helpText": "This configuration will require sharing username and emails of learners and the course team with {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "This configuration will require sharing usernames and emails of learners and the course team with {provider}. To access the LTI configuration for {provider}, please request your edX project coordinator to get PII sharing enabled for this course.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.live.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.live.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.live.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza مصمم لربط الطلبة، الأساتذة، و الأساتذة المساعدين بما يمكن كل طالب من الحصول على المساعدة التي يحتاجها في حينها.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig يقدم للمعلمين حلاً رقميًا تعليميًا ممتعًا لتحسين مشاركة الطلاب من خلال بناء مجتمعات متعلمين لأي نمط مساق. ",
|
||||
"authoring.discussions.appList.appDescription-inscribe": " InScribe يستفيد من قوة المجتمع + الذكاء الاصطناعي لربط الأفراد بالإجابات و الموارد و الأشخاص الذين يحتاجونهم لينجحوا.",
|
||||
"authoring.discussions.appList.appDescription-discourse": "Discourse برنامج منتدى حديث لمجتمعك. استخدمه كقائمة بريدية، كمنتدى مناقشة، كغرفة دردشة طويلة، و أكثر من ذلك!",
|
||||
"authoring.discussions.appList.appDescription-ed-discus": "يساعد Ed Discussion على توسيع نطاق التواصل في الفصل في واجهة جميلة وبديهية. الأسئلة تبلغ و تفيد الفصل بأكمله. قلل من رسائل البريد الإلكتروني و اربح مزيدًا من الوقت.",
|
||||
"authoring.discussions.featureName-discussion-page": "صفحة المناقشة",
|
||||
"authoring.discussions.featureName-embedded-course-sections": "أقسام فرعية للمساق",
|
||||
"authoring.discussions.featureName-advanced-in-context-discussion": "متقدم في المناقشات ذات السياق",
|
||||
"authoring.discussions.featureName-anonymous-posting": "النشر كمجهول",
|
||||
"authoring.discussions.featureName-automatic-learner-enrollment": "تسجيل المتعلمين تلقائيا",
|
||||
"authoring.discussions.featureName-blackout-discussion-dates": "مواعيد تعطيل المناقشة",
|
||||
"authoring.discussions.featureName-community-ta-support": "دعم الأساتذة المساعدين من المجتمع",
|
||||
"authoring.discussions.featureName-course-cohort-support": "دعم أفواج المساق",
|
||||
"authoring.discussions.featureName-direct-messages-from-instructors": "الرسائل المباشرة من الأساتذة",
|
||||
"authoring.discussions.featureName-discussion-content-prompts": "إرشادات عن محتوى المناقشة",
|
||||
"authoring.discussions.featureName-email-notifications": "إشعارات البريد الإلكتروني",
|
||||
"authoring.discussions.featureName-graded-discussions": "المناقشات المنقّطة",
|
||||
"authoring.discussions.featureName-in-platform-notifications": "الإشعارات داخل المنصة",
|
||||
"authoring.discussions.featureName-internationalization-support": "دعم التدويل",
|
||||
"authoring.discussions.featureName-lti-advanced-sharing-mode": "مشاركة LTI متقدمة",
|
||||
"authoring.discussions.featureName-basic-configuration": "التهيئة القاعدية",
|
||||
"authoring.discussions.featureName-primary-discussion-app-experience": "التجربة الأساسية لتطبيق المناقشة",
|
||||
"authoring.discussions.featureName-question-&-discussion-support": "دعم الأسئلة و المناقشات",
|
||||
"authoring.discussions.featureName-report/flag-content-to-moderators": "تبليغ المشرفين عن المحتوى",
|
||||
"authoring.discussions.featureName-research-data-events": "أحداث بيانات البحث",
|
||||
"authoring.discussions.featureName-simplified-in-context-discussion": "مناقشات ذات سياق مبسطة",
|
||||
"authoring.discussions.featureName-user-mentions": "الإشارة للمستخدمين",
|
||||
"authoring.discussions.featureName-wcag-2.1": "دعم WCAG 2.1",
|
||||
"authoring.discussions.wcag-2.0-support": "دعم WCAG 2.0",
|
||||
"authoring.discussions.basic-support": "دعم القاعدي",
|
||||
"authoring.discussions.partial-support": "دعم جزئي",
|
||||
"authoring.discussions.full-support": "دعم كامل",
|
||||
"authoring.discussions.common-support": "مطلوبة بكثرة",
|
||||
"authoring.discussions.settings": "الإعدادات",
|
||||
"authoring.discussions.applyButton": "تقديم طلب",
|
||||
"authoring.discussions.applyingButton": "تقديم الطلب جارٍ",
|
||||
"authoring.discussions.appliedButton": "تم تقديم الطلب",
|
||||
"authoring.discussions.noProviderSwitchAfterCourseStarted": "لا يمكن تغيير مزود المناقشة بعد انطلاق المساق، يرجى التواصل مع دعم الشركاء.",
|
||||
"authoring.discussions.providerSelection": "اختيار المزود",
|
||||
"authoring.discussions.Incomplete": "غير مكتملة",
|
||||
"course-authoring.pages-resources.notes.heading": "تهيئة الملاحظات",
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "الملاحظات",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "يمكن للمتعلمين الوصول إلى ملاحظاتهم إما في متن المساق أو في صفحة الملاحظات. يمكن للمتعلم رؤية جميع الملاحظات التي دونت خلال هذا المساق في صفحة الملاحظات. تحتوي الصفحة كذلك على روابط لمواضع الملاحظات في متن المساق.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "معرفة المزيد عن الملاحظات",
|
||||
"authoring.live.bbb.selectPlan.label": "خدد خطة",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "تهيئة البث المباشر",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "البث المباشر",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "قم بجدولة اجتماعات و نظّم جلسات تدريس مباشرة مع الطلبة.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "معرفة المزيد عن البث المباشر",
|
||||
"authoring.live.selectProvider": "حدد أداة مؤتمرات الفيديو",
|
||||
"authoring.live.formInstructions": "أكمل الحقول أدناه لتثبيت أداة مؤتمرات الفيديو الخاصة بك.",
|
||||
"authoring.live.consumerKey": "مفتاح المستهلك (Consumer Key)",
|
||||
"authoring.live.consumerKey.required": "حقل مفتاح المستهلك مطلوب",
|
||||
"authoring.live.consumerSecret": "سر المستهلك (Consumer Secret)",
|
||||
"authoring.live.consumerSecret.required": "حقل سر المستهلك مطلوب",
|
||||
"authoring.live.launchUrl": "عنوان التشغيل (Launch URL)",
|
||||
"authoring.live.launchUrl.required": "حقل عنوان التشغيل مطلوب",
|
||||
"authoring.live.launchEmail": "عنوان بريد التشغيل الإلكتروني (Launch Email)",
|
||||
"authoring.live.launchEmail.required": "حقل عنوان بريد التشغيل الإلكتروني مطلوب",
|
||||
"authoring.live.provider.helpText": "تتطلب هذه التهيئة مشاركة {providerName} أسماء المستخدمين و عناوين البريد الإلكتروني الخاصة بالمتعلمين و فريق المساق.",
|
||||
"authoring.live.requestPiiSharingEnable": "تتطلب هذه التهيئة مشاركة {provider} أسماء المستخدمين و عناوين البريد الإلكتروني الخاصة بالمتعلمين و فريق المساق. للوصول إلى تهيئة LTI الخاصة بـ{provider}، يرجى الاتصال بمنسق مشروعك على edX لتفعيل مشاركة معلومات التعريف الشخصية لهذا المساق.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "الوثائق العامة",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "وثائق قابلية الوصول",
|
||||
"authoring.live.appDocInstructions.configurationLink": "وثائق التهيئة",
|
||||
"authoring.live.appDocInstructions.learnMoreLink": "معرفة المزيد عن {providerName}",
|
||||
"authoring.live.appDocInstructions.linkTextHeading": "مساعدة و وثائق خارجية",
|
||||
"authoring.live.appDocInstructions.linkText": "{link}",
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Microsoft Teams",
|
||||
"course-authoring.pages-resources.heading": "الصفحات والموارد",
|
||||
"course-authoring.pages-resources.resources.settings.button": "settings",
|
||||
"course-authoring.pages-resources.viewLive.button": "View live",
|
||||
"course-authoring.badge.enabled": "Enabled",
|
||||
"authoring.proctoring.no": "No",
|
||||
"authoring.proctoring.yes": "Yes",
|
||||
"authoring.proctoring.support.text": "Support Page",
|
||||
"authoring.proctoring.enableproctoredexams.label": "Proctored exams",
|
||||
"authoring.proctoring.enableproctoredexams.help": "Enable and configure proctored exams in your course.",
|
||||
"authoring.proctoring.enabled": "Enabled",
|
||||
"authoring.proctoring.learn.more": "Learn more about proctoring",
|
||||
"authoring.proctoring.provider.label": "Proctoring provider",
|
||||
"authoring.proctoring.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.proctoring.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"authoring.proctoring.escalationemail.label": "Proctortrack escalation email",
|
||||
"authoring.proctoring.escalationemail.help": "Provide an email address to be contacted by the support team for escalations (e.g. appeals, delayed reviews).",
|
||||
"authoring.proctoring.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.proctoring.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.proctoring.allowoptout.label": "Allow learners to opt out of proctoring on proctored exams",
|
||||
"authoring.proctoring.createzendesk.label": "Create Zendesk tickets for suspicious attempts",
|
||||
"authoring.proctoring.error.single": "There is 1 error in this form.",
|
||||
"authoring.proctoring.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.proctoring.save": "Save",
|
||||
"authoring.proctoring.saving": "Saving...",
|
||||
"authoring.proctoring.cancel": "Cancel",
|
||||
"authoring.proctoring.studio.link.text": "Go back to your course in Studio",
|
||||
"authoring.proctoring.alert.success": "\n Proctored exam settings saved successfully. {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.alert.error": "\n We encountered a technical error while trying to save proctored exam settings.\n This might be a temporary issue, so please try again in a few minutes.\n If the problem persists,\n please go to the {support_link} for help.\n ",
|
||||
"course-authoring.pages-resources.progress.heading": "Configure progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.label": "Progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.help": "As students work through graded assignments, scores\n will appear under the progress tab. The progress tab contains a chart of\n all graded assignments in the course, with a list of all assignments and\n scores below.",
|
||||
"course-authoring.pages-resources.progress.enable-progress.link": "Learn more about progress",
|
||||
"course-authoring.pages-resources.progress.enable-graph.label": "Enable progress graph",
|
||||
"course-authoring.pages-resources.progress.enable-graph.help": "If enabled, students can view the progress graph",
|
||||
"authoring.pagesAndResources.teams.heading": "Configure teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.label": "Teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.help": "Allow learners to work together on specific projects or activities.",
|
||||
"authoring.pagesAndResources.teams.enableTeams.link": "Learn more about teams",
|
||||
"authoring.pagesAndResources.teams.teamSize.heading": "Team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSize": "Max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeHelp": "The maximum number of learners that can join a team",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeEmpty": "Enter max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeInvalid": "Max team size must be a positive number larger than zero.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeTooHigh": "Max team size cannot be greater than {max}",
|
||||
"authoring.pagesAndResources.teams.groups.heading": "Groups",
|
||||
"authoring.pagesAndResources.teams.groups.help": "Groups are spaces where learners can create or join teams.",
|
||||
"authoring.pagesAndResources.teams.configureGroup.heading": "Configure group",
|
||||
"authoring.pagesAndResources.teams.group.name.label": "Name",
|
||||
"authoring.pagesAndResources.teams.group.name.help": "Choose a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.empty": "Enter a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.exists": "It looks like this name is already in use",
|
||||
"authoring.pagesAndResources.teams.group.description.label": "Description",
|
||||
"authoring.pagesAndResources.teams.group.description.help": "Enter details about this group",
|
||||
"authoring.pagesAndResources.teams.group.description.error": "Enter a description for this group",
|
||||
"authoring.pagesAndResources.teams.group.type.label": "Type",
|
||||
"authoring.pagesAndResources.teams.group.type.help": "Control who can see, create and join teams",
|
||||
"authoring.pagesAndResources.teams.group.types.open": "Open",
|
||||
"authoring.pagesAndResources.teams.group.types.open.description": "Learners can create, join, leave, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed": "Public managed",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed.description": "Only course staff can control teams and memberships. Learners can see other teams.",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed": "Private managed",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed.description": "Only course staff can control teams, memberships, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.label": "Max team size (optional)",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.help": "Override the global max team size",
|
||||
"authoring.pagesAndResources.teams.addGroup.button": "Add group",
|
||||
"authoring.pagesAndResources.teams.group.delete": "Delete",
|
||||
"authoring.pagesAndResources.teams.group.expand": "Expand group editor",
|
||||
"authoring.pagesAndResources.teams.group.collapse": "Close group editor",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.initiateDelete": "Delete",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.cancel-delete.button": "Cancel",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.heading": "Delete this group?",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.body": "edX recommends that you do not delete groups once your course is running.\n Your group will no longer be visible in the LMS and learners will not be able to leave teams associated with it.\n Please delete learners from teams before deleting the associated group.",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.title": "No groups found",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.message": "Add one or more groups to enable teams.",
|
||||
"course-authoring.pages-resources.wiki.heading": "Configure wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.label": "Wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.help": "The course wiki can be set up based on the needs of your\n course. Common uses might include sharing answers to course FAQs, sharing\n editable course information, or providing access to learner-created\n resources.",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.link": "Learn more about the wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.label": "Enable public wiki access",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.help": "If enabled, edX users can view the course wiki even when\n they're not enrolled in the course.",
|
||||
"authoring.examsettings.enableproctoredexams.help": "إذا تم تحديده ، يتم تفعيل الامتحانات المراقبة في مساقك.",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "تتطلب هذه التهيئة مشاركة {provider} أسماء المستخدمين الخاصة بالمتعلمين و فريق المساق.",
|
||||
"authoring.live.piiSharingEnableHelpText": "لتفعيل هذه الميزة، يرجى الاتصال بفريق دعم edX لتفعيل مشاركة معلومات التعريف الشخصية لهذا المساق.",
|
||||
"authoring.live.freePlanMessage": "الخطة المجانية مهيئة سلفًا، ولا حاجة ﻷي تهيئة إضافية. باختيار الخطة المجانية ، فإنك توافق على بنود Blindside Networks الواردة في",
|
||||
"authoring.live.privacyPolicy": "سياسة خصوصيتها.",
|
||||
"course-authoring.pages-resources.heading": "الصفحات و الموارد",
|
||||
"course-authoring.pages-resources.resources.settings.button": "الإعدادات",
|
||||
"course-authoring.pages-resources.viewLive.button": "مشاهدة النسخة الحية",
|
||||
"course-authoring.badge.enabled": "مفعّل",
|
||||
"authoring.proctoring.no": "لا",
|
||||
"authoring.proctoring.yes": "نعم",
|
||||
"authoring.proctoring.support.text": "صفحة الدعم",
|
||||
"authoring.proctoring.enableproctoredexams.label": "الامتحانات المراقبة",
|
||||
"authoring.proctoring.enableproctoredexams.help": "قم بتفعيل و تهيئة الامتحانات المراقبة في مساقك.",
|
||||
"authoring.proctoring.enabled": "مفعّل",
|
||||
"authoring.proctoring.learn.more": "معرفة المزيد عن المراقبة",
|
||||
"authoring.proctoring.provider.label": "مزود المراقبة",
|
||||
"authoring.proctoring.provider.help": "حدد مزود المراقبة الذي تريد استخدامه لهذا المساق.",
|
||||
"authoring.proctoring.provider.help.aftercoursestart": "لا يمكن تعديل مزود المراقبة بعد تاريخ بدء المساق.",
|
||||
"authoring.proctoring.escalationemail.label": "عنوان بريد التصعيد الإلكتروني لـ Proctortrack",
|
||||
"authoring.proctoring.escalationemail.help": "أدخل عنوان بريد إلكتروني لتلقي رسائل التصعيد (مثلا طلبات الاستئناف، المراجعات المتأخرة، و غيرها) من فريق الدعم.",
|
||||
"authoring.proctoring.escalationemail.error.blank": "حقل عنوان بريد التصعيد الإلكتروني لـ Proctortrack لا يمكن أن يكون فارغًا إن كان Proctortrack هو المزود المختار.",
|
||||
"authoring.proctoring.escalationemail.error.invalid": "حقل بريد التصعيد الإلكتروني لـ Proctortrack صيغته خاطئة و هو غير صالح.",
|
||||
"authoring.proctoring.allowoptout.label": "السماح للمتعلمين بعدم الخضوع للمراقبة في الامتحانات المراقَبة",
|
||||
"authoring.proctoring.createzendesk.label": "إنشاء تذاكر Zendesk للمحاولات المشبوهة",
|
||||
"authoring.proctoring.error.single": "يوجد خطأ واحد في هذه الاستمارة.",
|
||||
"authoring.proctoring.escalationemail.error.multiple": "{numOfErrors, plural,\n zero {لا يوجد خطأ}\n one {يوجد خطأ واحد}\n two {يوجد خطآن}\n few {توجد # أخطا}\n many {يوجد # خطأً}\n other {يوجد # خطإٍ}\n} في هذا النموذج.",
|
||||
"authoring.proctoring.save": "حفظ",
|
||||
"authoring.proctoring.saving": "الحفظ جارٍ...",
|
||||
"authoring.proctoring.cancel": "إلغاء",
|
||||
"authoring.proctoring.studio.link.text": "الرجوع إلى مساقك في الاستوديو",
|
||||
"authoring.proctoring.alert.success": "تم حفظ إعدادات الامتحانات المراقبة بنجاح. {studioCourseRunURL}.",
|
||||
"authoring.examsettings.alert.error": "واجهنا خطأ تقنيًا أثناء محاولة حفظ إعدادات الامتحان المراقب. قد تكون هذه مشكلة عارضة، لذا يرجى المحاولة مجددًا خلال بضع دقائق. إن استمرت المشكلة فيرجى الذهاب إلى {support_link} للحصول على المساعدة.",
|
||||
"course-authoring.pages-resources.progress.heading": "تهيئة التقدم",
|
||||
"course-authoring.pages-resources.progress.enable-progress.label": "التقدم",
|
||||
"course-authoring.pages-resources.progress.enable-progress.help": "بينما يعمل الطلاب على واجباتهم المنقّطة، ستظهر الدرجات تحت تبويت التقدم. يحتوي تبويب التقدّم مخططًا لجميع الواجبات المنقّطة في المساق، مع قائمة بجميع الواجبات و الدرجات أدناه.",
|
||||
"course-authoring.pages-resources.progress.enable-progress.link": "معرفة المزيد عن التقدم",
|
||||
"course-authoring.pages-resources.progress.enable-graph.label": "تفعيل مخطط التقدم البياني",
|
||||
"course-authoring.pages-resources.progress.enable-graph.help": "عند التفعيل، سيستطيع الطلاب رؤية مخطط التقدم البياني",
|
||||
"authoring.pagesAndResources.teams.heading": "تهيئة الفِرق",
|
||||
"authoring.pagesAndResources.teams.enableTeams.label": "الفِرق",
|
||||
"authoring.pagesAndResources.teams.enableTeams.help": "تتيح للمتعلمين العمل معًا على مشاريع أو أنشطة محددة.",
|
||||
"authoring.pagesAndResources.teams.enableTeams.link": "معرفة المزيد عن الفِرق",
|
||||
"authoring.pagesAndResources.teams.teamSize.heading": "حجم الفريق",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSize": "الحجم الأقصى للفريق",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeHelp": "العدد الأقصى من المتعلمين القادرين على الانضمام لفريق ما.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeEmpty": "أدخل أقصى حجم للفريق",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeInvalid": "يجب أن يكون الحجم الأقصى للفريق عددًا موجبًا أكبر من الصفر.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeTooHigh": "لا يمكن للحجم الأقصى للفريق أن يفوق {max}",
|
||||
"authoring.pagesAndResources.teams.groups.heading": "المجموعات",
|
||||
"authoring.pagesAndResources.teams.groups.help": "المجموعات فضاءات يمكن للمتعلمين فيها إنشاء فرق أو الانضمام إليها.",
|
||||
"authoring.pagesAndResources.teams.configureGroup.heading": "تهيئة المجموعة",
|
||||
"authoring.pagesAndResources.teams.group.name.label": "الاسم",
|
||||
"authoring.pagesAndResources.teams.group.name.help": "اختر اسمًا فريدًا لهذه المجموعة",
|
||||
"authoring.pagesAndResources.teams.group.name.error.empty": "أدخل اسمًا فريدًا لهذه المجموعة",
|
||||
"authoring.pagesAndResources.teams.group.name.error.exists": "يبدو أن هذا الاسم مستخدم من قبل",
|
||||
"authoring.pagesAndResources.teams.group.description.label": "الوصف",
|
||||
"authoring.pagesAndResources.teams.group.description.help": "أدخل تفاصيل عن هذه المجموعة",
|
||||
"authoring.pagesAndResources.teams.group.description.error": "أدخل وصفا لهذه المجموعة",
|
||||
"authoring.pagesAndResources.teams.group.type.label": "النوع",
|
||||
"authoring.pagesAndResources.teams.group.type.help": "تحكم في من يستطيع رؤية و إنشاء الفرق و الانضمام إليها.",
|
||||
"authoring.pagesAndResources.teams.group.types.open": "مفتوحة",
|
||||
"authoring.pagesAndResources.teams.group.types.open.description": "يستطيع المتعلمون إنشاء فرق، الانضمام للفرق و مغادرتها، و أيضا مشاهدة الفرق الأخرى",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed": "عامة خاضعة للإدارة",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed.description": "وحده طاقم المساق مخول بالتحكم في الفرق و العضويات. يمكن للمتعلمين رؤية الفرق الأخرى.",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed": "خاصة خاضعة للإدارة",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed.description": "وحده طاقم المساق مخول بالتحكم في الفرق و العضويات و كذا رؤية الفرق الأخرى.",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.label": "الحجم الأقصى للفريق (اختياري)",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.help": "تجاوز الحجم الأقصى العام للفريق",
|
||||
"authoring.pagesAndResources.teams.addGroup.button": "إضافة مجموعة",
|
||||
"authoring.pagesAndResources.teams.group.delete": "حذف",
|
||||
"authoring.pagesAndResources.teams.group.expand": "توسيع محرر المجموعة",
|
||||
"authoring.pagesAndResources.teams.group.collapse": "إغلاق محرر المجموعة",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.initiateDelete": "حذف",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.cancel-delete.button": "إلغاء",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.heading": "هل تريد حذف هذه المجموعة؟",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.body": "ننصح في edX بعدم حذف المجموعات بعد انطلاق مساقك. حينها لن تكون مجموعتك مرئية في LMS و لن يستطيع المتعلمون مغادرة الفرق المرتبطة بها. يرجى حذف المتعلمين من الفرق قبل حذف المجموعة المرتبطة بها.",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.title": "لا توجد مجموعات",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.message": "أضف مجموعة واحدة أو أكثر لتمكين الفرق.",
|
||||
"course-authoring.pages-resources.wiki.heading": "تهيئة الويكي",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.label": "الويكي",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.help": "يمكن تهيئة الويكي بناءً على احتياجات المساق. من بين الاستخدامات الشائعة: مشاركة اجوبة الأسئلة الشائعة في المساق، مشاركة معلومات المساق القابلة للتعديل، و إتاحة الوصول إلى الموارد التي ينشئها المتعلمون.",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.link": "معرفة المزيد عن الويكي",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.label": "تفعيل الوصول العام",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.help": "إن تم التفعيل، فسيستطيع مستخدمو edX عرض ويكي المساق حتى وإن كانوا غير مسجلين في المساق.",
|
||||
"authoring.examsettings.enableproctoredexams.help": "في حال التأشير، يتم تفعيل الامتحانات المراقبة في مساقك.",
|
||||
"authoring.examsettings.allowoptout.label": "السماح بالخروج من الامتحانات المُراقبة",
|
||||
"authoring.examsettings.allowoptout.help": "\n If this value is \"Yes\", learners can choose to take proctored exams without proctoring.\n If this value is \"No\", all learners must take the exam with proctoring.\n ",
|
||||
"authoring.examsettings.allowoptout.help": "\nإن كانت هذه القيمة \"نعم\"، فيمكن للمتعلمبن أن يختاروا اجتياز الامتحان المراقب من غير مراقبة.\nإن كانت هذه القيمة \"لا\"، فسيكون عن جميع المتعلمين اجتياز الامتحان بالمراقبة.",
|
||||
"authoring.examsettings.provider.label": "موفر المراقبة",
|
||||
"authoring.examsettings.escalationemail.label": "البريد الإلكتروني لتصعيد مسار المراقبة",
|
||||
"authoring.examsettings.escalationemail.help": "\n Required if \"proctortrack\" is selected as your proctoring provider. Enter an email address to be\n contacted by the support team whenever there are escalations (e.g. appeals, delayed reviews, etc.).\n ",
|
||||
"authoring.examsettings.escalationemail.help": "\nمطلوب إن تم تحديد \"Proctortrack\" كمزود المراقبة الخاص بك. أدخل عنوان بريد إلكتروني كي يتصل بك فريق الدعم حينما يكون هنالك تصعيد (مثلا: طلبات الاستئناف و المراجعات المتأخرة، و غيرها) من فريق الدعم.",
|
||||
"authoring.examsettings.createzendesk.label": "أنشئ تذاكر Zendesk لمحاولات الاختبار المشبوهة",
|
||||
"authoring.examsettings.createzendesk.help": "إذا كانت هذه القيمة \"نعم\"، فسيتم إنشاء تذكرة Zendesk لمحاولات الاختبار المراقبة المشتبه فيها.",
|
||||
"authoring.examsettings.submit": "إرسال",
|
||||
"authoring.examsettings.alert.success": "\nتم حفظ إعدادات الاختبار Proctored بنجاح.\nيمكنك العودة إلى مقرّرك التعليمي في الاستوديو {studioCourseRunURL}",
|
||||
"authoring.examsettings.alert.success": "\nتم حفظ إعدادات الاختبار Proctored بنجاح.\nيمكنك الرجوع إلى مساقك في الاستوديو {studioCourseRunURL}.",
|
||||
"authoring.examsettings.allowoptout.no": "لا",
|
||||
"authoring.examsettings.allowoptout.yes": "نعم",
|
||||
"authoring.examsettings.createzendesk.no": "لا",
|
||||
"authoring.examsettings.createzendesk.yes": "نعم",
|
||||
"authoring.examsettings.support.text": "Support Page",
|
||||
"authoring.examsettings.support.text": "صفحة الدعم",
|
||||
"authoring.examsettings.escalationemail.enableproctoredexams.label": "تفعيل الامتحانات المراقَبة",
|
||||
"authoring.examsettings.escalationemail.error.blank": "لا يمكن أن يكون حقل البريد الإلكتروني الخاص بتصعيد ProctorTrack فارغًا إذا كانمسار المراقبة هو المزود المحدد.",
|
||||
"authoring.examsettings.escalationemail.error.invalid": "إن حقل البريد الإلكتروني للتصعيد في مسار المراقبة بتنسيق غير صحيح وغير صالح.",
|
||||
"authoring.examsettings.error.single": "يوجد خطأ واحد في هذا النموذج.",
|
||||
"authoring.examsettings.escalationemail.error.multiple": "يوجد {numOfErrors} خطأ في هذا النموذج.",
|
||||
"authoring.examsettings.provider.help": "حدد مزود المراقبة الذي تريد استخدامه لتشغيل هذا المساق.",
|
||||
"authoring.examsettings.escalationemail.error.multiple": "{numOfErrors, plural,\nzero {لا يوجد خطأ}\none {يوجد خطأ واحد}\ntwo {يوجد خطآن}\nfew {توجد # أخطا}\nmany {يوجد # خطأً}\nother {يوجد # خطإٍ}\n} في هذا النموذج.",
|
||||
"authoring.examsettings.provider.help": "حدد مزود المراقبة الذي تريد استخدامه لطبعة المساق هذه.",
|
||||
"authoring.examsettings.provider.help.aftercoursestart": "لا يمكن تعديل مزود المعالجة بعد تاريخ بدء المساق.",
|
||||
"header.links.content": "المحتوى",
|
||||
"header.links.settings": "إعدادات الحساب",
|
||||
"header.links.settings": "الإعدادات",
|
||||
"header.links.content.tools": "الأدوات",
|
||||
"header.links.outline": "المخطّط الكلّي",
|
||||
"header.links.outline": "المخطط الكلّي",
|
||||
"header.links.updates": "التحديثات",
|
||||
"header.links.pages": "Pages & Resources",
|
||||
"header.links.filesAndUploads": "الملفات والتحميل ",
|
||||
"header.links.pages": "الصفحات و الموارد",
|
||||
"header.links.filesAndUploads": "الملفات و التحميل ",
|
||||
"header.links.textbooks": "الكتب",
|
||||
"header.links.videoUploads": "تحميلات الفيديو",
|
||||
"header.links.scheduleAndDetails": "وضع جدول لوحدة",
|
||||
"header.links.grading": "التقييم",
|
||||
"header.links.videoUploads": "الفيديوهات المرفوعة",
|
||||
"header.links.scheduleAndDetails": "المواعيد و التفاصيل",
|
||||
"header.links.grading": "التنقيط",
|
||||
"header.links.courseTeam": "فريق المساق",
|
||||
"header.links.groupConfigurations": "إعدادات المجموعة",
|
||||
"header.links.proctoredExamSettings": "إعدادات الامتحان المراقب",
|
||||
"header.links.groupConfigurations": "تهيئة المجموعات",
|
||||
"header.links.proctoredExamSettings": "إعدادات الامتحانات المراقبة",
|
||||
"header.links.advancedSettings": "الإعدادات المتقدمة",
|
||||
"header.links.certificates": "الشهادات",
|
||||
"header.links.publisher": "ناشر",
|
||||
"header.links.import": "استيراد",
|
||||
"header.links.export": "تصدير",
|
||||
"header.links.checklists": "قوائم المراجعة",
|
||||
"header.user.menu.studio": "صفحة استوديو الرئيسية",
|
||||
"header.user.menu.maintenance": "صيانة",
|
||||
"header.user.menu.logout": "خروج",
|
||||
"header.links.publisher": "الناشر",
|
||||
"header.links.import": "الاستيراد",
|
||||
"header.links.export": "التصدير",
|
||||
"header.links.checklists": "قوائم التدقيق",
|
||||
"header.user.menu.studio": "صفحة الاستوديو الرئيسية",
|
||||
"header.user.menu.maintenance": "الصيانة",
|
||||
"header.user.menu.logout": "تسجيل الخروج",
|
||||
"header.label.account.menu": "قائمة الحساب",
|
||||
"header.label.account.menu.for": "قائمة الحساب للمستخدم {username}",
|
||||
"header.label.main.nav": "الرئيسية",
|
||||
"header.label.main.menu": "القائمة الرئيسية",
|
||||
"header.label.main.header": "الرئيسية",
|
||||
"header.label.secondary.nav": "ثانوي",
|
||||
"header.label.courseOutline": "العودة إلى مخطط المساق في استوديو"
|
||||
"header.label.secondary.nav": "الثانوية",
|
||||
"header.label.courseOutline": "الرجوع إلى مخطط المساق الكلّي في الاستوديو"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
353
src/i18n/messages/de.json
Normal file
353
src/i18n/messages/de.json
Normal file
@@ -0,0 +1,353 @@
|
||||
{
|
||||
"authoring.alert.error.connection": "We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"authoring.loading": "Loading...",
|
||||
"authoring.alert.error.permission": "You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access.",
|
||||
"authoring.alert.save.error.connection": "We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "Support Page",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Cancel",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Save",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saving": "Saving",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saved": "Saved",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.retry": "Retry",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.enabled": "Enabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.disabled": "Disabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.title": "We couldn't apply your changes.",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.message": "Please check your entries and try again.",
|
||||
"course-authoring.pages-resources.calculator.heading": "Configure calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.label": "Calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.help": "The calculator supports numbers, operators, constants,\n functions, and other mathematical concepts. When enabled, an icon to\n access the calculator appears on all pages in the body of your course.",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.link": "Learn more about the calculator",
|
||||
"authoring.discussions.documentationPage": "Visit the {name} documentation page",
|
||||
"authoring.discussions.formInstructions": "Complete the fields below to set up your discussion tool.",
|
||||
"authoring.discussions.consumerKey": "Consumer Key",
|
||||
"authoring.discussions.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.discussions.consumerSecret": "Consumer Secret",
|
||||
"authoring.discussions.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.discussions.launchUrl": "Launch URL",
|
||||
"authoring.discussions.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.discussions.stuffOnlyConfigInfo": "To enable {providerName} for your course, please contact their support team at {supportEmail} to learn more about pricing and usage.",
|
||||
"authoring.discussions.stuffOnlyConfigGuide": "To fully configure {providerName} will also require sharing usernames and emails for learners and course team. Please contact your edX project coordinator to enable PII sharing for this course.",
|
||||
"authoring.discussions.piiSharing": "Optionally share a user's username and/or email with the LTI provider:",
|
||||
"authoring.discussions.piiShareUsername": "Share username",
|
||||
"authoring.discussions.piiShareEmail": "Share email",
|
||||
"authoring.discussions.appDocInstructions.contact": "Contact: {link}",
|
||||
"authoring.discussions.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.discussions.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.discussions.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.discussions.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.discussions.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.discussions.appDocInstructions.linkText": "{link}",
|
||||
"authoring.discussions.configurationChangeConsequences": "Students will lose access to any active or previous discussion posts for your course.",
|
||||
"authoring.discussions.configure.app": "Configure {name}",
|
||||
"authoring.discussions.configure": "Configure discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Cancel",
|
||||
"authoring.discussions.confirm": "Confirm",
|
||||
"authoring.discussions.confirmConfigurationChange": "Are you sure you want to change the discussion settings?",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "Enable discussions on units in graded subsections?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "Disable discussions on units in graded subsections?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.",
|
||||
"authoring.discussions.backButton": "Back",
|
||||
"authoring.discussions.saveButton": "Save",
|
||||
"authoring.discussions.savingButton": "Saving",
|
||||
"authoring.discussions.savedButton": "Saved",
|
||||
"authoring.discussions.appConfigForm.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appConfigForm.appName-yellowdig": "Yellowdig",
|
||||
"authoring.discussions.appConfigForm.appName-inscribe": "InScribe",
|
||||
"authoring.discussions.appConfigForm.appName-discourse": "Discourse",
|
||||
"authoring.discussions.appConfigForm.appName-ed-discuss": "Ed Discussion",
|
||||
"authoring.discussions.appConfigForm.appName-legacy": "edX",
|
||||
"authoring.discussions.appConfigForm.appName-openedx": "edX",
|
||||
"authoring.discussions.builtIn.divisionByGroup": "Cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.label": "Divide discussions by cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.help": "Learners will only be able to view and respond to discussions posted by members of their cohort.",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.label": "Divide course-wide discussion topics",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choose which of your general course-wide discussion topics you would like to divide.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "General",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions for the TAs",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "To adjust these settings, enable cohorts on the ",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "instructor dashboard",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibility of in-context discussions",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Enable discussions on units in graded subsections",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Allow learners to engage with discussion on all graded unit pages except timed exams.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Group in context discussion at the subsection level",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Anonymous posting",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Allow anonymous discussion posts",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "If enabled, learners can create posts that are anonymous to all users.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.label": "Allow anonymous discussion posts to peers",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.help": "Learners will be able to post anonymously to other peers but all posts will be visible to course staff.",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications": "Notifications",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.label": "Email notifications for reported content",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.help": "Discussion Admins, Moderators, Community TAs and Group Community TAs (only for their own cohort) will receive an email notification when content is reported.",
|
||||
"authoring.discussions.discussionTopics": "Discussion topics",
|
||||
"authoring.discussions.discussionTopics.label": "General discussion topics",
|
||||
"authoring.discussions.discussionTopics.help": "Discussions can include general topics not contained to the course structure. All courses have a general topic by default.",
|
||||
"authoring.discussions.discussionTopic.required": "Topic name is a required field",
|
||||
"authoring.discussions.discussionTopic.alreadyExistError": "It looks like this name is already in use",
|
||||
"authoring.discussions.addTopicButton": "Add topic",
|
||||
"authoring.discussions.deleteButton": "Delete",
|
||||
"authoring.discussions.cancelButton": "Cancel",
|
||||
"authoring.discussions.discussionTopicDeletion.help": "edX recommends that you do not delete discussion topics once your course is running.",
|
||||
"authoring.discussions.discussionTopicDeletion.label": "Delete this topic?",
|
||||
"authoring.discussions.builtIn.renameGeneralTopic.label": "Rename general topic",
|
||||
"authoring.discussions.generalTopicHelp.help": "This is the default discussion topic for your course.",
|
||||
"authoring.discussions.builtIn.configureAdditionalTopic.label": "Configure topic",
|
||||
"authoring.discussions.addTopicHelpText": "Choose a unique name for your topic",
|
||||
"authoring.discussions.blackoutDates": "Discussion blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.label": "Blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.help": "If added, learners will not be able to post in discussions between these dates.",
|
||||
"authoring.discussions.addBlackoutDatesButton": "Add blackout date range",
|
||||
"authoring.discussions.builtIn.configureBlackoutDates.label": "Configure blackout date range",
|
||||
"authoring.discussions.blackoutStartDate.help": "Enter a start date, e.g. 12/10/2023",
|
||||
"authoring.discussions.blackoutEndDate.help": "Enter an end date, e.g. 12/17/2023",
|
||||
"authoring.discussions.blackoutStartTime.help": "Enter a start time, e.g. 09:00 AM",
|
||||
"authoring.discussions.blackoutEndTime.help": "Enter an end time, e.g. 05:00 PM",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.help": "These blackout dates are currently active. If deleted, learners will be able to post in discussions during these dates. Are you sure you want to proceed?",
|
||||
"authoring.discussions.blackoutDatesDeletion.help": "If deleted, learners will be able to post in discussions during these dates.",
|
||||
"authoring.discussions.completeBlackoutDatesDeletion.help": "Are you sure you want to delete these blackout dates?",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.label": "Delete active blackout dates?",
|
||||
"authoring.discussions.blackoutDatesDeletion.label": "Delete blackout dates?",
|
||||
"authoring.blackoutDates.delete": "Delete Blackout Dates",
|
||||
"authoring.blackoutDates.status": "{status}",
|
||||
"authoring.blackoutDates.startDate.required": "Start date is a required field",
|
||||
"authoring.blackoutDates.endDate.required": "End date is a required field",
|
||||
"authoring.blackoutDates.startDate.inPast": "Start date cannot be after end date",
|
||||
"authoring.blackoutDates.endDate.inPast": "End date cannot be before start date",
|
||||
"authoring.blackoutDates.startTime.inPast": "Start time cannot be after end time",
|
||||
"authoring.blackoutDates.endTime.inPast": "End time cannot be before start time",
|
||||
"authoring.blackoutDates.startTime.inValidFormat": "Enter a valid start time",
|
||||
"authoring.blackoutDates.endTime.inValidFormat": "Enter a valid end time",
|
||||
"authoring.blackoutDates.startDate.inValidFormat": "Enter a valid start Date",
|
||||
"authoring.blackoutDates.endDate.inValidFormat": "Enter a valid end date",
|
||||
"authoring.topics.delete": "Delete Topic",
|
||||
"authoring.topics.expand": "Expand",
|
||||
"authoring.topics.collapse": "Collapse",
|
||||
"authoring.blackoutDates.start.date": "Start date",
|
||||
"authoring.blackoutDates.start.time": "Start time (optional) ({zone})",
|
||||
"authoring.blackoutDates.end.date": "End date",
|
||||
"authoring.blackoutDates.end.time": "End time (optional) ({zone})",
|
||||
"authoring.discussions.heading": "Select a discussion tool for this course",
|
||||
"authoring.discussions.supportedFeatures": "Supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-show": "Show supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-hide": "Hide supported features",
|
||||
"authoring.discussions.noApps": "There are no discussions providers available for your course.",
|
||||
"authoring.discussions.nextButton": "Next",
|
||||
"authoring.discussions.appFullSupport": "Full support",
|
||||
"authoring.discussions.appBasicSupport": "Basic support",
|
||||
"authoring.discussions.selectApp": "Select {appName}",
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Enable participation in discussion topics alongside course content.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza is designed to connect students, TAs, and professors so every student can get the help they need when they need it.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offers educators a gameful learning digital solution to improve student engagement by building learning communities for any course modality.",
|
||||
"authoring.discussions.appList.appDescription-inscribe": "InScribe leverages the power of community + artificial intelligence to connect individuals to the answers, resources, and people they need to succeed.",
|
||||
"authoring.discussions.appList.appDescription-discourse": "Discourse is modern forum software for your community. Use it as a mailing list, discussion forum, long-form chat room, and more!",
|
||||
"authoring.discussions.appList.appDescription-ed-discus": "Ed Discussion helps scale class communication in a beautiful and intuitive interface. Questions reach and benefit the whole class. Less emails, more time saved.",
|
||||
"authoring.discussions.featureName-discussion-page": "Discussion page",
|
||||
"authoring.discussions.featureName-embedded-course-sections": "Embedded course sections",
|
||||
"authoring.discussions.featureName-advanced-in-context-discussion": "Advanced in context discussion",
|
||||
"authoring.discussions.featureName-anonymous-posting": "Anonymous posting",
|
||||
"authoring.discussions.featureName-automatic-learner-enrollment": "Automatic learner enrollment",
|
||||
"authoring.discussions.featureName-blackout-discussion-dates": "Blackout discussion dates",
|
||||
"authoring.discussions.featureName-community-ta-support": "Community TA support",
|
||||
"authoring.discussions.featureName-course-cohort-support": "Course cohort support",
|
||||
"authoring.discussions.featureName-direct-messages-from-instructors": "Direct messages from instructors",
|
||||
"authoring.discussions.featureName-discussion-content-prompts": "Discussion content prompts",
|
||||
"authoring.discussions.featureName-email-notifications": "Email notifications",
|
||||
"authoring.discussions.featureName-graded-discussions": "Graded discussions",
|
||||
"authoring.discussions.featureName-in-platform-notifications": "In-platform notifications",
|
||||
"authoring.discussions.featureName-internationalization-support": "Internationalization support",
|
||||
"authoring.discussions.featureName-lti-advanced-sharing-mode": "LTI advanced sharing",
|
||||
"authoring.discussions.featureName-basic-configuration": "Basic configuration",
|
||||
"authoring.discussions.featureName-primary-discussion-app-experience": "Primary discussion app experience",
|
||||
"authoring.discussions.featureName-question-&-discussion-support": "Question & discussion support",
|
||||
"authoring.discussions.featureName-report/flag-content-to-moderators": "Report content to moderators",
|
||||
"authoring.discussions.featureName-research-data-events": "Research data events",
|
||||
"authoring.discussions.featureName-simplified-in-context-discussion": "Simplified in-context discussion",
|
||||
"authoring.discussions.featureName-user-mentions": "User mentions",
|
||||
"authoring.discussions.featureName-wcag-2.1": "WCAG 2.1 support",
|
||||
"authoring.discussions.wcag-2.0-support": "WCAG 2.0 support",
|
||||
"authoring.discussions.basic-support": "Basic support",
|
||||
"authoring.discussions.partial-support": "Partial support",
|
||||
"authoring.discussions.full-support": "Full support",
|
||||
"authoring.discussions.common-support": "Commonly requested",
|
||||
"authoring.discussions.settings": "Settings",
|
||||
"authoring.discussions.applyButton": "Apply",
|
||||
"authoring.discussions.applyingButton": "Applying",
|
||||
"authoring.discussions.appliedButton": "Applied",
|
||||
"authoring.discussions.noProviderSwitchAfterCourseStarted": "Discussion provider can't be changed after course has started, please reach out to partner support.",
|
||||
"authoring.discussions.providerSelection": "Provider selection",
|
||||
"authoring.discussions.Incomplete": "Incomplete",
|
||||
"course-authoring.pages-resources.notes.heading": "Configure notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Learners can access their notes either in the body of the\n course of on a notes page. On the notes page, a learner can see all the\n notes made during the course. The page also contains links to the location\n of the notes in the course body.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Learn more about notes",
|
||||
"authoring.live.bbb.selectPlan.label": "Select a plan",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configure Live",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Schedule meetings and conduct live course sessions with learners.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "Learn more about live",
|
||||
"authoring.live.selectProvider": "Select a video conferencing tool",
|
||||
"authoring.live.formInstructions": "Complete the fields below to set up your video conferencing tool.",
|
||||
"authoring.live.consumerKey": "Consumer Key",
|
||||
"authoring.live.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.live.consumerSecret": "Consumer Secret",
|
||||
"authoring.live.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.live.launchUrl": "Launch URL",
|
||||
"authoring.live.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.live.launchEmail": "Launch Email",
|
||||
"authoring.live.launchEmail.required": "Launch Email is a required field",
|
||||
"authoring.live.provider.helpText": "This configuration will require sharing username and emails of learners and the course team with {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "This configuration will require sharing usernames and emails of learners and the course team with {provider}. To access the LTI configuration for {provider}, please request your edX project coordinator to get PII sharing enabled for this course.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.live.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.live.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.live.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.live.appDocInstructions.linkText": "{link}",
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Microsoft Teams",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "This configuration will require sharing usernames of learners and the course team with {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "To enable this feature, contact your edX support team to enable PII sharing for this course.",
|
||||
"authoring.live.freePlanMessage": "The free plan is pre-configured, and no additional configurations are required. By selecting the free plan, you are agreeing to Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Privacy Policy.",
|
||||
"course-authoring.pages-resources.heading": "Pages & Resources",
|
||||
"course-authoring.pages-resources.resources.settings.button": "settings",
|
||||
"course-authoring.pages-resources.viewLive.button": "View live",
|
||||
"course-authoring.badge.enabled": "Enabled",
|
||||
"authoring.proctoring.no": "No",
|
||||
"authoring.proctoring.yes": "Yes",
|
||||
"authoring.proctoring.support.text": "Support Page",
|
||||
"authoring.proctoring.enableproctoredexams.label": "Proctored exams",
|
||||
"authoring.proctoring.enableproctoredexams.help": "Enable and configure proctored exams in your course.",
|
||||
"authoring.proctoring.enabled": "Enabled",
|
||||
"authoring.proctoring.learn.more": "Learn more about proctoring",
|
||||
"authoring.proctoring.provider.label": "Proctoring provider",
|
||||
"authoring.proctoring.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.proctoring.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"authoring.proctoring.escalationemail.label": "Proctortrack escalation email",
|
||||
"authoring.proctoring.escalationemail.help": "Provide an email address to be contacted by the support team for escalations (e.g. appeals, delayed reviews).",
|
||||
"authoring.proctoring.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.proctoring.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.proctoring.allowoptout.label": "Allow learners to opt out of proctoring on proctored exams",
|
||||
"authoring.proctoring.createzendesk.label": "Create Zendesk tickets for suspicious attempts",
|
||||
"authoring.proctoring.error.single": "There is 1 error in this form.",
|
||||
"authoring.proctoring.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.proctoring.save": "Save",
|
||||
"authoring.proctoring.saving": "Saving...",
|
||||
"authoring.proctoring.cancel": "Cancel",
|
||||
"authoring.proctoring.studio.link.text": "Go back to your course in Studio",
|
||||
"authoring.proctoring.alert.success": "\n Proctored exam settings saved successfully. {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.alert.error": "\n We encountered a technical error while trying to save proctored exam settings.\n This might be a temporary issue, so please try again in a few minutes.\n If the problem persists,\n please go to the {support_link} for help.\n ",
|
||||
"course-authoring.pages-resources.progress.heading": "Configure progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.label": "Progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.help": "As students work through graded assignments, scores\n will appear under the progress tab. The progress tab contains a chart of\n all graded assignments in the course, with a list of all assignments and\n scores below.",
|
||||
"course-authoring.pages-resources.progress.enable-progress.link": "Learn more about progress",
|
||||
"course-authoring.pages-resources.progress.enable-graph.label": "Enable progress graph",
|
||||
"course-authoring.pages-resources.progress.enable-graph.help": "If enabled, students can view the progress graph",
|
||||
"authoring.pagesAndResources.teams.heading": "Configure teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.label": "Teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.help": "Allow learners to work together on specific projects or activities.",
|
||||
"authoring.pagesAndResources.teams.enableTeams.link": "Learn more about teams",
|
||||
"authoring.pagesAndResources.teams.teamSize.heading": "Team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSize": "Max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeHelp": "The maximum number of learners that can join a team",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeEmpty": "Enter max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeInvalid": "Max team size must be a positive number larger than zero.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeTooHigh": "Max team size cannot be greater than {max}",
|
||||
"authoring.pagesAndResources.teams.groups.heading": "Groups",
|
||||
"authoring.pagesAndResources.teams.groups.help": "Groups are spaces where learners can create or join teams.",
|
||||
"authoring.pagesAndResources.teams.configureGroup.heading": "Configure group",
|
||||
"authoring.pagesAndResources.teams.group.name.label": "Name",
|
||||
"authoring.pagesAndResources.teams.group.name.help": "Choose a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.empty": "Enter a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.exists": "It looks like this name is already in use",
|
||||
"authoring.pagesAndResources.teams.group.description.label": "Description",
|
||||
"authoring.pagesAndResources.teams.group.description.help": "Enter details about this group",
|
||||
"authoring.pagesAndResources.teams.group.description.error": "Enter a description for this group",
|
||||
"authoring.pagesAndResources.teams.group.type.label": "Type",
|
||||
"authoring.pagesAndResources.teams.group.type.help": "Control who can see, create and join teams",
|
||||
"authoring.pagesAndResources.teams.group.types.open": "Open",
|
||||
"authoring.pagesAndResources.teams.group.types.open.description": "Learners can create, join, leave, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed": "Public managed",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed.description": "Only course staff can control teams and memberships. Learners can see other teams.",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed": "Private managed",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed.description": "Only course staff can control teams, memberships, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.label": "Max team size (optional)",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.help": "Override the global max team size",
|
||||
"authoring.pagesAndResources.teams.addGroup.button": "Add group",
|
||||
"authoring.pagesAndResources.teams.group.delete": "Delete",
|
||||
"authoring.pagesAndResources.teams.group.expand": "Expand group editor",
|
||||
"authoring.pagesAndResources.teams.group.collapse": "Close group editor",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.initiateDelete": "Delete",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.cancel-delete.button": "Cancel",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.heading": "Delete this group?",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.body": "edX recommends that you do not delete groups once your course is running.\n Your group will no longer be visible in the LMS and learners will not be able to leave teams associated with it.\n Please delete learners from teams before deleting the associated group.",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.title": "No groups found",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.message": "Add one or more groups to enable teams.",
|
||||
"course-authoring.pages-resources.wiki.heading": "Configure wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.label": "Wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.help": "The course wiki can be set up based on the needs of your\n course. Common uses might include sharing answers to course FAQs, sharing\n editable course information, or providing access to learner-created\n resources.",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.link": "Learn more about the wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.label": "Enable public wiki access",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.help": "If enabled, edX users can view the course wiki even when\n they're not enrolled in the course.",
|
||||
"authoring.examsettings.enableproctoredexams.help": "If checked, proctored exams are enabled in your course.",
|
||||
"authoring.examsettings.allowoptout.label": "Allow Opting Out of Proctored Exams",
|
||||
"authoring.examsettings.allowoptout.help": "\n If this value is \"Yes\", learners can choose to take proctored exams without proctoring.\n If this value is \"No\", all learners must take the exam with proctoring.\n ",
|
||||
"authoring.examsettings.provider.label": "Proctoring Provider",
|
||||
"authoring.examsettings.escalationemail.label": "Proctortrack Escalation Email",
|
||||
"authoring.examsettings.escalationemail.help": "\n Required if \"proctortrack\" is selected as your proctoring provider. Enter an email address to be\n contacted by the support team whenever there are escalations (e.g. appeals, delayed reviews, etc.).\n ",
|
||||
"authoring.examsettings.createzendesk.label": "Create Zendesk Tickets for Suspicious Proctored Exam Attempts",
|
||||
"authoring.examsettings.createzendesk.help": "If this value is \"Yes\", a Zendesk ticket will be created for suspicious proctored exam attempts.",
|
||||
"authoring.examsettings.submit": "Submit",
|
||||
"authoring.examsettings.alert.success": "\n Proctored exam settings saved successfully.\n You can go back to your course in Studio {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.allowoptout.no": "No",
|
||||
"authoring.examsettings.allowoptout.yes": "Yes",
|
||||
"authoring.examsettings.createzendesk.no": "No",
|
||||
"authoring.examsettings.createzendesk.yes": "Yes",
|
||||
"authoring.examsettings.support.text": "Support Page",
|
||||
"authoring.examsettings.escalationemail.enableproctoredexams.label": "Enable Proctored Exams",
|
||||
"authoring.examsettings.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.examsettings.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.examsettings.error.single": "There is 1 error in this form.",
|
||||
"authoring.examsettings.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.examsettings.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.examsettings.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"header.links.content": "Content",
|
||||
"header.links.settings": "Settings",
|
||||
"header.links.content.tools": "Tools",
|
||||
"header.links.outline": "Outline",
|
||||
"header.links.updates": "Updates",
|
||||
"header.links.pages": "Pages & Resources",
|
||||
"header.links.filesAndUploads": "Files & Uploads",
|
||||
"header.links.textbooks": "Textbooks",
|
||||
"header.links.videoUploads": "Video Uploads",
|
||||
"header.links.scheduleAndDetails": "Schedule & Details",
|
||||
"header.links.grading": "Grading",
|
||||
"header.links.courseTeam": "Course Team",
|
||||
"header.links.groupConfigurations": "Group Configurations",
|
||||
"header.links.proctoredExamSettings": "Proctored Exam Settings",
|
||||
"header.links.advancedSettings": "Advanced Settings",
|
||||
"header.links.certificates": "Certificates",
|
||||
"header.links.publisher": "Publisher",
|
||||
"header.links.import": "Import",
|
||||
"header.links.export": "Export",
|
||||
"header.links.checklists": "Checklists",
|
||||
"header.user.menu.studio": "Studio Home",
|
||||
"header.user.menu.maintenance": "Maintenance",
|
||||
"header.user.menu.logout": "Logout",
|
||||
"header.label.account.menu": "Account Menu",
|
||||
"header.label.account.menu.for": "Account menu for {username}",
|
||||
"header.label.main.nav": "Main",
|
||||
"header.label.main.menu": "Main Menu",
|
||||
"header.label.main.header": "Main",
|
||||
"header.label.secondary.nav": "Secondary",
|
||||
"header.label.courseOutline": "Back to course outline in Studio"
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
"authoring.loading": "Cargando...",
|
||||
"authoring.alert.error.permission": "No te encuentras autorizado para ingresar a esta página. Si crees que deberías tener acceso, por favor contacta al equipo administrativo del curso para solicitar acceso.",
|
||||
"authoring.alert.save.error.connection": "Hemos detectado un error técnico al cargar esta página. Esto puede ser un problema temporal, así que por favor intente nuevamente en unos minutos. Si el problema persiste, por favor solicite ayuda en el siguiente enlace {supportLink}",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "Página de soporte",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Cancelar",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Guardar",
|
||||
@@ -42,7 +43,12 @@
|
||||
"authoring.discussions.configure": "Configura discusiones",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Cancelar",
|
||||
"authoring.discussions.confirm": "Confirmar",
|
||||
"authoring.discussions.confirmConfigurationChange": "¿Estas seguro que deseas cambiar la configuración de las discusiones? ",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "¿Habilitar debates sobre unidades en subsecciones calificadas?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "¿Deshabilitar debates sobre unidades en subsecciones calificadas?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "Habilitar esta opción habilitará automáticamente la discusión sobre todas las unidades en las subsecciones calificadas, que no son exámenes cronometrados.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "Al deshabilitar esta opción, se deshabilitará automáticamente la discusión en todas las unidades en las subsecciones calificadas. Los temas de debate que contengan al menos 1 hilo se enumerarán y estarán accesibles en \"Archivado\" en la pestaña Temas en la página de Debates.",
|
||||
"authoring.discussions.backButton": "Volver atrás",
|
||||
"authoring.discussions.saveButton": "Guardar",
|
||||
"authoring.discussions.savingButton": "Guardando",
|
||||
@@ -61,15 +67,13 @@
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Escoge cuales de los temas de tus discusiones de todo el cursos te gustaría dividir.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "General",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Preguntas para las herramientas asistidas",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "Para ajustar esta configuración, habilite las cohortes en la",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "tablero del instructor",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "visualización de las discusioness en contexto",
|
||||
"authoring.discussions.builtIn.inContextDiscussion.label": "discusiones en contexto",
|
||||
"authoring.discussions.builtIn.inContextDiscussion.help": "Los estudiantes podrán ver u ocultar el panel de discusiones para participar en la discusión de la unidad de página del curso.",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Unidades de página calificadas",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Habilitar discusiones en unidades de subsecciones calificables",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Permítele a los estudiantes participar con discusiones en todas las unidades de página calificables con excepción de los exámenes cronometrados.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Grupo en la discusión de contexto en el nivel de subseción",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Los estudiantes podrán ver cualquier publicación en la sub-sección sin importar en que unidad de página se encuentren visualizando. Mientras esto no sea recomendado, si tu curso cuenta con pocas secuencias de aprendizaje o bajo número de inscripciones, hacer grupos puede incrementar la participación.",
|
||||
"authoring.discussions.builtIn.allowUnitLevelVisibility.label": "Permite la visibilidad de la configuración para cada unidad de curso",
|
||||
"authoring.discussions.builtIn.allowUnitLevelVisibility.help": "Con esta configuración avanzada habilitada podrás anular la visibilidad global de la configuración y encender o apagar las discusiones para cada unidad desde la vista de esquema de curso.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Publicación anonima",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Habilita publicaciones anonimas en las discusiones",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "Si es permitido, los estudiantes puedrán crear publicaciones anonimas para todos los usuarios.",
|
||||
@@ -137,7 +141,7 @@
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Inicia conversaciones con otros estudiantes, haz preguntas, e interactúa con otros estudiantes pertenecientes al curso.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Inicia conversaciones con otros estudiantes, haz preguntas, e interactúa con otros estudiantes pertenecientes al curso.",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Habilitar la participación en temas de debate junto con el contenido del curso.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza está diseñada para conectar estudiantes, TAs, y profesores de tal forma que cada estudiante pueda obtener la ayuda necesaria en los momentos requeridos.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellodig ofrece a los educadores una solución de aprendizaje interactiva para mejorar la participación del estudiante mediante la construcción de comunidades para cualquier modalidad de curso.",
|
||||
@@ -183,22 +187,23 @@
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notas",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Los estudiantes pueden acceder a las notas ya sea en el cuerpo del \n curso en una página de notas. En la página de notas, el estudiante puede ver todas las\n notas realizadas durante el curso. La página también contiene enlaces a la ubicación\n de las notas en el cuerpo del curso.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Aprende más acerca de las notas",
|
||||
"authoring.live.bbb.selectPlan.label": "Seleccione un plan",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configurar en vivo",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "En vivo",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Programe reuniones y realice sesiones de cursos en vivo con los alumnos.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "Learn more about live",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "Más información sobre el vivo",
|
||||
"authoring.live.selectProvider": "Seleccione una herramienta de videoconferencia",
|
||||
"authoring.live.formInstructions": "Complete los campos a continuación para configurar su herramienta de videoconferencia.",
|
||||
"authoring.live.consumerKey": "Consumidor Clave",
|
||||
"authoring.live.consumerKey.required": "Consumidor clave es requerido en este campo",
|
||||
"authoring.live.consumerSecret": "Consumer Secret",
|
||||
"authoring.live.consumerSecret": "Consumidor Secreto",
|
||||
"authoring.live.consumerSecret.required": "Consumidor secreto es requerido en este campo",
|
||||
"authoring.live.launchUrl": "Lanzamiento URL",
|
||||
"authoring.live.launchUrl.required": "Lanzamiento URL es requerida para este campo",
|
||||
"authoring.live.launchEmail": "Correo electrónico de lanzamiento",
|
||||
"authoring.live.launchEmail.required": "El correo electrónico de lanzamiento es un campo obligatorio",
|
||||
"authoring.live.provider.helpText": "This configuration will require sharing username and emails of learners and the course team with {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "This configuration will require sharing usernames and emails of learners and the course team with {provider}. To access the LTI configuration for {provider}, please request your edX project coordinator to get PII sharing enabled for this course.",
|
||||
"authoring.live.provider.helpText": "Esta configuración requerirá compartir el nombre de usuario y los correos electrónicos de los alumnos, además del equipo del curso con {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "Esta configuración requerirá compartir los nombres de usuario y los correos electrónicos de los alumnos, además del equipo del curso con {provider}. Para acceder a la configuración de LTI para {provider}, solicite a su coordinador de proyectos de edX que habilite el uso compartido de PII para este curso.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "Documentación general ",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "Documentación de accesibilidad ",
|
||||
"authoring.live.appDocInstructions.configurationLink": "Documentación de configuración",
|
||||
@@ -208,6 +213,11 @@
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Reunión de Google",
|
||||
"authoring.live.appName-microsoftTeams": "Equipos de Microsoft",
|
||||
"authoring.live.appName-bigBlueButton": "GranBotónAzul",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "Esta configuración requerirá compartir los nombres de usuario de los alumnos y el equipo del curso con {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "Para habilitar esta función, comuníquese con el equipo de soporte de edX para habilitar el uso compartido de PII para este curso.",
|
||||
"authoring.live.freePlanMessage": "El plan gratuito está preconfigurado y no se requieren configuraciones adicionales. Al seleccionar el plan gratuito, acepta Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Política de privacidad.",
|
||||
"course-authoring.pages-resources.heading": "Páginas & Recursos",
|
||||
"course-authoring.pages-resources.resources.settings.button": "configuraciones",
|
||||
"course-authoring.pages-resources.viewLive.button": "Ver en vivo",
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"authoring.loading": "Chargement...",
|
||||
"authoring.alert.error.permission": "Vous n'êtes pas autorisé à afficher cette page. Si vous croyez que vous devriez avoir accès à cette page, veuillez contacter l'équipe administrative du cours pour obtenir la permission.",
|
||||
"authoring.alert.save.error.connection": "Nous avons rencontré une erreur technique lors de l'application des modifications. Cela peut être un problème temporaire, veuillez donc réessayer dans quelques minutes. Si le problème persiste, accédez à {support_link} pour obtenir de l'aide.",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "Page de support",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Annuler",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Enregistrer",
|
||||
@@ -42,7 +43,12 @@
|
||||
"authoring.discussions.configure": "Configurez les discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Annuler",
|
||||
"authoring.discussions.confirm": "Confirm",
|
||||
"authoring.discussions.confirmConfigurationChange": "Voulez-vous vraiment modifier les paramètres de discussion ?",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "Enable discussions on units in graded subsections?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "Disable discussions on units in graded subsections?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.",
|
||||
"authoring.discussions.backButton": "Retour",
|
||||
"authoring.discussions.saveButton": "Enregistrer",
|
||||
"authoring.discussions.savingButton": "Enregistrement",
|
||||
@@ -61,15 +67,13 @@
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choisissez lequel des sujets de discussion à l'échelle du cours vous souhaitez diviser.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "Général",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions pour les assistants d'enseignement",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "To adjust these settings, enable cohorts on the ",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "instructor dashboard",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibilité des discussions en contexte",
|
||||
"authoring.discussions.builtIn.inContextDiscussion.label": "Discussion en contexte",
|
||||
"authoring.discussions.builtIn.inContextDiscussion.help": "Les apprenants pourront afficher ou masquer un panneau latéral de discussion pour participer à la discussion sur la page de l'unité de cours.",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Pages d'unités notées",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Enable discussions on units in graded subsections",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Permettez aux apprenants de participer à la discussion sur toutes les pages d'unités notées, à l'exception des examens chronométrés.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Discussion de groupe en contexte au niveau des sous-sections",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Les apprenants pourront voir n'importe quel article de la sous-section, quelle que soit la page d'unité qu'ils consultent. Bien que cela ne soit pas recommandé, si votre cours comporte de courtes séquences d'apprentissage ou un faible regroupement d'inscription cela peut augmenter l'engagement.",
|
||||
"authoring.discussions.builtIn.allowUnitLevelVisibility.label": "Autoriser la configuration de la visibilité pour chaque unité de cours",
|
||||
"authoring.discussions.builtIn.allowUnitLevelVisibility.help": "Avec ce paramètre avancé activé, vous pourrez remplacer le paramètre de visibilité globale et activer ou désactiver les discussions pour chaque unité à partir de la vue d'ensemble du cours.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Publication anonyme",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Autoriser les posts de discussion anonymes",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "Si activé, les apprenants pourront créer des publications qui resteront anonymes à tous les utilisateurs.",
|
||||
@@ -137,7 +141,7 @@
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Démarrez des conversations avec d'autres apprenants, posez des questions et interagissez avec d'autres apprenants du cours.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Démarrez des conversations avec d'autres apprenants, posez des questions et interagissez avec d'autres apprenants du cours.",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Enable participation in discussion topics alongside course content.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza est conçu pour connecter les étudiants, les assistants enseignants et les professeurs afin que chaque étudiant puisse obtenir l'aide dont il a besoin quand il en a besoin.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offre aux éducateurs une solution d'enseignement ludique pour augmenter l'engagement des étudiants en construisant des communautés d'apprentissage pour toutes les modalités de cours.",
|
||||
@@ -183,6 +187,7 @@
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Les apprenants peuvent accéder à leurs notes à partir du\n corps du cours ou une page de notes. Sur la page de notes, un apprenant peut voir toutes les\n notes conçues durant le cours. La page contient également les liens vers la location\n des notes dans le corps du cours.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Apprenez en plus sur notes",
|
||||
"authoring.live.bbb.selectPlan.label": "Select a plan",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configurer en direct",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Planifiez des réunions et organisez des sessions de cours en direct avec les apprenants.",
|
||||
@@ -195,8 +200,8 @@
|
||||
"authoring.live.consumerSecret.required": "Le secret du consommateur est un champ obligatoire",
|
||||
"authoring.live.launchUrl": "URL de lancement",
|
||||
"authoring.live.launchUrl.required": "L'URL de lancement est un champ obligatoire",
|
||||
"authoring.live.launchEmail": "Lancer l'e-mail",
|
||||
"authoring.live.launchEmail.required": "L'e-mail de lancement est un champ obligatoire",
|
||||
"authoring.live.launchEmail": "Lancer l'e-mail",
|
||||
"authoring.live.launchEmail.required": "L'e-mail de lancement est un champ obligatoire",
|
||||
"authoring.live.provider.helpText": "Cette configuration nécessitera le partage du nom d'utilisateur et des courriels des apprenants et de l'équipe du cours avec {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "Cette configuration nécessitera le partage des noms d'utilisateur et des courriels des apprenants et de l'équipe du cours avec {provider}. Pour accéder à la configuration LTI pour {provider}, veuillez demander à votre coordinateur de projet edX d'activer le partage des PII pour ce cours.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "Documentation générale",
|
||||
@@ -208,6 +213,11 @@
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Microsoft Teams",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "This configuration will require sharing usernames of learners and the course team with {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "To enable this feature, contact your edX support team to enable PII sharing for this course.",
|
||||
"authoring.live.freePlanMessage": "The free plan is pre-configured, and no additional configurations are required. By selecting the free plan, you are agreeing to Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Privacy Policy.",
|
||||
"course-authoring.pages-resources.heading": "Pages et ressources",
|
||||
"course-authoring.pages-resources.resources.settings.button": "paramètres",
|
||||
"course-authoring.pages-resources.viewLive.button": "Aperçu temps réel",
|
||||
|
||||
353
src/i18n/messages/fr_CA.json
Normal file
353
src/i18n/messages/fr_CA.json
Normal file
@@ -0,0 +1,353 @@
|
||||
{
|
||||
"authoring.alert.error.connection": "Nous avons rencontré une erreur technique lors du chargement de cette page. Cela peut être un problème temporaire, veuillez donc réessayer dans quelques minutes. Si le problème persiste, accédez à {support_link} pour obtenir de l'aide.",
|
||||
"authoring.loading": "Chargement...",
|
||||
"authoring.alert.error.permission": "Vous n'êtes pas autorisé à afficher cette page. Si vous croyez que vous devriez avoir accès à cette page, veuillez contacter l'équipe administrative du cours pour obtenir la permission.",
|
||||
"authoring.alert.save.error.connection": "Nous avons rencontré une erreur technique lors de l'application des modifications. Cela peut être un problème temporaire, veuillez donc réessayer dans quelques minutes. Si le problème persiste, accédez à {support_link} pour obtenir de l'aide.",
|
||||
"course-authoring.page.title": "Création de cours | {siteName}",
|
||||
"authoring.alert.support.text": "Page de support",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Annuler",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Sauvegarder",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saving": "Sauvegarde en cours",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saved": "Sauvegardé",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.retry": "Réessayez",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.enabled": "Activé",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.disabled": "Désactivé",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.title": "Nous n'avons pas pu appliquer vos changements.",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.message": "Veuillez vérifier vos entrées et réessayer.",
|
||||
"course-authoring.pages-resources.calculator.heading": "Configurer la calculatrice",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.label": "Calculatrice",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.help": "La calculatrice prend en charge les nombres, les opérateurs, les constantes,\n fonctions et autres concepts mathématiques. Lorsqu'elle est activée, une icône pour\n accéder à la calculatrice apparaît sur toutes les pages du corps de votre cours.",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.link": "En savoir plus sur la calculatrice",
|
||||
"authoring.discussions.documentationPage": "Visitez la page de documentation de {name}",
|
||||
"authoring.discussions.formInstructions": "Complétez les champs ci-dessous pour configurer votre outil de discussion.",
|
||||
"authoring.discussions.consumerKey": "Clé du consommateur",
|
||||
"authoring.discussions.consumerKey.required": "Clé du consommateur est un champ obligatoire",
|
||||
"authoring.discussions.consumerSecret": "Secret du consommateur",
|
||||
"authoring.discussions.consumerSecret.required": "Le secret du consommateur est un champ obligatoire",
|
||||
"authoring.discussions.launchUrl": "URL de lancement",
|
||||
"authoring.discussions.launchUrl.required": "L'URL de lancement est un champ obligatoire",
|
||||
"authoring.discussions.stuffOnlyConfigInfo": "Pour activer {providerName} pour votre cours, veuillez contacter leur équipe d'assistance à {supportEmail} pour en savoir plus sur les prix et l'utilisation.",
|
||||
"authoring.discussions.stuffOnlyConfigGuide": "Pour configurer entièrement {providerName}, il faudra également partager les noms d'utilisateur et les courriels pour les apprenants et l'équipe du cours. Veuillez contacter votre coordinateur de projet edX pour activer le partage de PII pour ce cours.",
|
||||
"authoring.discussions.piiSharing": "Partagez en option le nom d'utilisateur et/ou l'adresse courriel d'un utilisateur avec le fournisseur LTI :",
|
||||
"authoring.discussions.piiShareUsername": "Partager le nom d'utilisateur",
|
||||
"authoring.discussions.piiShareEmail": "Partager l'adresse courriel",
|
||||
"authoring.discussions.appDocInstructions.contact": "Contact : {link}",
|
||||
"authoring.discussions.appDocInstructions.documentationLink": "Documentation générale",
|
||||
"authoring.discussions.appDocInstructions.accessibilityDocumentationLink": "Documentation d’accessibilité",
|
||||
"authoring.discussions.appDocInstructions.configurationLink": "Documentation de configuration",
|
||||
"authoring.discussions.appDocInstructions.learnMoreLink": "Apprenez-en plus sur {providerName}",
|
||||
"authoring.discussions.appDocInstructions.linkTextHeading": "Aide externe et documentation",
|
||||
"authoring.discussions.appDocInstructions.linkText": "{link}",
|
||||
"authoring.discussions.configurationChangeConsequences": "Les étudiants perdront l'accès à tous les messages de discussion actifs ou précédents pour votre cours.",
|
||||
"authoring.discussions.configure.app": "Configurer {name}",
|
||||
"authoring.discussions.configure": "Configurez les discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Annuler",
|
||||
"authoring.discussions.confirm": "Confirmer",
|
||||
"authoring.discussions.confirmConfigurationChange": "Voulez-vous vraiment modifier les paramètres de discussion?",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "Activer les discussions sur les unités dans les sous-sections notées?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "Désactiver les discussions sur les unités dans les sous-sections notées?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "L'activation de cette bascule activera automatiquement la discussion sur toutes les unités dans les sous-sections notées, qui ne sont pas des examens chronométrés.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "La désactivation de cette bascule désactivera automatiquement la discussion sur toutes les unités dans les sous-sections notées. Les sujets de discussion contenant au moins 1 fil de discussion seront répertoriés et accessibles sous \"Archivés\" dans l'onglet Sujets de la page Discussions.",
|
||||
"authoring.discussions.backButton": "Retour",
|
||||
"authoring.discussions.saveButton": "Sauvegarder",
|
||||
"authoring.discussions.savingButton": "Sauvegarde en cours",
|
||||
"authoring.discussions.savedButton": "Sauvegardé",
|
||||
"authoring.discussions.appConfigForm.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appConfigForm.appName-yellowdig": "Yellowdig",
|
||||
"authoring.discussions.appConfigForm.appName-inscribe": "InScribe",
|
||||
"authoring.discussions.appConfigForm.appName-discourse": "Discourse",
|
||||
"authoring.discussions.appConfigForm.appName-ed-discuss": "Ed Discussion",
|
||||
"authoring.discussions.appConfigForm.appName-legacy": "edX",
|
||||
"authoring.discussions.appConfigForm.appName-openedx": "edX",
|
||||
"authoring.discussions.builtIn.divisionByGroup": "Cohortes",
|
||||
"authoring.discussions.builtIn.divideByCohorts.label": "Divisez les discussions par cohortes",
|
||||
"authoring.discussions.builtIn.divideByCohorts.help": "Les apprenants ne pourront voir et répondre qu'aux discussions publiées par les membres de leur cohorte.",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.label": "Divisez les sujets de discussion à l'échelle du cours",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choisissez lequel des sujets de discussion à l'échelle du cours vous souhaitez diviser.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "Général",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions pour les assistants d'enseignement",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "Pour ajuster ces paramètres, activez les cohortes sur le",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "tableau de bord de l'instructeur",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibilité des discussions en contexte",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Activer les discussions sur les unités dans les sous-sections notées",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Permettez aux apprenants de participer à la discussion sur toutes les pages d'unités notées, à l'exception des examens chronométrés.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Discussion de groupe en contexte au niveau des sous-sections",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Les apprenants pourront voir n'importe quel article de la sous-section, quelle que soit la page d'unité qu'ils consultent. Bien que cela ne soit pas recommandé, si votre cours comporte de courtes séquences d'apprentissage ou un faible regroupement d'inscription cela peut augmenter l'engagement.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Publication anonyme",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Autoriser les posts de discussion anonymes",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "Si activé, les apprenants pourront créer des publications qui resteront anonymes à tous les utilisateurs.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.label": "Autorisez les posts de discussion anonymes aux pairs",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.help": "Les apprenants seront capables de poster de manière anonymes aux autres pairs mais tous les posts seront visibles par l'équipe du cours.",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications": "Notifications",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.label": "Notifications par courriel pour le contenu signalé",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.help": "Les administrateurs de discussion, les modérateurs, les assistants de communauté et les assistants de communauté de groupe (uniquement pour leur propre cohorte) recevront une notification par courriel lorsque du contenu est signalé.",
|
||||
"authoring.discussions.discussionTopics": "Sujets de discussions",
|
||||
"authoring.discussions.discussionTopics.label": "Sujets de discussion généraux",
|
||||
"authoring.discussions.discussionTopics.help": "Les discussions peuvent inclure des sujets généraux non contenus dans la structure du cours. Tous les cours ont un sujet général par défaut.",
|
||||
"authoring.discussions.discussionTopic.required": "Le nom du sujet est un champ obligatoire",
|
||||
"authoring.discussions.discussionTopic.alreadyExistError": "Il semble que ce nom soit déjà utilisé",
|
||||
"authoring.discussions.addTopicButton": "Ajoutez un sujet",
|
||||
"authoring.discussions.deleteButton": "Supprimer",
|
||||
"authoring.discussions.cancelButton": "Annuler",
|
||||
"authoring.discussions.discussionTopicDeletion.help": "EDUlib vous recommande de ne pas supprimer les sujets de discussion une fois que votre cours est en cours.",
|
||||
"authoring.discussions.discussionTopicDeletion.label": "Supprimer ce sujet?",
|
||||
"authoring.discussions.builtIn.renameGeneralTopic.label": "Renommez le sujet général",
|
||||
"authoring.discussions.generalTopicHelp.help": "Ceci est le sujet de discussion par défaut pour votre cours.",
|
||||
"authoring.discussions.builtIn.configureAdditionalTopic.label": "Configurez le sujet",
|
||||
"authoring.discussions.addTopicHelpText": "Choisissez un nom unique pour votre sujet",
|
||||
"authoring.discussions.blackoutDates": "Dates d'interdiction des discussions",
|
||||
"authoring.discussions.builtIn.blackoutDates.label": "Dates d'interdiction",
|
||||
"authoring.discussions.builtIn.blackoutDates.help": "S'ils sont ajoutés, les apprenants ne pourront pas participer aux discussions entre ces dates.",
|
||||
"authoring.discussions.addBlackoutDatesButton": "Ajouter une plage de dates d'interdiction",
|
||||
"authoring.discussions.builtIn.configureBlackoutDates.label": "Configurer la plage de dates d'interdiction",
|
||||
"authoring.discussions.blackoutStartDate.help": "Entrez une date de début, par exemple le 12/10/2023",
|
||||
"authoring.discussions.blackoutEndDate.help": "Entrez une date de fin, par exemple le 17/12/2023",
|
||||
"authoring.discussions.blackoutStartTime.help": "Entrez une heure de début, par exemple 09h00",
|
||||
"authoring.discussions.blackoutEndTime.help": "Entrez une heure de fin, par exemple 17h00",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.help": "Ces dates d'interdiction sont actuellement actives. Si elles sont supprimées, les apprenants pourront publier dans les discussions pendant ces dates. Êtes-vous sûr de vouloir continuer?",
|
||||
"authoring.discussions.blackoutDatesDeletion.help": "Si supprimé, les apprenants pourront participer aux discussions pendant ces dates.",
|
||||
"authoring.discussions.completeBlackoutDatesDeletion.help": "Êtes-vous sûr de vouloir supprimer ces dates d'interdiction?",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.label": "Supprimer les dates d'interdiction actives?",
|
||||
"authoring.discussions.blackoutDatesDeletion.label": "Supprimer les dates d'interdiction?",
|
||||
"authoring.blackoutDates.delete": "Supprimer les dates d'interdiction",
|
||||
"authoring.blackoutDates.status": "{status}",
|
||||
"authoring.blackoutDates.startDate.required": "La date de début est un champ obligatoire",
|
||||
"authoring.blackoutDates.endDate.required": "La date de fin est un champ obligatoire",
|
||||
"authoring.blackoutDates.startDate.inPast": "La date de début ne peut pas être après la date de fin",
|
||||
"authoring.blackoutDates.endDate.inPast": "La date de fin ne peut pas être avant la date de début",
|
||||
"authoring.blackoutDates.startTime.inPast": "L'heure de début ne peut pas être après l'heure de fin",
|
||||
"authoring.blackoutDates.endTime.inPast": "L'heure de fin ne peut pas être avant l'heure de début",
|
||||
"authoring.blackoutDates.startTime.inValidFormat": "Entrer un temps de départ valide",
|
||||
"authoring.blackoutDates.endTime.inValidFormat": "Entrer un temps de fin valide",
|
||||
"authoring.blackoutDates.startDate.inValidFormat": "Entrer une date valide de départ",
|
||||
"authoring.blackoutDates.endDate.inValidFormat": "Entrer une date valide de fin",
|
||||
"authoring.topics.delete": "Supprimer le sujet",
|
||||
"authoring.topics.expand": "Développer",
|
||||
"authoring.topics.collapse": "Replier",
|
||||
"authoring.blackoutDates.start.date": "Date de début",
|
||||
"authoring.blackoutDates.start.time": "Heure de début (facultatif) ({zone})",
|
||||
"authoring.blackoutDates.end.date": "Date de fin",
|
||||
"authoring.blackoutDates.end.time": "Heure de fin (facultatif) ({zone})",
|
||||
"authoring.discussions.heading": "Sélectionnez un outil de discussion pour ce cours",
|
||||
"authoring.discussions.supportedFeatures": "Fonctionnalités prises en charge",
|
||||
"authoring.discussions.supportedFeatureList-mobile-show": "Afficher les fonctionnalités prises en charge",
|
||||
"authoring.discussions.supportedFeatureList-mobile-hide": "Masquer les fonctionnalités prises en charge",
|
||||
"authoring.discussions.noApps": "Aucun fournisseur de discussion n'est disponible pour votre cours.",
|
||||
"authoring.discussions.nextButton": "Suivant",
|
||||
"authoring.discussions.appFullSupport": "Support complet",
|
||||
"authoring.discussions.appBasicSupport": "Support de base",
|
||||
"authoring.discussions.selectApp": "Choisissez {appName}",
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Démarrez des conversations avec d'autres apprenants, posez des questions et interagissez avec d'autres apprenants du cours.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Activez la participation aux sujets de discussion parallèlement au contenu du cours.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza est conçu pour connecter les étudiants, les assistants enseignants et les professeurs afin que chaque étudiant puisse obtenir l'aide dont il a besoin quand il en a besoin.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offre aux éducateurs une solution d'enseignement ludique pour augmenter l'engagement des étudiants en construisant des communautés d'apprentissage pour toutes les modalités de cours.",
|
||||
"authoring.discussions.appList.appDescription-inscribe": "InScribe exploite le pouvoir des communauté + l'intelligence artificielle pour connecter les individus aux réponses, aux ressources et aux personnes qu'ils ont besoin pour exceller.",
|
||||
"authoring.discussions.appList.appDescription-discourse": "Discourse est un programme de forum moderne pour votre communauté. Utilisez le en tant que liste de courriel, forum de discussion, salle de conversation et bien plus!",
|
||||
"authoring.discussions.appList.appDescription-ed-discus": "Ed Discussion aide les communications en classe avec une belle interface intuitive. Les questions rejoignent et bénéficient toute la classe. Moins de courriel, plus de temps épargnés.",
|
||||
"authoring.discussions.featureName-discussion-page": "Page de discussion",
|
||||
"authoring.discussions.featureName-embedded-course-sections": "Sections de cours intégrées",
|
||||
"authoring.discussions.featureName-advanced-in-context-discussion": "Discussion avancée en contexte",
|
||||
"authoring.discussions.featureName-anonymous-posting": "Publication anonyme",
|
||||
"authoring.discussions.featureName-automatic-learner-enrollment": "Inscription automatique de l'apprenant",
|
||||
"authoring.discussions.featureName-blackout-discussion-dates": "Dates de discussions interdites",
|
||||
"authoring.discussions.featureName-community-ta-support": "Support des assistants d'enseignement de la communauté",
|
||||
"authoring.discussions.featureName-course-cohort-support": "Support des cohortes de cours",
|
||||
"authoring.discussions.featureName-direct-messages-from-instructors": "Messages directs des instructeurs",
|
||||
"authoring.discussions.featureName-discussion-content-prompts": "Instructions pour le contenu de discussion",
|
||||
"authoring.discussions.featureName-email-notifications": "Notifications par courriel",
|
||||
"authoring.discussions.featureName-graded-discussions": "Discussions notées",
|
||||
"authoring.discussions.featureName-in-platform-notifications": "Notifications sur la plateforme",
|
||||
"authoring.discussions.featureName-internationalization-support": "Support pour l'Internationalisation",
|
||||
"authoring.discussions.featureName-lti-advanced-sharing-mode": "Partage avancé LTI",
|
||||
"authoring.discussions.featureName-basic-configuration": "Configuration de base",
|
||||
"authoring.discussions.featureName-primary-discussion-app-experience": "Application de discussion primaire",
|
||||
"authoring.discussions.featureName-question-&-discussion-support": "Support aux Questions et Discussions",
|
||||
"authoring.discussions.featureName-report/flag-content-to-moderators": "Signaler du contenu aux modérateurs",
|
||||
"authoring.discussions.featureName-research-data-events": "Recherche de données d'événements",
|
||||
"authoring.discussions.featureName-simplified-in-context-discussion": "Simplifié dans le contexte de la discussion",
|
||||
"authoring.discussions.featureName-user-mentions": "Mentions utilisatrices",
|
||||
"authoring.discussions.featureName-wcag-2.1": "Support WCAG 2.1",
|
||||
"authoring.discussions.wcag-2.0-support": "Support WCAG 2.0",
|
||||
"authoring.discussions.basic-support": "Support de base",
|
||||
"authoring.discussions.partial-support": "Support partiel",
|
||||
"authoring.discussions.full-support": "Support complet",
|
||||
"authoring.discussions.common-support": "Demande fréquente",
|
||||
"authoring.discussions.settings": "Paramètres",
|
||||
"authoring.discussions.applyButton": "Appliquer",
|
||||
"authoring.discussions.applyingButton": "Appliquer",
|
||||
"authoring.discussions.appliedButton": "Appliqué",
|
||||
"authoring.discussions.noProviderSwitchAfterCourseStarted": "Le fournisseur de discussion ne peut pas être modifié une fois le cours commencé, veuillez contacter l'assistance partenaire.",
|
||||
"authoring.discussions.providerSelection": "Sélection des fournisseurs",
|
||||
"authoring.discussions.Incomplete": "Incomplet",
|
||||
"course-authoring.pages-resources.notes.heading": "Configurer les notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Les apprenants peuvent accéder à leurs notes à partir du\n corps du cours ou une page de notes. Sur la page de notes, un apprenant peut voir toutes les\n notes conçues durant le cours. La page contient également les liens vers la location\n des notes dans le corps du cours.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Apprenez en plus sur notes",
|
||||
"authoring.live.bbb.selectPlan.label": "Sélectionnez un forfait",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configurer en direct",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "En direct",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Planifiez des réunions et organisez des sessions de cours en direct avec les apprenants.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "En savoir plus sur le direct",
|
||||
"authoring.live.selectProvider": "Sélectionnez un outil de visioconférence",
|
||||
"authoring.live.formInstructions": "Complétez les champs ci-dessous pour paramétrer votre outil de visioconférence.",
|
||||
"authoring.live.consumerKey": "Clé du consommateur",
|
||||
"authoring.live.consumerKey.required": "Clé du consommateur est un champ obligatoire",
|
||||
"authoring.live.consumerSecret": "Secret du consommateur",
|
||||
"authoring.live.consumerSecret.required": "Le secret du consommateur est un champ obligatoire",
|
||||
"authoring.live.launchUrl": "URL de lancement",
|
||||
"authoring.live.launchUrl.required": "L'URL de lancement est un champ obligatoire",
|
||||
"authoring.live.launchEmail": "Lancer le courriel",
|
||||
"authoring.live.launchEmail.required": "Le courriel de lancement est un champ obligatoire",
|
||||
"authoring.live.provider.helpText": "Cette configuration nécessitera le partage du nom d'utilisateur et des courriels des apprenants et de l'équipe du cours avec {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "Cette configuration nécessitera le partage des noms d'utilisateur et des courriels des apprenants et de l'équipe du cours avec {provider}. Pour accéder à la configuration LTI pour {provider}, veuillez demander à votre coordinateur de projet edX d'activer le partage des PII pour ce cours.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "Documentation générale",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "Documentation d’accessibilité",
|
||||
"authoring.live.appDocInstructions.configurationLink": "Documentation de configuration",
|
||||
"authoring.live.appDocInstructions.learnMoreLink": "Apprenez-en plus sur {providerName}",
|
||||
"authoring.live.appDocInstructions.linkTextHeading": "Aide externe et documentation",
|
||||
"authoring.live.appDocInstructions.linkText": "{link}",
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Équipes Microsoft",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "Cette configuration nécessitera le partage des noms d'utilisateur des apprenants et de l'équipe du cours avec {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "Pour activer cette fonctionnalité, contactez votre équipe d'assistance edX afin d'activer le partage des PII pour ce cours.",
|
||||
"authoring.live.freePlanMessage": "Le forfait gratuit est préconfiguré et aucune configuration supplémentaire n'est requise. En sélectionnant le forfait gratuit, vous acceptez Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Politique de confidentialité.",
|
||||
"course-authoring.pages-resources.heading": "Pages et ressources",
|
||||
"course-authoring.pages-resources.resources.settings.button": "paramètres",
|
||||
"course-authoring.pages-resources.viewLive.button": "Aperçu temps réel",
|
||||
"course-authoring.badge.enabled": "Activé",
|
||||
"authoring.proctoring.no": "Non",
|
||||
"authoring.proctoring.yes": "Oui",
|
||||
"authoring.proctoring.support.text": "Page de support",
|
||||
"authoring.proctoring.enableproctoredexams.label": "Examens surveillés",
|
||||
"authoring.proctoring.enableproctoredexams.help": "Activez et configurez les examens surveillés dans votre cours.",
|
||||
"authoring.proctoring.enabled": "Activé",
|
||||
"authoring.proctoring.learn.more": "En savoir plus sur la surveillance",
|
||||
"authoring.proctoring.provider.label": "Fournisseur de service de surveillance",
|
||||
"authoring.proctoring.provider.help": "Sélectionnez le fournisseur de surveillance que vous souhaitez utiliser pour cette session de cours.",
|
||||
"authoring.proctoring.provider.help.aftercoursestart": "Le fournisseur de surveillance ne peut pas être modifié après la date de début du cours.",
|
||||
"authoring.proctoring.escalationemail.label": "Courriel d'escalade Proctortrack",
|
||||
"authoring.proctoring.escalationemail.help": "Fournissez une adresse courriel à contacter par l'équipe de support pour les escalades (par exemple, appels, avis retardés).",
|
||||
"authoring.proctoring.escalationemail.error.blank": "Le champ courriel Proctortrack Escalation ne peut pas être vide si Proctortrack est le fournisseur sélectionné.",
|
||||
"authoring.proctoring.escalationemail.error.invalid": "Le champ du courriel d'escalade Proctortrack n'est pas au bon format et n'est pas valide.",
|
||||
"authoring.proctoring.allowoptout.label": "Permettre aux apprenants de se retirer de la surveillance des examens surveillés",
|
||||
"authoring.proctoring.createzendesk.label": "Créer les tickets Zendesk pour les tentatives suspectes",
|
||||
"authoring.proctoring.error.single": "Il y a 1 erreur dans ce formulaire.",
|
||||
"authoring.proctoring.escalationemail.error.multiple": "Il y a {numOfErrors} erreurs dans ce formulaire.",
|
||||
"authoring.proctoring.save": "Sauvegarder",
|
||||
"authoring.proctoring.saving": "Sauvegarde...",
|
||||
"authoring.proctoring.cancel": "Annuler",
|
||||
"authoring.proctoring.studio.link.text": "Retournez à votre cours dans Studio",
|
||||
"authoring.proctoring.alert.success": "\n Les paramètres de l'examen surveillé ont bien été enregistrés. {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.alert.error": "\n Nous avons rencontré une erreur technique en tentant de sauvegarder les paramètres de l'examen surveillé.\n Ceci est probablement un problème temporaire, veuillez réessayer dans quelques minutes. \n Si le problème persiste,\n veuillez aller sur {support_link} pour de l'aide.\n ",
|
||||
"course-authoring.pages-resources.progress.heading": "Configurer la progression",
|
||||
"course-authoring.pages-resources.progress.enable-progress.label": "Progression",
|
||||
"course-authoring.pages-resources.progress.enable-progress.help": "Au fur et à mesure que les élèves effectuent des devoirs notés, les notes\n apparaîtront sous l'onglet de progression. L'onglet de progression contient un graphique de\n tous les devoirs notés dans le cours, avec une liste de tous les devoirs et\n les notes ci-dessous.",
|
||||
"course-authoring.pages-resources.progress.enable-progress.link": "Apprenez en plus sur la progression",
|
||||
"course-authoring.pages-resources.progress.enable-graph.label": "Activer le graphique de progression",
|
||||
"course-authoring.pages-resources.progress.enable-graph.help": "Si activé, les étudiants peuvent consulter le graphique de progression",
|
||||
"authoring.pagesAndResources.teams.heading": "Configurer les équipes",
|
||||
"authoring.pagesAndResources.teams.enableTeams.label": "Équipes",
|
||||
"authoring.pagesAndResources.teams.enableTeams.help": "Permettre aux apprenant de travailler ensemble sur des projets ou activités spécifiques.",
|
||||
"authoring.pagesAndResources.teams.enableTeams.link": "Apprenez en plus à propos des équipes",
|
||||
"authoring.pagesAndResources.teams.teamSize.heading": "Taille de l'équipe",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSize": "Taille maximale de l'équipe",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeHelp": "Le nombre maximum d'apprenants qui peuvent rejoindre une équipe",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeEmpty": "Entrez la taille maximale de l'équipe",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeInvalid": "La taille maximale de l'équipe doit être un nombre positif supérieur à zéro.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeTooHigh": "Taille maximale des équipes ne peut pas être plus que {max}",
|
||||
"authoring.pagesAndResources.teams.groups.heading": "Groupes",
|
||||
"authoring.pagesAndResources.teams.groups.help": "Les groupes sont des espaces où les apprenant peuvent rejoindre ou créer des équipes.",
|
||||
"authoring.pagesAndResources.teams.configureGroup.heading": "Configurer un groupe",
|
||||
"authoring.pagesAndResources.teams.group.name.label": "Nom",
|
||||
"authoring.pagesAndResources.teams.group.name.help": "Choisissez un nom unique pour ce groupe",
|
||||
"authoring.pagesAndResources.teams.group.name.error.empty": "Entrer un nom unique pour ce groupe",
|
||||
"authoring.pagesAndResources.teams.group.name.error.exists": "Il semble que ce nom soit déjà utilisé",
|
||||
"authoring.pagesAndResources.teams.group.description.label": "Description",
|
||||
"authoring.pagesAndResources.teams.group.description.help": "Entrez les détails de ce groupe",
|
||||
"authoring.pagesAndResources.teams.group.description.error": "Entrer une description pour ce groupe",
|
||||
"authoring.pagesAndResources.teams.group.type.label": "Type",
|
||||
"authoring.pagesAndResources.teams.group.type.help": "Contrôlez qui peut voir, créer et rejoindre des équipes",
|
||||
"authoring.pagesAndResources.teams.group.types.open": "Ouvert",
|
||||
"authoring.pagesAndResources.teams.group.types.open.description": "Les apprenants peuvent créer, rejoindre, quitter et voir d'autres équipes",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed": "Géré par le public",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed.description": "Seul le personnel du cours peut contrôler les équipes et les adhésions. Les apprenants peuvent voir les autres équipes.",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed": "Gestion privée",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed.description": "Seul le personnel du cours peut contrôler les équipes, les adhésions et voir les autres équipes",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.label": "Taille maximale de l'équipe (optionelle)",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.help": "Outrepasser la taille maximale globale des équipes",
|
||||
"authoring.pagesAndResources.teams.addGroup.button": "Ajouter un groupe",
|
||||
"authoring.pagesAndResources.teams.group.delete": "Supprimer",
|
||||
"authoring.pagesAndResources.teams.group.expand": "Développer l'éditeur de groupe",
|
||||
"authoring.pagesAndResources.teams.group.collapse": "Fermer l'éditeur du groupe",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.initiateDelete": "Supprimer",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.cancel-delete.button": "Annuler",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.heading": "Supprimer ce groupe?",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.body": "edX recommande de ne pas supprimer les groupes une fois que le cours a commencé.\nVos groupes ne seront plus visibles dans le LMS et les apprenants ne seront plus en mesure de quitter les équipes associées aux groupes supprimés.\nVeuillez retirer les apprenants des équipes avant de supprimer le groupe associé.",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.title": "Aucun groupe trouvé",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.message": "Ajouter un ou plusieurs groupes pour permettre les équipes.",
|
||||
"course-authoring.pages-resources.wiki.heading": "Configurer le wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.label": "Wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.help": "Le wiki du cours peut être configuré en fonction des besoins de votre\ncours. Les utilisations courantes peuvent inclure le partage de réponses aux FAQ du cours, le partage\n d'informations de cours modifiables ou donner accès à des informations créées par\n les apprenants.",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.link": "Apprenez en plus sur le wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.label": "Activer l'accès public au wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.help": "Si activé, les utilisateurs edX peuvent afficher le wiki du cours même lorsqu'ils\nne sont pas inscrits au cours.",
|
||||
"authoring.examsettings.enableproctoredexams.help": "Si coché, les examens surveillés seront permis dans votre cours.",
|
||||
"authoring.examsettings.allowoptout.label": "Autoriser l'exclusion des examens surveillés",
|
||||
"authoring.examsettings.allowoptout.help": "\n Si cette valeur est \"Oui\", les apprenants peuvent choisir de passer des examens surveillés sans surveillance.\n Si cette valeur est \"Non\", tous les apprenants doivent passer l'examen avec surveillance.\n",
|
||||
"authoring.examsettings.provider.label": "Fournisseur de service de surveillance",
|
||||
"authoring.examsettings.escalationemail.label": "Courriel d'escalade Proctortrack",
|
||||
"authoring.examsettings.escalationemail.help": "\n Requis si «proctortrack» est choisi comme votre fournisseur de surveillance. Entrez une adresse de courriel à\ncontacter par l'équipe de support lorsqu'il y a des escalades (ex. appels, revues en retard, etc.).\n",
|
||||
"authoring.examsettings.createzendesk.label": "Créer des billets ZenDesk pour les tentatives d'examen surveillé suspectes",
|
||||
"authoring.examsettings.createzendesk.help": "Si cette valeur est \"Oui\", un billet ZenDesk sera créé pour les tentatives d'examen surveillé suspectes.",
|
||||
"authoring.examsettings.submit": "Soumettre",
|
||||
"authoring.examsettings.alert.success": "\n Paramètres d'examen sauvegardés avec succès.\n Vous pouvez retourner dans le Studio du cours {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.allowoptout.no": "Non",
|
||||
"authoring.examsettings.allowoptout.yes": "Oui",
|
||||
"authoring.examsettings.createzendesk.no": "Non",
|
||||
"authoring.examsettings.createzendesk.yes": "Oui",
|
||||
"authoring.examsettings.support.text": "Page de support",
|
||||
"authoring.examsettings.escalationemail.enableproctoredexams.label": "Activer les examens surveillés",
|
||||
"authoring.examsettings.escalationemail.error.blank": "Le champ courriel Proctortrack Escalation ne peut pas être vide si Proctortrack est le fournisseur sélectionné.",
|
||||
"authoring.examsettings.escalationemail.error.invalid": "Le champ du courriel d'escalade Proctortrack n'est pas au bon format et n'est pas valide.",
|
||||
"authoring.examsettings.error.single": "Il y a 1 erreur dans ce formulaire.",
|
||||
"authoring.examsettings.escalationemail.error.multiple": "Il y a {numOfErrors} erreurs dans ce formulaire.",
|
||||
"authoring.examsettings.provider.help": "Sélectionnez le fournisseur d'examen surveillé que vous souhaitez utiliser pour cette session de cours.",
|
||||
"authoring.examsettings.provider.help.aftercoursestart": "Le fournisseur de surveillance ne peut pas être modifié après la date de début du cours.",
|
||||
"header.links.content": "Contenu",
|
||||
"header.links.settings": "Paramètres",
|
||||
"header.links.content.tools": "Outils",
|
||||
"header.links.outline": "Plan du Cours",
|
||||
"header.links.updates": "Annonces",
|
||||
"header.links.pages": "Pages et ressources",
|
||||
"header.links.filesAndUploads": "Fichiers & téléversements",
|
||||
"header.links.textbooks": "Manuels",
|
||||
"header.links.videoUploads": "Téléversements des vidéos",
|
||||
"header.links.scheduleAndDetails": "Dates & Détails",
|
||||
"header.links.grading": "Évaluation",
|
||||
"header.links.courseTeam": "Équipe pédagogique",
|
||||
"header.links.groupConfigurations": "Configuration des groupes",
|
||||
"header.links.proctoredExamSettings": "Paramètres d'examen surveillé",
|
||||
"header.links.advancedSettings": "Paramètres avancés",
|
||||
"header.links.certificates": "Attestations",
|
||||
"header.links.publisher": "Éditeur",
|
||||
"header.links.import": "Importer",
|
||||
"header.links.export": "Exporter",
|
||||
"header.links.checklists": "Listes de contrôle",
|
||||
"header.user.menu.studio": "Accueil Studio",
|
||||
"header.user.menu.maintenance": "Entretien",
|
||||
"header.user.menu.logout": "Déconnexion",
|
||||
"header.label.account.menu": "Menu de compte",
|
||||
"header.label.account.menu.for": "Menu de compte pour {username}",
|
||||
"header.label.main.nav": "Principal",
|
||||
"header.label.main.menu": "Menu principal",
|
||||
"header.label.main.header": "Principal",
|
||||
"header.label.secondary.nav": "Secondaire",
|
||||
"header.label.courseOutline": "Retour au plan de cours dans Studio"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
353
src/i18n/messages/hi.json
Normal file
353
src/i18n/messages/hi.json
Normal file
@@ -0,0 +1,353 @@
|
||||
{
|
||||
"authoring.alert.error.connection": "We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"authoring.loading": "Loading...",
|
||||
"authoring.alert.error.permission": "You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access.",
|
||||
"authoring.alert.save.error.connection": "We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "Support Page",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Cancel",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Save",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saving": "Saving",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saved": "Saved",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.retry": "Retry",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.enabled": "Enabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.disabled": "Disabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.title": "We couldn't apply your changes.",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.message": "Please check your entries and try again.",
|
||||
"course-authoring.pages-resources.calculator.heading": "Configure calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.label": "Calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.help": "The calculator supports numbers, operators, constants,\n functions, and other mathematical concepts. When enabled, an icon to\n access the calculator appears on all pages in the body of your course.",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.link": "Learn more about the calculator",
|
||||
"authoring.discussions.documentationPage": "Visit the {name} documentation page",
|
||||
"authoring.discussions.formInstructions": "Complete the fields below to set up your discussion tool.",
|
||||
"authoring.discussions.consumerKey": "Consumer Key",
|
||||
"authoring.discussions.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.discussions.consumerSecret": "Consumer Secret",
|
||||
"authoring.discussions.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.discussions.launchUrl": "Launch URL",
|
||||
"authoring.discussions.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.discussions.stuffOnlyConfigInfo": "To enable {providerName} for your course, please contact their support team at {supportEmail} to learn more about pricing and usage.",
|
||||
"authoring.discussions.stuffOnlyConfigGuide": "To fully configure {providerName} will also require sharing usernames and emails for learners and course team. Please contact your edX project coordinator to enable PII sharing for this course.",
|
||||
"authoring.discussions.piiSharing": "Optionally share a user's username and/or email with the LTI provider:",
|
||||
"authoring.discussions.piiShareUsername": "Share username",
|
||||
"authoring.discussions.piiShareEmail": "Share email",
|
||||
"authoring.discussions.appDocInstructions.contact": "Contact: {link}",
|
||||
"authoring.discussions.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.discussions.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.discussions.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.discussions.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.discussions.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.discussions.appDocInstructions.linkText": "{link}",
|
||||
"authoring.discussions.configurationChangeConsequences": "Students will lose access to any active or previous discussion posts for your course.",
|
||||
"authoring.discussions.configure.app": "Configure {name}",
|
||||
"authoring.discussions.configure": "Configure discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Cancel",
|
||||
"authoring.discussions.confirm": "Confirm",
|
||||
"authoring.discussions.confirmConfigurationChange": "Are you sure you want to change the discussion settings?",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "Enable discussions on units in graded subsections?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "Disable discussions on units in graded subsections?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.",
|
||||
"authoring.discussions.backButton": "Back",
|
||||
"authoring.discussions.saveButton": "Save",
|
||||
"authoring.discussions.savingButton": "Saving",
|
||||
"authoring.discussions.savedButton": "Saved",
|
||||
"authoring.discussions.appConfigForm.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appConfigForm.appName-yellowdig": "Yellowdig",
|
||||
"authoring.discussions.appConfigForm.appName-inscribe": "InScribe",
|
||||
"authoring.discussions.appConfigForm.appName-discourse": "Discourse",
|
||||
"authoring.discussions.appConfigForm.appName-ed-discuss": "Ed Discussion",
|
||||
"authoring.discussions.appConfigForm.appName-legacy": "edX",
|
||||
"authoring.discussions.appConfigForm.appName-openedx": "edX",
|
||||
"authoring.discussions.builtIn.divisionByGroup": "Cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.label": "Divide discussions by cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.help": "Learners will only be able to view and respond to discussions posted by members of their cohort.",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.label": "Divide course-wide discussion topics",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choose which of your general course-wide discussion topics you would like to divide.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "General",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions for the TAs",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "To adjust these settings, enable cohorts on the ",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "instructor dashboard",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibility of in-context discussions",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Enable discussions on units in graded subsections",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Allow learners to engage with discussion on all graded unit pages except timed exams.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Group in context discussion at the subsection level",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Anonymous posting",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Allow anonymous discussion posts",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "If enabled, learners can create posts that are anonymous to all users.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.label": "Allow anonymous discussion posts to peers",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.help": "Learners will be able to post anonymously to other peers but all posts will be visible to course staff.",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications": "Notifications",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.label": "Email notifications for reported content",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.help": "Discussion Admins, Moderators, Community TAs and Group Community TAs (only for their own cohort) will receive an email notification when content is reported.",
|
||||
"authoring.discussions.discussionTopics": "Discussion topics",
|
||||
"authoring.discussions.discussionTopics.label": "General discussion topics",
|
||||
"authoring.discussions.discussionTopics.help": "Discussions can include general topics not contained to the course structure. All courses have a general topic by default.",
|
||||
"authoring.discussions.discussionTopic.required": "Topic name is a required field",
|
||||
"authoring.discussions.discussionTopic.alreadyExistError": "It looks like this name is already in use",
|
||||
"authoring.discussions.addTopicButton": "Add topic",
|
||||
"authoring.discussions.deleteButton": "Delete",
|
||||
"authoring.discussions.cancelButton": "Cancel",
|
||||
"authoring.discussions.discussionTopicDeletion.help": "edX recommends that you do not delete discussion topics once your course is running.",
|
||||
"authoring.discussions.discussionTopicDeletion.label": "Delete this topic?",
|
||||
"authoring.discussions.builtIn.renameGeneralTopic.label": "Rename general topic",
|
||||
"authoring.discussions.generalTopicHelp.help": "This is the default discussion topic for your course.",
|
||||
"authoring.discussions.builtIn.configureAdditionalTopic.label": "Configure topic",
|
||||
"authoring.discussions.addTopicHelpText": "Choose a unique name for your topic",
|
||||
"authoring.discussions.blackoutDates": "Discussion blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.label": "Blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.help": "If added, learners will not be able to post in discussions between these dates.",
|
||||
"authoring.discussions.addBlackoutDatesButton": "Add blackout date range",
|
||||
"authoring.discussions.builtIn.configureBlackoutDates.label": "Configure blackout date range",
|
||||
"authoring.discussions.blackoutStartDate.help": "Enter a start date, e.g. 12/10/2023",
|
||||
"authoring.discussions.blackoutEndDate.help": "Enter an end date, e.g. 12/17/2023",
|
||||
"authoring.discussions.blackoutStartTime.help": "Enter a start time, e.g. 09:00 AM",
|
||||
"authoring.discussions.blackoutEndTime.help": "Enter an end time, e.g. 05:00 PM",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.help": "These blackout dates are currently active. If deleted, learners will be able to post in discussions during these dates. Are you sure you want to proceed?",
|
||||
"authoring.discussions.blackoutDatesDeletion.help": "If deleted, learners will be able to post in discussions during these dates.",
|
||||
"authoring.discussions.completeBlackoutDatesDeletion.help": "Are you sure you want to delete these blackout dates?",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.label": "Delete active blackout dates?",
|
||||
"authoring.discussions.blackoutDatesDeletion.label": "Delete blackout dates?",
|
||||
"authoring.blackoutDates.delete": "Delete Blackout Dates",
|
||||
"authoring.blackoutDates.status": "{status}",
|
||||
"authoring.blackoutDates.startDate.required": "Start date is a required field",
|
||||
"authoring.blackoutDates.endDate.required": "End date is a required field",
|
||||
"authoring.blackoutDates.startDate.inPast": "Start date cannot be after end date",
|
||||
"authoring.blackoutDates.endDate.inPast": "End date cannot be before start date",
|
||||
"authoring.blackoutDates.startTime.inPast": "Start time cannot be after end time",
|
||||
"authoring.blackoutDates.endTime.inPast": "End time cannot be before start time",
|
||||
"authoring.blackoutDates.startTime.inValidFormat": "Enter a valid start time",
|
||||
"authoring.blackoutDates.endTime.inValidFormat": "Enter a valid end time",
|
||||
"authoring.blackoutDates.startDate.inValidFormat": "Enter a valid start Date",
|
||||
"authoring.blackoutDates.endDate.inValidFormat": "Enter a valid end date",
|
||||
"authoring.topics.delete": "Delete Topic",
|
||||
"authoring.topics.expand": "Expand",
|
||||
"authoring.topics.collapse": "Collapse",
|
||||
"authoring.blackoutDates.start.date": "Start date",
|
||||
"authoring.blackoutDates.start.time": "Start time (optional) ({zone})",
|
||||
"authoring.blackoutDates.end.date": "End date",
|
||||
"authoring.blackoutDates.end.time": "End time (optional) ({zone})",
|
||||
"authoring.discussions.heading": "Select a discussion tool for this course",
|
||||
"authoring.discussions.supportedFeatures": "Supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-show": "Show supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-hide": "Hide supported features",
|
||||
"authoring.discussions.noApps": "There are no discussions providers available for your course.",
|
||||
"authoring.discussions.nextButton": "Next",
|
||||
"authoring.discussions.appFullSupport": "Full support",
|
||||
"authoring.discussions.appBasicSupport": "Basic support",
|
||||
"authoring.discussions.selectApp": "Select {appName}",
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Enable participation in discussion topics alongside course content.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza is designed to connect students, TAs, and professors so every student can get the help they need when they need it.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offers educators a gameful learning digital solution to improve student engagement by building learning communities for any course modality.",
|
||||
"authoring.discussions.appList.appDescription-inscribe": "InScribe leverages the power of community + artificial intelligence to connect individuals to the answers, resources, and people they need to succeed.",
|
||||
"authoring.discussions.appList.appDescription-discourse": "Discourse is modern forum software for your community. Use it as a mailing list, discussion forum, long-form chat room, and more!",
|
||||
"authoring.discussions.appList.appDescription-ed-discus": "Ed Discussion helps scale class communication in a beautiful and intuitive interface. Questions reach and benefit the whole class. Less emails, more time saved.",
|
||||
"authoring.discussions.featureName-discussion-page": "Discussion page",
|
||||
"authoring.discussions.featureName-embedded-course-sections": "Embedded course sections",
|
||||
"authoring.discussions.featureName-advanced-in-context-discussion": "Advanced in context discussion",
|
||||
"authoring.discussions.featureName-anonymous-posting": "Anonymous posting",
|
||||
"authoring.discussions.featureName-automatic-learner-enrollment": "Automatic learner enrollment",
|
||||
"authoring.discussions.featureName-blackout-discussion-dates": "Blackout discussion dates",
|
||||
"authoring.discussions.featureName-community-ta-support": "Community TA support",
|
||||
"authoring.discussions.featureName-course-cohort-support": "Course cohort support",
|
||||
"authoring.discussions.featureName-direct-messages-from-instructors": "Direct messages from instructors",
|
||||
"authoring.discussions.featureName-discussion-content-prompts": "Discussion content prompts",
|
||||
"authoring.discussions.featureName-email-notifications": "Email notifications",
|
||||
"authoring.discussions.featureName-graded-discussions": "Graded discussions",
|
||||
"authoring.discussions.featureName-in-platform-notifications": "In-platform notifications",
|
||||
"authoring.discussions.featureName-internationalization-support": "Internationalization support",
|
||||
"authoring.discussions.featureName-lti-advanced-sharing-mode": "LTI advanced sharing",
|
||||
"authoring.discussions.featureName-basic-configuration": "Basic configuration",
|
||||
"authoring.discussions.featureName-primary-discussion-app-experience": "Primary discussion app experience",
|
||||
"authoring.discussions.featureName-question-&-discussion-support": "Question & discussion support",
|
||||
"authoring.discussions.featureName-report/flag-content-to-moderators": "Report content to moderators",
|
||||
"authoring.discussions.featureName-research-data-events": "Research data events",
|
||||
"authoring.discussions.featureName-simplified-in-context-discussion": "Simplified in-context discussion",
|
||||
"authoring.discussions.featureName-user-mentions": "User mentions",
|
||||
"authoring.discussions.featureName-wcag-2.1": "WCAG 2.1 support",
|
||||
"authoring.discussions.wcag-2.0-support": "WCAG 2.0 support",
|
||||
"authoring.discussions.basic-support": "Basic support",
|
||||
"authoring.discussions.partial-support": "Partial support",
|
||||
"authoring.discussions.full-support": "Full support",
|
||||
"authoring.discussions.common-support": "Commonly requested",
|
||||
"authoring.discussions.settings": "Settings",
|
||||
"authoring.discussions.applyButton": "Apply",
|
||||
"authoring.discussions.applyingButton": "Applying",
|
||||
"authoring.discussions.appliedButton": "Applied",
|
||||
"authoring.discussions.noProviderSwitchAfterCourseStarted": "Discussion provider can't be changed after course has started, please reach out to partner support.",
|
||||
"authoring.discussions.providerSelection": "Provider selection",
|
||||
"authoring.discussions.Incomplete": "Incomplete",
|
||||
"course-authoring.pages-resources.notes.heading": "Configure notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Learners can access their notes either in the body of the\n course of on a notes page. On the notes page, a learner can see all the\n notes made during the course. The page also contains links to the location\n of the notes in the course body.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Learn more about notes",
|
||||
"authoring.live.bbb.selectPlan.label": "Select a plan",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configure Live",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Schedule meetings and conduct live course sessions with learners.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "Learn more about live",
|
||||
"authoring.live.selectProvider": "Select a video conferencing tool",
|
||||
"authoring.live.formInstructions": "Complete the fields below to set up your video conferencing tool.",
|
||||
"authoring.live.consumerKey": "Consumer Key",
|
||||
"authoring.live.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.live.consumerSecret": "Consumer Secret",
|
||||
"authoring.live.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.live.launchUrl": "Launch URL",
|
||||
"authoring.live.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.live.launchEmail": "Launch Email",
|
||||
"authoring.live.launchEmail.required": "Launch Email is a required field",
|
||||
"authoring.live.provider.helpText": "This configuration will require sharing username and emails of learners and the course team with {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "This configuration will require sharing usernames and emails of learners and the course team with {provider}. To access the LTI configuration for {provider}, please request your edX project coordinator to get PII sharing enabled for this course.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.live.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.live.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.live.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.live.appDocInstructions.linkText": "{link}",
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Microsoft Teams",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "This configuration will require sharing usernames of learners and the course team with {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "To enable this feature, contact your edX support team to enable PII sharing for this course.",
|
||||
"authoring.live.freePlanMessage": "The free plan is pre-configured, and no additional configurations are required. By selecting the free plan, you are agreeing to Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Privacy Policy.",
|
||||
"course-authoring.pages-resources.heading": "Pages & Resources",
|
||||
"course-authoring.pages-resources.resources.settings.button": "settings",
|
||||
"course-authoring.pages-resources.viewLive.button": "View live",
|
||||
"course-authoring.badge.enabled": "Enabled",
|
||||
"authoring.proctoring.no": "No",
|
||||
"authoring.proctoring.yes": "Yes",
|
||||
"authoring.proctoring.support.text": "Support Page",
|
||||
"authoring.proctoring.enableproctoredexams.label": "Proctored exams",
|
||||
"authoring.proctoring.enableproctoredexams.help": "Enable and configure proctored exams in your course.",
|
||||
"authoring.proctoring.enabled": "Enabled",
|
||||
"authoring.proctoring.learn.more": "Learn more about proctoring",
|
||||
"authoring.proctoring.provider.label": "Proctoring provider",
|
||||
"authoring.proctoring.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.proctoring.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"authoring.proctoring.escalationemail.label": "Proctortrack escalation email",
|
||||
"authoring.proctoring.escalationemail.help": "Provide an email address to be contacted by the support team for escalations (e.g. appeals, delayed reviews).",
|
||||
"authoring.proctoring.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.proctoring.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.proctoring.allowoptout.label": "Allow learners to opt out of proctoring on proctored exams",
|
||||
"authoring.proctoring.createzendesk.label": "Create Zendesk tickets for suspicious attempts",
|
||||
"authoring.proctoring.error.single": "There is 1 error in this form.",
|
||||
"authoring.proctoring.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.proctoring.save": "Save",
|
||||
"authoring.proctoring.saving": "Saving...",
|
||||
"authoring.proctoring.cancel": "Cancel",
|
||||
"authoring.proctoring.studio.link.text": "Go back to your course in Studio",
|
||||
"authoring.proctoring.alert.success": "\n Proctored exam settings saved successfully. {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.alert.error": "\n We encountered a technical error while trying to save proctored exam settings.\n This might be a temporary issue, so please try again in a few minutes.\n If the problem persists,\n please go to the {support_link} for help.\n ",
|
||||
"course-authoring.pages-resources.progress.heading": "Configure progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.label": "Progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.help": "As students work through graded assignments, scores\n will appear under the progress tab. The progress tab contains a chart of\n all graded assignments in the course, with a list of all assignments and\n scores below.",
|
||||
"course-authoring.pages-resources.progress.enable-progress.link": "Learn more about progress",
|
||||
"course-authoring.pages-resources.progress.enable-graph.label": "Enable progress graph",
|
||||
"course-authoring.pages-resources.progress.enable-graph.help": "If enabled, students can view the progress graph",
|
||||
"authoring.pagesAndResources.teams.heading": "Configure teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.label": "Teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.help": "Allow learners to work together on specific projects or activities.",
|
||||
"authoring.pagesAndResources.teams.enableTeams.link": "Learn more about teams",
|
||||
"authoring.pagesAndResources.teams.teamSize.heading": "Team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSize": "Max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeHelp": "The maximum number of learners that can join a team",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeEmpty": "Enter max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeInvalid": "Max team size must be a positive number larger than zero.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeTooHigh": "Max team size cannot be greater than {max}",
|
||||
"authoring.pagesAndResources.teams.groups.heading": "Groups",
|
||||
"authoring.pagesAndResources.teams.groups.help": "Groups are spaces where learners can create or join teams.",
|
||||
"authoring.pagesAndResources.teams.configureGroup.heading": "Configure group",
|
||||
"authoring.pagesAndResources.teams.group.name.label": "Name",
|
||||
"authoring.pagesAndResources.teams.group.name.help": "Choose a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.empty": "Enter a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.exists": "It looks like this name is already in use",
|
||||
"authoring.pagesAndResources.teams.group.description.label": "Description",
|
||||
"authoring.pagesAndResources.teams.group.description.help": "Enter details about this group",
|
||||
"authoring.pagesAndResources.teams.group.description.error": "Enter a description for this group",
|
||||
"authoring.pagesAndResources.teams.group.type.label": "Type",
|
||||
"authoring.pagesAndResources.teams.group.type.help": "Control who can see, create and join teams",
|
||||
"authoring.pagesAndResources.teams.group.types.open": "Open",
|
||||
"authoring.pagesAndResources.teams.group.types.open.description": "Learners can create, join, leave, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed": "Public managed",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed.description": "Only course staff can control teams and memberships. Learners can see other teams.",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed": "Private managed",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed.description": "Only course staff can control teams, memberships, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.label": "Max team size (optional)",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.help": "Override the global max team size",
|
||||
"authoring.pagesAndResources.teams.addGroup.button": "Add group",
|
||||
"authoring.pagesAndResources.teams.group.delete": "Delete",
|
||||
"authoring.pagesAndResources.teams.group.expand": "Expand group editor",
|
||||
"authoring.pagesAndResources.teams.group.collapse": "Close group editor",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.initiateDelete": "Delete",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.cancel-delete.button": "Cancel",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.heading": "Delete this group?",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.body": "edX recommends that you do not delete groups once your course is running.\n Your group will no longer be visible in the LMS and learners will not be able to leave teams associated with it.\n Please delete learners from teams before deleting the associated group.",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.title": "No groups found",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.message": "Add one or more groups to enable teams.",
|
||||
"course-authoring.pages-resources.wiki.heading": "Configure wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.label": "Wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.help": "The course wiki can be set up based on the needs of your\n course. Common uses might include sharing answers to course FAQs, sharing\n editable course information, or providing access to learner-created\n resources.",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.link": "Learn more about the wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.label": "Enable public wiki access",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.help": "If enabled, edX users can view the course wiki even when\n they're not enrolled in the course.",
|
||||
"authoring.examsettings.enableproctoredexams.help": "If checked, proctored exams are enabled in your course.",
|
||||
"authoring.examsettings.allowoptout.label": "Allow Opting Out of Proctored Exams",
|
||||
"authoring.examsettings.allowoptout.help": "\n If this value is \"Yes\", learners can choose to take proctored exams without proctoring.\n If this value is \"No\", all learners must take the exam with proctoring.\n ",
|
||||
"authoring.examsettings.provider.label": "Proctoring Provider",
|
||||
"authoring.examsettings.escalationemail.label": "Proctortrack Escalation Email",
|
||||
"authoring.examsettings.escalationemail.help": "\n Required if \"proctortrack\" is selected as your proctoring provider. Enter an email address to be\n contacted by the support team whenever there are escalations (e.g. appeals, delayed reviews, etc.).\n ",
|
||||
"authoring.examsettings.createzendesk.label": "Create Zendesk Tickets for Suspicious Proctored Exam Attempts",
|
||||
"authoring.examsettings.createzendesk.help": "If this value is \"Yes\", a Zendesk ticket will be created for suspicious proctored exam attempts.",
|
||||
"authoring.examsettings.submit": "Submit",
|
||||
"authoring.examsettings.alert.success": "\n Proctored exam settings saved successfully.\n You can go back to your course in Studio {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.allowoptout.no": "No",
|
||||
"authoring.examsettings.allowoptout.yes": "Yes",
|
||||
"authoring.examsettings.createzendesk.no": "No",
|
||||
"authoring.examsettings.createzendesk.yes": "Yes",
|
||||
"authoring.examsettings.support.text": "Support Page",
|
||||
"authoring.examsettings.escalationemail.enableproctoredexams.label": "Enable Proctored Exams",
|
||||
"authoring.examsettings.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.examsettings.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.examsettings.error.single": "There is 1 error in this form.",
|
||||
"authoring.examsettings.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.examsettings.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.examsettings.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"header.links.content": "Content",
|
||||
"header.links.settings": "Settings",
|
||||
"header.links.content.tools": "Tools",
|
||||
"header.links.outline": "Outline",
|
||||
"header.links.updates": "Updates",
|
||||
"header.links.pages": "Pages & Resources",
|
||||
"header.links.filesAndUploads": "Files & Uploads",
|
||||
"header.links.textbooks": "Textbooks",
|
||||
"header.links.videoUploads": "Video Uploads",
|
||||
"header.links.scheduleAndDetails": "Schedule & Details",
|
||||
"header.links.grading": "Grading",
|
||||
"header.links.courseTeam": "Course Team",
|
||||
"header.links.groupConfigurations": "Group Configurations",
|
||||
"header.links.proctoredExamSettings": "Proctored Exam Settings",
|
||||
"header.links.advancedSettings": "Advanced Settings",
|
||||
"header.links.certificates": "Certificates",
|
||||
"header.links.publisher": "Publisher",
|
||||
"header.links.import": "Import",
|
||||
"header.links.export": "Export",
|
||||
"header.links.checklists": "Checklists",
|
||||
"header.user.menu.studio": "Studio Home",
|
||||
"header.user.menu.maintenance": "Maintenance",
|
||||
"header.user.menu.logout": "Logout",
|
||||
"header.label.account.menu": "Account Menu",
|
||||
"header.label.account.menu.for": "Account menu for {username}",
|
||||
"header.label.main.nav": "Main",
|
||||
"header.label.main.menu": "Main Menu",
|
||||
"header.label.main.header": "Main",
|
||||
"header.label.secondary.nav": "Secondary",
|
||||
"header.label.courseOutline": "Back to course outline in Studio"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
353
src/i18n/messages/it.json
Normal file
353
src/i18n/messages/it.json
Normal file
@@ -0,0 +1,353 @@
|
||||
{
|
||||
"authoring.alert.error.connection": "We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"authoring.loading": "Loading...",
|
||||
"authoring.alert.error.permission": "You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access.",
|
||||
"authoring.alert.save.error.connection": "We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "Support Page",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Cancel",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Save",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saving": "Saving",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saved": "Saved",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.retry": "Retry",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.enabled": "Enabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.disabled": "Disabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.title": "We couldn't apply your changes.",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.message": "Please check your entries and try again.",
|
||||
"course-authoring.pages-resources.calculator.heading": "Configure calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.label": "Calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.help": "The calculator supports numbers, operators, constants,\n functions, and other mathematical concepts. When enabled, an icon to\n access the calculator appears on all pages in the body of your course.",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.link": "Learn more about the calculator",
|
||||
"authoring.discussions.documentationPage": "Visit the {name} documentation page",
|
||||
"authoring.discussions.formInstructions": "Complete the fields below to set up your discussion tool.",
|
||||
"authoring.discussions.consumerKey": "Consumer Key",
|
||||
"authoring.discussions.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.discussions.consumerSecret": "Consumer Secret",
|
||||
"authoring.discussions.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.discussions.launchUrl": "Launch URL",
|
||||
"authoring.discussions.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.discussions.stuffOnlyConfigInfo": "To enable {providerName} for your course, please contact their support team at {supportEmail} to learn more about pricing and usage.",
|
||||
"authoring.discussions.stuffOnlyConfigGuide": "To fully configure {providerName} will also require sharing usernames and emails for learners and course team. Please contact your edX project coordinator to enable PII sharing for this course.",
|
||||
"authoring.discussions.piiSharing": "Optionally share a user's username and/or email with the LTI provider:",
|
||||
"authoring.discussions.piiShareUsername": "Share username",
|
||||
"authoring.discussions.piiShareEmail": "Share email",
|
||||
"authoring.discussions.appDocInstructions.contact": "Contact: {link}",
|
||||
"authoring.discussions.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.discussions.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.discussions.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.discussions.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.discussions.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.discussions.appDocInstructions.linkText": "{link}",
|
||||
"authoring.discussions.configurationChangeConsequences": "Students will lose access to any active or previous discussion posts for your course.",
|
||||
"authoring.discussions.configure.app": "Configure {name}",
|
||||
"authoring.discussions.configure": "Configure discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Cancel",
|
||||
"authoring.discussions.confirm": "Confirm",
|
||||
"authoring.discussions.confirmConfigurationChange": "Are you sure you want to change the discussion settings?",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "Enable discussions on units in graded subsections?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "Disable discussions on units in graded subsections?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.",
|
||||
"authoring.discussions.backButton": "Back",
|
||||
"authoring.discussions.saveButton": "Save",
|
||||
"authoring.discussions.savingButton": "Saving",
|
||||
"authoring.discussions.savedButton": "Saved",
|
||||
"authoring.discussions.appConfigForm.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appConfigForm.appName-yellowdig": "Yellowdig",
|
||||
"authoring.discussions.appConfigForm.appName-inscribe": "InScribe",
|
||||
"authoring.discussions.appConfigForm.appName-discourse": "Discourse",
|
||||
"authoring.discussions.appConfigForm.appName-ed-discuss": "Ed Discussion",
|
||||
"authoring.discussions.appConfigForm.appName-legacy": "edX",
|
||||
"authoring.discussions.appConfigForm.appName-openedx": "edX",
|
||||
"authoring.discussions.builtIn.divisionByGroup": "Cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.label": "Divide discussions by cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.help": "Learners will only be able to view and respond to discussions posted by members of their cohort.",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.label": "Divide course-wide discussion topics",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choose which of your general course-wide discussion topics you would like to divide.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "General",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions for the TAs",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "To adjust these settings, enable cohorts on the ",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "instructor dashboard",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibility of in-context discussions",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Enable discussions on units in graded subsections",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Allow learners to engage with discussion on all graded unit pages except timed exams.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Group in context discussion at the subsection level",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Anonymous posting",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Allow anonymous discussion posts",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "If enabled, learners can create posts that are anonymous to all users.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.label": "Allow anonymous discussion posts to peers",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.help": "Learners will be able to post anonymously to other peers but all posts will be visible to course staff.",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications": "Notifications",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.label": "Email notifications for reported content",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.help": "Discussion Admins, Moderators, Community TAs and Group Community TAs (only for their own cohort) will receive an email notification when content is reported.",
|
||||
"authoring.discussions.discussionTopics": "Discussion topics",
|
||||
"authoring.discussions.discussionTopics.label": "General discussion topics",
|
||||
"authoring.discussions.discussionTopics.help": "Discussions can include general topics not contained to the course structure. All courses have a general topic by default.",
|
||||
"authoring.discussions.discussionTopic.required": "Topic name is a required field",
|
||||
"authoring.discussions.discussionTopic.alreadyExistError": "It looks like this name is already in use",
|
||||
"authoring.discussions.addTopicButton": "Add topic",
|
||||
"authoring.discussions.deleteButton": "Delete",
|
||||
"authoring.discussions.cancelButton": "Cancel",
|
||||
"authoring.discussions.discussionTopicDeletion.help": "edX recommends that you do not delete discussion topics once your course is running.",
|
||||
"authoring.discussions.discussionTopicDeletion.label": "Delete this topic?",
|
||||
"authoring.discussions.builtIn.renameGeneralTopic.label": "Rename general topic",
|
||||
"authoring.discussions.generalTopicHelp.help": "This is the default discussion topic for your course.",
|
||||
"authoring.discussions.builtIn.configureAdditionalTopic.label": "Configure topic",
|
||||
"authoring.discussions.addTopicHelpText": "Choose a unique name for your topic",
|
||||
"authoring.discussions.blackoutDates": "Discussion blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.label": "Blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.help": "If added, learners will not be able to post in discussions between these dates.",
|
||||
"authoring.discussions.addBlackoutDatesButton": "Add blackout date range",
|
||||
"authoring.discussions.builtIn.configureBlackoutDates.label": "Configure blackout date range",
|
||||
"authoring.discussions.blackoutStartDate.help": "Enter a start date, e.g. 12/10/2023",
|
||||
"authoring.discussions.blackoutEndDate.help": "Enter an end date, e.g. 12/17/2023",
|
||||
"authoring.discussions.blackoutStartTime.help": "Enter a start time, e.g. 09:00 AM",
|
||||
"authoring.discussions.blackoutEndTime.help": "Enter an end time, e.g. 05:00 PM",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.help": "These blackout dates are currently active. If deleted, learners will be able to post in discussions during these dates. Are you sure you want to proceed?",
|
||||
"authoring.discussions.blackoutDatesDeletion.help": "If deleted, learners will be able to post in discussions during these dates.",
|
||||
"authoring.discussions.completeBlackoutDatesDeletion.help": "Are you sure you want to delete these blackout dates?",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.label": "Delete active blackout dates?",
|
||||
"authoring.discussions.blackoutDatesDeletion.label": "Delete blackout dates?",
|
||||
"authoring.blackoutDates.delete": "Delete Blackout Dates",
|
||||
"authoring.blackoutDates.status": "{status}",
|
||||
"authoring.blackoutDates.startDate.required": "Start date is a required field",
|
||||
"authoring.blackoutDates.endDate.required": "End date is a required field",
|
||||
"authoring.blackoutDates.startDate.inPast": "Start date cannot be after end date",
|
||||
"authoring.blackoutDates.endDate.inPast": "End date cannot be before start date",
|
||||
"authoring.blackoutDates.startTime.inPast": "Start time cannot be after end time",
|
||||
"authoring.blackoutDates.endTime.inPast": "End time cannot be before start time",
|
||||
"authoring.blackoutDates.startTime.inValidFormat": "Enter a valid start time",
|
||||
"authoring.blackoutDates.endTime.inValidFormat": "Enter a valid end time",
|
||||
"authoring.blackoutDates.startDate.inValidFormat": "Enter a valid start Date",
|
||||
"authoring.blackoutDates.endDate.inValidFormat": "Enter a valid end date",
|
||||
"authoring.topics.delete": "Delete Topic",
|
||||
"authoring.topics.expand": "Expand",
|
||||
"authoring.topics.collapse": "Collapse",
|
||||
"authoring.blackoutDates.start.date": "Start date",
|
||||
"authoring.blackoutDates.start.time": "Start time (optional) ({zone})",
|
||||
"authoring.blackoutDates.end.date": "End date",
|
||||
"authoring.blackoutDates.end.time": "End time (optional) ({zone})",
|
||||
"authoring.discussions.heading": "Select a discussion tool for this course",
|
||||
"authoring.discussions.supportedFeatures": "Supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-show": "Show supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-hide": "Hide supported features",
|
||||
"authoring.discussions.noApps": "There are no discussions providers available for your course.",
|
||||
"authoring.discussions.nextButton": "Next",
|
||||
"authoring.discussions.appFullSupport": "Full support",
|
||||
"authoring.discussions.appBasicSupport": "Basic support",
|
||||
"authoring.discussions.selectApp": "Select {appName}",
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Enable participation in discussion topics alongside course content.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza is designed to connect students, TAs, and professors so every student can get the help they need when they need it.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offers educators a gameful learning digital solution to improve student engagement by building learning communities for any course modality.",
|
||||
"authoring.discussions.appList.appDescription-inscribe": "InScribe leverages the power of community + artificial intelligence to connect individuals to the answers, resources, and people they need to succeed.",
|
||||
"authoring.discussions.appList.appDescription-discourse": "Discourse is modern forum software for your community. Use it as a mailing list, discussion forum, long-form chat room, and more!",
|
||||
"authoring.discussions.appList.appDescription-ed-discus": "Ed Discussion helps scale class communication in a beautiful and intuitive interface. Questions reach and benefit the whole class. Less emails, more time saved.",
|
||||
"authoring.discussions.featureName-discussion-page": "Discussion page",
|
||||
"authoring.discussions.featureName-embedded-course-sections": "Embedded course sections",
|
||||
"authoring.discussions.featureName-advanced-in-context-discussion": "Advanced in context discussion",
|
||||
"authoring.discussions.featureName-anonymous-posting": "Anonymous posting",
|
||||
"authoring.discussions.featureName-automatic-learner-enrollment": "Automatic learner enrollment",
|
||||
"authoring.discussions.featureName-blackout-discussion-dates": "Blackout discussion dates",
|
||||
"authoring.discussions.featureName-community-ta-support": "Community TA support",
|
||||
"authoring.discussions.featureName-course-cohort-support": "Course cohort support",
|
||||
"authoring.discussions.featureName-direct-messages-from-instructors": "Direct messages from instructors",
|
||||
"authoring.discussions.featureName-discussion-content-prompts": "Discussion content prompts",
|
||||
"authoring.discussions.featureName-email-notifications": "Email notifications",
|
||||
"authoring.discussions.featureName-graded-discussions": "Graded discussions",
|
||||
"authoring.discussions.featureName-in-platform-notifications": "In-platform notifications",
|
||||
"authoring.discussions.featureName-internationalization-support": "Internationalization support",
|
||||
"authoring.discussions.featureName-lti-advanced-sharing-mode": "LTI advanced sharing",
|
||||
"authoring.discussions.featureName-basic-configuration": "Basic configuration",
|
||||
"authoring.discussions.featureName-primary-discussion-app-experience": "Primary discussion app experience",
|
||||
"authoring.discussions.featureName-question-&-discussion-support": "Question & discussion support",
|
||||
"authoring.discussions.featureName-report/flag-content-to-moderators": "Report content to moderators",
|
||||
"authoring.discussions.featureName-research-data-events": "Research data events",
|
||||
"authoring.discussions.featureName-simplified-in-context-discussion": "Simplified in-context discussion",
|
||||
"authoring.discussions.featureName-user-mentions": "User mentions",
|
||||
"authoring.discussions.featureName-wcag-2.1": "WCAG 2.1 support",
|
||||
"authoring.discussions.wcag-2.0-support": "WCAG 2.0 support",
|
||||
"authoring.discussions.basic-support": "Basic support",
|
||||
"authoring.discussions.partial-support": "Partial support",
|
||||
"authoring.discussions.full-support": "Full support",
|
||||
"authoring.discussions.common-support": "Commonly requested",
|
||||
"authoring.discussions.settings": "Settings",
|
||||
"authoring.discussions.applyButton": "Apply",
|
||||
"authoring.discussions.applyingButton": "Applying",
|
||||
"authoring.discussions.appliedButton": "Applied",
|
||||
"authoring.discussions.noProviderSwitchAfterCourseStarted": "Discussion provider can't be changed after course has started, please reach out to partner support.",
|
||||
"authoring.discussions.providerSelection": "Provider selection",
|
||||
"authoring.discussions.Incomplete": "Incomplete",
|
||||
"course-authoring.pages-resources.notes.heading": "Configure notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Learners can access their notes either in the body of the\n course of on a notes page. On the notes page, a learner can see all the\n notes made during the course. The page also contains links to the location\n of the notes in the course body.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Learn more about notes",
|
||||
"authoring.live.bbb.selectPlan.label": "Select a plan",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configure Live",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Schedule meetings and conduct live course sessions with learners.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "Learn more about live",
|
||||
"authoring.live.selectProvider": "Select a video conferencing tool",
|
||||
"authoring.live.formInstructions": "Complete the fields below to set up your video conferencing tool.",
|
||||
"authoring.live.consumerKey": "Consumer Key",
|
||||
"authoring.live.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.live.consumerSecret": "Consumer Secret",
|
||||
"authoring.live.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.live.launchUrl": "Launch URL",
|
||||
"authoring.live.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.live.launchEmail": "Launch Email",
|
||||
"authoring.live.launchEmail.required": "Launch Email is a required field",
|
||||
"authoring.live.provider.helpText": "This configuration will require sharing username and emails of learners and the course team with {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "This configuration will require sharing usernames and emails of learners and the course team with {provider}. To access the LTI configuration for {provider}, please request your edX project coordinator to get PII sharing enabled for this course.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.live.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.live.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.live.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.live.appDocInstructions.linkText": "{link}",
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Microsoft Teams",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "This configuration will require sharing usernames of learners and the course team with {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "To enable this feature, contact your edX support team to enable PII sharing for this course.",
|
||||
"authoring.live.freePlanMessage": "The free plan is pre-configured, and no additional configurations are required. By selecting the free plan, you are agreeing to Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Privacy Policy.",
|
||||
"course-authoring.pages-resources.heading": "Pages & Resources",
|
||||
"course-authoring.pages-resources.resources.settings.button": "settings",
|
||||
"course-authoring.pages-resources.viewLive.button": "View live",
|
||||
"course-authoring.badge.enabled": "Enabled",
|
||||
"authoring.proctoring.no": "No",
|
||||
"authoring.proctoring.yes": "Yes",
|
||||
"authoring.proctoring.support.text": "Support Page",
|
||||
"authoring.proctoring.enableproctoredexams.label": "Proctored exams",
|
||||
"authoring.proctoring.enableproctoredexams.help": "Enable and configure proctored exams in your course.",
|
||||
"authoring.proctoring.enabled": "Enabled",
|
||||
"authoring.proctoring.learn.more": "Learn more about proctoring",
|
||||
"authoring.proctoring.provider.label": "Proctoring provider",
|
||||
"authoring.proctoring.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.proctoring.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"authoring.proctoring.escalationemail.label": "Proctortrack escalation email",
|
||||
"authoring.proctoring.escalationemail.help": "Provide an email address to be contacted by the support team for escalations (e.g. appeals, delayed reviews).",
|
||||
"authoring.proctoring.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.proctoring.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.proctoring.allowoptout.label": "Allow learners to opt out of proctoring on proctored exams",
|
||||
"authoring.proctoring.createzendesk.label": "Create Zendesk tickets for suspicious attempts",
|
||||
"authoring.proctoring.error.single": "There is 1 error in this form.",
|
||||
"authoring.proctoring.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.proctoring.save": "Save",
|
||||
"authoring.proctoring.saving": "Saving...",
|
||||
"authoring.proctoring.cancel": "Cancel",
|
||||
"authoring.proctoring.studio.link.text": "Go back to your course in Studio",
|
||||
"authoring.proctoring.alert.success": "\n Proctored exam settings saved successfully. {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.alert.error": "\n We encountered a technical error while trying to save proctored exam settings.\n This might be a temporary issue, so please try again in a few minutes.\n If the problem persists,\n please go to the {support_link} for help.\n ",
|
||||
"course-authoring.pages-resources.progress.heading": "Configure progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.label": "Progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.help": "As students work through graded assignments, scores\n will appear under the progress tab. The progress tab contains a chart of\n all graded assignments in the course, with a list of all assignments and\n scores below.",
|
||||
"course-authoring.pages-resources.progress.enable-progress.link": "Learn more about progress",
|
||||
"course-authoring.pages-resources.progress.enable-graph.label": "Enable progress graph",
|
||||
"course-authoring.pages-resources.progress.enable-graph.help": "If enabled, students can view the progress graph",
|
||||
"authoring.pagesAndResources.teams.heading": "Configure teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.label": "Teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.help": "Allow learners to work together on specific projects or activities.",
|
||||
"authoring.pagesAndResources.teams.enableTeams.link": "Learn more about teams",
|
||||
"authoring.pagesAndResources.teams.teamSize.heading": "Team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSize": "Max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeHelp": "The maximum number of learners that can join a team",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeEmpty": "Enter max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeInvalid": "Max team size must be a positive number larger than zero.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeTooHigh": "Max team size cannot be greater than {max}",
|
||||
"authoring.pagesAndResources.teams.groups.heading": "Groups",
|
||||
"authoring.pagesAndResources.teams.groups.help": "Groups are spaces where learners can create or join teams.",
|
||||
"authoring.pagesAndResources.teams.configureGroup.heading": "Configure group",
|
||||
"authoring.pagesAndResources.teams.group.name.label": "Name",
|
||||
"authoring.pagesAndResources.teams.group.name.help": "Choose a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.empty": "Enter a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.exists": "It looks like this name is already in use",
|
||||
"authoring.pagesAndResources.teams.group.description.label": "Description",
|
||||
"authoring.pagesAndResources.teams.group.description.help": "Enter details about this group",
|
||||
"authoring.pagesAndResources.teams.group.description.error": "Enter a description for this group",
|
||||
"authoring.pagesAndResources.teams.group.type.label": "Type",
|
||||
"authoring.pagesAndResources.teams.group.type.help": "Control who can see, create and join teams",
|
||||
"authoring.pagesAndResources.teams.group.types.open": "Open",
|
||||
"authoring.pagesAndResources.teams.group.types.open.description": "Learners can create, join, leave, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed": "Public managed",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed.description": "Only course staff can control teams and memberships. Learners can see other teams.",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed": "Private managed",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed.description": "Only course staff can control teams, memberships, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.label": "Max team size (optional)",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.help": "Override the global max team size",
|
||||
"authoring.pagesAndResources.teams.addGroup.button": "Add group",
|
||||
"authoring.pagesAndResources.teams.group.delete": "Delete",
|
||||
"authoring.pagesAndResources.teams.group.expand": "Expand group editor",
|
||||
"authoring.pagesAndResources.teams.group.collapse": "Close group editor",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.initiateDelete": "Delete",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.cancel-delete.button": "Cancel",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.heading": "Delete this group?",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.body": "edX recommends that you do not delete groups once your course is running.\n Your group will no longer be visible in the LMS and learners will not be able to leave teams associated with it.\n Please delete learners from teams before deleting the associated group.",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.title": "No groups found",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.message": "Add one or more groups to enable teams.",
|
||||
"course-authoring.pages-resources.wiki.heading": "Configure wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.label": "Wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.help": "The course wiki can be set up based on the needs of your\n course. Common uses might include sharing answers to course FAQs, sharing\n editable course information, or providing access to learner-created\n resources.",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.link": "Learn more about the wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.label": "Enable public wiki access",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.help": "If enabled, edX users can view the course wiki even when\n they're not enrolled in the course.",
|
||||
"authoring.examsettings.enableproctoredexams.help": "If checked, proctored exams are enabled in your course.",
|
||||
"authoring.examsettings.allowoptout.label": "Allow Opting Out of Proctored Exams",
|
||||
"authoring.examsettings.allowoptout.help": "\n If this value is \"Yes\", learners can choose to take proctored exams without proctoring.\n If this value is \"No\", all learners must take the exam with proctoring.\n ",
|
||||
"authoring.examsettings.provider.label": "Proctoring Provider",
|
||||
"authoring.examsettings.escalationemail.label": "Proctortrack Escalation Email",
|
||||
"authoring.examsettings.escalationemail.help": "\n Required if \"proctortrack\" is selected as your proctoring provider. Enter an email address to be\n contacted by the support team whenever there are escalations (e.g. appeals, delayed reviews, etc.).\n ",
|
||||
"authoring.examsettings.createzendesk.label": "Create Zendesk Tickets for Suspicious Proctored Exam Attempts",
|
||||
"authoring.examsettings.createzendesk.help": "If this value is \"Yes\", a Zendesk ticket will be created for suspicious proctored exam attempts.",
|
||||
"authoring.examsettings.submit": "Submit",
|
||||
"authoring.examsettings.alert.success": "\n Proctored exam settings saved successfully.\n You can go back to your course in Studio {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.allowoptout.no": "No",
|
||||
"authoring.examsettings.allowoptout.yes": "Yes",
|
||||
"authoring.examsettings.createzendesk.no": "No",
|
||||
"authoring.examsettings.createzendesk.yes": "Yes",
|
||||
"authoring.examsettings.support.text": "Support Page",
|
||||
"authoring.examsettings.escalationemail.enableproctoredexams.label": "Enable Proctored Exams",
|
||||
"authoring.examsettings.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.examsettings.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.examsettings.error.single": "There is 1 error in this form.",
|
||||
"authoring.examsettings.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.examsettings.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.examsettings.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"header.links.content": "Content",
|
||||
"header.links.settings": "Settings",
|
||||
"header.links.content.tools": "Tools",
|
||||
"header.links.outline": "Outline",
|
||||
"header.links.updates": "Updates",
|
||||
"header.links.pages": "Pages & Resources",
|
||||
"header.links.filesAndUploads": "Files & Uploads",
|
||||
"header.links.textbooks": "Textbooks",
|
||||
"header.links.videoUploads": "Video Uploads",
|
||||
"header.links.scheduleAndDetails": "Schedule & Details",
|
||||
"header.links.grading": "Grading",
|
||||
"header.links.courseTeam": "Course Team",
|
||||
"header.links.groupConfigurations": "Group Configurations",
|
||||
"header.links.proctoredExamSettings": "Proctored Exam Settings",
|
||||
"header.links.advancedSettings": "Advanced Settings",
|
||||
"header.links.certificates": "Certificates",
|
||||
"header.links.publisher": "Publisher",
|
||||
"header.links.import": "Import",
|
||||
"header.links.export": "Export",
|
||||
"header.links.checklists": "Checklists",
|
||||
"header.user.menu.studio": "Studio Home",
|
||||
"header.user.menu.maintenance": "Maintenance",
|
||||
"header.user.menu.logout": "Logout",
|
||||
"header.label.account.menu": "Account Menu",
|
||||
"header.label.account.menu.for": "Account menu for {username}",
|
||||
"header.label.main.nav": "Main",
|
||||
"header.label.main.menu": "Main Menu",
|
||||
"header.label.main.header": "Main",
|
||||
"header.label.secondary.nav": "Secondary",
|
||||
"header.label.courseOutline": "Back to course outline in Studio"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
353
src/i18n/messages/pt.json
Normal file
353
src/i18n/messages/pt.json
Normal file
@@ -0,0 +1,353 @@
|
||||
{
|
||||
"authoring.alert.error.connection": "We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"authoring.loading": "Loading...",
|
||||
"authoring.alert.error.permission": "You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access.",
|
||||
"authoring.alert.save.error.connection": "We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "Support Page",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Cancel",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Save",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saving": "Saving",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saved": "Saved",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.retry": "Retry",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.enabled": "Enabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.disabled": "Disabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.title": "We couldn't apply your changes.",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.message": "Please check your entries and try again.",
|
||||
"course-authoring.pages-resources.calculator.heading": "Configure calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.label": "Calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.help": "The calculator supports numbers, operators, constants,\n functions, and other mathematical concepts. When enabled, an icon to\n access the calculator appears on all pages in the body of your course.",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.link": "Learn more about the calculator",
|
||||
"authoring.discussions.documentationPage": "Visit the {name} documentation page",
|
||||
"authoring.discussions.formInstructions": "Complete the fields below to set up your discussion tool.",
|
||||
"authoring.discussions.consumerKey": "Consumer Key",
|
||||
"authoring.discussions.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.discussions.consumerSecret": "Consumer Secret",
|
||||
"authoring.discussions.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.discussions.launchUrl": "Launch URL",
|
||||
"authoring.discussions.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.discussions.stuffOnlyConfigInfo": "To enable {providerName} for your course, please contact their support team at {supportEmail} to learn more about pricing and usage.",
|
||||
"authoring.discussions.stuffOnlyConfigGuide": "To fully configure {providerName} will also require sharing usernames and emails for learners and course team. Please contact your edX project coordinator to enable PII sharing for this course.",
|
||||
"authoring.discussions.piiSharing": "Optionally share a user's username and/or email with the LTI provider:",
|
||||
"authoring.discussions.piiShareUsername": "Share username",
|
||||
"authoring.discussions.piiShareEmail": "Share email",
|
||||
"authoring.discussions.appDocInstructions.contact": "Contact: {link}",
|
||||
"authoring.discussions.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.discussions.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.discussions.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.discussions.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.discussions.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.discussions.appDocInstructions.linkText": "{link}",
|
||||
"authoring.discussions.configurationChangeConsequences": "Students will lose access to any active or previous discussion posts for your course.",
|
||||
"authoring.discussions.configure.app": "Configure {name}",
|
||||
"authoring.discussions.configure": "Configure discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Cancel",
|
||||
"authoring.discussions.confirm": "Confirm",
|
||||
"authoring.discussions.confirmConfigurationChange": "Are you sure you want to change the discussion settings?",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "Enable discussions on units in graded subsections?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "Disable discussions on units in graded subsections?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.",
|
||||
"authoring.discussions.backButton": "Back",
|
||||
"authoring.discussions.saveButton": "Save",
|
||||
"authoring.discussions.savingButton": "Saving",
|
||||
"authoring.discussions.savedButton": "Saved",
|
||||
"authoring.discussions.appConfigForm.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appConfigForm.appName-yellowdig": "Yellowdig",
|
||||
"authoring.discussions.appConfigForm.appName-inscribe": "InScribe",
|
||||
"authoring.discussions.appConfigForm.appName-discourse": "Discourse",
|
||||
"authoring.discussions.appConfigForm.appName-ed-discuss": "Ed Discussion",
|
||||
"authoring.discussions.appConfigForm.appName-legacy": "edX",
|
||||
"authoring.discussions.appConfigForm.appName-openedx": "edX",
|
||||
"authoring.discussions.builtIn.divisionByGroup": "Cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.label": "Divide discussions by cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.help": "Learners will only be able to view and respond to discussions posted by members of their cohort.",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.label": "Divide course-wide discussion topics",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choose which of your general course-wide discussion topics you would like to divide.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "General",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions for the TAs",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "To adjust these settings, enable cohorts on the ",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "instructor dashboard",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibility of in-context discussions",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Enable discussions on units in graded subsections",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Allow learners to engage with discussion on all graded unit pages except timed exams.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Group in context discussion at the subsection level",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Anonymous posting",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Allow anonymous discussion posts",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "If enabled, learners can create posts that are anonymous to all users.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.label": "Allow anonymous discussion posts to peers",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.help": "Learners will be able to post anonymously to other peers but all posts will be visible to course staff.",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications": "Notifications",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.label": "Email notifications for reported content",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.help": "Discussion Admins, Moderators, Community TAs and Group Community TAs (only for their own cohort) will receive an email notification when content is reported.",
|
||||
"authoring.discussions.discussionTopics": "Discussion topics",
|
||||
"authoring.discussions.discussionTopics.label": "General discussion topics",
|
||||
"authoring.discussions.discussionTopics.help": "Discussions can include general topics not contained to the course structure. All courses have a general topic by default.",
|
||||
"authoring.discussions.discussionTopic.required": "Topic name is a required field",
|
||||
"authoring.discussions.discussionTopic.alreadyExistError": "It looks like this name is already in use",
|
||||
"authoring.discussions.addTopicButton": "Add topic",
|
||||
"authoring.discussions.deleteButton": "Delete",
|
||||
"authoring.discussions.cancelButton": "Cancel",
|
||||
"authoring.discussions.discussionTopicDeletion.help": "edX recommends that you do not delete discussion topics once your course is running.",
|
||||
"authoring.discussions.discussionTopicDeletion.label": "Delete this topic?",
|
||||
"authoring.discussions.builtIn.renameGeneralTopic.label": "Rename general topic",
|
||||
"authoring.discussions.generalTopicHelp.help": "This is the default discussion topic for your course.",
|
||||
"authoring.discussions.builtIn.configureAdditionalTopic.label": "Configure topic",
|
||||
"authoring.discussions.addTopicHelpText": "Choose a unique name for your topic",
|
||||
"authoring.discussions.blackoutDates": "Discussion blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.label": "Blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.help": "If added, learners will not be able to post in discussions between these dates.",
|
||||
"authoring.discussions.addBlackoutDatesButton": "Add blackout date range",
|
||||
"authoring.discussions.builtIn.configureBlackoutDates.label": "Configure blackout date range",
|
||||
"authoring.discussions.blackoutStartDate.help": "Enter a start date, e.g. 12/10/2023",
|
||||
"authoring.discussions.blackoutEndDate.help": "Enter an end date, e.g. 12/17/2023",
|
||||
"authoring.discussions.blackoutStartTime.help": "Enter a start time, e.g. 09:00 AM",
|
||||
"authoring.discussions.blackoutEndTime.help": "Enter an end time, e.g. 05:00 PM",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.help": "These blackout dates are currently active. If deleted, learners will be able to post in discussions during these dates. Are you sure you want to proceed?",
|
||||
"authoring.discussions.blackoutDatesDeletion.help": "If deleted, learners will be able to post in discussions during these dates.",
|
||||
"authoring.discussions.completeBlackoutDatesDeletion.help": "Are you sure you want to delete these blackout dates?",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.label": "Delete active blackout dates?",
|
||||
"authoring.discussions.blackoutDatesDeletion.label": "Delete blackout dates?",
|
||||
"authoring.blackoutDates.delete": "Delete Blackout Dates",
|
||||
"authoring.blackoutDates.status": "{status}",
|
||||
"authoring.blackoutDates.startDate.required": "Start date is a required field",
|
||||
"authoring.blackoutDates.endDate.required": "End date is a required field",
|
||||
"authoring.blackoutDates.startDate.inPast": "Start date cannot be after end date",
|
||||
"authoring.blackoutDates.endDate.inPast": "End date cannot be before start date",
|
||||
"authoring.blackoutDates.startTime.inPast": "Start time cannot be after end time",
|
||||
"authoring.blackoutDates.endTime.inPast": "End time cannot be before start time",
|
||||
"authoring.blackoutDates.startTime.inValidFormat": "Enter a valid start time",
|
||||
"authoring.blackoutDates.endTime.inValidFormat": "Enter a valid end time",
|
||||
"authoring.blackoutDates.startDate.inValidFormat": "Enter a valid start Date",
|
||||
"authoring.blackoutDates.endDate.inValidFormat": "Enter a valid end date",
|
||||
"authoring.topics.delete": "Delete Topic",
|
||||
"authoring.topics.expand": "Expand",
|
||||
"authoring.topics.collapse": "Collapse",
|
||||
"authoring.blackoutDates.start.date": "Start date",
|
||||
"authoring.blackoutDates.start.time": "Start time (optional) ({zone})",
|
||||
"authoring.blackoutDates.end.date": "End date",
|
||||
"authoring.blackoutDates.end.time": "End time (optional) ({zone})",
|
||||
"authoring.discussions.heading": "Select a discussion tool for this course",
|
||||
"authoring.discussions.supportedFeatures": "Supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-show": "Show supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-hide": "Hide supported features",
|
||||
"authoring.discussions.noApps": "There are no discussions providers available for your course.",
|
||||
"authoring.discussions.nextButton": "Next",
|
||||
"authoring.discussions.appFullSupport": "Full support",
|
||||
"authoring.discussions.appBasicSupport": "Basic support",
|
||||
"authoring.discussions.selectApp": "Select {appName}",
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Enable participation in discussion topics alongside course content.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza is designed to connect students, TAs, and professors so every student can get the help they need when they need it.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offers educators a gameful learning digital solution to improve student engagement by building learning communities for any course modality.",
|
||||
"authoring.discussions.appList.appDescription-inscribe": "InScribe leverages the power of community + artificial intelligence to connect individuals to the answers, resources, and people they need to succeed.",
|
||||
"authoring.discussions.appList.appDescription-discourse": "Discourse is modern forum software for your community. Use it as a mailing list, discussion forum, long-form chat room, and more!",
|
||||
"authoring.discussions.appList.appDescription-ed-discus": "Ed Discussion helps scale class communication in a beautiful and intuitive interface. Questions reach and benefit the whole class. Less emails, more time saved.",
|
||||
"authoring.discussions.featureName-discussion-page": "Discussion page",
|
||||
"authoring.discussions.featureName-embedded-course-sections": "Embedded course sections",
|
||||
"authoring.discussions.featureName-advanced-in-context-discussion": "Advanced in context discussion",
|
||||
"authoring.discussions.featureName-anonymous-posting": "Anonymous posting",
|
||||
"authoring.discussions.featureName-automatic-learner-enrollment": "Automatic learner enrollment",
|
||||
"authoring.discussions.featureName-blackout-discussion-dates": "Blackout discussion dates",
|
||||
"authoring.discussions.featureName-community-ta-support": "Community TA support",
|
||||
"authoring.discussions.featureName-course-cohort-support": "Course cohort support",
|
||||
"authoring.discussions.featureName-direct-messages-from-instructors": "Direct messages from instructors",
|
||||
"authoring.discussions.featureName-discussion-content-prompts": "Discussion content prompts",
|
||||
"authoring.discussions.featureName-email-notifications": "Email notifications",
|
||||
"authoring.discussions.featureName-graded-discussions": "Graded discussions",
|
||||
"authoring.discussions.featureName-in-platform-notifications": "In-platform notifications",
|
||||
"authoring.discussions.featureName-internationalization-support": "Internationalization support",
|
||||
"authoring.discussions.featureName-lti-advanced-sharing-mode": "LTI advanced sharing",
|
||||
"authoring.discussions.featureName-basic-configuration": "Basic configuration",
|
||||
"authoring.discussions.featureName-primary-discussion-app-experience": "Primary discussion app experience",
|
||||
"authoring.discussions.featureName-question-&-discussion-support": "Question & discussion support",
|
||||
"authoring.discussions.featureName-report/flag-content-to-moderators": "Report content to moderators",
|
||||
"authoring.discussions.featureName-research-data-events": "Research data events",
|
||||
"authoring.discussions.featureName-simplified-in-context-discussion": "Simplified in-context discussion",
|
||||
"authoring.discussions.featureName-user-mentions": "User mentions",
|
||||
"authoring.discussions.featureName-wcag-2.1": "WCAG 2.1 support",
|
||||
"authoring.discussions.wcag-2.0-support": "WCAG 2.0 support",
|
||||
"authoring.discussions.basic-support": "Basic support",
|
||||
"authoring.discussions.partial-support": "Partial support",
|
||||
"authoring.discussions.full-support": "Full support",
|
||||
"authoring.discussions.common-support": "Commonly requested",
|
||||
"authoring.discussions.settings": "Settings",
|
||||
"authoring.discussions.applyButton": "Apply",
|
||||
"authoring.discussions.applyingButton": "Applying",
|
||||
"authoring.discussions.appliedButton": "Applied",
|
||||
"authoring.discussions.noProviderSwitchAfterCourseStarted": "Discussion provider can't be changed after course has started, please reach out to partner support.",
|
||||
"authoring.discussions.providerSelection": "Provider selection",
|
||||
"authoring.discussions.Incomplete": "Incomplete",
|
||||
"course-authoring.pages-resources.notes.heading": "Configure notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Learners can access their notes either in the body of the\n course of on a notes page. On the notes page, a learner can see all the\n notes made during the course. The page also contains links to the location\n of the notes in the course body.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Learn more about notes",
|
||||
"authoring.live.bbb.selectPlan.label": "Select a plan",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configure Live",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Schedule meetings and conduct live course sessions with learners.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "Learn more about live",
|
||||
"authoring.live.selectProvider": "Select a video conferencing tool",
|
||||
"authoring.live.formInstructions": "Complete the fields below to set up your video conferencing tool.",
|
||||
"authoring.live.consumerKey": "Consumer Key",
|
||||
"authoring.live.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.live.consumerSecret": "Consumer Secret",
|
||||
"authoring.live.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.live.launchUrl": "Launch URL",
|
||||
"authoring.live.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.live.launchEmail": "Launch Email",
|
||||
"authoring.live.launchEmail.required": "Launch Email is a required field",
|
||||
"authoring.live.provider.helpText": "This configuration will require sharing username and emails of learners and the course team with {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "This configuration will require sharing usernames and emails of learners and the course team with {provider}. To access the LTI configuration for {provider}, please request your edX project coordinator to get PII sharing enabled for this course.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.live.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.live.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.live.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.live.appDocInstructions.linkText": "{link}",
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Microsoft Teams",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "This configuration will require sharing usernames of learners and the course team with {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "To enable this feature, contact your edX support team to enable PII sharing for this course.",
|
||||
"authoring.live.freePlanMessage": "The free plan is pre-configured, and no additional configurations are required. By selecting the free plan, you are agreeing to Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Privacy Policy.",
|
||||
"course-authoring.pages-resources.heading": "Pages & Resources",
|
||||
"course-authoring.pages-resources.resources.settings.button": "settings",
|
||||
"course-authoring.pages-resources.viewLive.button": "View live",
|
||||
"course-authoring.badge.enabled": "Enabled",
|
||||
"authoring.proctoring.no": "No",
|
||||
"authoring.proctoring.yes": "Yes",
|
||||
"authoring.proctoring.support.text": "Support Page",
|
||||
"authoring.proctoring.enableproctoredexams.label": "Proctored exams",
|
||||
"authoring.proctoring.enableproctoredexams.help": "Enable and configure proctored exams in your course.",
|
||||
"authoring.proctoring.enabled": "Enabled",
|
||||
"authoring.proctoring.learn.more": "Learn more about proctoring",
|
||||
"authoring.proctoring.provider.label": "Proctoring provider",
|
||||
"authoring.proctoring.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.proctoring.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"authoring.proctoring.escalationemail.label": "Proctortrack escalation email",
|
||||
"authoring.proctoring.escalationemail.help": "Provide an email address to be contacted by the support team for escalations (e.g. appeals, delayed reviews).",
|
||||
"authoring.proctoring.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.proctoring.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.proctoring.allowoptout.label": "Allow learners to opt out of proctoring on proctored exams",
|
||||
"authoring.proctoring.createzendesk.label": "Create Zendesk tickets for suspicious attempts",
|
||||
"authoring.proctoring.error.single": "There is 1 error in this form.",
|
||||
"authoring.proctoring.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.proctoring.save": "Save",
|
||||
"authoring.proctoring.saving": "Saving...",
|
||||
"authoring.proctoring.cancel": "Cancel",
|
||||
"authoring.proctoring.studio.link.text": "Go back to your course in Studio",
|
||||
"authoring.proctoring.alert.success": "\n Proctored exam settings saved successfully. {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.alert.error": "\n We encountered a technical error while trying to save proctored exam settings.\n This might be a temporary issue, so please try again in a few minutes.\n If the problem persists,\n please go to the {support_link} for help.\n ",
|
||||
"course-authoring.pages-resources.progress.heading": "Configure progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.label": "Progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.help": "As students work through graded assignments, scores\n will appear under the progress tab. The progress tab contains a chart of\n all graded assignments in the course, with a list of all assignments and\n scores below.",
|
||||
"course-authoring.pages-resources.progress.enable-progress.link": "Learn more about progress",
|
||||
"course-authoring.pages-resources.progress.enable-graph.label": "Enable progress graph",
|
||||
"course-authoring.pages-resources.progress.enable-graph.help": "If enabled, students can view the progress graph",
|
||||
"authoring.pagesAndResources.teams.heading": "Configure teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.label": "Teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.help": "Allow learners to work together on specific projects or activities.",
|
||||
"authoring.pagesAndResources.teams.enableTeams.link": "Learn more about teams",
|
||||
"authoring.pagesAndResources.teams.teamSize.heading": "Team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSize": "Max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeHelp": "The maximum number of learners that can join a team",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeEmpty": "Enter max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeInvalid": "Max team size must be a positive number larger than zero.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeTooHigh": "Max team size cannot be greater than {max}",
|
||||
"authoring.pagesAndResources.teams.groups.heading": "Groups",
|
||||
"authoring.pagesAndResources.teams.groups.help": "Groups are spaces where learners can create or join teams.",
|
||||
"authoring.pagesAndResources.teams.configureGroup.heading": "Configure group",
|
||||
"authoring.pagesAndResources.teams.group.name.label": "Name",
|
||||
"authoring.pagesAndResources.teams.group.name.help": "Choose a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.empty": "Enter a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.exists": "It looks like this name is already in use",
|
||||
"authoring.pagesAndResources.teams.group.description.label": "Description",
|
||||
"authoring.pagesAndResources.teams.group.description.help": "Enter details about this group",
|
||||
"authoring.pagesAndResources.teams.group.description.error": "Enter a description for this group",
|
||||
"authoring.pagesAndResources.teams.group.type.label": "Type",
|
||||
"authoring.pagesAndResources.teams.group.type.help": "Control who can see, create and join teams",
|
||||
"authoring.pagesAndResources.teams.group.types.open": "Open",
|
||||
"authoring.pagesAndResources.teams.group.types.open.description": "Learners can create, join, leave, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed": "Public managed",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed.description": "Only course staff can control teams and memberships. Learners can see other teams.",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed": "Private managed",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed.description": "Only course staff can control teams, memberships, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.label": "Max team size (optional)",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.help": "Override the global max team size",
|
||||
"authoring.pagesAndResources.teams.addGroup.button": "Add group",
|
||||
"authoring.pagesAndResources.teams.group.delete": "Delete",
|
||||
"authoring.pagesAndResources.teams.group.expand": "Expand group editor",
|
||||
"authoring.pagesAndResources.teams.group.collapse": "Close group editor",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.initiateDelete": "Delete",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.cancel-delete.button": "Cancel",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.heading": "Delete this group?",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.body": "edX recommends that you do not delete groups once your course is running.\n Your group will no longer be visible in the LMS and learners will not be able to leave teams associated with it.\n Please delete learners from teams before deleting the associated group.",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.title": "No groups found",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.message": "Add one or more groups to enable teams.",
|
||||
"course-authoring.pages-resources.wiki.heading": "Configure wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.label": "Wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.help": "The course wiki can be set up based on the needs of your\n course. Common uses might include sharing answers to course FAQs, sharing\n editable course information, or providing access to learner-created\n resources.",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.link": "Learn more about the wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.label": "Enable public wiki access",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.help": "If enabled, edX users can view the course wiki even when\n they're not enrolled in the course.",
|
||||
"authoring.examsettings.enableproctoredexams.help": "If checked, proctored exams are enabled in your course.",
|
||||
"authoring.examsettings.allowoptout.label": "Allow Opting Out of Proctored Exams",
|
||||
"authoring.examsettings.allowoptout.help": "\n If this value is \"Yes\", learners can choose to take proctored exams without proctoring.\n If this value is \"No\", all learners must take the exam with proctoring.\n ",
|
||||
"authoring.examsettings.provider.label": "Proctoring Provider",
|
||||
"authoring.examsettings.escalationemail.label": "Proctortrack Escalation Email",
|
||||
"authoring.examsettings.escalationemail.help": "\n Required if \"proctortrack\" is selected as your proctoring provider. Enter an email address to be\n contacted by the support team whenever there are escalations (e.g. appeals, delayed reviews, etc.).\n ",
|
||||
"authoring.examsettings.createzendesk.label": "Create Zendesk Tickets for Suspicious Proctored Exam Attempts",
|
||||
"authoring.examsettings.createzendesk.help": "If this value is \"Yes\", a Zendesk ticket will be created for suspicious proctored exam attempts.",
|
||||
"authoring.examsettings.submit": "Submit",
|
||||
"authoring.examsettings.alert.success": "\n Proctored exam settings saved successfully.\n You can go back to your course in Studio {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.allowoptout.no": "No",
|
||||
"authoring.examsettings.allowoptout.yes": "Yes",
|
||||
"authoring.examsettings.createzendesk.no": "No",
|
||||
"authoring.examsettings.createzendesk.yes": "Yes",
|
||||
"authoring.examsettings.support.text": "Support Page",
|
||||
"authoring.examsettings.escalationemail.enableproctoredexams.label": "Enable Proctored Exams",
|
||||
"authoring.examsettings.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.examsettings.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.examsettings.error.single": "There is 1 error in this form.",
|
||||
"authoring.examsettings.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.examsettings.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.examsettings.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"header.links.content": "Content",
|
||||
"header.links.settings": "Settings",
|
||||
"header.links.content.tools": "Tools",
|
||||
"header.links.outline": "Outline",
|
||||
"header.links.updates": "Updates",
|
||||
"header.links.pages": "Pages & Resources",
|
||||
"header.links.filesAndUploads": "Files & Uploads",
|
||||
"header.links.textbooks": "Textbooks",
|
||||
"header.links.videoUploads": "Video Uploads",
|
||||
"header.links.scheduleAndDetails": "Schedule & Details",
|
||||
"header.links.grading": "Grading",
|
||||
"header.links.courseTeam": "Course Team",
|
||||
"header.links.groupConfigurations": "Group Configurations",
|
||||
"header.links.proctoredExamSettings": "Proctored Exam Settings",
|
||||
"header.links.advancedSettings": "Advanced Settings",
|
||||
"header.links.certificates": "Certificates",
|
||||
"header.links.publisher": "Publisher",
|
||||
"header.links.import": "Import",
|
||||
"header.links.export": "Export",
|
||||
"header.links.checklists": "Checklists",
|
||||
"header.user.menu.studio": "Studio Home",
|
||||
"header.user.menu.maintenance": "Maintenance",
|
||||
"header.user.menu.logout": "Logout",
|
||||
"header.label.account.menu": "Account Menu",
|
||||
"header.label.account.menu.for": "Account menu for {username}",
|
||||
"header.label.main.nav": "Main",
|
||||
"header.label.main.menu": "Main Menu",
|
||||
"header.label.main.header": "Main",
|
||||
"header.label.secondary.nav": "Secondary",
|
||||
"header.label.courseOutline": "Back to course outline in Studio"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
@@ -1 +1,353 @@
|
||||
{}
|
||||
{
|
||||
"authoring.alert.error.connection": "We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"authoring.loading": "Loading...",
|
||||
"authoring.alert.error.permission": "You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access.",
|
||||
"authoring.alert.save.error.connection": "We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "Support Page",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Cancel",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Save",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saving": "Saving",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saved": "Saved",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.retry": "Retry",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.enabled": "Enabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.disabled": "Disabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.title": "We couldn't apply your changes.",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.message": "Please check your entries and try again.",
|
||||
"course-authoring.pages-resources.calculator.heading": "Configure calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.label": "Calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.help": "The calculator supports numbers, operators, constants,\n functions, and other mathematical concepts. When enabled, an icon to\n access the calculator appears on all pages in the body of your course.",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.link": "Learn more about the calculator",
|
||||
"authoring.discussions.documentationPage": "Visit the {name} documentation page",
|
||||
"authoring.discussions.formInstructions": "Complete the fields below to set up your discussion tool.",
|
||||
"authoring.discussions.consumerKey": "Consumer Key",
|
||||
"authoring.discussions.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.discussions.consumerSecret": "Consumer Secret",
|
||||
"authoring.discussions.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.discussions.launchUrl": "Launch URL",
|
||||
"authoring.discussions.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.discussions.stuffOnlyConfigInfo": "To enable {providerName} for your course, please contact their support team at {supportEmail} to learn more about pricing and usage.",
|
||||
"authoring.discussions.stuffOnlyConfigGuide": "To fully configure {providerName} will also require sharing usernames and emails for learners and course team. Please contact your edX project coordinator to enable PII sharing for this course.",
|
||||
"authoring.discussions.piiSharing": "Optionally share a user's username and/or email with the LTI provider:",
|
||||
"authoring.discussions.piiShareUsername": "Share username",
|
||||
"authoring.discussions.piiShareEmail": "Share email",
|
||||
"authoring.discussions.appDocInstructions.contact": "Contact: {link}",
|
||||
"authoring.discussions.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.discussions.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.discussions.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.discussions.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.discussions.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.discussions.appDocInstructions.linkText": "{link}",
|
||||
"authoring.discussions.configurationChangeConsequences": "Students will lose access to any active or previous discussion posts for your course.",
|
||||
"authoring.discussions.configure.app": "Configure {name}",
|
||||
"authoring.discussions.configure": "Configure discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Cancel",
|
||||
"authoring.discussions.confirm": "Confirm",
|
||||
"authoring.discussions.confirmConfigurationChange": "Are you sure you want to change the discussion settings?",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "Enable discussions on units in graded subsections?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "Disable discussions on units in graded subsections?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.",
|
||||
"authoring.discussions.backButton": "Back",
|
||||
"authoring.discussions.saveButton": "Save",
|
||||
"authoring.discussions.savingButton": "Saving",
|
||||
"authoring.discussions.savedButton": "Saved",
|
||||
"authoring.discussions.appConfigForm.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appConfigForm.appName-yellowdig": "Yellowdig",
|
||||
"authoring.discussions.appConfigForm.appName-inscribe": "InScribe",
|
||||
"authoring.discussions.appConfigForm.appName-discourse": "Discourse",
|
||||
"authoring.discussions.appConfigForm.appName-ed-discuss": "Ed Discussion",
|
||||
"authoring.discussions.appConfigForm.appName-legacy": "edX",
|
||||
"authoring.discussions.appConfigForm.appName-openedx": "edX",
|
||||
"authoring.discussions.builtIn.divisionByGroup": "Cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.label": "Divide discussions by cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.help": "Learners will only be able to view and respond to discussions posted by members of their cohort.",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.label": "Divide course-wide discussion topics",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choose which of your general course-wide discussion topics you would like to divide.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "General",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions for the TAs",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "To adjust these settings, enable cohorts on the ",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "instructor dashboard",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibility of in-context discussions",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Enable discussions on units in graded subsections",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Allow learners to engage with discussion on all graded unit pages except timed exams.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Group in context discussion at the subsection level",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Anonymous posting",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Allow anonymous discussion posts",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "If enabled, learners can create posts that are anonymous to all users.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.label": "Allow anonymous discussion posts to peers",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.help": "Learners will be able to post anonymously to other peers but all posts will be visible to course staff.",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications": "Notifications",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.label": "Email notifications for reported content",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.help": "Discussion Admins, Moderators, Community TAs and Group Community TAs (only for their own cohort) will receive an email notification when content is reported.",
|
||||
"authoring.discussions.discussionTopics": "Discussion topics",
|
||||
"authoring.discussions.discussionTopics.label": "General discussion topics",
|
||||
"authoring.discussions.discussionTopics.help": "Discussions can include general topics not contained to the course structure. All courses have a general topic by default.",
|
||||
"authoring.discussions.discussionTopic.required": "Topic name is a required field",
|
||||
"authoring.discussions.discussionTopic.alreadyExistError": "It looks like this name is already in use",
|
||||
"authoring.discussions.addTopicButton": "Add topic",
|
||||
"authoring.discussions.deleteButton": "Delete",
|
||||
"authoring.discussions.cancelButton": "Cancel",
|
||||
"authoring.discussions.discussionTopicDeletion.help": "edX recommends that you do not delete discussion topics once your course is running.",
|
||||
"authoring.discussions.discussionTopicDeletion.label": "Delete this topic?",
|
||||
"authoring.discussions.builtIn.renameGeneralTopic.label": "Rename general topic",
|
||||
"authoring.discussions.generalTopicHelp.help": "This is the default discussion topic for your course.",
|
||||
"authoring.discussions.builtIn.configureAdditionalTopic.label": "Configure topic",
|
||||
"authoring.discussions.addTopicHelpText": "Choose a unique name for your topic",
|
||||
"authoring.discussions.blackoutDates": "Discussion blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.label": "Blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.help": "If added, learners will not be able to post in discussions between these dates.",
|
||||
"authoring.discussions.addBlackoutDatesButton": "Add blackout date range",
|
||||
"authoring.discussions.builtIn.configureBlackoutDates.label": "Configure blackout date range",
|
||||
"authoring.discussions.blackoutStartDate.help": "Enter a start date, e.g. 12/10/2023",
|
||||
"authoring.discussions.blackoutEndDate.help": "Enter an end date, e.g. 12/17/2023",
|
||||
"authoring.discussions.blackoutStartTime.help": "Enter a start time, e.g. 09:00 AM",
|
||||
"authoring.discussions.blackoutEndTime.help": "Enter an end time, e.g. 05:00 PM",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.help": "These blackout dates are currently active. If deleted, learners will be able to post in discussions during these dates. Are you sure you want to proceed?",
|
||||
"authoring.discussions.blackoutDatesDeletion.help": "If deleted, learners will be able to post in discussions during these dates.",
|
||||
"authoring.discussions.completeBlackoutDatesDeletion.help": "Are you sure you want to delete these blackout dates?",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.label": "Delete active blackout dates?",
|
||||
"authoring.discussions.blackoutDatesDeletion.label": "Delete blackout dates?",
|
||||
"authoring.blackoutDates.delete": "Delete Blackout Dates",
|
||||
"authoring.blackoutDates.status": "{status}",
|
||||
"authoring.blackoutDates.startDate.required": "Start date is a required field",
|
||||
"authoring.blackoutDates.endDate.required": "End date is a required field",
|
||||
"authoring.blackoutDates.startDate.inPast": "Start date cannot be after end date",
|
||||
"authoring.blackoutDates.endDate.inPast": "End date cannot be before start date",
|
||||
"authoring.blackoutDates.startTime.inPast": "Start time cannot be after end time",
|
||||
"authoring.blackoutDates.endTime.inPast": "End time cannot be before start time",
|
||||
"authoring.blackoutDates.startTime.inValidFormat": "Enter a valid start time",
|
||||
"authoring.blackoutDates.endTime.inValidFormat": "Enter a valid end time",
|
||||
"authoring.blackoutDates.startDate.inValidFormat": "Enter a valid start Date",
|
||||
"authoring.blackoutDates.endDate.inValidFormat": "Enter a valid end date",
|
||||
"authoring.topics.delete": "Delete Topic",
|
||||
"authoring.topics.expand": "Expand",
|
||||
"authoring.topics.collapse": "Collapse",
|
||||
"authoring.blackoutDates.start.date": "Start date",
|
||||
"authoring.blackoutDates.start.time": "Start time (optional) ({zone})",
|
||||
"authoring.blackoutDates.end.date": "End date",
|
||||
"authoring.blackoutDates.end.time": "End time (optional) ({zone})",
|
||||
"authoring.discussions.heading": "Select a discussion tool for this course",
|
||||
"authoring.discussions.supportedFeatures": "Supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-show": "Show supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-hide": "Hide supported features",
|
||||
"authoring.discussions.noApps": "There are no discussions providers available for your course.",
|
||||
"authoring.discussions.nextButton": "Next",
|
||||
"authoring.discussions.appFullSupport": "Full support",
|
||||
"authoring.discussions.appBasicSupport": "Basic support",
|
||||
"authoring.discussions.selectApp": "Select {appName}",
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Enable participation in discussion topics alongside course content.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza is designed to connect students, TAs, and professors so every student can get the help they need when they need it.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offers educators a gameful learning digital solution to improve student engagement by building learning communities for any course modality.",
|
||||
"authoring.discussions.appList.appDescription-inscribe": "InScribe leverages the power of community + artificial intelligence to connect individuals to the answers, resources, and people they need to succeed.",
|
||||
"authoring.discussions.appList.appDescription-discourse": "Discourse is modern forum software for your community. Use it as a mailing list, discussion forum, long-form chat room, and more!",
|
||||
"authoring.discussions.appList.appDescription-ed-discus": "Ed Discussion helps scale class communication in a beautiful and intuitive interface. Questions reach and benefit the whole class. Less emails, more time saved.",
|
||||
"authoring.discussions.featureName-discussion-page": "Discussion page",
|
||||
"authoring.discussions.featureName-embedded-course-sections": "Embedded course sections",
|
||||
"authoring.discussions.featureName-advanced-in-context-discussion": "Advanced in context discussion",
|
||||
"authoring.discussions.featureName-anonymous-posting": "Anonymous posting",
|
||||
"authoring.discussions.featureName-automatic-learner-enrollment": "Automatic learner enrollment",
|
||||
"authoring.discussions.featureName-blackout-discussion-dates": "Blackout discussion dates",
|
||||
"authoring.discussions.featureName-community-ta-support": "Community TA support",
|
||||
"authoring.discussions.featureName-course-cohort-support": "Course cohort support",
|
||||
"authoring.discussions.featureName-direct-messages-from-instructors": "Direct messages from instructors",
|
||||
"authoring.discussions.featureName-discussion-content-prompts": "Discussion content prompts",
|
||||
"authoring.discussions.featureName-email-notifications": "Email notifications",
|
||||
"authoring.discussions.featureName-graded-discussions": "Graded discussions",
|
||||
"authoring.discussions.featureName-in-platform-notifications": "In-platform notifications",
|
||||
"authoring.discussions.featureName-internationalization-support": "Internationalization support",
|
||||
"authoring.discussions.featureName-lti-advanced-sharing-mode": "LTI advanced sharing",
|
||||
"authoring.discussions.featureName-basic-configuration": "Basic configuration",
|
||||
"authoring.discussions.featureName-primary-discussion-app-experience": "Primary discussion app experience",
|
||||
"authoring.discussions.featureName-question-&-discussion-support": "Question & discussion support",
|
||||
"authoring.discussions.featureName-report/flag-content-to-moderators": "Report content to moderators",
|
||||
"authoring.discussions.featureName-research-data-events": "Research data events",
|
||||
"authoring.discussions.featureName-simplified-in-context-discussion": "Simplified in-context discussion",
|
||||
"authoring.discussions.featureName-user-mentions": "User mentions",
|
||||
"authoring.discussions.featureName-wcag-2.1": "WCAG 2.1 support",
|
||||
"authoring.discussions.wcag-2.0-support": "WCAG 2.0 support",
|
||||
"authoring.discussions.basic-support": "Basic support",
|
||||
"authoring.discussions.partial-support": "Partial support",
|
||||
"authoring.discussions.full-support": "Full support",
|
||||
"authoring.discussions.common-support": "Commonly requested",
|
||||
"authoring.discussions.settings": "Settings",
|
||||
"authoring.discussions.applyButton": "Apply",
|
||||
"authoring.discussions.applyingButton": "Applying",
|
||||
"authoring.discussions.appliedButton": "Applied",
|
||||
"authoring.discussions.noProviderSwitchAfterCourseStarted": "Discussion provider can't be changed after course has started, please reach out to partner support.",
|
||||
"authoring.discussions.providerSelection": "Provider selection",
|
||||
"authoring.discussions.Incomplete": "Incomplete",
|
||||
"course-authoring.pages-resources.notes.heading": "Configure notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Learners can access their notes either in the body of the\n course of on a notes page. On the notes page, a learner can see all the\n notes made during the course. The page also contains links to the location\n of the notes in the course body.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Learn more about notes",
|
||||
"authoring.live.bbb.selectPlan.label": "Select a plan",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configure Live",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Schedule meetings and conduct live course sessions with learners.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "Learn more about live",
|
||||
"authoring.live.selectProvider": "Select a video conferencing tool",
|
||||
"authoring.live.formInstructions": "Complete the fields below to set up your video conferencing tool.",
|
||||
"authoring.live.consumerKey": "Consumer Key",
|
||||
"authoring.live.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.live.consumerSecret": "Consumer Secret",
|
||||
"authoring.live.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.live.launchUrl": "Launch URL",
|
||||
"authoring.live.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.live.launchEmail": "Launch Email",
|
||||
"authoring.live.launchEmail.required": "Launch Email is a required field",
|
||||
"authoring.live.provider.helpText": "This configuration will require sharing username and emails of learners and the course team with {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "This configuration will require sharing usernames and emails of learners and the course team with {provider}. To access the LTI configuration for {provider}, please request your edX project coordinator to get PII sharing enabled for this course.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.live.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.live.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.live.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.live.appDocInstructions.linkText": "{link}",
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Microsoft Teams",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "This configuration will require sharing usernames of learners and the course team with {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "To enable this feature, contact your edX support team to enable PII sharing for this course.",
|
||||
"authoring.live.freePlanMessage": "The free plan is pre-configured, and no additional configurations are required. By selecting the free plan, you are agreeing to Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Privacy Policy.",
|
||||
"course-authoring.pages-resources.heading": "Pages & Resources",
|
||||
"course-authoring.pages-resources.resources.settings.button": "settings",
|
||||
"course-authoring.pages-resources.viewLive.button": "View live",
|
||||
"course-authoring.badge.enabled": "Enabled",
|
||||
"authoring.proctoring.no": "No",
|
||||
"authoring.proctoring.yes": "Yes",
|
||||
"authoring.proctoring.support.text": "Support Page",
|
||||
"authoring.proctoring.enableproctoredexams.label": "Proctored exams",
|
||||
"authoring.proctoring.enableproctoredexams.help": "Enable and configure proctored exams in your course.",
|
||||
"authoring.proctoring.enabled": "Enabled",
|
||||
"authoring.proctoring.learn.more": "Learn more about proctoring",
|
||||
"authoring.proctoring.provider.label": "Proctoring provider",
|
||||
"authoring.proctoring.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.proctoring.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"authoring.proctoring.escalationemail.label": "Proctortrack escalation email",
|
||||
"authoring.proctoring.escalationemail.help": "Provide an email address to be contacted by the support team for escalations (e.g. appeals, delayed reviews).",
|
||||
"authoring.proctoring.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.proctoring.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.proctoring.allowoptout.label": "Allow learners to opt out of proctoring on proctored exams",
|
||||
"authoring.proctoring.createzendesk.label": "Create Zendesk tickets for suspicious attempts",
|
||||
"authoring.proctoring.error.single": "There is 1 error in this form.",
|
||||
"authoring.proctoring.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.proctoring.save": "Save",
|
||||
"authoring.proctoring.saving": "Saving...",
|
||||
"authoring.proctoring.cancel": "Cancel",
|
||||
"authoring.proctoring.studio.link.text": "Go back to your course in Studio",
|
||||
"authoring.proctoring.alert.success": "\n Proctored exam settings saved successfully. {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.alert.error": "\n We encountered a technical error while trying to save proctored exam settings.\n This might be a temporary issue, so please try again in a few minutes.\n If the problem persists,\n please go to the {support_link} for help.\n ",
|
||||
"course-authoring.pages-resources.progress.heading": "Configure progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.label": "Progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.help": "As students work through graded assignments, scores\n will appear under the progress tab. The progress tab contains a chart of\n all graded assignments in the course, with a list of all assignments and\n scores below.",
|
||||
"course-authoring.pages-resources.progress.enable-progress.link": "Learn more about progress",
|
||||
"course-authoring.pages-resources.progress.enable-graph.label": "Enable progress graph",
|
||||
"course-authoring.pages-resources.progress.enable-graph.help": "If enabled, students can view the progress graph",
|
||||
"authoring.pagesAndResources.teams.heading": "Configure teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.label": "Teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.help": "Allow learners to work together on specific projects or activities.",
|
||||
"authoring.pagesAndResources.teams.enableTeams.link": "Learn more about teams",
|
||||
"authoring.pagesAndResources.teams.teamSize.heading": "Team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSize": "Max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeHelp": "The maximum number of learners that can join a team",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeEmpty": "Enter max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeInvalid": "Max team size must be a positive number larger than zero.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeTooHigh": "Max team size cannot be greater than {max}",
|
||||
"authoring.pagesAndResources.teams.groups.heading": "Groups",
|
||||
"authoring.pagesAndResources.teams.groups.help": "Groups are spaces where learners can create or join teams.",
|
||||
"authoring.pagesAndResources.teams.configureGroup.heading": "Configure group",
|
||||
"authoring.pagesAndResources.teams.group.name.label": "Name",
|
||||
"authoring.pagesAndResources.teams.group.name.help": "Choose a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.empty": "Enter a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.exists": "It looks like this name is already in use",
|
||||
"authoring.pagesAndResources.teams.group.description.label": "Description",
|
||||
"authoring.pagesAndResources.teams.group.description.help": "Enter details about this group",
|
||||
"authoring.pagesAndResources.teams.group.description.error": "Enter a description for this group",
|
||||
"authoring.pagesAndResources.teams.group.type.label": "Type",
|
||||
"authoring.pagesAndResources.teams.group.type.help": "Control who can see, create and join teams",
|
||||
"authoring.pagesAndResources.teams.group.types.open": "Open",
|
||||
"authoring.pagesAndResources.teams.group.types.open.description": "Learners can create, join, leave, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed": "Public managed",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed.description": "Only course staff can control teams and memberships. Learners can see other teams.",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed": "Private managed",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed.description": "Only course staff can control teams, memberships, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.label": "Max team size (optional)",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.help": "Override the global max team size",
|
||||
"authoring.pagesAndResources.teams.addGroup.button": "Add group",
|
||||
"authoring.pagesAndResources.teams.group.delete": "Delete",
|
||||
"authoring.pagesAndResources.teams.group.expand": "Expand group editor",
|
||||
"authoring.pagesAndResources.teams.group.collapse": "Close group editor",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.initiateDelete": "Delete",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.cancel-delete.button": "Cancel",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.heading": "Delete this group?",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.body": "edX recommends that you do not delete groups once your course is running.\n Your group will no longer be visible in the LMS and learners will not be able to leave teams associated with it.\n Please delete learners from teams before deleting the associated group.",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.title": "No groups found",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.message": "Add one or more groups to enable teams.",
|
||||
"course-authoring.pages-resources.wiki.heading": "Configure wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.label": "Wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.help": "The course wiki can be set up based on the needs of your\n course. Common uses might include sharing answers to course FAQs, sharing\n editable course information, or providing access to learner-created\n resources.",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.link": "Learn more about the wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.label": "Enable public wiki access",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.help": "If enabled, edX users can view the course wiki even when\n they're not enrolled in the course.",
|
||||
"authoring.examsettings.enableproctoredexams.help": "If checked, proctored exams are enabled in your course.",
|
||||
"authoring.examsettings.allowoptout.label": "Allow Opting Out of Proctored Exams",
|
||||
"authoring.examsettings.allowoptout.help": "\n If this value is \"Yes\", learners can choose to take proctored exams without proctoring.\n If this value is \"No\", all learners must take the exam with proctoring.\n ",
|
||||
"authoring.examsettings.provider.label": "Proctoring Provider",
|
||||
"authoring.examsettings.escalationemail.label": "Proctortrack Escalation Email",
|
||||
"authoring.examsettings.escalationemail.help": "\n Required if \"proctortrack\" is selected as your proctoring provider. Enter an email address to be\n contacted by the support team whenever there are escalations (e.g. appeals, delayed reviews, etc.).\n ",
|
||||
"authoring.examsettings.createzendesk.label": "Create Zendesk Tickets for Suspicious Proctored Exam Attempts",
|
||||
"authoring.examsettings.createzendesk.help": "If this value is \"Yes\", a Zendesk ticket will be created for suspicious proctored exam attempts.",
|
||||
"authoring.examsettings.submit": "Submit",
|
||||
"authoring.examsettings.alert.success": "\n Proctored exam settings saved successfully.\n You can go back to your course in Studio {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.allowoptout.no": "No",
|
||||
"authoring.examsettings.allowoptout.yes": "Yes",
|
||||
"authoring.examsettings.createzendesk.no": "No",
|
||||
"authoring.examsettings.createzendesk.yes": "Yes",
|
||||
"authoring.examsettings.support.text": "Support Page",
|
||||
"authoring.examsettings.escalationemail.enableproctoredexams.label": "Enable Proctored Exams",
|
||||
"authoring.examsettings.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.examsettings.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.examsettings.error.single": "There is 1 error in this form.",
|
||||
"authoring.examsettings.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.examsettings.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.examsettings.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"header.links.content": "Content",
|
||||
"header.links.settings": "Settings",
|
||||
"header.links.content.tools": "Tools",
|
||||
"header.links.outline": "Outline",
|
||||
"header.links.updates": "Updates",
|
||||
"header.links.pages": "Pages & Resources",
|
||||
"header.links.filesAndUploads": "Files & Uploads",
|
||||
"header.links.textbooks": "Textbooks",
|
||||
"header.links.videoUploads": "Video Uploads",
|
||||
"header.links.scheduleAndDetails": "Schedule & Details",
|
||||
"header.links.grading": "Grading",
|
||||
"header.links.courseTeam": "Course Team",
|
||||
"header.links.groupConfigurations": "Group Configurations",
|
||||
"header.links.proctoredExamSettings": "Proctored Exam Settings",
|
||||
"header.links.advancedSettings": "Advanced Settings",
|
||||
"header.links.certificates": "Certificates",
|
||||
"header.links.publisher": "Publisher",
|
||||
"header.links.import": "Import",
|
||||
"header.links.export": "Export",
|
||||
"header.links.checklists": "Checklists",
|
||||
"header.user.menu.studio": "Studio Home",
|
||||
"header.user.menu.maintenance": "Maintenance",
|
||||
"header.user.menu.logout": "Logout",
|
||||
"header.label.account.menu": "Account Menu",
|
||||
"header.label.account.menu.for": "Account menu for {username}",
|
||||
"header.label.main.nav": "Main",
|
||||
"header.label.main.menu": "Main Menu",
|
||||
"header.label.main.header": "Main",
|
||||
"header.label.secondary.nav": "Secondary",
|
||||
"header.label.courseOutline": "Back to course outline in Studio"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
@@ -1 +1,353 @@
|
||||
{}
|
||||
{
|
||||
"authoring.alert.error.connection": "We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"authoring.loading": "Loading...",
|
||||
"authoring.alert.error.permission": "You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access.",
|
||||
"authoring.alert.save.error.connection": "We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "Support Page",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Cancel",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Save",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saving": "Saving",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.saved": "Saved",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.retry": "Retry",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.enabled": "Enabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.badge.disabled": "Disabled",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.title": "We couldn't apply your changes.",
|
||||
"course-authoring.pages-resources.app-settings-modal.save-error.message": "Please check your entries and try again.",
|
||||
"course-authoring.pages-resources.calculator.heading": "Configure calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.label": "Calculator",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.help": "The calculator supports numbers, operators, constants,\n functions, and other mathematical concepts. When enabled, an icon to\n access the calculator appears on all pages in the body of your course.",
|
||||
"course-authoring.pages-resources.calculator.enable-calculator.link": "Learn more about the calculator",
|
||||
"authoring.discussions.documentationPage": "Visit the {name} documentation page",
|
||||
"authoring.discussions.formInstructions": "Complete the fields below to set up your discussion tool.",
|
||||
"authoring.discussions.consumerKey": "Consumer Key",
|
||||
"authoring.discussions.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.discussions.consumerSecret": "Consumer Secret",
|
||||
"authoring.discussions.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.discussions.launchUrl": "Launch URL",
|
||||
"authoring.discussions.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.discussions.stuffOnlyConfigInfo": "To enable {providerName} for your course, please contact their support team at {supportEmail} to learn more about pricing and usage.",
|
||||
"authoring.discussions.stuffOnlyConfigGuide": "To fully configure {providerName} will also require sharing usernames and emails for learners and course team. Please contact your edX project coordinator to enable PII sharing for this course.",
|
||||
"authoring.discussions.piiSharing": "Optionally share a user's username and/or email with the LTI provider:",
|
||||
"authoring.discussions.piiShareUsername": "Share username",
|
||||
"authoring.discussions.piiShareEmail": "Share email",
|
||||
"authoring.discussions.appDocInstructions.contact": "Contact: {link}",
|
||||
"authoring.discussions.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.discussions.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.discussions.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.discussions.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.discussions.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.discussions.appDocInstructions.linkText": "{link}",
|
||||
"authoring.discussions.configurationChangeConsequences": "Students will lose access to any active or previous discussion posts for your course.",
|
||||
"authoring.discussions.configure.app": "Configure {name}",
|
||||
"authoring.discussions.configure": "Configure discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Cancel",
|
||||
"authoring.discussions.confirm": "Confirm",
|
||||
"authoring.discussions.confirmConfigurationChange": "Are you sure you want to change the discussion settings?",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "Enable discussions on units in graded subsections?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "Disable discussions on units in graded subsections?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.",
|
||||
"authoring.discussions.backButton": "Back",
|
||||
"authoring.discussions.saveButton": "Save",
|
||||
"authoring.discussions.savingButton": "Saving",
|
||||
"authoring.discussions.savedButton": "Saved",
|
||||
"authoring.discussions.appConfigForm.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appConfigForm.appName-yellowdig": "Yellowdig",
|
||||
"authoring.discussions.appConfigForm.appName-inscribe": "InScribe",
|
||||
"authoring.discussions.appConfigForm.appName-discourse": "Discourse",
|
||||
"authoring.discussions.appConfigForm.appName-ed-discuss": "Ed Discussion",
|
||||
"authoring.discussions.appConfigForm.appName-legacy": "edX",
|
||||
"authoring.discussions.appConfigForm.appName-openedx": "edX",
|
||||
"authoring.discussions.builtIn.divisionByGroup": "Cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.label": "Divide discussions by cohorts",
|
||||
"authoring.discussions.builtIn.divideByCohorts.help": "Learners will only be able to view and respond to discussions posted by members of their cohort.",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.label": "Divide course-wide discussion topics",
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choose which of your general course-wide discussion topics you would like to divide.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "General",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions for the TAs",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "To adjust these settings, enable cohorts on the ",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "instructor dashboard",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibility of in-context discussions",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Enable discussions on units in graded subsections",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Allow learners to engage with discussion on all graded unit pages except timed exams.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Group in context discussion at the subsection level",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Anonymous posting",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Allow anonymous discussion posts",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "If enabled, learners can create posts that are anonymous to all users.",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.label": "Allow anonymous discussion posts to peers",
|
||||
"authoring.discussions.builtIn.allowAnonymousPeers.help": "Learners will be able to post anonymously to other peers but all posts will be visible to course staff.",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications": "Notifications",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.label": "Email notifications for reported content",
|
||||
"authoring.discussions.builtIn.reportedContentEmailNotifications.help": "Discussion Admins, Moderators, Community TAs and Group Community TAs (only for their own cohort) will receive an email notification when content is reported.",
|
||||
"authoring.discussions.discussionTopics": "Discussion topics",
|
||||
"authoring.discussions.discussionTopics.label": "General discussion topics",
|
||||
"authoring.discussions.discussionTopics.help": "Discussions can include general topics not contained to the course structure. All courses have a general topic by default.",
|
||||
"authoring.discussions.discussionTopic.required": "Topic name is a required field",
|
||||
"authoring.discussions.discussionTopic.alreadyExistError": "It looks like this name is already in use",
|
||||
"authoring.discussions.addTopicButton": "Add topic",
|
||||
"authoring.discussions.deleteButton": "Delete",
|
||||
"authoring.discussions.cancelButton": "Cancel",
|
||||
"authoring.discussions.discussionTopicDeletion.help": "edX recommends that you do not delete discussion topics once your course is running.",
|
||||
"authoring.discussions.discussionTopicDeletion.label": "Delete this topic?",
|
||||
"authoring.discussions.builtIn.renameGeneralTopic.label": "Rename general topic",
|
||||
"authoring.discussions.generalTopicHelp.help": "This is the default discussion topic for your course.",
|
||||
"authoring.discussions.builtIn.configureAdditionalTopic.label": "Configure topic",
|
||||
"authoring.discussions.addTopicHelpText": "Choose a unique name for your topic",
|
||||
"authoring.discussions.blackoutDates": "Discussion blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.label": "Blackout dates",
|
||||
"authoring.discussions.builtIn.blackoutDates.help": "If added, learners will not be able to post in discussions between these dates.",
|
||||
"authoring.discussions.addBlackoutDatesButton": "Add blackout date range",
|
||||
"authoring.discussions.builtIn.configureBlackoutDates.label": "Configure blackout date range",
|
||||
"authoring.discussions.blackoutStartDate.help": "Enter a start date, e.g. 12/10/2023",
|
||||
"authoring.discussions.blackoutEndDate.help": "Enter an end date, e.g. 12/17/2023",
|
||||
"authoring.discussions.blackoutStartTime.help": "Enter a start time, e.g. 09:00 AM",
|
||||
"authoring.discussions.blackoutEndTime.help": "Enter an end time, e.g. 05:00 PM",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.help": "These blackout dates are currently active. If deleted, learners will be able to post in discussions during these dates. Are you sure you want to proceed?",
|
||||
"authoring.discussions.blackoutDatesDeletion.help": "If deleted, learners will be able to post in discussions during these dates.",
|
||||
"authoring.discussions.completeBlackoutDatesDeletion.help": "Are you sure you want to delete these blackout dates?",
|
||||
"authoring.discussions.activeBlackoutDatesDeletion.label": "Delete active blackout dates?",
|
||||
"authoring.discussions.blackoutDatesDeletion.label": "Delete blackout dates?",
|
||||
"authoring.blackoutDates.delete": "Delete Blackout Dates",
|
||||
"authoring.blackoutDates.status": "{status}",
|
||||
"authoring.blackoutDates.startDate.required": "Start date is a required field",
|
||||
"authoring.blackoutDates.endDate.required": "End date is a required field",
|
||||
"authoring.blackoutDates.startDate.inPast": "Start date cannot be after end date",
|
||||
"authoring.blackoutDates.endDate.inPast": "End date cannot be before start date",
|
||||
"authoring.blackoutDates.startTime.inPast": "Start time cannot be after end time",
|
||||
"authoring.blackoutDates.endTime.inPast": "End time cannot be before start time",
|
||||
"authoring.blackoutDates.startTime.inValidFormat": "Enter a valid start time",
|
||||
"authoring.blackoutDates.endTime.inValidFormat": "Enter a valid end time",
|
||||
"authoring.blackoutDates.startDate.inValidFormat": "Enter a valid start Date",
|
||||
"authoring.blackoutDates.endDate.inValidFormat": "Enter a valid end date",
|
||||
"authoring.topics.delete": "Delete Topic",
|
||||
"authoring.topics.expand": "Expand",
|
||||
"authoring.topics.collapse": "Collapse",
|
||||
"authoring.blackoutDates.start.date": "Start date",
|
||||
"authoring.blackoutDates.start.time": "Start time (optional) ({zone})",
|
||||
"authoring.blackoutDates.end.date": "End date",
|
||||
"authoring.blackoutDates.end.time": "End time (optional) ({zone})",
|
||||
"authoring.discussions.heading": "Select a discussion tool for this course",
|
||||
"authoring.discussions.supportedFeatures": "Supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-show": "Show supported features",
|
||||
"authoring.discussions.supportedFeatureList-mobile-hide": "Hide supported features",
|
||||
"authoring.discussions.noApps": "There are no discussions providers available for your course.",
|
||||
"authoring.discussions.nextButton": "Next",
|
||||
"authoring.discussions.appFullSupport": "Full support",
|
||||
"authoring.discussions.appBasicSupport": "Basic support",
|
||||
"authoring.discussions.selectApp": "Select {appName}",
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Enable participation in discussion topics alongside course content.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza is designed to connect students, TAs, and professors so every student can get the help they need when they need it.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offers educators a gameful learning digital solution to improve student engagement by building learning communities for any course modality.",
|
||||
"authoring.discussions.appList.appDescription-inscribe": "InScribe leverages the power of community + artificial intelligence to connect individuals to the answers, resources, and people they need to succeed.",
|
||||
"authoring.discussions.appList.appDescription-discourse": "Discourse is modern forum software for your community. Use it as a mailing list, discussion forum, long-form chat room, and more!",
|
||||
"authoring.discussions.appList.appDescription-ed-discus": "Ed Discussion helps scale class communication in a beautiful and intuitive interface. Questions reach and benefit the whole class. Less emails, more time saved.",
|
||||
"authoring.discussions.featureName-discussion-page": "Discussion page",
|
||||
"authoring.discussions.featureName-embedded-course-sections": "Embedded course sections",
|
||||
"authoring.discussions.featureName-advanced-in-context-discussion": "Advanced in context discussion",
|
||||
"authoring.discussions.featureName-anonymous-posting": "Anonymous posting",
|
||||
"authoring.discussions.featureName-automatic-learner-enrollment": "Automatic learner enrollment",
|
||||
"authoring.discussions.featureName-blackout-discussion-dates": "Blackout discussion dates",
|
||||
"authoring.discussions.featureName-community-ta-support": "Community TA support",
|
||||
"authoring.discussions.featureName-course-cohort-support": "Course cohort support",
|
||||
"authoring.discussions.featureName-direct-messages-from-instructors": "Direct messages from instructors",
|
||||
"authoring.discussions.featureName-discussion-content-prompts": "Discussion content prompts",
|
||||
"authoring.discussions.featureName-email-notifications": "Email notifications",
|
||||
"authoring.discussions.featureName-graded-discussions": "Graded discussions",
|
||||
"authoring.discussions.featureName-in-platform-notifications": "In-platform notifications",
|
||||
"authoring.discussions.featureName-internationalization-support": "Internationalization support",
|
||||
"authoring.discussions.featureName-lti-advanced-sharing-mode": "LTI advanced sharing",
|
||||
"authoring.discussions.featureName-basic-configuration": "Basic configuration",
|
||||
"authoring.discussions.featureName-primary-discussion-app-experience": "Primary discussion app experience",
|
||||
"authoring.discussions.featureName-question-&-discussion-support": "Question & discussion support",
|
||||
"authoring.discussions.featureName-report/flag-content-to-moderators": "Report content to moderators",
|
||||
"authoring.discussions.featureName-research-data-events": "Research data events",
|
||||
"authoring.discussions.featureName-simplified-in-context-discussion": "Simplified in-context discussion",
|
||||
"authoring.discussions.featureName-user-mentions": "User mentions",
|
||||
"authoring.discussions.featureName-wcag-2.1": "WCAG 2.1 support",
|
||||
"authoring.discussions.wcag-2.0-support": "WCAG 2.0 support",
|
||||
"authoring.discussions.basic-support": "Basic support",
|
||||
"authoring.discussions.partial-support": "Partial support",
|
||||
"authoring.discussions.full-support": "Full support",
|
||||
"authoring.discussions.common-support": "Commonly requested",
|
||||
"authoring.discussions.settings": "Settings",
|
||||
"authoring.discussions.applyButton": "Apply",
|
||||
"authoring.discussions.applyingButton": "Applying",
|
||||
"authoring.discussions.appliedButton": "Applied",
|
||||
"authoring.discussions.noProviderSwitchAfterCourseStarted": "Discussion provider can't be changed after course has started, please reach out to partner support.",
|
||||
"authoring.discussions.providerSelection": "Provider selection",
|
||||
"authoring.discussions.Incomplete": "Incomplete",
|
||||
"course-authoring.pages-resources.notes.heading": "Configure notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Learners can access their notes either in the body of the\n course of on a notes page. On the notes page, a learner can see all the\n notes made during the course. The page also contains links to the location\n of the notes in the course body.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Learn more about notes",
|
||||
"authoring.live.bbb.selectPlan.label": "Select a plan",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configure Live",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Schedule meetings and conduct live course sessions with learners.",
|
||||
"authoring.pagesAndResources.live.enableLive.link": "Learn more about live",
|
||||
"authoring.live.selectProvider": "Select a video conferencing tool",
|
||||
"authoring.live.formInstructions": "Complete the fields below to set up your video conferencing tool.",
|
||||
"authoring.live.consumerKey": "Consumer Key",
|
||||
"authoring.live.consumerKey.required": "Consumer key is a required field",
|
||||
"authoring.live.consumerSecret": "Consumer Secret",
|
||||
"authoring.live.consumerSecret.required": "Consumer secret is a required field",
|
||||
"authoring.live.launchUrl": "Launch URL",
|
||||
"authoring.live.launchUrl.required": "Launch URL is a required field",
|
||||
"authoring.live.launchEmail": "Launch Email",
|
||||
"authoring.live.launchEmail.required": "Launch Email is a required field",
|
||||
"authoring.live.provider.helpText": "This configuration will require sharing username and emails of learners and the course team with {providerName}.",
|
||||
"authoring.live.requestPiiSharingEnable": "This configuration will require sharing usernames and emails of learners and the course team with {provider}. To access the LTI configuration for {provider}, please request your edX project coordinator to get PII sharing enabled for this course.",
|
||||
"authoring.live.appDocInstructions.documentationLink": "General documentation",
|
||||
"authoring.live.appDocInstructions.accessibilityDocumentationLink": "Accessibility documentation",
|
||||
"authoring.live.appDocInstructions.configurationLink": "Configuration documentation",
|
||||
"authoring.live.appDocInstructions.learnMoreLink": "Learn more about {providerName}",
|
||||
"authoring.live.appDocInstructions.linkTextHeading": "External help and documentation",
|
||||
"authoring.live.appDocInstructions.linkText": "{link}",
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Microsoft Teams",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "This configuration will require sharing usernames of learners and the course team with {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "To enable this feature, contact your edX support team to enable PII sharing for this course.",
|
||||
"authoring.live.freePlanMessage": "The free plan is pre-configured, and no additional configurations are required. By selecting the free plan, you are agreeing to Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Privacy Policy.",
|
||||
"course-authoring.pages-resources.heading": "Pages & Resources",
|
||||
"course-authoring.pages-resources.resources.settings.button": "settings",
|
||||
"course-authoring.pages-resources.viewLive.button": "View live",
|
||||
"course-authoring.badge.enabled": "Enabled",
|
||||
"authoring.proctoring.no": "No",
|
||||
"authoring.proctoring.yes": "Yes",
|
||||
"authoring.proctoring.support.text": "Support Page",
|
||||
"authoring.proctoring.enableproctoredexams.label": "Proctored exams",
|
||||
"authoring.proctoring.enableproctoredexams.help": "Enable and configure proctored exams in your course.",
|
||||
"authoring.proctoring.enabled": "Enabled",
|
||||
"authoring.proctoring.learn.more": "Learn more about proctoring",
|
||||
"authoring.proctoring.provider.label": "Proctoring provider",
|
||||
"authoring.proctoring.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.proctoring.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"authoring.proctoring.escalationemail.label": "Proctortrack escalation email",
|
||||
"authoring.proctoring.escalationemail.help": "Provide an email address to be contacted by the support team for escalations (e.g. appeals, delayed reviews).",
|
||||
"authoring.proctoring.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.proctoring.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.proctoring.allowoptout.label": "Allow learners to opt out of proctoring on proctored exams",
|
||||
"authoring.proctoring.createzendesk.label": "Create Zendesk tickets for suspicious attempts",
|
||||
"authoring.proctoring.error.single": "There is 1 error in this form.",
|
||||
"authoring.proctoring.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.proctoring.save": "Save",
|
||||
"authoring.proctoring.saving": "Saving...",
|
||||
"authoring.proctoring.cancel": "Cancel",
|
||||
"authoring.proctoring.studio.link.text": "Go back to your course in Studio",
|
||||
"authoring.proctoring.alert.success": "\n Proctored exam settings saved successfully. {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.alert.error": "\n We encountered a technical error while trying to save proctored exam settings.\n This might be a temporary issue, so please try again in a few minutes.\n If the problem persists,\n please go to the {support_link} for help.\n ",
|
||||
"course-authoring.pages-resources.progress.heading": "Configure progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.label": "Progress",
|
||||
"course-authoring.pages-resources.progress.enable-progress.help": "As students work through graded assignments, scores\n will appear under the progress tab. The progress tab contains a chart of\n all graded assignments in the course, with a list of all assignments and\n scores below.",
|
||||
"course-authoring.pages-resources.progress.enable-progress.link": "Learn more about progress",
|
||||
"course-authoring.pages-resources.progress.enable-graph.label": "Enable progress graph",
|
||||
"course-authoring.pages-resources.progress.enable-graph.help": "If enabled, students can view the progress graph",
|
||||
"authoring.pagesAndResources.teams.heading": "Configure teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.label": "Teams",
|
||||
"authoring.pagesAndResources.teams.enableTeams.help": "Allow learners to work together on specific projects or activities.",
|
||||
"authoring.pagesAndResources.teams.enableTeams.link": "Learn more about teams",
|
||||
"authoring.pagesAndResources.teams.teamSize.heading": "Team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSize": "Max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeHelp": "The maximum number of learners that can join a team",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeEmpty": "Enter max team size",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeInvalid": "Max team size must be a positive number larger than zero.",
|
||||
"authoring.pagesAndResources.teams.teamSize.maxTeamSizeTooHigh": "Max team size cannot be greater than {max}",
|
||||
"authoring.pagesAndResources.teams.groups.heading": "Groups",
|
||||
"authoring.pagesAndResources.teams.groups.help": "Groups are spaces where learners can create or join teams.",
|
||||
"authoring.pagesAndResources.teams.configureGroup.heading": "Configure group",
|
||||
"authoring.pagesAndResources.teams.group.name.label": "Name",
|
||||
"authoring.pagesAndResources.teams.group.name.help": "Choose a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.empty": "Enter a unique name for this group",
|
||||
"authoring.pagesAndResources.teams.group.name.error.exists": "It looks like this name is already in use",
|
||||
"authoring.pagesAndResources.teams.group.description.label": "Description",
|
||||
"authoring.pagesAndResources.teams.group.description.help": "Enter details about this group",
|
||||
"authoring.pagesAndResources.teams.group.description.error": "Enter a description for this group",
|
||||
"authoring.pagesAndResources.teams.group.type.label": "Type",
|
||||
"authoring.pagesAndResources.teams.group.type.help": "Control who can see, create and join teams",
|
||||
"authoring.pagesAndResources.teams.group.types.open": "Open",
|
||||
"authoring.pagesAndResources.teams.group.types.open.description": "Learners can create, join, leave, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed": "Public managed",
|
||||
"authoring.pagesAndResources.teams.group.types.public_managed.description": "Only course staff can control teams and memberships. Learners can see other teams.",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed": "Private managed",
|
||||
"authoring.pagesAndResources.teams.group.types.private_managed.description": "Only course staff can control teams, memberships, and see other teams",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.label": "Max team size (optional)",
|
||||
"authoring.pagesAndResources.teams.group.maxSize.help": "Override the global max team size",
|
||||
"authoring.pagesAndResources.teams.addGroup.button": "Add group",
|
||||
"authoring.pagesAndResources.teams.group.delete": "Delete",
|
||||
"authoring.pagesAndResources.teams.group.expand": "Expand group editor",
|
||||
"authoring.pagesAndResources.teams.group.collapse": "Close group editor",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.initiateDelete": "Delete",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.cancel-delete.button": "Cancel",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.heading": "Delete this group?",
|
||||
"authoring.pagesAndResources.teams.deleteGroup.body": "edX recommends that you do not delete groups once your course is running.\n Your group will no longer be visible in the LMS and learners will not be able to leave teams associated with it.\n Please delete learners from teams before deleting the associated group.",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.title": "No groups found",
|
||||
"authoring.pagesAndResources.teams.enableGroups.error.noGroupsFound.message": "Add one or more groups to enable teams.",
|
||||
"course-authoring.pages-resources.wiki.heading": "Configure wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.label": "Wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.help": "The course wiki can be set up based on the needs of your\n course. Common uses might include sharing answers to course FAQs, sharing\n editable course information, or providing access to learner-created\n resources.",
|
||||
"course-authoring.pages-resources.wiki.enable-wiki.link": "Learn more about the wiki",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.label": "Enable public wiki access",
|
||||
"course-authoring.pages-resources.wiki.enable-public-wiki.help": "If enabled, edX users can view the course wiki even when\n they're not enrolled in the course.",
|
||||
"authoring.examsettings.enableproctoredexams.help": "If checked, proctored exams are enabled in your course.",
|
||||
"authoring.examsettings.allowoptout.label": "Allow Opting Out of Proctored Exams",
|
||||
"authoring.examsettings.allowoptout.help": "\n If this value is \"Yes\", learners can choose to take proctored exams without proctoring.\n If this value is \"No\", all learners must take the exam with proctoring.\n ",
|
||||
"authoring.examsettings.provider.label": "Proctoring Provider",
|
||||
"authoring.examsettings.escalationemail.label": "Proctortrack Escalation Email",
|
||||
"authoring.examsettings.escalationemail.help": "\n Required if \"proctortrack\" is selected as your proctoring provider. Enter an email address to be\n contacted by the support team whenever there are escalations (e.g. appeals, delayed reviews, etc.).\n ",
|
||||
"authoring.examsettings.createzendesk.label": "Create Zendesk Tickets for Suspicious Proctored Exam Attempts",
|
||||
"authoring.examsettings.createzendesk.help": "If this value is \"Yes\", a Zendesk ticket will be created for suspicious proctored exam attempts.",
|
||||
"authoring.examsettings.submit": "Submit",
|
||||
"authoring.examsettings.alert.success": "\n Proctored exam settings saved successfully.\n You can go back to your course in Studio {studioCourseRunURL}.\n ",
|
||||
"authoring.examsettings.allowoptout.no": "No",
|
||||
"authoring.examsettings.allowoptout.yes": "Yes",
|
||||
"authoring.examsettings.createzendesk.no": "No",
|
||||
"authoring.examsettings.createzendesk.yes": "Yes",
|
||||
"authoring.examsettings.support.text": "Support Page",
|
||||
"authoring.examsettings.escalationemail.enableproctoredexams.label": "Enable Proctored Exams",
|
||||
"authoring.examsettings.escalationemail.error.blank": "The Proctortrack Escalation Email field cannot be empty if proctortrack is the selected provider.",
|
||||
"authoring.examsettings.escalationemail.error.invalid": "The Proctortrack Escalation Email field is in the wrong format and is not valid.",
|
||||
"authoring.examsettings.error.single": "There is 1 error in this form.",
|
||||
"authoring.examsettings.escalationemail.error.multiple": "There are {numOfErrors} errors in this form.",
|
||||
"authoring.examsettings.provider.help": "Select the proctoring provider you want to use for this course run.",
|
||||
"authoring.examsettings.provider.help.aftercoursestart": "Proctoring provider cannot be modified after course start date.",
|
||||
"header.links.content": "Content",
|
||||
"header.links.settings": "Settings",
|
||||
"header.links.content.tools": "Tools",
|
||||
"header.links.outline": "Outline",
|
||||
"header.links.updates": "Updates",
|
||||
"header.links.pages": "Pages & Resources",
|
||||
"header.links.filesAndUploads": "Files & Uploads",
|
||||
"header.links.textbooks": "Textbooks",
|
||||
"header.links.videoUploads": "Video Uploads",
|
||||
"header.links.scheduleAndDetails": "Schedule & Details",
|
||||
"header.links.grading": "Grading",
|
||||
"header.links.courseTeam": "Course Team",
|
||||
"header.links.groupConfigurations": "Group Configurations",
|
||||
"header.links.proctoredExamSettings": "Proctored Exam Settings",
|
||||
"header.links.advancedSettings": "Advanced Settings",
|
||||
"header.links.certificates": "Certificates",
|
||||
"header.links.publisher": "Publisher",
|
||||
"header.links.import": "Import",
|
||||
"header.links.export": "Export",
|
||||
"header.links.checklists": "Checklists",
|
||||
"header.user.menu.studio": "Studio Home",
|
||||
"header.user.menu.maintenance": "Maintenance",
|
||||
"header.user.menu.logout": "Logout",
|
||||
"header.label.account.menu": "Account Menu",
|
||||
"header.label.account.menu.for": "Account menu for {username}",
|
||||
"header.label.main.nav": "Main",
|
||||
"header.label.main.menu": "Main Menu",
|
||||
"header.label.main.header": "Main",
|
||||
"header.label.secondary.nav": "Secondary",
|
||||
"header.label.courseOutline": "Back to course outline in Studio"
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
"authoring.loading": "Loading...",
|
||||
"authoring.alert.error.permission": "You are not authorized to view this page. If you feel you should have access, please reach out to your course team admin to be given access.",
|
||||
"authoring.alert.save.error.connection": "We encountered a technical error when applying changes. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.",
|
||||
"course-authoring.page.title": "Course Authoring | {siteName}",
|
||||
"authoring.alert.support.text": "Support Page",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.cancel": "Cancel",
|
||||
"course-authoring.pages-resources.app-settings-modal.button.save": "Save",
|
||||
@@ -42,7 +43,12 @@
|
||||
"authoring.discussions.configure": "Configure discussions",
|
||||
"authoring.discussions.ok": "OK",
|
||||
"authoring.discussions.cancel": "Cancel",
|
||||
"authoring.discussions.confirm": "Confirm",
|
||||
"authoring.discussions.confirmConfigurationChange": "Are you sure you want to change the discussion settings?",
|
||||
"authoring.discussions.confirmEnableDiscussionsLabel": "Enable discussions on units in graded subsections?",
|
||||
"authoring.discussions.cancelEnableDiscussionsLabel": "Disable discussions on units in graded subsections?",
|
||||
"authoring.discussions.confirmEnableDiscussions": "Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.",
|
||||
"authoring.discussions.cancelEnableDiscussions": "Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.",
|
||||
"authoring.discussions.backButton": "Back",
|
||||
"authoring.discussions.saveButton": "Save",
|
||||
"authoring.discussions.savingButton": "Saving",
|
||||
@@ -61,15 +67,13 @@
|
||||
"authoring.discussions.builtIn.divideCourseTopicsByCohorts.help": "Choose which of your general course-wide discussion topics you would like to divide.",
|
||||
"authoring.discussions.builtIn.divideGeneralTopic.label": "General",
|
||||
"authoring.discussions.builtIn.divideQuestionsForTAsTopic.label": "Questions for the TAs",
|
||||
"authoring.discussions.builtIn.cohortsEnabled.label": "To adjust these settings, enable cohorts on the ",
|
||||
"authoring.discussions.builtIn.instructorDashboard.label": "instructor dashboard",
|
||||
"authoring.discussions.builtIn.visibilityInContext": "Visibility of in-context discussions",
|
||||
"authoring.discussions.builtIn.inContextDiscussion.label": "In-context discussion",
|
||||
"authoring.discussions.builtIn.inContextDiscussion.help": "Learners will be able to view or hide a discussion side panel to engage with discussion on the course unit page.",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Graded unit pages",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.label": "Enable discussions on units in graded subsections",
|
||||
"authoring.discussions.builtIn.gradedUnitPages.help": "Allow learners to engage with discussion on all graded unit pages except timed exams.",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.label": "Group in context discussion at the subsection level",
|
||||
"authoring.discussions.builtIn.groupInContextSubsection.help": "Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.",
|
||||
"authoring.discussions.builtIn.allowUnitLevelVisibility.label": "Allow visibility configuration for each course unit",
|
||||
"authoring.discussions.builtIn.allowUnitLevelVisibility.help": "With this advanced setting enabled you will be able to override the global visibility setting and turn discussions on or off for each unit from the course outline view..",
|
||||
"authoring.discussions.builtIn.anonymousPosting": "Anonymous posting",
|
||||
"authoring.discussions.builtIn.allowAnonymous.label": "Allow anonymous discussion posts",
|
||||
"authoring.discussions.builtIn.allowAnonymous.help": "If enabled, learners can create posts that are anonymous to all users.",
|
||||
@@ -137,7 +141,7 @@
|
||||
"authoring.discussions.appList.appName-legacy": "edX",
|
||||
"authoring.discussions.appList.appDescription-legacy": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appName-openedx": "edX",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Start conversations with other learners, ask questions, and interact with other learners in the course.",
|
||||
"authoring.discussions.appList.appDescription-openedx": "Enable participation in discussion topics alongside course content.",
|
||||
"authoring.discussions.appList.appName-piazza": "Piazza",
|
||||
"authoring.discussions.appList.appDescription-piazza": "Piazza is designed to connect students, TAs, and professors so every student can get the help they need when they need it.",
|
||||
"authoring.discussions.appList.appDescription-yellowdig": "Yellowdig offers educators a gameful learning digital solution to improve student engagement by building learning communities for any course modality.",
|
||||
@@ -183,6 +187,7 @@
|
||||
"course-authoring.pages-resources.notes.enable-notes.label": "Notes",
|
||||
"course-authoring.pages-resources.notes.enable-notes.help": "Learners can access their notes either in the body of the\n course of on a notes page. On the notes page, a learner can see all the\n notes made during the course. The page also contains links to the location\n of the notes in the course body.",
|
||||
"course-authoring.pages-resources.notes.enable-notes.link": "Learn more about notes",
|
||||
"authoring.live.bbb.selectPlan.label": "Select a plan",
|
||||
"authoring.pagesAndResources.live.enableLive.heading": "Configure Live",
|
||||
"authoring.pagesAndResources.live.enableLive.label": "Live",
|
||||
"authoring.pagesAndResources.live.enableLive.help": "Schedule meetings and conduct live course sessions with learners.",
|
||||
@@ -208,6 +213,11 @@
|
||||
"authoring.live.appName-yellowdig": "Zoom",
|
||||
"authoring.live.appName-googleMeet": "Google Meet",
|
||||
"authoring.live.appName-microsoftTeams": "Microsoft Teams",
|
||||
"authoring.live.appName-bigBlueButton": "BigBlueButton",
|
||||
"authoring.live.requestPiiSharingEnableForBbb": "This configuration will require sharing usernames of learners and the course team with {provider}.",
|
||||
"authoring.live.piiSharingEnableHelpText": "To enable this feature, contact your edX support team to enable PII sharing for this course.",
|
||||
"authoring.live.freePlanMessage": "The free plan is pre-configured, and no additional configurations are required. By selecting the free plan, you are agreeing to Blindside Networks",
|
||||
"authoring.live.privacyPolicy": "Privacy Policy.",
|
||||
"course-authoring.pages-resources.heading": "Pages & Resources",
|
||||
"course-authoring.pages-resources.resources.settings.button": "settings",
|
||||
"course-authoring.pages-resources.viewLive.button": "View live",
|
||||
|
||||
@@ -16,10 +16,12 @@ import appMessages from './i18n';
|
||||
import initializeStore from './store';
|
||||
import './index.scss';
|
||||
import CourseAuthoringRoutes from './CourseAuthoringRoutes';
|
||||
import Head from './head/Head';
|
||||
|
||||
subscribe(APP_READY, () => {
|
||||
ReactDOM.render(
|
||||
<AppProvider store={initializeStore()}>
|
||||
<Head />
|
||||
<Switch>
|
||||
<Route
|
||||
path="/course/:courseId"
|
||||
@@ -47,9 +49,11 @@ initialize({
|
||||
SUPPORT_URL: process.env.SUPPORT_URL || null,
|
||||
SUPPORT_EMAIL: process.env.SUPPORT_EMAIL || null,
|
||||
LEARNING_BASE_URL: process.env.LEARNING_BASE_URL,
|
||||
EXAMS_BASE_URL: process.env.EXAMS_BASE_URL || null,
|
||||
CALCULATOR_HELP_URL: process.env.CALCULATOR_HELP_URL || null,
|
||||
ENABLE_PROGRESS_GRAPH_SETTINGS: process.env.ENABLE_PROGRESS_GRAPH_SETTINGS || 'false',
|
||||
ENABLE_TEAM_TYPE_SETTING: process.env.ENABLE_TEAM_TYPE_SETTING === 'true',
|
||||
BBB_LEARN_MORE_URL: process.env.BBB_LEARN_MORE_URL || '',
|
||||
}, 'CourseAuthoringConfig');
|
||||
},
|
||||
},
|
||||
|
||||
@@ -17,7 +17,7 @@ import { getLoadingStatus } from './data/selectors';
|
||||
import PagesAndResourcesProvider from './PagesAndResourcesProvider';
|
||||
import { RequestStatus } from '../data/constants';
|
||||
|
||||
function PagesAndResources({ courseId, intl }) {
|
||||
const PagesAndResources = ({ courseId, intl }) => {
|
||||
const { path, url } = useRouteMatch();
|
||||
|
||||
const dispatch = useDispatch();
|
||||
@@ -34,6 +34,7 @@ function PagesAndResources({ courseId, intl }) {
|
||||
// Each page here is driven by a course app
|
||||
const pages = useModels('courseApps', courseAppIds);
|
||||
if (loadingStatus === RequestStatus.IN_PROGRESS) {
|
||||
// eslint-disable-next-line react/jsx-no-useless-fragment
|
||||
return <></>;
|
||||
}
|
||||
|
||||
@@ -89,7 +90,7 @@ function PagesAndResources({ courseId, intl }) {
|
||||
</main>
|
||||
</PagesAndResourcesProvider>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
PagesAndResources.propTypes = {
|
||||
courseId: PropTypes.string.isRequired,
|
||||
|
||||
@@ -1,22 +1,25 @@
|
||||
import React from 'react';
|
||||
import React, { useMemo } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
export const PagesAndResourcesContext = React.createContext({});
|
||||
|
||||
export default function PagesAndResourcesProvider({ courseId, children }) {
|
||||
const PagesAndResourcesProvider = ({ courseId, children }) => {
|
||||
const contextValue = useMemo(() => ({
|
||||
courseId,
|
||||
path: `/course/${courseId}/pages-and-resources`,
|
||||
}), []);
|
||||
return (
|
||||
<PagesAndResourcesContext.Provider
|
||||
value={{
|
||||
courseId,
|
||||
path: `/course/${courseId}/pages-and-resources`,
|
||||
}}
|
||||
value={contextValue}
|
||||
>
|
||||
{children}
|
||||
</PagesAndResourcesContext.Provider>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
PagesAndResourcesProvider.propTypes = {
|
||||
courseId: PropTypes.string.isRequired,
|
||||
children: PropTypes.node.isRequired,
|
||||
};
|
||||
|
||||
export default PagesAndResourcesProvider;
|
||||
|
||||
@@ -33,21 +33,19 @@ import AppConfigFormDivider from '../discussions/app-config-form/apps/shared/App
|
||||
import { PagesAndResourcesContext } from '../PagesAndResourcesProvider';
|
||||
import messages from './messages';
|
||||
|
||||
function AppSettingsForm({
|
||||
const AppSettingsForm = ({
|
||||
formikProps, children, showForm,
|
||||
}) {
|
||||
return children && (
|
||||
<TransitionReplace>
|
||||
{showForm ? (
|
||||
<React.Fragment key="app-enabled">
|
||||
{children(formikProps)}
|
||||
</React.Fragment>
|
||||
}) => children && (
|
||||
<TransitionReplace>
|
||||
{showForm ? (
|
||||
<React.Fragment key="app-enabled">
|
||||
{children(formikProps)}
|
||||
</React.Fragment>
|
||||
) : (
|
||||
<React.Fragment key="app-disabled" />
|
||||
)}
|
||||
</TransitionReplace>
|
||||
</TransitionReplace>
|
||||
);
|
||||
}
|
||||
|
||||
AppSettingsForm.propTypes = {
|
||||
// Ignore the warning here since we're just passing along the props as-is and the child component should validate
|
||||
@@ -61,38 +59,36 @@ AppSettingsForm.defaultProps = {
|
||||
children: null,
|
||||
};
|
||||
|
||||
function AppSettingsModalBase({
|
||||
const AppSettingsModalBase = ({
|
||||
intl, title, onClose, variant, isMobile, children, footer,
|
||||
}) {
|
||||
return (
|
||||
<ModalDialog
|
||||
title={title}
|
||||
isOpen
|
||||
onClose={onClose}
|
||||
size="lg"
|
||||
variant={variant}
|
||||
hasCloseButton={isMobile}
|
||||
isFullscreenOnMobile
|
||||
>
|
||||
<ModalDialog.Header>
|
||||
<ModalDialog.Title data-testid="modal-title">
|
||||
{title}
|
||||
</ModalDialog.Title>
|
||||
</ModalDialog.Header>
|
||||
<ModalDialog.Body>
|
||||
{children}
|
||||
</ModalDialog.Body>
|
||||
<ModalDialog.Footer className="p-4">
|
||||
<ActionRow>
|
||||
<ModalDialog.CloseButton variant="tertiary">
|
||||
{intl.formatMessage(messages.cancel)}
|
||||
</ModalDialog.CloseButton>
|
||||
{footer}
|
||||
</ActionRow>
|
||||
</ModalDialog.Footer>
|
||||
</ModalDialog>
|
||||
}) => (
|
||||
<ModalDialog
|
||||
title={title}
|
||||
isOpen
|
||||
onClose={onClose}
|
||||
size="lg"
|
||||
variant={variant}
|
||||
hasCloseButton={isMobile}
|
||||
isFullscreenOnMobile
|
||||
>
|
||||
<ModalDialog.Header>
|
||||
<ModalDialog.Title data-testid="modal-title">
|
||||
{title}
|
||||
</ModalDialog.Title>
|
||||
</ModalDialog.Header>
|
||||
<ModalDialog.Body>
|
||||
{children}
|
||||
</ModalDialog.Body>
|
||||
<ModalDialog.Footer className="p-4">
|
||||
<ActionRow>
|
||||
<ModalDialog.CloseButton variant="tertiary">
|
||||
{intl.formatMessage(messages.cancel)}
|
||||
</ModalDialog.CloseButton>
|
||||
{footer}
|
||||
</ActionRow>
|
||||
</ModalDialog.Footer>
|
||||
</ModalDialog>
|
||||
);
|
||||
}
|
||||
|
||||
AppSettingsModalBase.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
@@ -108,7 +104,7 @@ AppSettingsModalBase.defaultProps = {
|
||||
footer: null,
|
||||
};
|
||||
|
||||
function AppSettingsModal({
|
||||
const AppSettingsModal = ({
|
||||
intl,
|
||||
appId,
|
||||
title,
|
||||
@@ -122,7 +118,7 @@ function AppSettingsModal({
|
||||
enableAppHelp,
|
||||
learnMoreText,
|
||||
enableReinitialize,
|
||||
}) {
|
||||
}) => {
|
||||
const { courseId } = useContext(PagesAndResourcesContext);
|
||||
const loadingStatus = useSelector(getLoadingStatus);
|
||||
const updateSettingsRequestStatus = useSelector(getSavingStatus);
|
||||
@@ -271,7 +267,7 @@ function AppSettingsModal({
|
||||
{loadingStatus === RequestStatus.DENIED && <PermissionDeniedAlert />}
|
||||
</AppSettingsModalBase>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
AppSettingsModal.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
@@ -279,8 +275,8 @@ AppSettingsModal.propTypes = {
|
||||
appId: PropTypes.string.isRequired,
|
||||
children: PropTypes.func,
|
||||
onSettingsSave: PropTypes.func,
|
||||
initialValues: PropTypes.objectOf(PropTypes.any),
|
||||
validationSchema: PropTypes.objectOf(PropTypes.any),
|
||||
initialValues: PropTypes.shape({}),
|
||||
validationSchema: PropTypes.shape({}),
|
||||
onClose: PropTypes.func.isRequired,
|
||||
enableAppLabel: PropTypes.string.isRequired,
|
||||
enableAppHelp: PropTypes.string.isRequired,
|
||||
|
||||
@@ -6,18 +6,16 @@ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import AppSettingsModal from '../app-settings-modal/AppSettingsModal';
|
||||
import messages from './messages';
|
||||
|
||||
function CalculatorSettings({ intl, onClose }) {
|
||||
return (
|
||||
<AppSettingsModal
|
||||
appId="calculator"
|
||||
title={intl.formatMessage(messages.heading)}
|
||||
enableAppHelp={intl.formatMessage(messages.enableCalculatorHelp)}
|
||||
enableAppLabel={intl.formatMessage(messages.enableCalculatorLabel)}
|
||||
learnMoreText={intl.formatMessage(messages.enableCalculatorLink)}
|
||||
onClose={onClose}
|
||||
/>
|
||||
const CalculatorSettings = ({ intl, onClose }) => (
|
||||
<AppSettingsModal
|
||||
appId="calculator"
|
||||
title={intl.formatMessage(messages.heading)}
|
||||
enableAppHelp={intl.formatMessage(messages.enableCalculatorHelp)}
|
||||
enableAppLabel={intl.formatMessage(messages.enableCalculatorLabel)}
|
||||
learnMoreText={intl.formatMessage(messages.enableCalculatorLink)}
|
||||
onClose={onClose}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
CalculatorSettings.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
@@ -8,10 +8,9 @@ ensureConfig([
|
||||
'STUDIO_BASE_URL',
|
||||
], 'Course Apps API service');
|
||||
|
||||
const apiBaseUrl = getConfig().STUDIO_BASE_URL;
|
||||
|
||||
const courseAppsApiUrl = `${apiBaseUrl}/api/course_apps/v1/apps`;
|
||||
const courseAdvancedSettingsApiUrl = `${apiBaseUrl}/api/contentstore/v0/advanced_settings`;
|
||||
const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;
|
||||
const getCourseAppsApiUrl = () => `${getApiBaseUrl()}/api/course_apps/v1/apps`;
|
||||
const getCourseAdvancedSettingsApiUrl = () => `${getApiBaseUrl()}/api/contentstore/v0/advanced_settings`;
|
||||
|
||||
/**
|
||||
* Fetches the course apps installed for provided course
|
||||
@@ -20,7 +19,7 @@ const courseAdvancedSettingsApiUrl = `${apiBaseUrl}/api/contentstore/v0/advanced
|
||||
*/
|
||||
export async function getCourseApps(courseId) {
|
||||
const { data } = await getAuthenticatedHttpClient()
|
||||
.get(`${courseAppsApiUrl}/${courseId}`);
|
||||
.get(`${getCourseAppsApiUrl()}/${courseId}`);
|
||||
return camelCaseObject(data);
|
||||
}
|
||||
|
||||
@@ -33,7 +32,7 @@ export async function getCourseApps(courseId) {
|
||||
export async function updateCourseApp(courseId, appId, state) {
|
||||
await getAuthenticatedHttpClient()
|
||||
.patch(
|
||||
`${courseAppsApiUrl}/${courseId}`,
|
||||
`${getCourseAppsApiUrl()}/${courseId}`,
|
||||
{
|
||||
id: appId,
|
||||
enabled: state,
|
||||
@@ -49,7 +48,7 @@ export async function updateCourseApp(courseId, appId, state) {
|
||||
*/
|
||||
export async function getCourseAdvancedSettings(courseId, settings) {
|
||||
const { data } = await getAuthenticatedHttpClient()
|
||||
.get(`${courseAdvancedSettingsApiUrl}/${courseId}`, { filter_fields: settings.map(snakeCase).join(',') });
|
||||
.get(`${getCourseAdvancedSettingsApiUrl()}/${courseId}`, { filter_fields: settings.map(snakeCase).join(',') });
|
||||
return camelCaseObject(data);
|
||||
}
|
||||
|
||||
@@ -62,6 +61,6 @@ export async function getCourseAdvancedSettings(courseId, settings) {
|
||||
*/
|
||||
export async function updateCourseAdvancedSettings(courseId, setting, value) {
|
||||
const { data } = await getAuthenticatedHttpClient()
|
||||
.patch(`${courseAdvancedSettingsApiUrl}/${courseId}`, { [snakeCase(setting)]: { value } });
|
||||
.patch(`${getCourseAdvancedSettingsApiUrl()}/${courseId}`, { [snakeCase(setting)]: { value } });
|
||||
return camelCaseObject(data);
|
||||
}
|
||||
|
||||
@@ -1,21 +1,22 @@
|
||||
import React from 'react';
|
||||
import React, { useMemo } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
export const DiscussionsContext = React.createContext({});
|
||||
|
||||
export default function DiscussionsProvider({ children, path }) {
|
||||
const DiscussionsProvider = ({ children, path }) => {
|
||||
const contextValue = useMemo(() => ({ path }), []);
|
||||
return (
|
||||
<DiscussionsContext.Provider
|
||||
value={{
|
||||
path,
|
||||
}}
|
||||
value={contextValue}
|
||||
>
|
||||
{children}
|
||||
</DiscussionsContext.Provider>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
DiscussionsProvider.propTypes = {
|
||||
children: PropTypes.node.isRequired,
|
||||
path: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default DiscussionsProvider;
|
||||
|
||||
@@ -28,7 +28,7 @@ import Loading from '../../generic/Loading';
|
||||
const SELECTION_STEP = 'selection';
|
||||
const SETTINGS_STEP = 'settings';
|
||||
|
||||
function DiscussionsSettings({ courseId, intl }) {
|
||||
const DiscussionsSettings = ({ courseId, intl }) => {
|
||||
const dispatch = useDispatch();
|
||||
const { path: pagesAndResourcesPath } = useContext(PagesAndResourcesContext);
|
||||
const { status, hasValidationError } = useSelector(state => state.discussions);
|
||||
@@ -145,7 +145,7 @@ function DiscussionsSettings({ courseId, intl }) {
|
||||
</AppConfigForm.Provider>
|
||||
</DiscussionsProvider>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
DiscussionsSettings.propTypes = {
|
||||
courseId: PropTypes.string.isRequired,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import ReactDOM from 'react-dom';
|
||||
import {
|
||||
getConfig, history, initializeMockApp, setConfig,
|
||||
} from '@edx/frontend-platform';
|
||||
@@ -42,6 +43,9 @@ let axiosMock;
|
||||
let store;
|
||||
let container;
|
||||
|
||||
// Modal creates a portal. Overriding ReactDOM.createPortal allows portals to be tested in jest.
|
||||
ReactDOM.createPortal = jest.fn(node => node);
|
||||
|
||||
function renderComponent() {
|
||||
const wrapper = render(
|
||||
<AppProvider store={store}>
|
||||
|
||||
@@ -28,9 +28,9 @@ import AppConfigFormProvider, { AppConfigFormContext } from './AppConfigFormProv
|
||||
import AppConfigFormSaveButton from './AppConfigFormSaveButton';
|
||||
import messages from './messages';
|
||||
|
||||
function AppConfigForm({
|
||||
const AppConfigForm = ({
|
||||
courseId, intl,
|
||||
}) {
|
||||
}) => {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const { formRef } = useContext(AppConfigFormContext);
|
||||
@@ -141,7 +141,7 @@ function AppConfigForm({
|
||||
</ModalDialog>
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
AppConfigForm.propTypes = {
|
||||
courseId: PropTypes.string.isRequired,
|
||||
|
||||
@@ -1,22 +1,23 @@
|
||||
import React from 'react';
|
||||
import React, { useMemo } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
export const AppConfigFormContext = React.createContext({});
|
||||
|
||||
export default function AppConfigFormProvider({ children }) {
|
||||
const AppConfigFormProvider = ({ children }) => {
|
||||
const formRef = React.createRef();
|
||||
const contextValue = useMemo(() => ({ formRef }), []);
|
||||
|
||||
return (
|
||||
<AppConfigFormContext.Provider
|
||||
value={{
|
||||
formRef,
|
||||
}}
|
||||
value={contextValue}
|
||||
>
|
||||
{children}
|
||||
</AppConfigFormContext.Provider>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
AppConfigFormProvider.propTypes = {
|
||||
children: PropTypes.node.isRequired,
|
||||
};
|
||||
|
||||
export default AppConfigFormProvider;
|
||||
|
||||
@@ -10,7 +10,7 @@ import { SAVING } from '../data/slice';
|
||||
import { AppConfigFormContext } from './AppConfigFormProvider';
|
||||
import { useModel } from '../../../generic/model-store';
|
||||
|
||||
function AppConfigFormSaveButton({ intl, labelText }) {
|
||||
const AppConfigFormSaveButton = ({ intl, labelText }) => {
|
||||
const saveStatus = useSelector(state => state.discussions.saveStatus);
|
||||
const { selectedAppId } = useSelector((state) => state.discussions);
|
||||
|
||||
@@ -45,7 +45,7 @@ function AppConfigFormSaveButton({ intl, labelText }) {
|
||||
/>
|
||||
)
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
AppConfigFormSaveButton.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
@@ -18,7 +18,7 @@ import { useModel } from '../../../../../generic/model-store';
|
||||
|
||||
ensureConfig(['SITE_NAME', 'SUPPORT_EMAIL'], 'LTI Config Form');
|
||||
|
||||
function LtiConfigForm({ onSubmit, intl, formRef }) {
|
||||
const LtiConfigForm = ({ onSubmit, intl, formRef }) => {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const { selectedAppId, piiConfig } = useSelector((state) => state.discussions);
|
||||
@@ -177,7 +177,7 @@ function LtiConfigForm({ onSubmit, intl, formRef }) {
|
||||
/>
|
||||
</Card>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
LtiConfigForm.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
@@ -21,23 +21,23 @@ import OpenedXConfigFormProvider from './OpenedXConfigFormProvider';
|
||||
|
||||
setupYupExtensions();
|
||||
|
||||
function OpenedXConfigForm({
|
||||
const OpenedXConfigForm = ({
|
||||
onSubmit, formRef, intl, legacy,
|
||||
}) {
|
||||
}) => {
|
||||
const {
|
||||
selectedAppId, enableInContext, enableGradedUnits, unitLevelVisibility, discussionTopicIds, divideDiscussionIds,
|
||||
selectedAppId, enableGradedUnits, discussionTopicIds, divideDiscussionIds,
|
||||
} = useSelector(state => state.discussions);
|
||||
const appConfigObj = useModel('appConfigs', selectedAppId);
|
||||
const discussionTopicsModel = useModels('discussionTopics', discussionTopicIds);
|
||||
const legacyAppConfig = {
|
||||
...(appConfigObj || {}),
|
||||
divideDiscussionIds,
|
||||
enableInContext,
|
||||
enableInContext: true,
|
||||
enableGradedUnits,
|
||||
unitLevelVisibility,
|
||||
unitLevelVisibility: true,
|
||||
allowAnonymousPostsPeers: appConfigObj?.allowAnonymousPostsPeers || false,
|
||||
reportedContentEmailNotifications: appConfigObj?.reportedContentEmailNotifications || false,
|
||||
enableReportedContentEmailNotifications: appConfigObj?.enableReportedContentEmailNotifications || false,
|
||||
enableReportedContentEmailNotifications: Boolean(appConfigObj?.enableReportedContentEmailNotifications) || false,
|
||||
blackoutDates: appConfigObj?.blackoutDates || [],
|
||||
discussionTopics: discussionTopicsModel || [],
|
||||
divideByCohorts: appConfigObj?.divideByCohorts || false,
|
||||
@@ -48,12 +48,11 @@ function OpenedXConfigForm({
|
||||
const [validDiscussionTopics, setValidDiscussionTopics] = useState(discussionTopicsModel);
|
||||
// These fields are only used for the new provider and aren't supported for legacy.
|
||||
const additionalFields = legacy ? {} : {
|
||||
enableInContext: Yup.bool().default(true),
|
||||
enabledGradedUnits: Yup.bool().default(false),
|
||||
groupAtSubsection: Yup.bool().default(false),
|
||||
unitLevelVisibility: Yup.bool().default(false),
|
||||
};
|
||||
const validationSchema = Yup.object().shape({
|
||||
// eslint-disable-next-line react/forbid-prop-types
|
||||
blackoutDates: Yup.array(
|
||||
Yup.object().shape({
|
||||
startDate: Yup.string()
|
||||
@@ -78,6 +77,7 @@ function OpenedXConfigForm({
|
||||
}),
|
||||
}),
|
||||
),
|
||||
// eslint-disable-next-line react/forbid-prop-types
|
||||
discussionTopics: Yup.array(
|
||||
Yup.object({
|
||||
name: Yup.string().required(intl.formatMessage(messages.discussionTopicRequired)),
|
||||
@@ -147,7 +147,7 @@ function OpenedXConfigForm({
|
||||
}}
|
||||
</Formik>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
OpenedXConfigForm.propTypes = {
|
||||
legacy: PropTypes.bool.isRequired,
|
||||
|
||||
@@ -41,15 +41,16 @@ const defaultAppConfig = (divideDiscussionIds = []) => ({
|
||||
],
|
||||
divideDiscussionIds,
|
||||
enableGradedUnits: undefined,
|
||||
enableInContext: undefined,
|
||||
enableInContext: true,
|
||||
groupAtSubsection: false,
|
||||
unitLevelVisibility: undefined,
|
||||
unitLevelVisibility: true,
|
||||
allowAnonymousPosts: false,
|
||||
allowAnonymousPostsPeers: false,
|
||||
reportedContentEmailNotifications: false,
|
||||
enableReportedContentEmailNotifications: false,
|
||||
allowDivisionByUnit: false,
|
||||
blackoutDates: [],
|
||||
cohortsEnabled: false,
|
||||
});
|
||||
describe('OpenedXConfigForm', () => {
|
||||
let axiosMock;
|
||||
@@ -109,7 +110,6 @@ describe('OpenedXConfigForm', () => {
|
||||
expect(queryByText(container, messages.visibilityInContext.defaultMessage)).toBeInTheDocument();
|
||||
expect(queryByText(container, messages.gradedUnitPagesLabel.defaultMessage)).toBeInTheDocument();
|
||||
expect(queryByText(container, messages.groupInContextSubsectionLabel.defaultMessage)).toBeInTheDocument();
|
||||
expect(queryByText(container, messages.allowUnitLevelVisibilityLabel.defaultMessage)).toBeInTheDocument();
|
||||
});
|
||||
|
||||
test('calls onSubmit when the formRef is submitted', async () => {
|
||||
@@ -139,17 +139,20 @@ describe('OpenedXConfigForm', () => {
|
||||
await mockStore({
|
||||
...legacyApiResponse,
|
||||
plugin_configuration: {
|
||||
...legacyApiResponse.plugin_configuration,
|
||||
...legacyApiResponse.plugin_configuration,
|
||||
reported_content_email_notifications_flag: true,
|
||||
divided_course_wide_discussions: [],
|
||||
available_division_schemes: [],
|
||||
},
|
||||
});
|
||||
createComponent();
|
||||
const { divideDiscussionIds } = defaultAppConfig(['13f106c6-6735-4e84-b097-0456cff55960', 'course']);
|
||||
|
||||
// DivisionByGroupFields
|
||||
|
||||
expect(container.querySelector('#alert')).toBeInTheDocument();
|
||||
expect(container.querySelector('#divideByCohorts')).toBeInTheDocument();
|
||||
expect(container.querySelector('#divideByCohorts')).not.toBeChecked();
|
||||
expect(container.querySelector('#divideByCohorts')).toBeDisabled();
|
||||
expect(container.querySelector('#divideCourseTopicsByCohorts')).not.toBeInTheDocument();
|
||||
|
||||
divideDiscussionIds.forEach(id => expect(
|
||||
@@ -180,6 +183,7 @@ describe('OpenedXConfigForm', () => {
|
||||
reported_content_email_notifications_flag: true,
|
||||
always_divide_inline_discussions: true,
|
||||
divided_course_wide_discussions: [],
|
||||
available_division_schemes: ['cohorts'],
|
||||
},
|
||||
});
|
||||
createComponent();
|
||||
@@ -187,14 +191,10 @@ describe('OpenedXConfigForm', () => {
|
||||
|
||||
// DivisionByGroupFields
|
||||
expect(container.querySelector('#divideByCohorts')).toBeInTheDocument();
|
||||
expect(container.querySelector('#divideByCohorts')).toBeChecked();
|
||||
expect(container.querySelector('#divideByCohorts')).not.toBeChecked();
|
||||
expect(
|
||||
container.querySelector('#divideCourseTopicsByCohorts'),
|
||||
).toBeInTheDocument();
|
||||
expect(
|
||||
container.querySelector('#divideCourseTopicsByCohorts'),
|
||||
).not.toBeChecked();
|
||||
|
||||
).not.toBeInTheDocument();
|
||||
divideDiscussionIds.forEach(id => expect(
|
||||
container.querySelector(`#checkbox-${id}`),
|
||||
).not.toBeInTheDocument());
|
||||
@@ -212,7 +212,8 @@ describe('OpenedXConfigForm', () => {
|
||||
expect(container.querySelector('#reportedContentEmailNotifications')).toBeChecked();
|
||||
});
|
||||
|
||||
test('folded discussion topics are in the DOM when divideByCohorts and divideCourseWideTopics are enabled',
|
||||
test(
|
||||
'folded discussion topics are in the DOM when divideByCohorts and divideCourseWideTopics are enabled',
|
||||
async () => {
|
||||
await mockStore({
|
||||
...legacyApiResponse,
|
||||
@@ -230,15 +231,13 @@ describe('OpenedXConfigForm', () => {
|
||||
|
||||
// DivisionByGroupFields
|
||||
expect(container.querySelector('#divideByCohorts')).toBeInTheDocument();
|
||||
expect(container.querySelector('#divideByCohorts')).toBeChecked();
|
||||
expect(container.querySelector('#divideCourseTopicsByCohorts')).toBeInTheDocument();
|
||||
expect(container.querySelector('#divideCourseTopicsByCohorts')).toBeChecked();
|
||||
|
||||
expect(container.querySelector('#divideByCohorts')).not.toBeChecked();
|
||||
expect(container.querySelector('#divideCourseTopicsByCohorts')).not.toBeInTheDocument();
|
||||
divideDiscussionIds.forEach(id => {
|
||||
expect(container.querySelector(`#checkbox-${id}`)).toBeInTheDocument();
|
||||
expect(container.querySelector(`#checkbox-${id}`)).toBeChecked();
|
||||
expect(container.querySelector(`#checkbox-${id}`)).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
const updateTopicName = async (topicId, topicName) => {
|
||||
const topicCard = queryByTestId(container, topicId);
|
||||
@@ -266,7 +265,8 @@ describe('OpenedXConfigForm', () => {
|
||||
expect(store.getState().discussions.hasValidationError).toBe(expectExists);
|
||||
};
|
||||
|
||||
test('show required error on field when leaving empty topic name',
|
||||
test(
|
||||
'show required error on field when leaving empty topic name',
|
||||
async () => {
|
||||
await mockStore(legacyApiResponse);
|
||||
createComponent();
|
||||
@@ -275,7 +275,8 @@ describe('OpenedXConfigForm', () => {
|
||||
await waitForElementToBeRemoved(queryByText(topicCard, messages.addTopicHelpText.defaultMessage));
|
||||
assertTopicNameRequiredValidation(topicCard);
|
||||
assertHasErrorValidation();
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
test('check field is not collapsible in case of error', async () => {
|
||||
await mockStore(legacyApiResponse);
|
||||
|
||||
@@ -5,7 +5,7 @@ import { updateValidationStatus } from '../../../data/slice';
|
||||
|
||||
export const OpenedXConfigFormContext = createContext({});
|
||||
|
||||
export default function OpenedXConfigFormProvider({ children, value }) {
|
||||
const OpenedXConfigFormProvider = ({ children, value }) => {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
useEffect(() => {
|
||||
@@ -17,7 +17,7 @@ export default function OpenedXConfigFormProvider({ children, value }) {
|
||||
{children}
|
||||
</OpenedXConfigFormContext.Provider>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
OpenedXConfigFormProvider.propTypes = {
|
||||
children: PropTypes.node.isRequired,
|
||||
@@ -33,3 +33,5 @@ OpenedXConfigFormProvider.propTypes = {
|
||||
isFormInvalid: PropTypes.bool,
|
||||
}).isRequired,
|
||||
};
|
||||
|
||||
export default OpenedXConfigFormProvider;
|
||||
|
||||
@@ -5,27 +5,25 @@ import FormSwitchGroup from '../../../../../generic/FormSwitchGroup';
|
||||
import messages from '../../messages';
|
||||
import AppConfigFormDivider from './AppConfigFormDivider';
|
||||
|
||||
function AnonymousPostingFields({
|
||||
const AnonymousPostingFields = ({
|
||||
onBlur,
|
||||
onChange,
|
||||
intl,
|
||||
values,
|
||||
}) {
|
||||
return (
|
||||
<>
|
||||
<h5 className="mt-4 text-gray-500">{intl.formatMessage(messages.anonymousPosting)}</h5>
|
||||
<AppConfigFormDivider />
|
||||
<FormSwitchGroup
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
id="allowAnonymousPostsPeers"
|
||||
checked={values.allowAnonymousPostsPeers}
|
||||
label={intl.formatMessage(messages.allowAnonymousPostsPeersLabel)}
|
||||
helpText={intl.formatMessage(messages.allowAnonymousPostsPeersHelp)}
|
||||
/>
|
||||
</>
|
||||
}) => (
|
||||
<>
|
||||
<h5 className="mt-4 text-gray-500">{intl.formatMessage(messages.anonymousPosting)}</h5>
|
||||
<AppConfigFormDivider />
|
||||
<FormSwitchGroup
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
id="allowAnonymousPostsPeers"
|
||||
checked={values.allowAnonymousPostsPeers}
|
||||
label={intl.formatMessage(messages.allowAnonymousPostsPeersLabel)}
|
||||
helpText={intl.formatMessage(messages.allowAnonymousPostsPeersHelp)}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
AnonymousPostingFields.propTypes = {
|
||||
onBlur: PropTypes.func.isRequired,
|
||||
|
||||
@@ -2,22 +2,20 @@ import classNames from 'classnames';
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
|
||||
export default function AppConfigFormDivider({ thick, marginAdj }) {
|
||||
return (
|
||||
<hr
|
||||
className={classNames(
|
||||
const AppConfigFormDivider = ({ thick, marginAdj }) => (
|
||||
<hr
|
||||
className={classNames(
|
||||
'my-2 mx-n4 border-light-300',
|
||||
{
|
||||
[`mx-sm-n${marginAdj.sm}`]: marginAdj.sm !== null,
|
||||
[`mx-n${marginAdj.default}`]: marginAdj.default !== null,
|
||||
},
|
||||
)}
|
||||
style={{
|
||||
style={{
|
||||
borderTopWidth: thick ? '3px' : '1px',
|
||||
}}
|
||||
/>
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
AppConfigFormDivider.propTypes = {
|
||||
thick: PropTypes.bool,
|
||||
@@ -34,3 +32,5 @@ AppConfigFormDivider.defaultProps = {
|
||||
sm: 5,
|
||||
},
|
||||
};
|
||||
|
||||
export default AppConfigFormDivider;
|
||||
|
||||
@@ -9,13 +9,13 @@ import AppConfigFormDivider from './AppConfigFormDivider';
|
||||
|
||||
import messages from '../lti/messages';
|
||||
|
||||
function AppExternalLinks({
|
||||
const AppExternalLinks = ({
|
||||
externalLinks,
|
||||
intl,
|
||||
providerName,
|
||||
showLaunchIcon,
|
||||
customClasses,
|
||||
}) {
|
||||
}) => {
|
||||
const { contactEmail, ...links } = externalLinks;
|
||||
const linkTypes = Object.keys(links).filter(key => links[key]);
|
||||
return (
|
||||
@@ -60,7 +60,7 @@ function AppExternalLinks({
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
AppExternalLinks.propTypes = {
|
||||
externalLinks: PropTypes.shape({
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
import React, { useEffect, useContext } from 'react';
|
||||
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import { Form, TransitionReplace } from '@edx/paragon';
|
||||
import {
|
||||
Form, TransitionReplace, Hyperlink, Alert,
|
||||
} from '@edx/paragon';
|
||||
import { AppContext } from '@edx/frontend-platform/react';
|
||||
import { FieldArray, useFormikContext } from 'formik';
|
||||
import _ from 'lodash';
|
||||
import { useParams } from 'react-router-dom';
|
||||
import FormSwitchGroup from '../../../../../generic/FormSwitchGroup';
|
||||
import messages from '../../messages';
|
||||
import AppConfigFormDivider from './AppConfigFormDivider';
|
||||
@@ -21,8 +25,13 @@ const DivisionByGroupFields = ({ intl }) => {
|
||||
discussionTopics,
|
||||
divideByCohorts,
|
||||
divideCourseTopicsByCohorts,
|
||||
cohortsEnabled,
|
||||
} = appConfig;
|
||||
|
||||
const { courseId } = useParams();
|
||||
const { config } = useContext(AppContext);
|
||||
const learningCourseURL = `${config.LMS_BASE_URL}/courses/${courseId}/instructor`;
|
||||
|
||||
useEffect(() => {
|
||||
if (divideByCohorts) {
|
||||
if (!divideCourseTopicsByCohorts && _.size(discussionTopics) !== _.size(divideDiscussionIds)) {
|
||||
@@ -56,20 +65,30 @@ const DivisionByGroupFields = ({ intl }) => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<h5 className="text-gray-500 mb-2 mt-4">
|
||||
<h5 className="text-gray-500 mb-4 mt-4">
|
||||
{intl.formatMessage(messages.divisionByGroup)}
|
||||
</h5>
|
||||
{!cohortsEnabled
|
||||
&& (
|
||||
<Alert className="bg-light-200 font-weight-normal h5" id="alert">
|
||||
{intl.formatMessage(messages.cohortsEnabled)}
|
||||
<Hyperlink destination={learningCourseURL} target="_blank">
|
||||
{intl.formatMessage(messages.instructorDashboard)}
|
||||
</Hyperlink>
|
||||
</Alert>
|
||||
)}
|
||||
<FormSwitchGroup
|
||||
onChange={handleChange}
|
||||
className="mt-2"
|
||||
onBlur={handleBlur}
|
||||
id="divideByCohorts"
|
||||
checked={divideByCohorts}
|
||||
checked={cohortsEnabled === false ? cohortsEnabled : divideByCohorts}
|
||||
label={intl.formatMessage(messages.divideByCohortsLabel)}
|
||||
helpText={intl.formatMessage(messages.divideByCohortsHelp)}
|
||||
disabled={!cohortsEnabled}
|
||||
/>
|
||||
<TransitionReplace>
|
||||
{divideByCohorts ? (
|
||||
{(divideByCohorts && cohortsEnabled) ? (
|
||||
<React.Fragment key="open">
|
||||
<AppConfigFormDivider />
|
||||
<FormSwitchGroup
|
||||
|
||||
@@ -1,78 +1,77 @@
|
||||
import React from 'react';
|
||||
import React, { useState } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import { TransitionReplace } from '@edx/paragon';
|
||||
import { useFormikContext } from 'formik';
|
||||
import FormSwitchGroup from '../../../../../generic/FormSwitchGroup';
|
||||
import messages from '../../messages';
|
||||
import AppConfigFormDivider from './AppConfigFormDivider';
|
||||
import ConfirmationPopup from '../../../../../generic/ConfirmationPopup';
|
||||
|
||||
function InContextDiscussionFields({
|
||||
const InContextDiscussionFields = ({
|
||||
onBlur,
|
||||
onChange,
|
||||
intl,
|
||||
values,
|
||||
}) {
|
||||
}) => {
|
||||
const {
|
||||
setFieldValue,
|
||||
} = useFormikContext();
|
||||
|
||||
const [showPopup, setShowPopup] = useState(false);
|
||||
|
||||
const handleConfirmation = () => {
|
||||
setFieldValue('enableGradedUnits', !values.enableGradedUnits);
|
||||
setShowPopup(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<h5 className="text-gray-500 mt-4">{intl.formatMessage(messages.visibilityInContext)}</h5>
|
||||
{showPopup
|
||||
? (
|
||||
<ConfirmationPopup
|
||||
label={values.enableGradedUnits
|
||||
? intl.formatMessage(messages.cancelEnableDiscussionsLabel)
|
||||
: intl.formatMessage(messages.confirmEnableDiscussionsLabel)}
|
||||
bodyText={values.enableGradedUnits
|
||||
? intl.formatMessage(messages.cancelEnableDiscussions)
|
||||
: intl.formatMessage(messages.confirmEnableDiscussions)}
|
||||
onConfirm={handleConfirmation}
|
||||
confirmLabel={intl.formatMessage(messages.confirm)}
|
||||
onCancel={() => setShowPopup(false)}
|
||||
cancelLabel={intl.formatMessage(messages.cancelButton)}
|
||||
/>
|
||||
)
|
||||
: (
|
||||
<FormSwitchGroup
|
||||
onChange={() => setShowPopup(true)}
|
||||
onBlur={onBlur}
|
||||
id="enableGradedUnits"
|
||||
checked={values.enableGradedUnits}
|
||||
label={intl.formatMessage(messages.gradedUnitPagesLabel)}
|
||||
helpText={intl.formatMessage(messages.gradedUnitPagesHelp)}
|
||||
/>
|
||||
)}
|
||||
<AppConfigFormDivider />
|
||||
<FormSwitchGroup
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
id="enableInContext"
|
||||
checked={values.enableInContext}
|
||||
label={intl.formatMessage(messages.inContextDiscussionLabel)}
|
||||
helpText={intl.formatMessage(messages.inContextDiscussionHelp)}
|
||||
id="groupAtSubsection"
|
||||
checked={values.groupAtSubsection}
|
||||
label={intl.formatMessage(messages.groupInContextSubsectionLabel)}
|
||||
helpText={intl.formatMessage(messages.groupInContextSubsectionHelp)}
|
||||
/>
|
||||
<TransitionReplace>
|
||||
{values.enableInContext ? (
|
||||
<React.Fragment key="open">
|
||||
<AppConfigFormDivider />
|
||||
<FormSwitchGroup
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
className="ml-4"
|
||||
id="enableGradedUnits"
|
||||
checked={values.enableGradedUnits}
|
||||
label={intl.formatMessage(messages.gradedUnitPagesLabel)}
|
||||
helpText={intl.formatMessage(messages.gradedUnitPagesHelp)}
|
||||
/>
|
||||
<AppConfigFormDivider />
|
||||
<FormSwitchGroup
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
className="ml-4"
|
||||
id="groupAtSubsection"
|
||||
checked={values.groupAtSubsection}
|
||||
label={intl.formatMessage(messages.groupInContextSubsectionLabel)}
|
||||
helpText={intl.formatMessage(messages.groupInContextSubsectionHelp)}
|
||||
/>
|
||||
<AppConfigFormDivider />
|
||||
<FormSwitchGroup
|
||||
onChange={onChange}
|
||||
onBlur={onBlur}
|
||||
className="ml-4"
|
||||
id="unitLevelVisibility"
|
||||
checked={values.unitLevelVisibility}
|
||||
label={intl.formatMessage(messages.allowUnitLevelVisibilityLabel)}
|
||||
helpText={intl.formatMessage(messages.allowUnitLevelVisibilityHelp)}
|
||||
/>
|
||||
</React.Fragment>
|
||||
) : <React.Fragment key="closed" />}
|
||||
|
||||
</TransitionReplace>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
InContextDiscussionFields.propTypes = {
|
||||
onBlur: PropTypes.func.isRequired,
|
||||
onChange: PropTypes.func.isRequired,
|
||||
intl: intlShape.isRequired,
|
||||
values: PropTypes.shape({
|
||||
enableInContext: PropTypes.bool,
|
||||
enableGradedUnits: PropTypes.bool,
|
||||
groupAtSubsection: PropTypes.bool,
|
||||
unitLevelVisibility: PropTypes.bool,
|
||||
}).isRequired,
|
||||
};
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import FormSwitchGroup from '../../../../../generic/FormSwitchGroup';
|
||||
import AppConfigFormDivider from './AppConfigFormDivider';
|
||||
import messages from '../../messages';
|
||||
|
||||
function ReportedContentEmailNotifications({ intl }) {
|
||||
const ReportedContentEmailNotifications = ({ intl }) => {
|
||||
const {
|
||||
handleChange,
|
||||
handleBlur,
|
||||
@@ -13,6 +13,7 @@ function ReportedContentEmailNotifications({ intl }) {
|
||||
} = useFormikContext();
|
||||
|
||||
return (
|
||||
// eslint-disable-next-line react/jsx-no-useless-fragment
|
||||
<>
|
||||
{values.enableReportedContentEmailNotifications && (
|
||||
<div>
|
||||
@@ -31,7 +32,7 @@ function ReportedContentEmailNotifications({ intl }) {
|
||||
)}
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
ReportedContentEmailNotifications.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
@@ -14,7 +14,7 @@ import {
|
||||
badgeVariant,
|
||||
} from '../../../../data/constants';
|
||||
import CollapsableEditor from '../../../../../../generic/CollapsableEditor';
|
||||
import DeletePopup from '../../../../../../generic/DeletePopup';
|
||||
import ConfirmationPopup from '../../../../../../generic/ConfirmationPopup';
|
||||
import CollapseCardHeading from './CollapseCardHeading';
|
||||
|
||||
const BlackoutDatesItem = ({
|
||||
@@ -51,13 +51,13 @@ const BlackoutDatesItem = ({
|
||||
|
||||
if (showDeletePopup) {
|
||||
return (
|
||||
<DeletePopup
|
||||
<ConfirmationPopup
|
||||
label={blackoutDate.status === constants.ACTIVE
|
||||
? intl.formatMessage(messages.activeBlackoutDatesDeletionLabel)
|
||||
: intl.formatMessage(messages.blackoutDatesDeletionLabel)}
|
||||
bodyText={intl.formatMessage(deleteHelperText[blackoutDate.status])}
|
||||
onDelete={onDelete}
|
||||
deleteLabel={intl.formatMessage(messages.deleteButton)}
|
||||
onConfirm={onDelete}
|
||||
confirmLabel={intl.formatMessage(messages.deleteButton)}
|
||||
onCancel={() => setShowDeletePopup(false)}
|
||||
cancelLabel={intl.formatMessage(messages.cancelButton)}
|
||||
/>
|
||||
|
||||
@@ -28,11 +28,36 @@ const messages = defineMessages({
|
||||
defaultMessage: 'Cancel',
|
||||
description: 'Button allowing the user to return to discussion provider configurations.',
|
||||
},
|
||||
confirm: {
|
||||
id: 'authoring.discussions.confirm',
|
||||
defaultMessage: 'Confirm',
|
||||
description: 'Button allowing the user to confirm Confirmation.',
|
||||
},
|
||||
confirmConfigurationChange: {
|
||||
id: 'authoring.discussions.confirmConfigurationChange',
|
||||
defaultMessage: 'Are you sure you want to change the discussion settings?',
|
||||
description: 'Asks the user whether he/she really wants to change settings.',
|
||||
},
|
||||
confirmEnableDiscussionsLabel: {
|
||||
id: 'authoring.discussions.confirmEnableDiscussionsLabel',
|
||||
defaultMessage: 'Enable discussions on units in graded subsections?',
|
||||
description: 'Asks the user whether he/she really wants to enable discussions on units in graded subsections.',
|
||||
},
|
||||
cancelEnableDiscussionsLabel: {
|
||||
id: 'authoring.discussions.cancelEnableDiscussionsLabel',
|
||||
defaultMessage: 'Disable discussions on units in graded subsections?',
|
||||
description: 'Asks the user whether he/she really wants to disable discussions on units in graded subsections.',
|
||||
},
|
||||
confirmEnableDiscussions: {
|
||||
id: 'authoring.discussions.confirmEnableDiscussions',
|
||||
defaultMessage: 'Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.',
|
||||
description: 'Asks the user whether he/she really wants to enable discussions on units in graded subsections.',
|
||||
},
|
||||
cancelEnableDiscussions: {
|
||||
id: 'authoring.discussions.cancelEnableDiscussions',
|
||||
defaultMessage: 'Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.',
|
||||
description: 'Asks the user whether he/she really wants to disable discussions on units in graded subsections.',
|
||||
},
|
||||
backButton: {
|
||||
id: 'authoring.discussions.backButton',
|
||||
defaultMessage: 'Back',
|
||||
@@ -124,23 +149,24 @@ const messages = defineMessages({
|
||||
defaultMessage: 'Questions for the TAs',
|
||||
description: 'Label for a checkbox allowing a user to divide the Questions for the TAs (TA stands for "teaching assistant") course wide topic by cohorts.',
|
||||
},
|
||||
|
||||
cohortsEnabled: {
|
||||
id: 'authoring.discussions.builtIn.cohortsEnabled.label',
|
||||
defaultMessage: 'To adjust these settings, enable cohorts on the ',
|
||||
description: 'Label text informing the user to enable cohort',
|
||||
},
|
||||
instructorDashboard: {
|
||||
id: 'authoring.discussions.builtIn.instructorDashboard.label',
|
||||
defaultMessage: 'instructor dashboard',
|
||||
description: 'Label text for instructor dashboard',
|
||||
},
|
||||
// In-context discussion fields
|
||||
visibilityInContext: {
|
||||
id: 'authoring.discussions.builtIn.visibilityInContext',
|
||||
defaultMessage: 'Visibility of in-context discussions',
|
||||
},
|
||||
inContextDiscussionLabel: {
|
||||
id: 'authoring.discussions.builtIn.inContextDiscussion.label',
|
||||
defaultMessage: 'In-context discussion',
|
||||
},
|
||||
inContextDiscussionHelp: {
|
||||
id: 'authoring.discussions.builtIn.inContextDiscussion.help',
|
||||
defaultMessage: 'Learners will be able to view or hide a discussion side panel to engage with discussion on the course unit page.',
|
||||
},
|
||||
gradedUnitPagesLabel: {
|
||||
id: 'authoring.discussions.builtIn.gradedUnitPages.label',
|
||||
defaultMessage: 'Graded unit pages',
|
||||
defaultMessage: 'Enable discussions on units in graded subsections',
|
||||
},
|
||||
gradedUnitPagesHelp: {
|
||||
id: 'authoring.discussions.builtIn.gradedUnitPages.help',
|
||||
@@ -154,14 +180,6 @@ const messages = defineMessages({
|
||||
id: 'authoring.discussions.builtIn.groupInContextSubsection.help',
|
||||
defaultMessage: 'Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.',
|
||||
},
|
||||
allowUnitLevelVisibilityLabel: {
|
||||
id: 'authoring.discussions.builtIn.allowUnitLevelVisibility.label',
|
||||
defaultMessage: 'Allow visibility configuration for each course unit',
|
||||
},
|
||||
allowUnitLevelVisibilityHelp: {
|
||||
id: 'authoring.discussions.builtIn.allowUnitLevelVisibility.help',
|
||||
defaultMessage: 'With this advanced setting enabled you will be able to override the global visibility setting and turn discussions on or off for each unit from the course outline view..',
|
||||
},
|
||||
|
||||
// Anonymous posting fields
|
||||
anonymousPosting: {
|
||||
|
||||
@@ -38,9 +38,7 @@ export const hasValidTimeFormat = (time) => time && moment(time, validTimeFormat
|
||||
export const startOfDayTime = (time) => time || moment().startOf('day').format('HH:mm');
|
||||
export const endOfDayTime = (time) => time || moment().endOf('day').format('HH:mm');
|
||||
export const normalizeTime = (time) => time && moment(time, validTimeFormats, true).format('HH:mm');
|
||||
export const normalizeDate = (date) => moment(
|
||||
date, ['MM/DD/YYYY', 'YYYY-MM-DDTHH:mm', 'YYYY-MM-DD'], true,
|
||||
).format('YYYY-MM-DD');
|
||||
export const normalizeDate = (date) => moment(date, ['MM/DD/YYYY', 'YYYY-MM-DDTHH:mm', 'YYYY-MM-DD'], true).format('YYYY-MM-DD');
|
||||
|
||||
export const decodeDateTime = (date, time) => {
|
||||
const nDate = normalizeDate(date);
|
||||
@@ -50,8 +48,11 @@ export const decodeDateTime = (date, time) => {
|
||||
};
|
||||
|
||||
export const sortBlackoutDatesByStatus = (data, status, order) => (
|
||||
_.orderBy(data.filter(date => date.status === status),
|
||||
[(obj) => decodeDateTime(obj.startDate, startOfDayTime(obj.startTime))], [order])
|
||||
_.orderBy(
|
||||
data.filter(date => date.status === status),
|
||||
[(obj) => decodeDateTime(obj.startDate, startOfDayTime(obj.startTime))],
|
||||
[order],
|
||||
)
|
||||
);
|
||||
|
||||
export const formatBlackoutDates = ({
|
||||
|
||||
@@ -11,9 +11,9 @@ import messages from './messages';
|
||||
import appMessages from '../app-config-form/messages';
|
||||
import FeaturesList from './FeaturesList';
|
||||
|
||||
function AppCard({
|
||||
const AppCard = ({
|
||||
app, onClick, intl, selected, features,
|
||||
}) {
|
||||
}) => {
|
||||
const { canChangeProviders } = useSelector(state => state.courseDetail);
|
||||
const supportText = app.hasFullSupport
|
||||
? intl.formatMessage(messages.appFullSupport)
|
||||
@@ -62,7 +62,7 @@ function AppCard({
|
||||
</Card.Body>
|
||||
</Card>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
AppCard.propTypes = {
|
||||
app: PropTypes.shape({
|
||||
@@ -73,7 +73,7 @@ AppCard.propTypes = {
|
||||
onClick: PropTypes.func.isRequired,
|
||||
selected: PropTypes.bool.isRequired,
|
||||
intl: intlShape.isRequired,
|
||||
features: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
features: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
|
||||
};
|
||||
|
||||
export default injectIntl(AppCard);
|
||||
|
||||
@@ -14,7 +14,7 @@ import FeaturesTable from './FeaturesTable';
|
||||
import AppListNextButton from './AppListNextButton';
|
||||
import Loading from '../../../generic/Loading';
|
||||
|
||||
function AppList({ intl }) {
|
||||
const AppList = ({ intl }) => {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const {
|
||||
@@ -90,7 +90,7 @@ function AppList({ intl }) {
|
||||
</Responsive>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
AppList.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* eslint-disable react/jsx-no-constructed-context-values */
|
||||
import React from 'react';
|
||||
|
||||
import { initializeMockApp } from '@edx/frontend-platform';
|
||||
|
||||
@@ -8,7 +8,7 @@ import { DiscussionsContext } from '../DiscussionsProvider';
|
||||
|
||||
import messages from './messages';
|
||||
|
||||
function AppListNextButton({ intl }) {
|
||||
const AppListNextButton = ({ intl }) => {
|
||||
const { selectedAppId } = useSelector(state => state.discussions);
|
||||
const { path: discussionsPath } = useContext(DiscussionsContext);
|
||||
|
||||
@@ -24,7 +24,7 @@ function AppListNextButton({ intl }) {
|
||||
{intl.formatMessage(messages.nextButton)}
|
||||
</Button>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
AppListNextButton.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
@@ -41,9 +41,7 @@ describe('FeaturesList', () => {
|
||||
const button = getByRole(container, 'button');
|
||||
userEvent.click(button);
|
||||
app.featureIds.forEach((id) => {
|
||||
const featureNodes = queryAllByText(
|
||||
container, messages[`featureName-${id}`].defaultMessage,
|
||||
);
|
||||
const featureNodes = queryAllByText(container, messages[`featureName-${id}`].defaultMessage);
|
||||
expect(featureNodes.map(node => node.closest('div'))).toHaveLength(1);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -6,37 +6,35 @@ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import SupportedFeature from './SupportedFeature';
|
||||
import messages from './messages';
|
||||
|
||||
function FeaturesList({ app, intl }) {
|
||||
return (
|
||||
<Collapsible
|
||||
onClick={(event) => event.stopPropagation()}
|
||||
title={(
|
||||
<>
|
||||
<Collapsible.Visible whenClosed>
|
||||
{intl.formatMessage(messages['supportedFeatureList-mobile-show'])}
|
||||
</Collapsible.Visible>
|
||||
<Collapsible.Visible whenOpen>
|
||||
{intl.formatMessage(messages['supportedFeatureList-mobile-hide'])}
|
||||
</Collapsible.Visible>
|
||||
</>
|
||||
const FeaturesList = ({ app, intl }) => (
|
||||
<Collapsible
|
||||
onClick={(event) => event.stopPropagation()}
|
||||
title={(
|
||||
<>
|
||||
<Collapsible.Visible whenClosed>
|
||||
{intl.formatMessage(messages['supportedFeatureList-mobile-show'])}
|
||||
</Collapsible.Visible>
|
||||
<Collapsible.Visible whenOpen>
|
||||
{intl.formatMessage(messages['supportedFeatureList-mobile-hide'])}
|
||||
</Collapsible.Visible>
|
||||
</>
|
||||
)}
|
||||
styling="basic"
|
||||
>
|
||||
{app.featureIds.map((id) => (
|
||||
<div key={`collapsible-${app.id}&${id}`} className="d-flex mb-1">
|
||||
<SupportedFeature name={intl.formatMessage(messages[`featureName-${id}`])} />
|
||||
</div>
|
||||
styling="basic"
|
||||
>
|
||||
{app.featureIds.map((id) => (
|
||||
<div key={`collapsible-${app.id}&${id}`} className="d-flex mb-1">
|
||||
<SupportedFeature name={intl.formatMessage(messages[`featureName-${id}`])} />
|
||||
</div>
|
||||
))}
|
||||
</Collapsible>
|
||||
</Collapsible>
|
||||
);
|
||||
}
|
||||
|
||||
export default injectIntl(FeaturesList);
|
||||
|
||||
FeaturesList.propTypes = {
|
||||
app: PropTypes.shape({
|
||||
id: PropTypes.string.isRequired,
|
||||
featureIds: PropTypes.array.isRequired,
|
||||
featureIds: PropTypes.shape([]).isRequired,
|
||||
}).isRequired,
|
||||
intl: intlShape.isRequired,
|
||||
};
|
||||
|
||||
@@ -10,7 +10,7 @@ import appMessages from '../app-config-form/messages';
|
||||
import { FEATURE_TYPES } from '../data/constants';
|
||||
import './FeaturesTable.scss';
|
||||
|
||||
function FeaturesTable({ apps, features, intl }) {
|
||||
const FeaturesTable = ({ apps, features, intl }) => {
|
||||
const {
|
||||
basic, partial, full, common,
|
||||
} = _.groupBy(features, (feature) => feature.featureSupportType);
|
||||
@@ -87,12 +87,12 @@ function FeaturesTable({ apps, features, intl }) {
|
||||
<DataTable.Table />
|
||||
</DataTable>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default injectIntl(FeaturesTable);
|
||||
|
||||
FeaturesTable.propTypes = {
|
||||
apps: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
features: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
apps: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
|
||||
features: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
|
||||
intl: intlShape.isRequired,
|
||||
};
|
||||
|
||||
@@ -9,7 +9,7 @@ const SupportedFeature = ({ name }) => (
|
||||
</span>
|
||||
{name}
|
||||
</>
|
||||
);
|
||||
);
|
||||
|
||||
SupportedFeature.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
|
||||
@@ -64,7 +64,7 @@ const messages = defineMessages({
|
||||
},
|
||||
'appDescription-openedx': {
|
||||
id: 'authoring.discussions.appList.appDescription-openedx',
|
||||
defaultMessage: 'Start conversations with other learners, ask questions, and interact with other learners in the course.',
|
||||
defaultMessage: 'Enable participation in discussion topics alongside course content.',
|
||||
description: 'A description of the new edX Discussions app.',
|
||||
},
|
||||
// Piazza
|
||||
|
||||
@@ -32,7 +32,7 @@ function normalizeLtiConfig(data) {
|
||||
}
|
||||
|
||||
export function normalizeBlackoutDates(data) {
|
||||
if (!data.length) {
|
||||
if (!data || Object.keys(data).length < 1) {
|
||||
return [];
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@ function normalizePluginConfig(data) {
|
||||
if (!data || Object.keys(data).length < 1) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const enableDivideByCohorts = data.always_divide_inline_discussions && data.division_scheme === 'cohort';
|
||||
const enableDivideCourseTopicsByCohorts = enableDivideByCohorts && data.divided_course_wide_discussions.length > 0;
|
||||
return {
|
||||
@@ -69,6 +70,8 @@ function normalizePluginConfig(data) {
|
||||
allowDivisionByUnit: false,
|
||||
divideByCohorts: enableDivideByCohorts,
|
||||
divideCourseTopicsByCohorts: enableDivideCourseTopicsByCohorts,
|
||||
cohortsEnabled: data.available_division_schemes?.includes('cohort') || false,
|
||||
groupAtSubsection: data.group_at_subsection,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -252,6 +252,7 @@ describe('Data layer integration tests', () => {
|
||||
alwaysDivideInlineDiscussions: false,
|
||||
allowDivisionByUnit: false,
|
||||
divideCourseTopicsByCohorts: false,
|
||||
cohortsEnabled: false,
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -455,6 +456,7 @@ describe('Data layer integration tests', () => {
|
||||
allowDivisionsByUnit: true,
|
||||
alwaysDivideInlineDiscussions: true,
|
||||
divideCourseTopicsByCohorts: true,
|
||||
divisionScheme: DivisionSchemes.COHORT,
|
||||
divideDiscussionIds,
|
||||
discussionTopics: [
|
||||
{ name: 'Edx', id: '13f106c6-6735-4e84-b097-0456cff55960' },
|
||||
@@ -463,7 +465,6 @@ describe('Data layer integration tests', () => {
|
||||
},
|
||||
pagesAndResourcesPath,
|
||||
), store.dispatch);
|
||||
|
||||
expect(window.location.pathname).toEqual(pagesAndResourcesPath);
|
||||
expect(store.getState().discussions).toEqual(
|
||||
expect.objectContaining({
|
||||
@@ -490,6 +491,7 @@ describe('Data layer integration tests', () => {
|
||||
// happens, but NOT what we want to have happen!
|
||||
divideByCohorts: true,
|
||||
divisionScheme: DivisionSchemes.COHORT,
|
||||
cohortsEnabled: false,
|
||||
allowDivisionByUnit: false,
|
||||
divideCourseTopicsByCohorts: true,
|
||||
});
|
||||
|
||||
@@ -6,18 +6,16 @@ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import AppSettingsModal from '../app-settings-modal/AppSettingsModal';
|
||||
import messages from './messages';
|
||||
|
||||
function NotesSettings({ intl, onClose }) {
|
||||
return (
|
||||
<AppSettingsModal
|
||||
appId="edxnotes"
|
||||
title={intl.formatMessage(messages.heading)}
|
||||
enableAppHelp={intl.formatMessage(messages.enableNotesHelp)}
|
||||
enableAppLabel={intl.formatMessage(messages.enableNotesLabel)}
|
||||
learnMoreText={intl.formatMessage(messages.enableNotesLink)}
|
||||
onClose={onClose}
|
||||
/>
|
||||
const NotesSettings = ({ intl, onClose }) => (
|
||||
<AppSettingsModal
|
||||
appId="edxnotes"
|
||||
title={intl.formatMessage(messages.heading)}
|
||||
enableAppHelp={intl.formatMessage(messages.enableNotesHelp)}
|
||||
enableAppLabel={intl.formatMessage(messages.enableNotesLabel)}
|
||||
learnMoreText={intl.formatMessage(messages.enableNotesLink)}
|
||||
onClose={onClose}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
NotesSettings.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
129
src/pages-and-resources/live/BBBSettings.jsx
Normal file
129
src/pages-and-resources/live/BBBSettings.jsx
Normal file
@@ -0,0 +1,129 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { getConfig } from '@edx/frontend-platform';
|
||||
import { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import { Form, Hyperlink } from '@edx/paragon';
|
||||
import PropTypes from 'prop-types';
|
||||
import messages from './messages';
|
||||
import { providerNames, bbbPlanTypes } from './constants';
|
||||
import AppConfigFormDivider from '../discussions/app-config-form/apps/shared/AppConfigFormDivider';
|
||||
import LiveCommonFields from './LiveCommonFields';
|
||||
import { useModel } from '../../generic/model-store';
|
||||
|
||||
const BbbSettings = ({
|
||||
intl,
|
||||
values,
|
||||
setFieldValue,
|
||||
}) => {
|
||||
const [bbbPlan, setBbbPlan] = useState(values.tierType);
|
||||
|
||||
useEffect(() => {
|
||||
setBbbPlan(values.tierType);
|
||||
}, [values.tierType]);
|
||||
|
||||
const app = useModel('liveApps', 'big_blue_button');
|
||||
const isPiiDisabled = !values.piiSharingEnable;
|
||||
function getBbbPlanOptions() {
|
||||
const options = ['Select', bbbPlanTypes.commercial];
|
||||
if (app.hasFreeTier) { options.push(bbbPlanTypes.free); }
|
||||
return options.map(option => (
|
||||
<option
|
||||
key={option}
|
||||
value={option}
|
||||
data-testid={option}
|
||||
>
|
||||
{option}
|
||||
</option>
|
||||
));
|
||||
}
|
||||
const handlePlanChange = (e) => {
|
||||
setBbbPlan(e.target.value);
|
||||
setFieldValue('tierType', e.target.value);
|
||||
};
|
||||
return (
|
||||
<>
|
||||
{isPiiDisabled ? (
|
||||
<p data-testid="request-pii-sharing">
|
||||
{intl.formatMessage(messages.requestPiiSharingEnableForBbb, { provider: providerNames[values.provider] })}
|
||||
</p>
|
||||
) : (
|
||||
<p data-testid="helper-text">
|
||||
{intl.formatMessage(messages.providerHelperText, { providerName: providerNames[values.provider] })}
|
||||
</p>
|
||||
)}
|
||||
|
||||
<Form.Group controlId="bbs-settings" data-testid="plansDropDown">
|
||||
<Form.Label as="planSelector" className="h6">
|
||||
<FormattedMessage
|
||||
id="authoring.live.bbb.selectPlan.label"
|
||||
defaultMessage="Select a plan"
|
||||
description="Label for bbb plan selection"
|
||||
/>
|
||||
</Form.Label>
|
||||
<Form.Control
|
||||
as="select"
|
||||
name="tierType"
|
||||
value={bbbPlan}
|
||||
onChange={handlePlanChange}
|
||||
disabled={isPiiDisabled}
|
||||
>
|
||||
{getBbbPlanOptions()}
|
||||
</Form.Control>
|
||||
</Form.Group>
|
||||
|
||||
<Hyperlink
|
||||
destination={getConfig().BBB_LEARN_MORE_URL}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
showLaunchIcon
|
||||
className="text-primary-500 pt-2"
|
||||
>
|
||||
{ intl.formatMessage(messages.learnMore, { providerName: 'plans' }) }
|
||||
</Hyperlink>
|
||||
<>
|
||||
<AppConfigFormDivider thick marginAdj={{ default: 0, sm: 2 }} />
|
||||
{isPiiDisabled ? (
|
||||
<p data-testid="help-request-pii-sharing">
|
||||
{intl.formatMessage(messages.piiSharingEnableHelpTextBbb)}
|
||||
</p>
|
||||
) : (
|
||||
<>
|
||||
{bbbPlan === bbbPlanTypes.commercial && <LiveCommonFields values={values} />}
|
||||
{bbbPlan === bbbPlanTypes.free && (
|
||||
<span data-testid="free-plan-message">
|
||||
{intl.formatMessage(messages.freePlanMessage)}
|
||||
<Hyperlink
|
||||
destination="https://bigbluebutton.org/privacy-policy/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
showLaunchIcon
|
||||
className="text-gray-700 ml-1"
|
||||
>
|
||||
{intl.formatMessage(messages.privacyPolicy)}
|
||||
</Hyperlink>
|
||||
</span>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
</>
|
||||
|
||||
);
|
||||
};
|
||||
|
||||
BbbSettings.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
values: PropTypes.shape({
|
||||
consumerKey: PropTypes.string,
|
||||
consumerSecret: PropTypes.string,
|
||||
launchUrl: PropTypes.string,
|
||||
launchEmail: PropTypes.string,
|
||||
provider: PropTypes.string,
|
||||
piiSharingEmail: PropTypes.bool,
|
||||
piiSharingUsername: PropTypes.bool,
|
||||
piiSharingEnable: PropTypes.bool,
|
||||
tierType: PropTypes.string,
|
||||
}).isRequired,
|
||||
setFieldValue: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default injectIntl(BbbSettings);
|
||||
140
src/pages-and-resources/live/BbbSettings.test.jsx
Normal file
140
src/pages-and-resources/live/BbbSettings.test.jsx
Normal file
@@ -0,0 +1,140 @@
|
||||
import {
|
||||
render,
|
||||
queryByTestId,
|
||||
getByRole,
|
||||
getAllByRole,
|
||||
waitForElementToBeRemoved,
|
||||
} from '@testing-library/react';
|
||||
|
||||
import ReactDOM from 'react-dom';
|
||||
import { Switch } from 'react-router-dom';
|
||||
import { initializeMockApp, history } from '@edx/frontend-platform';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
|
||||
import { AppProvider, PageRoute } from '@edx/frontend-platform/react';
|
||||
import { IntlProvider } from '@edx/frontend-platform/i18n';
|
||||
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import initializeStore from '../../store';
|
||||
import { executeThunk } from '../../utils';
|
||||
import LiveSettings from './Settings';
|
||||
import {
|
||||
generateLiveConfigurationApiResponse,
|
||||
courseId,
|
||||
initialState,
|
||||
configurationProviders,
|
||||
} from './factories/mockApiResponses';
|
||||
|
||||
import { fetchLiveConfiguration, fetchLiveProviders } from './data/thunks';
|
||||
import { providerConfigurationApiUrl, providersApiUrl } from './data/api';
|
||||
import messages from './messages';
|
||||
import PagesAndResourcesProvider from '../PagesAndResourcesProvider';
|
||||
|
||||
let axiosMock;
|
||||
let container;
|
||||
let store;
|
||||
const liveSettingsUrl = `/course/${courseId}/pages-and-resources/live/settings`;
|
||||
|
||||
// Modal creates a portal. Overriding ReactDOM.createPortal allows portals to be tested in jest.
|
||||
ReactDOM.createPortal = jest.fn(node => node);
|
||||
|
||||
const renderComponent = () => {
|
||||
const wrapper = render(
|
||||
<IntlProvider locale="en">
|
||||
<AppProvider store={store}>
|
||||
<PagesAndResourcesProvider courseId={courseId}>
|
||||
<Switch>
|
||||
<PageRoute path={liveSettingsUrl}>
|
||||
<LiveSettings onClose={() => {}} />
|
||||
</PageRoute>
|
||||
</Switch>
|
||||
</PagesAndResourcesProvider>
|
||||
</AppProvider>
|
||||
</IntlProvider>,
|
||||
);
|
||||
container = wrapper.container;
|
||||
};
|
||||
|
||||
const mockStore = async ({
|
||||
usernameSharing = false,
|
||||
emailSharing = false,
|
||||
enabled = true,
|
||||
piiSharingAllowed = true,
|
||||
isFreeTier = false,
|
||||
}) => {
|
||||
const fetchProviderConfigUrl = `${providersApiUrl}/${courseId}/`;
|
||||
const fetchLiveConfigUrl = `${providerConfigurationApiUrl}/${courseId}/`;
|
||||
|
||||
axiosMock.onGet(fetchProviderConfigUrl).reply(200, configurationProviders(emailSharing, usernameSharing, 'big_blue_button', isFreeTier));
|
||||
axiosMock.onGet(fetchLiveConfigUrl).reply(200, generateLiveConfigurationApiResponse(enabled, piiSharingAllowed, 'bigBlueButton', isFreeTier));
|
||||
|
||||
await executeThunk(fetchLiveProviders(courseId), store.dispatch);
|
||||
await executeThunk(fetchLiveConfiguration(courseId), store.dispatch);
|
||||
};
|
||||
|
||||
describe('BBB Settings', () => {
|
||||
beforeEach(async () => {
|
||||
initializeMockApp({
|
||||
authenticatedUser: {
|
||||
userId: 3,
|
||||
username: 'abc123',
|
||||
administrator: false,
|
||||
roles: [],
|
||||
},
|
||||
});
|
||||
store = initializeStore(initialState);
|
||||
axiosMock = new MockAdapter(getAuthenticatedHttpClient());
|
||||
history.push(liveSettingsUrl);
|
||||
});
|
||||
|
||||
test('Plan dropdown to be visible and enabled in UI', async () => {
|
||||
await mockStore({ emailSharing: true });
|
||||
renderComponent();
|
||||
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
|
||||
expect(queryByTestId(container, 'plansDropDown')).toBeInTheDocument();
|
||||
expect(container.querySelector('select[name="tierType"]')).not.toBeDisabled();
|
||||
});
|
||||
|
||||
test.each([[true, 3], [false, 2]])('Plan dropdown should display correct number of options', async (isFreeTier, noOfOptions) => {
|
||||
await mockStore({ emailSharing: true, isFreeTier });
|
||||
renderComponent();
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
const dropDown = queryByTestId(container, 'plansDropDown');
|
||||
expect(getAllByRole(dropDown, 'option').length).toBe(noOfOptions);
|
||||
});
|
||||
|
||||
test(
|
||||
'Connect to support and PII sharing message is visible and plans selection is disabled, When pii sharing is disabled, ',
|
||||
async () => {
|
||||
await mockStore({ piiSharingAllowed: false });
|
||||
renderComponent();
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
const requestPiiText = queryByTestId(container, 'request-pii-sharing');
|
||||
const helpRequestPiiText = queryByTestId(container, 'help-request-pii-sharing');
|
||||
expect(requestPiiText).toHaveTextContent(
|
||||
messages.requestPiiSharingEnableForBbb.defaultMessage.replaceAll('{provider}', 'BigBlueButton'),
|
||||
);
|
||||
expect(helpRequestPiiText).toHaveTextContent(messages.piiSharingEnableHelpTextBbb.defaultMessage);
|
||||
expect(container.querySelector('select[name="tierType"]')).toBeDisabled();
|
||||
},
|
||||
);
|
||||
|
||||
test('free plans message is visible when free plan is selected', async () => {
|
||||
await mockStore({ emailSharing: true, isFreeTier: true });
|
||||
renderComponent();
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
const dropDown = container.querySelector('select[name="tierType"]');
|
||||
userEvent.selectOptions(
|
||||
dropDown,
|
||||
getByRole(dropDown, 'option', { name: 'Free' }),
|
||||
);
|
||||
expect(queryByTestId(container, 'free-plan-message')).toBeInTheDocument();
|
||||
expect(queryByTestId(container, 'free-plan-message')).toHaveTextContent(messages.freePlanMessage.defaultMessage);
|
||||
});
|
||||
});
|
||||
47
src/pages-and-resources/live/LiveCommonFields.jsx
Normal file
47
src/pages-and-resources/live/LiveCommonFields.jsx
Normal file
@@ -0,0 +1,47 @@
|
||||
import React from 'react';
|
||||
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import PropTypes from 'prop-types';
|
||||
import messages from './messages';
|
||||
import FormikControl from '../../generic/FormikControl';
|
||||
|
||||
const LiveCommonFields = ({
|
||||
intl,
|
||||
values,
|
||||
}) => (
|
||||
<>
|
||||
<p className="pb-2">{intl.formatMessage(messages.formInstructions)}</p>
|
||||
<FormikControl
|
||||
name="consumerKey"
|
||||
value={values.consumerKey}
|
||||
floatingLabel={intl.formatMessage(messages.consumerKey)}
|
||||
className="pb-1"
|
||||
type="input"
|
||||
/>
|
||||
<FormikControl
|
||||
name="consumerSecret"
|
||||
value={values.consumerSecret}
|
||||
floatingLabel={intl.formatMessage(messages.consumerSecret)}
|
||||
className="pb-1"
|
||||
type="password"
|
||||
/>
|
||||
<FormikControl
|
||||
name="launchUrl"
|
||||
value={values.launchUrl}
|
||||
floatingLabel={intl.formatMessage(messages.launchUrl)}
|
||||
className="pb-1"
|
||||
type="input"
|
||||
/>
|
||||
</>
|
||||
);
|
||||
|
||||
LiveCommonFields.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
values: PropTypes.shape({
|
||||
consumerKey: PropTypes.string,
|
||||
consumerSecret: PropTypes.string,
|
||||
launchUrl: PropTypes.string,
|
||||
launchEmail: PropTypes.string,
|
||||
}).isRequired,
|
||||
};
|
||||
|
||||
export default injectIntl(LiveCommonFields);
|
||||
@@ -5,21 +5,21 @@ import { SelectableBox, Icon } from '@edx/paragon';
|
||||
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import PropTypes from 'prop-types';
|
||||
import * as Yup from 'yup';
|
||||
|
||||
import { fetchLiveData, saveLiveConfiguration, saveLiveConfigurationAsDraft } from './data/thunks';
|
||||
import { selectApp } from './data/slice';
|
||||
import FormikControl from '../../generic/FormikControl';
|
||||
import AppSettingsModal from '../app-settings-modal/AppSettingsModal';
|
||||
import { useModel } from '../../generic/model-store';
|
||||
import Loading from '../../generic/Loading';
|
||||
import iconsSrc from './constants';
|
||||
import { iconsSrc, bbbPlanTypes } from './constants';
|
||||
import { RequestStatus } from '../../data/constants';
|
||||
import messages from './messages';
|
||||
import ZoomSettings from './ZoomSettings';
|
||||
import BBBSettings from './BBBSettings';
|
||||
|
||||
function LiveSettings({
|
||||
const LiveSettings = ({
|
||||
intl,
|
||||
onClose,
|
||||
}) {
|
||||
}) => {
|
||||
const dispatch = useDispatch();
|
||||
const courseId = useSelector(state => state.courseDetail.courseId);
|
||||
const availableProviders = useSelector((state) => state.live.appIds);
|
||||
@@ -38,16 +38,26 @@ function LiveSettings({
|
||||
launchEmail: appConfig?.launchEmail || '',
|
||||
provider: selectedAppId || 'zoom',
|
||||
piiSharingEnable: piiSharingAllowed || false,
|
||||
piiSharingUsername: app?.piiSharing.username || false,
|
||||
piiSharingEmail: app?.piiSharing.email || false,
|
||||
piiSharingUsername: app?.piiSharing?.username || false,
|
||||
piiSharingEmail: app?.piiSharing?.email || false,
|
||||
tierType: appConfig?.tierType || '',
|
||||
};
|
||||
|
||||
const validationSchema = {
|
||||
enabled: Yup.boolean(),
|
||||
consumerKey: Yup.string().required(intl.formatMessage(messages.consumerKeyRequired)),
|
||||
consumerSecret: Yup.string().required(intl.formatMessage(messages.consumerSecretRequired)),
|
||||
launchUrl: Yup.string().required(intl.formatMessage(messages.launchUrlRequired)),
|
||||
launchEmail: Yup.string().required(intl.formatMessage(messages.launchEmailRequired)),
|
||||
consumerKey: Yup.string().when(['provider', 'tierType'], {
|
||||
is: (provider, tier) => provider === 'zoom' || (provider === 'big_blue_button' && tier === bbbPlanTypes.commercial),
|
||||
then: Yup.string().required(intl.formatMessage(messages.consumerKeyRequired)),
|
||||
}),
|
||||
consumerSecret: Yup.string().when(['provider', 'tierType'], {
|
||||
is: (provider, tier) => provider === 'zoom' || (provider === 'big_blue_button' && tier === bbbPlanTypes.commercial),
|
||||
then: Yup.string().notRequired(intl.formatMessage(messages.consumerSecretRequired)),
|
||||
}),
|
||||
launchUrl: Yup.string().when(['provider', 'tierType'], {
|
||||
is: (provider, tier) => provider === 'zoom' || (provider === 'big_blue_button' && tier === bbbPlanTypes.commercial),
|
||||
then: Yup.string().required(intl.formatMessage(messages.launchUrlRequired)),
|
||||
}),
|
||||
launchEmail: Yup.string(),
|
||||
};
|
||||
|
||||
const handleProviderChange = (providerId, setFieldValue, values) => {
|
||||
@@ -65,94 +75,55 @@ function LiveSettings({
|
||||
}, [courseId]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<AppSettingsModal
|
||||
appId="live"
|
||||
title={intl.formatMessage(messages.heading)}
|
||||
enableAppHelp={intl.formatMessage(messages.enableLiveHelp)}
|
||||
enableAppLabel={intl.formatMessage(messages.enableLiveLabel)}
|
||||
learnMoreText={intl.formatMessage(messages.enableLiveLink)}
|
||||
onClose={onClose}
|
||||
initialValues={liveConfiguration}
|
||||
validationSchema={validationSchema}
|
||||
onSettingsSave={handleSettingsSave}
|
||||
configureBeforeEnable
|
||||
enableReinitialize
|
||||
>
|
||||
{({ values, setFieldValue }) => (
|
||||
<>
|
||||
{(status === RequestStatus.IN_PROGRESS) ? (
|
||||
<Loading />
|
||||
) : (
|
||||
<>
|
||||
<h4 className="my-3">{intl.formatMessage(messages.selectProvider)}</h4>
|
||||
<SelectableBox.Set
|
||||
type="checkbox"
|
||||
value={values.provider}
|
||||
onChange={(event) => handleProviderChange(event.target.value, setFieldValue, values)}
|
||||
name="provider"
|
||||
columns={3}
|
||||
className="mb-3"
|
||||
>
|
||||
{availableProviders.map((provider) => (
|
||||
<SelectableBox value={provider} type="checkbox" key={provider}>
|
||||
<div className="d-flex flex-column align-items-center">
|
||||
<Icon src={iconsSrc[`${camelCase(provider)}`]} alt={provider} />
|
||||
<span>{intl.formatMessage(messages[`appName-${camelCase(provider)}`])}</span>
|
||||
</div>
|
||||
</SelectableBox>
|
||||
))}
|
||||
</SelectableBox.Set>
|
||||
{(!values.piiSharingEnable && (values.piiSharingEmail || values.piiSharingUsername)) ? (
|
||||
<p data-testid="request-pii-sharing">
|
||||
{intl.formatMessage(messages.requestPiiSharingEnable, { provider: values.provider })}
|
||||
</p>
|
||||
) : (
|
||||
<>
|
||||
{(values.piiSharingEmail || values.piiSharingUsername)
|
||||
&& (
|
||||
<p data-testid="helper-text">
|
||||
{intl.formatMessage(messages.providerHelperText, { providerName: values.provider })}
|
||||
</p>
|
||||
)}
|
||||
<p className="pb-2">{intl.formatMessage(messages.formInstructions)}</p>
|
||||
<FormikControl
|
||||
name="consumerKey"
|
||||
value={values.consumerKey}
|
||||
floatingLabel={intl.formatMessage(messages.consumerKey)}
|
||||
className="pb-1"
|
||||
type="input"
|
||||
/>
|
||||
<FormikControl
|
||||
name="consumerSecret"
|
||||
value={values.consumerSecret}
|
||||
floatingLabel={intl.formatMessage(messages.consumerSecret)}
|
||||
className="pb-1"
|
||||
type="input"
|
||||
/>
|
||||
<FormikControl
|
||||
name="launchUrl"
|
||||
value={values.launchUrl}
|
||||
floatingLabel={intl.formatMessage(messages.launchUrl)}
|
||||
className="pb-1"
|
||||
type="input"
|
||||
/>
|
||||
<FormikControl
|
||||
name="launchEmail"
|
||||
value={values.launchEmail}
|
||||
floatingLabel={intl.formatMessage(messages.launchEmail)}
|
||||
type="input"
|
||||
/>
|
||||
</>
|
||||
<AppSettingsModal
|
||||
appId="live"
|
||||
title={intl.formatMessage(messages.heading)}
|
||||
enableAppHelp={intl.formatMessage(messages.enableLiveHelp)}
|
||||
enableAppLabel={intl.formatMessage(messages.enableLiveLabel)}
|
||||
learnMoreText={intl.formatMessage(messages.enableLiveLink)}
|
||||
onClose={onClose}
|
||||
initialValues={liveConfiguration}
|
||||
validationSchema={validationSchema}
|
||||
onSettingsSave={handleSettingsSave}
|
||||
configureBeforeEnable
|
||||
enableReinitialize
|
||||
>
|
||||
{({ values, setFieldValue }) => (
|
||||
(status === RequestStatus.IN_PROGRESS) ? (
|
||||
<Loading />
|
||||
) : (
|
||||
<>
|
||||
<h4 className="my-3">{intl.formatMessage(messages.selectProvider)}</h4>
|
||||
<SelectableBox.Set
|
||||
type="checkbox"
|
||||
value={values.provider}
|
||||
onChange={(event) => handleProviderChange(event.target.value, setFieldValue, values)}
|
||||
name="provider"
|
||||
columns={3}
|
||||
className="mb-3"
|
||||
>
|
||||
{availableProviders.map((provider) => (
|
||||
<SelectableBox value={provider} type="checkbox" key={provider}>
|
||||
<div className="d-flex flex-column align-items-center">
|
||||
<Icon src={iconsSrc[`${camelCase(provider)}`]} alt={provider} />
|
||||
<span>{intl.formatMessage(messages[`appName-${camelCase(provider)}`])}</span>
|
||||
</div>
|
||||
</SelectableBox>
|
||||
))}
|
||||
</SelectableBox.Set>
|
||||
{values.provider === 'zoom' ? <ZoomSettings values={values} />
|
||||
: (
|
||||
<BBBSettings
|
||||
values={values}
|
||||
setFieldValue={setFieldValue}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
</>
|
||||
)
|
||||
)}
|
||||
</AppSettingsModal>
|
||||
</>
|
||||
</AppSettingsModal>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
LiveSettings.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
waitForElementToBeRemoved,
|
||||
} from '@testing-library/react';
|
||||
|
||||
import ReactDOM from 'react-dom';
|
||||
import { Switch } from 'react-router-dom';
|
||||
import { initializeMockApp, history } from '@edx/frontend-platform';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
@@ -37,6 +38,9 @@ let container;
|
||||
let store;
|
||||
const liveSettingsUrl = `/course/${courseId}/pages-and-resources/live/settings`;
|
||||
|
||||
// Modal creates a portal. Overriding ReactDOM.createPortal allows portals to be tested in jest.
|
||||
ReactDOM.createPortal = jest.fn(node => node);
|
||||
|
||||
const renderComponent = () => {
|
||||
const wrapper = render(
|
||||
<IntlProvider locale="en">
|
||||
@@ -87,15 +91,12 @@ describe('LiveSettings', () => {
|
||||
|
||||
test('Live Configuration modal is visible', async () => {
|
||||
renderComponent();
|
||||
|
||||
expect(queryByRole(container, 'dialog')).toBeVisible();
|
||||
});
|
||||
|
||||
test('Displays "Configure Live" heading', async () => {
|
||||
renderComponent();
|
||||
|
||||
const headingElement = queryByTestId(container, 'modal-title');
|
||||
|
||||
expect(headingElement).toHaveTextContent(messages.heading.defaultMessage);
|
||||
});
|
||||
|
||||
@@ -140,76 +141,9 @@ describe('LiveSettings', () => {
|
||||
|
||||
expect(providers.childElementCount).toBe(2);
|
||||
expect(providers).toHaveTextContent('Zoom');
|
||||
expect(providers).toHaveTextContent('BigBlueButton');
|
||||
expect(helperText).toHaveTextContent(
|
||||
messages.providerHelperText.defaultMessage.replace('{providerName}', 'zoom'),
|
||||
);
|
||||
});
|
||||
|
||||
test('LTI fields are visible when pii sharing is enabled and email or username sharing required', async () => {
|
||||
await mockStore({ emailSharing: true });
|
||||
renderComponent();
|
||||
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
|
||||
const consumerKey = container.querySelector('input[name="consumerKey"]').parentElement;
|
||||
const consumerSecret = container.querySelector('input[name="consumerSecret"]').parentElement;
|
||||
const launchUrl = container.querySelector('input[name="launchUrl"]').parentElement;
|
||||
const launchEmail = container.querySelector('input[name="launchEmail"]').parentElement;
|
||||
|
||||
expect(consumerKey.firstChild).toBeVisible();
|
||||
expect(consumerKey.lastChild).toHaveTextContent(messages.consumerKey.defaultMessage);
|
||||
expect(consumerSecret.firstChild).toBeVisible();
|
||||
expect(consumerSecret.lastChild).toHaveTextContent(messages.consumerSecret.defaultMessage);
|
||||
expect(launchUrl.firstChild).toBeVisible();
|
||||
expect(launchUrl.lastChild).toHaveTextContent(messages.launchUrl.defaultMessage);
|
||||
expect(launchEmail.firstChild).toBeVisible();
|
||||
expect(launchEmail.lastChild).toHaveTextContent(messages.launchEmail.defaultMessage);
|
||||
});
|
||||
|
||||
test(
|
||||
'Only connect to support message is visible when pii sharing is disabled and email or username sharing is required',
|
||||
async () => {
|
||||
await mockStore({ emailSharing: true, piiSharingAllowed: false });
|
||||
renderComponent();
|
||||
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
|
||||
const requestPiiText = queryByTestId(container, 'request-pii-sharing');
|
||||
const consumerKey = container.querySelector('input[name="consumerKey"]');
|
||||
const consumerSecret = container.querySelector('input[name="consumerSecret"]');
|
||||
const launchUrl = container.querySelector('input[name="launchUrl"]');
|
||||
const launchEmail = container.querySelector('input[name="launchEmail"]');
|
||||
|
||||
expect(requestPiiText).toHaveTextContent(
|
||||
messages.requestPiiSharingEnable.defaultMessage.replaceAll('{provider}', 'zoom'),
|
||||
);
|
||||
expect(consumerKey).not.toBeInTheDocument();
|
||||
expect(consumerSecret).not.toBeInTheDocument();
|
||||
expect(launchUrl).not.toBeInTheDocument();
|
||||
expect(launchEmail).not.toBeInTheDocument();
|
||||
},
|
||||
);
|
||||
|
||||
test('Provider Configuration should be displayed correctly', async () => {
|
||||
const apiDefaultResponse = generateLiveConfigurationApiResponse(true, true);
|
||||
await mockStore({ emailSharing: false, piiSharingAllowed: false });
|
||||
renderComponent();
|
||||
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
|
||||
const consumerKey = container.querySelector('input[name="consumerKey"]');
|
||||
const consumerSecret = container.querySelector('input[name="consumerSecret"]');
|
||||
const launchUrl = container.querySelector('input[name="launchUrl"]');
|
||||
const launchEmail = container.querySelector('input[name="launchEmail"]');
|
||||
|
||||
expect(consumerKey.value).toBe(apiDefaultResponse.lti_configuration.lti_1p1_client_key);
|
||||
expect(consumerSecret.value).toBe(apiDefaultResponse.lti_configuration.lti_1p1_client_secret);
|
||||
expect(launchUrl.value).toBe(apiDefaultResponse.lti_configuration.lti_1p1_launch_url);
|
||||
expect(launchEmail.value).toBe(
|
||||
apiDefaultResponse.lti_configuration.lti_config.additional_parameters.custom_instructor_email,
|
||||
messages.providerHelperText.defaultMessage.replace('{providerName}', 'Zoom'),
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
53
src/pages-and-resources/live/ZoomSettings.jsx
Normal file
53
src/pages-and-resources/live/ZoomSettings.jsx
Normal file
@@ -0,0 +1,53 @@
|
||||
import React from 'react';
|
||||
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
|
||||
import PropTypes from 'prop-types';
|
||||
import messages from './messages';
|
||||
import { providerNames } from './constants';
|
||||
import LiveCommonFields from './LiveCommonFields';
|
||||
import FormikControl from '../../generic/FormikControl';
|
||||
|
||||
const ZoomSettings = ({
|
||||
intl,
|
||||
values,
|
||||
}) => (
|
||||
// eslint-disable-next-line react/jsx-no-useless-fragment
|
||||
<>
|
||||
{!values.piiSharingEnable ? (
|
||||
<p data-testid="request-pii-sharing">
|
||||
{intl.formatMessage(messages.requestPiiSharingEnable, { provider: providerNames[values.provider] })}
|
||||
</p>
|
||||
) : (
|
||||
<>
|
||||
{(values.piiSharingEmail || values.piiSharingUsername)
|
||||
&& (
|
||||
<p data-testid="helper-text">
|
||||
{intl.formatMessage(messages.providerHelperText, { providerName: providerNames[values.provider] })}
|
||||
</p>
|
||||
)}
|
||||
<LiveCommonFields values={values} />
|
||||
<FormikControl
|
||||
name="launchEmail"
|
||||
value={values.launchEmail}
|
||||
floatingLabel={intl.formatMessage(messages.launchEmail)}
|
||||
type="input"
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
ZoomSettings.propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
values: PropTypes.shape({
|
||||
consumerKey: PropTypes.string,
|
||||
consumerSecret: PropTypes.string,
|
||||
launchUrl: PropTypes.string,
|
||||
launchEmail: PropTypes.string,
|
||||
provider: PropTypes.string,
|
||||
piiSharingEmail: PropTypes.bool,
|
||||
piiSharingUsername: PropTypes.bool,
|
||||
piiSharingEnable: PropTypes.bool,
|
||||
}).isRequired,
|
||||
};
|
||||
|
||||
export default injectIntl(ZoomSettings);
|
||||
154
src/pages-and-resources/live/ZoomSettings.test.jsx
Normal file
154
src/pages-and-resources/live/ZoomSettings.test.jsx
Normal file
@@ -0,0 +1,154 @@
|
||||
import {
|
||||
render,
|
||||
queryByTestId,
|
||||
getByRole,
|
||||
waitForElementToBeRemoved,
|
||||
} from '@testing-library/react';
|
||||
|
||||
import ReactDOM from 'react-dom';
|
||||
import { Switch } from 'react-router-dom';
|
||||
import { initializeMockApp, history } from '@edx/frontend-platform';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
|
||||
import { AppProvider, PageRoute } from '@edx/frontend-platform/react';
|
||||
import { IntlProvider } from '@edx/frontend-platform/i18n';
|
||||
|
||||
import initializeStore from '../../store';
|
||||
import { executeThunk } from '../../utils';
|
||||
import LiveSettings from './Settings';
|
||||
import {
|
||||
generateLiveConfigurationApiResponse,
|
||||
courseId,
|
||||
initialState,
|
||||
configurationProviders,
|
||||
} from './factories/mockApiResponses';
|
||||
|
||||
import { fetchLiveConfiguration, fetchLiveProviders } from './data/thunks';
|
||||
import { providerConfigurationApiUrl, providersApiUrl } from './data/api';
|
||||
import messages from './messages';
|
||||
import PagesAndResourcesProvider from '../PagesAndResourcesProvider';
|
||||
|
||||
let axiosMock;
|
||||
let container;
|
||||
let store;
|
||||
const liveSettingsUrl = `/course/${courseId}/pages-and-resources/live/settings`;
|
||||
|
||||
// Modal creates a portal. Overriding ReactDOM.createPortal allows portals to be tested in jest.
|
||||
ReactDOM.createPortal = jest.fn(node => node);
|
||||
|
||||
const renderComponent = () => {
|
||||
const wrapper = render(
|
||||
<IntlProvider locale="en">
|
||||
<AppProvider store={store}>
|
||||
<PagesAndResourcesProvider courseId={courseId}>
|
||||
<Switch>
|
||||
<PageRoute path={liveSettingsUrl}>
|
||||
<LiveSettings onClose={() => {}} />
|
||||
</PageRoute>
|
||||
</Switch>
|
||||
</PagesAndResourcesProvider>
|
||||
</AppProvider>
|
||||
</IntlProvider>,
|
||||
);
|
||||
container = wrapper.container;
|
||||
};
|
||||
|
||||
const mockStore = async ({
|
||||
usernameSharing = false,
|
||||
emailSharing = false,
|
||||
enabled = true,
|
||||
piiSharingAllowed = true,
|
||||
}) => {
|
||||
const fetchProviderConfigUrl = `${providersApiUrl}/${courseId}/`;
|
||||
const fetchLiveConfigUrl = `${providerConfigurationApiUrl}/${courseId}/`;
|
||||
|
||||
axiosMock.onGet(fetchProviderConfigUrl).reply(200, configurationProviders(emailSharing, usernameSharing));
|
||||
axiosMock.onGet(fetchLiveConfigUrl).reply(200, generateLiveConfigurationApiResponse(enabled, piiSharingAllowed));
|
||||
|
||||
await executeThunk(fetchLiveProviders(courseId), store.dispatch);
|
||||
await executeThunk(fetchLiveConfiguration(courseId), store.dispatch);
|
||||
};
|
||||
|
||||
describe('Zoom Settings', () => {
|
||||
beforeEach(async () => {
|
||||
initializeMockApp({
|
||||
authenticatedUser: {
|
||||
userId: 3,
|
||||
username: 'abc123',
|
||||
administrator: false,
|
||||
roles: [],
|
||||
},
|
||||
});
|
||||
store = initializeStore(initialState);
|
||||
axiosMock = new MockAdapter(getAuthenticatedHttpClient());
|
||||
history.push(liveSettingsUrl);
|
||||
});
|
||||
|
||||
test('LTI fields are visible when pii sharing is enabled', async () => {
|
||||
await mockStore({ piiSharingAllowed: true });
|
||||
renderComponent();
|
||||
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
|
||||
const consumerKey = container.querySelector('input[name="consumerKey"]').parentElement;
|
||||
const consumerSecret = container.querySelector('input[name="consumerSecret"]').parentElement;
|
||||
const launchUrl = container.querySelector('input[name="launchUrl"]').parentElement;
|
||||
const launchEmail = container.querySelector('input[name="launchEmail"]').parentElement;
|
||||
|
||||
expect(consumerKey.firstChild).toBeVisible();
|
||||
expect(consumerKey.lastChild).toHaveTextContent(messages.consumerKey.defaultMessage);
|
||||
expect(consumerSecret.firstChild).toBeVisible();
|
||||
expect(consumerSecret.lastChild).toHaveTextContent(messages.consumerSecret.defaultMessage);
|
||||
expect(launchUrl.firstChild).toBeVisible();
|
||||
expect(launchUrl.lastChild).toHaveTextContent(messages.launchUrl.defaultMessage);
|
||||
expect(launchEmail.firstChild).toBeVisible();
|
||||
expect(launchEmail.lastChild).toHaveTextContent(messages.launchEmail.defaultMessage);
|
||||
});
|
||||
|
||||
test(
|
||||
'Only connect to support message is visible when pii sharing is disabled',
|
||||
async () => {
|
||||
await mockStore({ piiSharingAllowed: false });
|
||||
renderComponent();
|
||||
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
|
||||
const requestPiiText = queryByTestId(container, 'request-pii-sharing');
|
||||
const consumerKey = container.querySelector('input[name="consumerKey"]');
|
||||
const consumerSecret = container.querySelector('input[name="consumerSecret"]');
|
||||
const launchUrl = container.querySelector('input[name="launchUrl"]');
|
||||
const launchEmail = container.querySelector('input[name="launchEmail"]');
|
||||
|
||||
expect(requestPiiText).toHaveTextContent(
|
||||
messages.requestPiiSharingEnable.defaultMessage.replaceAll('{provider}', 'Zoom'),
|
||||
);
|
||||
expect(consumerKey).not.toBeInTheDocument();
|
||||
expect(consumerSecret).not.toBeInTheDocument();
|
||||
expect(launchUrl).not.toBeInTheDocument();
|
||||
expect(launchEmail).not.toBeInTheDocument();
|
||||
},
|
||||
);
|
||||
|
||||
test('Provider Configuration should be displayed correctly', async () => {
|
||||
const apiDefaultResponse = generateLiveConfigurationApiResponse(true, true);
|
||||
await mockStore({ piiSharingAllowed: true });
|
||||
renderComponent();
|
||||
|
||||
const spinner = getByRole(container, 'status');
|
||||
await waitForElementToBeRemoved(spinner);
|
||||
|
||||
const consumerKey = container.querySelector('input[name="consumerKey"]');
|
||||
const consumerSecret = container.querySelector('input[name="consumerSecret"]');
|
||||
const launchUrl = container.querySelector('input[name="launchUrl"]');
|
||||
const launchEmail = container.querySelector('input[name="launchEmail"]');
|
||||
|
||||
expect(consumerKey.value).toBe(apiDefaultResponse.lti_configuration.lti_1p1_client_key);
|
||||
expect(consumerSecret.value).toBe(apiDefaultResponse.lti_configuration.lti_1p1_client_secret);
|
||||
expect(launchUrl.value).toBe(apiDefaultResponse.lti_configuration.lti_1p1_launch_url);
|
||||
expect(launchEmail.value).toBe(
|
||||
apiDefaultResponse.lti_configuration.lti_config.additional_parameters.custom_instructor_email,
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -1,9 +1,20 @@
|
||||
import { GoogleMeet, MicrosoftTeams, Zoom } from '@edx/paragon/icons';
|
||||
import {
|
||||
GoogleMeet, MicrosoftTeams, Zoom, Bbb,
|
||||
} from '@edx/paragon/icons';
|
||||
|
||||
const iconsSrc = {
|
||||
export const iconsSrc = {
|
||||
googleMeet: GoogleMeet,
|
||||
microsoftTeams: MicrosoftTeams,
|
||||
zoom: Zoom,
|
||||
bigBlueButton: Bbb,
|
||||
};
|
||||
|
||||
export { iconsSrc as default };
|
||||
export const providerNames = {
|
||||
zoom: 'Zoom',
|
||||
big_blue_button: 'BigBlueButton',
|
||||
};
|
||||
|
||||
export const bbbPlanTypes = {
|
||||
free: 'Free',
|
||||
commercial: 'Commercial/self-hosted',
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user