Merge branch 'next' into develop

This commit is contained in:
katherinehhh 2025-03-13 16:30:40 +08:00
commit 4d10946a2e
123 changed files with 3159 additions and 128 deletions

View File

@ -17,7 +17,7 @@ server {
server_name _; server_name _;
root /app/nocobase/packages/app/client/dist; root /app/nocobase/packages/app/client/dist;
index index.html; index index.html;
client_max_body_size 20M; client_max_body_size 0;
access_log /var/log/nginx/nocobase.log apm; access_log /var/log/nginx/nocobase.log apm;

View File

@ -17,7 +17,7 @@ server {
server_name _; server_name _;
root /app/nocobase/node_modules/@nocobase/app/dist/client; root /app/nocobase/node_modules/@nocobase/app/dist/client;
index index.html; index index.html;
client_max_body_size 1000M; client_max_body_size 0;
access_log /var/log/nginx/nocobase.log apm; access_log /var/log/nginx/nocobase.log apm;
gzip on; gzip on;

View File

@ -17,7 +17,7 @@ server {
server_name _; server_name _;
root {{cwd}}/node_modules/@nocobase/app/dist/client; root {{cwd}}/node_modules/@nocobase/app/dist/client;
index index.html; index index.html;
client_max_body_size 1000M; client_max_body_size 0;
access_log /var/log/nginx/nocobase.log apm; access_log /var/log/nginx/nocobase.log apm;
gzip on; gzip on;

View File

@ -0,0 +1,888 @@
{
"Display <1><0>10</0><1>20</1><2>50</2><3>100</3></1> items per page": "<1><0>10</0><1>20</1><2>50</2><3>100</3></1> Einträge pro Seite anzeigen",
"Meet <1><0>All</0><1>Any</1></1> conditions in the group": "<1><0>Alle</0><1>Beliebige</1></1> Bedingungen in der Gruppe erfüllen",
"Open in<1><0>Modal</0><1>Drawer</1><2>Window</2></1>": "Öffnen in<1><0>Modal</0><1>Seitenleiste</1><2>Fenster</2></1>",
"{{count}} filter items": "{{count}} Filterelemente",
"{{count}} more items": "{{count}} weitere Einträge",
"Total {{count}} items": "Insgesamt {{count}} Einträge",
"Today": "Heute",
"Yesterday": "Gestern",
"Tomorrow": "Morgen",
"Month": "Monat",
"Week": "Woche",
"This week": "Diese Woche",
"This month": "Dieser Monat",
"This year": "Dieses Jahr",
"Next year": "Nächstes Jahr",
"Last week": "Letzte Woche",
"Next week": "Nächste Woche",
"Last month": "Letzter Monat",
"Next month": "Nächster Monat",
"Last quarter": "Letztes Quartal",
"This quarter": "Dieses Quartal",
"Next quarter": "Nächstes Quartal",
"Last year": "Letztes Jahr",
"Last 7 days": "Letzte 7 Tage",
"Last 30 days": "Letzte 30 Tage",
"Last 90 days": "Letzte 90 Tage",
"Next 7 days": "Nächste 7 Tage",
"Next 30 days": "Nächste 30 Tage",
"Next 90 days": "Nächste 90 Tage",
"Work week": "Arbeitswoche",
"Day": "Tag",
"Agenda": "Agenda",
"Date": "Datum",
"Time": "Zeit",
"Event": "Ereignis",
"None": "Keine",
"Unconnected": "Nicht verbunden",
"System settings": "Systemeinstellungen",
"System title": "Systemtitel",
"Settings": "Einstellungen",
"Logo": "Logo",
"Add menu item": "Menüpunkt hinzufügen",
"Page": "Seite",
"Name": "Name",
"Icon": "Symbol",
"Group": "Gruppe",
"Link": "Link",
"Tab": "Tab",
"Save conditions": "Bedingungen speichern",
"Edit menu item": "Menüpunkt bearbeiten",
"Move to": "Verschieben nach",
"Insert left": "Links einfügen",
"Insert right": "Rechts einfügen",
"Insert inner": "Innen einfügen",
"Delete": "Löschen",
"Disassociate": "Trennen",
"Disassociate record": "Datensatz trennen",
"Are you sure you want to disassociate it?": "Sind Sie sicher, dass Sie die Verbindung trennen möchten?",
"UI editor": "UI-Editor",
"Collection": "Sammlung",
"Collection selector": "Sammlungsauswahl",
"Providing certain collections as options for users, typically used in polymorphic or inheritance scenarios": "Bestimmte Sammlungen als Optionen für Benutzer bereitstellen, typischerweise verwendet in polymorphen oder Vererbungsszenarien",
"Collections & Fields": "Sammlungen & Felder",
"All collections": "Alle Sammlungen",
"Add category": "Kategorie hinzufügen",
"Enable child collections": "Untersammlungen aktivieren",
"Allow adding records to the current collection": "Hinzufügen von Datensätzen zur aktuellen Sammlung erlauben",
"Delete category": "Kategorie löschen",
"Edit category": "Kategorie bearbeiten",
"Collection category": "Sammlungskategorie",
"Collection template": "Sammlungsvorlage",
"Sort": "Sortieren",
"Categories": "Kategorien",
"Visible": "Sichtbar",
"Read only": "Nur lesen",
"Easy reading": "Leicht lesbar",
"Hidden": "Versteckt",
"Hidden(reserved value)": "Versteckt (reservierter Wert)",
"Not required": "Nicht erforderlich",
"Value": "Wert",
"Disabled": "Deaktiviert",
"Enabled": "Aktiviert",
"Problematic": "Problematisch",
"Setting": "Einstellung",
"On": "Ein",
"Off": "Aus",
"Empty": "Leer",
"Linkage rule": "Verknüpfungsregel",
"Linkage rules": "Verknüpfungsregeln",
"Condition": "Bedingung",
"Properties": "Eigenschaften",
"Add linkage rule": "Verknüpfungsregel hinzufügen",
"Add property": "Eigenschaft hinzufügen",
"Category name": "Kategoriename",
"Roles & Permissions": "Rollen & Berechtigungen",
"Edit profile": "Profil bearbeiten",
"Change password": "Passwort ändern",
"Old password": "Altes Passwort",
"New password": "Neues Passwort",
"Switch role": "Rolle wechseln",
"Super admin": "Superadministrator",
"Language": "Sprache",
"Allow sign up": "Registrierung erlauben",
"Enable SMS authentication": "SMS-Authentifizierung aktivieren",
"Sign out": "Abmelden",
"Cancel": "Abbrechen",
"Submit": "Absenden",
"Close": "Schließen",
"Set the data scope": "Datenbereich festlegen",
"Set data loading mode": "Datenladungsmodus festlegen",
"Load all data when filter is empty": "Alle Daten laden, wenn der Filter leer ist",
"Do not load data when filter is empty": "Keine Daten laden, wenn der Filter leer ist",
"Data loading mode": "Datenladungsmodus",
"Data blocks": "Datenblöcke",
"Filter blocks": "Filterblöcke",
"Table": "Tabelle",
"Table OID(Inheritance)": "Tabellen-OID (Vererbung)",
"Form": "Formular",
"List": "Liste",
"Grid Card": "Rasterkarte",
"pixels": "Pixel",
"Screen size": "Bildschirmgröße",
"Display title": "Titel anzeigen",
"Set the count of columns displayed in a row": "Anzahl der Spalten in einer Zeile festlegen",
"Column": "Spalte",
"Phone device": "Mobiltelefon",
"Tablet device": "Tablet",
"Desktop device": "Desktop",
"Large screen device": "Großer Bildschirm",
"Collapse": "Einklappen",
"Select data source": "Datenquelle auswählen",
"Calendar": "Kalender",
"Delete events": "Ereignisse löschen",
"This event": "Dieses Ereignis",
"This and following events": "Dieses und folgende Ereignisse",
"All events": "Alle Ereignisse",
"Delete this event?": "Dieses Ereignis löschen?",
"Delete Event": "Ereignis löschen",
"Kanban": "Kanban",
"Gantt": "Gantt",
"Create gantt block": "Gantt-Block erstellen",
"Progress field": "Fortschrittsfeld",
"Time scale": "Zeitskala",
"Hour": "Stunde",
"Quarter of day": "Viertel des Tages",
"Half of day": "Halber Tag",
"Year": "Jahr",
"QuarterYear": "Jahresquartal",
"Select grouping field": "Gruppierungsfeld auswählen",
"Media": "Medien",
"Markdown": "Markdown",
"Wysiwyg": "Wysiwyg",
"Chart blocks": "Diagrammblöcke",
"Column chart": "Säulendiagramm",
"Bar chart": "Balkendiagramm",
"Line chart": "Liniendiagramm",
"Pie chart": "Kreisdiagramm",
"Area chart": "Flächendiagramm",
"Other chart": "Anderes Diagramm",
"Other blocks": "Andere Blöcke",
"In configuration": "In Konfiguration",
"Chart title": "Diagrammtitel",
"Chart type": "Diagrammtyp",
"Chart config": "Diagrammkonfiguration",
"Templates": "Vorlagen",
"Select template": "Vorlage auswählen",
"Action logs": "Aktionslogs",
"Create template": "Vorlage erstellen",
"Edit markdown": "Markdown bearbeiten",
"Add block": "Block hinzufügen",
"Add new": "Neu hinzufügen",
"Add record": "Datensatz hinzufügen",
"Add child": "Kind hinzufügen",
"Collapse all": "Alle einklappen",
"Expand all": "Alle ausklappen",
"Expand/Collapse": "Erweitern/Einklappen",
"Default collapse": "Standardmäßig eingeklappt",
"Tree table": "Baumtabelle",
"Custom field display name": "Benutzerdefinierter Feldanzeigename",
"Display fields": "Anzeigefelder der Sammlung",
"Edit record": "Datensatz bearbeiten",
"Delete menu item": "Menüpunkt löschen",
"Add page": "Seite hinzufügen",
"Add group": "Gruppe hinzufügen",
"Add link": "Link hinzufügen",
"Insert above": "Oben einfügen",
"Insert below": "Unten einfügen",
"Save": "Speichern",
"Delete block": "Block löschen",
"Are you sure you want to delete it?": "Sind Sie sicher, dass Sie es löschen möchten?",
"This is a demo text, **supports Markdown syntax**.": "Dies ist ein Beispieltext, **unterstützt Markdown-Syntax**.",
"Filter": "Filter",
"Connect data blocks": "Datenblöcke verbinden",
"Action type": "Aktionstyp",
"Actions": "Aktionen",
"Insert": "Einfügen",
"Insert if not exists": "Einfügen, wenn nicht vorhanden",
"Insert if not exists, or update": "Einfügen, wenn nicht vorhanden, sonst aktualisieren",
"Determine whether a record exists by the following fields": "Bestimmen Sie, ob ein Datensatz anhand der folgenden Felder existiert",
"Update": "Aktualisieren",
"Update record": "Datensatz aktualisieren",
"View": "Ansicht",
"View record": "Datensatz ansehen",
"Refresh": "Aktualisieren",
"Data changes": "Datenänderungen",
"Field name": "Feldname",
"Before change": "Vor der Änderung",
"After change": "Nach der Änderung",
"Delete record": "Datensatz löschen",
"Delete collection": "Sammlung löschen",
"Create collection": "Sammlung erstellen",
"Collection display name": "Anzeigename der Sammlung",
"Collection name": "Sammlungsname",
"Inherits": "Erbt von",
"Primary key, unique identifier, self growth": "Primärschlüssel, eindeutiger Bezeichner, automatische Erhöhung",
"Store the creation user of each record": "Speichert den Erstellungsbenutzer jedes Datensatzes",
"Store the last update user of each record": "Speichert den letzten Aktualisierungsbenutzer jedes Datensatzes",
"Store the creation time of each record": "Speichert die Erstellungszeit jedes Datensatzes",
"Store the last update time of each record": "Speichert die letzte Aktualisierungszeit jedes Datensatzes",
"More options": "Weitere Optionen",
"Records can be sorted": "Datensätze können sortiert werden",
"Calendar collection": "Kalendersammlung",
"General collection": "Allgemeine Sammlung",
"Connect to database view": "Mit Datenbankansicht verbinden",
"Sync from database": "Von Datenbank synchronisieren",
"Source collections": "Quellsammlungen",
"Field source": "Feldquelle",
"Preview": "Vorschau",
"Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.": "Zufällig generiert und kann geändert werden. Unterstützt Buchstaben, Zahlen und Unterstriche, muss mit einem Buchstaben beginnen.",
"Edit": "Bearbeiten",
"Edit collection": "Sammlung bearbeiten",
"Configure fields": "Felder konfigurieren",
"Configure columns": "Spalten konfigurieren",
"Edit field": "Feld bearbeiten",
"Override": "Überschreiben",
"Override field": "Feld überschreiben",
"Configure fields of {{title}}": "Felder von {{title}} konfigurieren",
"Association fields filter": "Filter für Verknüpfungsfelder",
"PK & FK fields": "PK & FK Felder",
"Association fields": "Verknüpfungsfelder",
"Choices fields": "Auswahlfelder",
"System fields": "Systemfelder",
"General fields": "Allgemeine Felder",
"Inherited fields": "Geerbte Felder",
"Parent collection fields": "Felder der übergeordneten Sammlung",
"Basic": "Grundlegend",
"Single line text": "Einzeiliger Text",
"Long text": "Langer Text",
"Phone": "Telefon",
"Email": "E-Mail",
"Number": "Zahl",
"Integer": "Ganzzahl",
"Percent": "Prozent",
"Password": "Passwort",
"Advanced type": "Erweitert",
"Formula": "Formel",
"Formula description": "Berechnet einen Wert in jedem Datensatz basierend auf anderen Feldern im selben Datensatz.",
"Choices": "Auswahlmöglichkeiten",
"Checkbox": "Kontrollkästchen",
"Single select": "Einzelauswahl",
"Multiple select": "Mehrfachauswahl",
"Radio group": "Radiogruppe",
"Checkbox group": "Kontrollkästchengruppe",
"China region": "China-Region",
"Date & Time": "Datum & Zeit",
"Datetime": "Datum/Zeit",
"Relation": "Beziehung",
"Link to": "Verknüpfen mit",
"Link to description": "Wird verwendet, um Sammlungsbeziehungen schnell zu erstellen und ist mit den meisten gängigen Szenarien kompatibel. Geeignet für Nicht-Entwickler. Als Feld dargestellt, ist es eine Dropdown-Auswahl zur Auswahl von Datensätzen aus der Zielsammlung. Nach der Erstellung werden gleichzeitig die zugehörigen Felder der aktuellen Sammlung in der Zielsammlung generiert.",
"Sub-table": "Untertabelle",
"Sub-details": "Unterdetails",
"Sub-form(Popover)": "Unterformular (Popover)",
"System info": "Systeminformationen",
"Created at": "Erstellt am",
"Last updated at": "Zuletzt aktualisiert am",
"Created by": "Erstellt von",
"Last updated by": "Zuletzt aktualisiert von",
"Add field": "Feld hinzufügen",
"Field display name": "Feldanzeigename",
"Field type": "Feldtyp",
"Field interface": "Feldschnittstelle",
"Date format": "Datumsformat",
"Year/Month/Day": "Jahr/Monat/Tag",
"Year-Month-Day": "Jahr-Monat-Tag",
"Day/Month/Year": "Tag/Monat/Jahr",
"Show time": "Zeit anzeigen",
"Time format": "Zeitformat",
"12 hour": "12 Stunden",
"24 hour": "24 Stunden",
"Relationship type": "Beziehungstyp",
"Inverse relationship type": "Inverse Beziehungstyp",
"Source collection": "Quellsammlung",
"Source key": "Quellschlüssel",
"Target collection": "Zielsammlung",
"Through collection": "Zwischensammlung",
"Target key": "Zielschlüssel",
"Foreign key": "Fremdschlüssel",
"One to one": "Eins zu Eins",
"One to many": "Eins zu Viele",
"Many to one": "Viele zu Eins",
"Many to many": "Viele zu Viele",
"Foreign key 1": "Fremdschlüssel 1",
"Foreign key 2": "Fremdschlüssel 2",
"One to one description": "Wird verwendet, um eine Eins-zu-Eins-Beziehung zu erstellen. Zum Beispiel hat ein Benutzer ein Profil.",
"One to many description": "Wird verwendet, um eine Eins-zu-Viele-Beziehung zu erstellen. Zum Beispiel hat ein Land viele Städte und eine Stadt kann nur in einem Land sein. Als Feld dargestellt, ist es eine Untertabelle, die die Datensätze der zugehörigen Sammlung anzeigt. Bei der Erstellung wird automatisch ein Viele-zu-Eins-Feld in der zugehörigen Sammlung generiert.",
"Many to one description": "Wird verwendet, um Viele-zu-Eins-Beziehungen zu erstellen. Zum Beispiel kann eine Stadt nur zu einem Land gehören und ein Land kann viele Städte haben. Als Feld dargestellt, ist es eine Dropdown-Auswahl zur Auswahl eines Datensatzes aus der zugehörigen Sammlung. Nach der Erstellung wird automatisch ein Eins-zu-Viele-Feld in der zugehörigen Sammlung generiert.",
"Many to many description": "Wird verwendet, um Viele-zu-Viele-Beziehungen zu erstellen. Zum Beispiel hat ein Schüler viele Lehrer und ein Lehrer hat viele Schüler. Als Feld dargestellt, ist es eine Dropdown-Auswahl zur Auswahl von Datensätzen aus der zugehörigen Sammlung.",
"Generated automatically if left blank": "Wird automatisch generiert, wenn leer gelassen",
"Display association fields": "Verknüpfungsfelder anzeigen",
"Display field title": "Feldtitel anzeigen",
"Field component": "Feldkomponente",
"Allow multiple": "Mehrere erlauben",
"Quick upload": "Schnelles Hochladen",
"Select file": "Datei auswählen",
"Subtable": "Untertabelle",
"Sub-form": "Unterformular",
"Field mode": "Feldmodus",
"Allow add new data": "Hinzufügen neuer Daten erlauben",
"Record picker": "Datensatzauswahl",
"Toggles the subfield mode": "Schaltet den Unterfeld-Modus um",
"Selector mode": "Auswahlmodus",
"Subtable mode": "Untertabellenmodus",
"Subform mode": "Unterformularmodus",
"Edit block title": "Blocktitel bearbeiten",
"Block title": "Blocktitel",
"Pattern": "Muster",
"Operator": "Operator",
"Editable": "Bearbeitbar",
"Readonly": "Schreibgeschützt",
"Easy-reading": "Leicht lesbar",
"Add filter": "Filter hinzufügen",
"Add filter group": "Filtergruppe hinzufügen",
"Comparision": "Vergleich",
"is": "ist",
"is not": "ist nicht",
"contains": "enthält",
"does not contain": "enthält nicht",
"starts with": "beginnt mit",
"not starts with": "beginnt nicht mit",
"ends with": "endet mit",
"not ends with": "endet nicht mit",
"is empty": "ist leer",
"is not empty": "ist nicht leer",
"Edit chart": "Diagramm bearbeiten",
"Add text": "Text hinzufügen",
"Filterable fields": "Filterbare Felder",
"Edit button": "Schaltfläche bearbeiten",
"Hide": "Ausblenden",
"Enable actions": "Aktionen aktivieren",
"Import": "Importieren",
"Export": "Exportieren",
"Customize": "Anpassen",
"Custom": "Benutzerdefiniert",
"Function": "Funktion",
"Popup form": "Popup-Formular",
"Flexible popup": "Flexibles Popup",
"Configure actions": "Aktionen konfigurieren",
"Display order number": "Bestellnummer anzeigen",
"Enable drag and drop sorting": "Drag & Drop-Sortierung aktivieren",
"Triggered when the row is clicked": "Wird ausgelöst, wenn auf die Zeile geklickt wird",
"Add tab": "Tab hinzufügen",
"Disable tabs": "Tabs deaktivieren",
"Details": "Details",
"Edit form": "Formular bearbeiten",
"Create form": "Formular erstellen",
"Form (Edit)": "Formular (Bearbeiten)",
"Form (Add new)": "Formular (Neu hinzufügen)",
"Edit tab": "Tab bearbeiten",
"Relationship blocks": "Beziehungsblöcke",
"Select record": "Datensatz auswählen",
"Display name": "Anzeigename",
"Select icon": "Symbol auswählen",
"Custom column name": "Benutzerdefinierter Spaltenname",
"Edit description": "Beschreibung bearbeiten",
"Required": "Erforderlich",
"Unique": "Eindeutig",
"Primary": "Primär",
"Auto increment": "Automatische Erhöhung",
"Label field": "Beschriftungsfeld",
"Default is the ID field": "Standard ist das ID-Feld",
"Set default sorting rules": "Standardsortierregeln festlegen",
"Set validation rules": "Validierungsregeln festlegen",
"Max length": "Maximale Länge",
"Min length": "Minimale Länge",
"Maximum": "Maximum",
"Minimum": "Minimum",
"Max length must greater than min length": "Maximale Länge muss größer als minimale Länge sein",
"Min length must less than max length": "Minimale Länge muss kleiner als maximale Länge sein",
"Maximum must greater than minimum": "Maximum muss größer als Minimum sein",
"Minimum must less than maximum": "Minimum muss kleiner als Maximum sein",
"Validation rule": "Validierungsregel",
"Add validation rule": "Validierungsregel hinzufügen",
"Format": "Format",
"Regular expression": "Regulärer Ausdruck",
"Error message": "Fehlermeldung",
"Length": "Länge",
"The field value cannot be greater than ": "Der Feldwert darf nicht größer sein als ",
"The field value cannot be less than ": "Der Feldwert darf nicht kleiner sein als ",
"The field value is not an integer number": "Der Feldwert ist keine ganze Zahl",
"Set default value": "Standardwert festlegen",
"Default value": "Standardwert",
"is before": "ist vor",
"is after": "ist nach",
"is on or after": "ist am oder nach",
"is on or before": "ist am oder vor",
"is between": "ist zwischen",
"Upload": "Hochladen",
"Select level": "Ebene auswählen",
"Province": "Provinz",
"City": "Stadt",
"Area": "Gebiet",
"Street": "Straße",
"Village": "Dorf",
"Must select to the last level": "Muss bis zur letzten Ebene ausgewählt werden",
"Move {{title}} to": "{{title}} verschieben nach",
"Target position": "Zielposition",
"After": "Nach",
"Before": "Vor",
"Add {{type}} before \"{{title}}\"": "{{type}} vor \"{{title}}\" hinzufügen",
"Add {{type}} after \"{{title}}\"": "{{type}} nach \"{{title}}\" hinzufügen",
"Add {{type}} in \"{{title}}\"": "{{type}} in \"{{title}}\" hinzufügen",
"Original name": "Ursprünglicher Name",
"Custom name": "Benutzerdefinierter Name",
"Custom Title": "Benutzerdefinierter Titel",
"Options": "Optionen",
"Option value": "Optionswert",
"Option label": "Optionsbezeichnung",
"Color": "Farbe",
"Background Color": "Hintergrundfarbe",
"Text Align": "Textausrichtung",
"Add option": "Option hinzufügen",
"Related collection": "Zugehörige Sammlung",
"Allow linking to multiple records": "Verknüpfung mit mehreren Datensätzen erlauben",
"Allow uploading multiple files": "Hochladen mehrerer Dateien erlauben",
"Configure calendar": "Kalender konfigurieren",
"Title field": "Titelfeld",
"Custom title": "Benutzerdefinierter Titel",
"Daily": "Täglich",
"Weekly": "Wöchentlich",
"Monthly": "Monatlich",
"Yearly": "Jährlich",
"Repeats": "Wiederholungen",
"Show lunar": "Mondkalender anzeigen",
"Start date field": "Startdatumsfeld",
"End date field": "Enddatumsfeld",
"Navigate": "Navigieren",
"Title": "Titel",
"Description": "Beschreibung",
"Select view": "Ansicht auswählen",
"Reset": "Zurücksetzen",
"Importable fields": "Importierbare Felder",
"Exportable fields": "Exportierbare Felder",
"Saved successfully": "Erfolgreich gespeichert",
"Nickname": "Spitzname",
"Sign in": "Anmelden",
"Sign in via account": "Über Konto anmelden",
"Sign in via phone": "Über Telefon anmelden",
"Create an account": "Konto erstellen",
"Sign up": "Registrieren",
"Confirm password": "Passwort bestätigen",
"Log in with an existing account": "Mit einem bestehenden Konto anmelden",
"Signed up successfully. It will jump to the login page.": "Registrierung erfolgreich. Sie werden zur Anmeldeseite weitergeleitet.",
"Password mismatch": "Passwörter stimmen nicht überein",
"Users": "Benutzer",
"Verification code": "Bestätigungscode",
"Send code": "Code senden",
"Retry after {{count}} seconds": "Wiederholen nach {{count}} Sekunden",
"Roles": "Rollen",
"Add role": "Rolle hinzufügen",
"Role name": "Rollenname",
"Configure": "Konfigurieren",
"Configure permissions": "Berechtigungen konfigurieren",
"Edit role": "Rolle bearbeiten",
"Action permissions": "Aktionsberechtigungen",
"Menu permissions": "Menüberechtigungen",
"Menu item name": "Menüpunktname",
"Allow access": "Zugriff erlauben",
"Action name": "Aktionsname",
"Allow action": "Aktion erlauben",
"Action scope": "Aktionsbereich",
"Operate on new data": "Mit neuen Daten arbeiten",
"Operate on existing data": "Mit vorhandenen Daten arbeiten",
"Yes": "Ja",
"No": "Nein",
"Red": "Rot",
"Magenta": "Magenta",
"Volcano": "Vulkan",
"Orange": "Orange",
"Gold": "Gold",
"Lime": "Limette",
"Green": "Grün",
"Cyan": "Cyan",
"Blue": "Blau",
"Geek blue": "Geek-Blau",
"Purple": "Lila",
"Default": "Standard",
"Add card": "Karte hinzufügen",
"edit title": "Titel bearbeiten",
"Turn pages": "Seiten umblättern",
"Others": "Andere",
"Other records": "Andere Datensätze",
"Save as template": "Als Vorlage speichern",
"Save as block template": "Als Blockvorlage speichern",
"Block templates": "Blockvorlagen",
"Block template": "Blockvorlage",
"Convert reference to duplicate": "Referenz in Duplikat umwandeln",
"Template name": "Vorlagenname",
"Block type": "Blocktyp",
"No blocks to connect": "Keine Blöcke zum Verbinden",
"Action column": "Aktionsspalte",
"Records per page": "Datensätze pro Seite",
"(Fields only)": "(Nur Felder)",
"Button title": "Schaltflächentitel",
"Button icon": "Schaltflächensymbol",
"Submitted successfully": "Erfolgreich übermittelt",
"Operation succeeded": "Operation erfolgreich",
"Operation failed": "Operation fehlgeschlagen",
"Open mode": "Öffnungsmodus",
"Popup size": "Popup-Größe",
"Small": "Klein",
"Middle": "Mittel",
"Large": "Groß",
"Size": "Größe",
"Oversized": "Übergroß",
"Auto": "Automatisch",
"Object Fit": "Objektanpassung",
"Cover": "Abdecken",
"Fill": "Füllen",
"Contain": "Enthalten",
"Scale Down": "Verkleinern",
"Menu item title": "Menüpunkttitel",
"Menu item icon": "Menüpunktsymbol",
"Target": "Ziel",
"Position": "Position",
"Insert before": "Davor einfügen",
"Insert after": "Danach einfügen",
"UI Editor": "UI-Editor",
"ASC": "Aufsteigend",
"DESC": "Absteigend",
"Add sort field": "Sortierfeld hinzufügen",
"ID": "ID",
"Identifier for program usage. Support letters, numbers and underscores, must start with an letter.": "Bezeichner für Programmnutzung. Unterstützt Buchstaben, Zahlen und Unterstriche, muss mit einem Buchstaben beginnen.",
"Drawer": "Seitenleiste",
"Dialog": "Dialog",
"Delete action": "Aktion löschen",
"Custom column title": "Benutzerdefinierter Spaltentitel",
"Column title": "Spaltentitel",
"Original title: ": "Ursprünglicher Titel: ",
"Delete table column": "Tabellenspalte löschen",
"Skip required validation": "Erforderliche Validierung überspringen",
"Form values": "Formularwerte",
"Fields values": "Feldwerte",
"The field has been deleted": "Das Feld wurde gelöscht",
"When submitting the following fields, the saved values are": "Beim Absenden der folgenden Felder sind die gespeicherten Werte",
"After successful submission": "Nach erfolgreicher Übermittlung",
"Then": "Dann",
"Stay on current page": "Auf aktueller Seite bleiben",
"Redirect to": "Weiterleiten zu",
"Save action": "Aktion speichern",
"Exists": "Existiert",
"Add condition": "Bedingung hinzufügen",
"Add condition group": "Bedingungsgruppe hinzufügen",
"exists": "existiert",
"not exists": "existiert nicht",
"Style": "Stil",
"=": "=",
"≠": "≠",
">": ">",
"≥": "≥",
"<": "<",
"≤": "≤",
"Role UID": "Rollen-UID",
"Precision": "Genauigkeit",
"Formula mode": "Formelmodus",
"Expression": "Ausdruck",
"Input +, -, *, /, ( ) to calculate, input @ to open field variables.": "Geben Sie +, -, *, /, ( ) zum Berechnen ein, geben Sie @ ein, um Feldvariablen zu öffnen.",
"Formula error.": "Formelfehler.",
"Rich Text": "Rich Text",
"Junction collection": "Verbindungssammlung",
"Leave it blank, unless you need a custom intermediate table": "Lassen Sie es leer, es sei denn, Sie benötigen eine benutzerdefinierte Zwischentabelle",
"Fields": "Felder",
"Edit field title": "Feldtitel bearbeiten",
"Field title": "Feldtitel",
"Original field title: ": "Ursprünglicher Feldtitel: ",
"Edit tooltip": "Tooltip bearbeiten",
"Delete field": "Feld löschen",
"Select collection": "Sammlung auswählen",
"Blank block": "Leerer Block",
"Duplicate template": "Vorlage duplizieren",
"Reference template": "Referenzvorlage",
"Create calendar block": "Kalenderblock erstellen",
"Create kanban block": "Kanban-Block erstellen",
"Grouping field": "Gruppierungsfeld",
"Single select and radio fields can be used as the grouping field": "Einzelauswahl- und Radiofelder können als Gruppierungsfeld verwendet werden",
"Tab name": "Tab-Name",
"Current record blocks": "Blöcke des aktuellen Datensatzes",
"Popup message": "Popup-Nachricht",
"Delete role": "Rolle löschen",
"Role display name": "Rollenanzeigename",
"Default role": "Standardrolle",
"All collections use general action permissions by default; permission configured individually will override the default one.": "Alle Sammlungen verwenden standardmäßig allgemeine Aktionsberechtigungen; individuell konfigurierte Berechtigungen überschreiben die Standardeinstellung.",
"Allows configuration of the whole system, including UI, collections, permissions, etc.": "Ermöglicht die Konfiguration des gesamten Systems, einschließlich UI, Sammlungen, Berechtigungen usw.",
"New menu items are allowed to be accessed by default.": "Neue Menüpunkte dürfen standardmäßig zugegriffen werden.",
"Global permissions": "Globale Berechtigungen",
"General permissions": "Allgemeine Berechtigungen",
"Global action permissions": "Globale Aktionsberechtigungen",
"General action permissions": "Allgemeine Aktionsberechtigungen",
"Plugin settings permissions": "Plugin-Einstellungsberechtigungen",
"Allow to desgin pages": "Erlauben, Seiten zu gestalten",
"Allow to manage plugins": "Erlauben, Plugins zu verwalten",
"Allow to configure plugins": "Erlauben, Plugins zu konfigurieren",
"Allows to configure interface": "Erlaubt die Konfiguration der Schnittstelle",
"Allows to install, activate, disable plugins": "Erlaubt das Installieren, Aktivieren und Deaktivieren von Plugins",
"Allows to configure plugins": "Erlaubt die Konfiguration von Plugins",
"Action display name": "Anzeigeame der Aktion",
"Allow": "Erlauben",
"Data scope": "Datenbereich",
"Action on new records": "Aktion für neue Datensätze",
"Action on existing records": "Aktion für bestehende Datensätze",
"All records": "Alle Datensätze",
"Own records": "Eigene Datensätze",
"Permission policy": "Berechtigungsrichtlinie",
"Individual": "Individuell",
"General": "Allgemein",
"Accessible": "Zugänglich",
"Configure permission": "Berechtigung konfigurieren",
"Action permission": "Aktionsberechtigung",
"Field permission": "Feldberechtigung",
"Scope name": "Bereichsname",
"Unsaved changes": "Ungespeicherte Änderungen",
"Are you sure you don't want to save?": "Sind Sie sicher, dass Sie nicht speichern möchten?",
"Dragging": "Ziehen",
"Popup": "Popup",
"Trigger workflow": "Workflow auslösen",
"Request API": "API anfragen",
"Assign field values": "Feldwerte zuweisen",
"Constant value": "Konstanter Wert",
"Dynamic value": "Dynamischer Wert",
"Current user": "Aktueller Benutzer",
"Current role": "Aktuelle Rolle",
"Current record": "Aktueller Datensatz",
"Current collection": "Aktuelle Sammlung",
"Other collections": "Andere Sammlungen",
"Current popup record": "Aktueller Popup-Datensatz",
"Parent popup record": "Übergeordneter Popup-Datensatz",
"Associated records": "Zugehörige Datensätze",
"Parent record": "Übergeordneter Datensatz",
"Current time": "Aktuelle Zeit",
"System variables": "Systemvariablen",
"Date variables": "Datumsvariablen",
"Message popup close method": "Schließmethode für Popup-Nachrichten",
"Automatic close": "Automatisch schließen",
"Manually close": "Manuell schließen",
"After successful update": "Nach erfolgreicher Aktualisierung",
"Save record": "Datensatz speichern",
"Updated successfully": "Erfolgreich aktualisiert",
"After successful save": "Nach erfolgreichem Speichern",
"After clicking the custom button, the following field values will be assigned according to the following form.": "Nach dem Klicken auf die benutzerdefinierte Schaltfläche werden die folgenden Feldwerte gemäß dem folgenden Formular zugewiesen.",
"After clicking the custom button, the following fields of the current record will be saved according to the following form.": "Nach dem Klicken auf die benutzerdefinierte Schaltfläche werden die folgenden Felder des aktuellen Datensatzes gemäß dem folgenden Formular gespeichert.",
"Button background color": "Schaltflächen-Hintergrundfarbe",
"Highlight": "Hervorheben",
"Danger red": "Gefahr-Rot",
"Custom request": "Benutzerdefinierte Anfrage",
"Request settings": "Anfrageeinstellungen",
"Request URL": "Anfrage-URL",
"Request method": "Anfragemethode",
"Request query parameters": "Anfrageparameter",
"Request headers": "Anfrageheader",
"Request body": "Anfragekörper",
"Request success": "Anfrage erfolgreich",
"Invalid JSON format": "Ungültiges JSON-Format",
"After successful request": "Nach erfolgreicher Anfrage",
"Add exportable field": "Exportierbares Feld hinzufügen",
"Audit logs": "Prüfprotokolle",
"Record ID": "Datensatz-ID",
"User": "Benutzer",
"Field": "Feld",
"Select": "Auswählen",
"Select field": "Feld auswählen",
"Field value changes": "Feldwertänderungen",
"One to one (has one)": "Eins zu Eins (hat ein)",
"One to one (belongs to)": "Eins zu Eins (gehört zu)",
"Use the same time zone (GMT) for all users": "Verwenden Sie die gleiche Zeitzone (GMT) für alle Benutzer",
"Province/city/area name": "Provinz/Stadt/Gebietsname",
"Enabled languages": "Aktivierte Sprachen",
"View all plugins": "Alle Plugins anzeigen",
"Print": "Drucken",
"Done": "Fertig",
"Sign up successfully, and automatically jump to the sign in page": "Registrierung erfolgreich, Sie werden automatisch zur Anmeldeseite weitergeleitet",
"File manager": "Dateimanager",
"ACL": "ACL",
"Collection manager": "Sammlungsmanager",
"Plugin manager": "Plugin-Manager",
"Local": "Lokal",
"Built-in": "Eingebaut",
"Marketplace": "Marktplatz",
"Add plugin": "Plugin hinzufügen",
"Plugin source": "Plugin-Quelle",
"Upgrade": "Aktualisieren",
"Plugin dependencies check failed": "Überprüfung der Plugin-Abhängigkeiten fehlgeschlagen",
"More details": "Weitere Details",
"Upload new version": "Neue Version hochladen",
"Version": "Version",
"Npm package": "NPM-Paket",
"Npm package name": "NPM-Paketname",
"Upload plugin": "Plugin hochladen",
"Official plugin": "Offizielles Plugin",
"Add type": "Typ hinzufügen",
"Changelog": "Änderungsprotokoll",
"Dependencies check": "Abhängigkeitsprüfung",
"Update plugin": "Plugin aktualisieren",
"Installing": "Installiere",
"The deletion was successful.": "Das Löschen war erfolgreich.",
"Plugin Zip File": "Plugin-ZIP-Datei",
"Compressed file url": "URL der komprimierten Datei",
"Last updated": "Zuletzt aktualisiert",
"PackageName": "Paketname",
"DisplayName": "Anzeigename",
"Readme": "Readme",
"Dependencies compatibility check": "Kompatibilitätsprüfung der Abhängigkeiten",
"Plugin dependencies check failed, you should change the dependent version to meet the version requirements.": "Die Überprüfung der Plugin-Abhängigkeiten ist fehlgeschlagen. Sie sollten die abhängige Version ändern, um die Versionsanforderungen zu erfüllen.",
"Version range": "Versionsbereich",
"Plugin's version": "Plugin-Version",
"Result": "Ergebnis",
"No CHANGELOG.md file": "Keine CHANGELOG.md-Datei",
"No README.md file": "Keine README.md-Datei",
"Homepage": "Startseite",
"Drag and drop the file here or click to upload, file size should not exceed 30M": "Ziehen Sie die Datei hierher oder klicken Sie zum Hochladen, die Dateigröße sollte 30M nicht überschreiten",
"Dependencies check failed, can't enable.": "Abhängigkeitsprüfung fehlgeschlagen, kann nicht aktiviert werden.",
"Plugin starting...": "Plugin wird gestartet...",
"Plugin stopping...": "Plugin wird gestoppt...",
"Are you sure to delete this plugin?": "Sind Sie sicher, dass Sie dieses Plugin löschen möchten?",
"Are you sure to disable this plugin?": "Sind Sie sicher, dass Sie dieses Plugin deaktivieren möchten?",
"re-download file": "Datei erneut herunterladen",
"Not enabled": "Nicht aktiviert",
"Search plugin": "Plugin suchen",
"Author": "Autor",
"Plugin loading failed. Please check the server logs.": "Plugin-Ladung fehlgeschlagen. Bitte überprüfen Sie die Serverprotokolle.",
"Coming soon...": "Demnächst verfügbar...",
"All plugin settings": "Alle Plugin-Einstellungen",
"Bookmark": "Lesezeichen",
"Manage all settings": "Alle Einstellungen verwalten",
"Create inverse field in the target collection": "Inverses Feld in der Zielsammlung erstellen",
"Inverse field name": "Name des inversen Feldes",
"Inverse field display name": "Anzeigename des inversen Feldes",
"Bulk update": "Massenaktualisierung",
"After successful bulk update": "Nach erfolgreicher Massenaktualisierung",
"Bulk edit": "Massenbearbeitung",
"Data will be updated": "Daten werden aktualisiert",
"Selected": "Ausgewählt",
"All": "Alle",
"Update selected data?": "Ausgewählte Daten aktualisieren?",
"Update all data?": "Alle Daten aktualisieren?",
"Remains the same": "Bleibt gleich",
"Changed to": "Geändert zu",
"Clear": "Löschen",
"Add attach": "Anhang hinzufügen",
"Please select the records to be updated": "Bitte wählen Sie die zu aktualisierenden Datensätze aus",
"Selector": "Selektor",
"Inner": "Innen",
"Search and select collection": "Sammlung suchen und auswählen",
"Please fill in the iframe URL": "Bitte geben Sie die iframe-URL ein",
"Fix block": "Block fixieren",
"Plugin name": "Plugin-Name",
"Plugin tab name": "Plugin-Tab-Name",
"AutoGenId": "Automatisch generiertes ID-Feld",
"CreatedBy": "Erstellt von",
"UpdatedBy": "Aktualisiert von",
"CreatedAt": "Erstellt am",
"UpdatedAt": "Aktualisiert am",
"Column width": "Spaltenbreite",
"Sortable": "Sortierbar",
"Enable link": "Link aktivieren",
"This is likely a NocoBase internals bug. Please open an issue at <1>here</1>": "Dies ist wahrscheinlich ein interner Fehler von NocoBase. Bitte öffnen Sie ein Problem <1>hier</1>",
"Render Failed": "Rendering fehlgeschlagen",
"App error": "App-Fehler",
"Feedback": "Feedback",
"Try again": "Erneut versuchen",
"Download logs": "Protokolle herunterladen",
"Data template": "Datenvorlage",
"Duplicate": "Duplizieren",
"Duplicating": "Dupliziere",
"Duplicate mode": "Duplikationsmodus",
"Quick duplicate": "Schnelles Duplizieren",
"Duplicate and continue": "Duplizieren und fortfahren",
"Please configure the duplicate fields": "Bitte konfigurieren Sie die Duplikatfelder",
"Add": "Hinzufügen",
"Add new mode": "Neuer Hinzufügungsmodus",
"Quick add": "Schnell hinzufügen",
"Modal add": "Modal hinzufügen",
"Save mode": "Speichermodus",
"First or create": "Zuerst oder erstellen",
"Update or create": "Aktualisieren oder erstellen",
"Find by the following fields": "Nach den folgenden Feldern suchen",
"Create": "Erstellen",
"Current form": "Aktuelles Formular",
"Current object": "Aktuelles Objekt",
"Linkage with form fields": "Verknüpfung mit Formularfeldern",
"Allow add new, update and delete actions": "Hinzufügen, Aktualisieren und Löschen erlauben",
"Date display format": "Datumsanzeigeformat",
"Assign data scope for the template": "Datenbereich für die Vorlage zuweisen",
"Table selected records": "Ausgewählte Tabellendatensätze",
"Tag": "Tag",
"Tag color field": "Tag-Farbfeld",
"Sync successfully": "Synchronisierung erfolgreich",
"Sync from form fields": "Von Formularfeldern synchronisieren",
"Select all": "Alle auswählen",
"Restart": "Neustart",
"Restart application": "Anwendung neu starten",
"Cascade Select": "Kaskadierte Auswahl",
"Execute": "Ausführen",
"Please use a valid SELECT or WITH AS statement": "Bitte verwenden Sie eine gültige SELECT- oder WITH AS-Anweisung",
"Please confirm the SQL statement first": "Bitte bestätigen Sie zuerst die SQL-Anweisung",
"Automatically drop objects that depend on the collection (such as views), and in turn all objects that depend on those objects": "Automatisches Löschen von Objekten, die von der Sammlung abhängen (wie Ansichten), und wiederum aller Objekte, die von diesen Objekten abhängen",
"Sign in with another account": "Mit einem anderen Konto anmelden",
"Return to the main application": "Zurück zur Hauptanwendung",
"Permission deined": "Berechtigung verweigert",
"loading": "Lädt",
"name is required": "Name ist erforderlich",
"data source": "Datenquelle",
"Data source": "Datenquelle",
"DataSource": "Datenquelle",
"The {{type}} \"{{name}}\" may have been deleted. Please remove this {{blockType}}.": "Der {{type}} \"{{name}}\" wurde möglicherweise gelöscht. Bitte entfernen Sie diesen {{blockType}}.",
"Preset fields": "Voreingestellte Felder",
"Home page": "Startseite",
"Handbook": "Handbuch",
"License": "Lizenz",
"Generic properties": "Allgemeine Eigenschaften",
"Specific properties": "Spezifische Eigenschaften",
"Used for drag and drop sorting scenarios, supporting grouping sorting": "Wird für Drag & Drop-Sortierungsszenarien verwendet und unterstützt Gruppensortierung",
"Grouped sorting": "Gruppierte Sortierung",
"When a field is selected for grouping, it will be grouped first before sorting.": "Wenn ein Feld für die Gruppierung ausgewählt wird, wird es zuerst gruppiert, bevor es sortiert wird.",
"Departments": "Abteilungen",
"Main department": "Hauptabteilung",
"Department name": "Abteilungsname",
"Superior department": "Übergeordnete Abteilung",
"Owners": "Eigentümer",
"Plugin settings": "Plugin-Einstellungen",
"Menu": "Menü",
"Drag and drop sorting field": "Feld für Drag & Drop-Sortierung",
"This variable has been deprecated and can be replaced with \"Current form\"": "Diese Variable ist veraltet und kann durch \"Aktuelles Formular\" ersetzt werden",
"The value of this variable is derived from the query string of the page URL. This variable can only be used normally when the page has a query string.": "Der Wert dieser Variable wird aus der Abfragezeichenfolge der Seiten-URL abgeleitet. Diese Variable kann nur normal verwendet werden, wenn die Seite eine Abfragezeichenfolge hat.",
"URL search params": "URL-Suchparameter",
"Expand All": "Alle erweitern",
"Search": "Suchen",
"Clear default value": "Standardwert löschen",
"Open in new window": "In neuem Fenster öffnen",
"Sorry, the page you visited does not exist.": "Entschuldigung, die von Ihnen besuchte Seite existiert nicht.",
"is none of": "ist keines von",
"is any of": "ist eines von",
"Plugin dependency version mismatch": "Versionsinkompatibilität der Plugin-Abhängigkeit",
"The current dependency version of the plugin does not match the version of the application and may not work properly. Are you sure you want to continue enabling the plugin?": "Die aktuelle Abhängigkeitsversion des Plugins stimmt nicht mit der Version der Anwendung überein und funktioniert möglicherweise nicht ordnungsgemäß. Sind Sie sicher, dass Sie das Plugin weiterhin aktivieren möchten?",
"Allow multiple selection": "Mehrfachauswahl erlauben",
"Parent object": "Übergeordnetes Objekt",
"Skip getting the total number of table records during paging to speed up loading. It is recommended to enable this option for data tables with a large amount of data": "Überspringt das Abrufen der Gesamtanzahl der Tabellendatensätze während der Paginierung, um das Laden zu beschleunigen. Es wird empfohlen, diese Option für Datentabellen mit einer großen Datenmenge zu aktivieren",
"Enable secondary confirmation": "Sekundäre Bestätigung aktivieren",
"Notification": "Benachrichtigung",
"Ellipsis overflow content": "Auslassungszeichen für Überlaufinhalt",
"Hide column": "Spalte ausblenden",
"In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.": "Im Konfigurationsmodus wird die gesamte Spalte transparent. Im Nicht-Konfigurationsmodus wird die gesamte Spalte ausgeblendet. Auch wenn die gesamte Spalte ausgeblendet ist, werden ihre konfigurierten Standardwerte und andere Einstellungen weiterhin wirksam.",
"Unauthenticated. Please sign in to continue.": "Nicht authentifiziert. Bitte melden Sie sich an, um fortzufahren.",
"User not found. Please sign in again to continue.": "Benutzer nicht gefunden. Bitte melden Sie sich erneut an, um fortzufahren.",
"Your session has expired. Please sign in again.": "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",
"User password changed, please signin again.": "Benutzerpasswort geändert, bitte melden Sie sich erneut an.",
"Desktop routes": "Desktop-Routen",
"Route permissions": "Routenberechtigungen",
"New routes are allowed to be accessed by default": "Neue Routen dürfen standardmäßig zugegriffen werden",
"Route name": "Routenname",
"Mobile routes": "Mobile Routen",
"Show in menu": "Im Menü anzeigen",
"Hide in menu": "Im Menü ausblenden",
"Path": "Pfad",
"Type": "Typ",
"Access": "Zugriff",
"Routes": "Routen",
"Add child route": "Unterroute hinzufügen",
"Delete routes": "Routen löschen",
"Delete route": "Route löschen",
"Are you sure you want to hide these routes in menu?": "Sind Sie sicher, dass Sie diese Routen im Menü ausblenden möchten?",
"Are you sure you want to show these routes in menu?": "Sind Sie sicher, dass Sie diese Routen im Menü anzeigen möchten?",
"Are you sure you want to hide this menu?": "Sind Sie sicher, dass Sie dieses Menü ausblenden möchten?",
"After hiding, this menu will no longer appear in the menu bar. To show it again, you need to go to the route management page to configure it.": "Nach dem Ausblenden wird dieses Menü nicht mehr in der Menüleiste angezeigt. Um es wieder anzuzeigen, müssen Sie zur Routenverwaltungsseite gehen, um es zu konfigurieren.",
"If selected, the page will display Tab pages.": "Wenn ausgewählt, zeigt die Seite Tab-Seiten an.",
"If selected, the route will be displayed in the menu.": "Wenn ausgewählt, wird die Route im Menü angezeigt.",
"Are you sure you want to hide this tab?": "Sind Sie sicher, dass Sie diesen Tab ausblenden möchten?",
"After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Nach dem Ausblenden wird dieser Tab nicht mehr in der Tableiste angezeigt. Um ihn wieder anzuzeigen, müssen Sie zur Routenverwaltungsseite gehen, um ihn einzustellen."
}

View File

@ -127,7 +127,7 @@
"Tablet device": "Tablet", "Tablet device": "Tablet",
"Desktop device": "Desktop", "Desktop device": "Desktop",
"Large screen device": "Schermo di grandi dimensioni", "Large screen device": "Schermo di grandi dimensioni",
"Collapse": "Collassa", "Collapse": "Comprimi",
"Select data source": "Seleziona origine dati", "Select data source": "Seleziona origine dati",
"Calendar": "Calendario", "Calendar": "Calendario",
"Delete events": "Elimina eventi", "Delete events": "Elimina eventi",
@ -171,10 +171,10 @@
"Add new": "Aggiungi nuovo", "Add new": "Aggiungi nuovo",
"Add record": "Aggiungi record", "Add record": "Aggiungi record",
"Add child": "Aggiungi figlio", "Add child": "Aggiungi figlio",
"Collapse all": "Collassare tutto", "Collapse all": "Comprimi tutto",
"Expand all": "Espandere tutto", "Expand all": "Espandi tutto",
"Expand/Collapse": "Espandere/Collassare", "Expand/Collapse": "Espandi/Comprimi",
"Default collapse": "Collassa di default", "Default collapse": "Comprimi di default",
"Tree table": "Tabella ad albero", "Tree table": "Tabella ad albero",
"Custom field display name": "Nome visualizzato campo personalizzato ", "Custom field display name": "Nome visualizzato campo personalizzato ",
"Display fields": "Visualizza campi", "Display fields": "Visualizza campi",
@ -344,7 +344,7 @@
"Edit chart": "Modifica grafico", "Edit chart": "Modifica grafico",
"Add text": "Aggiungi testo", "Add text": "Aggiungi testo",
"Filterable fields": "Campi filtrabili", "Filterable fields": "Campi filtrabili",
"Edit button": "Pulsante Modifica", "Edit button": "Modifica pulsante",
"Hide": "Nascondi", "Hide": "Nascondi",
"Enable actions": "Abilita operazioni", "Enable actions": "Abilita operazioni",
"Import": "Importa", "Import": "Importa",
@ -552,7 +552,7 @@
"Fields values": "Valori campi", "Fields values": "Valori campi",
"The field has been deleted": "Il campo è stato eliminato", "The field has been deleted": "Il campo è stato eliminato",
"When submitting the following fields, the saved values are": "Quando si inviano i seguenti campi, i valori salvati sono", "When submitting the following fields, the saved values are": "Quando si inviano i seguenti campi, i valori salvati sono",
"After successful submission": "Dopo una invio riuscito", "After successful submission": "Dopo un invio riuscito",
"Then": "Poi", "Then": "Poi",
"Stay on current page": "Resta sulla pagina corrente", "Stay on current page": "Resta sulla pagina corrente",
"Redirect to": "Reindirizza a", "Redirect to": "Reindirizza a",
@ -658,9 +658,9 @@
"After clicking the custom button, the following field values will be assigned according to the following form.": "Dopo aver fatto clic sul pulsante personalizza, i seguenti valori verranno assegnati in base al seguente modulo.", "After clicking the custom button, the following field values will be assigned according to the following form.": "Dopo aver fatto clic sul pulsante personalizza, i seguenti valori verranno assegnati in base al seguente modulo.",
"After clicking the custom button, the following fields of the current record will be saved according to the following form.": "Dopo aver fatto clic sul pulsante personalizza, i seguenti campi del record corrente verranno salvati in base al seguente modulo.", "After clicking the custom button, the following fields of the current record will be saved according to the following form.": "Dopo aver fatto clic sul pulsante personalizza, i seguenti campi del record corrente verranno salvati in base al seguente modulo.",
"Button background color": "Colore sfondo del pulsante", "Button background color": "Colore sfondo del pulsante",
"Highlight": "Evidenzia", "Highlight": "Evidenziato",
"Danger red": "Pericolo rosso", "Danger red": "Rosso pericolo",
"Custom request": "Personalizza richiesta", "Custom request": "Richiesta personalizzata",
"Request settings": "Impostazioni richiesta", "Request settings": "Impostazioni richiesta",
"Request URL": "URL richiesta", "Request URL": "URL richiesta",
"Request method": "Metodo richiesta", "Request method": "Metodo richiesta",
@ -753,7 +753,7 @@
"Update all data?": "Aggiornare tutti i dati?", "Update all data?": "Aggiornare tutti i dati?",
"Remains the same": "Rimane lo stesso", "Remains the same": "Rimane lo stesso",
"Changed to": "Cambiato in", "Changed to": "Cambiato in",
"Clear": "Pulisci", "Clear": "Cancella",
"Add attach": "Aggiungi allegato", "Add attach": "Aggiungi allegato",
"Please select the records to be updated": "Si prega di selezionare i record da aggiornare", "Please select the records to be updated": "Si prega di selezionare i record da aggiornare",
"Selector": "Selettore", "Selector": "Selettore",
@ -841,7 +841,7 @@
"This variable has been deprecated and can be replaced with \"Current form\"": "Questa variabile è stata deprecata e può essere sostituita con \"Current form\"", "This variable has been deprecated and can be replaced with \"Current form\"": "Questa variabile è stata deprecata e può essere sostituita con \"Current form\"",
"The value of this variable is derived from the query string of the page URL. This variable can only be used normally when the page has a query string.": "Il valore di questa variabile deriva dalla stringa di ricerca nell'URL della pagina. Questa variabile può essere utilizzata normalmente solo quando la pagina ha una stringa di ricerca.", "The value of this variable is derived from the query string of the page URL. This variable can only be used normally when the page has a query string.": "Il valore di questa variabile deriva dalla stringa di ricerca nell'URL della pagina. Questa variabile può essere utilizzata normalmente solo quando la pagina ha una stringa di ricerca.",
"URL search params": "Parametri di ricerca URL", "URL search params": "Parametri di ricerca URL",
"Expand All": "Espandere tutto", "Expand All": "Espandi tutto",
"Search": "Ricerca", "Search": "Ricerca",
"Clear default value": "Cancella il valore predefinito", "Clear default value": "Cancella il valore predefinito",
"Open in new window": "Apri in una nuova finestra", "Open in new window": "Apri in una nuova finestra",

View File

@ -1082,6 +1082,7 @@
"If selected, the route will be displayed in the menu.": "如果选中,该路由将显示在菜单中。", "If selected, the route will be displayed in the menu.": "如果选中,该路由将显示在菜单中。",
"Are you sure you want to hide this tab?": "你确定要隐藏该标签页吗?", "Are you sure you want to hide this tab?": "你确定要隐藏该标签页吗?",
"After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "隐藏后,该标签将不再显示在标签栏中。要想再次显示它,你需要到路由管理页面进行设置。", "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "隐藏后,该标签将不再显示在标签栏中。要想再次显示它,你需要到路由管理页面进行设置。",
"Date scope":"日期范围",
"Deprecated": "已弃用", "Deprecated": "已弃用",
"The following old template features have been deprecated and will be removed in next version.": "以下旧的模板功能已弃用,将在下个版本移除。", "The following old template features have been deprecated and will be removed in next version.": "以下旧的模板功能已弃用,将在下个版本移除。",
"Full permissions": "全部权限" "Full permissions": "全部权限"

View File

@ -173,6 +173,7 @@ const layoutContentClass = css`
const className1 = css` const className1 = css`
width: 168px; width: 168px;
height: var(--nb-header-height);
margin-right: 4px; margin-right: 4px;
display: inline-flex; display: inline-flex;
flex-shrink: 0; flex-shrink: 0;

View File

@ -189,6 +189,7 @@ export const SubTable: any = observer(
onChange: (page, pageSize) => { onChange: (page, pageSize) => {
setCurrentPage(page); setCurrentPage(page);
setPageSize(pageSize); setPageSize(pageSize);
field.componentProps.pageSize = pageSize;
field.onInput(field.value); field.onInput(field.value);
}, },
showSizeChanger: true, showSizeChanger: true,

View File

@ -199,11 +199,29 @@ export interface URLReadPrettyProps {
} }
const ellipsisStyle = { textOverflow: 'ellipsis', overflow: 'hidden', whiteSpace: 'nowrap', display: 'block' }; const ellipsisStyle = { textOverflow: 'ellipsis', overflow: 'hidden', whiteSpace: 'nowrap', display: 'block' };
function encodeFileURL(url: string): string {
if (!url) {
return url;
}
const parts = url.split('/');
const filename = parts.pop();
parts.push(encodeURIComponent(filename));
const encodedURL = parts.join('/');
return encodedURL;
}
ReadPretty.URL = (props: URLReadPrettyProps) => { ReadPretty.URL = (props: URLReadPrettyProps) => {
// eslint-disable-next-line react-hooks/rules-of-hooks // eslint-disable-next-line react-hooks/rules-of-hooks
const prefixCls = usePrefixCls('description-url', props); const prefixCls = usePrefixCls('description-url', props);
const content = props.value && ( const content = props.value && (
<a style={props.ellipsis ? ellipsisStyle : undefined} target="_blank" rel="noopener noreferrer" href={props.value}> <a
style={props.ellipsis ? ellipsisStyle : undefined}
target="_blank"
rel="noopener noreferrer"
href={encodeFileURL(props.value)}
>
{props.value} {props.value}
</a> </a>
); );

View File

@ -32,6 +32,7 @@ import {
toValueItem as toValueItemDefault, toValueItem as toValueItemDefault,
useBeforeUpload, useBeforeUpload,
useUploadProps, useUploadProps,
encodeFileURL,
} from './shared'; } from './shared';
import { useStyles } from './style'; import { useStyles } from './style';
import type { ComposedUpload, DraggerProps, DraggerV2Props, UploadProps } from './type'; import type { ComposedUpload, DraggerProps, DraggerV2Props, UploadProps } from './type';
@ -89,26 +90,27 @@ attachmentFileTypes.add({
}, },
}); });
const iframePreviewSupportedTypes = ['application/pdf', 'audio/*', 'image/*', 'video/*']; const iframePreviewSupportedTypes = ['application/pdf', 'audio/*', 'image/*', 'video/*', 'text/*'];
function IframePreviewer({ index, list, onSwitchIndex }) { function IframePreviewer({ index, list, onSwitchIndex }) {
const { t } = useTranslation(); const { t } = useTranslation();
const file = list[index]; const file = list[index];
const url = encodeFileURL(file.url);
const onOpen = useCallback( const onOpen = useCallback(
(e) => { (e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
window.open(file.url); window.open(url);
}, },
[file], [url],
); );
const onDownload = useCallback( const onDownload = useCallback(
(e) => { (e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
saveAs(file.url, `${file.title}${file.extname}`); saveAs(url, `${file.title}${file.extname}`);
}, },
[file], [file.extname, file.title, url],
); );
const onClose = useCallback(() => { const onClose = useCallback(() => {
onSwitchIndex(null); onSwitchIndex(null);
@ -148,7 +150,7 @@ function IframePreviewer({ index, list, onSwitchIndex }) {
> >
{iframePreviewSupportedTypes.some((type) => matchMimetype(file, type)) ? ( {iframePreviewSupportedTypes.some((type) => matchMimetype(file, type)) ? (
<iframe <iframe
src={file.url} src={url}
style={{ style={{
width: '100%', width: '100%',
maxHeight: '90vh', maxHeight: '90vh',
@ -390,7 +392,7 @@ export function Uploader({ rules, ...props }: UploadProps) {
} else { } else {
field.setFeedback({}); field.setFeedback({});
} }
}, [field, pendingList]); }, [field, pendingList, t]);
const onUploadChange = useCallback( const onUploadChange = useCallback(
(info) => { (info) => {

View File

@ -267,3 +267,15 @@ export function useBeforeUpload(rules) {
[rules], [rules],
); );
} }
export function encodeFileURL(url: string): string {
if (!url) {
return url;
}
const parts = url.split('/');
const filename = parts.pop();
parts.push(encodeURIComponent(filename));
const encodedURL = parts.join('/');
return encodedURL;
}

View File

@ -0,0 +1,131 @@
/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import React, { useCallback } from 'react';
import { useFieldSchema } from '@formily/react';
import { SchemaComponent } from '../../schema-component';
import { useCollectionManager_deprecated, VariableInput, useFormBlockContext, useRecord } from '../../';
export const DateScopeComponent = (props) => {
const fieldSchema = useFieldSchema();
const { getCollectionJoinField } = useCollectionManager_deprecated();
const collectionField = getCollectionJoinField(fieldSchema?.['x-collection-field']) || {};
const gmt = collectionField?.uiSchema?.['x-component-props'].gmt || false;
const utc = collectionField?.uiSchema?.['x-component-props'].utc || false;
const { form } = useFormBlockContext();
const record = useRecord();
const showTime =
fieldSchema?.['x-component-props']?.showTime || collectionField?.uiSchema?.['x-component-props']?.showTime || false;
const dateFormat =
fieldSchema?.['x-component-props']?.dateFormat ||
collectionField?.uiSchema?.['x-component-props']?.dateFormat ||
'YYYY-MM-DD';
const timeFormat =
fieldSchema?.['x-component-props']?.timeFormat ||
collectionField?.uiSchema?.['x-component-props']?.timeFormat ||
'HH:mm:ss';
const picker =
fieldSchema?.['x-component-props']?.picker || collectionField?.uiSchema?.['x-component-props']?.picker || 'date';
const renderSchemaComponent = useCallback(
(props) => {
return (
<SchemaComponent
schema={{
'x-component': 'DatePicker',
'x-component-props': {
dateFormat,
timeFormat,
gmt,
utc,
picker,
showTime,
placeholder: '{{t("Please select time or variable")}}',
style: {
minWidth: 250,
},
},
name: 'value',
'x-read-pretty': false,
'x-validator': undefined,
'x-decorator': undefined,
}}
/>
);
},
[dateFormat, gmt, picker, showTime, timeFormat, utc],
);
const Component = useCallback(
(props) => {
return (
<VariableInput
{...props}
form={form}
record={record}
noDisabled={true}
style={{ minWidth: '250px' }}
renderSchemaComponent={renderSchemaComponent}
/>
);
},
[fieldSchema, form, record, renderSchemaComponent],
);
return (
<div>
<SchemaComponent
schema={{
type: 'object',
'x-component': 'FormLayout',
'x-component-props': {
layout: 'horizontal',
labelStyle: {
marginTop: '6px',
},
labelCol: 2,
wrapperCol: 24,
},
properties: {
_minDate: {
type: 'string',
title: '{{t("Min")}}',
'x-decorator': 'FormItem',
'x-decorator-props': {
labelCol: 4,
wrapperCol: 20,
labelAlign: 'left',
},
'x-component': Component,
'x-component-props': {
name: '_minDate',
},
//日期和使用变量设置的默认值不同
// default: isVariable(minDateDefaultValue) ? minDateDefaultValue : { value: minDateDefaultValue },
},
_maxDate: {
type: 'string',
title: '{{t("Max")}}',
'x-decorator': 'FormItem',
'x-decorator-props': {
labelCol: 4,
wrapperCol: 20,
labelAlign: 'left',
},
'x-component': Component,
'x-component-props': {
name: '_maxDate',
},
// default: isVariable(maxDateDefaultValue) ? maxDateDefaultValue : { value: maxDateDefaultValue },
},
},
}}
/>
</div>
);
};

View File

@ -22,6 +22,7 @@ import { OptionsComponent } from './OptionsComponent';
import { LinkageLogicContext, RemoveActionContext } from './context'; import { LinkageLogicContext, RemoveActionContext } from './context';
import { ActionType } from './type'; import { ActionType } from './type';
import { useValues } from './useValues'; import { useValues } from './useValues';
import { DateScopeComponent } from './DateScopeComponent';
export const FormFieldLinkageRuleAction = observer( export const FormFieldLinkageRuleAction = observer(
(props: any) => { (props: any) => {
@ -57,7 +58,7 @@ export const FormFieldLinkageRuleAction = observer(
.ant-space-item { .ant-space-item {
max-width: 95%; max-width: 95%;
display: inline-block; display: inline-block;
margin: 2px; margin: 2px 6px;
vertical-align: top; vertical-align: top;
} }
`} `}
@ -116,6 +117,14 @@ export const FormFieldLinkageRuleAction = observer(
collectionName={collectionName} collectionName={collectionName}
/> />
)} )}
{[ActionType.DateScope].includes(operator) && (
<DateScopeComponent
fieldValue={fieldValue}
schema={schema}
setValue={setValue}
collectionName={collectionName}
/>
)}
{!props.disabled && ( {!props.disabled && (
<a role="button" aria-label="icon-close"> <a role="button" aria-label="icon-close">
<CloseCircleOutlined onClick={() => remove()} style={{ color: '#bfbfbf' }} /> <CloseCircleOutlined onClick={() => remove()} style={{ color: '#bfbfbf' }} />

View File

@ -33,6 +33,7 @@ export const useLinkageCollectionFieldOptions = (collectionName: string, readPre
selected: false, selected: false,
schema: {}, schema: {},
}, },
{ label: t('Date scope'), value: ActionType.DateScope, selected: false, schema: {} },
].filter((v) => { ].filter((v) => {
if (readPretty) { if (readPretty) {
return [ActionType.Visible, ActionType.None, ActionType.Hidden].includes(v.value); return [ActionType.Visible, ActionType.None, ActionType.Hidden].includes(v.value);
@ -59,6 +60,13 @@ export const useLinkageCollectionFieldOptions = (collectionName: string, readPre
if (!['select', 'radioGroup', 'multipleSelect', 'checkboxGroup'].includes(fieldInterface.name)) { if (!['select', 'radioGroup', 'multipleSelect', 'checkboxGroup'].includes(fieldInterface.name)) {
return operator?.value !== ActionType.Options; return operator?.value !== ActionType.Options;
} }
if (
!['date', 'datetime', 'dateOnly', 'datetimeNoTz', 'unixTimestamp', 'createdAt', 'updatedAt'].includes(
fieldInterface.name,
)
) {
return operator?.value !== ActionType.DateScope;
}
return true; return true;
}) || [], }) || [],
}; };

View File

@ -37,6 +37,7 @@ interface Props {
* @default '$nForm' * @default '$nForm'
*/ */
variableNameOfLeftCondition?: string; variableNameOfLeftCondition?: string;
action?: any;
} }
export function bindLinkageRulesToFiled( export function bindLinkageRulesToFiled(
@ -71,6 +72,7 @@ export function bindLinkageRulesToFiled(
pattern: field.initStateOfLinkageRules?.pattern || getTempFieldState(true, field.pattern), pattern: field.initStateOfLinkageRules?.pattern || getTempFieldState(true, field.pattern),
value: field.initStateOfLinkageRules?.value || getTempFieldState(true, field.value || field.initialValue), value: field.initStateOfLinkageRules?.value || getTempFieldState(true, field.value || field.initialValue),
dataSource: field.initStateOfLinkageRules?.dataSource || getTempFieldState(true, field.dataSource || field.options), dataSource: field.initStateOfLinkageRules?.dataSource || getTempFieldState(true, field.dataSource || field.options),
dateScope: field.initStateOfLinkageRules?.dateScope || getTempFieldState(true, null),
}; };
return reaction( return reaction(
@ -213,6 +215,7 @@ function getSubscriber(
variables, variables,
localVariables, localVariables,
variableNameOfLeftCondition, variableNameOfLeftCondition,
action,
}, },
jsonLogic, jsonLogic,
); );
@ -240,6 +243,12 @@ function getSubscriber(
if (stateList.length > 1) { if (stateList.length > 1) {
field.value = lastState.value; field.value = lastState.value;
} }
} else if (fieldName === 'dateScope') {
console.log(lastState.value);
field.setComponentProps({
_maxDate: lastState.value?._maxDate?.value || lastState.value?._maxDate,
_minDate: lastState.value?._minDate?.value || lastState.value?._minDate,
});
} else { } else {
// 为了让字段的默认值中的变量能正常工作,需要保证字段被隐藏时,字段组件依然会被渲染 // 为了让字段的默认值中的变量能正常工作,需要保证字段被隐藏时,字段组件依然会被渲染
if (fieldName === 'display' && lastState?.value === 'hidden') { if (fieldName === 'display' && lastState?.value === 'hidden') {
@ -304,13 +313,15 @@ function getFieldNameByOperator(operator: ActionType) {
return 'value'; return 'value';
case ActionType.Options: case ActionType.Options:
return 'dataSource'; return 'dataSource';
case ActionType.DateScope:
return 'dateScope';
default: default:
return null; return null;
} }
} }
export const collectFieldStateOfLinkageRules = ( export const collectFieldStateOfLinkageRules = (
{ operator, value, field, condition, variables, localVariables, variableNameOfLeftCondition }: Props, { operator, value, field, condition, variables, localVariables, variableNameOfLeftCondition, action }: Props,
jsonLogic: any, jsonLogic: any,
) => { ) => {
const requiredResult = field?.stateOfLinkageRules?.required || [field?.initStateOfLinkageRules?.required]; const requiredResult = field?.stateOfLinkageRules?.required || [field?.initStateOfLinkageRules?.required];
@ -320,6 +331,7 @@ export const collectFieldStateOfLinkageRules = (
const optionsResult = field?.stateOfLinkageRules?.dataSource || [field?.initStateOfLinkageRules?.dataSource]; const optionsResult = field?.stateOfLinkageRules?.dataSource || [field?.initStateOfLinkageRules?.dataSource];
const { evaluate } = evaluators.get('formula.js'); const { evaluate } = evaluators.get('formula.js');
const paramsToGetConditionResult = { ruleGroup: condition, variables, localVariables, variableNameOfLeftCondition }; const paramsToGetConditionResult = { ruleGroup: condition, variables, localVariables, variableNameOfLeftCondition };
const dateScopeResult = field?.stateOfLinkageRules?.dateScope || [field?.initStateOfLinkageRules?.dateScope];
switch (operator) { switch (operator) {
case ActionType.Required: case ActionType.Required:
@ -401,6 +413,19 @@ export const collectFieldStateOfLinkageRules = (
}; };
} }
break; break;
case ActionType.DateScope: {
dateScopeResult.push(
getTempFieldState(conditionAnalyses(paramsToGetConditionResult, jsonLogic), {
_maxDate: action._maxDate,
_minDate: action._minDate,
}),
);
field.stateOfLinkageRules = {
...field.stateOfLinkageRules,
dateScope: dateScopeResult,
};
break;
}
default: default:
return null; return null;
} }

View File

@ -23,6 +23,7 @@ export enum ActionType {
BackgroundColor = 'backgroundColor', BackgroundColor = 'backgroundColor',
TextAlign = 'textAlign', TextAlign = 'textAlign',
Options = 'options', Options = 'options',
DateScope = 'dateScope',
} }
export enum LinkageRuleCategory { export enum LinkageRuleCategory {

View File

@ -46,7 +46,7 @@ export const useValues = (options) => {
const operators = option?.operators; const operators = option?.operators;
field.data.operators = operators?.filter((v) => { field.data.operators = operators?.filter((v) => {
if (dataIndex.length > 1) { if (dataIndex.length > 1) {
return v.value !== 'value' && v.value !== 'options'; return !['value', 'dateScope', 'options'].includes(v.value);
} }
return true; return true;
}); });

View File

@ -96,6 +96,6 @@ export class ACLSettingsUI {
} }
return tab; return tab;
}) })
.sort((a, b) => (a.sort ?? 100) - (b.sort ?? 100)); .sort((a, b) => (a?.sort ?? 100) - (b?.sort ?? 100));
} }
} }

View File

@ -0,0 +1,11 @@
{
"The current user has no roles. Please try another account.": "Der aktuelle Benutzer hat keine Rollen. Bitte versuchen Sie es mit einem anderen Konto.",
"The user role does not exist. Please try signing in again": "Die Benutzerrolle existiert nicht. Bitte versuchen Sie, sich erneut anzumelden",
"New role": "Neue Rolle",
"Permissions": "Berechtigungen",
"Roles & Permissions": "Rollen und Berechtigungen",
"General": "Allgemein",
"Desktop menu": "Desktop-Menü",
"Plugin settings": "Plugin-Einstellungen",
"Data sources": "Datenquellen"
}

View File

@ -4,4 +4,8 @@
"New role": "Nuovo ruolo", "New role": "Nuovo ruolo",
"Permissions": "Permessi", "Permissions": "Permessi",
"Desktop menu": "Menu desktop" "Desktop menu": "Menu desktop"
"Roles & Permissions": "Ruoli e permessi",
"General": "Generale",
"Plugin settings": "Impostazioni plugin",
"Data sources": "Origini dati"
} }

View File

@ -108,10 +108,13 @@ export const useCustomizeBulkEditActionProps = () => {
actionField.data = field.data || {}; actionField.data = field.data || {};
actionField.data.loading = true; actionField.data.loading = true;
try { try {
const updateData: { filter?: any; values: any; forceUpdate: boolean } = { const updateData: { filter?: any; values: any; forceUpdate: boolean; triggerWorkflows?: string } = {
values: form.values, values: form.values,
filter, filter,
forceUpdate: false, forceUpdate: false,
triggerWorkflows: triggerWorkflows?.length
? triggerWorkflows.map((row) => [row.workflowKey, row.context].filter(Boolean).join('!')).join(',')
: undefined,
}; };
if (updateMode === 'selected') { if (updateMode === 'selected') {
if (!selectedRecordKeys?.length) { if (!selectedRecordKeys?.length) {

View File

@ -0,0 +1,5 @@
{
"Bulk edit": "Massenbearbeitung",
"Data will be updated": "Daten werden aktualisiert",
"Entire collection": "Gesamte Sammlung"
}

View File

@ -1,4 +1,5 @@
{ {
"Bulk edit": "Modifica di massa", "Bulk edit": "Modifica di massa",
"Data will be updated": "I dati saranno aggiornati" "Data will be updated": "I dati saranno aggiornati"
"Entire collection":"Raccolta intera"
} }

View File

@ -0,0 +1,6 @@
{
"Bulk update": "Massenaktualisierung",
"After successful bulk update": "Nach erfolgreicher Massenaktualisierung",
"Please select the records to be updated": "Bitte wählen Sie die zu aktualisierenden Datensätze aus",
"Entire collection": "Gesamte Sammlung"
}

View File

@ -2,4 +2,5 @@
"Bulk update": "Aggiornamento di massa", "Bulk update": "Aggiornamento di massa",
"After successful bulk update": "Dopo un aggiornamento di massa riuscito", "After successful bulk update": "Dopo un aggiornamento di massa riuscito",
"Please select the records to be updated": "Per favore seleziona i record da aggiornare" "Please select the records to be updated": "Per favore seleziona i record da aggiornare"
"Entire collection": "Raccolta intera"
} }

View File

@ -20,7 +20,7 @@
"ms": "ms", "ms": "ms",
"Input request data": "Inserisci dati richiesta", "Input request data": "Inserisci dati richiesta",
"Only support standard JSON data": "Supporta solo dati JSON standard", "Only support standard JSON data": "Supporta solo dati JSON standard",
"Content-Type only support \"application/json\", and no need to specify": "Content-Type supporta solo \"application/json\", e non è necessario specificarlo", "\"Content-Type\" only support \"application/json\", and no need to specify": "Content-Type supporta solo \"application/json\", e non è necessario specificarlo",
"When the HTTP method is Post, Put or Patch, and this custom request inside the form, the request body will be automatically filled in with the form data": "Quando il metodo HTTP è Post, Put o Patch, e questa richiesta personalizzata è all'interno del modulo, il corpo della richiesta verrà automaticamente riempito con i dati del modulo", "When the HTTP method is Post, Put or Patch, and this custom request inside the form, the request body will be automatically filled in with the form data": "Quando il metodo HTTP è Post, Put o Patch, e questa richiesta personalizzata è all'interno del modulo, il corpo della richiesta verrà automaticamente riempito con i dati del modulo",
"Please configure the request settings first": "Per favore configura prima le impostazioni della richiesta" "Please configure the request settings first": "Per favore configura prima le impostazioni della richiesta"
} }

View File

@ -29,6 +29,7 @@ describe('actions', () => {
'acl', 'acl',
'action-custom-request', 'action-custom-request',
'data-source-manager', 'data-source-manager',
'ui-schema-storage',
'system-settings', 'system-settings',
], ],
}); });

View File

@ -76,14 +76,13 @@ export async function send(this: CustomRequestPlugin, ctx: Context, next: Next)
} = values; } = values;
// root role has all permissions // root role has all permissions
if (!ctx.state.currentRoles.includes('root')) { if (ctx.state.currentRole !== 'root') {
const crRepo = ctx.db.getRepository('customRequestsRoles'); const crRepo = ctx.db.getRepository('uiButtonSchemasRoles');
const hasRoles = await crRepo.find({ const hasRoles = await crRepo.find({
filter: { filter: {
customRequestKey: filterByTk, uid: filterByTk,
}, },
}); });
if (hasRoles.length) { if (hasRoles.length) {
if (!hasRoles.some((item) => ctx.state.currentRoles.includes(item.roleName))) { if (!hasRoles.some((item) => ctx.state.currentRoles.includes(item.roleName))) {
return ctx.throw(403, 'custom request no permission'); return ctx.throw(403, 'custom request no permission');

View File

@ -0,0 +1,7 @@
{
"Export warning": "Sie können bis zu {{limit}} Datenzeilen auf einmal exportieren, alles darüber hinaus wird ignoriert.",
"Start export": "Export starten",
"another export action is running, please try again later.": "Ein anderer Exportvorgang läuft, bitte versuchen Sie es später erneut.",
"True": "Wahr",
"False": "Falsch"
}

View File

@ -1,6 +1,7 @@
{ {
"Export warning": "Puoi esportare fino a {{limit}} colonne di dati alla volta, qualsiasi eccedenza sarà ignorata.", "Export warning": "Puoi esportare fino a {{limit}} colonne di dati alla volta, qualsiasi eccedenza sarà ignorata.",
"Start export": "Avvia esportazione", "Start export": "Avvia esportazione",
"another export action is running, please try again later.": "È in esecuzione un'altra attività di esportazione. Riprova più tardi.",
"True": "Vero", "True": "Vero",
"False": "Falso" "False": "Falso"
} }

View File

@ -0,0 +1,51 @@
{
"Only one file is allowed to be uploaded": "Es darf nur eine Datei hochgeladen werden",
"File size cannot exceed 10M": "Die Dateigröße darf 10 MB nicht überschreiten",
"Please upload the file of Excel": "Bitte laden Sie die Excel-Datei hoch",
"Import Data": "Daten importieren",
"Import": "Importieren",
"Start import": "Import starten",
"Import explain": "Anleitung",
"Download template": "Vorlage herunterladen",
"Step 1: Download template": "Schritt 1: Vorlage herunterladen",
"Step 2: Upload Excel": "Schritt 2: Excel hochladen",
"Step 3: Import options": "Schritt 3: Importoptionen",
"Download tips": "- Laden Sie die Vorlage herunter und füllen Sie die Daten gemäß dem Format aus \r\n - Es wird nur das erste Arbeitsblatt importiert \r\n - Ändern Sie nicht die Kopfzeile der Vorlage, um einen Importfehler zu vermeiden",
"Import warnings": "Sie können bis zu {{limit}} Datenzeilen auf einmal importieren, alles darüber hinaus wird ignoriert.",
"Upload placeholder": "Ziehen Sie die Datei hierher oder klicken Sie zum Hochladen, die Dateigröße sollte 80 MB nicht überschreiten",
"Excel data importing": "Excel-Datenimport läuft, bitte schließen Sie das Fenster nicht",
"{{successCount}} records have been successfully imported": "{{successCount}} Datensätze wurden erfolgreich importiert",
"To download the failure data": "Um die fehlgeschlagenen Daten herunterzuladen",
"Add importable field": "Importierbares Feld hinzufügen",
"Done": "Fertig",
"Yes": "Ja",
"No": "Nein",
"Field {{fieldName}} does not exist": "Feld {{fieldName}} existiert nicht",
"can not find value": "Wert kann nicht gefunden werden",
"password is empty": "Passwort ist leer",
"Incorrect time format": "Falsches Zeitformat",
"Incorrect date format": "Falsches Datumsformat",
"Incorrect email format": "Falsches E-Mail-Format",
"Illegal percentage format": "Ungültiges Prozentformat",
"Imported template does not match, please download again.": "Importierte Vorlage stimmt nicht überein, bitte erneut herunterladen.",
"another import action is running, please try again later.": "Ein anderer Importvorgang läuft, bitte versuchen Sie es später erneut.",
"Please select": "Bitte auswählen",
"Custom column title": "Benutzerdefinierter Spaltentitel",
"Field description": "Feldbeschreibung",
"Field description placeholder": "Feldbeschreibung eingeben",
"Columns configuration is empty": "Spaltenkonfiguration ist leer",
"Field not found: {{field}}": "Feld nicht gefunden: {{field}}",
"Headers not found. Expected headers: {{headers}}": "Kopfzeilen nicht gefunden. Erwartete Kopfzeilen: {{headers}}",
"Header mismatch at column {{column}}: expected \"{{expected}}\", but got \"{{actual}}\"": "Kopfzeile stimmt nicht überein in Spalte {{column}}: erwartet \"{{expected}}\", aber erhalten \"{{actual}}\"",
"No data to import": "Keine Daten zum Importieren",
"Failed to import row {{row}}, {{message}}, row data: {{data}}": "Fehler beim Importieren von Zeile {{row}}, {{message}}, Zeilendaten: {{data}}",
"import-error": "Fehler beim Importieren von Zeile {{rowIndex}}, Zeilendaten: {{rowData}}, Ursache: {{causeMessage}}",
"Import completed": "Import abgeschlossen: {{success}} Datensätze importiert, {{updated}} Datensätze aktualisiert, {{skipped}} Datensätze übersprungen, insgesamt {{total}} Datensätze",
"Successfully imported": "Erfolgreich importiert",
"Updated records": "Aktualisierte Datensätze",
"Skipped records": "Übersprungene Datensätze",
"Total records": "Gesamtzahl der Datensätze",
"View result": "Ergebnis anzeigen",
"ImportResult": "{{success}} importiert, {{updated}} aktualisiert, {{skipped}} übersprungen, insgesamt {{total}}",
"Task result": "Aufgabenergebnis"
}

View File

@ -9,7 +9,7 @@
"Step 1: Download template": "Passo 1: Scarica modello", "Step 1: Download template": "Passo 1: Scarica modello",
"Step 2: Upload Excel": "Passo 2: Carica file Excel", "Step 2: Upload Excel": "Passo 2: Carica file Excel",
"Step 3: Import options": "Passo 3: Opzioni di importazione", "Step 3: Import options": "Passo 3: Opzioni di importazione",
"Download tips": "- Scarica il modello e compila i dati secondo il formato \\r\\n - Importa solo il primo foglio di lavoro \\r\\n - Non cambiare l'intestazione del modello per evitare errori di importazione", "Download tips": "- Scarica il modello e compila i dati secondo il formato \r\n - Importa solo il primo foglio di lavoro \r\n - Non cambiare l'intestazione del modello per evitare errori di importazione",
"Import warnings": "Puoi importare fino a {{limit}} righe di dati alla volta, qualsiasi eccedenza verrà ignorata.", "Import warnings": "Puoi importare fino a {{limit}} righe di dati alla volta, qualsiasi eccedenza verrà ignorata.",
"Upload placeholder": "Trascina qui il file o clicca per caricare, la dimensione del file non deve superare 80M", "Upload placeholder": "Trascina qui il file o clicca per caricare, la dimensione del file non deve superare 80M",
"Excel data importing": "Importazione dati Excel in corso", "Excel data importing": "Importazione dati Excel in corso",
@ -39,4 +39,13 @@
"No data to import": "Nessun dato da importare", "No data to import": "Nessun dato da importare",
"Failed to import row {{row}}, {{message}}, row data: {{data}}": "Errore nell'importazione della riga {{row}}, {{message}}, dati della riga: {{data}}", "Failed to import row {{row}}, {{message}}, row data: {{data}}": "Errore nell'importazione della riga {{row}}, {{message}}, dati della riga: {{data}}",
"import-error": "Errore nell'importazione della riga {{rowIndex}}, dati della riga: {{rowData}}, causa: {{causeMessage}}" "import-error": "Errore nell'importazione della riga {{rowIndex}}, dati della riga: {{rowData}}, causa: {{causeMessage}}"
"Import": "Importa",
"Import completed": "Importazione completata: {{success}} record importati con successo, {{updated}} record aggiornati, {{skipped}} record saltati, totale {{total}} record",
"Successfully imported": "Importazione riuscita",
"Updated records": "Record aggiornati",
"Skipped records": "Record saltati",
"Total records": "Record totali",
"View result": "Visualizza risultato",
"ImportResult": "Importati {{success}}, aggiornati {{updated}}, saltati {{skipped}}, totale {{total}}",
"Task result": "Risultato attività"
} }

View File

@ -0,0 +1,25 @@
{
"AI integration": "KI-Integration",
"LLM services": "LLM-Dienste",
"LLM service": "LLM-Dienst",
"Model": "Modell",
"Messages": "Nachrichten",
"Structured output": "Strukturierte Ausgabe",
"Message": "Nachricht",
"Role": "Rolle",
"UID": "UID",
"Add content": "Inhalt hinzufügen",
"Add prompt": "Prompt hinzufügen",
"Provider": "Anbieter",
"Text": "Text",
"Image": "Bild",
"Timout (ms)": "Zeitüberschreitung (ms)",
"Max retries": "Maximale Wiederholungen",
"Frequency penalty description": "Zahl zwischen -2,0 und 2,0. Positive Werte bestrafen neue Tokens basierend auf ihrer vorhandenen Häufigkeit im bisherigen Text und verringern so die Wahrscheinlichkeit, dass das Modell dieselbe Zeile wörtlich wiederholt.",
"Max completion tokens description": "Eine Obergrenze für die Anzahl der Tokens, die für eine Vervollständigung generiert werden können, einschließlich sichtbarer Ausgabe-Tokens und Reasoning-Tokens.",
"Presence penalty description": "Zahl zwischen -2,0 und 2,0. Positive Werte bestrafen neue Tokens basierend darauf, ob sie bisher im Text vorkommen, und erhöhen die Wahrscheinlichkeit, dass das Modell über neue Themen spricht.",
"Response format description": "Wichtig: Bei Verwendung des JSON-Modus müssen Sie das Modell auch selbst über eine System- oder Benutzernachricht anweisen, JSON zu erzeugen.",
"Temperature description": "Welche Sampling-Temperatur verwendet werden soll, zwischen 0 und 2. Höhere Werte wie 0,8 machen die Ausgabe zufälliger, während niedrigere Werte wie 0,2 sie fokussierter und deterministischer machen.",
"Top P description": "Eine Alternative zum Sampling mit Temperatur, genannt Nucleus-Sampling, bei dem das Modell die Ergebnisse der Tokens mit der Wahrscheinlichkeitsmasse top_p berücksichtigt. 0,1 bedeutet also, dass nur die Tokens berücksichtigt werden, die die obersten 10% der Wahrscheinlichkeitsmasse ausmachen.",
"Get models list failed, you can enter a model name manually.": "Abrufen der Modellliste fehlgeschlagen, Sie können einen Modellnamen manuell eingeben."
}

View File

@ -0,0 +1,25 @@
{
"AI integration": "Integrazione AI",
"LLM services": "Servizi LLM",
"LLM service": "Servizio LLM",
"Model": "Modello",
"Messages": "Messaggi",
"Structured output": "Output strutturato",
"Message": "Messaggio",
"Role": "Ruolo",
"UID": "UID",
"Add content": "Aggiungi contenuto",
"Add prompt": "Aggiungi prompt",
"Provider": "Fornitore",
"Text": "Testo",
"Image": "Immagine",
"Timout (ms)": "Timeout (ms)",
"Max retries": "Tentativi massimi",
"Frequency penalty description": "Un numero compreso tra -2,0 e 2,0. Se il valore è positivo, i nuovi token vengono penalizzati in base alla loro frequenza di occorrenza nel testo esistente, riducendo la probabilità che il modello ripeta lo stesso contenuto.",
"Max completion tokens description": "Un limite superiore per il numero di token che possono essere generati per un completamento, inclusi i token di output visibili e i token di ragionamento.",
"Presence penalty description": "Numero tra -2.0 e 2.0. I valori positivi penalizzano i nuovi token in base alla loro presenza o meno nel testo finora, aumentando la probabilità del modello di parlare di nuovi argomenti.",
"Response format description": "Importante: quando si utilizza la modalità JSON, è necessario anche istruire il modello a produrre JSON tramite un messaggio di sistema o messaggio utente.",
"Temperature description": "Quale temperatura di campionamento utilizzare, tra 0 e 2. Valori più alti come 0.8 renderanno l'output più casuale, mentre valori più bassi come 0.2 lo renderanno più focalizzato e deterministico.",
"Top P description": "Un'alternativa al campionamento con temperatura, chiamata campionamento del nucleo, in cui il modello considera i risultati dei token con massa di probabilità top_p. Quindi 0.1 significa che vengono considerati solo i token che comprendono la massa di probabilità del 10% o superiore.",
"Get models list failed, you can enter a model name manually.": "Recupero dell'elenco dei modelli fallito, è possibile inserire manualmente il nome del modello."
}

View File

@ -0,0 +1,5 @@
{
"API documentation": "API-Dokumentation",
"Documentation": "Dokumentation",
"Select a definition": "Wählen Sie eine Definition aus"
}

View File

@ -1,5 +1,5 @@
{ {
"API documentation": "Docuemntazione API", "API documentation": "Documentazione API",
"Documentation": "Documentazione", "Documentation": "Documentazione",
"Select a definition": "Seleziona una definizione" "Select a definition": "Seleziona una definizione"
} }

View File

@ -0,0 +1,21 @@
{
"API keys": "API-Schlüssel",
"API key created successfully": "API-Schlüssel erfolgreich erstellt",
"Make sure to copy your personal access key now as you will not be able to see this again.": "Stellen Sie sicher, dass Sie Ihren persönlichen Zugriffsschlüssel jetzt kopieren, da Sie ihn später nicht mehr sehen können.",
"Key name": "Schlüsselname",
"Expiration": "Ablauf",
"Delete API key": "API-Schlüssel löschen",
"Role": "Rolle",
"Keys manager": "Schlüsselverwaltung",
"Created at": "Erstellt am",
"Add API key": "API-Schlüssel hinzufügen",
"Never": "Nie",
"Custom": "Benutzerdefiniert",
"Never expires": "Läuft nie ab",
"1 Day": "1 Tag",
"7 Days": "7 Tage",
"30 Days": "30 Tage",
"90 Days": "90 Tage",
"Role not found": "Rolle nicht gefunden",
"Allow only your own roles to be selected": "Erlauben Sie nur die Auswahl Ihrer eigenen Rollen"
}

View File

@ -0,0 +1,45 @@
{
"Export": "Exportieren",
"Import": "Importieren",
"Data": "Daten",
"Task": "Aufgabe",
"Status": "Status",
"Actions": "Aktionen",
"Created at": "Erstellt am",
"Type": "Typ",
"Waiting": "Wartend",
"Processing": "In Bearbeitung",
"Completed": "Abgeschlossen",
"Failed": "Fehlgeschlagen",
"Cancelled": "Abgebrochen",
"Cancel": "Abbrechen",
"Cancelling": "Wird abgebrochen",
"Download": "Herunterladen",
"Error details": "Fehlerdetails",
"Confirm cancel": "Abbruch bestätigen",
"Confirm cancel description": "Sind Sie sicher, dass Sie diese Aufgabe abbrechen möchten?",
"Confirm": "Bestätigen",
"Task cancelled": "Aufgabe abgebrochen",
"Task completed": "Aufgabe abgeschlossen",
"Task failed": "Aufgabe fehlgeschlagen",
"Error Details": "Fehlerdetails",
"Close": "Schließen",
"Error code": "Fehlercode",
"Unknown error": "Unbekannter Fehler",
"OK": "OK",
"Import result": "Importergebnis",
"Import completed": "Import abgeschlossen: {{success}} Datensätze importiert, {{updated}} Datensätze aktualisiert, {{skipped}} Datensätze übersprungen, insgesamt {{total}} Datensätze",
"Import summary": "{{success}}/{{total}} Datensätze importiert",
"Import details": "{{success}} erfolgreich importiert, {{updated}} aktualisiert, {{skipped}} übersprungen, insgesamt {{total}}",
"Imported": "{{count}}/{{total}} importiert",
"Successfully imported": "Erfolgreich importiert",
"Updated records": "Aktualisierte Datensätze",
"Skipped records": "Übersprungene Datensätze",
"Total records": "Gesamtzahl der Datensätze",
"View result": "Ergebnis anzeigen",
"ImportResult": "{{success}} importiert, {{updated}} aktualisiert, {{skipped}} übersprungen, insgesamt {{total}}",
"Task result": "Aufgabenergebnis",
"Export {collection} attachments": "Export von {collection} Anhängen",
"Export {collection} data": "Export von {collection} Daten",
"Import {collection} data": "Import von {collection} Daten"
}

View File

@ -1,4 +1,44 @@
{ {
"Export": "Esporta",
"Import": "Importa",
"Data": "Dati",
"Task": "Attività",
"Status": "Stato",
"Actions": "Operazioni",
"Created at": "Creato alle",
"Type": "Tipo",
"Waiting": "In attesa",
"Processing": "In elaborazione",
"Completed": "Completato",
"Failed": "Fallito",
"Cancelled": "Annullato",
"Cancel": "Annulla",
"Cancelling": "Annullamento in corso",
"Download": "Scarica",
"Error details": "Dettagli errore",
"Confirm cancel": "Conferma annullamento",
"Confirm cancel description": "Sei sicuro di voler annullare questa attività?",
"Confirm": "Conferma",
"Task cancelled": "Attività annullata",
"Task completed": "Attività completata",
"Task failed": "Esecuzione attività fallita",
"Error Details": "Dettagli errore",
"Close": "Chiudi",
"Error code": "Codice errore",
"Unknown error": "Errore sconosciuto",
"OK": "OK",
"Import result": "Risultato importazione",
"Import completed": "Importazione completata: {{success}} record importati con successo, {{updated}} record aggiornati, {{skipped}} record saltati, totale {{total}} record",
"Import summary": "{{success}}/{{total}} record importati",
"Import details": "{{success}} record importati con successo, {{updated}} record aggiornati, {{skipped}} record saltati, totale {{total}} record",
"Imported": "{{count}}/{{total}} importati",
"Successfully imported": "Importazione riuscita",
"Updated records": "Record aggiornati",
"Skipped records": "Record saltati",
"Total records": "Record totali",
"View result": "Visualizza risultato",
"ImportResult": "Importati {{success}}, aggiornati {{updated}}, saltati {{skipped}}, totale {{total}}",
"Task result": "Risultato attività"
"Export {collection} attachments": "Esporta allegati {collection}", "Export {collection} attachments": "Esporta allegati {collection}",
"Export {collection} data": "Esporta dati {collection}", "Export {collection} data": "Esporta dati {collection}",
"Import {collection} data": "Importa dati {collection}" "Import {collection} data": "Importa dati {collection}"

View File

@ -0,0 +1,3 @@
{
"Details of changes": "Details der Änderungen"
}

View File

@ -0,0 +1,6 @@
{
"Sign in via SMS": "Anmeldung per SMS",
"User will be registered automatically if not exists.": "Benutzer wird automatisch registriert, wenn er nicht existiert.",
"Sign up automatically when the user does not exist": "Automatische Registrierung, wenn der Benutzer nicht existiert",
"SMS": "SMS"
}

View File

@ -0,0 +1,50 @@
{
"Auth Type": "Authentifizierungstyp",
"Authenticators": "Authentifikatoren",
"Authentication": "Authentifizierung",
"Sign in via email": "Mit E-Mail anmelden",
"Sign in via password": "Mit Passwort anmelden",
"Not allowed to sign up": "Registrierung nicht erlaubt",
"Allow to sign up": "Registrierung erlauben",
"The username or email is incorrect, please re-enter": "Der Benutzername oder die E-Mail ist falsch, bitte erneut eingeben",
"The password is incorrect, please re-enter": "Das Passwort ist falsch, bitte erneut eingeben",
"Not a valid cellphone number, please re-enter": "Keine gültige Handynummer, bitte erneut eingeben",
"The phone number has been registered, please login directly": "Die Telefonnummer wurde bereits registriert, bitte direkt anmelden",
"The phone number is not registered, please register first": "Die Telefonnummer ist nicht registriert, bitte zuerst registrieren",
"Please keep and enable at least one authenticator": "Bitte mindestens einen Authentifikator beibehalten und aktivieren",
"Allow to sign in with": "Anmeldung erlauben mit",
"Please enter a valid username": "Bitte geben Sie einen gültigen Benutzernamen ein",
"Please enter a valid email": "Bitte geben Sie eine gültige E-Mail-Adresse ein",
"Please enter your username or email": "Bitte geben Sie Ihren Benutzernamen oder Ihre E-Mail-Adresse ein",
"Please enter a password": "Bitte geben Sie ein Passwort ein",
"Username/Email": "Benutzername/E-Mail",
"Auth UID": "Auth-UID",
"The authentication allows users to sign in via username or email.": "Die Authentifizierung ermöglicht Benutzern die Anmeldung über Benutzernamen oder E-Mail.",
"No authentication methods available.": "Keine Authentifizierungsmethoden verfügbar.",
"The password is inconsistent, please re-enter": "Das Passwort ist inkonsistent, bitte erneut eingeben",
"Sign-in": "Anmelden",
"Password": "Passwort",
"The username/email or password is incorrect, please re-enter": "Der Benutzername/die E-Mail oder das Passwort ist falsch, bitte erneut eingeben",
"Show": "Anzeigen",
"Sign up settings": "Registrierungseinstellungen",
"Sign up form": "Registrierungsformular",
"At least one of the username or email fields is required": "Mindestens eines der Felder Benutzername oder E-Mail ist erforderlich",
"Password is not allowed to be changed": "Das Passwort darf nicht geändert werden",
"Token policy": "Token-Richtlinie",
"Token validity period": "Token-Gültigkeitsdauer",
"Session validity period": "Sitzungsgültigkeitsdauer",
"Expired token refresh limit": "Limit für die Aktualisierung abgelaufener Token",
"Token validity period must be less than session validity period!": "Die Token-Gültigkeitsdauer muss kürzer sein als die Sitzungsgültigkeitsdauer!",
"Seconds": "Sekunden",
"Minutes": "Minuten",
"Hours": "Stunden",
"Days": "Tage",
"Saved successfully!": "Erfolgreich gespeichert!",
"The maximum valid time for each user login. During the session validity, the Token will be automatically updated. After the timeout, the user is required to log in again.": "Die maximale Gültigkeitsdauer für jede Benutzeranmeldung. Während der Sitzungsgültigkeit wird das Token automatisch aktualisiert. Nach dem Timeout muss sich der Benutzer erneut anmelden.",
"The validity period of each issued API Token. After the Token expires, if it is within the session validity period and has not exceeded the refresh limit, the server will automatically issue a new Token to maintain the user session, otherwise the user is required to log in again. (Each Token can only be refreshed once)": "Die Gültigkeitsdauer jedes ausgestellten API-Tokens. Nachdem das Token abgelaufen ist, wird der Server automatisch ein neues Token ausstellen, um die Benutzersitzung aufrechtzuerhalten, wenn es innerhalb der Sitzungsgültigkeitsdauer liegt und das Aktualisierungslimit nicht überschritten hat, andernfalls muss sich der Benutzer erneut anmelden. (Jedes Token kann nur einmal aktualisiert werden)",
"The maximum time limit allowed for refreshing a Token after it expires. After this time limit, the token cannot be automatically renewed, and the user needs to log in again.": "Die maximal zulässige Zeitbegrenzung für die Aktualisierung eines Tokens nach dessen Ablauf. Nach dieser Zeitbegrenzung kann das Token nicht automatisch erneuert werden, und der Benutzer muss sich erneut anmelden.",
"In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.": "Im Konfigurationsmodus wird die gesamte Spalte transparent. Im Nicht-Konfigurationsmodus wird die gesamte Spalte ausgeblendet. Auch wenn die gesamte Spalte ausgeblendet ist, bleiben ihre konfigurierten Standardwerte und andere Einstellungen weiterhin wirksam.",
"Your session has expired. Please sign in again.": "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",
"Unauthenticated. Please sign in to continue.": "Nicht authentifiziert. Bitte melden Sie sich an, um fortzufahren.",
"User not found. Please sign in again to continue.": "Benutzer nicht gefunden. Bitte melden Sie sich erneut an, um fortzufahren."
}

View File

@ -30,4 +30,26 @@
"Sign up form": "Modulo di registrazione", "Sign up form": "Modulo di registrazione",
"At least one of the username or email fields is required": "È richiesto almeno uno dei campi nome utente o email", "At least one of the username or email fields is required": "È richiesto almeno uno dei campi nome utente o email",
"Password is not allowed to be changed": "Non consentire cambio password" "Password is not allowed to be changed": "Non consentire cambio password"
"Token policy": "Politica token",
"Token validity period": "Periodo di validità del token",
"Session validity period": "Periodo di validità della sessione",
"Expired token refresh limit": "Limite di aggiornamento token scaduto",
"Token validity period must be less than session validity period!": "Il periodo di validità del token deve essere inferiore al periodo di validità della sessione!",
"Seconds": "Secondi",
"Minutes": "Minuti",
"Hours": "Ore",
"Days": "Giorni",
"Saved successfully!": "Salvato con successo!",
"The maximum valid time for each user login. During the session validity, the Token will be automatically updated. After the timeout, the user is required to log in again.": "Il tempo massimo valido per ogni accesso utente. Durante la validità della sessione, il token verrà aggiornato automaticamente. Dopo il timeout, all'utente verrà richiesto di accedere nuovamente.",
"The validity period of each issued API Token. After the Token expires, if it is within the session validity period and has not exceeded the refresh limit, the server will automatically issue a new Token to maintain the user session, otherwise the user is required to log in again. (Each Token can only be refreshed once)": "Il periodo di validità di ciascun token API emesso. Dopo la scadenza del token, se rientra nel periodo di validità della sessione e il limite di tempo di aggiornamento non è stato superato, il server emetterà automaticamente un nuovo token per mantenere la sessione utente, altrimenti all'utente verrà richiesto di accedere nuovamente. (Ogni token può essere aggiornato una sola volta)",
"The maximum time limit allowed for refreshing a Token after it expires. After this time limit, the token cannot be automatically renewed, and the user needs to log in again.": "Il limite di tempo massimo consentito per l'aggiornamento del token dopo la scadenza. Superato questo limite di tempo, il token non può essere rinnovato automaticamente e l'utente dovrà effettuare nuovamente l'accesso.",
"Your session has expired. Please sign in again.": "La tua sessione è scaduta. Accedi di nuovo.",
"Unauthenticated. Please sign in to continue.": "Non autenticato. Accedi per continuare.",
"User not found. Please sign in again to continue.": "Utente non trovato. Accedi di nuovo per continuare."
"Select Import data": "Seleziona dati da importare",
"Select Import Plugins": "Seleziona plugin di importazione",
"Select User Collections": "Seleziona raccolte utente",
"Basic Data": "Dati di base",
"Optional Data": "Dati opzionali",
"User Data": "Dati utente"
} }

View File

@ -0,0 +1,50 @@
{
"Backup file": "Sicherungsdatei",
"Select Import data": "Bitte wählen Sie die zu importierenden Daten",
"Select Import Plugins": "Bitte wählen Sie die zu importierenden Plugins",
"Select User Collections": "Bitte wählen Sie Benutzersammlungen",
"Basic Data": "Basisdaten",
"Optional Data": "Optionale Daten",
"User Data": "Benutzerdaten",
"System metadata": "System-Metadaten",
"System config": "Systemkonfiguration",
"Business data": "Geschäftsdaten",
"Backup & Restore": "Sicherung & Wiederherstellung",
"Backup": "Sicherung",
"Restore": "Wiederherstellung",
"Configuration": "Konfiguration",
"Select the data to be backed up": "Wählen Sie die zu sichernden Daten aus",
"Select the data to be restored": "Wählen Sie die wiederherzustellenden Daten aus",
"Click or drag file to this area to upload": "Klicken oder ziehen Sie die Datei in diesen Bereich, um sie hochzuladen",
"Learn more": "Mehr erfahren",
"Start backup": "Sicherung starten",
"Start restore": "Wiederherstellung starten",
"Backed up successfully": "Erfolgreich gesichert",
"Plugin": "Plugin",
"file uploaded successfully": "Datei erfolgreich hochgeladen",
"file upload failed": "Datei-Upload fehlgeschlagen",
"Download": "Herunterladen",
"Restore backup from local": "Sicherung von lokal wiederherstellen",
"Backup instructions": "Sicherungsanweisungen",
"File size": "Dateigröße",
"New backup": "Neue Sicherung",
"Origin": "Ursprung",
"Backing up": "Sicherung läuft",
"Refresh": "Aktualisieren",
"Delete": "Löschen",
"Deleted successfully": "Erfolgreich gelöscht",
"required.title": "Erforderliche Daten",
"user.title": "Benutzerdaten",
"log.title": "Protokolldaten",
"custom.title": "Benutzerdefinierte Sammlungsdaten",
"skipped.title": "Übersprungene Daten",
"unknown.title": "Unbekannt",
"third-party.title": "Informationen zu Drittanbieterdiensten",
"required.description": "Erforderliche Daten",
"user.description": "Benutzerdaten",
"log.description": "Protokolldaten",
"custom.description": "Benutzerdefinierte Sammlungsdaten",
"skipped.description": "Übersprungene Daten",
"unknown.description": "Daten ohne konfigurierte Dump-Regeln",
"third-party.description": "Informationen zu Drittanbieterdiensten"
}

View File

@ -31,9 +31,6 @@ const useStyles = createStyles(({ token, css }) => ({
title: css` title: css`
margin-top: ${token.marginSM}px; margin-top: ${token.marginSM}px;
width: 100%; width: 100%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
`, `,
})); }));
@ -41,14 +38,23 @@ function Button() {
const fieldSchema = useFieldSchema(); const fieldSchema = useFieldSchema();
const icon = fieldSchema['x-component-props']?.['icon']; const icon = fieldSchema['x-component-props']?.['icon'];
const backgroundColor = fieldSchema['x-component-props']?.['iconColor']; const backgroundColor = fieldSchema['x-component-props']?.['iconColor'];
const { layout } = useContext(WorkbenchBlockContext); const { layout, ellipsis = true } = useContext(WorkbenchBlockContext);
const { styles, cx } = useStyles(); const { styles, cx } = useStyles();
const compile = useCompile(); const compile = useCompile();
const title = compile(fieldSchema.title); const title = compile(fieldSchema.title);
return layout === WorkbenchLayout.Grid ? ( return layout === WorkbenchLayout.Grid ? (
<div title={title} className={cx(styles.avatar)}> <div title={title} className={cx(styles.avatar)}>
<Avatar style={{ backgroundColor }} size={48} icon={<Icon type={icon} />} /> <Avatar style={{ backgroundColor }} size={48} icon={<Icon type={icon} />} />
<div className={cx(styles.title)}>{title}</div> <div
className={cx(styles.title)}
style={{
whiteSpace: ellipsis ? 'nowrap' : 'normal',
textOverflow: ellipsis ? 'ellipsis' : 'clip',
overflow: ellipsis ? 'hidden' : 'visible',
}}
>
{title}
</div>
</div> </div>
) : ( ) : (
<span>{title}</span> <span>{title}</span>

View File

@ -101,7 +101,7 @@ const InternalIcons = () => {
); );
}; };
export const WorkbenchBlockContext = createContext({ layout: 'grid' }); export const WorkbenchBlockContext = createContext({ layout: 'grid', ellipsis: true });
const useStyles = createStyles(({ token, css }) => ({ const useStyles = createStyles(({ token, css }) => ({
containerClass: css` containerClass: css`
@ -142,7 +142,7 @@ const useStyles = createStyles(({ token, css }) => ({
export const WorkbenchBlock: any = withDynamicSchemaProps( export const WorkbenchBlock: any = withDynamicSchemaProps(
(props) => { (props) => {
const fieldSchema = useFieldSchema(); const fieldSchema = useFieldSchema();
const { layout = 'grid' } = fieldSchema['x-component-props'] || {}; const { layout = 'grid', ellipsis } = fieldSchema['x-component-props'] || {};
const { styles } = useStyles(); const { styles } = useStyles();
const { title } = fieldSchema['x-decorator-props'] || {}; const { title } = fieldSchema['x-decorator-props'] || {};
const targetHeight = useBlockHeight(); const targetHeight = useBlockHeight();
@ -171,7 +171,7 @@ export const WorkbenchBlock: any = withDynamicSchemaProps(
return ( return (
<div className={`nb-action-penal-container ${layout} ${styles.containerClass} ${heightClass}`}> <div className={`nb-action-penal-container ${layout} ${styles.containerClass} ${heightClass}`}>
<WorkbenchBlockContext.Provider value={{ layout }}> <WorkbenchBlockContext.Provider value={{ layout, ellipsis }}>
<DataSourceContext.Provider value={undefined}> <DataSourceContext.Provider value={undefined}>
<CollectionContext.Provider value={undefined}>{props.children}</CollectionContext.Provider> <CollectionContext.Provider value={undefined}>{props.children}</CollectionContext.Provider>
</DataSourceContext.Provider> </DataSourceContext.Provider>

View File

@ -14,6 +14,7 @@ import {
SchemaSettingsBlockHeightItem, SchemaSettingsBlockHeightItem,
SchemaSettingsModalItem, SchemaSettingsModalItem,
useOpenModeContext, useOpenModeContext,
SchemaSettingsItemType,
} from '@nocobase/client'; } from '@nocobase/client';
import { CustomSchemaSettingsBlockTitleItem } from './SchemaSettingsBlockTitleItem'; import { CustomSchemaSettingsBlockTitleItem } from './SchemaSettingsBlockTitleItem';
import React from 'react'; import React from 'react';
@ -55,6 +56,32 @@ const ActionPanelLayout = () => {
); );
}; };
export const ellipsisSettingsItem: SchemaSettingsItemType = {
name: 'ellipsis',
type: 'switch',
useComponentProps() {
const fieldSchema = useFieldSchema();
const { dn } = useDesignable();
const { t } = useTranslation();
return {
title: t('Ellipsis action title', { ns: 'block-workbench' }),
checked: fieldSchema['x-component-props']?.ellipsis !== false,
onChange: async (checked) => {
fieldSchema['x-component-props'] = fieldSchema['x-component-props'] || {};
fieldSchema['x-component-props']['ellipsis'] = checked;
await dn.emit('patch', {
schema: {
'x-uid': fieldSchema['x-uid'],
'x-component-props': {
...fieldSchema['x-component-props'],
ellipsis: checked,
},
},
});
},
};
},
};
export function ActionPanelItemsPerRow() { export function ActionPanelItemsPerRow() {
const field = useField(); const field = useField();
const fieldSchema = useFieldSchema(); const fieldSchema = useFieldSchema();
@ -122,6 +149,7 @@ export const workbenchBlockSettings = new SchemaSettings({
return isMobile && fieldSchema?.['x-component-props']?.layout !== WorkbenchLayout.List; return isMobile && fieldSchema?.['x-component-props']?.layout !== WorkbenchLayout.List;
}, },
}, },
ellipsisSettingsItem,
{ {
type: 'remove', type: 'remove',
name: 'remove', name: 'remove',

View File

@ -0,0 +1,18 @@
{
"Workbench": "Arbeitsbereich",
"Action panel": "Aktionspanel",
"Scan QR code": "QR-Code scannen",
"Album": "Album",
"No camera device detected": "Keine Kamera erkannt",
"You have not granted permission to use the camera": "Sie haben keine Berechtigung zur Nutzung der Kamera erteilt",
"Unknown error": "Unbekannter Fehler",
"The image size is too large. Please compress it to below 1MB before uploading": "Die Bildgröße ist zu groß. Bitte komprimieren Sie es auf unter 1MB vor dem Hochladen.",
"QR code recognition failed, please scan again": "QR-Code-Erkennung fehlgeschlagen, bitte erneut scannen.",
"Layout": "Layout",
"Grid": "Raster",
"List": "Liste",
"Add popup": "Popup hinzufügen",
"Add custom request": "Benutzerdefinierte Anfrage hinzufügen",
"At least 1, up to 6": "Mindestens 1, maximal 6",
"Items per row": "Elemente pro Zeile"
}

View File

@ -1,5 +1,5 @@
{ {
"Workbench": "Banco di lavoro", "Action panel": "Pannello azioni",
"Scan QR code": "Scansiona codice QR", "Scan QR code": "Scansiona codice QR",
"Album": "Album", "Album": "Album",
"No camera device detected": "Nessuna fotocamera rilevata", "No camera device detected": "Nessuna fotocamera rilevata",
@ -7,4 +7,11 @@
"Unknown error": "Errore sconosciuto", "Unknown error": "Errore sconosciuto",
"The image size is too large. Please compress it to below 1MB before uploading": "La dimensione dell'immagine è troppo grande. Si prega di comprimerla sotto 1MB prima di caricarla.", "The image size is too large. Please compress it to below 1MB before uploading": "La dimensione dell'immagine è troppo grande. Si prega di comprimerla sotto 1MB prima di caricarla.",
"QR code recognition failed, please scan again": "Riconoscimento del codice QR fallito, si prega di scansionare di nuovo." "QR code recognition failed, please scan again": "Riconoscimento del codice QR fallito, si prega di scansionare di nuovo."
"Layout": "Layout",
"Grid": "Griglia",
"List": "Elenco",
"Add popup": "Aggiungi popup",
"Add custom request": "Aggiungi richiesta personalizzata",
"At least 1, up to 6": "Almeno 1, fino a 6",
"Items per row": "Elementi per riga"
} }

View File

@ -13,5 +13,6 @@
"Add popup": "添加弹窗", "Add popup": "添加弹窗",
"Add custom request": "添加自定义请求", "Add custom request": "添加自定义请求",
"At least 1, up to 6": "最多6个最少一个", "At least 1, up to 6": "最多6个最少一个",
"Items per row":"每行显示个数" "Items per row": "每行显示个数",
"Ellipsis action title": "省略超出长度的操作标题"
} }

View File

@ -0,0 +1,54 @@
{
"Configure calendar": "Kalender konfigurieren",
"Title field": "Titelfeld",
"Custom title": "Benutzerdefinierter Titel",
"Show lunar": "Mondkalender anzeigen",
"Start date field": "Startdatumsfeld",
"End date field": "Enddatumsfeld",
"Work week": "Arbeitswoche",
"Today": "Heute",
"Day": "Tag",
"Agenda": "Agenda",
"Date": "Datum",
"Time": "Zeit",
"Event": "Ereignis",
"None": "Keine",
"Calendar": "Kalender",
"Delete events": "Ereignisse löschen",
"This event": "Dieses Ereignis",
"This and following events": "Dieses und folgende Ereignisse",
"All events": "Alle Ereignisse",
"Delete this event?": "Dieses Ereignis löschen?",
"Delete Event": "Ereignis löschen",
"Calendar collection": "Kalendersammlung",
"Create calendar block": "Kalenderblock erstellen",
"Filter": "Filter",
"Configure actions": "Aktionen konfigurieren",
"Enable actions": "Aktionen aktivieren",
"Turn pages": "Seiten umblättern",
"Select view": "Ansicht auswählen",
"Add new": "Neu hinzufügen",
"View record": "Datensatz anzeigen",
"Details": "Details",
"Customize": "Anpassen",
"Popup": "Popup",
"Updated successfully": "Erfolgreich aktualisiert",
"Custom request": "Benutzerdefinierte Anfrage",
"Edit": "Bearbeiten",
"Delete": "Löschen",
"Print": "Drucken",
"Daily": "Täglich",
"Weekly": "Wöchentlich",
"Monthly": "Monatlich",
"Yearly": "Jährlich",
"Repeats": "Wiederholungen",
"Title": "Titel",
"Month": "Monat",
"Week": "Woche",
"{{count}} more items": "{{count}} weitere Einträge",
"Color field": "Farbfeld",
"Not selected": "Nicht ausgewählt",
"Default view": "Standardansicht",
"Event open mode": "Ereignisöffnungsmodus",
"Update record": "Datensatz aktualisieren"
}

View File

@ -1,22 +1,4 @@
/** {
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
export default {
"Configure calendar": "Configura calendario", "Configure calendar": "Configura calendario",
"Title field": "Campo titolo", "Title field": "Campo titolo",
"Custom title": "Titolo personalizzato", "Custom title": "Titolo personalizzato",
@ -49,6 +31,7 @@ export default {
"View record": "Visualizza record", "View record": "Visualizza record",
"Details": "Dettagli", "Details": "Dettagli",
"Customize": "Personalizza", "Customize": "Personalizza",
"Update record": "Aggiorna record",
"Popup": "Popup", "Popup": "Popup",
"Updated successfully": "Aggiornato con successo", "Updated successfully": "Aggiornato con successo",
"Custom request": "Richiesta personalizzata", "Custom request": "Richiesta personalizzata",
@ -60,6 +43,12 @@ export default {
"Monthly": "Mensile", "Monthly": "Mensile",
"Yearly": "Annuale", "Yearly": "Annuale",
"Repeats": "Ripeti", "Repeats": "Ripeti",
"Background color field": "Campo colore sfondo", "Title": "Titolo",
"Not selected": "Non selezionato" "Month": "Mese",
}; "Week": "Settimana",
"{{count}} more items": "{{count}} altri elementi",
"Not selected": "Non selezionato",
"Color field": "Campo colore",
"Default view": "Vista predefinita",
"Event open mode": "Modalità apertura evento"
}

View File

@ -0,0 +1,74 @@
{
"Edit": "Bearbeiten",
"Delete": "Löschen",
"Cancel": "Abbrechen",
"Submit": "Absenden",
"Actions": "Aktionen",
"Title": "Titel",
"Enable": "Aktivieren",
"SAML manager": "SAML-Manager",
"SAML Providers": "SAML-Anbieter",
"Redirect url": "Weiterleitungs-URL",
"SP entity id": "SP-Entitäts-ID",
"Add provider": "Hinzufügen",
"Edit provider": "Bearbeiten",
"Client id": "Client-ID",
"Entity id or issuer": "Entitäts-ID oder Aussteller",
"Login Url": "Login-URL",
"Public cert": "Öffentliches Zertifikat",
"Delete provider": "Löschen",
"Are you sure you want to delete it?": "Sind Sie sicher, dass Sie es löschen möchten?",
"Sign in button name, which will be displayed on the sign in page": "Name der Anmeldeschaltfläche, der auf der Anmeldeseite angezeigt wird",
"Chart": "Diagramm",
"Charts": "Diagramme",
"Queries": "Abfragen",
"Select chart query": "Diagrammabfrage auswählen",
"Select query data": "Abfragedaten auswählen",
"Type": "Typ",
"Chart type": "Diagrammtyp",
"Chart title": "Diagrammtitel",
"Basic charts": "Grundlegende Diagramme",
"More charts": "Weitere Diagramme",
"Chart config": "Diagrammkonfiguration",
"Add query": "Abfrage hinzufügen",
"Edit query": "Abfrage bearbeiten",
"Invalid JSON format,must be an object array.": "Ungültiges JSON-Format, muss ein Array von Objekten sein.",
"Area": "Flächendiagramm",
"Bar": "Balkendiagramm",
"Column": "Säulendiagramm",
"Funnel": "Trichterdiagramm",
"Line": "Liniendiagramm",
"Pie": "Kreisdiagramm",
"Radar": "Radardiagramm",
"Scatter": "Streudiagramm",
"Edit chart block": "Diagrammblock bearbeiten",
"Chart preview": "Diagrammvorschau",
"Delete queries": "Abfragen löschen",
"Delete query": "Abfrage löschen",
"Add chart query": "Diagrammabfrage hinzufügen",
"Add SQL query": "SQL-Abfrage hinzufügen",
"Add JSON query": "JSON-Abfrage hinzufügen",
"Data preview": "Datenvorschau",
"Category axis / Dimension": "Kategorienachse / Dimension",
"Value axis / Metrics": "Werteachse / Metriken",
"JSON config": "JSON-Konfiguration",
"Json config references": "JSON-Konfigurationsreferenzen",
"Create chart block": "Diagrammblock erstellen",
"Invalid JSON format": "Ungültiges JSON-Format",
"Json config references: ": "JSON-Konfigurationsreferenzen: ",
"Sector Angle / Metric": "Sektorwinkel / Metrik",
"Sector label / Dimensional": "Sektorbeschriftung / Dimensional",
"Color legend / Dimensional": "Farblegende / Dimensional",
"Funnel Layer Width/Metrics": "Trichterebenenbreite / Metriken",
"Branch Tags/Dimensions": "Zweigbeschriftungen / Dimensionen",
"Branch Length/Metrics": "Zweiglänge / Metriken",
"Please check the chart config": "Bitte überprüfen Sie die Diagrammkonfiguration",
"1 「time」or 「Ordered Noun」 field,1 「Numerical」 field,1 「Unordered Noun」 field (optional)": "1 「Zeit」- oder 「Geordnetes Substantiv」-Feld, 1 「Numerisches」-Feld, 1 「Ungeordnetes Substantiv」-Feld (optional)",
"1 「time」 or 「ordered noun」 field, 1 「value」 field, 0~ 1 「unordered noun」": "1 「Zeit」- oder 「geordnetes Substantiv」-Feld, 1 「Wert」-Feld, 0~1 「ungeordnetes Substantiv」",
"1 「time」 or 「ordered noun」 field, 1 「value」 field, 0 to 1 「unordered noun」": "1 「Zeit」- oder 「geordnetes Substantiv」-Feld, 1 「Wert」-Feld, 0 bis 1 「ungeordnetes Substantiv」",
"1 「Unordered Noun」 field, 1 「Numeric」 field": "1 「Ungeordnetes Substantiv」-Feld, 1 「Numerisches」-Feld",
"1 「Time」 or 「Order Noun」 field, 1 「Value」 field": "1 「Zeit」- oder 「Geordnetes Substantiv」-Feld, 1 「Wert」-Feld",
"1~ 2 「Unordered Noun」 fields, 1 「Numeric」 field": "1~2 「Ungeordnete Substantiv」-Felder, 1 「Numerisches」-Feld",
"1 「Numeric」 field, 0~ 1 「Unordered Noun」 field": "1 「Numerisches」-Feld, 0~1 「Ungeordnetes Substantiv」-Feld",
"Chart (Old)": "Diagramm (Alt)"
}

View File

@ -6,17 +6,56 @@
"Actions": "Operazioni", "Actions": "Operazioni",
"Title": "Titolo", "Title": "Titolo",
"Enable": "Abilita", "Enable": "Abilita",
"SAML manager": "Gestore SAML", "Chart": "Grafico",
"SAML Providers": "Fornitori SAML", "Charts": "Grafici",
"Redirect url": "URL di reindirizzamento", "Queries": "Elenco query",
"SP entity id": "ID entità SP", "Select chart query": "Seleziona dati grafico",
"Add provider": "Aggiungi fornitore", "Select query data": "Seleziona dati query",
"Edit provider": "Modifica fornitore", "Type": "Tipo",
"Client id": "ID client", "Chart type": "Tipo di grafico",
"Entity id or issuer": "ID entità o emittente", "Chart title": "Titolo grafico",
"Login Url": "URL di accesso", "Basic charts": "Grafici di base",
"Public cert": "Certificato pubblico", "More charts": "Altri grafici",
"Delete provider": "Elimina fornitore", "Chart config": "Configurazione grafico",
"Are you sure you want to delete it?": "Sei sicuro di volerlo eliminare?", "Add query": "Aggiungi query",
"Sign in button name, which will be displayed on the sign in page": "Nome del pulsante di accesso, che verrà visualizzato nella pagina di accesso" "Edit query": "Modifica query",
"Invalid JSON format,must be an object array.": "Formato JSON non valido, deve essere un array di oggetti.",
"Area": "Area",
"Bar": "Barre orizzontali",
"Column": "Colonne",
"Funnel": "Imbuto",
"Line": "Linee",
"Pie": "Torta",
"Radar": "Radar",
"Scatter": "Dispersione",
"Edit chart block": "Modifica blocco grafico",
"Chart preview": "Anteprima grafico",
"Delete queries": "Elimina elenco query",
"Delete query": "Elimina query",
"Add chart query": "Aggiungi query grafico",
"Add SQL query": "Aggiungi query SQL",
"Add JSON query": "Aggiungi query JSON",
"Data preview": "Anteprima dati",
"Category axis / Dimension": "Assi Categoria / Dimensione",
"Value axis / Metrics": "Assi Valore / Metriche",
"JSON config": "Configurazione JSON",
"Json config references": "Riferimenti configurazione JSON",
"Create chart block": "Crea blocco grafico",
"Invalid JSON format": "Formato JSON non valido",
"Json config references: ": "Riferimenti configurazione JSON: ",
"Sector Angle / Metric": "Angolo Settore / Metrica",
"Sector label / Dimensional": "Etichetta Settore / Dimensionale",
"Color legend / Dimensional": "Legenda colori / Dimensionale",
"Funnel Layer Width/Metrics": "Larghezza livello imbuto / Metriche",
"Branch Tags/Dimensions": "Etichette rami / Dimensioni",
"Branch Length/Metrics": "Lunghezza rami / Metriche",
"Please check the chart config": "Controlla la configurazione del grafico",
"1 「time」or 「Ordered Noun」 field,1 「Numerical」 field,1 「Unordered Noun」 field (optional)": "1 campo 「time」 o 「Ordered Noun」, 1 campo 「Numerical」, 1 campo 「Unordered Noun」 (opzionale)",
"1 「time」 or 「ordered noun」 field, 1 「value」 field, 0~ 1 「unordered noun」": "1 campo 「time」 o 「ordered noun」, 1 campo 「value」, 0~1 「unordered noun」",
"1 「time」 or 「ordered noun」 field, 1 「value」 field, 0 to 1 「unordered noun」": "1 campo 「time」 o 「ordered noun」, 1 campo 「value」, da 0 a 1 「unordered noun」",
"1 「Unordered Noun」 field, 1 「Numeric」 field": "1 campo 「Unordered Noun」, 1 campo 「Numeric」",
"1 「Time」 or 「Order Noun」 field, 1 「Value」 field": "1 campo 「Time」 o 「Order Noun」, 1 campo 「Value」",
"1~ 2 「Unordered Noun」 fields, 1 「Numeric」 field": "1 ~ 2 campi 「Unordered Noun」, 1 campo 「Numeric」",
"1 「Numeric」 field, 0~ 1 「Unordered Noun」 field": "1 campo 「Numeric」, 0 ~ 1 campo 「Unordered Noun」",
"Chart (Old)": "Grafico (Vecchio)"
} }

View File

@ -0,0 +1,4 @@
{
"field-name-exists": "Feldname \"{{name}}\" existiert bereits in der Sammlung \"{{collectionName}}\"",
"field-is-depended-on-by-other": "Feld \"{{fieldName}}\" in \"{{fieldCollectionName}}\" kann nicht gelöscht werden, es wird von Feld \"{{dependedFieldName}}\" in \"{{dependedFieldCollectionName}}\" als \"{{dependedFieldAs}}\" verwendet"
}

View File

@ -59,12 +59,16 @@ export const PermissionProvider = (props) => {
); );
}; };
export const CurrentDataSourceKey = createContext({ dataSourceKey: 'main' });
export const RoleRecordProvider = (props) => { export const RoleRecordProvider = (props) => {
const role = useContext(CurrentRolesContext); const role = useContext(CurrentRolesContext);
const record = useRecord(); const record = useRecord();
return ( return (
<RecordContext_deprecated.Provider value={{ ...role }}> <RecordContext_deprecated.Provider value={{ ...role }}>
<CurrentDataSourceKey.Provider value={{ dataSourceKey: record.key }}>
<SchemaComponentOptions scope={{ dataSourceKey: record.key }}>{props.children}</SchemaComponentOptions> <SchemaComponentOptions scope={{ dataSourceKey: record.key }}>{props.children}</SchemaComponentOptions>
</CurrentDataSourceKey.Provider>
</RecordContext_deprecated.Provider> </RecordContext_deprecated.Provider>
); );
}; };

View File

@ -0,0 +1,36 @@
/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import React, { useContext } from 'react';
import { ResourceActionProvider, useRecord } from '@nocobase/client';
import { CurrentDataSourceKey } from './PermisionProvider';
export const PermissionResourceActionProvider = (props) => {
const { dataSourceKey } = useContext(CurrentDataSourceKey);
const record = useRecord();
console.log(props, record.key, dataSourceKey);
// 创建一个新的请求对象,并添加 dataSourceKey
const modifiedRequest = {
...props.request,
params: {
...props.request.params,
filter: {
...props.request.params.filter,
dataSourceKey, // 添加 dataSourceKey 到 filter
},
},
};
return (
<ResourceActionProvider {...props} request={modifiedRequest}>
{props.children}
</ResourceActionProvider>
);
};

View File

@ -11,7 +11,7 @@ import { ISchema } from '@formily/react';
import { uid } from '@formily/shared'; import { uid } from '@formily/shared';
import { useRoleResourceValues } from './useRoleResourceValues'; import { useRoleResourceValues } from './useRoleResourceValues';
import { useSaveRoleResourceAction } from './useSaveRoleResourceAction'; import { useSaveRoleResourceAction } from './useSaveRoleResourceAction';
import { PermissionResourceActionProvider } from '../PermissionResourceActionProvider';
const collection = { const collection = {
name: 'dataSourcesCollections', name: 'dataSourcesCollections',
targetKey: 'name', targetKey: 'name',
@ -82,9 +82,9 @@ export const roleCollectionsSchema: ISchema = {
type: 'void', type: 'void',
'x-decorator': 'RoleRecordProvider', 'x-decorator': 'RoleRecordProvider',
properties: { properties: {
block: { [uid()]: {
type: 'void', type: 'void',
'x-decorator': 'ResourceActionProvider', 'x-decorator': PermissionResourceActionProvider,
'x-decorator-props': { 'x-decorator-props': {
collection, collection,
association: { association: {

View File

@ -0,0 +1,40 @@
{
"Data source name": "Datenquellname",
"Data source display name": "Anzeigename der Datenquelle",
"Host": "Host",
"Port": "Port",
"Database": "Datenbank",
"Data source manager": "Datenquellenverwaltung",
"Data sources": "Datenquellen",
"No external data source plugin installed": "Kein externes Datenquellen-Plugin installiert",
"View documentation": "Dokumentation anzeigen",
"Test Connection": "Verbindung testen",
"Connection successful": "Verbindung erfolgreich",
"Display name": "Anzeigename",
"Username": "Benutzername",
"Password": "Passwort",
"Type": "Typ",
"Description": "Beschreibung",
"Storage": "Speicher",
"Collections": "Sammlungen",
"Permissions": "Berechtigungen",
"Allow adding and modifying collection": "Hinzufügen und Ändern von Sammlungen erlauben",
"Unknown field type": "Unbekannter Feldtyp",
"The following field types are not compatible and do not support output and display": "Die folgenden Feldtypen sind nicht kompatibel und unterstützen keine Ausgabe und Anzeige",
"Field database type": "Felddatenbanktyp",
"Field interface": "Feldschnittstelle",
"Status": "Status",
"Loading": "Wird geladen",
"Failed": "Fehlgeschlagen",
"Loaded": "Geladen",
"Reloading": "Wird neu geladen",
"Data source synchronization in progress": "Datenquellensynchronisierung läuft",
"Data source synchronization successful": "Datenquellensynchronisierung erfolgreich",
"Filter target key": "Zielschlüssel filtern",
"Select field": "Feld auswählen",
"OK": "OK",
"Please select a field.": "Bitte wählen Sie ein Feld aus.",
"Are you sure you want to set the \"{{title}}\" field as a record unique key? This setting cannot be changed after it's been set.": "Sind Sie sicher, dass Sie das Feld \"{{title}}\" als eindeutigen Datensatzschlüssel festlegen möchten? Diese Einstellung kann nach dem Festlegen nicht mehr geändert werden.",
"If a collection lacks a primary key, you must configure a unique record key to locate row records within a block, failure to configure this will prevent the creation of data blocks for the collection.": "Wenn eine Sammlung keinen Primärschlüssel hat, müssen Sie einen eindeutigen Datensatzschlüssel konfigurieren, um Zeilendatensätze innerhalb eines Blocks zu lokalisieren. Wenn Sie dies nicht konfigurieren, wird die Erstellung von Datenblöcken für die Sammlung verhindert.",
"Filter data based on the specific field, with the requirement that the field value must be unique.": "Filtern Sie Daten basierend auf dem spezifischen Feld, mit der Anforderung, dass der Feldwert eindeutig sein muss."
}

View File

@ -249,7 +249,7 @@ export const ChartFilterCustomItemInitializer: React.FC<{
}), }),
); );
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [theme]); }, [theme, insert]);
return <SchemaInitializerItem {...itemConfig} {...props} onClick={handleClick} />; return <SchemaInitializerItem {...itemConfig} {...props} onClick={handleClick} />;
}); });
ChartFilterCustomItemInitializer.displayName = 'ChartFilterCustomItemInitializer'; ChartFilterCustomItemInitializer.displayName = 'ChartFilterCustomItemInitializer';

View File

@ -0,0 +1,102 @@
{
"Edit": "Bearbeiten",
"Delete": "Löschen",
"Cancel": "Abbrechen",
"Submit": "Absenden",
"Actions": "Aktionen",
"Title": "Titel",
"Enable": "Aktivieren",
"Chart": "Diagramm",
"ChartV2": "DiagrammV2",
"Charts": "Diagramme",
"Configure": "Konfigurieren",
"Duplicate": "Duplizieren",
"Configure chart": "Diagramm konfigurieren",
"Transform": "Transformieren",
"Chart type": "Diagrammtyp",
"JSON config": "JSON-Konfiguration",
"Query": "Abfrage",
"Data": "Daten",
"Run query": "Abfrage ausführen",
"Measures": "Messgrößen",
"Dimensions": "Dimensionen",
"Filter": "Filter",
"Sort": "Sortierung",
"Limit": "Limit",
"Offset": "Versatz",
"Enable cache": "Cache aktivieren",
"TTL (second)": "TTL (Sekunden)",
"Field": "Feld",
"Aggregation": "Aggregation",
"Alias": "Alias",
"Format": "Format",
"The first 10 records of the query result:": "Die ersten 10 Datensätze des Abfrageergebnisses:",
"Please run query to retrive data.": "Bitte führen Sie die Abfrage aus, um Daten abzurufen.",
"Type": "Typ",
"Add field": "Feld hinzufügen",
"Add chart": "Diagramm hinzufügen",
"xField": "X-Feld",
"yField": "Y-Feld",
"seriesField": "Reihenfeld",
"angleField": "Winkelfeld",
"colorField": "Farbfeld",
"Line": "Linie",
"Area": "Fläche",
"Column": "Säule",
"Bar": "Balken",
"Pie": "Kreis",
"Dual axes": "Doppelachsen",
"Scatter": "Streuung",
"Gauge": "Messanzeige",
"Statistic": "Statistik",
"Currency": "Währung",
"Percent": "Prozent",
"Exponential": "Exponentiell",
"Abbreviation": "Abkürzung",
"Please configure and run query": "Bitte konfigurieren und führen Sie die Abfrage aus",
"Please configure chart": "Bitte konfigurieren Sie das Diagramm",
"Are you sure to cancel?": "Sind Sie sicher, dass Sie abbrechen möchten?",
"You changes are not saved. If you click OK, your changes will be lost.": "Ihre Änderungen sind nicht gespeichert. Wenn Sie OK klicken, gehen Ihre Änderungen verloren.",
"Same properties set in the form above will be overwritten by this JSON config.": "Dieselben Eigenschaften, die im obigen Formular festgelegt wurden, werden durch diese JSON-Konfiguration überschrieben.",
"Built-in": "Eingebaut",
"Config reference: ": "Konfigurationsreferenz: ",
"Table": "Tabelle",
"Sum": "Summe",
"Avg": "Durchschnitt",
"Count": "Anzahl",
"Min": "Minimum",
"Max": "Maximum",
"Please select a chart type.": "Bitte wählen Sie einen Diagrammtyp aus.",
"Collection": "Sammlung",
"isStack": "istGestapelt",
"isPercent": "istProzent",
"isGroup": "istGruppiert",
"smooth": "geglättet",
"Collapse": "Einklappen",
"Expand": "Erweitern",
"Current filter": "Aktueller Filter",
"Add custom field": "Benutzerdefiniertes Feld hinzufügen",
"To filter with custom fields, use \"Current filter\" variables in the chart configuration.": "Um mit benutzerdefinierten Feldern zu filtern, verwenden Sie die Variablen \"Aktueller Filter\" in der Diagrammkonfiguration.",
"Input": "Eingabe",
"Date range": "Datumsbereich",
"Time range": "Zeitbereich",
"Edit field properties": "Feldeigenschaften bearbeiten",
"Select a source field to use metadata of the field": "Wählen Sie ein Quellfeld aus, um Metadaten des Feldes zu verwenden",
"Original field": "Ursprüngliches Feld",
"Transformation": "Transformation",
"Add transformation": "Transformation hinzufügen",
"Container": "Container",
"Show border": "Rahmen anzeigen",
"Transformation tip": "Felder erlauben mehrere Transformationen, die nacheinander angewendet werden. Achten Sie auf Datentypenänderungen nach jeder Transformation. Drag-and-Drop-Funktionalität ermöglicht die Anpassung der Transformationsreihenfolge.",
"Type conversion": "Typumwandlung",
"Transformer": "Transformator",
"Size": "Größe",
"Width": "Breite",
"Height": "Höhe",
"Aspect ratio": "Seitenverhältnis",
"Fixed height": "Feste Höhe",
"Show background": "Hintergrund anzeigen",
"Show padding": "Abstand anzeigen",
"Distinct": "Eindeutig",
"Auto refresh": "Automatische Aktualisierung"
}

View File

@ -72,10 +72,11 @@
"isPercent": "èPercentuale", "isPercent": "èPercentuale",
"isGroup": "èGruppo", "isGroup": "èGruppo",
"smooth": "smussato", "smooth": "smussato",
"Collapse": "Comprimi",
"Expand": "Espandi", "Expand": "Espandi",
"Current filter": "Filtro corrente", "Current filter": "Filtro corrente",
"Add custom field": "Aggiungi campo personalizzato", "Add custom field": "Aggiungi campo personalizzato",
"To filter with custom fields, use \"Current filter\" variables in the chart configuration.": "Per filtrare con campi personalizzati, utilizza le variabili \"Filtro corrente\" nella configurazione del grafico.", "To filter with custom fields, use \"Current filter\" variables in the chart configuration.": "Per filtrare con campi personalizzati, utilizza le variabili \"Current filter\" nella configurazione del grafico.",
"Input": "Input", "Input": "Input",
"Date range": "Intervallo date", "Date range": "Intervallo date",
"Time range": "Intervallo tempo", "Time range": "Intervallo tempo",

View File

@ -0,0 +1,16 @@
{
"Environment": "Umgebung",
"Variables and secrets": "Variablen und Geheimnisse",
"Variables": "Variablen",
"Secrets": "Geheimnisse",
"Add variable": "Variable hinzufügen",
"Bulk import": "Massenimport",
"Name": "Name",
"Value": "Wert",
"Type": "Typ",
"Plain text": "Klartext",
"Encrypted": "Verschlüsselt",
"Delete variable": "Variable löschen",
"Restart now": "Jetzt neu starten",
"Variables and secrets have been updated. A restart is required for the changes to take effect.": "Variablen und Geheimnisse wurden aktualisiert. Ein Neustart ist erforderlich, damit die Änderungen wirksam werden."
}

View File

@ -0,0 +1,16 @@
{
"Environment": "Ambiente",
"Variables and secrets": "Variabili e segreti",
"Variables": "Variabili",
"Secrets": "Segreti",
"Add variable": "Aggiungi variabile",
"Bulk import": "Importazione in blocco",
"Name": "Nome",
"Value": "Valore",
"Type": "Tipo",
"Plain text": "Testo semplice",
"Encrypted": "Crittografato",
"Delete variable": "Elimina variabile",
"Restart now": "Riavvia ora",
"Variables and secrets have been updated. A restart is required for the changes to take effect.": "Rilevati aggiornamenti a variabili e segreti. È necessario un riavvio per applicare le modifiche."
}

View File

@ -0,0 +1,6 @@
{
"unique violation": "{{field}} existiert bereits",
"notNull violation": "{{field}} darf nicht null sein",
"Validation error": "{{field}} Validierungsfehler",
"notNull Violation": "{{field}} darf nicht null sein"
}

View File

@ -0,0 +1,9 @@
{
"Formula": "Formel",
"Calculation engine": "Berechnungs-Engine",
"Expression": "Ausdruck",
"Expression syntax error": "Ausdruckssyntaxfehler",
"Syntax references": "Syntaxreferenzen",
"Compute a value based on the other fields": "Berechnen Sie einen Wert basierend auf den anderen Feldern",
"Configure and store the results of calculations between multiple field values in the same record, supporting both Math.js and Excel formula functions.": "Konfigurieren und speichern Sie die Ergebnisse von Berechnungen zwischen mehreren Feldwerten im selben Datensatz, unterstützt sowohl Math.js als auch Excel-Formelfunktionen."
}

View File

@ -0,0 +1,4 @@
{
"Many to many (array)": "Viele-zu-viele (Array)",
"Many to many (array) description": "Ermöglicht die Erstellung von Viele-zu-viele-Beziehungen zwischen zwei Modellen durch Speicherung eines Arrays eindeutiger Schlüssel des Zielmodells."
}

View File

@ -0,0 +1,33 @@
{
"Vditor": "Markdown(Vditor)",
"File collection": "Dateisammlung",
"Used to store files uploaded in the Markdown editor": "Wird verwendet, um Dateien zu speichern, die im Markdown-Editor hochgeladen wurden",
"Toolbar": "Editor-Symbolleistenkonfiguration",
"Emoji": "Emoji",
"Headings": "Überschriften",
"Bold": "Fett",
"Italic": "Kursiv",
"Strike": "Durchgestrichen",
"Record": "Aufnahme starten/Aufnahme beenden",
"Line": "Linie",
"Quote": "Zitat",
"List": "Liste",
"OrderedList": "Geordnete Liste",
"Check": "Aufgabenliste",
"Outdent": "Ausrücken",
"Indent": "Einrücken",
"Code": "Codeblock",
"InlineCode": "Inline-Code",
"InsertAfter": "Zeile danach einfügen",
"InsertBefore": "Zeile davor einfügen",
"Undo": "Rückgängig",
"Redo": "Wiederholen",
"Upload": "Bild oder Datei hochladen",
"Link": "Link",
"Table": "Tabelle",
"EditMode": "Bearbeitungsmodus",
"Both": "Editor & Vorschau",
"Preview": "Vorschau",
"Fullscreen": "Vollbild umschalten",
"Outline": "Gliederung"
}

View File

@ -0,0 +1,37 @@
{
"Sequence": "Sequenz",
"Automatically generate codes based on configured rules, supporting combinations of dates, numbers, and text.": "Generieren Sie automatisch Codes basierend auf konfigurierten Regeln, unterstützt Kombinationen aus Datum, Zahlen und Text.",
"Sequence rules": "Sequenzregeln",
"Add rule": "Regel hinzufügen",
"Inputable": "Eingabefähig",
"Match rules": "Übereinstimmungsregeln",
"Type": "Typ",
"Autoincrement": "Automatische Erhöhung",
"Fixed text": "Fester Text",
"Text content": "Textinhalt",
"Date": "Datum",
"Date format": "Datumsformat",
"Supports all formats of the Day.js library, such as \"YYYYMMDD\", \"YYYY-MM-DD\", etc.": "Unterstützt alle Formate der Day.js-Bibliothek, wie \"YYYYMMDD\", \"YYYY-MM-DD\" usw.",
"Rule content": "Regelinhalt",
"{{value}} Digits": "{{value}} Ziffern",
"Digits": "Ziffern",
"Start from": "Beginnen bei",
"Starts from {{value}}": "Beginnt bei {{value}}",
"Reset cycle": "Zurücksetzungszyklus",
"No reset": "Kein Zurücksetzen",
"Daily": "Täglich",
"Every Monday": "Jeden Montag",
"Monthly": "Monatlich",
"Yearly": "Jährlich",
"Operations": "Operationen",
"Customize": "Anpassen",
"Random character": "Zufälliges Zeichen",
"Length": "Länge",
"Will generate random characters with specified length.": "Generiert zufällige Zeichen mit angegebener Länge.",
"Character sets": "Zeichensätze",
"Select character sets to generate random characters.": "Wählen Sie Zeichensätze zur Generierung zufälliger Zeichen.",
"Number": "Zahl",
"Lowercase letters": "Kleinbuchstaben",
"Uppercase letters": "Großbuchstaben",
"Symbols": "Symbole"
}

View File

@ -21,4 +21,17 @@
"Yearly": "Annuale", "Yearly": "Annuale",
"Operations": "Operazioni", "Operations": "Operazioni",
"Customize": "Personalizza" "Customize": "Personalizza"
"Automatically generate codes based on configured rules, supporting combinations of dates, numbers, and text.": "Genera automaticamente codici basati su regole configurate, supportando combinazioni di date, numeri e testo.",
"Date": "Data",
"Date format": "Formato data",
"Supports all formats of the Day.js library, such as \"YYYYMMDD\", \"YYYY-MM-DD\", etc.": "Supporta tutti i formati della libreria Day.js, come \"YYYYMMDD\", \"YYYY-MM-DD\", ecc.",
"Random character": "Carattere casuale",
"Length": "Lunghezza",
"Will generate random characters with specified length.": "Genererà caratteri casuali con la lunghezza specificata.",
"Character sets": "Set di caratteri",
"Select character sets to generate random characters.": "Seleziona i set di caratteri per generare caratteri casuali.",
"Number": "Numero",
"Lowercase letters": "Lettere minuscole",
"Uppercase letters": "Lettere maiuscole",
"Symbols": "Simboli"
} }

View File

@ -20,7 +20,6 @@
"@types/multer": "^1.4.5", "@types/multer": "^1.4.5",
"antd": "5.x", "antd": "5.x",
"cos-nodejs-sdk-v5": "^2.11.14", "cos-nodejs-sdk-v5": "^2.11.14",
"iconv-lite": "^0.6.3",
"koa-static": "^5.0.0", "koa-static": "^5.0.0",
"mime-match": "^1.0.2", "mime-match": "^1.0.2",
"mkdirp": "~0.5.4", "mkdirp": "~0.5.4",

View File

@ -10,7 +10,7 @@
export const FILE_FIELD_NAME = 'file'; export const FILE_FIELD_NAME = 'file';
export const LIMIT_FILES = 1; export const LIMIT_FILES = 1;
export const FILE_SIZE_LIMIT_MIN = 1; export const FILE_SIZE_LIMIT_MIN = 1;
export const FILE_SIZE_LIMIT_MAX = 1024 * 1024 * 1024; export const FILE_SIZE_LIMIT_MAX = Number.POSITIVE_INFINITY;
export const FILE_SIZE_LIMIT_DEFAULT = 1024 * 1024 * 20; export const FILE_SIZE_LIMIT_DEFAULT = 1024 * 1024 * 20;
export const STORAGE_TYPE_LOCAL = 'local'; export const STORAGE_TYPE_LOCAL = 'local';

View File

@ -0,0 +1,41 @@
{
"File collection": "Dateisammlung",
"File name": "Dateiname",
"Extension name": "Erweiterungsname",
"Size": "Größe",
"File size limit": "Dateigrößenbegrenzung",
"Minimum from 1 byte, maximum up to 1GB.": "Minimum 1 Byte, Maximum bis zu 1GB.",
"File manager": "Dateimanager",
"Attachment": "Anhang",
"MIME type": "MIME-Typ",
"File type (in MIME type format)": "Dateityp (im MIME-Typ-Format)",
"Multi-types seperated with comma, for example: \"image/*\", \"image/png\", \"image/*, application/pdf\" etc.": "Mehrere Typen durch Kommas getrennt, zum Beispiel: \"image/*\", \"image/png\", \"image/*, application/pdf\" usw.",
"URL": "URL",
"File storage": "Dateispeicher",
"Allow uploading multiple files": "Hochladen mehrerer Dateien erlauben",
"Storage": "Speicher",
"Storages": "Speicher",
"Storage display name": "Anzeigename des Speichers",
"Storage name": "Speichername",
"Storage type": "Speichertyp",
"Default storage": "Standardspeicher",
"Storage base URL": "Basis-URL des Speichers",
"Access base URL": "Basis-URL für den Zugriff",
"Base URL for file access, could be your CDN base URL. For example: \"https://cdn.nocobase.com\".": "Basis-URL für den Dateizugriff, könnte Ihre CDN-Basis-URL sein. Zum Beispiel: \"https://cdn.nocobase.com\".",
"Destination": "Ziel",
"Use the built-in static file server": "Den integrierten statischen Dateiserver verwenden",
"Local storage": "Lokaler Speicher",
"Aliyun OSS": "Aliyun OSS",
"Amazon S3": "Amazon S3",
"Tencent COS": "Tencent COS",
"Region": "Region",
"Bucket": "Bucket",
"Path": "Pfad",
"Relative path the file will be saved to. Left blank as root path. The leading and trailing slashes \"/\" will be ignored. For example: \"user/avatar\".": "Relativer Pfad, in dem die Datei gespeichert wird. Leer lassen als Stammpfad. Die führenden und abschließenden Schrägstriche \"/\" werden ignoriert. Zum Beispiel: \"user/avatar\".",
"Filename": "Dateiname",
"Will be used for API": "Wird für API verwendet",
"Default storage will be used when not selected": "Wenn nicht ausgewählt, wird der Standardspeicher verwendet",
"Keep file in storage when destroy record": "Datei im Speicher behalten, wenn Datensatz gelöscht wird",
"See more": "Mehr anzeigen",
"Aliyun OSS region part of the bucket. For example: \"oss-cn-beijing\".": "Aliyun OSS-Regionsteil des Buckets. Zum Beispiel: \"oss-cn-beijing\"."
}

View File

@ -19,4 +19,24 @@
"Filename": "Nome file", "Filename": "Nome file",
"See more": "Vedi altro", "See more": "Vedi altro",
"Will be used for API": "Sarà utilizzato per l'API" "Will be used for API": "Sarà utilizzato per l'API"
{
"File collection": "Raccolta file",
"File name": "Nome file",
"Extension name": "Nome estensione",
"Size": "Dimensione file",
"File size limit": "Limite dimensione file",
"Minimum from 1 byte, maximum up to 1GB.": "Minimo da 1 byte, massimo fino a 1GB.",
"File type (in MIME type format)": "Tipo di file (in formato MIME)",
"Multi-types seperated with comma, for example: \"image/*\", \"image/png\", \"image/*, application/pdf\" etc.": "Più tipi separati da virgola, ad esempio: \"image/*\", \"image/png\", \"image/*, application/pdf\" ecc.",
"URL": "URL",
"File storage": "Archiviazione file",
"Allow uploading multiple files": "Consenti caricamento di più file",
"Storage": "Spazio di archiviazione",
"Storages": "Spazi di archiviazione",
"Access base URL": "URL base accesso",
"Base URL for file access, could be your CDN base URL. For example: \"https://cdn.nocobase.com\".": "URL base per l'accesso ai file, potrebbe essere l'URL base del tuo CDN. Ad esempio: \"https://cdn.nocobase.com\".",
"Relative path the file will be saved to. Left blank as root path. The leading and trailing slashes \"/\" will be ignored. For example: \"user/avatar\".": "Percorso relativo in cui verrà salvato il file. Lasciare vuoto per il percorso radice. Le barre iniziali e finali \"/\" verranno ignorate. Ad esempio: \"user/avatar\".",
"Default storage will be used when not selected": "Se non selezionato verrà utilizzato lo spazio di archiviazione predefinito",
"Keep file in storage when destroy record": "Quando elimini il record mantieni il file nello spazio di archiviazione",
"Aliyun OSS region part of the bucket. For example: \"oss-cn-beijing\".": "Parte della regione Aliyun OSS del bucket. Ad esempio: \"oss-cn-beijing\"."
} }

View File

@ -9,9 +9,9 @@
import { promises as fs } from 'fs'; import { promises as fs } from 'fs';
import path from 'path'; import path from 'path';
import querystring from 'querystring';
import { getApp } from '.'; import { getApp } from '.';
import { FILE_FIELD_NAME, FILE_SIZE_LIMIT_DEFAULT, STORAGE_TYPE_LOCAL } from '../../constants'; import { FILE_FIELD_NAME, FILE_SIZE_LIMIT_DEFAULT, STORAGE_TYPE_LOCAL } from '../../constants';
import PluginFileManagerServer from '../server';
const { LOCAL_STORAGE_BASE_URL, LOCAL_STORAGE_DEST = 'storage/uploads', APP_PORT = '13000' } = process.env; const { LOCAL_STORAGE_BASE_URL, LOCAL_STORAGE_DEST = 'storage/uploads', APP_PORT = '13000' } = process.env;
@ -105,6 +105,35 @@ describe('action', () => {
const content = await agent.get(url); const content = await agent.get(url);
expect(content.text.includes('Hello world!')).toBeTruthy(); expect(content.text.includes('Hello world!')).toBeTruthy();
}); });
it('filename with special character (URL)', async () => {
const rawText = '[]中文报告! 1%~50.4% (123) {$#}';
const rawFilename = `${rawText}.txt`;
const { body } = await agent.resource('attachments').create({
[FILE_FIELD_NAME]: path.resolve(__dirname, `./files/${rawFilename}`),
});
const matcher = {
title: rawText,
extname: '.txt',
path: '',
mimetype: 'text/plain',
meta: {},
storageId: 1,
};
// 文件上传和解析是否正常
expect(body.data).toMatchObject(matcher);
// 文件的 url 是否正常生成
expect(body.data.url).toBe(`${DEFAULT_LOCAL_BASE_URL}${body.data.path}/${body.data.filename}`);
const encodedFilename = querystring.escape(rawFilename);
// console.log('-----------', body.data, encodedFilename);
// 文件的 url 是否正常访问
// TODO: mock-server is not start within gateway, static url can not be accessed
// const res2 = await agent.get(`${DEFAULT_LOCAL_BASE_URL}${body.data.path}/${encodedFilename}`);
// expect(res2.text).toBe(rawText);
});
}); });
describe('specific storage', () => { describe('specific storage', () => {

View File

@ -0,0 +1 @@
[]中文报告! 1%~50.4% (123) {$#}

View File

@ -12,13 +12,7 @@ import { koaMulter as multer } from '@nocobase/utils';
import Path from 'path'; import Path from 'path';
import Plugin from '..'; import Plugin from '..';
import { import { FILE_FIELD_NAME, FILE_SIZE_LIMIT_DEFAULT, FILE_SIZE_LIMIT_MIN, LIMIT_FILES } from '../../constants';
FILE_FIELD_NAME,
FILE_SIZE_LIMIT_DEFAULT,
FILE_SIZE_LIMIT_MAX,
FILE_SIZE_LIMIT_MIN,
LIMIT_FILES,
} from '../../constants';
import * as Rules from '../rules'; import * as Rules from '../rules';
import { StorageClassType } from '../storages'; import { StorageClassType } from '../storages';
@ -90,10 +84,7 @@ async function multipart(ctx: Context, next: Next) {
}, },
storage: storageInstance.make(), storage: storageInstance.make(),
}; };
multerOptions.limits['fileSize'] = Math.min( multerOptions.limits['fileSize'] = Math.max(FILE_SIZE_LIMIT_MIN, storage.rules.size ?? FILE_SIZE_LIMIT_DEFAULT);
Math.max(FILE_SIZE_LIMIT_MIN, storage.rules.size ?? FILE_SIZE_LIMIT_DEFAULT),
FILE_SIZE_LIMIT_MAX,
);
const upload = multer(multerOptions).single(FILE_FIELD_NAME); const upload = multer(multerOptions).single(FILE_FIELD_NAME);
try { try {

View File

@ -7,13 +7,13 @@
* For more information, please refer to: https://www.nocobase.com/agreement. * For more information, please refer to: https://www.nocobase.com/agreement.
*/ */
import { uid } from '@nocobase/utils';
import iconv from 'iconv-lite';
import path from 'path'; import path from 'path';
import { uid } from '@nocobase/utils';
export function getFilename(req, file, cb) { export function getFilename(req, file, cb) {
const originalname = iconv.decode(Buffer.from(file.originalname, 'binary'), 'utf8'); const originalname = Buffer.from(file.originalname, 'binary').toString('utf8');
const baseName = path.basename(originalname, path.extname(originalname)); // Filename in Windows cannot contain the following characters: < > ? * | : " \ /
const baseName = path.basename(originalname.replace(/[<>?*|:"\\/]/g, '-'), path.extname(originalname));
cb(null, `${baseName}-${uid(6)}${path.extname(originalname)}`); cb(null, `${baseName}-${uid(6)}${path.extname(originalname)}`);
} }

View File

@ -0,0 +1,7 @@
{
"Title field": "Titelfeld",
"Time scale": "Zeitskala",
"Start date field": "Startdatumsfeld",
"End date field": "Enddatumsfeld",
"Progress field": "Fortschrittsfeld"
}

View File

@ -2,5 +2,6 @@
"Title field": "Campo titolo", "Title field": "Campo titolo",
"Time scale": "Scala temporale", "Time scale": "Scala temporale",
"Start date field": "Campo data di inizio", "Start date field": "Campo data di inizio",
"End date field": "Campo data di fine",
"Progress field": "Campo progresso" "Progress field": "Campo progresso"
} }

View File

@ -0,0 +1,16 @@
{
"Graph Collection": "Graphische Sammlung",
"Collection List": "Sammlungsliste",
"Full Screen": "Vollbild",
"Collection Search": "Sammlungssuche",
"Create Collection": "Sammlung erstellen",
"All Fields": "Alle Felder",
"Association Fields": "Assoziationsfelder",
"Choices fields": "Auswahlfelder",
"All relationships": "Alle Beziehungen",
"Entity relationship only": "Nur Entitätsbeziehungen",
"Inheritance relationship only": "Nur Vererbungsbeziehungen",
"Graphical interface": "Grafische Benutzeroberfläche",
"Auto layout": "Automatisches Layout",
"Selection": "Auswahl"
}

View File

@ -11,5 +11,6 @@
"Entity relationship only": "Solo Relazioni Entità", "Entity relationship only": "Solo Relazioni Entità",
"Inheritance relationship only": "Solo Relazioni Eredità", "Inheritance relationship only": "Solo Relazioni Eredità",
"Graphical interface": "Interfaccia Grafica", "Graphical interface": "Interfaccia Grafica",
"Auto layout": "Layout automatico",
"Selection": "Selezione" "Selection": "Selezione"
} }

View File

@ -0,0 +1,9 @@
{
"Used for sorting kanban cards, only sorting fields corresponding to grouping fields can be selected": "Wird zum Sortieren von Kanban-Karten verwendet, es können nur Sortierfelder ausgewählt werden, die den Gruppierungsfeldern entsprechen",
"Global sorting": "Globale Sortierung",
"Create sort field": "Sortierfeld erstellen",
"Convert the following integer fields to sorting fields": "Die folgenden Ganzzahlfelder in Sortierfelder umwandeln",
"Sorting field": "Sortierfeld",
"Grouped sorting based on": "Gruppierte Sortierung basierend auf",
"Enable drag and drop sorting": "Drag-and-Drop-Sortierung aktivieren"
}

View File

@ -4,5 +4,6 @@
"Create sort field": "Crea campo di ordinamento", "Create sort field": "Crea campo di ordinamento",
"Convert the following integer fields to sorting fields": "Converti i seguenti campi interi in campi di ordinamento", "Convert the following integer fields to sorting fields": "Converti i seguenti campi interi in campi di ordinamento",
"Sorting field": "Campo di ordinamento", "Sorting field": "Campo di ordinamento",
"Grouped sorting based on": "Ordinamento raggruppato basato su" "Grouped sorting based on": "Ordinamento raggruppato basato su",
"Enable drag and drop sorting": "Abilita l'ordinamento con drag and drop"
} }

View File

@ -0,0 +1,24 @@
{
"Edit": "Bearbeiten",
"Add new": "Neu hinzufügen",
"Localization management": "Lokalisierungsverwaltung",
"No data": "Keine Daten",
"Delete text": "Text löschen",
"Delete translation": "Übersetzung löschen",
"Module": "Modul",
"Text": "Text",
"Translation": "Übersetzung",
"Sync": "Synchronisieren",
"Current language": "Aktuelle Sprache",
"Keyword": "Stichwort",
"All": "Alle",
"No translation": "Keine Übersetzung",
"System & Plugins": "System & Plugins",
"User interfaces": "Benutzeroberflächen",
"Collections & Fields": "Sammlungen & Felder",
"Please select the resources you want to synchronize": "Bitte wählen Sie die Ressourcen aus, die Sie synchronisieren möchten",
"Menu": "Menü",
"Publish": "Veröffentlichen",
"Translations": "Übersetzungen",
"Localization": "Lokalisierung"
}

View File

@ -0,0 +1,9 @@
{
"Logger": "Logger",
"Search": "Suche",
"Download": "Herunterladen",
"Download logs": "Protokolle herunterladen",
"API request and response logs": "API-Anfrage- und Antwortprotokolle",
"Application, database, plugins and other system logs, the error level logs will be sent to": "Anwendungs-, Datenbank-, Plugin- und andere Systemprotokolle, die Fehlerprotokolle werden gesendet an",
"SQL execution logs, printed by Sequelize when the db logging is enabled": "SQL-Ausführungsprotokolle, die von Sequelize ausgegeben werden, wenn das DB-Logging aktiviert ist"
}

View File

@ -0,0 +1,51 @@
{
"Map": "Karte",
"Map-based geometry": "Kartenbasierte Geometrie",
"Map type": "Kartentyp",
"Point": "Punkt",
"Line": "Linie",
"Circle": "Kreis",
"Polygon": "Polygon",
"Access key": "Zugriffsschlüssel",
"securityJsCode or serviceHost": "securityJsCode oder serviceHost",
"AMap": "AMap",
"Google Maps": "Google Maps",
"Clear": "Löschen",
"Click to select the starting point and double-click to end the drawing": "Klicken Sie, um den Startpunkt auszuwählen, und doppelklicken Sie, um die Zeichnung zu beenden",
"Clear the canvas": "Leinwand löschen",
"Are you sure to clear the canvas?": "Sind Sie sicher, dass Sie die Leinwand löschen möchten?",
"Confirm": "Bestätigen",
"Cancel": "Abbrechen",
"Enter keywords to search": "Geben Sie Suchbegriffe ein",
"The AccessKey is incorrect, please check it": "Der Zugriffsschlüssel ist falsch, bitte überprüfen Sie ihn",
"Please configure the AMap securityCode or serviceHost correctly": "Bitte konfigurieren Sie den AMap securityCode oder serviceHost korrekt",
"Map manager": "Karten-Manager",
"Configuration": "Konfiguration",
"Saved successfully": "Erfolgreich gespeichert",
"Saved failed": "Speichern fehlgeschlagen",
"Edit": "Bearbeiten",
"Save": "Speichern",
"Please configure the AccessKey and SecurityJsCode first": "Bitte konfigurieren Sie zuerst den AccessKey und SecurityJsCode",
"Go to the configuration page": "Zur Konfigurationsseite gehen",
"Zoom": "Zoom",
"Set default zoom level": "Standard-Zoomstufe festlegen",
"The default zoom level of the map": "Die Standard-Zoomstufe der Karte",
"Edit field title": "Feldtitel bearbeiten",
"Field title": "Feldtitel",
"Edit tooltip": "Tooltip bearbeiten",
"Delete field": "Feld löschen",
"Required": "Erforderlich",
"Pattern": "Muster",
"Operator": "Operator",
"Editable": "Bearbeitbar",
"Readonly": "Schreibgeschützt",
"Easy-reading": "Leicht lesbar",
"Edit description": "Beschreibung bearbeiten",
"Map field": "Kartenfeld",
"Marker field": "Markierungsfeld",
"Load google maps failed, Please check the Api key and refresh the page": "Google Maps konnte nicht geladen werden. Bitte überprüfen Sie den API-Schlüssel und aktualisieren Sie die Seite",
"Create map block": "Kartenblock erstellen",
"Start point": "Startpunkt",
"End point": "Endpunkt",
"Concatenation order field": "Verkettungsreihenfolgefeld"
}

View File

@ -0,0 +1,32 @@
{
"Mobile Client-side(Deprecated)": "Mobile Client-Seite (Veraltet)",
"Interface Configuration": "Schnittstellenkonfiguration",
"App Configuration": "App-Konfiguration",
"Enable TabBar": "TabBar aktivieren",
"Untitled": "Ohne Titel",
"Edit info": "Informationen bearbeiten",
"Title": "Titel",
"Display back button": "Zurück-Button anzeigen",
"Delete menu": "Menü löschen",
"Edit menu info": "Menüinformationen bearbeiten",
"Menu": "Menü",
"Menu name": "Menüname",
"Icon": "Symbol",
"Delete menu item?": "Menüelement löschen?",
"Add menu item": "Menüelement hinzufügen",
"Page template": "Seitenvorlage",
"Template mode": "Vorlagenmodus",
"Enable Header": "Header aktivieren",
"Enable Tabs": "Tabs aktivieren",
"Delete tab item?": "Tab-Element löschen?",
"Add tab": "Tab hinzufügen",
"App level Configuration": "App-Ebenen-Konfiguration",
"Menu configuration": "Menükonfiguration",
"Page configuration": "Seitenkonfiguration",
"Settings": "Einstellungen",
"Delete settings block": "Einstellungsblock löschen",
"Delete menu block": "Menüblock löschen",
"Mobile client access address": "Zugangsadresse für mobile Clients",
"The full address is": "Die vollständige Adresse ist",
"Preview": "Vorschau"
}

View File

@ -7,7 +7,7 @@
* For more information, please refer to: https://www.nocobase.com/agreement. * For more information, please refer to: https://www.nocobase.com/agreement.
*/ */
import React, { useState, useCallback } from 'react'; import React, { useState, useCallback, useEffect, useRef } from 'react';
import { DatePicker, Picker } from 'antd-mobile'; import { DatePicker, Picker } from 'antd-mobile';
import { Space, Select } from 'antd'; import { Space, Select } from 'antd';
import { import {
@ -18,7 +18,11 @@ import {
inferPickerType, inferPickerType,
TimePicker as NBTimePicker, TimePicker as NBTimePicker,
mapTimeFormat, mapTimeFormat,
useVariables,
isVariable,
useLocalVariables,
} from '@nocobase/client'; } from '@nocobase/client';
import { autorun } from '@formily/reactive';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { connect, mapProps, mapReadPretty, useField, useFieldSchema } from '@formily/react'; import { connect, mapProps, mapReadPretty, useField, useFieldSchema } from '@formily/react';
import { getPickerFormat } from '@nocobase/utils/client'; import { getPickerFormat } from '@nocobase/utils/client';
@ -52,8 +56,41 @@ const MobileDateTimePicker = connect(
...rest ...rest
} = props; } = props;
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const { parseVariable } = useVariables() || {};
const localVariables = useLocalVariables();
const [minDate, setMinDate] = useState(null);
const [maxDate, setMaxDate] = useState(null);
const disposeRef = useRef(null);
useEffect(() => {
if (disposeRef.current) {
disposeRef.current();
}
disposeRef.current = autorun(() => {
limitDate();
});
return () => {
disposeRef.current();
};
}, [props._maxDate, props._minDate, localVariables, parseVariable]);
const limitDate = async () => {
// dayjs() 如果传入 undefined 可能会被解析成当前时间
let minDateTimePromise = props._minDate ? Promise.resolve(dayjs(props._minDate)) : Promise.resolve(null);
let maxDateTimePromise = props._maxDate ? Promise.resolve(dayjs(props._maxDate)) : Promise.resolve(null);
if (isVariable(props._maxDate)) {
maxDateTimePromise = parseVariable(props._maxDate, localVariables).then((result) => dayjs(result.value));
}
if (isVariable(props._minDate)) {
minDateTimePromise = parseVariable(props._minDate, localVariables).then((result) => dayjs(result.value));
}
const [minDateTime, maxDateTime] = await Promise.all([minDateTimePromise, maxDateTimePromise]);
setMinDate(minDateTime ? minDateTime.toDate() : null);
setMaxDate(maxDateTime ? maxDateTime.toDate() : null);
};
// 性能优化:使用 useCallback 缓存函数
const handleConfirm = useCallback( const handleConfirm = useCallback(
(value) => { (value) => {
setVisible(false); setVisible(false);
@ -79,7 +116,6 @@ const MobileDateTimePicker = connect(
return data; return data;
} }
}, []); }, []);
return ( return (
<> <>
<div contentEditable="false" onClick={() => !disabled && setVisible(true)}> <div contentEditable="false" onClick={() => !disabled && setVisible(true)}>
@ -104,8 +140,8 @@ const MobileDateTimePicker = connect(
}} }}
precision={showTime && picker === 'date' ? getPrecision(timeFormat) : picker === 'date' ? 'day' : picker} precision={showTime && picker === 'date' ? getPrecision(timeFormat) : picker === 'date' ? 'day' : picker}
renderLabel={labelRenderer} renderLabel={labelRenderer}
min={rest.min || new Date(1000, 0, 1)} min={minDate || rest.min || new Date(1000, 0, 1)}
max={rest.max || new Date(9999, 11, 31)} max={maxDate || rest.max || new Date(9999, 11, 31)}
onConfirm={(val) => { onConfirm={(val) => {
handleConfirm(val); handleConfirm(val);
}} }}

View File

@ -0,0 +1,35 @@
{
"Fill": "Füllen",
"App settings": "App-Einstellungen",
"Page settings": "Seiteneinstellungen",
"Info": "Info",
"Back": "Zurück",
"Link": "Link",
"Remove": "Entfernen",
"Add page": "Seite hinzufügen",
"Title": "Titel",
"Icon": "Symbol",
"Selected icon": "Ausgewähltes Symbol",
"Add link": "Link hinzufügen",
"Display tab bar": "Tab-Leiste anzeigen",
"Display page header": "Seitenkopf anzeigen",
"Display navigation bar": "Navigationsleiste anzeigen",
"Display page title": "Seitentitel anzeigen",
"Display tabs": "Tabs anzeigen",
"Add tab": "Tab hinzufügen",
"Mobile": "Mobil",
"Title field is required": "Titelfeld ist erforderlich",
"Icon field is required": "Symbolfeld ist erforderlich",
"Desktop data blocks": "Desktop-Datenblöcke",
"Other desktop blocks": "Andere Desktop-Blöcke",
"Settings": "Einstellungen",
"Mobile menu": "Mobiles Menü",
"Mobile routes": "Mobile Routen",
"No accessible pages found": "Keine zugänglichen Seiten gefunden",
"This might be due to permission configuration issues": "Dies könnte auf Probleme mit der Berechtigungskonfiguration zurückzuführen sein",
"Select time": "Zeit auswählen",
"Clear": "Löschen",
"Confirm": "Bestätigen",
"Cancel": "Abbrechen",
"Display < back button": "< Zurück-Schaltfläche anzeigen"
}

View File

@ -26,4 +26,10 @@
"No accessible pages found": "Nessuna pagina accessibile trovata", "No accessible pages found": "Nessuna pagina accessibile trovata",
"This might be due to permission configuration issues": "Questo potrebbe essere dovuto a problemi di configurazione dei permessi", "This might be due to permission configuration issues": "Questo potrebbe essere dovuto a problemi di configurazione dei permessi",
"Select time":"Seleziona orario" "Select time":"Seleziona orario"
"Fill": "Riempimento",
"Mobile routes": "Percorsi mobile",
"Clear": "Cancella",
"Confirm": "Conferma",
"Cancel": "Annulla",
"Display < back button": "Visualizza pulsante < indietro"
} }

View File

@ -0,0 +1,14 @@
{
"Multi-app manager": "Multi-App-Manager",
"Applications": "Anwendungen",
"App display name": "App-Anzeigename",
"App ID": "App-ID",
"Pin to menu": "An Menü anheften",
"Custom domain": "Benutzerdefinierte Domain",
"Manage applications": "Anwendungen verwalten",
"Standalone deployment": "Eigenständige Bereitstellung",
"Auto start": "Automatischer Start",
"Start mode": "Startmodus",
"Start on first visit": "Beim ersten Besuch starten",
"Start with main application": "Mit Hauptanwendung starten"
}

View File

@ -8,4 +8,7 @@
"Manage applications": "Gestisci applicazioni", "Manage applications": "Gestisci applicazioni",
"Standalone deployment": "Distribuzione autonoma", "Standalone deployment": "Distribuzione autonoma",
"Auto start": "Avvio automatico" "Auto start": "Avvio automatico"
"Start mode": "Modalità di avvio",
"Start on first visit": "Avvia alla prima visita",
"Start with main application": "Avvia con l'applicazione principale"
} }

View File

@ -0,0 +1,12 @@
{
"Share collections": "Sammlungen teilen",
"Unshared collections": "Nicht geteilte Sammlungen",
"Shared collections": "Geteilte Sammlungen",
"All categories": "Alle Kategorien",
"Enter name or title...": "Name oder Titel eingeben...",
"Are you sure to add the following collections?": "Sind Sie sicher, dass Sie die folgenden Sammlungen hinzufügen möchten?",
"Are you sure to remove the following collections?": "Sind Sie sicher, dass Sie die folgenden Sammlungen entfernen möchten?",
"Collection display name": "Anzeigename der Sammlung",
"Collection name": "Sammlungsname",
"Collection category": "Sammlungskategorie"
}

View File

@ -0,0 +1,22 @@
{
"Email": "E-Mail",
"From": "Von",
"To": "An",
"CC": "CC",
"BCC": "BCC",
"Add email address": "E-Mail-Adresse hinzufügen",
"Subject": "Betreff",
"Content": "Inhalt",
"Host": "Host",
"Port": "Port",
"Secure": "Sicher",
"Account": "Konto",
"Password" : "Passwort",
"Configure": "Konfigurieren",
"The email address that will be used as the sender": "Die E-Mail-Adresse, die als Absender verwendet wird",
"SMTP mail": "SMTP-E-Mail",
"SMTP server host": "SMTP-Server-Host",
"Content type": "Inhaltstyp",
"Plain text": "Einfacher Text",
"Transport": "Transport"
}

View File

@ -0,0 +1,29 @@
{
"Inbox": "Posteingang",
"Message": "Nachricht",
"Loading": "Wird geladen",
"Loading more": "Mehr laden",
"No more": "Keine weiteren",
"Loading failed,": "Laden fehlgeschlagen,",
"please reload": "bitte neu laden",
"Detail": "Detail",
"Content": "Inhalt",
"Datetime": "Datum/Uhrzeit",
"Status": "Status",
"All": "Alle",
"Read": "Gelesen",
"Unread": "Ungelesen",
"In-app message": "In-App-Nachricht",
"Receivers": "Empfänger",
"Channel name": "Kanalname",
"Message group name": "Nachrichtengruppenname",
"Message title": "Nachrichtentitel",
"Message content": "Nachrichteninhalt",
"detail URL": "Detail-URL",
"Details page for desktop": "Detailseite für Desktop",
"Support two types of links: internal links and external links. If using an internal link, the link starts with\"/\", for example, \"/admin\". If using an external link, the link starts with \"http\", for example, \"https://example.com\".": "Unterstützt zwei Arten von Links: interne Links und externe Links. Bei Verwendung eines internen Links beginnt der Link mit \"/\", zum Beispiel \"/admin\". Bei Verwendung eines externen Links beginnt der Link mit \"http\", zum Beispiel \"https://example.com\".",
"Mark as read": "Als gelesen markieren",
"Support two types of links: internal links and external links. If using an internal link, the link starts with\"/\", for example, \"/m\". If using an external link, the link starts with \"http\", for example, \"https://example.com\".": "Unterstützt zwei Arten von Links: interne Links und externe Links. Bei Verwendung eines internen Links beginnt der Link mit \"/\", zum Beispiel \"/m\". Bei Verwendung eines externen Links beginnt der Link mit \"http\", zum Beispiel \"https://example.com\".",
"Details page for mobile": "Detailseite für Mobilgeräte",
"The message page has already been created.": "Die Nachrichtenseite wurde bereits erstellt."
}

View File

@ -24,5 +24,6 @@
"Mark as read": "Segna come letto", "Mark as read": "Segna come letto",
"Support two types of links: internal links and external links. If using an internal link, the link starts with\"/\", for example, \"/m\". If using an external link, the link starts with \"http\", for example, \"https://example.com\".": "Supporta due tipi di link: link interni e link esterni. Se si utilizza un link interno, il link inizia con \"/\", ad esempio, \"/m\". Se si utilizza un link esterno, il link inizia con \"http\", ad esempio, \"https://example.com\".", "Support two types of links: internal links and external links. If using an internal link, the link starts with\"/\", for example, \"/m\". If using an external link, the link starts with \"http\", for example, \"https://example.com\".": "Supporta due tipi di link: link interni e link esterni. Se si utilizza un link interno, il link inizia con \"/\", ad esempio, \"/m\". Se si utilizza un link esterno, il link inizia con \"http\", ad esempio, \"https://example.com\".",
"Details page for mobile": "Pagina dettagli per mobile", "Details page for mobile": "Pagina dettagli per mobile",
"The message page has already been created.": "La pagina dei messaggi è già stata creata." "The message page has already been created.": "La pagina dei messaggi è già stata creata.",
"When select receivers from node result, only support ID of user (or IDs array of users). Others will not match any user.": "Quando selezioni i destinatari dal risultato del nodo, supporta solo l'ID dell'utente (o l'array di ID degli utenti). Gli altri non corrisponderanno a nessun utente."
} }

View File

@ -0,0 +1,43 @@
{
"Notification Management": "Benachrichtigungsverwaltung",
"Notification": "Benachrichtigung",
"Channels": "Kanäle",
"Channel": "Kanal",
"Channel title": "Kanaltitel",
"Channel name": "Kanalname",
"Channel display name": "Kanalanzeigename",
"Content": "Inhalt",
"Receivers": "Empfänger",
"Receiver": "Empfänger",
"Add new receiver": "Neuen Empfänger hinzufügen",
"Templates": "Vorlagen",
"Logs": "Protokolle",
"Title": "Titel",
"Description": "Beschreibung",
"Notification type": "Benachrichtigungstyp",
"Actions": "Aktionen",
"Configure": "Konfigurieren",
"Add new": "Neu hinzufügen",
"Trigger from": "Auslöser von",
"Status": "Status",
"Created at": "Erstellt am",
"Delete record": "Datensatz löschen",
"Are you sure you want to delete it?": "Sind Sie sicher, dass Sie es löschen möchten?",
"Deleted successfully!": "Erfolgreich gelöscht!",
"Add user": "Benutzer hinzufügen",
"Select users": "Benutzer auswählen",
"Query users": "Benutzer abfragen",
"Receiver type": "Empfängertyp",
"Manual input": "Manuelle Eingabe",
"Select user": "Benutzer auswählen",
"No channel enabled yet": "Noch kein Kanal aktiviert",
"Success": "Erfolg",
"Fail": "Fehlschlag",
"Failure": "Fehlschlag",
"Reason": "Grund",
"Failed reason": "Fehlergrund",
"Log detail": "Protokolldetail",
"Message": "Nachricht",
"Notification manager": "Benachrichtigungsmanager",
"Randomly generated and can not be modified. Support letters, numbers and underscores, must start with an letter.": "Zufällig generiert und kann nicht geändert werden. Unterstützt Buchstaben, Zahlen und Unterstriche, muss mit einem Buchstaben beginnen."
}

View File

@ -4,8 +4,6 @@
"Channels": "Canali", "Channels": "Canali",
"Channel": "Canale", "Channel": "Canale",
"Channel title": "Titolo canale", "Channel title": "Titolo canale",
"Channel name": "Nome canale",
"Channel display name": "Nome visualizzato canale",
"Content": "Contenuto", "Content": "Contenuto",
"Receivers": "Destinatari", "Receivers": "Destinatari",
"Receiver": "Destinatario", "Receiver": "Destinatario",
@ -16,6 +14,8 @@
"Description": "Descrizione", "Description": "Descrizione",
"Notification type": "Tipo di notifica", "Notification type": "Tipo di notifica",
"Actions": "Azioni", "Actions": "Azioni",
"Channel name": "Nome canale",
"Channel display name": "Nome visualizzato canale",
"Configure": "Configura", "Configure": "Configura",
"Add new": "Aggiungi nuovo", "Add new": "Aggiungi nuovo",
"Trigger From": "Attivato da", "Trigger From": "Attivato da",
@ -28,6 +28,8 @@
"Select users": "Seleziona utenti", "Select users": "Seleziona utenti",
"Query users": "Cerca utenti", "Query users": "Cerca utenti",
"Receiver type": "Tipo di destinatario", "Receiver type": "Tipo di destinatario",
"Manual input": "Inserimento manuale",
"Select user": "Seleziona utente",
"No channel enabled yet": "Nessun canale ancora abilitato", "No channel enabled yet": "Nessun canale ancora abilitato",
"Success": "Successo", "Success": "Successo",
"Fail": "Fallito", "Fail": "Fallito",

Some files were not shown because too many files have changed in this diff Show More