From 625b5a9b94eec36ba2b995ebf0745daf7231d94e Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Fri, 10 May 2019 01:53:28 +0300 Subject: [PATCH] Implemented font image renderer --- package.json | 12 +- scripts/i18n-collect.mjs | 191 ------------- scripts/i18n-collect/index.js | 57 ++++ scripts/i18n-collect/package.json | 9 + scripts/package.json | 18 -- src/App.js | 4 +- src/components/blocks/code/messages.intl.json | 2 +- src/components/layout/footer/Footer.js | 7 +- src/components/layout/footer/images/logo.png | Bin 0 -> 7664 bytes .../layout/footer/messages.intl.json | 9 +- src/components/layout/footer/styles.js | 4 +- src/components/text/BitmapText.js | 73 ----- src/components/text/index.js | 1 - src/emails/forgotPassword/ForgotPassword.js | 7 +- src/emails/forgotPassword/messages.intl.json | 16 +- src/emails/register/Register.js | 17 +- src/emails/register/messages.intl.json | 48 +++- src/i18n/be.json | 6 +- src/i18n/el.json | 6 +- src/i18n/en.json | 6 +- src/i18n/fil.json | 6 +- src/i18n/fr.json | 6 +- src/i18n/id.json | 6 +- src/i18n/lt.json | 6 +- src/i18n/pl.json | 6 +- src/i18n/pt.json | 6 +- src/i18n/ro.json | 6 +- src/i18n/ru.json | 6 +- src/i18n/sl.json | 6 +- src/i18n/uk.json | 6 +- src/i18n/vi.json | 6 +- .../RobotoCondensed-Regular.ttf | Bin 0 -> 169544 bytes .../extended-translations-loader/index.js | 120 ++++++++ .../extended-translations-loader/package.json | 13 + webpack-utils/image-size-loader/index.js | 108 ++++++++ webpack-utils/image-size-loader/options.json | 19 ++ webpack-utils/image-size-loader/package.json | 13 + webpack-utils/intl-json-loader/index.js | 19 +- webpack-utils/text2png-loader/index.js | 16 ++ webpack-utils/text2png-loader/package.json | 9 + webpack.config.js | 23 +- yarn.lock | 260 +++++++----------- 42 files changed, 628 insertions(+), 531 deletions(-) delete mode 100644 scripts/i18n-collect.mjs create mode 100755 scripts/i18n-collect/index.js create mode 100644 scripts/i18n-collect/package.json delete mode 100644 scripts/package.json create mode 100644 src/components/layout/footer/images/logo.png delete mode 100644 src/components/text/BitmapText.js delete mode 100644 src/components/text/index.js create mode 100644 webpack-utils/extended-translations-loader/RobotoCondensed-Regular.ttf create mode 100644 webpack-utils/extended-translations-loader/index.js create mode 100644 webpack-utils/extended-translations-loader/package.json create mode 100644 webpack-utils/image-size-loader/index.js create mode 100644 webpack-utils/image-size-loader/options.json create mode 100644 webpack-utils/image-size-loader/package.json create mode 100644 webpack-utils/text2png-loader/index.js create mode 100644 webpack-utils/text2png-loader/package.json diff --git a/package.json b/package.json index 742c441..368f72b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "scripts": { "start": "webpack-dev-server --mode=development --progress --colors", "lint": "eslint ./src", - "i18n:collect": "node --experimental-modules ./scripts/i18n-collect.mjs", + "i18n:collect": "./scripts/i18n-collect/index.js", "build": "rm -rf dist/ && webpack --mode=production --progress --colors", "i18n:pull": "cd ./scripts && ../node_modules/.bin/babel-node --presets es2015,stage-0 i18n-onesky.js pull" }, @@ -32,20 +32,24 @@ "@babel/plugin-proposal-export-default-from": "^7.2.0", "@babel/preset-env": "^7.3.4", "@babel/preset-react": "^7.0.0", - "@eoleo/image-size-loader": "^1.0.0", "babel-eslint": "^6.0.0", "babel-loader": "^8.0.5", - "babel-plugin-react-intl": "^3.0.1", "babel-preset-react-hot": "^1.0.5", "eslint": "^3.1.1", "eslint-plugin-react": "^6.0.0", + "extended-translations-loader": "file:webpack-utils/extended-translations-loader", "file-loader": "^3.0.1", "html-webpack-plugin": "^3.2.0", + "i18n-collect": "file:scripts/i18n-collect", "intl-json-loader": "file:./webpack-utils/intl-json-loader", + "json-loader": "^0.5.7", "prop-types": "^15.7.2", - "scripts": "file:scripts", + "text2png-loader": "file:./webpack-utils/text2png-loader", "webpack": "^4.29.6", "webpack-cli": "^3.3.0", "webpack-dev-server": "^3.2.1" + }, + "engines": { + "node": ">=7.6.0" } } diff --git a/scripts/i18n-collect.mjs b/scripts/i18n-collect.mjs deleted file mode 100644 index c8359d6..0000000 --- a/scripts/i18n-collect.mjs +++ /dev/null @@ -1,191 +0,0 @@ -/* eslint-env node */ -/* eslint-disable no-console */ -import fs from 'fs'; -import path from 'path'; -import glob from 'glob'; -import mkdirp from 'mkdirp'; -import chalk from 'chalk'; -import prompt from 'prompt'; - -// https://stackoverflow.com/a/50052194/5184751 -const __dirname = path.dirname(new URL(import.meta.url).pathname); // eslint-disable-line - -const MESSAGES_PATTERN = path.resolve(__dirname, '../dist/messages/**/*.json'); -const LANG_DIR = path.resolve(__dirname, '../src/i18n'); -const DEFAULT_LOCALE = 'en'; -const SUPPORTED_LANGS = Object.keys(JSON.parse(fs.readFileSync(path.join(LANG_DIR, 'index.json')))); - -/** - * Aggregates the default messages that were extracted from the app's - * React components via the React Intl Babel plugin. An error will be thrown if - * there are messages in different components that use the same `id`. The result - * is a flat collection of `id: message` pairs for the app's default locale. - */ -let idToFileMap = {}; -let duplicateIds = []; -const collectedMessages = glob.sync(MESSAGES_PATTERN) - .map((filename) => [filename, JSON.parse(fs.readFileSync(filename, 'utf8'))]) - .reduce((collection, [file, descriptors]) => { - descriptors.forEach(({id, defaultMessage}) => { - if (collection.hasOwnProperty(id)) { - duplicateIds.push(id); - } - - collection[id] = defaultMessage; - idToFileMap[id] = (idToFileMap[id] || []).concat(file); - }); - - return collection; - }, {}); - -if (duplicateIds.length) { - console.log('\nFound duplicated ids:'); - duplicateIds.forEach((id) => console.log(`${chalk.yellow(id)}:\n - ${idToFileMap[id].join('\n - ')}\n`)); - console.log(chalk.red('Please correct the errors above to proceed further!')); - - process.exit(0); -} - -duplicateIds = null; -idToFileMap = null; - -/** - * Making a diff with the previous DEFAULT_LOCALE version - */ -const defaultMessagesPath = `${LANG_DIR}/${DEFAULT_LOCALE}.json`; -let keysToUpdate = []; -let keysToAdd = []; -let keysToRemove = []; -const keysToRename = []; -const isNotMarked = (value) => value.slice(0, 2) !== '--'; - -const prevMessages = readJSON(defaultMessagesPath); -const prevMessagesMap = Object.entries(prevMessages).reduce((acc, [key, value]) => { - if (acc[value]) { - acc[value].push(key); - } else { - acc[value] = [key]; - } - - return acc; -}, {}); -keysToAdd = Object.keys(collectedMessages).filter((key) => !prevMessages[key]); -keysToRemove = Object.keys(prevMessages).filter((key) => !collectedMessages[key]).filter(isNotMarked); -keysToUpdate = Object.entries(prevMessages).reduce((acc, [key, message]) => - acc.concat(collectedMessages[key] && collectedMessages[key] !== message ? key : []) -, []); - -// detect keys to rename, mutating keysToAdd and keysToRemove -[].concat(keysToAdd).forEach((toKey) => { - const keys = prevMessagesMap[collectedMessages[toKey]] || []; - const fromKey = keys.find((fromKey) => keysToRemove.indexOf(fromKey) > -1); - - if (fromKey) { - keysToRename.push([fromKey, toKey]); - - keysToRemove.splice(keysToRemove.indexOf(fromKey), 1); - keysToAdd.splice(keysToAdd.indexOf(toKey), 1); - } -}); - -if (!keysToAdd.length && !keysToRemove.length && !keysToUpdate.length && !keysToRename.length) { - console.log(chalk.green('Everything is up to date!')); - process.exit(); -} - -console.log(chalk.magenta(`The diff relative to default locale (${DEFAULT_LOCALE}) is:`)); - -if (keysToRemove.length) { - console.log('The following keys will be removed:'); - console.log([chalk.red('\n - '), keysToRemove.join(chalk.red('\n - ')), '\n'].join('')); -} - -if (keysToAdd.length) { - console.log('The following keys will be added:'); - console.log([chalk.green('\n + '), keysToAdd.join(chalk.green('\n + ')), '\n'].join('')); -} - -if (keysToUpdate.length) { - console.log('The following keys will be updated:'); - console.log([chalk.yellow('\n @ '), keysToUpdate.join(chalk.yellow('\n @ ')), '\n'].join('')); -} - -if (keysToRename.length) { - console.log('The following keys will be renamed:\n'); - console.log(keysToRename.reduce((str, pair) => - [str, pair[0], chalk.yellow(' -> '), pair[1], '\n'].join('') - , '')); -} - -prompt.start(); -prompt.get({ - properties: { - apply: { - description: 'Apply changes? [Y/n]', - pattern: /^y|n$/i, - message: 'Please enter "y" or "n"', - default: 'y', - before: (value) => value.toLowerCase() === 'y' - } - } -}, (err, resp) => { - console.log('\n'); - - if (err || !resp.apply) { - return console.log(chalk.red('Aborted')); - } - - buildLocales(); - - console.log(chalk.green('All locales was successfuly built')); -}); - - -function buildLocales() { - mkdirp.sync(LANG_DIR); - - SUPPORTED_LANGS.map((lang) => { - const destPath = `${LANG_DIR}/${lang}.json`; - const newMessages = readJSON(destPath); - - keysToRename.forEach(([fromKey, toKey]) => { - newMessages[toKey] = newMessages[fromKey]; - delete newMessages[fromKey]; - }); - keysToRemove.forEach((key) => { - delete newMessages[key]; - }); - keysToUpdate.forEach((key) => { - newMessages[`--${key}`] = newMessages[key]; - newMessages[key] = collectedMessages[key]; - }); - keysToAdd.forEach((key) => { - newMessages[key] = collectedMessages[key]; - }); - - const sortedKeys = Object.keys(newMessages).sort((key1, key2) => { - key1 = key1.replace(/^\-+/, ''); - key2 = key2.replace(/^\-+/, ''); - - return key1 < key2 || !isNotMarked(key1) ? -1 : 1; - }); - - const sortedNewMessages = sortedKeys.reduce((acc, key) => { - acc[key] = newMessages[key]; - - return acc; - }, {}); - - fs.writeFileSync(destPath, JSON.stringify(sortedNewMessages, null, 4) + '\n'); - }); -} - -function readJSON(destPath) { - try { - return JSON.parse(fs.readFileSync(destPath, 'utf8')); - } catch (err) { - console.log(chalk.yellow(`Can not read ${destPath}. The new file will be created.`), `(${err.message})`); - } - - return {}; -} diff --git a/scripts/i18n-collect/index.js b/scripts/i18n-collect/index.js new file mode 100755 index 0000000..1d0301c --- /dev/null +++ b/scripts/i18n-collect/index.js @@ -0,0 +1,57 @@ +#!/usr/bin/env node + +/* eslint-env node */ +/* eslint-disable no-console */ + +const os = require('os'); +const fs = require('fs'); +const path = require('path'); +const glob = require('glob'); +const sortKeys = require('sort-keys'); + +const DEFAULT_LOCALE = 'en'; +const INDEX_FILE_NAME = 'index'; + +const ROOT_PATH = path.resolve(__dirname, '../../src'); +const LANG_DIR = path.join(ROOT_PATH, 'i18n'); +const MESSAGES_PATTERN = path.join(ROOT_PATH, '**/*.intl.json'); +const TARGET_FILE = path.join(LANG_DIR, `${DEFAULT_LOCALE}.json`); + +const messages = glob.sync(MESSAGES_PATTERN) + .map((filename) => [filename, JSON.parse(fs.readFileSync(filename, 'utf8'))]) + .reduce((collection, [filename, descriptors]) => { + const prefix = path.dirname(filename) + .replace(ROOT_PATH, '') + .replace(/^\/|\/$/g, '') + .replace(/\//g, '.'); + for (const id in descriptors) { + // noinspection JSUnfilteredForInLoop + const key = `${prefix}.${id}`; + // noinspection JSUnfilteredForInLoop + const descriptor = descriptors[id]; + if (typeof descriptor === 'object') { + const { defaultMessage } = descriptor; + collection[key] = defaultMessage; + } else { + collection[key] = descriptor; + } + } + + return collection; + }, {}); + +fs.writeFileSync(TARGET_FILE, JSON.stringify(sortKeys(messages), null, 4) + os.EOL); +const messagesIds = Object.keys(messages); +glob.sync(path.join(LANG_DIR, `!(${DEFAULT_LOCALE}|${INDEX_FILE_NAME}).json`)) + .map((filename) => [filename, JSON.parse(fs.readFileSync(filename, 'utf8'))]) + .forEach(([filename, translatedMessages]) => { + const translatedMessagesIds = Object.keys(translatedMessages); + messagesIds.filter((id) => !translatedMessagesIds.includes(id)).forEach((newKey) => { + translatedMessages[newKey] = messages[newKey]; + }); + translatedMessagesIds.filter((id) => !messagesIds.includes(id)).forEach((removedKey) => { + Reflect.deleteProperty(translatedMessages, removedKey); + }); + + fs.writeFileSync(filename, JSON.stringify(sortKeys(translatedMessages), null, 4) + os.EOL); + }); diff --git a/scripts/i18n-collect/package.json b/scripts/i18n-collect/package.json new file mode 100644 index 0000000..e501d71 --- /dev/null +++ b/scripts/i18n-collect/package.json @@ -0,0 +1,9 @@ +{ + "name": "i18n-collect", + "version": "1.0.0", + "main": "index.js", + "dependencies": { + "glob": "^7.1.3", + "sort-keys": "^3.0.0" + } +} diff --git a/scripts/package.json b/scripts/package.json deleted file mode 100644 index 9fa1d3b..0000000 --- a/scripts/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "scripts", - "version": "1.0.0", - "description": "", - "main": "i18n-build.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "chalk": "^1.1.3", - "glob": "^7.1.3", - "mkdirp": "^0.5.1", - "prompt": "^1.0.0" - } -} diff --git a/src/App.js b/src/App.js index 74e00b7..ac9671b 100644 --- a/src/App.js +++ b/src/App.js @@ -44,8 +44,8 @@ export default function App({type, payload = {}}) { locale = DEFAULT_LANGUAGE; } - const messages = require(`i18n/${locale}.json`); - const Email = require(`emails/${type}/index`).default; + const { default: messages } = require(`!extended-translations-loader!i18n/${locale}.json`); + const { default: Email } = require(`emails/${type}/index`); return ( diff --git a/src/components/blocks/code/messages.intl.json b/src/components/blocks/code/messages.intl.json index 30adb83..69cfd5d 100644 --- a/src/components/blocks/code/messages.intl.json +++ b/src/components/blocks/code/messages.intl.json @@ -1,4 +1,4 @@ { "or": "or", - "pass_code_in_field": "Use this code in an entry field of our site:" + "pass_code_in_field": "Insert this code into form field of our site:" } diff --git a/src/components/layout/footer/Footer.js b/src/components/layout/footer/Footer.js index 256b9f1..6040ba7 100644 --- a/src/components/layout/footer/Footer.js +++ b/src/components/layout/footer/Footer.js @@ -1,11 +1,11 @@ import React from 'react'; -import { FormattedMessage as Message } from 'react-intl'; +import { FormattedMessage as Message, FormattedHTMLMessage as HTMLMessage } from 'react-intl'; import { Table } from 'components/table'; -import { BitmapText } from 'components/text'; import styles from './styles'; import messages from './messages.intl.json'; +import logoImg from './images/logo.png'; export default function Footer() { return ( @@ -21,7 +21,8 @@ export default function Footer() { - + Ely.by + diff --git a/src/components/layout/footer/images/logo.png b/src/components/layout/footer/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6db068f82b175e31359b1800b0c82e009e7b07fe GIT binary patch literal 7664 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 => - {message} - } - ); -} - -BitmapText.propTypes = { - message: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.shape({ - id: PropTypes.string - }) - ]).isRequired, - style: PropTypes.object, // eslint-disable-line react/forbid-prop-types - retina: PropTypes.bool -}; - -BitmapText.defaultProps = { - retina: true, - style: { - verticalAlign: 'middle' - } -}; - -import { injectIntl, intlShape } from 'react-intl'; - -BitmapText.propTypes.intl = intlShape; - -export default injectIntl(BitmapText); diff --git a/src/components/text/index.js b/src/components/text/index.js deleted file mode 100644 index 0a8572b..0000000 --- a/src/components/text/index.js +++ /dev/null @@ -1 +0,0 @@ -export BitmapText from './BitmapText'; diff --git a/src/emails/forgotPassword/ForgotPassword.js b/src/emails/forgotPassword/ForgotPassword.js index aea87cf..e4532e8 100644 --- a/src/emails/forgotPassword/ForgotPassword.js +++ b/src/emails/forgotPassword/ForgotPassword.js @@ -1,11 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage as Message } from 'react-intl'; +import { FormattedMessage as Message, FormattedHTMLMessage as HTMLMessage } from 'react-intl'; import { Userbar, Header, Content, Footer } from 'components/layout'; import { Table } from 'components/table'; import { Code } from 'components/blocks'; -import { BitmapText } from 'components/text'; import { lightViolet } from 'components/ui/colors'; import styles from './styles'; @@ -17,7 +16,7 @@ export default function ForgotPassword({username, link, code}) {
+ } /> @@ -32,7 +31,7 @@ export default function ForgotPassword({username, link, code}) { + } /> diff --git a/src/emails/forgotPassword/messages.intl.json b/src/emails/forgotPassword/messages.intl.json index 8070325..1c239af 100644 --- a/src/emails/forgotPassword/messages.intl.json +++ b/src/emails/forgotPassword/messages.intl.json @@ -1,5 +1,15 @@ { - "forgot_the_password_image": "Forgot the password?", - "shit_happens": "Oops, this happens. If you wish to continue changing the password, you should enter the following code on the website. If you didn't start this process, just delete this email to be sure – this code may be used to steal your password.", - "continue_image": "Continue" + "forgot_the_password_image": { + "type": "text2png", + "defaultMessage": "Forgot the password?", + "size": 32, + "color": "#fff" + }, + "shit_happens": "Oops, this happens. If you wish to continue changing the password, you should enter the following code on the website. If you haven't requested password recovery, just ignore this email. Without this code no-one will be able to steal your password.", + "continue_image": { + "type": "text2png", + "defaultMessage": "Continue", + "size": 18, + "color": "#fff" + } } diff --git a/src/emails/register/Register.js b/src/emails/register/Register.js index 8041fb7..a6100f1 100644 --- a/src/emails/register/Register.js +++ b/src/emails/register/Register.js @@ -1,11 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage as Message } from 'react-intl'; +import { FormattedMessage as Message, FormattedHTMLMessage as HTMLMessage } from 'react-intl'; import { Userbar, Header, Content, Footer } from 'components/layout'; import { Table } from 'components/table'; import { blue } from 'components/ui/colors'; -import { BitmapText } from 'components/text'; import { Code } from 'components/blocks'; import styles from './styles'; @@ -21,7 +20,7 @@ export default function Register({username, link, code}) {
+ } /> @@ -36,7 +35,7 @@ export default function Register({username, link, code}) { + } /> @@ -45,7 +44,7 @@ export default function Register({username, link, code}) { ...styles.contentCenterCell, ...styles.whatsNextText }}> - + @@ -59,7 +58,7 @@ export default function Register({username, link, code}) { }} /> - +
- +
- +
- +
diff --git a/src/emails/register/messages.intl.json b/src/emails/register/messages.intl.json index 44e39d2..8cadf52 100644 --- a/src/emails/register/messages.intl.json +++ b/src/emails/register/messages.intl.json @@ -1,12 +1,42 @@ { - "welcome_image": "Welcome to Ely.by", - "we_glad_to_see_you": "We glad to see you among the users of Ely.by. You almost reached the final point, it remains only to confirm your E-mail address.For doing it, please push a button under the text.", - "confirm_email_image": "Confirm E‑mail", - "whats_next_image": "What's the next?", - "choose_you_skin_image": "Choose your skin", + "welcome_image": { + "type": "text2png", + "defaultMessage": "Welcome to Ely.by", + "size": 32, + "color": "#fff" + }, + "we_glad_to_see_you": "We glad to see you among the users of Ely.by. You almost reached the final point, it remains only to confirm your E-mail address. Please push the button bellow to continue.", + "confirm_email_image": { + "type": "text2png", + "defaultMessage": "Confirm E‑mail", + "size": 18, + "color": "#fff" + }, + "whats_next_image": { + "type": "text2png", + "defaultMessage": "What's the next?", + "size": 32, + "color": "#444" + }, + "choose_you_skin_image": { + "type": "text2png", + "defaultMessage": "Choose your skin", + "size": 24, + "color": "#6b5a8d" + }, "choose_you_skin_text": "In Ely.by's catalog you can find great diversity of skins, which are ready to be put up.", - "install_our_patch_image": "Install our patch in the game", - "install_our_patch_text": "You should install our patch to make the Ely.by's skin system working. You can find it at 'Load' section.", - "use_tlauncher_image": "Use TLauncher", - "use_tlauncher_text": "It is much easier, when you use right tool for right purpose. TLauncher is one of the best alternative launchers for the Minecraft, that also has installed Ely.by's support system." + "install_our_patch_image": { + "type": "text2png", + "defaultMessage": "Install our patch in the game", + "size": 24, + "color": "#df864a" + }, + "install_our_patch_text": "You should install our patch to make the Ely.by's skin system working. You can find it in 'Load' section on our site.", + "useTLLauncher": { + "type": "text2png", + "defaultMessage": "Use TL launcher", + "size": 24, + "color": "#28555b" + }, + "useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support." } diff --git a/src/i18n/be.json b/src/i18n/be.json index 61e0ac7..595d59a 100644 --- a/src/i18n/be.json +++ b/src/i18n/be.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "ці", "components.blocks.code.pass_code_in_field": "Пазнач гэты код у поле ўводу на сайце:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Ты атрымаў гэты ліст, бо гэты E‑mail быў пазначаны пры рэгістрацыі на сэрвісе {serviceLink}. Калі гэта быў не ты, то проста выдалі гэты ліст.", - "components.layout.footer.footer_logo_alt": "Ely.by - Альтэрнатыўныя сэрвісы Minecraft", "components.layout.footer.service_name": "Акаўнты Ely.by", "components.layout.header.hello_username": "Прывітанне, {username}", "emails.forgotPassword.continue_image": "Працягуць", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Пацвердзіць E‑mail", "emails.register.install_our_patch_image": "Устанаві наш патч у гульню", "emails.register.install_our_patch_text": "Для таго, каб сістема скіноў Ely.by працавала, табе патрэбна ўстанавіць наш патч. Знайсці яго можна ў раздзеле загрузак на сайце.", - "emails.register.use_tlauncher_image": "Выкарыстоўвай TLauncher", - "emails.register.use_tlauncher_text": "Усё значна лягчэй, калі ты выкарыстоўваеш правільную прыладу для сваёй задачы. TLauncher з'яўляецца лепшым альтэрнатыўным лаунчарам для Minecraft, які таксама мае ўбудаваную падтрымку Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Мы рады бачыць цябе ў шэрагах карыстальнікаў праекту Ely.by. Ты ўжо амаль у мэты, засталося толькі пацвердзіць свой E‑mail адрас. Каб зрабіць гэта, калі ласка, націсні на кнопку, якая знаходзіцца ніжэй.", "emails.register.welcome_image": "Сардэчна запрашаем на Ely.by", "emails.register.whats_next_image": "Што далей?" diff --git a/src/i18n/el.json b/src/i18n/el.json index 66a1d9c..ba99857 100644 --- a/src/i18n/el.json +++ b/src/i18n/el.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "ή", "components.blocks.code.pass_code_in_field": "Πληκτρολογήστε αυτόν το κωδικό στο κενό στην ιστοσελίδα:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Λάβατε αυτό το μήνυμα, γιατί αυτό το E‑mail είχε εισαχθεί για την δημιουργία λογαριασμού στην υπηρεσία {serviceLink}. Αν δεν ήσασταν εσείς παρακαλώ αγνοείστε αυτό το μήνυμα.", - "components.layout.footer.footer_logo_alt": "Ely.by - Alternative Minecraft services", "components.layout.footer.service_name": "Λογαριασμός Ely.by", "components.layout.header.hello_username": "Γεια {username}", "emails.forgotPassword.continue_image": "Συνέχεια", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Επιβεβαίωση E‑mail", "emails.register.install_our_patch_image": "Κάνε αναβάθμιση μέσα στο παιχνίδι", "emails.register.install_our_patch_text": "Θα ήταν καλύτερα να κατέβαζες την καινούργια αναβάθμιση για να κάνει το συστημα να δουλέψει. Μπορείς να το βρείς στην κατηγορία 'φόρτιση' στην ιστοσελίδα.", - "emails.register.use_tlauncher_image": "Χρησιμοποίησε το TLauncher", - "emails.register.use_tlauncher_text": "Είναι πολύ ποιο εύκολο όταν χρησιμοποιείς το σωστό εργαλείο για την σωστή χρήση. Το TLauncher είναι​ το καλύτερο εναλλακτικό launcher για το Minecraft, το οποίο υποστηρίζει το σύστημα Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Χαιρόμαστε που βρίσκεσαι ανάμεσα στους χρήστες του Ely.by. Έμεινε μόνο ένα ακόμη πράγμα, να επιβιώσεις την διεύθυνση ηλεκτρονικού ταχυδρομείου. Παρακαλώ πατήστε το κουμπί παρακάτω για να συνεχίσεις.", "emails.register.welcome_image": "Καλωσορίσατε στο Ely.by", "emails.register.whats_next_image": "Τι έχει μετά;" diff --git a/src/i18n/en.json b/src/i18n/en.json index 33244e3..61053e7 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "or", "components.blocks.code.pass_code_in_field": "Insert this code into form field of our site:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "You have received this message, because this E‑mail was entered during registration at the {serviceLink} service. If that wasn't you, please just ignore this message.", - "components.layout.footer.footer_logo_alt": "Ely.by - Alternative Minecraft services", "components.layout.footer.service_name": "Accounts Ely.by", "components.layout.header.hello_username": "Hello, {username}", "emails.forgotPassword.continue_image": "Continue", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Confirm E‑mail", "emails.register.install_our_patch_image": "Install our patch in the game", "emails.register.install_our_patch_text": "You should install our patch to make the Ely.by's skin system working. You can find it in 'Load' section on our site.", - "emails.register.use_tlauncher_image": "Use TLauncher", - "emails.register.use_tlauncher_text": "It is much easier, when you use right tool for the right purpose. TLauncher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "We glad to see you among the users of Ely.by. You almost reached the final point, it remains only to confirm your E-mail address. Please push the button bellow to continue.", "emails.register.welcome_image": "Welcome to Ely.by", "emails.register.whats_next_image": "What's the next?" diff --git a/src/i18n/fil.json b/src/i18n/fil.json index 1482770..1607cd7 100644 --- a/src/i18n/fil.json +++ b/src/i18n/fil.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "o", "components.blocks.code.pass_code_in_field": "Isingit ang code sa form field ng aming site:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Natanggap mo ang mensaheng ito, dahil ito E-mail ay naipasok tuwing registration sa {serviceLink} serbisyo. kung hindi ikaw yung wag mo nalang pansinin tong message.", - "components.layout.footer.footer_logo_alt": "Ely.by - Alternatibong Minecraft na Serbisyo", "components.layout.footer.service_name": "Accounts Ely.by", "components.layout.header.hello_username": "Kamusta, {username}\n", "emails.forgotPassword.continue_image": "Continue", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Kumpirmahin ang E-mail", "emails.register.install_our_patch_image": "I-install ang aming patch sa laro", "emails.register.install_our_patch_text": "Dapat mong i-install ang aming patch upang gumawa ng balat sistema ng pagtatrabaho sa Ely.by ni. Maaari mong mahanap ito sa seksyon ng 'I-load ang' sa aming site.", - "emails.register.use_tlauncher_image": "Gamitin mo ang Tlauncher", - "emails.register.use_tlauncher_text": "Ito ay lubhang mas madaling, kapag ginamit mo tamang tool para sa tamang layunin. TLauncher ay isa sa mga pinakamahusay na alternatibong launcher para sa Minecraft, na mayroon ding Ely.by sistema ng suporta.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Kami ay natutuwa na nakikita mo sa gitna ng mga gumagamit ng mga Ely.by. Halos umabot sa panghuling punto, ito ay nananatiling lamang upang kumpirmahin ang iyong E-mail address. Mangyaring itulak ang pindutan ng bellow upang magpatuloy.", "emails.register.welcome_image": "Maligayang pagdating sa Ely.by", "emails.register.whats_next_image": "Ano ang susunod?" diff --git a/src/i18n/fr.json b/src/i18n/fr.json index 3f94df0..41a5c3b 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "ou", "components.blocks.code.pass_code_in_field": "Insérez ce code dans le champ de formulaire de notre site:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Vous avez reçu ce message, car cet e-mail a été saisi lors de l'inscription au service des {serviceLink}. Si ce n'était pas vous, ignorez ce message.", - "components.layout.footer.footer_logo_alt": "Ely.by - Services alternatifs de Minecraft", "components.layout.footer.service_name": "Comptes Ely.by", "components.layout.header.hello_username": "Bonjour {username},", "emails.forgotPassword.continue_image": "Continuer", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Confirmez votre E-mail", "emails.register.install_our_patch_image": "Installez notre application dans le jeu", "emails.register.install_our_patch_text": "Vous devrez installer notre application pour faire fonctionner le système de skin Ely.by. Vous pouvez le trouver dans la section 'Télécharger' sur notre site.", - "emails.register.use_tlauncher_image": "Utiliser TLauncher", - "emails.register.use_tlauncher_text": "C'est beaucoup plus facile, lorsque vous utilisez l'outil approprié pour le bon but. TLauncher est l'un des meilleurs launchers pour Minecraft, qui dispose également du support de notre système de skins Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Nous sommes heureux de vous voir parmi les utilisateurs de Ely.by. Vous avez presque atteint le dernier point, il ne vous reste qu'à confirmer votre adresse E-mail. Appuyez sur le bouton ci-dessous pour continuer.", "emails.register.welcome_image": "Bienvenue sur Ely.by", "emails.register.whats_next_image": "C'est quoi après?" diff --git a/src/i18n/id.json b/src/i18n/id.json index 7d1fe0c..0fa7889 100644 --- a/src/i18n/id.json +++ b/src/i18n/id.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "atau", "components.blocks.code.pass_code_in_field": "Masukkan kode ini kedalam bagian formulir situs kami:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Anda telah menerima pesan ini, karena E-mail ini dimasukkan saat pendaftaran di layanan {serviceLink}. Jika itu bukan anda, mohon abaikan saja pesan ini.", - "components.layout.footer.footer_logo_alt": "Ely.by - Layanan Minecraft Alternatif", "components.layout.footer.service_name": "Akun Ely.by", "components.layout.header.hello_username": "Halo, {username}", "emails.forgotPassword.continue_image": "Lanjutkan", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Konfirmasi E-mail", "emails.register.install_our_patch_image": "Pasang patch kami didalam game", "emails.register.install_our_patch_text": "Anda harus memasang patch kami agar sistem skin Ely.by dapat bekerja. Anda bisa menemukannya pada bagian \"Unduhan\" di situs kami.", - "emails.register.use_tlauncher_image": "Gunakan TLauncher", - "emails.register.use_tlauncher_text": "Akan jauhlebih mudah saat anda menggunakan alat yang benar untuk tujuan yang benar. TLauncher adalah salah satu dari peluncur Minecraft alternatif terbaik, yang juga memiliki dukungan sistem Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Kami senang melihat Anda di antara pengguna Ely.by. Anda hampir mencapai titik akhir, hanya tinggal untuk mengkonfirmasi alamat E-mail Anda. Tolong tekan tombol di bawah untuk melanjutkan.", "emails.register.welcome_image": "Selamat datang di Ely.by", "emails.register.whats_next_image": "Selanjutnya apa?" diff --git a/src/i18n/lt.json b/src/i18n/lt.json index f2e60a8..9d117c5 100644 --- a/src/i18n/lt.json +++ b/src/i18n/lt.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "arba", "components.blocks.code.pass_code_in_field": "Įterpkite šį kodą į mūsų svetainės formos lauką:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Jūs gavote šį pranešimą, nes šis elektroninis paštas buvo įvestas registruojant {serviceLink} tarnybą. Jei tai nebuvo jūsų, tiesiog ignoruokite šį pranešimą.", - "components.layout.footer.footer_logo_alt": "Ely.by - Alternatyvios Minecraft paslaugos", "components.layout.footer.service_name": "Paskyros Ely.by", "components.layout.header.hello_username": "Sveiki, {username}", "emails.forgotPassword.continue_image": "Tęsti", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Patvirtinti el. paštą", "emails.register.install_our_patch_image": "Įdiekite mūsų pleistrą žaidime", "emails.register.install_our_patch_text": "Turėtumėte įdiegti mūsų pleistrą, kad veiktų Ely.by apvalkalų sistema. Tai galite rasti mūsų svetainėje esančioje skiltyje \"Įkelti\".", - "emails.register.use_tlauncher_image": "Naudoti TLauncher", - "emails.register.use_tlauncher_text": "Tai daug lengviau, kai naudojate teisingą priemonę tinkamam tikslui. TLauncher yra viena iš geriausių Minecraft alternatyvių paleidiklių, kuri taip pat turi Ely.by sistemos palaikymą.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Mielai matome jus tarp Ely.by naudotojų. Jūs beveik pasiekėte paskutinį tašką, lieka tik patvirtinti savo el. pašto adresą. Jei norite tęsti, spauskite žemiau esantį mygtuką.", "emails.register.welcome_image": "Sveiki atvykę į Ely.by", "emails.register.whats_next_image": "Kas toliau?" diff --git a/src/i18n/pl.json b/src/i18n/pl.json index 26e09b9..91b6cd8 100644 --- a/src/i18n/pl.json +++ b/src/i18n/pl.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "lub", "components.blocks.code.pass_code_in_field": "Wprowadź ten kod w polu formularza na naszej stronie", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Otrzymałeś tę wiadomość, ponieważ ten E-mail został wprowadzony podczas rejestracji w usłudze {serviceLink}. Jeśli to nie ty, po prostu zignoruj ​​tę wiadomość.", - "components.layout.footer.footer_logo_alt": "Ely.by - Alternatywne usługi Minecraft", "components.layout.footer.service_name": "Kont Ely.by", "components.layout.header.hello_username": "Cześć, {username}", "emails.forgotPassword.continue_image": "Dalej", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Potwierdź adres E-mail", "emails.register.install_our_patch_image": "Zainstaluj nasz patch w grze", "emails.register.install_our_patch_text": "Powinieneś zainstalować nasz patch, by nasz system Ely.by działał poprawnie. Można znaleźć go w zakładce \"załaduj\" na naszej stronie.", - "emails.register.use_tlauncher_image": "Użyj TLauncher", - "emails.register.use_tlauncher_text": "Jest to dużo łatwiejsze, gdy używasz właściwego narzędzia do właściwego celu. TLauncher jest jednym z najlepszych alternatywnych launcherów dla Minecraft'a, który również obsługuje system Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Cieszymy się widząc Ciebie pośród użytkowników Ely.by. Już prawie dotarłeś do końca, lecz pozostało Ci jedynie potwierdzić Twój adres E-mail. Naciśnij przycisk poniżej, by kontynuować.", "emails.register.welcome_image": "Witamy na Ely.by", "emails.register.whats_next_image": "Co dalej?" diff --git a/src/i18n/pt.json b/src/i18n/pt.json index 8a04787..8589d9e 100644 --- a/src/i18n/pt.json +++ b/src/i18n/pt.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "ou", "components.blocks.code.pass_code_in_field": "Insira esse código no campo de formulário do nosso site:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Você recebeu essa mensagem porque este E-mail foi digitado durante o registro no serviço {serviceLink}. Se não foi você, apenas ignore esta mensagem.", - "components.layout.footer.footer_logo_alt": "Ely.by - Serviço de Minecraft alternativo", "components.layout.footer.service_name": "Contas Ely.by", "components.layout.header.hello_username": "Olá, {username}", "emails.forgotPassword.continue_image": "Continuar", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Confirmar E-mail", "emails.register.install_our_patch_image": "Instale nosso patch no jogo", "emails.register.install_our_patch_text": "Você deve instalar o nosso patch para fazer o sistema de skins Ely.by funcionar. Você pode encontrá-lo na seção 'carregar' no nosso site.", - "emails.register.use_tlauncher_image": "Use o TLauncher", - "emails.register.use_tlauncher_text": "É muito fácil quando você usa a ferramenta correta para o motivo correto. O TLauncher é uma das melhores alternativas de launchers para Minecraft, e também tem o suporte do sistema Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Estamos felizes de ver você entre os usuários do Ely.by. Você está quase no final, falta apenas confirmar o endereço de E-mail. Por favor, aperte o botão abaixo para continuar.", "emails.register.welcome_image": "Bem-vindo ao Ely.by", "emails.register.whats_next_image": "O que é o próximo a se fazer?" diff --git a/src/i18n/ro.json b/src/i18n/ro.json index 07a620e..8f6d8f3 100644 --- a/src/i18n/ro.json +++ b/src/i18n/ro.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "sau", "components.blocks.code.pass_code_in_field": "Insereaza acest cod in formularul de pe site-ul nostru:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Ai primit acest mesaj deoarece acest E-mail a fost introdus intr-o inregistrare la serviciul {serviceLink}. Daca nu ati fost dvs., va rugam sa ingnorati acest mesaj.", - "components.layout.footer.footer_logo_alt": "Ely.by - Servicii Minecraft Alternative", "components.layout.footer.service_name": "Conturi Ely.by", "components.layout.header.hello_username": "Bună ziua, {username}", "emails.forgotPassword.continue_image": "Continua", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Confirma E-mail-ul", "emails.register.install_our_patch_image": "Instaleaza pachetul nostru in joc", "emails.register.install_our_patch_text": "Ar trebui sa instalezi pachetul nostru pentru a sistemul de skinuri Ely.by sa functioneze. Poti sa il gasesti in sectiunea \"Incarca\" de pe site-ul nostru.", - "emails.register.use_tlauncher_image": "Foloseste TLauncher", - "emails.register.use_tlauncher_text": "Este mult mai usor, cand folosesti unealta buna pentru un motiv bun. TLauncher e unul dintre cele mai bune lansatoare alternative pentru Minecraft, care are si suport pentru sistem Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Ne bucurăm să vă vedem printre utilizatorii Ely.by. Aproape ați ajuns la punctul final, rămâne doar pentru a vă confirma adresa de E-mail. Apăsați butonul de mai jos pentru a continua.", "emails.register.welcome_image": "Bun venit pe Ely.by", "emails.register.whats_next_image": "Ce urmeaza?" diff --git a/src/i18n/ru.json b/src/i18n/ru.json index 966b314..05e53c8 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "или", "components.blocks.code.pass_code_in_field": "Укажи этот код в поле ввода на сайте:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Ты получил это письмо, т.к. этот E‑mail был указан при регистрации на сервисе {serviceLink}. Если это был не ты, то просто удали это письмо.", - "components.layout.footer.footer_logo_alt": "Ely.by - Альтернативные сервисы Minecraft", "components.layout.footer.service_name": "Аккаунты Ely.by", "components.layout.header.hello_username": "Привет, {username}", "emails.forgotPassword.continue_image": "Продолжить", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Подтвердить E‑mail", "emails.register.install_our_patch_image": "Установи наш патч в игру", "emails.register.install_our_patch_text": "Для того, чтобы система скинов Ely.by работала, тебе нужно установить наш патч. Найти его можно в разделе загрузок на сайте.", - "emails.register.use_tlauncher_image": "Используй TLauncher", - "emails.register.use_tlauncher_text": "Всё гораздо проще, когда ты используешь правильный инструмент для своей задачи. TLauncher является лучшим альтернативным лаунчером для Minecraft, который также имеет встроенную поддержку Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Мы рады видеть тебя в рядах пользователей проекта Ely.by. Ты уже почти у цели, осталось лишь подтвердить свой E‑mail адрес. Чтобы сделать это, пожалуйста, нажми на кнопку, которая расположена ниже.", "emails.register.welcome_image": "Добро пожаловать на Ely.by", "emails.register.whats_next_image": "Что дальше?" diff --git a/src/i18n/sl.json b/src/i18n/sl.json index c95d164..d47aeb9 100644 --- a/src/i18n/sl.json +++ b/src/i18n/sl.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "ali", "components.blocks.code.pass_code_in_field": "Vnesi to kodo v polje na naši spletni strani:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "To sporočilo ste prejeli, ker je bil ta E-mail vnesen med registracijo {serviceLink} storitve. Če to niste bili vi, prosim ignorirajte to sporočilo.", - "components.layout.footer.footer_logo_alt": "Ely.by - Alternativne storitve za Minecraft", "components.layout.footer.service_name": "Računi Ely.by", "components.layout.header.hello_username": "Pozdravljen, {username}", "emails.forgotPassword.continue_image": "Nadaljuj", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Potrdi E-mail", "emails.register.install_our_patch_image": "Namesti maš dodatek v igro", "emails.register.install_our_patch_text": "Če hočeš, da sistem za skin deluje, moraš namestiti dodatek Ely.by. Najdeš ga lahko na poglavju 'Naloži' na naši strani.", - "emails.register.use_tlauncher_image": "Uporabi TLauncher", - "emails.register.use_tlauncher_text": "Veliko lažje je, če uporabljaš prava orodja za prave stvari. TLauncher je eden najboljših alternativnih zaganjalnikov za igro Minecraft. Kar je še bolje, pa je, da podpira Ely.by skin sistem.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Srečni smo, da te lahko najdemo med uporabniki Ely.by. Edino, kar ti preostane do tvojega računa je potrditev E-maila. Prosim pritisni gumb spodaj za nadaljevanje.", "emails.register.welcome_image": "Dobrodošel na Ely.by", "emails.register.whats_next_image": "Kaj sledi?" diff --git a/src/i18n/uk.json b/src/i18n/uk.json index 9b1b1dc..d952a5d 100644 --- a/src/i18n/uk.json +++ b/src/i18n/uk.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "або", "components.blocks.code.pass_code_in_field": "Введи цей код в форму на сайті:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Ти отримав цей лист, тому що твій E-mail було вказано при реєстрації на сервісі {serviceLink}. Якщо це був не ти, то просто видали цей лист.", - "components.layout.footer.footer_logo_alt": "Ely.by - Альтернативні сервіси Minecraft", "components.layout.footer.service_name": "Акаунти Ely.by", "components.layout.header.hello_username": "Привіт, {username}", "emails.forgotPassword.continue_image": "Продовжити", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Підтвердити E-mail", "emails.register.install_our_patch_image": "Встанови наш патч в гру", "emails.register.install_our_patch_text": "Для того, щоб система скінів Ely.by працювала, тобі потрібно встановити наш патч. Знайти його можна в розділі завантажень на сайті.", - "emails.register.use_tlauncher_image": "Використовуй TLauncher", - "emails.register.use_tlauncher_text": "Все набагато простіше, коли ти використовуєш правильний інструмент для своєї задачі. TLauncher є кращим альтернативним лаунчером для Minecraft, який також має вбудовану підтримку Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Ми раді бачити тебе в рядах користувачів проекту Ely.by. Ти вже майже у мети, залишилося лише підтвердити свою E-mail адресу. Щоб зробити це, будь ласка, натисни на кнопку, яка розташована нижче.", "emails.register.welcome_image": "Ласкаво просимо до Ely.by", "emails.register.whats_next_image": "Що далі?" diff --git a/src/i18n/vi.json b/src/i18n/vi.json index 5e3822e..bef945c 100644 --- a/src/i18n/vi.json +++ b/src/i18n/vi.json @@ -1,8 +1,8 @@ { "components.blocks.code.or": "hoặc", "components.blocks.code.pass_code_in_field": "Chèn mã này vào mẫu của trang chúng tôi:", + "components.layout.footer.alternativeMinecraftServices": "Alternative Minecraft services", "components.layout.footer.footer": "Bạn đã nhận được tin nhắn này, bởi vì địa chỉ E-mail này đã được nhập trong quá trình đăng ký tại dịch vụ {serviceLink}. Nếu đó không phải bạn, vui lòng bỏ qua tin nhắn.", - "components.layout.footer.footer_logo_alt": "Ely.by - Dịch vụ Minecraft luân hồi", "components.layout.footer.service_name": "Tài khoản Ely.by", "components.layout.header.hello_username": "Xin chào, {username}", "emails.forgotPassword.continue_image": "Tiếp tục", @@ -13,8 +13,8 @@ "emails.register.confirm_email_image": "Xác nhận E-mail", "emails.register.install_our_patch_image": "Cài đặt bản vá của chúng tôi trong game", "emails.register.install_our_patch_text": "Bạn nên cài đặt bản vá của chúng tôi để làm hệ thống skin của Ely.by hoạt động. Bạn có thể tìm thấy nó trong phần 'Tải' trên trang của chúng tôi.", - "emails.register.use_tlauncher_image": "Dùng TLauncher", - "emails.register.use_tlauncher_text": "Nó sẽ rất dễ hơn, khi mà bạn dùng công cụ đúng cho mục đích đúng. TLauncher là một trong những trình khởi động thay thế tốt nhất cho Minecraft, cũng được hỗ trợ bởi hệ thống Ely.by.", + "emails.register.useTLLauncher": "Use TL launcher", + "emails.register.useTLLauncherText": "It is much easier, when you use right tool for the right purpose. The TL launcher is one of the best alternative launchers for the Minecraft, that also has Ely.by system support.", "emails.register.we_glad_to_see_you": "Chúng tôi rất vui vì bạn chọn Ely.by. Bạn đã gần đạt được điểm cuối cùng, bước còn lại là chỉ cần xác nhận E-mail của bạn. Vui lòng nhấn nút bên dưới để tiếp tục.", "emails.register.welcome_image": "Chào mừng tới Ely.by", "emails.register.whats_next_image": "Làm gì tiếp theo?" diff --git a/webpack-utils/extended-translations-loader/RobotoCondensed-Regular.ttf b/webpack-utils/extended-translations-loader/RobotoCondensed-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9a1418d62d2f6d82c6d906a84db514b7c7cd9bd4 GIT binary patch literal 169544 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 B7a0Hm literal 0 HcmV?d00001 diff --git a/webpack-utils/extended-translations-loader/index.js b/webpack-utils/extended-translations-loader/index.js new file mode 100644 index 0000000..4e467ce --- /dev/null +++ b/webpack-utils/extended-translations-loader/index.js @@ -0,0 +1,120 @@ +/* eslint-env node */ + +const fs = require('fs'); +const path = require('path'); +const glob = require('glob'); +const { stringify } = require('qs'); + +const localFontPath = path.join(__dirname, 'RobotoCondensed-Regular.ttf'); +const localFontName = 'RobotoCondensed'; +const scale = 2; + +module.exports = async function(content) { + this.cacheable && this.cacheable(); + + const callback = this.async(); + + const { publicPath } = this._compiler.options.output; + const ROOT_PATH = path.join(this.rootContext, 'src'); + const localeName = path.basename(this.resourcePath, `.${this.resourcePath.split('.').pop()}`); + + const renderText2Png = (key, { text, size, color }) => new Promise((resolve, reject) => { + if (!text || !size || !color) { + reject(new Error('text, size and color params are required')); + return; + } + + const fileName = `${key.replace(/\./g, '_')}_${localeName}.png`; + const args = { + localFontPath, + localFontName, + text, + color, + font: `${size * scale}px RobotoCondensed`, // eslint-disable-line generator-star-spacing + }; + const renderTextRequest = `text2png-loader?${stringify(args)}!`; + const emitFileRequest = `image-size-loader?name=assets${path.sep}${fileName}?[hash]!${renderTextRequest}`; + this.loadModule(emitFileRequest, (err, module) => { + if (err) { + reject(err); + return; + } + + global.__webpack_public_path__ = publicPath; // eslint-disable-line camelcase + const { src, width, height } = this.exec(module, fileName); + Reflect.deleteProperty(global, '__webpack_public_path__'); + + const targetWidth = Math.ceil(width / scale); + const targetHeight = Math.ceil(height / scale); + + resolve(`${text}`); + }); + }); + + const examine = (key, value) => new Promise((resolve, reject) => { + const pathParts = key.split('.'); + const id = pathParts.pop(); + const pattern = path.join(ROOT_PATH, pathParts.join('/'), '*.intl.json'); + // glob always uses linux separators + glob(pattern.replace(/\\/g, '/'), (err, matches) => { + if (err) { + reject(err); + return; + } + + if (matches.length === 0) { + this.emitWarning(`Unable to find corresponding intl file for ${key} key`); + resolve(value); + return; + } + + for (const path of matches) { + const json = JSON.parse(fs.readFileSync(path)); + const descriptor = json[id]; + if (!descriptor) { + continue; + } + + this.addDependency(path); + + if (typeof descriptor === 'string') { + resolve(value); + continue; + } + + if (typeof descriptor !== 'object') { + this.emitWarning('Unknown value type'); + continue; + } + + const { type } = descriptor; + if (type !== 'text2png') { + this.emitWarning(`Unsupported object key type "${type}"`); + continue; + } + + renderText2Png(key, { + ...descriptor, + text: value, + }).then(resolve).catch(reject); + + return; + } + + resolve(value); + }); + }); + + const json = JSON.parse(content); + const result = JSON.stringify(await Object.keys(json).reduce(async (translationsPromise, key) => { + const translations = await translationsPromise; + translations[key] = await examine(key, json[key]); + + return translations; + }, Promise.resolve({}))); + + callback(null, ` + import { defineMessages } from 'react-intl'; + export default defineMessages(${result}); + `); +}; diff --git a/webpack-utils/extended-translations-loader/package.json b/webpack-utils/extended-translations-loader/package.json new file mode 100644 index 0000000..752846b --- /dev/null +++ b/webpack-utils/extended-translations-loader/package.json @@ -0,0 +1,13 @@ +{ + "name": "extended-translations-loader", + "version": "1.0.0", + "main": "index.js", + "dependencies": { + "@lesechos/image-size-loader": "file:./../image-size-loader", + "glob": "^7.1.4", + "loader-utils": "^1.2.3", + "text2png-loader": "file:./../text2png-loader", + "tmp": "^0.0.33", + "qs": "^6.0.0" + } +} diff --git a/webpack-utils/image-size-loader/index.js b/webpack-utils/image-size-loader/index.js new file mode 100644 index 0000000..da94934 --- /dev/null +++ b/webpack-utils/image-size-loader/index.js @@ -0,0 +1,108 @@ +/* eslint-disable multiline-ternary */ +const path = require('path'); +const fs = require('fs'); + +const sizeOf = require('image-size'); +const loaderUtils = require('loader-utils'); +const validateOptions = require('schema-utils'); + +const schema = require('./options.json'); + +function imageToString(image) { + return ` + module.exports = { + src: ${image.src}, + width: ${JSON.stringify(image.width)}, + height: ${JSON.stringify(image.height)}, + bytes: ${JSON.stringify(image.bytes)}, + type: ${JSON.stringify(image.type)}, + }; + // For requires from CSS when used with webpack css-loader, + // outputting an Object doesn't make sense, + // So overriding the toString method to output just the URL + module.exports.toString = function() { + return ${image.src}; + }; + `; +} + +module.exports = function(content) { + if (!this.emitFile) { + throw new Error('File Loader\n\nemitFile is required from module system'); + } + + const options = loaderUtils.getOptions(this) || {}; + + validateOptions(schema, options, 'File Loader'); + + const context = options.context || this.rootContext || (this.options && this.options.context); + + const url = loaderUtils.interpolateName(this, options.name, { + context, + content, + regExp: options.regExp, + }); + + let image; + if (this.resourcePath) { + image = sizeOf(this.resourcePath); + image.bytes = fs.statSync(this.resourcePath).size; + } else { + image = sizeOf(content); + image.bytes = content.byteLength; + } + + let outputPath = url; + + if (options.outputPath) { + if (typeof options.outputPath === 'function') { + outputPath = options.outputPath(url); + } else { + outputPath = path.posix.join(options.outputPath, url); + } + } + + if (options.useRelativePath) { + const filePath = this.resourcePath; + + const issuer = options.context ? context : this._module && this._module.issuer && this._module.issuer.context; + + const relativeUrl = issuer && path + .relative(issuer, filePath) + .split(path.sep) + .join('/'); + + const relativePath = relativeUrl && `${path.dirname(relativeUrl)}/`; + // eslint-disable-next-line no-bitwise + if (~relativePath.indexOf('../')) { + outputPath = path.posix.join(outputPath, relativePath, url); + } else { + outputPath = path.posix.join(relativePath, url); + } + } + + let publicPath = `__webpack_public_path__ + ${JSON.stringify(outputPath)}`; + + if (options.publicPath) { + if (typeof options.publicPath === 'function') { + publicPath = options.publicPath(url); + } else if (options.publicPath.endsWith('/')) { + publicPath = options.publicPath + url; + } else { + publicPath = `${options.publicPath}/${url}`; + } + + publicPath = JSON.stringify(publicPath); + } + + image.src = publicPath; + + // eslint-disable-next-line no-undefined + if (options.emitFile === undefined || options.emitFile) { + this.emitFile(outputPath, content); + } + + return imageToString(image); +}; + +module.exports.raw = true; diff --git a/webpack-utils/image-size-loader/options.json b/webpack-utils/image-size-loader/options.json new file mode 100644 index 0000000..bab6fd5 --- /dev/null +++ b/webpack-utils/image-size-loader/options.json @@ -0,0 +1,19 @@ +{ + "type": "object", + "properties": { + "name": {}, + "regExp": {}, + "context": { + "type": "string" + }, + "publicPath": {}, + "outputPath": {}, + "useRelativePath": { + "type": "boolean" + }, + "emitFile": { + "type": "boolean" + } + }, + "additionalProperties": true +} \ No newline at end of file diff --git a/webpack-utils/image-size-loader/package.json b/webpack-utils/image-size-loader/package.json new file mode 100644 index 0000000..bf1ce9b --- /dev/null +++ b/webpack-utils/image-size-loader/package.json @@ -0,0 +1,13 @@ +{ + "name": "@lesechos/image-size-loader", + "version": "1.0.0", + "main": "index.js", + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + }, + "dependencies": { + "image-size": "^0.6.3", + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } +} diff --git a/webpack-utils/intl-json-loader/index.js b/webpack-utils/intl-json-loader/index.js index 09a1a23..d988a0b 100644 --- a/webpack-utils/intl-json-loader/index.js +++ b/webpack-utils/intl-json-loader/index.js @@ -10,16 +10,25 @@ module.exports = function(input) { const json = JSON.parse(input); const result = JSON.stringify(Object.keys(json).reduce((translations, key) => { - translations[key] = { - id: `${moduleId}.${key}`, - defaultMessage: json[key], - }; + const value = json[key]; + const id = `${moduleId}.${key}`; + if (typeof value === 'object') { + translations[key] = { + ...value, + id, + }; + } else { + translations[key] = { + id, + defaultMessage: value, + }; + } return translations; }, {})); return ` import { defineMessages } from 'react-intl'; - export default defineMessages(${result}) + export default defineMessages(${result}); `; }; diff --git a/webpack-utils/text2png-loader/index.js b/webpack-utils/text2png-loader/index.js new file mode 100644 index 0000000..e7aed02 --- /dev/null +++ b/webpack-utils/text2png-loader/index.js @@ -0,0 +1,16 @@ +/* eslint-env node */ + +const { getOptions } = require('loader-utils'); +const text2png = require('text2png'); + +module.exports = function() { + this.cacheable && this.cacheable(); + + const { text, ...options } = getOptions(this); + if (!text) { + this.emitError('The text param is required'); + return ''; + } + + return text2png(text, options); +}; diff --git a/webpack-utils/text2png-loader/package.json b/webpack-utils/text2png-loader/package.json new file mode 100644 index 0000000..b22e959 --- /dev/null +++ b/webpack-utils/text2png-loader/package.json @@ -0,0 +1,9 @@ +{ + "name": "text2png-loader", + "version": "1.0.0", + "main": "index.js", + "dependencies": { + "text2png": "^2.1.0", + "loader-utils": "^1.2.3" + } +} diff --git a/webpack.config.js b/webpack.config.js index 028c5ec..f726b26 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,8 +2,11 @@ const path = require('path'); +const { ContextReplacementPlugin } = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); +const SUPPORTED_LANGUAGES = Object.keys(require('./src/i18n/index.json')); + module.exports = (env, { mode = 'development' }) => { const isProduction = mode === 'production'; @@ -33,7 +36,7 @@ module.exports = (env, { mode = 'development' }) => { resolveLoader: { alias: { - 'image-size-loader': path.join(__dirname, 'node_modules/@eoleo/image-size-loader/dist/cjs.js'), + 'image-size-loader': path.join(__dirname, 'node_modules/@lesechos/image-size-loader/index.js'), }, }, @@ -46,6 +49,9 @@ module.exports = (env, { mode = 'development' }) => { }, plugins: [ + new ContextReplacementPlugin( + /i18n/, new RegExp(`/(${SUPPORTED_LANGUAGES.join('|')})\\.json`) + ), new HtmlWebpackPlugin({ template: 'src/index.ejs', favicon: 'src/favicon.ico', @@ -87,11 +93,6 @@ module.exports = (env, { mode = 'development' }) => { plugins: [ '@babel/plugin-proposal-class-properties', '@babel/plugin-proposal-export-default-from', - // TODO: by unknown reasons react-intl plugins isn't working. - // investigate later - ['react-intl', { - messagesDir: path.join(__dirname, 'dist/messages/'), - }], ], }, }, @@ -104,12 +105,20 @@ module.exports = (env, { mode = 'development' }) => { name: 'assets/[name]-[folder].[ext]?[hash]', }, }, + // The explicit declaration of the json loader allows us to disable the built-in + // webpack 4 loader for json, which interferes with the work of text2png-loader + { + test: /\.json$/, + exclude: /\.intl\.json$/, + loader: 'json-loader', + type: 'javascript/auto', + }, { test: /\.intl\.json$/, loader: 'intl-json-loader', type: 'javascript/auto', }, - ] + ], }, }; }; diff --git a/yarn.lock b/yarn.lock index 0c401df..2780534 100644 --- a/yarn.lock +++ b/yarn.lock @@ -652,13 +652,6 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" -"@babel/runtime@^7.0.0": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" - integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== - dependencies: - regenerator-runtime "^0.12.0" - "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" @@ -692,10 +685,8 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" -"@eoleo/image-size-loader@^1.0.0": +"@lesechos/image-size-loader@file:./webpack-utils/image-size-loader": version "1.0.0" - resolved "https://registry.yarnpkg.com/@eoleo/image-size-loader/-/image-size-loader-1.0.0.tgz#f63d781cbd0863a925429631bf9013a6266b2046" - integrity sha512-5ltMAAxQQyw95uF1dW9HJ9r727hhdDkS6uEClKS9Rgqwn7dYDAKjoCM1/zIvydbz9h7MbjFWKwRKyCmASXZryw== dependencies: image-size "^0.6.3" loader-utils "^1.1.0" @@ -1076,16 +1067,6 @@ async@^1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@~0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= - -async@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" - integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= - atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -1128,15 +1109,6 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-react-intl@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-react-intl/-/babel-plugin-react-intl-3.0.1.tgz#4abc7fff04a7bbbb7034aec0a675713f2e52181c" - integrity sha512-FqnEO+Tq7kJVUPKsSG3s5jaHi3pAC4RUR11IrscvjsfkOApLP2DtzNo6dtQ+tX+OzEzJx7cUms8aCw5BFyW5xg== - dependencies: - "@babel/runtime" "^7.0.0" - intl-messageformat-parser "^1.2.0" - mkdirp "^0.5.1" - babel-plugin-react-transform@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-react-transform/-/babel-plugin-react-transform-2.0.2.tgz#515bbfa996893981142d90b1f9b1635de2995109" @@ -1480,6 +1452,14 @@ caniuse-lite@^1.0.30000948: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz#8cbc6d2f141bc32362f7467b45a2dcae8e64c84b" integrity sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg== +canvas@^2.0.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.4.1.tgz#d3b40efc7c281006ca0ff9cc854aaa8b82abec7a" + integrity sha512-SaFomFqDuuuSTScTHQ7nXc5ea71Ieb8ctvwXjR7vzLsBMfp3euTv2xsTY70zIoC5r4sSQZYXv6tiHiORJ4y1vg== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.11.0" + chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1612,16 +1592,6 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -colors@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= - -colors@^1.1.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== - commander@2.17.x: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -1827,11 +1797,6 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== -cycle@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" - integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= - cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -1892,11 +1857,6 @@ deep-equal@^1.0.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= -deep-equal@~0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" - integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0= - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -2498,6 +2458,16 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" +"extended-translations-loader@file:webpack-utils/extended-translations-loader": + version "1.0.0" + dependencies: + "@lesechos/image-size-loader" "file:../../.cache/yarn/v4/npm-extended-translations-loader-1.0.0-cce5d179-7eca-4a0d-9cb7-e40895c28e2e-1557440986048/node_modules/image-size-loader" + glob "^7.1.4" + loader-utils "^1.2.3" + qs "^6.0.0" + text2png-loader "file:../../.cache/yarn/v4/npm-extended-translations-loader-1.0.0-cce5d179-7eca-4a0d-9cb7-e40895c28e2e-1557440986048/node_modules/text2png-loader" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -2512,11 +2482,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -eyes@0.1.x: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -2767,7 +2732,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.3: +glob@^7.0.0, glob@^7.0.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -2779,6 +2744,18 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3, glob@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -3037,10 +3014,11 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -i@0.3.x: - version "0.3.6" - resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" - integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0= +"i18n-collect@file:scripts/i18n-collect": + version "1.0.0" + dependencies: + glob "^7.1.3" + sort-keys "^3.0.0" iconv-lite@0.4.23: version "0.4.23" @@ -3164,7 +3142,7 @@ intl-format-cache@^2.0.5: "intl-json-loader@file:./webpack-utils/intl-json-loader": version "1.0.0" -intl-messageformat-parser@1.4.0, intl-messageformat-parser@^1.2.0: +intl-messageformat-parser@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz#b43d45a97468cadbe44331d74bb1e8dea44fc075" integrity sha1-tD1FqXRoytvkQzHXS7Ho3qRPwHU= @@ -3368,6 +3346,11 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.0.0.tgz#7fd1a7f1b69e160cde9181d2313f445c68aa2679" + integrity sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ== + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -3436,11 +3419,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isstream@0.1.x: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - js-levenshtein@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" @@ -3474,6 +3452,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-loader@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== + json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -3589,7 +3572,7 @@ loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -3845,7 +3828,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.x, mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -3892,10 +3875,10 @@ mute-stream@0.0.5: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA= -mute-stream@~0.0.4: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +nan@^2.12.1: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== nan@^2.9.2: version "2.13.1" @@ -3924,11 +3907,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -ncp@1.0.x: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" - integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY= - needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" @@ -4015,6 +3993,22 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-pre-gyp@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" + integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-releases@^1.1.10: version "1.1.11" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.11.tgz#9a0841a4b0d92b7d5141ed179e764f42ad22724a" @@ -4209,7 +4203,7 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -4394,16 +4388,6 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkginfo@0.3.x: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" - integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE= - -pkginfo@0.x.x: - version "0.4.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" - integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= - pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" @@ -4466,18 +4450,6 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -prompt@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe" - integrity sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4= - dependencies: - colors "^1.1.2" - pkginfo "0.x.x" - read "1.0.x" - revalidator "0.1.x" - utile "0.3.x" - winston "2.1.x" - prop-types@^15.5.4, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -4557,6 +4529,11 @@ qs@6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +qs@^6.0.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -4674,13 +4651,6 @@ react@^16.8.4: prop-types "^15.6.2" scheduler "^0.13.4" -read@1.0.x: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= - dependencies: - mute-stream "~0.0.4" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -4755,11 +4725,6 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" - integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== - regenerator-transform@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" @@ -4908,12 +4873,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -revalidator@0.1.x: - version "0.1.8" - resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" - integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs= - -rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -4986,14 +4946,6 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -"scripts@file:scripts": - version "1.0.0" - dependencies: - chalk "^1.1.3" - glob "^7.1.3" - mkdirp "^0.5.1" - prompt "^1.0.0" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -5182,6 +5134,13 @@ sockjs@0.3.19: faye-websocket "^0.10.0" uuid "^3.0.1" +sort-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-3.0.0.tgz#fa751737e3da363ef80632d4fd78e324d661fe9a" + integrity sha512-77XUKMiZN5LvQXZ9sgWfJza19AvYIDwaDGwGiULM+B5XYru8Z90Oh06JvqDlJczvjjYvssrV0aK1GI6+YXvn5A== + dependencies: + is-plain-obj "^2.0.0" + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -5275,11 +5234,6 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - stackframe@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-0.3.1.tgz#33aa84f1177a5548c8935533cbfeb3420975f5a4" @@ -5472,6 +5426,20 @@ text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +"text2png-loader@file:./webpack-utils/text2png-loader": + version "1.0.0" + dependencies: + loader-utils "^1.2.3" + text2png "^2.1.0" + +text2png@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/text2png/-/text2png-2.1.0.tgz#789fae490663c1062aa0e6d70d4657710bd67191" + integrity sha512-nk6ccBTNdwRcCGGgYpCOmi17J+tk23r03qcVClb9EgvH5wXdXMfLF01khfeJWT2yfWSkbeNBOzPfkZUeljgRpg== + dependencies: + canvas "^2.0.1" + commander "^2.19.0" + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -5497,6 +5465,13 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -5727,18 +5702,6 @@ utila@^0.4.0, utila@~0.4: resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= -utile@0.3.x: - version "0.3.0" - resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a" - integrity sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo= - dependencies: - async "~0.9.0" - deep-equal "~0.2.1" - i "0.3.x" - mkdirp "0.x.x" - ncp "1.0.x" - rimraf "2.x.x" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -5923,19 +5886,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -winston@2.1.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e" - integrity sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4= - dependencies: - async "~1.0.0" - colors "1.0.x" - cycle "1.0.x" - eyes "0.1.x" - isstream "0.1.x" - pkginfo "0.3.x" - stack-trace "0.0.x" - wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"