From e6e293129efe56f36bfbd1285bc59f2c67564267 Mon Sep 17 00:00:00 2001 From: Tiago-Salles Date: Tue, 4 Feb 2025 17:23:17 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B1(cookiecutter)=20select=20databases?= =?UTF-8?q?=20to=20run=20sites?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Changed the activate script to provide also the possibility of select the database to build the app - The intention is to provide flexibility to fetch images from a given dockerhub, and when it is not provided, the dockerhub continues following the standard which is fundocker. --- CHANGELOG.md | 2 + cookiecutter/cookiecutter.json | 4 + .../.circleci/src/jobs/@docker.yml | 24 +- .../.cookiecutter_default.yml | 4 + .../Dockerfile | 4 +- .../Makefile | 48 +- .../bin/activate | 114 +- .../docker-compose-mysql.yml | 17 + .../docker-compose-postgresql.yml | 14 + .../docker-compose-sqlite.yml | 1 + .../docker-compose.yml | 42 +- .../env.d/development.dist | 12 - .../env.d/mysql | 12 + .../env.d/postgresql | 12 + .../env.d/sqlite | 5 + .../template/cookiecutter.json | 4 + .../requirements/base.txt | 1 + .../requirements/dev.txt | 4 +- .../src/backend/locale/.gitkeep | 0 .../locale/ar_SA/LC_MESSAGES/django.po | 470 +++++ .../locale/es_ES/LC_MESSAGES/django.po | 1428 ++++++++++++++ .../locale/fr_CA/LC_MESSAGES/django.po | 1592 ++++++++++++++++ .../locale/fr_FR/LC_MESSAGES/django.po | 1662 +++++++++++++++++ .../locale/ko_KR/LC_MESSAGES/django.po | 66 + .../locale/pt_PT/LC_MESSAGES/django.po | 1641 ++++++++++++++++ .../locale/ru_RU/LC_MESSAGES/django.po | 1495 +++++++++++++++ .../locale/vi_VN/LC_MESSAGES/django.po | 66 + .../backend/{{cookiecutter.site}}/settings.py | 28 +- pyproject.toml | 4 +- sandbox/settings.py | 23 +- src/richie/apps/demo/defaults.py | 367 ++-- .../management/commands/create_demo_site.py | 33 +- 32 files changed, 8827 insertions(+), 372 deletions(-) create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-mysql.yml create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-postgresql.yml create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-sqlite.yml create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/mysql create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/postgresql create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/sqlite create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/.gitkeep create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ar_SA/LC_MESSAGES/django.po create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/es_ES/LC_MESSAGES/django.po create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/fr_CA/LC_MESSAGES/django.po create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/fr_FR/LC_MESSAGES/django.po create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ko_KR/LC_MESSAGES/django.po create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/pt_PT/LC_MESSAGES/django.po create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ru_RU/LC_MESSAGES/django.po create mode 100644 cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/vi_VN/LC_MESSAGES/django.po diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b3cd48d3b..11cd10e554 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ Versioning](https://semver.org/spec/v2.0.0.html). - Add Additional Information section for a category and use them in a course page - Added new page extension `MainMenuEntry` +- Added database selection to activate script +- Added org_dockerhub parameter to cookiecutter ### Fixed diff --git a/cookiecutter/cookiecutter.json b/cookiecutter/cookiecutter.json index e95b9b94c4..b3b2122b36 100644 --- a/cookiecutter/cookiecutter.json +++ b/cookiecutter/cookiecutter.json @@ -1,5 +1,9 @@ { "organization": null, + "org_dockerhub": "fundocker", + "nginx_image_name": "fundocker/openshift-nginx", + "nginx_image_tag": "1.13", + "elasticsearch_image_name": "fundocker/openshift-elasticsearch:6.6.2", "_copy_without_render": [ ".circleci", "bin/activate", diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/.circleci/src/jobs/@docker.yml b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/.circleci/src/jobs/@docker.yml index 5c20c591bf..0f0541712d 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/.circleci/src/jobs/@docker.yml +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/.circleci/src/jobs/@docker.yml @@ -75,39 +75,39 @@ hub: - run: name: Tag app image command: | - docker images fundocker/<< parameters.image_name >> + docker images {{cookiecutter.org_dockerhub}}/<< parameters.image_name >> # Display either: # - DOCKER_TAG: main (Git branch) # or # - DOCKER_TAG: 1.1.2 (Git tag v1.1.2) echo "DOCKER_TAG: ${DOCKER_TAG}" - docker tag << parameters.site >>:production fundocker/<< parameters.image_name >>:${DOCKER_TAG} + docker tag << parameters.site >>:production {{cookiecutter.org_dockerhub}}/<< parameters.image_name >>:${DOCKER_TAG} if [[ -n "$CIRCLE_TAG" ]]; then - docker tag << parameters.site >>:production fundocker/<< parameters.image_name >>:latest + docker tag << parameters.site >>:production {{cookiecutter.org_dockerhub}}/<< parameters.image_name >>:latest fi - docker images | grep -E "^fundocker/<< parameters.image_name >>\s*(${DOCKER_TAG}.*|latest|main)" + docker images | grep -E "^{{cookiecutter.org_dockerhub}}/<< parameters.image_name >>\s*(${DOCKER_TAG}.*|latest|main)" - run: name: Tag nginx image command: | - docker images fundocker/<< parameters.image_name >>-nginx + docker images {{cookiecutter.org_dockerhub}}/<< parameters.image_name >>-nginx echo "DOCKER_TAG: ${DOCKER_TAG}" - docker tag << parameters.site >>-nginx:production fundocker/<< parameters.image_name >>-nginx:${DOCKER_TAG} + docker tag << parameters.site >>-nginx:production {{cookiecutter.org_dockerhub}}/<< parameters.image_name >>-nginx:${DOCKER_TAG} if [[ -n "$CIRCLE_TAG" ]]; then - docker tag << parameters.site >>-nginx:production fundocker/<< parameters.image_name >>-nginx:latest + docker tag << parameters.site >>-nginx:production {{cookiecutter.org_dockerhub}}/<< parameters.image_name >>-nginx:latest fi - docker images | grep -E "^fundocker/<< parameters.image_name >>-nginx\s*(${DOCKER_TAG}.*|latest|main)" + docker images | grep -E "^{{cookiecutter.org_dockerhub}}/<< parameters.image_name >>-nginx\s*(${DOCKER_TAG}.*|latest|main)" # Publish images - run: name: Publish app image command: | - docker push fundocker/<< parameters.image_name >>:${DOCKER_TAG} + docker push {{cookiecutter.org_dockerhub}}/<< parameters.image_name >>:${DOCKER_TAG} if [[ -n "$CIRCLE_TAG" ]]; then - docker push fundocker/<< parameters.image_name >>:latest + docker push {{cookiecutter.org_dockerhub}}/<< parameters.image_name >>:latest fi - run: name: Publish nginx image command: | - docker push fundocker/<< parameters.image_name >>-nginx:${DOCKER_TAG} + docker push {{cookiecutter.org_dockerhub}}/<< parameters.image_name >>-nginx:${DOCKER_TAG} if [[ -n "$CIRCLE_TAG" ]]; then - docker push fundocker/<< parameters.image_name >>-nginx:latest + docker push {{cookiecutter.org_dockerhub}}/<< parameters.image_name >>-nginx:latest fi diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/.cookiecutter_default.yml b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/.cookiecutter_default.yml index 0778a7168d..e0432eab0d 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/.cookiecutter_default.yml +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/.cookiecutter_default.yml @@ -1,2 +1,6 @@ default_context: _organization: {{cookiecutter.organization}} + _org_dockerhub: {{cookiecutter.org_dockerhub}} + _nginx_image_name: {{cookiecutter.nginx_image_name}} + _nginx_image_tag: {{cookiecutter.nginx_image_tag}} + _elasticsearch_image_name: {{cookiecutter.elasticsearch_image_name}} diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/Dockerfile b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/Dockerfile index 5583ec5bd7..a4805bcc53 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/Dockerfile +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/Dockerfile @@ -1,5 +1,5 @@ -ARG NGINX_IMAGE_NAME=fundocker/openshift-nginx -ARG NGINX_IMAGE_TAG=1.13 +ARG NGINX_IMAGE_NAME={{cookiecutter.nginx_image_name}} +ARG NGINX_IMAGE_TAG={{cookiecutter.nginx_image_tag}} ARG STATIC_ROOT=/data/static ARG SITE diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/Makefile b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/Makefile index ac68f7f9c4..61d6c98a0b 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/Makefile +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/Makefile @@ -1,3 +1,9 @@ +# -- Load .env file +ifneq (,$(wildcard .env)) + include .env + export $(shell sed 's/=.*//' .env) +endif + # -- Terminal colors COLOR_INFO = \033[0;36m COLOR_RESET = \033[0m @@ -13,15 +19,13 @@ COMPOSE = \ NGINX_IMAGE_TAG="$(NGINX_IMAGE_TAG)" \ DOCKER_USER="$(DOCKER_UID):$(DOCKER_GID)" \ docker compose +COMPOSE_UP_WAIT = $(COMPOSE) up -d --wait --wait-timeout 60 COMPOSE_RUN = $(COMPOSE) run --rm COMPOSE_RUN_APP = $(COMPOSE_RUN) app-dev COMPOSE_EXEC = $(COMPOSE) exec COMPOSE_EXEC_APP = $(COMPOSE_EXEC) app-dev COMPOSE_TEST_RUN = $(COMPOSE) run --rm -e DJANGO_CONFIGURATION=Test COMPOSE_TEST_RUN_APP = $(COMPOSE_TEST_RUN) app-dev -WAIT_DB = $(COMPOSE_RUN) dockerize -wait tcp://db:5432 -timeout 60s -WAIT_ES = $(COMPOSE_RUN) dockerize -wait tcp://elasticsearch:9200 -timeout 60s -WAIT_SENTINEL = $(COMPOSE_RUN) dockerize -wait tcp://redis-sentinel:26379 -wait tcp://redis-primary:6379 -timeout 20s # -- Node @@ -44,7 +48,7 @@ bootstrap: \ env.d/aws \ env.d/development \ data/media/$(RICHIE_SITE)/.keep \ - data/db/$(RICHIE_SITE) \ + data/${ACTIVATED_DB}/$(RICHIE_SITE) \ stop \ build-front \ build \ @@ -84,7 +88,7 @@ build: .env ## build all containers reset: .env ## Remove database and local files $(COMPOSE) stop rm -Ir data/* || exit 0 - $(COMPOSE) rm db + $(COMPOSE) rm ${ACTIVATED_DB} .PHONY: reset down: .env ## stop & remove containers @@ -96,11 +100,9 @@ logs: .env ## display app logs (follow mode) .PHONY: logs run: .env ## start the wsgi (production) or development server - @$(COMPOSE) up -V -d redis-sentinel - @$(WAIT_SENTINEL) - @$(COMPOSE) up -d nginx - @$(COMPOSE) up -d app-dev - @$(WAIT_DB) + @$(COMPOSE_UP_WAIT) -V redis-sentinel + @$(COMPOSE_UP_WAIT) nginx + @$(COMPOSE_UP_WAIT) app-dev .PHONY: run stop: .env ## stop the development server @@ -179,8 +181,7 @@ check: .env ## perform django checks .PHONY: check demo-site: .env ## create a demo site - @$(COMPOSE) up -d db - @$(WAIT_DB) + @$(COMPOSE_UP_WAIT) ${ACTIVATED_DB} @$(MANAGE) flush @$(MANAGE) create_demo_site @${MAKE} search-index @@ -255,20 +256,20 @@ i18n-front: .env ## Extract and compile translation files used for react-intl .PHONY: i18n-front migrate: .env ## perform database migrations - @$(COMPOSE) up -d db - @$(WAIT_DB) + @echo "Start and wait for ${ACTIVATED_DB} to be up..." + @$(COMPOSE_UP_WAIT) ${ACTIVATED_DB} @$(MANAGE) migrate .PHONY: migrate search-index: .env ## (re)generate the Elasticsearch index - @$(COMPOSE) up -d elasticsearch - @$(WAIT_ES) + @echo "Start and wait for ${ACTIVATED_DB} & elasticsearch to be up..." + @$(COMPOSE_UP_WAIT) elasticsearch @$(MANAGE) bootstrap_elasticsearch .PHONY: search-index -superuser: .env ## create a DjangoCMS superuser - @$(COMPOSE) up -d db - @$(WAIT_DB) +superuser: .env ## Create an admin user with password "admin" + @echo "Start and wait for ${ACTIVATED_DB} to be up..." + @$(COMPOSE_UP_WAIT) ${ACTIVATED_DB} @$(MANAGE) createsuperuser .PHONY: superuser @@ -278,8 +279,7 @@ ci-check: .env ## run django check management command on productin image .PHONY: ci-check ci-migrate: .env ## run django migrate command on production image - @$(COMPOSE) up -d db - @$(WAIT_DB) + @$(COMPOSE) up -d ${ACTIVATED_DB} $(COMPOSE_RUN) app python manage.py migrate .PHONY: ci-migrate @@ -306,9 +306,9 @@ data/media/$(RICHIE_SITE)/.keep: .env @mkdir -p data/media/$(RICHIE_SITE) @touch data/media/$(RICHIE_SITE)/.keep -data/db/$(RICHIE_SITE): .env - @echo 'Preparing db volume...' - @mkdir -p data/db/$(RICHIE_SITE) +data/${ACTIVATED_DB}/$(RICHIE_SITE): .env + @echo 'Preparing ${ACTIVATED_DB} volume...' + @mkdir -p data/${ACTIVATED_DB}/$(RICHIE_SITE) env.d/development: cp env.d/development.dist env.d/development diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/bin/activate b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/bin/activate index e0463f93ad..7c12e9e5ae 100755 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/bin/activate +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/bin/activate @@ -8,6 +8,34 @@ declare -a sites declare -i default=1 declare -i choice declare -i n_sites +declare -a databases=("mysql" "postgresql" "sqlite") +declare -i database_choice +declare -i n_databases +declare -A languages=( + ["Portuguese"]='("pt", "Portuguese")' + ["Portuguese (Brazil)"]='("pt-br", "Portuguese (Brazil)")' + ["French"]='("fr", "French (France)")' + ["Spanish"]='("es", "Spanish")' + ["Russian"]='("ru", "Russian")' + ["Vietnamese"]='("vi", "Vietnamese")' + ["Arabic (Saudi Arabia)"]='("ar", "Arabic (Saudi Arabia)")' + ["Korean"]='("ko", "Korean")' +) +declare -A selected_languages=( + ["English"]='("en", "English")' +) +ordered_languages=( + "English" + "Portuguese" + "Portuguese (Brazil)" + "French (France)" + "Spanish" + "Russian" + "Vietnamese" + "Arabic (Saudi Arabia)" + "Korean" +) +ordered_languages_choices="" # List sites by looking in the "sites" directory # and store them in an array @@ -17,6 +45,7 @@ read -r -a sites <<< "$( xargs )" n_sites=${#sites[@]} +n_databases=${#databases[@]} if [[ n_sites -eq 0 ]]; then (>&2 echo "You should first add a site to the project by running: make add-site") @@ -24,30 +53,91 @@ if [[ n_sites -eq 0 ]]; then fi if [[ n_sites -eq 1 ]]; then - # If there is only one site, just activate it + # If there is only one site, activate it echo "RICHIE_SITE=${sites[0]}" > .env - exit 0 +else + prompt="Select an available site to activate:\\n" + for (( i=0; i&2 echo "Invalid choice ${choice} (should be <= ${n_sites})") + exit 10 + fi + + if [[ ${choice} -le 0 ]]; then + choice=${default} + fi fi -prompt="Select an available site to activate:\\n" -for (( i=0; i&2 echo "Invalid choice ${choice} (should be <= ${n_sites})") - exit 10 -fi +read -r -p "$(echo -e "${prompt}")" database_choice if [[ ${choice} -le 0 ]]; then - choice=${default} + database_choice=${default} fi +echo "Select the languages this site will support:" +for language in "${!languages[@]}"; do + while true; do + read -p "Enable $language? (y/n): " answer + if [[ "$answer" != "y" && "$answer" != "n" ]]; then + echo "Please enter 'y' or 'n'." + else + if [[ "$answer" == "y" ]]; then + selected_languages["$language"]="${languages["$language"]}" + fi + break + fi + done +done + +for language in "${ordered_languages[@]}"; do + if [[ -n "${selected_languages["$language"]}" ]]; then + if [[ -z $ordered_languages_choices ]]; then + ordered_languages_choices="${selected_languages["$language"]}" + else + ordered_languages_choices="$ordered_languages_choices, ${selected_languages["$language"]}" + fi + fi +done + # Activate the chosen site +# Set the database and port +# Set the LANGUAGES variables echo "RICHIE_SITE=${sites[$((choice-1))]}" > .env +echo "ACTIVATED_DB=${databases[$((database_choice-1))]}" >> .env + +if [[ ${database_choice} == 1 ]]; then + echo "DB_PORT=3306" >> .env +else [[ ${database_choice} == 2 ]]; + echo "DB_PORT=5472" >> .env +fi + +echo "LANGUAGES=($ordered_languages_choices)" >> .env + +echo """ +Site activated successfully! + +The configurations are set in the .env file + +Please, note that you can change the languages +order in the .env file according to your needs. +English is the default language and if the site +will not suport it, you can remove it from there. +""" \ No newline at end of file diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-mysql.yml b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-mysql.yml new file mode 100644 index 0000000000..cc307cc544 --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-mysql.yml @@ -0,0 +1,17 @@ +services: + mysql: + image: mysql:8.0 + ports: + - "3306:3306" + environment: + - MYSQL_ALLOW_EMPTY_PASSWORD=yes + - MYSQL_ROOT_PASSWORD= + - MYSQL_DATABASE=richie_${RICHIE_SITE:?} + command: --default-authentication-plugin=caching_sha2_password + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + interval: 1s + timeout: 2s + retries: 300 + volumes: + - ./data/db/${RICHIE_SITE:?}:/var/lib/mysql diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-postgresql.yml b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-postgresql.yml new file mode 100644 index 0000000000..59f788663c --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-postgresql.yml @@ -0,0 +1,14 @@ +services: + postgresql: + image: postgres:16.4 + ports: + - "5472:5432" + env_file: + - env.d/postgresql + healthcheck: + test: ["CMD-SHELL", "pg_isready"] + interval: 1s + timeout: 2s + retries: 300 + volumes: + - ./data/db/${RICHIE_SITE:?}:/var/lib/postgresql/data diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-sqlite.yml b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-sqlite.yml new file mode 100644 index 0000000000..ea25d004e1 --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose-sqlite.yml @@ -0,0 +1 @@ +# This file is empty on purpose! diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose.yml b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose.yml index 0ff8278427..1452c77498 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose.yml +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/docker-compose.yml @@ -1,24 +1,20 @@ +include: + - docker-compose-${ACTIVATED_DB}.yml services: - db: - image: postgres:16.4 - environment: - - POSTGRES_DB=richie_${RICHIE_SITE:?} - env_file: - - "env.d/development" - ports: - - "5440:5432" - volumes: - - ./data/db/${RICHIE_SITE:?}:/var/lib/postgresql/data - elasticsearch: - image: fundocker/openshift-elasticsearch:6.6.2 + image: {{cookiecutter.elasticsearch_image_name}} environment: - discovery.type=single-node env_file: - "env.d/development" + - "env.d/${ACTIVATED_DB}" ports: - "9220:9200" - + healthcheck: + test: ["CMD", "echo", "''", ">", "/dev/tcp/127.0.0.1/9200", "||", "exit", "1"] + interval: 1s + timeout: 2s + retries: 300 app-dev: build: context: . @@ -28,11 +24,13 @@ services: SITE: ${RICHIE_SITE:?} image: "${RICHIE_SITE:?}:development" environment: - - DB_NAME=richie_${RICHIE_SITE:?} - DJANGO_SETTINGS_MODULE=${RICHIE_SITE:?}.settings - DJANGO_CONFIGURATION=Development - RICHIE_ES_INDICES_PREFIX=richie_${RICHIE_SITE:?} - env_file: env.d/development + env_file: + - ".env" + - "env.d/development" + - "env.d/${ACTIVATED_DB}" networks: - default - lms_outside @@ -42,7 +40,7 @@ services: - "./sites/${RICHIE_SITE:?}/src/backend:/app" - "./data/media/${RICHIE_SITE:?}:/data/media" depends_on: - - "db" + - "${ACTIVATED_DB}" - "elasticsearch" - "redis-sentinel" user: ${DOCKER_USER:-1000} @@ -58,18 +56,20 @@ services: # unique and avoid collisions in parallel builds. image: "${RICHIE_SITE:?}:production" environment: - - DB_NAME=richie_${RICHIE_SITE:?} - DJANGO_SETTINGS_MODULE=${RICHIE_SITE:?}.settings - DJANGO_CONFIGURATION=ContinuousIntegration - RICHIE_ES_INDICES_PREFIX=richie_${RICHIE_SITE:?} - env_file: env.d/development + env_file: + - ".env" + - "env.d/development" + - "env.d/${ACTIVATED_DB}" networks: - default - lms_outside volumes: - ./data/media/${RICHIE_SITE:?}:/data/media depends_on: - - "db" + - "${ACTIVATED_DB}" - "elasticsearch" - "redis-sentinel" user: ${DOCKER_USER:-1000} @@ -80,8 +80,8 @@ services: target: nginx args: DOCKER_USER: ${DOCKER_USER:-1000} - NGINX_IMAGE_NAME: ${NGINX_IMAGE_NAME:-fundocker/openshift-nginx} - NGINX_IMAGE_TAG: ${NGINX_IMAGE_TAG:-1.13} + NGINX_IMAGE_NAME: ${NGINX_IMAGE_NAME:-{{cookiecutter.nginx_image_name}}} + NGINX_IMAGE_TAG: ${NGINX_IMAGE_TAG:-{{cookiecutter.nginx_image_tag}}} SITE: ${RICHIE_SITE:?} image: "${RICHIE_SITE:?}-nginx:production" ports: diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/development.dist b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/development.dist index eec91ee64c..bc49a091ce 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/development.dist +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/development.dist @@ -8,18 +8,6 @@ DJANGO_ALLOWED_HOSTS=* # Elastic search RICHIE_ES_HOST=elasticsearch -# PostgreSQL db container configuration -POSTGRES_DB=richie -POSTGRES_USER=fun -POSTGRES_PASSWORD=pass - -# App database configuration -DB_HOST=db -DB_NAME=richie -DB_USER=fun -DB_PASSWORD=pass -DB_PORT=5432 - # LMS Backend EDX_BACKEND=richie.apps.courses.lms.base.BaseLMSBackend EDX_BASE_URL=http://localhost:8073 diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/mysql b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/mysql new file mode 100644 index 0000000000..feb0adc658 --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/mysql @@ -0,0 +1,12 @@ +# Mysql db container configuration +MYSQL_ROOT_PASSWORD= +MYSQL_ALLOW_EMPTY_PASSWORD=yes +MYSQL_DATABASE=richie_${RICHIE_SITE} + +# App database configuration +DB_ENGINE=django.db.backends.mysql +DB_HOST=mysql +DB_NAME=richie_${RICHIE_SITE} +DB_USER=root +DB_PASSWORD= +DB_PORT=3306 diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/postgresql b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/postgresql new file mode 100644 index 0000000000..ec29f0855f --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/postgresql @@ -0,0 +1,12 @@ +# Postgresql db container configuration +POSTGRES_DB=richie_${RICHIE_SITE} +POSTGRES_USER=postgres +POSTGRES_PASSWORD=pass + +# App database configuration +DB_ENGINE=django.db.backends.postgresql_psycopg2 +DB_HOST=postgresql +DB_NAME=richie_${RICHIE_SITE} +DB_USER=postgres +DB_PASSWORD=pass +DB_PORT=5432 diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/sqlite b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/sqlite new file mode 100644 index 0000000000..5289f0a188 --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/env.d/sqlite @@ -0,0 +1,5 @@ +# App database configuration +DB_NAME=db.sqlite3 + +DB_HOST=sqlite +DB_ENGINE=django.db.backends.sqlite3 diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/cookiecutter.json b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/cookiecutter.json index 572c1afc8d..bc6a33fa00 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/cookiecutter.json +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/cookiecutter.json @@ -1,5 +1,9 @@ { "_organization": null, + "_org_dockerhub": null, + "_nginx_image_name": null, + "_nginx_image_tag": null, + "_elasticsearch_image_name": null, "site": null, "domain": null } diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/base.txt b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/base.txt index e880f716ee..e7f808df37 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/base.txt +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/base.txt @@ -5,6 +5,7 @@ django-storages==1.13.2 dockerflow==2022.8.0 gunicorn==22.0.0 psycopg2-binary==2.9.9 +mysqlclient==2.2.6 richie==2.33.0 unidecode==1.3.6 # required by django-check-seo sentry-sdk==2.11.0 diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/dev.txt b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/dev.txt index 76e276a9c6..916def5372 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/dev.txt +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/dev.txt @@ -1,7 +1,7 @@ bandit==1.7.5 black==24.3.0 -Faker==13.2.0 -factory-boy==3.2.1 +Faker==35.2.0 +factory-boy==3.3.3 flake8==6.0.0 flake8-pyproject==1.2.3 isort==5.12.0 diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/.gitkeep b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ar_SA/LC_MESSAGES/django.po b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ar_SA/LC_MESSAGES/django.po new file mode 100644 index 0000000000..3f4c9a5ffa --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ar_SA/LC_MESSAGES/django.po @@ -0,0 +1,470 @@ +msgid "" +msgstr "" +"Project-Id-Version: richie\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-31 17:41+0100\n" +"PO-Revision-Date: 2024-11-20 14:09\n" +"Last-Translator: \n" +"Language-Team: Arabic, Saudi Arabia\n" +"Language: ar_SA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" +"X-Crowdin-Project: richie\n" +"X-Crowdin-Project-ID: 308578\n" +"X-Crowdin-Language: ar-SA\n" +"X-Crowdin-File: backend.pot\n" +"X-Crowdin-File-ID: 32\n" + +#: newsite/settings.py:250 newsite/settings.py:260 +msgid "Dashboard" +msgstr "" + +#: newsite/settings.py:251 +msgid "{base_url:s}/dashboard/" +msgstr "" + +#: newsite/settings.py:261 +msgid "/dashboard/" +msgstr "" + +#: newsite/settings.py:264 +msgid "Teacher dashboard" +msgstr "" + +#: newsite/settings.py:265 +msgid "/dashboard/teacher" +msgstr "" + +#: newsite/settings.py:287 +msgid "Profile" +msgstr "" + +#: newsite/settings.py:288 +msgid "{base_url:s}/u/(username)" +msgstr "" + +#: newsite/settings.py:291 +msgid "Account" +msgstr "" + +#: newsite/settings.py:292 +msgid "{base_url:s}/account/settings" +msgstr "" + +#: newsite/settings.py:385 +msgid "Teaser" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "English" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "French" +msgstr "" + +msgid "Define an effort" +msgstr "تحديد المجهود" + +msgid "Pagination" +msgstr "ترقيم الصفحات" + +#, python-format +msgid "Currently reading last page %(page)s" +msgstr "حاليا قراءة الصفحة الأخيرة %(page)s" + +#, python-format +msgid "Currently reading page %(page)s" +msgstr "قراءة الصفحة %(page)s حاليا" + +#, python-format +msgid "Page %(page)s" +msgstr "الصفحة %(page)s" + +#, python-format +msgid "Previous page %(page)s" +msgstr "الصفحة السابقة %(page)s" + +#, python-format +msgid "Last page %(page)s" +msgstr "آخر صفحة %(page)s" + +#, python-format +msgid "Next page %(page)s" +msgstr "الصفحة التالية %(page)s" + +msgid "Facebook" +msgstr "فيسبوك" + +msgid "Twitter page" +msgstr "صفحة تويتر" + +msgid "Bad request" +msgstr "طلب غير صالح" + +msgid "Forbidden" +msgstr "ممنوع" + +msgid "You do not have the required permissions to access this resource." +msgstr "ليس لديك الصلاحيات المطلوبة للوصول إلى هذا المورد." + +msgid "Page not found" +msgstr "لم يتم العثور على الصفحة!" + +msgid "The requested resource does not exist." +msgstr "المورد المطلوب غير موجود." + +msgid "Program" +msgstr "البرنامج" + +msgid "New page" +msgstr "صفحة جديدة" + +msgid "New sub page" +msgstr "صفحة فرعية جديدة" + +msgid "Page title" +msgstr "عنوان الصفحة" + +msgid "Page slug" +msgstr "مسبار الصفحة" + +msgid "This slug is already in use" +msgstr "هذا السلسلة مستخدم مسبقاً" + +msgid "Code" +msgstr "كود" + +msgid "New course page" +msgstr "صفحة دورة جديدة" + +msgid "Create a new course page" +msgstr "إنشاء صفحة دورة جديدة" + +msgid "Unique reference for the organization." +msgstr "مرجع فريد للمنظمة." + +msgid "New organization page" +msgstr "صفحة منظمة جديدة" + +msgid "Create a new organization page" +msgstr "إنشاء صفحة منظمة جديدة" + +msgid "New category page" +msgstr "صفحة فئة جديدة" + +msgid "Create a new category page" +msgstr "إنشاء صفحة فئة جديدة" + +msgid "New blog post" +msgstr "مشاركة مدونة جديدة" + +msgid "Create a new blog post" +msgstr "إنشاء مشاركة مدونة جديدة" + +msgid "New person page" +msgstr "صفحة شخص جديد" + +msgid "Create a new person page" +msgstr "إنشاء صفحة شخص جديد" + +msgid "New program" +msgstr "برنامج جديد" + +msgid "Create a new program" +msgstr "إنشاء برنامج جديد" + +msgid "Admin" +msgstr "المسؤل" + +msgid "Inherit" +msgstr "وراثة" + +msgid "Default" +msgstr "الافتراضي" + +msgid "Mini" +msgstr "مصغر" + +msgid "Favorite" +msgstr "مفضلة" + +msgid "Badge" +msgstr "شارة" + +msgid "Tag" +msgstr "وسم" + +msgid "Small" +msgstr "صغير" + +msgid "Large" +msgstr "كبير" + +msgid "Card" +msgstr "بطاقة" + +msgid "Row" +msgstr "صف" + +msgid "minute" +msgstr "دقيقة" + +msgid "minutes" +msgstr "دقائق" + +msgid "hour" +msgstr "ساعة" + +msgid "hours" +msgstr "ساعات" + +msgid "day" +msgstr "يوم" + +msgid "days" +msgstr "أيام" + +msgid "categories" +msgstr "الفئات" + +msgid "enroll now" +msgstr "التسجيل الآن" + +msgid "code" +msgstr "كود" + +msgid "courses" +msgstr "الدورات" + +msgid "Manual" +msgstr "دليل" + +msgid "Synchronization to draft page" +msgstr "المزامنة إلى مسودة الصفحة" + +msgid "Synchronization to public page" +msgstr "المزامنة إلى الصفحة العامة" + +msgid "resource link" +msgstr "رابط المورد" + +msgid "course start" +msgstr "بدء الدورة التدريبية" + +msgid "course end" +msgstr "نهاية الدورة التدريبية" + +msgid "enrollment start" +msgstr "بدء التسجيل" + +msgid "enrollment end" +msgstr "نهاية التسجيل" + +msgid "The list of languages in which the course content is available." +msgstr "قائمة اللغات التي يتوفر بها محتوى الدورة." + +msgid "course run" +msgstr "تشغيل الدورة التدريبية" + +msgid "course runs" +msgstr "تشغيل الدورة التدريبية" + +msgid "title" +msgstr "العنوان" + +msgid "Course run translation" +msgstr "الدورة التدريبية تشغيل الترجمة" + +msgid "Course run translations" +msgstr "تشغيل الترجمات" + +msgid "logo" +msgstr "الشعار" + +msgid "url" +msgstr "رابط" + +msgid "name" +msgstr "اسم" + +msgid "content" +msgstr "المحتوى" + +msgid "licence" +msgstr "الترخيص" + +msgid "licences" +msgstr "التراخيص" + +msgid "Licence translation" +msgstr "ترجمة الترخيص" + +msgid "licence translations" +msgstr "ترجمات الترخيص" + +msgid "description" +msgstr "وصف" + +msgid "licence plugin" +msgstr "ملحق الترخيص" + +msgid "licence plugins" +msgstr "إضافات الترخيص" + +msgid "organization" +msgstr "المنظمة" + +msgid "organizations" +msgstr "المنظمات" + +msgid "person" +msgstr "شخص" + +msgid "persons" +msgstr "الأشخاص" + +msgid "Custom bio" +msgstr "بيو مخصص" + +msgid "program" +msgstr "البرنامج" + +msgid "programs" +msgstr "البرامج" + +msgid "role" +msgstr "دور" + +msgid "" +"A role describes all the permissions that should be granted to the user " +"group." +msgstr "الدور يصف جميع الأذونات التي يجب منحها لمجموعة المستخدمين." + +msgid "page" +msgstr "الصفحة" + +msgid "Page to which this role grants permissions." +msgstr "الصفحة التي يمنح لها هذا الدور الأذونات." + +msgid "Search" +msgstr "البحث" + +msgid "Cover" +msgstr "غلاف" + +msgid "License for the content created by course participants" +msgstr "رخصة للمحتوى الذي أنشأه المشاركون في الدورة" + +msgid "Categories" +msgstr "الفئات" + +msgid "Icon" +msgstr "أيقونة" + +msgid "Organizations" +msgstr "المنظمات" + +msgid "Banner" +msgstr "لافتة" + +msgid "Logo" +msgstr "الشعار" + +msgid "Description" +msgstr "وصف" + +msgid "Excerpt" +msgstr "مقتطف" + +msgid "Bio" +msgstr "بيو" + +msgid "Main Content" +msgstr "المحتوى الرئيسي" + +msgid "Author" +msgstr "المؤلف" + +msgid "Body" +msgstr "الجسم" + +msgid "Headline" +msgstr "عنوان رئيسي" + +msgid "Courses" +msgstr "الدورات" + +msgid "Full width" +msgstr "العرض الكامل" + +msgid "No categories yet." +msgstr "لا توجد فئات حتى الآن." + +msgid "Not published yet" +msgstr "لم تنشر بعد" + +msgid "No author yet" +msgstr "لا يوجد مؤلف بعد" + +msgid "No excerpt content" +msgstr "لا يوجد محتوى مقتطف" + +msgid "No body content" +msgstr "لا يوجد محتوى للجسم" + +msgid "No associated blogposts" +msgstr "لا توجد مدوّنات مرتبطة" + +msgid "Sub categories" +msgstr "التصنيفات الفرعية" + +msgid "Related courses" +msgstr "الدورات ذات الصلة" + +msgid "See all courses" +msgstr "مشاهدة جميع الدورات" + +msgid "Related organizations" +msgstr "المنظمات ذات الصلة" + +msgid "Related blogposts" +msgstr "مدوّنة ذات صلة" + +msgid "Related persons" +msgstr "الأشخاص ذوو الصلة" + +msgid "No categories" +msgstr "لا توجد فئات حتى الآن" + +msgid "Ref. " +msgstr "المرجع " + +msgid "No associated categories" +msgstr "لا توجد فئات مرتبطة" + +msgid "Duration:" +msgstr "المدة:" + +msgid "Effort:" +msgstr "جهد:" + +msgid "Pace:" +msgstr "السبيل:" + +msgctxt "course_detail__title" +msgid "Description" +msgstr "وصف" + +msgctxt "course_detail__title" +msgid "Organizations" +msgstr "المنظمات" + +msgid "Languages" +msgstr "اللغات" + +msgid "body" +msgstr "الجسم" diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/es_ES/LC_MESSAGES/django.po b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/es_ES/LC_MESSAGES/django.po new file mode 100644 index 0000000000..0352a0aa42 --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/es_ES/LC_MESSAGES/django.po @@ -0,0 +1,1428 @@ +msgid "" +msgstr "" +"Project-Id-Version: richie\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-31 17:41+0100\n" +"PO-Revision-Date: 2024-11-20 14:09\n" +"Last-Translator: \n" +"Language-Team: Spanish\n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: richie\n" +"X-Crowdin-Project-ID: 308578\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File: backend.pot\n" +"X-Crowdin-File-ID: 32\n" + +#: newsite/settings.py:250 newsite/settings.py:260 +msgid "Dashboard" +msgstr "" + +#: newsite/settings.py:251 +msgid "{base_url:s}/dashboard/" +msgstr "" + +#: newsite/settings.py:261 +msgid "/dashboard/" +msgstr "" + +#: newsite/settings.py:264 +msgid "Teacher dashboard" +msgstr "" + +#: newsite/settings.py:265 +msgid "/dashboard/teacher" +msgstr "" + +#: newsite/settings.py:287 +msgid "Profile" +msgstr "" + +#: newsite/settings.py:288 +msgid "{base_url:s}/u/(username)" +msgstr "" + +#: newsite/settings.py:291 +#, fuzzy +#| msgid "Accordion" +msgid "Account" +msgstr "Acordión" + +#: newsite/settings.py:292 +msgid "{base_url:s}/account/settings" +msgstr "" + +#: newsite/settings.py:385 +msgid "Teaser" +msgstr "Teaser" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "English" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "French" +msgstr "" + +msgid "Richie Plugins" +msgstr "Plugins de Richie" + +msgid "Define a duration as a number of time units" +msgstr "Definir una duración como un número de unidades de tiempo" + +#, python-format +msgid "%(value)s is not a valid choice for a time unit." +msgstr "%(value)s no es una opción válida para una unidad de tiempo." + +msgid "A composite duration should be a pair: number and time unit." +msgstr "Una duración compuesta debe ser un par: número y unidad de tiempo." + +msgid "A composite duration should be a round number of time units." +msgstr "" +"Una duración compuesta debe ser un número redondeado de unidades de " +"tiempo." + +msgid "A composite duration should be positive." +msgstr "Una duración compuesta debe ser positiva." + +msgid "Define an effort" +msgstr "Definir un esfuerzo" + +msgid "An effort should be a triplet: number, time unit and reference unit." +msgstr "" +"El esfuerzo debe ser una tripleta: número, unidad de tiempo y unidad de " +"referencia." + +msgid "An effort should be a round number of time units." +msgstr "Un esfuerzo debe ser un número redondo de unidades de tiempo." + +msgid "An effort should be positive." +msgstr "Un esfuerzo debería ser positivo." + +msgid "The effort time unit should be shorter than the reference unit." +msgstr "" +"La unidad de tiempo de esfuerzo debe ser más corta que la unidad de " +"referencia." + +msgid "{:s} and {:s}" +msgstr "{:s} y {:s}" + +msgid " and " +msgstr " y " + +#, python-format +msgid "You can only select up to %(limit_value)d choices." +msgstr "Sólo puede seleccionar hasta %(limit_value)d opciones." + +#, python-format +msgid "Multi select field (up to %(max_choices)s choices)" +msgstr "Campo de selección múltiple (hasta %(max_choices)s opciones)" + +#, python-format +msgid "Value %(value)s is not a valid choice." +msgid_plural "Values %(value)s are not valid choices." +msgstr[0] "El valor %(value)s no es una opción válida." +msgstr[1] "Los valores %(value)s no son opciones válidas." + +msgid "" +"Storing {:d} choices could require storing a CharField of up to {:d} " +"characters. Please reduce 'max_choices' or increase 'max_length'." +msgstr "" +"Almacenar {:d} opciones podría requerir almacenar un CharField de hasta {:" +"d} caracteres. Por favor, reduzca 'max_choices' o incremente 'max_length'." + +msgid "Your browser doesn't support this video format." +msgstr "Su navegador no admite este formato de vídeo." + +msgid "You are here:" +msgstr "Usted está aquí:" + +msgid "Skip to main content" +msgstr "Saltar al contenido principal" + +msgid "Go to homepage" +msgstr "Ir a la página de inicio" + +msgid "Contact us" +msgstr "Contáctenos" + +msgid "Life-changing learning!" +msgstr "¡Aprendizaje que cambia la vida!" + +msgid "Learn more" +msgstr "Saber más" + +msgid "Powered by" +msgstr "Impulsado por" + +msgid "This page has no child objects" +msgstr "Esta página no tiene objetos secundarios" + +msgid "Back to home" +msgstr "Volver al inicio" + +msgid "Pagination" +msgstr "Paginación" + +#, python-format +msgid "Currently reading last page %(page)s" +msgstr "Leyendo la última página %(page)s" + +#, python-format +msgid "Currently reading page %(page)s" +msgstr "Actualmente leyendo la página %(page)s" + +#, python-format +msgid "Page %(page)s" +msgstr "Página %(page)s" + +#, python-format +msgid "Previous page %(page)s" +msgstr "Página anterior %(page)s" + +#, python-format +msgid "Last page %(page)s" +msgstr "Última página %(page)s" + +#, python-format +msgid "Next page %(page)s" +msgstr "Página siguiente %(page)s" + +#, python-format +msgid "Richie news: %(title)s" +msgstr "Noticias de Richie: %(title)s" + +#, python-format +msgid "Richie news: %(title)s %(url)s" +msgstr "Noticias de Richie: %(title)s %(url)s" + +msgid "Share on Facebook" +msgstr "Compartir en Facebook" + +msgid "Share on Twitter" +msgstr "Compartir en Twitter" + +msgid "Share on Linkedin" +msgstr "Compartir en Linkedin" + +msgid "Share by Email" +msgstr "Compartir por Email" + +msgid "Follow a course online with Richie" +msgstr "Sigua un curso en línea con Richie" + +#, python-format +msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s" +msgstr "Acabo de inscribirme al curso \"%(title)s\" en Richie: %(url)s" + +msgid "Facebook" +msgstr "Facebook" + +msgid "Twitter page" +msgstr "Página de Twitter" + +msgid "Bad request" +msgstr "Solicitud errónea" + +msgid "" +"Your query seems to be malformed. Please check your data and try again." +msgstr "" +"Su consulta parece ser incorrecta. Por favor, compruebe sus datos e " +"inténtelo de nuevo." + +msgid "Forbidden" +msgstr "Prohibido" + +msgid "You do not have the required permissions to access this resource." +msgstr "No tiene los permisos necesarios para acceder a este contenido." + +msgid "Page not found" +msgstr "No se pudo encontrar la página" + +msgid "The requested resource does not exist." +msgstr "El recurso solicitado no existe." + +msgid "Server bad request" +msgstr "Solicitud errónea del servidor" + +msgid "Something went wrong. Please try again later." +msgstr "Algo ha fallado. Por favor, inténtelo de nuevo más tarde." + +msgid "Course could not be found." +msgstr "No se pudo encontrar el curso." + +msgid "See user group" +msgstr "Ver grupo de usuarios" + +msgid "See filer folder" +msgstr "Ver carpeta de archivos" + +msgid "Organization" +msgstr "Organizaciones" + +msgid "Organization by Category" +msgstr "Organización por categoría" + +msgid "Category" +msgstr "Categoría" + +msgid "Course" +msgstr "Curso" + +msgid "Person" +msgstr "Persona" + +msgid "Licence" +msgstr "Licencia" + +msgid "Post" +msgstr "Publicar" + +msgid "Program" +msgstr "Programa" + +msgid "{!s} settings" +msgstr "{!s} configuración" + +msgid "Snapshot this page..." +msgstr "Captura instantánea de esta página..." + +msgid "" +"This will place a copy of this page as its child and move all its " +"courseruns as children of its new copy." +msgstr "" +"Esto colocará una copia de esta página como su hijo y moverá a todos sus " +"sesiones de curso como hijos de su nueva copia." + +msgid "New page" +msgstr "Nueva página" + +msgid "Create a new page next to the current page." +msgstr "Crear una nueva página junto a la página actual." + +msgid "New sub page" +msgstr "Nueva subpágina" + +msgid "Create a page below the current page." +msgstr "Crear una página debajo de la página actual." + +msgid "Page title" +msgstr "Título de página" + +msgid "Title of the page in current language" +msgstr "Título de la página en el idioma actual" + +msgid "Page slug" +msgstr "Slug de página" + +msgid "Slug of the page in current language" +msgstr "Slug de la página en el idioma actual" + +msgid "" +"This slug is too long. The length of the path built by prepending the " +"slug of the parent page would be {:d} characters long and it should be " +"less than 255" +msgstr "" +"Este slug es demasiado largo. La longitud de la ruta construida que " +"antecede el slug de la página padre sería {:d} caracteres de largo y " +"debería ser menor de 255" + +msgid "This slug is already in use" +msgstr "Este slug ya ha sido utilizado" + +msgid "" +"You must first create a parent page and set its `reverse_id` to `{:s}`." +msgstr "" +"Primero debe crear una página padre y establecer su `reverse_id` a `{:s}`." + +msgid "Code" +msgstr "Código" + +msgid "Unique reference for the course." +msgstr "Referencia única para el curso." + +msgid "New course page" +msgstr "Nueva página de curso" + +msgid "Create a new course page" +msgstr "Crear una nueva página de curso" + +msgid "Unique reference for the organization." +msgstr "Referencia única para la organización." + +msgid "New organization page" +msgstr "Nueva página de organización" + +msgid "Create a new organization page" +msgstr "Crear una nueva página de organización" + +msgid "New category page" +msgstr "Nueva página de categoría" + +msgid "Create a new category page" +msgstr "Crear una nueva página de categoría" + +msgid "New blog post" +msgstr "Nueva entrada de blog" + +msgid "Create a new blog post" +msgstr "Crear una nueva entrada de blog" + +msgid "New person page" +msgstr "Nueva página persona" + +msgid "Create a new person page" +msgstr "Crear una nueva página persona" + +msgid "New program" +msgstr "Nuevo programa" + +msgid "Create a new program" +msgstr "Crear un nuevo programa" + +msgid "Admin" +msgstr "Admin" + +msgid "Inherit" +msgstr "Heredar" + +msgid "Default" +msgstr "Por defecto" + +msgid "Mini" +msgstr "Mini" + +msgid "Favorite" +msgstr "Favorito" + +msgid "Badge" +msgstr "Badge" + +msgid "Tag" +msgstr "Etiqueta" + +msgid "Small" +msgstr "Pequeño" + +msgid "Large" +msgstr "Grande" + +msgid "Card" +msgstr "Tarjeta" + +msgid "Row" +msgstr "Fila" + +msgid "minute" +msgstr "minuto" + +msgid "minutes" +msgstr "minutos" + +msgid "hour" +msgstr "hora" + +msgid "hours" +msgstr "horas" + +msgid "day" +msgstr "día" + +msgid "days" +msgstr "dias" + +msgid "week" +msgstr "semana" + +msgid "weeks" +msgstr "semanas" + +msgid "month" +msgstr "mes" + +msgid "months" +msgstr "meses" + +msgid "Run {:d}" +msgstr "Ejecutar {:d}" + +msgid "You can't snapshot a snapshot." +msgstr "No puedes hacer una captura instantánea de una captura instantánea." + +msgid "You don't have sufficient permissions to snapshot this page." +msgstr "" +"No tiene permisos suficientes para hacer una captura instantánea en esta " +"página." + +msgid "Archived on {now:%Y-%m-%d %H:%M:%S}" +msgstr "Archivado el {ahora:%Y-%m-%d %H:%M:%S}" + +msgid "{title:s} ({version!s})" +msgstr "{title:s} ({version!s})" + +msgid "blog post" +msgstr "entrada de blog" + +msgid "blog posts" +msgstr "entradas de blog" + +msgid "variant" +msgstr "variante" + +msgid "Optional glimpse variant for a custom look." +msgstr "Variante vista previa optional para un aspecto personalizado." + +msgid "blog post plugin" +msgstr "plugin de entrada de blog" + +msgid "blog post plugins" +msgstr "plugins de entrada de blog" + +msgid "category" +msgstr "categoría" + +msgid "categories" +msgstr "categorías" + +msgid "category plugin" +msgstr "plugin de categoría" + +msgid "category plugins" +msgstr "plugins de categoría" + +msgid "enroll now" +msgstr "inscribirse ahora" + +msgid "study now" +msgstr "estudiar ahora" + +msgid "starting on" +msgstr "comenzando el" + +msgid "closing on" +msgstr "cerrando en" + +msgid "enrollment closed" +msgstr "fin de inscripción" + +msgid "on-going" +msgstr "en curso" + +msgid "archived" +msgstr "archivado" + +msgid "to be scheduled" +msgstr "por ser programado" + +msgid "forever open" +msgstr "siempre abierto" + +msgid "code" +msgstr "código" + +msgid "The course time range." +msgstr "El intervalo de tiempo del curso." + +msgid "Total amount of time to complete this course." +msgstr "Cantidad total de tiempo para completar este curso." + +msgid "is listed" +msgstr "está listado" + +msgid "Tick if you want the course to be visible on the search page." +msgstr "Marque si desea que el curso sea visible en la página de búsqueda." + +msgid "is self paced" +msgstr "es a su propio ritmo" + +msgid "Tick if the course pace is self paced." +msgstr "Marque si el ritmo del curso es a ritmo propio." + +msgid "course" +msgstr "curso" + +msgid "courses" +msgstr "cursos" + +msgid "Self paced" +msgstr "A ritmo propio" + +msgid "~{pace:d} {effort_unit!s}/{duration_unit!s}" +msgstr "~{pace:d} {esfuerzo_unidad!s}/{duración_unidad!s}" + +msgid "~{pace_hours:d}h{pace_minutes:d}/{duration_unit!s}" +msgstr "~{pace_hours:d}h{pace_minutes:d}/{duration_unit!s}" + +msgid "Manual" +msgstr "Manual" + +msgid "Synchronization to draft page" +msgstr "Sincronización a página de borrador" + +msgid "Synchronization to public page" +msgstr "Sincronización a página pública" + +msgid "" +"course_and_search - show on the course page and include in search results" +msgstr "" +"curse_and_search - mostrar en la página del curso e incluir en los " +"resultados de búsqueda" + +msgid "course_only - show on the course page and hide from search results" +msgstr "" +"curso solo - mostrar en la página del curso y ocultar de los resultados " +"de la búsqueda" + +msgid "hidden - hide on the course page and from search results" +msgstr "" +"oculto - ocultar en la página del curso y de los resultados de búsqueda" + +msgid "resource link" +msgstr "enlace de recursos" + +msgid "course start" +msgstr "inicio del curso" + +msgid "course end" +msgstr "fin del curso" + +msgid "enrollment start" +msgstr "inicio de inscripción" + +msgid "enrollment end" +msgstr "fin de inscripción" + +msgid "The list of languages in which the course content is available." +msgstr "Lista de idiomas en los que el contenido del curso está disponible." + +msgid "enrollment count" +msgstr "número de inscripciones" + +msgid "The number of enrolled students" +msgstr "El número de estudiantes inscritos" + +msgid "catalog visibility" +msgstr "visibilidad del catálogo" + +msgid "course run" +msgstr "sesión de curso" + +msgid "course runs" +msgstr "sesión de curso" + +msgid "title" +msgstr "título" + +msgid "Course run translation" +msgstr "Traducción de la sesión de curso" + +msgid "Course run translations" +msgstr "Traducciones de la sesión de curso" + +msgid "Empty title" +msgstr "Sin título" + +msgid "course plugin" +msgstr "plugin de curso" + +msgid "course plugins" +msgstr "plugins de curso" + +msgid "logo" +msgstr "logo" + +msgid "url" +msgstr "url" + +msgid "name" +msgstr "nombre" + +msgid "content" +msgstr "contenido" + +msgid "licence" +msgstr "licencia" + +msgid "licences" +msgstr "licencias" + +msgid "Licence translation" +msgstr "Traducción de la licencia" + +msgid "licence translations" +msgstr "traducciones de licencias" + +msgid "description" +msgstr "descripción" + +msgid "licence plugin" +msgstr "plugin de licencia" + +msgid "licence plugins" +msgstr "plugins de licencia" + +msgid "organization" +msgstr "organización" + +msgid "organizations" +msgstr "organizaciones" + +msgid "organization plugin" +msgstr "plugin de la organización" + +msgid "organization plugins" +msgstr "plugins de organización" + +msgid "organizations by category plugin" +msgstr "organizaciones por plugin de categoría" + +msgid "organizations by category plugins" +msgstr "organizaciones por plugins de categoría" + +msgid "person" +msgstr "persona" + +msgid "persons" +msgstr "personas" + +msgid "Custom bio" +msgstr "Personalizar biografía" + +msgid "" +"Optional: provide a custom bio (if you leave it empty, it will display " +"the person's bio)." +msgstr "" +"Opcional: proporcionar una biografía personalizada (si la deja vacía, se " +"mostrará la biografía de la persona)." + +msgid "person plugin" +msgstr "plugin de persona" + +msgid "person plugins" +msgstr "plugins de persona" + +msgid "program" +msgstr "programa" + +msgid "programs" +msgstr "programas" + +msgid "program plugin" +msgstr "plugin del programa" + +msgid "program plugins" +msgstr "plugins de programa" + +msgid "role" +msgstr "rol" + +msgid "" +"A role describes all the permissions that should be granted to the user " +"group." +msgstr "" +"Un rol describe todos los permisos que deben concederse al grupo de " +"usuarios." + +msgid "page" +msgstr "página" + +msgid "Page to which this role grants permissions." +msgstr "Página a la que este rol concede permisos." + +msgid "group" +msgstr "grupo" + +msgid "User group that this role controls." +msgstr "Grupo de usuarios que este rol controla." + +msgid "filer folder" +msgstr "carpeta de archivos" + +msgid "Filer folder that this role controls." +msgstr "Carpeta del archivador que este rol controla." + +msgid "page role" +msgstr "rol de página" + +msgid "page roles" +msgstr "roles de página" + +msgid "{:s} | {:s}" +msgstr "{:s} | {:s}" + +msgid "Course page" +msgstr "Página de curso" + +msgid "Organization list" +msgstr "Lista de organizaciones" + +msgid "Organization page" +msgstr "Página organización" + +msgid "Category list" +msgstr "Lista de categorías" + +msgid "Category page" +msgstr "Página de categoría" + +msgid "Blog post list" +msgstr "Lista de entradas de blog" + +msgid "Blog post page" +msgstr "Página de entrada de blog" + +msgid "Person page" +msgstr "Página persona" + +msgid "Person list" +msgstr "Lista de personas" + +msgid "Program page" +msgstr "Página de programa" + +msgid "Program list" +msgstr "Lista de programas" + +msgid "Search" +msgstr "Buscar" + +msgid "List of child pages" +msgstr "Lista de páginas hijas" + +msgid "Homepage" +msgstr "Página principal" + +msgid "Single column" +msgstr "Columna única" + +msgid "Three columns: (33% | 33% | 33%)" +msgstr "Tres columnas: (33% | 33% | 33%)" + +msgid "Two columns: (50% | 50%)" +msgstr "Dos columnas: (50% | 50%)" + +msgid "Two columns: (25% | 75%)" +msgstr "Dos columnas: (25% | 75%)" + +msgid "Two columns: (75% | 25%)" +msgstr "Dos columnas: (75% | 25%)" + +msgid "Footer" +msgstr "Pie de página" + +msgid "Static headline" +msgstr "Encabezado estático" + +msgid "Main content" +msgstr "Contenido principal" + +msgid "Secondary content" +msgstr "Contenido secundario" + +msgid "Third content" +msgstr "Tercer contenido" + +msgid "Cover" +msgstr "Portada" + +msgid "Catch phrase" +msgstr "Eslogan" + +msgid "About the course" +msgstr "Acerca del curso" + +msgid "What you will learn" +msgstr "Lo que aprenderás" + +msgid "Format" +msgstr "Formato" + +msgid "Prerequisites" +msgstr "Prerrequisitos" + +msgid "Team" +msgstr "Equipo" + +msgid "Plan" +msgstr "Plan" + +msgid "Complementary information" +msgstr "Información complementaria" + +msgid "License for the course content" +msgstr "Licencia para el contenido del curso" + +msgid "License for the content created by course participants" +msgstr "Licencia para el contenido creado por los participantes del curso" + +msgid "Categories" +msgstr "Categorías" + +msgid "Icon" +msgstr "Icono" + +msgid "Organizations" +msgstr "Organizaciones" + +msgid "Assessment and Certification" +msgstr "Evaluación y certificación" + +msgid "Banner" +msgstr "Banner" + +msgid "Logo" +msgstr "Logo" + +msgid "Description" +msgstr "Descripción" + +msgid "Excerpt" +msgstr "Extracto" + +msgid "Portrait" +msgstr "Retrato" + +msgid "Bio" +msgstr "Biografía" + +msgid "Main Content" +msgstr "Contenido principal" + +msgid "Author" +msgstr "Autor" + +msgid "Body" +msgstr "Cuerpo" + +msgid "Headline" +msgstr "Encabezado" + +msgid "Courses" +msgstr "Cursos" + +msgid "Button caesura" +msgstr "Botón cesura" + +msgid "Full width" +msgstr "Anchura total" + +msgid "No categories yet." +msgstr "No hay categorías aún." + +msgid "Not published yet" +msgstr "Sin publicar" + +msgid "No author yet" +msgstr "No hay autor aún" + +msgid "No excerpt content" +msgstr "No hay extracto de contenido" + +msgid "No body content" +msgstr "No hay contenido en el cuerpo" + +msgid "Related posts" +msgstr "Entradas relacionadas" + +msgid "No associated blogposts" +msgstr "No hay entradas de blogs asociadas" + +msgid "Sub categories" +msgstr "Subcategorías" + +msgid "Related courses" +msgstr "Cursos relacionados" + +msgid "Courses pagination" +msgstr "Paginación de cursos" + +msgid "See all courses" +msgstr "Ver todos los cursos" + +msgid "Related organizations" +msgstr "Organizaciones relacionadas" + +msgid "Related organizations pagination" +msgstr "Paginación de organizaciones relacionadas" + +msgid "Related blogposts" +msgstr "Entradas de blog relacionadas" + +msgid "Related blogposts pagination" +msgstr "Paginación de entradas de blog relacionadas" + +msgid "Related persons" +msgstr "Personas relacionadas" + +msgid "Related persons pagination" +msgstr "Paginación de personas relacionadas" + +msgid "No categories" +msgstr "Sin categorías" + +msgid "Ref. " +msgstr "Ref. " + +msgid "No associated categories" +msgstr "No hay categorías asociadas" + +msgid "Duration:" +msgstr "Duración:" + +msgid "Effort:" +msgstr "Esfuerzo:" + +msgid "Pace:" +msgstr "Ritmo:" + +msgid "" +"Add a teaser video or add a cover image below and it will be used as " +"teaser image as well." +msgstr "" +"Añada un video de teaser o añada una imagen de portada a continuación y " +"se utilizará como imagen de teaser." + +msgid "course cover image" +msgstr "imagen de portada del curso" + +#, python-format +msgid "" +"\n" +" Archived on %(creation_date)s\n" +" " +msgstr "" +"\n" +" Archivado el %(creation_date)s\n" +" " + +msgid "Go to current version" +msgstr "Ir a la sesión actual" + +msgid "Glimpse cover" +msgstr "Vistazo de la cobertura" + +msgid "Add an image for course cover on its glimpse." +msgstr "Agrega una imagen para la portada del curso en la vista previa." + +msgctxt "course_detail__title" +msgid "What you will learn" +msgstr "Lo que aprenderás" + +msgid "At the end of this course, you will be able to:" +msgstr "Al final de este curso, podrá:" + +msgctxt "course_detail__title" +msgid "Description" +msgstr "Descripción" + +msgctxt "course_detail__title" +msgid "Format" +msgstr "Formato" + +msgid "How is the course structured?" +msgstr "¿Cómo está estructurado el curso?" + +msgctxt "course_detail__title" +msgid "Prerequisites" +msgstr "Prerrequisitos" + +msgid "What are the prerequisites to follow this course?" +msgstr "¿Cuáles son los perrequisitos para seguir este curso?" + +msgctxt "course_detail__title" +msgid "Assessment and certification" +msgstr "Evaluación y certificación" + +msgid "How is progress evaluated and/or certified?" +msgstr "¿Cómo se evalúa y/o certifica el progreso?" + +msgctxt "course_detail__title" +msgid "Course plan" +msgstr "Plan del curso" + +msgid "Enter here the detailed course plan." +msgstr "Ingrese aquí el plan detallado del curso." + +msgctxt "course_detail__title" +msgid "Course team" +msgstr "Equipo del curso" + +msgid "Who are the teachers in the course team?" +msgstr "¿Quiénes son los profesores del equipo del curso?" + +msgctxt "course_detail__title" +msgid "Organizations" +msgstr "Organizaciones" + +msgid "What are the organizations publishing this course?" +msgstr "¿Cuáles son las organizaciones que publican este curso?" + +msgctxt "course_detail__title" +msgid "License" +msgstr "Licencia" + +msgid "What is the license for the course content?" +msgstr "¿Cuál es la licencia para el contenido del curso?" + +msgid "What is the license for the content created by course participants?" +msgstr "" +"¿Cuál es la licencia para el contenido creado por los participantes del " +"curso?" + +msgid "Course team" +msgstr "Equipo del curso" + +msgid "License" +msgstr "Licencia" + +#, python-format +msgid "" +"\n" +" A %(model)s object is missing on this %(model)s page. Please " +"select another page template.\n" +"
\n" +" If what you need is a %(model)s page, you need to create it via " +"the wizard and choose \"New %(model)s page\".\n" +" " +msgstr "" +"\n" +" Falta un objeto %(model)s en esta página %(model)s. Por favor, " +"seleccione otra plantilla de página.\n" +"
\n" +" Si lo que necesita es una página %(model)s, necesita crearlo a " +"través del asistente y seleccione \"Nueva página %(model)s\".\n" +" " + +msgid "Main organization" +msgstr "Organización principal" + +msgid "Related courses pagination" +msgstr "Paginación de cursos relacionados" + +msgid "No organization yet" +msgstr "Aún no hay organización" + +msgid "Enter your bio here..." +msgstr "Introduzca su biografía aquí..." + +#, python-format +msgid "%(title)s avatar" +msgstr "%(title)s avatar" + +msgid "No associated organizations" +msgstr "No hay organizaciones asociadas" + +msgid "Blogposts" +msgstr "Artículos de blog" + +msgid "Blogposts pagination" +msgstr "Paginación de entradas de blog" + +msgid "No persons" +msgstr "No hay personas" + +msgid "program cover image" +msgstr "imagen de portada del programa" + +msgid "No associated programs" +msgstr "No hay programas asociados" + +#, python-brace-format +msgid "Run {i:d}" +msgstr "Ejecutar {i:d}" + +msgid "Regenerate search index..." +msgstr "Regenerar índice de búsqueda..." + +msgid "New courses" +msgstr "Nuevos cursos" + +msgid "First session" +msgstr "Primera sesión" + +msgid "Availability" +msgstr "Disponibilidad" + +msgid "Languages" +msgstr "Idiomas" + +msgid "Subjects" +msgstr "Temas" + +msgid "Levels" +msgstr "Niveles" + +msgid "Persons" +msgstr "Personas" + +msgid "Open for enrollment" +msgstr "Inscripciones abiertas" + +msgid "Coming soon" +msgstr "Próximamente" + +msgid "On-going" +msgstr "En curso" + +msgid "Archived" +msgstr "Archivado" + +msgid "Sort by configuration" +msgstr "Ordenar por configuración" + +msgid "Sort by facet count" +msgstr "Ordenar por número de facetas" + +msgid "Sort alphabetically" +msgstr "Ordenar alfabéticamente" + +msgid "You are not allowed to manage the search index." +msgstr "No está autorizado para administrar el índice de búsqueda." + +msgid "The search index was successfully bootstrapped" +msgstr "El índice de búsqueda fue impulsado con éxito" + +msgid "Glimpse" +msgstr "Vista previa" + +msgid "Link settings" +msgstr "Configuración de enlace" + +msgid "Square card" +msgstr "Tarjeta cuadrada" + +msgid "Quote" +msgstr "Citación" + +msgid "Half row" +msgstr "Media fila" + +msgid "Full row" +msgstr "Fila completa" + +msgid "Variant" +msgstr "Variante" + +msgid "Form factor variant" +msgstr "Variante del factor de forma" + +msgid "image" +msgstr "imagen" + +msgid "Content" +msgstr "Contenido" + +msgid "External URL" +msgstr "URL externa" + +msgid "Make the glimpse as a link with an external URL." +msgstr "Configurar la vista previa como un enlace con una URL externa." + +msgid "Internal URL" +msgstr "URL interna" + +msgid "Make the glimpse as a link with an internal (page) URL." +msgstr "" +"Configurar la vista previa como un enlace con una URL interna (página)." + +msgid "HTML Sitemap" +msgstr "Mapa del sitio HTML" + +msgid "" +"Press save to create a site map. You will then be able to add a child " +"plugin for each subtree in your sitemap." +msgstr "" +"Haga clic en guardar para crear un mapa del sitio. Luego podrá añadir un " +"plugin hijo para cada subárbol en su mapa del sitio." + +msgid "HTML sitemap page" +msgstr "Página del mapa del sitio HTML" + +msgid "root page" +msgstr "página raíz" + +msgid "" +"This page will be at the root of your sitemap (or its children if the " +"\"include root page\" flag is unticked)." +msgstr "" +"Esta página estará en la raíz del mapa del sitio (o sus hijos si la " +"bandera \"incluir página raíz\" está desmarcada)." + +msgid "max depth" +msgstr "profundidad máxima" + +msgid "" +"Limit the level of nesting that your sitemap will contain below this " +"page. An empty field or 0 equals to no limit." +msgstr "" +"Limite el nivel de anidación que su mapa del sitio contendrá debajo de " +"esta página. Un campo vacío o 0 es igual a ningún límite." + +msgid "in navigation" +msgstr "en navegación" + +msgid "" +"Tick to exclude from sitemap the pages that are excluded from navigation." +msgstr "" +"Marque para excluir del mapa del sitio las páginas que están excluidas de " +"la navegación." + +msgid "include root page" +msgstr "incluir página raíz" + +msgid "" +"Tick to include the root page and its descendants. Untick to include only " +"its descendants." +msgstr "" +"Marque para incluir la página raíz y sus descendientes. Desmarque para " +"incluir sólo sus descendientes." + +msgid "HTML Sitemaps" +msgstr "Mapas de sitio HTML" + +msgid "Sitemap" +msgstr "Mapa del sitio" + +msgid "Large Banner" +msgstr "Gran banner" + +msgid "Medias" +msgstr "Medias" + +msgid "Hero introduction" +msgstr "Introducción" + +msgid "background image" +msgstr "imagen de fondo" + +msgid "Template" +msgstr "Plantilla" + +msgid "Choose template to render plugin." +msgstr "Elija la plantilla para proveer el plugin." + +msgid "Explore our catalog" +msgstr "Explore nuestro catálogo" + +msgid "Search in our courses" +msgstr "Buscar en nuestros cursos" + +msgid "LTI consumer" +msgstr "Consumidor LTI" + +msgid "Custom provider configuration" +msgstr "Configuración de proveedor personalizado" + +msgid "shared secret" +msgstr "secreto compartido" + +msgid "" +"The url is not valid for this provider. It should be of the form \"{:s}\"." +msgstr "" +"La url no es válida para este proveedor. Debería comenzar con \"{:s}\"." + +msgid "" +"The url is not valid for this provider. It should start with \"{:s}\"." +msgstr "" +"La url no es válida para este proveedor. Debería comenzar con \"{:s}\"." + +msgid "Please choose a predefined provider, or fill fields below" +msgstr "" +"Por favor, elija un proveedor predefinido, o rellene los campos a " +"continuación" + +msgid "Please choose a predefined provider above, or fill this field" +msgstr "" +"Por favor, elija un proveedor predefinido arriba, o rellene este campo" + +msgid "Please fill this field" +msgstr "Por favor, rellene este campo" + +msgid "LTI url" +msgstr "url LTI" + +msgid "" +"For a predefined provider, leave this field empty for uploading new " +"content." +msgstr "" +"Para un proveedor predefinido, deje este campo vacío para cargar nuevo " +"contenido." + +msgid "Predefined LTI provider" +msgstr "Proveedor de LTI predefinido" + +msgid "Please choose a predefined provider or fill fields below." +msgstr "" +"Por favor, elija un proveedor predefinido, o rellene los campos a " +"continuación." + +msgid "Nested item" +msgstr "Artículo anidado" + +msgid "List" +msgstr "Lista" + +msgid "Plain text" +msgstr "Texto simple" + +msgid "plain text" +msgstr "texto plano" + +msgid "Section" +msgstr "Sección" + +msgid "Primary scheme" +msgstr "Esquema primario" + +msgid "Secondary scheme" +msgstr "Esquema secundario" + +msgid "Tertiary scheme" +msgstr "Esquema terciario" + +msgid "Quaternary scheme" +msgstr "Esquema cuaternario" + +msgid "Quinary scheme" +msgstr "Esquema Quinario" + +msgid "Senary scheme" +msgstr "Esquema senario" + +msgid "Septenary scheme" +msgstr "Esquema septenario" + +msgid "Item tiles" +msgstr "Mosaicos de objetos" + +msgid "Optional template for custom look." +msgstr "Plantilla opcional para aspecto personalizado." + +msgid "Attributes" +msgstr "Atributos" + +msgid "Image" +msgstr "Imagen" + +msgid "Simple text" +msgstr "Texto simple" + +msgid "body" +msgstr "cuerpo" + +#, python-format +msgid "" +"Ensure this text has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this text has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Asegúrese de que este texto tiene como máximo %(limit_value)d caracter " +"(tiene %(show_value)d)." +msgstr[1] "" +"Asegúrese de que este texto tiene como máximo %(limit_value)d caracteres " +"(tiene %(show_value)d)." diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/fr_CA/LC_MESSAGES/django.po b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/fr_CA/LC_MESSAGES/django.po new file mode 100644 index 0000000000..36b752b495 --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/fr_CA/LC_MESSAGES/django.po @@ -0,0 +1,1592 @@ +msgid "" +msgstr "" +"Project-Id-Version: richie\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-31 17:41+0100\n" +"PO-Revision-Date: 2024-11-20 14:09\n" +"Last-Translator: \n" +"Language-Team: French, Canada\n" +"Language: fr_CA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: richie\n" +"X-Crowdin-Project-ID: 308578\n" +"X-Crowdin-Language: fr-CA\n" +"X-Crowdin-File: backend.pot\n" +"X-Crowdin-File-ID: 32\n" + +#: newsite/settings.py:250 newsite/settings.py:260 +#, fuzzy +#| msgid "dashboard" +msgid "Dashboard" +msgstr "tableau de bord" + +#: newsite/settings.py:251 +msgid "{base_url:s}/dashboard/" +msgstr "" + +#: newsite/settings.py:261 +#, fuzzy +#| msgid "dashboard" +msgid "/dashboard/" +msgstr "tableau de bord" + +#: newsite/settings.py:264 +#, fuzzy +#| msgid "dashboard" +msgid "Teacher dashboard" +msgstr "tableau de bord" + +#: newsite/settings.py:265 +#, fuzzy +#| msgid "dashboard" +msgid "/dashboard/teacher" +msgstr "tableau de bord" + +#: newsite/settings.py:287 +msgid "Profile" +msgstr "" + +#: newsite/settings.py:288 +msgid "{base_url:s}/u/(username)" +msgstr "" + +#: newsite/settings.py:291 +#, fuzzy +#| msgid "Accordion" +msgid "Account" +msgstr "Accordéon" + +#: newsite/settings.py:292 +msgid "{base_url:s}/account/settings" +msgstr "" + +#: newsite/settings.py:385 +msgid "Teaser" +msgstr "Accroche" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "English" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "French" +msgstr "" + +msgid "Richie Plugins" +msgstr "Plugins Richie" + +msgid "Define a duration as a number of time units" +msgstr "Définir une durée avec un nombre d'unités de temps" + +#, python-format +msgid "%(value)s is not a valid choice for a time unit." +msgstr "%(value)s n'est pas un choix valide d'unité de temps." + +msgid "A composite duration should be a pair: number and time unit." +msgstr "Une durée composite doit être une paire : nombre / unité de temps." + +msgid "A composite duration should be a round number of time units." +msgstr "Une durée composite doit être un nombre entier d'unités de temps." + +msgid "A composite duration should be positive." +msgstr "Une durée composite doit être positive." + +msgid "Define an effort" +msgstr "Définir un effort" + +msgid "An effort should be a triplet: number, time unit and reference unit." +msgstr "" +"Un effort doit être un triplet : numéro / unité de temps / unité de " +"référence." + +msgid "An effort should be a round number of time units." +msgstr "Un effort devrait être un nombre entier d'unités de temps." + +msgid "An effort should be positive." +msgstr "Un effort doit être positif." + +msgid "The effort time unit should be shorter than the reference unit." +msgstr "" +"L'unité de temps d'effort doit être plus courte que l'unité de temps de " +"référence." + +msgid "{:s} and {:s}" +msgstr "{:s} et {:s}" + +msgid " and " +msgstr " et " + +#, python-format +msgid "You can only select up to %(limit_value)d choices." +msgstr "Vous pouvez sélectionner jusqu'à %(limit_value)d choix." + +#, python-format +msgid "Multi select field (up to %(max_choices)s choices)" +msgstr "Champ de sélection multiple (jusqu'à %(max_choices)s choix)" + +#, python-format +msgid "Value %(value)s is not a valid choice." +msgid_plural "Values %(value)s are not valid choices." +msgstr[0] "La valeur %(value)s n'est pas un choix valide." +msgstr[1] "Les valeurs %(value)s ne sont pas des choix valides." + +msgid "" +"Storing {:d} choices could require storing a CharField of up to {:d} " +"characters. Please reduce 'max_choices' or increase 'max_length'." +msgstr "" +"L'enregistrement de {:d} choix nécessite l'enregistrement d'un CharField " +"de {:d} caractères. Veuillez réduire 'max_choices' ou augmenter " +"'max_length'." + +msgid "Video" +msgstr "Vidéo" + +msgid "Your browser doesn't support this video format." +msgstr "Votre navigateur ne supporte pas ce format de vidéo." + +msgid "You are here:" +msgstr "Vous êtes ici :" + +msgid "Skip to main content" +msgstr "Passer au contenu principal" + +msgid "Go to homepage" +msgstr "Aller à la page d'accueil" + +msgid "Menu" +msgstr "Menu" + +msgid "Contact us" +msgstr "Contactez-nous" + +msgid "Life-changing learning!" +msgstr "Un apprentissage renversant!" + +msgid "Learn more" +msgstr "En savoir plus" + +msgid "Powered by" +msgstr "Propulsé par" + +msgid "This page has no child objects" +msgstr "Cette page n'a pas d'objets enfants" + +msgid "Back to home" +msgstr "Retour à la page d'accueil" + +msgid "Pagination" +msgstr "Pagination" + +#, python-format +msgid "Currently reading last page %(page)s" +msgstr "Actuellement sur la dernière page %(page)s" + +#, python-format +msgid "Currently reading page %(page)s" +msgstr "Actuellement sur la page %(page)s" + +#, python-format +msgid "Page %(page)s" +msgstr "Page %(page)s" + +#, python-format +msgid "Previous page %(page)s" +msgstr "Page précédente %(page)s" + +#, python-format +msgid "Last page %(page)s" +msgstr "Dernière page %(page)s" + +#, python-format +msgid "Next page %(page)s" +msgstr "Page suivante %(page)s" + +#, python-format +msgid "Richie news: %(title)s" +msgstr "Actualités Richie : %(title)s" + +#, python-format +msgid "Richie news: %(title)s %(url)s" +msgstr "Actualités Richie : %(title)s %(url)s" + +msgid "Share on Facebook" +msgstr "Partager sur Facebook" + +msgid "Share on Twitter" +msgstr "Partager sur Twitter" + +msgid "Share on Linkedin" +msgstr "Partager sur Linkedin" + +msgid "Share by Email" +msgstr "Partager par courriel" + +msgid "Follow a course online with Richie" +msgstr "Suivre un cours en ligne avec Richie" + +#, python-format +msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s" +msgstr "Je viens de m'inscrire au cours \"%(title)s\" sur Richie : %(url)s" + +msgid "Facebook" +msgstr "Facebook" + +msgid "Twitter page" +msgstr "Page Twitter" + +msgid "Linkedin page" +msgstr "Page LinkedIn" + +msgid "Bad request" +msgstr "Requête incorrecte" + +msgid "" +"Your query seems to be malformed. Please check your data and try again." +msgstr "" +"Votre requête semble être incorrecte. Veuillez vérifier les informations " +"envoyées et réessayer." + +msgid "Forbidden" +msgstr "Interdit" + +msgid "You do not have the required permissions to access this resource." +msgstr "Vous n'avez pas les permissions requises pour accéder à ce contenu." + +msgid "Page not found" +msgstr "Page introuvable" + +msgid "The requested resource does not exist." +msgstr "Le contenu demandé n'existe pas." + +msgid "Server bad request" +msgstr "Requête incorrecte au serveur" + +msgid "Something went wrong. Please try again later." +msgstr "Une erreur s'est produite. Merci de réessayer plus tard." + +msgid "Course could not be found." +msgstr "Le cours n'a pas pu être trouvé." + +msgid "See user group" +msgstr "Voir le groupe d'utilisateurs" + +msgid "See filer folder" +msgstr "Voir le dossier du classeur" + +msgid "Organization" +msgstr "Organisation" + +msgid "Organization by Category" +msgstr "Institution par catégorie" + +msgid "Category" +msgstr "Catégorie" + +msgid "Course" +msgstr "Cours" + +msgid "Person" +msgstr "Person." + +msgid "Licence" +msgstr "License" + +msgid "Post" +msgstr "Art." + +msgid "Program" +msgstr "Parcours" + +msgid "{!s} settings" +msgstr "Paramètres de {:s}" + +msgid "Snapshot this page..." +msgstr "Prise d'un instantanée de cette page..." + +msgid "" +"This will place a copy of this page as its child and move all its " +"courseruns as children of its new copy." +msgstr "" +"Ceci copie la page vers une page enfant et les sessions de cours " +"actuelles deviennent des enfants de cette copie." + +msgid "New page" +msgstr "Nouvelle page" + +msgid "Create a new page next to the current page." +msgstr "Créer une nouvelle page à côté de la page actuelle." + +msgid "New sub page" +msgstr "Nouvelle sous-page" + +msgid "Create a page below the current page." +msgstr "Créer une page sous la page actuelle." + +msgid "Page title" +msgstr "Titre de la page" + +msgid "Title of the page in current language" +msgstr "Titre de la page dans la langue actuelle" + +msgid "Page slug" +msgstr "Chemin de la page" + +msgid "Slug of the page in current language" +msgstr "Chemin de la page dans la langue actuelle" + +msgid "" +"This slug is too long. The length of the path built by prepending the " +"slug of the parent page would be {:d} characters long and it should be " +"less than 255" +msgstr "" +"Ce chemin est trop long. Le lien construit en faisant précéder ce chemin " +"par le lien de la page parente serait trop long de {:d} caractères et " +"devrait être de moins de 255 caractères" + +msgid "This slug is already in use" +msgstr "Ce chemin est déjà utilisé" + +msgid "" +"You must first create a parent page and set its `reverse_id` to `{:s}`." +msgstr "" +"Vous devez d’abord créer une page parente dont le 'reverse_id' est la " +"valeur `{:s}`." + +msgid "Code" +msgstr "Code" + +msgid "Unique reference for the course." +msgstr "Référence unique du cours." + +msgid "New course page" +msgstr "Nouvelle page de cours" + +msgid "Create a new course page" +msgstr "Créez une nouvelle page de cours" + +msgid "Unique reference for the organization." +msgstr "Référence unique de l'institution." + +msgid "New organization page" +msgstr "Nouvelle page d'organisation" + +msgid "Create a new organization page" +msgstr "Créer une nouvelle page d'organisation" + +msgid "New category page" +msgstr "Nouvelle page de catégorie" + +msgid "Create a new category page" +msgstr "Créer une nouvelle page de catégorie" + +msgid "New blog post" +msgstr "Nouveau message de blog" + +msgid "Create a new blog post" +msgstr "Créer un nouveau message de blog" + +msgid "New person page" +msgstr "Nouvelle page de personne" + +msgid "Create a new person page" +msgstr "Créez une nouvelle page de personne" + +msgid "New program" +msgstr "Nouveau parcours" + +msgid "Create a new program" +msgstr "Créer un nouveau parcours" + +msgid "Admin" +msgstr "Admin" + +msgid "Inherit" +msgstr "Hériter" + +msgid "Default" +msgstr "Défaut" + +msgid "Mini" +msgstr "Mini" + +msgid "Favorite" +msgstr "Favoris" + +msgid "Badge" +msgstr "Badge" + +msgid "Tag" +msgstr "Étiquette" + +msgid "Small" +msgstr "Petit" + +msgid "Large" +msgstr "Grand" + +msgid "Card" +msgstr "Fiche" + +msgid "Row" +msgstr "Rangée" + +msgid "minute" +msgstr "minute" + +msgid "minutes" +msgstr "minutes" + +msgid "hour" +msgstr "heure" + +msgid "hours" +msgstr "heures" + +msgid "day" +msgstr "jour" + +msgid "days" +msgstr "jours" + +msgid "week" +msgstr "semaine" + +msgid "weeks" +msgstr "semaines" + +msgid "month" +msgstr "mois" + +msgid "months" +msgstr "mois" + +msgid "Run {:d}" +msgstr "Session {:d}" + +msgid "You can't snapshot a snapshot." +msgstr "" +"Vous ne pouvez pas faire une capture instantanée d'une capture " +"instantanée." + +msgid "You don't have sufficient permissions to snapshot this page." +msgstr "" +"Vous n'avez pas les permissions suffisantes pour faire une capture " +"instantanée de cette page." + +msgid "Archived on {now:%Y-%m-%d %H:%M:%S}" +msgstr "Archivé le {now:%Y-%m-%d %H:%M:%S}" + +msgid "{title:s} ({version!s})" +msgstr "{title:s} ({version!s})" + +msgid "blog post" +msgstr "message de blog" + +msgid "blog posts" +msgstr "messages de blog" + +msgid "variant" +msgstr "variante" + +msgid "Optional glimpse variant for a custom look." +msgstr "Variante de vue optionnelle pour une apparence personnalisé." + +msgid "blog post plugin" +msgstr "plugin pour message de blog" + +msgid "blog post plugins" +msgstr "plugins de message de blog" + +msgid "category" +msgstr "catégorie" + +msgid "categories" +msgstr "catégories" + +msgid "category plugin" +msgstr "plugin de catégorie" + +msgid "category plugins" +msgstr "plugins de catégorie" + +msgid "enroll now" +msgstr "s’inscrire maintenant" + +msgid "study now" +msgstr "étudier maintenant" + +msgid "open for enrollment" +msgstr "ouvert pour inscription" + +msgid "starting on" +msgstr "débute le" + +msgid "closing on" +msgstr "termine le" + +msgid "enrollment closed" +msgstr "inscription fermée" + +msgid "on-going" +msgstr "en cours" + +msgid "archived" +msgstr "archivé" + +msgid "to be scheduled" +msgstr "à planifier" + +msgid "forever open" +msgstr "toujours ouvert" + +msgid "code" +msgstr "code" + +msgid "The course time range." +msgstr "La durée du cours." + +msgid "Total amount of time to complete this course." +msgstr "Effort de temps total pour compléter ce cours." + +msgid "is listed" +msgstr "est listé" + +msgid "Tick if you want the course to be visible on the search page." +msgstr "" +"Cochez si vous voulez que le cours soit visible sur la page de recherche." + +msgid "is self paced" +msgstr "est à votre rythme" + +msgid "Tick if the course pace is self paced." +msgstr "Cochez si le cours est à votre rythme." + +msgid "course" +msgstr "cours" + +msgid "courses" +msgstr "cours" + +msgid "Self paced" +msgstr "À votre rythme" + +msgid "~{pace:d} {effort_unit!s}/{duration_unit!s}" +msgstr "~{pace:d} {effort_unit!s}/{duration_unit!s}" + +msgid "~{pace_hours:d}h{pace_minutes:d}/{duration_unit!s}" +msgstr "~{pace_hours:d}h{pace_minutes:d}/{duration_unit!s}" + +msgid "Manual" +msgstr "Manuel" + +msgid "Synchronization to draft page" +msgstr "Synchronisation de la page brouillon" + +msgid "Synchronization to public page" +msgstr "Synchronisation de la page publique" + +msgid "" +"course_and_search - show on the course page and include in search results" +msgstr "" +"cours et recherche - afficher sur la page du cours et inclure dans les " +"résultats de recherche" + +msgid "course_only - show on the course page and hide from search results" +msgstr "" +"cours seulement - afficher sur la page du cours mais exclure des " +"résultats de recherche" + +msgid "hidden - hide on the course page and from search results" +msgstr "" +"caché - masquer sur la page du cours et exclure des résultats de recherche" + +msgid "" +"compact - show minimal information about the course run (only for " +"products)." +msgstr "" +"compact - affiche un peu d'information de la session de cours (uniquement " +"pour les produits)." + +msgid "" +"detailed - show all information about the course run (only for products)." +msgstr "" +"détaillé - affiche toutes les informations de la session de cours " +"(uniquement pour les produits)." + +msgid "Synchronization mode" +msgstr "Mode de synchronisation" + +msgid "resource link" +msgstr "lien de la ressource" + +msgid "course start" +msgstr "début du cours" + +msgid "course end" +msgstr "fin du cours" + +msgid "enrollment start" +msgstr "début des inscriptions" + +msgid "enrollment end" +msgstr "fin des inscriptions" + +msgid "The list of languages in which the course content is available." +msgstr "Les langues dans lesquelles le contenu du cours est disponible." + +msgid "enrollment count" +msgstr "nombre d'inscriptions" + +msgid "The number of enrolled students" +msgstr "Le nombre d'apprenants inscrits" + +msgid "catalog visibility" +msgstr "visibilité dans le catalogue" + +msgid "course run" +msgstr "session de cours" + +msgid "course runs" +msgstr "sessions de cours" + +msgid "title" +msgstr "titre" + +msgid "Course run translation" +msgstr "Traduction de la session de cours" + +msgid "Course run translations" +msgstr "Traductions de la session de cours" + +msgid "Empty title" +msgstr "Titre vide" + +msgid "course plugin" +msgstr "plugin de cours" + +msgid "course plugins" +msgstr "plugins de cours" + +msgid "logo" +msgstr "logo" + +msgid "url" +msgstr "URL" + +msgid "name" +msgstr "nom" + +msgid "content" +msgstr "contenu" + +msgid "licence" +msgstr "license" + +msgid "licences" +msgstr "licences" + +msgid "Licence translation" +msgstr "Traduction de la licence" + +msgid "licence translations" +msgstr "traductions de la licence" + +msgid "description" +msgstr "description" + +msgid "licence plugin" +msgstr "plugin de licence" + +msgid "licence plugins" +msgstr "plugins de licence" + +msgid "organization" +msgstr "institution" + +msgid "organizations" +msgstr "organisations" + +msgid "organization plugin" +msgstr "plugin d'organisation" + +msgid "organization plugins" +msgstr "plugins d'institution" + +msgid "organizations by category plugin" +msgstr "institutions par plugin de catégorie" + +msgid "organizations by category plugins" +msgstr "institutions par plugins de catégorie" + +msgid "person" +msgstr "personnes" + +msgid "persons" +msgstr "personnes" + +msgid "Custom bio" +msgstr "Bio adaptée" + +msgid "" +"Optional: provide a custom bio (if you leave it empty, it will display " +"the person's bio)." +msgstr "" +"Optionnel : adaptez la bio (si vous laissez le champs vide, la biographie " +"par défaut de la personne s'affichera)." + +msgid "person plugin" +msgstr "plugin de personne" + +msgid "person plugins" +msgstr "plugins de personne" + +msgid "program" +msgstr "parcours" + +msgid "programs" +msgstr "parcours" + +msgid "program plugin" +msgstr "plugin de parcours" + +msgid "program plugins" +msgstr "plugins de parcours" + +msgid "role" +msgstr "rôle" + +msgid "" +"A role describes all the permissions that should be granted to the user " +"group." +msgstr "" +"Un rôle décrit toutes les permissions qui doivent être accordées au " +"groupe d'utilisateurs." + +msgid "page" +msgstr "page" + +msgid "Page to which this role grants permissions." +msgstr "Page à laquelle ce rôle donne des permissions." + +msgid "group" +msgstr "groupe" + +msgid "User group that this role controls." +msgstr "Groupe d'utilisateurs que ce rôle contrôle." + +msgid "filer folder" +msgstr "dossier du classeur" + +msgid "Filer folder that this role controls." +msgstr "Dossier du classeur que ce rôle contrôle." + +msgid "page role" +msgstr "rôle de page" + +msgid "page roles" +msgstr "rôles de la page" + +msgid "{:s} | {:s}" +msgstr "{:s} | {:s}" + +msgid "Course page" +msgstr "Page de cours" + +msgid "Organization list" +msgstr "Liste des institutions" + +msgid "Organization page" +msgstr "Page d'institution" + +msgid "Category list" +msgstr "Liste des catégories" + +msgid "Category page" +msgstr "Page de catégorie" + +msgid "Blog post list" +msgstr "Liste des articles" + +msgid "Blog post page" +msgstr "Page d'article" + +msgid "Person page" +msgstr "Page de personne" + +msgid "Person list" +msgstr "Liste des personnes" + +msgid "Program page" +msgstr "Page de parcours" + +msgid "Program list" +msgstr "Liste des parcours" + +msgid "Search" +msgstr "Recherche" + +msgid "List of child pages" +msgstr "Liste des pages enfants" + +msgid "Homepage" +msgstr "Page d'accueil" + +msgid "Single column" +msgstr "Colonne unique" + +msgid "Three columns: (33% | 33% | 33%)" +msgstr "Trois colonnes : (33% | 33% | 33%)" + +msgid "Two columns: (50% | 50%)" +msgstr "Deux colonnes: (50% | 50%)" + +msgid "Two columns: (25% | 75%)" +msgstr "Deux colonnes : (25% | 75%)" + +msgid "Two columns: (75% | 25%)" +msgstr "Deux colonnes : (75% | 25%)" + +msgid "Footer" +msgstr "Pied de page" + +msgid "Static headline" +msgstr "Titre statique" + +msgid "Main content" +msgstr "Contenu principal" + +msgid "Secondary content" +msgstr "Deuxième contenu" + +msgid "Third content" +msgstr "Troisième contenu" + +msgid "Cover" +msgstr "Couverture" + +msgid "Catch phrase" +msgstr "Slogan" + +msgid "About the course" +msgstr "À propos du cours" + +msgid "What you will learn" +msgstr "Ce que vous apprendrez" + +msgid "Format" +msgstr "Format" + +msgid "Prerequisites" +msgstr "Prérequis" + +msgid "Team" +msgstr "Équipe" + +msgid "Plan" +msgstr "Plan" + +msgid "Complementary information" +msgstr "Informations complémentaires" + +msgid "License for the course content" +msgstr "Licence pour le contenu du cours" + +msgid "License for the content created by course participants" +msgstr "Licence pour le contenu créé par les participants du cours" + +msgid "Categories" +msgstr "Catégories" + +msgid "Icon" +msgstr "Icône" + +msgid "Organizations" +msgstr "Organisations" + +msgid "Assessment and Certification" +msgstr "Évaluation et Certification" + +msgid "Banner" +msgstr "Bannière" + +msgid "Logo" +msgstr "Logo" + +msgid "Description" +msgstr "Description" + +msgid "Excerpt" +msgstr "Extrait" + +msgid "Portrait" +msgstr "Portrait" + +msgid "Bio" +msgstr "Bio" + +msgid "Main Content" +msgstr "Contenu principal" + +msgid "Author" +msgstr "Auteur" + +msgid "Body" +msgstr "Corps" + +msgid "Headline" +msgstr "Titre" + +msgid "Courses" +msgstr "Cours" + +msgid "Button caesura" +msgstr "Bouton caesura" + +msgid "Full width" +msgstr "Pleine largeur" + +msgid "No categories yet." +msgstr "Pas de catégories." + +msgid "Not published yet" +msgstr "Pas encore publié" + +msgid "No author yet" +msgstr "Pas d'auteur" + +msgid "No excerpt content" +msgstr "Aucun extrait de contenu" + +msgid "No body content" +msgstr "Aucun contenu" + +msgid "Related posts" +msgstr "Billets de blog liés" + +msgid "Other categories of articles" +msgstr "Autres catégories d'articles" + +msgid "No associated blogposts" +msgstr "Aucun message de blogue associé" + +#, python-format +msgid "%(category_title)s - Category" +msgstr "%(category_title)s - Catégorie" + +msgid "Sub categories" +msgstr "Sous-catégories" + +msgid "Related courses" +msgstr "Cours connexes" + +msgid "Courses pagination" +msgstr "Pagination des cours" + +#, python-format +msgid "" +"\n" +" See all courses related to " +"%(category_title)s\n" +" " +msgstr "" +"\n" +" Voir tous les cours liés à " +"%(category_title)s\n" +" " + +msgid "See all courses" +msgstr "Voir tous les cours" + +msgid "Related organizations" +msgstr "Institutions associées" + +msgid "Related organizations pagination" +msgstr "Pagination des institutions liées" + +msgid "Related blogposts" +msgstr "Billets de blog liés" + +msgid "Related blogposts pagination" +msgstr "Pagination des billets de blog liés" + +msgid "Related persons" +msgstr "Personnes liées" + +msgid "Related persons pagination" +msgstr "Pagination des personnes liées" + +msgid "No categories" +msgstr "Pas de catégories" + +#, python-format +msgid "%(course_title)s - Course" +msgstr "%(course_title)s - Cours" + +msgid "Ref. " +msgstr "Réf. " + +msgid "No associated categories" +msgstr "Aucune catégorie associée" + +msgid "Enter here an introduction to your course." +msgstr "Saisissez ici une introduction à votre cours." + +msgid "Duration:" +msgstr "Durée :" + +msgid "Effort:" +msgstr "Effort :" + +msgid "Pace:" +msgstr "Rythme :" + +msgid "Languages:" +msgstr "Langues :" + +#, python-format +msgid "" +"\n" +" %(count)s already " +"enrolled!\n" +" " +msgstr "" +"\n" +" %(count)s déjà " +"inscrits !\n" +" " + +msgid "" +"Add a teaser video or add a cover image below and it will be used as " +"teaser image as well." +msgstr "" +"Ajouter une vidéo de teasing ou une image de couverture ci-dessous, celle-" +"ci sera également utilisée comme image de teasing." + +msgid "course cover image" +msgstr "image de couverture du cours" + +#, python-format +msgid "" +"\n" +" Archived on %(creation_date)s\n" +" " +msgstr "" +"\n" +" Archivé le %(creation_date)s\n" +" " + +msgid "Go to current version" +msgstr "Accédez à la version actuelle" + +msgid "Glimpse cover" +msgstr "Image de l'aperçu" + +msgid "Add an image for course cover on its glimpse." +msgstr "Ajouter une image pour la couverture du cours sur son aperçu." + +msgctxt "course_detail__title" +msgid "What you will learn" +msgstr "Ce que vous apprendrez" + +msgid "At the end of this course, you will be able to:" +msgstr "À la fin de ce cours, vous pourrez :" + +msgctxt "course_detail__title" +msgid "Description" +msgstr "Description" + +msgctxt "course_detail__title" +msgid "Format" +msgstr "Format" + +msgid "How is the course structured?" +msgstr "Quelle est la structure du cours ?" + +msgctxt "course_detail__title" +msgid "Prerequisites" +msgstr "Prérequis" + +msgid "What are the prerequisites to follow this course?" +msgstr "Quels sont les prérequis pour suivre ce cours ?" + +msgctxt "course_detail__title" +msgid "Assessment and certification" +msgstr "Évaluation et Certification" + +msgid "How is progress evaluated and/or certified?" +msgstr "Comment les étudiants sont ils évalués et/ou certifiés ?" + +msgctxt "course_detail__title" +msgid "Course plan" +msgstr "Plan de cours" + +msgid "Enter here the detailed course plan." +msgstr "Détaillez ici le plan du cours." + +msgid "" +"\n" +" This course is part of a " +"program\n" +" " +msgid_plural "" +"\n" +" This course is part of " +"programs\n" +" " +msgstr[0] "" +"\n" +" Ce cours fait partie d'une " +"série\n" +" " +msgstr[1] "" +"\n" +" Ce cours fait partie de ces " +"séries\n" +" " + +msgctxt "course_detail__title" +msgid "Course team" +msgstr "Équipe pédagogique" + +msgid "Who are the teachers in the course team?" +msgstr "Qui sont les enseignants de l’équipe pédagogique ?" + +msgctxt "course_detail__title" +msgid "Organizations" +msgstr "Organisations" + +msgid "What are the organizations publishing this course?" +msgstr "Quelles sont les organisations publiant ce cours?" + +msgctxt "course_detail__title" +msgid "License" +msgstr "Licence" + +msgid "What is the license for the course content?" +msgstr "Quelle est la licence pour le contenu du cours ?" + +msgid "What is the license for the content created by course participants?" +msgstr "" +"Quelle est la licence pour le contenu créé par les participants du cours ?" + +msgid "Course code" +msgstr "Code du cours" + +msgid "Course date" +msgstr "Date du cours" + +msgid "Course team" +msgstr "Équipe pédagogique" + +msgid "License" +msgstr "Licence" + +#, python-format +msgid "" +"\n" +" A %(model)s object is missing on this %(model)s page. Please " +"select another page template.\n" +"
\n" +" If what you need is a %(model)s page, you need to create it via " +"the wizard and choose \"New %(model)s page\".\n" +" " +msgstr "" +"\n" +" Il manque un objet %(model)s sur cette page %(model)s . Veuillez " +"sélectionner un autre gabarit de page.\n" +"
\n" +" Si ce dont vous avez besoin est une page %(model)s , vous devez " +"la créer via l'assistant et choisir \"Nouvelle page %(model)s \".\n" +" " + +msgid "Main organization" +msgstr "Organisation principale" + +msgid "Related courses pagination" +msgstr "Pagination des cours liés" + +#, python-format +msgid "" +"\n" +" See all courses related to " +"%(organization_title)s\n" +" " +msgstr "" +"\n" +" Voir tous les cours liés à " +"%(organization_title)s\n" +" " + +msgid "No organization yet" +msgstr "Pas encore d'organisation" + +msgid "Enter your bio here..." +msgstr "Saisissez ici votre bio..." + +#, python-format +msgid "%(title)s avatar" +msgstr "avatar de %(title)s" + +msgid "No associated organizations" +msgstr "Aucune organisation associée" + +#, python-format +msgid "" +"\n" +" See all courses related to " +"%(person_title)s\n" +" " +msgstr "" +"\n" +" Voir tous les cours liés à " +"%(person_title)s\n" +" " + +msgid "Blogposts" +msgstr "Messages de blog" + +msgid "Blogposts pagination" +msgstr "Pagination des billets de blog" + +msgid "No persons" +msgstr "Pas de personnes" + +#, python-format +msgid "%(program_title)s - Program" +msgstr "%(program_title)s - Parcours" + +msgid "program cover image" +msgstr "image de couverture de parcours" + +msgid "No associated programs" +msgstr "Aucun parcours associé" + +#, python-brace-format +msgid "Run {i:d}" +msgstr "Session {i:d}" + +msgid "Regenerate search index..." +msgstr "Regénérer l'index de recherche..." + +msgid "New courses" +msgstr "Nouveaux cours" + +msgid "First session" +msgstr "Première session" + +msgid "Availability" +msgstr "Disponibilité" + +msgid "Languages" +msgstr "Langues" + +msgid "Subjects" +msgstr "Sujets" + +msgid "Levels" +msgstr "Niveaux" + +msgid "Persons" +msgstr "Personnes" + +msgid "Licences" +msgstr "Licences" + +msgid "Weekly pace" +msgstr "Rythme hebdomadaire" + +msgid "Self-paced" +msgstr "À votre rythme" + +msgid "Less than one hour" +msgstr "Moins d'une heure" + +msgid "One to two hours" +msgstr "Entre une et deux heures" + +msgid "More than two hours" +msgstr "Plus de deux heures" + +msgid "Open for enrollment" +msgstr "Ouvert pour inscription" + +msgid "Coming soon" +msgstr "Bientôt" + +msgid "On-going" +msgstr "En cours" + +msgid "Archived" +msgstr "Archivé" + +msgid "Sort by configuration" +msgstr "Trier par configuration" + +msgid "Sort by facet count" +msgstr "Trier par compte de facettes" + +msgid "Sort alphabetically" +msgstr "Trier par ordre alphabétique" + +msgid "You are not allowed to manage the search index." +msgstr "Vous n'êtes pas autorisé à modifier l'index de recherche." + +msgid "The search index was successfully bootstrapped" +msgstr "L'index de recherche a été initialisé avec succès" + +msgid "Glimpse" +msgstr "Aperçu" + +msgid "Link settings" +msgstr "Paramètres du lien" + +msgid "Square card" +msgstr "Carte carrée" + +msgid "Quote" +msgstr "Citation" + +msgid "Half row" +msgstr "Demi-rangée" + +msgid "Full row" +msgstr "Rangée complète" + +msgid "Variant" +msgstr "Variante" + +msgid "Form factor variant" +msgstr "Variante de facteur de forme" + +msgid "image" +msgstr "image" + +msgid "Content" +msgstr "Contenu" + +msgid "External URL" +msgstr "URL externe" + +msgid "Make the glimpse as a link with an external URL." +msgstr "Afficher l'aperçu comme un lien vers une URL externe." + +msgid "Internal URL" +msgstr "URL interne" + +msgid "Make the glimpse as a link with an internal (page) URL." +msgstr "Afficher l'aperçu comme un lien vers une URL (page) interne." + +msgid "HTML Sitemap" +msgstr "Plan de site HTML" + +msgid "" +"Press save to create a site map. You will then be able to add a child " +"plugin for each subtree in your sitemap." +msgstr "" +"Appuyez sur «Enregistrer» pour créer un plan de site. Vous pourrez " +"ensuite ajouter un plugin enfant pour chaque sous-arbre de votre plan de " +"site." + +msgid "HTML sitemap page" +msgstr "Page de site HTML" + +msgid "root page" +msgstr "page racine" + +msgid "" +"This page will be at the root of your sitemap (or its children if the " +"\"include root page\" flag is unticked)." +msgstr "" +"Cette page sera à la racine de votre plan de site (ou de ses enfants si " +"«inclure la page racine» n'a pas été sélectionné)." + +msgid "max depth" +msgstr "profondeur maximale" + +msgid "" +"Limit the level of nesting that your sitemap will contain below this " +"page. An empty field or 0 equals to no limit." +msgstr "" +"Limitez la profondeur de votre plan de site sous cette page. Un champ " +"vide ou égal à 0 correspond à une profondeur illimitée." + +msgid "in navigation" +msgstr "dans le menu" + +msgid "" +"Tick to exclude from sitemap the pages that are excluded from navigation." +msgstr "" +"Sélectionner pour exclure du plan de site les pages qui sont exclues du " +"menu." + +msgid "include root page" +msgstr "inclure la page racine" + +msgid "" +"Tick to include the root page and its descendants. Untick to include only " +"its descendants." +msgstr "" +"Sélectionner pour inclure la page racine et ses descendants. Ne pas " +"sélectionner pour n'inclure que les descendants de la page racine." + +msgid "HTML Sitemaps" +msgstr "Plans de site HTML" + +msgid "Sitemap" +msgstr "Plan de site" + +msgid "Large Banner" +msgstr "Grande Bannière" + +msgid "Medias" +msgstr "Médias" + +msgid "Hero introduction" +msgstr "Introduction" + +msgid "background image" +msgstr "image d'arrière-plan" + +msgid "Template" +msgstr "Modèle" + +msgid "Choose template to render plugin." +msgstr "Choisir un modèle d'affichage pour le plugin." + +msgid "Explore our catalog" +msgstr "Explorez notre catalogue" + +msgid "Search in our courses" +msgstr "Rechercher dans nos cours" + +msgid "Advanced settings" +msgstr "Paramètres avancés" + +msgid "LTI consumer" +msgstr "Consommateur LTI" + +msgid "Custom provider configuration" +msgstr "Configuration manuelle du service" + +msgid "shared secret" +msgstr "secret partagé" + +msgid "" +"The url is not valid for this provider. It should be of the form \"{:s}\"." +msgstr "" +"L'url n'est pas valide pour ce service. Elle doit être de la forme \"{:" +"s}\"." + +msgid "" +"The url is not valid for this provider. It should start with \"{:s}\"." +msgstr "" +"L'url n'est pas valide pour ce service. Elle devrait commencer par \"{:" +"s}\"." + +msgid "Please choose a predefined provider, or fill fields below" +msgstr "" +"Veuillez choisir un fournisseur de service LTI prédéfini, ou remplir les " +"champs ci-dessous" + +msgid "Please choose a predefined provider above, or fill this field" +msgstr "" +"Veuillez choisir ci-dessus un fournisseur de service LTI prédéfini, ou " +"remplir ce champs" + +msgid "Please fill this field" +msgstr "Veuillez remplir ce champ" + +msgid "LTI url" +msgstr "url LTI" + +msgid "" +"For a predefined provider, leave this field empty for uploading new " +"content." +msgstr "" +"Pour un fournisseur de service LTI prédéfini, laissez ce champ vide pour " +"créer un nouveau contenu." + +msgid "Predefined LTI provider" +msgstr "Fournisseur de service LTI prédéfini" + +msgid "Please choose a predefined provider or fill fields below." +msgstr "" +"Veuillez choisir un fournisseur de service LTI prédéfini, ou remplir les " +"champs ci-dessous." + +msgid "Yes" +msgstr "Oui" + +msgid "No" +msgstr "Non" + +msgid "Nested item" +msgstr "Élément imbriqué" + +msgid "List" +msgstr "Liste" + +msgid "Plain text" +msgstr "Texte brut" + +msgid "plain text" +msgstr "texte brut" + +msgid "Section" +msgstr "Section" + +msgid "Primary scheme" +msgstr "Schéma principal" + +msgid "Secondary scheme" +msgstr "Schéma secondaire" + +msgid "Tertiary scheme" +msgstr "Schéma tertiaire" + +msgid "Quaternary scheme" +msgstr "Schéma Quaternaire" + +msgid "Quinary scheme" +msgstr "Schéma Quinaire" + +msgid "Senary scheme" +msgstr "Schéma sénaire" + +msgid "Septenary scheme" +msgstr "Schéma septénaire" + +msgid "Item tiles" +msgstr "Tuiles d'objet" + +msgid "Optional template for custom look." +msgstr "Modèle optionnel pour un rendu personnalisé." + +msgid "Attributes" +msgstr "Attributs" + +msgid "Image" +msgstr "Image" + +msgid "Simple text" +msgstr "Texte simple" + +msgid "body" +msgstr "corps" + +#, python-format +msgid "" +"Ensure this text has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this text has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Assurez-vous que ce texte a au maximum %(limit_value)d caractère (il a " +"%(show_value)d)." +msgstr[1] "" +"Assurez-vous que ce texte a au maximum %(limit_value)d caractères (il a " +"%(show_value)d)." diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/fr_FR/LC_MESSAGES/django.po b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/fr_FR/LC_MESSAGES/django.po new file mode 100644 index 0000000000..a9fa919a6b --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/fr_FR/LC_MESSAGES/django.po @@ -0,0 +1,1662 @@ +msgid "" +msgstr "" +"Project-Id-Version: richie\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-31 17:41+0100\n" +"PO-Revision-Date: 2024-11-27 13:20\n" +"Last-Translator: \n" +"Language-Team: French\n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Crowdin-Project: richie\n" +"X-Crowdin-Project-ID: 308578\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: backend.pot\n" +"X-Crowdin-File-ID: 32\n" + +#: newsite/settings.py:250 newsite/settings.py:260 +#, fuzzy +#| msgid "dashboard" +msgid "Dashboard" +msgstr "tableau de bord" + +#: newsite/settings.py:251 +msgid "{base_url:s}/dashboard/" +msgstr "" + +#: newsite/settings.py:261 +#, fuzzy +#| msgid "dashboard" +msgid "/dashboard/" +msgstr "tableau de bord" + +#: newsite/settings.py:264 +#, fuzzy +#| msgid "dashboard" +msgid "Teacher dashboard" +msgstr "tableau de bord" + +#: newsite/settings.py:265 +#, fuzzy +#| msgid "dashboard" +msgid "/dashboard/teacher" +msgstr "tableau de bord" + +#: newsite/settings.py:287 +msgid "Profile" +msgstr "" + +#: newsite/settings.py:288 +msgid "{base_url:s}/u/(username)" +msgstr "" + +#: newsite/settings.py:291 +#, fuzzy +#| msgid "Accordion" +msgid "Account" +msgstr "Accordéon" + +#: newsite/settings.py:292 +msgid "{base_url:s}/account/settings" +msgstr "" + +#: newsite/settings.py:385 +msgid "Teaser" +msgstr "Accroche" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "English" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "French" +msgstr "" + +msgid "Richie Plugins" +msgstr "Plugins Richie" + +msgid "Define a duration as a number of time units" +msgstr "Définir une durée comme un nombre d'unités de temps" + +#, python-format +msgid "%(value)s is not a valid choice for a time unit." +msgstr "%(value)s n'est pas un choix valide d'unité de temps." + +msgid "A composite duration should be a pair: number and time unit." +msgstr "Une durée composite doit être une paire : nombre / unité de temps." + +msgid "A composite duration should be a round number of time units." +msgstr "Une durée composite doit être un nombre rond d'unités de temps." + +msgid "A composite duration should be positive." +msgstr "Une durée composite doit être positive." + +msgid "Define an effort" +msgstr "Définir un effort" + +msgid "An effort should be a triplet: number, time unit and reference unit." +msgstr "" +"Un effort doit être un triplet: numéro / unité de temps / unité de " +"référence." + +msgid "An effort should be a round number of time units." +msgstr "Un effort doit être un nombre rond d'unités de temps." + +msgid "An effort should be positive." +msgstr "Un effort doit être positif." + +msgid "The effort time unit should be shorter than the reference unit." +msgstr "" +"L'unité de temps d'effort doit être plus courte que l'unité de temps de " +"référence." + +msgid "{:s} and {:s}" +msgstr "{:s} et {:s}" + +msgid " and " +msgstr " et " + +#, python-format +msgid "You can only select up to %(limit_value)d choices." +msgstr "Vous pouvez sélectionner jusqu'à %(limit_value)d choix." + +#, python-format +msgid "Multi select field (up to %(max_choices)s choices)" +msgstr "Champ de sélection multiple (jusqu'à %(max_choices)s choix)" + +#, python-format +msgid "Value %(value)s is not a valid choice." +msgid_plural "Values %(value)s are not valid choices." +msgstr[0] "La valeur %(value)s n'est pas un choix valide." +msgstr[1] "Les valeurs %(value)s ne sont pas des choix valides." + +msgid "" +"Storing {:d} choices could require storing a CharField of up to {:d} " +"characters. Please reduce 'max_choices' or increase 'max_length'." +msgstr "" +"L'enregistrement de {:d} choix nécessite l'enregistrement d'un CharField " +"de {:d} caractères. Veuillez réduire 'max_choices' ou augmenter " +"'max_length'." + +msgid "Video" +msgstr "Vidéo" + +msgid "Your browser doesn't support this video format." +msgstr "Votre navigateur ne supporte pas ce format de vidéo." + +msgid "You are here:" +msgstr "Vous êtes ici:" + +msgid "Skip to main content" +msgstr "Passer au contenu principal" + +msgid "Go to homepage" +msgstr "Retour à la page d'accueil" + +msgid "Menu" +msgstr "Menu" + +msgid "Contact us" +msgstr "Nous contacter" + +msgid "Life-changing learning!" +msgstr "Apprendre pour changer de vie !" + +msgid "Learn more" +msgstr "En savoir plus" + +msgid "Powered by" +msgstr "Propulsé par" + +msgid "This page has no child objects" +msgstr "Cette page n'a pas d'objets enfants" + +msgid "Back to home" +msgstr "Retour à la page d'accueil" + +msgid "Pagination" +msgstr "Pagination" + +#, python-format +msgid "Currently reading last page %(page)s" +msgstr "Actuellement sur la dernière page %(page)s" + +#, python-format +msgid "Currently reading page %(page)s" +msgstr "Actuellement sur la page %(page)s" + +#, python-format +msgid "Page %(page)s" +msgstr "Page %(page)s" + +#, python-format +msgid "Previous page %(page)s" +msgstr "Page précédente %(page)s" + +#, python-format +msgid "Last page %(page)s" +msgstr "Dernière page %(page)s" + +#, python-format +msgid "Next page %(page)s" +msgstr "Page suivante %(page)s" + +#, python-format +msgid "Richie news: %(title)s" +msgstr "Actualités Richie: %(title)s" + +#, python-format +msgid "Richie news: %(title)s %(url)s" +msgstr "Actualités Richie: %(title)s %(url)s" + +msgid "Share on Facebook" +msgstr "Partager sur Facebook" + +msgid "Share on Twitter" +msgstr "Partager sur Twitter" + +msgid "Share on Linkedin" +msgstr "Partager sur Linkedin" + +msgid "Share by Email" +msgstr "Partager par Email" + +msgid "Follow a course online with Richie" +msgstr "Suivre un cours en ligne avec Richie" + +#, python-format +msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s" +msgstr "Je viens de m'inscrire au cours \"%(title)s\" sur Richie: %(url)s" + +msgid "Facebook" +msgstr "Facebook" + +msgid "Twitter page" +msgstr "Page Twitter" + +msgid "Linkedin page" +msgstr "Page LinkedIn" + +msgid "Bad request" +msgstr "Requête incorrecte" + +msgid "" +"Your query seems to be malformed. Please check your data and try again." +msgstr "" +"Votre requête semble être incorrecte. Veuillez vérifier les informations " +"envoyées et réessayer." + +msgid "Forbidden" +msgstr "Interdit" + +msgid "You do not have the required permissions to access this resource." +msgstr "Vous n'avez pas les permissions requises pour accéder à ce contenu." + +msgid "Page not found" +msgstr "Page introuvable" + +msgid "The requested resource does not exist." +msgstr "Le contenu demandé n'existe pas." + +msgid "Server bad request" +msgstr "Requête incorrecte au serveur" + +msgid "Something went wrong. Please try again later." +msgstr "Une erreur s'est produite. Merci de réessayer plus tard." + +msgid "Course could not be found." +msgstr "Le cours n'a pas pu être trouvé." + +msgid "See user group" +msgstr "Voir le groupe d'utilisateurs" + +msgid "See filer folder" +msgstr "Voir le dossier du classeur" + +msgid "Organization" +msgstr "Établissement" + +msgid "Organization by Category" +msgstr "Établissement par catégorie" + +msgid "Category" +msgstr "Catégorie" + +msgid "Course" +msgstr "Cours" + +msgid "Person" +msgstr "Pers" + +msgid "Licence" +msgstr "License" + +msgid "Post" +msgstr "Post" + +msgid "Program" +msgstr "Parcours" + +msgid "{!s} settings" +msgstr "Paramètres de {:s}" + +msgid "Snapshot this page..." +msgstr "Faire un instantané de cette page..." + +msgid "" +"This will place a copy of this page as its child and move all its " +"courseruns as children of its new copy." +msgstr "" +"Ceci copie la page vers une page enfant et les sessions de cours " +"actuelles deviennent des enfants de cette copie." + +msgid "New page" +msgstr "Nouvelle page" + +msgid "Create a new page next to the current page." +msgstr "Créer une nouvelle page à côté de la page actuelle." + +msgid "New sub page" +msgstr "Nouvelle sous-page" + +msgid "Create a page below the current page." +msgstr "Créer une page sous la page actuelle." + +msgid "Page title" +msgstr "Titre de la page" + +msgid "Title of the page in current language" +msgstr "Titre de la page dans la langue actuelle" + +msgid "Page slug" +msgstr "Chemin de la page" + +msgid "Slug of the page in current language" +msgstr "Chemin de la page dans la langue actuelle" + +msgid "" +"This slug is too long. The length of the path built by prepending the " +"slug of the parent page would be {:d} characters long and it should be " +"less than 255" +msgstr "" +"Ce chemin est trop long. Le lien construit en faisant précéder ce chemin " +"par le lien de la page parente serait trop long de {:d} caractères et " +"devrait être de moins de 255 caractères" + +msgid "This slug is already in use" +msgstr "Ce chemin est déjà utilisé" + +msgid "" +"You must first create a parent page and set its `reverse_id` to `{:s}`." +msgstr "" +"Vous devez d’abord créer une page parente dont le 'reverse_id' est la " +"valeur `{:s}`." + +msgid "Code" +msgstr "Code" + +msgid "Unique reference for the course." +msgstr "Référence unique du cours." + +msgid "New course page" +msgstr "Nouvelle page de cours" + +msgid "Create a new course page" +msgstr "Créez une nouvelle page de cours" + +msgid "Unique reference for the organization." +msgstr "Référence unique de l'établissement." + +msgid "New organization page" +msgstr "Nouvelle page d'établissement" + +msgid "Create a new organization page" +msgstr "Créer une nouvelle page d'établissement" + +msgid "New category page" +msgstr "Nouvelle page de catégorie" + +msgid "Create a new category page" +msgstr "Créer une nouvelle page de catégorie" + +msgid "New blog post" +msgstr "Nouveau billet de blog" + +msgid "Create a new blog post" +msgstr "Créer un nouveau billet de blog" + +msgid "New person page" +msgstr "Nouvelle page de personne" + +msgid "Create a new person page" +msgstr "Créez une nouvelle page de personne" + +msgid "New program" +msgstr "Nouveau parcours" + +msgid "Create a new program" +msgstr "Créer un nouveau parcours" + +msgid "Admin" +msgstr "Admin" + +msgid "Inherit" +msgstr "Hériter" + +msgid "Default" +msgstr "Par défaut" + +msgid "Mini" +msgstr "Mini" + +msgid "Favorite" +msgstr "Favoris" + +msgid "Badge" +msgstr "Badge" + +msgid "Tag" +msgstr "Tag" + +msgid "Small" +msgstr "Petit" + +msgid "Large" +msgstr "Grand" + +msgid "Card" +msgstr "Carte" + +msgid "Row" +msgstr "Rangée" + +msgid "minute" +msgstr "minute" + +msgid "minutes" +msgstr "minutes" + +msgid "hour" +msgstr "heure" + +msgid "hours" +msgstr "heures" + +msgid "day" +msgstr "jour" + +msgid "days" +msgstr "jours" + +msgid "week" +msgstr "semaine" + +msgid "weeks" +msgstr "semaines" + +msgid "month" +msgstr "mois" + +msgid "months" +msgstr "mois" + +msgid "Run {:d}" +msgstr "Session {:d}" + +msgid "You can't snapshot a snapshot." +msgstr "" +"Vous ne pouvez pas faire une capture instantanée d'une capture " +"instantanée." + +msgid "You don't have sufficient permissions to snapshot this page." +msgstr "" +"Vous n'avez pas les permissions suffisantes pour faire une capture " +"instantanée de cette page." + +msgid "Archived on {now:%Y-%m-%d %H:%M:%S}" +msgstr "Archivé le {now:%Y-%m-%d %H:%M:%S}" + +msgid "{title:s} ({version!s})" +msgstr "{title:s} ({version!s})" + +msgid "blog post" +msgstr "billet de blog" + +msgid "blog posts" +msgstr "articles de blog" + +msgid "variant" +msgstr "variante" + +msgid "Optional glimpse variant for a custom look." +msgstr "Variante d'aperçu optionnelle pour un affichage personnalisé." + +msgid "blog post plugin" +msgstr "plugin de billet de blog" + +msgid "blog post plugins" +msgstr "plugins d'article de blog" + +msgid "category" +msgstr "catégorie" + +msgid "categories" +msgstr "catégories" + +msgid "category plugin" +msgstr "plugin de catégorie" + +msgid "category plugins" +msgstr "plugins de catégorie" + +msgid "enroll now" +msgstr "s’inscrire maintenant" + +msgid "study now" +msgstr "étudier maintenant" + +msgid "open for enrollment" +msgstr "ouvert à l'inscription" + +msgid "starting on" +msgstr "débute le" + +msgid "closing on" +msgstr "termine le" + +msgid "enrollment closed" +msgstr "inscription fermée" + +msgid "on-going" +msgstr "en cours" + +msgid "archived" +msgstr "archivé" + +msgid "to be scheduled" +msgstr "à programmer" + +msgid "forever open" +msgstr "toujours ouvert" + +msgid "code" +msgstr "code" + +msgid "The course time range." +msgstr "La durée du cours." + +msgid "Total amount of time to complete this course." +msgstr "Temps de travail total nécessaire pour compléter ce cours." + +msgid "is listed" +msgstr "est listé" + +msgid "Tick if you want the course to be visible on the search page." +msgstr "" +"Cochez si vous voulez que le cours soit visible sur la page de recherche." + +msgid "is self paced" +msgstr "est auto-rythmé" + +msgid "Tick if the course pace is self paced." +msgstr "Cochez si le cours est auto-rythmé" + +msgid "course" +msgstr "cours" + +msgid "courses" +msgstr "cours" + +msgid "Self paced" +msgstr "Auto-rythmé" + +msgid "~{pace:d} {effort_unit!s}/{duration_unit!s}" +msgstr "~{pace:d} {effort_unit!s}/{duration_unit!s}" + +msgid "~{pace_hours:d}h{pace_minutes:d}/{duration_unit!s}" +msgstr "~{pace_hours:d}h{pace_minutes:d}/{duration_unit!s}" + +msgid "Manual" +msgstr "Manuel" + +msgid "Synchronization to draft page" +msgstr "Synchronisation vers le brouillon de la page" + +msgid "Synchronization to public page" +msgstr "Synchronisation de la page publique" + +msgid "" +"course_and_search - show on the course page and include in search results" +msgstr "" +"cours et recherche - afficher sur la page du cours et inclure dans les " +"résultats de recherche" + +msgid "course_only - show on the course page and hide from search results" +msgstr "" +"cours seulement - afficher sur la page du cours et exclure des résultats " +"de recherche" + +msgid "hidden - hide on the course page and from search results" +msgstr "" +"caché - masquer sur la page du cours et exclure des résultats de recherche" + +msgid "" +"compact - show minimal information about the course run (only for " +"products)." +msgstr "" +"compacte - affiche des informations synthétiques sur la session " +"(uniquement pour les produits)." + +msgid "" +"detailed - show all information about the course run (only for products)." +msgstr "" +"détaillée - affiche des informations détaillées sur la session " +"(uniquement pour les produits)." + +msgid "Synchronization mode" +msgstr "Mode de synchronisation" + +msgid "resource link" +msgstr "lien de la ressource" + +msgid "course start" +msgstr "début du cours" + +msgid "course end" +msgstr "fin du cours" + +msgid "enrollment start" +msgstr "début des inscriptions" + +msgid "enrollment end" +msgstr "fin des inscriptions" + +msgid "The list of languages in which the course content is available." +msgstr "Les langues dans lesquelles le contenu du cours est disponible." + +msgid "enrollment count" +msgstr "compte des inscriptions" + +msgid "The number of enrolled students" +msgstr "Le nombre d'apprenants inscrits" + +msgid "catalog visibility" +msgstr "visibilité dans le catalogue" + +msgid "course run" +msgstr "session de cours" + +msgid "course runs" +msgstr "sessions de cours" + +msgid "title" +msgstr "titre" + +msgid "Course run translation" +msgstr "Traduction de session de cours" + +msgid "Course run translations" +msgstr "Traductions de sessions de cours" + +msgid "Empty title" +msgstr "Titre manquant" + +msgid "course plugin" +msgstr "plugin de cours" + +msgid "course plugins" +msgstr "plugins de cours" + +msgid "logo" +msgstr "logo" + +msgid "url" +msgstr "URL" + +msgid "name" +msgstr "nom" + +msgid "content" +msgstr "contenu" + +msgid "licence" +msgstr "license" + +msgid "licences" +msgstr "licences" + +msgid "Licence translation" +msgstr "Traduction des Licences" + +msgid "licence translations" +msgstr "traductions de licences" + +msgid "description" +msgstr "description" + +msgid "licence plugin" +msgstr "plugin de licence" + +msgid "licence plugins" +msgstr "plugins de licences" + +msgid "organization" +msgstr "établissement" + +msgid "organizations" +msgstr "établissements" + +msgid "organization plugin" +msgstr "plugin d'établissement" + +msgid "organization plugins" +msgstr "plugins d'établissements" + +msgid "organizations by category plugin" +msgstr "plugin d'établissements par catégorie" + +msgid "organizations by category plugins" +msgstr "plugins d'établissements par catégorie" + +msgid "person" +msgstr "personnes" + +msgid "persons" +msgstr "personnes" + +msgid "Custom bio" +msgstr "Bio adaptée" + +msgid "" +"Optional: provide a custom bio (if you leave it empty, it will display " +"the person's bio)." +msgstr "" +"Optionnel: adaptez la bio (si vous laissez le champs vide, la biographie " +"par défaut de la personne s'affichera)." + +msgid "person plugin" +msgstr "plugin de personne" + +msgid "person plugins" +msgstr "plugins de personnes" + +msgid "program" +msgstr "parcours" + +msgid "programs" +msgstr "parcours" + +msgid "program plugin" +msgstr "plugin de parcours" + +msgid "program plugins" +msgstr "plugins de parcours" + +msgid "role" +msgstr "rôle" + +msgid "" +"A role describes all the permissions that should be granted to the user " +"group." +msgstr "" +"Un rôle décrit toutes les permissions qui doivent être accordées au " +"groupe d'utilisateurs." + +msgid "page" +msgstr "page" + +msgid "Page to which this role grants permissions." +msgstr "Page à laquelle ce rôle donne des permissions." + +msgid "group" +msgstr "groupe" + +msgid "User group that this role controls." +msgstr "Groupe d'utilisateurs que ce rôle contrôle." + +msgid "filer folder" +msgstr "dossier du classeur" + +msgid "Filer folder that this role controls." +msgstr "Dossier du classeur que ce rôle contrôle." + +msgid "page role" +msgstr "rôle de page" + +msgid "page roles" +msgstr "rôles de page" + +msgid "{:s} | {:s}" +msgstr "{:s} | {:s}" + +msgid "Course page" +msgstr "Page de cours" + +msgid "Organization list" +msgstr "Liste des établissements" + +msgid "Organization page" +msgstr "Page d'établissement" + +msgid "Category list" +msgstr "Liste des Catégories" + +msgid "Category page" +msgstr "Page de catégorie" + +msgid "Blog post list" +msgstr "Liste de billet de blog" + +msgid "Blog post page" +msgstr "Page de billet de blog" + +msgid "Person page" +msgstr "Page de personne" + +msgid "Person list" +msgstr "Liste des personnes" + +msgid "Program page" +msgstr "Page de parcours" + +msgid "Program list" +msgstr "Liste des parcours" + +msgid "Search" +msgstr "Recherche" + +msgid "List of child pages" +msgstr "Liste des pages enfants" + +msgid "Homepage" +msgstr "Page d'accueil" + +msgid "Single column" +msgstr "Colonne unique" + +msgid "Three columns: (33% | 33% | 33%)" +msgstr "Trois colonnes: (33% | 33% | 33%)" + +msgid "Two columns: (50% | 50%)" +msgstr "Deux colonnes: (50% | 50%)" + +msgid "Two columns: (25% | 75%)" +msgstr "Deux colonnes: (25% | 75%)" + +msgid "Two columns: (75% | 25%)" +msgstr "Deux colonnes: (75% | 25%)" + +msgid "Footer" +msgstr "Pied de page" + +msgid "Static headline" +msgstr "Entête statique" + +msgid "Main content" +msgstr "Contenu principal" + +msgid "Secondary content" +msgstr "Deuxième contenu" + +msgid "Third content" +msgstr "Troisième contenu" + +msgid "Cover" +msgstr "Couverture" + +msgid "Catch phrase" +msgstr "Slogan" + +msgid "About the course" +msgstr "À propos du cours" + +msgid "What you will learn" +msgstr "Ce que vous allez apprendre" + +msgid "Format" +msgstr "Format" + +msgid "Prerequisites" +msgstr "Prérequis" + +msgid "Team" +msgstr "Équipe" + +msgid "Plan" +msgstr "Plan" + +msgid "Complementary information" +msgstr "Informations complémentaires" + +msgid "License for the course content" +msgstr "Licence pour le contenu du cours" + +msgid "License for the content created by course participants" +msgstr "Licence pour le contenu créé par les participants du cours" + +msgid "Categories" +msgstr "Catégories" + +msgid "Icon" +msgstr "Icône" + +msgid "Organizations" +msgstr "Établissements" + +msgid "Assessment and Certification" +msgstr "Évaluation et certification" + +msgid "Required equipment" +msgstr "Équipement requis" + +msgid "Accessibility" +msgstr "Accessibilité" + +msgid "Banner" +msgstr "Bannière" + +msgid "Logo" +msgstr "Logo" + +msgid "Description" +msgstr "Description" + +msgid "Excerpt" +msgstr "Extrait" + +msgid "Portrait" +msgstr "Portrait" + +msgid "Bio" +msgstr "Bio" + +msgid "Main Content" +msgstr "Contenu principal" + +msgid "Author" +msgstr "Auteur" + +msgid "Body" +msgstr "Corps" + +msgid "Headline" +msgstr "Entête" + +msgid "Courses" +msgstr "Cours" + +msgid "Button caesura" +msgstr "Bouton caesura" + +msgid "Full width" +msgstr "Pleine largeur" + +msgid "No categories yet." +msgstr "Pas de catégories." + +msgid "Not published yet" +msgstr "Pas encore publié" + +msgid "No author yet" +msgstr "Pas d'auteur" + +msgid "No excerpt content" +msgstr "Pas d'extrait" + +msgid "No body content" +msgstr "Pas de contenu" + +msgid "Related posts" +msgstr "Articles liés" + +msgid "Other categories of articles" +msgstr "Autres catégories d'articles" + +msgid "No associated blogposts" +msgstr "Pas de billets de blog associés" + +#, python-format +msgid "%(category_title)s - Category" +msgstr "%(category_title)s - Catégorie" + +msgid "Sub categories" +msgstr "Sous-catégories" + +msgid "Related courses" +msgstr "Cours associés" + +msgid "Courses pagination" +msgstr "Pagination des cours" + +#, python-format +msgid "" +"\n" +" See all courses related to " +"%(category_title)s\n" +" " +msgstr "" +"\n" +" Voir tous les cours liés à " +"%(category_title)s\n" +" " + +msgid "See all courses" +msgstr "Voir tous les cours" + +msgid "Related organizations" +msgstr "Établissements liés" + +msgid "Related organizations pagination" +msgstr "Pagination des établissements liés" + +msgid "Related blogposts" +msgstr "Billets de blog liés" + +msgid "Related blogposts pagination" +msgstr "Pagination des articles de blog liés" + +msgid "Related persons" +msgstr "Personnes liées" + +msgid "Related persons pagination" +msgstr "Pagination des personnes liées" + +msgid "No categories" +msgstr "Pas de catégories" + +#, python-format +msgid "%(course_title)s - Course" +msgstr "%(course_title)s - Cours" + +msgid "Ref. " +msgstr "Réf. " + +msgid "No associated categories" +msgstr "Aucune catégorie associée" + +msgid "Enter here an introduction to your course." +msgstr "Saisissez ici une introduction à votre cours." + +msgid "Duration:" +msgstr "Durée :" + +msgid "Effort:" +msgstr "Effort :" + +msgid "Pace:" +msgstr "Rythme:" + +msgid "Languages:" +msgstr "Langues:" + +#, python-format +msgid "" +"\n" +" %(count)s already " +"enrolled!\n" +" " +msgstr "" +"\n" +" %(count)s déjà " +"inscrits !\n" +" " + +msgid "" +"Add a teaser video or add a cover image below and it will be used as " +"teaser image as well." +msgstr "" +"Ajouter une vidéo de teasing ou une image de couverture ci-dessous, celle-" +"ci sera également utilisée comme image de teasing." + +msgid "course cover image" +msgstr "image de couverture du cours" + +#, python-format +msgid "" +"\n" +" Archived on %(creation_date)s\n" +" " +msgstr "" +"\n" +" Archivé le %(creation_date)s\n" +" " + +msgid "Go to current version" +msgstr "Accédez à la version actuelle" + +msgid "Glimpse cover" +msgstr "Image d'aperçu" + +msgid "Add an image for course cover on its glimpse." +msgstr "Ajouter une image pour la couverture du cours sur son aperçu." + +msgctxt "course_detail__title" +msgid "What you will learn" +msgstr "Ce que vous allez apprendre" + +msgid "At the end of this course, you will be able to:" +msgstr "À la fin de ce cours, vous saurez :" + +msgctxt "course_detail__title" +msgid "Description" +msgstr "Description" + +msgctxt "course_detail__title" +msgid "Format" +msgstr "Format" + +msgid "How is the course structured?" +msgstr "Quelle est la structure du cours ?" + +msgctxt "course_detail__title" +msgid "Prerequisites" +msgstr "Prérequis" + +msgid "What are the prerequisites to follow this course?" +msgstr "Quels sont les prérequis pour suivre ce cours ?" + +msgctxt "course_detail__title" +msgid "Required Equipment" +msgstr "Équipement requis" + +msgid "What are the required equipment to follow this course?" +msgstr "Quels sont les équipements nécessaires pour suivre ce cours ?" + +msgctxt "course_detail__title" +msgid "Assessment and certification" +msgstr "Evaluation et Certification" + +msgid "How is progress evaluated and/or certified?" +msgstr "Comment les étudiants sont ils évalués et/ou certifiés ?" + +msgctxt "course_detail__title" +msgid "Accessibility" +msgstr "Accessibilité" + +msgid "What is the accessibility of this course?" +msgstr "Quelle est l'accessibilité de ce cours ?" + +msgctxt "course_detail__title" +msgid "Course plan" +msgstr "Plan de cours" + +msgid "Enter here the detailed course plan." +msgstr "Détaillez ici le plan du cours." + +msgid "" +"\n" +" This course is part of a " +"program\n" +" " +msgid_plural "" +"\n" +" This course is part of " +"programs\n" +" " +msgstr[0] "" +"\n" +" Ce cours fait partie d'un " +"parcours\n" +" " +msgstr[1] "" +"\n" +" Ce cours fait partie de plusieurs " +"parcours\n" +" " + +msgctxt "course_detail__title" +msgid "Course team" +msgstr "Équipe pédagogique" + +msgid "Who are the teachers in the course team?" +msgstr "Qui sont les enseignants de l’équipe pédagogique ?" + +msgctxt "course_detail__title" +msgid "Organizations" +msgstr "Établissements" + +msgid "What are the organizations publishing this course?" +msgstr "Qui sont les établissements publiant ce cours ?" + +msgctxt "course_detail__title" +msgid "License" +msgstr "Licence" + +msgid "What is the license for the course content?" +msgstr "Quelle est la licence pour le contenu du cours ?" + +msgid "What is the license for the content created by course participants?" +msgstr "" +"Quelle est la licence pour le contenu créé par les participants du cours ?" + +msgid "Course code" +msgstr "Code du cours" + +msgid "Course date" +msgstr "Date du cours" + +msgid "Course team" +msgstr "Équipe pédagogique" + +msgid "License" +msgstr "Licence" + +#, python-format +msgid "" +"\n" +" A %(model)s object is missing on this %(model)s page. Please " +"select another page template.\n" +"
\n" +" If what you need is a %(model)s page, you need to create it via " +"the wizard and choose \"New %(model)s page\".\n" +" " +msgstr "" +"\n" +" Il manque un objet %(model)s sur cette page %(model)s . Veuillez " +"sélectionner un autre gabarit de page.\n" +"
\n" +" Si ce dont vous avez besoin est une page %(model)s , vous devez " +"la créer via l'assistant et choisir \"Nouvelle page %(model)s \".\n" +" " + +#, python-format +msgid "Link to the organization page of %(title)s" +msgstr "Lien vers la page de l'organisation de %(title)s" + +msgid "Main organization" +msgstr "Etablissement principal" + +msgctxt "organization_detail__title" +msgid "Related organizations" +msgstr "Établissements liés" + +msgid "Are there organizations affiliated to this organization?" +msgstr "Y a-t-il des établissements affiliés à cet établissement ?" + +msgid "Related courses pagination" +msgstr "Pagination des cours liés" + +#, python-format +msgid "" +"\n" +" See all courses related to " +"%(organization_title)s\n" +" " +msgstr "" +"\n" +" Voir tous les cours liés à " +"%(organization_title)s\n" +" " + +msgid "No organization yet" +msgstr "Pas d'établissement" + +msgid "Enter your bio here..." +msgstr "Saisissez ici votre bio..." + +#, python-format +msgid "%(title)s avatar" +msgstr "avatar de %(title)s" + +msgid "No associated organizations" +msgstr "Aucun établissement associé" + +#, python-format +msgid "" +"\n" +" See all courses related to " +"%(person_title)s\n" +" " +msgstr "" +"\n" +" Voir tous les cours liés à " +"%(person_title)s\n" +" " + +msgid "Blogposts" +msgstr "Articles de blog" + +msgid "Blogposts pagination" +msgstr "Pagination des articles de blog" + +msgid "No persons" +msgstr "Pas de personnes" + +#, python-format +msgid "%(program_title)s - Program" +msgstr "%(program_title)s - Programme" + +msgid "program cover image" +msgstr "image de couverture de parcours" + +msgid "No associated programs" +msgstr "Aucun parcours associé" + +#, python-brace-format +msgid "Run {i:d}" +msgstr "Session {i:d}" + +msgid "Regenerate search index..." +msgstr "Regénérer l'index de recherche..." + +msgid "New courses" +msgstr "Nouveaux cours" + +msgid "First session" +msgstr "Première session" + +msgid "Availability" +msgstr "Disponibilité" + +msgid "Languages" +msgstr "Langues" + +msgid "Subjects" +msgstr "Sujets" + +msgid "Levels" +msgstr "Niveaux" + +msgid "Persons" +msgstr "Personnes" + +msgid "Licences" +msgstr "Licences" + +msgid "Weekly pace" +msgstr "Rythme hebdomadaire" + +msgid "Self-paced" +msgstr "À son rythme" + +msgid "Less than one hour" +msgstr "Moins d'une heure" + +msgid "One to two hours" +msgstr "Entre une et deux heures" + +msgid "More than two hours" +msgstr "Plus de deux heures" + +msgid "Open for enrollment" +msgstr "Ouvert pour inscription" + +msgid "Coming soon" +msgstr "Bientôt" + +msgid "On-going" +msgstr "En cours" + +msgid "Archived" +msgstr "Archivé" + +msgid "Sort by configuration" +msgstr "Trier par configuration" + +msgid "Sort by facet count" +msgstr "Trier par compte de facette" + +msgid "Sort alphabetically" +msgstr "Trier par ordre alphabétique" + +msgid "You are not allowed to manage the search index." +msgstr "Vous n'êtes pas autorisé à modifier l'index de recherche." + +msgid "The search index was successfully bootstrapped" +msgstr "L'index de recherche a été initialisé avec succès" + +msgid "Glimpse" +msgstr "Aperçu" + +msgid "Link settings" +msgstr "Paramètres du lien" + +msgid "Square card" +msgstr "Carte carrée" + +msgid "Quote" +msgstr "Citation" + +msgid "Half row" +msgstr "Demi-rangée" + +msgid "Full row" +msgstr "Rangée complète" + +msgid "Variant" +msgstr "Variante" + +msgid "Form factor variant" +msgstr "Variante de facteur de forme" + +msgid "image" +msgstr "image" + +msgid "Content" +msgstr "Contenu" + +msgid "External URL" +msgstr "URL externe" + +msgid "Make the glimpse as a link with an external URL." +msgstr "Configurer l'aperçu comme un lien vers une URL externe." + +msgid "Internal URL" +msgstr "URL interne" + +msgid "Make the glimpse as a link with an internal (page) URL." +msgstr "Configurer l'aperçu comme un lien vers une URL (page) interne." + +msgid "HTML Sitemap" +msgstr "Plan de site HTML" + +msgid "" +"Press save to create a site map. You will then be able to add a child " +"plugin for each subtree in your sitemap." +msgstr "" +"Appuyez sur \"Enregistrer\" pour créer un plan de site. Vous pourrez " +"ensuite ajouter un plugin enfant pour chaque sous-arbre de votre plan de " +"site." + +msgid "HTML sitemap page" +msgstr "Page de site HTML" + +msgid "root page" +msgstr "page racine" + +msgid "" +"This page will be at the root of your sitemap (or its children if the " +"\"include root page\" flag is unticked)." +msgstr "" +"Cette page sera à la racine de votre plan de site (ou ses enfants au lieu " +"d'elle si la case \"inclure la page racine\" n'est pas sélectionnée)." + +msgid "max depth" +msgstr "profondeur maximale" + +msgid "" +"Limit the level of nesting that your sitemap will contain below this " +"page. An empty field or 0 equals to no limit." +msgstr "" +"Limitez la profondeur de votre plan de site sous cette page. Un champ " +"vide ou égal à 0 correspond à une profondeur illimitée." + +msgid "in navigation" +msgstr "dans le menu" + +msgid "" +"Tick to exclude from sitemap the pages that are excluded from navigation." +msgstr "" +"Sélectionner pour exclure du plan de site les pages qui sont exclues du " +"menu." + +msgid "include root page" +msgstr "inclure la page racine" + +msgid "" +"Tick to include the root page and its descendants. Untick to include only " +"its descendants." +msgstr "" +"Sélectionner pour inclure la page racine et ses descendants. Ne pas " +"sélectionner pour n'inclure que les descendants de la page racine." + +msgid "HTML Sitemaps" +msgstr "Plans de site HTML" + +msgid "Sitemap" +msgstr "Plan de site" + +msgid "Large Banner" +msgstr "Grande Bannière" + +msgid "Medias" +msgstr "Media" + +msgid "Hero introduction" +msgstr "Introduction" + +msgid "Compacted introduction" +msgstr "Introduction compactée" + +msgid "background image" +msgstr "image d'arrière-plan" + +msgid "Template" +msgstr "Modèle" + +msgid "Choose template to render plugin." +msgstr "Choisir un modèle pour afficher le plugin." + +msgid "Explore our catalog" +msgstr "Explorer notre catalogue" + +msgid "Search in our courses" +msgstr "Chercher dans nos cours" + +msgid "Advanced settings" +msgstr "Paramètres avancés" + +msgid "LTI consumer" +msgstr "Consommateur LTI" + +msgid "Custom provider configuration" +msgstr "Configuration manuelle du service" + +msgid "shared secret" +msgstr "secret partagé" + +msgid "" +"The url is not valid for this provider. It should be of the form \"{:s}\"." +msgstr "" +"L'url n'est pas valide pour ce service. Elle doit être de la forme \"{:" +"s}\"." + +msgid "" +"The url is not valid for this provider. It should start with \"{:s}\"." +msgstr "" +"L'url n'est pas valide pour ce service. Elle devrait commencer par \"{:" +"s}\"." + +msgid "Please choose a predefined provider, or fill fields below" +msgstr "" +"Veuillez choisir un fournisseur de service LTI prédéfini, ou remplir les " +"champs ci-dessous" + +msgid "Please choose a predefined provider above, or fill this field" +msgstr "" +"Veuillez choisir ci-dessus un fournisseur de service LTI prédéfini, ou " +"remplir ce champs" + +msgid "Please fill this field" +msgstr "Veuillez remplir ce champ" + +msgid "LTI url" +msgstr "url LTI" + +msgid "" +"For a predefined provider, leave this field empty for uploading new " +"content." +msgstr "" +"Pour un fournisseur de service LTI prédéfini, laissez ce champ vide pour " +"créer un nouveau contenu." + +msgid "Predefined LTI provider" +msgstr "Fournisseur de service LTI prédéfini" + +msgid "Please choose a predefined provider or fill fields below." +msgstr "" +"Veuillez choisir un fournisseur de service LTI prédéfini, ou remplir les " +"champs ci-dessous." + +msgid "Yes" +msgstr "Oui" + +msgid "No" +msgstr "Non" + +msgid "Nested item" +msgstr "Élément imbriqué" + +msgid "List" +msgstr "Liste" + +msgid "Plain text" +msgstr "Texte brut" + +msgid "plain text" +msgstr "texte brut" + +msgid "Section" +msgstr "Section" + +msgid "Primary scheme" +msgstr "Schéma primaire" + +msgid "Secondary scheme" +msgstr "Schéma secondaire" + +msgid "Tertiary scheme" +msgstr "Schéma tertiaire" + +msgid "Quaternary scheme" +msgstr "Schéma quaternaire" + +msgid "Quinary scheme" +msgstr "Schéma quinquénaire" + +msgid "Senary scheme" +msgstr "Schéma sexténaire" + +msgid "Septenary scheme" +msgstr "Schéma septénaire" + +msgid "Item tiles" +msgstr "Tuiles d'objets" + +msgid "None" +msgstr "Aucun" + +msgid "Optional template for custom look." +msgstr "Modèle optionnel pour un rendu personnalisé." + +msgid "Attributes" +msgstr "Attributs" + +msgid "Grid" +msgstr "Grille" + +msgid "" +"Define a Grid to use for contents, when no Grid is enable each content " +"can define its own width." +msgstr "" +"Définit une grille à utiliser pour les contenus, quand aucune grille " +"n'est activée, chaque contenu peut définir sa propre largeur." + +msgid "Grid gutter" +msgstr "Gouttière de la grille" + +msgid "Enable a gutter between content items when Grid is enabled." +msgstr "" +"Activer une gouttière entre les éléments de contenu lorsque la grille est " +"activée." + +msgid "Image" +msgstr "Image" + +msgid "Simple text" +msgstr "Texte simple" + +msgid "Transparent box" +msgstr "Boîte transparente" + +msgid "Fulfilled box" +msgstr "Boîte avec fond" + +msgid "Stroked box" +msgstr "Boîte avec bordure" + +msgid "body" +msgstr "corps" + +msgid "Box variant" +msgstr "Variante de boîte" + +msgid "Enable a themed box to enclose content." +msgstr "Utiliser une boîte stylisée pour inclure du contenu." + +#, python-format +msgid "" +"Ensure this text has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this text has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Assurez-vous que ce texte a au maximum %(limit_value)d caractères (il en " +"a %(show_value)d)." +msgstr[1] "" +"Assurez-vous que ce texte fait au maximum %(limit_value)d caractères (il " +"en a %(show_value)d)." diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ko_KR/LC_MESSAGES/django.po b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ko_KR/LC_MESSAGES/django.po new file mode 100644 index 0000000000..2cdddc65be --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ko_KR/LC_MESSAGES/django.po @@ -0,0 +1,66 @@ +msgid "" +msgstr "" +"Project-Id-Version: richie\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-31 17:41+0100\n" +"PO-Revision-Date: 2024-11-20 14:09\n" +"Last-Translator: \n" +"Language-Team: Korean\n" +"Language: ko_KR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: richie\n" +"X-Crowdin-Project-ID: 308578\n" +"X-Crowdin-Language: ko\n" +"X-Crowdin-File: backend.pot\n" +"X-Crowdin-File-ID: 32\n" + +#: newsite/settings.py:250 newsite/settings.py:260 +msgid "Dashboard" +msgstr "" + +#: newsite/settings.py:251 +msgid "{base_url:s}/dashboard/" +msgstr "" + +#: newsite/settings.py:261 +msgid "/dashboard/" +msgstr "" + +#: newsite/settings.py:264 +msgid "Teacher dashboard" +msgstr "" + +#: newsite/settings.py:265 +msgid "/dashboard/teacher" +msgstr "" + +#: newsite/settings.py:287 +msgid "Profile" +msgstr "" + +#: newsite/settings.py:288 +msgid "{base_url:s}/u/(username)" +msgstr "" + +#: newsite/settings.py:291 +msgid "Account" +msgstr "" + +#: newsite/settings.py:292 +msgid "{base_url:s}/account/settings" +msgstr "" + +#: newsite/settings.py:385 +msgid "Teaser" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "English" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "French" +msgstr "" diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/pt_PT/LC_MESSAGES/django.po b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/pt_PT/LC_MESSAGES/django.po new file mode 100644 index 0000000000..36e21afa21 --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/pt_PT/LC_MESSAGES/django.po @@ -0,0 +1,1641 @@ +msgid "" +msgstr "" +"Project-Id-Version: richie\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-31 17:41+0100\n" +"PO-Revision-Date: 2024-11-20 14:09\n" +"Last-Translator: \n" +"Language-Team: Portuguese\n" +"Language: pt_PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: richie\n" +"X-Crowdin-Project-ID: 308578\n" +"X-Crowdin-Language: pt-PT\n" +"X-Crowdin-File: backend.pot\n" +"X-Crowdin-File-ID: 32\n" + +#: newsite/settings.py:250 newsite/settings.py:260 +#, fuzzy +#| msgid "dashboard" +msgid "Dashboard" +msgstr "painel de controlo" + +#: newsite/settings.py:251 +msgid "{base_url:s}/dashboard/" +msgstr "" + +#: newsite/settings.py:261 +#, fuzzy +#| msgid "dashboard" +msgid "/dashboard/" +msgstr "painel de controlo" + +#: newsite/settings.py:264 +#, fuzzy +#| msgid "dashboard" +msgid "Teacher dashboard" +msgstr "painel de controlo" + +#: newsite/settings.py:265 +#, fuzzy +#| msgid "dashboard" +msgid "/dashboard/teacher" +msgstr "painel de controlo" + +#: newsite/settings.py:287 +msgid "Profile" +msgstr "" + +#: newsite/settings.py:288 +msgid "{base_url:s}/u/(username)" +msgstr "" + +#: newsite/settings.py:291 +#, fuzzy +#| msgid "Accordion" +msgid "Account" +msgstr "Acordeão" + +#: newsite/settings.py:292 +msgid "{base_url:s}/account/settings" +msgstr "" + +#: newsite/settings.py:385 +msgid "Teaser" +msgstr "Teaser" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "English" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "French" +msgstr "" + +msgid "Richie Plugins" +msgstr "Plugins do Richie" + +msgid "Define a duration as a number of time units" +msgstr "Defina a duração como uma unidade de tempo" + +#, python-format +msgid "%(value)s is not a valid choice for a time unit." +msgstr "%(value)s não é uma unidade de tempo válida." + +msgid "A composite duration should be a pair: number and time unit." +msgstr "Uma duração composta deve ser um par: número e unidade de tempo." + +msgid "A composite duration should be a round number of time units." +msgstr "A duração composta deve ser um valor inteiro de unidades de tempo." + +msgid "A composite duration should be positive." +msgstr "Uma duração composta deve ser positiva." + +msgid "Define an effort" +msgstr "Defina uma taxa de esforço" + +msgid "An effort should be a triplet: number, time unit and reference unit." +msgstr "" +"A taxa de esforço deve ser representada por um conjunto de três valores: " +"número, unidade de tempo e referência." + +msgid "An effort should be a round number of time units." +msgstr "A taxa de esforço deve ser um valor inteiro de unidades de tempo." + +msgid "An effort should be positive." +msgstr "A taxa de esforço deve ser positiva." + +msgid "The effort time unit should be shorter than the reference unit." +msgstr "" +"A unidade de tempo da taxa de esforço deve ser menor do que a unidade de " +"referência." + +msgid "{:s} and {:s}" +msgstr "{:s} e {:s}" + +msgid " and " +msgstr " e " + +#, python-format +msgid "You can only select up to %(limit_value)d choices." +msgstr "Só pode selecionar até %(limit_value)d escolhas." + +#, python-format +msgid "Multi select field (up to %(max_choices)s choices)" +msgstr "Caixa de seleção múltipla (até %(max_choices)s escolhas)" + +#, python-format +msgid "Value %(value)s is not a valid choice." +msgid_plural "Values %(value)s are not valid choices." +msgstr[0] "O valor %(value)s não é uma escolha válida." +msgstr[1] "Os valores %(value)s não são escolhas válidas." + +msgid "" +"Storing {:d} choices could require storing a CharField of up to {:d} " +"characters. Please reduce 'max_choices' or increase 'max_length'." +msgstr "" +"Guardar {:d} opções poderá exigir o armazenamento de um Campo de {:d} " +"caracteres. Por favor reduza 'max_choices' ou aumente 'max_length'." + +msgid "Video" +msgstr "Vídeo" + +msgid "Your browser doesn't support this video format." +msgstr "O seu navegador não suporta este formato de vídeo." + +msgid "You are here:" +msgstr "Você está aqui:" + +msgid "Skip to main content" +msgstr "Saltar para o conteúdo" + +msgid "Go to homepage" +msgstr "Ir para a página inicial" + +msgid "Menu" +msgstr "Menu" + +msgid "Contact us" +msgstr "Contacte-nos" + +msgid "Life-changing learning!" +msgstr "Aprendizagem que muda a sua vida!" + +msgid "Learn more" +msgstr "Saiba mais" + +msgid "Powered by" +msgstr "Desenvolvido por" + +msgid "This page has no child objects" +msgstr "Esta página não tem objetos filhos" + +msgid "Back to home" +msgstr "Voltar à página inicial" + +msgid "Pagination" +msgstr "Paginação" + +#, python-format +msgid "Currently reading last page %(page)s" +msgstr "A ler a última página %(page)s" + +#, python-format +msgid "Currently reading page %(page)s" +msgstr "A ler a página %(page)s" + +#, python-format +msgid "Page %(page)s" +msgstr "Página %(page)s" + +#, python-format +msgid "Previous page %(page)s" +msgstr "Página anterior %(page)s" + +#, python-format +msgid "Last page %(page)s" +msgstr "Última página %(page)s" + +#, python-format +msgid "Next page %(page)s" +msgstr "Página seguinte %(page)s" + +#, python-format +msgid "Richie news: %(title)s" +msgstr "Notícias do Richie: %(title)s" + +#, python-format +msgid "Richie news: %(title)s %(url)s" +msgstr "Notícias de Richie: %(title)s %(url)s" + +msgid "Share on Facebook" +msgstr "Partilhar no Facebook" + +msgid "Share on Twitter" +msgstr "Partilhar no Twitter" + +msgid "Share on Linkedin" +msgstr "Partilhar no Linkedin" + +msgid "Share by Email" +msgstr "Partilhar por e-mail" + +msgid "Follow a course online with Richie" +msgstr "Siga um curso online com o Richie" + +#, python-format +msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s" +msgstr "Eu acabei de me inscrever no curso \"%(title)s\" no Richie: %(url)s" + +msgid "Facebook" +msgstr "Facebook" + +msgid "Twitter page" +msgstr "Página do Twitter" + +msgid "Linkedin page" +msgstr "Página do Linkedin" + +msgid "Bad request" +msgstr "Pedido inválido" + +msgid "" +"Your query seems to be malformed. Please check your data and try again." +msgstr "" +"A sua consulta parece estar incorreta. Por favor, verifique os dados e " +"tente novamente." + +msgid "Forbidden" +msgstr "Proibido" + +msgid "You do not have the required permissions to access this resource." +msgstr "Não tem as permissões necessárias para aceder a este recurso." + +msgid "Page not found" +msgstr "Página não encontrada" + +msgid "The requested resource does not exist." +msgstr "O recurso solicitado não existe." + +msgid "Server bad request" +msgstr "Processo não permitido pelo servidor" + +msgid "Something went wrong. Please try again later." +msgstr "Ocorreu um erro. Por favor, tente novamente." + +msgid "Course could not be found." +msgstr "O curso não foi encontrado." + +msgid "See user group" +msgstr "Ver grupo de utilizadores" + +msgid "See filer folder" +msgstr "Ver pasta do arquivador" + +msgid "Organization" +msgstr "Organização" + +msgid "Organization by Category" +msgstr "Organização por Categoria" + +msgid "Category" +msgstr "Categoria" + +msgid "Course" +msgstr "Curso" + +msgid "Person" +msgstr "Pessoa" + +msgid "Licence" +msgstr "Licença" + +msgid "Post" +msgstr "Publicação" + +msgid "Program" +msgstr "Programa" + +msgid "{!s} settings" +msgstr "Definições de {!s}" + +msgid "Snapshot this page..." +msgstr "Capturar esta página..." + +msgid "" +"This will place a copy of this page as its child and move all its " +"courseruns as children of its new copy." +msgstr "" +"Isto colocará uma cópia desta página como filho e moverá todos as edições " +"do curso como filhos da sua nova cópia." + +msgid "New page" +msgstr "Nova página" + +msgid "Create a new page next to the current page." +msgstr "Criar uma nova página próxima à página atual." + +msgid "New sub page" +msgstr "Nova sub-página" + +msgid "Create a page below the current page." +msgstr "Criar uma página abaixo da página atual." + +msgid "Page title" +msgstr "Título da página" + +msgid "Title of the page in current language" +msgstr "Título da página no idioma atual" + +msgid "Page slug" +msgstr "Slug da página" + +msgid "Slug of the page in current language" +msgstr "Slug da página no idioma atual" + +msgid "" +"This slug is too long. The length of the path built by prepending the " +"slug of the parent page would be {:d} characters long and it should be " +"less than 255" +msgstr "" +"Este slug é demasiado longo. O comprimento do caminho construído teria {:" +"d} caracteres e não deveria ter mais de 255" + +msgid "This slug is already in use" +msgstr "Este slug já se encontra em utilização" + +msgid "" +"You must first create a parent page and set its `reverse_id` to `{:s}`." +msgstr "" +"Primeiro é preciso criar uma página pai e definir o `reverse_id` para `{:" +"s}`." + +msgid "Code" +msgstr "Código" + +msgid "Unique reference for the course." +msgstr "Referência única para o curso." + +msgid "New course page" +msgstr "Nova página de curso" + +msgid "Create a new course page" +msgstr "Criar uma nova página de curso" + +msgid "Unique reference for the organization." +msgstr "Referência única para a organização." + +msgid "New organization page" +msgstr "Nova página de organização" + +msgid "Create a new organization page" +msgstr "Criar uma nova página de organização" + +msgid "New category page" +msgstr "Nova página de categoria" + +msgid "Create a new category page" +msgstr "Criar uma nova página de categoria" + +msgid "New blog post" +msgstr "Nova publicação no blog" + +msgid "Create a new blog post" +msgstr "Criar uma nova publicação no blog" + +msgid "New person page" +msgstr "Nova página de pessoa" + +msgid "Create a new person page" +msgstr "Criar uma nova página de pessoa" + +msgid "New program" +msgstr "Novo programa" + +msgid "Create a new program" +msgstr "Criar um novo programa" + +msgid "Admin" +msgstr "Admin" + +msgid "Inherit" +msgstr "Herdar" + +msgid "Default" +msgstr "Predefinição" + +msgid "Mini" +msgstr "Mini" + +msgid "Favorite" +msgstr "Favorito" + +msgid "Badge" +msgstr "Emblema" + +msgid "Tag" +msgstr "Etiqueta" + +msgid "Small" +msgstr "Pequeno" + +msgid "Large" +msgstr "Grande" + +msgid "Card" +msgstr "Cartão" + +msgid "Row" +msgstr "Linha" + +msgid "minute" +msgstr "minuto" + +msgid "minutes" +msgstr "minutos" + +msgid "hour" +msgstr "hora" + +msgid "hours" +msgstr "horas" + +msgid "day" +msgstr "dia" + +msgid "days" +msgstr "dias" + +msgid "week" +msgstr "semana" + +msgid "weeks" +msgstr "semanas" + +msgid "month" +msgstr "mês" + +msgid "months" +msgstr "meses" + +msgid "Run {:d}" +msgstr "Executar {:d}" + +msgid "You can't snapshot a snapshot." +msgstr "Você não pode capturar uma captura." + +msgid "You don't have sufficient permissions to snapshot this page." +msgstr "Não tem permissões suficientes para fazer uma captura desta página." + +msgid "Archived on {now:%Y-%m-%d %H:%M:%S}" +msgstr "Arquivado em {now:%Y-%m-%d %H:%M:%S}" + +msgid "{title:s} ({version!s})" +msgstr "{title:s} ({version!s})" + +msgid "blog post" +msgstr "publicação" + +msgid "blog posts" +msgstr "publicações" + +msgid "variant" +msgstr "variante" + +msgid "Optional glimpse variant for a custom look." +msgstr "Variante de visualização personalizada." + +msgid "blog post plugin" +msgstr "plugin de publicações" + +msgid "blog post plugins" +msgstr "plugins de publicações" + +msgid "category" +msgstr "categoria" + +msgid "categories" +msgstr "categorias" + +msgid "category plugin" +msgstr "plugin de categoria" + +msgid "category plugins" +msgstr "plugins de categoria" + +msgid "enroll now" +msgstr "inscreva-se já" + +msgid "study now" +msgstr "estudar agora" + +msgid "open for enrollment" +msgstr "inscrições abertas" + +msgid "starting on" +msgstr "inicia a" + +msgid "closing on" +msgstr "encerra a" + +msgid "enrollment closed" +msgstr "inscrição encerrada" + +msgid "on-going" +msgstr "a decorrer" + +msgid "archived" +msgstr "arquivado" + +msgid "to be scheduled" +msgstr "a agendar" + +msgid "forever open" +msgstr "sempre aberto" + +msgid "code" +msgstr "código" + +msgid "The course time range." +msgstr "O intervalo de duração curso." + +msgid "Total amount of time to complete this course." +msgstr "Quantidade total de tempo para concluir este curso." + +msgid "is listed" +msgstr "está listado" + +msgid "Tick if you want the course to be visible on the search page." +msgstr "Marque se deseja que o curso esteja visível na página de pesquisa." + +msgid "is self paced" +msgstr "ao ritmo do estudante" + +msgid "Tick if the course pace is self paced." +msgstr "Marque se o curso é ao ritmo do estudante." + +msgid "course" +msgstr "curso" + +msgid "courses" +msgstr "cursos" + +msgid "Self paced" +msgstr "Ao ritmo do estudante" + +msgid "~{pace:d} {effort_unit!s}/{duration_unit!s}" +msgstr "~{pace:d} {effort_unit!s}/{duration_unit!s}" + +msgid "~{pace_hours:d}h{pace_minutes:d}/{duration_unit!s}" +msgstr "~{pace_hours:d}h{pace_minutes:d}/{duration_unit!s}" + +msgid "Manual" +msgstr "Manual" + +msgid "Synchronization to draft page" +msgstr "Sincronização com a página rascunho" + +msgid "Synchronization to public page" +msgstr "Sincronização com a página pública" + +msgid "" +"course_and_search - show on the course page and include in search results" +msgstr "" +"course_and_search - mostrar na página do curso e incluir nos resultados " +"da pesquisa" + +msgid "course_only - show on the course page and hide from search results" +msgstr "" +"course_only - mostrar na página do curso mas ocultar nos resultados de " +"pesquisa" + +msgid "hidden - hide on the course page and from search results" +msgstr "hidden - ocultar na página de curso e nos resultados de pesquisa" + +msgid "" +"compact - show minimal information about the course run (only for " +"products)." +msgstr "" +"compacto - mostra informação mínima sobre a edição do curso (só para " +"produtos)." + +msgid "" +"detailed - show all information about the course run (only for products)." +msgstr "" +"detalhado - mostra toda a informação sobre a edição do curso (só para " +"produtos)." + +msgid "Synchronization mode" +msgstr "Modo de sincronização" + +msgid "resource link" +msgstr "link do recurso" + +msgid "course start" +msgstr "início do curso" + +msgid "course end" +msgstr "fim do curso" + +msgid "enrollment start" +msgstr "início das inscrições" + +msgid "enrollment end" +msgstr "fim das inscrições" + +msgid "The list of languages in which the course content is available." +msgstr "Lista de idiomas em que o conteúdo do curso está disponível." + +msgid "enrollment count" +msgstr "número de inscrições" + +msgid "The number of enrolled students" +msgstr "O número de alunos inscritos" + +msgid "catalog visibility" +msgstr "visibilidade no catálogo" + +msgid "course run" +msgstr "edição do curso" + +msgid "course runs" +msgstr "edições do curso" + +msgid "title" +msgstr "título" + +msgid "Course run translation" +msgstr "Tradução da edição do curso" + +msgid "Course run translations" +msgstr "Traduções da edição do curso" + +msgid "Empty title" +msgstr "Título em branco" + +msgid "course plugin" +msgstr "plugin do curso" + +msgid "course plugins" +msgstr "plugins do curso" + +msgid "logo" +msgstr "logotipo" + +msgid "url" +msgstr "url" + +msgid "name" +msgstr "nome" + +msgid "content" +msgstr "conteúdo" + +msgid "licence" +msgstr "licença" + +msgid "licences" +msgstr "licenças" + +msgid "Licence translation" +msgstr "Tradução da licença" + +msgid "licence translations" +msgstr "traduções da licença" + +msgid "description" +msgstr "descrição" + +msgid "licence plugin" +msgstr "plugin da licença" + +msgid "licence plugins" +msgstr "plugins de licença" + +msgid "organization" +msgstr "organização" + +msgid "organizations" +msgstr "organizações" + +msgid "organization plugin" +msgstr "plugin da organização" + +msgid "organization plugins" +msgstr "plugins da organização" + +msgid "organizations by category plugin" +msgstr "plugin de organizações por categoria" + +msgid "organizations by category plugins" +msgstr "plugins de organizações por categoria" + +msgid "person" +msgstr "pessoa" + +msgid "persons" +msgstr "pessoas" + +msgid "Custom bio" +msgstr "Biografia personalizada" + +msgid "" +"Optional: provide a custom bio (if you leave it empty, it will display " +"the person's bio)." +msgstr "" +"Opcional: fornecer uma biografia personalizada (caso a deixe vazia, ela " +"exibirá a bio)." + +msgid "person plugin" +msgstr "plugin de pessoa" + +msgid "person plugins" +msgstr "plugins de pessoa" + +msgid "program" +msgstr "programa" + +msgid "programs" +msgstr "programas" + +msgid "program plugin" +msgstr "plugin do programa" + +msgid "program plugins" +msgstr "plugins do programa" + +msgid "role" +msgstr "papel" + +msgid "" +"A role describes all the permissions that should be granted to the user " +"group." +msgstr "" +"Um papel descreve todas as permissões dadas a um grupo de utilizadores." + +msgid "page" +msgstr "página" + +msgid "Page to which this role grants permissions." +msgstr "Página à qual este papel concede permissões." + +msgid "group" +msgstr "grupo" + +msgid "User group that this role controls." +msgstr "Grupo de utilizadores controlado por este papel." + +msgid "filer folder" +msgstr "pasta do arquivador" + +msgid "Filer folder that this role controls." +msgstr "Pasta do arquivador controlada por este papel." + +msgid "page role" +msgstr "papel da página" + +msgid "page roles" +msgstr "papéis de página" + +msgid "{:s} | {:s}" +msgstr "{:s} | {:s}" + +msgid "Course page" +msgstr "Página do curso" + +msgid "Organization list" +msgstr "Lista de organizações" + +msgid "Organization page" +msgstr "Página da organização" + +msgid "Category list" +msgstr "Lista de categorias" + +msgid "Category page" +msgstr "Página de categorias" + +msgid "Blog post list" +msgstr "Lista de publicações" + +msgid "Blog post page" +msgstr "Página de publicação" + +msgid "Person page" +msgstr "Página da pessoa" + +msgid "Person list" +msgstr "Lista de pessoas" + +msgid "Program page" +msgstr "Página de programa" + +msgid "Program list" +msgstr "Lista de programas" + +msgid "Search" +msgstr "Pesquisar" + +msgid "List of child pages" +msgstr "Lista de páginas filhas" + +msgid "Homepage" +msgstr "Página inicial" + +msgid "Single column" +msgstr "Coluna única" + +msgid "Three columns: (33% | 33% | 33%)" +msgstr "Três colunas: (33% | 33% | 33%)" + +msgid "Two columns: (50% | 50%)" +msgstr "Duas colunas: (50% | 50%)" + +msgid "Two columns: (25% | 75%)" +msgstr "Duas colunas: (25% | 75%)" + +msgid "Two columns: (75% | 25%)" +msgstr "Duas colunas: (75% | 25%)" + +msgid "Footer" +msgstr "Rodapé" + +msgid "Static headline" +msgstr "Cabeçalho estático" + +msgid "Main content" +msgstr "Conteúdo principal" + +msgid "Secondary content" +msgstr "Conteúdo secundário" + +msgid "Third content" +msgstr "Conteúdo terciário" + +msgid "Cover" +msgstr "Capa" + +msgid "Catch phrase" +msgstr "Frase-chave" + +msgid "About the course" +msgstr "Sobre o curso" + +msgid "What you will learn" +msgstr "O que vai aprender" + +msgid "Format" +msgstr "Formato" + +msgid "Prerequisites" +msgstr "Pré-requisitos" + +msgid "Team" +msgstr "Equipa" + +msgid "Plan" +msgstr "Plano" + +msgid "Complementary information" +msgstr "Informação complementar" + +msgid "License for the course content" +msgstr "Licença para o conteúdo do curso" + +msgid "License for the content created by course participants" +msgstr "Licença para o conteúdo criado pelos participantes do curso" + +msgid "Categories" +msgstr "Categorias" + +msgid "Icon" +msgstr "Ícone" + +msgid "Organizations" +msgstr "Organizações" + +msgid "Assessment and Certification" +msgstr "Avaliação e Certificação" + +msgid "Required equipment" +msgstr "Equipamento necessário" + +msgid "Accessibility" +msgstr "Acessibilidade" + +msgid "Banner" +msgstr "Banner" + +msgid "Logo" +msgstr "Logo" + +msgid "Description" +msgstr "Descrição" + +msgid "Excerpt" +msgstr "Excerto" + +msgid "Portrait" +msgstr "Retrato" + +msgid "Bio" +msgstr "Bio" + +msgid "Main Content" +msgstr "Conteúdo Principal" + +msgid "Author" +msgstr "Autor" + +msgid "Body" +msgstr "Conteúdo" + +msgid "Headline" +msgstr "Título" + +msgid "Courses" +msgstr "Cursos" + +msgid "Button caesura" +msgstr "Botão de quebra de secção" + +msgid "Full width" +msgstr "Largura total" + +msgid "No categories yet." +msgstr "Não existem categorias." + +msgid "Not published yet" +msgstr "Não publicado" + +msgid "No author yet" +msgstr "Nenhum autor" + +msgid "No excerpt content" +msgstr "Sem conteúdo no excerto" + +msgid "No body content" +msgstr "Sem conteúdo de corpo de texto" + +msgid "Related posts" +msgstr "Publicações relacionadas" + +msgid "Other categories of articles" +msgstr "Outras categorias de artigos" + +msgid "No associated blogposts" +msgstr "Não existem publicações associadas" + +#, python-format +msgid "%(category_title)s - Category" +msgstr "%(category_title)s - Categoria" + +msgid "Sub categories" +msgstr "Subcategorias" + +msgid "Related courses" +msgstr "Cursos relacionados" + +msgid "Courses pagination" +msgstr "Paginação de cursos" + +#, python-format +msgid "" +"\n" +" See all courses related to " +"%(category_title)s\n" +" " +msgstr "" +"\n" +" Ver todos os cursos " +"relacionados com %(category_title)s\n" +" " + +msgid "See all courses" +msgstr "Ver todos os cursos" + +msgid "Related organizations" +msgstr "Organizações relacionadas" + +msgid "Related organizations pagination" +msgstr "Paginação de organizações relacionadas" + +msgid "Related blogposts" +msgstr "Publicações relacionadas" + +msgid "Related blogposts pagination" +msgstr "Página de posts de blog relacionados" + +msgid "Related persons" +msgstr "Pessoas relacionadas" + +msgid "Related persons pagination" +msgstr "Paginação de pessoas relacionadas" + +msgid "No categories" +msgstr "Sem categorias" + +#, python-format +msgid "%(course_title)s - Course" +msgstr "%(course_title)s - Curso" + +msgid "Ref. " +msgstr "Cód. " + +msgid "No associated categories" +msgstr "Nenhuma categoria associada" + +msgid "Enter here an introduction to your course." +msgstr "Escreva um texto introdutório para o curso." + +msgid "Duration:" +msgstr "Duração:" + +msgid "Effort:" +msgstr "Esforço:" + +msgid "Pace:" +msgstr "Ritmo:" + +msgid "Languages:" +msgstr "Idiomas:" + +#, python-format +msgid "" +"\n" +" %(count)s already " +"enrolled!\n" +" " +msgstr "" +"\n" +" %(count)s já " +"inscritos!\n" +" " + +msgid "" +"Add a teaser video or add a cover image below and it will be used as " +"teaser image as well." +msgstr "" +"Adicione um vídeo ou uma imagem de capa abaixo e será utilizada como " +"imagem de teaser." + +msgid "course cover image" +msgstr "imagem de capa do curso" + +#, python-format +msgid "" +"\n" +" Archived on %(creation_date)s\n" +" " +msgstr "" +"\n" +" Arquivado em %(creation_date)s\n" +" " + +msgid "Go to current version" +msgstr "Ir para a versão atual" + +msgid "Glimpse cover" +msgstr "Capa da perspectiva" + +msgid "Add an image for course cover on its glimpse." +msgstr "Adicione uma imagem para a capa do curso na perspectiva." + +msgctxt "course_detail__title" +msgid "What you will learn" +msgstr "O que vai aprender" + +msgid "At the end of this course, you will be able to:" +msgstr "No final deste curso, será capaz de:" + +msgctxt "course_detail__title" +msgid "Description" +msgstr "Descrição" + +msgctxt "course_detail__title" +msgid "Format" +msgstr "Formato" + +msgid "How is the course structured?" +msgstr "Como está estruturado o curso?" + +msgctxt "course_detail__title" +msgid "Prerequisites" +msgstr "Pré-requisitos" + +msgid "What are the prerequisites to follow this course?" +msgstr "Quais são os pré-requisitos para este curso?" + +msgctxt "course_detail__title" +msgid "Required Equipment" +msgstr "Equipamento Necessário" + +msgid "What are the required equipment to follow this course?" +msgstr "Quais são os equipamentos necessários para frequentar este curso?" + +msgctxt "course_detail__title" +msgid "Assessment and certification" +msgstr "Avaliação e certificação" + +msgid "How is progress evaluated and/or certified?" +msgstr "Como é avaliado o progresso e/ou certificado?" + +msgctxt "course_detail__title" +msgid "Accessibility" +msgstr "Acessibilidade" + +msgid "What is the accessibility of this course?" +msgstr "Qual é a acessibilidade deste curso?" + +msgctxt "course_detail__title" +msgid "Course plan" +msgstr "Plano de curso" + +msgid "Enter here the detailed course plan." +msgstr "Descreva aqui o plano detalhado do curso." + +msgid "" +"\n" +" This course is part of a " +"program\n" +" " +msgid_plural "" +"\n" +" This course is part of " +"programs\n" +" " +msgstr[0] "" +"\n" +" Este curso faz parte de um " +"programa\n" +" " +msgstr[1] "" +"\n" +" Este curso faz parte de " +"programas\n" +" " + +msgctxt "course_detail__title" +msgid "Course team" +msgstr "Equipa do curso" + +msgid "Who are the teachers in the course team?" +msgstr "Quem são os professores da equipa do curso?" + +msgctxt "course_detail__title" +msgid "Organizations" +msgstr "Organizações" + +msgid "What are the organizations publishing this course?" +msgstr "Quem são as organizações responsáveis por este curso?" + +msgctxt "course_detail__title" +msgid "License" +msgstr "Licença" + +msgid "What is the license for the course content?" +msgstr "Qual é a licença para o conteúdo do curso?" + +msgid "What is the license for the content created by course participants?" +msgstr "" +"Qual é a licença para o conteúdo criado pelos participantes do curso?" + +msgid "Course code" +msgstr "Código do curso" + +msgid "Course date" +msgstr "Data do curso" + +msgid "Course team" +msgstr "Equipa do curso" + +msgid "License" +msgstr "Licença" + +#, python-format +msgid "" +"\n" +" A %(model)s object is missing on this %(model)s page. Please " +"select another page template.\n" +"
\n" +" If what you need is a %(model)s page, you need to create it via " +"the wizard and choose \"New %(model)s page\".\n" +" " +msgstr "" +"\n" +" Um objeto %(model)s está em falta nesta página %(model)s. Por " +"favor, selecione outro modelo de página.\n" +"
\n" +" Se o que precisa é de uma página de %(model)s deve criá-la " +"através do assistente, escolhendo \"Nova página %(model)s.\n" +" " + +msgid "Main organization" +msgstr "Organização principal" + +msgctxt "organization_detail__title" +msgid "Related organizations" +msgstr "Organizações relacionadas" + +msgid "Are there organizations affiliated to this organization?" +msgstr "Existem organizações afiliadas a esta organização?" + +msgid "Related courses pagination" +msgstr "Paginação de cursos relacionados" + +#, python-format +msgid "" +"\n" +" See all courses related to " +"%(organization_title)s\n" +" " +msgstr "" +"\n" +" Ver todos os cursos " +"relacionados com %(organization_title)s\n" +" " + +msgid "No organization yet" +msgstr "Nenhuma organização disponível" + +msgid "Enter your bio here..." +msgstr "Insira a sua biografia aqui..." + +#, python-format +msgid "%(title)s avatar" +msgstr "avatar de %(title)s" + +msgid "No associated organizations" +msgstr "Nenhuma organização associada" + +#, python-format +msgid "" +"\n" +" See all courses related to " +"%(person_title)s\n" +" " +msgstr "" +"\n" +" Ver todos os cursos " +"relacionados com %(person_title)s\n" +" " + +msgid "Blogposts" +msgstr "Publicações" + +msgid "Blogposts pagination" +msgstr "Paginação de posts de blog" + +msgid "No persons" +msgstr "Sem pessoas" + +#, python-format +msgid "%(program_title)s - Program" +msgstr "%(program_title)s - Programa" + +msgid "program cover image" +msgstr "imagem de capa do programa" + +msgid "No associated programs" +msgstr "Sem programas associados" + +#, python-brace-format +msgid "Run {i:d}" +msgstr "Executar {i:d}" + +msgid "Regenerate search index..." +msgstr "Regenerar índice de pesquisa..." + +msgid "New courses" +msgstr "Novos cursos" + +msgid "First session" +msgstr "Primeira sessão" + +msgid "Availability" +msgstr "Disponibilidade" + +msgid "Languages" +msgstr "Idiomas" + +msgid "Subjects" +msgstr "Temas" + +msgid "Levels" +msgstr "Níveis" + +msgid "Persons" +msgstr "Pessoas" + +msgid "Licences" +msgstr "Licenças" + +msgid "Weekly pace" +msgstr "Ritmo semanal" + +msgid "Self-paced" +msgstr "Ao ritmo do estudante" + +msgid "Less than one hour" +msgstr "Menos de uma hora" + +msgid "One to two hours" +msgstr "Uma a duas horas" + +msgid "More than two hours" +msgstr "Mais de duas horas" + +msgid "Open for enrollment" +msgstr "Inscrições abertas" + +msgid "Coming soon" +msgstr "Brevemente" + +msgid "On-going" +msgstr "A decorrer" + +msgid "Archived" +msgstr "Arquivado" + +msgid "Sort by configuration" +msgstr "Ordenar por configuração" + +msgid "Sort by facet count" +msgstr "Ordenar por quantidade de facetas" + +msgid "Sort alphabetically" +msgstr "Ordenar alfabeticamente" + +msgid "You are not allowed to manage the search index." +msgstr "Não tem permissões para gerir o índice de pesquisa." + +msgid "The search index was successfully bootstrapped" +msgstr "O índice de pesquisa foi iniciado com sucesso" + +msgid "Glimpse" +msgstr "Perspectiva" + +msgid "Link settings" +msgstr "Configurações de hiperligação" + +msgid "Square card" +msgstr "Cartão quadrado" + +msgid "Quote" +msgstr "Citação" + +msgid "Half row" +msgstr "Meia linha" + +msgid "Full row" +msgstr "Linha completa" + +msgid "Variant" +msgstr "Variante" + +msgid "Form factor variant" +msgstr "Variante do formulário" + +msgid "image" +msgstr "imagem" + +msgid "Content" +msgstr "Conteúdo" + +msgid "External URL" +msgstr "URL Externo" + +msgid "Make the glimpse as a link with an external URL." +msgstr "Tornar a perspectiva como um link para um URL externo." + +msgid "Internal URL" +msgstr "URL Interno" + +msgid "Make the glimpse as a link with an internal (page) URL." +msgstr "Tornar a perspectiva como um link para um URL interno (página)." + +msgid "HTML Sitemap" +msgstr "Mapa do Site HTML" + +msgid "" +"Press save to create a site map. You will then be able to add a child " +"plugin for each subtree in your sitemap." +msgstr "" +"Carregue em gravar para criar um mapa do site. Será depois possível " +"adicionar um plugin filho para cada ramo do mapa do site." + +msgid "HTML sitemap page" +msgstr "Página do mapa do site HTML" + +msgid "root page" +msgstr "página inicial" + +msgid "" +"This page will be at the root of your sitemap (or its children if the " +"\"include root page\" flag is unticked)." +msgstr "" +"Esta página estará na raiz do seu mapa do site (ou filhos, se a opção " +"\"incluir página principal\" não estiver marcada)." + +msgid "max depth" +msgstr "profundidade máxima" + +msgid "" +"Limit the level of nesting that your sitemap will contain below this " +"page. An empty field or 0 equals to no limit." +msgstr "" +"Limitar o nível de profundidade que o mapa do site terá abaixo desta " +"página. Um campo vazio ou 0 é igual a nenhum limite." + +msgid "in navigation" +msgstr "na navegação" + +msgid "" +"Tick to exclude from sitemap the pages that are excluded from navigation." +msgstr "" +"Marque para excluir do mapa do site as páginas que estão excluídas da " +"navegação." + +msgid "include root page" +msgstr "incluir página principal" + +msgid "" +"Tick to include the root page and its descendants. Untick to include only " +"its descendants." +msgstr "" +"Marque para incluir a página principal e seus descendentes. Desmarque " +"para incluir apenas seus descendentes." + +msgid "HTML Sitemaps" +msgstr "Mapa do Site HTML" + +msgid "Sitemap" +msgstr "Mapa do site" + +msgid "Large Banner" +msgstr "Banner Grande" + +msgid "Medias" +msgstr "Multimédia" + +msgid "Hero introduction" +msgstr "Introdução do Hero" + +msgid "Compacted introduction" +msgstr "Introdução compactada" + +msgid "background image" +msgstr "imagem de fundo" + +msgid "Template" +msgstr "Modelo" + +msgid "Choose template to render plugin." +msgstr "Escolha o modelo para renderizar o plugin." + +msgid "Explore our catalog" +msgstr "Explore o nosso catálogo" + +msgid "Search in our courses" +msgstr "Pesquisar nos cursos" + +msgid "Advanced settings" +msgstr "Definições avançadas" + +msgid "LTI consumer" +msgstr "Cliente LTI" + +msgid "Custom provider configuration" +msgstr "Configuração de fornecedor personalizado" + +msgid "shared secret" +msgstr "segredo partilhado" + +msgid "" +"The url is not valid for this provider. It should be of the form \"{:s}\"." +msgstr "" +"A url não é válida para este fornecedor. Deve ser no formato \"{:s}\"." + +msgid "" +"The url is not valid for this provider. It should start with \"{:s}\"." +msgstr "A url não é válida para este fornecedor. Deve começar com \"{:s}\"." + +msgid "Please choose a predefined provider, or fill fields below" +msgstr "" +"Por favor, escolha um fornecedor predefinido, ou preencha os campos abaixo" + +msgid "Please choose a predefined provider above, or fill this field" +msgstr "" +"Por favor, escolha um fornecedor predefinido acima, ou preencha este campo" + +msgid "Please fill this field" +msgstr "Preencha este campo" + +msgid "LTI url" +msgstr "LTI url" + +msgid "" +"For a predefined provider, leave this field empty for uploading new " +"content." +msgstr "" +"Para um fornecedor predefinido, deixe este campo vazio para carregar um " +"novo conteúdo." + +msgid "Predefined LTI provider" +msgstr "Fornecedor de LTI predefinido" + +msgid "Please choose a predefined provider or fill fields below." +msgstr "" +"Por favor, escolha um fornecedor predefinido ou preencha os campos abaixo." + +msgid "Yes" +msgstr "Sim" + +msgid "No" +msgstr "Não" + +msgid "Nested item" +msgstr "Item agrupado" + +msgid "List" +msgstr "Lista" + +msgid "Plain text" +msgstr "Texto simples" + +msgid "plain text" +msgstr "texto simples" + +msgid "Section" +msgstr "Secção" + +msgid "Primary scheme" +msgstr "Esquema principal" + +msgid "Secondary scheme" +msgstr "Esquema secundário" + +msgid "Tertiary scheme" +msgstr "Esquema terciário" + +msgid "Quaternary scheme" +msgstr "Esquema quaternário" + +msgid "Quinary scheme" +msgstr "Esquema quinário" + +msgid "Senary scheme" +msgstr "Esquema senário" + +msgid "Septenary scheme" +msgstr "Esquema setenário" + +msgid "Item tiles" +msgstr "Blocos do item" + +msgid "None" +msgstr "Nenhum" + +msgid "Optional template for custom look." +msgstr "Modelo opcional para aparência personalizada." + +msgid "Attributes" +msgstr "Atributos" + +msgid "Grid" +msgstr "Grelha" + +msgid "" +"Define a Grid to use for contents, when no Grid is enable each content " +"can define its own width." +msgstr "" +"Definir uma grelha a utilizar para os conteúdos, quando não é ativada uma " +"grelha cada conteúdo pode definir a sua própria largura." + +msgid "Grid gutter" +msgstr "Calha da grelha" + +msgid "Enable a gutter between content items when Grid is enabled." +msgstr "" +"Ativar uma calha entre itens de conteúdo quando a Grelha está ativada." + +msgid "Image" +msgstr "Imagem" + +msgid "Simple text" +msgstr "Texto simples" + +msgid "Transparent box" +msgstr "Caixa transparente" + +msgid "Fulfilled box" +msgstr "Caixa preenchida" + +msgid "Stroked box" +msgstr "Caixa de destacada" + +msgid "body" +msgstr "corpo" + +msgid "Box variant" +msgstr "Variante de caixa" + +msgid "Enable a themed box to enclose content." +msgstr "Ativar uma caixa temática para incluir conteúdo." + +#, python-format +msgid "" +"Ensure this text has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this text has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Certifique-se de que o texto tem no máximo %(limit_value)d caracter (está " +"com %(show_value)d)." +msgstr[1] "" +"Certifique-se de que o texto tem no máximo %(limit_value)d caracteres " +"(está com %(show_value)d)." diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ru_RU/LC_MESSAGES/django.po b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ru_RU/LC_MESSAGES/django.po new file mode 100644 index 0000000000..bae2023e65 --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/ru_RU/LC_MESSAGES/django.po @@ -0,0 +1,1495 @@ +msgid "" +msgstr "" +"Project-Id-Version: richie\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-31 17:41+0100\n" +"PO-Revision-Date: 2024-11-20 14:09\n" +"Last-Translator: \n" +"Language-Team: Russian\n" +"Language: ru_RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 " +"&& n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 " +"&& n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: richie\n" +"X-Crowdin-Project-ID: 308578\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: backend.pot\n" +"X-Crowdin-File-ID: 32\n" + +#: newsite/settings.py:250 newsite/settings.py:260 +#, fuzzy +#| msgid "dashboard" +msgid "Dashboard" +msgstr "панель управления" + +#: newsite/settings.py:251 +msgid "{base_url:s}/dashboard/" +msgstr "" + +#: newsite/settings.py:261 +#, fuzzy +#| msgid "dashboard" +msgid "/dashboard/" +msgstr "панель управления" + +#: newsite/settings.py:264 +#, fuzzy +#| msgid "dashboard" +msgid "Teacher dashboard" +msgstr "панель управления" + +#: newsite/settings.py:265 +#, fuzzy +#| msgid "dashboard" +msgid "/dashboard/teacher" +msgstr "панель управления" + +#: newsite/settings.py:287 +msgid "Profile" +msgstr "" + +#: newsite/settings.py:288 +msgid "{base_url:s}/u/(username)" +msgstr "" + +#: newsite/settings.py:291 +#, fuzzy +#| msgid "Accordion" +msgid "Account" +msgstr "Аккордеон" + +#: newsite/settings.py:292 +msgid "{base_url:s}/account/settings" +msgstr "" + +#: newsite/settings.py:385 +msgid "Teaser" +msgstr "Тизер" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "English" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "French" +msgstr "" + +msgid "Richie Plugins" +msgstr "Плагины Richie" + +msgid "Define a duration as a number of time units" +msgstr "Определить длительность как количество единиц времени" + +#, python-format +msgid "%(value)s is not a valid choice for a time unit." +msgstr "%(value)s - недопустимый выбор единицы времени." + +msgid "A composite duration should be a pair: number and time unit." +msgstr "Составная длительность должна быть парой: число и единица времени." + +msgid "A composite duration should be a round number of time units." +msgstr "" +"Составная продолжительность должна представлять собой круглое число " +"единиц времени." + +msgid "A composite duration should be positive." +msgstr "Составная продолжительность должна быть положительной." + +msgid "Define an effort" +msgstr "Определить усилия" + +msgid "An effort should be a triplet: number, time unit and reference unit." +msgstr "" +"Усилие должно быть триплетом: число, единица времени и единица отсчета." + +msgid "An effort should be a round number of time units." +msgstr "Усилие должно представлять собой круглое число единиц времени." + +msgid "An effort should be positive." +msgstr "Усилие должно быть положительным." + +msgid "The effort time unit should be shorter than the reference unit." +msgstr "Единица времени усилия должна быть короче, чем единица отсчета." + +msgid "{:s} and {:s}" +msgstr "{:s} и {:s}" + +msgid " and " +msgstr " и " + +#, python-format +msgid "You can only select up to %(limit_value)d choices." +msgstr "Вы можете выбрать только %(limit_value)d вариантов." + +#, python-format +msgid "Multi select field (up to %(max_choices)s choices)" +msgstr "Поле множественного выбора (до %(max_choices)s вариантов)" + +#, python-format +msgid "Value %(value)s is not a valid choice." +msgid_plural "Values %(value)s are not valid choices." +msgstr[0] "Значение %(value)s не является допустимым вариантом." +msgstr[1] "Значения %(value)s не являются допустимыми вариантами." +msgstr[2] "Значения %(value)s не являются допустимыми вариантами." +msgstr[3] "Значения %(value)s не являются допустимыми вариантами." + +msgid "" +"Storing {:d} choices could require storing a CharField of up to {:d} " +"characters. Please reduce 'max_choices' or increase 'max_length'." +msgstr "" +"Хранение {:d} вариантов может потребовать хранения CharField размером до " +"{:d} символов. Уменьшите значение 'max_choices' или увеличьте значение " +"'max_length'." + +msgid "Video" +msgstr "Видео" + +msgid "Your browser doesn't support this video format." +msgstr "Ваш браузер не поддерживает этот формат видео." + +msgid "You are here:" +msgstr "Вы находитесь здесь:" + +msgid "Skip to main content" +msgstr "Перейти к основному содержимому" + +msgid "Go to homepage" +msgstr "Вернуться на главную страницу" + +msgid "Menu" +msgstr "Меню" + +msgid "Contact us" +msgstr "Свяжитесь с нами" + +msgid "Life-changing learning!" +msgstr "Обучение, меняющее жизнь!" + +msgid "Learn more" +msgstr "Узнать больше" + +msgid "Powered by" +msgstr "Работает на" + +msgid "This page has no child objects" +msgstr "У этой страницы нет дочерних объектов" + +msgid "Back to home" +msgstr "Вернуться на главную" + +msgid "Pagination" +msgstr "Постраничная навигация" + +#, python-format +msgid "Currently reading last page %(page)s" +msgstr "В настоящее время чтение последней страницы %(page)s" + +#, python-format +msgid "Currently reading page %(page)s" +msgstr "Сейчас чтение страницы %(page)s" + +#, python-format +msgid "Page %(page)s" +msgstr "Страница %(page)s" + +#, python-format +msgid "Previous page %(page)s" +msgstr "Предыдущая страница %(page)s" + +#, python-format +msgid "Last page %(page)s" +msgstr "Последняя страница %(page)s" + +#, python-format +msgid "Next page %(page)s" +msgstr "Следующая страница %(page)s" + +#, python-format +msgid "Richie news: %(title)s" +msgstr "Новости Richie: %(title)s" + +#, python-format +msgid "Richie news: %(title)s %(url)s" +msgstr "Новости Richie: %(title)s %(url)s" + +msgid "Share on Facebook" +msgstr "Поделитесь на Facebook" + +msgid "Share on Twitter" +msgstr "Поделиться через Twitter" + +msgid "Share on Linkedin" +msgstr "Поделиться на LinkedIn" + +msgid "Share by Email" +msgstr "Поделиться по электронной почте" + +msgid "Follow a course online with Richie" +msgstr "Пройдите курс обучения онлайн вместе с Richie" + +#, python-format +msgid "I just enrolled to the course \"%(title)s\" on Richie: %(url)s" +msgstr "Я записался на курс \"%(title)s\" на Richie\": %(url)s" + +msgid "Facebook" +msgstr "Facebook" + +msgid "Twitter page" +msgstr "Страничка Twitter" + +msgid "Linkedin page" +msgstr "Linkedin" + +msgid "Bad request" +msgstr "Неверный запрос" + +msgid "" +"Your query seems to be malformed. Please check your data and try again." +msgstr "" +"Похоже, ваш запрос имеет неправильный формат. Пожалуйста, проверьте ваши " +"данные и повторите попытку." + +msgid "Forbidden" +msgstr "Доступ запрещен" + +msgid "You do not have the required permissions to access this resource." +msgstr "У вас нет требуемых прав для доступа к этому ресурсу." + +msgid "Page not found" +msgstr "Страница не найдена" + +msgid "The requested resource does not exist." +msgstr "Запрошенный ресурс не существует." + +msgid "Server bad request" +msgstr "Неверный запрос сервера" + +msgid "Something went wrong. Please try again later." +msgstr "Что-то пошло не так. Пожалуйста, попробуйте позже." + +msgid "Course could not be found." +msgstr "Курс не может быть найден." + +msgid "See user group" +msgstr "Посмотреть группу пользователей" + +msgid "See filer folder" +msgstr "Смотреть папку filer" + +msgid "Organization" +msgstr "Организация" + +msgid "Organization by Category" +msgstr "Организация по категориям" + +msgid "Category" +msgstr "Категория" + +msgid "Course" +msgstr "Курс" + +msgid "Person" +msgstr "Человек" + +msgid "Licence" +msgstr "Лицензия" + +msgid "Post" +msgstr "Пост" + +msgid "Program" +msgstr "Программа" + +msgid "{!s} settings" +msgstr "Настройки {!s}" + +msgid "Snapshot this page..." +msgstr "Снимок этой страницы..." + +msgid "" +"This will place a copy of this page as its child and move all its " +"courseruns as children of its new copy." +msgstr "" +"Это поместит копию этой страницы в качестве ее дочерней и переместит все " +"её этапы курса в качестве дочерних для ее новой копии." + +msgid "New page" +msgstr "Новая страница" + +msgid "Create a new page next to the current page." +msgstr "Создать новую страницу рядом с текущей страницей." + +msgid "New sub page" +msgstr "Новая подстраница" + +msgid "Create a page below the current page." +msgstr "Создайте страницу под текущей страницей." + +msgid "Page title" +msgstr "Заголовок страницы" + +msgid "Title of the page in current language" +msgstr "Заголовок страницы на текущем языке" + +msgid "Page slug" +msgstr "Slug страницы" + +msgid "Slug of the page in current language" +msgstr "Slug страницы на текущем языке" + +msgid "" +"This slug is too long. The length of the path built by prepending the " +"slug of the parent page would be {:d} characters long and it should be " +"less than 255" +msgstr "" +"Этот slug слишком длинный. Длина пути, созданного в ожидании slug " +"родительской страницы, будет равна {:d} символам, и она должна быть " +"меньше 255" + +msgid "This slug is already in use" +msgstr "Этот slug уже используется" + +msgid "" +"You must first create a parent page and set its `reverse_id` to `{:s}`." +msgstr "" +"Сначала вы должны создать родительскую страницу и установить `reverse_id` " +"в `{:s}`." + +msgid "Code" +msgstr "Код" + +msgid "Unique reference for the course." +msgstr "Уникальная ссылка на курс." + +msgid "New course page" +msgstr "Новая страница курса" + +msgid "Create a new course page" +msgstr "Создать новую страницу курса" + +msgid "Unique reference for the organization." +msgstr "Уникальная ссылка для организации." + +msgid "New organization page" +msgstr "Новая страница организации" + +msgid "Create a new organization page" +msgstr "Создать новую страницу организации" + +msgid "New category page" +msgstr "Новая страница категории" + +msgid "Create a new category page" +msgstr "Создать новую страницу категории" + +msgid "New blog post" +msgstr "Новая запись блога" + +msgid "Create a new blog post" +msgstr "Создать новую запись блога" + +msgid "New person page" +msgstr "Новая страница человека" + +msgid "Create a new person page" +msgstr "Создать новую страницу человека" + +msgid "New program" +msgstr "Новая программа" + +msgid "Create a new program" +msgstr "Создать новую программу" + +msgid "Admin" +msgstr "Администратор" + +msgid "Inherit" +msgstr "Наследовать" + +msgid "Default" +msgstr "По-умолчанию" + +msgid "Mini" +msgstr "Мини" + +msgid "Favorite" +msgstr "Избранное" + +msgid "Badge" +msgstr "Значок" + +msgid "Tag" +msgstr "Тег" + +msgid "Small" +msgstr "Маленький" + +msgid "Large" +msgstr "Большой" + +msgid "Card" +msgstr "Карточка" + +msgid "Row" +msgstr "Строка" + +msgid "minute" +msgstr "минута" + +msgid "minutes" +msgstr "минут" + +msgid "hour" +msgstr "час" + +msgid "hours" +msgstr "часов" + +msgid "day" +msgstr "день" + +msgid "days" +msgstr "дней" + +msgid "week" +msgstr "неделя" + +msgid "weeks" +msgstr "недель" + +msgid "month" +msgstr "месяц" + +msgid "months" +msgstr "месяцев" + +msgid "Run {:d}" +msgstr "Запустить {:d}" + +msgid "You can't snapshot a snapshot." +msgstr "Вы не можете сделать снимок снимка." + +msgid "You don't have sufficient permissions to snapshot this page." +msgstr "У вас недостаточно прав для снимка этой страницы." + +msgid "Archived on {now:%Y-%m-%d %H:%M:%S}" +msgstr "Архивировано {now:%Y-%m-%d %H:%M:%S}" + +msgid "{title:s} ({version!s})" +msgstr "{title:s} ({version!s})" + +msgid "blog post" +msgstr "запись в блоге" + +msgid "blog posts" +msgstr "записи в блоге" + +msgid "variant" +msgstr "вариант" + +msgid "Optional glimpse variant for a custom look." +msgstr "" +"Дополнительный вариант с проблеском для придания индивидуального вида." + +msgid "blog post plugin" +msgstr "плагин для записи в блоге" + +msgid "blog post plugins" +msgstr "плагины для записи в блоге" + +msgid "category" +msgstr "категория" + +msgid "categories" +msgstr "категории" + +msgid "category plugin" +msgstr "плагин категории" + +msgid "category plugins" +msgstr "плагины категории" + +msgid "enroll now" +msgstr "записаться сейчас" + +msgid "study now" +msgstr "начать обучение" + +msgid "starting on" +msgstr "начиная с" + +msgid "closing on" +msgstr "закрытие с" + +msgid "enrollment closed" +msgstr "зачисление закрыто" + +msgid "on-going" +msgstr "в настоящее время" + +msgid "archived" +msgstr "архивировано" + +msgid "to be scheduled" +msgstr "будет запланировано" + +msgid "forever open" +msgstr "всегда открыты" + +msgid "code" +msgstr "код" + +msgid "The course time range." +msgstr "Интервал времени курса." + +msgid "Total amount of time to complete this course." +msgstr "Общее количество времени для завершения этого курса." + +msgid "is listed" +msgstr "в списке" + +msgid "Tick if you want the course to be visible on the search page." +msgstr "Отметьте, если хотите, чтобы курс был виден на странице поиска." + +msgid "is self paced" +msgstr "самостоятельный" + +msgid "Tick if the course pace is self paced." +msgstr "Отметьте, если темп прохождения курса - самостоятельный." + +msgid "course" +msgstr "курс" + +msgid "courses" +msgstr "курсы" + +msgid "Self paced" +msgstr "Самостоятельный" + +msgid "~{pace:d} {effort_unit!s}/{duration_unit!s}" +msgstr "~{pace:d} {effort_unit!s}/{duration_unit!s}" + +msgid "~{pace_hours:d}h{pace_minutes:d}/{duration_unit!s}" +msgstr "~{pace_hours:d}ч{pace_minutes:d}/{duration_unit!s}" + +msgid "Manual" +msgstr "Руководство" + +msgid "Synchronization to draft page" +msgstr "Синхронизация с черновиком страницы" + +msgid "Synchronization to public page" +msgstr "Синхронизация с публичной страницей" + +msgid "" +"course_and_search - show on the course page and include in search results" +msgstr "" +"course_and_search - показать на странице курса и включить в результаты " +"поиска" + +msgid "course_only - show on the course page and hide from search results" +msgstr "" +"course_only - показывать на странице курса и скрыть от результатов поиска" + +msgid "hidden - hide on the course page and from search results" +msgstr "hidden - скрыть на странице курса и из результатов поиска" + +msgid "Synchronization mode" +msgstr "Режим синхронизации" + +msgid "resource link" +msgstr "ссылка на ресурс" + +msgid "course start" +msgstr "начало курса" + +msgid "course end" +msgstr "конец курса" + +msgid "enrollment start" +msgstr "начало зачисления" + +msgid "enrollment end" +msgstr "окончание зачисления" + +msgid "The list of languages in which the course content is available." +msgstr "Список языков, на которых доступно содержимое курса." + +msgid "enrollment count" +msgstr "количество зачислений" + +msgid "The number of enrolled students" +msgstr "Количество зачисленных студентов" + +msgid "catalog visibility" +msgstr "видимость каталога" + +msgid "course run" +msgstr "запуск курса" + +msgid "course runs" +msgstr "этапы курса" + +msgid "title" +msgstr "заголовок" + +msgid "Course run translation" +msgstr "Перевод запуска курса" + +msgid "Course run translations" +msgstr "Переводы запуска курса" + +msgid "Empty title" +msgstr "Пустой заголовок" + +msgid "course plugin" +msgstr "плагин курса" + +msgid "course plugins" +msgstr "плагины курса" + +msgid "logo" +msgstr "лого" + +msgid "url" +msgstr "url" + +msgid "name" +msgstr "имя" + +msgid "content" +msgstr "контент" + +msgid "licence" +msgstr "лицензия" + +msgid "licences" +msgstr "лицензии" + +msgid "Licence translation" +msgstr "Перевод лицензии" + +msgid "licence translations" +msgstr "переводы лицензий" + +msgid "description" +msgstr "описание" + +msgid "licence plugin" +msgstr "плагин лицензии" + +msgid "licence plugins" +msgstr "плагины лицензии" + +msgid "organization" +msgstr "организация" + +msgid "organizations" +msgstr "организации" + +msgid "organization plugin" +msgstr "плагин организации" + +msgid "organization plugins" +msgstr "плагины организации" + +msgid "organizations by category plugin" +msgstr "организации по плагину категории" + +msgid "organizations by category plugins" +msgstr "организации по плагинам категории" + +msgid "person" +msgstr "человек" + +msgid "persons" +msgstr "люди" + +msgid "Custom bio" +msgstr "Пользовательская биография" + +msgid "" +"Optional: provide a custom bio (if you leave it empty, it will display " +"the person's bio)." +msgstr "" +"Необязательно: укажите пользовательскую биографию (если оставить ее " +"пустым, она отобразит биографию человека)." + +msgid "person plugin" +msgstr "плагин человека" + +msgid "person plugins" +msgstr "плагины человека" + +msgid "program" +msgstr "программа" + +msgid "programs" +msgstr "программы" + +msgid "program plugin" +msgstr "плагин программы" + +msgid "program plugins" +msgstr "плагины программы" + +msgid "role" +msgstr "роль" + +msgid "" +"A role describes all the permissions that should be granted to the user " +"group." +msgstr "" +"Роль описывает все разрешения, которые должны быть предоставлены группе " +"пользователей." + +msgid "page" +msgstr "страница" + +msgid "Page to which this role grants permissions." +msgstr "Страница, к которой эта роль предоставляет разрешения." + +msgid "group" +msgstr "группа" + +msgid "User group that this role controls." +msgstr "Группа пользователей, которой управляет эта роль." + +msgid "filer folder" +msgstr "filer папка" + +msgid "Filer folder that this role controls." +msgstr "Filer папка, которой управляет эта роль." + +msgid "page role" +msgstr "роль страницы" + +msgid "page roles" +msgstr "роли страницы" + +msgid "{:s} | {:s}" +msgstr "{:s} | {:s}" + +msgid "Course page" +msgstr "Страница курса" + +msgid "Organization list" +msgstr "Список организаций" + +msgid "Organization page" +msgstr "Страница организации" + +msgid "Category list" +msgstr "Список категорий" + +msgid "Category page" +msgstr "Страница категории" + +msgid "Blog post list" +msgstr "Список записей блога" + +msgid "Blog post page" +msgstr "Страница записи блога" + +msgid "Person page" +msgstr "Страница человека" + +msgid "Person list" +msgstr "Список людей" + +msgid "Program page" +msgstr "Страница программы" + +msgid "Program list" +msgstr "Список программ" + +msgid "Search" +msgstr "Поиск" + +msgid "List of child pages" +msgstr "Список дочерних страниц" + +msgid "Homepage" +msgstr "Домашняя страница" + +msgid "Single column" +msgstr "Одна колонка" + +msgid "Three columns: (33% | 33% | 33%)" +msgstr "Три колонки: (33% | 33% | 33%)" + +msgid "Two columns: (50% | 50%)" +msgstr "Две колонки: (50% | 50%)" + +msgid "Two columns: (25% | 75%)" +msgstr "Две колонки: (25% | 75%)" + +msgid "Two columns: (75% | 25%)" +msgstr "Две колонки: (75% | 25%)" + +msgid "Footer" +msgstr "Подвал" + +msgid "Static headline" +msgstr "Статический заголовок" + +msgid "Main content" +msgstr "Основной контент" + +msgid "Secondary content" +msgstr "Дополнительное содержимое" + +msgid "Third content" +msgstr "Третье содержимое" + +msgid "Cover" +msgstr "Обложка" + +msgid "Catch phrase" +msgstr "Меткая фраза" + +msgid "About the course" +msgstr "О курсе" + +msgid "What you will learn" +msgstr "Чему вы научитесь" + +msgid "Format" +msgstr "Формат" + +msgid "Prerequisites" +msgstr "Предварительные условия" + +msgid "Team" +msgstr "Команда" + +msgid "Plan" +msgstr "План" + +msgid "Complementary information" +msgstr "Дополнительная информация" + +msgid "License for the course content" +msgstr "Лицензия на содержимое курса" + +msgid "License for the content created by course participants" +msgstr "Лицензия на контент, созданный участниками курса" + +msgid "Categories" +msgstr "Категории" + +msgid "Icon" +msgstr "Иконка" + +msgid "Organizations" +msgstr "Организации" + +msgid "Assessment and Certification" +msgstr "Оценка и сертификация" + +msgid "Banner" +msgstr "Баннер" + +msgid "Logo" +msgstr "Лого" + +msgid "Description" +msgstr "Описание" + +msgid "Excerpt" +msgstr "Выдержка" + +msgid "Portrait" +msgstr "Портрет" + +msgid "Bio" +msgstr "О себе" + +msgid "Main Content" +msgstr "Основной Контент" + +msgid "Author" +msgstr "Автор" + +msgid "Body" +msgstr "Тело" + +msgid "Headline" +msgstr "Заголовок" + +msgid "Courses" +msgstr "Курсы" + +msgid "Button caesura" +msgstr "Кнопка цезура" + +msgid "Full width" +msgstr "Во всю ширину" + +msgid "No categories yet." +msgstr "Еще нет категорий." + +msgid "Not published yet" +msgstr "Ещё не опубликовано" + +msgid "No author yet" +msgstr "Пока нет автора" + +msgid "No excerpt content" +msgstr "Контент без выдержки" + +msgid "No body content" +msgstr "Контент без тела" + +msgid "Related posts" +msgstr "Похожие записи" + +msgid "Other categories of articles" +msgstr "Другие категории статей" + +msgid "No associated blogposts" +msgstr "Нет связанных блогов" + +#, python-format +msgid "%(category_title)s - Category" +msgstr "%(category_title)s - Категория" + +msgid "Sub categories" +msgstr "Подкатегории" + +msgid "Related courses" +msgstr "Связанные курсы" + +msgid "Courses pagination" +msgstr "Пагинация курсов" + +msgid "See all courses" +msgstr "Посмотреть все курсы" + +msgid "Related organizations" +msgstr "Связанные организации" + +msgid "Related organizations pagination" +msgstr "Пагинация связанных курсов" + +msgid "Related blogposts" +msgstr "Похожие блоги" + +msgid "Related blogposts pagination" +msgstr "Пагинация связанных блогов" + +msgid "Related persons" +msgstr "Связанные люди" + +msgid "Related persons pagination" +msgstr "Пагинация связанных персон" + +msgid "No categories" +msgstr "Нет категорий" + +#, python-format +msgid "%(course_title)s - Course" +msgstr "%(course_title)s - Курс" + +msgid "Ref. " +msgstr "Ссылка. " + +msgid "No associated categories" +msgstr "Нет связанных категорий" + +msgid "Duration:" +msgstr "Длительность:" + +msgid "Effort:" +msgstr "Усилие:" + +msgid "Pace:" +msgstr "Темп:" + +msgid "" +"Add a teaser video or add a cover image below and it will be used as " +"teaser image as well." +msgstr "" +"Добавьте видео тизер или добавьте обложку ниже и оно также будет " +"использоваться в качестве тизерного изображения." + +msgid "course cover image" +msgstr "обложка курса" + +#, python-format +msgid "" +"\n" +" Archived on %(creation_date)s\n" +" " +msgstr "" +"\n" +" Архивировано %(creation_date)s\n" +" " + +msgid "Go to current version" +msgstr "Перейти к текущей версии" + +msgid "Glimpse cover" +msgstr "Glimpse обложка" + +msgid "Add an image for course cover on its glimpse." +msgstr "Добавить изображение для обложки курса на его glimpse." + +msgctxt "course_detail__title" +msgid "What you will learn" +msgstr "Чему вы научитесь" + +msgid "At the end of this course, you will be able to:" +msgstr "По окончании этого курса вы сможете:" + +msgctxt "course_detail__title" +msgid "Description" +msgstr "Описание" + +msgctxt "course_detail__title" +msgid "Format" +msgstr "Формат" + +msgid "How is the course structured?" +msgstr "Как структурирован курс?" + +msgctxt "course_detail__title" +msgid "Prerequisites" +msgstr "Предварительные условия" + +msgid "What are the prerequisites to follow this course?" +msgstr "Каковы предварительные условия для прохождения этого курса?" + +msgctxt "course_detail__title" +msgid "Assessment and certification" +msgstr "Оценка и сертификация" + +msgid "How is progress evaluated and/or certified?" +msgstr "Как оценивается и/или сертифицируется прогресс?" + +msgctxt "course_detail__title" +msgid "Course plan" +msgstr "План курса" + +msgid "Enter here the detailed course plan." +msgstr "Введите подробный план курса." + +msgctxt "course_detail__title" +msgid "Course team" +msgstr "Команда курса" + +msgid "Who are the teachers in the course team?" +msgstr "Кто является преподавателями в команде курсов?" + +msgctxt "course_detail__title" +msgid "Organizations" +msgstr "Организации" + +msgid "What are the organizations publishing this course?" +msgstr "Какие организации публикуют этот курс?" + +msgctxt "course_detail__title" +msgid "License" +msgstr "Лицензия" + +msgid "What is the license for the course content?" +msgstr "Какова лицензия на содержимое курса?" + +msgid "What is the license for the content created by course participants?" +msgstr "Какова лицензия на контент, созданный участниками курса?" + +msgid "Course code" +msgstr "Код курса" + +msgid "Course date" +msgstr "Дата курса" + +msgid "Course team" +msgstr "Команда курса" + +msgid "License" +msgstr "Лицензия" + +#, python-format +msgid "" +"\n" +" A %(model)s object is missing on this %(model)s page. Please " +"select another page template.\n" +"
\n" +" If what you need is a %(model)s page, you need to create it via " +"the wizard and choose \"New %(model)s page\".\n" +" " +msgstr "" +"\n" +" На этой странице %(model)s отсутствует объект %(model)s. " +"Пожалуйста, выберите другой шаблон страницы.\n" +"
\n" +" Если вам нужна страница %(model)s, вы должны создать его через " +"мастер и выбрать \"Новая %(model)s страница\".\n" +" " + +msgid "Main organization" +msgstr "Основная организация" + +msgid "Related courses pagination" +msgstr "Пагинация связанных курсов" + +msgid "No organization yet" +msgstr "Организаций пока нет" + +msgid "Enter your bio here..." +msgstr "Введите вашу биографию..." + +#, python-format +msgid "%(title)s avatar" +msgstr "Аватар %(title)s" + +msgid "No associated organizations" +msgstr "Нет связанных организаций" + +msgid "Blogposts" +msgstr "Записи в блогах" + +msgid "Blogposts pagination" +msgstr "Пагинация блогов" + +msgid "No persons" +msgstr "Нет людей" + +#, python-format +msgid "%(program_title)s - Program" +msgstr "%(program_title)s - Программа" + +msgid "program cover image" +msgstr "обложка программы" + +msgid "No associated programs" +msgstr "Нет связанных программ" + +#, python-brace-format +msgid "Run {i:d}" +msgstr "Запустить {i:d}" + +msgid "Regenerate search index..." +msgstr "Пересоздать индекс поиска..." + +msgid "New courses" +msgstr "Новые курсы" + +msgid "First session" +msgstr "Первая сессия" + +msgid "Availability" +msgstr "Доступность" + +msgid "Languages" +msgstr "Языки" + +msgid "Subjects" +msgstr "Темы" + +msgid "Levels" +msgstr "Уровни" + +msgid "Persons" +msgstr "Люди" + +msgid "Licences" +msgstr "Лицензии" + +msgid "Weekly pace" +msgstr "Недельный темп" + +msgid "Self-paced" +msgstr "В своём темпе" + +msgid "Less than one hour" +msgstr "Меньше одного часа" + +msgid "One to two hours" +msgstr "От одного до двух часов" + +msgid "More than two hours" +msgstr "Более двух часов" + +msgid "Open for enrollment" +msgstr "Открыть для зачисления" + +msgid "Coming soon" +msgstr "Скоро появится" + +msgid "On-going" +msgstr "В настоящее Время" + +msgid "Archived" +msgstr "Архивировано" + +msgid "Sort by configuration" +msgstr "Сортировать по конфигурации" + +msgid "Sort by facet count" +msgstr "Сортировать по количеству аспектов" + +msgid "Sort alphabetically" +msgstr "Сортировать по алфавиту" + +msgid "You are not allowed to manage the search index." +msgstr "Вы не можете управлять поисковым индексом." + +msgid "The search index was successfully bootstrapped" +msgstr "Поисковый индекс успешно загружен" + +msgid "Glimpse" +msgstr "Glimpse" + +msgid "Link settings" +msgstr "Настройки ссылок" + +msgid "Square card" +msgstr "Квадратная карточка" + +msgid "Quote" +msgstr "Цитата" + +msgid "Half row" +msgstr "Половина строки" + +msgid "Full row" +msgstr "Полная строка" + +msgid "Variant" +msgstr "Вариант" + +msgid "Form factor variant" +msgstr "Вариант коэффициента формы" + +msgid "image" +msgstr "изображение" + +msgid "Content" +msgstr "Контент" + +msgid "External URL" +msgstr "Внешний URL" + +msgid "Make the glimpse as a link with an external URL." +msgstr "Сделать glimpse как ссылку с внешним URL." + +msgid "Internal URL" +msgstr "Внутренний URL" + +msgid "Make the glimpse as a link with an internal (page) URL." +msgstr "Сделать glimpse как ссылку с внутренним (страничкой) URL." + +msgid "HTML Sitemap" +msgstr "HTML карта сайта" + +msgid "" +"Press save to create a site map. You will then be able to add a child " +"plugin for each subtree in your sitemap." +msgstr "" +"Нажмите кнопку «Сохранить», чтобы создать карту сайта. Затем вы сможете " +"добавить дочерний плагин для каждого поддерева на карте сайта." + +msgid "HTML sitemap page" +msgstr "Страница HTML карты сайта" + +msgid "root page" +msgstr "корневая страница" + +msgid "" +"This page will be at the root of your sitemap (or its children if the " +"\"include root page\" flag is unticked)." +msgstr "" +"Эта страница будет в корне вашей карты сайта (или её дочерних частей, " +"если флаг \"включая корневую страницу\" не отмечен)." + +msgid "max depth" +msgstr "максимальная глубина" + +msgid "" +"Limit the level of nesting that your sitemap will contain below this " +"page. An empty field or 0 equals to no limit." +msgstr "" +"Ограничить уровень вложения, который ваша карта сайта будет содержать " +"ниже этой страницы. Пустое поле или 0 означает без ограничений." + +msgid "in navigation" +msgstr "в навигации" + +msgid "" +"Tick to exclude from sitemap the pages that are excluded from navigation." +msgstr "" +"Отметьте, чтобы исключить из карты сайта страницы, исключенные из " +"навигации." + +msgid "include root page" +msgstr "включая корневую страницу" + +msgid "" +"Tick to include the root page and its descendants. Untick to include only " +"its descendants." +msgstr "" +"Отметьте, чтобы включить корневую страницу и ее потомков. Удалите отметку " +"для включения только его потомков." + +msgid "HTML Sitemaps" +msgstr "HTML карты сайта" + +msgid "Sitemap" +msgstr "Карта сайта" + +msgid "Large Banner" +msgstr "Большой Баннер" + +msgid "Medias" +msgstr "СМИ" + +msgid "Hero introduction" +msgstr "Hero введение" + +msgid "background image" +msgstr "фоновое изображение" + +msgid "Template" +msgstr "Шаблон" + +msgid "Choose template to render plugin." +msgstr "Выберите шаблон для плагина рендеринга." + +msgid "Explore our catalog" +msgstr "Ознакомьтесь с нашим каталогом" + +msgid "Search in our courses" +msgstr "Поиск в наших курсах" + +msgid "Advanced settings" +msgstr "Расширенные настройки" + +msgid "LTI consumer" +msgstr "LTI потребитель" + +msgid "Custom provider configuration" +msgstr "Пользовательская конфигурация провайдера" + +msgid "shared secret" +msgstr "общий секрет" + +msgid "" +"The url is not valid for this provider. It should be of the form \"{:s}\"." +msgstr "" +"URL не действителен для этого провайдера. Он должен быть в форме \"{:s}\"." + +msgid "" +"The url is not valid for this provider. It should start with \"{:s}\"." +msgstr "" +"URL не действителен для этого провайдера. Он должен начинаться с \"{:s}\"." + +msgid "Please choose a predefined provider, or fill fields below" +msgstr "Пожалуйста, выберите провайдера или заполните поля ниже" + +msgid "Please choose a predefined provider above, or fill this field" +msgstr "" +"Пожалуйста, выберите выбранного провайдера выше или заполните это поле" + +msgid "Please fill this field" +msgstr "Пожалуйста, заполните это поле" + +msgid "LTI url" +msgstr "LTI url" + +msgid "" +"For a predefined provider, leave this field empty for uploading new " +"content." +msgstr "" +"Для предопределенного поставщика оставьте это поле пустым для загрузки " +"нового содержимого." + +msgid "Predefined LTI provider" +msgstr "Предопределенный провайдер LTI" + +msgid "Please choose a predefined provider or fill fields below." +msgstr "Пожалуйста, выберите провайдера или заполните поля ниже." + +msgid "Yes" +msgstr "Да" + +msgid "No" +msgstr "Нет" + +msgid "Nested item" +msgstr "Вложенный элемент" + +msgid "List" +msgstr "Список" + +msgid "Plain text" +msgstr "Простой текст" + +msgid "plain text" +msgstr "простой текст" + +msgid "Section" +msgstr "Раздел" + +msgid "Primary scheme" +msgstr "Основная схема" + +msgid "Secondary scheme" +msgstr "Вторичная схема" + +msgid "Tertiary scheme" +msgstr "Третичная схема" + +msgid "Quaternary scheme" +msgstr "Четвертичная схема" + +msgid "Quinary scheme" +msgstr "Пятеричная схема" + +msgid "Senary scheme" +msgstr "Шестеричная схема" + +msgid "Septenary scheme" +msgstr "Семеричная схема" + +msgid "Item tiles" +msgstr "Плитки элементов" + +msgid "Optional template for custom look." +msgstr "Дополнительный шаблон для пользовательского вида." + +msgid "Attributes" +msgstr "Атрибуты" + +msgid "Image" +msgstr "Изображение" + +msgid "Simple text" +msgstr "Обычный текст" + +msgid "body" +msgstr "тело" + +#, python-format +msgid "" +"Ensure this text has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this text has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Убедитесь, что текст содержит не более %(limit_value)d символа (сейчас " +"%(show_value)d)." +msgstr[1] "" +"Убедитесь, что текст содержит не более %(limit_value)d символов (сейчас " +"%(show_value)d)." +msgstr[2] "" +"Убедитесь, что текст содержит не более %(limit_value)d символов (сейчас " +"%(show_value)d)." +msgstr[3] "" +"Убедитесь, что текст содержит не более %(limit_value)d символов (сейчас " +"%(show_value)d)." diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/vi_VN/LC_MESSAGES/django.po b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/vi_VN/LC_MESSAGES/django.po new file mode 100644 index 0000000000..534a892d24 --- /dev/null +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/locale/vi_VN/LC_MESSAGES/django.po @@ -0,0 +1,66 @@ +msgid "" +msgstr "" +"Project-Id-Version: richie\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-31 17:41+0100\n" +"PO-Revision-Date: 2024-11-20 14:09\n" +"Last-Translator: \n" +"Language-Team: Vietnamese\n" +"Language: vi_VN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: richie\n" +"X-Crowdin-Project-ID: 308578\n" +"X-Crowdin-Language: vi\n" +"X-Crowdin-File: backend.pot\n" +"X-Crowdin-File-ID: 32\n" + +#: newsite/settings.py:250 newsite/settings.py:260 +msgid "Dashboard" +msgstr "" + +#: newsite/settings.py:251 +msgid "{base_url:s}/dashboard/" +msgstr "" + +#: newsite/settings.py:261 +msgid "/dashboard/" +msgstr "" + +#: newsite/settings.py:264 +msgid "Teacher dashboard" +msgstr "" + +#: newsite/settings.py:265 +msgid "/dashboard/teacher" +msgstr "" + +#: newsite/settings.py:287 +msgid "Profile" +msgstr "" + +#: newsite/settings.py:288 +msgid "{base_url:s}/u/(username)" +msgstr "" + +#: newsite/settings.py:291 +msgid "Account" +msgstr "" + +#: newsite/settings.py:292 +msgid "{base_url:s}/account/settings" +msgstr "" + +#: newsite/settings.py:385 +msgid "Teaser" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "English" +msgstr "" + +#: newsite/settings.py:476 newsite/settings.py:483 +msgid "French" +msgstr "" diff --git a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/{{cookiecutter.site}}/settings.py b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/{{cookiecutter.site}}/settings.py index 518a0fff2b..e0317a6879 100644 --- a/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/{{cookiecutter.site}}/settings.py +++ b/cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/backend/{{cookiecutter.site}}/settings.py @@ -2,6 +2,7 @@ Django settings for the richie {{cookiecutter.site}} project. """ +import ast import json import os @@ -462,6 +463,8 @@ class Base(StyleguideMixin, DRFMixin, RichieCoursesConfigurationMixin, Configura "django.contrib.humanize", ) + RFC_5646_LOCALES = ["en-US", "es-ES", "pt-PT", "pt-BR", "fr-FR", "fr-CA", "ru-RU", "vi-VN", "ar-SA", "ko-KR"] + # Languages # - Django LANGUAGE_CODE = "en" @@ -470,33 +473,32 @@ class Base(StyleguideMixin, DRFMixin, RichieCoursesConfigurationMixin, Configura # fallback/default languages throughout the app. # Use "en" as default as it is the language that is most likely to be spoken by any visitor # when their preferred language, whatever it is, is unavailable - LANGUAGES = (("en", _("English")), ("fr", _("French"))) + LANGUAGES = os.getenv("LANGUAGES") or [("en", _("English")), ("fr", _("French"))] + + if isinstance(LANGUAGES, str): + try: + LANGUAGES = ast.literal_eval(LANGUAGES) + LANGUAGES = [(code, _(name)) for code, name in LANGUAGES] + except Exception as e: + LANGUAGES = [("en", _("English")), ("fr", _("French"))] # - Django CMS CMS_LANGUAGES = { "default": { "public": True, "hide_untranslated": False, - "redirect_on_fallback": True, + "redirect_on_fallback": False, "fallbacks": ["en", "fr"], }, 1: [ { "public": True, - "code": "en", - "hide_untranslated": False, - "name": _("English"), - "fallbacks": ["fr"], - "redirect_on_fallback": False, - }, - { - "public": True, - "code": "fr", + "code": code, "hide_untranslated": False, - "name": _("French"), + "name": _(name), "fallbacks": ["en"], "redirect_on_fallback": False, - }, + } for code, name in LANGUAGES ], } diff --git a/pyproject.toml b/pyproject.toml index 6208720b6e..ab53809d5f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,7 +72,7 @@ dev = [ "black==24.10.0", "pyRdfa3==3.6.4", "cssselect==1.2.0", - "factory-boy==3.3.1", + "factory-boy==3.3.3", "flake8==7.1.1", "flake8-pyproject==1.2.3", "htmlmin==0.1.12", @@ -95,7 +95,7 @@ ci = [ sandbox = [ "django-configurations==2.5.1", "dockerflow==2024.4.2", - "factory-boy==3.3.1", + "factory-boy==3.3.3", "gunicorn==23.0.0", "psycopg2-binary==2.9.10", "sentry-sdk==2.19.2", diff --git a/sandbox/settings.py b/sandbox/settings.py index 91e52b402a..ff5915ba3b 100644 --- a/sandbox/settings.py +++ b/sandbox/settings.py @@ -458,6 +458,8 @@ class Base(StyleguideMixin, DRFMixin, RichieCoursesConfigurationMixin, Configura "django.contrib.humanize", ) + RFC_5646_LOCALES = ["en-US", "es-ES", "pt-PT", "pt-BR", "fr-FR", "fr-CA", "ru-RU", "vi-VN", "ar-SA", "ko-KR"] + # Languages # - Django LANGUAGE_CODE = "en" @@ -466,33 +468,28 @@ class Base(StyleguideMixin, DRFMixin, RichieCoursesConfigurationMixin, Configura # fallback/default languages throughout the app. # Use "en" as default as it is the language that is most likely to be spoken by any visitor # when their preferred language, whatever it is, is unavailable - LANGUAGES = (("en", _("English")), ("fr", _("French"))) + LANGUAGES = values.Value( + (("en", _("English")), ("pt", _("Portuguese")), ("pt-br", _("Brazilian Portuguese")), ("fr", _("French (France)")), ("es", _("Spanish")), ("ru", _("Russian")), ("vi", _("Vietnamese")), ("ar", _("Arabic (Saudi Arabia)")), ("ko", _("Korean"))), + environ_name="LANGUAGES", + ) # - Django CMS CMS_LANGUAGES = { "default": { "public": True, "hide_untranslated": False, - "redirect_on_fallback": False, + "redirect_on_fallback": True, "fallbacks": ["en", "fr"], }, 1: [ { "public": True, - "code": "en", - "hide_untranslated": False, - "name": _("English"), - "fallbacks": ["fr"], - "redirect_on_fallback": False, - }, - { - "public": True, - "code": "fr", + "code": code, "hide_untranslated": False, - "name": _("French"), + "name": _(name), "fallbacks": ["en"], "redirect_on_fallback": False, - }, + } for code, name in LANGUAGES ], } diff --git a/src/richie/apps/demo/defaults.py b/src/richie/apps/demo/defaults.py index bc1930c59c..8867a8747f 100644 --- a/src/richie/apps/demo/defaults.py +++ b/src/richie/apps/demo/defaults.py @@ -1,5 +1,6 @@ """Parameters that define how the demo site will be built.""" - +from django.utils.translation import gettext_lazy as _ +from django.utils import translation from django.conf import settings from .utils import pick_image @@ -33,60 +34,75 @@ } NB_OBJECTS.update(getattr(settings, "RICHIE_DEMO_NB_OBJECTS", {})) +languages = getattr(settings, "LANGUAGES", ()) + +def translate_message(code, label): + with translation.override(code): + new_label = str(_(label)) + return new_label + +def set_labels_by_language(label): + labels = {} + + for code, _ in languages: + labels.update({str(code): translate_message(code, label)}) + + return labels + PAGES_INFO = { "home": { - "title": {"en": "Home", "fr": "Accueil"}, + "title": set_labels_by_language("Home"), "in_navigation": False, "is_homepage": True, "template": "richie/homepage.html", }, "blogposts": { - "title": {"en": "News", "fr": "Actualités"}, + "title": set_labels_by_language("News"), "in_navigation": True, "template": "courses/cms/blogpost_list.html", }, "courses": { - "title": {"en": "Courses", "fr": "Cours"}, + "title": set_labels_by_language("Courses"), "in_navigation": True, "template": "search/search.html", }, "categories": { - "title": {"en": "Categories", "fr": "Catégories"}, + "title": set_labels_by_language("Categories"), "in_navigation": True, "template": "courses/cms/category_list.html", }, "organizations": { - "title": {"en": "Organizations", "fr": "Établissements"}, + "title": set_labels_by_language("Organizations"), "in_navigation": True, "template": "courses/cms/organization_list.html", }, "persons": { - "title": {"en": "Persons", "fr": "Personnes"}, + "title":set_labels_by_language("Persons"), "in_navigation": True, "template": "courses/cms/person_list.html", }, "programs": { - "title": {"en": "Programs", "fr": "Parcours"}, + "title": set_labels_by_language("Programs"), "in_navigation": True, "template": "courses/cms/program_list.html", }, "annex": { - "title": {"en": "Annex", "fr": "Annexe"}, + "title": set_labels_by_language("Annex"), "in_navigation": False, "template": "richie/single_column.html", "children": { "annex__about": { - "title": {"en": "About", "fr": "A propos"}, + "title": set_labels_by_language("About"), "in_navigation": True, "template": "richie/single_column.html", }, "annex__sitemap": { - "title": {"en": "Sitemap", "fr": "Plan de site"}, + "title": set_labels_by_language("Sitemap"), "in_navigation": True, "template": "richie/single_column.html", }, "login-error": { - "title": {"en": "Login error", "fr": "Erreur de connexion"}, + "title": set_labels_by_language("Login error"), "in_navigation": False, "template": "richie/single_column.html", }, @@ -97,202 +113,124 @@ LEVELS_INFO = { - "page_title": {"en": "Level", "fr": "Niveau"}, + "page_title": set_labels_by_language("Level"), "children": [ - {"page_title": {"en": "Beginner", "fr": "Débutant"}}, - {"page_title": {"en": "Advanced", "fr": "Avancé"}}, - {"page_title": {"en": "Expert", "fr": "Expert"}}, + {"page_title": set_labels_by_language("Beginner")}, + {"page_title": set_labels_by_language("Advanced")}, + {"page_title": set_labels_by_language("Expert")}, ], "page_reverse_id": "levels", } LEVELS_INFO.update(getattr(settings, "RICHIE_DEMO_LEVELS_INFO", {})) PARTNERSHIPS_INFO = { - "page_title": {"en": "Partnership", "fr": "Partenariat"}, + "page_title": set_labels_by_language("Partnership"), "children": [ - {"page_title": {"en": "Gold", "fr": "Or"}}, - {"page_title": {"en": "Silver", "fr": "Argent"}}, - {"page_title": {"en": "Bronze", "fr": "Bronze"}}, + {"page_title": set_labels_by_language("Gold")}, + {"page_title": set_labels_by_language("Silver")}, + {"page_title": set_labels_by_language("Bronze")}, ], "page_reverse_id": "partnerships", } PARTNERSHIPS_INFO.update(getattr(settings, "RICHIE_DEMO_PARTNERSHIPS_INFO", {})) TAGS_INFO = { - "page_title": {"en": "Tag", "fr": "Etiquette"}, + "page_title": set_labels_by_language("Tag"), "children": [ - {"page_title": {"en": "Event", "fr": "Evénement"}}, - {"page_title": {"en": "Feature", "fr": "Fonctionnalité"}}, - {"page_title": {"en": "Around the course", "fr": "Autour du cours"}}, - {"page_title": {"en": "Partner", "fr": "Partenaire"}}, - {"page_title": {"en": "Portrait", "fr": "Portrait"}}, - {"page_title": {"en": "Recruitment", "fr": "Recrutement"}}, + {"page_title": set_labels_by_language("Event")}, + {"page_title": set_labels_by_language("Feature")}, + {"page_title": set_labels_by_language("Around the course")}, + {"page_title": set_labels_by_language("Partner")}, + {"page_title": set_labels_by_language("Portrait")}, + {"page_title": set_labels_by_language("Recruitment")}, ], "page_reverse_id": "tags", } TAGS_INFO.update(getattr(settings, "RICHIE_DEMO_TAGS_INFO", {})) SUBJECTS_INFO = { - "page_title": {"en": "Subject", "fr": "Sujet"}, + "page_title": set_labels_by_language("Subject"), "children": [ { - "page_title": {"en": "Science", "fr": "Sciences"}, + "page_title": set_labels_by_language("Science"), "children": [ - { - "page_title": { - "en": "Agronomy and Agriculture", - "fr": "Agronomie et Agriculture", - } - }, - {"page_title": {"en": "Chemistry", "fr": "Chimie"}}, - { - "page_title": { - "en": "Discovery of the Universe", - "fr": "Découverte de l'Univers", - } - }, - {"page_title": {"en": "Environment", "fr": "Environnement"}}, - { - "page_title": { - "en": "Mathematics and Statistics", - "fr": "Mathématiques et Statistiques", - } - }, - { - "page_title": { - "en": "Tools for Research", - "fr": "Outils pour la Recherche", - } - }, - {"page_title": {"en": "Physics", "fr": "Physique"}}, - { - "page_title": { - "en": "Cognitive science", - "fr": "Sciences cognitives", - } - }, - { - "page_title": { - "en": "Earth science and science of the Universe", - "fr": "Sciences de la Terre et de l'Univers", - } - }, - {"page_title": {"en": "Life science", "fr": "Sciences de la vie"}}, - { - "page_title": { - "en": "Engineering science", - "fr": "Sciences pour l'ingénieur", - } - }, + {"page_title": set_labels_by_language("Agronomy and Agriculture")}, + {"page_title": set_labels_by_language("Chemistry")}, + {"page_title": set_labels_by_language("Discovery of the Universe")}, + {"page_title": set_labels_by_language("Environment")}, + {"page_title": set_labels_by_language("Mathematics and Statistics")}, + {"page_title": set_labels_by_language("Tools for Research")}, + {"page_title": set_labels_by_language("Physics")}, + {"page_title": set_labels_by_language("Cognitive science")}, + {"page_title": set_labels_by_language("Earth science and science of the Universe")}, + {"page_title": set_labels_by_language("Life science")}, + {"page_title": set_labels_by_language("Engineering science")}, ], }, { - "page_title": { - "en": "Human and social sciences", - "fr": "Sciences humaines et social", - }, + "page_title": set_labels_by_language("Human and social sciences"), "children": [ - {"page_title": {"en": "Communication", "fr": "Communication"}}, - { - "page_title": { - "en": "Creation, Arts and Design", - "fr": "Création, Arts et Design", - } - }, - { - "page_title": { - "en": "Culture and Civilization", - "fr": "Cultures et Civilisations", - } - }, - { - "page_title": { - "en": "Social Issues and Social Policy", - "fr": "Enjeux de société", - } - }, - {"page_title": {"en": "Geography", "fr": "Géographie"}}, - {"page_title": {"en": "History", "fr": "Histoire"}}, - {"page_title": {"en": "Innovation", "fr": "Innovation"}}, - {"page_title": {"en": "Literature", "fr": "Lettres"}}, - {"page_title": {"en": "Media", "fr": "Médias"}}, - {"page_title": {"en": "Philosophy", "fr": "Philosophie"}}, - { - "page_title": { - "en": "Political science", - "fr": "Sciences politiques", - } - }, - { - "page_title": { - "en": "International relations", - "fr": "Relations internationales", - } - }, - {"page_title": {"en": "Sports", "fr": "Sport"}}, + {"page_title": set_labels_by_language("Communication")}, + {"page_title": set_labels_by_language("Creation, Arts and Design")}, + {"page_title": set_labels_by_language("Culture and Civilization")}, + {"page_title": set_labels_by_language("Social Issues and Social Policy")}, + {"page_title": set_labels_by_language("Geography")}, + {"page_title": set_labels_by_language("History")}, + {"page_title": set_labels_by_language("Innovation")}, + {"page_title": set_labels_by_language("Literature")}, + {"page_title": set_labels_by_language("Media")}, + {"page_title": set_labels_by_language("Philosophy")}, + {"page_title": set_labels_by_language("Political science")}, + {"page_title": set_labels_by_language("International relations")}, + {"page_title": set_labels_by_language("Sports")}, ], }, - {"page_title": {"en": "Law", "fr": "Droit et juridique"}}, - {"page_title": {"en": "Economy and Finance", "fr": "Economie et Finance"}}, - { - "page_title": { - "en": "Education and Training", - "fr": "Education et formation", - } - }, - {"page_title": {"en": "Management", "fr": "Management"}}, - {"page_title": {"en": "Entrepreneurship", "fr": "Entreprenariat"}}, + {"page_title": set_labels_by_language("Law")}, + {"page_title": set_labels_by_language("Economy and Finance")}, + {"page_title": set_labels_by_language("Education and Training")}, + {"page_title": set_labels_by_language("Management")}, + {"page_title": set_labels_by_language("Entrepreneurship")}, { - "page_title": {"en": "Computer science", "fr": "Informatique"}, + "page_title": set_labels_by_language("Computer science"), "children": [ - { - "page_title": { - "en": "Digital and Technology", - "fr": "Numérique et Technologie", - } - }, - { - "page_title": { - "en": "Telecommunication and Networks", - "fr": "Télécommunications et Réseaux", - } - }, - {"page_title": {"en": "Coding", "fr": "Programmation"}}, + {"page_title": set_labels_by_language("Digital and Technology")}, + {"page_title": set_labels_by_language("Telecommunication and Networks")}, + {"page_title": set_labels_by_language("Coding")}, ], }, - {"page_title": {"en": "Languages", "fr": "Langues"}}, - {"page_title": {"en": "Education and career guidance", "fr": "Orientation"}}, - {"page_title": {"en": "Health", "fr": "Santé"}}, + {"page_title": set_labels_by_language("Languages")}, + {"page_title": set_labels_by_language("Education and career guidance")}, + {"page_title": set_labels_by_language("Health")}, ], "page_reverse_id": "subjects", } SUBJECTS_INFO.update(getattr(settings, "RICHIE_DEMO_SUBJECTS_INFO", {})) ICONS_INFO = { - "page_title": {"en": "Icons", "fr": "Icônes"}, + "page_title": set_labels_by_language("Icons"), "children": [ { - "page_title": {"en": "Academic", "fr": "Diplomant"}, + "page_title": set_labels_by_language("Academic"), "color": "#005c08", "fill_icon": pick_image("icons")("academic.png"), }, { - "page_title": {"en": "Accessible", "fr": "Accessible"}, + "page_title": set_labels_by_language("Accessible"), "color": "#00a1d6", "fill_icon": pick_image("icons")("accessible.png"), }, { - "page_title": {"en": "Closed caption", "fr": "Malentendants"}, + "page_title": set_labels_by_language("Closed caption"), "color": "#a11000", "fill_icon": pick_image("icons")("cc.png"), }, { - "page_title": {"en": "Certificate", "fr": "Certifiant"}, + "page_title": set_labels_by_language("Certificate"), "color": "#ffc400", "fill_icon": pick_image("icons")("certificate.png"), }, { - "page_title": {"en": "Subtitles", "fr": "Sous-titres"}, + "page_title": set_labels_by_language("Subtitles"), "color": "#6d00ba", "fill_icon": pick_image("icons")("subtitles.png"), }, @@ -302,113 +240,54 @@ ICONS_INFO.update(getattr(settings, "RICHIE_DEMO_ICONS_INFO", {})) HOMEPAGE_CONTENT = { - "en": { - "banner_title": "Welcome to Richie", + str(code): { + "banner_title": translate_message(str(code), "Welcome to Richie"), "banner_content": ( - """

Welcome to Richie

""" - """

It works! This is the default homepage for the Richie CMS.

""" + f"""

{translate_message(str(code), "Welcome")} {translate_message(str(code), "to Richie")}

""" + f"""

{translate_message(str(code), "It works! This is the default homepage for the Richie CMS.")}

""" ), "banner_template": "richie/large_banner/hero-intro.html", "button_template_name": "button-caesura", "section_template": "richie/section/section.html", - "blogposts_title": "Last news", - "blogposts_button_title": "More news", - "courses_title": "Popular courses", - "courses_button_title": "More courses", - "organizations_title": "Universities", - "organizations_button_title": "More universities", - "persons_title": "Persons", - "persons_button_title": "More persons", - "programs_title": "Programs", - "programs_button_title": "More programs", - "subjects_title": "Subjects", - "subjects_button_title": "More subjects", - }, - "fr": { - "banner_title": "Bienvenue sur Richie", - "banner_content": ( - """

Bienvenue sur Richie

""" - """

Ça marche ! Ceci est la page d'accueil par défaut du CMS Richie.

""" - ), - "banner_template": "richie/large_banner/hero-intro.html", - "button_template_name": "button-caesura", - "section_template": "richie/section/section.html", - "blogposts_title": "Actualités récentes", - "blogposts_button_title": "Plus d'actualités", - "courses_title": "Cours à la une", - "courses_button_title": "Plus de cours", - "organizations_title": "Universités", - "organizations_button_title": "Plus d'universités", - "subjects_title": "Thématiques", - "subjects_button_title": "Plus de thématiques", - "persons_title": "Personnes", - "persons_button_title": "Plus de personnes", - "programs_title": "Parcours", - "programs_button_title": "Plus de parcours", - }, + "blogposts_title": translate_message(str(code), "Last news"), + "blogposts_button_title": translate_message(str(code), "More news"), + "courses_title": translate_message(str(code), "Popular courses"), + "courses_button_title": translate_message(str(code), "More courses"), + "organizations_title": translate_message(str(code), "Universities"), + "organizations_button_title": translate_message(str(code), "More universities"), + "persons_title": translate_message(str(code), "Persons"), + "persons_button_title": translate_message(str(code), "More persons"), + "programs_title": translate_message(str(code), "Programs"), + "programs_button_title": translate_message(str(code), "More programs"), + "subjects_title": translate_message(str(code), "Subjects"), + "subjects_button_title": translate_message(str(code), "More subjects"), + } for code, _ in languages } HOMEPAGE_CONTENT.update(getattr(settings, "RICHIE_DEMO_HOMEPAGE_CONTENT", {})) SINGLECOLUMN_CONTENT = { - "en": { - "banner_title": "Single column template sample", - "banner_content": "It works! This is a single column page.", + str(code): { + "banner_title": translate_message(str(code), "Single column template sample"), + "banner_content": translate_message(str(code), "It works! This is a single column page."), "banner_template": "richie/large_banner/hero-intro.html", "button_template_name": "button-caesura", - "section_sample_title": "A sample section", - "section_sample_button_title": "More!", + "section_sample_title": translate_message(str(code), "A sample section"), + "section_sample_button_title": translate_message(str(code), "More"), "section_sample_template": "richie/section/section.html", - }, - "fr": { - "banner_title": "Exemple de template avec une colonne unique", - "banner_content": "Ça marche ! Ceci est une page d'une colonne.", - "banner_template": "richie/large_banner/hero-intro.html", - "button_template_name": "button-caesura", - "section_sample_title": "Une section d'exemple", - "section_sample_button_title": "Plus !", - "section_sample_template": "richie/section/section.html", - }, + } for code, _ in languages } SINGLECOLUMN_CONTENT.update(getattr(settings, "RICHIE_DEMO_SINGLECOLUMN_CONTENT", {})) FOOTER_CONTENT = { - "en": [ - {"name": "About", "link": {"internal_link": "annex__about"}}, - {"name": "Sitemap", "link": {"internal_link": "annex__sitemap"}}, - {"name": "Style guide", "link": {"external_link": "/styleguide/"}}, - { - "title": "Richie community", - "items": [ - { - "name": "Website", - "link": {"external_link": "https://richie.education"}, - }, - { - "name": "Github", - "link": {"external_link": "https://github.com/openfun/richie"}, - }, - { - "name": "Site factory", - "link": { - "external_link": "https://github.com/openfun/richie-site-factory" - }, - }, - { - "name": "Example site", - "link": {"external_link": "https://www.fun-campus.fr"}, - }, - ], - }, - ], - "fr": [ - {"name": "A propos", "link": {"internal_link": "annex__about"}}, - {"name": "Plan du site", "link": {"internal_link": "annex__sitemap"}}, - {"name": "Style guide", "link": {"external_link": "/styleguide/"}}, + str(code): [ + {"name": translate_message(str(code), "About"), "link": {"internal_link": "annex__about"}}, + {"name": translate_message(str(code), "Sitemap"), "link": {"internal_link": "annex__sitemap"}}, + {"name": translate_message(str(code), "Style guide"), "link": {"external_link": "/styleguide/"}}, { - "title": "Communauté Richie", + "title": translate_message(str(code), "Richie community"), "items": [ { - "name": "Site web", + "name": translate_message(str(code), "Website"), "link": {"external_link": "https://richie.education"}, }, { @@ -416,24 +295,26 @@ "link": {"external_link": "https://github.com/openfun/richie"}, }, { - "name": "Usine à sites", + "name": translate_message(str(code), "Site factory"), "link": { "external_link": "https://github.com/openfun/richie-site-factory" }, }, { - "name": "Site exemple", + "name": translate_message(str(code), "Example site"), "link": {"external_link": "https://www.fun-campus.fr"}, }, ], }, - ], + ] for code, _ in languages } FOOTER_CONTENT.update(getattr(settings, "RICHIE_DEMO_FOOTER_CONTENT", {})) COURSE_CONTENT = { - "en": {"partners_title": "Partners", "sponsors_title": "Sponsors"}, - "fr": {"partners_title": "Partenaires", "sponsors_title": "Sponsors"}, + str(code): { + "partners_title": translate_message(str(code), "Partners"), + "sponsors_title": translate_message(str(code), "Sponsors") + } for code, _ in languages } COURSE_CONTENT.update(getattr(settings, "RICHIE_DEMO_COURSE_CONTENT", {})) diff --git a/src/richie/apps/demo/management/commands/create_demo_site.py b/src/richie/apps/demo/management/commands/create_demo_site.py index c55e28cd13..1db23f28a9 100755 --- a/src/richie/apps/demo/management/commands/create_demo_site.py +++ b/src/richie/apps/demo/management/commands/create_demo_site.py @@ -21,9 +21,9 @@ from richie.plugins.glimpse import defaults as glimpse_defaults from richie.plugins.glimpse.factories import GlimpseFactory -from ... import defaults -from ...helpers import create_categories -from ...utils import pick_image +from richie.apps.demo import defaults +from richie.apps.demo.helpers import create_categories +from richie.apps.demo.utils import pick_image logger = logging.getLogger("richie.commands.demo.create_demo_site") @@ -73,6 +73,9 @@ def create_demo_site(): site.name = "Richie demonstration" site.save() + languages = getattr(settings, "LANGUAGES", ()) + languages = [language_code for language_code, _ in languages] + lms_endpoint = ( getattr(settings, "RICHIE_LMS_BACKENDS", None) or [{"BASE_URL": defaults.DEFAULT_LMS_ENDPOINT}] @@ -179,12 +182,14 @@ def create_footer_link(**link_info): # Create organizations under the `Organizations` page organizations = [] + for i in range(defaults.NB_OBJECTS["organizations"]): # Randomly assign each organization to a partnership level category + organizations.append( factories.OrganizationFactory( page_in_navigation=True, - page_languages=["en", "fr"], + page_languages=languages, page_parent=pages_created["organizations"], fill_banner=pick_image("banner"), fill_categories=( @@ -206,9 +211,10 @@ def create_footer_link(**link_info): organizations, random.randint(1, defaults.NB_OBJECTS["person_organizations"]), # nosec ) + person = factories.PersonFactory( page_in_navigation=True, - page_languages=["en", "fr"], + page_languages=languages, page_parent=pages_created["persons"], fill_categories=random.sample( subjects, @@ -255,10 +261,9 @@ def create_footer_link(**link_info): if licences else [] ) - course = factories.CourseFactory( page_in_navigation=True, - page_languages=["en", "fr"], + page_languages=languages, page_parent=pages_created["courses"], fill_licences=course_licences, fill_team=random.sample( @@ -367,17 +372,12 @@ def create_footer_link(**link_info): # Add a random number of course runs to the course nb_course_runs = get_number_of_course_runs() - # pick a subset of languages for this course (otherwise all courses will have more or - # less all the languages across their course runs!) - languages_subset = random.sample( - ["de", "en", "es", "fr", "it", "nl"], random.randint(1, 4) # nosec - ) # only half the courses have an enrollment count defined for i in range(nb_course_runs): course_run = factories.CourseRunFactory( __sequence=i, languages=random.sample( - languages_subset, random.randint(1, len(languages_subset)) # nosec + languages, random.randint(1, len(languages)) # nosec ), direct_course=course, resource_link=f"{lms_endpoint}/courses/course-v1:edX+DemoX+Demo_Course/info", @@ -400,7 +400,7 @@ def create_footer_link(**link_info): for _i in range(defaults.NB_OBJECTS["blogposts"]): post = factories.BlogPostFactory.create( page_in_navigation=True, - page_languages=["en", "fr"], + page_languages=languages, page_parent=pages_created["blogposts"], fill_cover=pick_image("cover"), fill_excerpt=True, @@ -416,10 +416,11 @@ def create_footer_link(**link_info): # Create programs under the `Programs` page programs = [] + for _i in range(defaults.NB_OBJECTS["programs"]): program = factories.ProgramFactory.create( page_in_navigation=True, - page_languages=["en", "fr"], + page_languages=languages, page_parent=pages_created["programs"], fill_cover=pick_image("cover"), fill_excerpt=True, @@ -837,4 +838,4 @@ def handle(self, *args, **options): create_demo_site() - logger.info("done") + logger.info("done") \ No newline at end of file