Merge commit '2d128754760fba06f0cfd42b8bd6ded52a4ed864' into colorGradientPicker

This commit is contained in:
MrOnosa
2020-10-30 18:10:04 -05:00
15 changed files with 267 additions and 77 deletions

View File

@@ -0,0 +1,20 @@
import React from 'react';
export default class Dropdown extends React.PureComponent {
getLabel() {
return this.props.label ? <label htmlFor={this.props.name}>{this.props.label}</label> : null;
}
render() {
return (
<React.Fragment>
{this.getLabel()}
<div className='dropdown' style={{ display: 'inline' }}>
<select name={this.props.name} id={this.props.id} onChange={this.props.onChange}>
{this.props.children}
</select>
</div>
</React.Fragment>
);
}
}

View File

@@ -1,6 +1,7 @@
import React from 'react';
import { toast } from 'react-toastify';
import Checkbox from '../Checkbox';
import Dropdown from '../Dropdown';
import Section from '../Section';
import { ColorPicker } from 'react-color-gradient-picker';
import 'react-color-gradient-picker/dist/index.css';
@@ -191,13 +192,15 @@ export default class BackgroundSettings extends React.PureComponent {
<Checkbox name='refresh' text={this.props.language.background.refresh} />
</ul>
<ul>
<label htmlFor='backgroundapi'>{this.props.language.background.API} </label>
<label className='dropdown'>
<select className='select-css' name='backgroundapi' id='backgroundAPI' onChange={() => localStorage.setItem('backgroundAPI', document.getElementById('backgroundAPI').value)}>
<option className='choices' value='mue'>Mue</option>
<option className='choices' value='unsplash'>Unsplash</option>
</select>
</label>
<Dropdown
label={this.props.language.background.API}
name='backgroundapi'
id='backgroundAPI'
onChange={() => localStorage.setItem('backgroundAPI', document.getElementById('backgroundAPI').value)}
>
<option className='choices' value='mue'>Mue</option>
<option className='choices' value='unsplash'>Unsplash</option>
</Dropdown>
</ul>
<ul>
<p>{this.props.language.background.blur} ({this.state.blur}%) <span className='modalLink' onClick={() => this.resetItem('blur')}>{this.props.language.reset}</span></p>

View File

@@ -1,18 +1,24 @@
import React from 'react';
import Dropdown from '../Dropdown';
export default class LanguageSettings extends React.PureComponent {
render() {
return (
<div className='section'>
<div className='section'>
<h4 htmlFor='language' className='nodropdown'>{this.props.language.language}</h4>
<select className='select-css' name='language' id='language' onChange={() => localStorage.setItem('language', document.getElementById('language').value)}>
<option className='choices' value='en'>English</option>
<option className='choices' value='nl'>Nederlands</option>
<option className='choices' value='fr'>Français</option>
<option className='choices' value='no'>Norsk</option>
<option className='choices' value='ru'>Pусский</option>
</select>
</div>
<Dropdown
name='language'
id='language'
onChange={() => localStorage.setItem('language', document.getElementById('language').value)}
>
<option className='choices' value='en'>English</option>
<option className='choices' value='es'>Español</option>
<option className='choices' value='fr'>Français</option>
<option className='choices' value='nl'>Nederlands</option>
<option className='choices' value='no'>Norsk</option>
<option className='choices' value='ru'>Pусский</option>
</Dropdown>
</div>
);
}
}

View File

@@ -2,6 +2,7 @@ import React from 'react';
import SettingsFunctions from '../../../../modules/settingsFunctions';
import { toast } from 'react-toastify';
import Section from '../Section';
import Dropdown from '../Dropdown';
const searchEngines = require('../../../../modules/searchEngines.json');
@@ -25,23 +26,26 @@ export default class SearchSettings extends React.PureComponent {
render() {
return (
<React.Fragment>
<Section title={this.props.language.searchbar.title} name='searchBar'>
<ul>
<label htmlFor='searchEngine'>{this.props.language.searchbar.searchengine} </label>
<select className='select-css' name='searchEngine' id='searchEngine' onChange={() => SettingsFunctions.setSearchEngine(document.getElementById('searchEngine').value)}>
{searchEngines.map((engine) =>
<option key={engine.name} className='choices' value={engine.settingsName}>{engine.name}</option>
)}
<option className='choices' value='custom'>Custom</option>
</select>
</ul>
<ul id='searchEngineInput' style={{ display: 'none' }}>
<p style={{"marginTop": "0px"}}>{this.props.language.searchbar.custom} <span className='modalLink' onClick={() => this.resetSearch()}>{this.props.language.reset}</span></p>
<input type='text' id='customSearchEngine'></input>
</ul>
</Section>
</React.Fragment>
<React.Fragment>
<Section title={this.props.language.searchbar.title} name='searchBar'>
<ul>
<Dropdown label={this.props.language.searchbar.searchengine}
name='searchEngine'
id='searchEngine'
onChange={() => SettingsFunctions.setSearchEngine(document.getElementById('searchEngine').value)}
>
{searchEngines.map((engine) =>
<option key={engine.name} className='choices' value={engine.settingsName}>{engine.name}</option>
)}
<option className='choices' value='custom'>Custom</option>
</Dropdown>
</ul>
<ul id='searchEngineInput' style={{ display: 'none' }}>
<p style={{ "marginTop": "0px" }}>{this.props.language.searchbar.custom} <span className='modalLink' onClick={() => this.resetSearch()}>{this.props.language.reset}</span></p>
<input type='text' id='customSearchEngine'></input>
</ul>
</Section>
</React.Fragment>
);
}
}

View File

@@ -5,6 +5,9 @@ import App from './App';
import './scss/index.scss';
import 'react-toastify/dist/ReactToastify.css'; // the toast css is based on default so we need to import it
import 'fontsource-lexend-deca/latin-400-normal.css';
import 'fontsource-roboto/cyrillic-400-normal.css';
ReactDOM.render(
<App/>,
document.getElementById('root')

View File

@@ -78,7 +78,7 @@ export default class SettingsFunctions {
if (supportsWebP) localStorage.setItem('supportswebp', 'true');
// Languages
const languages = ['nl', 'no', 'fr', 'ru'];
const languages = ['nl', 'no', 'fr', 'ru', 'es'];
const browserLanguage = (navigator.languages && navigator.languages[0]) || navigator.language;
if (languages.includes(browserLanguage)) {
localStorage.setItem('language', browserLanguage);

View File

@@ -13,6 +13,7 @@
@import 'modules/marketplace';
@import 'modules/checkbox';
@import 'modules/buttons';
@import 'modules/dropdown';
@import 'modules/welcome';
body {
@@ -29,16 +30,6 @@ body {
outline: none;
}
@font-face {
font-family: 'Lexend Deca';
src: url('/./fonts/LexendDeca-Regular.woff2') format('woff2');
}
@font-face {
font-family: 'Roboto';
src: url('/./fonts/Roboto-Cyrillic.woff2') format('woff2');
}
#center {
margin-left: 2vw;
margin-right: 2vw;

View File

@@ -0,0 +1,16 @@
.dropdown {
select {
background: linear-gradient(180deg, #ffb032 0%, #dd3b67 100%);
height: 34px;
width: 120px;
color: map-get($modal, "text");
border-image-source: linear-gradient(180deg, #ffb032 0%, #dd3b67 100%);
border-image-slice: 1;
border-width: 3px 4px;
}
select#language {
float: right;
}
}

View File

@@ -225,20 +225,6 @@ button.remove + input[type=color].colour {
margin-left: 7px;
}
select {
background: none;
height: 34px;
width: 120px;
border-image-slice: 1;
border-image-source: linear-gradient(180deg, #ffb032 0%, #dd3b67 100%);
border-left: 10px solid;
color: map-get($modal, "text");
}
select#language {
float: right;
}
#customBackgroundColour {
cursor: pointer;
}

135
src/translations/es.json Normal file
View File

@@ -0,0 +1,135 @@
{
"greeting": {
"morning": "Buenos días",
"afternoon": "Buenas tardes",
"evening": "Buenas noches",
"christmas": "Feliz Navidad",
"newyear": "Feliz año nuevo",
"halloween": "Feliz Halloween"
},
"credit": "Foto por",
"search": "Buscar",
"modals": {
"title": "Opciones",
"settings": "Ajustes",
"addons": "Mis complementos",
"marketplace": "Tienda"
},
"settings": {
"time": {
"title": "Tiempo",
"seconds": "Segundos",
"twentyfourhour": "24 Horas",
"ampm": "AM/PM (12 horas)",
"zero": "Sin ceros",
"analog": "Analógico"
},
"greeting": {
"title": "Saludos",
"events": "Eventos",
"default": "Mensaje del saludo por defecto",
"name": "Nombre para el saludo"
},
"quote": {
"title": "Cita",
"copy": "Botón de copiar",
"tweet": "Botón de Tweet",
"favourite": "Botón de favoritos"
},
"background": {
"title": "Fondo",
"API": "Fondos API",
"blur": "Ajustar difuminado",
"brightness": "Ajustar brillo",
"customURL": "URL del fondo personalizado",
"custombackground": "Fondo personalizado",
"customcolour": "Color del fondo personalizado",
"upload": "Subir",
"addcolour": "Añadir color",
"favourite": "Favorito",
"view": "Ver",
"refresh": "Refrescar",
"disabled": "Desactivado"
},
"searchbar": {
"title": "Barra de búsqueda",
"searchengine": "Motor de búsqueda",
"custom": "URL de búsqueda personalizada"
},
"offline": "Modo Offline",
"dark": "Tema Oscuro",
"experimental": {
"title": "Experimental",
"webp": "Activar WebP",
"animations": "Animaciones",
"voicesearch": "Búsqueda por voz",
"nightmode": "Modo nocturno automático"
},
"language": "Lenguaje",
"apply": "Aplicar",
"reset": "Reiniciar",
"import": "Importar",
"export": "Exportar"
},
"update": {
"title": "Actualizar",
"offline": {
"title": "Offline",
"description": "No se pueden obtener actualizaciones en modo sin conexión"
},
"error": {
"title": "Error",
"description": "No se pudo conectar con el servidor"
},
"loading": "Cargando...",
"readblog": "Leer en el blog aquí",
"contactsupport": "Contáctanos aquí"
},
"toasts": {
"quote": "Cita copiada",
"reset": "Restablecido correctamente",
"installed": "Instalado correctamente",
"removed": "Retirado correctamente",
"error": "Algo salió mal",
"imported": "Importado correctamente"
},
"marketplace": {
"photo_packs": "Paquetes de fotos",
"quote_packs": "Paquetes de citas",
"preset_settings": "Ajustes preestablecidos",
"themes": "Tema",
"product": {
"overview": "Visión general",
"information": "Información",
"last_updated": "Última actualización",
"version": "Versión",
"author": "Autor",
"notice": {
"title": "Aviso",
"description": "Para que se realice el cambio, la página debe actualizarse."
},
"buttons": {
"addtomue": "Añadir a Mue",
"remove": "Remover"
},
"quoteWarning": {
"title": "Advertencia",
"description": "¡Este paquete de citas solicita a servidores externos que pueden rastrearlo!"
}
},
"offline": {
"title": "Parece que estás desconectado",
"description": "Por favor conéctate a Internet."
},
"see_more": "Ver más"
},
"addons": {
"added": "Añadido",
"empty": {
"title": "Está vacío aquí",
"description": "Dirígete a la tienda para agregar algunos.",
"button": "Llévame allí"
},
"sideload": "Cargar complemento localmente"
}
}

View File

@@ -32,7 +32,9 @@
},
"quote": {
"title": "Цитата",
"copy": "Кнопка копирования"
"copy": "Кнопка копирования",
"tweet": "Кнопка твита",
"favourite": "Кнопка для оценки"
},
"background": {
"title": "Фон",
@@ -43,18 +45,25 @@
"custombackground": "Пользовательский фон",
"customcolour": "Пользовательский цвет фона",
"upload": "Загрузить",
"addcolour": "Добавить цвет"
"addcolour": "Добавить цвет",
"favourite": "Любимые",
"view": "Просмотр",
"refresh": "Обновить",
"disabled": "Выключен"
},
"searchbar": {
"title": "Панель поиска",
"searchengine": "Поисковый движок"
"searchengine": "Поисковый движок",
"custom": "Пользовательский поисковый движок"
},
"offline": "Офлайн режим",
"dark": "Тёмная тема",
"experimental": {
"title": "Экспериментальные настройки",
"webp": "Включить WebP",
"animations": "Анимации"
"animations": "Анимации",
"voicesearch": "Поиск голосом",
"nightmode": "Автоматический ночной режим"
},
"language": "Язык",
"apply": "Применить",
@@ -72,14 +81,17 @@
"title": "Ошибка",
"content": "Не удалось подключиться к серверу"
},
"loading": "Загрузка..."
"loading": "Загрузка...",
"readblog": "Прочитайте об изменениях в блоге",
"contactsupport": "Связаться с нами"
},
"toasts": {
"quote": "Цитата скопирована!",
"reset": "Сброшено!",
"installed": "Успешно установлено",
"removed": "Успешно удалено",
"error": "Что-то пошло не так"
"error": "Что-то пошло не так",
"imported": "Успешно импортировано"
},
"marketplace": {
"photo_packs": "Наборы фото",
@@ -99,6 +111,10 @@
"buttons": {
"addtomue": "Добавить в Mue",
"remove": "Удалить"
},
"quoteWarning": {
"title": "Предупреждение",
"description": "Этот пакет цитат обращается к внешнему серверу и может отслеживать вас!"
}
},
"offline": {
@@ -113,6 +129,7 @@
"title": "Здесь пусто",
"description": "Зайдите в магазин, чтобы найти что-то интересное.",
"button": "Перейти"
}
},
"sideload": "Загрузить"
}
}