diff --git a/Procfile b/Procfile
new file mode 100644
index 00000000000000..bef5264b4657b1
--- /dev/null
+++ b/Procfile
@@ -0,0 +1 @@
+web: npm run start
\ No newline at end of file
diff --git a/api-server/src/common/models/user.js b/api-server/src/common/models/user.js
index c8fe2571f04e12..7dec4bb43adafb 100644
--- a/api-server/src/common/models/user.js
+++ b/api-server/src/common/models/user.js
@@ -977,6 +977,7 @@ export default function initializeUser(User) {
return user.progressTimestamps;
});
};
+
User.prototype.getCompletedChallenges$ = function getCompletedChallenges$() {
if (
Array.isArray(this.completedChallenges) &&
diff --git a/api-server/src/common/models/user.json b/api-server/src/common/models/user.json
index 88419eaedb20d7..35b1fbc11d4a92 100644
--- a/api-server/src/common/models/user.json
+++ b/api-server/src/common/models/user.json
@@ -85,6 +85,34 @@
"type": "string",
"default": ""
},
+ "gender": {
+ "type": "string",
+ "default": ""
+ },
+ "codeTime": {
+ "type": "string",
+ "default": ""
+ },
+ "fieldOfStudy": {
+ "type": "string",
+ "default": ""
+ },
+ "levelOfStudy": {
+ "type": "string",
+ "default": ""
+ },
+ "employedWhere": {
+ "type": "string",
+ "default": ""
+ },
+ "sinceWhen": {
+ "type": "string",
+ "default": ""
+ },
+ "position": {
+ "type": "string",
+ "default": ""
+ },
"location": {
"type": "string",
"default": ""
diff --git a/api-server/src/server/boot/donate.js b/api-server/src/server/boot/donate.js
index b7029430530177..ac36415a5f2610 100644
--- a/api-server/src/server/boot/donate.js
+++ b/api-server/src/server/boot/donate.js
@@ -1,231 +1,230 @@
-import debug from 'debug';
-import Stripe from 'stripe';
-
-import { donationSubscriptionConfig } from '../../../../config/donation-settings';
-import keys from '../../../../config/secrets';
-import {
- getAsyncPaypalToken,
- verifyWebHook,
- updateUser,
- verifyWebHookType,
- createStripeCardDonation
-} from '../utils/donation';
-import { validStripeForm } from '../utils/stripeHelpers';
-
-const log = debug('fcc:boot:donate');
-
-export default function donateBoot(app, done) {
- let stripe = false;
- const { User } = app.models;
- const api = app.loopback.Router();
- const hooks = app.loopback.Router();
- const donateRouter = app.loopback.Router();
-
- function connectToStripe() {
- return new Promise(function () {
- // connect to stripe API
- stripe = Stripe(keys.stripe.secret);
- });
- }
-
- async function handleStripeCardDonation(req, res) {
- return createStripeCardDonation(req, res, stripe, app).catch(err => {
- if (
- err.type === 'AlreadyDonatingError' ||
- err.type === 'UserActionRequired' ||
- err.type === 'PaymentMethodRequired'
- ) {
- return res.status(402).send({ error: err });
- }
- if (err.type === 'InvalidRequest')
- return res.status(400).send({ error: err });
- return res.status(500).send({
- error: 'Donation failed due to a server error.'
- });
- });
- }
-
- function createStripeDonation(req, res) {
- const { user, body } = req;
-
- const {
- amount,
- duration,
- token: { id },
- email,
- name
- } = body;
-
- if (!validStripeForm(amount, duration, email)) {
- return res.status(500).send({
- error: 'The donation form had invalid values for this submission.'
- });
- }
-
- const fccUser = user
- ? Promise.resolve(user)
- : new Promise((resolve, reject) =>
- User.findOrCreate(
- { where: { email } },
- { email },
- (err, instance) => {
- if (err) {
- return reject(err);
- }
- return resolve(instance);
- }
- )
- );
-
- let donatingUser = {};
- let donation = {
- email,
- amount,
- duration,
- provider: 'stripe',
- startDate: new Date(Date.now()).toISOString()
- };
-
- const createCustomer = async user => {
- let customer;
- donatingUser = user;
- try {
- customer = await stripe.customers.create({
- email,
- card: id,
- name
- });
- } catch (err) {
- throw new Error('Error creating stripe customer');
- }
- log(`Stripe customer with id ${customer.id} created`);
- return customer;
- };
-
- const createSubscription = async customer => {
- donation.customerId = customer.id;
- let sub;
- try {
- sub = await stripe.subscriptions.create({
- customer: customer.id,
- items: [
- {
- plan: `${donationSubscriptionConfig.duration[
- duration
- ].toLowerCase()}-donation-${amount}`
- }
- ]
- });
- } catch (err) {
- throw new Error('Error creating stripe subscription');
- }
- return sub;
- };
-
- const createAsyncUserDonation = () => {
- donatingUser
- .createDonation(donation)
- .toPromise()
- .catch(err => {
- throw new Error(err);
- });
- };
-
- return Promise.resolve(fccUser)
- .then(nonDonatingUser => {
- // the logic is removed since users can donate without an account
- return nonDonatingUser;
- })
- .then(createCustomer)
- .then(customer => {
- return createSubscription(customer).then(subscription => {
- log(`Stripe subscription with id ${subscription.id} created`);
- donation.subscriptionId = subscription.id;
- return res.send(subscription);
- });
- })
- .then(createAsyncUserDonation)
- .catch(err => {
- if (
- err.type === 'StripeCardError' ||
- err.type === 'AlreadyDonatingError'
- ) {
- return res.status(402).send({ error: err.message });
- }
- return res
- .status(500)
- .send({ error: 'Donation failed due to a server error.' });
- });
- }
-
- function addDonation(req, res) {
- const { user, body } = req;
- if (!user || !body) {
- return res
- .status(500)
- .json({ error: 'User must be signed in for this request.' });
- }
- return Promise.resolve(req)
- .then(
- user.updateAttributes({
- isDonating: true
- })
- )
- .then(() => res.status(200).json({ isDonating: true }))
- .catch(err => {
- log(err.message);
- return res.status(500).json({
- type: 'danger',
- message: 'Something went wrong.'
- });
- });
- }
-
- function updatePaypal(req, res) {
- const { headers, body } = req;
- return Promise.resolve(req)
- .then(verifyWebHookType)
- .then(getAsyncPaypalToken)
- .then(token => verifyWebHook(headers, body, token, keys.paypal.webhookId))
- .then(hookBody => updateUser(hookBody, app))
- .catch(err => {
- // Todo: This probably need to be thrown and caught in error handler
- log(err.message);
- })
- .finally(() => res.status(200).json({ message: 'received paypal hook' }));
- }
-
- const stripeKey = keys.stripe.public;
- const secKey = keys.stripe.secret;
- const paypalKey = keys.paypal.client;
- const paypalSec = keys.paypal.secret;
-
- const stripeSecretInvalid = !secKey || secKey === 'sk_from_stripe_dashboard';
- const stripPublicInvalid =
- !stripeKey || stripeKey === 'pk_from_stripe_dashboard';
- const paypalSecretInvalid =
- !paypalKey || paypalKey === 'id_from_paypal_dashboard';
- const paypalPublicInvalid =
- !paypalSec || paypalSec === 'secret_from_paypal_dashboard';
-
- const stripeInvalid = stripeSecretInvalid || stripPublicInvalid;
- const paypalInvalid = paypalPublicInvalid || paypalSecretInvalid;
-
- if (stripeInvalid || paypalInvalid) {
- if (process.env.FREECODECAMP_NODE_ENV === 'production') {
- throw new Error('Donation API keys are required to boot the server!');
- }
- log('Donation disabled in development unless ALL test keys are provided');
- done();
- } else {
- api.post('/charge-stripe', createStripeDonation);
- api.post('/charge-stripe-card', handleStripeCardDonation);
- api.post('/add-donation', addDonation);
- hooks.post('/update-paypal', updatePaypal);
- donateRouter.use('/donate', api);
- donateRouter.use('/hooks', hooks);
- app.use(donateRouter);
- connectToStripe(stripe).then(done);
- done();
- }
+// import debug from 'debug';
+// import Stripe from 'stripe';
+
+// import { donationSubscriptionConfig } from '../../../../config/donation-settings';
+// import keys from '../../../../config/secrets';
+// import {
+// getAsyncPaypalToken,
+// verifyWebHook,
+// updateUser,
+// verifyWebHookType,
+// createStripeCardDonation
+// } from '../utils/donation';
+// import { validStripeForm } from '../utils/stripeHelpers';
+
+// const log = debug('fcc:boot:donate');
+
+export default function donateBoot() {
+ // let stripe = false;
+ // const { User } = app.models;
+ // const api = app.loopback.Router();
+ // const hooks = app.loopback.Router();
+ // const donateRouter = app.loopback.Router();
+ // function connectToStripe() {
+ // return new Promise(function () {
+ // // connect to stripe API
+ // stripe = Stripe(keys.stripe.secret);
+ // });
}
+
+// async function handleStripeCardDonation(req, res) {
+// return createStripeCardDonation(req, res, stripe, app).catch(err => {
+// if (
+// err.type === 'AlreadyDonatingError' ||
+// err.type === 'UserActionRequired' ||
+// err.type === 'PaymentMethodRequired'
+// ) {
+// return res.status(402).send({ error: err });
+// }
+// if (err.type === 'InvalidRequest')
+// return res.status(400).send({ error: err });
+// return res.status(500).send({
+// error: 'Donation failed due to a server error.'
+// });
+// });
+// }
+
+// function createStripeDonation(req, res) {
+// const { user, body } = req;
+
+// const {
+// amount,
+// duration,
+// token: { id },
+// email,
+// name
+// } = body;
+
+// if (!validStripeForm(amount, duration, email)) {
+// return res.status(500).send({
+// error: 'The donation form had invalid values for this submission.'
+// });
+// }
+
+// const fccUser = user
+// ? Promise.resolve(user)
+// : new Promise((resolve, reject) =>
+// User.findOrCreate(
+// { where: { email } },
+// { email },
+// (err, instance) => {
+// if (err) {
+// return reject(err);
+// }
+// return resolve(instance);
+// }
+// )
+// );
+
+// let donatingUser = {};
+// let donation = {
+// email,
+// amount,
+// duration,
+// provider: 'stripe',
+// startDate: new Date(Date.now()).toISOString()
+// };
+
+// const createCustomer = async user => {
+// let customer;
+// donatingUser = user;
+// try {
+// customer = await stripe.customers.create({
+// email,
+// card: id,
+// name
+// });
+// } catch (err) {
+// throw new Error('Error creating stripe customer');
+// }
+// log(`Stripe customer with id ${customer.id} created`);
+// return customer;
+// };
+
+// const createSubscription = async customer => {
+// donation.customerId = customer.id;
+// let sub;
+// try {
+// sub = await stripe.subscriptions.create({
+// customer: customer.id,
+// items: [
+// {
+// plan: `${donationSubscriptionConfig.duration[
+// duration
+// ].toLowerCase()}-donation-${amount}`
+// }
+// ]
+// });
+// } catch (err) {
+// throw new Error('Error creating stripe subscription');
+// }
+// return sub;
+// };
+
+// const createAsyncUserDonation = () => {
+// donatingUser
+// .createDonation(donation)
+// .toPromise()
+// .catch(err => {
+// throw new Error(err);
+// });
+// };
+
+// return Promise.resolve(fccUser)
+// .then(nonDonatingUser => {
+// // the logic is removed since users can donate without an account
+// return nonDonatingUser;
+// })
+// .then(createCustomer)
+// .then(customer => {
+// return createSubscription(customer).then(subscription => {
+// log(`Stripe subscription with id ${subscription.id} created`);
+// donation.subscriptionId = subscription.id;
+// return res.send(subscription);
+// });
+// })
+// .then(createAsyncUserDonation)
+// .catch(err => {
+// if (
+// err.type === 'StripeCardError' ||
+// err.type === 'AlreadyDonatingError'
+// ) {
+// return res.status(402).send({ error: err.message });
+// }
+// return res
+// .status(500)
+// .send({ error: 'Donation failed due to a server error.' });
+// });
+// }
+
+// function addDonation(req, res) {
+// const { user, body } = req;
+// if (!user || !body) {
+// return res
+// .status(500)
+// .json({ error: 'User must be signed in for this request.' });
+// }
+// return Promise.resolve(req)
+// .then(
+// user.updateAttributes({
+// isDonating: true
+// })
+// )
+// .then(() => res.status(200).json({ isDonating: true }))
+// .catch(err => {
+// log(err.message);
+// return res.status(500).json({
+// type: 'danger',
+// message: 'Something went wrong.'
+// });
+// });
+// }
+
+// function updatePaypal(req, res) {
+// const { headers, body } = req;
+// return Promise.resolve(req)
+// .then(verifyWebHookType)
+// .then(getAsyncPaypalToken)
+// .then(token => verifyWebHook(headers, body, token, keys.paypal.webhookId))
+// .then(hookBody => updateUser(hookBody, app))
+// .catch(err => {
+// // Todo: This probably need to be thrown and caught in error handler
+// log(err.message);
+// })
+// .finally(() => res.status(200).json({ message: 'received paypal hook' }));
+// }
+
+// const stripeKey = keys.stripe.public;
+// const secKey = keys.stripe.secret;
+// const paypalKey = keys.paypal.client;
+// const paypalSec = keys.paypal.secret;
+
+// const stripeSecretInvalid = !secKey || secKey === 'sk_from_stripe_dashboard';
+// const stripPublicInvalid =
+// !stripeKey || stripeKey === 'pk_from_stripe_dashboard';
+// const paypalSecretInvalid =
+// !paypalKey || paypalKey === 'id_from_paypal_dashboard';
+// const paypalPublicInvalid =
+// !paypalSec || paypalSec === 'secret_from_paypal_dashboard';
+
+// const stripeInvalid = stripeSecretInvalid || stripPublicInvalid;
+// const paypalInvalid = paypalPublicInvalid || paypalSecretInvalid;
+
+// if (stripeInvalid || paypalInvalid) {
+// if (process.env.FREECODECAMP_NODE_ENV === 'production') {
+// throw new Error('Donation API keys are required to boot the server!');
+// }
+// log('Donation disabled in development unless ALL test keys are provided');
+// done();
+// } else {
+// api.post('/charge-stripe', createStripeDonation);
+// api.post('/charge-stripe-card', handleStripeCardDonation);
+// api.post('/add-donation', addDonation);
+// hooks.post('/update-paypal', updatePaypal);
+// donateRouter.use('/donate', api);
+// donateRouter.use('/hooks', hooks);
+// app.use(donateRouter);
+// connectToStripe(stripe).then(done);
+// done();
+// }
+// }
diff --git a/api-server/src/server/boot/settings.js b/api-server/src/server/boot/settings.js
index 88112f50711a2b..6613ea922eea8f 100644
--- a/api-server/src/server/boot/settings.js
+++ b/api-server/src/server/boot/settings.js
@@ -1,6 +1,6 @@
import debug from 'debug';
import { check } from 'express-validator';
-import isURL from 'validator/lib/isURL';
+// import isURL from 'validator/lib/isURL';
import { isValidUsername } from '../../../../utils/validate';
import { alertTypes } from '../../common/utils/flash.js';
@@ -27,6 +27,8 @@ export default function settingsController(app) {
api.post('/update-my-portfolio', ifNoUser401, updateMyPortfolio);
api.post('/update-my-theme', deprecatedEndpoint);
api.put('/update-my-about', ifNoUser401, updateMyAbout);
+ api.put('/update-my-education', ifNoUser401, updateMyEducation);
+ api.put('/update-my-work-experience', ifNoUser401, updateMyWorkExperience);
api.put(
'/update-my-email',
ifNoUser401,
@@ -126,13 +128,36 @@ function updateMyProfileUI(req, res, next) {
function updateMyAbout(req, res, next) {
const {
user,
- body: { name, location, about, picture }
+ body: { name, location, gender, codeTime, about, picture }
} = req;
- log(name, location, picture, about);
+ log(name, location, gender, codeTime, about, picture);
// prevent dataurls from being stored
- const update = isURL(picture, { require_protocol: true })
- ? { name, location, about, picture }
- : { name, location, about };
+ // const update = isURL(picture, { require_protocol: true })
+ // ? { name, location, gender, codeTime, about, picture }
+ // : { name, location, gender, codeTime, about };
+ const update = { name, location, gender, codeTime, about };
+ return user.updateAttributes(update, createStandardHandler(req, res, next));
+}
+
+function updateMyEducation(req, res, next) {
+ const {
+ user,
+ body: { fieldOfStudy, levelOfStudy }
+ } = req;
+ log(fieldOfStudy, levelOfStudy);
+ // prevent dataurls from being stored
+ const update = { fieldOfStudy, levelOfStudy };
+ return user.updateAttributes(update, createStandardHandler(req, res, next));
+}
+
+function updateMyWorkExperience(req, res, next) {
+ const {
+ user,
+ body: { employedWhere, sinceWhen, position }
+ } = req;
+ log(employedWhere, sinceWhen, position);
+ // prevent dataurls from being stored
+ const update = { employedWhere, sinceWhen, position };
return user.updateAttributes(update, createStandardHandler(req, res, next));
}
diff --git a/api-server/src/server/index.js b/api-server/src/server/index.js
index 8d047438310518..760a62580e6e51 100644
--- a/api-server/src/server/index.js
+++ b/api-server/src/server/index.js
@@ -70,7 +70,7 @@ app.start = _.once(function () {
const server = app.listen(app.get('port'), function () {
app.emit('started');
log(
- 'freeCodeCamp server listening on port %d in %s',
+ 'KDA learning platform server listening on port %d in %s',
app.get('port'),
app.get('env')
);
diff --git a/api-server/src/server/utils/publicUserProps.js b/api-server/src/server/utils/publicUserProps.js
index ca71fd21debba7..dd943820c64fef 100644
--- a/api-server/src/server/utils/publicUserProps.js
+++ b/api-server/src/server/utils/publicUserProps.js
@@ -42,7 +42,14 @@ export const publicUserProps = [
'twitter',
'username',
'website',
- 'yearsTopContributor'
+ 'yearsTopContributor',
+ 'gender',
+ 'codeTime',
+ 'fieldOfStudy',
+ 'levelOfStudy',
+ 'employedWhere',
+ 'sinceWhen',
+ 'position'
];
export const userPropsForSession = [
diff --git a/client/gatsby-config.js b/client/gatsby-config.js
index ba8d6a9ff385ac..58d55ed4120f11 100644
--- a/client/gatsby-config.js
+++ b/client/gatsby-config.js
@@ -19,7 +19,7 @@ module.exports = {
DEV_SSR: false
},
siteMetadata: {
- title: 'freeCodeCamp',
+ title: 'Code Learning Platform',
siteUrl: homeLocation
},
pathPrefix: pathPrefix,
diff --git a/client/gatsby-node.js b/client/gatsby-node.js
index 3bc54eacca0504..157e7645681529 100644
--- a/client/gatsby-node.js
+++ b/client/gatsby-node.js
@@ -4,7 +4,7 @@ const { createFilePath } = require('gatsby-source-filesystem');
const uniq = require('lodash/uniq');
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
const webpack = require('webpack');
-const env = require('../config/env.json');
+// const env = require('../config/env.json');
const { blockNameify } = require('../utils/block-nameify');
const {
@@ -33,28 +33,28 @@ exports.onCreateNode = function onCreateNode({ node, actions, getNode }) {
}
};
-exports.createPages = function createPages({ graphql, actions, reporter }) {
- if (!env.algoliaAPIKey || !env.algoliaAppId) {
- if (process.env.FREECODECAMP_NODE_ENV === 'production') {
- throw new Error(
- 'Algolia App id and API key are required to start the client!'
- );
- } else {
- reporter.info(
- 'Algolia keys missing or invalid. Required for search to yield results.'
- );
- }
- }
+exports.createPages = function createPages({ graphql, actions }) {
+ // if (!env.algoliaAPIKey || !env.algoliaAppId) {
+ // if (process.env.FREECODECAMP_NODE_ENV === 'production') {
+ // throw new Error(
+ // 'Algolia App id and API key are required to start the client!'
+ // );
+ // } else {
+ // reporter.info(
+ // 'Algolia keys missing or invalid. Required for search to yield results.'
+ // );
+ // }
+ // }
- if (!env.stripePublicKey) {
- if (process.env.FREECODECAMP_NODE_ENV === 'production') {
- throw new Error('Stripe public key is required to start the client!');
- } else {
- reporter.info(
- 'Stripe public key is missing or invalid. Required for Stripe integration.'
- );
- }
- }
+ // if (!env.stripePublicKey) {
+ // if (process.env.FREECODECAMP_NODE_ENV === 'production') {
+ // throw new Error('Stripe public key is required to start the client!');
+ // } else {
+ // reporter.info(
+ // 'Stripe public key is missing or invalid. Required for Stripe integration.'
+ // );
+ // }
+ // }
const { createPage } = actions;
diff --git a/client/i18n/locales/english/meta-tags.json b/client/i18n/locales/english/meta-tags.json
index cf2020dbfb80e6..9997ba10c0d66e 100644
--- a/client/i18n/locales/english/meta-tags.json
+++ b/client/i18n/locales/english/meta-tags.json
@@ -1,7 +1,7 @@
{
- "title": "Learn to Code — For Free — Coding Courses for Busy People",
- "description": "Learn to Code — For Free",
- "social-description": "Learn to Code — For Free",
+ "title": "Apprendre à coder - gratuitement",
+ "description": "Apprendre à coder - gratuitement",
+ "social-description": "Apprendre à coder - gratuitement",
"keywords": [
"python",
"javascript",
@@ -28,5 +28,5 @@
"tutorial",
"programming"
],
- "youre-unsubscribed": "You have been unsubscribed"
+ "youre-unsubscribed": "Vous avez été désabonné(e)"
}
diff --git a/client/i18n/locales/french/intro.json b/client/i18n/locales/french/intro.json
new file mode 100644
index 00000000000000..2c0a970c0c79fb
--- /dev/null
+++ b/client/i18n/locales/french/intro.json
@@ -0,0 +1,771 @@
+{
+ "responsive-web-design": {
+ "title": "Responsive Web Design TTest",
+ "intro": [
+ "In this Responsive Web Design Certification, you'll learn the languages that developers use to build webpages: HTML (Hypertext Markup Language) for content, and CSS (Cascading Style Sheets) for design.",
+ "First, you'll build a cat photo app to learn the basics of HTML and CSS. Later, you'll learn modern techniques like CSS variables by building a penguin, and best practices for accessibility by building a web form.",
+ "Finally, you'll learn how to make webpages that respond to different screen sizes by building a Twitter card with Flexbox, and a complex blog layout with CSS Grid."
+ ],
+ "note": "Note: Some browser extensions, such as ad-blockers and dark mode extensions can interfere with the tests. If you face issues, we recommend disabling extensions that modify the content or layout of pages, while taking the course.",
+ "blocks": {
+ "basic-html-and-html5": {
+ "title": "Basic HTML and HTML5",
+ "intro": [
+ "HTML is a markup language that uses a special syntax or notation to describe the structure of a webpage to the browser. HTML elements usually have opening and closing tags that surround and give meaning to content. For example, different elements can describe text as a heading, paragraph, or list item.",
+ "In this course, you'll build a cat photo app to learn some of the most common HTML elements — the building blocks of any webpage."
+ ]
+ },
+ "basic-css": {
+ "title": "Basic CSS",
+ "intro": [
+ "CSS, or Cascading Style Sheets, tell the browser how to display the text and other content that you write in HTML. With CSS, you can control the color, font, size, spacing, and many other aspects of HTML elements.",
+ "Now that you've described the structure of your cat photo app, give it some style with CSS."
+ ]
+ },
+ "applied-visual-design": {
+ "title": "Applied Visual Design",
+ "intro": [
+ "Visual design is a combination of typography, color theory, graphics, animation, page layout, and more to help deliver your unique message.",
+ "In this course, you'll learn how to apply these different elements of visual design to your webpages."
+ ]
+ },
+ "applied-accessibility": {
+ "title": "Applied Accessibility",
+ "intro": [
+ "In web development, accessibility refers to web content and a UI (user interface) that can be understood, navigated, and interacted with by a broad audience. This includes people with visual, auditory, mobility, or cognitive disabilities.",
+ "In this course, you'll learn best practices for building webpages that are accessible to everyone."
+ ]
+ },
+ "responsive-web-design-principles": {
+ "title": "Responsive Web Design Principles",
+ "intro": [
+ "There are many devices that can access the web, and they come in all shapes and sizes. Responsive web design is the practice of designing flexible websites that can respond to different screen sizes, orientations, and resolutions.",
+ "In this course, you'll learn how to use CSS to make your webpages look good, no matter what device they're viewed on."
+ ]
+ },
+ "css-flexbox": {
+ "title": "CSS Flexbox",
+ "intro": [
+ "Flexbox is a powerful, well-supported layout method that was introduced with the latest version of CSS, CSS3. With flexbox, it's easy to center elements on the page and create dynamic user interfaces that shrink and expand automatically.",
+ "In this course, you'll learn the fundamentals of flexbox and dynamic layouts by building a Twitter card."
+ ]
+ },
+ "css-grid": {
+ "title": "CSS Grid",
+ "intro": [
+ "The CSS grid is a newer standard that makes it easy to build complex responsive layouts. It works by turning an HTML element into a grid, and lets you place child elements anywhere within.",
+ "In this course, you'll learn the fundamentals of CSS grid by building different complex layouts, including a blog."
+ ]
+ },
+ "responsive-web-design-projects": {
+ "title": "Responsive Web Design Projects",
+ "intro": [
+ "Time to put your newly learnt skills to work. By working on these projects, you will get a chance to apply all of the skills, principles, and concepts you have learned so far: HTML, CSS, Visual Design, Accessibility, and more.",
+ "Complete the five web programming projects below to earn your Responsive Web Design certification."
+ ]
+ }
+ }
+ },
+ "2022/responsive-web-design": {
+ "title": "Responsive Web Design (Beta)",
+ "intro": [
+ "In this Responsive Web Design Certification, you'll learn the languages that developers use to build webpages: HTML (Hypertext Markup Language) for content, and CSS (Cascading Style Sheets) for design.",
+ "First, you'll build a cat photo app to learn the basics of HTML and CSS. Later, you'll learn modern techniques like CSS variables by building a penguin, and best practices for accessibility by building a web form.",
+ "Finally, you'll learn how to make webpages that respond to different screen sizes by building a Twitter card with Flexbox, and a complex blog layout with CSS Grid."
+ ],
+ "note": "Note: Some browser extensions, such as ad-blockers and dark mode extensions can interfere with the tests. If you face issues, we recommend disabling extensions that modify the content or layout of pages, while taking the course.",
+ "blocks": {
+ "build-a-tribute-page-project": {
+ "title": "Tribute Page",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will build a tribute page for a subject of your choosing, fictional or real."
+ ] },
+ "build-a-personal-portfolio-webpage-project": {
+ "title": "Personal Portfolio Webpage",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will build your own personal portfolio page."
+ ] },
+ "build-a-product-landing-page-project": {
+ "title": "Product Landing Page",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will build a product landing page to market a product of your choice."
+ ] },
+ "build-a-survey-form-project": {
+ "title": "Survey Form",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will build a survey form to collect data from your users."
+ ] },
+ "build-a-technical-documentation-page-project": {
+ "title": "Technical Documentation Page",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will build a technical documentation page to serve as instruction or reference for a topic."
+ ] },
+ "learn-html-by-building-a-cat-photo-app": {
+ "title": "Learn HTML by Building a Cat Photo App",
+ "intro": [
+ "HTML tags give a webpage its structure. You can use HTML tags to add photos, buttons, and other elements to your webpage.",
+ "In this course, you'll learn the most common HTML tags by building your own cat photo app."
+ ]
+ },
+ "learn-basic-css-by-building-a-cafe-menu": {
+ "title": "Learn Basic CSS by Building a Cafe Menu",
+ "intro": [
+ "CSS tells the browser how to display your webpage. You can use CSS to set the color, font, size, and other aspects of HTML elements.",
+ "In this course, you'll learn CSS by designing a menu page for a cafe webpage."
+ ]
+ },
+ "learn-the-css-box-model-by-building-a-rothko-painting": {
+ "title": "Learn the CSS Box Model by Building a Rothko Painting",
+ "intro": [
+ "Every HTML element is its own box – with its own spacing and a border. This is called the Box Model.",
+ "In this course, you'll use CSS and the Box Model to create your own Rothko-style rectangular art pieces."
+ ]
+ },
+ "learn-css-variables-by-building-a-city-skyline": {
+ "title": "Learn CSS Variables by Building a City Skyline",
+ "intro": [
+ "CSS variables help you organize your styles and reuse them.",
+ "In this course, you'll build a city skyline. You'll learn how to configure CSS variables so you can reuse them whenever you want."
+ ]
+ },
+ "learn-html-forms-by-building-a-registration-form": {
+ "title": "Learn HTML Forms by Building a Registration Form",
+ "intro": [
+ "You can use HTML forms to collect information from people who visit your webpage.",
+ "In this course, you'll learn HTML forms by building a signup page. You'll learn how to control what types of data people can type into your form, and some new CSS tools for styling your page."
+ ]
+ },
+ "learn-accessibility-by-building-a-quiz": {
+ "title": "Learn Accessibility by Building a Quiz",
+ "intro": [
+ "Accessibility is making your webpage easy for all people to use – even people with disabilities.",
+ "In this course, you'll build a quiz webpage. You'll learn accessibility tools such as keyboard shortcuts, ARIA attributes, and design best practices."
+ ]
+ },
+ "learn-intermediate-css-by-building-a-picasso-painting": {
+ "title": "Learn Intermediate CSS by Building a Picasso Painting",
+ "intro": [
+ "In this course, you'll use learn some intermediate CSS techniques by coding your own Picasso painting webpage. You'll learn about SVG icons, CSS positioning, and review other CSS skills you've learned."
+ ]
+ },
+ "learn-responsive-web-design-by-building-a-piano": {
+ "title": "Learn Responsive Web Design by Building a Piano",
+ "intro": [
+ "Responsive Design tells your webpage how it should look on different-sized screens.",
+ "In this course, you'll use CSS and Responsive Design to code a piano. You'll also learn more about media queries and pseudo selectors."
+ ]
+ },
+ "learn-css-flexbox-by-building-a-photo-gallery": {
+ "title": "Learn CSS Flexbox by Building a Photo Gallery",
+ "intro": [
+ "Flexbox helps you design your webpage so that it looks good on any screen size.",
+ "In this course, you'll use Flexbox to build a responsive photo gallery webpage."
+ ]
+ },
+ "learn-css-grid-by-building-a-magazine": {
+ "title": "Learn CSS Grid by Building a Magazine",
+ "intro": [
+ "CSS Grid gives you control over the rows and columns of your webpage design.",
+ "In this course, you'll build a magazine article. You'll learn how to use CSS Grid, including concepts like grid rows and grid columns."
+ ]
+ },
+ "learn-typography-by-building-a-nutrition-label": {
+ "title": "Learn Typography by Building a Nutrition Label",
+ "intro": [
+ "Typography is the art of styling your text to be easily readable and suit its purpose.",
+ "In this course, you'll use typography to build a nutrition label webpage. You'll learn how to style text, adjust line height, and position your text using CSS."
+ ]
+ },
+ "learn-css-transforms-by-building-a-penguin": { "title": "Learn CSS Transforms by Building a Penguin", "intro": [
+ "You can transform HTML elements to create appealing designs that draw your reader's eye. You can use transforms to rotate elements, scale them, and more.",
+ "In this course, you'll build a penguin. You'll use CSS transforms to position and resize the parts of your penguin, create a background, and animate your work."
+ ] },
+ "learn-css-animation-by-building-a-ferris-wheel": { "title": "Learn CSS Animation by Building a Ferris Wheel", "intro": [
+ "You can use CSS animation to draw attention to specific sections of your webpage and make it more engaging.",
+ "In this course, you'll build a Ferris wheel. You'll learn how to use CSS to animate elements, transform them, and adjust their speed."
+ ] },
+ "learn-more-about-css-pseudo-selectors-by-building-a-balance-sheet": { "title": "Learn More About CSS Pseudo Selectors By Building A Balance Sheet", "intro": [
+ "You can use CSS pseudo selectors to change specific HTML elements.",
+ "In this course, you'll build a balance sheet using pseudo selectors. You'll learn how to change the style of an element when you hover over it with your mouse, and trigger other events on your webpage."
+ ] },
+ "learn-css-colors-by-building-a-set-of-colored-markers": {
+ "title": "Learn CSS Colors by Building a Set of Colored Markers",
+ "intro": [
+ "Selecting the correct colors for your webpage can greatly improve the aesthetic appeal to your readers.",
+ "In this course, you'll build a set of colored markers. You'll learn different ways to set color values and how to pair colors with each other."
+ ] }
+ }
+ },
+ "javascript-algorithms-and-data-structures": {
+ "title": "JavaScript Algorithms and Data Structures",
+ "intro": [
+ "While HTML and CSS control the content and styling of a page, JavaScript is used to make it interactive. In the JavaScript Algorithm and Data Structures Certification, you'll learn the fundamentals of JavaScript including variables, arrays, objects, loops, and functions.",
+ "Once you have the fundamentals down, you'll apply that knowledge by creating algorithms to manipulate strings, factorialize numbers, and even calculate the orbit of the International Space Station.",
+ "Along the way, you'll also learn two important programming styles or paradigms: Object Oriented Programming (OOP) and Functional Programming (FP)."
+ ],
+ "note": "Note: Some browser extensions, such as ad-blockers and script-blockers can interfere with the tests. If you face issues, we recommend disabling extensions that modify or block the content of pages while taking the course.",
+ "blocks": {
+ "basic-javascript": {
+ "title": "Basic JavaScript",
+ "intro": [
+ "JavaScript is a scripting language you can use to make web pages interactive. It is one of the core technologies of the web, along with HTML and CSS, and is supported by all modern browsers.",
+ "In this course, you'll learn fundamental programming concepts in JavaScript. You'll start with basic data structures like numbers and strings. Then you'll learn to work with arrays, objects, functions, loops, if/else statements, and more."
+ ]
+ },
+ "es6": {
+ "title": "ES6",
+ "intro": [
+ "ECMAScript, or ES, is a standardized version of JavaScript. Because all major browsers follow this specification, the terms ECMAScript and JavaScript are interchangeable.",
+ "Most of the JavaScript you've learned up to this point was in ES5 (ECMAScript 5), which was finalized in 2009. While you can still write programs in ES5, JavaScript is constantly evolving, and new features are released every year.",
+ "ES6, released in 2015, added many powerful new features to the language. In this course, you'll learn these new features, including arrow functions, destructuring, classes, promises, and modules."
+ ]
+ },
+ "regular-expressions": {
+ "title": "Regular Expressions",
+ "intro": [
+ "Regular expressions, often shortened to \"regex\" or \"regexp\", are patterns that help programmers match, search, and replace text. Regular expressions are very powerful, but can be hard to read because they use special characters to make more complex, flexible matches.",
+ "In this course, you'll learn how to use special characters, capture groups, positive and negative lookaheads, and other techniques to match any text you want."
+ ]
+ },
+ "debugging": {
+ "title": "Debugging",
+ "intro": [
+ "Debugging is the process of going through your code, finding any issues, and fixing them.",
+ "Issues in code generally come in three forms: syntax errors that prevent your program from running, runtime errors where your code has unexpected behavior, or logical errors where your code doesn't do what you intended.",
+ "In this course, you'll learn how to use the JavaScript console to debug programs and prevent common issues before they happen."
+ ]
+ },
+ "basic-data-structures": {
+ "title": "Basic Data Structures",
+ "intro": [
+ "Data can be stored and accessed in many ways. You already know some common JavaScript data structures — arrays and objects.",
+ "In this Basic Data Structures course, you'll learn more about the differences between arrays and objects, and which to use in different situations. You'll also learn how to use helpful JS methods like splice() and Object.keys() to access and manipulate data."
+ ]
+ },
+ "basic-algorithm-scripting": {
+ "title": "Basic Algorithm Scripting",
+ "intro": [
+ "An algorithm is a series of step-by-step instructions that describe how to do something.",
+ "To write an effective algorithm, it helps to break a problem down into smaller parts and think carefully about how to solve each part with code.",
+ "In this course, you'll learn the fundamentals of algorithmic thinking by writing algorithms that do everything from converting temperatures to handling complex 2D arrays."
+ ]
+ },
+ "object-oriented-programming": {
+ "title": "Object Oriented Programming",
+ "intro": [
+ "OOP, or Object Oriented Programming, is one of the major approaches to the software development process. In OOP, objects and classes organize code to describe things and what they can do.",
+ "In this course, you'll learn the basic principles of OOP in JavaScript, including the this keyword, prototype chains, constructors, and inheritance."
+ ]
+ },
+ "functional-programming": {
+ "title": "Functional Programming",
+ "intro": [
+ "Functional Programming is another popular approach to software development. In Functional Programming, code is organized into smaller, basic functions that can be combined to build complex programs.",
+ "In this course, you'll learn the core concepts of Functional Programming including pure functions, how to avoid mutations, and how to write cleaner code with methods like .map() and .filter()."
+ ]
+ },
+ "intermediate-algorithm-scripting": {
+ "title": "Intermediate Algorithm Scripting",
+ "intro": [
+ "Now that you know the basics of algorithmic thinking, along with OOP and Functional Programming, test your skills with the Intermediate Algorithm Scripting challenges."
+ ]
+ },
+ "javascript-algorithms-and-data-structures-projects": {
+ "title": "JavaScript Algorithms and Data Structures Projects",
+ "intro": [
+ "This is it — time to put your new JavaScript skills to work. These projects are similar to the algorithm scripting challenges you've done before – just much more difficult.",
+ "Complete these 5 JavaScript projects to earn the JavaScript Algorithms and Data Structures certification."
+ ]
+ },
+ "basic-javascript-rpg-game": {
+ "title": "Basic JavaScript RPG Game",
+ "intro": [
+ "",
+ ""
+ ]
+ },
+ "intermediate-javascript-calorie-counter": {
+ "title": "Intermediate JavaScript Calorie Counter",
+ "intro": [
+ "",
+ ""
+ ]
+ },
+ "functional-programming-spreadsheet": {
+ "title": "Functional Programming Spreadsheet",
+ "intro": [
+ "",
+ ""
+ ]
+ }
+ }
+ },
+ "front-end-development-libraries": {
+ "title": "Front End Development Libraries",
+ "intro": [
+ "Now that you're familiar with HTML, CSS, and JavaScript, level up your skills by learning some of the most popular front end libraries in the industry.",
+ "In the Front End Development Libraries Certification, you'll learn how to style your site quickly with Bootstrap. You'll also learn how add logic to your CSS styles and extend them with Sass.",
+ "Later, you'll build a shopping cart and other applications to learn how to create powerful Single Page Applications (SPAs) with React and Redux."
+ ],
+ "note": "",
+ "blocks": {
+ "bootstrap": {
+ "title": "Bootstrap",
+ "intro": [
+ "Bootstrap is a front end framework used to design responsive web pages and applications. It takes a mobile-first approach to web development, and includes pre-built CSS styles and classes, plus some JavaScript functionality.",
+ "In this course, you'll learn how to build responsive websites with Bootstrap, and use its included classes to style buttons, images, forms, navigation, and other common elements."
+ ]
+ },
+ "jquery": {
+ "title": "jQuery",
+ "intro": [
+ "jQuery is one of the most widely used JavaScript libraries in the world.",
+ "In 2006 when it was released, all major browsers handled JavaScript slightly differently. jQuery simplified the process of writing client-side JavaScript, and also ensured that your code worked the same way in all browsers.",
+ "In this course, you'll learn how to use jQuery to select, remove, clone, and modify different elements on the page."
+ ]
+ },
+ "sass": {
+ "title": "SASS",
+ "intro": [
+ "Sass, or \"Syntactically Awesome StyleSheets\", is a language extension of CSS. It adds features that aren't available in basic CSS, which make it easier for you to simplify and maintain the style sheets for your projects.",
+ "In this Sass course, you'll learn how to store data in variables, nest CSS, create reusable styles with mixins, add logic and loops to your styles, and more."
+ ]
+ },
+ "react": {
+ "title": "React",
+ "intro": [
+ "React is a popular JavaScript library for building reusable, component-driven user interfaces for web pages or applications.",
+ "React combines HTML with JavaScript functionality into its own markup language called JSX. React also makes it easy to manage the flow of data throughout the application.",
+ "In this course, you'll learn how to create different React components, manage data in the form of state props, use different lifecycle methods like componentDidMount, and much more."
+ ]
+ },
+ "redux": {
+ "title": "Redux",
+ "intro": [
+ "As applications grow in size and scope, managing shared data becomes much more difficult. Redux is defined as a \"predictable state container for JavaScript apps\" that helps ensure your apps work predictably, and are easier to test.",
+ "While you can use Redux with any view library, we introduce Redux here before combining it with React in the next set of courses.",
+ "In this course, you'll learn the fundamentals of Redux stores, actions, reducers and middleware to manage data throughout your application."
+ ]
+ },
+ "react-and-redux": {
+ "title": "React and Redux",
+ "intro": [
+ "React and Redux are often mentioned together, and with good reason. The developer who created Redux was a React developer who wanted to make it easier to share data across different components.",
+ "Now that you know how to manage the flow of shared data with Redux, it's time to combine that knowledge with React. In the React and Redux courses, you'll build a React component and learn how to manage state locally at the component level, and throughout the entire application with Redux."
+ ]
+ },
+ "front-end-development-libraries-projects": {
+ "title": "Front End Development Libraries Projects",
+ "intro": [
+ "It's time to put your front end development libraries skills to the test. Use Bootstrap, jQuery, Sass, React, and Redux to build 5 projects that will test everything you've learned up to this point.",
+ "Complete all 5 projects, and you'll earn the Front End Development Libraries certification."
+ ]
+ }
+ }
+ },
+ "data-visualization": {
+ "title": "Data Visualization",
+ "intro": [
+ "Data is all around us, but it doesn't mean much without shape or context.",
+ "In the Data Visualization Certification, you'll build charts, graphs, and maps to present different types of data with the D3.js library.",
+ "You'll also learn about JSON (JavaScript Object Notation), and how to work with data online using an API (Application Programming Interface)."
+ ],
+ "note": "",
+ "blocks": {
+ "data-visualization-with-d3": {
+ "title": "Data Visualization with D3",
+ "intro": [
+ "D3, or D3.js, stands for Data Driven Documents. It's a JavaScript library for creating dynamic and interactive data visualizations in the browser.",
+ "D3 is built to work with common web standards – namely HTML, CSS, and Scalable Vector Graphics (SVG).",
+ "D3 supports many different kinds of input data formats. Then, using its powerful built-in methods, you can transform those data into different charts, graphs, and maps.",
+ "In the Data Visualization with D3 courses, you'll learn how to work with data to create different charts, graphs, hover elements, and other ingredients to create dynamic and attractive data visualizations."
+ ]
+ },
+ "json-apis-and-ajax": {
+ "title": "JSON APIs and AJAX",
+ "intro": [
+ "Similar to how UIs help people use programs, APIs (Application Programming Interfaces) help programs interact with other programs. APIs are tools that computers use to communicate with one another, in part to send and receive data.",
+ "Programmers often use AJAX (Asynchronous JavaScript and XML) when working with APIs. AJAX refers to a group of technologies that make asynchronous requests to a server to transfer data, then load any returned data into the page. And the data transferred between the browser and server is often in a format called JSON (JavaScript Object Notation).",
+ "This course will teach you the basics about working with APIs and different AJAX technologies in the browser."
+ ]
+ },
+ "data-visualization-projects": {
+ "title": "Data Visualization Projects",
+ "intro": [
+ "Now that you learned how to work with D3, APIs, and AJAX technologies, put your skills to the test with these 5 Data Visualization projects.",
+ "In these projects, you'll need to fetch data and parse a dataset, then use D3 to create different data visualizations. Finish them all to earn your Data Visualization certification."
+ ]
+ },
+ "d3-dashboard": {
+ "title": "D3 Dashboard",
+ "intro": [
+ "",
+ ""
+ ]
+ }
+ }
+ },
+ "relational-database": {
+ "title": "Relational Database",
+ "intro": [
+ "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.",
+ "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.",
+ "Next, you will learn how to create and use a relational database with PostgreSQL, a database management system, and SQL, the language of these databases.",
+ "Finally, you will learn Git, the version control system, an essential tool of every developer."
+ ],
+ "blocks": {
+ "build-a-celestial-bodies-database-project": {
+ "title": "Celestial Bodies Database",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will build a database of celestial bodies using PostgreSQL."
+ ]
+ },
+ "build-a-number-guessing-game-project": {
+ "title": "Number Guessing Game",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will use Bash scripting, PostgreSQL, and Git to create a number guessing game that runs in the terminal and saves user information."
+ ]
+ },
+ "build-a-periodic-table-database-project": {
+ "title": "Periodic Table Database",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will create Bash a script to get information about chemical elements from a periodic table database."
+ ]
+ },
+ "build-a-salon-appointment-scheduler-project": {
+ "title": "Salon Appointment Scheduler",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will create an interactive Bash program that uses PostgreSQL to track the customers and appointments for your salon."
+ ]
+ },
+ "build-a-world-cup-database-project": {
+ "title": "World Cup Database",
+ "intro": [
+ "This is one of the required projects to earn your certification.",
+ "For this project, you will create a Bash script that enters information from World Cup games into PostgreSQL, then query the database for useful statistics."
+ ]
+ },
+ "learn-advanced-bash-by-building-a-kitty-ipsum-translator": {
+ "title": "Learn Advanced Bash by Building a Kitty Ipsum Translator",
+ "intro": [
+ "There's more to Bash commands than you might think.",
+ "In this 140 lesson course, you will learn some more complex commands, and the details of how commands work."
+ ]
+ },
+ "learn-bash-and-sql-by-building-a-bike-rental-shop": {
+ "title": "Learn Bash and SQL by Building a Bike Rental Shop",
+ "intro": [
+ "In this 210 lesson course, you will build an interactive Bash program that stores rental information for your bike rental shop using PostgreSQL."
+ ]
+ },
+ "learn-bash-by-building-a-boilerplate": {
+ "title": "Learn Bash by Building a Boilerplate",
+ "intro": [
+ "The terminal allows you to send text commands to your computer that can manipulate the file system, run programs, automate tasks, and much more.",
+ "In this 170 lesson course, you will learn basic commands by creating a website boilerplate using only the command line."
+ ]
+ },
+ "learn-bash-scripting-by-building-five-programs": {
+ "title": "Learn Bash Scripting by Building Five Programs",
+ "intro": [
+ "Bash scripts combine terminal commands and logic into programs that can execute or automate tasks, and much more.",
+ "In this 220 lesson course, you will learn more terminal commands and how to use them within Bash scripts by creating five small programs."
+ ]
+ },
+ "learn-git-by-building-an-sql-reference-object": {
+ "title": "Learn Git by Building an SQL Reference Object",
+ "intro": [
+ "Git is a version control system that keeps track of all the changes you make to your codebase.",
+ "In this 240 lesson course, you will learn how Git keeps track of your code by creating an object containing commonly used SQL commands."
+ ]
+ },
+ "learn-nano-by-building-a-castle": {
+ "title": "Learn Nano by Building a Castle",
+ "intro": [
+ "Nano is a program that allows you to edit files right in the terminal.",
+ "In this 40 lesson course, you will learn how to edit files in the terminal with Nano while building a castle."
+ ]
+ },
+ "learn-relational-databases-by-building-a-mario-database": {
+ "title": "Learn Relational Databases by Building a Mario Database",
+ "intro": [
+ "A relational database organizes data into tables that are linked together through relationships.",
+ "In this 165 lesson course, you will learn the basics of a relational database by creating a PostgreSQL database filled with video game characters."
+ ]
+ },
+ "learn-sql-by-building-a-student-database-part-1": {
+ "title": "Learn SQL by Building a Student Database: Part 1",
+ "intro": [
+ "SQL, or Structured Query Language, is the language for communicating with a relational database.",
+ "In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL."
+ ]
+ },
+ "learn-sql-by-building-a-student-database-part-2": {
+ "title": "Learn SQL by Building a Student Database: Part 2",
+ "intro": [
+ "SQL join commands are used to combine information from multiple tables in a relational database",
+ "In this 140 lesson course, you will complete your student database while diving deeper into SQL commands."
+ ]
+ }
+ }
+ },
+ "back-end-development-and-apis": {
+ "title": "Back End Development and APIs",
+ "intro": [
+ "Until this point, you've only used JavaScript on the front end to add interactivity to a page, solve algorithm challenges, or build an SPA. But JavaScript can also be used on the back end, or server, to build entire web applications.",
+ "Today, one of the popular ways to build applications is through microservices, which are small, modular applications that work together to form a larger whole.",
+ "In the Back End Development and APIs Certification, you'll learn how to write back end apps with Node.js and npm (Node Package Manager). You'll also build web applications with the Express framework, and build a People Finder microservice with MongoDB and the Mongoose library."
+ ],
+ "note": "",
+ "blocks": {
+ "managing-packages-with-npm": {
+ "title": "Managing Packages with NPM",
+ "intro": [
+ "npm (Node Package Manager), is a command line tool to install, create, and share packages of JavaScript code written for Node.js. There are many open source packages available on npm, so before starting a project, take some time to explore so you don't end up recreating the wheel for things like working with dates or fetching data from an API.",
+ "In this course, you'll learn the basics of using npm, including how to work with the package.json and how to manage your installed dependencies."
+ ]
+ },
+ "basic-node-and-express": {
+ "title": "Basic Node and Express",
+ "intro": [
+ "Node.js is a JavaScript runtime that allows developers to write backend (server-side) programs in JavaScript. Node.js comes with a handful of built-in modules — small, independent programs — that help with this. Some of the core modules include HTTP, which acts like a server, and File System, a module to read and modify files.",
+ "In the last set of courses you learned to install and manage packages from npm, which are collections of smaller modules. These packages can help you build larger, more complex applications.",
+ "Express is a lightweight web application framework, and is one of the most popular packages on npm. Express makes it much easier to create a server and handle routing for your application, which handles things like direct people to the correct page when they visit a certain endpoint like
/blog.", + "In this course, you'll learn the basics of Node and Express including how to create a server, serve different files, and handle different requests from the browser." + ] + }, + "mongodb-and-mongoose": { + "title": "MongoDB and Mongoose", + "intro": [ + "MongoDB is a database application that stores JSON documents (or records) that you can use in your application. Unlike SQL, another type of database, Mongo is a non-relational or \"NoSQL\" database. This means Mongo stores all associated data within one record, instead of storing it across many preset tables as in a SQL database.", + "Mongoose is a popular npm package that is often installed alongside Mongo. With Mongoose, you can use plain JavaScript objects instead of JSON, which makes it easier to work with Mongo. Also, it allows you to create blueprints for your documents called schemas, so you don't accidentally save the wrong type of data and cause bugs later.", + "In the MongoDB and Mongoose courses, you'll learn the fundamentals of working with persistent data including how to set up a model, and save, delete, and find documents in the database." + ] + }, + "back-end-development-and-apis-projects": { + "title": "Back End Development and APIs Projects", + "intro": [ + "You've worked with APIs before, but now that you know npm, Node, Express, MongoDB, and Mongoose, it's time to build your own. Draw on everything you've learned up to this point to create 5 different microservices, which are smaller applications that are limited in scope.", + "After creating these, you'll have 5 cool microservice APIs you can show off to friends, family, and potential employers. Oh, and you'll have a shiny new Back End Development and APIs Certification, too." + ] + } + } + }, + "quality-assurance": { + "title": "Quality Assurance", + "intro": [ + "As your programs or web applications become more complex, you'll want to test them to make sure that new changes don't break their original functionality.", + "In the Quality Assurance Certification, you'll learn how to write tests with Chai to ensure your applications work the way you expect them to.", + "Then you'll build a chat application to learn advanced Node and Express concepts. You'll also use Pug as a template engine, Passport for authentication, and Socket.io for real-time communication between the server and connected clients." + ], + "note": "", + "blocks": { + "quality-assurance-and-testing-with-chai": { + "title": "Quality Assurance and Testing with Chai", + "intro": [ + "Chai is a JavaScript testing library that helps you confirm that your program still behaves the way you expect it to after you make changes to your code.", + "Using Chai, you can write tests that describe your program's requirements and see if your program meets them.", + "In this course, you'll learn about assertions, deep equality, truthiness, testing APIs, and other fundamentals for testing JavaScript applications." + ] + }, + "advanced-node-and-express": { + "title": "Advanced Node and Express", + "intro": [ + "Now it's time to take a deep dive into Node.js and Express.js by building a chat application with a sign-in system.", + "To implement the sign-in system safely, you'll need to learn about authentication. This is the act of verifying the identity of a person or process.", + "In this course, you'll learn how to use Passport to manage authentication, Pug to create reusable templates for quickly building the front end, and web sockets for real-time communication between the clients and server." + ] + }, + "quality-assurance-projects": { + "title": "Quality Assurance Projects", + "intro": [ + "Now that you're well versed in both the front end and back end, it's time to apply all the skills and concepts you've learned up to this point. You'll build 5 different web applications, and write tests for each one to make sure they're working and can handle different edge cases.", + "After completing these Quality Assurance projects, you'll have 5 more projects under your belt, and a new certification to show off on your portfolio." + ] + } + } + }, + "scientific-computing-with-python": { + "title": "Scientific Computing with Python", + "intro": [ + "Python is one of the most popular, flexible programming languages today. You can use it for everything from basic scripting to machine learning.", + "In the Scientific Computing with Python Certification, you'll learn Python fundamentals like variables, loops, conditionals, and functions. Then you'll quickly ramp up to complex data structures, networking, relational databases, and data visualization." + ], + "note": "", + "blocks": { + "python-for-everybody": { + "title": "Python for Everybody", + "intro": [ + "Python for everybody is a free video course series that teaches the basics of using Python 3.", + "The courses were created by Dr. Charles Severance (also known as Dr. Chuck). He is a Clinical Professor at the University of Michigan School of Information, where he teaches various technology-oriented courses including programming, database design, and web development." + ] + }, + "scientific-computing-with-python-projects": { + "title": "Scientific Computing with Python Projects", + "intro": [ + "Time to put your Python skills to the test. By completing these projects, you will demonstrate that you have a good foundational knowledge of Python and qualify for the Scientific Computing with Python Certification." + ] + } + } + }, + "data-analysis-with-python": { + "title": "Data Analysis with Python", + "intro": [ + "Data Analysis has been around for a long time. But up until a few years ago, developers practiced it using expensive, closed-source tools like Tableau. But recently, Python, SQL, and other open libraries have changed Data Analysis forever.", + "In the Data Analysis with Python Certification, you'll learn the fundamentals of data analysis with Python. By the end of this certification, you'll know how to read data from sources like CSVs and SQL, and how to use libraries like Numpy, Pandas, Matplotlib, and Seaborn to process and visualize data." + ], + "note": "", + "blocks": { + "data-analysis-with-python-course": { + "title": "Data Analysis with Python", + "intro": [ + "In these comprehensive video courses, created by Santiago Basulto, you will learn the whole process of data analysis. You'll be reading data from multiple sources (CSV, SQL, Excel), process that data using NumPy and Pandas, and visualize it using Matplotlib and Seaborn,", + "Additionally, we've included a thorough Jupyter Notebook course, and a quick Python reference to refresh your programming skills." + ] + }, + "numpy": { + "title": "Numpy", + "intro": [ + "Learn the basics of the NumPy library in the following video course created by Keith Galli.", + "In this course, you'll learn how NumPy works and how it compares to Python's built-in lists. You'll also learn how to write code with NumPy, indexing, reshaping, applied statistics, and much more." + ] + }, + "data-analysis-with-python-projects": { + "title": "Data Analysis with Python Projects", + "intro": [ + "There are many ways to analyze data with Python. By completing these projects, you will demonstrate that you have a good foundational knowledge of data analysis with Python.", + "Finish them all to claim your Data Analysis with Python certification." + ] + } + } + }, + "information-security": { + "title": "Information Security", + "intro": [ + "With everything we do online, there's a vast amount of sensitive information at risk: email addresses, passwords, phone numbers, and much more.", + "With the Information Security Certification, you'll build a secure web app with HelmetJS to learn the fundamentals of protecting people's information online.", + "You'll also build a TCP client, and an Nmap and port scanner in Python. This will help you learn the basics of penetration testing — an important component of good information security." + ], + "note": "", + "blocks": { + "information-security-with-helmetjs": { + "title": "Information Security with HelmetJS", + "intro": [ + "This programming course focuses on HelmetJS, a type of middleware for Express-based applications that automatically sets HTTP headers. This way it can prevent sensitive information from unintentionally being passed between the server and client.", + "Completing the courses below will help you understand how to protect your website from malicious behavior." + ] + }, + "python-for-penetration-testing": { + "title": "Python for Penetration Testing", + "intro": [ + "These video courses teach you penetration testing with Python. Also known as a pen test, penetration testing is a simulated attack against a system to check for vulnerabilities.", + "In this course, you'll learn about sockets, create a TCP server and client, build an Nmap scanner, and other tools and techniques that pen testers use daily." + ] + }, + "information-security-projects": { + "title": "Information Security Projects", + "intro": [ + "Now it’s time to put your new information security skills to work. These projects will give you a chance to apply the infosec skills, principles, and concepts you've learned.", + "When you are done, you will have plenty of information security projects under your belt, along with a certification that you can show off to friends, family, and employers." + ] + } + } + }, + "machine-learning-with-python": { + "title": "Machine Learning with Python", + "intro": [ + "Machine learning has many practical applications that you can use in your projects or on the job.", + "In the Machine Learning with Python Certification, you'll use the TensorFlow framework to build several neural networks and explore more advanced techniques like natural language processing and reinforcement learning.", + "You'll also dive into neural networks, and learn the principles behind how deep, recurrent, and convolutional neural networks work." + ], + "note": "", + "blocks": { + "tensorflow": { + "title": "Tensorflow", + "intro": [ + "TensorFlow is an open source framework that makes machine learning and neural networking easier to use.", + "The following video course was created by Tim Ruscica, also known as “Tech With Tim”. It will help you to understand TensorFlow and some of its powerful capabilities." + ] + }, + "how-neural-networks-work": { + "title": "How Neural Networks Work", + "intro": [ + "Neural networks are at the core of what we call artificial intelligence today. But historically they've been hard to understand. Especially for beginners in the machine learning field.", + "Even if you are completely new to neural networks, these video courses by Brandon Rohrer will get you comfortable with the concepts and the math behind them." + ] + }, + "machine-learning-with-python-projects": { + "title": "Machine Learning with Python Projects", + "intro": [ + "Machine learning has many practical applications. By completing these free and challenging coding projects, you will demonstrate that you have a good foundational knowledge of machine learning, and qualify for your Machine Learning with Python certification." + ] + } + } + }, + "coding-interview-prep": { + "title": "Coding Interview Prep", + "intro": [ + "If you're looking for free coding exercises to prepare for your next job interview, we've got you covered.", + "This section contains hundreds of coding challenges that test your knowledge of algorithms, data structures, and mathematics. It also has a number of take-home projects you can use to strengthen your skills, or add to your portfolio." + ], + "note": "", + "blocks": { + "algorithms": { + "title": "Algorithms", + "intro": [ + "These free programming exercises will teach you about some common algorithms that you will likely encounter in real life. They are a great opportunity to improve your logic and programming skills.", + "These algorithms are frequently used in job interviews to test a candidate's skills. We'll give you clear and concise explanations of how these different algorithms work so you can implement a solution for each one." + ] + }, + "data-structures": { + "title": "Data Structures", + "intro": [ + "These free programming courses are meant to help you deal with large and complex data structures that you may not yet be familiar with.", + "Working through the courses below, you will learn about each type of data structure, and implement algorithms to reinforce your understanding of them." + ] + }, + "take-home-projects": { + "title": "Take Home Projects", + "intro": [ + "Programming interviews have always been stressful. Job applicants are sometimes given a take home project to be completed outside of the interview. These types of interviews usually require a lot of work, but they're a great way for employers to see how you might perform on the job.", + "Build the bonus coding projects below for extra practice. Take your time, make them great, and put them on your resume or portfolio to show potential employers." + ] + }, + "rosetta-code": { + "title": "Rosetta Code", + "intro": [ + "Level up your creative problem solving skills with these free programming tasks from the classic Rosetta Code library.", + "These challenges can prove to be difficult, but they will push your algorithm logic to new heights." + ] + }, + "project-euler": { + "title": "Project Euler", + "intro": [ + "Complete the programming challenges below, from the massive Project Euler archives. These will harden your algorithm and mathematics knowledge.", + "These problems range in difficulty and, for many, the experience is inductive chain learning. That is, by solving one problem, it will expose you to a new concept that allows you to undertake a previously inaccessible problem. Can you finish them all?" + ] + } + } + }, + "misc-text": { + "certification": "{{cert}} Certification", + "browse-other": "Browse our other free certifications\n(we recommend doing these in order)", + "courses": "Courses", + "steps": "Steps", + "expand": "Expand course", + "collapse": "Collapse course", + "legacy-header": "Legacy Courses", + "legacy-desc": "These courses are no longer part of the certification path, but are still available for you to further your learning.", + "viewing-upcoming-change": "You are looking at a beta page. ", + "go-back-to-learn": "Go back to the stable version of the curriculum." + } +} diff --git a/client/i18n/locales/french/links.json b/client/i18n/locales/french/links.json new file mode 100644 index 00000000000000..d94c781872c64a --- /dev/null +++ b/client/i18n/locales/french/links.json @@ -0,0 +1,31 @@ +{ + "help-translate-link-url": "https://contribute.freecodecamp.org/#/how-to-translate-files", + "top-contributors": "https://www.freecodecamp.org/news/freecodecamp-top-contributors/", + "footer": { + "about-url": "https://www.freecodecamp.org/news/about/", + "shop-url": "https://www.freecodecamp.org/shop/", + "support-url": "https://www.freecodecamp.org/news/support/", + "sponsors-url": "https://www.freecodecamp.org/news/sponsors/", + "honesty-url": "https://www.freecodecamp.org/news/academic-honesty-policy/", + "coc-url": "https://www.freecodecamp.org/news/code-of-conduct/", + "privacy-url": "https://www.freecodecamp.org/news/privacy-policy/", + "tos-url": "https://www.freecodecamp.org/news/terms-of-service/", + "copyright-url": "https://www.freecodecamp.org/news/copyright-policy/" + }, + "donate": { + "other-ways-url": "https://www.freecodecamp.org/news/how-to-donate-to-free-code-camp", + "download-irs-url": "https://s3.amazonaws.com/freecodecamp/Free+Code+Camp+Inc+IRS+Determination+Letter.pdf", + "download-990-url": "https://freecodecamp.s3.amazonaws.com/freeCodeCamp+2019+f990.pdf", + "one-time-url": "https://paypal.me/freecodecamp" + }, + "nav": { + "forum": "https://forum.freecodecamp.org/", + "news": "https://freecodecamp.org/news/" + }, + "help": { + "HTML-CSS": "HTML-CSS", + "JavaScript": "JavaScript", + "Python": "Python", + "Backend Development": "Backend Development" + } +} diff --git a/client/i18n/locales/french/meta-tags.json b/client/i18n/locales/french/meta-tags.json new file mode 100644 index 00000000000000..cf2020dbfb80e6 --- /dev/null +++ b/client/i18n/locales/french/meta-tags.json @@ -0,0 +1,32 @@ +{ + "title": "Learn to Code — For Free — Coding Courses for Busy People", + "description": "Learn to Code — For Free", + "social-description": "Learn to Code — For Free", + "keywords": [ + "python", + "javascript", + "js", + "git", + "github", + "website", + "web", + "development", + "free", + "code", + "camp", + "course", + "courses", + "html", + "css", + "react", + "redux", + "api", + "front", + "back", + "end", + "learn", + "tutorial", + "programming" + ], + "youre-unsubscribed": "You have been unsubscribed" +} diff --git a/client/i18n/locales/french/motivation.json b/client/i18n/locales/french/motivation.json new file mode 100644 index 00000000000000..9b14cef6782c48 --- /dev/null +++ b/client/i18n/locales/french/motivation.json @@ -0,0 +1,819 @@ +{ + "compliments": [ + "Over the top!", + "Down the rabbit hole we go!", + "Bring that rain!", + "Target acquired.", + "Feel that need for speed!", + "You've got guts!", + "We have liftoff!", + "To infinity and beyond!", + "Encore!", + "Onward!", + "Challenge destroyed!", + "It's on like Donkey Kong!", + "Power level? It's over 9000!", + "Coding spree!", + "Code long and prosper.", + "The crowd goes wild!", + "One for the Guinness book!", + "Flawless victory!", + "Most efficient!", + "You've got the touch!", + "You're on fire!", + "The town is now red!", + "To the nines!", + "To the Batmobile!", + "Pull out all the stops!", + "You're a wizard, Harry!", + "You're an all star!", + "Way to go!", + "Outta sight!", + "You're crushing it!", + "What sorcery is this?", + "The world rejoices!", + "That's the way it's done!", + "You rock!", + "Woo-hoo!", + "We knew you could do it!", + "Hyper Combo Finish!", + "Nothing but net!", + "Boom-shakalaka!", + "You're a shooting star!", + "You're unstoppable!", + "Way cool!", + "Walk on that sunshine!", + "Keep on trucking!", + "Off the charts!", + "There is no spoon!", + "Cranked it up to 11!", + "Escape velocity reached!", + "You make this look easy!", + "Passed with flying colors!", + "You've got this!", + "Happy, happy, joy, joy!", + "Tomorrow, the world!", + "Your powers combined!", + "It's alive. It's alive!", + "Sonic Boom!", + "Here's looking at you, Code!", + "Ride like the wind!", + "Legen - wait for it - dary!", + "Ludicrous Speed! Go!", + "Most triumphant!", + "One loop to rule them all!", + "By the power of Grayskull!", + "You did it!", + "Storm that castle!", + "Face-melting guitar solo!", + "Checkmate!", + "Bodacious!", + "Tubular!", + "You're outta sight!", + "Keep calm and code on!", + "Even sad panda smiles!", + "Even grumpy cat approves!", + "Kool Aid Man says oh yeah!", + "Bullseye!", + "Far out!", + "You're heating up!", + "Standing ovation!", + "Nice one!", + "All right!", + "Hasta la vista, challenge!", + "Terminated.", + "Off the hook!", + "Thundercats, Hooo!", + "Shiver me timbers!", + "Raise the roof!", + "Bingo!", + "Even Honey Badger cares!", + "Helm, Warp Nine. Engage!", + "Gotta code 'em all!", + "Spool up the FTL drive!", + "Cool beans!", + "They're in another castle.", + "Power UP!", + "Pikachu chooses you!", + "I gotta have more cowbell.", + "Gotta go fast!", + "Yippee!", + "Cowabunga!", + "Moon Prism Power!", + "Plus Ultra!" + ], + "motivationalQuotes": [ + { + "quote": "Whatever you are, be a good one.", + "author": "Abraham Lincoln" + }, + { + "quote": "A change in perspective is worth 80 IQ points.", + "author": "Alan Kay" + }, + { + "quote": "The best way to predict the future is to invent it.", + "author": "Alan Kay" + }, + { + "quote": "The future is not laid out on a track. It is something that we can decide, and to the extent that we do not violate any known laws of the universe, we can probably make it work the way that we want to.", + "author": "Alan Kay" + }, + { + "quote": "We can only see a short distance ahead, but we can see plenty there that needs to be done.", + "author": "Alan Turing" + }, + { + "quote": "In the depth of winter, I finally learned that within me there lay an invincible summer.", + "author": "Albert Camus" + }, + { + "quote": "A person who never made a mistake never tried anything new.", + "author": "Albert Einstein" + }, + { + "quote": "Creativity is intelligence having fun.", + "author": "Albert Einstein" + }, + { + "quote": "I have no special talents. I am only passionately curious.", + "author": "Albert Einstein" + }, + { + "quote": "Life is like riding a bicycle. To keep your balance, you must keep moving.", + "author": "Albert Einstein" + }, + { + "quote": "Make everything as simple as possible, but not simpler.", + "author": "Albert Einstein" + }, + { + "quote": "Never memorize something that you can look up.", + "author": "Albert Einstein" + }, + { + "quote": "Once we accept our limits, we go beyond them.", + "author": "Albert Einstein" + }, + { + "quote": "Play is the highest form of research.", + "author": "Albert Einstein" + }, + { + "quote": "We cannot solve our problems with the same thinking we used when we created them.", + "author": "Albert Einstein" + }, + { + "quote": "Wisdom is not a product of schooling but of the lifelong attempt to acquire it.", + "author": "Albert Einstein" + }, + { + "quote": "Your imagination is your preview of life's coming attractions.", + "author": "Albert Einstein" + }, + { + "quote": "There is only one corner of the universe you can be certain of improving, and that's your own self.", + "author": "Aldous Huxley" + }, + { + "quote": "The most common way people give up their power is by thinking they don't have any.", + "author": "Alice Walker" + }, + { + "quote": "Follow your inner moonlight. Don't hide the madness.", + "author": "Allen Ginsberg" + }, + { + "quote": "The most difficult thing is the decision to act. The rest is merely tenacity.", + "author": "Amelia Earhart" + }, + { + "quote": "Life shrinks or expands in proportion with one's courage.", + "author": "Anaïs Nin" + }, + { + "quote": "Weeks of programming can save you hours of planning.", + "author": "Unknown" + }, + { + "quote": "Quality is not an act, it is a habit.", + "author": "Aristotle" + }, + { + "quote": "Start where you are. Use what you have. Do what you can.", + "author": "Arthur Ashe" + }, + { + "quote": "Nothing is impossible, the word itself says \"I'm possible\"!", + "author": "Audrey Hepburn" + }, + { + "quote": "Every strike brings me closer to the next home run.", + "author": "Babe Ruth" + }, + { + "quote": "By failing to prepare, you are preparing to fail.", + "author": "Benjamin Franklin" + }, + { + "quote": "Tell me and I forget. Teach me and I remember. Involve me and I learn.", + "author": "Benjamin Franklin" + }, + { + "quote": "Well done is better than well said.", + "author": "Benjamin Franklin" + }, + { + "quote": "There are no short cuts to any place worth going.", + "author": "Beverly Sills" + }, + { + "quote": "Controlling complexity is the essence of computer programming.", + "author": "Brian Kernighan" + }, + { + "quote": "I fear not the man who has practiced 10,000 kicks once, but I fear the man who has practiced one kick 10,000 times.", + "author": "Bruce Lee" + }, + { + "quote": "There are far, far better things ahead than any we leave behind.", + "author": "C.S. Lewis" + }, + { + "quote": "We are what we believe we are.", + "author": "C.S. Lewis" + }, + { + "quote": "With the possible exception of the equator, everything begins somewhere.", + "author": "C.S. Lewis" + }, + { + "quote": "You are never too old to set another goal, or to dream a new dream.", + "author": "C.S. Lewis" + }, + { + "quote": "Somewhere, something incredible is waiting to be known.", + "author": "Carl Sagan" + }, + { + "quote": "If you're not making mistakes, then you're not making decisions.", + "author": "Catherine Cook" + }, + { + "quote": "Find what you love and let it kill you.", + "author": "Charles Bukowski" + }, + { + "quote": "What matters most is how well you walk through the fire.", + "author": "Charles Bukowski" + }, + { + "quote": "It is not the strongest of the species that survive, nor the most intelligent, but the one most responsive to change.", + "author": "Charles Darwin" + }, + { + "quote": "Life is 10% what happens to you and 90% how you react to it.", + "author": "Charles R. Swindoll" + }, + { + "quote": "You will do foolish things, but do them with enthusiasm.", + "author": "Colette" + }, + { + "quote": "It does not matter how slowly you go as long as you do not stop.", + "author": "Confucius" + }, + { + "quote": "Real knowledge is to know the extent of one's ignorance.", + "author": "Confucius" + }, + { + "quote": "The past cannot be changed. The future is yet in your power.", + "author": "Confucius" + }, + { + "quote": "Looking at code you wrote more than two weeks ago is like looking at code you are seeing for the first time.", + "author": "Dan Hurvitz" + }, + { + "quote": "Someday is not a day of the week.", + "author": "Denise Brennan-Nelson" + }, + { + "quote": "UNIX is simple. It just takes a genius to understand its simplicity.", + "author": "Dennis Ritchie" + }, + { + "quote": "Computers are good at following instructions, but not at reading your mind.", + "author": "Donald Knuth" + }, + { + "quote": "A good programmer is someone who always looks both ways before crossing a one-way street.", + "author": "Doug Linder" + }, + { + "quote": "Tough times never last, but tough people do.", + "author": "Dr. Robert Schuller" + }, + { + "quote": "If things start happening, don't worry, don't stew, just go right along and you'll start happening too.", + "author": "Dr. Seuss" + }, + { + "quote": "Do not go gentle into that good night. Rage, rage against the dying of the light.", + "author": "Dylan Thomas" + }, + { + "quote": "The question of whether computers can think is like the question of whether submarines can swim.", + "author": "E.W. Dijkstra" + }, + { + "quote": "Any code of your own that you haven't looked at for six or more months might as well have been written by someone else.", + "author": "Eagleson's Law" + }, + { + "quote": "Do one thing every day that scares you.", + "author": "Eleanor Roosevelt" + }, + { + "quote": "With the new day comes new strength and new thoughts.", + "author": "Eleanor Roosevelt" + }, + { + "quote": "You must do the things you think you cannot do.", + "author": "Eleanor Roosevelt" + }, + { + "quote": "Light tomorrow with today.", + "author": "Elizabeth Barrett Browning" + }, + { + "quote": "Forever is composed of nows.", + "author": "Emily Dickinson" + }, + { + "quote": "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter.", + "author": "Eric Raymond" + }, + { + "quote": "If you don't risk anything, you risk even more.", + "author": "Erica Jong" + }, + { + "quote": "The world breaks everyone, and afterward, many are strong at the broken places.", + "author": "Ernest Hemingway" + }, + { + "quote": "There is nothing noble in being superior to your fellow man; true nobility is being superior to your former self.", + "author": "Ernest Hemingway" + }, + { + "quote": "Never confuse a single defeat with a final defeat.", + "author": "F. Scott Fitzgerald" + }, + { + "quote": "I attribute my success to this - I never gave or took any excuse.", + "author": "Florence Nightingale" + }, + { + "quote": "The best revenge is massive success.", + "author": "Frank Sinatra" + }, + { + "quote": "The only limit to our realization of tomorrow, will be our doubts of today.", + "author": "Franklin D. Roosevelt" + }, + { + "quote": "Right or wrong, it's very pleasant to break something from time to time.", + "author": "Fyodor Dostoevsky" + }, + { + "quote": "The harder I work, the luckier I get.", + "author": "Gary Player" + }, + { + "quote": "Giving up is the only sure way to fail.", + "author": "Gena Showalter" + }, + { + "quote": "The only truly secure system is one that is powered off, cast in a block of concrete and sealed in a lead-lined room with armed guards.", + "author": "Gene Spafford" + }, + { + "quote": "A life spent making mistakes is not only more honorable, but more useful than a life spent doing nothing.", + "author": "George Bernard Shaw" + }, + { + "quote": "First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack.", + "author": "George Carrette" + }, + { + "quote": "Discovering the unexpected is more important than confirming the known.", + "author": "George Box" + }, + { + "quote": "We only see what we know.", + "author": "Goethe" + }, + { + "quote": "Without hard work, nothing grows but weeds.", + "author": "Gordon B. Hinckley" + }, + { + "quote": "The function of good software is to make the complex appear to be simple.", + "author": "Grady Booch" + }, + { + "quote": "When you know that you're capable of dealing with whatever comes, you have the only security the world has to offer.", + "author": "Harry Browne" + }, + { + "quote": "Pain is inevitable. Suffering is optional.", + "author": "Haruki Murakami" + }, + { + "quote": "Optimism is the faith that leads to achievement. Nothing can be done without hope and confidence.", + "author": "Helen Keller" + }, + { + "quote": "The price of anything is the amount of life you exchange for it.", + "author": "Henry David Thoreau" + }, + { + "quote": "Whether you think you can or think you can't, you're right.", + "author": "Henry Ford" + }, + { + "quote": "The most exciting phrase to hear in science, the one that heralds discoveries, is not 'Eureka!' but 'Now that's funny…'", + "author": "Isaac Asimov" + }, + { + "quote": "We are all failures. At least the best of us are.", + "author": "J.M. Barrie" + }, + { + "quote": "You can't wait for inspiration. You have to go after it with a club.", + "author": "Jack London" + }, + { + "quote": "Don't wish it were easier, wish you were better.", + "author": "Jim Rohn" + }, + { + "quote": "By seeking and blundering we learn.", + "author": "Johann Wolfgang von Goethe" + }, + { + "quote": "Knowing is not enough; we must apply. Wishing is not enough; we must do.", + "author": "Johann Wolfgang von Goethe" + }, + { + "quote": "We first make our habits, then our habits make us.", + "author": "John Dryden" + }, + { + "quote": "The power of imagination makes us infinite.", + "author": "John Muir" + }, + { + "quote": "May you live every day of your life.", + "author": "Jonathan Swift" + }, + { + "quote": "Perseverance is failing 19 times and succeeding the 20th.", + "author": "Julie Andrews" + }, + { + "quote": "The work of today is the history of tomorrow, and we are its makers.", + "author": "Juliette Gordon Low" + }, + { + "quote": "If you reveal your secrets to the wind, you should not blame the wind for revealing them to the trees.", + "author": "Kahlil Gibran" + }, + { + "quote": "Optimism is an occupational hazard of programming; feedback is the treatment.", + "author": "Kent Beck" + }, + { + "quote": "Opportunity does not knock, it presents itself when you beat down the door.", + "author": "Kyle Chandler" + }, + { + "quote": "To iterate is human, to recurse divine.", + "author": "Peter Deutsch" + }, + { + "quote": "A good traveler has no fixed plans and is not intent on arriving.", + "author": "Lao Tzu" + }, + { + "quote": "An ant on the move does more than a dozing ox.", + "author": "Lao Tzu" + }, + { + "quote": "Do the difficult things while they are easy and do the great things while they are small. A journey of a thousand miles must begin with a single step.", + "author": "Lao Tzu" + }, + { + "quote": "That's the thing about people who think they hate computers. What they really hate is lousy programmers.", + "author": "Larry Niven" + }, + { + "quote": "It had long since come to my attention that people of accomplishment rarely sat back and let things happen to them. They went out and happened to things.", + "author": "Leonardo da Vinci" + }, + { + "quote": "If you're any good at all, you know you can be better.", + "author": "Lindsay Buckingham" + }, + { + "quote": "If people never did silly things, nothing intelligent would ever get done.", + "author": "Ludwig Wittgenstein" + }, + { + "quote": "You only live once, but if you do it right, once is enough.", + "author": "Mae West" + }, + { + "quote": "Live as if you were to die tomorrow. Learn as if you were to live forever.", + "author": "Mahatma Gandhi" + }, + { + "quote": "Strength does not come from physical capacity. It comes from an indomitable will.", + "author": "Mahatma Gandhi" + }, + { + "quote": "One person's 'paranoia' is another person's 'engineering redundancy'.", + "author": "Marcus J. Ranum" + }, + { + "quote": "Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less.", + "author": "Marie Curie" + }, + { + "quote": "If you have everything under control, you're not moving fast enough.", + "author": "Mario Andretti" + }, + { + "quote": "Education: the path from cocky ignorance to miserable uncertainty.", + "author": "Mark Twain" + }, + { + "quote": "It ain't what you don't know that gets you into trouble. It's what you know for sure that just ain't so.", + "author": "Mark Twain" + }, + { + "quote": "The secret of getting ahead is getting started.", + "author": "Mark Twain" + }, + { + "quote": "The two most important days in your life are the day you are born and the day you find out why.", + "author": "Mark Twain" + }, + { + "quote": "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails.", + "author": "Mark Twain" + }, + { + "quote": "Any fool can write code that a computer can understand. Good programmers write code that humans can understand.", + "author": "Martin Fowler" + }, + { + "quote": "I know, somehow, that only when it is dark enough can you see the stars.", + "author": "Martin Luther King Jr." + }, + { + "quote": "It is never too late to be what you might have been.", + "author": "Mary Anne Evans" + }, + { + "quote": "Nothing will work unless you do.", + "author": "Maya Angelou" + }, + { + "quote": "We delight in the beauty of the butterfly, but rarely admit the changes it has gone through to achieve that beauty.", + "author": "Maya Angelou" + }, + { + "quote": "We may encounter many defeats, but we must not be defeated.", + "author": "Maya Angelou" + }, + { + "quote": "Everybody has talent, but ability takes hard work.", + "author": "Michael Jordan" + }, + { + "quote": "I've missed more than 9,000 shots during my career. I've lost almost 300 games. 26 times, I've been trusted to take the game winning shot and missed. I've failed over and over and over again in my life. And that is why I succeed.", + "author": "Michael Jordan" + }, + { + "quote": "Impossible is just a big word thrown around by small men who find it easier to live in the world they've been given than to explore the power they have to change it. Impossible is not a fact. It's an opinion. Impossible is not a declaration. It's a dare. Impossible is potential. Impossible is temporary. Impossible is nothing.", + "author": "Muhammad Ali" + }, + { + "quote": "A winner is a dreamer who never gives up.", + "author": "Nelson Mandela" + }, + { + "quote": "It always seems impossible until it's done.", + "author": "Nelson Mandela" + }, + { + "quote": "Failure will never overtake me if my determination to succeed is strong enough.", + "author": "Og Mandino" + }, + { + "quote": "I am not young enough to know everything.", + "author": "Oscar Wilde" + }, + { + "quote": "There is only one thing that makes a dream impossible to achieve: the fear of failure.", + "author": "Paulo Coelho" + }, + { + "quote": "Never go to bed mad. Stay up and fight.", + "author": "Phyllis Diller" + }, + { + "quote": "You can't cross the sea merely by standing and staring at the water.", + "author": "Rabindranath Tagore" + }, + { + "quote": "The only person you are destined to become is the person you decide to be.", + "author": "Ralph Waldo Emerson" + }, + { + "quote": "What you do speaks so loudly that I cannot hear what you say.", + "author": "Ralph Waldo Emerson" + }, + { + "quote": "People who are crazy enough to think they can change the world, are the ones who do.", + "author": "Rob Siltanen" + }, + { + "quote": "The best way out is always through.", + "author": "Robert Frost" + }, + { + "quote": "Today's accomplishments were yesterday's impossibilities.", + "author": "Robert H. Schuller" + }, + { + "quote": "Don't be satisfied with stories, how things have gone with others. Unfold your own myth.", + "author": "Rumi" + }, + { + "quote": "Forget safety. Live where you fear to live. Destroy your reputation. Be notorious.", + "author": "Rumi" + }, + { + "quote": "Sell your cleverness and buy bewilderment.", + "author": "Rumi" + }, + { + "quote": "The cure for pain is in the pain.", + "author": "Rumi" + }, + { + "quote": "Have no fear of perfection - you'll never reach it.", + "author": "Salvador Dalí" + }, + { + "quote": "Don't watch the clock. Do what it does. Keep going.", + "author": "Sam Levenson" + }, + { + "quote": "Ever Tried. Ever failed. No matter. Try again. Fail again. Fail better.", + "author": "Samuel Beckett" + }, + { + "quote": "The more you know, the more you realize you know nothing.", + "author": "Socrates" + }, + { + "quote": "The greatest enemy of knowledge is not ignorance, it is the illusion of knowledge.", + "author": "Stephen Hawking" + }, + { + "quote": "The universe doesn't allow perfection.", + "author": "Stephen Hawking" + }, + { + "quote": "Whether you want to uncover the secrets of the universe, or you want to pursue a career in the 21st century, basic computer programming is an essential skill to learn.", + "author": "Stephen Hawking" + }, + { + "quote": "The scariest moment is always just before you start.", + "author": "Stephen King" + }, + { + "quote": "You can, you should, and if you're brave enough to start, you will.", + "author": "Stephen King" + }, + { + "quote": "Arise, Awake and Stop not until the goal is reached.", + "author": "Swami Vivekananda" + }, + { + "quote": "It is said that your life flashes before your eyes just before you die. That is true, it's called Life.", + "author": "Terry Pratchett" + }, + { + "quote": "Believe you can and you're halfway there.", + "author": "Theodore Roosevelt" + }, + { + "quote": "I have not failed. I've just found 10,000 ways that won't work.", + "author": "Thomas A. Edison" + }, + { + "quote": "Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.", + "author": "Thomas A. Edison" + }, + { + "quote": "The harder the conflict, the more glorious the triumph.", + "author": "Thomas Paine" + }, + { + "quote": "The Web as I envisaged it, we have not seen it yet. The future is still so much bigger than the past.", + "author": "Tim Berners-Lee" + }, + { + "quote": "Failure is the condiment that gives success its flavor.", + "author": "Truman Capote" + }, + { + "quote": "Those who says it cannot be done should not interrupt the person doing it.", + "author": "Unknown" + }, + { + "quote": "Even if you fall on your face, you're still moving forward.", + "author": "Victor Kiam" + }, + { + "quote": "It's not whether you get knocked down, it's whether you get up.", + "author": "Vince Lombardi" + }, + { + "quote": "I dream my painting and I paint my dream.", + "author": "Vincent van Gogh" + }, + { + "quote": "Let us cultivate our garden.", + "author": "Voltaire" + }, + { + "quote": "Aim for the moon. If you miss, you may hit a star.", + "author": "W. Clement Stone" + }, + { + "quote": "The way to get started is to quit talking and begin doing.", + "author": "Walt Disney" + }, + { + "quote": "You miss 100% of the shots you don't take.", + "author": "Wayne Gretzky" + }, + { + "quote": "Don't let yesterday take up too much of today.", + "author": "Will Rogers" + }, + { + "quote": "Even if you're on the right track, you'll get run over if you just sit there.", + "author": "Will Rogers" + }, + { + "quote": "Do not wait to strike till the iron is hot; but make it hot by striking.", + "author": "William Butler Yeats" + }, + { + "quote": "You cannot swim for new horizons until you have courage to lose sight of the shore.", + "author": "William Faulkner" + }, + { + "quote": "Be not afraid of greatness. Some are born great, some achieve greatness, and others have greatness thrust upon them.", + "author": "William Shakespeare" + }, + { + "quote": "We know what we are, but not what we may be.", + "author": "William Shakespeare" + }, + { + "quote": "In theory there is no difference between theory and practice. In practice there is.", + "author": "Yogi Berra" + }, + { + "quote": "You can see a lot by just looking.", + "author": "Yogi Berra" + }, + { + "quote": "There is no elevator to success, you have to take the stairs.", + "author": "Zig Ziglar" + }, + { + "quote": "You don't have to be great to start, but you have to start to be great.", + "author": "Zig Ziglar" + } + ] +} diff --git a/client/i18n/locales/french/translations.json b/client/i18n/locales/french/translations.json new file mode 100644 index 00000000000000..ec8f50ba51c6da --- /dev/null +++ b/client/i18n/locales/french/translations.json @@ -0,0 +1,672 @@ +{ + "buttons": { + "logged-in-cta-btn": "Get started (it's free)", + "logged-out-cta-btn": "Sign in to save your progress (it's free)", + "view-curriculum": "View the Curriculum", + "first-lesson": "Go to the first lesson", + "close": "Close", + "edit": "Edit", + "show-code": "Show Code", + "show-solution": "Show Solution", + "frontend": "Front End", + "backend": "Back End", + "view": "View", + "show-cert": "Show Certification", + "claim-cert": "Claim Certification", + "save-progress": "Save Progress", + "accepted-honesty": "You have accepted our Academic Honesty Policy.", + "agree": "Agree", + "save-portfolio": "Save this portfolio item", + "remove-portfolio": "Remove this portfolio item", + "add-portfolio": "Add a new portfolio Item", + "download-data": "Download your data", + "public": "Public", + "private": "Private", + "off": "Off", + "on": "On", + "sign-in": "Sign in", + "sign-out": "Sign out", + "curriculum": "Curriculum", + "forum": "Forum", + "radio": "Radio", + "profile": "Profile", + "news": "News", + "donate": "Donate", + "update-settings": "Update my account settings", + "sign-me-out": "Sign me out of freeCodeCamp", + "flag-user": "Flag This User's Account for Abuse", + "current-challenge": "Go to current challenge", + "try-again": "Try again", + "menu": "Menu", + "settings": "Settings", + "take-me": "Take me to the Challenges", + "check-answer": "Check your answer", + "get-hint": "Get a Hint", + "ask-for-help": "Ask for Help", + "create-post": "Create a help post on the forum", + "cancel": "Cancel", + "reset-lesson": "Reset this lesson", + "run": "Run", + "run-test": "Run the Tests (Ctrl + Enter)", + "reset": "Reset", + "reset-code": "Reset All Code", + "help": "Help", + "get-help": "Get Help", + "watch-video": "Watch a Video", + "resubscribe": "You can click here to resubscribe", + "click-here": "Click here to sign in", + "save": "Save", + "no-thanks": "No thanks", + "yes-please": "Yes please", + "update-email": "Update my Email", + "verify-email": "Verify Email", + "submit-and-go": "Submit and go to next challenge", + "go-to-next": "Go to next challenge", + "ask-later": "Ask me later", + "start-coding": "Start coding!", + "go-to-settings": "Go to settings to claim your certification", + "click-start-course": "Click here to start the course", + "click-start-project": "Click here to start the project" + }, + "landing": { + "big-heading-1": "Learn to code — for free.", + "big-heading-2": "Build projects.", + "big-heading-3": "Earn certifications.", + "h2-heading": "Since 2014, more than 40,000 freeCodeCamp.org graduates have gotten jobs at tech companies including:", + "hero-img-description": "freeCodeCamp students at a local study group in South Korea.", + "as-seen-in": "As seen in:", + "testimonials": { + "heading": "Here is what our alumni say about freeCodeCamp:", + "shawn": { + "location": "Shawn Wang in Singapore", + "occupation": "Software Engineer at Amazon", + "testimony": "\"It's scary to change careers. I only gained confidence that I could code by working through the hundreds of hours of free lessons on freeCodeCamp. Within a year I had a six-figure job as a Software Engineer. freeCodeCamp changed my life.\"" + }, + "sarah": { + "location": "Sarah Chima in Nigeria", + "occupation": "Software Engineer at ChatDesk", + "testimony": "\"freeCodeCamp was the gateway to my career as a software developer. The well-structured curriculum took my coding knowledge from a total beginner level to a very confident level. It was everything I needed to land my first dev job at an amazing company.\"" + }, + "emma": { + "location": "Emma Bostian in Sweden", + "occupation": "Software Engineer at Spotify", + "testimony": "\"I've always struggled with learning JavaScript. I've taken many courses but freeCodeCamp's course was the one which stuck. Studying JavaScript as well as data structures and algorithms on freeCodeCamp gave me the skills and confidence I needed to land my dream job as a software engineer at Spotify.\"" + } + }, + "certification-heading": "Earn free verified certifications in:" + }, + "settings": { + "share-projects": "Share your non-freeCodeCamp projects, articles or accepted pull requests.", + "privacy": "The settings in this section enable you to control what is shown on your freeCodeCamp public portfolio.", + "data": "To see what data we hold on your account, click the \"Download your data\" button below", + "disabled": "Your certifications will be disabled, if set to private.", + "private-name": "Your name will not appear on your certifications, if this is set to private.", + "claim-legacy": "Once you've earned the following freeCodeCamp certifications, you'll be able to claim the {{cert}}:", + "for": "Account Settings for {{username}}", + "sound-mode": "This adds the pleasant sound of acoustic guitar throughout the website. You'll get musical feedback as you type in the editor, complete challenges, claim certifications, and more.", + "username": { + "contains invalid characters": "Username \"{{username}}\" contains invalid characters", + "is too short": "Username \"{{username}}\" is too short", + "is a reserved error code": "Username \"{{username}}\" is a reserved error code", + "must be lowercase": "Username \"{{username}}\" must be lowercase", + "unavailable": "Username not available", + "validating": "Validating username...", + "available": "Username is available", + "change": "Please note, changing your username will also change the URL to your profile and your certifications." + }, + "labels": { + "username": "Username", + "name": "Name", + "location": "Location", + "picture": "Picture", + "about": "About", + "personal": "Personal Website", + "title": "Title", + "url": "URL", + "image": "Image", + "description": "Description", + "project-name": "Project Name", + "solution": "Solution", + "solution-for": "Solution for {{projectTitle}}", + "my-profile": "My profile", + "my-name": "My name", + "my-location": "My location", + "my-about": "My about", + "my-points": "My points", + "my-heatmap": "My heatmap", + "my-certs": "My certifications", + "my-portfolio": "My portfolio", + "my-timeline": "My timeline", + "my-donations": "My donations", + "night-mode": "Night Mode", + "sound-mode": "Campfire Mode" + }, + "headings": { + "certs": "Certifications", + "legacy-certs": "Legacy Certifications", + "honesty": "Academic Honesty Policy", + "internet": "Your Internet Presence", + "portfolio": "Portfolio Settings", + "privacy": "Privacy Settings" + }, + "danger": { + "heading": "Danger Zone", + "be-careful": "Please be careful. Changes in this section are permanent.", + "reset": "Reset all of my progress", + "delete": "Delete my account", + "delete-title": "Delete My Account", + "delete-p1": "This will really delete all your data, including all your progress and account information.", + "delete-p2": "We won't be able to recover any of it for you later, even if you change your mind.", + "delete-p3": "If there's something we could do better, send us an email instead and we'll do our best: <0>{{email}}0>", + "nevermind": "Nevermind, I don't want to delete my account", + "certain": "I am 100% certain. Delete everything related to this account", + "reset-heading": "Reset My Progress", + "reset-p1": "This will really delete all of your progress, points, completed challenges, our records of your projects, any certifications you have, everything.", + "reset-p2": "We won't be able to recover any of it for you later, even if you change your mind.", + "nevermind-2": "Nevermind, I don't want to delete all of my progress", + "reset-confirm": "Reset everything. I want to start from the beginning" + }, + "email": { + "missing": "You do not have an email associated with this account.", + "heading": "Email Settings", + "not-verified": "Your email has not been verified.", + "check": "Please check your email, or <0>request a new verification email here0>.", + "current": "Current Email", + "new": "New Email", + "confirm": "Confirm New Email", + "weekly": "Send me Quincy's weekly email" + }, + "honesty": { + "p1": "Before you can claim a verified certification, you must accept our Academic Honesty Pledge, which reads:", + "p2": "\"I understand that plagiarism means copying someone else’s work and presenting the work as if it were my own, without clearly attributing the original author.\"", + "p3": "\"I understand that plagiarism is an act of intellectual dishonesty, and that people usually get kicked out of university or fired from their jobs if they get caught plagiarizing.\"", + "p4": "\"Aside from using open source libraries such as jQuery and Bootstrap, and short snippets of code which are clearly attributed to their original author, 100% of the code in my projects was written by me, or along with another person going through the freeCodeCamp curriculum with whom I was pair programming in real time.\"", + "p5": "\"I pledge that I did not plagiarize any of my freeCodeCamp.org work. I understand that freeCodeCamp.org’s team will audit my projects to confirm this.\"", + "p6": "In the situations where we discover instances of unambiguous plagiarism, we will replace the person in question’s certification with a message that \"Upon review, this account has been flagged for academic dishonesty.\"", + "p7": "As an academic institution that grants achievement-based certifications, we take academic honesty very seriously. If you have any questions about this policy, or suspect that someone has violated it, you can email <0>{{email}}0> and we will investigate." + } + }, + "profile": { + "you-not-public": "You have not made your portfolio public.", + "username-not-public": "{{username}} has not made their portfolio public.", + "you-change-privacy": "You need to change your privacy setting in order for your portfolio to be seen by others. This is a preview of how your portfolio will look when made public.", + "username-change-privacy": "{{username}} needs to change their privacy setting in order for you to view their portfolio.", + "supporter": "Supporter", + "contributor": "Top Contributor", + "no-certs": "No certifications have been earned under the current curriculum", + "fcc-certs": "freeCodeCamp Certifications", + "longest-streak": "Longest Streak:", + "current-streak": "Current Streak:", + "portfolio": "Portfolio", + "timeline": "Timeline", + "none-completed": "No challenges have been completed yet.", + "get-started": "Get started here.", + "challenge": "Challenge", + "completed": "Completed", + "add-linkedin": "Add this certification to my LinkedIn profile", + "add-twitter": "Share this certification on Twitter", + "tweet": "I just earned the {{certTitle}} certification @freeCodeCamp! Check it out here: {{certURL}}", + "avatar": "{{username}}'s avatar", + "joined": "Joined {{date}}", + "total-points": "{{count}} total point", + "total-points_plural": "{{count}} total points", + "points": "{{count}} point on {{date}}", + "points_plural": "{{count}} points on {{date}}", + "screen-shot": "A screen shot of {{title}}", + "page-number": "{{pageNumber}} of {{totalPages}}" + }, + "footer": { + "tax-exempt-status": "freeCodeCamp is a donor-supported tax-exempt 501(c)(3) nonprofit organization (United States Federal Tax Identification Number: 82-0779546)", + "mission-statement": "Our mission: to help people learn to code for free. We accomplish this by creating thousands of videos, articles, and interactive coding lessons - all freely available to the public. We also have thousands of freeCodeCamp study groups around the world.", + "donation-initiatives": "Donations to freeCodeCamp go toward our education initiatives, and help pay for servers, services, and staff.", + "donate-text": "You can <1>make a tax-deductible donation here1>.", + "trending-guides": "Trending Guides", + "our-nonprofit": "Our Nonprofit", + "links": { + "about": "About", + "alumni": "Alumni Network", + "open-source": "Open Source", + "shop": "Shop", + "support": "Support", + "sponsors": "Sponsors", + "honesty": "Academic Honesty", + "coc": "Code of Conduct", + "privacy": "Privacy Policy", + "tos": "Terms of Service", + "copyright": "Copyright Policy" + }, + "language": "Language:" + }, + "learn": { + "heading": "Welcome to freeCodeCamp's curriculum.", + "welcome-1": "Welcome back, {{name}}.", + "welcome-2": "Welcome to freeCodeCamp.org", + "start-at-beginning": "If you are new to coding, we recommend you <0>start at the beginning0>.", + "read-this": { + "heading": "Please slow down and read this.", + "p1": "freeCodeCamp is a proven path to your first software developer job.", + "p2": "More than 40,000 people have gotten developer jobs after completing this – including at big companies like Google and Microsoft.", + "p3": "If you are new to programming, we recommend you start at the beginning and earn these certifications in order.", + "p4": "To earn each certification, build its 5 required projects and get all their tests to pass.", + "p5": "You can add these certifications to your résumé or LinkedIn. But more important than the certifications is the practice you get along the way.", + "p6": "If you feel overwhelmed, that is normal. Programming is hard.", + "p7": "Practice is the key. Practice, practice, practice.", + "p8": "And this curriculum will give you thousands of hours of hands-on programming practice.", + "p9": "And if you want to learn more math and computer science theory, we also have thousands of hours of video courses on <0>freeCodeCamp's YouTube channel0>.", + "p10": "If you want to get a developer job or freelance clients, programming skills will be just part of the puzzle. You also need to build your personal network and your reputation as a developer.", + "p11": "You can do this on Twitter and GitHub, and also on <0>the freeCodeCamp forum0>.", + "p12": "Happy coding!" + }, + "upcoming-lessons": "Upcoming Lessons", + "learn": "Learn", + "add-subtitles": "Help improve or add subtitles", + "wrong-answer": "Sorry, that's not the right answer. Give it another try?", + "check-answer": "Click the button below to check your answer.", + "solution-link": "Solution Link", + "github-link": "GitHub Link", + "submit-and-go": "Submit and go to my next challenge", + "i-completed": "I've completed this challenge", + "test-output": "Your test output will go here", + "running-tests": "// running tests", + "tests-completed": "// tests completed", + "console-output": "// console output", + "sign-in-save": "Sign in to save your progress", + "download-solution": "Download my solution", + "percent-complete": "{{percent}}% complete", + "tried-rsa": "If you've already tried the <0>Read-Search-Ask0> method, then you can ask for help on the freeCodeCamp forum.", + "rsa": "Read, search, ask", + "reset": "Reset this lesson?", + "reset-warn": "Are you sure you wish to reset this lesson? The editors and tests will be reset.", + "reset-warn-2": "This cannot be undone", + "scrimba-tip": "Tip: If the mini-browser is covering the code, click and drag to move it. Also, feel free to stop and edit the code in the video at any time.", + "chal-preview": "Challenge Preview", + "cert-map-estimates": { + "certs": "{{title}} Certification (300\u00A0hours)", + "coding-prep": "{{title}} (Thousands of hours of challenges)" + }, + "editor-tabs": { + "info": "Info", + "code": "Code", + "tests": "Tests", + "restart": "Restart", + "restart-step": "Restart Step", + "console": "Console", + "notes": "Notes", + "preview": "Preview" + }, + "help-translate": "We are still translating the following certifications.", + "help-translate-link": "Help us translate.", + "project-preview-title": "Here's a preview of what you will build", + "github-required": "A <0>GitHub0> account is required to run the project. You will need to create one if you haven't already.", + "step-1": "Step 1: Complete the project", + "step-2": "Step 2: Submit your code", + "submit-public-url": "When you have completed the project, save all the required files into a public repository and submit the URL to it below.", + "complete-both-steps": "Complete both steps below to finish the challenge.", + "runs-in-vm": "The project runs in a virtual machine, complete the user stories described in there and get all the tests to pass to finish step 1." + }, + "donate": { + "title": "Support our nonprofit", + "processing": "We are processing your donation.", + "redirecting": "Redirecting...", + "thanks": "Thanks for donating", + "thank-you": "Thank you for being a supporter.", + "thank-you-2": "Thank you for being a supporter of freeCodeCamp. You currently have a recurring donation.", + "additional": "You can make an additional one-time donation of any amount using this link: <0>{{url}}0>", + "help-more": "Help us do more", + "error": "Something went wrong with your donation.", + "free-tech": "Your donations will support free technology education for people all over the world.", + "no-halo": "If you don't see a gold halo around your profile picture, contact donors@freecodecamp.org.", + "gift-frequency": "Select gift frequency:", + "gift-amount": "Select gift amount:", + "confirm": "Confirm your donation", + "confirm-2": "Confirm your one-time donation of ${{usd}}", + "confirm-3": "Confirm your donation of ${{usd}} / month", + "confirm-4": "Confirm your donation of ${{usd}} / year", + "wallet-label": "${{usd}} donation to freeCodeCamp", + "wallet-label-1": "${{usd}} / month donation to freeCodeCamp", + "your-donation": "Your ${{usd}} donation will provide {{hours}} hours of learning to people around the world.", + "your-donation-2": "Your ${{usd}} donation will provide {{hours}} hours of learning to people around the world each month.", + "your-donation-3": "Your ${{usd}} donation will provide {{hours}} hours of learning to people around the world each year.", + "duration": "Become a one-time supporter of our nonprofit.", + "duration-2": "Become a monthly supporter of our nonprofit.", + "duration-3": "Become an annual supporter of our nonprofit", + "duration-4": "Become a supporter of our nonprofit", + "duration-5": "Support our nonprofit and earn a supporter profile badge.", + "nicely-done": "Nicely done. You just completed {{block}}.", + "credit-card": "Credit Card", + "credit-card-2": "Or donate with a credit card:", + "or-card": "Or donate with card", + "paypal": "with PayPal:", + "need-email": "We need a valid email address to which we can send your donation tax receipt.", + "went-wrong": "Something went wrong processing your donation. Your card has not been charged.", + "valid-info": "Please enter valid email address, credit card number, and expiration date.", + "valid-email": "Please enter a valid email address.", + "valid-card": "Please enter valid credit card number and expiration date.", + "email-receipt": "Email (we'll send you a tax-deductible donation receipt):", + "need-help": "Need help with your current or past donations?", + "forward-receipt": "Forward a copy of your donation receipt to donors@freecodecamp.org and tell us how we can help.", + "efficiency": "freeCodeCamp is a highly efficient education nonprofit.", + "why-donate-1": "When you donate to freeCodeCamp, you help people learn new skills and provide for their families.", + "why-donate-2": "You also help us create new resources for you to use to expand your own technology skills.", + "bigger-donation": "Want to make a bigger one-time donation, mail us a check, or give in other ways?", + "other-ways": "Here are many <0>other ways you can support our non-profit's mission0>.", + "failed-pay": "Uh - oh. It looks like your transaction didn't go through. Could you please try again?", + "try-again": "Please try again.", + "card-number": "Your Card Number:", + "expiration": "Expiration Date:", + "faq": "Frequently asked questions", + "only-you": "Only you can see this message. Congratulations on earning this certification. It's no easy task. Running freeCodeCamp isn't easy either. Nor is it cheap. Help us help you and many other people around the world. Make a tax-deductible supporting donation to our nonprofit today.", + "get-help": "How can I get help with my donations?", + "how-transparent": "How transparent is freeCodeCamp.org?", + "very-transparent": "Very. We have a Platinum transparency rating from GuideStar.org.", + "download-irs": "You can <0>download our IRS Determination Letter here0>.", + "download-990": "You can <0>download our most recent 990 (annual tax report) here0>.", + "how-efficient": "How efficient is freeCodeCamp?", + "fcc-budget": "freeCodeCamp's budget is much smaller than most comparable nonprofits. We haven't brought in professional fundraisers. Instead, Quincy does everything himself.", + "help-millions": "However, on a budget of only a few hundred thousand dollars per year, we have been able to help millions of people.", + "how-one-time":"How can I make a one-time donation?", + "one-time": "If you'd prefer to make one-time donations, you can support freeCodeCamp's mission whenever you have cash to spare. You can use <0>this link to donate whatever amount feels right through PayPal0>.", + "wire-transfer": "You can also send money to freeCodeCamp directly through a wire transfer. If you need our wire details, email Quincy at quincy@freecodecamp.org", + "does-crypto": "Does freeCodeCamp accept donations in Bitcoin or other cryptocurrencies?", + "yes-cryptocurrency": "Yes. Please email Quincy at quincy@freecodecamp.org and he can send you freeCodeCamp's wallet information. He can also provide you with a donation receipt if you need one for your taxes.", + "can-check": "Can I mail a physical check?", + "yes-check": "Yes, we would welcome a check. You can mail it to us at:", + "how-matching-gift": "How can I set up matching gifts from my employer, or payroll deductions?", + "employers-vary": "This varies from employer to employer, and our nonprofit is already listed in many of the big donation-matching databases.", + "some-volunteer": "Some people are able to volunteer for freeCodeCamp and their employer matches by donating a fixed amount per hour they volunteer. Other employers will match any donations the donors make up to a certain amount", + "help-matching-gift": "If you need help with this, please email Quincy directly: quincy@freecodecamp.org", + "how-endowment": "How can I set up an Endowment Gift to freeCodeCamp.org?", + "endowment": "This would be a huge help. Since this is a more manual process, Quincy can help walk you through it personally. Please email him directly at quincy@freecodecamp.org.", + "how-legacy": "How can I set up a Legacy gift to freeCodeCamp.org?", + "we-honored": "We would be honored to put such a gift to good use helping people around the world learn to code. Depending on where you live, this may also be tax exempt.", + "legacy-gift-message": "I give, devise, and bequeath [the sum of _____ USD (or other currency) OR _____ percent of the rest and residue of my estate] to freeCodeCamp.org (Free Code Camp, Inc. tax identification number 82-0779546), a charitable corporation organized under the laws of the State of Delaware, United States, currently located at 3905 Hedgcoxe Rd, PO Box 250352, Plano, Texas, 75025 United States, to be used for its general charitable purposes at its discretion.", + "thank-wikimedia": "We would like to thank the Wikimedia Foundation for providing this formal language for us to use.", + "legacy-gift-questions": "If you have any questions about this process, please email Quincy at quincy@freecodecamp.org.", + "how-stock": "How can I donate stock to freeCodeCamp.org?", + "welcome-stock": "We would welcome your stock donations. Please email Quincy directly and he can help you with this, and share our nonprofit's brokerage account details: quincy@freecodecamp.org.", + "how-receipt": "Can I get a donation receipt so that I can deduct my donation from my taxes?", + "just-forward": "Absolutely. Just forward the receipt from your transaction to donors@freecodecamp.org, tell us you'd like a receipt and any special instructions you may have, and we'll reply with a receipt for you.", + "how-update": "I set up a monthly donation, but I need to update or pause the monthly recurrence. How can I do this?", + "take-care-of-this": "Just forward one of your monthly donation receipts to donors@freecodecamp.org and tell us what you'd like us to do. We'll take care of this for you and send you confirmation.", + "anything-else": "Is there anything else I can learn about donating to freeCodeCamp.org?", + "other-support": "If there is some other way you'd like to support our nonprofit and its mission that isn't listed here, or if you have any questions at all, please email Quincy at quincy@freecodecamp.org." + }, + "report": { + "sign-in": "You need to be signed in to report a user", + "details": "Please provide as much detail as possible about the account or behavior you are reporting.", + "portfolio": "Report a users portfolio", + "portfolio-2": "Do you want to report {{username}}'s portfolio for abuse?", + "notify-1": "We will notify the community moderators' team, and send a copy of this report to your email: {{email}}", + "notify-2": "We may get back to you for more information, if required.", + "what": "What would you like to report?", + "submit": "Submit the report" + }, + "404": { + "page-not-found": "Page not found", + "not-found": "404 Not Found:", + "heres-a-quote": "We couldn't find what you were looking for, but here is a quote:" + }, + "search": { + "label": "Search", + "placeholder": "Search 8,000+ tutorials", + "see-results": "See all results for {{searchQuery}}", + "no-tutorials": "No tutorials found", + "try": "Looking for something? Try the search bar on this page.", + "no-results": "We could not find anything relating to <0>{{query}}0>" + }, + "misc": { + "offline": "You appear to be offline, your progress may not be saved", + "server-offline": "The server could not be reached and your progress may not be saved. Please contact <0>support0> if this message persists", + "unsubscribed": "You have successfully been unsubscribed", + "keep-coding": "Whatever you go on to, keep coding!", + "email-signup": "Email Sign Up", + "quincy": "- Quincy Larson, the teacher who founded freeCodeCamp.org", + "email-blast": "By the way, each Friday I send an email with 5 links about programming and computer science. I send these to about 4 million people. Would you like me to send this to you, too?", + "update-email-1": "Update your email address", + "update-email-2": "Update your email address here:", + "email": "Email", + "and": "and", + "change-theme": "Sign in to change theme.", + "translation-pending": "Help us translate", + "certification-project": "Certification Project" + }, + "icons": { + "gold-cup": "Gold Cup", + "avatar": "Default Avatar", + "avatar-2": "An avatar coding with a laptop", + "donate": "Donate with PayPal", + "fail": "Test Failed", + "not-passed": "Not Passed", + "passed": "Passed", + "heart": "Heart", + "initial": "Initial", + "info": "Intro Information", + "spacer": "Spacer", + "toggle": "Toggle Checkmark", + "responsive-design": "Laptop and mobile phone icon", + "javascript": "JavaScript icon", + "react": "React icon", + "d3": "D3 icon", + "api": "A stack of servers", + "clipboard": "A clipboard with a checkmark", + "python": "Python icon", + "analytics": "A bar chart and line graph", + "shield": "A shield with a checkmark", + "tensorflow": "Tensorflow icon", + "database": "Database icon", + "algorithm": "Branching nodes", + "magnifier": "magnifier" + }, + "aria": { + "fcc-curriculum": "freeCodeCamp Curriculum", + "answer": "Answer", + "linkedin": "Link to {{username}}'s LinkedIn", + "github": "Link to {{username}}'s GitHub", + "website": "Link to {{username}}'s website", + "twitter": "Link to {{username}}'s Twitter", + "first-page": "Go to first page", + "previous-page": "Go to previous page", + "next-page": "Go to next page", + "last-page": "Go to last page", + "primary-nav": "primary", + "breadcrumb-nav": "breadcrumb" + }, + "flash": { + "honest-first": "To claim a certification, you must first accept our academic honesty policy", + "really-weird": "Something really weird happened, if it happens again, please consider raising an issue on https://github.com/freeCodeCamp/freeCodeCamp/issues/new", + "not-right": "Something is not quite right. A report has been generated and the freeCodeCamp.org team have been notified", + "went-wrong": "Something went wrong, please check and try again", + "account-deleted": "Your account has been successfully deleted", + "progress-reset": "Your progress has been reset", + "not-authorized": "You are not authorized to continue on this route", + "could-not-find": "We couldn't find what you were looking for. Please check and try again", + "wrong-updating": "Something went wrong updating your account. Please check and try again", + "updated-preferences": "We have updated your preferences", + "email-invalid": "Email format is invalid", + "email-valid": "Your email has successfully been changed, happy coding!", + "bad-challengeId": "currentChallengeId is not a valid challenge ID", + "theme-invalid": "Theme is invalid", + "theme-set": "Theme already set", + "theme-updated": "Your theme has been updated!", + "username-used": "Username is already associated with this account", + "username-taken": "Username is already associated with a different account", + "username-updated": "We have updated your username to {{username}}", + "could-not-logout": "We could not log you out, please try again in a moment", + "email-encoded-wrong": "The email encoded in the link is incorrectly formatted", + "oops-not-right": "Oops, something is not right, please request a fresh link to sign in / sign up", + "expired-link": "Looks like the link you clicked has expired, please request a fresh link, to sign in", + "signin-success": "Success! You have signed in to your account. Happy Coding!", + "social-auth-gone": "We are moving away from social authentication for privacy reasons. Next time we recommend using your email address: {{email}} to sign in instead.", + "name-needed": "We need your name so we can put it on your certification. Add your name to your account settings and click the save button. Then we can issue your certification.", + "incomplete-steps": "It looks like you have not completed the necessary steps. Please complete the required projects to claim the {{name}} Certification.", + "already-claimed": "It looks like you already have claimed the {{name}} Certification", + "cert-claim-success": "@{{username}}, you have successfully claimed the {{name}} Certification! Congratulations on behalf of the freeCodeCamp.org team!", + "wrong-name": "Something went wrong with the verification of {{name}}, please try again. If you continue to receive this error, you can send a message to support@freeCodeCamp.org to get help.", + "error-claiming": "Error claiming {{certName}}", + "refresh-needed": "You can only use the PaymentRequest button once. Refresh the page to start over.", + "username-not-found": "We could not find a user with the username \"{{username}}\"", + "add-name": "This user needs to add their name to their account in order for others to be able to view their certification.", + "not-eligible": "This user is not eligible for freeCodeCamp.org certifications at this time.", + "profile-private": "{{username}} has chosen to make their profile private. They will need to make their profile public in order for others to be able to view their certification.", + "certs-private": "{{username}} has chosen to make their certifications private. They will need to make their certifications public in order for others to be able to view them.", + "not-honest": "{{username}} has not yet agreed to our Academic Honesty Pledge.", + "user-not-certified": "It looks like user {{username}} is not {{cert}} certified", + "invalid-challenge": "That does not appear to be a valid challenge submission", + "no-links-provided": "You have not provided the valid links for us to inspect your work.", + "no-social": "No social account found", + "invalid-social": "Invalid social account", + "no-account": "No {{website}} account associated", + "unlink-success": "You've successfully unlinked your {{website}}", + "provide-username": "Check if you have provided a username and a report", + "report-sent": "A report was sent to the team with {{email}} in copy", + "certificate-missing": "The certification you tried to view does not exist", + "create-token-err": "An error occurred trying to create a token", + "delete-token-err": "An error occurred trying to delete your token", + "token-created": "You have successfully created a new token.", + "token-deleted": "Your token has been deleted.", + "complete-project-first": "You must complete the project first.", + "local-code-save-error": "Oops, your code did not save, your browser's local storage may be full.", + "local-code-saved": "Saved! Your code was saved to your browser's local storage." + }, + "validation": { + "max-characters": "There is a maximum limit of 288 characters, you have {{charsLeft}} left", + "same-email": "This email is the same as your current email", + "invalid-email": "We could not validate your email correctly, please ensure it is correct", + "email-mismatch": "Both new email addresses must be the same", + "title-required": "A title is required", + "title-short": "Title is too short", + "title-long": "Title is too long", + "invalid-url": "We could not validate your URL correctly, please ensure it is correct", + "invalid-protocol": "URL must start with http or https", + "url-not-image": "URL must link directly to an image file", + "use-valid-url": "Please use a valid URL", + "editor-url": "Remember to submit the Live App URL.", + "http-url": "An unsecure (http) URL cannot be used.", + "own-work-url": "Remember to submit your own work.", + "publicly-visible-url": "Remember to submit a publicly visible app URL." + }, + "certification": { + "executive": "Executive Director, freeCodeCamp.org", + "verify": "Verify this certification at {{certURL}}", + "issued": "Issued", + "fulltext": "<0>This certifies that0> <1>{{user}}1> <2>has successfully completed the freeCodeCamp.org2> <3>{{title}}3> <4>Developer Certification, representing approximately {{time}} hours of coursework.4>", + "project": { + "heading-legacy-full-stack": "As part of this Legacy Full Stack certification, {{user}} completed the following certifications:", + "heading": "As part of this certification, {{user}} built the following projects and got all automated test suites to pass:", + "solution": "solution", + "no-solution": "error displaying solution, email support@freeCodeCamp.org to get help.", + "source": "source", + "footnote": "If you suspect that any of these projects violate the <2>academic honesty policy2>, please <5>report this to our team5>.", + "title": { + "Build a Personal Portfolio Webpage": "Build a Personal Portfolio Webpage", + "Build a Random Quote Machine": "Build a Random Quote Machine", + "Build a 25 + 5 Clock": "Build a 25 + 5 Clock", + "Build a JavaScript Calculator": "Build a JavaScript Calculator", + "Show the Local Weather": "Show the Local Weather", + "Use the TwitchTV JSON API": "Use the TwitchTV JSON API", + "Stylize Stories on Camper News": "Stylize Stories on Camper News", + "Build a Wikipedia Viewer": "Build a Wikipedia Viewer", + "Build a Tic Tac Toe Game": "Build a Tic Tac Toe Game", + "Build a Simon Game": "Build a Simon Game", + "Timestamp Microservice": "Timestamp Microservice", + "Request Header Parser Microservice": "Request Header Parser Microservice", + "URL Shortener Microservice": "URL Shortener Microservice", + "Image Search Abstraction Layer": "Image Search Abstraction Layer", + "File Metadata Microservice": "File Metadata Microservice", + "Build a Voting App": "Build a Voting App", + "Build a Nightlife Coordination App": "Build a Nightlife Coordination App", + "Chart the Stock Market": "Chart the Stock Market", + "Manage a Book Trading Club": "Manage a Book Trading Club", + "Build a Pinterest Clone": "Build a Pinterest Clone", + "Build a Markdown Previewer": "Build a Markdown Previewer", + "Build a Camper Leaderboard": "Build a Camper Leaderboard", + "Build a Recipe Box": "Build a Recipe Box", + "Build the Game of Life": "Build the Game of Life", + "Build a Roguelike Dungeon Crawler Game": "Build a Roguelike Dungeon Crawler Game", + "Visualize Data with a Bar Chart": "Visualize Data with a Bar Chart", + "Visualize Data with a Scatterplot Graph": "Visualize Data with a Scatterplot Graph", + "Visualize Data with a Heat Map": "Visualize Data with a Heat Map", + "Show National Contiguity with a Force Directed Graph": "Show National Contiguity with a Force Directed Graph", + "Map Data Across the Globe": "Map Data Across the Globe", + "Metric-Imperial Converter": "Metric-Imperial Converter", + "Issue Tracker": "Issue Tracker", + "Personal Library": "Personal Library", + "Stock Price Checker": "Stock Price Checker", + "Anonymous Message Board": "Anonymous Message Board", + "Build a Tribute Page": "Build a Tribute Page", + "Build a Survey Form": "Build a Survey Form", + "Build a Product Landing Page": "Build a Product Landing Page", + "Build a Technical Documentation Page": "Build a Technical Documentation Page", + "Palindrome Checker": "Palindrome Checker", + "Roman Numeral Converter": "Roman Numeral Converter", + "Caesars Cipher": "Caesars Cipher", + "Telephone Number Validator": "Telephone Number Validator", + "Cash Register": "Cash Register", + "Build a Drum Machine": "Build a Drum Machine", + "Visualize Data with a Choropleth Map": "Visualize Data with a Choropleth Map", + "Visualize Data with a Treemap Diagram": "Visualize Data with a Treemap Diagram", + "Exercise Tracker": "Exercise Tracker", + "Sudoku Solver": "Sudoku Solver", + "American British Translator": "American British Translator", + "Arithmetic Formatter": "Arithmetic Formatter", + "Time Calculator": "Time Calculator", + "Budget App": "Budget App", + "Polygon Area Calculator": "Polygon Area Calculator", + "Probability Calculator": "Probability Calculator", + "Mean-Variance-Standard Deviation Calculator": "Mean-Variance-Standard Deviation Calculator", + "Demographic Data Analyzer": "Demographic Data Analyzer", + "Medical Data Visualizer": "Medical Data Visualizer", + "Page View Time Series Visualizer": "Page View Time Series Visualizer", + "Sea Level Predictor": "Sea Level Predictor", + "Port Scanner": "Port Scanner", + "SHA-1 Password Cracker": "SHA-1 Password Cracker", + "Secure Real Time Multiplayer Game": "Secure Real Time Multiplayer Game", + "Rock Paper Scissors": "Rock Paper Scissors", + "Cat and Dog Image Classifier": "Cat and Dog Image Classifier", + "Book Recommendation Engine using KNN": "Book Recommendation Engine using KNN", + "Linear Regression Health Costs Calculator": "Linear Regression Health Costs Calculator", + "Neural Network SMS Text Classifier": "Neural Network SMS Text Classifier" + } + } + }, + "certification-card": { + "title": "Claim Your Certification", + "intro": "Complete the following steps to claim and view your {{i18nCertText}}", + "complete-project": "Complete {{i18nCertText}} Projects", + "accept-honesty": "Accept our Academic Honesty Policy", + "set-name": "Set your name, and make it public", + "set-certs-public": "Set your certification settings to public", + "set-profile-public": "Set your profile settings to public", + "set-claim": "Claim and view your certification" + }, + "forum-help": { + "browser-info": "**Your browser information:**", + "user-agent": "User Agent is:
{{userAgent}}",
+ "challenge": "**Challenge:** {{challengeTitle}}",
+ "challenge-link": "**Link to the challenge:**",
+ "whats-happening": "**Tell us what's happening:**",
+ "describe": "Describe your issue in detail here.",
+ "camper-project": "**Your project link(s)**",
+ "camper-code": "**Your code so far**",
+ "warning": "WARNING",
+ "too-long-one": "The challenge seed code and/or your solution exceeded the maximum length we can port over from the challenge.",
+ "too-long-two": "You will need to take an additional step here so the code you wrote presents in an easy to read format.",
+ "too-long-three": "Please copy/paste all the editor code showing in the challenge from where you just linked.",
+ "add-code-one": "Replace these two sentences with your copied code.",
+ "add-code-two": "Please leave the ``` line above and the ``` line below,",
+ "add-code-three": "because they allow your code to properly format in the post."
+ },
+ "webhook-token": {
+ "title": "Webhook Token",
+ "create": "Create a new token",
+ "create-p1": "It looks like you don't have a webhook token. Create one to save your progress on this section",
+ "create-p2": "Create a webhook token to save your progress on the curriculum sections that use a virtual machine.",
+ "delete": "Delete my token",
+ "delete-title": "Delete My Webhook Token",
+ "delete-p1": "Your webhook token below is used to save your progress on the curriculum sections that use a virtual machine.",
+ "delete-p2": "If you suspect your token has been compromised, you can delete it to make it unusable. Progress on previously submitted lessons will not be lost.",
+ "delete-p3": "You will need to create a new token to save future progress on the curriculum sections that use a virtual machine.",
+ "no-thanks": "No thanks, I would like to keep my token",
+ "yes-please": "Yes please, I would like to delete my token"
+ }
+}
diff --git a/client/i18n/locales/french/trending.json b/client/i18n/locales/french/trending.json
new file mode 100644
index 00000000000000..5a994f0cf8a933
--- /dev/null
+++ b/client/i18n/locales/french/trending.json
@@ -0,0 +1,62 @@
+{
+ "article0title": "HTML Font Style",
+ "article0link": "https://www.freecodecamp.org/news/html-font-style-how-to-change-text-color-and-size-with-an-html-tag/",
+ "article1title": "Python Enumerate",
+ "article1link": "https://www.freecodecamp.org/news/python-enumerate-python-enum-for-loop-index-example/",
+ "article2title": " tag in HTML",
+ "article2link": "https://www.freecodecamp.org/news/pre-tag-in-html-example-code/",
+ "article3title": "Git Delete Branch",
+ "article3link": "https://www.freecodecamp.org/news/git-delete-branch-how-to-remove-a-local-or-remote-branch/",
+ "article4title": "Git Revert Commit",
+ "article4link": "https://www.freecodecamp.org/news/git-revert-commit-how-to-undo-the-last-commit/",
+ "article5title": "Bold Font in HTML",
+ "article5link": "https://www.freecodecamp.org/news/bold-font-in-html-font-weight-for-letters/",
+ "article6title": "HTML Button onclick",
+ "article6link": "https://www.freecodecamp.org/news/html-button-onclick-javascript-click-event-tutorial/",
+ "article7title": "HTML Underline Text",
+ "article7link": "https://www.freecodecamp.org/news/html-underline-text-how-to-use-the-u-tag-with-example-code/",
+ "article8title": "CSS Display Property",
+ "article8link": "https://www.freecodecamp.org/news/the-css-display-property-display-none-display-table-inline-block-and-more/",
+ "article9title": "SQL Left Join Syntax",
+ "article9link": "https://www.freecodecamp.org/news/sql-left-join-example-join-statement-syntax/",
+ "article10title": "CSS Font",
+ "article10link": "https://www.freecodecamp.org/news/html-font-css-font-family-example-serif-and-sans-serif-characters/",
+ "article11title": "HTML Space",
+ "article11link": "https://www.freecodecamp.org/news/html-space-how-to-add-a-non-breaking-space-with-the-nbsp-character-entity/",
+ "article12title": "HTML Forms",
+ "article12link": "https://www.freecodecamp.org/news/html-form-input-type-and-submit-button-example/",
+ "article13title": "How to Code",
+ "article13link": "https://www.freecodecamp.org/news/how-to-code-coding-for-beginners-and-how-to-learn-programming-for-free/",
+ "article14title": "What is PHP?",
+ "article14link": "https://www.freecodecamp.org/news/what-is-php-the-php-programming-language-meaning-explained/",
+ "article15title": "What is HTML?",
+ "article15link": "https://www.freecodecamp.org/news/what-is-html-definition-and-meaning/",
+ "article16title": "HTML Image Tag",
+ "article16link": "https://www.freecodecamp.org/news/img-html-image-tag-tutorial/",
+ "article17title": "What is HTTPS?",
+ "article17link": "https://www.freecodecamp.org/news/what-is-https-http-vs-https-meaning-and-how-it-works/",
+ "article18title": "SQL Join Types",
+ "article18link": "https://www.freecodecamp.org/news/sql-join-types-inner-join-vs-outer-join-example/",
+ "article19title": "Coding Websites",
+ "article19link": "https://www.freecodecamp.org/news/coding-websites-where-you-can-learn-how-to-code-for-free/",
+ "article20title": "Case Statement in SQL",
+ "article20link": "https://www.freecodecamp.org/news/case-statement-in-sql-example-query/",
+ "article21title": "JavaScript setTimeout()",
+ "article21link": "https://www.freecodecamp.org/news/javascript-settimeout-js-timer-to-delay-n-seconds/",
+ "article22title": "Python Function Examples",
+ "article22link": "https://www.freecodecamp.org/news/python-function-examples-how-to-declare-and-invoke-with-parameters-2/",
+ "article23title": "External CSS Stylesheets",
+ "article23link": "https://www.freecodecamp.org/news/external-css-stylesheets-how-to-link-css-to-html-and-import-into-head/",
+ "article24title": "HTML and CSS Code Examples",
+ "article24link": "https://www.freecodecamp.org/news/html-and-css-inline-style-external-stylesheet-css-code-examples/",
+ "article25title": "Remove a Directory in Linux",
+ "article25link": "https://www.freecodecamp.org/news/remove-a-directory-in-linux-how-to-delete-directories-and-contents-from-the-command-line/",
+ "article26title": "Text Box in Google Docs",
+ "article26link": "https://www.freecodecamp.org/news/how-to-insert-a-text-box-in-google-docs-add-textbox-tutorial/",
+ "article27title": "Outlier in Statistics",
+ "article27link": "https://www.freecodecamp.org/news/what-is-an-outlier-definition-and-how-to-find-outliers-in-statistics/",
+ "article28title": "Windows 10 Screen Brightness",
+ "article28link": "https://www.freecodecamp.org/news/how-to-change-screen-brightness-on-windows-10/",
+ "article29title": "Unblock Someone on Instagram",
+ "article29link": "https://www.freecodecamp.org/news/how-to-unblock-someone-on-instagram/"
+}
\ No newline at end of file
diff --git a/client/src/assets/icons/FreeCodeCamp-logo.tsx b/client/src/assets/icons/FreeCodeCamp-logo.tsx
index 1e1a28f8321dfd..ff223b69ef6b97 100644
--- a/client/src/assets/icons/FreeCodeCamp-logo.tsx
+++ b/client/src/assets/icons/FreeCodeCamp-logo.tsx
@@ -1,17 +1,18 @@
import React from 'react';
+import { useTranslation } from 'react-i18next';
+
+function FreeCodeCampLogo(): JSX.Element {
+ const { t } = useTranslation();
-function FreeCodeCampLogo(
- props: JSX.IntrinsicAttributes & React.SVGProps
-): JSX.Element {
return (
\ No newline at end of file
diff --git a/client/src/assets/icons/facebook-square-brands.svg b/client/src/assets/icons/facebook-square-brands.svg
new file mode 100644
index 00000000000000..7326e4bb43acb9
--- /dev/null
+++ b/client/src/assets/icons/facebook-square-brands.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/assets/icons/instagram-square-brands-light.svg b/client/src/assets/icons/instagram-square-brands-light.svg
new file mode 100644
index 00000000000000..8b3c0979bef1e4
--- /dev/null
+++ b/client/src/assets/icons/instagram-square-brands-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/assets/icons/instagram-square-brands.svg b/client/src/assets/icons/instagram-square-brands.svg
new file mode 100644
index 00000000000000..f32b6e5e970f0c
--- /dev/null
+++ b/client/src/assets/icons/instagram-square-brands.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/assets/icons/kda-learning-plateform-chroma.png b/client/src/assets/icons/kda-learning-plateform-chroma.png
new file mode 100644
index 00000000000000..8c209061aea375
Binary files /dev/null and b/client/src/assets/icons/kda-learning-plateform-chroma.png differ
diff --git a/client/src/assets/icons/kda-learning-plateform.png b/client/src/assets/icons/kda-learning-plateform.png
new file mode 100644
index 00000000000000..11bade4c3954ea
Binary files /dev/null and b/client/src/assets/icons/kda-learning-plateform.png differ
diff --git a/client/src/assets/icons/kda-logo.png b/client/src/assets/icons/kda-logo.png
new file mode 100644
index 00000000000000..a6fdcb0248c151
Binary files /dev/null and b/client/src/assets/icons/kda-logo.png differ
diff --git a/client/src/assets/icons/linkedin-brands-light.svg b/client/src/assets/icons/linkedin-brands-light.svg
new file mode 100644
index 00000000000000..e2b2d6c0db6025
--- /dev/null
+++ b/client/src/assets/icons/linkedin-brands-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/assets/icons/linkedin-brands.svg b/client/src/assets/icons/linkedin-brands.svg
new file mode 100644
index 00000000000000..4309db9226e941
--- /dev/null
+++ b/client/src/assets/icons/linkedin-brands.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/assets/icons/twitter-square-brands-light.svg b/client/src/assets/icons/twitter-square-brands-light.svg
new file mode 100644
index 00000000000000..d9cd3645e23a4e
--- /dev/null
+++ b/client/src/assets/icons/twitter-square-brands-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/assets/icons/twitter-square-brands.svg b/client/src/assets/icons/twitter-square-brands.svg
new file mode 100644
index 00000000000000..d35a64172f22e1
--- /dev/null
+++ b/client/src/assets/icons/twitter-square-brands.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/assets/images/bi-bar-chart.png b/client/src/assets/images/bi-bar-chart.png
new file mode 100644
index 00000000000000..121df0757144b8
Binary files /dev/null and b/client/src/assets/images/bi-bar-chart.png differ
diff --git a/client/src/assets/images/bx-code-block.png b/client/src/assets/images/bx-code-block.png
new file mode 100644
index 00000000000000..4690a9f773f585
Binary files /dev/null and b/client/src/assets/images/bx-code-block.png differ
diff --git a/client/src/assets/images/css.png b/client/src/assets/images/css.png
new file mode 100644
index 00000000000000..0f82f461492259
Binary files /dev/null and b/client/src/assets/images/css.png differ
diff --git a/client/src/assets/images/html.png b/client/src/assets/images/html.png
new file mode 100644
index 00000000000000..822b50d6e6e832
Binary files /dev/null and b/client/src/assets/images/html.png differ
diff --git a/client/src/assets/images/kda-learning-plateform-landing-logo.png b/client/src/assets/images/kda-learning-plateform-landing-logo.png
new file mode 100644
index 00000000000000..a0b41816740cca
Binary files /dev/null and b/client/src/assets/images/kda-learning-plateform-landing-logo.png differ
diff --git a/client/src/assets/images/learn-code.png b/client/src/assets/images/learn-code.png
new file mode 100644
index 00000000000000..bc68d71ea6eb43
Binary files /dev/null and b/client/src/assets/images/learn-code.png differ
diff --git a/client/src/assets/images/square_puck.png b/client/src/assets/images/square_puck.png
index 12af9808b2bbb9..9865b0543730f1 100644
Binary files a/client/src/assets/images/square_puck.png and b/client/src/assets/images/square_puck.png differ
diff --git a/client/src/client-only-routes/show-settings.tsx b/client/src/client-only-routes/show-settings.tsx
index c31ac63e988e02..74001279c1d513 100644
--- a/client/src/client-only-routes/show-settings.tsx
+++ b/client/src/client-only-routes/show-settings.tsx
@@ -1,4 +1,4 @@
-import { Grid } from '@freecodecamp/react-bootstrap';
+import { Grid, Row, Col } from '@freecodecamp/react-bootstrap';
import React from 'react';
import Helmet from 'react-helmet';
import { useTranslation } from 'react-i18next';
@@ -8,26 +8,32 @@ import { createSelector } from 'reselect';
import envData from '../../../config/env.json';
import { createFlashMessage } from '../components/Flash/redux';
import { Loader, Spacer } from '../components/helpers';
-import Certification from '../components/settings/certification';
import About from '../components/settings/about';
+import Education from '../components/settings/education';
+import WorkExperience from '../components/settings/work-experience';
import DangerZone from '../components/settings/danger-zone';
-import Email from '../components/settings/email';
-import Honesty from '../components/settings/honesty';
+// import Email from '../components/settings/email';
import Internet from '../components/settings/internet';
-import Portfolio from '../components/settings/portfolio';
-import Privacy from '../components/settings/privacy';
import { Themes } from '../components/settings/theme';
-import WebhookToken from '../components/settings/webhook-token';
+
import {
signInLoadingSelector,
userSelector,
isSignedInSelector,
hardGoTo as navigate
} from '../redux';
+
import { User } from '../redux/prop-types';
-import { submitNewAbout, updateUserFlag, verifyCert } from '../redux/settings';
-const { apiLocation, deploymentEnv } = envData;
+import {
+ submitNewAbout,
+ updateUserFlag,
+ verifyCert,
+ submitNewEducation,
+ submitNewWorkExperience
+} from '../redux/settings';
+
+const { apiLocation } = envData;
// TODO: update types for actions
interface ShowSettingsProps {
@@ -36,6 +42,8 @@ interface ShowSettingsProps {
navigate: (location: string) => void;
showLoading: boolean;
submitNewAbout: () => void;
+ submitNewEducation: () => void;
+ submitNewWorkExperience: () => void;
toggleNightMode: (theme: Themes) => void;
toggleSoundMode: (sound: boolean) => void;
updateInternetSettings: () => void;
@@ -62,6 +70,8 @@ const mapDispatchToProps = {
createFlashMessage,
navigate,
submitNewAbout,
+ submitNewEducation,
+ submitNewWorkExperience,
toggleNightMode: (theme: Themes) => updateUserFlag({ theme }),
toggleSoundMode: (sound: boolean) => updateUserFlag({ sound }),
updateInternetSettings: updateUserFlag,
@@ -75,54 +85,35 @@ const mapDispatchToProps = {
export function ShowSettings(props: ShowSettingsProps): JSX.Element {
const { t } = useTranslation();
const {
- createFlashMessage,
isSignedIn,
submitNewAbout,
- toggleNightMode,
- toggleSoundMode,
+ submitNewEducation,
+ submitNewWorkExperience,
user: {
- completedChallenges,
- email,
- is2018DataVisCert,
- isApisMicroservicesCert,
- isJsAlgoDataStructCert,
- isBackEndCert,
- isDataVisCert,
- isFrontEndCert,
- isInfosecQaCert,
- isQaCertV7,
- isInfosecCertV7,
- isFrontEndLibsCert,
- isFullStackCert,
- isRespWebDesignCert,
- isSciCompPyCertV7,
- isDataAnalysisPyCertV7,
- isMachineLearningPyCertV7,
- isRelationalDatabaseCertV8,
- isEmailVerified,
- isHonest,
- sendQuincyEmail,
+ // email,
+ // isEmailVerified,
+ // sendQuincyEmail,
username,
about,
- picture,
points,
- theme,
- sound,
location,
name,
+ gender,
+ codeTime,
+ fieldOfStudy,
+ levelOfStudy,
+ employedWhere,
+ sinceWhen,
+ position,
githubProfile,
linkedin,
twitter,
- website,
- portfolio
+ website
},
navigate,
showLoading,
- updateQuincyEmail,
- updateInternetSettings,
- updatePortfolio,
- updateIsHonest,
- verifyCert
+ // updateQuincyEmail,
+ updateInternetSettings
} = props;
if (showLoading) {
@@ -136,74 +127,159 @@ export function ShowSettings(props: ShowSettingsProps): JSX.Element {
return (
<>
-
-
+
+
-
- {t('settings.for', { username: username })}
-
-
-
-
-
-
-
-
-
- {/* @ts-expect-error Portfolio types mismatch */}
-
-
-
-
-
- {deploymentEnv == 'staging' && }
- {deploymentEnv == 'staging' && }
+
+
+
+
+
+
+ {'Informations personnelles'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {'Éducation'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {'Expérience professionnelle'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/*
+
+
+
+
+
+
+ {"Paramètres d'email"}
+
+
+
+
+
+
+
+
+
+
+
+
+ */}
+
+
+
+
+
+
+
+ {'Votre présence sur internet'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/src/client-only-routes/show-unsubscribed.tsx b/client/src/client-only-routes/show-unsubscribed.tsx
index 0ddd3c02482dda..cbd0128c730010 100644
--- a/client/src/client-only-routes/show-unsubscribed.tsx
+++ b/client/src/client-only-routes/show-unsubscribed.tsx
@@ -18,7 +18,9 @@ function ShowUnsubscribed({
return (
<>
- {t('metaTags:youre-unsubscribed')} | freeCodeCamp.org
+
+ {t('metaTags:youre-unsubscribed')} | Code Learning Plateform
+
diff --git a/client/src/client-only-routes/show-user.tsx b/client/src/client-only-routes/show-user.tsx
index 8231fbdc808bc6..e26b10b5fa59e2 100644
--- a/client/src/client-only-routes/show-user.tsx
+++ b/client/src/client-only-routes/show-user.tsx
@@ -106,7 +106,7 @@ function ShowUser({
return (
<>
- {t('report.portfolio')} | freeCodeCamp.org
+ {t('report.portfolio')} | Code Learning Plateform
diff --git a/client/src/components/Donation/donate-form.tsx b/client/src/components/Donation/donate-form.tsx
index cba6ca6e150118..423f35bdda3fc4 100644
--- a/client/src/components/Donation/donate-form.tsx
+++ b/client/src/components/Donation/donate-form.tsx
@@ -28,10 +28,10 @@ import {
import Spacer from '../helpers/spacer';
import { Themes } from '../settings/theme';
import DonateCompletion from './donate-completion';
-import PatreonButton from './patreon-button';
+//import PatreonButton from './patreon-button';
import type { AddDonationData } from './paypal-button';
-import PaypalButton from './paypal-button';
-import StripeCardForm, { HandleAuthentication } from './stripe-card-form';
+// import PaypalButton from './paypal-button';
+// import StripeCardForm, { HandleAuthentication } from './stripe-card-form';
import WalletsWrapper from './walletsButton';
import './donation.css';
@@ -62,7 +62,7 @@ type DonateFormProps = {
paymentMethodId: string;
amount: number;
duration: string;
- handleAuthentication: HandleAuthentication;
+ // handleAuthentication: HandleAuthentication;
}) => void;
defaultTheme?: Themes;
email: string;
@@ -230,8 +230,8 @@ class DonateForm extends Component {
}
postStripeCardDonation(
- paymentMethodId: string,
- handleAuthentication: HandleAuthentication
+ paymentMethodId: string
+ // handleAuthentication: HandleAuthentication
) {
const { donationAmount: amount, donationDuration: duration } = this.state;
this.props.handleProcessing(
@@ -242,8 +242,8 @@ class DonateForm extends Component {
this.props.postChargeStripeCard({
paymentMethodId,
amount,
- duration,
- handleAuthentication
+ duration
+ // handleAuthentication
});
}
@@ -307,15 +307,11 @@ class DonateForm extends Component {
renderButtonGroup() {
const { donationAmount, donationDuration } = this.state;
const {
- donationFormState: { loading, processing },
- handleProcessing,
- addDonation,
+ donationFormState: { loading },
defaultTheme,
theme,
t,
- isMinimalForm,
- isSignedIn,
- isDonating
+ isMinimalForm
} = this.props;
const priorityTheme = defaultTheme ? defaultTheme : theme;
const isOneTime = donationDuration === 'onetime';
@@ -323,7 +319,7 @@ class DonateForm extends Component {
isOneTime ? 'donate.wallet-label' : 'donate.wallet-label-1',
{ usd: donationAmount / 100 }
)}:`;
- const showMinimalPayments = isSignedIn && (isMinimalForm || !isDonating);
+ // const showMinimalPayments = isSignedIn && (isMinimalForm || !isDonating);
return (
<>
@@ -342,7 +338,7 @@ class DonateForm extends Component {
refreshErrorMessage={t('donate.refresh-needed')}
theme={priorityTheme}
/>
- {
isSignedIn={isSignedIn}
onDonationStateChange={this.onDonationStateChange}
theme={priorityTheme}
- />
- {(!loading.stripe || !loading.paypal) && (
+ /> */}
+ {/* {(!loading.stripe || !loading.paypal) && (
- )}
- {showMinimalPayments && (
+ )} */}
+ {/* {showMinimalPayments && (
<>
{t('donate.or-card')}
{
theme={priorityTheme}
/>
>
- )}
+ )} */}
>
);
diff --git a/client/src/components/Donation/donation-modal.tsx b/client/src/components/Donation/donation-modal.tsx
index 27ffa552c7811d..6ca5087b248475 100644
--- a/client/src/components/Donation/donation-modal.tsx
+++ b/client/src/components/Donation/donation-modal.tsx
@@ -1,12 +1,10 @@
import { Modal, Button, Col, Row } from '@freecodecamp/react-bootstrap';
import { WindowLocation } from '@reach/router';
import React, { useEffect } from 'react';
-import { useTranslation } from 'react-i18next';
import { connect } from 'react-redux';
import { goToAnchor } from 'react-scrollable-anchor';
import { bindActionCreators, Dispatch, AnyAction } from 'redux';
import { createSelector } from 'reselect';
-import { modalDefaultDonation } from '../../../../config/donation-settings';
import Cup from '../../assets/icons/cup';
import Heart from '../../assets/icons/heart';
@@ -20,7 +18,6 @@ import {
import { isLocationSuperBlock } from '../../utils/path-parsers';
import { playTone } from '../../utils/tone';
import { Spacer } from '../helpers';
-import DonateForm from './donate-form';
const mapStateToProps = createSelector(
isDonationModalOpenSelector,
@@ -57,27 +54,10 @@ function DonateModal({
closeDonationModal,
executeGA,
location,
- recentlyClaimedBlock,
- isAVariant
+ recentlyClaimedBlock
}: DonateModalProps): JSX.Element {
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
const [closeLabel, setCloseLabel] = React.useState(false);
- const { t } = useTranslation();
- const handleProcessing = (
- duration: string,
- amount: number,
- action: string
- ) => {
- executeGA({
- type: 'event',
- data: {
- category: 'Donation',
- action: `Modal ${action}`,
- label: duration,
- value: amount
- }
- });
- setCloseLabel(true);
- };
useEffect(() => {
if (show) {
@@ -96,20 +76,6 @@ function DonateModal({
}
}, [show, recentlyClaimedBlock, executeGA]);
- const getDonationText = () => {
- const donationDuration = modalDefaultDonation.donationDuration;
- switch (donationDuration) {
- case 'onetime':
- return {t('donate.duration')};
- case 'month':
- return {t('donate.duration-2')};
- case 'year':
- return {t('donate.duration-3')};
- default:
- return {t('donate.duration-4')};
- }
- };
-
const handleModalHide = () => {
// If modal is open on a SuperBlock page
if (isLocationSuperBlock(location)) {
@@ -125,20 +91,13 @@ function DonateModal({
{!closeLabel && (
- {t('donate.nicely-done', { block: recentlyClaimedBlock })}
-
- {getDonationText()}
+ {'Bien joué. Vous venez de terminer!'}
)}
);
- const renderABtestProgressText = () => {
- if (isAVariant) return getDonationText();
- else {t('donate.duration-5')};
- };
-
const progressDonationText = (
@@ -147,7 +106,7 @@ function DonateModal({
{!closeLabel && (
- {renderABtestProgressText()}
+ {'Bien joué!'}
)}
@@ -164,26 +123,17 @@ function DonateModal({
{recentlyClaimedBlock ? blockDonationText : progressDonationText}
-
-
-
-
-
-
diff --git a/client/src/components/Flash/index.tsx b/client/src/components/Flash/index.tsx
index 6accd829365ded..dde98d00d11dea 100644
--- a/client/src/components/Flash/index.tsx
+++ b/client/src/components/Flash/index.tsx
@@ -34,25 +34,33 @@ function Flash({ flashMessage, removeFlashMessage }: FlashProps): JSX.Element {
return (
<>
-
-
-
- {t(message, variables)}
-
-
-
- {flashMessage && (
-
- )}
+
+ {console.log(type)}
+
+
+
+ {t(message, variables)}
+
+
+
+ {flashMessage && (
+
+ )}
+
>
);
}
diff --git a/client/src/components/Flash/redux/flash-messages.ts b/client/src/components/Flash/redux/flash-messages.ts
index 7118fa0779b7f0..1680c8201d7e0e 100644
--- a/client/src/components/Flash/redux/flash-messages.ts
+++ b/client/src/components/Flash/redux/flash-messages.ts
@@ -1,38 +1,38 @@
export enum FlashMessages {
- AccountDeleted = 'flash.account-deleted',
- AddNameSuccess = 'flash.add-name',
- AlreadyClaimed = 'flash.already-claimed',
- CertClaimSuccess = 'flash.cert-claim-success',
- CertificateMissing = 'flash.certificate-missing',
- CertsPrivate = 'flash.certs-private',
- CompleteProjectFirst = 'flash.complete-project-first',
- CreateTokenErr = 'flash.create-token-err',
- DeleteTokenErr = 'flash.delete-token-err',
- EmailValid = 'flash.email-valid',
- HonestFirst = 'flash.honest-first',
- IncompleteSteps = 'flash.incomplete-steps',
- LocalCodeSaved = 'flash.local-code-saved',
- LocalCodeSaveError = 'flash.local-code-save-error',
- NameNeeded = 'flash.name-needed',
+ AccountDeleted = 'Votre compte a été supprimé avec succès',
+ AddNameSuccess = "Cet utilisateur doit ajouter son nom à son compte pour que d'autres puissent voir sa certification.",
+ AlreadyClaimed = 'Il semble que vous ayez déjà revendiqué la certification',
+ CertClaimSuccess = "Vous avez revendiqué avec succès la Certification ! Félicitations au nom de l'équipe !",
+ CertificateMissing = "La certification que vous avez essayé de visualiser n'existe pas",
+ CertsPrivate = 'vous avez choisi de rendre vos certifications privées. vous devrez rendre vos certifications publiques pour que les autres puissent les consulter.',
+ CompleteProjectFirst = "Vous devez d'abord terminer le projet.",
+ CreateTokenErr = "Une erreur s'est produite en essayant de créer un jeton",
+ DeleteTokenErr = "Une erreur s'est produite en essayant de supprimer votre jeton",
+ EmailValid = 'Votre adresse électronique a été modifiée avec succès, bon codage !',
+ HonestFirst = "Pour demander une certification, vous devez d'abord accepter notre politique d'honnêteté académique.",
+ IncompleteSteps = "Il semble que vous n'ayez pas accompli les étapes nécessaires. Veuillez compléter les projets requis pour prétendre à la certification. Certification.",
+ LocalCodeSaved = 'Sauvegardé ! Votre code a été enregistré dans le stockage local de votre navigateur.',
+ LocalCodeSaveError = "Oups, votre code n'a pas été enregistré, la mémoire locale de votre navigateur est peut-être pleine.",
+ NameNeeded = "Nous avons besoin de votre nom pour pouvoir le mettre sur votre certification. Ajoutez votre nom aux paramètres de votre compte et cliquez sur le bouton d'enregistrement. Nous pourrons alors délivrer votre certification.",
None = '',
- NotEligible = 'flash.not-eligible',
- NotHonest = 'flash.not-honest',
- NotRight = 'flash.not-right',
- ProfilePrivate = 'flash.profile-private',
- ProgressReset = 'flash.progress-reset',
- ProvideUsername = 'flash.provide-username',
- ReallyWeird = 'flash.really-weird',
- ReportSent = 'flash.report-sent',
- SigninSuccess = 'flash.signin-success',
- TokenCreated = 'flash.token-created',
- TokenDeleted = 'flash.token-deleted',
- UpdatedPreferences = 'flash.updated-preferences',
- UsernameNotFound = 'flash.username-not-found',
- UsernameTaken = 'flash.username-taken',
- UsernameUpdated = 'flash.username-updated',
- UsernameUsed = 'flash.username-used',
- UserNotCertified = 'flash.user-not-certified',
- WrongName = 'flash.wrong-name',
- WrongUpdating = 'flash.wrong-updating',
- WentWrong = 'flash.went-wrong'
+ NotEligible = "Cet utilisateur n'est pas éligible pour le moment pour les certifications.",
+ NotHonest = "vous n'avez pas encore accepté notre engagement d'honnêteté académique.",
+ NotRight = "Quelque chose ne va pas. Un rapport a été généré et l'équipe a été informée.",
+ ProfilePrivate = "vous avez choisi de rendre votre profil privé. vous devrez rendre votre profil public pour que d'autres puissent voir votre certification.",
+ ProgressReset = 'Votre progression a été réinitialisée',
+ ProvideUsername = "Vérifiez si vous avez fourni un nom d'utilisateur et un rapport.",
+ ReallyWeird = "Quelque chose de vraiment bizarre s'est produit, si cela se reproduit, pensez à nous écrire.",
+ ReportSent = "Un rapport a été envoyé à l'équipe avec votre e-mail en copie.",
+ SigninSuccess = 'Succès ! Vous vous êtes connecté à votre compte. Bon codage !',
+ TokenCreated = 'Vous avez créé avec succès un nouveau jeton.',
+ TokenDeleted = 'Votre jeton a été supprimé.',
+ UpdatedPreferences = 'Nous avons mis à jour vos préférences',
+ UsernameNotFound = "Nous n'avons pas trouvé d'utilisateur avec le nom d'utilisateur renseigné.",
+ UsernameTaken = "Le nom d'utilisateur est déjà associé à un autre compte",
+ UsernameUpdated = "Nous avons mis à jour votre nom d'utilisateur",
+ UsernameUsed = "Le nom d'utilisateur est déjà associé à ce compte",
+ UserNotCertified = 'Il semble que vous ne soyez pas certifié.',
+ WrongName = "Un problème est survenu lors de la vérification du nom, veuillez réessayer. Si vous continuez à recevoir cette erreur, vous pouvez nous envoyer un message pour obtenir de l'aide.",
+ WrongUpdating = 'Un problème est survenu lors de la mise à jour de votre compte. Veuillez vérifier et réessayer',
+ WentWrong = "Un problème est survenu lors du traitement de votre don. Votre carte n'a pas été débitée."
}
diff --git a/client/src/components/Footer/footer-logo.tsx b/client/src/components/Footer/footer-logo.tsx
new file mode 100644
index 00000000000000..34bf911657ef64
--- /dev/null
+++ b/client/src/components/Footer/footer-logo.tsx
@@ -0,0 +1,14 @@
+import React from 'react';
+import Logo from '../../assets/icons/kda-learning-plateform-chroma.png';
+
+const FooterLogo = (): JSX.Element => {
+ const kdaLogo: string = Logo as never;
+ return (
+
+
+
+ );
+};
+
+FooterLogo.displayName = 'FooterLogo';
+export default FooterLogo;
diff --git a/client/src/components/Footer/footer.css b/client/src/components/Footer/footer.css
index 91aa0ffb3f3c5b..7a7ebee139d722 100644
--- a/client/src/components/Footer/footer.css
+++ b/client/src/components/Footer/footer.css
@@ -213,3 +213,18 @@ p.footer-donation a:hover {
background-color: var(--quaternary-background);
}
}
+
+.footer-logo {
+ width: 20%;
+}
+
+.footer-icon {
+ width: 1.5rem;
+}
+
+.link-icon,
+.link-icon:hover {
+ text-decoration: none;
+ color: rgba(0, 0, 0, 0);
+ background: rgba(0, 0, 0, 0);
+}
diff --git a/client/src/components/Footer/index copy.tsx b/client/src/components/Footer/index copy.tsx
new file mode 100644
index 00000000000000..fed253ccbd0762
--- /dev/null
+++ b/client/src/components/Footer/index copy.tsx
@@ -0,0 +1,187 @@
+import React from 'react';
+import { Trans, useTranslation } from 'react-i18next';
+import Link from '../helpers/link';
+import './footer.css';
+
+function Footer(): JSX.Element {
+ const { t } = useTranslation();
+
+ return (
+
+ );
+}
+
+Footer.displayName = 'Footer';
+export default Footer;
diff --git a/client/src/components/Footer/index.tsx b/client/src/components/Footer/index.tsx
index fed253ccbd0762..2548c8de439a91 100644
--- a/client/src/components/Footer/index.tsx
+++ b/client/src/components/Footer/index.tsx
@@ -1,183 +1,87 @@
import React from 'react';
-import { Trans, useTranslation } from 'react-i18next';
import Link from '../helpers/link';
+import { Spacer } from '../helpers';
+import Facebook from '../../assets/icons/facebook-square-brands-light.svg';
+import Twitter from '../../assets/icons/twitter-square-brands-light.svg';
+import Linkedin from '../../assets/icons/linkedin-brands-light.svg';
+import Instagram from '../../assets/icons/instagram-square-brands-light.svg';
+import FooterLogo from './footer-logo';
import './footer.css';
function Footer(): JSX.Element {
- const { t } = useTranslation();
-
return (
-