Pull enhancement/sortable-input because master is too buggy with my modifications

This commit is contained in:
soupette 2018-08-02 15:51:10 +02:00
commit ccb4fe0270
45 changed files with 1202 additions and 317 deletions

View File

@ -1,4 +1,12 @@
{
"app.components.Button.save": "Speichern",
"app.components.Button.cancel": "Abbrechen",
"app.components.BlockLink.documentation": "Lese die Dokumentation",
"app.components.BlockLink.documentation.content": "Entdecke die Konzepte, Referenzanleitungen und Tutorials.",
"app.components.BlockLink.code": "Code Beispiele",
"app.components.BlockLink.code.content": "Lerne durch das Testen realer Projekte, die die Community entwickelt haben.",
"app.components.ComingSoonPage.comingSoon": "Bald verfügbar",
"app.components.ComingSoonPage.featuresNotAvailable": "Dieses Feature ist derzeit noch in aktiver Entwicklung.",
@ -6,13 +14,24 @@
"app.components.DownloadInfo.text": "Dies könnte kurz dauern. Danke für deine Geduld.",
"app.components.HomePage.welcome": "Willkommen an Bord!",
"app.components.HomePage.create": "Erstelle deinen ersten Content-Typ",
"app.components.HomePage.welcome.again": "Willkommen",
"app.components.HomePage.create": "Erstelle deinen ersten Inhaltstyp",
"app.components.HomePage.welcomeBlock.content": "Wir freuen uns, dich als Mitglied der Community zu haben. Wir sind offen für Feedback, senden uns einfach eine direkt Nachricht an\u0020",
"app.components.HomePage.welcomeBlock.content.issues": "Fehler",
"app.components.HomePage.welcomeBlock.content.raise": "\u0020oder erhöhen\u0020",
"app.components.HomePage.createBlock.content.first": "Das\u0020",
"app.components.HomePage.createBlock.content.second": "\u0020Plugin wird dir helfen, die Datenstruktur deiner Modelle zu definieren. Wenn du neu hier bist, empfehlen wir dir unsere\u0020",
"app.components.HomePage.createBlock.content.tutorial": "\u0020Anleitung.",
"app.components.HomePage.welcomeBlock.content.again": "Wir hoffen, dass du Fortschritte bei deinem Projekt machst.... Lese das Neueste über Strapi. Wir geben unser Bestes, um das Produkt auf der Grundlage deines Feedbacks zu verbessern.",
"app.components.HomePage.cta": "BESTÄTIGEN",
"app.components.HomePage.community": "Finde die Community im Web",
"app.components.HomePage.community.content": "Diskutiere mit Teammitgliedern, Mitwirkenden und Entwicklern auf verschiedenen Kanälen.",
"app.components.HomePage.newsLetter": "Abonniere den Newsletter, um sich über Strapi zu informieren.",
"app.components.HomePage.button.quickStart" : "STARTE DAS QUICK-START-TUTORIAL",
"app.components.HomePage.button.blog": "MEHR DAZU IM BLOG",
"app.components.HomePage.support": "UNTERSTÜTZE UNS",
"app.components.HomePage.support.content": "Durch den Kauf des T-Shirts können wir unsere Arbeit am Projekt fortsetzen, um Ihnen das bestmögliche Erlebnis zu bieten!",
"app.components.HomePage.support.link": "HOLE DIR JETZT DEIN T-SHIRT",
"app.components.InputFile.newFile": "Neue Datei hinzufügen",
"app.components.InputFileDetails.open": "In einem neuen Tab öffnen",
@ -69,6 +88,8 @@
"app.utils.placeholder.defaultMessage": "\u0020",
"app.utils.SelectOption.defaultMessage": "\u0020",
"app.utils.defaultMessage": "",
"components.AutoReloadBlocker.header": "Dieses Plugin benötigt das Neuladen-Feature.",
"components.AutoReloadBlocker.description": "Öffne die folgende Datei und aktiviere das Feature.",
@ -78,6 +99,8 @@
"components.OverlayBlocker.title": "Auf Neustart warten...",
"components.OverlayBlocker.description": "Du verwendest ein Feature, das einen Neustart des Servers erfordert. Bitte warte, bis der Server wieder gestartet wurde.",
"components.PageFooter.select": "Einträge pro Seite",
"components.ProductionBlocker.header": "Dieses Plugin ist nur in der Entwicklungsumgebung verfügbar.",
"components.ProductionBlocker.description": "Aus Sicherheitsgründen müssen wir dieses Plugin in anderen Umgebungen deaktivieren.",
@ -93,6 +116,7 @@
"components.Input.error.validation.min": "Dieser Wert ist zu niedrig.",
"components.Input.error.validation.maxLength": "Dieser Wert ist zu lang.",
"components.Input.error.validation.minLength": "Dieser Wert ist zu kurz.",
"components.Input.error.validation.json": "Dies entspricht nicht dem JSON-Format.",
"components.Input.error.contentTypeName.taken": "Dieser Name existiert bereits",
"components.Input.error.attribute.taken": "Dieser Feldname ist bereits vergeben",
"components.Input.error.attribute.key.taken": "Dieser Wert existiert bereits",
@ -117,18 +141,26 @@
"components.WysiwygBottomControls.uploadFiles.browse": "selecting them",
"components.WysiwygBottomControls.fullscreen": "Expand",
"notification.error": "Ein Fehler ist aufgetreten",
"HomePage.notification.newsLetter.success": "Newsletter erfolgreich abonniert",
"notification.error": "Ein Fehler ist aufgetreten",
"notification.error.layout": "Das Layout konnte nicht abgerufen werden.",
"Analytics": "Analytics",
"Auth & Permissions": "Authentifizierung & Berechtigungen",
"Content Manager": "Content-Manager",
"Content Type Builder": "Content-Typ-Manager",
"Content Type Builder": "Inhaltstyp-Manager",
"Files Upload": "Dateien hochladen",
"Settings Manager": "Einstellungs-Manager",
"Email": "E-Mail",
"Password": "Passwort",
"Users": "Benutzer",
"Username": "Benutzername",
"Users & Permissions": "Benutzer & Berechtigungen",
"Provider": "Methode",
"ResetPasswordToken": "Passwort-Token zurücksetzen",
"Role": "Rolle",
"Roles & Permissions" : "Rollen & Berechtigungen",
"New entry": "Neuer Eintrag",
"request.error.model.unknown": "Dieses Schema existiert nicht"
}

View File

@ -8,23 +8,23 @@
"app.components.DownloadInfo.download": "Descarga en curso...",
"app.components.DownloadInfo.text": "Esto puede tardar un minuto. Gracias por su paciencia.",
"app.components.HomePage.welcome": "Bienvenidos a bordo!",
"app.components.HomePage.welcome": "¡Bienvenido a bordo!",
"app.components.HomePage.welcome.again": "Bienvenido ",
"app.components.HomePage.cta": "CONFIRMAR",
"app.components.HomePage.community": "Encuentra la comunidad en la web",
"app.components.HomePage.newsLetter": "Suscríbase al boletín de noticias para ponerse en contacto con Strapi",
"app.components.HomePage.community.content": "Discutir con los miembros del equipo, colaboradores y desarrolladores en diferentes canales.",
"app.components.HomePage.create": "Crea tu primer Tipo de Contenido",
"app.components.HomePage.welcomeBlock.content": "Estamos felices de tenerlo como miembro de la comunidad. Estamos constantemente en busca de comentarios así que no dude en enviarnos DM en\u0020",
"app.components.HomePage.welcomeBlock.content": "Estamos felices de tenerlo como miembro de la comunidad. Estamos constantemente en busca de comentarios así que no dude en enviarnos un DM en\u0020",
"app.components.HomePage.welcomeBlock.content.again": "Esperamos que estés progresando en tu proyecto.... Siéntase libre de leer las últimas novedades sobre Strapi. Estamos dando lo mejor de nosotros mismos para mejorar el producto basándonos en sus comentarios.",
"app.components.HomePage.welcomeBlock.content.issues": "temas.",
"app.components.HomePage.welcomeBlock.content.raise": "\u0020o plantear\u0020",
"app.components.HomePage.welcomeBlock.content.issues": "problema.",
"app.components.HomePage.welcomeBlock.content.raise": "\u0020o reportar cualquier\u0020",
"app.components.HomePage.createBlock.content.first": "El\u0020",
"app.components.HomePage.createBlock.content.second": "\u0020le ayudará a definir la estructura de datos de sus modelos. Si eres nuevo aquí, te recomendamos encarecidamente que sigas nuestros\u0020",
"app.components.HomePage.createBlock.content.tutorial": "\u0020tutorial.",
"app.components.HomePage.createBlock.content.second": "\u0020le ayudará a definir la estructura de datos de sus modelos. Si eres nuevo aquí, te recomendamos encarecidamente que sigas nuestro\u0020",
"app.components.HomePage.createBlock.content.tutorial": "\u0020",
"app.components.HomePage.button.quickStart": "INICIAR EL TUTORIAL DE INICIO RÁPIDO",
"app.components.HomePage.button.blog": "VER MÁS EN EL BLOG",
"app.components.HomePage.support": "APOYANOS",
"app.components.HomePage.support": "APÓYANOS",
"app.components.HomePage.support.content": "¡Al comprar la camiseta, nos permitirá continuar nuestro trabajo en el proyecto para darle la mejor experiencia posible!",
"app.components.HomePage.support.link": "CONSIGUE TU CAMISETA AHORA",
@ -43,8 +43,8 @@
"app.components.ImgPreview.hint": "Arrastre y suelte el archivo en esta área o {browse} para cargar un archivo.",
"app.components.ImgPreview.hint.browse": "buscar",
"app.components.InstallPluginPage.helmet": "Mercado - Plugins",
"app.components.InstallPluginPage.title": "Mercado - Plugins",
"app.components.InstallPluginPage.helmet": "Tienda - Plugins",
"app.components.InstallPluginPage.title": "Tienda - Plugins",
"app.components.InstallPluginPage.description": "Extienda su aplicación sin esfuerzo.",
"app.components.InstallPluginPage.plugin.support-us.description": "¡Apóyanos comprando la camiseta Strapi. Eso nos permitirá seguir trabajando en el proyecto y tratar de darle la mejor experiencia posible!",
"app.components.InstallPluginPage.InputSearch.label": " ",
@ -60,7 +60,7 @@
"app.components.LeftMenuFooter.poweredBy": "Potenciado por ",
"app.components.LeftMenuLinkContainer.configuration": "Configuraciones",
"app.components.LeftMenuLinkContainer.general": "General",
"app.components.LeftMenuLinkContainer.installNewPlugin": "Plaza de mercado",
"app.components.LeftMenuLinkContainer.installNewPlugin": "Tienda",
"app.components.LeftMenuLinkContainer.listPlugins": "Plugins",
"app.components.LeftMenuLinkContainer.noPluginsInstalled": "No hay plugins instalados todavía",
"app.components.LeftMenuLinkContainer.plugins": "Plugins",
@ -149,6 +149,8 @@
"Users & Permissions": "Usuarios y permisos",
"Content Manager": "Gestor de Contenidos",
"Content Type Builder": "Constructor de Tipos de Contenido",
"Files Upload": "Carga de archivos",
"Roles & Permissions": "Roles y Permisos",
"Settings Manager": "Gestor de ajustes",
"Email": "Email",
"Password": "Contraseña",

View File

@ -89,6 +89,7 @@
"components.popUpWarning.title": "Per favore conferma",
"components.popUpWarning.message": "Sei sicuro di volerlo cancellare?",
"components.Input.error.validation.email": "Non è un'email",
"components.Input.error.validation.json" : "Formato JSON non corrispondente",
"components.Input.error.validation.required": "Valore obbligatorio.",
"components.Input.error.validation.regex": "Questo valore non coincide con il regex.",
"components.Input.error.validation.max": "Valore troppo alto.",
@ -119,18 +120,21 @@
"HomePage.notification.newsLetter.success": "Iscritto con successo alla newsletter",
"notification.error": "Si è verificato un errore",
"notification.error.layout": "Non è stato possibile recuperare il layout",
"request.error.model.unknown" : "Questo modello non esiste",
"Users & Permissions": "Utenti & Permessi",
"Content Manager": "Gestione Contenuti",
"Content Type Builder": "Generatore di Tipo Contenuti",
"Settings Manager": "Gestione Impostazioni",
"Email": "Email",
"Files Upload" : "Caricamento Files",
"Password": "Password",
"Username": "Username",
"Provider": "Provider",
"ResetPasswordToken": "Reimposta Token Password",
"Role": "Ruolo",
"Roles & Permissions" : "Ruoli e Permessi",
"New entry": "Nuovo elemento",
"request.error.model.unknow": "Questo modello non esiste",
"Users": "Utenti",
"Analytics": "Analytics"
}
}

View File

@ -149,6 +149,8 @@
"Users & Permissions": "Usuários & Permissões",
"Content Manager": "Gestão de conteúdo",
"Content Type Builder": "Construtor de Conteúdo",
"Files Upload": "Enviar arquivos",
"Roles & Permissions": "Papéis e permissões",
"Settings Manager": "Gerenciador de configurações",
"Email": "E-mail",
"Password": "Senha",

View File

@ -17,10 +17,13 @@
"app.components.HomePage.welcomeBlock.content": "Мы рады, что вы вступили в сообщество. Нам необходима обратная связь для развития проекта, поэтому не стесняйтесь писать нам\u0020",
"app.components.HomePage.welcomeBlock.content.issues": "проблема.",
"app.components.HomePage.welcomeBlock.content.raise": "\u0020или поднять\u0020",
"app.components.HomePage.welcome.again": "Добро пожаловать",
"app.components.HomePage.welcomeBlock.content.again": "Надеемся у вы делаете успехи в вашем проекте... Следите с последними новостями о Strapi. Мы стараемся изо всех сил, чтобы улучшить продукт основываясь на ваших пожеланиях.",
"app.components.HomePage.createBlock.content.first": "\u0020",
"app.components.HomePage.createBlock.content.second": "\u0020плагин поможет вам создать структуру ваших данных. Если вы новичок, мы настоятельно рекомендуем вам следить за нашими\u0020",
"app.components.HomePage.createBlock.content.tutorial": "\u0020руководство.",
"app.components.HomePage.button.quickStart": "ОЗНАКОМТЕСЬ С РУКОВОДСТВОМ ПО БЫСТРОМУ СТАРТУ",
"app.components.HomePage.button.blog": "СМОТРИТЕ БОЛЬШЕ В БЛОГЕ",
"app.components.HomePage.support": "ПОДДЕРЖИТЕ НАС",
"app.components.HomePage.support.content": "Купите футболку, это поможет нам продолжать работу над проектом, чтобы предоставить вам наилучшее из возможных решений!",
"app.components.HomePage.support.link": "ЗАКАЗАТЬ НАШУ ФУТБОЛКУ СЕЙЧАС",
@ -113,6 +116,7 @@
"components.Input.error.validation.min": "Слишком маленькое.",
"components.Input.error.validation.maxLength": "Слишком длинное.",
"components.Input.error.validation.minLength": "Слишком короткое.",
"components.Input.error.validation.json": "Не соответствует JSON формату",
"components.Input.error.contentTypeName.taken": "Это название уже существует",
"components.Input.error.attribute.taken": "Поле с таким названием уже существует",
"components.Input.error.attribute.key.taken": "Это значение уже существует",
@ -136,6 +140,8 @@
"components.WysiwygBottomControls.uploadFiles": "Перетащите файлы в эту область, добавляйте из буфер обмена или {browse}.",
"components.WysiwygBottomControls.uploadFiles.browse": "выделите их",
"components.WysiwygBottomControls.fullscreen": "Развернуть",
"Files Upload": "Загрузка файлов",
"HomePage.notification.newsLetter.success": "Успешная подписка на рассылку новостей",
@ -143,6 +149,7 @@
"notification.error.layout": "Не удалось получить макет",
"Users & Permissions": "Пользователи & Доступы",
"Roles & Permissions": "Роли и доступы",
"Content Manager": "Редактор контента",
"Content Type Builder": "Конструктор Типов Контента",
"Settings Manager": "Менеджер Настроек",

View File

@ -122,10 +122,11 @@
"components.Input.error.attribute.sameKeyAndName": "Eşit olamaz",
"components.Input.error.validation.minSupMax": "Üstü olamaz",
"components.Input.error.custom-error": "{errorMessage} ",
"components.Input.error.validation.json": "Bu JSON biçimi ile eşleşmiyor",
"components.ListRow.empty": "Gösterilecek veri bulunmamaktadır.",
"components.Wysiwyg.collapse": "Collapse",
"components.Wysiwyg.collapse": "Daralt",
"components.Wysiwyg.selectOptions.title": "Başlık ekle",
"components.Wysiwyg.selectOptions.H1": "H1 başlık",
"components.Wysiwyg.selectOptions.H2": "H2 başlık",
@ -143,11 +144,13 @@
"HomePage.notification.newsLetter.success": "Bültene başarıyla abone olundu",
"notification.error": "Bir hata oluştu",
"notification.error.layout": "Couldn't retrieve the layout",
"notification.error.layout": "Düzen alınamadı",
"Users & Permissions": "Kullanıcılar & İzinler",
"Content Manager": "İçerik Yönetimi",
"Content Type Builder": "İçerik Türü Oluşturucusu",
"Files Upload": "Dosya yükleme",
"Roles & Permissions": "Roller & İzinler",
"Settings Manager": "Yönetici Ayarları",
"Email": "E-posta",
"Password": "Şifre",

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="8px" height="8px" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 49.3 (51167) - http://www.bohemiancoding.com/sketch -->
<title>Icon grab</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Pages" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Content-Manager---Settings-view---Single" transform="translate(-335.000000, -698.000000)" fill="#B3B5B9">
<g id="Container" transform="translate(261.000000, 84.000000)">
<g id="Forms" transform="translate(3.000000, 77.000000)">
<g id="Settings">
<g id="Attributes" transform="translate(4.000000, 456.000000)">
<g id="Order-attributes" transform="translate(0.000000, 23.000000)">
<g id="Link" transform="translate(0.000000, 19.000000)">
<g id="Icon-grab" transform="translate(67.000000, 39.000000)">
<rect id="Rectangle-4" x="0" y="0" width="2" height="2"></rect>
<rect id="Rectangle-4" x="3" y="0" width="2" height="2"></rect>
<rect id="Rectangle-4" x="6" y="0" width="2" height="2"></rect>
<rect id="Rectangle-4" x="0" y="3" width="2" height="2"></rect>
<rect id="Rectangle-4" x="3" y="3" width="2" height="2"></rect>
<rect id="Rectangle-4" x="6" y="3" width="2" height="2"></rect>
<rect id="Rectangle-4" x="0" y="6" width="2" height="2"></rect>
<rect id="Rectangle-4" x="3" y="6" width="2" height="2"></rect>
<rect id="Rectangle-4" x="6" y="6" width="2" height="2"></rect>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 49.3 (51167) - http://www.bohemiancoding.com/sketch -->
<title>Icon remove</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Pages" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Content-Manager---List-view" transform="translate(-279.000000, -165.000000)">
<g id="Container" transform="translate(234.000000, 0.000000)">
<g id="Add-filters" transform="translate(0.000000, 60.000000)">
<g id="Icon-remove" transform="translate(45.000000, 105.000000)">
<rect id="Rectangle-12" stroke="#E3E9F3" x="0.5" y="0.5" width="19" height="19" rx="9.5"></rect>
<path d="M6,10 L14,10" id="Line-4" stroke="#007EFF" stroke-width="2" stroke-linecap="round"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -5,7 +5,6 @@
*/
import React from 'react';
import { FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';
import { get } from 'lodash';
@ -18,22 +17,36 @@ import styles from './styles.scss';
function EditRelations(props) {
return (
<div className={styles.editFormRelations}>
<FormattedMessage id="content-manager.EditRelations.title">
{(message) => <h3>{message}</h3>}
</FormattedMessage>
{props.displayedRelations.map(relationName => {
const relation = get(props.schema, ['relations', relationName], {});
const Select = ['oneWay', 'oneToOne', 'manyToOne', 'oneToManyMorph', 'oneToOneMorph'].includes(relation.nature) ? SelectOne : SelectMany;
if(['oneWay', 'oneToOne', 'manyToOne', 'oneToManyMorph', 'oneToOneMorph'].includes(relation.nature)) {
return (
<SelectOne
currentModelName={props.currentModelName}
key={relationName}
record={props.record}
relation={relation}
schema={props.schema}
setRecordAttribute={props.changeData}
location={props.location}
onRedirect={props.onRedirect}
/>
);
}
return (
<Select
<SelectMany
currentModelName={props.currentModelName}
key={relationName}
record={props.record}
relation={relation}
schema={props.schema}
setRecordAttribute={props.changeData}
location={props.location}
onAddRelationalItem={props.onAddRelationalItem}
onRedirect={props.onRedirect}
onRemoveRelationItem={props.onRemoveRelationItem}
onSort={props.onSort}
/>
);
})}
@ -48,10 +61,13 @@ EditRelations.defaultProps = {
};
EditRelations.propTypes = {
changeData: PropTypes.func.isRequired,
currentModelName: PropTypes.string.isRequired,
displayedRelations: PropTypes.array,
location: PropTypes.object.isRequired,
onAddRelationalItem: PropTypes.func.isRequired,
onRedirect: PropTypes.func.isRequired,
onRemoveRelationItem: PropTypes.func.isRequired,
onSort: PropTypes.func.isRequired,
record: PropTypes.object,
schema: PropTypes.object,
};

View File

@ -1,13 +1,3 @@
.editFormRelations { /* stylelint-disable */
h3{
height: 41px;
margin: 0 -25px 14px;
padding: 0 25px;
background: #F3F3F3;
line-height: 41px;
border-radius: 2px 2px 0 0;
letter-spacing: 0.03rem;
font-size: 1.3rem;
font-weight: bold;
}
padding-top: 19px;
}

View File

@ -0,0 +1,48 @@
/**
*
* SortableItem
*
*/
import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
import { SortableElement } from 'react-sortable-hoc';
// Icons.
import IconRemove from '../../assets/images/icon_remove.svg';
// CSS.
import styles from './styles.scss';
const SortableItem = SortableElement(({ item, onClick, onRemove, sortIndex }) => {
return (
<li className={styles.sortableListItem}>
<div>
<div className={styles.dragHandle}><span></span></div>
<FormattedMessage id='content-manager.containers.Edit.clickToJump'>
{title => (
<span
className='sortable-item--value'
onClick={() => onClick(item)}
title={title}
>
{item.label}
</span>
)}
</FormattedMessage>
</div>
<div className={styles.sortableListItemActions}>
<img src={IconRemove} alt="Remove Icon" onClick={() => onRemove(sortIndex)} />
</div>
</li>
);
});
SortableItem.propTypes = {
item: PropTypes.object.isRequired,
onClick: PropTypes.func.isRequired,
onRemove: PropTypes.func.isRequired,
sortIndex: PropTypes.number.isRequired,
};
export default SortableItem;

View File

@ -0,0 +1,36 @@
/**
*
* SortableList
*
*/
import React from 'react';
import PropTypes from 'prop-types';
import cn from 'classnames';
import { SortableContainer } from 'react-sortable-hoc';
import SortableItem from './SortableItem';
// CSS.
import styles from './styles.scss';
const SortableList = SortableContainer(({ items, onClick, onRemove }) => {
const shadowList = (items.length > 4 ? <div className={styles.sortableListLong}></div> : '');
return (
<div className={cn(styles.sortableList)}>
<ul>
{items.map((item, index) => (
<SortableItem key={`item-${index}`} index={index} sortIndex={index} item={item} onRemove={onRemove} onClick={onClick} />
))}
</ul>
{shadowList}
</div>
);
});
SortableList.propTypes = {
items: PropTypes.array.isRequired,
onClick: PropTypes.func.isRequired,
onRemove: PropTypes.func.isRequired,
};
export default SortableList;

View File

@ -6,32 +6,44 @@
import React from 'react';
import Select from 'react-select';
import { FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';
import 'react-select/dist/react-select.css';
import { cloneDeep, isArray, isNull, isUndefined, get, findIndex, includes } from 'lodash';
import { cloneDeep, isArray, isNull, isUndefined, get, findIndex, isEmpty } from 'lodash';
// Utils.
import request from 'utils/request';
import templateObject from 'utils/templateObject';
// CSS.
import 'react-select/dist/react-select.css';
// Component.
import SortableList from './SortableList';
// CSS.
import styles from './styles.scss';
class SelectMany extends React.Component {
// eslint-disable-line react/prefer-stateless-function
constructor(props) {
super(props);
this.state = {
isLoading: true,
options: [],
toSkip: 0,
};
}
class SelectMany extends React.PureComponent {
state = {
isLoading: true,
options: [],
toSkip: 0,
};
componentDidMount() {
this.getOptions('');
}
componentDidUpdate(prevProps, prevState) {
if (isEmpty(prevProps.record) && !isEmpty(this.props.record)) {
const values = (get(this.props.record, this.props.relation.alias) || [])
.map(el => (el.id || el._id));
const options = this.state.options.filter(el => {
return !values.includes(el.value.id || el.value._id);
});
this.state.options = options;
}
if (prevState.toSkip !== this.state.toSkip) {
this.getOptions('');
}
@ -92,16 +104,15 @@ class SelectMany extends React.Component {
};
handleChange = value => {
const filteredValue = value.filter(
(data, index) => findIndex(value, o => o.value.id === data.value.id) === index
// Remove new added value from available option;
this.state.options = this.state.options.filter(el =>
!((el.value._id || el.value.id) === (value.value.id || value.value._id))
);
const target = {
name: `record.${this.props.relation.alias}`,
type: 'select',
value: filteredValue,
};
this.props.setRecordAttribute({ target });
this.props.onAddRelationalItem({
key: this.props.relation.alias,
value: value.value,
});
};
handleBottomScroll = () => {
@ -112,35 +123,64 @@ class SelectMany extends React.Component {
});
}
handleInputChange = (value) => {
const clonedOptions = this.state.options;
const filteredValues = clonedOptions.filter(data => includes(data.label, value));
handleSortEnd = ({ oldIndex, newIndex }) => {
this.props.onSort({
key: this.props.relation.alias,
oldIndex,
newIndex,
});
};
if (filteredValues.length === 0) {
return this.getOptions(value);
}
handleRemove = (index) => {
const values = get(this.props.record, this.props.relation.alias);
// Add removed value from available option;
this.state.options.push({
value: values[index],
label: templateObject({ mainField: this.props.relation.displayedAttribute }, values[index])
.mainField,
});
this.props.onRemoveRelationItem({
key: this.props.relation.alias,
index,
});
}
// Redirect to the edit page
handleClick = (item = {}) => {
this.props.onRedirect({
model: this.props.relation.collection || this.props.relation.model,
id: item.value.id || item.value._id,
source: this.props.relation.plugin,
});
}
render() {
const description = this.props.relation.description ? (
<p>{this.props.relation.description}</p>
) : '';
const value = get(this.props.record, this.props.relation.alias);
) : (
''
);
const value = get(this.props.record, this.props.relation.alias) || [];
/* eslint-disable jsx-a11y/label-has-for */
return (
<div className={`form-group ${styles.selectMany}`}>
<label htmlFor={this.props.relation.alias}>{this.props.relation.label}</label>
<div className={`form-group ${styles.selectMany} ${value.length > 4 && styles.selectManyUpdate}`}>
<label htmlFor={this.props.relation.alias}>{this.props.relation.alias} <span>({value.length})</span></label>
{description}
<Select
onChange={this.handleChange}
options={this.state.options}
className={`${styles.select}`}
id={this.props.relation.alias}
isLoading={this.state.isLoading}
onChange={this.handleChange}
onMenuScrollToBottom={this.handleBottomScroll}
onInputChange={this.handleInputChange}
onSelectResetsInput={false}
multi
value={
options={this.state.options}
placeholder={<FormattedMessage id='content-manager.containers.Edit.addAnItem' />}
/>
<SortableList
items={
isNull(value) || isUndefined(value) || value.size === 0
? null
: value.map(item => {
@ -157,6 +197,10 @@ class SelectMany extends React.Component {
}
})
}
onSortEnd={this.handleSortEnd}
onRemove={this.handleRemove}
distance={1}
onClick={this.handleClick}
/>
{description}
</div>
@ -166,9 +210,12 @@ class SelectMany extends React.Component {
}
SelectMany.propTypes = {
onAddRelationalItem: PropTypes.func.isRequired,
onRedirect: PropTypes.func.isRequired,
onRemoveRelationItem: PropTypes.func.isRequired,
onSort: PropTypes.func.isRequired,
record: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]).isRequired,
relation: PropTypes.object.isRequired,
setRecordAttribute: PropTypes.func.isRequired,
};
export default SelectMany;

View File

@ -1,13 +1,21 @@
.selectMany { /* stylelint-disable */
padding-bottom: 19px;
margin-bottom: 0px;
label{
font-size: 1.3rem;
font-weight: 500;
text-transform: capitalize;
margin-top: 3px;
> span {
font-weight: 400;
font-size: 1.2rem;
}
}
label + div{
margin: 5px 0 26px;
margin: 3px 0 26px;
&:focus{
outline: none;
@ -25,3 +33,150 @@
}
}
}
.selectManyUpdate{
padding-bottom: 15px !important;
}
.select{
margin-bottom: 0px !important;
}
.sortableList {
overflow: hidden;
max-height: 116px;
> ul {
margin: 4px -20px 0;
padding: 0 20px !important;
list-style: none !important;
overflow: scroll;
max-height: 110px;
}
}
.sortableListLong {
position: relative;
display: inline-block;
width: 100%;
height: 0px;
&:after {
position: absolute;
top: -15px;
left: -5px;
content: '';
display: inline-block;
width: calc(100% + 10px);
height: 1px;
margin-bottom: -25px;
box-shadow: 0px -2px 4px 0px rgba(227, 233, 243, .5);
}
}
.sortableListItem {
display: flex;
flex-wrap: nowrap;
align-content: center;
justify-content: space-between;
height: 27px;
&:hover{
cursor: pointer;
}
&:active{
.dragHandle{
cursor: pointer;
> span {
background: #AED4FB;
}
}
}
.dragHandle{
outline: none;
text-decoration: none;
margin-top: -1px;
> span {
vertical-align: middle;
position: relative;
display: inline-block;
width: 6px;
height: 1px;
padding: 0px !important;
background: #B3B5B9;
overflow: visible !important;
transition: background .25s ease-out;
&:before, &:after{
content: '';
display: inline-block;
width: 6px;
height: 1px;
background: inherit;
}
&:before{
position: absolute;
top: -2px;
left: 0;
}
&:after{
position: absolute;
bottom: -2px;
left: 0;
}
}
}
> div {
span {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
&:first-of-type{
display: flex;
align-items: center;
transition: color .25s ease-out;
&:hover{
.dragHandle{
> span {
background: #007EFF;
}
}
color: #007EFF;
}
span {
&:last-of-type{
padding-left: 10px;
}
}
}
&:last-of-type{
display: inline-block;
height: 100%;
line-height: 27px;
text-align: right;
padding-right: 0px;
img{
display: inline-block;
height: 14px;
}
}
}
}

View File

@ -6,6 +6,7 @@
import React from 'react';
import Select from 'react-select';
import { FormattedMessage } from 'react-intl';
import PropTypes from 'prop-types';
import 'react-select/dist/react-select.css';
import { cloneDeep, map, includes, isArray, isNull, isUndefined, isFunction, get, findIndex } from 'lodash';
@ -106,6 +107,15 @@ class SelectOne extends React.Component { // eslint-disable-line react/prefer-st
});
}
// Redirect to the edit page
handleClick = (item = {}) => {
this.props.onRedirect({
model: this.props.relation.collection || this.props.relation.model,
id: item.value.id || item.value._id,
source: this.props.relation.plugin,
});
}
handleInputChange = (value) => {
const clonedOptions = this.state.options;
const filteredValues = clonedOptions.filter(data => includes(data.label, value));
@ -121,11 +131,25 @@ class SelectOne extends React.Component { // eslint-disable-line react/prefer-st
: '';
const value = get(this.props.record, this.props.relation.alias);
const excludeModel = ['role', 'permission', 'file'].includes(this.props.relation.model || this.props.relation.collection); // Temporary.
const entryLink = (isNull(value) || isUndefined(value) || excludeModel ?
'' :
(
<FormattedMessage id='content-manager.containers.Edit.clickToJump'>
{title => (
<a onClick={() => this.handleClick({value})} title={title}><FormattedMessage id='content-manager.containers.Edit.seeDetails' /></a>
)}
</FormattedMessage>
)
);
/* eslint-disable jsx-a11y/label-has-for */
return (
<div className={`form-group ${styles.selectOne}`}>
<label htmlFor={this.props.relation.alias}>{this.props.relation.alias}</label>
<nav className={styles.headline}>
<label htmlFor={this.props.relation.alias}>{this.props.relation.alias}</label>
{entryLink}
</nav>
{description}
<Select
onChange={this.handleChange}
@ -140,6 +164,7 @@ class SelectOne extends React.Component { // eslint-disable-line react/prefer-st
label: templateObject({ mainField: this.props.relation.displayedAttribute }, isFunction(value.toJS) ? value.toJS() : value).mainField || (isFunction(value.toJS) ? get(value.toJS(), 'id') : get(value, 'id')),
}}
/>
</div>
);
/* eslint-disable jsx-a11y/label-has-for */
@ -147,6 +172,7 @@ class SelectOne extends React.Component { // eslint-disable-line react/prefer-st
}
SelectOne.propTypes = {
onRedirect: PropTypes.func.isRequired,
record: PropTypes.oneOfType([
PropTypes.object,
PropTypes.bool,

View File

@ -1,4 +1,6 @@
.selectOne { /* stylelint-disable */
position: relative;
label{
font-size: 1.3rem;
font-weight: 500;
@ -6,7 +8,7 @@
margin-top: 3px;
}
label + div{
nav + div{
height: 34px;
margin: 3px 0 26px;
@ -28,3 +30,19 @@
}
}
}
.headline{
display: flex;
justify-content: space-between;
a{
color: #007EFF !important;
font-size: 1.3rem;
padding-top: 3px;
&:hover{
text-decoration: underline !important;
cursor: pointer;
}
}
}

View File

@ -8,20 +8,31 @@ import { get } from 'lodash';
import { getValidationsFromForm } from 'utils/formValidations';
import {
ADD_RELATION_ITEM,
CHANGE_DATA,
GET_DATA,
GET_DATA_SUCCEEDED,
INIT_MODEL_PROPS,
ON_CANCEL,
REMOVE_RELATION_ITEM,
RESET_PROPS,
SET_FILE_RELATIONS,
SET_LOADER,
SET_FORM_ERRORS,
SORT_RELATIONS,
SUBMIT,
SUBMIT_SUCCESS,
UNSET_LOADER,
} from './constants';
export function addRelationItem({ key, value }) {
return {
type: ADD_RELATION_ITEM,
key,
value,
};
}
export function changeData({ target }) {
return {
type: CHANGE_DATA,
@ -76,6 +87,14 @@ export function onCancel() {
};
}
export function removeRelationItem({ key, index }) {
return {
type: REMOVE_RELATION_ITEM,
key,
index,
};
}
export function resetProps() {
return {
type: RESET_PROPS,
@ -102,6 +121,15 @@ export function setLoader() {
};
}
export function sortRelations({ key, oldIndex, newIndex }) {
return {
type: SORT_RELATIONS,
key,
oldIndex,
newIndex,
};
}
export function submit() {
return {
type: SUBMIT,

View File

@ -4,15 +4,18 @@
*
*/
export const ADD_RELATION_ITEM = 'ContentManager/EditPage/ADD_RELATION_ITEM';
export const CHANGE_DATA = 'ContentManager/EditPage/CHANGE_DATA';
export const GET_DATA = 'ContentManager/EditPage/GET_DATA';
export const GET_DATA_SUCCEEDED = 'ContentManager/EditPage/GET_DATA_SUCCEEDED';
export const INIT_MODEL_PROPS = 'ContentManager/EditPage/INIT_MODEL_PROPS';
export const ON_CANCEL = 'ContentManager/EditPage/ON_CANCEL';
export const REMOVE_RELATION_ITEM = 'ContentManager/EditPage/REMOVE_RELATION_ITEM';
export const RESET_PROPS = 'ContentManager/EditPage/RESET_PROPS';
export const SET_FILE_RELATIONS = 'ContentManager/EditPage/SET_FILE_RELATIONS';
export const SET_LOADER = 'ContentManager/EditPage/SET_LOADER';
export const SET_FORM_ERRORS = 'ContentManager/EditPage/SET_FORM_ERRORS';
export const SORT_RELATIONS = 'ContentManager/EditPage/SORT_RELATIONS';
export const SUBMIT = 'ContentManager/EditPage/SUBMIT';
export const SUBMIT_SUCCESS = 'ContentManager/EditPage/SUBMIT_SUCCESS';
export const UNSET_LOADER = 'ContentManager/EditPage/UNSET_LOADER';

View File

@ -30,15 +30,19 @@ import injectSaga from 'utils/injectSaga';
import getQueryParameters from 'utils/getQueryParameters';
import { bindLayout } from 'utils/bindLayout';
import inputValidations from 'utils/inputsValidations';
import { generateRedirectURI } from 'containers/ListPage/utils';
import { checkFormValidity } from 'utils/formValidations';
import {
addRelationItem,
changeData,
getData,
initModelProps,
onCancel,
removeRelationItem,
resetProps,
setFileRelations,
setFormErrors,
sortRelations,
submit,
} from './actions';
import reducer from './reducer';
@ -50,33 +54,15 @@ export class EditPage extends React.Component {
state = { showWarning: false };
componentDidMount() {
this.props.initModelProps(this.getModelName(), this.isCreating(), this.getSource(), this.getModelAttributes());
if (!this.isCreating()) {
const mainField = get(this.getModel(), 'info.mainField') || this.getModel().primaryKey;
this.props.getData(this.props.match.params.id, this.getSource(), mainField);
}
// Get all relations made with the upload plugin
const fileRelations = Object.keys(get(this.getSchema(), 'relations', {})).reduce((acc, current) => {
const association = get(this.getSchema(), ['relations', current], {});
if (association.plugin === 'upload' && association[association.type] === 'file') {
const relation = {
name: current,
multiple: association.nature === 'manyToManyMorph',
};
acc.push(relation);
}
return acc;
}, []);
// Update the reducer so we can use it to create the appropriate FormData in the saga
this.props.setFileRelations(fileRelations);
this.initComponent(this.props);
}
componentDidUpdate(prevProps) {
if (prevProps.location.pathname !== this.props.location.pathname) {
this.props.resetProps();
this.initComponent(this.props);
}
if (prevProps.editPage.submitSuccess !== this.props.editPage.submitSuccess) {
if (!isEmpty(this.props.location.search) && includes(this.props.location.search, '?redirectUrl')) {
const redirectUrl = this.props.location.search.split('?redirectUrl=')[1];
@ -167,6 +153,43 @@ export class EditPage extends React.Component {
*/
getSource = () => getQueryParameters(this.props.location.search, 'source');
/**
* Initialize component
*/
initComponent = (props) => {
this.props.initModelProps(this.getModelName(), this.isCreating(), this.getSource(), this.getModelAttributes());
if (!this.isCreating()) {
const mainField = get(this.getModel(), 'info.mainField') || this.getModel().primaryKey;
this.props.getData(props.match.params.id, this.getSource(), mainField);
}
// Get all relations made with the upload plugin
const fileRelations = Object.keys(get(this.getSchema(), 'relations', {})).reduce((acc, current) => {
const association = get(this.getSchema(), ['relations', current], {});
if (association.plugin === 'upload' && association[association.type] === 'file') {
const relation = {
name: current,
multiple: association.nature === 'manyToManyMorph',
};
acc.push(relation);
}
return acc;
}, []);
// Update the reducer so we can use it to create the appropriate FormData in the saga
this.props.setFileRelations(fileRelations);
}
handleAddRelationItem = ({ key, value }) => {
this.props.addRelationItem({
key,
value,
});
}
handleBlur = ({ target }) => {
const defaultValue = get(this.getModelAttribute(target.name), 'default');
@ -218,6 +241,36 @@ export class EditPage extends React.Component {
handleGoBack = () => this.props.history.goBack();
handleRedirect = ({ model, id, source = 'content-manager'}) => {
/* eslint-disable */
switch (model) {
case 'permission':
case 'role':
case 'file':
// Exclude special models which are handled by plugins.
if (source !== 'content-manager') {
break;
}
default:
const pathname = `${this.props.match.path.replace(':slug', model).replace(':id', id)}`;
this.props.history.push({
pathname,
search: `?source=${source}&redirectURI=${generateRedirectURI({ model, search: `?source=${source}` })}`,
});
}
/* eslint-enable */
}
handleRemoveRelationItem = ({ key, index }) => {
this.props.removeRelationItem({ key, index });
}
handleSortRelations = ({ key, oldIndex, newIndex }) => {
console.log(key, oldIndex, newIndex);
this.props.sortRelations({ key, oldIndex, newIndex });
}
handleSubmit = (e) => {
e.preventDefault();
const formErrors = checkFormValidity(this.generateFormFromRecord(), this.props.editPage.formValidations);
@ -373,6 +426,10 @@ export class EditPage extends React.Component {
changeData={this.props.changeData}
record={editPage.record}
schema={this.getSchema()}
onAddRelationalItem={this.handleAddRelationItem}
onRedirect={this.handleRedirect}
onRemoveRelationItem={this.handleRemoveRelationItem}
onSort={this.handleSortRelations}
/>
)}
</div>
@ -395,6 +452,7 @@ EditPage.defaultProps = {
};
EditPage.propTypes = {
addRelationItem: PropTypes.func.isRequired,
changeData: PropTypes.func.isRequired,
editPage: PropTypes.object.isRequired,
getData: PropTypes.func.isRequired,
@ -403,23 +461,28 @@ EditPage.propTypes = {
location: PropTypes.object.isRequired,
match: PropTypes.object.isRequired,
onCancel: PropTypes.func.isRequired,
removeRelationItem: PropTypes.func.isRequired,
resetProps: PropTypes.func.isRequired,
schema: PropTypes.object,
setFileRelations: PropTypes.func.isRequired,
setFormErrors: PropTypes.func.isRequired,
sortRelations: PropTypes.func.isRequired,
submit: PropTypes.func.isRequired,
};
function mapDispatchToProps(dispatch) {
return bindActionCreators(
{
addRelationItem,
changeData,
getData,
initModelProps,
onCancel,
removeRelationItem,
resetProps,
setFileRelations,
setFormErrors,
sortRelations,
submit,
},
dispatch,

View File

@ -6,14 +6,17 @@
import { fromJS, Map, List } from 'immutable';
import {
ADD_RELATION_ITEM,
CHANGE_DATA,
GET_DATA_SUCCEEDED,
INIT_MODEL_PROPS,
ON_CANCEL,
REMOVE_RELATION_ITEM,
RESET_PROPS,
SET_FILE_RELATIONS,
SET_FORM_ERRORS,
SET_LOADER,
SORT_RELATIONS,
SUBMIT_SUCCESS,
UNSET_LOADER,
} from './constants';
@ -29,7 +32,7 @@ const initialState = fromJS({
isLoading: true,
modelName: '',
pluginHeaderTitle: 'New Entry',
record: Map({}),
record: fromJS({}),
resetProps: false,
showLoader: false,
source: 'content-manager',
@ -38,21 +41,31 @@ const initialState = fromJS({
function editPageReducer(state = initialState, action) {
switch (action.type) {
case ADD_RELATION_ITEM:
return state
.updateIn(['record', action.key], (list) => {
if (List.isList(list)) {
return list.push(action.value);
}
return List([])
.push(action.value);
});
case CHANGE_DATA:
return state.updateIn(action.keys, () => action.value);
case GET_DATA_SUCCEEDED:
return state
.update('id', () => action.id)
.update('isLoading', () => false)
.update('initialRecord', () => Map(action.data))
.update('initialRecord', () => fromJS(action.data))
.update('pluginHeaderTitle', () => action.pluginHeaderTitle)
.update('record', () => Map(action.data));
.update('record', () => fromJS(action.data));
case INIT_MODEL_PROPS:
return state
.update('formValidations', () => List(action.formValidations))
.update('isCreating', () => action.isCreating)
.update('modelName', () => action.modelName)
.update('record', () => Map(action.record))
.update('record', () => fromJS(action.record))
.update('source', () => action.source);
case ON_CANCEL:
return state
@ -60,6 +73,12 @@ function editPageReducer(state = initialState, action) {
.update('formErrors', () => List([]))
.update('record', () => state.get('initialRecord'))
.update('resetProps', (v) => v = !v);
case REMOVE_RELATION_ITEM:
return state
.updateIn(['record', action.key], (list) => {
return list
.delete(action.index);
});
case RESET_PROPS:
return initialState;
case SET_FILE_RELATIONS:
@ -71,6 +90,16 @@ function editPageReducer(state = initialState, action) {
case SET_LOADER:
return state
.update('showLoader', () => true);
case SORT_RELATIONS: {
const item = state.getIn(['record', action.key, action.oldIndex]);
return state
.updateIn(['record', action.key], (list) => {
return list
.delete(action.oldIndex)
.insert(action.newIndex, item);
});
}
case SUBMIT_SUCCESS:
return state.update('submitSuccess', (v) => v = !v);
case UNSET_LOADER:

View File

@ -62,6 +62,7 @@ import {
generateFiltersFromSearch,
generateSearchFromFilters,
generateSearchFromParams,
generateRedirectURI,
} from './utils';
import styles from './styles.scss';
@ -177,9 +178,7 @@ export class ListPage extends React.Component {
* Generate the redirect URI when editing an entry
* @type {String}
*/
generateRedirectURI = () => (
`?redirectUrl=/plugins/content-manager/${this.getCurrentModelName().toLowerCase()}${this.generateSearch()}`
);
generateRedirectURI = generateRedirectURI.bind(this);
generateSearch = () => {
const {

View File

@ -50,8 +50,17 @@ const generateSearchFromParams = params =>
return acc;
}, '');
/**
* Generate the redirect URI when editing an entry
* @type {String}
*/
const generateRedirectURI = function ({ model, search } = {}) {
return `?redirectUrl=/plugins/content-manager/${(model || this.getCurrentModelName()).toLowerCase()}${(search || this.generateSearch())}`;
};
export {
generateFiltersFromSearch,
generateSearchFromFilters,
generateSearchFromParams,
generateRedirectURI,
};

View File

@ -1,6 +1,7 @@
{
"plugin.description.short": "Greife blitzschnell auf alle Daten in der Datenbank zu und manipuliere sie.",
"plugin.description.long": "Greife blitzschnell auf alle Daten in der Datenbank zu und manipuliere sie.",
"containers.Home.pluginHeaderTitle": "Inhalts-Manager",
"containers.Home.introduction": "Um deine Einträge zu verwalten, klicke auf den entsprechenden Link im Menü links. Dieses Plugin ist noch in aktiver Entwicklung und seine Einstellungen können nicht optimal angepasst werden.",
"containers.Home.pluginHeaderDescription": "Verwalte deine Einträge mithilfe eines mächtigen und wunderschönen Interfaces.",
@ -14,6 +15,51 @@
"containers.List.pluginHeaderDescription.singular": "{label} Eintrag gefunden",
"components.LimitSelect.itemsPerPage": "Einträge pro Seite",
"containers.List.errorFetchRecords": "Fehler",
"containers.SettingPage.addField": "Neues Feld hinzufügen",
"containers.SettingPage.attributes": "Attribut Felder",
"containers.SettingPage.attributes.description": "Reihenfolge der Attribute festlegen",
"containers.SettingPage.listSettings.title": "Liste - Einstellungen",
"containers.SettingPage.listSettings.description": "Konfiguriere die Optionen für diesen Inhaltstyp.",
"containers.SettingPage.pluginHeaderDescription": "Konfiguriere die spezifischen Einstellungen für diesen Inhaltstyp.",
"containers.SettingsPage.Block.generalSettings.description": "Konfiguriere die Standardoptionen für deine Inhaltstypen.",
"containers.SettingsPage.Block.generalSettings.title" : "Allgemeines",
"containers.SettingsPage.Block.contentType.title": "Inhaltstypen",
"containers.SettingsPage.Block.contentType.description": "Konfiguriere die spezifischen Einstellungen",
"components.AddFilterCTA.add": "Filter",
"components.AddFilterCTA.hide": "Filter",
"components.DraggableAttr.edit": "Klicken zum Bearbeiten",
"components.FiltersPickWrapper.PluginHeader.actions.apply": "Anwenden",
"components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Alle löschen",
"components.FiltersPickWrapper.PluginHeader.description": "Lege die Bedingungen fest, unter denen die Einträge gefiltert werden sollen.",
"components.FiltersPickWrapper.PluginHeader.title.filter": "Filter",
"components.FiltersPickWrapper.hide": "Ausblenden",
"components.FilterOptions.button.apply": "Anwenden",
"components.FilterOptions.FILTER_TYPES.=": "ist",
"components.FilterOptions.FILTER_TYPES._ne": "ist nicht",
"components.FilterOptions.FILTER_TYPES._lt": "ist kleiner als",
"components.FilterOptions.FILTER_TYPES._lte": "ist kleiner oder gleich als",
"components.FilterOptions.FILTER_TYPES._gt": "ist größer als",
"components.FilterOptions.FILTER_TYPES._gte": "ist größer oder gleich als",
"components.FilterOptions.FILTER_TYPES._contains": "enthält",
"components.FilterOptions.FILTER_TYPES._containss": "enthält (Groß-/Kleinschreibung beachten)",
"components.Search.placeholder": "Suche nach einem Eintrag....",
"components.TableDelete.entries.plural": "{number} ausgewählte Einträge",
"components.TableDelete.entries.singular": "{number} ausgewählter Eintrag",
"components.TableDelete.delete": "Alle löschen",
"components.TableEmpty.withFilters": "Es gibt keinen {contentType} mit den verwendeten Filtern...",
"components.TableEmpty.withoutFilter": "Es gibt keinen {contentType}...",
"components.TableEmpty.withSearch": "Es gibt keinen {contentType}, der der Suche entspricht ({search})...",
"form.Input.label": "Label",
"form.Input.search": "Suche aktivieren",
"form.Input.search.field": "Suche in diesem Feld aktivieren",
"form.Input.filters": "Filter aktivieren",
"form.Input.sort.field": "Sortierung in diesem Feld aktivieren",
"form.Input.bulkActions": "Bulk-Bearbeitung aktivieren",
"form.Input.pageEntries": "Einträge pro Seite",
"form.Input.pageEntries.inputDescription": "Hinweis: Du kannst diesen Wert auf der Inhaltstypen Einstellungsseite überschreiben.",
"form.Input.defaultSort": "Standard-Sortierattribut",
"containers.SettingPage.relations": "Relational fields",
@ -23,8 +69,8 @@
"EditRelations.title": "Relationale Daten",
"emptyAttributes.title": "Es gibt noch keine Felder",
"emptyAttributes.description": "Füge deinem Content-Typen das erste Feld hinzu",
"emptyAttributes.button": "Den Content-Typ-Generator öffnen",
"emptyAttributes.description": "Füge deinem Inhaltstypen das erste Feld hinzu",
"emptyAttributes.button": "Den Inhaltstyp-Generator öffnen",
"error.schema.generation": "Bei der Generierung des Schemas ist ein Fehler aufgetreten.",
"error.records.count": "Beim Abruf von count records ist ein Fehler aufgetreten.",
@ -40,6 +86,7 @@
"error.validation.min": "Dieser Wert ist zu niedrig.",
"error.validation.maxLength": "Dieser Wert ist zu lang.",
"error.validation.minLength": "Dieser Wert ist zu kurz.",
"error.validation.json": "Dies ist kein JSON",
"error.contentTypeName.taken": "Dieser Name existiert bereits",
"error.attribute.taken": "Dieser Feldname ist bereits vergeben",
"error.attribute.key.taken": "Dieser Wert existiert bereits",
@ -51,6 +98,7 @@
"form.Input.description.placeholder": "Please don't forget to fill the full URL!",
"notification.error.relationship.fetch": "Beim Abruf von Beziehungen ist ein Fehler aufgetreten.",
"notification.info.SettingPage.disableSort": "Du musst ein Attribut mit aktivierter Sortierung haben.",
"success.record.delete": "Gelöscht",
"success.record.save": "Gespeichert",
@ -60,5 +108,9 @@
"popUpWarning.button.cancel": "Abbrechen",
"popUpWarning.button.confirm": "Bestätigen",
"popUpWarning.title": "Bitte bestätigen",
"popUpWarning.bodyMessage.contentType.delete": "Bist du sicher, dass du diesen Content-Typ löschen willst?"
"popUpWarning.bodyMessage.contentType.delete": "Bist du sicher, dass du diesen Inhaltstyp löschen willst?",
"popUpWarning.bodyMessage.contentType.delete.all": "Bist du sicher, dass du diese Einträge löschen willst?",
"popUpWarning.warning.cancelAllSettings": "Bist du sicher, dass du deine Änderungen rückgängig machen willst?",
"popUpWarning.warning.updateAllSettings": "Dadurch werden alle deine Einstellungen geändert."
}

View File

@ -9,6 +9,9 @@
"containers.Edit.delete": "Delete",
"containers.Edit.reset": "Reset",
"containers.Edit.returnList": "Return to list",
"containers.Edit.addAnItem": "Add an item...",
"containers.Edit.clickToJump": "Click to jump to the entry",
"containers.Edit.seeDetails": "Details",
"containers.List.addAnEntry": "Add New {entity}",
"containers.List.pluginHeaderDescription": "{label} entries found",
"containers.List.pluginHeaderDescription.singular": "{label} entry found",

View File

@ -1,162 +1,116 @@
{
"app.components.Button.save": "Guardar",
"app.components.Button.cancel": "Cancelar",
"plugin.description.short": "Ver, editar y eliminar información de su base de datos de manera rápida.",
"plugin.description.long": "Ver, editar y eliminar información de su base de datos de manera rápida.",
"containers.Home.pluginHeaderTitle": "Gestor de Contenido",
"containers.Home.introduction": "Para editar sus registros vaya al link en específico en el menu de la izquierda. Este plugin no tiene una manera de editar configuraciones y aún esta en continuo desarrollo.",
"containers.Home.pluginHeaderDescription": "Gestiona sus registros en una bella y poderoza interfaz.",
"containers.Edit.submit": "Guardar",
"containers.Edit.editing": "Editando...",
"containers.Edit.delete": "Eliminar",
"containers.Edit.reset": "Reiniciar",
"containers.Edit.returnList": "Regresar a la lista",
"containers.List.addAnEntry": "Agregar nuevo {entity}",
"containers.List.pluginHeaderDescription": "{label} registros encontrados",
"containers.List.pluginHeaderDescription.singular": "{label} registro encontrado",
"components.LimitSelect.itemsPerPage": "registros por página",
"containers.List.errorFetchRecords": "Error",
"app.components.ComingSoonPage.comingSoon": "Próximamente",
"app.components.ComingSoonPage.featuresNotAvailable": "Esta característica está aún en desarrollo.",
"containers.SettingPage.addField": "Agregar nuevo campo",
"containers.SettingPage.attributes": "Campos de atributos",
"containers.SettingPage.attributes.description": "Defina el orden de sus atributos",
"app.components.DownloadInfo.download": "Descarga en curso....",
"app.components.DownloadInfo.text": "Esto puede tardar un minuto. Gracias por su paciencia.",
"containers.SettingPage.listSettings.title": "Lista — Configuraciones",
"containers.SettingPage.listSettings.description": "Configura las opciones para este tipo de contenido",
"containers.SettingPage.pluginHeaderDescription": "Configura las opciones específicas para este Tipo de Contenido",
"containers.SettingsPage.pluginHeaderDescription": "Configura las opciones por defecto para todos sus Tipos de Contenido",
"containers.SettingsPage.Block.generalSettings.description": "Configura las opciones por defecto para sus Tipos de Contenido",
"containers.SettingsPage.Block.generalSettings.title": "General",
"containers.SettingsPage.Block.contentType.title": "Tipos de Contenido",
"containers.SettingsPage.Block.contentType.description": "Configuraciones específicas",
"app.components.HomePage.welcome": "Bienvenido a bordo!",
"app.components.HomePage.welcome.again": "Bienvenido ",
"app.components.HomePage.cta": "CONFIRMAR",
"app.components.HomePage.community": "Encuentra la comunidad en la web",
"app.components.HomePage.newsLetter": "Suscríbase al boletín de noticias para ponerse en contacto con Strapi",
"app.components.HomePage.community.content": "Discuta con los miembros del equipo, colaboradores y desarrolladores en diferentes canales.",
"app.components.HomePage.create": "Crea tu primer tipo de contenido",
"app.components.HomePage.welcomeBlock.content": "Estamos felices de tenerlo como miembro de la comunidad. Estamos constantemente en busca de comentarios así que no dude en enviarnos DM a\u0020",
"app.components.HomePage.welcomeBlock.content.again": "Esperamos que estés progresando en tu proyecto.... Siéntase libre de leer las últimas novedades sobre Strapi. Estamos dando lo mejor de nosotros mismos para mejorar el producto basándonos en sus comentarios.",
"app.components.HomePage.welcomeBlock.content.issues": "problema.",
"app.components.HomePage.welcomeBlock.content.raise": "\u0020o plantear\u0020",
"app.components.HomePage.createBlock.content.first": "El\u0020",
"app.components.HomePage.createBlock.content.second": "\u0020plugin le ayudará a definir la estructura de datos de sus modelos. Si eres nuevo aquí, te recomendamos encarecidamente que sigas nuestro\u0020",
"app.components.HomePage.createBlock.content.tutorial": "\u0020tutorial.",
"app.components.HomePage.button.quickStart": "INICIAR EL TUTORIAL DE INICIO RÁPIDO",
"app.components.HomePage.button.blog": "VER MÁS EN EL BLOG",
"app.components.HomePage.support": "APOYANOS",
"app.components.HomePage.support.content": "Al comprar la camiseta, nos permitirá continuar nuestro trabajo en el proyecto para darle la mejor experiencia posible!",
"app.components.HomePage.support.link": "CONSIGUE TU CAMISETA AHORA",
"components.AddFilterCTA.add": "Filtros",
"components.AddFilterCTA.hide": "Filtros",
"app.components.BlockLink.documentation": "Lea la documentación",
"app.components.BlockLink.documentation.content": "Descubra los conceptos, guías de referencia y tutoriales.",
"app.components.BlockLink.code": "Ejemplos de código",
"app.components.BlockLink.code.content": "Aprenda probando proyectos reales desarrollados por la comunidad.",
"components.DraggableAttr.edit": "Click para editar",
"app.components.InputFile.newFile": "Añadir nuevo archivo",
"app.components.InputFileDetails.open": "Abrir en una nueva pestaña",
"app.components.InputFileDetails.remove": "Eliminar este archivo",
"app.components.InputFileDetails.originalName": "Nombre original:",
"app.components.InputFileDetails.size": "Tamaño:",
"components.FiltersPickWrapper.PluginHeader.actions.apply": "Aplicar",
"components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Limpiar todo",
"components.FiltersPickWrapper.PluginHeader.description": "Establece las condiciones a aplicar para filtrar registros",
"components.FiltersPickWrapper.PluginHeader.title.filter": "Filtros",
"components.FiltersPickWrapper.hide": "Ocultar",
"app.components.ImgPreview.hint": "Arrastre y suelte el archivo en esta área o {Buscar} para cargar un archivo.",
"app.components.ImgPreview.hint.browse": "buscar",
"components.FilterOptions.button.apply": "Aplicar",
"components.FilterOptions.FILTER_TYPES.=": "es",
"components.FilterOptions.FILTER_TYPES._ne": "no es",
"components.FilterOptions.FILTER_TYPES._lt": "es menor que",
"components.FilterOptions.FILTER_TYPES._lte": "es menor o igual que",
"components.FilterOptions.FILTER_TYPES._gt": "es mayor que",
"components.FilterOptions.FILTER_TYPES._gte": "es mayor o igual que",
"components.FilterOptions.FILTER_TYPES._contains": "contiene",
"components.FilterOptions.FILTER_TYPES._containss": "contiene (distinguiendo mayúsculas y minúsculas)",
"app.components.InstallPluginPage.helmet": "Mercado - Plugins",
"app.components.InstallPluginPage.title": "Mercado - Plugins",
"app.components.InstallPluginPage.description": "Extienda su aplicación sin esfuerzo.",
"app.components.InstallPluginPage.plugin.support-us.description": "Apóyanos comprando la camiseta Strapi. Eso nos permitirá seguir trabajando en el proyecto y tratar de darle la mejor experiencia posible!",
"app.components.InstallPluginPage.InputSearch.label": " ",
"app.components.InstallPluginPage.InputSearch.placeholder": "Buscar un plugin... (ej: autenticación)",
"app.components.InstallPluginPopup.downloads": "descargar",
"app.components.InstallPluginPopup.navLink.description": "Descripción",
"app.components.InstallPluginPopup.navLink.screenshots": "Capturas de pantalla",
"app.components.InstallPluginPopup.navLink.avis": "aviso",
"app.components.InstallPluginPopup.navLink.faq": "preguntas frecuentes",
"app.components.InstallPluginPopup.navLink.changelog": "changelog",
"app.components.InstallPluginPopup.noDescription": "No hay descripción disponible",
"components.Search.placeholder": "Buscar un registro...",
"app.components.LeftMenuFooter.poweredBy": "Potenciado por ",
"app.components.LeftMenuLinkContainer.configuration": "Configuraciones",
"app.components.LeftMenuLinkContainer.general": "General",
"app.components.LeftMenuLinkContainer.installNewPlugin": "Marketplace",
"app.components.LeftMenuLinkContainer.listPlugins": "Mercado",
"app.components.LeftMenuLinkContainer.noPluginsInstalled": "No hay plugins instalados todavía",
"app.components.LeftMenuLinkContainer.plugins": "Plugins",
"components.TableDelete.entries.plural": "{number} registros seleccionados",
"components.TableDelete.entries.singular": "{number} registro seleccionado",
"components.TableDelete.delete": "Eliminar todo",
"app.components.ListPluginsPage.helmet.title": "Lista de plugins",
"app.components.ListPluginsPage.title": "Plugins",
"app.components.ListPluginsPage.description": "Lista de los plugins instalados en el proyecto.",
"app.components.listPluginsPage.deletePlugin.error": "Se ha producido un error al desinstalar el plugin",
"app.components.listPlugins.title.singular": "{number} plugin está instalado",
"app.components.listPlugins.title.plural": "{número} plugins están instalados",
"app.components.listPlugins.title.none": "No hay plugins instalados",
"app.components.listPlugins.button": "Añadir nuevo plugin",
"app.components.NotFoundPage.description": "No encontrado",
"app.components.NotFoundPage.back": "Volver a la página de inicio",
"components.TableEmpty.withFilters": "No hay {contentType} con los filtros aplicados...",
"components.TableEmpty.withoutFilter": "No hay {contentType}...",
"components.TableEmpty.withSearch": "No hay {contentType} que coincida con la búsqueda ({search})...",
"app.components.Official": "Oficial",
"EditRelations.title": "Datos relacionados",
"app.components.PluginCard.compatible": "Compatible con su aplicación",
"app.components.PluginCard.compatibleCommunity": "Compatible con la comunidad",
"app.components.PluginCard.Button.label.download": "Descargar",
"app.components.PluginCard.Button.label.install": "Ya está instalado",
"app.components.PluginCard.Button.label.support": "Apóyenos",
"app.components.PluginCard.price.free": "Gratuito",
"app.components.PluginCard.more-details": "Más detalles",
"emptyAttributes.title": "Aún no hay campos",
"emptyAttributes.description": "Agregue su primer campo a su Tipo de Contenido",
"emptyAttributes.button": "Ir al creador de Tipos de Contenido",
"app.utils.placeholder.defaultMessage": "\u0020",
"app.utils.SelectOption.defaultMessage": "\u0020",
"app.utils.defaultMessage": "\u0020",
"error.schema.generation": "Ocurrió un error durante la generación de esquema.",
"error.records.count": "Ocurrió un error durante la consulta del número de registros.",
"error.records.fetch": "Ocurrió un error durante la consulta de registros.",
"error.record.fetch": "Ocurrió un error durante la consulta del registro.",
"error.record.create": "Ocurrió un error durante la creación del registro.",
"error.record.update": "Ocurrió un error durante la actualización del registro.",
"error.record.delete": "Ocurrió un error durante la eliminación del registro.",
"error.model.fetch": "Ocurrió un error durante la consulta de configuración de modelos.",
"error.validation.required": "Este dato es requerido.",
"error.validation.regex": "El valor no cumple la expresión regular.",
"error.validation.max": "El valor es muy alto.",
"error.validation.min": "El valor es muy bajo.",
"error.validation.maxLength": "El valor es muy largo.",
"error.validation.minLength": "El valor es muy corto.",
"error.contentTypeName.taken": "Este nombre ya existe",
"error.attribute.taken": "Este campo ya existe",
"error.attribute.key.taken": "Este valor ya existe",
"error.attribute.sameKeyAndName": "No pueden ser iguales",
"error.validation.minSupMax": "No puede ser superior",
"error.validation.json": "Este no es un JSON",
"components.AutoReloadBlocker.header": "La función de reload es necesaria para este plugin.",
"components.AutoReloadBlocker.description": "Abra el siguiente archivo y habilite la función.",
"form.Input.label.inputDescription": "Este valor sobrescribe la etiqueta mostrada en la cabecera de la tabla",
"form.Input.label": "Etiqueta",
"form.Input.search": "Habilitar la búsqueda",
"form.Input.search.field": "Habilitar la búsqueda para este campo",
"form.Input.filters": "Habilitar filtros",
"form.Input.sort.field": "Habilitar ordenado para este campo",
"form.Input.bulkActions": "Habilitar acciones en bloque",
"form.Input.pageEntries": "Registros por página",
"form.Input.pageEntries.inputDescription": "Nota: Puede sobrescribir este valor en la página de configuraciones para Tipo de Contenido.",
"form.Input.defaultSort": "Atributo para ordenar por defecto",
"components.ErrorBoundary.title": "Algo salió mal...",
"notification.error.relationship.fetch": "Ocurrió un error durante la consulta de la relación.",
"notification.info.SettingPage.disableSort": "Necesita tener un habilidato el ordenado en un atributo",
"components.OverlayBlocker.title": "Esperando el reinicio...",
"components.OverlayBlocker.description": "Está utilizando una función que necesita que el servidor se reinicie. Por favor, espere hasta que el servidor esté listo.",
"success.record.delete": "Eliminado",
"success.record.save": "Guardado",
"components.PageFooter.select": "entradas por página",
"pageNotFound": "Página no encontrada",
"components.ProductionBlocker.header": "Este plugin sólo está disponible en desarrollo.",
"components.ProductionBlocker.description": "Por razones de seguridad tenemos que desactivar este plugin en otros entornos.",
"components.popUpWarning.button.cancel": "Cancelar",
"components.popUpWarning.button.confirm": "Confirmar",
"components.popUpWarning.title": "Por favor, confirme",
"components.popUpWarning.message": "¿Estás seguro de que quieres borrar esto?",
"components.Input.error.validation.email": "Esto no es un email",
"components.Input.error.validation.required": "Este valor es obligatorio.",
"components.Input.error.validation.regex": "El valor no coincide con el valor de regex.",
"components.Input.error.validation.max": "El valor es demasiado alto.",
"components.Input.error.validation.min": "El valor es demasiado bajo.",
"components.Input.error.validation.maxLength": "El valor es demasiado largo.",
"components.Input.error.validation.minLength": "El valor es demasiado corto.",
"components.Input.error.contentTypeName.taken": "Este nombre ya existe",
"components.Input.error.attribute.taken": "Este nombre de campo ya existe",
"components.Input.error.attribute.key.taken": "Este valor ya existe",
"components.Input.error.attribute.sameKeyAndName": "No puede ser igual",
"components.Input.error.validation.minSupMax": "No puede ser superior",
"components.Input.error.custom-error": "{errorMessage} ",
"components.Input.error.validation.json": "Esto no coincide con el formato JSON",
"components.ListRow.empty": "No hay datos que mostrar.",
"components.Wysiwyg.collapse": "Colapso",
"components.Wysiwyg.selectOptions.title": "Añadir un título",
"components.Wysiwyg.selectOptions.H1": "Título H1",
"components.Wysiwyg.selectOptions.H2": "Título H2",
"components.Wysiwyg.selectOptions.H3": "Título H3",
"components.Wysiwyg.selectOptions.H4": "Título H4",
"components.Wysiwyg.selectOptions.H5": "Título H5",
"components.Wysiwyg.selectOptions.H6": "Título H6",
"components.Wysiwyg.ToggleMode.markdown": "Pasar a markdown",
"components.Wysiwyg.ToggleMode.preview": "Cambiar a previsualización",
"components.WysiwygBottomControls.charactersIndicators": "caracteres",
"components.WysiwygBottomControls.uploadFiles": "Arrastre y suelte archivos, péguelos desde el portapapeles o {buscar}.",
"components.WysiwygBottomControls.uploadFiles.browse": "seleccionarlos",
"components.WysiwygBottomControls.fullscreen": "Expandir",
"HomePage.notification.newsLetter.success": "Suscribirse con éxito al boletín de noticias",
"notification.error": "Se ha producido un error",
"notification.error.layout": "No se pudo recuperar el diseño",
"Users & Permissions": "Usuarios y permisos",
"Content Manager": "Gestión de Contenidos",
"Content Type Builder": "Constructor de Tipos de Contenido",
"Settings Manager": "Gestion de Ajustes",
"Email": "Email",
"Password": "Contraseña",
"Username": "Nombre de Usuario",
"Provider": "Proveedor",
"ResetPasswordToken": "Restablecer Token de Contraseña",
"Role": "Papel",
"New entry": "Entrada nueva",
"request.error.model.unknown": "Este modelo no existe",
"Users": "Usuarios",
"Analytics": "Analytics"
"popUpWarning.button.cancel": "Cancelar",
"popUpWarning.button.confirm": "Confirmar",
"popUpWarning.title": "Favor de confirmar",
"popUpWarning.bodyMessage.contentType.delete": "¿Está seguro de querer eliminar este registro?",
"popUpWarning.bodyMessage.contentType.delete.all": "¿Está seguro de querer eliminar estos registros?",
"popUpWarning.warning.cancelAllSettings": "¿Está seguro de querer cancelar sus cambios?",
"popUpWarning.warning.updateAllSettings": "Esto modificará todas sus configuraciones"
}

View File

@ -9,6 +9,9 @@
"containers.Edit.delete": "Supprimer",
"containers.Edit.reset": "Annuler",
"containers.Edit.returnList": "Retourner à la liste",
"containers.Edit.addAnItem": "Ajouter un élément...",
"containers.Edit.clickToJump": "Cliquer pour voir l'entrée",
"containers.Edit.seeDetails": "Détails",
"containers.List.addAnEntry": "Ajouter {entity}",
"containers.List.pluginHeaderDescription": "{label} entrées trouvées",
"containers.List.pluginHeaderDescription.singular": "{label} entrée trouvée",

View File

@ -13,22 +13,28 @@
"containers.List.pluginHeaderDescription": "{label} voci non trovato",
"containers.List.pluginHeaderDescription.singular": "{label} voce trovati",
"components.LimitSelect.itemsPerPage": "Elementi per pagina",
"containers.List.errorFetchRecords": "Errore",
"containers.SettingPage.relations": "Relational fields",
"containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout",
"containers.SettingPage.editSettings.title": "Edit - Settings",
"containers.List.errorFetchRecords": "Errore",
"containers.SettingPage.addField" : "Aggiungi un nuovo campo",
"containers.SettingPage.attributes" : "Attributi",
"containers.SettingPage.attributes.description" : "Definisci l'ordine degli attributi",
"containers.SettingPage.listSettings.title" : "Lista - Impostazioni",
"containers.SettingPage.listSettings.description" : "Configura le opzioni per questo Tipo di Contenuto",
"containers.SettingPage.pluginHeaderDescription" : "Configura le impostazioni specifiche per questo Tipo di Contenuto",
"containers.SettingsPage.pluginHeaderDescription" : "Configura le impostazioni di default per tutti i tuoi Tipi di Contenuto",
"containers.SettingsPage.Block.generalSettings.description" : "Configura le opzioni di default per i Tipi di Contenuto",
"containers.SettingsPage.Block.generalSettings.title" : "Generali",
"containers.SettingsPage.Block.contentType.title" : "Tipi di Contenuto",
"containers.SettingsPage.Block.contentType.description" : "Configura le impostazioni specifiche",
"components.AddFilterCTA.add": "Filtri",
"components.AddFilterCTA.hide": "Filtri",
"components.DraggableAttr.edit" : "Clicca per modificare",
"components.FilterOptions.button.apply": "Applica",
"components.FiltersPickWrapper.PluginHeader.actions.apply": "Applica",
"components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Cancella tutto",
"components.FiltersPickWrapper.PluginHeader.description": "Impostare le condizioni da applicare per filtrare le voci",
"components.FiltersPickWrapper.PluginHeader.title.filter": "Filtri",
"components.FiltersPickWrapper.hide": "Nascondi",
"components.FilterOptions.FILTER_TYPES.=": "si",
"components.FilterOptions.FILTER_TYPES._ne": "non è",
"components.FilterOptions.FILTER_TYPES._lt": "è inferiore",
@ -64,6 +70,7 @@
"error.model.fetch": "Si è verificato un errore durante il caricamento dei modelli di configurazione.",
"error.validation.required": "Questo valore è richiesto.",
"error.validation.regex": "Il valore non corrisponde alla regex.",
"error.validation.json" : "Non è un JSON",
"error.validation.max": "Il valore è troppo alto.",
"error.validation.min": "Il valore è troppo basso.",
"error.validation.maxLength": "Il valore è troppo lungo.",
@ -78,7 +85,19 @@
"form.Input.description.placeholder": "Please don't forget to fill the full URL!",
"form.Input.disabled": "Editable field",
"form.Input.label.inputDescription" : "Questo valore sovrascrive l'etichetta mostrata nell'intestazione della tabella",
"form.Input.label" : "Etichetta",
"form.Input.search" : "Abilita ricerca",
"form.Input.search.field" : "Abilita la ricerca su questo campo",
"form.Input.filters" : "Abilita filtri",
"form.Input.sort.field" : "Abilita ordinamento su questo campo",
"form.Input.bulkActions" : "Abilita caricamento",
"form.Input.pageEntries" : "Righe per pagina",
"form.Input.pageEntries.inputDescription" : "Attenzione: Puoi sovrascrivere questo valore nella pagina delle impostazioni del Tipo di Contenuto",
"form.Input.defaultSort" : "Attributo di ordinamento di default",
"notification.error.relationship.fetch": "Si è verificato un errore durante il rapporto di recupero.",
"notification.info.SettingPage.disableSort" : "E' necessario un attributo con l'ordinamento abilitato",
"success.record.delete": "Eliminato",
"success.record.save": "Salvato",
@ -89,5 +108,8 @@
"popUpWarning.button.confirm": "Conferma",
"popUpWarning.title": "Si prega di confermare",
"popUpWarning.bodyMessage.contentType.delete": "Sei sicuro di voler cancellare questa voce?",
"popUpWarning.bodyMessage.contentType.delete.all": "Sei sicuro di voler eliminare queste voci?"
}
"popUpWarning.bodyMessage.contentType.delete.all": "Sei sicuro di voler eliminare queste voci?",
"popUpWarning.warning.cancelAllSettings" : "Sei sicuro di voler cancellare le tue modifiche?",
"popUpWarning.warning.updateAllSettings" : "Questa operazione modificherà tutte le tue impostazioni"
}

View File

@ -20,8 +20,24 @@
"containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout",
"containers.SettingPage.editSettings.title": "Edit - Settings",
"containers.SettingPage.addField": "Adicionar campo",
"containers.SettingPage.attributes": "Atributos",
"containers.SettingPage.attributes.description": "Define a ordem dos atributos",
"containers.SettingPage.listSettings.title": "Lista — Configurações",
"containers.SettingPage.listSettings.description": "Configure as opções para este Tipo de Conteúdo",
"containers.SettingPage.pluginHeaderDescription": "Defina as configurações específicas para este Tipo de Conteúdo",
"containers.SettingsPage.pluginHeaderDescription": "Configure as opções padrões para todos os seus Tipos de Conteúdo",
"containers.SettingsPage.Block.generalSettings.description": "Configure as opções padrões para seu Tipo de Conteúdo",
"containers.SettingsPage.Block.generalSettings.title": "Geral",
"containers.SettingsPage.Block.contentType.title": "Tipos de Conteúdo",
"containers.SettingsPage.Block.contentType.description": "Defina as configurações específicas",
"components.AddFilterCTA.add": "Filtros",
"components.AddFilterCTA.hide": "Filtros",
"components.DraggableAttr.edit": "Clique para editar",
"components.FilterOptions.button.apply": "Aplicar",
"components.FiltersPickWrapper.PluginHeader.actions.apply": "Aplicar",
"components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Limpar tudo",
@ -76,11 +92,19 @@
"error.validation.minSupMax": "Não pode ser superior",
"error.validation.json": "Isto não corresponde com o formato JSON",
"form.Input.description": "Description",
"form.Input.description.placeholder": "Please don't forget to fill the full URL!",
"form.Input.disabled": "Editable field",
"form.Input.label.inputDescription": "Este valor substitui o rótulo apresentado no cabeçalho da tabela",
"form.Input.label": "Rótulo",
"form.Input.search": "Habilitar busca",
"form.Input.search.field": "Habilitar busca neste campo",
"form.Input.filters": "Habilitar filtros",
"form.Input.sort.field": "Habilitar ordenação neste campo",
"form.Input.bulkActions": "Habilitar ações em lote",
"form.Input.pageEntries": "Entradas por página",
"form.Input.pageEntries.inputDescription": "Nota: Você pode substituir este valor na página de configurações do Tipo de Conteúdo.",
"form.Input.defaultSort": "Atributo de ordenação padrão",
"notification.error.relationship.fetch": "Ocorreu um erro durante a busca da relação.",
"notification.info.SettingPage.disableSort": "Você precisa de um atributo com permissão de ordenação",
"success.record.delete": "Removido",
"success.record.save": "Salvo",
@ -91,5 +115,7 @@
"popUpWarning.button.confirm": "Confirmar",
"popUpWarning.title": "Por favor, confirme",
"popUpWarning.bodyMessage.contentType.delete": "Tem a certeza de que deseja remover este registro?",
"popUpWarning.bodyMessage.contentType.delete.all": "Tem a certeza de que deseja remover estes registros?"
"popUpWarning.bodyMessage.contentType.delete.all": "Tem a certeza de que deseja remover estes registros?",
"popUpWarning.warning.cancelAllSettings": "Você tem certeza de que deseja cancelar suas modificações?",
"popUpWarning.warning.updateAllSettings": "Isto irá modificar todas as suas configurações"
}

View File

@ -14,11 +14,57 @@
"containers.List.pluginHeaderDescription.singular": "{label} запись найдена",
"components.LimitSelect.itemsPerPage": "Элементов на странице",
"containers.List.errorFetchRecords": "Ошибка",
"containers.SettingPage.relations": "Relational fields",
"containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout",
"containers.SettingPage.editSettings.title": "Edit - Settings",
"containers.SettingPage.addField": "Добавить новое поле",
"containers.SettingPage.attributes": "Поля атрибутов",
"containers.SettingPage.attributes.description": "Определить порядок атребутов",
"containers.SettingPage.listSettings.title": "Список — Настройки",
"containers.SettingPage.listSettings.description": "Указать порядок атрибутов",
"containers.SettingPage.listSettings.title": "Список — Настройки",
"containers.SettingPage.pluginHeaderDescription": "Отдельные настройки для этого Типа Данных",
"containers.SettingsPage.pluginHeaderDescription": "Настройте параметры по умолчанию для всех Типов Данных",
"containers.SettingsPage.Block.generalSettings.description": "Настройте опции по умолчанию для ваших Типов Данных",
"containers.SettingsPage.Block.generalSettings.title": "Общее",
"containers.SettingsPage.Block.contentType.title": "Типы данных",
"containers.SettingsPage.Block.contentType.description": "Настроить отдельные параметры",
"components.AddFilterCTA.add": "Фильтры",
"components.AddFilterCTA.hide": "Фильтры",
"components.DraggableAttr.edit": "Нажмите чтобы редактировать",
"components.FiltersPickWrapper.PluginHeader.actions.apply": "Применить",
"components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Очистить все",
"components.FiltersPickWrapper.PluginHeader.description": "Укажите условия для фильтрации записей",
"components.FiltersPickWrapper.PluginHeader.title.filter": "Фильтры",
"components.FiltersPickWrapper.hide": "Скрыть",
"components.FilterOptions.button.apply": "Применить",
"components.FilterOptions.FILTER_TYPES.=": "равно",
"components.FilterOptions.FILTER_TYPES._ne": "не равно",
"components.FilterOptions.FILTER_TYPES._lt": "меньше чем",
"components.FilterOptions.FILTER_TYPES._lte": "меньше или равно чем",
"components.FilterOptions.FILTER_TYPES._gt": "больше чем",
"components.FilterOptions.FILTER_TYPES._gte": "равно или больше чем",
"components.FilterOptions.FILTER_TYPES._contains": "содержит",
"components.FilterOptions.FILTER_TYPES._containss": "содержит (с учетом регистра)",
"components.Search.placeholder": "Поиск записей...",
"components.TableDelete.entries.plural": "{число} записей выбрано",
"components.TableDelete.entries.singular": "{число} записей выделено",
"components.TableDelete.delete": "Удалить все",
"components.TableEmpty.withFilters": "Нет {Тип данных} с примененными фильтрами...",
"components.TableEmpty.withoutFilter": "Нет {Тип данных}...",
"components.TableEmpty.withSearch": "Нет {Тип данных} согласно поиску ({поиск})",
"error.validation.json": "Это не JSON",
"form.Input.label.inputDescription": "Это знчение переопределит метку, в заголовке таблицы",
"form.Input.label": "Метка",
"form.Input.search": "Применить поиск",
"form.Input.search.field": "Применить поиск по этому полю",
"form.Input.filters": "Применить фильтры",
"form.Input.sort.field": "Применить сортировку по этому полю",
"form.Input.bulkActions": "Применить массовые действия",
"form.Input.pageEntries": "Записей на страницу",
"form.Input.pageEntries.inputDescription": "Заметка: вы можете переопределить это значение на странице настроек Типа Данных",
"form.Input.defaultSort": "Сортировка по умолчанию",
"notification.info.SettingPage.disableSort": "У вас должен быть один атрибут с разрешенной сортировкой",
"popUpWarning.bodyMessage.contentType.delete.all": "Вы уверенны, что хотите удалить эти записи?",
"popUpWarning.warning.cancelAllSettings": "Вы уверенны, что хотите отменить ваши модификации?",
"popUpWarning.warning.updateAllSettings": "Это изменит все ваши настройки",
"EditRelations.title": "Связанные данные",

View File

@ -15,20 +15,31 @@
"components.LimitSelect.itemsPerPage": "Sayfa başı",
"containers.List.errorFetchRecords": "Hata",
"containers.SettingPage.relations": "Relational fields",
"containers.SettingPage.addField": "Yeni alan ekle",
"containers.SettingPage.attributes": "Nitelik alanları",
"containers.SettingPage.attributes.description": "Niteliklerin sırasını tanımlayın",
"containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout",
"containers.SettingPage.editSettings.title": "Edit - Settings",
"containers.SettingPage.listSettings.title": "Liste — Ayarlar",
"containers.SettingPage.listSettings.description": "Bu içerik türü için seçenekleri yapılandırın",
"containers.SettingPage.pluginHeaderDescription": "Bu İçerik Türü için belirli ayarları yapılandırın",
"containers.SettingsPage.pluginHeaderDescription": "Tüm İçerik türleriniz için varsayılan ayarları yapılandırın",
"containers.SettingsPage.Block.generalSettings.description": "İçerik Türleriniz için varsayılan seçenekleri yapılandırın",
"containers.SettingsPage.Block.generalSettings.title": "Genel",
"containers.SettingsPage.Block.contentType.title": "İçerik Türleri",
"containers.SettingsPage.Block.contentType.description": "Belirli ayarları yapılandırın",
"components.AddFilterCTA.add": "Filtreler",
"components.AddFilterCTA.hide": "Filtreler",
"components.FilterOptions.button.apply": "Uygula",
"components.DraggableAttr.edit": "Düzenlemek için tıklayın",
"components.FiltersPickWrapper.PluginHeader.actions.apply": "Uygula",
"components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Hepsini temizle",
"components.FiltersPickWrapper.PluginHeader.description": "Filtrelemek için uygulanacak şartları ayarlayın",
"components.FiltersPickWrapper.PluginHeader.title.filter": "Filtreler",
"components.FiltersPickWrapper.hide": "Gizle",
"components.FilterOptions.button.apply": "Uygula",
"components.FilterOptions.FILTER_TYPES.=": "eşit",
"components.FilterOptions.FILTER_TYPES._ne": "eşit değil",
"components.FilterOptions.FILTER_TYPES._lt": "daha düşük",
@ -73,12 +84,25 @@
"error.attribute.key.taken": "Bu değer zaten var.",
"error.attribute.sameKeyAndName": "Eşit olamaz",
"error.validation.minSupMax": "Üstü olamaz",
"error.validation.json": "Bu JSON biçimi ile eşleşmiyor",
"form.Input.label.inputDescription": "Bu değer, tablonun başında görüntülenen etiketi geçersiz kılar",
"form.Input.label": "Etiket",
"form.Input.search": "Aramayı etkinleştir",
"form.Input.search.field": "Bu alanda aramayı etkinleştir",
"form.Input.filters": "Filtreleri etkinleştir",
"form.Input.sort.field": "Bu alana göre sıralamayı etkinleştir",
"form.Input.bulkActions": "Toplu işlemleri etkinleştir",
"form.Input.pageEntries": "Sayfa başına kayıtlar",
"form.Input.pageEntries.inputDescription": "Not: Bu değeri İçerik Türü ayarları sayfasında geçersiz kılabilirsiniz..",
"form.Input.defaultSort": "Varsayılan sıralama özelliği",
"form.Input.description": "Description",
"form.Input.description.placeholder": "Please don't forget to fill the full URL!",
"form.Input.disabled": "Editable field",
"notification.error.relationship.fetch": "İlişki getirme sırasında bir hata oluştu.",
"notification.info.SettingPage.disableSort": "Sıralamaya izin verilen tek bir özelliğe sahip olmanız gerekir",
"success.record.delete": "Silindi",
"success.record.save": "Kaydedildi",
@ -89,5 +113,7 @@
"popUpWarning.button.confirm": "Onayla",
"popUpWarning.title": "Lütfen onaylayın",
"popUpWarning.bodyMessage.contentType.delete": "Bu kaydı silmek istediğinizden emin misiniz?",
"popUpWarning.bodyMessage.contentType.delete.all": "Bu kayıtları silmek istediğinizden emin misiniz?"
"popUpWarning.bodyMessage.contentType.delete.all": "Bu kayıtları silmek istediğinizden emin misiniz?",
"popUpWarning.warning.cancelAllSettings": "Değişikliklerinizi iptal etmek istediğinizden emin misiniz?",
"popUpWarning.warning.updateAllSettings": "Bu bütün ayarlarınızı değiştirecektir"
}

View File

@ -27,6 +27,7 @@
"react-dnd": "^5.0.0",
"react-dnd-html5-backend": "^5.0.1",
"react-select": "^1.2.1",
"react-sortable-hoc": "^0.8.3",
"showdown": "^1.8.6",
"strapi-helper-plugin": "3.0.0-alpha.13.0.1"
},

View File

@ -19,16 +19,16 @@
"contentType.temporaryDisplay": "(Nicht gespeichert)",
"from": "aus",
"home.contentTypeBuilder.name": "Content-Typen",
"home.contentTypeBuilder.description": "Verwalte deine Content-Typen.",
"home.emptyContentType.title": "Es sind keine Content-Typen verfügbar",
"home.emptyContentType.description": "Lege deinen ersten Content-Typ an, Daten deiner API abrufen zu können.",
"home.contentTypeBuilder.name": "Inhaltstypen",
"home.contentTypeBuilder.description": "Verwalte deine Inhaltstypen.",
"home.emptyContentType.title": "Es sind keine Inhaltstypen verfügbar",
"home.emptyContentType.description": "Lege deinen ersten Inhaltstyp an, Daten deiner API abrufen zu können.",
"home.emptyAttributes.title": "Es gibt noch keine Felder",
"home.emptyAttributes.description": "Füge deinem Content-Typen das erste Feld hinzu",
"home.emptyAttributes.description": "Füge deinem Inhaltstypen das erste Feld hinzu",
"button.contentType.create": "Lege einen Content-Typ an",
"button.contentType.add": "Neuer Content-Typ",
"button.contentType.create": "Lege einen Inhaltstyp an",
"button.contentType.add": "Neuer Inhaltstyp",
"button.attributes.add": "Neues Feld",
"error.validation.required": "Dieser Wert ist erforderlich.",
@ -42,6 +42,7 @@
"error.attribute.key.taken": "Dieser Wert existiert bereits",
"error.attribute.sameKeyAndName": "Darf nicht gleich sein",
"error.validation.minSupMax": "Darf nicht höher sein",
"error.attribute.forbidden": "Dieser Attributname ist reserviert",
"form.attribute.item.textarea.name": "Name",
"form.attribute.item.number.name": "Name",
@ -52,7 +53,7 @@
"form.attribute.item.boolean.name": "Name",
"form.attribute.item.string.name": "Name",
"form.attribute.item.enumeration.name": "Name",
"form.attribute.item.enumeration.rules": "Werte (trennen Sie sie mit einem Komma)",
"form.attribute.item.enumeration.rules": "Werte (trenne sie mit einem Komma)",
"form.attribute.item.enumeration.placeholder": "Ex: Morgen, Mittag, Abend",
"form.attribute.item.enumeration.graphql": "Name override for GraphQL",
"form.attribute.item.enumeration.graphql.description": "Allows you to override the default generated name for GraphQL",
@ -72,6 +73,9 @@
"form.attribute.item.number.type.integer": "integer (z.B.: 10)",
"form.attribute.item.number.type.float": "float (z.B.: 3.33333333)",
"form.attribute.item.number.type.decimal": "decimal (z.B.: 2.22)",
"form.attribute.item.appearance.name": "Aussehen",
"form.attribute.item.appearance.label": "Als WYSIWYG anzeigen",
"form.attribute.item.appearance.description": "Andernfalls ist der Wert über ein einfaches Textfeld editierbar",
"form.attribute.settings.default": "Standardwert",
"form.attribute.settings.default.checkboxLabel": "Set to true",
@ -81,22 +85,22 @@
"form.contentType.item.connections": "Verbindung",
"form.contentType.item.name": "Name",
"form.contentType.item.name.description": "Der Name des Content-Typs sollte Singular sein. {link}",
"form.contentType.item.name.description": "Der Name des Inhaltstyps sollte Singular sein. {link}",
"form.contentType.item.name.link.description": "Schau dir unsere Dokumentation an.",
"form.contentType.item.description": "Beschreibung",
"form.contentType.item.description.placeholder": "Beschreibe deinen Content-Typ",
"form.contentType.item.description.placeholder": "Beschreibe deinen Inhaltstyp",
"form.contentType.item.collectionName": "Name des Dokuments in der Datenbank",
"form.contentType.item.collectionName.inputDescription": "Nützlich, wenn Content-Typ und Datenbankname unterschiedlich sind",
"form.contentType.item.collectionName.inputDescription": "Nützlich, wenn Inhaltstyp und Datenbankname unterschiedlich sind",
"menu.section.contentTypeBuilder.name.plural": "Content-Typen",
"menu.section.contentTypeBuilder.name.singular": "Content-Typ",
"menu.section.contentTypeBuilder.name.plural": "Inhaltstypen",
"menu.section.contentTypeBuilder.name.singular": "Inhaltstyp",
"menu.section.documentation.name": "Dokumentation",
"menu.section.documentation.guide": "Mehr über Content-Typen findest du in unserer",
"menu.section.documentation.guide": "Mehr über Inhaltstypen findest du in unserer",
"menu.section.documentation.guideLink": "Anleitung.",
"menu.section.documentation.tutorial": "Schau dir unser",
"menu.section.documentation.tutorialLink": "Tutorial an.",
"modelPage.contentHeader.emptyDescription.description": "Dieser Content-Typ hat keine Beschreibung",
"modelPage.contentHeader.emptyDescription.description": "Dieser Inhaltstyp hat keine Beschreibung",
"modelPage.contentType.list.title.plural": "Felder",
"modelPage.contentType.list.title.singular": "Feld",
"modelPage.contentType.list.title.including": "schließt ein",
@ -108,12 +112,14 @@
"noTableWarning.infos": "Mehr Informationen",
"notification.error.message": "Ein Fehler ist aufgetreten",
"notification.info.contentType.creating.notSaved": "Bitte speichere zuerst diesen Content-Typ bevor du einen neuen anlegst",
"notification.info.contentType.creating.notSaved": "Bitte speichere zuerst diesen Inhaltstyp bevor du einen neuen anlegst",
"notification.info.disable": "Dieses Feld ist momentan nicht editierbar...😮",
"notification.info.optimized": "Dieses Plugin ist auf deinen localStorage optimiert",
"notification.success.message.contentType.edit": "Der Content-Typ wurde aktualisiert",
"notification.success.message.contentType.create": "Der Content-Typ wurde angelegt",
"notification.success.contentTypeDeleted": "Der Content-Typ wurde gelöscht",
"notification.success.message.contentType.edit": "Der Inhaltstyp wurde aktualisiert",
"notification.success.message.contentType.create": "Der Inhaltstyp wurde angelegt",
"notification.success.contentTypeDeleted": "Der Inhaltstyp wurde gelöscht",
"relation.oneWay": "hat eine",
"popUpForm.attributes.string.description": "Titel, Namen, Namenslisten",
"popUpForm.attributes.text.description": "Beschreibungen, Paragraphen, Artikel",
@ -122,7 +128,7 @@
"popUpForm.attributes.date.description": "Event-Daten, Öffnungszeiten",
"popUpForm.attributes.json.description": "Daten in JSON-Format",
"popUpForm.attributes.media.description": "Bilder, Videos, PDFs und andere",
"popUpForm.attributes.relation.description": "Bezieht sich auf einen Content-Typ",
"popUpForm.attributes.relation.description": "Bezieht sich auf einen Inhaltstyp",
"popUpForm.attributes.email.description": "E-Mail-Adressen von Benutzern",
"popUpForm.attributes.password.description": "Passwörter von Benutzers",
"popUpForm.attributes.enumeration.description": "Liste der Auswahlmöglichkeiten",
@ -141,9 +147,9 @@
"popUpForm.create": "Neu",
"popUpForm.edit": "Bearbeiten",
"popUpForm.field": "Feld",
"popUpForm.create.contentType.header.title": "Neuer Content-Typ",
"popUpForm.create.contentType.header.title": "Neuer Inhaltstyp",
"popUpForm.choose.attributes.header.title": "Neues Feld hinzufügen",
"popUpForm.edit.contentType.header.title": "Content-Typen bearbeiten",
"popUpForm.edit.contentType.header.title": "Inhaltstypen bearbeiten",
"popUpForm.navContainer.relation": "Beziehung definieren",
"popUpForm.navContainer.base": "Grundeinstellungen",
@ -154,12 +160,12 @@
"popUpWarning.button.cancel": "Abbrechen",
"popUpWarning.button.confirm": "Bestätigen",
"popUpWarning.title": "Bitte bestätigen",
"popUpWarning.bodyMessage.contentType.delete": "Bist du sicher, dass du diesen Content-Typ löschen willst?",
"popUpWarning.bodyMessage.contentType.delete": "Bist du sicher, dass du diesen Inhaltstyp löschen willst?",
"popUpWarning.bodyMessage.attribute.delete": "Bist du sicher, dass du dieses Feld löschen willst?",
"table.contentType.title.plural": "Content-Typen sind verfügbar",
"table.contentType.title.singular": "Content-Typ ist verfügbar",
"table.contentType.title.plural": "Inhaltstypen sind verfügbar",
"table.contentType.title.singular": "Inhaltstyp ist verfügbar",
"table.contentType.head.name": "Name",
"table.contentType.head.description": "Beschreibung",
"table.contentType.head.fields": "Felder",

View File

@ -42,6 +42,7 @@
"error.attribute.taken": "Поле с таким названием уже существует",
"error.attribute.key.taken": "Это значение уже существует",
"error.attribute.sameKeyAndName": "Не может быть одинаковым",
"error.attribute.forbidden": "Такое имя атрибута зарезервировано",
"error.validation.minSupMax": "Не может быть выше",
"form.attribute.item.textarea.name": "Название",
@ -175,6 +176,7 @@
"table.contentType.head.description": "Описание",
"table.contentType.head.fields": "Поля",
"relation.oneWay": "один принадлежит",
"relation.oneToOne": "имеет один",
"relation.oneToMany": "принадлежит многим",
"relation.manyToOne": "имеет много",

View File

@ -1,4 +1,14 @@
{
"ConfigPage.title": "E-Mail - Einstellungen",
"ConfigPage.description": "E-Mail-Plugin konfigurieren",
"EditForm.Input.number.label": "Maximal zulässige Größe (in MB)",
"EditForm.Input.select.label": "Anbieter",
"EditForm.Input.select.inputDescription": "E-Mails können mit dem Standardanbieter (Sendmail) oder einem externen Anbieter versendet werden",
"EditForm.Input.toggle.label": "E-Mail-Versand aktivieren",
"notification.config.success": "Die Einstellungen wurden aktualisiert",
"plugin.description.short": "Zum Versand von E-Mails.",
"plugin.description.long": "Zum Versand von E-Mails."
}

View File

@ -1,5 +1,12 @@
{
"plugin.description.short": "Отсылка почты.",
"plugin.description.long": "Отсылка почты."
"plugin.description.long": "Отсылка почты.",
"ConfigPage.title": "Email - Настройки",
"ConfigPage.description": "Настройка плагина email",
"EditForm.Input.number.label": "Максимально допустимый размер (в МБ)",
"EditForm.Input.select.label": "Провайдеры",
"EditForm.Input.select.inputDescription": "Письма могут быть отправлены стандартным провайдером (Sendmail), или внешними провайдерами",
"EditForm.Input.toggle.label": "Активировать отправку писем",
"notification.config.success": "Настройки успешно обновлены"
}

View File

@ -112,6 +112,7 @@
"form.language.choose": "Wähle eine Sprache:",
"request.error.database.exist": "Diese Verbindung gibt es bereits",
"request.error.database.unknow": "Keine solche Verbindung",
"request.error.type.string": "Ein Text ist erforderlich.",
"request.error.type.number": "Eine Nummer ist erforderlich.",
"request.error.type.boolean": "Ein Boolean ist erforderlich.",
@ -141,7 +142,7 @@
"list.databases.title.plural": "Verbindungen in dieser Umgebung",
"popUpWarning.title": "Bitte bestätigen",
"popUpWarning.databases.danger.message": "Es gibt noch hiermit verbundene Content-Typen. Durch das Löschen könntest du deine Anwendung beschädigen. Sei vorsichtig...",
"popUpWarning.databases.danger.message": "Es gibt noch hiermit verbundene Inhaltstypen. Durch das Löschen könntest du deine Anwendung beschädigen. Sei vorsichtig...",
"popUpWarning.danger.ok.message": "Ich stimme zu",
"popUpWarning.databases.delete.message": "Bist du sicher, dass du diese Datenbank löschen möchtest?",
"popUpWarning.languages.delete.message": "Bist du sicher, dass du diese Sprache entfernen möchtest?",

View File

@ -52,8 +52,8 @@
"form.advanced.item.prefix": "API de prefijos",
"form.request.name": "Solicitud",
"formulario.de.solicitud.de.descripción": "Configure los ajustes de su solicitud",
"formulario.para.solicitar.item.parser": "Parser",
"form.request.description": "Configure los ajustes de su solicitud.",
"form.request.item.parser": "Parser",
"form.request.item.parser.multipart": "Parser Multiparte",
"form.request.item.prefix": "Prefijo",
"form.request.item.prefix.prefix": "Prefijo",

View File

@ -35,6 +35,8 @@
"form.database.item.provider.postgres": "PostgresSQL",
"form.database.item.provider.mysql": "MySQL",
"form.database.item.provider.redis": "Redis",
"form.database.item.ssl": "SSL",
"form.database.item.authenticationDatabase": "База данных аутентификации",
"form.application.name": "Приложение",
"form.application.description": "Зайдайте настройки вашего приложения.",

View File

@ -28,8 +28,10 @@
"PluginInputFile.text": "Ziehe eine Datei hierher oder {link} eine Datei zum hochladen aus",
"PluginInputFile.link": "wähle",
"PluginInputFile.loading": "Deine Dateien werden hochgeladen...",
"notification.delete.success": "Die Datei wurde gelöscht",
"notification.dropFile.success": "Ihre Datei wurde hochgeladen",
"notification.dropFiles.success": "{number} Dateien wurden hochgeladen"
"notification.dropFile.success": "Deine Datei wurde hochgeladen",
"notification.dropFiles.success": "{number} Dateien wurden hochgeladen",
"notification.config.success": "Die Einstellungen wurden aktualisiert"
}

View File

@ -28,6 +28,7 @@
"Auth.form.register.username.placeholder": "John Doe",
"Auth.form.register.password.label": "Passwort",
"Auth.form.register.confirmPassword.label": "Passwort-Bestätigung",
"Auth.form.register.news.label": "Haltet mich auf dem Laufenden über die neuen Funktionen und kommenden Verbesserungen.",
"Auth.form.register-success.email.label": "Eine E-Mail wurde erfolgreich verschickt an",
"Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com",

View File

@ -1,6 +1,6 @@
{
"Auth.form.button.register-success": "Enviar de nuevo",
"Auth.form.button.forgot-password.success": "Enviar de nuevo",
"Auth.form.button.register-success": "Enviar nuevamente",
"Auth.form.button.forgot-password.success": "Enviar nuevamente",
"Auth.form.button.forgot-password": "Enviar Email",
"Auth.form.button.reset-password": "Cambiar contraseña",
"Auth.form.button.login": "Iniciar sesión",
@ -59,7 +59,7 @@
"EditForm.inputSelect.label.role": "Rol predeterminado para usuarios autenticados",
"EditForm.inputSelect.description.role": "Adjuntará el nuevo usuario autenticado al rol seleccionado.",
"EditForm.inputSelect.subscriptions.label": "Gestionar cuotas de suscripción",
"EditForm.inputSelect.subscriptions.description": "Limite el número de suscripciones por IP por hora.",
"EditForm.inputSelect.subscriptions.description": "Limite el número de suscripciones de IP por hora.",
"EditForm.inputSelect.durations.label": "Duración",
"EditForm.inputSelect.durations.description": "Número de horas durante las cuales el usuario no puede suscribirse.",
@ -121,7 +121,7 @@
"Plugin.permissions.application.description": "Defina todas las acciones permitidas de su proyecto.",
"Plugin.permissions.plugins.description": "Defina todas las acciones permitidas para el plugin {name}.",
"Plugins.header.title": "Permisiones",
"Plugins.header.title": "Permisos",
"Plugins.header.description": "Sólo las acciones vinculadas a una ruta se enumeran a continuación.",
"Policies.InputSelect.empty": "Ninguno",
@ -139,7 +139,7 @@
"PopUpForm.button.save": "Guardar",
"PopUpForm.header.add.providers": "Añadir nuevo proveedor",
"PopUpForm.header.edit.email-templates": "Editar Plantillas de Email",
"PopUpForm.header.edit.providers": "Editar {provider} Proveedor",
"PopUpForm.header.edit.providers": "Editar Proveedor {provider}",
"PopUpForm.inputSelect.providers.label": "Elija el proveedor",
"PopUpForm.Email.options.from.name.label": "Nombre del remitente",
"PopUpForm.Email.options.from.email.label": "Email del remitente",

View File

@ -1 +1,144 @@
{}
{
"Auth.form.button.register-success" : "Invia di nuovo",
"Auth.form.button.forgot-password.success" : "Invia di nuovo",
"Auth.form.button.forgot-password" : "Invia Email",
"Auth.form.button.reset-password" : "Cambia password",
"Auth.form.button.login" : "Accedi",
"Auth.form.button.register" : "Inizia adesso",
"Auth.form.error.noAdminAccess" : "Non puoi accedere al pannello di amministrazione.",
"Auth.form.forgot-password.email.label" : "Inserisci la tua email",
"Auth.form.forgot-password.email.label.success" : "Email inviata correttamente",
"Auth.form.forgot-password.email.placeholder" : "mysuperemail@gmail.com",
"Auth.header.register.description" : "Per terminare l'installazione e mettere in sicurezza la tua applicazione è necessario creare il primo utente (root admin) inserendo le informazioni necessarie di seguito riportate",
"Auth.form.header.login" : "strapi",
"Auth.form.header.forgot-password" : "strapi",
"Auth.form.header.register" : "Benvenuto!",
"Auth.form.header.register-success" : "strapi",
"Auth.form.login.password.label" : "Password",
"Auth.form.login.rememberMe.label" : "Ricordati di me",
"Auth.form.login.username.label" : "Username",
"Auth.form.login.username.placeholder" : "John Doe",
"Auth.form.register.email.label" : "Email",
"Auth.form.register.email.placeholder" : "johndoe@gmail.com",
"Auth.form.register.username.label" : "Username",
"Auth.form.register.username.placeholder" : "John Doe",
"Auth.form.register.password.label" : "Password",
"Auth.form.register.confirmPassword.label" : "Password di conferma",
"Auth.form.register.news.label" : "Tienimi aggiornato su nuove funzionalità e futuri miglioramenti",
"Auth.form.register-success.email.label" : "Email inviata con successo a",
"Auth.form.register-success.email.placeholder" : "mysuperemail@gmail.com",
"Auth.form.error.email.provide" : "Per favore fornisci il tuo username o la tua password",
"Auth.form.error.email.invalid" : "Questa email non è valida.",
"Auth.form.error.password.provide" : "Per favore fornisci la tua password",
"Auth.form.error.invalid" : "Identificatore o password non valida.",
"Auth.form.error.password.local" : "Questo utente non ha mai impostato una password locale, accedi gentilmente tramite il provider usato durante la creazione dell'account",
"Auth.form.error.password.format" : "La tua password non può contenere il simbolo $ per più di tre volte.",
"Auth.form.error.user.not-exist" : "Questa email non esiste.",
"Auth.form.error.code.provide" : "Codice fornito non corretto.",
"Auth.form.error.password.matching" : "La password non corrisponde.",
"Auth.form.error.params.provide" : "I parametri forniti non sono corretti.",
"Auth.form.error.username.taken" : "Username in uso",
"Auth.form.error.email.taken" : "Email in uso",
"Auth.link.forgot-password" : "Password dimenticata?",
"Auth.link.ready" : "Sei pronto per accedere?",
"BoundRoute.title" : "Percorso vincolato a",
"components.Input.error.password.noMatch" : "La password non corrisponde",
"Controller.input.label" : "{label}",
"Controller.selectAll" : "Seleziona tutto",
"EditForm.inputSelect.label.role" : "Ruolo di default per gli utenti autenticati",
"EditForm.inputSelect.description.role" : "Questa operazione associerà i nuovi utenti autenticati al ruolo selezionato.",
"EditForm.inputSelect.subscriptions.label" : "Gestisci le sottoscrizioni di quota",
"EditForm.inputSelect.subscriptions.description" : "Limita il numero di sottoscrizioni per IP per ora.",
"EditForm.inputSelect.durations.label" : "Durata",
"EditForm.inputSelect.durations.description" : "Numero di ore in cui l'utente non può registrarsi",
"EditForm.inputToggle.label.email" : "Un account per indirizzo email",
"EditForm.inputToggle.label.sign-up" : "Abilita iscrizioni",
"EditForm.inputToggle.description.email" : "Non consentire all'utente di creare account multipli usando lo stesso indirizzo email con fornitori di autenticazione diversi.",
"EditForm.inputToggle.description.sign-up" : "Quando disabilitata (OFF), il processo di registrazione è proibito. Nessuno può iscriversi indipendentemente dal fornitore utilizzato.",
"EditPage.cancel" : "Cancella",
"EditPage.submit" : "Salva",
"EditPage.form.roles" : "Dettagli del ruolo",
"EditPage.form.roles.label.description" : "Descrizione",
"EditPage.form.roles.label.name" : "Nome",
"EditPage.form.roles.label.users" : "Utente associato con questo ruolo ({number})",
"EditPage.form.roles.name.error" : "Questo valore è obbligatorio",
"EditPage.header.title" : "{name}",
"EditPage.header.title.create" : "Crea un nuovo ruolo",
"EditPage.header.description" : "{description}",
"EditPage.header.description.create" : "Crea",
"EditPage.notification.permissions.error" : "Si è verificato un errore durante il recupero dei permessi",
"EditPage.notification.policies.error" : "Si è verificato un errore durante il recupero delle policy",
"EditPage.notification.role.error" : "Si è verificato un errore durante il recupero del ruolo",
"eaderNav.link.advancedSettings" : "Impostazioni avanzate",
"HeaderNav.link.emailTemplates" : "Template delle Email",
"HeaderNav.link.providers" : "Providers",
"HeaderNav.link.roles" : "Ruoli e permessi",
"HomePage.header.title" : "Ruoli e permessi",
"HomePage.header.description" : "Definisci i ruoli e i permessi per i tuoi utenti.",
"InputSearch.placeholder" : "Cerca un utente",
"List.button.roles" : "Aggiungi un ruolo",
"List.button.providers" : "Aggiungi un nuovo Provider",
"List.title.emailTemplates.singular" : "{number} template per le email disponibile",
"List.title.emailTemplates.plural" : "{number} template per le email disponibili",
"List.title.providers.disabled.singular" : "{number} disabilitato",
"List.title.providers.disabled.plural" : "{number} sono disabilitati",
"List.title.providers.enabled.singular" : "{number} provider è abilitato e",
"List.title.providers.enabled.plural" : "{number} providers sono disponibili e",
"List.title.roles.singular" : "{number} ruolo disponibile",
"List.title.roles.plural" : "{number} ruoli disponibili",
"notification.error.delete" : "Si è verificato un errore mentre si stava cercando di eliminare l'elemento",
"notification.error.fetch" : "Si è verificato un errore mentre si stava cercando di recuperare i dati",
"notification.error.fetchUser" : "Si è verificato un errore mentre si stava cercando di recuperare gli utenti",
"notification.info.emailSent" : "Email inviata",
"notification.success.delete" : "L'elemento è stato eliminato",
"notification.success.submit" : "Impostazioni aggiornate",
"plugin.description.short" : "Proteggi le tue API con un processo completo di autenticazione basato su JWT",
"plugin.description.long" : "Proteggi le tue API con un processo completo di autenticazione basato su JWT. Questo plugin è implementato con una strategia ACL che ti consente di gestire i permessi tra i gruppi di utenti.",
"Plugin.permissions.application.description" : "Definire tutte le azioni consentite per il tuo progetto.",
"Plugin.permissions.plugins.description" : "Definire tutte le azioni consentite per il plugin {name}.",
"Plugins.header.title" : "Permessi",
"Plugins.header.description" : "Solo le azioni guidate da un percorso sono elencate sotto.",
"Policies.InputSelect.empty" : "Nessuno",
"Policies.InputSelect.label" : "Consenti di eseguire questa azione per:",
"Policies.header.hint" : "Seleziona le azioni dell'applicazione o del plugin e clicca sull'icona cog per mostrare il percorso corrispondente",
"Policies.header.title" : "Impostazioni avanzate",
"Email.template.validation_email" : "Validazione dell'indirizzo Email",
"Email.template.reset_password" : "Reset password",
"Email.template.success_register" : "Registrazione avvenuta",
"Auth.advanced.allow_register" : "Registrazione consentita",
"PopUpForm.button.cancel" : "Cancella",
"PopUpForm.button.save" : "Salva",
"PopUpForm.header.add.providers" : "Aggiungi nuovo Provider",
"PopUpForm.header.edit.email-templates" : "Modifica il template delle Email",
"PopUpForm.header.edit.providers" : "Modifica {provider} Provider",
"PopUpForm.inputSelect.providers.label" : "Scegli il provider",
"PopUpForm.Email.options.from.name.label" : "Nome del mittente",
"PopUpForm.Email.options.from.email.label" : "Email del mittente",
"PopUpForm.Email.options.response_email.label" : "Email di risposta",
"PopUpForm.Email.options.object.label" : "Soggetto",
"PopUpForm.Email.options.message.label" : "Messaggio",
"PopUpForm.Email.validation_email.options.object.placeholder" : "Conferma gentilmente il tuo indirizzo email per %APP_NAME%",
"PopUpForm.Email.reset_password.options.object.placeholder" : "Conferma gentilmente il tuo indirizzo email per %APP_NAME%",
"PopUpForm.Email.success_register.options.object.placeholder" : "Conferma gentilmente il tuo indirizzo email per %APP_NAME%",
"PopUpForm.Email.validation_email.options.message.placeholder" : "Clicca su questo link per validare il tuo account",
"PopUpForm.Email.reset_password.options.message.placeholder" : "Clicca su questo link per validare il tuo account",
"PopUpForm.Email.success_register.options.message.placeholder" : "Clicca su questo link per validare il tuo account",
"PopUpForm.Email.options.from.email.placeholder" : "johndoe@gmail.com",
"PopUpForm.Email.options.response_email.placeholder" : "johndoe@gmail.com",
"PopUpForm.Email.options.from.name.placeholder" : "John Doe",
"PopUpForm.Providers.enabled.label" : "Abilita",
"PopUpForm.Providers.enabled.description" : "Se disabilitato, gli utenti non potranno usare questo provider.",
"opUpForm.Providers.key.label" : "Client ID",
"PopUpForm.Providers.key.placeholder" : "TEXT",
"PopUpForm.Providers.secret.label" : "Client Secret",
"PopUpForm.Providers.secret.placeholder" : "TEXT",
"PopUpForm.Providers.redirectURL.front-end.label" : "L'URL di redirect per la tua app di front-end",
"PopUpForm.Providers.facebook.providerConfig.redirectURL" : "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Facebook",
"PopUpForm.Providers.google.providerConfig.redirectURL" : "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Google",
"PopUpForm.Providers.github.providerConfig.redirectURL" : "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Github",
"PopUpForm.Providers.linkedin2.providerConfig.redirectURL" : "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Linkdin",
"PopUpForm.Providers.twitter.providerConfig.redirectURL" : "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Twitter",
"PopUpForm.Providers.callback.placeholder" : "TEXT",
"PopUpForm.Email.email_templates.inputDescription" : "Se non sai bene come usare le variabili, {link}",
"PopUpForm.Email.link.documentation" : "controlla la documentazione"
}

View File

@ -14,6 +14,14 @@ module.exports = strapi => {
},
initialize: function(cb) {
console.log();
_.forEach(strapi.admin.config.routes, value => {
if (_.get(value.config, 'policies')) {
value.config.policies.unshift('plugins.users-permissions.permissions');
}
});
_.forEach(strapi.config.routes, value => {
if (_.get(value.config, 'policies')) {
value.config.policies.unshift('plugins.users-permissions.permissions');

View File

@ -27,8 +27,8 @@
"role": {
"model": "role",
"via": "users",
"plugin": "users-permissions"
"plugin": "users-permissions",
"configurable": false
}
},
"collectionName": "users-permissions_user"
}
}
}

View File

@ -66,7 +66,7 @@ module.exports = function(appPath = '') {
};
const setFilesToWatch = (src) => {
var files = _.includes(src, '/admin') || _.includes(src, 'components') ? [] : fs.readdirSync(src);
let files = _.includes(src, '/admin') || _.includes(src, 'components') ? [] : fs.readdirSync(src);
_.forEach(files, file => {
if (