From 9c08e44d8c0046c35fd11126ea7c5c950bb469c2 Mon Sep 17 00:00:00 2001 From: "Kalle (Sendou)" <38327916+Sendouc@users.noreply.github.com> Date: Wed, 4 Nov 2020 03:09:57 +0200 Subject: [PATCH] lingui initial --- .babelrc | 14 + .gitignore | 4 + .prettierignore | 3 +- lib/i18n.ts | 16 + lingui.config.js | 14 + locale/en/messages.po | 74 ++ package-lock.json | 759 ++++++++++++++++++++- package.json | 13 +- pages/_app.tsx | 12 +- scenes/Layout/components/TopNav.tsx | 9 +- scenes/Profile/components/ProfileModal.tsx | 25 +- scenes/Profile/index.tsx | 5 +- 12 files changed, 902 insertions(+), 46 deletions(-) create mode 100644 .babelrc create mode 100644 lib/i18n.ts create mode 100644 lingui.config.js create mode 100644 locale/en/messages.po diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..24e92c958 --- /dev/null +++ b/.babelrc @@ -0,0 +1,14 @@ +{ + "presets": [ + [ + "next/babel", + { + "preset-env": {}, + "transform-runtime": {}, + "styled-jsx": {}, + "class-properties": {} + } + ] + ], + "plugins": ["macros"] +} diff --git a/.gitignore b/.gitignore index d9a2fc1a0..347248550 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,7 @@ prisma/.env # vercel .vercel + +# lingui +locale/_build/ +locale/**/*.js diff --git a/.prettierignore b/.prettierignore index 4cc976ccb..4a5b3b62a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ old .next -prisma/migrations \ No newline at end of file +prisma/migrations +locales/**/*.js \ No newline at end of file diff --git a/lib/i18n.ts b/lib/i18n.ts new file mode 100644 index 000000000..50ee9e472 --- /dev/null +++ b/lib/i18n.ts @@ -0,0 +1,16 @@ +import { i18n } from "@lingui/core"; +import { en } from "make-plural/plurals"; + +i18n.loadLocaleData("en", { plurals: en }); +//i18n.loadLocaleData("cs", { plurals: cs }); + +/** + * Load messages for requested locale and activate it. + * This function isn't part of the LinguiJS library because there're + * many ways how to load messages — from REST API, from file, from cache, etc. + */ +export async function activate(locale: string) { + const { messages } = await import(`locale/${locale}/messages.js`); + i18n.load(locale, messages); + i18n.activate(locale); +} diff --git a/lingui.config.js b/lingui.config.js new file mode 100644 index 000000000..35cc5168b --- /dev/null +++ b/lingui.config.js @@ -0,0 +1,14 @@ +module.exports = { + locales: ["en"], + sourceLocale: "en", + catalogs: [ + { + path: "/locale/{locale}/messages", + include: [ + "./pages/", + "./components/", + "./scenes/" + ], + }, + ], +} \ No newline at end of file diff --git a/locale/en/messages.po b/locale/en/messages.po new file mode 100644 index 000000000..009e06904 --- /dev/null +++ b/locale/en/messages.po @@ -0,0 +1,74 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2020-11-04 01:38+0200\n" +"Mime-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: scenes/Profile/components/ProfileModal.tsx:209 +msgid "Cancel" +msgstr "Cancel" + +#: scenes/Profile/components/ProfileModal.tsx:161 +msgid "Country" +msgstr "Country" + +#: scenes/Profile/components/ProfileModal.tsx:109 +msgid "Custom URL" +msgstr "Custom URL" + +#: scenes/Profile/index.tsx:17 +msgid "Edit profile" +msgstr "Edit profile" + +#: scenes/Profile/components/ProfileModal.tsx:102 +msgid "Editing profile" +msgstr "Editing profile" + +#: scenes/Layout/components/TopNav.tsx:19 +msgid "Log in via Discord" +msgstr "Log in via Discord" + +#: scenes/Layout/components/TopNav.tsx:36 +msgid "Log out" +msgstr "Log out" + +#: scenes/Profile/components/ProfileModal.tsx:194 +msgid "Motion sensitivity" +msgstr "Motion sensitivity" + +#: scenes/Layout/components/TopNav.tsx:32 +msgid "Profile" +msgstr "Profile" + +#: scenes/Profile/components/ProfileModal.tsx:206 +msgid "Save" +msgstr "Save" + +#: scenes/Profile/components/ProfileModal.tsx:184 +msgid "Stick sensitivity" +msgstr "Stick sensitivity" + +#: scenes/Profile/components/ProfileModal.tsx:137 +msgid "Twitch name" +msgstr "Twitch name" + +#: scenes/Profile/components/ProfileModal.tsx:123 +msgid "Twitter name" +msgstr "Twitter name" + +#: scenes/Profile/components/ProfileModal.tsx:172 +msgid "Weapon pool" +msgstr "Weapon pool" + +#: scenes/Profile/components/ProfileModal.tsx:151 +msgid "YouTube channel ID" +msgstr "YouTube channel ID" diff --git a/package-lock.json b/package-lock.json index a1567803a..5e96ef287 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@chakra-ui/core": "^1.0.0-rc.8", "@chakra-ui/theme-tools": "^1.0.0-rc.8", "@hookform/resolvers": "^1.0.0", + "@lingui/react": "^3.0.3", "@nexus/schema": "^0.17.0", "@prisma/client": "^2.10.1", "@sendou/react-sketch": "^0.5.2", @@ -39,6 +40,8 @@ "@graphql-codegen/typescript": "1.17.11", "@graphql-codegen/typescript-operations": "1.17.8", "@graphql-codegen/typescript-react-apollo": "2.0.7", + "@lingui/cli": "^3.0.3", + "@lingui/macro": "^3.0.3", "@prisma/cli": "^2.10.1", "@types/next-auth": "^3.1.14", "@types/node": "^14.14.6", @@ -3459,6 +3462,165 @@ "react-hook-form": ">=6.6.0" } }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@lingui/babel-plugin-extract-messages": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.0.3.tgz", + "integrity": "sha512-3RVx9qharfHGDrxyRMp0jWRG5vzYHyTYiamqFejcmDVCBDHOS1SqFkgyDayFZp3f4CnyRT9W+0ARAeTFjpfuaw==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.11.6", + "@babel/runtime": "^7.11.2", + "@lingui/conf": "3.0.3", + "mkdirp": "^1.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@lingui/cli": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.0.3.tgz", + "integrity": "sha512-LCjiLZz8ODB9cGARmxGrHDMe02GWdoHPlhcZjjQ1KFD5SWYsgJd4FkcRt5MIK+027vr6Iu5sjs/THht0NillLA==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.11.6", + "@babel/parser": "^7.11.5", + "@babel/plugin-syntax-jsx": "^7.10.4", + "@babel/runtime": "^7.11.2", + "@babel/types": "^7.11.5", + "@lingui/babel-plugin-extract-messages": "3.0.3", + "@lingui/conf": "3.0.3", + "babel-plugin-macros": "^2.8.0", + "bcp-47": "^1.0.7", + "chalk": "^4.1.0", + "cli-table": "^0.3.1", + "commander": "^6.1.0", + "date-fns": "^2.16.1", + "fs-extra": "^9.0.1", + "fuzzaldrin": "^2.1.0", + "glob": "^7.1.4", + "inquirer": "^7.3.3", + "make-plural": "^6.2.2", + "messageformat-parser": "^4.1.3", + "micromatch": "4.0.2", + "mkdirp": "^1.0.4", + "normalize-path": "^3.0.0", + "ora": "^5.1.0", + "papaparse": "^5.3.0", + "pofile": "^1.0.11", + "pseudolocale": "^1.1.0", + "ramda": "^0.27.1" + }, + "bin": { + "lingui": "lingui.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "babel-plugin-macros": "^2.4.2", + "typescript": "2 || 3 || 4" + } + }, + "node_modules/@lingui/cli/node_modules/commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@lingui/cli/node_modules/date-fns": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz", + "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==", + "dev": true, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/@lingui/conf": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.0.3.tgz", + "integrity": "sha512-LjpKne/DduH3Ovq+2K/u160LIM6eHVpWbufQYn9li6zM9RrRMkZ833Xsb2r5FrKN9uhtDYlrSZgOapLN3IC93Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.11.2", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "jest-validate": "^26.5.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@lingui/core": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.0.3.tgz", + "integrity": "sha512-lfDkhgChJ+6f+qlGFFJmHAF28ZZTc/dgxVcT4zpLx4Gqf0MsIsx701MBGLXI1X/Gn2PMkDnhZVP0XkpDma6fxQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "make-plural": "^6.2.2", + "messageformat-parser": "^4.1.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@lingui/macro": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.0.3.tgz", + "integrity": "sha512-nGvEo5hg+6kKAOAw72zu8xDhBbh0ujlJNOHXNmf3h9T0mI5BlHqcUOJH29meZgn4x19rFyiBJty19gcD4IHTHg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.11.2", + "@lingui/conf": "3.0.3", + "ramda": "^0.27.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "babel-plugin-macros": "^2.5.1" + } + }, + "node_modules/@lingui/react": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-3.0.3.tgz", + "integrity": "sha512-ws+g1ZG7QAmA/pUb3wrRtFbu665VbnGps3y7olQ7F+LqyeqiVpOBukRxiThBwc51apM5v9/zVbyrtjJtWsdRYg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@lingui/core": "3.0.3" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, "node_modules/@next/env": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@next/env/-/env-10.0.0.tgz", @@ -3605,13 +3767,13 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/@prisma/bar/-/bar-0.0.0.tgz", "integrity": "sha512-3nez9n/vMyAr4+nmqj6Xh3cGZbreYHr3RWX0vgtrFRpiN6otuCzL+9HW8MW/DfZNuFz5YyIdfwnRSPueUZPoWQ==", - "dev": true + "devOptional": true }, "node_modules/@prisma/cli": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/@prisma/cli/-/cli-2.10.1.tgz", "integrity": "sha512-I+51GBJyuGS5xsCl8pf4XfTt9HIdhCJQoaGCA9KLDzVRbFHElMQ++hhyhLohJ4buFZlSagIq8NI8yIC5yu+Wkg==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "dependencies": { "@prisma/bar": "^0.0.0", @@ -3649,7 +3811,7 @@ "version": "2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111.tgz", "integrity": "sha512-F/I8mmYMQnEFX47jl7Su8Pmvpua1wti9Uq3IUlSCqLQsrOmuMj+GKQ5nYEewmcynqBlyVcpUyxF5iAWbmUVdjw==", - "dev": true, + "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { @@ -3997,6 +4159,30 @@ "@types/node": "*" } }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/js-yaml": { "version": "3.12.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.5.tgz", @@ -4121,8 +4307,7 @@ "node_modules/@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", - "dev": true + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "node_modules/@types/qs": { "version": "6.9.5", @@ -4138,7 +4323,6 @@ "version": "16.9.55", "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.55.tgz", "integrity": "sha512-6KLe6lkILeRwyyy7yG9rULKJ0sXplUsl98MGoCfpteXf9sPWFWWMknDcsvubcpaTdBuxtsLF6HDUwdApZL/xIg==", - "dev": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4197,6 +4381,21 @@ "@types/node": "*" } }, + "node_modules/@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, "node_modules/@types/zen-observable": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.1.tgz", @@ -5296,6 +5495,21 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, + "node_modules/bcp-47": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz", + "integrity": "sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag==", + "dev": true, + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -5999,6 +6213,39 @@ "node": ">=6" } }, + "node_modules/cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-table/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/cli-table3": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", @@ -6095,6 +6342,15 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -6832,6 +7088,15 @@ "node": ">=4.0.0" } }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, "node_modules/defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -8219,6 +8484,12 @@ "node": ">=8" } }, + "node_modules/fuzzaldrin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fuzzaldrin/-/fuzzaldrin-2.1.0.tgz", + "integrity": "sha1-kCBMPi/appQbso0WZF1BgGOpDps=", + "dev": true + }, "node_modules/gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -9328,6 +9599,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-negative-zero": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", @@ -9521,6 +9801,53 @@ "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, "node_modules/jest-worker": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", @@ -10431,6 +10758,11 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "node_modules/make-plural": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz", + "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA==" + }, "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -10537,6 +10869,11 @@ "node": ">= 8" } }, + "node_modules/messageformat-parser": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.3.tgz", + "integrity": "sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg==" + }, "node_modules/micro": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/micro/-/micro-9.3.4.tgz", @@ -11645,6 +11982,28 @@ "@wry/context": "^0.5.2" } }, + "node_modules/ora": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", + "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -11765,6 +12124,12 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "node_modules/papaparse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.0.tgz", + "integrity": "sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg==", + "dev": true + }, "node_modules/parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", @@ -12068,6 +12433,12 @@ "node": ">=6" } }, + "node_modules/pofile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.0.tgz", + "integrity": "sha512-6XYcNkXWGiJ2CVXogTP7uJ6ZXQCldYLZc16wgRp8tqRaBTTyIfF+TUT3EQJPXTLAT7OTPpTAoaFdoXKfaTRU1w==", + "dev": true + }, "node_modules/popmotion": { "version": "9.0.0-rc.20", "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-9.0.0-rc.20.tgz", @@ -12419,6 +12790,15 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, + "node_modules/pseudolocale": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-1.1.0.tgz", + "integrity": "sha512-OZ8I/hwYEJ3beN3IEcNnt8EpcqblH0/x23hulKBXjs+WhTTEle+ijCHCkh2bd+cIIeCuCwSCbBe93IthGG6hLw==", + "dev": true, + "dependencies": { + "commander": "*" + } + }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -16171,6 +16551,15 @@ "node": ">=0.10.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/web-vitals": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz", @@ -18418,7 +18807,8 @@ "@chakra-ui/css-reset": { "version": "1.0.0-rc.8", "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-1.0.0-rc.8.tgz", - "integrity": "sha512-s/V28H0W324OYRL8yxpBT1u0rTe+D0R9AmmUjMDmUV+ETxZ77zQMa3DykutbD+Kem3fJv8bpgVuM/uB2utfXSw==" + "integrity": "sha512-s/V28H0W324OYRL8yxpBT1u0rTe+D0R9AmmUjMDmUV+ETxZ77zQMa3DykutbD+Kem3fJv8bpgVuM/uB2utfXSw==", + "requires": {} }, "@chakra-ui/descendant": { "version": "1.0.0-rc.8", @@ -19649,7 +20039,8 @@ "@graphql-typed-document-node/core": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz", - "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==" + "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==", + "requires": {} }, "@hapi/accept": { "version": "5.0.1", @@ -19676,7 +20067,124 @@ "@hookform/resolvers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-1.0.0.tgz", - "integrity": "sha512-YzBq6ZFw/uWGa3rXBNSHqnsE4hDXLrzdboDxPRKGjYHVzs1dBxjvELftP8iTmRPqP32VjnbVfUktX1CQ6Y7sog==" + "integrity": "sha512-YzBq6ZFw/uWGa3rXBNSHqnsE4hDXLrzdboDxPRKGjYHVzs1dBxjvELftP8iTmRPqP32VjnbVfUktX1CQ6Y7sog==", + "requires": {} + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@lingui/babel-plugin-extract-messages": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-3.0.3.tgz", + "integrity": "sha512-3RVx9qharfHGDrxyRMp0jWRG5vzYHyTYiamqFejcmDVCBDHOS1SqFkgyDayFZp3f4CnyRT9W+0ARAeTFjpfuaw==", + "dev": true, + "requires": { + "@babel/generator": "^7.11.6", + "@babel/runtime": "^7.11.2", + "@lingui/conf": "3.0.3", + "mkdirp": "^1.0.4" + } + }, + "@lingui/cli": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-3.0.3.tgz", + "integrity": "sha512-LCjiLZz8ODB9cGARmxGrHDMe02GWdoHPlhcZjjQ1KFD5SWYsgJd4FkcRt5MIK+027vr6Iu5sjs/THht0NillLA==", + "dev": true, + "requires": { + "@babel/generator": "^7.11.6", + "@babel/parser": "^7.11.5", + "@babel/plugin-syntax-jsx": "^7.10.4", + "@babel/runtime": "^7.11.2", + "@babel/types": "^7.11.5", + "@lingui/babel-plugin-extract-messages": "3.0.3", + "@lingui/conf": "3.0.3", + "babel-plugin-macros": "^2.8.0", + "bcp-47": "^1.0.7", + "chalk": "^4.1.0", + "cli-table": "^0.3.1", + "commander": "^6.1.0", + "date-fns": "^2.16.1", + "fs-extra": "^9.0.1", + "fuzzaldrin": "^2.1.0", + "glob": "^7.1.4", + "inquirer": "^7.3.3", + "make-plural": "^6.2.2", + "messageformat-parser": "^4.1.3", + "micromatch": "4.0.2", + "mkdirp": "^1.0.4", + "normalize-path": "^3.0.0", + "ora": "^5.1.0", + "papaparse": "^5.3.0", + "pofile": "^1.0.11", + "pseudolocale": "^1.1.0", + "ramda": "^0.27.1" + }, + "dependencies": { + "commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "dev": true + }, + "date-fns": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz", + "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==", + "dev": true + } + } + }, + "@lingui/conf": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-3.0.3.tgz", + "integrity": "sha512-LjpKne/DduH3Ovq+2K/u160LIM6eHVpWbufQYn9li6zM9RrRMkZ833Xsb2r5FrKN9uhtDYlrSZgOapLN3IC93Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "jest-validate": "^26.5.2" + } + }, + "@lingui/core": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-3.0.3.tgz", + "integrity": "sha512-lfDkhgChJ+6f+qlGFFJmHAF28ZZTc/dgxVcT4zpLx4Gqf0MsIsx701MBGLXI1X/Gn2PMkDnhZVP0XkpDma6fxQ==", + "requires": { + "@babel/runtime": "^7.11.2", + "make-plural": "^6.2.2", + "messageformat-parser": "^4.1.3" + } + }, + "@lingui/macro": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-3.0.3.tgz", + "integrity": "sha512-nGvEo5hg+6kKAOAw72zu8xDhBbh0ujlJNOHXNmf3h9T0mI5BlHqcUOJH29meZgn4x19rFyiBJty19gcD4IHTHg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "@lingui/conf": "3.0.3", + "ramda": "^0.27.1" + } + }, + "@lingui/react": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-3.0.3.tgz", + "integrity": "sha512-ws+g1ZG7QAmA/pUb3wrRtFbu665VbnGps3y7olQ7F+LqyeqiVpOBukRxiThBwc51apM5v9/zVbyrtjJtWsdRYg==", + "requires": { + "@babel/runtime": "^7.11.2", + "@lingui/core": "3.0.3" + } }, "@next/env": { "version": "10.0.0", @@ -19727,7 +20235,8 @@ "@next/react-refresh-utils": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-10.0.0.tgz", - "integrity": "sha512-V1/oiDWb2C1Do0eZONsKX1aqGNkqCUqxUahIiCjwKFu9c3bps+Ygg4JjtaCd9oycv0KzYImUZnU+nqveFUjxUw==" + "integrity": "sha512-V1/oiDWb2C1Do0eZONsKX1aqGNkqCUqxUahIiCjwKFu9c3bps+Ygg4JjtaCd9oycv0KzYImUZnU+nqveFUjxUw==", + "requires": {} }, "@nexus/schema": { "version": "0.17.0", @@ -19786,13 +20295,13 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/@prisma/bar/-/bar-0.0.0.tgz", "integrity": "sha512-3nez9n/vMyAr4+nmqj6Xh3cGZbreYHr3RWX0vgtrFRpiN6otuCzL+9HW8MW/DfZNuFz5YyIdfwnRSPueUZPoWQ==", - "dev": true + "devOptional": true }, "@prisma/cli": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/@prisma/cli/-/cli-2.10.1.tgz", "integrity": "sha512-I+51GBJyuGS5xsCl8pf4XfTt9HIdhCJQoaGCA9KLDzVRbFHElMQ++hhyhLohJ4buFZlSagIq8NI8yIC5yu+Wkg==", - "dev": true, + "devOptional": true, "requires": { "@prisma/bar": "^0.0.0", "@prisma/engines": "2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111" @@ -19810,7 +20319,7 @@ "version": "2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111.tgz", "integrity": "sha512-F/I8mmYMQnEFX47jl7Su8Pmvpua1wti9Uq3IUlSCqLQsrOmuMj+GKQ5nYEewmcynqBlyVcpUyxF5iAWbmUVdjw==", - "dev": true + "devOptional": true }, "@prisma/engines-version": { "version": "2.10.1-6-7d0087eadc7265e12d4b8d8c3516b02c4c965111", @@ -20122,6 +20631,30 @@ "@types/node": "*" } }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "@types/js-yaml": { "version": "3.12.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.5.tgz", @@ -20246,8 +20779,7 @@ "@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", - "dev": true + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/qs": { "version": "6.9.5", @@ -20263,7 +20795,6 @@ "version": "16.9.55", "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.55.tgz", "integrity": "sha512-6KLe6lkILeRwyyy7yG9rULKJ0sXplUsl98MGoCfpteXf9sPWFWWMknDcsvubcpaTdBuxtsLF6HDUwdApZL/xIg==", - "dev": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -20322,6 +20853,21 @@ "@types/node": "*" } }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, "@types/zen-observable": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.1.tgz", @@ -20572,12 +21118,14 @@ "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "requires": {} }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "ally.js": { "version": "1.4.1", @@ -20745,7 +21293,8 @@ "apollo-server-errors": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz", - "integrity": "sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ==" + "integrity": "sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ==", + "requires": {} }, "apollo-server-micro": { "version": "2.19.0", @@ -21222,6 +21771,17 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, + "bcp-47": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz", + "integrity": "sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag==", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -21788,6 +22348,29 @@ } } }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, "cli-table3": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", @@ -21862,6 +22445,12 @@ "wrap-ansi": "^7.0.0" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -22494,6 +23083,15 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "devOptional": true }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -23650,6 +24248,12 @@ "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.3.2.tgz", "integrity": "sha512-3EVi3ETTyJg5PSXlxLCaUVVn0pSbDf62L3Gwxne7Uq+d8adOSNWQAad4gg7WToHkcgnCJb3Wlb1P8r4Evj4GPw==" }, + "fuzzaldrin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fuzzaldrin/-/fuzzaldrin-2.1.0.tgz", + "integrity": "sha1-kCBMPi/appQbso0WZF1BgGOpDps=", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -23897,7 +24501,8 @@ "graphql-tag": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.11.0.tgz", - "integrity": "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==" + "integrity": "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==", + "requires": {} }, "graphql-tools": { "version": "4.0.8", @@ -24495,6 +25100,12 @@ "is-path-inside": "^3.0.1" } }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, "is-negative-zero": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", @@ -24639,6 +25250,46 @@ "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + } + } + }, "jest-worker": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", @@ -25363,6 +26014,11 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "make-plural": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz", + "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA==" + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -25454,6 +26110,11 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "messageformat-parser": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.3.tgz", + "integrity": "sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg==" + }, "micro": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/micro/-/micro-9.3.4.tgz", @@ -25962,7 +26623,8 @@ "next-google-fonts": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/next-google-fonts/-/next-google-fonts-1.2.1.tgz", - "integrity": "sha512-BhVSldP1oZBTwXeJdMtjmu2qbDT1EkbQO2rG83Oj6APYm6aUsIcMu00Pzkzd8TTkrQW9HyC08Pzr10PY4pE6jA==" + "integrity": "sha512-BhVSldP1oZBTwXeJdMtjmu2qbDT1EkbQO2rG83Oj6APYm6aUsIcMu00Pzkzd8TTkrQW9HyC08Pzr10PY4pE6jA==", + "requires": {} }, "next-images": { "version": "1.6.2", @@ -26342,6 +27004,22 @@ "@wry/context": "^0.5.2" } }, + "ora": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", + "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -26433,6 +27111,12 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "papaparse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.0.tgz", + "integrity": "sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg==", + "dev": true + }, "parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", @@ -26677,6 +27361,12 @@ "ts-pnp": "^1.1.6" } }, + "pofile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.0.tgz", + "integrity": "sha512-6XYcNkXWGiJ2CVXogTP7uJ6ZXQCldYLZc16wgRp8tqRaBTTyIfF+TUT3EQJPXTLAT7OTPpTAoaFdoXKfaTRU1w==", + "dev": true + }, "popmotion": { "version": "9.0.0-rc.20", "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-9.0.0-rc.20.tgz", @@ -26951,6 +27641,15 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, + "pseudolocale": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-1.1.0.tgz", + "integrity": "sha512-OZ8I/hwYEJ3beN3IEcNnt8EpcqblH0/x23hulKBXjs+WhTTEle+ijCHCkh2bd+cIIeCuCwSCbBe93IthGG6hLw==", + "dev": true, + "requires": { + "commander": "*" + } + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -27163,7 +27862,8 @@ "react-hook-form": { "version": "6.9.6", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-6.9.6.tgz", - "integrity": "sha512-TyLqWHgFS1WLELDuUBvMWLHEzmR7aS7xOY+eOxMtS1w4jFhqF1xmHnMhJsbiFPSgC+OeTJ1Pc0U4K0y6cA7ERA==" + "integrity": "sha512-TyLqWHgFS1WLELDuUBvMWLHEzmR7aS7xOY+eOxMtS1w4jFhqF1xmHnMhJsbiFPSgC+OeTJ1Pc0U4K0y6cA7ERA==", + "requires": {} }, "react-hotkeys-hook": { "version": "2.4.0", @@ -28540,7 +29240,8 @@ "stylis-rule-sheet": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", + "requires": {} }, "subscriptions-transport-ws": { "version": "0.9.18", @@ -29453,7 +30154,8 @@ "use-callback-ref": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.4.tgz", - "integrity": "sha512-rXpsyvOnqdScyied4Uglsp14qzag1JIemLeTWGKbwpotWht57hbP78aNT+Q4wdFKQfQibbUX4fb6Qb4y11aVOQ==" + "integrity": "sha512-rXpsyvOnqdScyied4Uglsp14qzag1JIemLeTWGKbwpotWht57hbP78aNT+Q4wdFKQfQibbUX4fb6Qb4y11aVOQ==", + "requires": {} }, "use-sidecar": { "version": "1.0.3", @@ -29897,6 +30599,15 @@ } } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "web-vitals": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz", diff --git a/package.json b/package.json index 78da7e384..d8558933c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "next dev", - "build": "next build", + "build": "lingui compile && next build", "start": "next start", "migrate:save": "npx prisma migrate save --name init --experimental", "migrate:up": "npx prisma migrate up --experimental", @@ -13,13 +13,17 @@ "gen": "graphql-codegen --config codegen.yml", "seed": "ts-node prisma/seed.ts", "prettier": "prettier --write .", - "e2e": "cypress open" + "e2e": "cypress open", + "add-locale": "lingui add-locale", + "extract": "lingui extract", + "compile": "lingui compile" }, "dependencies": { "@apollo/client": "^3.2.5", "@chakra-ui/core": "^1.0.0-rc.8", "@chakra-ui/theme-tools": "^1.0.0-rc.8", "@hookform/resolvers": "^1.0.0", + "@lingui/react": "^3.0.3", "@nexus/schema": "^0.17.0", "@prisma/client": "^2.10.1", "@sendou/react-sketch": "^0.5.2", @@ -47,6 +51,8 @@ "@graphql-codegen/typescript": "1.17.11", "@graphql-codegen/typescript-operations": "1.17.8", "@graphql-codegen/typescript-react-apollo": "2.0.7", + "@lingui/cli": "^3.0.3", + "@lingui/macro": "^3.0.3", "@prisma/cli": "^2.10.1", "@types/next-auth": "^3.1.14", "@types/node": "^14.14.6", @@ -55,5 +61,6 @@ "prettier": "^2.1.2", "ts-node": "^9.0.0", "typescript": "^4.0.5" - } + }, + "license": "MIT" } diff --git a/pages/_app.tsx b/pages/_app.tsx index 91c36cc76..129ef5b49 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,10 +1,14 @@ import { ApolloProvider } from "@apollo/client"; import { ChakraProvider, extendTheme } from "@chakra-ui/core"; import { mode } from "@chakra-ui/theme-tools"; +import { i18n } from "@lingui/core"; +import { I18nProvider } from "@lingui/react"; import { useApollo } from "lib/apollo"; +import { activate } from "lib/i18n"; import { Provider as NextAuthProvider } from "next-auth/client"; import GoogleFonts from "next-google-fonts"; import type { AppProps } from "next/app"; +import { useEffect } from "react"; import Layout from "scenes/Layout"; import { theme } from "theme"; @@ -82,6 +86,10 @@ const extendedTheme = extendTheme({ const MyApp = (props: AppProps) => { const apolloClient = useApollo(props.pageProps.initialApolloState); + useEffect(() => { + activate("en"); + }, []); + return ( <> { - + + + diff --git a/scenes/Layout/components/TopNav.tsx b/scenes/Layout/components/TopNav.tsx index de017aa9b..8504e62ba 100644 --- a/scenes/Layout/components/TopNav.tsx +++ b/scenes/Layout/components/TopNav.tsx @@ -12,6 +12,7 @@ import { MenuList, useColorMode, } from "@chakra-ui/core"; +import { Trans } from "@lingui/macro"; import { DiscordIcon } from "assets/icons"; import { useTranslation } from "lib/useMockT"; import useUser from "lib/useUser"; @@ -37,7 +38,7 @@ const TopNav = () => { variant="ghost" size="sm" > - {t("navigation;Log in via Discord")} + Log in via Discord ); } @@ -60,10 +61,12 @@ const TopNav = () => { - {t("navigation;Profile")} + + Profile + signOut()}> - {t("navigation;Log out")} + Log out diff --git a/scenes/Profile/components/ProfileModal.tsx b/scenes/Profile/components/ProfileModal.tsx index 23055f88c..4a210e861 100644 --- a/scenes/Profile/components/ProfileModal.tsx +++ b/scenes/Profile/components/ProfileModal.tsx @@ -18,6 +18,7 @@ import { useToast, } from "@chakra-ui/core"; import { zodResolver } from "@hookform/resolvers/zod"; +import { Trans } from "@lingui/macro"; import { countries } from "countries-list"; import { GetUserByIdentifierDocument, @@ -158,13 +159,15 @@ const ProfileModal: React.FC = ({ - {t("users;Editing profile")} + + Editing profile +
- {t("users;Custom URL")} + Custom URL @@ -188,7 +191,7 @@ const ProfileModal: React.FC = ({ mb={1} color="#1DA1F2" />{" "} - {t("users;Twitter name")} + Twitter name @@ -212,7 +215,7 @@ const ProfileModal: React.FC = ({ mb={1} color="#6441A4" /> - {t("users;Twitch name")} + Twitch name @@ -236,7 +239,7 @@ const ProfileModal: React.FC = ({ mb={1} color="#FF0000" /> - {t("users;YouTube channel ID")} + YouTube channel ID @@ -250,7 +253,7 @@ const ProfileModal: React.FC = ({ - {t("users;Country")} + Country {/* FIXME: placeholders for dropdowns */} {sensOptions.map((sens) => ( @@ -300,7 +303,7 @@ const ProfileModal: React.FC = ({ - {t("users;Motion sensitivity")} + Motion sensitivity