diff --git a/bin/build-locales b/bin/build-locales index 1984168c7..059c1fc06 100755 --- a/bin/build-locales +++ b/bin/build-locales @@ -42,6 +42,7 @@ var path = require('path'); var languages = require('../languages.json'); var localeCompare = require('./lib/locale-compare'); +var localizedUrls = require('./lib/localized-urls'); // ----------------------------------------------------------------------------- // Main script @@ -92,6 +93,28 @@ files.forEach(function (file) { localeCompare.getIdsForView(view, file, viewLocales, idsWithICU, icuWithIds); }); +// get asset url translations +var localizedAssetUrls = {}; +files = glob.sync(path.resolve(__dirname, '../src/views/**/l10n-static.json')); +files.forEach(function (file) { + var dirPath = file.split('/'); + dirPath.pop(); + var view = dirPath.pop(); + localizedAssetUrls[view] = {}; + + var assetUrls = JSON.parse(fs.readFileSync(file, 'utf8')); + for (var lang in localizedUrls) { + localizedAssetUrls[view][lang] = {}; + for (var key in assetUrls) { + if (localizedUrls[lang].hasOwnProperty(key)) { + localizedAssetUrls[view][lang][key] = localizedUrls[lang][key]; + } else { + localizedAssetUrls[view][lang][key] = assetUrls[key]; + } + } + } +}); + // md5 of english strings with message key as the value for searching po files. // Sample structure: { 'sdfas43534sdfasdf': 'general-general.blah', 'lkjfasdf4t342asdfa': 'about-about.blah' } var md5WithIds = localeCompare.getMD5Map(icuWithIds); @@ -110,5 +133,8 @@ for (i in views) { if (views[i] in viewLocales) { viewTranslations = merge(viewLocales[views[i]], viewTranslations); } + if (views[i] in localizedAssetUrls) { + viewTranslations = merge(viewTranslations, localizedAssetUrls[[views[i]]]); + } localeCompare.writeTranslationsToJS(outputDir, views[i], viewTranslations); } diff --git a/bin/lib/localized-urls.json b/bin/lib/localized-urls.json new file mode 100644 index 000000000..5b85d12e0 --- /dev/null +++ b/bin/lib/localized-urls.json @@ -0,0 +1,52 @@ +{ + "en": { + "cards.starterLink": "//scratch.mit.edu/scratchr2/static/pdfs/help/Scratch2Cards.pdf", + "cards.nameLink": "//scratch.mit.edu/scratchr2/static/pdfs/help/AnimateYourNameCards.pdf", + "cards.pongLink": "//scratch.mit.edu/scratchr2/static/pdfs/help/PongCards.pdf", + "cards.storyLink": "//scratch.mit.edu/scratchr2/static/pdfs/help/StoryCards.pdf", + "cards.danceLink": "//scratch.mit.edu/scratchr2/static/pdfs/help/DanceCards.pdf", + "cards.hideLink": "//scratch.mit.edu/scratchr2/static/pdfs/help/Hide-and-Seek-Cards.pdf" + }, + "ar": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/ar/Scratch2Cards.pdf" + }, + "ca": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/ca/Scratch2Cards.pdf" + }, + "cs": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/cs/Scratch2Cards.pdf" + }, + "de": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/de/Scratch2Cards.pdf" + }, + "es": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/es/Scratch2Cards.pdf" + }, + "fr": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/fr/Scratch2Cards.pdf" + }, + "hr": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/hr/Scratch2Cards.pdf" + }, + "it": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/it/Scratch2Cards.pdf" + }, + "ja": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/ja/Scratch2Cards.pdf" + }, + "ja-hr": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/ja-hr/Scratch2Cards.pdf" + }, + "ko": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/ko/Scratch2Cards.pdf" + }, + "nl": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/nl/Scratch2Cards.pdf" + }, + "pt-br": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/pt-br/Scratch2Cards.pdf" + }, + "sl": { + "cards.starterLink": "//cdn.scratch.mit.edu/scratchr2/static/pdfs/help/sl/Scratch2Cards.pdf" + } +} \ No newline at end of file diff --git a/server/routes.json b/server/routes.json index d32b25ff3..78ac23d5b 100644 --- a/server/routes.json +++ b/server/routes.json @@ -24,6 +24,11 @@ "view": "credits", "title": "Credits" }, + { + "pattern": "/info/cards", + "view": "cards", + "title": "Cards" + }, { "pattern": "/jobs", "view": "jobs", diff --git a/src/views/cards/cards.jsx b/src/views/cards/cards.jsx new file mode 100644 index 000000000..5a6526065 --- /dev/null +++ b/src/views/cards/cards.jsx @@ -0,0 +1,150 @@ +var React = require('react'); +var injectIntl = require('react-intl').injectIntl; +var FormattedMessage = require('react-intl').FormattedMessage; +var render = require('../../lib/render.jsx'); + +var Box = require('../../components/box/box.jsx'); +var Page = require('../../components/page/page.jsx'); + +require('./cards.scss'); + +var Cards = injectIntl(React.createClass({ + type: 'Cards', + render: function () { + var locale = window._locale || 'en'; + var formatMessage = this.props.intl.formatMessage; + var englishLinks = { + 'cards.starterLink': '//scratch.mit.edu/scratchr2/static/pdfs/help/Scratch2Cards.pdf', + 'cards.nameLink': '//scratch.mit.edu/scratchr2/static/pdfs/help/AnimateYourNameCards.pdf', + 'cards.pongLink': '//scratch.mit.edu/scratchr2/static/pdfs/help/PongCards.pdf', + 'cards.storyLink': '//scratch.mit.edu/scratchr2/static/pdfs/help/StoryCards.pdf', + 'cards.danceLink': '//scratch.mit.edu/scratchr2/static/pdfs/help/DanceCards.pdf', + 'cards.hideLink': '//scratch.mit.edu/scratchr2/static/pdfs/help/Hide-and-Seek-Cards.pdf' + }; + var formattedLinks = { + 'cards.starterLink': formatMessage({id: 'cards.starterLink'}), + 'cards.nameLink': formatMessage({id: 'cards.nameLink'}), + 'cards.pongLink': formatMessage({id: 'cards.pongLink'}), + 'cards.storyLink': formatMessage({id: 'cards.storyLink'}), + 'cards.danceLink': formatMessage({id: 'cards.danceLink'}), + 'cards.hideLink': formatMessage({id: 'cards.hideLink'}) + }; + return ( +