Merge branch 'release/v1.0.0' of https://github.com/ONLYOFFICE/DocSpace into release/v1.0.0

# Conflicts:
#	packages/client/public/locales/ko-KR/CreateEditRoomDialog.json
This commit is contained in:
Svetlana Maleeva 2023-04-03 18:41:02 +03:00
commit 99d13d36f6
100 changed files with 1180 additions and 295 deletions

View File

@ -9,7 +9,10 @@
"FillingFormsRoomDescription": "Erstellen, teilen und füllen Sie Dokumentvorlagen oder arbeiten Sie mit den fertigen Voreinstellungen, um schnell Dokumente jeder Art zu erstellen.",
"Icon": "Icon",
"MakeRoomPrivateDescription": "Alle Dateien in diesem Raum werden verschlüsselt.",
"MakeRoomPrivateLimitationsWarningDescription": "Mit dieser Funktion können Sie nur bestehende DocSpace-Benutzer einladen. Nachdem Sie einen Raum erstellt haben, können Sie die Liste der Benutzer nicht mehr ändern.",
"MakeRoomPrivateTitle": "Machen Sie den Raum privat",
"ReviewRoomDescription": "Eine Überprüfung oder Kommentare zu den Dokumenten anfordern",
"ReviewRoomTitle": "Raum überprüfen",
"RoomEditing": "Bearbeitung von Räumen",
"RootLabel": "Root",
"TagsPlaceholder": "Tag hinzufügen",

View File

@ -69,6 +69,7 @@
"RemoveFromList": "Aus Liste entfernen",
"RemovedFromFavorites": "Aus Favoriten entfernt",
"Rename": "Umbenennen",
"RoomCreated": "Raum erstellt",
"RoomEmptyContainerDescription": "Bitte erstellen Sie den ersten Raum.",
"SendByEmail": "Per E-Mail senden",
"Share": "Freigeben",

View File

@ -5,6 +5,7 @@
"BusinessExpired": "Ihr {{planName}}-Plan ist am {{date}} abgelaufen",
"BusinessFinalDateInfo": "Das Abonnement wird automatisch am {{finalDate}} mit aktualisierten Preisen und Spezifikationen verlängert. Sie können es kündigen oder Ihre Rechnungsdaten in Ihrem Stripe-Kundenportal ändern.",
"BusinessPlanPaymentOverdue": "Sie können keine neuen Benutzer hinzufügen und keine neuen Räume erstellen. Die Zahlung für den Plan {{planName}} ist überfällig.",
"BusinessRequestDescription": "Die Preispläne mit mehr {{peopleNumber}} Managern sind nur auf Anfrage erhältlich.",
"BusinessSuggestion": "Passen Sie Ihren {{planName}}-Plan an",
"BusinessTitle": "Sie verwenden den {{planName}}-Plan",
"BusinessUpdated": "{{planName}}-Plan aktualisiert",

View File

@ -1,5 +1,6 @@
{
"RequestDetails": "Bitte beschreiben Sie hier die Details Ihrer Anfrage.",
"SalesDepartmentRequest": "Anfrage zur Verkaufsabteilung",
"SuccessfullySentMessage": "Ihre Nachricht wurde erfolgreich gesendet. Sie werden von der Verkaufsabteilung kontaktiert.",
"YouWillBeContacted": "Das Verkaufsteam wird Sie nach der Erstellung der Anfrage kontaktieren.",
"YourName": "Ihr Name"

View File

@ -17,6 +17,7 @@
"AmazonBucketTip": "Geben Sie den eindeutigen Namen des Amazon S3-Buckets ein, in dem Sie Ihre Backups speichern möchten.",
"AmazonCSE": "Clientseitige Verschlüsselung",
"AmazonForcePathStyleTip": "Wenn \"true\", werden Anfragen immer im Pfadstil adressiert.",
"AmazonHTTPTip": "Wenn diese Eigenschaft auf true gesetzt ist, versucht der Client, das HTTP-Protokoll zu verwenden, wenn der Zielendpunkt es unterstützt. Standardmäßig ist diese Eigenschaft auf false gesetzt.",
"AmazonRegionTip": "Geben Sie die AWS-Region ein, in der sich Ihr Amazon-Bucket befindet.",
"AmazonSSE": "Serverseitige Verschlüsselung",
"AmazonSSETip": "Der serverseitige Verschlüsselungsalgorithmus, der bei der Speicherung dieses Objekts in S3 verwendet wird.",
@ -153,6 +154,7 @@
"ServerSideEncryptionMethod": "Methode der Server-seitigen Verschlüsselung",
"ServiceUrl": "URL des Dienstes",
"SessionLifetime": "Lebensdauer der Sitzung",
"SessionLifetimeDescription": "Mit der Sitzungsdauer können Sie die Zeit (in Minuten) festlegen, nach der die Benutzer des Bereichs ihre Anmeldedaten erneut eingeben müssen, um auf den Bereich zuzugreifen.",
"SessionLifetimeHelper": "Nach dem Speichern werden alle Benutzer von dem Bereich abgemeldet.",
"SettingPasswordStrength": "Passwortlänge einstellen",
"SettingPasswordStrengthDescription": "Die Einstellungen der Passwortstärke sind eine Möglichkeit, die Effektivität eines Passworts gegen Erraten und Brute-Force-Angriffe zu bestimmen.",

View File

@ -33,6 +33,7 @@
"ServiceProviderSettings": "ONLYOFFICE-SP Einstellungen",
"Show": "Anzeigen",
"ShowAdditionalParameters": "Erweiterte Einstellungen anzeigen",
"SignOnEndpointUrl": "URL des Single Sign-On Endpunkts vom IdP",
"SignOnEndpointUrlTooltip": "Die URL, die für das Single Sign-On auf der Seite des Identitätsanbieters verwendet wird.",
"Signing": "Unterzeichnung",
"SigningAndEncryption": "Signierung und Verschlüsselung",
@ -44,11 +45,17 @@
"UploadXML": "Laden von Metadaten aus XML zum automatischen Ausfüllen der erforderlichen Felder.",
"UploadXMLPlaceholder": "URL zu IdP-Metadaten-XML",
"UsedFor": "Verwenden für",
"idpAuthRequest": "Signatur der Authentifizierungsantworten prüfen",
"idpCertificates": "Öffentliche IdP-Zertifikate",
"idpCertificatesTooltip": "Die öffentlichen Zertifikate des Identitätsanbieters, die entweder für die Überprüfung oder die Entschlüsselung (oder beides) der Anfragen und Antworten des IdP verwendet werden.",
"idpSignExitRequest": "Signatur von Logout-Anfragen prüfen",
"idpSignResponseRequest": "Signatur von Logout-Antworten prüfen",
"idpSigningAlgorithm": "Standardmäßiger Algorithmus zur Überprüfung der Unterschrift",
"spAuthRequest": "Autorisierungsanfragen unterschreiben",
"spCertificates": "SP-Zertifikate",
"spCertificatesTooltip": "Die Zertifikate des Dienstanbieters, die zum Signieren und Verschlüsseln der Anfragen und Antworten des SP verwendet werden",
"spDecryptStatements": "Behauptungen entschlüsseln",
"spSignExitRequest": "Logout-Anforderungen unterschreiben",
"spSignResponseRequest": "Abmeldungsantworten unterschreiben",
"spSigningAlgorithm": "Unterzeichnungsalgorithmus"
}

View File

@ -1,5 +1,6 @@
{
"ArchivingData": "Archivieren der Daten",
"ChooseFromList": "Aus der Liste wählen",
"ConnectingAccount": "Konto wird verbunden",
"Copy": "Kopieren",
"CopyHere": "Hierhin kopieren",
@ -37,6 +38,20 @@
"Other": "Sonstiges",
"OwnerChange": "Besitzer ändern",
"Presentations": "Präsentationen",
"Remove": "Entfernen",
"RoleCommentator": "Kommentator",
"RoleCommentatorDescription": "Vorgänge mit bestehenden Dateien: Anzeigen, Kommentieren.",
"RoleDocSpaceAdminDescription": "DocSpace-Administratoren können auf die DocSpace-Einstellungen zugreifen, Räume verwalten und archivieren, neue Benutzer einladen und Rollen unterhalb ihrer Stufe zuweisen. Alle Administratoren haben Zugriff auf den persönlichen Bereich.",
"RoleEditor": "Editor",
"RoleEditorDescription": "Vorgänge mit bestehenden Dateien: Anzeigen, Bearbeiten, Ausfüllen von Formularen, Überprüfen, Kommentieren.",
"RoleFormFiller": "Formularausfüller",
"RoleFormFillerDescription": "Vorgänge mit bestehenden Dateien: Anzeigen, Ausfüllen von Formularen, Überprüfen, Kommentieren.",
"RoleReviewer": "Überprüfer",
"RoleRoomAdminDescription": "Raumadministratoren können die ihnen zugewiesenen Räume erstellen und verwalten, neue Benutzer einladen und Rollen unterhalb ihrer Stufe zuweisen. Alle Administratoren haben Zugang zum persönlichen Bereich.",
"RoleUserDescription": "Benutzer können nur auf die Räume zugreifen, zu denen sie von den Administratoren eingeladen wurden. Sie können keine eigenen Räume, Ordner oder Dateien erstellen.",
"RoleViewer": "Betrachter",
"RoleViewerDescription": "Datei anzeigen",
"SearchByOwner": "Suche nach Besitzern",
"Spreadsheets": "Tabellenkalkulationen",
"SubNewForm": "Leer",
"SubNewFormFile": "Aus Textdatei",

View File

@ -4,5 +4,6 @@
"AboutHeader": "Σχετικά με αυτό το πρόγραμμα",
"DocumentManagement": "Διαχείριση εγγράφων",
"OnlineEditors": "Διαδικτυακά προγράμματα επεξεργασίας",
"Site": "Ιστότοπος",
"SoftwareLicense": "Άδεια χρήσης λογισμικού"
}

View File

@ -1 +1,8 @@
{}
{
"ArchiveHeader": "Μετακίνηση στα αρχειοθετημένα;",
"ArchiveRoom": "Πρόκειται να αρχειοθετήσετε ένα δωμάτιο.",
"ArchiveRooms": "Πρόκειται να αρχειοθετήσετε δωμάτια.",
"RestoreAllRooms": "Θέλετε σίγουρα να επαναφέρετε όλα τα δωμάτια;",
"RestoreRoom": "Θέλετε σίγουρα να επαναφέρετε ένα δωμάτιο;",
"RestoreRooms": "Θέλετε σίγουρα να επαναφέρετε τα δωμάτια;"
}

View File

@ -1,5 +1,14 @@
{
"AppointAdmin": "Ορισμός διαχειριστών",
"BackupPortal": "Διαφυλάξτε τα δεδομένα πύλης",
"ChangeInstruction": "Για να αλλάξετε τον ιδιοκτήτη του DocSpace, επιλέξτε το όνομα του νέου ιδιοκτήτη παρακάτω.",
"ChangeOwner": "Αλλαγή ιδιοκτήτη DocSpace",
"ChangeUser": "Αλλαγή χρήστη",
"DeactivateOrDeletePortal": "Απενεργοποίηση ή διαγραφή DocSpace",
"DoTheSame": "Κάντε το ίδιο με τους διαχειριστές",
"ManagePortal": "Διαχειριστείτε ρυθμίσεις DocSpace",
"ManageUser": "Διαχειριστείτε λογαριασμούς χρηστών"
"ManageUser": "Διαχειριστείτε λογαριασμούς χρηστών",
"NewPortalOwner": "Νέος ιδιοκτήτης DocSpace",
"PortalOwnerCan": "Ο ιδιοκτήτης DocSpace μπορεί:",
"SetAccessRights": "Ορισμός δικαιωμάτων πρόσβασης"
}

View File

@ -1,4 +1,6 @@
{
"ChangeUserStatusDialog": "Οι χρήστες με κατάσταση '{{ userStatus }}' θα είναι {{ status }}.",
"ChangeUserStatusDialogHeader": "Αλλαγή κατάστασης χρήστη"
"ChangeUserStatusDialogHeader": "Αλλαγή κατάστασης χρήστη",
"ChangeUsersActiveStatus": "eνεργοποιημένο",
"ChangeUsersDisableStatus": "aπενεργοποίηση"
}

View File

@ -2,6 +2,7 @@
"ChangeUserTypeButton": "Αλλαγή τύπου",
"ChangeUserTypeHeader": "Αλλαγή τύπου χρήστη",
"ChangeUserTypeMessage": "Οι χρήστες με τον τύπο '{{ firstType }}' θα μετακινηθούν στον τύπο '{{ secondType }}'",
"ChangeUserTypeMessageMulti": "Οι επιλεγμένοι χρήστες θα μεταφερθούν στον τύπο '{{ secondType }}'.",
"ChangeUserTypeMessageWarning": "Δεν μπορείτε να αλλάξετε τον τύπο για τους διαχειριστές της DocSpace και για εσάς.",
"SuccessChangeUserType": "Ο τύπος χρήστη άλλαξε επιτυχώς"
}

View File

@ -18,9 +18,15 @@
"LoginRegistryButton": "Συμμετοχή",
"PassworResetTitle": "Τώρα, μπορείτε να δημιουργήσετε έναν νέο κωδικό πρόσβασης.",
"PhoneSubtitle": "Ο έλεγχος ταυτότητας δύο παραγόντων είναι ενεργοποιημένος για να παρέχει πρόσθετη ασφάλεια. Εισαγάγετε τον αριθμό του κινητού σας τηλεφώνου για να συνεχίσετε την εργασία σας στην DocSpace. Ο αριθμός κινητού τηλεφώνου πρέπει να εισαχθεί χρησιμοποιώντας διεθνή μορφή με κωδικό χώρας.",
"PortalContinueTitle": "Επιβεβαιώστε ότι θέλετε να ενεργοποιήσετε ξανά το DocSpace σας",
"PortalDeactivateTitle": "Επιβεβαιώστε ότι θέλετε να απενεργοποιήσετε το DocSpace σας",
"PortalRemoveTitle": "Επιβεβαιώστε ότι θέλετε να διαγράψετε το DocSpace σας",
"Reactivate": "Επανενεργοποίηση",
"SetAppButton": "Σύνδεση εφαρμογής",
"SetAppDescription": "Ο έλεγχος ταυτότητας δύο παραγόντων είναι ενεργοποιημένος. Ρυθμίστε την εφαρμογή επαληθευτή για να συνεχίσετε να εργάζεστε στην DocSpace. Μπορείτε να χρησιμοποιήσετε το Google Authenticator για <1>Android</1> και <4>iOS</4> ή το Authenticator για <8>Windows Phone</8>.",
"SetAppInstallDescription": "Για να συνδέσετε την εφαρμογή, σαρώστε τον κωδικό QR ή εισαγάγετε χειροκίνητα το μυστικό σας κλειδί <1>{{ secretKey }}}</1> και, στη συνέχεια, εισαγάγετε έναν 6ψήφιο κωδικό από την εφαρμογή σας στο παρακάτω πεδίο.",
"SetAppTitle": "Διαμορφώστε την εφαρμογή επαληθευτή",
"SuccessDeactivate": "Ο λογαριασμός σας απενεργοποιήθηκε επιτυχώς. Σε 10 δευτερόλεπτα θα ανακατευθυνθείτε στον <1>ιστότοπο</1>",
"SuccessReactivate": "Ο λογαριασμός σας έχει επανενεργοποιηθεί επιτυχώς. Σε 10 δευτερόλεπτα θα ανακατευθυνθείτε στην <1>πύλη</1>",
"WelcomeUser": "Καλώς ήρθατε στην DocSpace μας!\nΓια να ξεκινήσετε, εγγραφείτε ή συνδεθείτε μέσω κοινωνικής δικτύωσης."
}

View File

@ -3,5 +3,6 @@
"ConnectFolderTitle": "Τίτλος φακέλου",
"ConnectionUrl": "Σύνδεση url",
"Login": "Σύνδεση",
"Reconnect": "Επανασύνδεση"
"Reconnect": "Επανασύνδεση",
"SuccessfulConnectionOfAThirdParty": "Η υπηρεσία τρίτου μέρους συνδέθηκε επιτυχώς."
}

View File

@ -1,7 +1,11 @@
{
"ConversionMessage": "Όλα τα έγγραφα που ανεβάζετε θα μετατραπούν σε μορφή Office με ανοιχτή μορφή XML (docx, xlsx ή pptx) για ταχύτερη επεξεργασία.",
"ConvertedFileDestination": "Το αντίγραφο του αρχείου θα δημιουργηθεί στον φάκελο <strong>{{folderTitle}}</strong>.",
"DocumentConversionTitle": "Μετατροπή εγγράφων",
"FailedToConvert": "Η μετατροπή απέτυχε",
"FileUploadTitle": "Ανέβασμα αρχείου",
"HideMessage": "Να μην εμφανιστεί ξανά αυτό το μήνυμα",
"InfoCreateFileIn": "Το νέο αρχείο '{{fileTitle}}' δημιουργήθηκε στον φάκελο '{{folderTitle}}'",
"OpenFileMessage": "Το αρχείο εγγράφου που ανοίγετε θα μετατραπεί σε μορφή Office Open XML για γρήγορη προβολή και επεξεργασία.",
"SaveOriginalFormatMessage": "Αποθηκεύστε το αντίγραφο του αρχείου στην αρχική μορφή"
}

View File

@ -1 +1,24 @@
{}
{
"ChooseRoomType": "Επιλέξτε τύπο δωματίου",
"CollaborationRoomDescription": "Συνεργαστείτε σε ένα ή πολλά έγγραφα με την ομάδα σας",
"CollaborationRoomTitle": "Δωμάτιο συνεργασίας",
"CreateRoomConfirmation": "Συνέχεια χωρίς σύνδεση του αποθηκευτικού χώρου;\nΈχετε επιλέξει μια επιλογή αποθήκευσης τρίτου μέρους που δεν έχει συνδεθεί ακόμα. Εάν προχωρήσετε χωρίς να συνδέσετε την υπηρεσία, η επιλογή αυτή δεν θα προστεθεί.",
"CreateTagOption": "Δημιουργία ετικέτας",
"CustomRoomDescription": "Εφαρμόστε τις δικές σας ρυθμίσεις για να χρησιμοποιήσετε αυτό το δωμάτιο για οποιονδήποτε προσαρμοσμένο σκοπό",
"CustomRoomTitle": "Προσαρμοσμένο δωμάτιο",
"FillingFormsRoomDescription": "Δημιουργήστε, μοιραστείτε και συμπληρώστε πρότυπα εγγράφων ή εργαστείτε με τις έτοιμες προεπιλογές για να δημιουργήσετε γρήγορα έγγραφα οποιουδήποτε τύπου",
"FillingFormsRoomTitle": "Αίθουσα συμπλήρωσης φορμών",
"Icon": "Εικονίδιο",
"MakeRoomPrivateDescription": "Όλα τα αρχεία σε αυτόν τον χώρο θα είναι κρυπτογραφημένα",
"MakeRoomPrivateLimitationsWarningDescription": "Με αυτήν τη λειτουργία, μπορείτε να προσκαλέσετε μόνο υπάρχοντες χρήστες του DocSpace. Μετά τη δημιουργία ενός χώρου, δεν θα μπορείτε να αλλάξετε τη λίστα των χρηστών.",
"MakeRoomPrivateTitle": "Κάντε το δωμάτιο ιδιωτικό",
"ReviewRoomDescription": "Ζητήστε αναθεώρηση ή σχόλια σχετικά με τα έγγραφα",
"ReviewRoomTitle": "Αναθεώρηση δωματίου",
"TagsPlaceholder": "Προσθήκη ετικέτας",
"ThirdPartyStorageComboBoxPlaceholder": "Επιλέξτε αποθηκευτικό χώρο",
"ThirdPartyStorageDescription": "Χρησιμοποιήστε υπηρεσίες τρίτων ως χώρο αποθήκευσης δεδομένων για αυτό το δωμάτιο. Θα δημιουργηθεί ένας νέος φάκελος για την αποθήκευση των δεδομένων αυτού του δωματίου στον συνδεδεμένο αποθηκευτικό χώρο",
"ThirdPartyStorageNoStorageAlert": "Πριν, πρέπει να συνδέσετε την αντίστοιχη υπηρεσία στην ενότητα «Ενσωμάτωση». Διαφορετικά, η σύνδεση δεν θα είναι δυνατή.",
"ThirdPartyStoragePermanentSettingDescription": "Τα αρχεία αποθηκεύονται σε έναν αποθηκευτικό χώρο τρίτου μέρους {{thirdpartyTitle}} στον φάκελο «{{thirdpartyFolderName}}».\n<strong>{{thirdpartyPath}}</strong>",
"ThirdPartyStorageRoomAdminNoStorageAlert": "Για να συνδέσετε έναν αποθηκευτικό χώρο τρίτου μέρους, πρέπει να προσθέσετε την αντίστοιχη υπηρεσία στην ενότητα «Ενσωμάτωση» των ρυθμίσεων του DocSpace. Επικοινωνήστε με τον ιδιοκτήτη ή τον διαχειριστή του DocSpace για να ενεργοποιήσετε την ενσωμάτωση.",
"ThirdPartyStorageTitle": "Αποθήκευση τρίτου μέρους"
}

View File

@ -106,8 +106,8 @@
"TooltipElementsMoveMessage": "Move {{element}} elements",
"TrashEmptyDescription": "All deleted files are moved to 'Trash'. Restore files deleted by mistake or delete them permanently. Files in 'Trash' are automatically deleted after 30 days. Please note, that the files deleted from the 'Trash' cannot be restored any longer.",
"TrashErasureWarning": "Items in Trash are automatically deleted after 30 days.",
"UnarchivedRoomAction": "The room '{{name}}' is unarchived",
"UnarchivedRoomsAction": "The rooms are unarchived",
"UnarchivedRoomAction": "The room '{{name}}' is unarchived.",
"UnarchivedRoomsAction": "The rooms are unarchived.",
"UnblockVersion": "Unblock/Check-in",
"Unpin": "Unpin",
"VersionBadge": "V.{{version}}",

View File

@ -28,7 +28,7 @@
"Folders": "Folders",
"FormTemplates": "Form templates",
"LinkCopySuccess": "Link has been copied to the clipboard",
"LinkValidTime": "This link is valid for {{days_count}} days only",
"LinkValidTime": "This link is valid for {{days_count}} days only.",
"MobileAndroid": "Get ONLYOFFICE Documents on Google Play",
"MobileIos": "Download ONLYOFFICE Documents on the App Store",
"MobileLinux": "Download ONLYOFFICE Desktop Editors for Linux",

View File

@ -69,6 +69,7 @@
"RemoveFromList": "Quitar de la lista",
"RemovedFromFavorites": "Quitado de favoritos",
"Rename": "Renombrar",
"RoomCreated": "La sala se ha creado",
"RoomEmptyContainerDescription": "Por favor, cree la primera sala.",
"SendByEmail": "Enviar por correo electrónico",
"Share": "Compartir",

View File

@ -72,6 +72,7 @@
"DeleteDocSpaceInfo": "Antes de eliminar el espacio, por favor, asegúrese de que la facturación automática está desactivada. Puede comprobar el estado de la facturación automática en <1>su portal de cliente de Stripe.</1>",
"DeleteTheme": "Eliminar tema",
"DeleteThemeForever": "¿Eliminar el tema para siempre?",
"DeleteThemeNotice": "El tema se eliminará definitivamente. No podrá deshacer esta acción.",
"DeveloperTools": "Herramientas de desarrollo",
"Disabled": "Deshabilitado",
"DownloadCopy": "Descargar la copia",

View File

@ -4,5 +4,6 @@
"AboutHeader": "Tietoja tästä ohjelmasta",
"DocumentManagement": "Asiakirjojen hallinta",
"OnlineEditors": "Verkkoeditorit",
"Site": "Sivusto",
"SoftwareLicense": "Ohjelmiston käyttöoikeus"
}

View File

@ -1 +1,8 @@
{}
{
"ArchiveHeader": "Siirretäänkö arkistoon?",
"ArchiveRoom": "Olet arkistoimassa huonetta.",
"ArchiveRooms": "Olet arkistoimassa huoneita.",
"RestoreAllRooms": "Haluatko varmasti palauttaa kaikki huoneet?",
"RestoreRoom": "Haluatko varmasti palauttaa huoneen?",
"RestoreRooms": "Haluatko varmasti palauttaa huoneet?"
}

View File

@ -1,5 +1,14 @@
{
"AppointAdmin": "Nimeä ylläpitäjät",
"BackupPortal": "Varmuuskopioi portaalin tiedot",
"ChangeInstruction": "Ole hyvä ja valitse omistajan nimi alta vaihtaaksesi DocSpacen omistajan.",
"ChangeOwner": "Vaihda DocSpace-omistaja",
"ChangeUser": "Vaihda käyttäjä",
"DeactivateOrDeletePortal": "Poista DocSpace käytöstä tai poista se kokonaan",
"DoTheSame": "Tee sama kuin järjestelmänvalvojat",
"ManagePortal": " Hallitse portaalin asetuksia",
"ManageUser": " Hallitse käyttäjätilejä"
"ManageUser": " Hallitse käyttäjätilejä",
"NewPortalOwner": "Uusi DocSpace-omistaja",
"PortalOwnerCan": "DocSpace omistaja voi:",
"SetAccessRights": "Aseta pääsyoikeudet"
}

View File

@ -1,4 +1,6 @@
{
"ChangeUserStatusDialog": "Käyttäjät, joilla on tila {{userStatus}}, tulee {{ status }}.",
"ChangeUserStatusDialogHeader": "Muuta käyttäjän tilaa"
"ChangeUserStatusDialogHeader": "Muuta käyttäjän tilaa",
"ChangeUsersActiveStatus": "käytössä",
"ChangeUsersDisableStatus": "poissa käytöstä"
}

View File

@ -2,6 +2,7 @@
"ChangeUserTypeButton": "Vaihda tyyppiä",
"ChangeUserTypeHeader": "Muuta käyttäjän tyyppiä",
"ChangeUserTypeMessage": "Käyttäjät, joiden tyyppi on {{firstType}}, siirretään tyypiksi {{secondType}}.",
"ChangeUserTypeMessageMulti": "Valitut käyttäjät siirretään '{{secondType}}.",
"ChangeUserTypeMessageWarning": "Et voi muuttaa DocSpace-järjestelmänvalvojien tai omaa tilaasi.",
"SuccessChangeUserType": "Käyttäjän tila muutettu onnistuneesti"
}

View File

@ -18,9 +18,15 @@
"LoginRegistryButton": "Liity",
"PassworResetTitle": "Nyt voit luoda uuden salasanan.",
"PhoneSubtitle": "Kaksiosainen todennus on käytössä lisäsuojauksen tarjoamiseksi. Anna matkapuhelinnumerosi, jos haluat jatkaa työskentelyä DocSpaceessa. Matkapuhelinnumero on annettava kansainvälisessä muodossa, jossa on maakoodi.",
"PortalContinueTitle": "Ole hyvä ja vahvista, että haluat aktivoida DocSpacesi uudelleen.",
"PortalDeactivateTitle": "Ole hyvä ja vahvista, että haluat deaktivoida DocSpacesi.",
"PortalRemoveTitle": "Ole hyvä ja vahvista, että haluat poistaa DocSpacesi.",
"Reactivate": "Aktivoida uudelleen",
"SetAppButton": "Yhdistä sovellus",
"SetAppDescription": "Kaksivaiheinen todennus on käytössä. Määritä autentikointisovelluksesi jatkaaksesi työskentelyä DocSpacessa. Voit käyttää Google Authenticatoria <1> Android</1> ja <4> iOS</4>-järjestelmällä tai Authenticatoria <8> Windows-puhelimella</8>.",
"SetAppInstallDescription": "Jos haluat yhdistää sovelluksen, skannaa QR-koodi tai kirjoita salainen avaimesi <1> {{secretKey}} </1> manuaalisesti ja kirjoita sitten 6-numeroinen koodi sovelluksestasi alla olevaan kenttään.",
"SetAppTitle": "Määritä todennussovelluksesi",
"WelcomeUser": "Tervetuloa DocSpaceen!\nAloita rekisteröityminen tai kirjautuminen sosiaalisen verkostoitumisen kautta."
"SuccessDeactivate": "Tilisi on onnistuneesti deaktivoitu. Sinut ohjataan <1>sivustolle</1> 10 sekunnissa.",
"SuccessReactivate": "Tilisi on onnistuneesti aktivoitu uudelleen. Sinut ohjataan <1>portaaliin</1> 10 sekunnissa.",
"WelcomeUser": "Tervetuloa meidän DocSpaceen!\nAloita rekisteröityminen tai kirjautuminen sosiaalisen verkostoitumisen kautta."
}

View File

@ -3,5 +3,6 @@
"ConnectFolderTitle": "Kansion nimi",
"ConnectionUrl": "Yhteyden url-osoite",
"Login": "Kirjaudu sisään",
"Reconnect": "Yhdistä uudelleen"
"Reconnect": "Yhdistä uudelleen",
"SuccessfulConnectionOfAThirdParty": "Kolmannen osapuolen palvelu onnistuneesti yhdistetty."
}

View File

@ -1,6 +1,9 @@
{
"ConversionMessage": "Kaikki lähettämäsi asiakirjat muunnetaan Office Open XML -muotoon (docx, xlsx tai pptx) muokkaamisen nopeuttamiseksi.",
"ConvertedFileDestination": "Tiedoston kopio luodaan <strong>{{folderTitle}}</strong> kansioon.",
"DocumentConversionTitle": "Dokumentin muuntaminen",
"FailedToConvert": "Muuntaminen epäonnistui",
"FileUploadTitle": "Tiedosto ladattu",
"HideMessage": "Älä näytä tätä viestiä enää",
"InfoCreateFileIn": "Uusi tiedosto '{{fileTitle}}' on luotu kohteeseen '{{folderTitle}}'",
"OpenFileMessage": "Avaamasi asiakirja muunnetaan Office Open XML muotoon nopeampaa katselua ja muokkausta varten.",

View File

@ -1 +1,24 @@
{}
{
"ChooseRoomType": "Valitse huonetyyppi",
"CollaborationRoomDescription": "Tee yhteistyötä yhden tai useiden dokumenttien luomisessa tiimisi kanssa",
"CollaborationRoomTitle": "Yhteistyöhuone",
"CreateRoomConfirmation": "Jatka yhdistämättä muistiin?\nEt voi alentaa kolmannen osapuolen muistivaihtoehtoa, joka ei ole vielä yhdistetty. Jos jatkat yhdistämättä palvelua, tätä vaihtoehtoa ei lisätä.",
"CreateTagOption": "Luo merkki",
"CustomRoomDescription": "Aseta omat asetuksesti käyttääksesi tätä huonetta mihin tahansa mukautettuun tarkoitukseen",
"CustomRoomTitle": "Mukautettu huone",
"FillingFormsRoomDescription": "Rakenna, jaa ja täytä dokumenttipohjia tai tee töitä valmiiden pohjien kanssa luodaksesi nopeasti kaikentyyppisiä dokumentteja.",
"FillingFormsRoomTitle": "Lomakkeiden täyttöhuone",
"Icon": "Kuvake",
"MakeRoomPrivateDescription": "Kaikki tämän huoneen tiedostot salataan.",
"MakeRoomPrivateLimitationsWarningDescription": "Tällä toiminnolla, voit kutsua vai olemassa olevia DocSpace-käyttäjiä. Huoneen luomisen jälkeen et voi muuttaa käyttäjien listaa.",
"MakeRoomPrivateTitle": "Tee huoneesta yksityinen",
"ReviewRoomDescription": "Pyydä arvostelu tai kommentteja dokumentteihin",
"ReviewRoomTitle": "Tarkasta huone",
"TagsPlaceholder": "Lisää tunniste",
"ThirdPartyStorageComboBoxPlaceholder": "Valitse muisti",
"ThirdPartyStorageDescription": "Käytä kolmannen osapuolen palveluita tallennustilana tälle huoneelle. Yhdistettyyn tallennustilaan luodaan uusi kansio tämän huoneen tietojen tallentamista varten.",
"ThirdPartyStorageNoStorageAlert": "Sitä ennen, sinun tulee yhdistää vastaavaan palveluun \"Liittäminen\"-osiossa. Muuten, yhteys ei ole mahdollinen.",
"ThirdPartyStoragePermanentSettingDescription": "Tiedostot on säilötty kolmannen osapuolen {{thirdpartyTitle}} muistiin \"{{thirdpartyFolderName}}\" -kansioon.\n<strong>{{thirdpartyPath}}</strong>",
"ThirdPartyStorageRoomAdminNoStorageAlert": "Yhdistääksesi kolmannen osapuolen tallennustilan, sinun täytyy lisätä vastaava palvelu DocSpacen asetusten Ingtegraatio-osiossa. Ota yhteyttä DocSpacen omistajaan tai järjestelmänvalvojaan ottaaksesi integraation käyttöön.",
"ThirdPartyStorageTitle": "Kolmannen osapuolen tallennustila"
}

View File

@ -28,5 +28,5 @@
"SetAppTitle": "Configurez votre application d'authentification",
"SuccessDeactivate": "Votre compte a été désactivé avec succès. Dans 10 secondes, vous serez redirigé vers le <1>site</1>.",
"SuccessReactivate": "Votre compte a été réactivé avec succès. Dans 10 secondes, vous serez redirigé vers le <1>portail</1>.",
"WelcomeUser": "Bienvenue sur notre DocSpaceen !\nPour commencer, enregistrez-vous, ou connectez-vous via les réseaux sociaux."
"WelcomeUser": "Bienvenue sur notre DocSpace!\nPour commencer, enregistrez-vous, ou connectez-vous via les réseaux sociaux."
}

View File

@ -69,6 +69,7 @@
"RemoveFromList": "Retirer de la liste",
"RemovedFromFavorites": "Retiré des favoris",
"Rename": "Renommer",
"RoomCreated": "Salle créée",
"RoomEmptyContainerDescription": "Veuillez créer la première pièce.",
"SendByEmail": "Envoyer par émail",
"Share": "Partager",

View File

@ -13,6 +13,7 @@
"Encryption": "Chiffrement",
"GenerateCertificate": "Générer un nouveau certificat auto-signé",
"Hide": "Masquer",
"HideAdditionalParameters": "Masquer les paramètres avancés",
"HideAuthPage": "Masquer la page dauthentification",
"LogoutEndpointUrl": "URL du point final de déconnexion unique IdP",
"LogoutEndpointUrlTooltip": "LURL utilisée pour la déconnexion unique du côté du fournisseur de services",

View File

@ -7,9 +7,13 @@
"CustomRoomDescription": "Applica le tue impostazioni per utilizzare questa stanza per qualsiasi scopo personalizzato.",
"CustomRoomTitle": "Stanza personalizzata",
"FillingFormsRoomDescription": "Crea, condividi e compila modelli di documenti o lavora con i moduli precompilati per creare rapidamente documenti di qualsiasi tipo.",
"FillingFormsRoomTitle": "Stanza di compilazione di moduli",
"Icon": "Icona",
"MakeRoomPrivateDescription": "Tutti i file in questa stanza verranno crittografati.",
"MakeRoomPrivateLimitationsWarningDescription": "Con questa funzione, puoi invitare solo gli utenti esistenti di DocSpace. Dopo aver creato una stanza, non sarai in grado di modificare lelenco degli utenti.",
"MakeRoomPrivateTitle": "Rendi la stanza privata",
"ReviewRoomDescription": "Richiedi una revisione o dei commenti sui documenti",
"ReviewRoomTitle": "Rivedi la stanza",
"RoomEditing": "Modifica della stanza",
"RootLabel": "Menù principale",
"TagsPlaceholder": "Aggiungi un tag",

View File

@ -68,6 +68,7 @@
"RemoveFromList": "Rimuovere dalla lista",
"RemovedFromFavorites": "Rimosso dai favoriti",
"Rename": "Rinomina",
"RoomCreated": "La stanza è stata creata",
"RoomEmptyContainerDescription": "Ti preghiamo di creare la prima stanza.",
"SendByEmail": "Invia per email",
"Share": "Condividi",

View File

@ -1,5 +1,6 @@
{
"ArchivingData": "Archiviazione dei dati",
"ChooseFromList": "Scegli dallelenco",
"ConnectingAccount": "Collegamento dell'account",
"Copy": "Copiare",
"CopyHere": "Copia qui",

View File

@ -7,8 +7,10 @@
"CustomRoomDescription": "사용자 지정 목적으로 이 방을 사용하려면 원하는 설정을 적용하세요.",
"CustomRoomTitle": "사용자 지정 방",
"FillingFormsRoomDescription": "문서 템플릿을 작성, 공유 및 입력하거나 준비된 사전 설정으로 작업하여 모든 유형의 문서를 빠르게 생성하세요.",
"FillingFormsRoomTitle": "양식 작성 방",
"Icon": "아이콘",
"MakeRoomPrivateDescription": "이 방의 모든 파일이 암호화됩니다.",
"MakeRoomPrivateLimitationsWarningDescription": "이 기능을 사용하면 기존 DocSpace 사용자만 초대할 수 있습니다. 그리고 방을 만든 후에는 사용자 목록을 변경할 수 없습니다.",
"MakeRoomPrivateTitle": "방을 비공개로 설정",
"ReviewRoomDescription": "문서 검토 또는 주석 달기 요청",
"ReviewRoomTitle": "방 검토",

View File

@ -1,6 +1,6 @@
{
"ChangeUserStatusDialog": "Użytkownicy o statusie '{{ userStatus }}' zostaną {{ status }}.",
"ChangeUserStatusDialogHeader": "Zmień status użytkownika",
"ChangeUserStatusDialogHeader": "Zmień status",
"ChangeUserStatusDialogMessage": "Nie możesz zmienić swojego statusu, ani statusu właściciela DocSpace.",
"ChangeUsersActiveStatus": "aktywny",
"ChangeUsersDisableStatus": "nieaktywny"

View File

@ -4,5 +4,6 @@
"AboutHeader": "Sobre este programa",
"DocumentManagement": "Gestão de documentos",
"OnlineEditors": "Editores online",
"Site": "Website",
"SoftwareLicense": "Licença de software"
}

View File

@ -1 +1,8 @@
{}
{
"ArchiveHeader": "Mover para os Arquivados?",
"ArchiveRoom": "Está prestes a arquivar uma sala.",
"ArchiveRooms": "Está prestes a arquivar várias salas.",
"RestoreAllRooms": "Tem a certeza que quer restaurar todas as salas?",
"RestoreRoom": "Tem a certeza que quer restaurar a sala?",
"RestoreRooms": "Tem a certeza que quer restaurar as salas?"
}

View File

@ -1,5 +1,14 @@
{
"AppointAdmin": "Definir administradores",
"BackupPortal": "Faça uma cópia de segurança dos dados do DocSpace",
"ChangeInstruction": "Para mudar o proprietário do DocSpace, por favor escolha abaixo o nome do novo proprietário.",
"ChangeOwner": "Mudar o proprietário do DocSpace",
"ChangeUser": "Mudar o utilizador",
"DeactivateOrDeletePortal": "Desativar ou eliminar o DocSpace",
"DoTheSame": "Faça o mesmo como administrador",
"ManagePortal": "Gerir a configuração do DocSpace",
"ManageUser": "Gerir as contas dos utilizadores"
"ManageUser": "Gerir as contas dos utilizadores",
"NewPortalOwner": "Novo proprietário do DocSpace",
"PortalOwnerCan": "O Proprietário do DocSpace pode:",
"SetAccessRights": "Definir os direitos de acesso"
}

View File

@ -2,6 +2,7 @@
"ChangeUserTypeButton": "Alterar tipo",
"ChangeUserTypeHeader": "Alterar tipo de utilizador",
"ChangeUserTypeMessage": "Os utilizadores com o tipo '{{{ firstType }}' serão movidos para o tipo '{{ secondType }}'.",
"ChangeUserTypeMessageMulti": "Os utilizadores selecionados serão movidos para o tipo '{{ secondType }}'.",
"ChangeUserTypeMessageWarning": "Não pode alterar o tipo para os administradores do DocSpace e para si próprio.",
"SuccessChangeUserType": "O tipo de utilizador foi alterado com êxito"
}

View File

@ -18,9 +18,15 @@
"LoginRegistryButton": "Juntar-se",
"PassworResetTitle": "Agora pode criar uma nova palavra-chave.",
"PhoneSubtitle": "A autenticação de dois fatores está ativa para fornecer maior segurança. Introduza o seu número de telemóvel para continuar a trabalhar no DocSpace. O número de telemóvel tem de ser introduzido utilizando o formato internacional com o código do país.",
"PortalContinueTitle": "Por favor, confirme que quer reativar o seu DocSpace.",
"PortalDeactivateTitle": "Por favor, confirme que deseja desativar o seu DocSpace.",
"PortalRemoveTitle": "Por favor, confirme que quer eliminar o seu DocSpace.",
"Reactivate": "Reativar",
"SetAppButton": "Ligar à app",
"SetAppDescription": "A autenticação de dois-fatores está ativada. Configure a sua aplicação de autenticação para continuar a trabalhar no DocSpace. Pode utilizar a autenticação da Google para <1>Android</1> e <4>iOS</4> ou um autenticador para <8>Windows Phone</8>.",
"SetAppInstallDescription": "Para ligar a app, faça scan ao código QR ou insira manualmente a sua chave secreta <1>{{ secretKey }}</1>, e depois insira o código de 6 dígitos fornecido pela sua app no campo abaixo.",
"SetAppTitle": "Configure a sua aplicação de autenticação",
"SuccessDeactivate": "A sua conta foi desativada com êxito. Em 10 segundos será redirecionado para o <1>site</1>.",
"SuccessReactivate": "A sua conta foi reativada com sucesso. Em 10 segundos será redirecionado para o <1>portal</1>.",
"WelcomeUser": "Seja bem-vindo(a) ao nosso DocSpace!\nPara começar a usufruir dele registe-se, ou inicie sessão via redes sociais."
}

View File

@ -3,5 +3,6 @@
"ConnectFolderTitle": "Título da pasta",
"ConnectionUrl": "Url de ligação",
"Login": "Entrar",
"Reconnect": "Voltar a ligar"
"Reconnect": "Voltar a ligar",
"SuccessfulConnectionOfAThirdParty": "O serviço de terceiros foi conectado com êxito."
}

View File

@ -1,6 +1,9 @@
{
"ConversionMessage": "Todos os documentos que carregar serão convertidos no formato Office Open XML (docx, xlsx ou pptx) para uma edição mais rápida.",
"ConvertedFileDestination": "A copia do ficheiro será criada na pasta <strong>{{folderTitle}}</strong>.",
"DocumentConversionTitle": "Conversão de documentos",
"FailedToConvert": "Não foi possível converter",
"FileUploadTitle": "Ficheiro carregado",
"HideMessage": "Não mostre esta mensagem novamente",
"InfoCreateFileIn": "O novo ficheiro '{{fileTitle}}' foi criado em '{{folderTitle}}'",
"OpenFileMessage": "O documento que abriu será convertido para formato Office Open XML para uma visualização e edição rápida.",

View File

@ -1,3 +1,22 @@
{
"ChooseRoomType": "Escolha o tipo de quarto"
"ChooseRoomType": "Escolha o tipo de sala",
"CollaborationRoomDescription": "Colabore num ou em vários documentos com a sua equipa",
"CollaborationRoomTitle": "Sala de colaboração",
"CreateRoomConfirmation": "Continuar sem se conectar ao armazenamento?\nSelecionou uma opção de armazenamento de terceiros que ainda não está associada. Se prosseguir sem associar o serviço, esta opção não será adicionada.",
"CreateTagOption": "Criar tag",
"CustomRoomDescription": "Aplique as suas próprias definições para usar esta sala para qualquer propósito.",
"CustomRoomTitle": "Sala personalizada",
"FillingFormsRoomDescription": "Construir, partilhar e preencher modelos de documentos ou trabalhar com as predefinições para criar rapidamente documentos de qualquer tipo.",
"FillingFormsRoomTitle": "Sala de preenchimento de formulários",
"Icon": "Ícone",
"MakeRoomPrivateDescription": "Todos os ficheiros nesta sala serão encriptados.",
"MakeRoomPrivateLimitationsWarningDescription": "Com esta funcionalidade, pode convidar apenas utilizadores já existentes no DocSpace. Depois de criar uma sala, não será possível alterar a lista de utilizadores.",
"MakeRoomPrivateTitle": "Tornar a Sala Privada",
"TagsPlaceholder": "Adicionar uma tag",
"ThirdPartyStorageComboBoxPlaceholder": "Selecionar armazenamento",
"ThirdPartyStorageDescription": "Utilizar serviços de terceiros para o armazenamento de dados desta sala. Será criada uma pasta para armazenar os dados desta sala no armazenamento conectado.",
"ThirdPartyStorageNoStorageAlert": "Antes de proceder, é necessário ligar o serviço correspondente na secção \"Integração\". Caso contrário, a ligação não será possível.",
"ThirdPartyStoragePermanentSettingDescription": "Os ficheiros estão armazenados num armazenamento de terceiros {{thirdpartyTitle}} na pasta \"{{thirdpartyFolderName}}\".\n<strong>{{thirdpartyPath}}</strong>",
"ThirdPartyStorageRoomAdminNoStorageAlert": "Para ligar um armazenamento de terceiros, é necessário adicionar o serviço correspondente na secção Integração das definições do DocSpace. Contacte o proprietário ou administrador do DocSpace para ativar a integração.",
"ThirdPartyStorageTitle": "Armazenamento de terceiros."
}

View File

@ -1,6 +1,6 @@
{
"ChangeUserStatusDialog": "Utilizatorii cu statutul '{{ userStatus }}' vor fi {{ status }}.",
"ChangeUserStatusDialogHeader": "Schimbați statutul utilizatorului",
"ChangeUserStatusDialogHeader": "Schimbați statutul",
"ChangeUserStatusDialogMessage": "Nu puteți schimba statutul proprietarului spațiului DocSpace și nici al dumneavoastră.",
"ChangeUsersActiveStatus": "activat",
"ChangeUsersDisableStatus": "desactivat"

View File

@ -26,7 +26,7 @@
"SetAppDescription": "Включена двухфакторная аутентификация. Чтобы продолжить работу в DocSpace, настройте приложение для аутентификации. Вы можете использовать Google Authenticator для <1>Android</1> и <4>iOS</4> или Authenticator для <8>Windows Phone</8>.",
"SetAppInstallDescription": "Для подключения приложения отсканируйте QR-код или вручную введите секретный ключ <1>{{ secretKey }}</1>, а затем введите 6-значный код из приложения в поле ниже.",
"SetAppTitle": "Настройте приложение для аутентификации",
"SuccessDeactivate": "Ваш аккаунт успешно деактивирован. Через 10 секунд вы будете перенаправлены на сайт <1>site</1>.",
"SuccessReactivate": "Ваша учетная запись успешно повторно активирована. Через 10 секунд вы будете перенаправлены на <1>portal</1>.",
"SuccessDeactivate": "Ваш аккаунт успешно деактивирован. Через 10 секунд вы будете перенаправлены на <1>сайт</1>.",
"SuccessReactivate": "Ваша учетная запись успешно повторно активирована. Через 10 секунд вы будете перенаправлены на <1>портал</1>.",
"WelcomeUser": "Добро пожаловать на DocSpace!\nЧтобы приступить к работе зарегистрируйтесь, или войдите через социальную сеть."
}

View File

@ -46,7 +46,7 @@
"RoleDocSpaceAdminDescription": "Администраторы DocSpace могут получить доступ к настройкам DocSpace, управлять и архивировать комнаты, приглашать новых пользователей и назначать роли ниже своего уровня. Все администраторы имеют доступ к Личному разделу.",
"RoleEditor": "Редактор",
"RoleEditorDescription": "Операции с существующими файлами: просмотр, редактирование, заполнение форм, рецензирование, комментирование.",
"RoleFormFiller": "Наполнитель формы",
"RoleFormFiller": "Заполнитель формы",
"RoleFormFillerDescription": "Операции с существующими файлами: просмотр, заполнение форм, просмотр, комментирование.",
"RolePowerUserDescription": "Опытные пользователи могут создавать и редактировать файлы в комнате, но не могут создавать комнаты, управлять пользователями или получать доступ к настройкам.",
"RoleReviewer": "Рецензент",

View File

@ -9,6 +9,8 @@
"FillingFormsRoomDescription": "Oblikujte, delite in izpolnite predloge dokumentov ali delajte s pripravljenimi prednastavitvami za hitro ustvarjanje dokumentov katere koli vrste.",
"Icon": "Ikona",
"MakeRoomPrivateDescription": "Vse datoteke v tej sobi bodo šifrirane.",
"MakeRoomPrivateLimitationsWarningDescription": "S to funkcijo lahko povabite samo obstoječe uporabnike DocSpace. Ko ustvarite sobo, ne boste mogli spremeniti seznama uporabnikov.",
"MakeRoomPrivateTitle": "Naredi sobo zasebno",
"ReviewRoomDescription": "Zahtevaj pregled ali komentarje dokumentov",
"RoomEditing": "Urejanje sobe",
"RootLabel": "Osnova",

View File

@ -9,7 +9,10 @@
"FillingFormsRoomDescription": "构建、分享以及填充文档模板,或使用现有预设来快速创建各类文档。",
"Icon": "图标",
"MakeRoomPrivateDescription": "此房间中的所有文件都将被加密。",
"MakeRoomPrivateLimitationsWarningDescription": "您可使用此功能仅邀请现有协作空间用户。创建房间后您将无法更改用户列表。",
"MakeRoomPrivateTitle": "将房间设为私密",
"ReviewRoomDescription": "请求审阅或评论文档",
"ReviewRoomTitle": "审阅房间",
"RoomEditing": "房间编辑",
"RootLabel": "Root",
"TagsPlaceholder": "添加标签",

View File

@ -5,6 +5,7 @@
"BusinessExpired": "您的 {{planName}} 版本已于 {{date}} 过期",
"BusinessFinalDateInfo": "订阅将于 {{finalDate}} 自动按照更新后的定价和规格续期。您可在 Stripe 客户门户中取消或更改计费信息。",
"BusinessPlanPaymentOverdue": "无法添加新用户并新建房间。{{planName}} 版本付款已逾期。",
"BusinessRequestDescription": "超过 {{peopleNumber}} 名用管理者定价版本仅应要求单独提供。",
"BusinessSuggestion": "自定义您的 {{planName}} 版本",
"BusinessTitle": "您正在使用 {{planName}} 版本",
"BusinessUpdated": "{{planName}} 版本已更新",

View File

@ -1,5 +1,6 @@
{
"RequestDetails": "请在此详细描述您的需求。",
"SalesDepartmentRequest": "销售部门请求",
"SuccessfullySentMessage": "您的消息已成功发送。销售部门将与您联系。",
"YouWillBeContacted": "创建请求后销售团队将与您取得联系。",
"YourName": "您的姓名"

View File

@ -45,11 +45,17 @@
"UploadXML": "从 XML 中加载元数据以自动填充所需字段。",
"UploadXMLPlaceholder": "IdP 元数据 XML URL",
"UsedFor": "用于",
"idpAuthRequest": "校验认证响应签名",
"idpCertificates": "IdP 公共证书",
"idpCertificatesTooltip": "用于对来自 IdP 的请求与信息进行验证或解密(或两者皆有)的身份供应商公共证书。",
"idpSignExitRequest": "校验登出请求签名",
"idpSignResponseRequest": "校验登出响应签名",
"idpSigningAlgorithm": "默认签名校验算法",
"spAuthRequest": "签署认证请求",
"spCertificates": "SP 证书",
"spCertificatesTooltip": "用于对来自 SP 的请求和响应进行签名与加密的服务供应商证书",
"spDecryptStatements": "解密断言",
"spSignExitRequest": "签署登出请求",
"spSignResponseRequest": "签署登出响应",
"spSigningAlgorithm": "签名算法"
}

View File

@ -1,5 +1,6 @@
{
"ArchivingData": "归档数据",
"ChooseFromList": "从列表中选择",
"ConnectingAccount": "连接账户",
"Copy": "复制",
"CopyHere": "在此复制",
@ -37,6 +38,20 @@
"Other": "其他",
"OwnerChange": "变更所有者",
"Presentations": "演示文稿",
"Remove": "移除",
"RoleCommentator": "评论者",
"RoleCommentatorDescription": "现有文件操作:查看、评论。",
"RoleDocSpaceAdminDescription": "协作空间管理员可访问协作空间设置、管理/归档房间、邀请新用户并指派低于其级别的角色。所有管理员都有访问“个人”分区的权限。",
"RoleEditor": "编辑器",
"RoleEditorDescription": "现有文件操作:查看、编辑、表单填写、审阅、评论。",
"RoleFormFiller": "表单填写工具",
"RoleFormFillerDescription": "现有文件操作:查看、表单填写、审阅、评论。",
"RoleReviewerDescription": "审阅者",
"RoleRoomAdminDescription": "房间管理员可创建并管理已指派的房间、邀请新用户并指派低于其级别的角色。所有管理员都有访问“个人”分区的权限。",
"RoleUserDescription": "用户仅可访问管理员已邀请其加入的房间。其不能创建房间、文件夹或文件。",
"RoleViewer": "查看者",
"RoleViewerDescription": "文件查看",
"SearchByOwner": "按所有者搜索",
"Spreadsheets": "电子表格",
"SubNewForm": "空白",
"SubNewFormFile": "来自文本文件",

View File

@ -43,7 +43,8 @@ const StyledRowContainer = styled(RowContainer)`
.user-row {
border-top: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
margin-top: -3px;
margin-top: -4px;
${marginStyles}
}
}
@ -52,7 +53,8 @@ const StyledRowContainer = styled(RowContainer)`
.user-row {
border-top: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
margin-top: -3px;
margin-top: -4px;
${marginStyles}
}
}
@ -68,6 +70,7 @@ const StyledRowContainer = styled(RowContainer)`
border-bottom: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
padding-bottom: 1px;
padding-top: 1px;
${marginStyles}
}
.user-row::after {
@ -78,10 +81,47 @@ const StyledRowContainer = styled(RowContainer)`
.user-row {
border-top: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
margin-top: -3px;
margin-top: -4px;
${marginStyles}
}
}
.row-selected {
.user-row {
.styled-element {
padding-top: 1px;
}
}
}
@media (max-width: 1024px) {
.row-selected {
.user-row {
margin-top: -3px !important;
padding-bottom: 0.8px !important;
padding-top: 0.8px !important;
.styled-element {
padding-bottom: 0.8px;
.owner_icon {
padding-bottom: 0.8px;
}
}
.expandButton {
padding-bottom: 0.8px;
}
.mainIcons {
.paid-badge {
margin-top: -1px;
}
}
}
}
}
`;
const PeopleRowContainer = ({
@ -120,7 +160,7 @@ const PeopleRowContainer = ({
hasMoreFiles={hasMoreAccounts}
itemCount={filterTotal}
filesLength={peopleList.length}
itemHeight={58}
itemHeight={57.6}
>
{peopleList.map((item) => (
<SimpleUserRow

View File

@ -70,9 +70,48 @@ const StyledSimpleUserRow = styled(Row)`
cursor: pointer;
${checkedStyle}
margin-top: -3px;
border-top: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
@media (min-width: 1024px) {
margin-top: -4px !important;
padding-top: 1px;
padding-bottom: 1px;
border-top: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
border-bottom: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
.styled-checkbox-container {
.styled-element {
padding-top: 1px;
}
}
}
@media (max-width: 1024px) {
margin-top: -3px !important;
padding-top: 0.8px;
padding-bottom: 0.8px;
border-top: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
border-bottom: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
.owner_icon {
padding-bottom: 0.8px;
}
.mainIcons {
.paid-badge {
margin-top: -1px;
}
}
.expandButton {
padding-bottom: 0.8px;
}
}
}
`}

View File

@ -43,6 +43,24 @@ const StyledTableContainer = styled(TableContainer)`
.table-container_row-context-menu-wrapper {
${contextCss}
}
.table-container_cell {
.paid-badge {
p {
padding-top: 1px;
}
}
}
}
:hover {
.table-container_cell {
.paid-badge {
p {
padding-top: 1px;
}
}
}
}
.table-row-selected + .table-row-selected {

View File

@ -29,6 +29,12 @@ const StyledPeopleRow = styled(TableRow)`
border-top: ${(props) =>
`1px solid ${props.theme.filesSection.tableView.row.borderColor}`};
margin-top: -1px;
.paid-badge {
p {
padding-top: 1px;
}
}
}
.table-container_user-name-cell {
@ -338,6 +344,7 @@ const PeopleTableRow = (props) => {
hasAccess={true}
className="table-container_row-checkbox-wrapper"
checked={isChecked}
style={{ borderBottom: "none" }}
>
<div className="table-container_element">{element}</div>
<Checkbox

View File

@ -1,13 +1,27 @@
import React from "react";
import styled from "styled-components";
import ErrorContainer from "@docspace/common/components/ErrorContainer";
import { I18nextProvider, useTranslation } from "react-i18next";
import i18n from "./i18n";
import DocspaceLogo from "../../../DocspaceLogo";
const ErrorUnavailable = () => {
const StyledWrapper = styled.div`
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 64px;
`;
const ErrorUnavailable = ({ logoUrl }) => {
const { t, ready } = useTranslation("Errors");
return ready ? (
<ErrorContainer headerText={t("ErrorUnavailableText")} />
<StyledWrapper>
<DocspaceLogo />
<ErrorContainer headerText={t("ErrorUnavailableText")} />
</StyledWrapper>
) : (
<></>
);

View File

@ -47,6 +47,17 @@ const StyledRowContainer = styled(RowContainer)`
}
}
.row-hotkey-border {
.files-row {
margin-top: -3px;
padding-top: 2px;
.row_content {
padding-top: 1px;
}
}
}
.row-selected:last-child {
.files-row {
border-bottom: ${(props) =>
@ -61,10 +72,18 @@ const StyledRowContainer = styled(RowContainer)`
.files-row {
border-top: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
margin-top: -2px;
margin-top: -2.2px;
padding-top: 1px;
padding-bottom: 1px;
${marginStyles};
.row_content {
padding-top: 1px;
.mainIcons {
padding-bottom: 1px;
}
}
}
}
`;
@ -135,7 +154,7 @@ const FilesRowContainer = ({
hasMoreFiles={hasMoreFiles}
draggable
useReactWindow={!withPaging}
itemHeight={59}
itemHeight={59.2}
>
{filesListNode}
</StyledRowContainer>

View File

@ -40,13 +40,37 @@ const StyledSimpleFilesRow = styled(Row)`
cursor: pointer;
${checkedStyle}
margin-top: -2px;
margin-top: -2.2px;
padding-top: 1px;
padding-bottom: 1px;
border-top: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
border-bottom: ${(props) =>
`1px ${props.theme.filesSection.tableView.row.borderColor} solid`};
.row_content {
padding-top: 1px;
.mainIcons {
padding-bottom: 1px;
}
}
.styled-checkbox-container {
.styled-element {
padding-top: 1px;
}
}
${(props) =>
props.isSmallContainer &&
css`
.row_content {
.mainIcons {
padding-bottom: 0px;
}
}
`}
}
`};

View File

@ -48,12 +48,14 @@ const StyledTableRow = styled(TableRow)`
background: ${(props) =>
`${props.theme.filesSection.tableView.row.backgroundActive} !important`};
margin-top: ${(props) => (props.showHotkeyBorder ? "-2px" : "-1px")};
margin-top: ${(props) =>
props.showHotkeyBorder ? "-2px" : "-0.8px"};
${(props) =>
!props.showHotkeyBorder &&
css`
border-top: ${(props) =>
`1px solid ${props.theme.filesSection.tableView.row.borderColor}`};
`0.8px solid ${props.theme.filesSection.tableView.row.borderColor}`};
`}
}
.table-container_file-name-cell {

View File

@ -31,6 +31,10 @@ const StyledTableContainer = styled(TableContainer)`
.table-row-selected {
.table-container_file-name-cell {
${fileNameCss}
.table-container_element-container,.additional-badges {
padding-top: 1px;
}
}
.table-container_row-context-menu-wrapper {
@ -77,6 +81,14 @@ const StyledTableContainer = styled(TableContainer)`
}
}
.table-hotkey-border {
.table-row {
.tablet-badge {
padding-top: 1px;
}
}
}
.files-item:not(.table-row-selected) + .table-row-selected {
.table-row {
.table-container_file-name-cell {
@ -228,7 +240,7 @@ const Table = ({
useReactWindow={!withPaging}
infoPanelVisible={infoPanelVisible}
columnInfoPanelStorageName={columnInfoPanelStorageName}
itemHeight={49}
itemHeight={48.8}
>
{filesListNode}
</TableBody>

View File

@ -36,6 +36,7 @@ const FileNameCell = ({
className="table-container_element-wrapper"
hasAccess={true}
checked={checked}
style={{ borderBottom: "none" }}
>
<div className="table-container_element-container">
<div className="table-container_element">{element}</div>

View File

@ -44,6 +44,7 @@ const RoomsRowDataComponent = (props) => {
checked={checkedProps}
element={element}
inProgress={inProgress}
isRoomTable={true}
{...props}
/>
<StyledBadgesContainer showHotkeyBorder={showHotkeyBorder}>

View File

@ -428,6 +428,7 @@ class Tile extends React.PureComponent {
this.cm = React.createRef();
this.tile = React.createRef();
this.checkboxContainerRef = React.createRef();
}
onError = () => {
@ -503,7 +504,8 @@ class Tile extends React.PureComponent {
e.target.nodeName !== "INPUT" &&
e.target.nodeName !== "rect" &&
e.target.nodeName !== "path" &&
e.target.nodeName !== "svg"
e.target.nodeName !== "svg" &&
!this.checkboxContainerRef.current?.contains(e.target)
) {
setSelection && setSelection([]);
}
@ -637,7 +639,10 @@ class Tile extends React.PureComponent {
{renderElement && !(!fileExst && id === -1) && !isEdit && (
<>
{!inProgress ? (
<div className="file-icon_container">
<div
className="file-icon_container"
ref={this.checkboxContainerRef}
>
<StyledElement
className="file-icon"
isRoom={isRoom}

View File

@ -81,26 +81,28 @@ const StyledBody = styled.div`
}
`;
const PaymentContainer = ({
isFreeTariff,
isGracePeriod,
theme,
isNotPaidPeriod,
payerEmail,
user,
isPaidPeriod,
currencySymbol,
startValue,
currentTariffPlanTitle,
tariffPlanTitle,
expandArticle,
gracePeriodEndDate,
delayDaysCount,
const PaymentContainer = (props) => {
const {
isFreeTariff,
isGracePeriod,
theme,
isNotPaidPeriod,
payerEmail,
user,
isPaidPeriod,
currencySymbol,
startValue,
currentTariffPlanTitle,
tariffPlanTitle,
expandArticle,
gracePeriodEndDate,
delayDaysCount,
isAlreadyPaid,
paymentDate,
t,
}) => {
isAlreadyPaid,
paymentDate,
t,
isNonProfit,
} = props;
const renderTooltip = () => {
return (
<>
@ -164,6 +166,8 @@ const PaymentContainer = ({
};
const planSuggestion = () => {
if (isNonProfit) return;
if (isFreeTariff) {
return (
<Text
@ -228,6 +232,41 @@ const PaymentContainer = ({
return;
};
const planDescription = () => {
if (isFreeTariff || isNonProfit) return;
if (isGracePeriod)
return (
<Text noSelect fontSize={"14px"} lineHeight={"16px"}>
<Trans t={t} i18nKey="GracePeriodActivatedInfo" ns="Payments">
Grace period activated
<strong>
from {{ fromDate: paymentDate }} to
{{ byDate: gracePeriodEndDate }}
</strong>
(days remaining: {{ delayDaysCount }})
</Trans>{" "}
<Text as="span" fontSize="14px" lineHeight="16px">
{t("GracePeriodActivatedDescription")}
</Text>
</Text>
);
if (isPaidPeriod)
return (
<Text
noSelect
fontSize={"14px"}
lineHeight={"16px"}
className="payment-info_managers-price"
>
<Trans t={t} i18nKey="BusinessFinalDateInfo" ns="Payments">
{{ finalDate: paymentDate }}
</Trans>
</Text>
);
};
const isPayer = user.email === payerEmail;
const isFreeAfterPaidPeriod = isFreeTariff && payerEmail?.length !== 0;
@ -244,7 +283,7 @@ const PaymentContainer = ({
? expiredTitleSubscriptionWarning()
: currentPlanTitle()}
{isAlreadyPaid && (
{!isNonProfit && isAlreadyPaid && (
<PayerInformationContainer
isPayer={isPayer}
isFreeAfterPaidPeriod={isFreeAfterPaidPeriod}
@ -254,59 +293,37 @@ const PaymentContainer = ({
<CurrentTariffContainer />
{planSuggestion()}
{planDescription()}
{isGracePeriod && (
<Text noSelect fontSize={"14px"} lineHeight={"16px"}>
<Trans t={t} i18nKey="GracePeriodActivatedInfo" ns="Payments">
Grace period activated
<strong>
from {{ fromDate: paymentDate }} to
{{ byDate: gracePeriodEndDate }}
</strong>
(days remaining: {{ delayDaysCount }})
</Trans>{" "}
<Text as="span" fontSize="14px" lineHeight="16px">
{t("GracePeriodActivatedDescription")}
</Text>
</Text>
)}
{!isNonProfit &&
!isGracePeriod &&
!isNotPaidPeriod &&
!isFreeAfterPaidPeriod && (
<div className="payment-info_wrapper">
<Text
noSelect
fontWeight={600}
fontSize={"14px"}
className="payment-info_managers-price"
>
<Trans t={t} i18nKey="PerUserMonth" ns="Common">
From {{ currencySymbol }}
{{ price: startValue }} per admin/power user /month
</Trans>
</Text>
{isPaidPeriod && !isFreeTariff && (
<Text
noSelect
fontSize={"14px"}
lineHeight={"16px"}
className="payment-info_managers-price"
>
<Trans t={t} i18nKey="BusinessFinalDateInfo" ns="Payments">
{{ finalDate: paymentDate }}
</Trans>
</Text>
)}
{renderTooltip()}
</div>
)}
{!isGracePeriod && !isNotPaidPeriod && !isFreeAfterPaidPeriod && (
<div className="payment-info_wrapper">
<Text
noSelect
fontWeight={600}
fontSize={"14px"}
className="payment-info_managers-price"
>
<Trans t={t} i18nKey="PerUserMonth" ns="Common">
From {{ currencySymbol }}
{{ price: startValue }} per admin/power user /month
</Trans>
</Text>
{renderTooltip()}
</div>
)}
<div className="payment-info">
<PriceCalculation
t={t}
isPayer={isPayer}
isFreeAfterPaidPeriod={isFreeAfterPaidPeriod}
/>
{!isNonProfit && (
<PriceCalculation
t={t}
isPayer={isPayer}
isFreeAfterPaidPeriod={isFreeAfterPaidPeriod}
/>
)}
<BenefitsContainer t={t} />
</div>
@ -327,7 +344,9 @@ export default inject(({ auth, payments }) => {
} = auth;
const { showText: expandArticle } = settingsStore;
const { isFreeTariff, currentTariffPlanTitle } = currentQuotaStore;
const { isFreeTariff, currentTariffPlanTitle, isNonProfit } =
currentQuotaStore;
const {
isNotPaidPeriod,
isPaidPeriod,
@ -372,5 +391,6 @@ export default inject(({ auth, payments }) => {
currentTariffPlanTitle,
portalTariffStatus,
portalPaymentQuotas,
isNonProfit,
};
})(withRouter(observer(PaymentContainer)));

View File

@ -35,7 +35,7 @@ class HotkeyStore {
scrollToCaret = () => {
const { offsetTop, item } = this.getItemOffset();
const scroll = document.getElementsByClassName("section-scroll")[0];
const scrollRect = scroll.getBoundingClientRect();
const scrollRect = scroll?.getBoundingClientRect();
if (item && item[0]) {
const el = item[0];

View File

@ -3,8 +3,10 @@ import HotkeysReactSvgUrl from "PUBLIC_DIR/images/hotkeys.react.svg?url";
import ProfileReactSvgUrl from "PUBLIC_DIR/images/profile.react.svg?url";
import PaymentsReactSvgUrl from "PUBLIC_DIR/images/payments.react.svg?url";
import HelpCenterReactSvgUrl from "PUBLIC_DIR/images/help.center.react.svg?url";
import SupportReactSvgUrl from "PUBLIC_DIR/images/support.react.svg?url";
import VideoGuidesReactSvgUrl from "PUBLIC_DIR/images/video.guides.react.svg?url";
import EmailReactSvgUrl from "PUBLIC_DIR/images/email.react.svg?url";
import LiveChatReactSvgUrl from "PUBLIC_DIR/images/support.react.svg?url";
import BookTrainingReactSvgUrl from "PUBLIC_DIR/images/book.training.react.svg?url";
//import VideoGuidesReactSvgUrl from "PUBLIC_DIR/images/video.guides.react.svg?url";
import InfoOutlineReactSvgUrl from "PUBLIC_DIR/images/info.outline.react.svg?url";
import LogoutReactSvgUrl from "PUBLIC_DIR/images/logout.react.svg?url";
import { makeAutoObservable } from "mobx";
@ -93,6 +95,10 @@ class ProfileActionsStore {
window.open(helpUrl, "_blank");
};
onLiveChatClick = () => {
//window.open(supportUrl, "_blank");
};
onSupportClick = () => {
const supportUrl = this.authStore.settingsStore.additionalResourcesData
?.feedbackAndSupportUrl;
@ -100,6 +106,13 @@ class ProfileActionsStore {
window.open(supportUrl, "_blank");
};
onBookTraining = () => {
const trainingEmail = this.authStore.settingsStore.additionalResourcesData
?.trainingEmail;
trainingEmail && window.open(`mailto:${trainingEmail}`, "_blank");
};
// onVideoGuidesClick = () => {
// window.open(VIDEO_GUIDES_URL, "_blank");
// };
@ -173,6 +186,29 @@ class ProfileActionsStore {
};
}
// }
let liveChat = null;
if (!isMobile) {
liveChat = {
key: "user-menu-live-chat",
icon: LiveChatReactSvgUrl,
label: t("Common:LiveChat"),
onClick: this.onLiveChatClick,
};
}
let bookTraining = null;
if (!isMobile) {
bookTraining = {
key: "user-menu-book-training",
icon: BookTrainingReactSvgUrl,
label: t("Common:BookTraining"),
onClick: this.onBookTraining,
};
}
const actions = [
{
key: "user-menu-profile",
@ -187,18 +223,16 @@ class ProfileActionsStore {
label: t("Common:PaymentsTitle"),
onClick: this.onPaymentsClick,
},
{
isSeparator: true,
key: "separator1",
},
{
key: "user-menu-help-center",
icon: HelpCenterReactSvgUrl,
label: t("Common:HelpCenter"),
onClick: this.onHelpCenterClick,
},
{
key: "user-menu-support",
icon: SupportReactSvgUrl,
label: t("Common:FeedbackAndSupport"),
onClick: this.onSupportClick,
},
// {
// key: "user-menu-video",
// icon: VideoGuidesReactSvgUrl,
@ -206,6 +240,18 @@ class ProfileActionsStore {
// onClick: this.onVideoGuidesClick,
// },
hotkeys,
{
isSeparator: true,
key: "separator2",
},
liveChat,
{
key: "user-menu-support",
icon: EmailReactSvgUrl,
label: t("Common:FeedbackAndSupport"),
onClick: this.onSupportClick,
},
bookTraining,
{
key: "user-menu-about",
icon: InfoOutlineReactSvgUrl,
@ -214,7 +260,7 @@ class ProfileActionsStore {
},
{
isSeparator: true,
key: "separator",
key: "separator3",
},
{
key: "user-menu-logout",
@ -226,7 +272,7 @@ class ProfileActionsStore {
];
if (debugInfo) {
actions.splice(3, 0, {
actions.splice(4, 0, {
key: "user-menu-debug",
icon: InfoOutlineReactSvgUrl,
label: "Debug Info",

View File

@ -0,0 +1,23 @@
import styled, { css } from "styled-components";
const StyledAlertComponent = styled.div`
position: relative;
border: ${(props) => `1px solid ${props.borderColor}`};
border-radius: 6px;
margin: 32px 0px;
padding: 12px;
${(props) => !!props.onClick && "cursor:pointer"};
display: grid;
grid-template-columns: ${(props) =>
props.needArrowIcon ? "1fr 16px" : "1fr"};
.alert-component_title {
color: ${(props) => props.titleColor};
}
.alert-component_icons {
margin: auto 0;
}
`;
export { StyledAlertComponent };

View File

@ -0,0 +1,106 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { withRouter } from "react-router";
import styled from "styled-components";
import Text from "@docspace/components/text";
import commonIconsStyles from "@docspace/components/utils/common-icons-style";
import ArrowRightIcon from "PUBLIC_DIR/images/arrow.right.react.svg";
import CrossReactSvg from "PUBLIC_DIR/images/cross.react.svg";
import Loaders from "../Loaders";
import { StyledAlertComponent } from "./StyledComponent";
import Link from "@docspace/components/link";
const StyledArrowRightIcon = styled(ArrowRightIcon)`
margin: auto 0;
path {
fill: ${(props) => props.theme.alertComponent.iconColor};
}
`;
const StyledCrossIcon = styled(CrossReactSvg)`
position: absolute;
right: 0px;
margin-right: 8px;
margin-top: 8px;
cursor: pointer;
${commonIconsStyles}
path {
fill: ${(props) => props.color};
}
`;
const AlertComponent = (props) => {
const {
id,
description,
title,
titleFontSize,
additionalDescription,
needArrowIcon = false,
needCloseIcon = false,
link,
linkColor,
linkTitle,
onAlertClick,
onCloseClick,
titleColor,
borderColor,
theme,
} = props;
return (
<StyledAlertComponent
theme={theme}
titleColor={titleColor}
borderColor={borderColor}
onClick={onAlertClick}
needArrowIcon={needArrowIcon}
id={id}
>
<div>
<Text
className="alert-component_title"
fontSize={titleFontSize ?? "12px"}
fontWeight={600}
>
{title}
</Text>
{additionalDescription && (
<Text fontWeight={600}>{additionalDescription}</Text>
)}
<Text
noSelect
fontSize="12px"
color={theme.alertComponent.descriptionColor}
>
{description}
</Text>
{link && (
<Link type="page" href={link} noHover color={linkColor}>
{linkTitle}
</Link>
)}
</div>
{needCloseIcon && (
<StyledCrossIcon size="extraSmall" onClick={onCloseClick} />
)}
{needArrowIcon && (
<StyledArrowRightIcon className="alert-component_arrow" />
)}
</StyledAlertComponent>
);
};
export default withRouter(
inject(({ auth }) => {
const { settingsStore } = auth;
const { theme } = settingsStore;
return {
theme,
};
})(observer(AlertComponent))
);

View File

@ -15,6 +15,7 @@ import SubArticleMainButton from "./sub-components/article-main-button";
import SubArticleBody from "./sub-components/article-body";
import ArticleProfile from "./sub-components/article-profile";
import ArticlePaymentAlert from "./sub-components/article-payment-alert";
import ArticleTeamTrainingAlert from "./sub-components/article-team-training";
import { StyledArticle } from "./styled-article";
import HideArticleMenuButton from "./sub-components/article-hide-menu-button";
import Portal from "@docspace/components/portal";
@ -40,6 +41,8 @@ const Article = ({
withSendAgain,
mainBarVisible,
isBannerVisible,
isNonProfit,
isTeamTrainingAlertAvailable,
...rest
}) => {
const [articleHeaderContent, setArticleHeaderContent] = React.useState(null);
@ -178,6 +181,7 @@ const Article = ({
<ArticleProfile showText={showText} />
)}
{isPaymentPageAvailable &&
!isNonProfit &&
(isFreeTariff || isGracePeriod) &&
showText && (
<ArticlePaymentAlert
@ -185,6 +189,9 @@ const Article = ({
toggleArticleOpen={toggleArticleOpen}
/>
)}
{isTeamTrainingAlertAvailable && showText && (
<ArticleTeamTrainingAlert />
)}
</SubArticleBody>
</StyledArticle>
{articleOpen && (isMobileOnly || window.innerWidth <= 375) && (
@ -247,9 +254,10 @@ export default inject(({ auth }) => {
currentTariffStatusStore,
userStore,
isPaymentPageAvailable,
isTeamTrainingAlertAvailable,
bannerStore,
} = auth;
const { isFreeTariff } = currentQuotaStore;
const { isFreeTariff, isNonProfit } = currentQuotaStore;
const { isGracePeriod } = currentTariffStatusStore;
const { withSendAgain } = userStore;
@ -283,5 +291,7 @@ export default inject(({ auth }) => {
withSendAgain,
mainBarVisible,
isBannerVisible,
isNonProfit,
isTeamTrainingAlertAvailable,
};
})(observer(Article));

View File

@ -2,20 +2,11 @@ import React, { useEffect } from "react";
import { inject, observer } from "mobx-react";
import { withRouter } from "react-router";
import { useTranslation, Trans } from "react-i18next";
import Text from "@docspace/components/text";
import ArrowRightIcon from "PUBLIC_DIR/images/arrow.right.react.svg";
import { StyledArticlePaymentAlert } from "../styled-article";
import styled from "styled-components";
import { combineUrl } from "@docspace/common/utils";
import history from "@docspace/common/history";
import Loaders from "../../Loaders";
const StyledArrowRightIcon = styled(ArrowRightIcon)`
margin: auto 0;
path {
fill: ${(props) => props.color};
}
`;
import AlertComponent from "../../AlertComponent";
const PROXY_BASE_URL = combineUrl(
window.DocSpaceConfig?.proxy?.url,
@ -52,52 +43,47 @@ const ArticlePaymentAlert = ({
toggleArticleOpen();
};
const title = isFreeTariff ? (
<Trans t={t} i18nKey="FreeStartupPlan" ns="Common">
{{ planName: currentTariffPlanTitle }}
</Trans>
) : (
t("Common:LatePayment")
);
const description = isFreeTariff
? pricePerManager && (
<Trans t={t} i18nKey="PerUserMonth" ns="Common">
From {{ currencySymbol }}
{{ price: pricePerManager }} per admin/power user /month
</Trans>
)
: t("Common:PayBeforeTheEndGracePeriod");
const additionalDescription = isFreeTariff
? t("Common:ActivateBusinessPlan", { planName: tariffPlanTitle })
: t("Common:GracePeriodActivated");
const color = isFreeTariff
? theme.catalog.paymentAlert.color
: theme.catalog.paymentAlert.warningColor;
const isShowLoader = !ready;
return isShowLoader ? (
<Loaders.Rectangle width="210px" height="88px" />
) : (
<StyledArticlePaymentAlert
onClick={onClick}
isFreeTariff={isFreeTariff}
theme={theme}
<AlertComponent
id="document_catalog-payment-alert"
>
<div>
<Text className="article-payment_border">
{isFreeTariff ? (
<Trans t={t} i18nKey="FreeStartupPlan" ns="Common">
{{ planName: currentTariffPlanTitle }}
</Trans>
) : (
t("Common:LatePayment")
)}
</Text>
<Text fontWeight={600}>
{isFreeTariff
? t("Common:ActivateBusinessPlan", { planName: tariffPlanTitle })
: t("Common:GracePeriodActivated")}
</Text>
<Text noSelect fontSize={"12px"}>
{isFreeTariff ? (
<>
{pricePerManager ? (
<Trans t={t} i18nKey="PerUserMonth" ns="Common">
From {{ currencySymbol }}
{{ price: pricePerManager }} per admin/power user /month
</Trans>
) : (
<></>
)}
</>
) : (
t("Common:PayBeforeTheEndGracePeriod")
)}
</Text>
</div>
<StyledArrowRightIcon />
</StyledArticlePaymentAlert>
borderColor={color}
titleColor={color}
onAlertClick={onClick}
title={title}
titleFontSize="11px"
description={description}
additionalDescription={additionalDescription}
needArrowIcon
/>
);
};
@ -105,7 +91,7 @@ export default withRouter(
inject(({ auth }) => {
const { paymentQuotasStore, currentQuotaStore, settingsStore } = auth;
const { currentTariffPlanTitle } = currentQuotaStore;
const { theme } = auth;
const { theme } = settingsStore;
const {
setPortalPaymentQuotas,
planCost,

View File

@ -0,0 +1,56 @@
import React, { useState } from "react";
import { inject, observer } from "mobx-react";
import { withRouter } from "react-router";
import { useTranslation } from "react-i18next";
import AlertComponent from "../../AlertComponent";
const ArticleTeamTrainingAlert = ({
theme,
trainingEmail,
organizationName,
}) => {
const { t, ready } = useTranslation("Common");
const [isClose, setIsClose] = useState(
localStorage.getItem("teamTrainingAlertClose")
);
const onClick = () => {
localStorage.setItem("teamTrainingAlertClose", true);
setIsClose(true);
};
if (isClose) return <></>;
const isShowLoader = !ready;
return isShowLoader ? (
<Loaders.Rectangle width="210px" height="88px" />
) : (
<AlertComponent
titleColor={theme.catalog.teamTrainingAlert.titleColor}
linkColor={theme.catalog.teamTrainingAlert.linkColor}
borderColor={theme.catalog.teamTrainingAlert.borderColor}
title={t("Common:UseLikePro", { organizationName })}
description={t("Common:BookTeamTraining")}
link={`mailto:${trainingEmail}`}
linkTitle={t("Common:BookNow")}
onCloseClick={onClick}
needCloseIcon
/>
);
};
export default withRouter(
inject(({ auth }) => {
const { settingsStore } = auth;
const { theme, additionalResourcesData, organizationName } = settingsStore;
return {
theme,
trainingEmail: additionalResourcesData.trainingEmail,
organizationName,
};
})(observer(ArticleTeamTrainingAlert))
);

View File

@ -130,7 +130,9 @@ class AuthStore {
if (!user) return false;
return !user.isAdmin && !user.isOwner && !user.isVisitor;
return (
!user.isAdmin && !user.isOwner && !user.isVisitor && !user.isCollaborator
);
}
get isPaymentPageAvailable() {
@ -141,6 +143,14 @@ class AuthStore {
return user.isOwner || user.isAdmin;
}
get isTeamTrainingAlertAvailable() {
const { user } = this.userStore;
if (!user) return false;
return user.isOwner || user.isAdmin || this.isRoomAdmin;
}
login = async (user, hash, session = true) => {
try {
const response = await api.user.login(user, hash, session);

View File

@ -207,6 +207,10 @@ class QuotasStore {
);
}
get isNonProfit() {
return this.currentPortalQuota?.nonProfit;
}
setPortalQuotaValue = (res) => {
this.currentPortalQuota = res;
this.currentPortalQuotaFeatures = res.features;

View File

@ -389,6 +389,9 @@ class SettingsStore {
setAdditionalResourcesData = (data) => {
this.additionalResourcesData = data;
if (!this.additionalResourcesData?.trainingEmail) {
this.additionalResourcesData.trainingEmail = "training@onlyoffice.com";
}
};
setAdditionalResourcesIsDefault = (additionalResourcesIsDefault) => {

View File

@ -1912,9 +1912,18 @@ const Base = {
paymentAlert: {
color: "#ed7309",
warningColor: "#F21C0E",
border: "1px solid #ed7309",
warningBorder: "1px solid #F21C0E",
},
teamTrainingAlert: {
titleColor: "#388BDE",
borderColor: "#388BDE",
linkColor: "#5299E0",
},
},
alertComponent: {
descriptionColor: "#555F65",
iconColor: "#657077",
},
catalogItem: {

View File

@ -1903,9 +1903,18 @@ const Dark = {
paymentAlert: {
color: "#ed7309",
warningColor: "#E06451",
border: "1px solid #ed7309",
warningBorder: "1px solid #E06451",
},
teamTrainingAlert: {
titleColor: "#FFFFFF",
borderColor: "#388BDE",
linkColor: "#5299E0",
},
},
alertComponent: {
descriptionColor: "#ADADAD",
iconColor: "#ADADAD",
},
catalogItem: {

View File

@ -1,6 +1,7 @@
import { css } from "styled-components";
const iconSizes = {
extraSmall: 8,
small: 12,
medium: 16,
big: 24,
@ -14,6 +15,7 @@ const getSizeStyle = (size) => {
height: 100%;
}
`;
case "extraSmall":
case "small":
case "medium":
case "big":

View File

@ -5,5 +5,6 @@
"ImageFileType": "Εικόνες",
"MailMergeFileType": "Επιλέξτε το αρχείο σε μορφή XLSX",
"OpenSavedDocument": "Άνοιγμα αποθηκευμένου εγγράφου σε νέα καρτέλα",
"SelectFilesType": "Επιλέξτε αρχεία τύπου: {{fileType}}"
"SelectFilesType": "Επιλέξτε αρχεία τύπου: {{fileType}}",
"UsersWithoutAccess": "Ορισμένοι χρήστες τους οποίους θέλετε να αναφέρετε δεν έχουν πρόσβαση στο δωμάτιο: {{users}}"
}

View File

@ -5,5 +5,6 @@
"ImageFileType": "kuvat",
"MailMergeFileType": "Valitse tiedosto XLSX-muodossa",
"OpenSavedDocument": "Avaa tallennettu asiakirja uudessa välilehdessä",
"SelectFilesType": "Valitse tiedostot tyyppiä: {{fileType}}"
"SelectFilesType": "Valitse tiedostot tyyppiä: {{fileType}}",
"UsersWithoutAccess": "Joillakin käyttäjillä, jotka haluat mainita, ei ole pääsyä huoneeseen: {{users}}"
}

View File

@ -5,5 +5,6 @@
"ImageFileType": "imagens",
"MailMergeFileType": "Selecione o ficheiro no formato XLSX",
"OpenSavedDocument": "Abrir o documento guardado numa nova aba",
"SelectFilesType": "Selecione ficheiros do tipo: {{fileType}}"
"SelectFilesType": "Selecione ficheiros do tipo: {{fileType}}",
"UsersWithoutAccess": "Alguns utilizadores que quer mencionar não têm acesso à sala: {{users}}"
}

View File

@ -3,6 +3,7 @@
"CodeSubtitle": "Στείλαμε έναν 6ψήφιο κωδικό στο email {{email}}. Ο κωδικός έχει περιορισμένη διάρκεια ισχύος, οπότε πληκτρολογήστε τον το συντομότερο δυνατό.",
"CodeTitle": "Ο κωδικός σας εστάλη με email",
"CookieSettingsTitle": "Διάρκεια περιόδου λειτουργίας",
"ErrorInvalidHeader": "Ληγμένος σύνδεσμος",
"ErrorInvalidText": "Σε 10 δευτερόλεπτα θα ανακατευθυνθείτε στη <1>DocSpace</1>",
"ExpiredCode": "Αυτός ο κωδικός δεν ισχύει πλέον. Ζητήστε έναν νέο κωδικό και δοκιμάστε ξανά.",
"ForgotPassword": "Ξεχάσατε τον κωδικό σας;",
@ -23,5 +24,7 @@
"RegistrationEmailWatermark": "Email",
"Remember": "Απομνημόνευση των στοιχείων μου",
"RememberHelper": "Η προεπιλεγμένη διάρκεια περιόδου λειτουργίας είναι 20 λεπτά. Ενεργοποιήστε αυτή την επιλογή για να την ορίσετε σε 1 έτος. Για να ορίσετε τη δική σας τιμή, μεταβείτε στις Ρυθμίσεις.",
"ResendCode": "Επαναποστολή κωδικού"
"ResendCode": "Επαναποστολή κωδικού",
"SignInWithCode": "Σύνδεση με μυστικό κωδικό",
"SignInWithPassword": "Σύνδεση με κωδικό πρόσβασης"
}

View File

@ -3,6 +3,7 @@
"CodeSubtitle": "Lähetimme 6-numeroisen koodin osoitteeseen {{email}}. Koodilla on rajoitettu voimassaoloaika, syötä se mahdollisimman pian.",
"CodeTitle": "Koodi lähetettiin sinulle sähköpostitse",
"CookieSettingsTitle": "Istunnon kesto",
"ErrorInvalidHeader": "Vanhentunut linkki",
"ErrorInvalidText": "10 sekunnin kuluttua sinut ohjataan <1>DocSpace</1>",
"ExpiredCode": "Tämä koodi ei ole enää voimassa. Pyydä uutta koodia ja yritä uudelleen.",
"ForgotPassword": "Unohditko salasanasi?",
@ -23,5 +24,7 @@
"RegistrationEmailWatermark": "sähköposti",
"Remember": "Muista minut",
"RememberHelper": "Istunnon oletuskesto on 20 minuuttia. Valitse tämä vaihtoehto, jos haluat asettaa sen 1 vuodeksi. Voit asettaa oman arvon Asetuksissa.",
"ResendCode": "Lähetä koodi uudelleen"
"ResendCode": "Lähetä koodi uudelleen",
"SignInWithCode": "Kirjaudu sisään salaisella koodilla",
"SignInWithPassword": "Kirjaudu sisään salasanalla"
}

View File

@ -3,6 +3,7 @@
"CodeSubtitle": "Enviamos um código de 6 dígitos para {{email}}. O código tem período de validade limitado, introduza-o o mais rápido possível.",
"CodeTitle": "Enviamos um email com o código para si",
"CookieSettingsTitle": "Duração da sessão",
"ErrorInvalidHeader": "Link expirado",
"ErrorInvalidText": "Em 10 segundos será redirecionado para a <1>DocSpace</1>",
"ExpiredCode": "Este código já não é válido. Solicite um novo código e tente de novo.",
"ForgotPassword": "Esqueceu-se da senha?",
@ -23,5 +24,7 @@
"RegistrationEmailWatermark": "E-mail",
"Remember": "Lembrar a minha sessão",
"RememberHelper": "A duração da sessão predefinida é de 20 minutos. Clique nesta opção para configurá-la para 1 ano. Para introduzir um período à sua escolha, aceda às definições.",
"ResendCode": "Reenviar código"
"ResendCode": "Reenviar código",
"SignInWithCode": "Iniciar sessão com o código secreto",
"SignInWithPassword": "Iniciar sessão com palavra-passe"
}

View File

@ -60,10 +60,17 @@ public class CountRoomCheckerStatistic : ITenantQuotaFeatureStat<CountRoomFeatur
public async Task<int> GetValue()
{
var daoFactory = _serviceProvider.GetService<IDaoFactory>();
var folderDao = _serviceProvider.GetService<IFolderDao<int>>();
var globalFolderHelper = _serviceProvider.GetService<GlobalFolderHelper>();
var globalFolder = _serviceProvider.GetService<GlobalFolder>();
var parentId = await globalFolderHelper.GetFolderVirtualRooms<int>();
var parentId = await globalFolder.GetFolderVirtualRoomsAsync(daoFactory, false);
if (parentId == default)
{
return 0;
}
return await folderDao.GetFoldersAsync(parentId).CountAsync();
}
}

View File

@ -31,7 +31,7 @@ public class GlobalNotify
{
public ILogger Logger { get; set; }
private readonly ICacheNotify<AscCacheItem> _notify;
public GlobalNotify(ICacheNotify<AscCacheItem> notify, ILoggerProvider options, CoreBaseSettings coreBaseSettings)
{
_notify = notify;
@ -41,7 +41,7 @@ public class GlobalNotify
ClearCache();
}
}
private void ClearCache()
{
try
@ -105,7 +105,7 @@ public class Global
private readonly DisplayUserSettingsHelper _displayUserSettingsHelper;
private readonly CustomNamingPeople _customNamingPeople;
private readonly FileSecurityCommon _fileSecurityCommon;
public Global(
IConfiguration configuration,
AuthContext authContext,
@ -133,17 +133,17 @@ public class Global
}
}
#region Property
#region Property
public DocThumbnailExtension DocThumbnailExtension;
public ThumbnailExtension ThumbnailExtension;
public const int MaxTitle = 170;
public static readonly Regex InvalidTitleChars = new Regex("[\t*\\+:\"<>?|\\\\/\\p{Cs}]");
public bool EnableUploadFilter => bool.TrueString.Equals(_configuration["files:upload-filter"] ?? "false", StringComparison.InvariantCultureIgnoreCase);
public TimeSpan StreamUrlExpire
{
get
@ -157,27 +157,27 @@ public class Global
return TimeSpan.FromMinutes(validateTimespan);
}
}
public bool IsDocSpaceAdministrator => _fileSecurityCommon.IsDocSpaceAdministrator(_authContext.CurrentAccount.ID);
public string GetDocDbKey()
{
const string dbKey = "UniqueDocument";
var resultKey = _coreSettings.GetSetting(dbKey);
if (!string.IsNullOrEmpty(resultKey))
{
return resultKey;
}
resultKey = Guid.NewGuid().ToString();
_coreSettings.SaveSetting(dbKey, resultKey);
return resultKey;
}
#endregion
#endregion
public static string ReplaceInvalidCharsAndTruncate(string title)
{
if (string.IsNullOrEmpty(title))
@ -201,27 +201,27 @@ public class Global
return InvalidTitleChars.Replace(title, "_");
}
public string GetUserName(Guid userId, bool alive = false)
{
if (userId.Equals(_authContext.CurrentAccount.ID))
{
return FilesCommonResource.Author_Me;
}
if (userId.Equals(ASC.Core.Configuration.Constants.Guest.ID))
{
return FilesCommonResource.Guest;
}
var userInfo = _userManager.GetUsers(userId);
if (userInfo.Equals(Constants.LostUser))
{
return alive ? FilesCommonResource.Guest : _customNamingPeople.Substitute<FilesCommonResource>("ProfileRemoved");
}
}
return userInfo.DisplayUserName(false, _displayUserSettingsHelper);
}
}
}
[Scope]
@ -229,18 +229,18 @@ public class GlobalStore
{
private readonly StorageFactory _storageFactory;
private readonly TenantManager _tenantManager;
public GlobalStore(StorageFactory storageFactory, TenantManager tenantManager)
{
_storageFactory = storageFactory;
_tenantManager = tenantManager;
}
public IDataStore GetStore(bool currentTenant = true)
{
return _storageFactory.GetStorage(currentTenant ? _tenantManager.GetCurrentTenant().Id : null, FileConstant.StorageModule);
}
public IDataStore GetStoreTemplate()
{
return _storageFactory.GetStorage(null, FileConstant.StorageTemplate);
@ -252,18 +252,18 @@ public class GlobalSpace
{
private readonly FilesSpaceUsageStatManager _filesSpaceUsageStatManager;
private readonly AuthContext _authContext;
public GlobalSpace(FilesSpaceUsageStatManager filesSpaceUsageStatManager, AuthContext authContext)
{
_filesSpaceUsageStatManager = filesSpaceUsageStatManager;
_authContext = authContext;
}
public Task<long> GetUserUsedSpaceAsync()
{
return GetUserUsedSpaceAsync(_authContext.CurrentAccount.ID);
}
public Task<long> GetUserUsedSpaceAsync(Guid userId)
{
return _filesSpaceUsageStatManager.GetUserSpaceUsageAsync(userId);
@ -283,7 +283,7 @@ public class GlobalFolder
private readonly GlobalStore _globalStore;
private readonly IServiceProvider _serviceProvider;
private readonly ILogger _logger;
public GlobalFolder(
CoreBaseSettings coreBaseSettings,
WebItemManager webItemManager,
@ -294,56 +294,56 @@ public class GlobalFolder
SettingsManager settingsManager,
GlobalStore globalStore,
ILoggerProvider options,
IServiceProvider serviceProvider
IServiceProvider serviceProvider
)
{
_coreBaseSettings = coreBaseSettings;
_webItemManager = webItemManager;
_webItemSecurity = webItemSecurity;
_authContext = authContext;
_tenantManager = tenantManager;
_userManager = userManager;
_settingsManager = settingsManager;
_globalStore = globalStore;
_serviceProvider = serviceProvider;
_coreBaseSettings = coreBaseSettings;
_webItemManager = webItemManager;
_webItemSecurity = webItemSecurity;
_authContext = authContext;
_tenantManager = tenantManager;
_userManager = userManager;
_settingsManager = settingsManager;
_globalStore = globalStore;
_serviceProvider = serviceProvider;
_logger = options.CreateLogger("ASC.Files");
}
internal static readonly IDictionary<int, int> ProjectsRootFolderCache =
new ConcurrentDictionary<int, int>(); /*Use SYNCHRONIZED for cross thread blocks*/
public async ValueTask<int> GetFolderProjectsAsync(IDaoFactory daoFactory)
{
if (_coreBaseSettings.Personal)
{
return default;
}
if (_webItemManager[WebItemManager.ProjectsProductID].IsDisabled(_webItemSecurity, _authContext))
{
return default;
}
var folderDao = daoFactory.GetFolderDao<int>();
if (!ProjectsRootFolderCache.TryGetValue(_tenantManager.GetCurrentTenant().Id, out var result))
{
result = await folderDao.GetFolderIDProjectsAsync(true);
ProjectsRootFolderCache[_tenantManager.GetCurrentTenant().Id] = result;
}
}
return result;
}
public async ValueTask<T> GetFolderProjectsAsync<T>(IDaoFactory daoFactory)
{
return (T)Convert.ChangeType(await GetFolderProjectsAsync(daoFactory), typeof(T));
}
internal static readonly ConcurrentDictionary<string, int> DocSpaceFolderCache =
new ConcurrentDictionary<string, int>();
public async ValueTask<int> GetFolderVirtualRoomsAsync(IDaoFactory daoFactory)
public async ValueTask<int> GetFolderVirtualRoomsAsync(IDaoFactory daoFactory, bool createIfNotExist = true)
{
if (_coreBaseSettings.DisableDocSpace)
{
@ -352,10 +352,15 @@ public class GlobalFolder
var key = $"vrooms/{_tenantManager.GetCurrentTenant().Id}";
if (!DocSpaceFolderCache.TryGetValue(key, out var result))
if (DocSpaceFolderCache.TryGetValue(key, out var result))
{
result = await daoFactory.GetFolderDao<int>().GetFolderIDVirtualRooms(true);
return result;
}
result = await daoFactory.GetFolderDao<int>().GetFolderIDVirtualRooms(createIfNotExist);
if (result != default)
{
DocSpaceFolderCache[key] = result;
}
@ -390,22 +395,22 @@ public class GlobalFolder
{
return (T)Convert.ChangeType(await GetFolderArchiveAsync(daoFactory), typeof(T));
}
internal static readonly ConcurrentDictionary<string, Lazy<int>> UserRootFolderCache =
new ConcurrentDictionary<string, Lazy<int>>(); /*Use SYNCHRONIZED for cross thread blocks*/
public T GetFolderMy<T>(FileMarker fileMarker, IDaoFactory daoFactory)
{
return (T)Convert.ChangeType(GetFolderMy(fileMarker, daoFactory), typeof(T));
}
public int GetFolderMy(FileMarker fileMarker, IDaoFactory daoFactory)
{
if (!_authContext.IsAuthenticated)
{
return default;
}
if (_userManager.IsUser(_authContext.CurrentAccount.ID))
{
return default;
@ -417,8 +422,8 @@ public class GlobalFolder
return myFolderId.Value;
}
protected internal void SetFolderMy(object value)
protected internal void SetFolderMy(object value)
{
var cacheKey = string.Format("my/{0}/{1}", _tenantManager.GetCurrentTenant().Id, value);
UserRootFolderCache.Remove(cacheKey, out _);
@ -441,23 +446,23 @@ public class GlobalFolder
return false;
}
internal static readonly IDictionary<int, int> CommonFolderCache =
new ConcurrentDictionary<int, int>(); /*Use SYNCHRONIZED for cross thread blocks*/
public async ValueTask<T> GetFolderCommonAsync<T>(FileMarker fileMarker, IDaoFactory daoFactory)
{
return (T)Convert.ChangeType(await GetFolderCommonAsync(fileMarker, daoFactory), typeof(T));
}
public async ValueTask<int> GetFolderCommonAsync(FileMarker fileMarker, IDaoFactory daoFactory)
{
if (_coreBaseSettings.Personal)
{
return default;
}
if (!CommonFolderCache.TryGetValue(_tenantManager.GetCurrentTenant().Id, out var commonFolderId))
if (!CommonFolderCache.TryGetValue(_tenantManager.GetCurrentTenant().Id, out var commonFolderId))
{
commonFolderId = await GetFolderIdAndProccessFirstVisitAsync(fileMarker, daoFactory, false);
if (!Equals(commonFolderId, 0))
@ -471,7 +476,7 @@ public class GlobalFolder
internal static readonly IDictionary<int, int> ShareFolderCache =
new ConcurrentDictionary<int, int>(); /*Use SYNCHRONIZED for cross thread blocks*/
public async ValueTask<int> GetFolderShareAsync(IDaoFactory daoFactory)
{
if (_coreBaseSettings.Personal)
@ -483,12 +488,12 @@ public class GlobalFolder
{
return default;
}
if (!ShareFolderCache.TryGetValue(_tenantManager.GetCurrentTenant().Id, out var sharedFolderId))
if (!ShareFolderCache.TryGetValue(_tenantManager.GetCurrentTenant().Id, out var sharedFolderId))
{
sharedFolderId = await daoFactory.GetFolderDao<int>().GetFolderIDShareAsync(true);
if (!sharedFolderId.Equals(default))
if (!sharedFolderId.Equals(default))
{
ShareFolderCache[_tenantManager.GetCurrentTenant().Id] = sharedFolderId;
}
@ -496,7 +501,7 @@ public class GlobalFolder
return sharedFolderId;
}
public async ValueTask<T> GetFolderShareAsync<T>(IDaoFactory daoFactory)
{
return (T)Convert.ChangeType(await GetFolderShareAsync(daoFactory), typeof(T));
@ -615,10 +620,10 @@ public class GlobalFolder
return privacyFolderId;
}
internal static readonly IDictionary<string, object> TrashFolderCache =
new ConcurrentDictionary<string, object>(); /*Use SYNCHRONIZED for cross thread blocks*/
public async Task<T> GetFolderTrashAsync<T>(IDaoFactory daoFactory)
{
return (T)Convert.ChangeType(await GetFolderTrashAsync(daoFactory), typeof(T));
@ -630,8 +635,8 @@ public class GlobalFolder
{
return null;
}
var cacheKey = string.Format("trash/{0}/{1}", _tenantManager.GetCurrentTenant().Id, _authContext.CurrentAccount.ID);
var cacheKey = string.Format("trash/{0}/{1}", _tenantManager.GetCurrentTenant().Id, _authContext.CurrentAccount.ID);
if (!TrashFolderCache.TryGetValue(cacheKey, out var trashFolderId))
{
@ -641,8 +646,8 @@ public class GlobalFolder
return trashFolderId;
}
protected internal void SetFolderTrash(object value)
protected internal void SetFolderTrash(object value)
{
var cacheKey = string.Format("trash/{0}/{1}", _tenantManager.GetCurrentTenant().Id, value);
TrashFolderCache.Remove(cacheKey);
@ -652,30 +657,30 @@ public class GlobalFolder
{
var folderDao = (FolderDao)daoFactory.GetFolderDao<int>();
var fileDao = (FileDao)daoFactory.GetFileDao<int>();
var id = my ? await folderDao.GetFolderIDUserAsync(false) : await folderDao.GetFolderIDCommonAsync(false);
if (Equals(id, 0)) //TODO: think about 'null'
{
id = my ? await folderDao.GetFolderIDUserAsync(true) : await folderDao.GetFolderIDCommonAsync(true);
//Copy start document
if (_settingsManager.LoadForDefaultTenant<AdditionalWhiteLabelSettings>().StartDocsEnabled)
{
try
{
var storeTemplate = _globalStore.GetStoreTemplate();
var culture = my ? _userManager.GetUsers(_authContext.CurrentAccount.ID).GetCulture() : _tenantManager.GetCurrentTenant().GetCulture();
var path = FileConstant.StartDocPath + culture + "/";
if (!await storeTemplate.IsDirectoryAsync(path))
{
path = FileConstant.StartDocPath + "en-US/";
}
path += my ? "my/" : "corporate/";
await SaveStartDocumentAsync(fileMarker, folderDao, fileDao, id, path, storeTemplate);
}
catch (Exception ex)
@ -684,31 +689,31 @@ public class GlobalFolder
}
}
}
return id;
}
private async Task SaveStartDocumentAsync(FileMarker fileMarker, FolderDao folderDao, FileDao fileDao, int folderId, string path, IDataStore storeTemplate)
{
var files = await storeTemplate.ListFilesRelativeAsync("", path, "*", false).ToListAsync();
foreach (var file in files)
foreach (var file in files)
{
await SaveFileAsync(fileMarker, fileDao, folderId, path + file, storeTemplate, files);
await SaveFileAsync(fileMarker, fileDao, folderId, path + file, storeTemplate, files);
}
await foreach (var folderName in storeTemplate.ListDirectoriesRelativeAsync(path, false))
{
var folder = _serviceProvider.GetService<Folder<int>>();
folder.Title = folderName;
folder.ParentId = folderId;
var subFolderId = await folderDao.SaveFolderAsync(folder);
await SaveStartDocumentAsync(fileMarker, folderDao, fileDao, subFolderId, path + folderName + "/", storeTemplate);
}
}
private async Task SaveFileAsync(FileMarker fileMarker, FileDao fileDao, int folder, string filePath, IDataStore storeTemp, IEnumerable<string> files)
private async Task SaveFileAsync(FileMarker fileMarker, FileDao fileDao, int folder, string filePath, IDataStore storeTemp, IEnumerable<string> files)
{
try
{
@ -718,7 +723,7 @@ public class GlobalFolder
if (FileUtility.GetFileExtension(filePath) == "." + ext
&& files.Contains(Regex.Replace(fileName, "\\." + ext + "$", "")))
return;
}
}
var file = _serviceProvider.GetService<File<int>>();
@ -739,7 +744,7 @@ public class GlobalFolder
_logger.ErrorSaveFile(ex);
}
}
public bool IsOutsider => _userManager.IsOutsider(_authContext.CurrentAccount.ID);
}
@ -749,14 +754,14 @@ public class GlobalFolderHelper
private readonly FileMarker _fileMarker;
private readonly IDaoFactory _daoFactory;
private readonly GlobalFolder _globalFolder;
public GlobalFolderHelper(FileMarker fileMarker, IDaoFactory daoFactory, GlobalFolder globalFolder)
{
_fileMarker = fileMarker;
_daoFactory = daoFactory;
_globalFolder = globalFolder;
}
public ValueTask<int> FolderProjectsAsync => _globalFolder.GetFolderProjectsAsync(_daoFactory);
public ValueTask<int> FolderCommonAsync => _globalFolder.GetFolderCommonAsync(_fileMarker, _daoFactory);
public int FolderMy => _globalFolder.GetFolderMy(_fileMarker, _daoFactory);
@ -806,16 +811,16 @@ public class GlobalFolderHelper
{
_globalFolder.SetFolderMy(val);
}
public async ValueTask<T> GetFolderShareAsync<T>()
{
return (T)Convert.ChangeType(await FolderShareAsync, typeof(T));
}
public ValueTask<int> FolderShareAsync => _globalFolder.GetFolderShareAsync(_daoFactory);
public object FolderTrash
{
get => _globalFolder.GetFolderTrashAsync(_daoFactory).Result;
set => _globalFolder.SetFolderTrash(value);
}
}
}
}

View File

@ -842,6 +842,15 @@ namespace ASC.Files.Core.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to You don&apos;t have enough permission to archive the room.
/// </summary>
public static string ErrorMessage_SecurityException_ArchiveRoom {
get {
return ResourceManager.GetString("ErrorMessage_SecurityException_ArchiveRoom", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You don&apos;t have permission to copy to this folder.
/// </summary>
@ -870,11 +879,11 @@ namespace ASC.Files.Core.Resources {
}
/// <summary>
/// Looks up a localized string similar to You don&apos;t have enough permission to archive the room.
/// Looks up a localized string similar to You don&apos;t have enough permission to unarchive the room.
/// </summary>
public static string ErrorMessage_UnarchiveRoom {
public static string ErrorMessage_SecurityException_UnarchiveRoom {
get {
return ResourceManager.GetString("ErrorMessage_UnarchiveRoom", resourceCulture);
return ResourceManager.GetString("ErrorMessage_SecurityException_UnarchiveRoom", resourceCulture);
}
}

View File

@ -375,8 +375,8 @@
<data name="ErrorMessage_SecurityException_MoveToFolder" xml:space="preserve">
<value>You don't have permission to move to this folder</value>
</data>
<data name="ErrorMessage_UnarchiveRoom" xml:space="preserve">
<value>You don't have enough permission to archive the room</value>
<data name="ErrorMessage_SecurityException_UnarchiveRoom" xml:space="preserve">
<value>You don't have enough permission to unarchive the room</value>
</data>
<data name="ErrorMessage_UpdateArchivedRoom" xml:space="preserve">
<value>You cannot edit archived rooms</value>
@ -472,4 +472,7 @@ Highest compatibility with docx, xlsx, pptx. </value>
<data name="AceStatusEnum_Collaborator" xml:space="preserve">
<value>Collaborator</value>
</data>
<data name="ErrorMessage_SecurityException_ArchiveRoom" xml:space="preserve">
<value>You don't have enough permission to archive the room</value>
</data>
</root>

View File

@ -146,6 +146,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
if (0 < Folders.Count)
{
var firstFolder = await FolderDao.GetFolderAsync(Folders[0]);
var isRoom = DocSpaceHelper.IsRoom(firstFolder.FolderType);
if (_copy && !await FilesSecurity.CanCopyAsync(firstFolder))
{
@ -155,7 +156,17 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
}
if (!_copy && !await FilesSecurity.CanMoveAsync(firstFolder))
{
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFile;
if (isRoom)
{
this[Err] = toFolder.FolderType == FolderType.Archive
? FilesCommonResource.ErrorMessage_SecurityException_ArchiveRoom
: FilesCommonResource.ErrorMessage_SecurityException_UnarchiveRoom;
}
else
{
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
}
return;
}
@ -187,7 +198,9 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
}
if (!_copy && !await fileSecurity.CanMoveToAsync(toFolder))
{
this[Err] = FilesCommonResource.ErrorMessage_SecurityException_MoveToFolder;
this[Err] = toFolder.FolderType == FolderType.VirtualRooms ? FilesCommonResource.ErrorMessage_SecurityException_UnarchiveRoom :
toFolder.FolderType == FolderType.Archive ? FilesCommonResource.ErrorMessage_SecurityException_UnarchiveRoom :
FilesCommonResource.ErrorMessage_SecurityException_MoveToFolder;
return;
}
@ -270,7 +283,16 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
}
else if (!copy && checkPermissions && !canMoveOrCopy)
{
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
if (isRoom)
{
this[Err] = toFolder.FolderType == FolderType.Archive
? FilesCommonResource.ErrorMessage_SecurityException_ArchiveRoom
: FilesCommonResource.ErrorMessage_SecurityException_UnarchiveRoom;
}
else
{
this[Err] = FilesCommonResource.ErrorMassage_SecurityException_MoveFolder;
}
}
else if (!isRoom && (toFolder.FolderType == FolderType.VirtualRooms || toFolder.RootFolderType == FolderType.Archive))
{
@ -278,7 +300,7 @@ class FileMoveCopyOperation<T> : FileOperation<FileMoveCopyOperationData<T>, T>
}
else if (isRoom && toFolder.FolderType != FolderType.VirtualRooms && toFolder.FolderType != FolderType.Archive)
{
this[Err] = FilesCommonResource.ErrorMessage_UnarchiveRoom;
this[Err] = FilesCommonResource.ErrorMessage_SecurityException_UnarchiveRoom;
}
else if (!isRoom && folder.Private && !await CompliesPrivateRoomRulesAsync(folder, toFolderParents))
{

View File

@ -0,0 +1,6 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.25807 1.11309C7.53755 0.967522 7.86929 0.962209 8.1533 1.09875L15.4333 4.59875C15.7797 4.76529 16 5.11564 16 5.5C16 5.88436 15.7797 6.23471 15.4333 6.40125L8.1533 9.90125C7.86929 10.0378 7.53755 10.0325 7.25807 9.88691L2 7.14834V9C2 9.55228 1.55228 10 1 10C0.447715 10 0 9.55228 0 9V5.5C0 5.12717 0.207401 4.78531 0.538066 4.61309L7.25807 1.11309ZM7.73791 7.88182L12.6921 5.5L7.73791 3.11818L3.16481 5.5L7.73791 7.88182Z" fill="#333333"/>
<path d="M2 12C2 11.4477 1.55228 11 1 11C0.447715 11 0 11.4477 0 12C0 12.5523 0.447715 13 1 13C1.55228 13 2 12.5523 2 12Z" fill="#333333"/>
<path d="M13 9.01632L11 9.97786V12.4812C9.92129 13.198 8.93284 13.5144 7.99797 13.5156C7.06354 13.5167 6.07649 13.2032 5 12.4832V10.1471L3 9.10542V13C3 13.3154 3.14878 13.6123 3.40141 13.8011C4.88035 14.9062 6.40699 15.5176 8.0005 15.5156C9.59296 15.5135 11.1183 14.8991 12.5958 13.8032C12.8501 13.6145 13 13.3166 13 13V9.01632Z" fill="#333333"/>
<path d="M5 9H4.96241L5 9.01958V9Z" fill="#333333"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -77,7 +77,7 @@
"Delete": "Silin",
"Disconnect": "Bağlantını kəs",
"DocSpaceAdmin": "DocSpace admini",
"DocSpaceOwner": "DocSpace admini",
"DocSpaceOwner": "DocSpace sahibi",
"Documents": "Sənədlər",
"DomainIpAddress": "IP ünvan kimi domen dəstəklənmir",
"Done": "İcra edildi",

View File

@ -6,6 +6,7 @@
"Action": "Ενέργεια",
"Actions": "Ενέργειες",
"Activate": "Ενεργοποίηση",
"ActivateBusinessPlan": "Ενεργοποίηση του πλάνου {{planName}};",
"Active": "Ενεργό",
"AddButton": "Προσθήκη",
"AddFilter": "Προσθήκη φίλτρου",
@ -25,6 +26,8 @@
"CancelButton": "Ακύρωση",
"ChangeButton": "Αλλαγή",
"ChangesSavedSuccessfully": "Οι αλλαγές αποθηκεύτηκαν με επιτυχία",
"ClearAll": "Εκκαθάριση όλων",
"ClearFilter": "Εκκαθάριση φίλτρου",
"CloseButton": "Κλείσιμο",
"Color": "Χρώμα",
"ComingSoon": "Σύντομα διαθέσιμο",
@ -73,10 +76,15 @@
"Date": "Ημερομηνία",
"Delete": "Διαγραφή",
"Disconnect": "Αποσύνδεση",
"DocSpaceAdmin": "Διαχειριστής DocSpace",
"DocSpaceOwner": "Ιδιοκτήτης DocSpace",
"Documents": "Έγγραφα",
"DomainIpAddress": "Οι τομείς ως διεύθυνση IP δεν υποστηρίζονται",
"Done": "Τέλος",
"DontAskAgain": "Να μη γίνει αίτημα ξανά για το όνομα του αρχείου κατά τη δημιουργία",
"Download": "Λήψη",
"DropzoneTitleExsts": "(JPG ή PNG)",
"DropzoneTitleLink": "Επιλέξτε νέα εικόνα",
"Duplicate": "Αντίγραφο",
"EditButton": "Επεξεργασία",
"Email": "Email",
@ -88,11 +96,18 @@
"EncryptionKeysReload": "Τα κλειδιά κρυπτογράφησης πρέπει να εισαχθούν εκ νέου",
"EnterName": "Εισαγωγή ονόματος",
"Error": "Σφάλμα",
"ErrorInternalServer": "Σφάλμα εσωτερικού διακομιστή. Δοκιμάστε ξανά αργότερα.",
"Exabyte": "EB",
"FeedbackAndSupport": "Ανατροφοδότηση & Υποστήριξη",
"FillFormButton": "Συμπληρώστε τη φόρμα",
"FirstName": "Όνομα",
"FreeStartupPlan": "Δωρεάν πρόγραμμα {{planName}}",
"FullAccess": "Πλήρης πρόσβαση",
"Gigabyte": "GB",
"GracePeriodActivated": "Η περίοδος χάριτος ενεργοποιήθηκε",
"HasFullAccess": "Έχει πλήρη πρόσβαση στο δωμάτιο",
"HelpCenter": "Κέντρο Βοήθειας",
"HideArticleMenu": "Απόκρυψη μενού",
"Hotkeys": "Πλήκτρα συντόμευσης",
"Image": "Εικόνα",
"IncorrectDomain": "Εσφαλμένος τομέας",
@ -101,9 +116,12 @@
"Info": "Πληροφορίες",
"Invite": "Πρόσκληση",
"InviteUsers": "Πρόσκληση χρηστών",
"IpAddress": "Διεύθυνση IP",
"Kilobyte": "KB",
"Language": "Γλώσσα",
"LastModifiedDate": "Τελευταία ημερομηνία τροποποίησης",
"LastModifiedDate": "Ημερομηνία τελευταίας τροποποίησης",
"LastName": "Επώνυμο",
"LatePayment": "Καθυστερημένη πληρωμή",
"LearnMore": "Μάθετε περισσότερα",
"Load": "Φόρτωση",
"LoadingDescription": "Περιμένετε...",
@ -117,6 +135,9 @@
"ManyEmails": "Αναλύθηκαν πάρα πολλά μηνύματα email",
"MaxLengthExceeded": "Το μέγιστο μήκος ενός ονόματος χρήστη ή άλλου τοπικού τμήματος είναι 64 χαρακτήρες.",
"MeLabel": "Εγώ",
"MediaError": "Δεν κατέστη δυνατή η φόρτωση της διεύθυνσης URL πολυμέσων",
"Megabyte": "MB",
"Member": "Μέλος",
"Members": "Μέλη",
"Name": "Όνομα",
"NewDocument": "Νέο έγγραφο",
@ -136,15 +157,19 @@
"Owner": "Κάτοχος",
"PageOfTotalPage": "{{page}} από {{totalPage}}",
"Pages": "Σελίδες",
"Paid": "Επί πληρωμή",
"Password": "Κωδικός πρόσβασης",
"PasswordLimitDigits": "ψηφία",
"PasswordLimitMessage": "Ο κωδικός πρόσβασης πρέπει να περιέχει",
"PasswordLimitSpecialSymbols": "ειδικούς χαρακτήρες",
"PasswordLimitUpperCase": "κεφαλαία γράμματα",
"PasswordMinimumLength": "Ελάχιστο μήκος",
"PayBeforeTheEndGracePeriod": "Βεβαιωθείτε ότι έχετε πραγματοποιήσει την πληρωμή πριν από τη λήξη της περιόδου χάριτος",
"PaymentsTitle": "Πληρωμές",
"People": "Άτομα",
"Petabyte": "PB",
"Phone": "Τηλέφωνο",
"Plugin": "Πρόσθετο",
"PreparationPortalTitle": "Η αποκατάσταση της πύλης βρίσκεται σε εξέλιξη",
"Preview": "Προεπισκόπηση",
"Previous": "Προηγούμενο",
@ -153,15 +178,20 @@
"ProviderNotConnected": "Ο πάροχος δεν είναι συνδεδεμένος με τον λογαριασμό σας",
"PunycodeDomain": "Οι τομείς Punycode δεν υποστηρίζονται",
"PunycodeLocalPart": "Το τοπικό τμήμα Punycode δεν υποστηρίζεται",
"ReconnectStorage": "Επανασύνδεση αποθηκευτικού χώρου",
"RecoverDescribeYourProblemPlaceholder": "Περιγράψτε το πρόβλημά σας",
"RecoverTitle": "Ανάκτηση πρόσβασης",
"RegistrationEmail": "Το email εγγραφής σας",
"RepeatInvitation": "Επανάληψη πρόσκλησης",
"RequiredField": "Υποχρεωτικό πεδίο",
"ResetApplication": "Επαναφορά εφαρμογής",
"Restore": "Επαναφορά",
"RestoreHere": "Επαναφορά εδώ",
"Review": "Αξιολόγηση",
"Role": "Θέση",
"Room": "Δωμάτιο",
"RoomAdmin": "Διαχειριστής δωματίου",
"Rooms": "Δωμάτια",
"SameEmail": "Δεν μπορείτε να χρησιμοποιήσετε το ίδιο email",
"SaveButton": "Αποθήκευση",
"SaveHereButton": "Αποθήκευση εδώ",
@ -173,8 +203,11 @@
"SendButton": "Αποστολή",
"SendRequest": "Αποστολή αιτήματος",
"Sending": "Αποστολή...",
"Sessions": "Συνεδρίες",
"Settings": "Ρυθμίσεις",
"SettingsDocSpace": "Ρυθμίσεις DocSpace",
"SettingsGeneral": "Γενικά",
"SettingsPersonal": "Προσωπικά",
"ShowMore": "Εμφάνιση περισσότερων",
"SignInWithFacebook": "Συνδεθείτε με το Facebook",
"SignInWithGoogle": "Συνδεθείτε με την Google",
@ -182,6 +215,7 @@
"SignInWithSso": "Σύνδεση με SSO",
"SignInWithTwitter": "Συνδεθείτε με το Twitter",
"Size": "Μέγεθος",
"SizeImageLarge": "Το μέγεθος της εικόνας είναι πολύ μεγάλο, επιλέξτε άλλη εικόνα.",
"SomethingWentWrong": "Κάτι πήγε στραβά.",
"SortBy": "Ταξινόμηση κατά",
"SpacesInLocalPart": "Το τοπικό τμήμα δεν μπορεί να περιέχει κενά",
@ -189,13 +223,16 @@
"SwitchToThumbnails": "Εναλλαγή σε προβολή μικρογραφιών",
"SwitchViewToCompact": "Εναλλαγή σε συμπαγή προβολή",
"Tags": "Ετικέτες",
"Terabyte": "TB",
"Title": "Τίτλος",
"TitleSelectFile": "Επιλογή",
"Today": "Σήμερα",
"Type": "Τύπος",
"UnexpectedError": "Εμφανίστηκε ένα απροσδόκητο σφάλμα. Δοκιμάστε ξανά αργότερα ή επικοινωνήστε με την υποστήριξη.",
"Unknown": "Άγνωστο",
"UnknownError": "Άγνωστο σφάλμα",
"User": "Χρήστης",
"UsersInvited": "Οι χρήστες προσκλήθηκαν",
"Version": "Έκδοση",
"Video": "Βίντεο",
"View": "Προβολή",

View File

@ -20,6 +20,9 @@
"Audio": "Audio",
"BarMaintenanceDescription": "We apologize for any short-term technical issues in service functioning that may appear on {{targetDate}} during the update of {{productName}}.",
"BarMaintenanceDisclaimer": "Please, make sure that all the changes are successfully saved during this day.",
"BookTraining": "Book a training",
"BookTeamTraining": "Book a team training session with our best specialists",
"BookNow": "Book now",
"ByFirstNameSorting": "By first name",
"ByLastNameSorting": "By last name",
"Bytes": "bytes",
@ -124,6 +127,7 @@
"LastName": "Last name",
"LatePayment": "Late payment",
"LearnMore": "Learn more",
"LiveChat": "Live chat",
"Load": "Load",
"LoadingDescription": "Please wait...",
"LoadingProcessing": "Loading...",
@ -236,6 +240,7 @@
"UnknownError": "Unknown error",
"User": "User",
"UsersInvited": "Users invited",
"UseLikePro": "Use {{organizationName}} like a pro",
"Version": "Version",
"Video": "Video",
"View": "View",

View File

@ -6,11 +6,13 @@
"Action": "Tapahtuma",
"Actions": "Toimet",
"Activate": "Aktivoi",
"ActivateBusinessPlan": "Aktivoi {{planName}} ohjelma?",
"Active": "Aktiivinen",
"AddButton": "Lisää",
"AddFilter": "Lisää suodatin",
"AddUsers": "Lisää käyttäjiä",
"Address": "Osoite",
"AdvancedFilter": "Hakuvaihtoehdot",
"Alert": "Varoitus",
"ApplyButton": "Käytä",
"Archive": "Arkisto",
@ -20,9 +22,12 @@
"BarMaintenanceDisclaimer": "Varmista, että kaikki muutokset on tallennettu onnistuneesti tämän päivän aikana.",
"ByFirstNameSorting": "Etunimen mukaan",
"ByLastNameSorting": "Sukunimen mukaan",
"Bytes": "bitit",
"CancelButton": "Peruuta",
"ChangeButton": "Muuta",
"ChangesSavedSuccessfully": "Muutokset tallennettu onnistuneesti",
"ClearAll": "Tyhjennä kaikki",
"ClearFilter": "Tyhjennä suodatin",
"CloseButton": "Sulje",
"Color": "Väri",
"ComingSoon": "Tulossa pian",
@ -71,10 +76,15 @@
"Date": "Päivämäärä",
"Delete": "Poista",
"Disconnect": "Katkaise",
"DocSpaceAdmin": "DocSpace- järjestelmänvalvoja",
"DocSpaceOwner": "DocSpace omistaja",
"Documents": "Asiakirjat",
"DomainIpAddress": "Verkkotunnuksia IP-osoitteina ei tueta",
"Done": "Tehty",
"DontAskAgain": "Älä kysy enää tiedostonimeä luonnin yhteydessä",
"Download": "Lataa",
"DropzoneTitleExsts": "(JPG tai PNG)",
"DropzoneTitleLink": "Valitse uusi kuva",
"EditButton": "Muokkaa",
"Email": "Sähköposti",
"EmptyEmail": "Yhtään sähköpostia ei ole jäsennelty",
@ -86,11 +96,17 @@
"EnterName": "Syötä nimi",
"Error": "Virhe",
"ErrorInternalServer": "Palvelimen sisäinen virhe. Yritä myöhemmin uudelleen.",
"Exabyte": "EB",
"FeedbackAndSupport": "Palaute & Tuki",
"FillFormButton": "Täytä lomake",
"FirstName": "Etunimi",
"FreeStartupPlan": "Ilmainen {{planName}}ohjelma",
"FullAccess": "Täysi pääsy",
"Gigabyte": "GB",
"GracePeriodActivated": "Lisäaika aktivoitu",
"HasFullAccess": "Hänellä on rajoittamaton pääsy huoneeseen",
"HelpCenter": "Ohjekeskus (englanniksi)",
"HideArticleMenu": "Piilota valikko",
"Hotkeys": "Pikanäppäimet",
"Image": "Kuva",
"IncorrectDomain": "Virheellinen verkkotunnus",
@ -98,8 +114,13 @@
"IncorrectLocalPart": "Virheellinen paikallinen osa",
"Info": "Info",
"Invite": "Kutsu",
"InviteUsers": "Kutsu käyttäjiä",
"IpAddress": "IP-osoite",
"Kilobyte": "KB",
"Language": "Kieli",
"LastModifiedDate": "Viimeisin muokkauspäivä",
"LastName": "Sukunimi",
"LatePayment": "Myöhästynyt maksu",
"LearnMore": "Lue lisää",
"Load": "Lataa",
"LoadingDescription": "Odota...",
@ -113,6 +134,9 @@
"ManyEmails": "Liian monta jäsenneltyä sähköpostia",
"MaxLengthExceeded": "Käyttäjänimen tai muun paikallisen osan enimmäispituus on 64 merkkiä.",
"MeLabel": "Minä",
"MediaError": "Media URL ei voitu ladata",
"Megabyte": "MB",
"Member": "Jäsen",
"Members": "Jäsenet",
"Name": "Nimi",
"NewDocument": "Uusi asiakirja",
@ -127,19 +151,24 @@
"OFORMsGallery": "OFORM-galleria",
"OKButton": "OK",
"Or": "tai",
"OtherLabel": "Muu",
"OtherOperations": "Muut toiminnot",
"Owner": "Omistaja",
"PageOfTotalPage": "{{page}} - {{totalPage}}",
"Pages": "Sivua",
"Paid": "Maksettu",
"Password": "Salasana",
"PasswordLimitDigits": "numerot",
"PasswordLimitMessage": "Salasanan on sisällettävä",
"PasswordLimitSpecialSymbols": "erikoismerkkejä",
"PasswordLimitUpperCase": "isoja kirjaimia",
"PasswordMinimumLength": "Vähimmäispituus",
"PayBeforeTheEndGracePeriod": "Suorita maksu ennen kuin lisäaika päättyy.",
"PaymentsTitle": "Maksut",
"People": "Ihmiset",
"Petabyte": "PB",
"Phone": "Puhelin",
"Plugin": "Kytkentä",
"PreparationPortalTitle": "Portaalin palautus on käynnissä.",
"Preview": "Esikatselu",
"Previous": "Edellinen",
@ -148,15 +177,20 @@
"ProviderNotConnected": "Palveluntarjoajaa ei ole yhdistetty tiliisi",
"PunycodeDomain": "Paikallisia verkkotunnuksia ei tueta",
"PunycodeLocalPart": "Punycode-verkkotunnuksia ei tueta",
"ReconnectStorage": "Yhdistä muisti uudelleen",
"RecoverDescribeYourProblemPlaceholder": "Kuvaile ongelmasi",
"RecoverTitle": "Käytä palautusta",
"RegistrationEmail": "Rekisteröitymisen sähköpostiosoitteesi",
"RepeatInvitation": "Toista kutsu",
"RequiredField": "Pakollinen kenttä",
"ResetApplication": "Nollaa sovellus",
"Restore": "Palauttaa",
"RestoreHere": "Palauta tähän",
"Review": "Arvostelu",
"Role": "Rooli",
"Room": "Huone",
"RoomAdmin": "Huoneen järjestelmänvalvoja",
"Rooms": "Huoneet",
"SameEmail": "Et voi käyttää samaa sähköpostiosoitetta",
"SaveButton": "Tallenna",
"SaveHereButton": "Tallenna tähän",
@ -168,7 +202,10 @@
"SendButton": "Lähetä",
"SendRequest": "Lähetä pyyntö",
"Sending": "Lähetetään...",
"Sessions": "Istunnot",
"Settings": "Asetukset",
"SettingsDocSpace": "DocSpace-asetukset",
"SettingsPersonal": "Henkilökohtainen",
"ShowMore": "Näytä lisää",
"SignInWithFacebook": "Kirjaudu sisään Facebookilla",
"SignInWithGoogle": "Kirjaudu sisään Googlella",
@ -176,6 +213,7 @@
"SignInWithSso": "Kirjaudu sisään kertakirjautumisella",
"SignInWithTwitter": "Kirjaudu sisään Twitterillä",
"Size": "Koko",
"SizeImageLarge": "Kuva on liian suuri, ole hyvä ja valitse toinen kuva.",
"SomethingWentWrong": "Jokin meni pieleen.",
"SortBy": "Lajitteluperuste",
"SpacesInLocalPart": "Paikallinen osa ei voi sisältää välilyöntejä",
@ -183,16 +221,20 @@
"SwitchToThumbnails": "Vaihda pikkukuvanäkymään",
"SwitchViewToCompact": "Suppeat tiedot",
"Tags": "Tunnisteet",
"Terabyte": "TB",
"Title": "Otsikko",
"TitleSelectFile": "Valitse",
"Today": "Tänään",
"Type": "Tyyppi",
"UnexpectedError": "Odottamaton virhe tapahtui. Yritä uudelleen myöhemmin tai ota yhteyttä tukeen.",
"Unknown": "Tuntematon",
"UnknownError": "Tuntematon virhe",
"User": "Käyttäjä",
"UsersInvited": "Kutsutut käyttäjät",
"Version": "Versio",
"Video": "Video",
"View": "Näkymä",
"WantToContinue": "Haluatko varmasti jatkaa?",
"Warning": "Varoitus",
"Website": "Sivusto"
}

View File

@ -216,7 +216,7 @@
"SignInWithSso": "Accedere con SSO",
"SignInWithTwitter": "Accedere con Twitter",
"Size": "Dimensione",
"SizeImageLarge": "La dimensione dell&apos;immagine è troppo grande, seleziona un&apos;altra immagine.",
"SizeImageLarge": "La dimensione dell&apos;immagine è troppo grande, seleziona un'altra immagine.",
"SomethingWentWrong": "Qualcosa è andato storto.",
"SortBy": "Ordina per",
"SpacesInLocalPart": "La parte locale non può contenere spazi",

View File

@ -115,6 +115,7 @@
"IncorrectEmail": "유효하지 않은 이메일입니다",
"IncorrectLocalPart": "유효하지 않은 로컬 파트입니다",
"Info": "정보",
"Invite": "초대",
"InviteUsers": "초대 링크",
"IpAddress": "IP 주소",
"Kilobyte": "KB",

View File

@ -85,6 +85,7 @@
"Download": "Pobierz",
"DropzoneTitleExsts": "(JPG lub PNG)",
"DropzoneTitleLink": "Wybierz nowy obraz",
"DropzoneTitleSecondary": "lub upuść plik tutaj",
"Duplicate": "Duplikować",
"EditButton": "Edytuj",
"Email": "E-mail",

View File

@ -3,13 +3,16 @@
"AboutCompanyTitle": "Sobre este programa",
"AccessRights": "Direitos de acesso",
"Accounts": "Contas",
"Action": "Ação",
"Actions": "Ações",
"Activate": "Activar",
"ActivateBusinessPlan": "Ativar o plano {{planName}}?",
"Active": "Ativo",
"AddButton": "Adicionar",
"AddFilter": "Adicionar filtro",
"AddUsers": "Adicionar utilizadores",
"Address": "Endereço",
"AdvancedFilter": "Opções de Procura",
"Alert": "Alerta",
"ApplyButton": "Aplicar",
"Archive": "Arquivo",
@ -19,9 +22,12 @@
"BarMaintenanceDisclaimer": "Por favor, certifique-se que guardou todas as alterações feitas no dia indicado.",
"ByFirstNameSorting": "Por primeiro nome",
"ByLastNameSorting": "Por último nome",
"Bytes": "bytes",
"CancelButton": "Cancelar",
"ChangeButton": "Trocar",
"ChangesSavedSuccessfully": "Alterações guardadas com êxito",
"ClearAll": "Limpar tudo",
"ClearFilter": "Limpar filtro",
"CloseButton": "Fechar",
"Color": "Cor",
"ComingSoon": "Em breve",
@ -70,11 +76,16 @@
"Date": "Data",
"Delete": "Eliminar",
"Disconnect": "Desligar",
"DocSpaceAdmin": "Administrador do DocSpace",
"DocSpaceOwner": "Proprietário do DocSpace ",
"Documents": "Documentos",
"DomainIpAddress": "Os domínios como endereço IP não são suportados",
"Done": "Concluído",
"DontAskAgain": "Não voltar a perguntar o nome do ficheiro ao criá-lo",
"Download": "Download",
"DropzoneTitleSecondary": "lub upuść plik tutaj",
"DropzoneTitleExsts": "(JPG ou PNG)",
"DropzoneTitleLink": "Selecionar uma nova imagem",
"DropzoneTitleSecondary": "ou arraste o ficheiro para aqui",
"Duplicate": "Duplicar",
"EditButton": "Editar",
"Email": "Email",
@ -86,19 +97,32 @@
"EncryptionKeysReload": "As chaves de Encriptação têm de ser reinseridas",
"EnterName": "Introduza o nome",
"Error": "Erro",
"ErrorInternalServer": "Erro interno do servidor. Tente novamente mais tarde.",
"Exabyte": "EB",
"FeedbackAndSupport": "Feedback e Suporte",
"FillFormButton": "Preencha o formulário",
"FirstName": "Primeiro nome",
"FreeStartupPlan": "Plano gratuito {{planName}}",
"FullAccess": "Acesso total",
"Gigabyte": "GB",
"GracePeriodActivated": "Período de tolerância ativado",
"HasFullAccess": "Ele tem acesso total à sala",
"HelpCenter": "Help Center",
"HideArticleMenu": "Ocultar menu",
"Hotkeys": "Teclas de atalho",
"Image": "Imagem",
"IncorrectDomain": "Domínio incorreto",
"IncorrectEmail": "E-mail inválido",
"IncorrectLocalPart": "Parte local incorreta",
"Info": "Informação",
"Invite": "Convidar",
"InviteUsers": "Convidar utilizadores",
"IpAddress": "Endereço de IP",
"Kilobyte": "KB",
"Language": "Idioma",
"LastModifiedDate": "Data da última modificação",
"LastName": "Último Nome",
"LatePayment": "Pagamento tardio",
"LearnMore": "Saiba ma",
"Load": "Carregar",
"LoadingDescription": "Por favor aguarde...",
@ -112,6 +136,9 @@
"ManyEmails": "Demasiados e-mails analisados",
"MaxLengthExceeded": "O comprimento máximo de um nome de utilizador ou outra parte local é de 64 caracteres.",
"MeLabel": "A mim",
"MediaError": "O URL da multimédia não pôde ser carregado",
"Megabyte": "MB",
"Member": "Membro",
"Members": "Membros",
"Name": "Nome",
"NewDocument": "Novo documento",
@ -131,15 +158,19 @@
"Owner": "Proprietário",
"PageOfTotalPage": "{{page}} de {{totalPage}}",
"Pages": "Páginas",
"Paid": "Pago",
"Password": "Palavra-chave",
"PasswordLimitDigits": "dígitos",
"PasswordLimitMessage": "A palavra-chave tem de conter",
"PasswordLimitSpecialSymbols": "caracteres especiais",
"PasswordLimitUpperCase": "letras maiúsculas",
"PasswordMinimumLength": "Comprimento mínimo",
"PayBeforeTheEndGracePeriod": "Certifique-se que faz o pagamento antes do período de tolerância terminar.",
"PaymentsTitle": "Pagamentos",
"People": "Pessoas",
"Petabyte": "PB",
"Phone": "Telemóvel",
"Plugin": "Plugin",
"PreparationPortalTitle": "A restauração do Portal está em curso",
"Preview": "Pré-visualizar",
"Previous": "Anterior",
@ -148,15 +179,20 @@
"ProviderNotConnected": "O fornecedor não está ligado à sua conta",
"PunycodeDomain": "Os domínios Punycode não são suportados",
"PunycodeLocalPart": "A peça local Punycode não é suportada",
"ReconnectStorage": "Reconectar armazenamento",
"RecoverDescribeYourProblemPlaceholder": "Descreva o seu problema",
"RecoverTitle": "Recuperação de acesso",
"RegistrationEmail": "O seu e-mail de registo",
"RepeatInvitation": "Repetir convite",
"RequiredField": "Campo obrigatório",
"ResetApplication": "Repor a aplicação",
"Restore": "Restaurar",
"RestoreHere": "Restaurar aqui",
"Review": "Rever",
"Role": "Função",
"Room": "Sala",
"RoomAdmin": "Administrador de Salas",
"Rooms": "Salas",
"SameEmail": "Não pode usar o mesmo e-mail",
"SaveButton": "Guardar",
"SaveHereButton": "Guardar aqui",
@ -168,8 +204,11 @@
"SendButton": "Enviar",
"SendRequest": "Enviar pedido",
"Sending": "A enviar...",
"Sessions": "Sessões",
"Settings": "Definições",
"SettingsDocSpace": "Configurações do DocSpace",
"SettingsGeneral": "Geral",
"SettingsPersonal": "Pessoal",
"ShowMore": "Mostrar mais",
"SignInWithFacebook": "Iniciar sessão com o Facebook",
"SignInWithGoogle": "Iniciar sessão com a Google",
@ -177,6 +216,7 @@
"SignInWithSso": "Entrar com SSO",
"SignInWithTwitter": "Iniciar sessão com o Twitter",
"Size": "Tamanho",
"SizeImageLarge": "A imagem é demasiado grande, por favor selecione outra imagem.",
"SomethingWentWrong": "Ocorreu um erro.",
"SortBy": "Ordenar por",
"SpacesInLocalPart": "A parte local não pode conter espaços",
@ -184,16 +224,21 @@
"SwitchToThumbnails": "Mudar para a vista de thumbnails",
"SwitchViewToCompact": "Mudar para visualização compacta",
"Tags": "Tags",
"Terabyte": "TB",
"Title": "Título",
"TitleSelectFile": "Selecionar",
"Today": "Hoje",
"Type": "Tipo",
"UnexpectedError": "Ocorreu um erro inesperado. Tente novamente mais tarde ou contacte o apoio.",
"Unknown": "Desconhecido",
"UnknownError": "Erro desconhecido",
"User": "Utilizador",
"UsersInvited": "Utilizadores convidados",
"Version": "Versão",
"Video": "Vídeo",
"View": "Ver",
"WantToContinue": "Tem a certeza que pretende continuar?",
"Warning": "Aviso",
"Website": "Website",
"Yesterday": "Ontem"
}