Merge branch 'develop' into feature/color-contrast

This commit is contained in:
Andy O'Neill 2023-05-24 13:42:07 -04:00
commit 728461dc2f
19 changed files with 1126 additions and 477 deletions

62
package-lock.json generated
View file

@ -102,7 +102,7 @@
"sass": "1.49.7",
"sass-loader": "10.2.1",
"scratch-gui": "2.0.0-beta.3",
"scratch-l10n": "3.15.20230507032520",
"scratch-l10n": "3.15.20230524032205",
"selenium-webdriver": "4.1.0",
"slick-carousel": "1.6.0",
"style-loader": "0.12.3",
@ -23556,7 +23556,7 @@
"scratch-render-fonts": "1.0.0-prerelease.20221102164332",
"scratch-storage": "2.2.1",
"scratch-svg-renderer": "0.2.0-prerelease.20230224194137",
"scratch-vm": "1.5.48",
"scratch-vm": "1.5.70",
"startaudiocontext": "1.2.1",
"style-loader": "^0.23.0",
"text-encoding": "0.7.0",
@ -23891,6 +23891,24 @@
"symbol-observable": "^1.0.3"
}
},
"node_modules/scratch-gui/node_modules/scratch-l10n": {
"version": "3.15.20230507032520",
"resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230507032520.tgz",
"integrity": "sha512-WpAXxJ6hZIXIvHiLCbReXq9FCGXojX+2uMBs+yWvUNDfTmg2jpuWkbRw0+Ovnzll6lZYc5D2ErUtyD90BI38JA==",
"dev": true,
"dependencies": {
"@babel/cli": "^7.1.2",
"@babel/core": "^7.1.2",
"@transifex/api": "4.2.5",
"babel-plugin-react-intl": "^3.0.1",
"download": "^8.0.0",
"transifex": "1.6.6"
},
"bin": {
"build-i18n-src": "scripts/build-i18n-src.js",
"tx-push-src": "scripts/tx-push-src.js"
}
},
"node_modules/scratch-gui/node_modules/scratch-paint": {
"version": "1.2.0-beta.1",
"resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-1.2.0-beta.1.tgz",
@ -23973,9 +23991,9 @@
}
},
"node_modules/scratch-l10n": {
"version": "3.15.20230507032520",
"resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230507032520.tgz",
"integrity": "sha512-WpAXxJ6hZIXIvHiLCbReXq9FCGXojX+2uMBs+yWvUNDfTmg2jpuWkbRw0+Ovnzll6lZYc5D2ErUtyD90BI38JA==",
"version": "3.15.20230524032205",
"resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230524032205.tgz",
"integrity": "sha512-0qkeMvfEVTrsgOauQjtQylw/fpSkJYj0EXhjn9rQcDB/6M1M/P5fsCpT9jSQZZInxdI6/t0qDfuRjiCRUoPHTw==",
"dev": true,
"dependencies": {
"@babel/cli": "^7.1.2",
@ -24175,9 +24193,9 @@
"dev": true
},
"node_modules/scratch-vm": {
"version": "1.5.48",
"resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.5.48.tgz",
"integrity": "sha512-xvIxNRruVTdDbgow1tjkM51+DYEfsE39oGrwG0hfKdLTTcF517gz30U3G3EK6vURivzlu+XvaO0RCHwxskSeeg==",
"version": "1.5.70",
"resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.5.70.tgz",
"integrity": "sha512-ybmtPK+1nDNxeUpbAxTZTPwmRzksNo5X7eF+2E0L8NgHZXekHoamUmJYe2FGewK5Fx7LIkkhmczWAIo7fF4Qlw==",
"dev": true,
"dependencies": {
"@vernier/godirect": "1.5.0",
@ -52047,7 +52065,7 @@
"scratch-render-fonts": "1.0.0-prerelease.20221102164332",
"scratch-storage": "2.2.1",
"scratch-svg-renderer": "0.2.0-prerelease.20230224194137",
"scratch-vm": "1.5.48",
"scratch-vm": "1.5.70",
"startaudiocontext": "1.2.1",
"style-loader": "^0.23.0",
"text-encoding": "0.7.0",
@ -52317,6 +52335,20 @@
"symbol-observable": "^1.0.3"
}
},
"scratch-l10n": {
"version": "3.15.20230507032520",
"resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230507032520.tgz",
"integrity": "sha512-WpAXxJ6hZIXIvHiLCbReXq9FCGXojX+2uMBs+yWvUNDfTmg2jpuWkbRw0+Ovnzll6lZYc5D2ErUtyD90BI38JA==",
"dev": true,
"requires": {
"@babel/cli": "^7.1.2",
"@babel/core": "^7.1.2",
"@transifex/api": "4.2.5",
"babel-plugin-react-intl": "^3.0.1",
"download": "^8.0.0",
"transifex": "1.6.6"
}
},
"scratch-paint": {
"version": "1.2.0-beta.1",
"resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-1.2.0-beta.1.tgz",
@ -52381,9 +52413,9 @@
}
},
"scratch-l10n": {
"version": "3.15.20230507032520",
"resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230507032520.tgz",
"integrity": "sha512-WpAXxJ6hZIXIvHiLCbReXq9FCGXojX+2uMBs+yWvUNDfTmg2jpuWkbRw0+Ovnzll6lZYc5D2ErUtyD90BI38JA==",
"version": "3.15.20230524032205",
"resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.15.20230524032205.tgz",
"integrity": "sha512-0qkeMvfEVTrsgOauQjtQylw/fpSkJYj0EXhjn9rQcDB/6M1M/P5fsCpT9jSQZZInxdI6/t0qDfuRjiCRUoPHTw==",
"dev": true,
"requires": {
"@babel/cli": "^7.1.2",
@ -52580,9 +52612,9 @@
"dev": true
},
"scratch-vm": {
"version": "1.5.48",
"resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.5.48.tgz",
"integrity": "sha512-xvIxNRruVTdDbgow1tjkM51+DYEfsE39oGrwG0hfKdLTTcF517gz30U3G3EK6vURivzlu+XvaO0RCHwxskSeeg==",
"version": "1.5.70",
"resolved": "https://registry.npmjs.org/scratch-vm/-/scratch-vm-1.5.70.tgz",
"integrity": "sha512-ybmtPK+1nDNxeUpbAxTZTPwmRzksNo5X7eF+2E0L8NgHZXekHoamUmJYe2FGewK5Fx7LIkkhmczWAIo7fF4Qlw==",
"dev": true,
"requires": {
"@vernier/godirect": "1.5.0",

View file

@ -35,14 +35,14 @@
},
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/llk/scratch-www.git"
"url": "git+ssh://git@github.com/scratchfoundation/scratch-www.git"
},
"author": "Massachusetts Institute of Technology",
"license": "BSD-3-Clause",
"bugs": {
"url": "https://github.com/llk/scratch-www/issues"
"url": "https://github.com/scratchfoundation/scratch-www/issues"
},
"homepage": "https://github.com/llk/scratch-www#readme",
"homepage": "https://github.com/scratchfoundation/scratch-www#readme",
"dependencies": {
"bunyan": "1.8.15",
"clipboard-copy": "2.0.1",
@ -137,7 +137,7 @@
"sass": "1.49.7",
"sass-loader": "10.2.1",
"scratch-gui": "2.0.0-beta.3",
"scratch-l10n": "3.15.20230507032520",
"scratch-l10n": "3.15.20230524032205",
"selenium-webdriver": "4.1.0",
"slick-carousel": "1.6.0",
"style-loader": "0.12.3",

View file

@ -169,6 +169,11 @@ const Footer = props => (
<FormattedMessage id="general.privacyPolicy" />
</a>
</dd>
<dd>
<a href="/cookies">
<FormattedMessage id="general.cookies" />
</a>
</dd>
<dd>
<a href="/DMCA">
<FormattedMessage id="general.dmca" />

View file

@ -6,6 +6,7 @@ const Navigation = require('../../navigation/www/navigation.jsx');
const Footer = require('../../footer/www/footer.jsx');
const DonorRecognition = require('./donor-recognition.jsx');
const ErrorBoundary = require('../../errorboundary/errorboundary.jsx');
const PrivacyBanner = require('../../privacy-banner/privacy-banner.jsx');
const today = new Date();
const semi = today.getDate() === 1 && today.getMonth() === 3;
@ -25,6 +26,7 @@ const Page = ({
>
<Navigation />
</nav>
<PrivacyBanner />
<main id="view">
{children}
</main>

View file

@ -0,0 +1,107 @@
const bindAll = require('lodash.bindall');
const FormattedMessage = require('react-intl').FormattedMessage;
const injectIntl = require('react-intl').injectIntl;
const connect = require('react-redux').connect;
const PropTypes = require('prop-types');
const React = require('react');
const TitleBanner = require('../title-banner/title-banner.jsx');
const Button = require('../forms/button.jsx');
const jar = require('../../lib/jar.js');
require('./privacy-banner.scss');
const PRIVACY_UPDATE_START_TIME = 1684987200000; // May 25 2023 0000 ET
const PRIVACY_UPDATE_END_TIME = 1686887999000; // Jun 15 2023 1159 ET
class PrivacyBanner extends React.Component {
constructor (props) {
super(props);
bindAll(this, [
'shouldShowBanner',
'handleCloseBanner'
]);
}
shouldShowBanner () {
const seen = jar.get('scratchpolicyseen');
return (
Date.now() >= PRIVACY_UPDATE_START_TIME &&
Date.now() < PRIVACY_UPDATE_END_TIME &&
typeof seen === 'undefined' &&
typeof this.props.user !== 'undefined'
);
}
handleCloseBanner () {
const opts = {
expires: new Date(new Date().setDate(new Date().getDate + 21)) // expires after 3 weeks
};
this.setState({dismissedPrivacyBanner: true});
jar.set('scratchpolicyseen', true, opts);
}
render () {
const showBanner = this.shouldShowBanner();
const privacyPolicyLink = chunks => <a href="/privacy_policy">{chunks}</a>;
if (showBanner) {
return (
<aside>
<TitleBanner className="privacy-banner">
<div className="privacy-banner-container">
<img
aria-hidden="true"
alt=""
className="lightbulb-icon"
src="/images/ideas/bulb-icon.svg"
/>
<div className="privacy-banner-centered">
<p className="privacy-banner-text">
<FormattedMessage
id="privacyBanner.update"
values={{
a: privacyPolicyLink
}}
/>
</p>
</div>
<Button
isCloseType
className="privacy-close-button"
key="closeButton"
name="closeButton"
type="button"
onClick={this.handleCloseBanner}
>
<div className="action-button-text">
<FormattedMessage id="general.close" />
</div>
</Button>
</div>
</TitleBanner>
</aside>
);
}
// if we're not showing the banner, return null to not render anything
return null;
}
}
const mapStateToProps = state => ({
user: state.session && state.session.session && state.session.session.user
});
PrivacyBanner.propTypes = {
// onRequestClose: PropTypes.func
user: PropTypes.shape({
classroomId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
thumbnailUrl: PropTypes.string,
username: PropTypes.string
})
};
const ConnectedPrivacyBanner = connect(
mapStateToProps
)(PrivacyBanner);
module.exports = injectIntl(ConnectedPrivacyBanner);

View file

@ -0,0 +1,72 @@
@import "../../colors";
@import "../../frameless";
.privacy-banner {
display: flex;
z-index: 8;
background-color: $ui-blue-dark;
padding: 0;
overflow: hidden;
align-items: center;
justify-content: center;
margin-bottom: -50px;
margin-top: 50px;
.privacy-banner-container {
display: flex;
margin: 0.375rem auto;
align-items: center;
.lightbulb-icon {
margin: 0.6875rem;
width: 1.75rem;
height: 1.75rem;
}
.privacy-banner-centered {
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
}
.privacy-banner-text {
text-align: left;
color: $ui-white;
font-size: 1rem;
font-weight: bold;
margin-right: 1rem;
max-width: 70vw;
}
}
.privacy-close-button {
right: 1rem;
top: auto;
}
a {
color: $ui-white;
text-decoration: underline;
}
}
@media only screen and (max-width: $mobileIntermediate) {
.privacy-banner .privacy-banner-container .privacy-banner-centered {
flex-wrap: wrap;
}
.privacy-banner .privacy-banner-container .lightbulb-icon {
padding-bottom: 2rem;
}
.privacy-banner .privacy-banner-container {
margin-left: 0;
margin-bottom: 1rem
}
.privacy-banner .donate-close-button {
top: 1rem;
}
}

View file

@ -17,6 +17,7 @@
"general.contactUs": "Contact Us",
"general.getHelp": "Get Help",
"general.contact": "Contact",
"general.cookies": "Cookies",
"general.done": "Done",
"general.downloadPDF": "Download PDF",
"general.emailUs": "Email Us",
@ -451,5 +452,6 @@
"extensions.otherComputerConnectedText": "Only one computer can be connected to a {deviceName} at a time. If you have another computer connected to your {deviceName}, disconnect the {deviceName} or close Scratch on that computer and try again.",
"bluetooth.enableLocationServicesTitle": "Make sure you have location services enabled on Chromebooks or Android tablets",
"bluetooth.enableLocationServicesText": "Bluetooth can be used to provide location data to the app. In addition to granting the Scratch App permission to access location, location must be enabled in your general device settings. Search for 'Location' in your settings, and make sure it is on. On Chromebooks search for 'Location' in the Google Play Store Android preferences."
"bluetooth.enableLocationServicesText": "Bluetooth can be used to provide location data to the app. In addition to granting the Scratch App permission to access location, location must be enabled in your general device settings. Search for 'Location' in your settings, and make sure it is on. On Chromebooks search for 'Location' in the Google Play Store Android preferences.",
"privacyBanner.update": "The Scratch privacy policy has been updated, effective May 25, 2023. You can see the new policy <a>here</a>."
}

View file

@ -13,6 +13,7 @@ const Types = keyMirror({
});
const banGoodListPaths = [
'/ip_ban_appeal',
'/vpn_required',
'/accounts/banned-response',
'/community_guidelines',
@ -72,6 +73,13 @@ const handleSessionResponse = (dispatch, body) => {
) {
window.location = '/vpn_required/';
return;
} else if (
body.banned &&
body.redirectURL &&
banGoodListPaths.every(goodPath => window.location.pathname.indexOf(goodPath) === -1)
) {
window.location = body.redirectURL;
return;
} else if (
body.user &&
body.user.banned &&

View file

@ -138,6 +138,13 @@
"title": "Contact Us",
"viewportWidth": "device-width"
},
{
"name": "cookies",
"pattern": "^/cookies/?$",
"routeAlias": "/cookies/?",
"view": "cookies/cookies",
"title": "Cookie Policy"
},
{
"name": "credits",
"pattern": "^/credits/?$",

View file

@ -5,10 +5,12 @@ const render = require('../../lib/render.jsx');
const Button = require('../../components/forms/button.jsx');
const Page = require('../../components/page/www/page.jsx');
const Video = require('../../components/video/video.jsx');
const injectIntl = require('react-intl').injectIntl;
require('./about.scss');
const About = () => (
const tedLink = chunks => <a href="https://www.ted.com/talks/mitch_resnick_let_s_teach_kids_to_code">{chunks}</a>;
const About = injectIntl(({intl}) => (
<div className="inner about">
<h1><FormattedMessage id="general.aboutScratch" /></h1>
@ -56,14 +58,22 @@ const About = () => (
<li>
<h2><FormattedMessage id="about.literacy" /></h2>
<iframe
allowFullScreen
mozallowfullscreen={'true'}
scrolling="no"
src="https://embed-ssl.ted.com/talks/mitch_resnick_let_s_teach_kids_to_code.html"
webkitallowfullscreen={'true'}
/>
<p><FormattedMessage id="about.literacyDescription" /></p>
<a href="https://www.ted.com/talks/mitch_resnick_let_s_teach_kids_to_code">
<img
alt={intl.formatMessage(
{id: 'about.literacyImageDescription'}
)}
src="/images/about/ted-thumbnail.jpg"
/>
</a>
<p>
<FormattedMessage
id="about.literacyDescription"
values={{
a: tedLink
}}
/>
</p>
</li>
<li>
@ -241,6 +251,6 @@ const About = () => (
</ul>
</div>
</div>
);
));
render(<Page><About /></Page>, document.getElementById('app'));

View file

@ -19,7 +19,8 @@
"about.learnMoreEducators": "Information for Educators",
"about.learnMoreAnnualReport": "Annual Report",
"about.literacy": "Learn to Code, Code to Learn",
"about.literacyDescription": "The ability to code computer programs is an important part of literacy in todays society. When people learn to code in Scratch, they learn important strategies for solving problems, designing projects, and communicating ideas.",
"about.literacyImageDescription": "An image of Mitch Resnick giving a TED talk titled \"Let's Teach Kids to Code.\" A play button is in the center of the image.",
"about.literacyDescription": "In this <a>TED talk</a>, Scratch founder Mitch Resnick describes why the ability to code computer programs is an important part of literacy in todays society. When people learn to code in Scratch, they learn important strategies for solving problems, designing projects, and communicating ideas.",
"about.schools": "Scratch in Schools",
"about.schoolsDescription": "Students are learning with Scratch at all levels (from elementary school to college) and across disciplines (such as math, computer science, language arts, social studies). Educator resources are available on the {scratchForEducatorsLink} page.",
"about.scratchForEducatorsLinkText": "Scratch For Educators",

View file

@ -0,0 +1,344 @@
const React = require('react');
const injectIntl = require('react-intl').injectIntl;
const FormattedMessage = require('react-intl').FormattedMessage;
const Page = require('../../components/page/www/page.jsx');
const render = require('../../lib/render.jsx');
const InformationPage = require('../../components/informationpage/informationpage.jsx');
const bold = chunks => <b>{chunks}</b>;
const privacyPolicyLink = chunks => <a href="/privacy_policy">{chunks}</a>;
const manageLink = chunks => <a href="http://www.allaboutcookies.org/manage-cookies">{chunks}</a>;
const googlePoliciesLink = chunks => <a href="https://www.google.com/policies/privacy/partners">{chunks}</a>;
const optOutLink = chunks => <a href="https://tools.google.com/dlpage/gaoptout">{chunks}</a>;
require('./cookies.scss');
const Cookies = injectIntl(() => (
<InformationPage
title={
<FormattedMessage id="cookies.title" />
}
>
<div className="inner info-inner">
<section>
<p className="lastupdate">
<i>
<FormattedMessage id="cookies.lastUpdated" />
</i>
</p>
<p className="intro">
<FormattedMessage
id="cookies.intro1"
values={{
b: bold,
privacy: privacyPolicyLink
}}
/>
</p>
<p className="intro">
<FormattedMessage
id="cookies.intro2"
values={{
b: bold
}}
/>
</p>
</section>
<section id="types">
<dl>
<span className="nav-spacer" />
<h2><FormattedMessage id="cookies.types.title" /></h2>
<dt><FormattedMessage id="cookies.types.essentialTitle" /></dt>
<dd><FormattedMessage id="cookies.types.essentialIntro" /></dd>
<dd>
<table className="cookies-table">
<thead>
<tr>
<th><FormattedMessage id="cookies.table.name" /></th>
<th><FormattedMessage id="cookies.table.provider" /></th>
<th><FormattedMessage id="cookies.table.purpose" /></th>
<th><FormattedMessage id="cookies.table.expiration" /></th>
</tr>
</thead>
<tbody>
<tr>
<td>scratchcsrftoken</td>
<td><a href="/privacy_policy">Scratch</a></td>
<td><FormattedMessage id="cookies.essential.csrf" /></td>
<td><FormattedMessage id="cookies.table.years.1" /></td>
</tr>
<tr>
<td>scratchsessionid</td>
<td><a href="/privacy_policy">Scratch</a></td>
<td><FormattedMessage id="cookies.essential.sessionID" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
</tbody>
</table>
</dd>
<dt><FormattedMessage id="cookies.types.functionalTitle" /></dt>
<dd><FormattedMessage id="cookies.types.functionalIntro" /></dd>
<dd>
<table className="cookies-table">
<thead>
<tr>
<th><FormattedMessage id="cookies.table.name" /></th>
<th><FormattedMessage id="cookies.table.provider" /></th>
<th><FormattedMessage id="cookies.table.purpose" /></th>
<th><FormattedMessage id="cookies.table.expiration" /></th>
</tr>
</thead>
<tbody>
<tr>
<td>permissions</td>
<td><a href="/privacy_policy">Scratch</a></td>
<td><FormattedMessage id="cookies.functional.permissions" /></td>
<td><FormattedMessage id="cookies.table.years.1" /></td>
</tr>
<tr>
<td>explore_by</td>
<td><a href="/privacy_policy">Scratch</a></td>
<td><FormattedMessage id="cookies.functional.exploreBy" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>minilogSettings</td>
<td><a href="/privacy_policy">Scratch</a></td>
<td><FormattedMessage id="cookies.functional.minilogSettings" /></td>
<td><FormattedMessage id="cookies.table.persistent" /></td>
</tr>
<tr>
<td>scratchlanguage</td>
<td><a href="/privacy_policy">Scratch</a></td>
<td><FormattedMessage id="cookies.functional.scratchLanguage" /></td>
<td><FormattedMessage id="cookies.table.years.1" /></td>
</tr>
<tr>
<td>scratchpolicyseen</td>
<td><a href="/privacy_policy">Scratch</a></td>
<td><FormattedMessage id="cookies.functional.scratchPolicySeen" /></td>
<td><FormattedMessage id="cookies.table.weeks.3" /></td>
</tr>
<tr>
<td>wistia-video-progress-#</td>
<td><a href="https://wistia.com/privacy">Wistia</a></td>
<td><FormattedMessage id="cookies.functional.wistia" /></td>
<td><FormattedMessage id="cookies.table.persistent" /></td>
</tr>
</tbody>
</table>
</dd>
<dt><FormattedMessage id="cookies.types.analyticsTitle" /></dt>
<dd>
<FormattedMessage
id="cookies.types.analyticsIntro"
values={{
policies: googlePoliciesLink,
optout: optOutLink
}}
/>
</dd>
<dd>
<table className="cookies-table">
<thead>
<tr>
<th><FormattedMessage id="cookies.table.name" /></th>
<th><FormattedMessage id="cookies.table.provider" /></th>
<th><FormattedMessage id="cookies.table.purpose" /></th>
<th><FormattedMessage id="cookies.table.expiration" /></th>
</tr>
</thead>
<tbody>
<tr>
<td>_ga</td>
<td><a href="https://policies.google.com/privacy">Google Analytics</a></td>
<td><FormattedMessage id="cookies.analytics.ga" /></td>
<td><FormattedMessage id="cookies.table.years.2" /></td>
</tr>
<tr>
<td>_gat</td>
<td><a href="https://policies.google.com/privacy">Google Analytics</a></td>
<td><FormattedMessage id="cookies.analytics.gat" /></td>
<td><FormattedMessage id="cookies.table.days.1" /></td>
</tr>
<tr>
<td>_gid</td>
<td><a href="https://policies.google.com/privacy">Google Analytics</a></td>
<td><FormattedMessage id="cookies.analytics.gid" /></td>
<td><FormattedMessage id="cookies.table.days.1" /></td>
</tr>
<tr>
<td>__utma</td>
<td><a href="https://policies.google.com/privacy">Google Analytics</a></td>
<td><FormattedMessage id="cookies.analytics.utma" /></td>
<td><FormattedMessage id="cookies.table.years.2" /></td>
</tr>
<tr>
<td>__utmb</td>
<td><a href="https://policies.google.com/privacy">Google Analytics</a></td>
<td><FormattedMessage id="cookies.analytics.utmb" /></td>
<td><FormattedMessage id="cookies.table.days.1" /></td>
</tr>
<tr>
<td>__utmc</td>
<td><a href="https://policies.google.com/privacy">Google Analytics</a></td>
<td><FormattedMessage id="cookies.analytics.utmc" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>__utmt</td>
<td><a href="https://policies.google.com/privacy">Google Analytics</a></td>
<td><FormattedMessage id="cookies.analytics.utmt" /></td>
<td><FormattedMessage id="cookies.table.days.1" /></td>
</tr>
<tr>
<td>__utmz</td>
<td><a href="https://policies.google.com/privacy">Google Analytics</a></td>
<td><FormattedMessage id="cookies.analytics.utmz" /></td>
<td><FormattedMessage id="cookies.table.months.6" /></td>
</tr>
<tr>
<td>loglevel</td>
<td><a href="https://wistia.com/privacy">Wistia</a></td>
<td><FormattedMessage id="cookies.analytics.loglevel" /></td>
<td><FormattedMessage id="cookies.table.persistent" /></td>
</tr>
<tr>
<td>DEVICE_INFO</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.deviceInfo" /></td>
<td><FormattedMessage id="cookies.table.days.180" /></td>
</tr>
<tr>
<td>LogsDatabaseV2:[unique ID number]</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.youtubeLogsDatabase" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>VISITOR_INFO1_LIVE</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.visitorInfo" /></td>
<td><FormattedMessage id="cookies.table.days.180" /></td>
</tr>
<tr>
<td>remote_sid</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.remoteSid" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>YSC</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.ysc" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>ytidb::LAST_RESULT_ENTRY_KEY</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.lastResultEntryKey" /></td>
<td><FormattedMessage id="cookies.table.persistent" /></td>
</tr>
<tr>
<td>YtIdbMeta#databases</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.ytidbMetaDatabases" /></td>
<td><FormattedMessage id="cookies.table.persistent" /></td>
</tr>
<tr>
<td>yt-remote-cast-available</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.remoteCastAvailable" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>yt-remote-cast-installed</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.remoteCastInstalled" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>yt-remote-connected-devices</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.remoteConnectedDevices" /></td>
<td><FormattedMessage id="cookies.table.persistent" /></td>
</tr>
<tr>
<td>yt-remote-device-id</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.remoteDeviceId" /></td>
<td><FormattedMessage id="cookies.table.persistent" /></td>
</tr>
<tr>
<td>yt-remote-fast-check-period</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.remoteFastCheckPeriod" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>yt-remote-session-app</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.remoteSessionApp" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>yt-remote-session-name</td>
<td><a href="https://policies.google.com/privacy">YouTube</a></td>
<td><FormattedMessage id="cookies.analytics.remoteSessionName" /></td>
<td><FormattedMessage id="cookies.table.session" /></td>
</tr>
<tr>
<td>undefined</td>
<td><a href="https://wistia.com/privacy">Wistia</a></td>
<td><FormattedMessage id="cookies.analytics.wistiaUndefinedCookie" /></td>
<td><FormattedMessage id="cookies.table.persistent" /></td>
</tr>
<tr>
<td>wistia</td>
<td><a href="https://wistia.com/privacy">Wistia</a></td>
<td><FormattedMessage id="cookies.analytics.wistiaCookie" /></td>
<td><FormattedMessage id="cookies.table.persistent" /></td>
</tr>
</tbody>
</table>
</dd>
</dl>
</section>
<section id="manage">
<span className="nav-spacer" />
<h2><FormattedMessage id="cookies.manageTitle" /></h2>
<p>
<FormattedMessage
id="cookies.manageBody"
values={{
a: manageLink
}}
/>
</p>
</section>
<section id="contact">
<span className="nav-spacer" />
<h2><FormattedMessage id="cookies.contactTitle" /></h2>
<p><FormattedMessage id="cookies.contactIntro" /></p>
<p>
Scratch Foundation<br />
ATTN: Cookie Policy<br />
201 South Street<br />
Suite 102<br />
Boston, MA 02111<br />
</p>
</section>
</div>
<nav>
<ol>
<li><a href="#types"><FormattedMessage id="cookies.nav.types" /></a></li>
<li><a href="#manage"><FormattedMessage id="cookies.nav.manage" /></a></li>
<li><a href="#contact"><FormattedMessage id="cookies.nav.contact" /></a></li>
</ol>
</nav>
</InformationPage>
));
render(<Page><Cookies /></Page>, document.getElementById('app'));

View file

@ -0,0 +1,12 @@
@import "../../colors";
.cookies-table {
border: 1px solid $ui-border;
border-collapse: collapse;
td, th {
padding: .75rem;
border: 1px solid $ui-border;
text-align: left;
}
}

View file

@ -0,0 +1,66 @@
{
"cookies.title": "Cookie Policy",
"cookies.nav.types": "Types of Cookies",
"cookies.nav.manage": "Manage Cookies",
"cookies.nav.contact": "Contact Us",
"cookies.lastUpdated": "The Scratch Cookie Policy was last updated May 25, 2023",
"cookies.intro1": "This Cookie Policy (the <b>“Cookie Policy”</b>) is provided by Scratch Foundation (<b>“Scratch”</b>, <b>“we”</b> or <b>“us”</b>). It supplements the information and disclosures included in our <privacy>Privacy Policy</privacy>, and explains how Scratch uses Cookies on its website scratch.mit.edu (the <b>“Scratch Website”</b>) to its visitors (<b>“you”</b>, <b>“user”</b>). For the purpose of this Cookie Policy, <b>“Personal Information”</b> means any information relating to an identified or identifiable individual.",
"cookies.intro2": "When you use the Scratch Website, we use cookies, beacons, invisible tags, unique IDs and similar technologies (collectively <b>“Cookies”</b>) to automatically record certain Personal Information from your browser or device.",
"cookies.table.name": "Name",
"cookies.table.provider": "Provider",
"cookies.table.purpose": "Purpose",
"cookies.table.expiration": "Expiration",
"cookies.table.session": "Session",
"cookies.table.persistent": "Persistent",
"cookies.table.days.1": "1 day",
"cookies.table.days.180": "180 days",
"cookies.table.weeks.2": "2 weeks",
"cookies.table.weeks.3": "3 weeks",
"cookies.table.months.6": "6 months",
"cookies.table.years.1": "1 year",
"cookies.table.years.2": "2 years",
"cookies.types.title": "What types of Cookies are used on the Scratch Website?",
"cookies.types.essentialTitle": "Essential Cookies",
"cookies.types.essentialIntro": "These are Cookies that are necessary to make the Scratch Website available to the user or ensure security. We use this Personal Information, for example, to ensure that the Scratch Website functions properly, or to prevent fraud. We use the following essential Cookies:",
"cookies.essential.csrf": "Used as a security measure to prevent cross site request forgery.",
"cookies.essential.sessionID": "Used for authenticating you on the Scratch Website so we can provide you the services you requested.",
"cookies.types.functionalTitle": "Functional Cookies",
"cookies.types.functionalIntro": "We use these cookies to recognize the user when they return to the Scratch Website, and for beneficial, but non-essential functionality. For example, Cookies to remember users settings (e.g., retaining language settings) and content preferences when they return to the Scratch Website, or that allow videos to play. Disabling functional Cookies will typically result in limited functionality of the site and a less personalized experience, but the user will still be able to use the site as such. We use the following functional Cookies:",
"cookies.functional.permissions": "Used to track which features of the service a logged in user is able to access.",
"cookies.functional.exploreBy": "Used to save the users current search preference.",
"cookies.functional.scratchLanguage": "Used to save information about the users preferred language.",
"cookies.functional.scratchPolicySeen": "Used to track if the user has seen a privacy policy update notification",
"cookies.functional.wistia": "Contains a timestamp for the Scratch Websites video-content. This allows the user to resume watching without having to start over, if the user leaves the video or Scratch Website.",
"cookies.functional.minilogSettings": "Unclassified",
"cookies.types.analyticsTitle": "Analytical or Performance Cookies",
"cookies.types.analyticsIntro": "We use Cookies to generally help us better understand how the Scratch Website is being used (e.g., determining which pages are popular based on how many users have visited certain pages). We also work with analytics providers, such as Google Analytics, which use Cookies to collect and analyze information about use of the Scratch Website and report on activities and trends. You can learn more about Googles practices by going to <policies>https://www.google.com/policies/privacy/partners</policies> and opt out of them by downloading the Google Analytics opt-out browser add-on, available at <optout>https://tools.google.com/dlpage/gaoptout</optout>. We use the following analytical and performance Cookies:",
"cookies.analytics.ga": "Used to send data to Google Analytics about the user's device and behavior. Tracks the user across devices and marketing channels.",
"cookies.analytics.gat": "Used by Google Analytics to throttle request rate.",
"cookies.analytics.gid": "Registers a unique ID that is used to generate statistical data on how the user uses the Scratch Website.",
"cookies.analytics.utma": "Used by Google Analytics to categorize new vs returning users.",
"cookies.analytics.utmb": "Used by Google Analytics to calculate the duration of the Scratch Website visit.",
"cookies.analytics.utmc": "Used by Google Analytics to calculate the duration of the Scratch Website visit.",
"cookies.analytics.utmt": "Used by Google Analytics to throttle request rate.",
"cookies.analytics.utmz": "Used by Google Analytics to understand how a user navigates the Scratch Website.",
"cookies.analytics.loglevel": "Maintains settings and outputs when using the Developer Tools Console on the current session.",
"cookies.analytics.deviceInfo": "Used to track a users interaction with embedded content.",
"cookies.analytics.youtubeLogsDatabase": "Unclassified",
"cookies.analytics.visitorInfo": "Tries to estimate user bandwidth on pages with integrated YouTube videos.",
"cookies.analytics.remoteSid": "Necessary for the implementation and functionality of YouTube video content.",
"cookies.analytics.ysc": "Registers a unique ID to keep statistics of what videos from YouTube the user has seen.",
"cookies.analytics.lastResultEntryKey": "Stores the user's video player preferences using embedded YouTube video.",
"cookies.analytics.ytidbMetaDatabases": "Stores the user's video player preferences using embedded YouTube video.",
"cookies.analytics.remoteCastAvailable": "Stores the user's video player preferences using embedded YouTube video.",
"cookies.analytics.remoteCastInstalled": "Stores the user's video player preferences using embedded YouTube video.",
"cookies.analytics.remoteConnectedDevices": "Stores the user's video player preferences using embedded YouTube video.",
"cookies.analytics.remoteDeviceId": "Stores the user's video player preferences using embedded YouTube video.",
"cookies.analytics.remoteFastCheckPeriod": "Stores the user's video player preferences using embedded YouTube video.",
"cookies.analytics.remoteSessionApp": "Stores the user's video player preferences using embedded YouTube video.",
"cookies.analytics.remoteSessionName": "Stores the user's video player preferences using embedded YouTube video.",
"cookies.analytics.wistiaUndefinedCookie": "Collects data on user interaction with the Scratch Website's video-content. This data is used to make the website's video-content more relevant towards the user.",
"cookies.analytics.wistiaCookie": "Used by the Scratch Website to track the user's use of video-content - the cookie roots from Wistia, which provides video-software to websites.",
"cookies.manageTitle": "How can you manage Cookies?",
"cookies.manageBody": "If you do not want your Personal Information to be collected through the use of Cookies, most browsers allow you to manage your Cookie preferences. You can set your browser to automatically decline Cookies or to request you to accept or decline Cookies for each site. You can find more information about Cookies at <a>http://www.allaboutcookies.org/manage-cookies</a>.",
"cookies.contactTitle": "Contact Us",
"cookies.contactIntro": "If you have any questions about this Cookie Policy please contact us at privacy@scratch.mit.edu or via mail at:"
}

View file

@ -117,22 +117,22 @@ const Credits = () => (
<FormattedMessage id="credits.pastContributorsThanks" />
</p>
<p>
Yusuf Ahmad, Ben Berg, Amos Blanton, Paula Bontá, Karen Brennan,
Juanita Buitrago, Leo Burd, Gaia Carini, Kasia Chmielinski,
Yusuf Ahmad, Zoë Bentley, Ben Berg, Amos Blanton, Paula Bontá, Carl Bowman, Karen Brennan,
Juanita Buitrago, Leo Burd, Gaia Carini, Jolie Castellucci, Karishma Chadha, Kasia Chmielinski,
Michelle Chung, Shane Clements, Hannah Cole, Sayamindu Dasgupta,
Margarita Dekoli, Manuj Dhariwal, Shruti Dhariwal, Dave Feinberg,
Zachary Deiman, Margarita Dekoli, Manuj Dhariwal, Shruti Dhariwal, Dave Feinberg,
Champika Fernando, Linda Fernsel, Elizabeth Foster, Joan Fusco,
Lily Gabaree, Stephanie Gayle, Chris Graves, Joel Gritter,
Megan Haddadi, Kreg Hanning, Sean Hickey, Christina Huang,
Tony Hwang, Abdulrahman Idlbi, Rupal Jain, Randy Jou,
Paul Kaplan, Lily Kim, Tauntaun Kim, Saskia Leggett, DD Liu,
John Maloney, Tim Mickel, Amon Millner, Andrés Monroy-Hernández,
Marian Muthui, My Nguyen, Lisa O&apos;Brien, Abisola Okuk,
Kristin Osiecki, Carmelo Presicce, Tina Quach, Mitchel Resnick,
Ricarose Roque, Natalie Rusk, Andrea Saxman, Jay Silver,
Brian Silverman, Andrew Sliwinski, Tammy Stern, Lis Sylvan,
Hanako Tjia, Jaleesa Trapp, Moran Tsur, Claudia Urrea,
Julia Zimmerman, Oren Zuckerman.
Tony Hwang, Abdulrahman Idlbi, Rupal Jain, Addae Jordan, Randy Jou,
Paul Kaplan, Lily Kim, Tauntaun Kim, Amy Lee, Saskia Leggett, Shenkiat Lim, DD Liu,
John Maloney, Tim Mickel, Amon Millner, Ariam Mogos, Andrés Monroy-Hernández,
Marian Muthui, Katelyn Mann, Cindy Nguyen, My Nguyen, Lisa O&apos;Brien, Abisola Okuk,
Kristin Osiecki, Sarah Otts, Carmelo Presicce, Tina Quach, Mitchel Resnick,
Ricarose Roque, Natalie Rusk, Andrea Saxman, Ray Schamp, Eric Schilling, Rupa Shah, Mimi Shalf,
Jay Silver, Brian Silverman, Andrew Sliwinski, Stephanie Stephens, Tammy Stern, Lis Sylvan,
Bryce Taylor, Matt Taylor, Hanako Tjia, Jaleesa Trapp, Moran Tsur, Claudia Urrea, Kathy Wu,
Shawna Young, Julia Zimmerman, Oren Zuckerman.
</p>
<h2>
<FormattedMessage id="credits.illustrationsTitle" />
@ -174,7 +174,7 @@ const Credits = () => (
Yasmin Kafai, Kapaya Katongo, Evan Karatzas, Christine Kim,
Joren Lauwers, Mike Lee, Jeff Lieberman, Mark Loughridge,
Kelly Liu, Anthony Lu, Danny Lutz, David Malan Wayne Marshall,
John McIntosh, Paul Medlock-Walton, Dongfang (Tian) Mi,
John McIntosh, Paul Medlock-Walton, Dongfang (Tian) Mi, Dalton Miner,
Ximena Miranda, Jens Moenig, Evan Moore, Geetha Narayanan,
Kate Nazemi, Liddy Nevile, Wing Ngan, Derek O&apos;Connell,
Tim Radvan, Karen Randall, Ian Reynolds, Miriam Ruiz,

View file

@ -4,11 +4,6 @@
"userId": 61436283,
"name": "Achal"
},
{
"userName": "themorningsun",
"userId": 79849553,
"name": "Addae"
},
{
"userName": "LeopardFlash",
"userId": 71683519,
@ -24,21 +19,11 @@
"userId": 56182496,
"name": "Amielle"
},
{
"userName": "amylaser",
"userId": 17462181,
"name": "Amy"
},
{
"userName": "achouse",
"userId": 4747093,
"name": "Annie"
},
{
"userName": "mogibear",
"userId": 5808866,
"name": "Ariam"
},
{
"userName": "carpeediem",
"userId": 85830206,
@ -74,11 +59,6 @@
"userId": 2755634,
"name": "Christan"
},
{
"userName": "floralsunset",
"userId": 64635632,
"name": "Cindy"
},
{
"userName": "codubee",
"userId": 10866958,
@ -166,7 +146,7 @@
},
{
"userName": "lashaunan",
"userId": 91118517,
"userId": 97557216,
"name": "La Shauna"
},
{
@ -239,31 +219,11 @@
"userId": 88383612,
"name": "Ron"
},
{
"userName": "RupaLax",
"userId": 58005604,
"name": "Rupa"
},
{
"userName": "Rhyolyte",
"userId": 80776012,
"name": "Ryan"
},
{
"userName": "Onyx45",
"userId": 63526043,
"name": "Shawna"
},
{
"userName": "RagingAvocado",
"userId": 79263979,
"name": "Shen"
},
{
"userName": "sgste735",
"userId": 69368419,
"name": "Stephanie"
},
{
"userName": "LT7845",
"userId": 68837085,
@ -304,11 +264,6 @@
"userId": 80892866,
"name": "Yvette"
},
{
"userName": "Zinnea",
"userId": 35911243,
"name": "Zo\u00eb"
},
{
"userName": "my_uh",
"userId": 95347525,
@ -344,11 +299,6 @@
"userId": 95347525,
"name": "Jess"
},
{
"userName": "ZipZapZuko",
"userId": 41136623,
"name": "Prasanth"
},
{
"userName": "GardenSamantha",
"userId": 105312115,
@ -373,5 +323,100 @@
"userName": "Johnny2By4",
"userId": 99985150,
"name": "Timothy"
},
{
"userName": "Ronald",
"userId": 88383612,
"name": "delasare"
},
{
"userName": "Jessica",
"userId": 90382234,
"name": "Call_Me_J_Money"
},
{
"userName": "ZipZapZuko",
"userId": 41136623,
"name": "Prasanth"
},
{
"userName": "darien_scratch",
"userId": 99394155,
"name": "Darien"
},
{
"userName": "theegreatcatsby",
"userId": 104616178,
"name": "Gabriella"
},
{
"userName": "bambam2433",
"userId": 106524413,
"name": "Kelly"
},
{
"userName": "lalizapper",
"userId": 97449744,
"name": "Laura"
},
{
"userName": "Moshilu",
"userId": 106664575,
"name": "Lucy"
},
{
"userName": "ZiMereLu",
"userId": 103073460,
"name": "Meredith"
},
{
"userName": "Arduinah",
"userId": 106474044,
"name": "Nikki"
},
{
"userName": "sanj1717",
"userId": 106524910,
"name": "Sandra"
},
{
"userName": "Smurflyfriend",
"userId": 97544955,
"name": "Sarah"
},
{
"userName": "The_Quirky_Witch",
"userId": 104383414,
"name": "Tiffany"
},
{
"userName": "asingh7115",
"userId": 89358075,
"name": "Anu"
},
{
"userName": "bassa846",
"userId": 77575217,
"name": "Ashley"
},
{
"userName": "JJLBailey",
"userId": 97557177,
"name": "Jarvis"
},
{
"userName": "KBScratch_621",
"userId": 105937628,
"name": "Kevin"
},
{
"userName": "BeachOlive",
"userId": 97557363,
"name": "Mindee"
},
{
"userName": "Filmerguy",
"userId": 96131855,
"name": "Russell"
}
]

View file

@ -0,0 +1,100 @@
{
"privacyPolicy.nav.collection": "Collection",
"privacyPolicy.nav.usage": "Usage",
"privacyPolicy.nav.share": "Sharing",
"privacyPolicy.nav.thirdParties": "Third Party Services",
"privacyPolicy.nav.childPrivacy": "Children and Student Privacy",
"privacyPolicy.nav.rights": "Rights and Choices",
"privacyPolicy.nav.retention": "Data Retention",
"privacyPolicy.nav.protection": "Protection",
"privacyPolicy.nav.changes": "Notifications of Changes",
"privacyPolicy.nav.transfer": "Data Transfer",
"privacyPolicy.nav.help": "How to Help",
"privacyPolicy.nav.contact": "Contact Us",
"privacyPolicy.title": "Privacy Policy",
"privacyPolicy.lastUpdated": "The Scratch Privacy Policy was last updated: May 25, 2023",
"privacyPolicy.intro": "The Scratch Foundation (“<b>Scratch</b>”, “<b>we</b>” or “<b>us</b>”) understands how important privacy is to our community, especially kids and parents (“<b>you</b>”, “<b>user</b>”). We wrote this privacy policy (“<b>Privacy Policy</b>”) to explain what Personal Information we collect through our website (scratch.mit.edu, the “<b>Scratch Website</b>”), how we use, process, and share it, and what we're doing to keep it safe. It also tells you about your rights and choices with respect to your Personal Information, and how you can <a>contact us</a> if you have any questions or concerns.",
"privacyPolicy.offlineEditor": "If you would like to build projects with Scratch without submitting any Personal Information to us, you can download and use the <a>Scratch app</a> offline. Projects created in the <a>Scratch app</a> are not accessible by Scratch, and the app will only send anonymized information back to us if you choose to do so. If you upload your projects to the Scratch online community on the Scratch Website, we will collect your Personal Information as explained in this Privacy Policy.",
"privacyPolicy.collectionTitle": "What Personal Information Does Scratch Collect About Me?",
"privacyPolicy.collection1": "For the purpose of this Privacy Policy, “<b>Personal Information</b>” means any information relating to an identified or identifiable individual. You may provide us with Personal Information directly, such as when you create an account, or we may collect your Personal Information automatically, such as when you switch languages or view a project.",
"privacyPolicy.collection2": "Where applicable, we explain whether and why you must provide us with your Personal Information, as well as the consequences if you choose not to do so. For example, you may not be able to benefit from the Scratch Website if that Personal Information is necessary to provide you with the service or if we are legally required to collect that Personal Information.",
"privacyPolicy.youProvide": "Personal Information That You Provide Us",
"privacyPolicy.accountInformationTitle": "Account Information",
"privacyPolicy.accountInformationIntro": "In order to use the services and features that we offer on the Scratch Website, such as to share projects, create studios, or post comments, you need to create an account (your own account, a teacher account or a student account).",
"privacyPolicy.yourAccount": "When you create an <b>account for yourself</b>, we ask you for a username and password, your country, gender, and your email address. We ask that you select a username that does not disclose your real name or other information that could identify you. Other users can see your username and country, but not your gender or email address.",
"privacyPolicy.teacherAccount": "When you create a <b>teacher account</b>, we ask for a username and password, your phone number, birthdate, gender, country of residence, name, and details about your employer.",
"privacyPolicy.studentAccount": "When you create <b>student accounts through your teacher account</b>, we ask for a username, password, birthdate, gender, and country of residence. You do not need to provide students email addresses to create bulk student accounts.",
"privacyPolicy.userGeneratedContentTitle": "User-generated Content",
"privacyPolicy.userGeneratedContentBody": "We process any Personal Information that you choose to provide to us in content when you create or interact with the Scratch Website (typically referred to as user-generated content). For example, in Scratch projects (including unshared projects), studios, text fields, or comments.",
"privacyPolicy.communicationsTitle": "Communications",
"privacyPolicy.communicationsBody": "If you contact us directly, we collect the Personal Information that you provide in your message. For example, when you contact our Customer Support Team, we may receive your name, email address, phone number, the contents of a message or attachments that you may send to us, and other information you choose to provide.",
"privacyPolicy.automaticallyCollect": "Personal Information We Collect Automatically From Your Use of the Scratch Website",
"privacyPolicy.locationInformationTitle": "Location Information",
"privacyPolicy.locationInformationBody": "When you use the Scratch Website, we infer your general location information, for example, by using your internet protocol (IP) address.",
"privacyPolicy.cookiesTitle": "Cookies",
"privacyPolicy.cookiesBody": "When you use the Scratch Website, we use cookies, beacons, invisible tags, unique IDs and similar technologies (collectively “Cookies”) to automatically record certain Personal Information from your browser or device. For example, your IP address, network location, web server logs, what browser you are using, device IDs and characteristics, operating system version, browser language settings, referring URLs, and Personal Information about the usage of the Scratch Website. For more information about our use of Cookies, please refer to the <a>Scratch Cookie Policy.</a>",
"privacyPolicy.otherSources": "Information Collected From Other Sources",
"privacyPolicy.thirdPartyInformationTitle": "Information from Third Parties",
"privacyPolicy.thirdPartyInformationBody": "We may obtain Personal Information about you from third parties, such as from your teacher if you are using Scratch within a school. This information may include your school name and address.",
"privacyPolicy.publicSourceInformationTitle": "Information from Public Sources",
"privacyPolicy.publicSourceInformationBody": "We may obtain Personal Information about you from public sources, such as from census records. This information may include demographic information about your school or geographic region.",
"privacyPolicy.usageTitle": "How Does Scratch Use My Personal Information?",
"privacyPolicy.usageBody": "The main purpose is to provide you with the services that we offer through the Scratch Website and to improve your learning experience. An overview of the uses:",
"privacyPolicy.usage.internalAndServiceTitle": "Internal and Service-Related Usage",
"privacyPolicy.usage.internalAndServiceBody": "We use Personal Information for internal purposes, including to operate, provide and maintain the Scratch Website. For example, to direct users to the requested content, to create and recover accounts and to enable users to create and share projects.",
"privacyPolicy.usage.analyticsTitle": "Analytics and Improving the Scratch Website",
"privacyPolicy.usage.analyticsBody": "We use Personal Information that we collect on the Scratch Website, such as your location and your activities, to monitor and analyze usage of the Scratch Website and to enhance your learning experience.",
"privacyPolicy.usage.communicationsBody": "We may send emails to an email address you provide to us for customer-service or technical-support purposes. We may also send a newsletter to the email address you provide to us when you subscribe to receive additional communications from us.",
"privacyPolicy.usage.researchTitle": "Academic and Scientific Research",
"privacyPolicy.usage.researchBody": "We de-identify and aggregate Personal Information collected through the Scratch Website for statistical analysis in the context of scientific and academic research. For example, to help us understand how people learn through the Scratch Website and how we can enhance learning tools for young people. The results of such research are shared with educators and researchers through conferences, journals, and other academic or scientific publications. You can find out more on our <a>Research page.</a>",
"privacyPolicy.usage.legalTitle": "Legal",
"privacyPolicy.usage.legalBody": "We may use your Personal Information to enforce our <terms>Terms of Use</terms>, to defend our legal rights, and to comply with our legal obligations and internal policies. We moderate content posted to the Scratch Website, including shared and unshared projects, comments, and forum posts to ensure that our <guidelines>Community Guidelines</guidelines> are respected. We also use your Personal Information to detect and prevent fraud, spam, and abuse. We and our service providers may do this by reading information held in cookies set in your browser, analyzing your usage of the Scratch Website, and through other means.",
"privacyPolicy.legalGrounds.title": "What Are The Legal Grounds For Processing Your Personal Information?",
"privacyPolicy.legalGrounds.intro": "If you are located in the European Economic Area, the United Kingdom or Switzerland, we only process your Personal Information based on a valid legal ground. A “legal ground” is a reason that justifies our use of your Personal Information. We may use different legal grounds, such as:",
"privacyPolicy.legalGrounds.communications": "You have consented to the use of your Personal Information, for example, to receive electronic marketing communications;",
"privacyPolicy.legalGrounds.services": "We need your Personal Information to provide our services, including for account registration, to respond to your inquiries, or for customer support;",
"privacyPolicy.legalGrounds.obligation": "We have a legal obligation to use your Personal Information; or",
"privacyPolicy.legalGrounds.thirdParty": "We or a third party have a legitimate interest in using your Personal Information. In particular, we have a legitimate interest in using your Personal Information to analyze and share your aggregated or de-identified information for research purposes, to analyze and enhance your learning experience on the Scratch Website and otherwise ensure and improve the safety, security, and performance of the Scratch Website. We only rely on our or a third partys legitimate interests to process your Personal Information when these interests are not overridden by your rights and interests.",
"privacyPolicy.share.title": "How Does Scratch Share My Personal Information?",
"privacyPolicy.share.intro": "We disclose Personal Information that we collect through the Scratch Website to third parties, if you consent to us doing so, as well as in the following circumstances:",
"privacyPolicy.share.serviceProvidersTitle": "Service Providers",
"privacyPolicy.share.serviceProvidersBody": "To third parties who provide services such as website hosting, data analysis, information technology and related infrastructure provisions, customer service, email delivery, and other services.",
"privacyPolicy.share.researchTitle": "Academic and Scientific Research",
"privacyPolicy.share.researchBody": "To research institutions, such as the Massachusetts Institute of Technology (MIT), to learn about how our users learn through the Scratch Website and develop new learning tools.",
"privacyPolicy.share.mergerTitle": "Merger",
"privacyPolicy.share.mergerBody": "To a potential or actual acquirer, successor, or assignee as part of any reorganization, merger, sale, joint venture, assignment, transfer, or other disposition of all or any portion of our organization or assets. You will have the opportunity to opt out of any such transfer if the new entitys planned processing of your Personal Information differs materially from that set forth in this Privacy Policy.",
"privacyPolicy.share.legalTitle": "Legal",
"privacyPolicy.share.legalBody": "If required to do so by law or in the good faith belief that such action is appropriate: (a) under applicable law, including laws outside your country of residence; (b) to comply with legal process; (c) to respond to requests from public and government authorities, such as school, school districts, and law enforcement, including public and government authorities outside your country of residence; (d) to enforce our terms and conditions; (e) to protect our operations or those of any of our affiliates; (f) to protect our rights, privacy, safety, or property, and/or that of our affiliates, you, or others; and (g) to allow us to pursue available remedies or limit the damages that we may sustain.",
"privacyPolicy.thirdPartyServices.title": "Third Party Services",
"privacyPolicy.thirdPartyServices.body": "This Privacy Policy applies only to the processing of your Personal Information by Scratch. It does not address, and we are not responsible for, the privacy, information, or other practices of any third parties, including any third party operating any site or service to which the Scratch Website links. The inclusion of a link on the Scratch Website does not imply endorsement of the linked site or service by us or by our affiliates.",
"privacyPolicy.childPrivacy.title": "Children and Student Privacy",
"privacyPolicy.childPrivacy.body1": "The Scratch Foundation is a 501(c)(3) nonprofit organization. As such, the Childrens Online Privacy Protection Act (COPPA) does not apply to the Scratch Website. Nevertheless, Scratch takes childrens privacy seriously. Scratch collects only minimal information from its users, and only uses and discloses information to provide the services and for limited other purposes, such as research, as described in this Privacy Policy.",
"privacyPolicy.childPrivacy.body2": "Scratch does not collect information from a students education record, as defined by the Family Educational Rights and Privacy Act (FERPA). Scratch does not disclose personal information of students to any third parties except as described in this Privacy Policy: to service providers and research institutions.",
"privacyPolicy.rights.title": "Your Rights and Choices",
"privacyPolicy.rights.updatingTitle": "Updating Your Information",
"privacyPolicy.rights.updatingBody1": "You can update your password, email address, and country through the <settings>Account Settings</settings> page. You can also reset your password through the <reset>Account Reset</reset> page. You cannot change your username, but you can make a new account and manually copy your projects to the new account.",
"privacyPolicy.rights.updatingBody2": "If you want to delete your account, login to Scratch, and then click your username in the top right-hand corner. Select \"Account Settings,\" then click the \"I want to delete my account\" link at the bottom of the page. Deleting your account hides all Personal Information from public view, but does not remove all of your Personal Information from our servers. If you want to have all of your Personal Information removed from our servers, please contact help@scratch.mit.edu for assistance.",
"privacyPolicy.rights.marketingTitle": "Marketing Communications",
"privacyPolicy.rights.marketingBody": "If you decide at any time that you no longer wish to receive marketing communications from us, please follow the unsubscribe instructions provided in any of the communications. You may also opt out from receiving email from us by sending your request to us by email at help@scratch.mit.edu. Please be aware that, even after you opt out from receiving marketing communications from us, you may continue to receive administrative messages from us regarding your account.",
"privacyPolicy.rights.data.title": "Your Data Protection Rights (EEA, UK and Switzerland)",
"privacyPolicy.rights.data.intro": "If you are located in the European Economic Area, the United Kingdom or Switzerland, you have certain rights in relation to your Personal Information:",
"privacyPolicy.rights.data.access": "<b>Access, Correction and Data Portability:</b> You may ask for an overview of the Personal Information we process about you and to receive a copy of your Personal Information. You also have the right to request to correct incomplete, inaccurate or outdated Personal Information. To the extent required by applicable law, you may request us to provide your Personal Information to another company.",
"privacyPolicy.rights.data.objection": "<b>Objection:</b> You may object to (this means “ask us to stop”) any use of your Personal Information that is not (i) processed to comply with a legal obligation, (ii) necessary to do what is provided in a contract between Scratch and you, or (iii) if we have a compelling reason to do so (such as, to ensure safety and security in our online community). If you do object, we will work with you to find a reasonable solution.",
"privacyPolicy.rights.data.deletion": "<b>Deletion:</b> You may also request the deletion of your Personal Information, as permitted under applicable law. This applies, for instance, where your Personal Information is outdated or the processing is not necessary or is unlawful; where you withdraw your consent to our processing based on such consent; or where you have objected to our processing. In some situations, we may need to retain your Personal Information due to legal obligations or for litigation purposes.",
"privacyPolicy.rights.data.restriction": "<b>Restriction of Processing:</b> You may request that we restrict processing of your Personal Information while we are processing a request relating to (i) the accuracy of your Personal Information, (ii) the lawfulness of the processing of your Personal Information, or (iii) our legitimate interests to process this Personal Information. You may also request that we restrict processing of your Personal Information if you wish to use the Personal Information for litigation purposes.",
"privacyPolicy.rights.data.consent": "<b>Withdrawal of Consent:</b> If we rely on consent for the processing of your Personal Information, you have the right to withdraw it at any time and free of charge. When you do so, we will apply your preferences going forward and this will not affect the lawfulness of the processing before your consent withdrawal.",
"privacyPolicy.rights.data.exceptions": "However, there are exceptions and limitations to each of these rights. We may, for example, refuse to act on a request if the request is manifestly unfounded or excessive, or if the request is likely to adversely affect the rights and freedoms of others, prejudice the execution or enforcement of the law, interfere with pending or future litigation, or infringe applicable law. To submit a request to exercise your rights, please contact help@scratch.mit.edu for assistance. In addition to the above-mentioned rights, you also have the right to lodge a complaint with a competent supervisory authority including in your country of residence, place of work or where an incident took place subject to applicable law.",
"privacyPolicy.retentionTitle": "Data Retention",
"privacyPolicy.retentionBody": "We take measures to delete your Personal Information or keep it in a form that does not allow you to be identified when this Information is no longer necessary for the purposes for which we process it, unless we are required by law to keep this Personal Information for a longer period. When determining the retention period, we take into account various criteria, such as the type of services requested by or provided to you, the nature and length of our relationship with you, possible re-enrolment with our services, the impact on the services we provide to you if we delete some Personal Information from or about you, mandatory retention periods provided by law and the statute of limitations.",
"privacyPolicy.protectionTitle": "How Does Scratch Protect My Personal Information?",
"privacyPolicy.protectionBody": "Scratch has in place administrative, physical, and technical procedures that are intended to protect the Personal Information we collect on the Scratch Website against accidental or unlawful destruction, accidental loss, unauthorized alteration, unauthorized disclosure or access, misuse, and any other unlawful form of processing of the Personal Information. For example, we use SSL/TLS for all data transfers and strictly limit access to the Scratch servers and the data we store on them. However, as effective as these measures are, no security system is impenetrable. We cannot completely guarantee the security of our databases, nor can we guarantee that the Personal Information you supply will not be intercepted while being transmitted to us over the Internet.",
"privacyPolicy.transferTitle": "International Cross-Border Data Transfer",
"privacyPolicy.transferBody1": "We may transfer your Personal Information to countries other than the country where you are located, including to the U.S. (where Scratch servers are located) or any other country in which we or our service providers maintain facilities. If you are located in the European Economic Area, the United Kingdom or Switzerland, or other regions with laws governing data collection and use that may differ from U.S. law, please note that we may transfer your Personal Information to a country and jurisdiction that does not have the same data protection laws as your jurisdiction.",
"privacyPolicy.transferBody2": "We apply administrative, physical, and technical procedures to ensure the confidentiality and security of the Personal Information processed and transferred on our behalf. This includes procedures to ensure that your Personal Information is only processed for the purposes for which it has been collected. To obtain additional information on the transfers, please contact us using the contact information below.",
"privacyPolicy.helpTitle": "What Can I Do To Help Protect Privacy On The Scratch Website?",
"privacyPolicy.helpBody": "Please do not share personal contact information (such as your name, physical address, email address, or phone number) in projects, comments, profiles, studios, or forum posts. Please let us know if you see this kind of information by using the “Report” link which appears on the page. It is also important that you maintain the security and control of your account credentials, and not share your password with anyone.",
"privacyPolicy.changesTitle": "Notifications Of Changes To The Privacy Policy",
"privacyPolicy.changesBody": "We review our security measures and Privacy Policy on a periodic basis, and we may modify our policies as appropriate. If we make material changes to the Policy, we will notify you through the Site or by sending you an email or other communication. We encourage you to review our Privacy Policy on a regular basis. The “Last Updated” date at the top of this page indicates when this Privacy Policy was last revised. Your continued use of the Scratch Website following these changes means that you accept the revised Privacy Policy.",
"privacyPolicy.contactTitle": "Contact Us",
"privacyPolicy.contactBody": "The Scratch Foundation is the entity responsible for the processing of your Personal Information. If you have any questions about this Privacy Policy, or if you would like to exercise your rights to your Personal Information, you may contact us at help@scratch.mit.edu or via mail at:"
}

View file

@ -1,475 +1,311 @@
const React = require('react');
const FormattedMessage = require('react-intl').FormattedMessage;
const injectIntl = require('react-intl').injectIntl;
const Page = require('../../components/page/www/page.jsx');
const render = require('../../lib/render.jsx');
const InformationPage = require('../../components/informationpage/informationpage.jsx');
const Privacypolicy = () => (
<InformationPage title={'Privacy Policy'}>
const bold = chunks => <b>{chunks}</b>;
const contactUsLink = chunks => <a href="/contact-us">{chunks}</a>;
const downloadLink = chunks => <a href="/download">{chunks}</a>;
const cookiesLink = chunks => <a href="/cookies">{chunks}</a>;
const researchLink = chunks => <a href="/research">{chunks}</a>;
const termsOfUseLink = chunks => <a href="/terms_of_use">{chunks}</a>;
const guidelinesLink = chunks => <a href="/community_guidelines">{chunks}</a>;
const settingsLink = chunks => <a href="/accounts/settings">{chunks}</a>;
const resetPasswordLink = chunks => <a href="/accounts/password_change">{chunks}</a>;
const Privacypolicy = injectIntl(props => (
<InformationPage
title={props.intl.formatMessage({id: 'privacyPolicy.title'})}
>
<div className="inner info-inner">
<section>
<p className="lastupdate">
<i>
The Scratch Privacy Policy was last updated: February 14, 2019
<FormattedMessage
id="privacyPolicy.lastUpdated"
/>
</i>
</p>
<p className="intro">
Scratch understands how important privacy is to our
community, especially kids and parents. We wrote this
Privacy Policy to explain what information we collect
through our website (scratch.mit.edu) (the &#34;Site&#34;),
how we use, process, and share it, and what we&#39;re doing
to keep it safe. It also tells you about your rights and
choices with respect to your information, and how you can{' '}
<a href="/contact-us">contact us</a> if you have any
questions or concerns.
<FormattedMessage
id="privacyPolicy.intro"
values={{
b: bold,
a: contactUsLink
}}
/>
</p>
<p className="callout">
If you would like to build projects with Scratch without
submitting any Personal Information to us, you can download
the <a href="/download">Scratch Offline Editor</a>. Projects
created in the <a href="/download">Scratch Offline Editor</a>
{' '}are not accessible by the Scratch Team, and using the
offline editor does not disclose any personally identifying
information to Scratch unless you upload these projects to
the Scratch online community.
<FormattedMessage
id="privacyPolicy.offlineEditor"
values={{
a: downloadLink
}}
/>
</p>
</section>
<section id="collection">
<dl>
<span className="nav-spacer" />
<h3>What personal information does the Scratch Team collect about me?</h3>
<h2><FormattedMessage id="privacyPolicy.collectionTitle" /></h2>
<p>
For the purpose of this Privacy Policy, Personal
Information means any information relating to an
identified or identifiable individual. We obtain
Personal Information relating to you from various
sources described below.
<FormattedMessage
id="privacyPolicy.collection1"
values={{
b: bold
}}
/>
</p>
<p>
Where applicable, we indicate whether and why you must
provide us with your Personal Information, as well as
the consequences of failing to do so. If you do not
provide Personal Information when requested, you may not
be able to benefit from our Site if that information is
necessary to provide you with the service or if we are
legally required to collect the information.
<FormattedMessage id="privacyPolicy.collection2" />
</p>
<dt>Account Information</dt>
<h3><FormattedMessage id="privacyPolicy.youProvide" /></h3>
<dt><FormattedMessage id="privacyPolicy.accountInformationTitle" /></dt>
<dd>
In order to share projects, create studios, or post
comments, you need to make an account. During account
creation, we ask you for a username, your country, birth
month and year, gender, and your email address (or your
parent or guardian&#39;s email address if you are under
16 years old). We ask that you select a username that does
not disclose your real name or other information that
could identify you. Other users can see your username
and country, but not your age, gender, or email address.
<FormattedMessage id="privacyPolicy.accountInformationIntro" />
<ul>
<li>
<FormattedMessage
id="privacyPolicy.yourAccount"
values={{
b: bold
}}
/>
</li>
<li>
<FormattedMessage
id="privacyPolicy.teacherAccount"
values={{
b: bold
}}
/>
</li>
<li>
<FormattedMessage
id="privacyPolicy.studentAccount"
values={{
b: bold
}}
/>
</li>
</ul>
</dd>
<dt>User-generated Content</dt>
<dt><FormattedMessage id="privacyPolicy.userGeneratedContentTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.userGeneratedContentBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.communicationsTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.communicationsBody" /></dd>
<h3><FormattedMessage id="privacyPolicy.automaticallyCollect" /></h3>
<dt><FormattedMessage id="privacyPolicy.locationInformationTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.locationInformationBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.cookiesTitle" /></dt>
<dd>
We collect any information that you provide to us when
you create Scratch projects (including unshared
projects), write comments, or post on our forums.
</dd>
<dt>Communications</dt>
<dd>
If you contact us directly, we may receive additional
information about you. For example, when you contact our
Customer Support Team, we may receive your name, email
address, phone number, the contents of a message or
attachments that you may send to us, and other
information you choose to provide.
</dd>
<dt>
Personal Information We Collect Automatically From Your
Use of the Site
</dt>
<dd>
When you use Scratch, we and our third-party service
providers collect information about you and your device
through automated means, such as cookies and web server
logs. By using Scratch, you consent to the placement of
cookies and similar technologies in your browser in
accordance with this Privacy Policy. The information
collected in this manner includes your IP address,
network location, what browser you are using, device IDs
and characteristics, operating system version, language
preferences, referring URLs, and information about the
usage of our site.
</dd>
<dd>
We use this information, for example, to ensure that the
site functions properly, to determine how many users
have visited certain pages, or to prevent fraud. We use
IP address information to derive your approximate
location. We also work with analytics providers, such
as Google Analytics, which use cookies and similar
technologies to collect and analyze information about
use of the site and report on activities and trends.
These services may also collect information about the
use of other websites, apps, and online resources. You
can learn more about Googles practices by going to{' '}
<a href="https://www.google.com/policies/privacy/partners/">
https://www.google.com/policies/privacy/partners/</a>.
</dd>
<dd>
If you do not want information collected through the use
of cookies, most browsers allow you to automatically
decline cookies or be given the choice of declining or
accepting the transfer to your computer of a particular
cookie (or cookies) from a particular site. You may also
wish to refer to{' '}
<a href="http://www.allaboutcookies.org/manage-cookies/index.html">
http://www.allaboutcookies.org/manage-cookies/index.html</a>.
If, however, you do not accept cookies, you may
experience some inconvenience in your use of Scratch.
<FormattedMessage
id="privacyPolicy.cookiesBody"
values={{
a: cookiesLink
}}
/>
</dd>
<h3><FormattedMessage id="privacyPolicy.otherSources" /></h3>
<dt><FormattedMessage id="privacyPolicy.thirdPartyInformationTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.thirdPartyInformationBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.publicSourceInformationTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.publicSourceInformationBody" /></dd>
</dl>
</section>
<section id="usage">
<dl>
<span className="nav-spacer" />
<h3>How does the Scratch Team use my personal information?</h3>
<p />
<dt>Internal and Service-Related Usage</dt>
<h2><FormattedMessage id="privacyPolicy.usageTitle" /></h2>
<p><FormattedMessage id="privacyPolicy.usageBody" /></p>
<dt><FormattedMessage id="privacyPolicy.usage.internalAndServiceTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.usage.internalAndServiceBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.usage.analyticsTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.usage.analyticsBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.communicationsTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.usage.communicationsBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.usage.researchTitle" /></dt>
<dd>
We use Personal Information for internal and Site-related
purposes, including to operate, provide, and maintain the
Site.
<FormattedMessage
id="privacyPolicy.usage.researchBody"
values={{
a: researchLink
}}
/>
</dd>
<dt>Analytics and Improving the Site</dt>
<dt><FormattedMessage id="privacyPolicy.usage.legalTitle" /></dt>
<dd>
We and our service providers use Personal Information
that we collect on the Site, such as your location and
your activities on the Site, to monitor and analyze
usage of the Site and to improve and enhance the Site.
</dd>
<dt>Communications</dt>
<dd>
We may send emails to an email address you provide to us
for customer-service or technical-support purposes, to
send you information about topics or content that we
think may interest you, or updates about the latest
developments or features on the Site. We may also send a
newsletter to the email address you provide to us if you
subscribe to receive the newsletter. Parents and
guardians who register their under-16 year olds for
Scratch may also receive additional updates from the
Scratch Foundation, a non-profit that supports Scratch
educational initiatives.
</dd>
<dt>Aggregate Data</dt>
<dd>
We may de-identify and aggregate information collected
through the Site for statistical analysis and other
lawful purpose, including in research studies intended
to improve our understanding of how people learn with
Scratch. The results of this research are shared with
educators and researchers through conferences, journals,
and other publications. You can find out more on our{' '}
<a href="/research">Research page</a>.
</dd>
<dt>Legal</dt>
<dd>
We may use your Personal Information to enforce our{' '}
<a href="/terms_of_use">Terms of Use</a>, to defend our
legal rights, and to comply with our legal obligations
and internal policies. We moderate all content posted to
Scratch, including unshared projects, comments, and
forum posts.
</dd>
<dd>
If you are located in the European Economic Area, we
only process your Personal Information based on a valid
legal ground, including when:
<FormattedMessage
id="privacyPolicy.usage.legalBody"
values={{
terms: termsOfUseLink,
guidelines: guidelinesLink
}}
/>
</dd>
<h2><FormattedMessage id="privacyPolicy.legalGrounds.title" /></h2>
<p><FormattedMessage id="privacyPolicy.legalGrounds.intro" /></p>
<ul>
<li>
You have consented to the use of your Personal
Information, for example, to receive electronic
marketing communications;
<FormattedMessage id="privacyPolicy.legalGrounds.communications" />
</li>
<li>
We need your Personal Information to provide our
services, including for account registration, to
respond to your inquiries, or for customer support;
<FormattedMessage id="privacyPolicy.legalGrounds.services" />
</li>
<li>
We have a legal obligation to use your Personal
Information; or
<FormattedMessage id="privacyPolicy.legalGrounds.obligation" />
</li>
<li>
We or a third party have a legitimate interest in
using your Personal Information. In particular, we
have a legitimate interest in using your Personal
Information to personalize our services and provide
you with tailored content, conduct business
analytics, and otherwise improve the safety,
security, and performance of our Site. We only rely
on our or a third partys legitimate interests to
process your Personal Information when these
interests are not overridden by your rights and
interests.
<FormattedMessage id="privacyPolicy.legalGrounds.thirdParty" />
</li>
</ul>
</dl>
</section>
<section id="share">
<span className="nav-spacer" />
<h3>How Does Scratch Share my Personal Information?</h3>
<p>
We disclose information that we collect through the Site to
third parties in the following circumstances:
</p>
<ul>
<li>
To third-party service providers who provide services
such as website hosting, data analysis, information
technology and related infrastructure provisions,
customer service, email delivery, and other services.
</li>
<li>
We may also disclose your Personal Information with your
permission. We may seek your permission in various ways.
For example, we may present you with an opt-in prompt
when you register to use the Site or access certain
content.
</li>
<li>
To a potential or actual acquirer, successor, or
assignee as part of any reorganization, merger, sale,
joint venture, assignment, transfer, or other
disposition of all or any portion of our organization or
assets. You will have the opportunity to opt out of any
such transfer if the new entitys planned processing of
your information differs materially from that set forth
in this Privacy Policy.
</li>
<li>
If required to do so by law or in the good faith belief
that such action is appropriate: (a) under applicable
law, including laws outside your country of residence;
(b) to comply with legal process; (c) to respond to
requests from public and government authorities, such
as school, school districts, and law enforcement,
including public and government authorities outside your
country of residence; (d) to enforce our terms and
conditions; (e) to protect our operations or those of
any of our affiliates; (f) to protect our rights,
privacy, safety, or property, and/or that of our
affiliates, you, or others; and (g) to allow us to
pursue available remedies or limit the damages that we
may sustain.
</li>
</ul>
<dl>
<span className="nav-spacer" />
<h2><FormattedMessage id="privacyPolicy.share.title" /></h2>
<p>
<FormattedMessage id="privacyPolicy.share.intro" />
</p>
<dt><FormattedMessage id="privacyPolicy.share.serviceProvidersTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.share.serviceProvidersBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.share.researchTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.share.researchBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.share.mergerTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.share.mergerBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.share.legalTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.share.legalBody" /></dd>
</dl>
</section>
<section id="thirdparties">
<span className="nav-spacer" />
<h3>Third Party Services</h3>
<p>
This Privacy Policy applies only to the processing of your
Personal Information by Scratch. It does not address, and we
are not responsible for, the privacy, information, or other
practices of any third parties, including any third party
operating any site or service to which the Site links. The
inclusion of a link on the Site does not imply endorsement
of the linked site or service by us or by our affiliates.
</p>
<h2><FormattedMessage id="privacyPolicy.thirdPartyServices.title" /></h2>
<p><FormattedMessage id="privacyPolicy.thirdPartyServices.body" /></p>
</section>
<section id="childprivacy">
<span className="nav-spacer" />
<h2><FormattedMessage id="privacyPolicy.childPrivacy.title" /></h2>
<p><FormattedMessage id="privacyPolicy.childPrivacy.body1" /></p>
<p><FormattedMessage id="privacyPolicy.childPrivacy.body2" /></p>
</section>
<section id="rights">
<span className="nav-spacer" />
<h3>Your Rights and Choices</h3>
<p />
<h2><FormattedMessage id="privacyPolicy.rights.title" /></h2>
<dl>
<dt>Updating Your Information</dt>
<dt><FormattedMessage id="privacyPolicy.rights.updatingTitle" /></dt>
<dd>
You can update your password, email address, and country
through the <a href="/accounts/settings">Account
Settings</a> page. You can also reset your password
through the <a href="/accounts/password_change">Account
Reset</a> page. You cannot change your username, but you
can make a new account and manually copy your projects
to the new account.
<FormattedMessage
id="privacyPolicy.rights.updatingBody1"
values={{
settings: settingsLink,
reset: resetPasswordLink
}}
/>
</dd>
<dd>
If you want to delete your account, login to Scratch,
and then click your username in the top right-hand
corner. Select &#34;Account Settings,&#34; then click
the &#34;I want to delete my account&#34; link at the
bottom of the page. Deleting your account hides all
information from public view, but does not remove all of
your information from our servers. If you want to have
all of your information removed from our servers, please
contact help@scratch.mit.edu for assistance.
<FormattedMessage id="privacyPolicy.rights.updatingBody2" />
</dd>
<dt>Marketing Communications</dt>
<dt><FormattedMessage id="privacyPolicy.rights.marketingTitle" /></dt>
<dd><FormattedMessage id="privacyPolicy.rights.marketingBody" /></dd>
<dt><FormattedMessage id="privacyPolicy.rights.data.title" /></dt>
<dd>
If you decide at any time that you no longer wish to
receive marketing communications from us, please follow
the unsubscribe instructions provided in any of the
communications. You may also opt out from receiving
email from us by sending your request to us by email at
help@scratch.mit.edu. Please be aware that, even after
you opt out from receiving marketing communications from
us, you may continue to receive administrative messages
from us regarding the Site.
</dd>
<dt>Your Data Protection Rights (EEA)</dt>
<dd>
In certain jurisdictions, you have the right to request
access and receive information about the Personal
Information we maintain about you, to update and correct
inaccuracies in your Personal Information, to restrict
or object to the processing of your Personal
Information, to have the information blocked,
anonymized, or deleted, as appropriate, or to exercise
your right to data portability to easily transfer your
Personal Information to another company. Those rights
may be limited in some circumstances by local law
requirements. In addition to the above-mentioned rights,
you also have the right to lodge a complaint with a
competent supervisory authority subject to applicable
law.
</dd>
<dd>
Where required by law, we obtain your consent for the
processing of certain Personal Information collected by
cookies or similar technologies, or used to send you
direct marketing communications, or when we carry out
other processing activities for which consent may be
required. If we rely on consent for the processing of
your Personal Information, you have the right to
withdraw it at any time and free of charge. When you do
so, this will not affect the lawfulness of the
processing before your consent withdrawal.
</dd>
<dd>
To update your preferences, ask us to remove your
information from our mailing lists, or submit a request
to exercise your rights under applicable law, please
contact us as specified in the How to Contact Us
section below.
<p><FormattedMessage id="privacyPolicy.rights.data.intro" /></p>
<ul>
<li>
<FormattedMessage
id="privacyPolicy.rights.data.access"
values={{b: bold}}
/>
</li>
<li>
<FormattedMessage
id="privacyPolicy.rights.data.objection"
values={{b: bold}}
/>
</li>
<li>
<FormattedMessage
id="privacyPolicy.rights.data.deletion"
values={{b: bold}}
/>
</li>
<li>
<FormattedMessage
id="privacyPolicy.rights.data.restriction"
values={{b: bold}}
/>
</li>
<li>
<FormattedMessage
id="privacyPolicy.rights.data.consent"
values={{b: bold}}
/>
</li>
</ul>
<p><FormattedMessage id="privacyPolicy.rights.data.exceptions" /></p>
</dd>
</dl>
</section>
<section id="retention">
<span className="nav-spacer" />
<h3>Data Retention</h3>
<p>
We take measures to delete your Personal Information or keep
it in a form that does not allow you to be identified when
this information is no longer necessary for the purposes for
which we process it, unless we are required by law to keep
this information for a longer period. When determining the
retention period, we take into account various criteria,
such as the type of services requested by or provided to
you, the nature and length of our relationship with you,
possible re-enrolment with our services, the impact on the
services we provide to you if we delete some information
from or about you, mandatory retention periods provided by
law and the statute of limitations.
</p>
<h2><FormattedMessage id="privacyPolicy.retentionTitle" /></h2>
<p><FormattedMessage id="privacyPolicy.retentionBody" /></p>
</section>
<section id="protection">
<span className="nav-spacer" />
<h3>How does the Scratch Team protect my personal information?</h3>
<p>
The Scratch Team has in place administrative, physical, and
technical procedures that are intended to protect the
information we collect on the Scratch website against
accidental or unlawful destruction, accidental loss,
unauthorized alteration, unauthorized disclosure or access,
misuse, and any other unlawful form of processing of the
Personal Information in our possession. For example, we
use SSL/TLS for all data transfer and strictly limit access
to the Scratch servers and the data we store on them. However,
as effective as these measures are, no security system is
impenetrable. We cannot completely guarantee the security of
our databases, nor can we guarantee that the information you
supply will not be intercepted while being transmitted to us
over the Internet.
</p>
</section>
<section id="changes">
<span className="nav-spacer" />
<h3>Notifications of changes to the Privacy Policy</h3>
<p>
We review our security measures and Privacy Policy on a
periodic basis, and we may modify our policies as
appropriate. If we make material changes, we will notify you
through the Site or by sending you an email or other
communication. We encourage you to review our Privacy Policy
on a regular basis. The Last Updated date at the top of
this page indicates when this Privacy Policy was last
revised. Your continued use of the Site following these
changes means that you accept the revised Privacy Policy.
</p>
<h2><FormattedMessage id="privacyPolicy.protectionTitle" /></h2>
<p><FormattedMessage id="privacyPolicy.protectionBody" /></p>
</section>
<section id="transfer">
<span className="nav-spacer" />
<h3>International Cross-Border Data Transfer</h3>
<p>
Scratch is based in the United States. Personal Information
that we collect may be transferred to, and stored at, any of
our affiliates, partners, or service providers which may be
inside or outside the European Economic Area, including the
United States. By submitting your personal data, you agree
to such transfers.
</p>
<h2><FormattedMessage id="privacyPolicy.transferTitle" /></h2>
<p><FormattedMessage id="privacyPolicy.transferBody1" /></p>
<p><FormattedMessage id="privacyPolicy.transferBody2" /></p>
</section>
<section id="help">
<span className="nav-spacer" />
<h3>What can I do to help protect privacy on Scratch?</h3>
<p>
Please do not share personal contact information (such as
your name, physical address, email address, or phone number)
in projects, comments, profiles, studios, or forum posts.
Please let us know if you see this kind of information by
using the Report link which appears on the page. It is
also important that you maintain the security and control
of your account credentials, and not share your password
with anyone.
</p>
<h2><FormattedMessage id="privacyPolicy.helpTitle" /></h2>
<p><FormattedMessage id="privacyPolicy.helpBody" /></p>
</section>
<section id="changes">
<span className="nav-spacer" />
<h2><FormattedMessage id="privacyPolicy.changesTitle" /></h2>
<p><FormattedMessage id="privacyPolicy.changesBody" /></p>
</section>
<section id="contact">
<span className="nav-spacer" />
<h3>Contact Us</h3>
<p>
The Code-to-Learn Foundation d/b/a The Scratch Foundation is
the entity responsible for the processing of your Personal
Information. If you have any questions about this Privacy
Policy, or if you would like to exercise your rights to your
Personal Information, you may contact us at
help@scratch.mit.edu or via mail at:
</p>
<h2><FormattedMessage id="privacyPolicy.contactTitle" /></h2>
<p><FormattedMessage id="privacyPolicy.contactBody" /></p>
<p>
Scratch Foundation<br />
ATTN: Privacy Policy<br />
7315 Wisconsin Ave.<br />
4th Floor West<br />
Bethesda, MD 20814
201 South Street<br />
Unit 102<br />
Boston, MA 02111
</p>
</section>
</div>
<nav>
<ol>
<li><a href="#collection">Collection</a></li>
<li><a href="#usage">Usage</a></li>
<li><a href="#share">Sharing</a></li>
<li><a href="#thirdparties">Third Party Services</a></li>
<li><a href="#rights">Rights and Choices</a></li>
<li><a href="#retention">Data Retention</a></li>
<li><a href="#protection">Protection</a></li>
<li><a href="#changes">Notifications of Changes</a></li>
<li><a href="#transfer">Data Transfer</a></li>
<li><a href="#help">How to Help</a></li>
<li><a href="#contact">Contact Us</a></li>
<li><a href="#collection"><FormattedMessage id="privacyPolicy.nav.collection" /></a></li>
<li><a href="#usage"><FormattedMessage id="privacyPolicy.nav.usage" /></a></li>
<li><a href="#share"><FormattedMessage id="privacyPolicy.nav.share" /></a></li>
<li><a href="#thirdparties"><FormattedMessage id="privacyPolicy.nav.thirdParties" /></a></li>
<li><a href="#childprivacy"><FormattedMessage id="privacyPolicy.nav.childPrivacy" /></a></li>
<li><a href="#rights"><FormattedMessage id="privacyPolicy.nav.rights" /></a></li>
<li><a href="#retention"><FormattedMessage id="privacyPolicy.nav.retention" /></a></li>
<li><a href="#protection"><FormattedMessage id="privacyPolicy.nav.protection" /></a></li>
<li><a href="#transfer"><FormattedMessage id="privacyPolicy.nav.transfer" /></a></li>
<li><a href="#help"><FormattedMessage id="privacyPolicy.nav.help" /></a></li>
<li><a href="#changes"><FormattedMessage id="privacyPolicy.nav.changes" /></a></li>
<li><a href="#contact"><FormattedMessage id="privacyPolicy.nav.contact" /></a></li>
</ol>
</nav>
</InformationPage>
);
));
render(<Page><Privacypolicy /></Page>, document.getElementById('app'));

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB