Replace OneSkyApp with Crowdin API. Remove unused strings from password component

This commit is contained in:
ErickSkrauch 2019-03-09 03:10:06 +03:00
parent f063cec498
commit 9f49bebc3b
21 changed files with 720 additions and 285 deletions

View File

@ -3,4 +3,5 @@ module.exports = {
apiHost: 'https://dev.account.ely.by',
ga: {id: 'UA-XXXXX-Y'},
sentryCdn: 'https://<key>@sentry.io/<project>',
crowdinApiKey: '',
};

View File

@ -16,8 +16,8 @@
"lint": "eslint ./src",
"flow": "flow",
"i18n:collect": "babel-node ./scripts/i18n-collect.js",
"i18n:publish": "babel-node --presets es2015,stage-0 ./scripts/i18n-onesky.js publish",
"i18n:pull": "babel-node --presets es2015,stage-0 ./scripts/i18n-onesky.js pull",
"i18n:push": "babel-node --presets flow --plugins transform-es2015-modules-commonjs ./scripts/i18n-crowdin.js push",
"i18n:pull": "babel-node --presets flow --plugins transform-es2015-modules-commonjs ./scripts/i18n-crowdin.js pull",
"build": "yarn run clean && yarn run build:webpack --progress",
"build:install": "yarn install && check-node-version",
"build:webpack": "NODE_PATH=./src webpack --colors -p --bail",

334
scripts/i18n-crowdin.js Normal file
View File

@ -0,0 +1,334 @@
// @flow
/* eslint-env node */
/* eslint-disable no-console */
import fs from 'fs';
import path from 'path';
import CrowdinApi from 'crowdin-api';
import MultiProgress from 'multi-progress';
import ch from 'chalk';
import iso639 from 'iso-639-1';
import prompt from 'prompt';
const CONFIG_PATH = path.resolve(`${__dirname}/../config/env.js`);
if (!fs.existsSync(CONFIG_PATH)) {
console.error('To use this scripts please create config/env.js file first');
process.exit(126);
}
const PROJECT_ID = 'elyby';
const PROJECT_KEY = require('./../config/env.js').crowdinApiKey;
const CROWDIN_FILE_PATH = 'accounts/site.json';
const SOURCE_LANG = 'en';
const LANG_DIR = path.resolve(`${__dirname}/../src/i18n`);
const INDEX_FILE_NAME = 'index.json';
const MIN_RELEASE_PROGRESS = 80; // Minimal ready percent before translation can be published
const crowdin = new CrowdinApi({ apiKey: PROJECT_KEY });
const progressBar = new MultiProgress();
/**
* Locales that has been verified by core team members
*/
const RELEASED_LOCALES = ['be', 'fr', 'id', 'pt', 'ru', 'uk', 'vi', 'zh'];
/**
* Array of Crowdin locales to our internal locales representation
*/
const LOCALES_MAP = {
'pt-BR': 'pt',
'zh-CN': 'zh',
};
/**
* This array allows us to customise native languages names, because ISO-639-1 sometimes is strange
*/
const NATIVE_NAMES_MAP = {
be: 'Беларуская',
id: 'Bahasa Indonesia',
lt: 'Lietuvių',
pl: 'Polski',
pt: 'Português do Brasil',
sr: 'Српски',
ro: 'Română',
zh: '简体中文',
};
/**
* This arrays allows us to override Crowdin English languages names
*/
const ENGLISH_NAMES_MAP = {
pt: 'Portuguese, Brazilian',
sr: 'Serbian',
zh: 'Simplified Chinese',
};
/**
* Converts Crowdin's language code to our internal value
*
* @param {string} code
* @return {string}
*/
function toInternalLocale(code: string): string {
return LOCALES_MAP[code] || code;
}
/**
* Форматирует входящий объект с переводами в итоговую строку в том формате, в каком они
* хранятся в самом приложении
*
* @param {object} translates
* @return {string}
*/
function serializeToFormattedJson(translates: Object): string {
return JSON.stringify(sortByKeys(translates), null, 4) + '\n'; // eslint-disable-line prefer-template
}
/**
* http://stackoverflow.com/a/29622653/5184751
*
* @param {object} object
* @return {object}
*/
function sortByKeys(object: Object): Object {
return Object.keys(object).sort().reduce((result, key) => {
result[key] = object[key];
return result;
}, {});
}
interface ProjectInfoFile {
node_type: 'file';
id: number;
name: string;
created: string;
last_updated: string;
last_accessed: string;
last_revision: string;
}
interface ProjectInfoDirectory {
node_type: 'directory';
id: number;
name: string;
files: Array<ProjectInfoFile | ProjectInfoDirectory>;
}
interface ProjectInfoResponse {
details: {
source_language: {
name: string;
code: string;
};
name: string;
identifier: string;
created: string;
description: string;
join_policy: string;
last_build: string | null;
last_activity: string;
participants_count: string; // it's number, but string in the response
logo_url: string | null;
total_strings_count: string; // it's number, but string in the response
total_words_count: string; // it's number, but string in the response
duplicate_strings_count: number;
duplicate_words_count: number;
invite_url: {
translator: string;
proofreader: string;
};
};
languages: Array<{
name: string; // English language name
code: string;
can_translate: 0 | 1;
can_approve: 0 | 1;
}>;
files: Array<ProjectInfoFile | ProjectInfoDirectory>;
}
async function pullLocales() {
const { languages }: ProjectInfoResponse = await crowdin.projectInfo(PROJECT_ID);
return languages;
}
interface LanguageStatusNode {
node_type: 'directory' | 'file';
id: number;
name: string;
phrases: number;
translated: number;
approved: number;
words: number;
words_translated: number;
words_approved: number;
files: Array<LanguageStatusNode>;
}
function findFile(root: Array<LanguageStatusNode>, path: string): LanguageStatusNode | null {
const [nodeToSearch, ...rest] = path.split('/');
for (const node of root) {
if (node.name !== nodeToSearch) {
continue;
}
if (rest.length === 0) {
return node;
}
return findFile(node.files, rest.join('/'));
}
return null;
}
interface IndexFileEntry {
code: string;
name: string;
englishName: string;
progress: number;
isReleased: bool;
}
async function pull() {
console.log('Pulling locales list...');
const locales = await pullLocales();
const checkingProgressBar = progressBar.newBar('| Pulling locales info :bar :percent | :current/:total', {
total: locales.length,
incomplete: '\u2591',
complete: '\u2588',
width: locales.length,
});
// Add prefix 'c' to current and total to prevent filling thees placeholders with real values
const downloadingProgressBar = progressBar.newBar('| Downloading translates :bar :percent | :cCurrent/:cTotal', {
total: 100,
incomplete: '\u2591',
complete: '\u2588',
width: locales.length,
});
let downloadingTotal = 0;
let downloadingReady = 0;
const results = await Promise.all(locales.map(async (locale) => {
const { files }: { files: Array<LanguageStatusNode> } = await crowdin.languageStatus(PROJECT_ID, locale.code);
checkingProgressBar.tick();
const fileInfo = findFile(files, CROWDIN_FILE_PATH);
if (fileInfo === null) {
throw new Error('Unable to find translation file. Please check the CROWDIN_FILE_PATH param.');
}
const progress = fileInfo.words_approved / fileInfo.words * 100;
if (!RELEASED_LOCALES.includes(toInternalLocale(locale.code)) && progress < MIN_RELEASE_PROGRESS) {
return null;
}
downloadingProgressBar.update(downloadingReady / ++downloadingTotal, {
cCurrent: downloadingReady,
cTotal: downloadingTotal,
});
const translatesFilePath = await crowdin.exportFile(PROJECT_ID, CROWDIN_FILE_PATH, locale.code);
downloadingProgressBar.update(++downloadingReady / downloadingTotal, {
cCurrent: downloadingReady,
cTotal: downloadingTotal,
});
return {
locale,
progress,
translatesFilePath,
};
}));
console.log('Locales are downloaded. Writing them to file system.');
const indexFileEntries: { [string]: IndexFileEntry } = {
en: {
code: 'en',
name: 'English',
englishName: 'English',
progress: 100,
isReleased: true,
},
};
// $FlowFixMe
await Promise.all(results.map((result) => new Promise((resolve, reject) => {
if (result === null) {
resolve();
return;
}
const { locale: { code, name }, progress, translatesFilePath } = result;
const ourCode = toInternalLocale(code);
indexFileEntries[ourCode] = {
code: ourCode,
name: NATIVE_NAMES_MAP[ourCode] || iso639.getNativeName(ourCode),
englishName: ENGLISH_NAMES_MAP[ourCode] || name,
progress: parseFloat(progress.toFixed(1)),
isReleased: RELEASED_LOCALES.includes(ourCode),
};
fs.copyFile(translatesFilePath, path.join(LANG_DIR, `${ourCode}.json`), 0, (err) => {
err ? reject(err) : resolve();
});
})));
console.log('Writing an index file.');
fs.writeFileSync(path.join(LANG_DIR, INDEX_FILE_NAME), serializeToFormattedJson(indexFileEntries));
console.log(ch.green('The index file was successfully written'));
}
function push() {
return new Promise((resolve, reject) => {
prompt.start();
prompt.get({
properties: {
disapprove: {
description: 'Disapprove changed lines? [Y/n]',
pattern: /^y|n$/i,
message: 'Please enter "y" or "n"',
default: 'y',
before: (value) => value.toLowerCase() === 'y',
},
},
}, async (err, { disapprove }) => {
if (err) {
reject(err);
return;
}
console.log(`Publishing ${ch.bold(SOURCE_LANG)} translates file...`);
await crowdin.updateFile(PROJECT_ID, {
[CROWDIN_FILE_PATH]: path.join(LANG_DIR, `${SOURCE_LANG}.json`),
}, {
// eslint-disable-next-line camelcase
update_option: disapprove ? 'update_as_unapproved' : 'update_without_changes',
});
console.log(ch.green('Success'));
resolve();
});
});
}
try {
const action = process.argv[2];
switch (action) {
case 'pull':
pull();
break;
case 'push':
push();
break;
default:
console.error(`Unknown action ${action}`);
}
} catch (exception) {
console.error(exception);
}

View File

@ -1,185 +0,0 @@
/* eslint-env node */
/* eslint-disable no-console */
import onesky from 'onesky-utils';
import fs from 'fs';
import ch from 'chalk';
const LANG_DIR = `${__dirname}/../src/i18n`;
const SOURCE_LANG = 'en'; // Базовый язык, относительно которого будут формироваться все остальные переводы
const SOURCE_FILE_NAME = 'i18n.json'; // Название файла с исходными строками внутри OneSky
const INDEX_FILE_NAME = 'index.json'; // Название файла с информацией о переводах
const MIN_RELEASE_PROGRESS = 80; // Какой процент локали перевода должен быть выполнен, чтобы локаль была опубликована
/**
* Массив локалей для соответствия каноничному виду в OneSky и нашему представлению
* о том, каким должны быть имена локалей
*/
const LOCALES_MAP = {
ru: 'ru-RU',
en: 'en-GB',
sl: 'sl-SI',
fr: 'fr-FR',
el: 'el-GR',
de: 'de-DE',
sr: 'sr-RS',
lt: 'lt-LT',
zh: 'zh-Hans-CN',
};
/**
* Некоторые языки, после выгрузки из OneSky, имеют не очень информативные названия,
* так что здесь можно указать точные имена для результирующего файла index.json
*/
const ORIGINAL_NAMES_MAP = {
en: 'English, UK',
pt: 'Português do Brasil',
zh: '简体中文',
};
/**
* Некоторые языки, после выгрузки из OneSky, имеют не очень точные английские названия,
* так что здесь можно указать точные имена для результирующего файла index.json
*/
const ENGLISH_NAMES_MAP = {
en: 'English, UK',
pt: 'Portuguese, Brazilian',
zh: 'Simplified Chinese',
};
// https://ely-translates.oneskyapp.com/admin/site/settings
const defaultOptions = {
apiKey: '5MaW9TYp0S3qdJgkZ5QLgEIDeabkFDzB',
secret: 'qd075hUNpop4DItD6KOXKQnbqWPLZilf',
projectId: 201323,
};
/**
* Переводит из кода языка в OneSky в наше представление
*
* @param {string} code
* @return {string}
*/
function code2locale(code) {
for (const locale in LOCALES_MAP) {
if (code === LOCALES_MAP[locale]) {
return locale;
}
}
return code;
}
/**
* Переводит из нашего формата локалей в ожидаемое значение OneSky
*
* @param {string} locale
* @return {string}
*/
function locale2code(locale) {
return LOCALES_MAP[locale] || locale;
}
/**
* Форматирует входящий объект с переводами в итоговую строку в том формате, в каком они
* хранятся в самом приложении
*
* @param {object} translates
* @return {string}
*/
function formatTranslates(translates) {
return JSON.stringify(sortByKeys(translates), null, 4) + '\n'; // eslint-disable-line prefer-template
}
/**
* http://stackoverflow.com/a/29622653/5184751
*
* @param {object} object
* @return {object}
*/
function sortByKeys(object) {
return Object.keys(object).sort().reduce((result, key) => {
result[key] = object[key];
return result;
}, {});
}
/**
* Убирает значение в скобках.
* Например: "French (France)" => "French".
*
* @param {string} value
* @return {string}
*/
function trimValueInBrackets(value) {
return value.match(/^([^(]+)/)[0].trim();
}
async function pullReadyLanguages() {
const languages = JSON.parse(await onesky.getLanguages({...defaultOptions}));
return languages.data
.filter((elem) => elem.is_ready_to_publish || parseFloat(elem.translation_progress) > MIN_RELEASE_PROGRESS);
}
async function pullTranslate(language) {
const rawResponse = await onesky.getFile({...defaultOptions, language, fileName: SOURCE_FILE_NAME});
const response = JSON.parse(rawResponse);
fs.writeFileSync(`${LANG_DIR}/${code2locale(language)}.json`, formatTranslates(response));
}
async function pull() {
console.log('Pulling locales list...');
const langs = await pullReadyLanguages();
const langsList = langs.map((elem) => elem.custom_locale || elem.code);
console.log(ch.green('Pulled locales: ') + langsList.map((lang) => code2locale(lang)).join(', '));
console.log('Pulling translates...');
await Promise.all(langsList.map(async (lang) => {
await pullTranslate(lang);
console.log(ch.green('Locale ') + ch.white.bold(code2locale(lang)) + ch.green(' successfully pulled'));
}));
console.log('Writing an index file...');
const mapFileContent = {};
langs.map((elem) => {
mapFileContent[elem.locale] = {
code: elem.locale,
name: ORIGINAL_NAMES_MAP[elem.locale] || trimValueInBrackets(elem.local_name),
englishName: ENGLISH_NAMES_MAP[elem.locale] || trimValueInBrackets(elem.english_name),
progress: parseFloat(elem.translation_progress),
isReleased: elem.is_ready_to_publish,
};
});
fs.writeFileSync(`${LANG_DIR}/${INDEX_FILE_NAME}`, formatTranslates(mapFileContent));
console.log(ch.green('The index file was successfully written'));
}
async function publish() {
console.log(`Publishing ${ch.bold(SOURCE_LANG)} translates file...`);
await onesky.postFile({
...defaultOptions,
format: 'HIERARCHICAL_JSON',
content: fs.readFileSync(`${LANG_DIR}/${SOURCE_LANG}.json`, 'utf8'),
keepStrings: false,
language: locale2code(SOURCE_LANG),
fileName: SOURCE_FILE_NAME,
});
console.log(ch.green('Success'));
}
try {
const action = process.argv[2];
switch (action) {
case 'pull':
pull();
break;
case 'publish':
publish();
break;
default:
throw new Error(`Unknown action ${action}`);
}
} catch (exception) {
console.error(exception);
}

View File

@ -11,8 +11,10 @@
"license": "ISC",
"dependencies": {
"chalk": "^1.1.3",
"crowdin-api": "erickskrauch/crowdin-api#add_missed_methods_and_fix_files_uploading",
"iso-639-1": "^2.0.3",
"multi-progress": "^2.0.0",
"node-babel": "^0.1.2",
"onesky-utils": "^1.2",
"prompt": "^1.0.0"
}
}

View File

@ -1,9 +1,6 @@
{
"passwordTitle": "Enter password",
"signInButton": "Sign in",
"invalidPassword": "You entered wrong account password.",
"suggestResetPassword": "Are you have {link}?",
"forgotYourPassword": "forgot your password",
"forgotPassword": "Forgot password",
"accountPassword": "Account password",
"rememberMe": "Remember me on this device"

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Увядзіце код",
"components.auth.password.accountPassword": "Пароль акаўнту",
"components.auth.password.forgotPassword": "Забыў пароль",
"components.auth.password.forgotYourPassword": "забылі пароль",
"components.auth.password.invalidPassword": "Вы ўвялі памылковы пароль акаўнту.",
"components.auth.password.passwordTitle": "Увядзіце пароль",
"components.auth.password.rememberMe": "Запомніць мяне на гэтай прыладзе",
"components.auth.password.signInButton": "Увайсці",
"components.auth.password.suggestResetPassword": "Вы {link}?",
"components.auth.permissions.approve": "Дазволіць",
"components.auth.permissions.decline": "Адмена",
"components.auth.permissions.permissionsTitle": "Правы праграмы",

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Enter code",
"components.auth.password.accountPassword": "Account password",
"components.auth.password.forgotPassword": "Forgot password",
"components.auth.password.forgotYourPassword": "forgot your password",
"components.auth.password.invalidPassword": "You entered wrong account password.",
"components.auth.password.passwordTitle": "Enter password",
"components.auth.password.rememberMe": "Remember me on this device",
"components.auth.password.signInButton": "Sign in",
"components.auth.password.suggestResetPassword": "Are you have {link}?",
"components.auth.permissions.approve": "Approve",
"components.auth.permissions.decline": "Decline",
"components.auth.permissions.permissionsTitle": "Application permissions",

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Entrer le code",
"components.auth.password.accountPassword": "Mot de passe du compte",
"components.auth.password.forgotPassword": "Mot de passe oublié",
"components.auth.password.forgotYourPassword": "oublié votre mot de passe",
"components.auth.password.invalidPassword": "Vous avez entré un mauvais mot de passe pour ce compte.",
"components.auth.password.passwordTitle": "Entrer votre mot de passe",
"components.auth.password.rememberMe": "Se souvenir de moi sur cet appareil",
"components.auth.password.signInButton": "Se connecter",
"components.auth.password.suggestResetPassword": "Avez-vous {link}?",
"components.auth.permissions.approve": "Approuver",
"components.auth.permissions.decline": "Refuser",
"components.auth.permissions.permissionsTitle": "Permissions de l'application",

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Masukkan kode",
"components.auth.password.accountPassword": "Kata sandi akun",
"components.auth.password.forgotPassword": "Lupa kata sandi",
"components.auth.password.forgotYourPassword": "lupa kata sandi anda",
"components.auth.password.invalidPassword": "Anda memasukan kata sandi yang salah.",
"components.auth.password.passwordTitle": "Masukan kata sandi",
"components.auth.password.rememberMe": "Ingat saya di perangkat ini",
"components.auth.password.signInButton": "Masuk",
"components.auth.password.suggestResetPassword": "Apakah anda memiliki {link}?",
"components.auth.permissions.approve": "Setuju",
"components.auth.permissions.decline": "Tolak",
"components.auth.permissions.permissionsTitle": "Perizinan aplikasi",

View File

@ -8,8 +8,8 @@
},
"en": {
"code": "en",
"name": "English, UK",
"englishName": "English, UK",
"name": "English",
"englishName": "English",
"progress": 100,
"isReleased": true
},
@ -17,7 +17,7 @@
"code": "fr",
"name": "Français",
"englishName": "French",
"progress": 80.5,
"progress": 73.8,
"isReleased": true
},
"id": {
@ -31,14 +31,14 @@
"code": "lt",
"name": "Lietuvių",
"englishName": "Lithuanian",
"progress": 81.6,
"progress": 81,
"isReleased": false
},
"pl": {
"code": "pl",
"name": "Polski",
"englishName": "Polish",
"progress": 84,
"progress": 83,
"isReleased": false
},
"pt": {
@ -48,6 +48,13 @@
"progress": 100,
"isReleased": true
},
"ro": {
"code": "ro",
"name": "Română",
"englishName": "Romanian",
"progress": 81.1,
"isReleased": false
},
"ru": {
"code": "ru",
"name": "Русский",
@ -59,7 +66,7 @@
"code": "sr",
"name": "Српски",
"englishName": "Serbian",
"progress": 84,
"progress": 83.3,
"isReleased": false
},
"uk": {
@ -73,7 +80,7 @@
"code": "vi",
"name": "Tiếng Việt",
"englishName": "Vietnamese",
"progress": 85.8,
"progress": 83.6,
"isReleased": true
},
"zh": {
@ -81,6 +88,6 @@
"name": "简体中文",
"englishName": "Simplified Chinese",
"progress": 100,
"isReleased": false
"isReleased": true
}
}

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Įveskite kodą",
"components.auth.password.accountPassword": "Paskyros slaptažodis",
"components.auth.password.forgotPassword": "Pamiršau slaptažodį",
"components.auth.password.forgotYourPassword": "Pamiršote slaptažodį",
"components.auth.password.invalidPassword": "Įvedėte neteisingą paskyros slaptažodį.",
"components.auth.password.passwordTitle": "Įvesti slaptažodį",
"components.auth.password.rememberMe": "Prisiminti mane šiame įrenginyje",
"components.auth.password.signInButton": "Prisijungti",
"components.auth.password.suggestResetPassword": "Ar turite {link}?",
"components.auth.permissions.approve": "Patvirtinti",
"components.auth.permissions.decline": "Atmesti",
"components.auth.permissions.permissionsTitle": "Programos leidimai",

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Wprowadź kod",
"components.auth.password.accountPassword": "Hasło do konta",
"components.auth.password.forgotPassword": "Zapomniałeś hasła",
"components.auth.password.forgotYourPassword": "zapomniałeś hasła",
"components.auth.password.invalidPassword": "Podałeś nieprawidłowe hasło do konta.",
"components.auth.password.passwordTitle": "Wprowadź hasło",
"components.auth.password.rememberMe": "Zapamiętaj mnie na tym urządzeniu",
"components.auth.password.signInButton": "Zaloguj",
"components.auth.password.suggestResetPassword": "Nie pamiętasz hasła {link}?",
"components.auth.permissions.approve": "Zatwierdź",
"components.auth.permissions.decline": "Odrzuć",
"components.auth.permissions.permissionsTitle": "Uprawnienia aplikacji",

View File

@ -1,6 +1,6 @@
{
"components.accounts.addAccount": "Adicionar conta",
"components.accounts.goToEly": "Ir para o perfil Ely.by",
"components.accounts.goToEly": "Ir para o perfil do Ely.by",
"components.accounts.logout": "Sair",
"components.auth.acceptRules.accept": "Aceitar",
"components.auth.acceptRules.declineAndLogout": "Recusar e sair",
@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Digite o código",
"components.auth.password.accountPassword": "Senha da conta",
"components.auth.password.forgotPassword": "Esqueceu a senha",
"components.auth.password.forgotYourPassword": "esqueceu a senha",
"components.auth.password.invalidPassword": "Você colocou a senha errada.",
"components.auth.password.passwordTitle": "Coloque a senha",
"components.auth.password.rememberMe": "Lembrar de mim neste aparelho",
"components.auth.password.signInButton": "Entrar",
"components.auth.password.suggestResetPassword": "Você {link}?",
"components.auth.permissions.approve": "Aprovar",
"components.auth.permissions.decline": "Recusar",
"components.auth.permissions.permissionsTitle": "Permissões de aplicação",

281
src/i18n/ro.json Normal file
View File

@ -0,0 +1,281 @@
{
"components.accounts.addAccount": "Adauga cont",
"components.accounts.goToEly": "Du-te pe profilul Ely.by",
"components.accounts.logout": "Deconecteaza-te",
"components.auth.acceptRules.accept": "Accept",
"components.auth.acceptRules.declineAndLogout": "Declin si deconectare",
"components.auth.acceptRules.description1": "Am actualizat {link} nostru.",
"components.auth.acceptRules.description2": "Pentru a folosi in continuare serviciul {name}, trebuie sa le accepti.",
"components.auth.acceptRules.termsOfService": "Conditii de utilizare",
"components.auth.acceptRules.title": "Acordul Utilizatorului",
"components.auth.activation.accountActivationTitle": "Activarea contului",
"components.auth.activation.activationMailWasSent": "Va rugam sa verificati {email} pentru mesaj cu instructiuni viitoare.",
"components.auth.activation.activationMailWasSentNoEmail": "Va rugam sa verificati Email pentru mesaj cu instructiuni",
"components.auth.activation.confirmEmail": "Confirma E-mail-ul",
"components.auth.activation.didNotReceivedEmail": "Nu ai primit E-mail?",
"components.auth.activation.enterTheCode": "Completeaza aici cu codul din E-mail.",
"components.auth.appInfo.appDescription": "Bine ai venit la sistemul de autorizatie Ely.by, care iti permite sa faci orice actiune asupra contului in siguranta. Este un portal catre multe siteuri si programe software, incluzand lansatoare de jocuri.",
"components.auth.appInfo.appName": "Conturi Ely.by",
"components.auth.appInfo.documentation": "documentatie",
"components.auth.appInfo.goToAuth": "Du-te la autentificare",
"components.auth.appInfo.useItYourself": "Viziteaza {link} nostru pentru a invata cum sa folosesti serviciul nostru in proiectele tale.",
"components.auth.chooseAccount.addAccount": "Logheaza-te cu alt cont",
"components.auth.chooseAccount.chooseAccountTitle": "Alege un cont",
"components.auth.chooseAccount.logoutAll": "Deconecteaza-te de pe toate conturile",
"components.auth.chooseAccount.pleaseChooseAccount": "Vă rugăm să selectați un cont pe care doriți sa îl utilizați",
"components.auth.chooseAccount.pleaseChooseAccountForApp": "Vă rugăm să selectați un cont pe care doriți să îl utilizați pentru a autoriza {appName}",
"components.auth.finish.authForAppFailed": "Autorizatia pentru {appName} a esuat",
"components.auth.finish.authForAppSuccessful": "Autorizatia pentru {appName} a fost completata cu succes",
"components.auth.finish.copy": "Copiaza",
"components.auth.finish.passCodeToApp": "Pentru a completa procesul de autorizatie, va rugam, dati acest cod la {appName}",
"components.auth.finish.waitAppReaction": "Va rugam sa asteptati pana cand se va raspunde la aplicatie",
"components.auth.forgotPassword.alreadyHaveCode": "Am deja codul",
"components.auth.forgotPassword.pleasePressButton": "Va rugam sa apasati butonul de mai jos pentru a primi un E-mail cu codul pentru recuperarea parolei.",
"components.auth.forgotPassword.sendMail": "Trimite mail",
"components.auth.forgotPassword.specifyEmail": "Specifica E-mailul folosit la inregistrare sau ultimul nume avut pentru contul tau si vom trimite un E-mail cu instructiunile pentru recuperarea parolei.",
"components.auth.forgotPassword.title": "Am uitat parola",
"components.auth.login.createNewAccount": "Creeaza un cont nou",
"components.auth.login.emailOrUsername": "E-mail sau utilizator",
"components.auth.login.loginTitle": "Conecteaza-te",
"components.auth.login.next": "Urmatorul",
"components.auth.mfa.description": "Pentru a vă conecta în acest cont, trebuie să introduceţi o parolă de o singură dată din aplicaţia mobilă",
"components.auth.mfa.enterTotp": "Introduceți codul",
"components.auth.password.accountPassword": "Parola contului",
"components.auth.password.forgotPassword": "Am uitat parola",
"components.auth.password.passwordTitle": "Scrie parola",
"components.auth.password.rememberMe": "Tine-ma minte pe acest aparat",
"components.auth.password.signInButton": "Conecteaza-te",
"components.auth.permissions.approve": "Aprob",
"components.auth.permissions.decline": "Declin",
"components.auth.permissions.permissionsTitle": "Permisiunile aplicatiei",
"components.auth.permissions.scope_account_email": "Acceseaza adresa ta de E-mail",
"components.auth.permissions.scope_account_info": "Acceseaza datele profilului tau (excluzand E-mail)",
"components.auth.permissions.scope_minecraft_server_session": "Date de autorizatie pentru serverul de Minecraft",
"components.auth.permissions.scope_offline_access": "Acceseaza date ale profilului tau cand esti deconectat",
"components.auth.permissions.theAppNeedsAccess1": "Aceasta aplicatie are nevoie de acces",
"components.auth.permissions.theAppNeedsAccess2": "datelor tale",
"components.auth.permissions.youAuthorizedAs": "Esti autorizat ca:",
"components.auth.recoverPassword.change": "Schimba parola",
"components.auth.recoverPassword.contactSupport": "Suport pentru contact",
"components.auth.recoverPassword.enterCodeBelow": "Va rugam sa inserati codul primit in campul de mai jos:",
"components.auth.recoverPassword.enterNewPasswordBelow": "Enter si repeta noua parola mai jos:",
"components.auth.recoverPassword.enterTheCode": "Insereaza codul de confirmare",
"components.auth.recoverPassword.messageWasSent": "Codul de recuperare a fost trimis spre E-mail-ul tau.",
"components.auth.recoverPassword.messageWasSentTo": "Codul de recuperare a fost trimis la E-mail-ul {email}.",
"components.auth.recoverPassword.newPassword": "Insereaza noua parola",
"components.auth.recoverPassword.newRePassword": "Repeta noua parola",
"components.auth.recoverPassword.title": "Schimba parola",
"components.auth.register.acceptRules": "Accept {link}",
"components.auth.register.accountPassword": "Parola contului",
"components.auth.register.registerTitle": "Inregistreaza-te",
"components.auth.register.repeatPassword": "Repeta parola",
"components.auth.register.signUpButton": "Inregistrare",
"components.auth.register.termsOfService": "termenii serviciului",
"components.auth.register.yourEmail": "E-mail-ul tau",
"components.auth.register.yourNickname": "Numele tau",
"components.auth.resendActivation.sendNewEmail": "Trimite un Email nou",
"components.auth.resendActivation.specifyYourEmail": "Va rugam sa introduceti Emailul cu care v-ati inregistrat si o sa va trimitem codul de activare",
"components.auth.resendActivation.title": "Nu am primit un Email",
"components.contact.cannotAccessMyAccount": "Nu imi pot accesa contul",
"components.contact.close": "Inchide",
"components.contact.disclaimer": "Va rugam sa formulati o parere cu informatii care ne pot ajuta, ca sa va putem intelege si rezolva problema",
"components.contact.email": "Email",
"components.contact.foundBugOnSite": "Am gasit o problema pe site",
"components.contact.improvementsSuggestion": "Am o propunere pentru a imbunatati functionarea",
"components.contact.integrationQuestion": "Întrebarea privind integrarea serviciului",
"components.contact.message": "Mesaj",
"components.contact.other": "Altceva",
"components.contact.philosophicalThought": "Întrebarea corect formulată — jumătate din răspuns",
"components.contact.send": "Trimite",
"components.contact.subject": "Subiect",
"components.contact.title": "Formular de parere",
"components.contact.whichQuestion": "In ce esti interesat?",
"components.contact.youMessageReceived": "Mesajul tau a fost primit. O sa iti raspundem cat de repede putem. Raspunsul in vei primi pe Email:",
"components.dev.apps.accountsAllowsYouYoUseOauth2": "Ely.by Accounts service provides users with a quick and easy-to-use way to login to your site, launcher or Minecraft server via OAuth2 authorization protocol. You can find more information about integration with Ely.by Accounts in {ourDocumentation}.",
"components.dev.apps.accountsForDevelopers": "Ely.by Accounts for developers",
"components.dev.apps.addNew": "Add new",
"components.dev.apps.allRefreshTokensWillBecomeInvalid": "All \"refresh\" tokens will become invalid and after next authorization the user will get permissions prompt.",
"components.dev.apps.appAndAllTokenWillBeDeleted": "Application and all associated tokens will be deleted.",
"components.dev.apps.applicationForm.appDescriptionWillBeAlsoVisibleOnOauthPage": "Application's description will be displayed at the authorization page too. It isn't a required field. In authorization process the value may be overridden.",
"components.dev.apps.applicationForm.applicationName": "Application name:",
"components.dev.apps.applicationForm.createApplication": "Create application",
"components.dev.apps.applicationForm.creatingApplication": "Creating an application",
"components.dev.apps.applicationForm.description": "Description:",
"components.dev.apps.applicationForm.ipAddressIsOptionButPreferable": "IP address is optional, but is very preferable. It might become handy in case of we suddenly decide to play on your server with the entire band (=",
"components.dev.apps.applicationForm.minecraftServer": "Minecraft server",
"components.dev.apps.applicationForm.redirectUri": "Redirect URI:",
"components.dev.apps.applicationForm.redirectUriLimitsAllowableBaseAddress": "Redirection URI (redirectUri) determines a base address, that user will be allowed to be redirected to after authorization. In order to improve security it's better to use the whole path instead of just a domain name. For example: https://example.com/oauth/ely.",
"components.dev.apps.applicationForm.serverIp": "Server IP:",
"components.dev.apps.applicationForm.serverName": "Server name:",
"components.dev.apps.applicationForm.toDisplayRegistrationFormChooseType": "To display registration form for a new application choose necessary type.",
"components.dev.apps.applicationForm.updateApplication": "Update application",
"components.dev.apps.applicationForm.updatingApplication": "Updating an application",
"components.dev.apps.applicationForm.website": "Web site",
"components.dev.apps.applicationForm.websiteLink": "Website link:",
"components.dev.apps.applicationForm.websiteLinkWillBeUsedAsAdditionalId": "Site's link is optional, but it can be used as an additional identifier of the application.",
"components.dev.apps.applicationForm.youCanAlsoSpecifyServerSite": "You also can specify either server's site URL or its community in a social network.",
"components.dev.apps.authorization": "Authorization",
"components.dev.apps.cancel": "Cancel",
"components.dev.apps.continue": "Continue",
"components.dev.apps.countUsers": "{count, plural, =0 {No users} one {# user} other {# users}}",
"components.dev.apps.delete": "Delete",
"components.dev.apps.editDescription": "{icon} Edit description",
"components.dev.apps.feedback": "feedback",
"components.dev.apps.ifYouHaveAnyTroubles": "If you are experiencing difficulties, you can always use {feedback}. We'll surely help you.",
"components.dev.apps.ifYouSuspectingThatSecretHasBeenCompromised": "If you are suspecting that your Client Secret has been compromised, then you may want to reset it value. It'll cause recall of the all \"access\" and \"refresh\" tokens that have been issued. You can also recall all issued tokens without changing Client Secret.",
"components.dev.apps.ourDocumentation": "our documentation",
"components.dev.apps.performing": "Performing…",
"components.dev.apps.resetClientSecret": "Reset Client Secret",
"components.dev.apps.revokeAllTokens": "Revoke all tokens",
"components.dev.apps.shallWeStart": "Shall we start?",
"components.dev.apps.takeCareAccessTokensInvalidation": "Take care because \"access\" tokens won't be invalidated immediately.",
"components.dev.apps.weDontKnowAnythingAboutYou": "We don't know anything about you yet.",
"components.dev.apps.youDontHaveAnyApplication": "You don't have any app registered yet.",
"components.dev.apps.youMustAuthToBegin": "You have to authorize to start.",
"components.dev.apps.yourApplications": "Your applications:",
"components.footerMenu.contactUs": "Contacteaza-ne",
"components.footerMenu.forDevelopers": "For developers",
"components.footerMenu.rules": "Reguli",
"components.footerMenu.siteLanguage": "Limba site-ului",
"components.languageSwitcher.improveTranslates": "Imbunatățește traducerea Ely.by",
"components.languageSwitcher.improveTranslatesArticleLink": "Acest articol",
"components.languageSwitcher.improveTranslatesDescription": "Localizarea Ely.by este un efort comunitar. Dacă vreți să vedeți Ely.by tradus într-o altă limbă, ne-ar plăcea ajutorul tău. Pentru a aplica citiți {articleLink}.",
"components.languageSwitcher.mayBeInaccurate": "Poate fi incorectă",
"components.languageSwitcher.siteLanguage": "Limba site-ului",
"components.languageSwitcher.startTyping": "Începeți să tastați...",
"components.languageSwitcher.translationProgress": "{progress}% tradus",
"components.languageSwitcher.weDoNotSupportThisLang": "Ne pare rău, nu acceptăm această limbă",
"components.profile.accountDescription": "Conturile Ely.by iti permit sa accesezi multe resurese din Minecraft. Va rugam sa aveti grija de siguranta contului dvs. Folositi o parola sigura si schimbati-o regulat.",
"components.profile.accountPreferencesTitle": "Preferintele contului Ely.by",
"components.profile.back": "Inapoi",
"components.profile.changeEmail.alreadyReceivedCode": "Am primit codul",
"components.profile.changeEmail.changeEmailButton": "Schimba E-mailul",
"components.profile.changeEmail.changeEmailDescription": "Pentru a schimba E-mail-ul curent trebuie sa dovedesti ca inca esti detinatorul E-mail-ului curent si sa il confirmi pe cel nou.",
"components.profile.changeEmail.changeEmailTitle": "Schimba E-mail",
"components.profile.changeEmail.codePlaceholder": "Lipeste codul aici",
"components.profile.changeEmail.currentAccountEmail": "Adresa de E-mail curenta:",
"components.profile.changeEmail.enterFinalizationCode": "Pentru a cofirma E-mail-ul nou, insereaza codul primit in campul de mai jos:",
"components.profile.changeEmail.enterInitializationCode": "E-mail-ul cu un cod de initializare pentru schimbarea adresei de E-mail a fost trimisa la {email}. Va rugam sa inserati codul in campul de mai jos:",
"components.profile.changeEmail.enterNewEmail": "Apoi insereaza noua ta adresa de E-mail, care o vei folosi pe acest cont. O sa primeste codul de cofirmare.",
"components.profile.changeEmail.finalizationCodeWasSentToEmail": "Codul de cofirmare pentru schimbarea E-mail-ului a fost trimis la {email}.",
"components.profile.changeEmail.newEmailPlaceholder": "Introdu noul E-mail",
"components.profile.changeEmail.pressButtonToStart": "Apasa butonul de mai jos pentru a trimite un mesaj cu codul pentru initializarea schimbarii E-mail-ului.",
"components.profile.changeEmail.sendEmailButton": "Trimite E-mail",
"components.profile.changePassword.achievementLossWarning": "Iti pretuiesti realizarile din joc, nu?",
"components.profile.changePassword.changePasswordButton": "Schimba parola",
"components.profile.changePassword.changePasswordDescription": "Va rugam sa alegeti o parola care o sa fie diferita fata de alte site-uri si sa nu fie identica cu cea pe care o folositi la logarea pe servere de Minecraft.",
"components.profile.changePassword.changePasswordTitle": "Schimba parola",
"components.profile.changePassword.logoutOnAllDevices": "Deconecteaza-te de pe toate aparetele",
"components.profile.changePassword.newPasswordLabel": "Noua parola:",
"components.profile.changePassword.passwordRequirements": "Parola trebuie sa contina minim 8 caractere. Poate sa fie orice simbol — nu te limita, creeaza o parola de neimaginat!",
"components.profile.changePassword.repeatNewPasswordLabel": "Repete parola:",
"components.profile.changeUsername.changeUsernameButton": "Schimba numele",
"components.profile.changeUsername.changeUsernameDescription": "Puteți să vă schimbați numele la orice valoare arbitrară. Rețineți că nu este recomandat să luați o un nume al unui cont Mojang.",
"components.profile.changeUsername.changeUsernameTitle": "Schimba numele",
"components.profile.changeUsername.changeUsernameWarning": "Ai grija: Daca te joci pe servere care se bazeaza pe nume, schimbare lui iti poate sterge tot progresul.",
"components.profile.changedAt": "Schimbat {at}",
"components.profile.disabled": "Dezactivata",
"components.profile.email": "Email:",
"components.profile.enabled": "Activat",
"components.profile.mojangPriorityWarning": "Un cont Mojang cu acelasi nume a fost gasit. Acordand la {rules}, doar detinatorul contului are control asupra ocuparii acestuia.",
"components.profile.multiFactorAuth.codePlaceholder": "Introduceți codul aici",
"components.profile.multiFactorAuth.disable": "Dezactivați",
"components.profile.multiFactorAuth.disableMfa": "Dezactivați autentificarea cu doi factori.",
"components.profile.multiFactorAuth.disableMfaInstruction": "Pentru a dezactiva autentificarea cu doi factori, aveți nevoie să furnizați un cod din aplicația mobilă și să confirmați acțiunea cu parola contului curentă.",
"components.profile.multiFactorAuth.enable": "Activaţi",
"components.profile.multiFactorAuth.enterCodeFromApp": "Pentru a termina configurarea Twofactor auth, vă rugăm să introduceţi codul primit în aplicaţia de mobil:",
"components.profile.multiFactorAuth.enterKeyManually": "Dacă nu puteți scana codul QR, incercați introducerea cheii secrete manual:",
"components.profile.multiFactorAuth.findAlternativeApps": "Găsiți aplicații alternative",
"components.profile.multiFactorAuth.installOnOfTheApps": "Instalați una dintre următoarele aplicații:",
"components.profile.multiFactorAuth.mfaDescription": "Autentificarea Twofactor este un strat suplimentar de securitate conceput pentru a vă asigura că sunteți singura persoană care vă poate accesa contul, chiar dacă parola este furată.",
"components.profile.multiFactorAuth.mfaEnabledForYourAcc": "Autentificarea Twofactor pentru contul dumneavoastră este activă acum",
"components.profile.multiFactorAuth.mfaIntroduction": "Mai întâi de toate, trebuie să instalați una dintre aplicațiile noastre sugerate pe telefon. Această aplicație va genera coduri pentru dumneavoastră. Vă rugăm să alegeţi sistemul de operare pentru a obţine link-uri de instalare corespunzătoare.",
"components.profile.multiFactorAuth.mfaLoginFlowDesc": "Un cod suplimentar va fi solicitat data viitoare când vă conectaţi. Vă rugăm să reţineţi că autorizaţia de Minecraft nu va funcţiona atunci când Twofactor auth este activat.",
"components.profile.multiFactorAuth.mfaTitle": "Autentificare cu doi factori",
"components.profile.multiFactorAuth.or": "QR",
"components.profile.multiFactorAuth.ready": "Gata",
"components.profile.multiFactorAuth.scanQrCode": "Open your favorite QR scanner app and scan the following QR code:",
"components.profile.multiFactorAuth.theAppIsInstalled": "Aplicația a fost instalată",
"components.profile.multiFactorAuth.whenKeyEntered": "If a temporary code appears in your twofactor auth app, then you may proceed to the next step.",
"components.profile.nickname": "Nume:",
"components.profile.password": "Parola:",
"components.profile.passwordRequestForm.continue": "Continua",
"components.profile.passwordRequestForm.description": "Pentru a completa actiunea, insereaza parola contului",
"components.profile.passwordRequestForm.title": "Cofrima actiunea",
"components.profile.personalData": "Date personale",
"components.profile.preferencesDescription": "Aici iti poti schimba preferintele contului tau. Noteaza ca toate actiunile trebuiesc cofirmate inserand parola.",
"components.profile.projectRules": "regulile proiectului",
"components.profile.siteLanguage": "Limba site-ului",
"components.profile.twoFactorAuth": "Autentificare in doi pasi:",
"components.profile.uuid": "UUID:",
"components.ui.bsod.alsoYouCanInteractWithBackground": "De asemenea te poti juca cu fundalul este interactiv :)",
"components.ui.bsod.criticalErrorHappened": "O eroare critica a aparut si aplicatia nu poate continua operatia.",
"components.ui.bsod.reloadPageOrContactUs": "Va rugam sa reincarcati aceasta pagina si sa incercati din nou. Daca o problema apare iar, raportati-o dezvoltatorilor trimitand un email la",
"components.userbar.login": "Conecteaza-te",
"components.userbar.register": "Intra",
"pages.404.homePage": "pagina principala",
"pages.404.nothingHere": "Nu e locul pe care il cauti",
"pages.404.returnToTheHomePage": "Incearca sa mergi inapoi la {link}",
"pages.404.title": "Pagina nu a fost gasita",
"pages.auth.applicationAuth": "Autorizarea aplicației",
"pages.auth.authorizationForAppSuccessful": "Autorizarea pentru {appName} a fost finalizată cu succes.",
"pages.auth.authorizationSuccessful": "Autorizarea a fost finalizată cu succes.",
"pages.auth.title": "Autorizare cu succes",
"pages.auth.youCanCloseThisPage": "Puteți inchide această fereastră și să vă intoarceți la aplicația dumneavoastră",
"pages.root.siteName": "Ely.by",
"pages.rules.elyAccountsAsService": "{name} ca serviciu",
"pages.rules.elyAccountsAsService1": "Nu avem nici o garanție cu privire la timpul de lucru fără defecte al acestui serviciu.",
"pages.rules.elyAccountsAsService2": "Nu suntem responsabili pentru întârzieri și pierderi de venit ca rezultat al inoperabilității serviciului nostru.",
"pages.rules.elyAccountsAsServiceDesc1": "{name} oferă gratuit tuturor proiectelor care sunt interesate să le utilizeze pentru Minecraft.",
"pages.rules.elyAccountsAsServiceDesc2": "În ciuda faptului că facem tot posibilul pentru a furniza servicii rapide și stabile de serviciu, nu suntem salvați de atacurile DDOS, conexiunile de hosteri, întreruperile de muncă, tulburările de electricitate sau orice alte cazuri care nu pot fi anticipate. Pentru a evita eventualele neînțelegeri, am obligat să discutăm acordurile următoare, care vor funcționa în situațiile menționate anterior:",
"pages.rules.emailAndNickname": "E-mail si nume",
"pages.rules.emailAndNickname1": "Înregistrarea contului cu utilizarea serviciilor de mail temporar este interzisă. Vorbim despre servicii care oferă E-mailuri aleatoare în orice cantitate.",
"pages.rules.emailAndNickname2": "Încercăm să o contracarăm, dar dacă ați reușit în înregistrarea contului cu utilizarea serviciilor de E-mail temporar, nu va fi suport tehnic pentru acesta și mai târziu, în timpul actualizării filtrelor noastre, contul va fi blocat cu numele dvs.",
"pages.rules.emailAndNickname3": "Nu sunt restrictii morale pentru numele utilizatorului care va fii folosit in joc.",
"pages.rules.emailAndNickname4": "Numele, care aparțin unor persoane celebre, pot fi eliberate în favoarea lor pentru cerințe și dovedesc acele persoane.",
"pages.rules.emailAndNickname5": "Titularul contului Premium Minecraft are dreptul de a solicita o restaurare a numelui de control și, dacă s-a întâmplat, trebuie să vă schimbați porecla în 3 zile sau se va face automat.",
"pages.rules.emailAndNickname6": "Daca nu ai mai fost activ timp de 3 luni pe cont, numele poate fi ocupat de catre altcineva.",
"pages.rules.emailAndNickname7": "Nu suntem responsabili pentru pierderea progresului pe servere daca v-ati schimbat numele, incluzand schimbarii pe domeniul nostru.",
"pages.rules.mainProvision1": "Serviciul {name} a fost creeat pentru organizatia de siguranta utilizatorilor de conturi Ely.by, partenerii ei si orice parte a proiectului care doreste sa foloseasca unul dintre proiectele noastre.",
"pages.rules.mainProvision2": "Noi (aici si un punctele urmatoare) — Echipa de dezvoltatori care creeaza servicii de calitate pentru comunitatea Minecraft.",
"pages.rules.mainProvision3": "Ely.by este un proiect lateral, care nu are nimic de-a face cu cumpaniile Mojang sau Microsoft. Nu oferim suport conturilor premium Minecraft, si nu avem de-a face cu serverele care folosesc sau nu serviciile noastre.",
"pages.rules.mainProvision4": "Inregistrarea utilizatorilor la server este gratuita. Creearea contului Ely.by este posibila doar la pagina {link}.",
"pages.rules.mainProvisions": "Asigurarea principala",
"pages.rules.title": "Regulile siteului",
"services.errorsDict.accountAlreadyActivated": "Acest cont este deja activat",
"services.errorsDict.accountBanned": "Contul este blocat",
"services.errorsDict.accountNotActivated": "Contul nu este activat",
"services.errorsDict.captchaRequired": "Va rugam, rezolvati captcha-ul",
"services.errorsDict.doYouWantRequestKey": "Ai nevoie de o cheie noua?",
"services.errorsDict.emailFrequency": "Va rugam sa asteptati, cereti E-mail-uri prea des. O cheie noua poate fii trimisa in {time}.",
"services.errorsDict.emailInvalid": "E-mail-ul este invalid",
"services.errorsDict.emailIsTempmail": "Adresa de E-mail temporara nu este permisa",
"services.errorsDict.emailNotAvailable": "Acest E-mail este deja inregistrat.",
"services.errorsDict.emailNotFound": "E-mail-ul specificat nu a fost gasit",
"services.errorsDict.emailRequired": "E-mail-ul este necesar",
"services.errorsDict.emailToLong": "E-mail-ul este prea lung",
"services.errorsDict.forgotYourPassword": "uitat parola ",
"services.errorsDict.invalidPassword": "Ai introdus o parola gresita.",
"services.errorsDict.keyNotExists": "Cheia este incorecta sau a expirat.",
"services.errorsDict.keyRequired": "Va rugam, introduceti o cheie de activare",
"services.errorsDict.loginNotExist": "Ne cerem scuze, Ely nu recunoaste conectarea dvs.",
"services.errorsDict.loginRequired": "Va rugam, introduceti un E-mail sau un nume",
"services.errorsDict.mfaAlreadyEnabled": "The two factor auth is already enabled",
"services.errorsDict.newPasswordRequired": "Va rugam, introduceti parola noua",
"services.errorsDict.newRePasswordRequired": "Va rugam, repetati parola noua",
"services.errorsDict.passwordRequired": "Va rugam, introduceti parola",
"services.errorsDict.passwordTooShort": "Parola ta trebuie sa aiba cel putin 8 caractere",
"services.errorsDict.passwordsDoesNotMatch": "Parolele nu se potrivesc",
"services.errorsDict.rePasswordRequired": "Va rugam, reintroduceti parola",
"services.errorsDict.redirectUriInvalid": "Redirect URI is invalid",
"services.errorsDict.redirectUriRequired": "Redirect URI is required",
"services.errorsDict.rulesAgreementRequired": "Trebuie să acceptați reguli pentru a crea un cont",
"services.errorsDict.suggestResetPassword": "Ai {link}?",
"services.errorsDict.totpIncorrect": "Codul este incorect",
"services.errorsDict.totpRequired": "Vă rugăm să introduceți codul",
"services.errorsDict.usernameInvalid": "Numele de utilizator este invalid",
"services.errorsDict.usernameRequired": "Numele este necesar",
"services.errorsDict.usernameTooLong": "Numele este prea lung",
"services.errorsDict.usernameTooShort": "Numele este prea scurt",
"services.errorsDict.usernameUnavailable": "Acest nume de utilizator este deja luat"
}

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Введите код",
"components.auth.password.accountPassword": "Пароль от аккаунта",
"components.auth.password.forgotPassword": "Забыл пароль",
"components.auth.password.forgotYourPassword": "забыли пароль",
"components.auth.password.invalidPassword": "Вы указали неправильный пароль от аккаунта.",
"components.auth.password.passwordTitle": "Введите пароль",
"components.auth.password.rememberMe": "Запомнить меня на этом устройстве",
"components.auth.password.signInButton": "Войти",
"components.auth.password.suggestResetPassword": "Вы {link}?",
"components.auth.permissions.approve": "Разрешить",
"components.auth.permissions.decline": "Отмена",
"components.auth.permissions.permissionsTitle": "Права приложения",

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Унесите кôд",
"components.auth.password.accountPassword": "Лозинка налога",
"components.auth.password.forgotPassword": "Заборављена лозинка",
"components.auth.password.forgotYourPassword": "заборавили лозинку",
"components.auth.password.invalidPassword": "Унели сте погрешну лозинку налога.",
"components.auth.password.passwordTitle": "Унос лозинке",
"components.auth.password.rememberMe": "Запамти ме на овом уређају",
"components.auth.password.signInButton": "Пријави ме",
"components.auth.password.suggestResetPassword": "Јесте ли {link}?",
"components.auth.permissions.approve": "Одобри",
"components.auth.permissions.decline": "Одбиј",
"components.auth.permissions.permissionsTitle": "Дозволе апликације",

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Введіть код",
"components.auth.password.accountPassword": "Пароль від акаунту",
"components.auth.password.forgotPassword": "Забув пароль",
"components.auth.password.forgotYourPassword": "забули пароль",
"components.auth.password.invalidPassword": "Ви вказали не вірний пароль від акаунту.",
"components.auth.password.passwordTitle": "Введіть пароль",
"components.auth.password.rememberMe": "Запам'ятати мене на цьому пристрої",
"components.auth.password.signInButton": "Увійти",
"components.auth.password.suggestResetPassword": "Ви {link}?",
"components.auth.permissions.approve": "Дозволити",
"components.auth.permissions.decline": "Відмінити",
"components.auth.permissions.permissionsTitle": "Права додатку",

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "Nhập mã",
"components.auth.password.accountPassword": "Mật khẩu tài khoản",
"components.auth.password.forgotPassword": "Quên mật khẩu",
"components.auth.password.forgotYourPassword": "quên mật khẩu của bạn",
"components.auth.password.invalidPassword": "Bạn đã nhập sai mật khẩu tài khoản.",
"components.auth.password.passwordTitle": "Nhập mật khẩu",
"components.auth.password.rememberMe": "Nhớ tài khoản của tôi trên thiết bị này",
"components.auth.password.signInButton": "Đăng nhập",
"components.auth.password.suggestResetPassword": "Có phải bạn đã {link}?",
"components.auth.permissions.approve": "Chấp nhận",
"components.auth.permissions.decline": "Từ chối",
"components.auth.permissions.permissionsTitle": "Giấy phép ứng dụng",
@ -123,7 +120,7 @@
"components.dev.apps.countUsers": "{count, plural, =0 {No users} one {# user} other {# users}}",
"components.dev.apps.delete": "Delete",
"components.dev.apps.editDescription": "{icon} Edit description",
"components.dev.apps.feedback": "feedback",
"components.dev.apps.feedback": "phản hồi",
"components.dev.apps.ifYouHaveAnyTroubles": "If you are experiencing difficulties, you can always use {feedback}. We'll surely help you.",
"components.dev.apps.ifYouSuspectingThatSecretHasBeenCompromised": "If you are suspecting that your Client Secret has been compromised, then you may want to reset it value. It'll cause recall of the all \"access\" and \"refresh\" tokens that have been issued. You can also recall all issued tokens without changing Client Secret.",
"components.dev.apps.ourDocumentation": "our documentation",

View File

@ -42,12 +42,9 @@
"components.auth.mfa.enterTotp": "输入代码",
"components.auth.password.accountPassword": "输入密码",
"components.auth.password.forgotPassword": "忘记密码",
"components.auth.password.forgotYourPassword": "您忘记了您的密码",
"components.auth.password.invalidPassword": "密码错误!请重新输入",
"components.auth.password.passwordTitle": "输入密码",
"components.auth.password.rememberMe": "在这台设备上记住我",
"components.auth.password.signInButton": "登陆",
"components.auth.password.suggestResetPassword": "您是不是 {link}",
"components.auth.permissions.approve": "授权",
"components.auth.permissions.decline": "拒绝",
"components.auth.permissions.permissionsTitle": "应用程序权限",

130
yarn.lock
View File

@ -1562,16 +1562,16 @@ block-stream@*:
dependencies:
inherits "~2.0.0"
bluebird@^2.3:
version "2.11.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=
bluebird@^3.3.0, bluebird@^3.4.7:
version "3.5.1"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==
bluebird@^3.5.0, bluebird@^3.5.1:
version "3.5.3"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
body-parser@1.18.2, body-parser@^1.16.1:
version "1.18.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
@ -1816,7 +1816,7 @@ chain-function@^1.0.0:
resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
integrity sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w=
chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
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"
integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
@ -1841,11 +1841,6 @@ chardet@^0.4.0:
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=
charenc@~0.0.1:
version "0.0.2"
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
check-node-version@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/check-node-version/-/check-node-version-2.1.0.tgz#85565842cf79a09dfa8e266720575ee0aec1983d"
@ -2296,10 +2291,14 @@ cross-spawn@^5.1.0:
shebang-command "^1.2.0"
which "^1.2.9"
crypt@~0.0.1:
version "0.0.2"
resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=
crowdin-api@erickskrauch/crowdin-api#add_missed_methods_and_fix_files_uploading:
version "2.0.3"
resolved "https://codeload.github.com/erickskrauch/crowdin-api/tar.gz/6de7673c790c594f7bd1fb0a0df8994a669ec29b"
dependencies:
bluebird "^3.5.1"
request "^2.88.0"
request-promise "^4.2.2"
temp "^0.8.3"
cryptiles@2.x.x:
version "2.0.5"
@ -4339,7 +4338,7 @@ is-boolean-object@^1.0.0:
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93"
integrity sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=
is-buffer@^1.1.5, is-buffer@~1.1.1:
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
@ -4569,6 +4568,11 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
iso-639-1@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/iso-639-1/-/iso-639-1-2.0.3.tgz#72dd3448ac5629c271628c5ac566369428d6ccd0"
integrity sha512-PZhOTDH05ZLJyCqxAH65EzGaLO801KCvoEahAFoiqlp2HmnGUm8sO19KwWPCiWd3odjmoYd9ytzk2WtVYgWyCg==
isobject@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
@ -5129,12 +5133,12 @@ lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
lodash@^3.10.0, lodash@^3.2.0, lodash@^3.8.0:
lodash@^3.2.0, lodash@^3.8.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10:
lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10:
version "4.17.11"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
@ -5250,15 +5254,6 @@ math-expression-evaluator@^1.2.14:
resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw=
md5@^2.0.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9"
integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=
dependencies:
charenc "~0.0.1"
crypt "~0.0.1"
is-buffer "~1.1.1"
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@ -5494,6 +5489,13 @@ ms@^2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
multi-progress@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/multi-progress/-/multi-progress-2.0.0.tgz#29ccb42cf24874b1c6384f03127ce5dff7b22f2c"
integrity sha1-Kcy0LPJIdLHGOE8DEnzl3/eyLyw=
dependencies:
progress "^1.1.8"
mute-stream@0.0.7, mute-stream@~0.0.4:
version "0.0.7"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
@ -5878,14 +5880,6 @@ once@^1.3.0, once@^1.3.3:
dependencies:
wrappy "1"
onesky-utils@^1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/onesky-utils/-/onesky-utils-1.2.0.tgz#543dd7eb5d1153a6331283fef1f457032f6f2eff"
integrity sha1-VD3X610RU6YzEoP+8fRXAy9vLv8=
dependencies:
md5 "^2.0.0"
request-promise "^0.4.2"
onetime@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
@ -6557,6 +6551,11 @@ process@~0.5.1:
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
progress@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=
progress@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@ -6637,7 +6636,7 @@ pseudomap@^1.0.2:
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
psl@^1.1.24:
psl@^1.1.24, psl@^1.1.28:
version "1.1.31"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184"
integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==
@ -6652,7 +6651,7 @@ punycode@^1.2.4, punycode@^1.4.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
punycode@^2.1.0:
punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
@ -7269,15 +7268,22 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
request-promise@^0.4.2:
version "0.4.3"
resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-0.4.3.tgz#3c8ddc82f06f8908d720aede1d6794258e22121c"
integrity sha1-PI3cgvBviQjXIK7eHWeUJY4iEhw=
request-promise-core@1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
dependencies:
bluebird "^2.3"
chalk "^1.1.0"
lodash "^3.10.0"
request "^2.34"
lodash "^4.17.11"
request-promise@^4.2.2:
version "4.2.4"
resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.4.tgz#1c5ed0d71441e38ad58c7ce4ea4ea5b06d54b310"
integrity sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==
dependencies:
bluebird "^3.5.0"
request-promise-core "1.1.2"
stealthy-require "^1.1.1"
tough-cookie "^2.3.3"
request@2.81.0:
version "2.81.0"
@ -7307,7 +7313,7 @@ request@2.81.0:
tunnel-agent "^0.6.0"
uuid "^3.0.0"
request@^2.34, request@^2.79.0:
request@^2.79.0:
version "2.83.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
integrity sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==
@ -7335,7 +7341,7 @@ request@^2.34, request@^2.79.0:
tunnel-agent "^0.6.0"
uuid "^3.1.0"
request@^2.87.0:
request@^2.87.0, request@^2.88.0:
version "2.88.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
@ -7478,6 +7484,11 @@ rimraf@2.x.x, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1:
dependencies:
glob "^7.0.5"
rimraf@~2.2.6:
version "2.2.8"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=
ripemd160@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce"
@ -7578,8 +7589,10 @@ schema-utils@^0.3.0:
version "1.0.0"
dependencies:
chalk "^1.1.3"
crowdin-api erickskrauch/crowdin-api#add_missed_methods_and_fix_files_uploading
iso-639-1 "^2.0.3"
multi-progress "^2.0.0"
node-babel "^0.1.2"
onesky-utils "^1.2"
prompt "^1.0.0"
scss-tokenizer@^0.2.3:
@ -7972,6 +7985,11 @@ stdout-stream@^1.4.0:
dependencies:
readable-stream "^2.0.1"
stealthy-require@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
stream-browserify@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
@ -8233,6 +8251,14 @@ tar@^2.0.0, tar@^2.2.1:
fstream "^1.0.2"
inherits "2"
temp@^0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=
dependencies:
os-tmpdir "^1.0.0"
rimraf "~2.2.6"
text-encoding@0.6.4, text-encoding@^0.6.4:
version "0.6.4"
resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19"
@ -8329,6 +8355,14 @@ tough-cookie@^2.3.2:
dependencies:
punycode "^1.4.1"
tough-cookie@^2.3.3:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
dependencies:
psl "^1.1.28"
punycode "^2.1.1"
tough-cookie@~2.3.0, tough-cookie@~2.3.3:
version "2.3.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"