Implemented font image renderer

This commit is contained in:
ErickSkrauch 2019-05-10 01:53:28 +03:00
parent cb84df8f96
commit 625b5a9b94
42 changed files with 628 additions and 531 deletions

View File

@ -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"
}
}

View File

@ -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 {};
}

57
scripts/i18n-collect/index.js Executable file
View File

@ -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);
});

View File

@ -0,0 +1,9 @@
{
"name": "i18n-collect",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"glob": "^7.1.3",
"sort-keys": "^3.0.0"
}
}

View File

@ -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"
}
}

View File

@ -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 (
<IntlProvider locale={locale} messages={messages}>

View File

@ -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:"
}

View File

@ -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() {
</td>
<td style={styles.footerLogo}>
<a href="http://ely.by">
<BitmapText message={messages.footer_logo_alt} />
<img src={logoImg} alt="Ely.by" width="128" height="58" style={{verticalAlign: 'middle'}} />
<HTMLMessage {...messages.alternativeMinecraftServices} />
</a>
</td>
</tr>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -1,5 +1,10 @@
{
"footer": "You have received this message, because this Email was set during registration at the {serviceLink} service. If it wasn't you just delete the message please.",
"footer": "You have received this message, because this Email was entered during registration at the {serviceLink} service. If that wasn't you, please just ignore this message.",
"service_name": "Accounts Ely.by",
"footer_logo_alt": "Ely.by - Alternative Minecraft services"
"alternativeMinecraftServices": {
"type": "text2png",
"defaultMessage": "Alternative Minecraft services",
"size": 13,
"color": "#7a7a7a"
}
}

View File

@ -18,7 +18,7 @@ export default {
borderBottom: '1px dashed #7A7A7A'
},
footerLogo: {
verticalAlign: 'middle',
padding: '0 30px'
padding: '0 30px',
textAlign: 'center'
}
};

View File

@ -1,73 +0,0 @@
import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage as Message } from 'react-intl';
export function BitmapText(props) {
const parts = props.message.id.split('.');
if (parts[0] !== 'emails' && parts[0] !== 'components') {
throw new Error('Only src/emails and src/components subdirectories supported for now');
}
const fileName = parts.pop();
const componentPath = parts.slice(1).join('/');
let src;
let size;
try {
try {
src = require(`emails/${componentPath}/images/${props.intl.locale}/${fileName}.png`);
// TODO: we can improve this loader in future by adding an option to disable file emitting
// because this thing is handled by url-loader
size = require(`image-size-loader!emails/${componentPath}/images/${props.intl.locale}/${fileName}.png`);
} catch (err) { // fallback to default locale
src = require(`emails/${componentPath}/images/${props.intl.defaultLocale}/${fileName}.png`);
size = require(`image-size-loader!emails/${componentPath}/images/${props.intl.defaultLocale}/${fileName}.png`);
}
} catch (err) { // try components
try {
src = require(`components/${componentPath}/images/${props.intl.locale}/${fileName}.png`);
size = require(`image-size-loader!components/${componentPath}/images/${props.intl.locale}/${fileName}.png`);
} catch (err) { // fallback to default locale
src = require(`components/${componentPath}/images/${props.intl.defaultLocale}/${fileName}.png`);
size = require(`image-size-loader!components/${componentPath}/images/${props.intl.defaultLocale}/${fileName}.png`);
}
}
const width = props.retina ? size.width / 2 : size.width;
const height = props.retina ? size.height / 2 : size.height;
return (
<Message {...props.message}>{(message) =>
<img src={src} alt={message} style={{
width: `${width}px`,
height: `${height}px`,
...props.style
}}/>
}</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);

View File

@ -1 +0,0 @@
export BitmapText from './BitmapText';

View File

@ -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}) {
<Userbar />
<Header username={username} title={
<BitmapText message={messages.forgot_the_password_image} />
<HTMLMessage {...messages.forgot_the_password_image}/>
} />
<Content>
@ -32,7 +31,7 @@ export default function ForgotPassword({username, link, code}) {
<tr>
<td>
<Code code={code} link={link} color={lightViolet} label={
<BitmapText message={messages.continue_image} />
<HTMLMessage {...messages.continue_image} />
} />
</td>
</tr>

View File

@ -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"
}
}

View File

@ -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}) {
<Userbar />
<Header username={username} title={
<BitmapText message={messages.welcome_image} />
<HTMLMessage {...messages.welcome_image} />
} />
<Content>
@ -36,7 +35,7 @@ export default function Register({username, link, code}) {
<tr>
<td>
<Code code={code} link={link} color={blue} label={
<BitmapText message={messages.confirm_email_image} />
<HTMLMessage {...messages.confirm_email_image} />
} />
</td>
</tr>
@ -45,7 +44,7 @@ export default function Register({username, link, code}) {
...styles.contentCenterCell,
...styles.whatsNextText
}}>
<BitmapText message={messages.whats_next_image} />
<HTMLMessage {...messages.whats_next_image} />
</td>
</tr>
<tr>
@ -59,7 +58,7 @@ export default function Register({username, link, code}) {
}} />
</td>
<td style={styles.todoItemContent}>
<BitmapText message={messages.choose_you_skin_image} />
<HTMLMessage {...messages.choose_you_skin_image} />
<div style={{
...styles.paragraph,
...styles.todoItemText
@ -82,7 +81,7 @@ export default function Register({username, link, code}) {
}} />
</td>
<td style={styles.todoItemContent}>
<BitmapText message={messages.install_our_patch_image} />
<HTMLMessage {...messages.install_our_patch_image} />
<div style={{
...styles.paragraph,
...styles.todoItemText
@ -105,12 +104,12 @@ export default function Register({username, link, code}) {
}} />
</td>
<td style={styles.todoItemContent}>
<BitmapText message={messages.use_tlauncher_image} />
<HTMLMessage {...messages.useTLLauncher} />
<div style={{
...styles.paragraph,
...styles.todoItemText
}}>
<Message {...messages.use_tlauncher_text} />
<Message {...messages.useTLLauncherText} />
</div>
</td>
</tr>

View File

@ -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 Email",
"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 Email",
"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."
}

View File

@ -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": "Ты атрымаў гэты ліст, бо гэты Email быў пазначаны пры рэгістрацыі на сэрвісе {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": "Пацвердзіць Email",
"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. Ты ўжо амаль у мэты, засталося толькі пацвердзіць свой Email адрас. Каб зрабіць гэта, калі ласка, націсні на кнопку, якая знаходзіцца ніжэй.",
"emails.register.welcome_image": "Сардэчна запрашаем на Ely.by",
"emails.register.whats_next_image": "Што далей?"

View File

@ -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": "Λάβατε αυτό το μήνυμα, γιατί αυτό το Email είχε εισαχθεί για την δημιουργία λογαριασμού στην υπηρεσία {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": "Επιβεβαίωση Email",
"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": "Τι έχει μετά;"

View File

@ -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 Email 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 Email",
"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?"

View File

@ -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?"

View File

@ -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?"

View File

@ -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?"

View File

@ -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?"

View File

@ -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?"

View File

@ -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?"

View File

@ -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?"

View File

@ -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": "Ты получил это письмо, т.к. этот Email был указан при регистрации на сервисе {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": "Подтвердить Email",
"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. Ты уже почти у цели, осталось лишь подтвердить свой Email адрес. Чтобы сделать это, пожалуйста, нажми на кнопку, которая расположена ниже.",
"emails.register.welcome_image": "Добро пожаловать на Ely.by",
"emails.register.whats_next_image": "Что дальше?"

View File

@ -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?"

View File

@ -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": "Що далі?"

View File

@ -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?"

View File

@ -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(`<img src="${src}" alt="${text}" width="${targetWidth}" height="${targetHeight}" style="vertical-align: middle" />`);
});
});
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});
`);
};

View File

@ -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"
}
}

View File

@ -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;

View File

@ -0,0 +1,19 @@
{
"type": "object",
"properties": {
"name": {},
"regExp": {},
"context": {
"type": "string"
},
"publicPath": {},
"outputPath": {},
"useRelativePath": {
"type": "boolean"
},
"emitFile": {
"type": "boolean"
}
},
"additionalProperties": true
}

View File

@ -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"
}
}

View File

@ -10,16 +10,25 @@ module.exports = function(input) {
const json = JSON.parse(input);
const result = JSON.stringify(Object.keys(json).reduce((translations, key) => {
const value = json[key];
const id = `${moduleId}.${key}`;
if (typeof value === 'object') {
translations[key] = {
id: `${moduleId}.${key}`,
defaultMessage: json[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});
`;
};

View File

@ -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);
};

View File

@ -0,0 +1,9 @@
{
"name": "text2png-loader",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"text2png": "^2.1.0",
"loader-utils": "^1.2.3"
}
}

View File

@ -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',
},
]
],
},
};
};

260
yarn.lock
View File

@ -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"