diff --git a/Makefile b/Makefile index 1ca691e..48789fb 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ export TRANSIFEX_RESOURCE = frontend-app-profile transifex_resource = frontend-app-profile transifex_langs = "ar,fr,es_419,zh_CN,pt,it,de,uk,ru,hi,fr_CA" +intl_imports = ./node_modules/.bin/intl-imports.js transifex_utils = ./node_modules/.bin/transifex-utils.js i18n = ./src/i18n transifex_input = $(i18n)/transifex_input.json @@ -49,9 +50,23 @@ push_translations: # Pushing comments to Transifex... ./node_modules/@edx/reactifex/bash_scripts/put_comments_v3.sh +ifeq ($(OPENEDX_ATLAS_PULL),) # Pulls translations from Transifex. pull_translations: tx pull -t -f --mode reviewed --languages=$(transifex_langs) +else +# Experimental: OEP-58 Pulls translations using atlas +pull_translations: + rm -rf src/i18n/messages + mkdir src/i18n/messages + cd src/i18n/messages \ + && atlas pull --filter=$(transifex_langs) \ + translations/frontend-component-header/src/i18n/messages:frontend-component-header \ + translations/frontend-component-footer/src/i18n/messages:frontend-component-footer \ + translations/frontend-app-profile/src/i18n/messages:frontend-app-profile + + $(intl_imports) frontend-component-header frontend-component-footer frontend-app-profile +endif # This target is used by Travis. validate-no-uncommitted-package-lock-changes: diff --git a/package-lock.json b/package-lock.json index 8ce14b8..2f82d49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,10 @@ "license": "AGPL-3.0", "dependencies": { "@edx/brand": "npm:@edx/brand-openedx@1.2.0", - "@edx/frontend-component-footer": "11.7.4", - "@edx/frontend-component-header": "3.6.5", - "@edx/frontend-platform": "3.3.1", - "@edx/paragon": "^20.20.0", + "@edx/frontend-component-footer": "12.0.0", + "@edx/frontend-component-header": "4.0.0", + "@edx/frontend-platform": "4.2.0", + "@edx/paragon": "^20.32.0", "@fortawesome/fontawesome-svg-core": "1.2.36", "@fortawesome/free-brands-svg-icons": "5.15.4", "@fortawesome/free-regular-svg-icons": "5.15.4", @@ -2704,9 +2704,9 @@ } }, "node_modules/@edx/frontend-component-footer": { - "version": "11.7.4", - "resolved": "https://registry.npmjs.org/@edx/frontend-component-footer/-/frontend-component-footer-11.7.4.tgz", - "integrity": "sha512-psZA6p4TgIKI6L2L+qVYKlIHEOSPhTgX37qWWU8A4M8w9Po+GVwV0ilGtkJCv5/JqKQHQlMP2vr+4k2X4kykrg==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@edx/frontend-component-footer/-/frontend-component-footer-12.0.0.tgz", + "integrity": "sha512-m8Rx6ZPWzIN5XLrz6Ft3aTuFo0rty0jECd79CBYWdm0D9KD1WxoYEG+fElluyOQp/t42T5jLImHTSWjFURx5kw==", "dependencies": { "@fortawesome/fontawesome-svg-core": "6.4.0", "@fortawesome/free-brands-svg-icons": "6.4.0", @@ -2715,7 +2715,7 @@ "@fortawesome/react-fontawesome": "0.2.0" }, "peerDependencies": { - "@edx/frontend-platform": "^2.0.0 || ^3.0.0", + "@edx/frontend-platform": "^4.0.0", "prop-types": "^15.5.10", "react": "^16.9.0 || ^17.0.0", "react-dom": "^16.9.0 || ^17.0.0" @@ -2779,11 +2779,11 @@ } }, "node_modules/@edx/frontend-component-header": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@edx/frontend-component-header/-/frontend-component-header-3.6.5.tgz", - "integrity": "sha512-7B0AxNDm/U/ooYXNfguhzl8W4GhCUFLwJ//Aq9GLMumZcmvS33O+JtOw5isrV5VkdFN/OODnzb0AX6mTexi7Cg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@edx/frontend-component-header/-/frontend-component-header-4.0.0.tgz", + "integrity": "sha512-r/L3p2ZSI1DitjxVKAor18GmgJllafYslrdpzGI0vcX/gTemH13jf2Xr9iQqrT921DP2nzZ5GOwGJNptTSjiaA==", "dependencies": { - "@edx/paragon": "20.28.5", + "@edx/paragon": "20.30.1", "@fortawesome/fontawesome-svg-core": "6.3.0", "@fortawesome/free-brands-svg-icons": "6.3.0", "@fortawesome/free-regular-svg-icons": "6.3.0", @@ -2794,10 +2794,59 @@ "react-transition-group": "4.4.5" }, "peerDependencies": { - "@edx/frontend-platform": "^2.0.0 || ^3.0.0", + "@edx/frontend-platform": "^4.0.0", "prop-types": "^15.5.10", - "react": "^16.9.0", - "react-dom": "^16.9.0" + "react": "^16.9.0 || ^17.0.0", + "react-dom": "^16.9.0 || ^17.0.0" + } + }, + "node_modules/@edx/frontend-component-header/node_modules/@edx/paragon": { + "version": "20.30.1", + "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.30.1.tgz", + "integrity": "sha512-v3Ek8deZWqVKi3IWP08Mj4egrvbmbqQEyRA6+qazHZdgHJA4qOP1SST42UKd9XxPeRbLWUgaJWd0iBAOAna/gw==", + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.1.18", + "@popperjs/core": "^2.11.4", + "bootstrap": "^4.6.2", + "classnames": "^2.3.1", + "email-prop-type": "^3.0.0", + "file-selector": "^0.6.0", + "font-awesome": "^4.7.0", + "glob": "^8.0.3", + "lodash.uniqby": "^4.7.0", + "mailto-link": "^2.0.0", + "prop-types": "^15.8.1", + "react-bootstrap": "^1.6.5", + "react-colorful": "^5.6.1", + "react-dropzone": "^14.2.1", + "react-focus-on": "^3.5.4", + "react-loading-skeleton": "^3.1.0", + "react-popper": "^2.2.5", + "react-proptype-conditional-require": "^1.0.4", + "react-responsive": "^8.2.0", + "react-table": "^7.7.0", + "react-transition-group": "^4.4.2", + "tabbable": "^5.3.3", + "uncontrollable": "^7.2.1", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "react": "^16.8.6 || ^17.0.0", + "react-dom": "^16.8.6 || ^17.0.0", + "react-intl": "^5.25.1" + } + }, + "node_modules/@edx/frontend-component-header/node_modules/@edx/paragon/node_modules/@fortawesome/react-fontawesome": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", + "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.x" } }, "node_modules/@edx/frontend-component-header/node_modules/@fortawesome/fontawesome-common-types": { @@ -2857,10 +2906,18 @@ "node": ">=6" } }, + "node_modules/@edx/frontend-component-header/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@edx/frontend-platform": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@edx/frontend-platform/-/frontend-platform-3.3.1.tgz", - "integrity": "sha512-EF2a5Ovzhu5URo7ER6Mc/K+l02UGuXpd2bQw+dW/xGe/hlv+1CDnrzDTqM8QEk+suZyQfI9U0fnsqwcwr0a2SA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@edx/frontend-platform/-/frontend-platform-4.2.0.tgz", + "integrity": "sha512-iDoFeccENQKBjqUgdjl5KSwBrjNEj8YW6Ual+6twcHHJUBg3yRoBEphwHIoRREcMgQjhdKVAdWj8eleh4JsEKA==", "dependencies": { "@cospired/i18n-iso-languages": "2.2.0", "@formatjs/intl-pluralrules": "4.3.3", @@ -2883,13 +2940,14 @@ "universal-cookie": "4.0.4" }, "bin": { + "intl-imports.js": "i18n/scripts/intl-imports.js", "transifex-utils.js": "i18n/scripts/transifex-utils.js" }, "peerDependencies": { "@edx/paragon": ">= 10.0.0 < 21.0.0", "prop-types": "^15.7.2", - "react": "^16.9.0", - "react-dom": "^16.9.0", + "react": "^16.9.0 || ^17.0.0", + "react-dom": "^16.9.0 || ^17.0.0", "react-redux": "^7.1.1", "react-router-dom": "^5.0.1", "redux": "^4.0.4" @@ -2946,9 +3004,9 @@ } }, "node_modules/@edx/paragon": { - "version": "20.28.5", - "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.28.5.tgz", - "integrity": "sha512-6cW9Pl1hojOGfGatLjeojzr0qNfil6rlwB3APKZlgomscDxVzYbaQYyZNOx/k2dFaO8EKCpiApXhHW+WihQipg==", + "version": "20.32.0", + "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.32.0.tgz", + "integrity": "sha512-d2rlYoWyRLvzPMo7MfCojqU/Qvk0cXnBpXW7aOOOQYhTvC3m3Y3yNWjQ8DJhbnWyL1tFEjZG2mjlgXHDHBqtLQ==", "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", @@ -2963,6 +3021,7 @@ "mailto-link": "^2.0.0", "prop-types": "^15.8.1", "react-bootstrap": "^1.6.5", + "react-colorful": "^5.6.1", "react-dropzone": "^14.2.1", "react-focus-on": "^3.5.4", "react-loading-skeleton": "^3.1.0", @@ -15674,6 +15733,15 @@ "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -22362,9 +22430,9 @@ } }, "@edx/frontend-component-footer": { - "version": "11.7.4", - "resolved": "https://registry.npmjs.org/@edx/frontend-component-footer/-/frontend-component-footer-11.7.4.tgz", - "integrity": "sha512-psZA6p4TgIKI6L2L+qVYKlIHEOSPhTgX37qWWU8A4M8w9Po+GVwV0ilGtkJCv5/JqKQHQlMP2vr+4k2X4kykrg==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@edx/frontend-component-footer/-/frontend-component-footer-12.0.0.tgz", + "integrity": "sha512-m8Rx6ZPWzIN5XLrz6Ft3aTuFo0rty0jECd79CBYWdm0D9KD1WxoYEG+fElluyOQp/t42T5jLImHTSWjFURx5kw==", "requires": { "@fortawesome/fontawesome-svg-core": "6.4.0", "@fortawesome/free-brands-svg-icons": "6.4.0", @@ -22413,11 +22481,11 @@ } }, "@edx/frontend-component-header": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@edx/frontend-component-header/-/frontend-component-header-3.6.5.tgz", - "integrity": "sha512-7B0AxNDm/U/ooYXNfguhzl8W4GhCUFLwJ//Aq9GLMumZcmvS33O+JtOw5isrV5VkdFN/OODnzb0AX6mTexi7Cg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@edx/frontend-component-header/-/frontend-component-header-4.0.0.tgz", + "integrity": "sha512-r/L3p2ZSI1DitjxVKAor18GmgJllafYslrdpzGI0vcX/gTemH13jf2Xr9iQqrT921DP2nzZ5GOwGJNptTSjiaA==", "requires": { - "@edx/paragon": "20.28.5", + "@edx/paragon": "20.30.1", "@fortawesome/fontawesome-svg-core": "6.3.0", "@fortawesome/free-brands-svg-icons": "6.3.0", "@fortawesome/free-regular-svg-icons": "6.3.0", @@ -22428,6 +22496,48 @@ "react-transition-group": "4.4.5" }, "dependencies": { + "@edx/paragon": { + "version": "20.30.1", + "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.30.1.tgz", + "integrity": "sha512-v3Ek8deZWqVKi3IWP08Mj4egrvbmbqQEyRA6+qazHZdgHJA4qOP1SST42UKd9XxPeRbLWUgaJWd0iBAOAna/gw==", + "requires": { + "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.1.18", + "@popperjs/core": "^2.11.4", + "bootstrap": "^4.6.2", + "classnames": "^2.3.1", + "email-prop-type": "^3.0.0", + "file-selector": "^0.6.0", + "font-awesome": "^4.7.0", + "glob": "^8.0.3", + "lodash.uniqby": "^4.7.0", + "mailto-link": "^2.0.0", + "prop-types": "^15.8.1", + "react-bootstrap": "^1.6.5", + "react-colorful": "^5.6.1", + "react-dropzone": "^14.2.1", + "react-focus-on": "^3.5.4", + "react-loading-skeleton": "^3.1.0", + "react-popper": "^2.2.5", + "react-proptype-conditional-require": "^1.0.4", + "react-responsive": "^8.2.0", + "react-table": "^7.7.0", + "react-transition-group": "^4.4.2", + "tabbable": "^5.3.3", + "uncontrollable": "^7.2.1", + "uuid": "^9.0.0" + }, + "dependencies": { + "@fortawesome/react-fontawesome": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", + "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "requires": { + "prop-types": "^15.8.1" + } + } + } + }, "@fortawesome/fontawesome-common-types": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz", @@ -22464,13 +22574,18 @@ "requires": { "@fortawesome/fontawesome-common-types": "6.3.0" } + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" } } }, "@edx/frontend-platform": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@edx/frontend-platform/-/frontend-platform-3.3.1.tgz", - "integrity": "sha512-EF2a5Ovzhu5URo7ER6Mc/K+l02UGuXpd2bQw+dW/xGe/hlv+1CDnrzDTqM8QEk+suZyQfI9U0fnsqwcwr0a2SA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@edx/frontend-platform/-/frontend-platform-4.2.0.tgz", + "integrity": "sha512-iDoFeccENQKBjqUgdjl5KSwBrjNEj8YW6Ual+6twcHHJUBg3yRoBEphwHIoRREcMgQjhdKVAdWj8eleh4JsEKA==", "requires": { "@cospired/i18n-iso-languages": "2.2.0", "@formatjs/intl-pluralrules": "4.3.3", @@ -22537,9 +22652,9 @@ } }, "@edx/paragon": { - "version": "20.28.5", - "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.28.5.tgz", - "integrity": "sha512-6cW9Pl1hojOGfGatLjeojzr0qNfil6rlwB3APKZlgomscDxVzYbaQYyZNOx/k2dFaO8EKCpiApXhHW+WihQipg==", + "version": "20.32.0", + "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.32.0.tgz", + "integrity": "sha512-d2rlYoWyRLvzPMo7MfCojqU/Qvk0cXnBpXW7aOOOQYhTvC3m3Y3yNWjQ8DJhbnWyL1tFEjZG2mjlgXHDHBqtLQ==", "requires": { "@fortawesome/fontawesome-svg-core": "^6.1.1", "@fortawesome/react-fontawesome": "^0.1.18", @@ -22554,6 +22669,7 @@ "mailto-link": "^2.0.0", "prop-types": "^15.8.1", "react-bootstrap": "^1.6.5", + "react-colorful": "^5.6.1", "react-dropzone": "^14.2.1", "react-focus-on": "^3.5.4", "react-loading-skeleton": "^3.1.0", @@ -32024,6 +32140,12 @@ "@babel/runtime": "^7.12.13" } }, + "react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "requires": {} + }, "react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", diff --git a/package.json b/package.json index 6773fb9..1614c0b 100644 --- a/package.json +++ b/package.json @@ -28,10 +28,10 @@ ], "dependencies": { "@edx/brand": "npm:@edx/brand-openedx@1.2.0", - "@edx/frontend-component-footer": "11.7.4", - "@edx/frontend-component-header": "3.6.5", - "@edx/frontend-platform": "3.3.1", - "@edx/paragon": "^20.20.0", + "@edx/frontend-component-footer": "12.0.0", + "@edx/frontend-component-header": "4.0.0", + "@edx/frontend-platform": "4.2.0", + "@edx/paragon": "^20.32.0", "@fortawesome/fontawesome-svg-core": "1.2.36", "@fortawesome/free-brands-svg-icons": "5.15.4", "@fortawesome/free-regular-svg-icons": "5.15.4", diff --git a/src/i18n/index.jsx b/src/i18n/index.js similarity index 76% rename from src/i18n/index.jsx rename to src/i18n/index.js index 0336b3a..e472eef 100644 --- a/src/i18n/index.jsx +++ b/src/i18n/index.js @@ -1,3 +1,6 @@ +import { messages as headerMessages } from '@edx/frontend-component-header'; +import { messages as footerMessages } from '@edx/frontend-component-footer'; + import arMessages from './messages/ar.json'; import frMessages from './messages/fr.json'; import es419Messages from './messages/es_419.json'; @@ -11,7 +14,7 @@ import hiMessages from './messages/hi.json'; import frCAMessages from './messages/fr_CA.json'; // no need to import en messages-- they are in the defaultMessage field -const messages = { +const appMessages = { ar: arMessages, 'es-419': es419Messages, fr: frMessages, @@ -25,4 +28,8 @@ const messages = { uk: ukMessages, }; -export default messages; +export default [ + headerMessages, + footerMessages, + appMessages, +]; diff --git a/src/index.jsx b/src/index.jsx index 680c0a0..1b5a8df 100755 --- a/src/index.jsx +++ b/src/index.jsx @@ -16,10 +16,10 @@ import { import React from 'react'; import ReactDOM from 'react-dom'; -import Header, { messages as headerMessages } from '@edx/frontend-component-header'; -import Footer, { messages as footerMessages } from '@edx/frontend-component-footer'; +import Header from '@edx/frontend-component-header'; +import Footer from '@edx/frontend-component-footer'; -import appMessages from './i18n'; +import messages from './i18n'; import configureStore from './data/configureStore'; import './index.scss'; @@ -46,11 +46,7 @@ subscribe(APP_INIT_ERROR, (error) => { }); initialize({ - messages: [ - appMessages, - headerMessages, - footerMessages, - ], + messages, hydrateAuthenticatedUser: true, handlers: { config: () => {