// Copyright 2018 The Gitea Authors. // Copyright 2016 The Gogs Authors. // All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package models import ( "bytes" "fmt" "strings" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" "github.com/Unknwon/com" "github.com/go-xorm/builder" "github.com/go-xorm/xorm" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/util" ) // CommentType defines whether a comment is just a simple comment, an action (like close) or a reference. type CommentType int // define unknown comment type const ( CommentTypeUnknown CommentType = -1 ) // Enumerate all the comment types const ( // Plain comment, can be associated with a commit (CommitID > 0) and a line (LineNum > 0) CommentTypeComment CommentType = iota CommentTypeReopen CommentTypeClose // References. CommentTypeIssueRef // Reference from a commit (not part of a pull request) CommentTypeCommitRef // Reference from a comment CommentTypeCommentRef // Reference from a pull request CommentTypePullRef // Labels changed CommentTypeLabel // Milestone changed CommentTypeMilestone // Assignees changed CommentTypeAssignees // Change Title CommentTypeChangeTitle // Delete Branch CommentTypeDeleteBranch // Start a stopwatch for time tracking CommentTypeStartTracking // Stop a stopwatch for time tracking CommentTypeStopTracking // Add time manual for time tracking CommentTypeAddTimeManual // Cancel a stopwatch for time tracking CommentTypeCancelTracking // Added a due date CommentTypeAddedDeadline // Modified the due date CommentTypeModifiedDeadline // Removed a due date CommentTypeRemovedDeadline // Dependency added CommentTypeAddDependency //Dependency removed CommentTypeRemoveDependency // Comment a line of code CommentTypeCode // Reviews a pull request by giving general feedback CommentTypeReview // Lock an issue, giving only collaborators access CommentTypeLock // Unlocks a previously locked issue CommentTypeUnlock ) // CommentTag defines comment tag type type CommentTag int // Enumerate all the comment tag types const ( CommentTagNone CommentTag = iota CommentTagPoster CommentTagWriter CommentTagOwner ) // Comment represents a comment in commit and issue page. type Comment struct { ID int64 `xorm:"pk autoincr"` Type CommentType PosterID int64 `xorm:"INDEX"` Poster *User `xorm:"-"` IssueID int64 `xorm:"INDEX"` Issue *Issue `xorm:"-"` LabelID int64 Label *Label `xorm:"-"` OldMilestoneID int64 MilestoneID int64 OldMilestone *Milestone `xorm:"-"` Milestone *Milestone `xorm:"-"` AssigneeID int64 RemovedAssignee bool Assignee *User `xorm:"-"` OldTitle string NewTitle string DependentIssueID int64 DependentIssue *Issue `xorm:"-"` CommitID int64 Line int64 // - previous line / + proposed line TreePath string Content string `xorm:"TEXT"` RenderedContent string `xorm:"-"` // Path represents the 4 lines of code cemented by this comment Patch string `xorm:"TEXT"` CreatedUnix util.TimeStamp `xorm:"INDEX created"` UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` // Reference issue in commit message CommitSHA string `xorm:"VARCHAR(40)"` Attachments []*Attachment `xorm:"-"` Reactions ReactionList `xorm:"-"` // For view issue page. ShowTag CommentTag `xorm:"-"` Review *Review `xorm:"-"` ReviewID int64 Invalidated bool } // LoadIssue loads issue from database func (c *Comment) LoadIssue() (err error) { if c.Issue != nil { return nil } c.Issue, err = GetIssueByID(c.IssueID) return } func (c *Comment) loadPoster(e Engine) (err error) { if c.Poster != nil { return nil } c.Poster, err = getUserByID(e, c.PosterID) if err != nil { if IsErrUserNotExist(err) { c.PosterID = -1 c.Poster = NewGhostUser() } else { log.Error("getUserByID[%d]: %v", c.ID, err) } } return err } // AfterDelete is invoked from XORM after the object is deleted. func (c *Comment) AfterDelete() { if c.ID <= 0 { return } _, err := DeleteAttachmentsByComment(c.ID, true) if err != nil { log.Info("Could not delete files for comment %d on issue #%d: %s", c.ID, c.IssueID, err) } } // HTMLURL formats a URL-string to the issue-comment func (c *Comment) HTMLURL() string { err := c.LoadIssue() if err != nil { // Silently dropping errors :unamused: log.Error("LoadIssue(%d): %v", c.IssueID, err) return "" } err = c.Issue.loadRepo(x) if err != nil { // Silently dropping errors :unamused: log.Error("loadRepo(%d): %v", c.Issue.RepoID, err) return "" } if c.Type == CommentTypeCode { if c.ReviewID == 0 { return fmt.Sprintf("%s/files#%s", c.Issue.HTMLURL(), c.HashTag()) } if c.Review == nil { if err := c.LoadReview(); err != nil { log.Warn("LoadReview(%d): %v", c.ReviewID, err) return fmt.Sprintf("%s/files#%s", c.Issue.HTMLURL(), c.HashTag()) } } if c.Review.Type <= ReviewTypePending { return fmt.Sprintf("%s/files#%s", c.Issue.HTMLURL(), c.HashTag()) } } return fmt.Sprintf("%s#%s", c.Issue.HTMLURL(), c.HashTag()) } // IssueURL formats a URL-string to the issue func (c *Comment) IssueURL() string { err := c.LoadIssue() if err != nil { // Silently dropping errors :unamused: log.Error("LoadIssue(%d): %v", c.IssueID, err) return "" } if c.Issue.IsPull { return "" } err = c.Issue.loadRepo(x) if err != nil { // Silently dropping errors :unamused: log.Error("loadRepo(%d): %v", c.Issue.RepoID, err) return "" } return c.Issue.HTMLURL() } // PRURL formats a URL-string to the pull-request func (c *Comment) PRURL() string { err := c.LoadIssue() if err != nil { // Silently dropping errors :unamused: log.Error("LoadIssue(%d): %v", c.IssueID, err) return "" } err = c.Issue.loadRepo(x) if err != nil { // Silently dropping errors :unamused: log.Error("loadRepo(%d): %v", c.Issue.RepoID, err) return "" } if !c.Issue.IsPull { return "" } return c.Issue.HTMLURL() } // APIFormat converts a Comment to the api.Comment format func (c *Comment) APIFormat() *api.Comment { return &api.Comment{ ID: c.ID, Poster: c.Poster.APIFormat(), HTMLURL: c.HTMLURL(), IssueURL: c.IssueURL(), PRURL: c.PRURL(), Body: c.Content, Created: c.CreatedUnix.AsTime(), Updated: c.UpdatedUnix.AsTime(), } } // CommentHashTag returns unique hash tag for comment id. func CommentHashTag(id int64) string { return fmt.Sprintf("issuecomment-%d", id) } // HashTag returns unique hash tag for comment. func (c *Comment) HashTag() string { return CommentHashTag(c.ID) } // EventTag returns unique event hash tag for comment. func (c *Comment) EventTag() string { return "event-" + com.ToStr(c.ID) } // LoadLabel if comment.Type is CommentTypeLabel, then load Label func (c *Comment) LoadLabel() error { var label Label has, err := x.ID(c.LabelID).Get(&label) if err != nil { return err } else if has { c.Label = &label } else { // Ignore Label is deleted, but not clear this table log.Warn("Commit %d cannot load label %d", c.ID, c.LabelID) } return nil } // LoadMilestone if comment.Type is CommentTypeMilestone, then load milestone func (c *Comment) LoadMilestone() error { if c.OldMilestoneID > 0 { var oldMilestone Milestone has, err := x.ID(c.OldMilestoneID).Get(&oldMilestone) if err != nil { return err } else if has { c.OldMilestone = &oldMilestone } } if c.MilestoneID > 0 { var milestone Milestone has, err := x.ID(c.MilestoneID).Get(&milestone) if err != nil { return err } else if has { c.Milestone = &milestone } } return nil } // LoadPoster loads comment poster func (c *Comment) LoadPoster() error { if c.PosterID <= 0 || c.Poster != nil { return nil } var err error c.Poster, err = getUserByID(x, c.PosterID) if err != nil { if IsErrUserNotExist(err) { c.PosterID = -1 c.Poster = NewGhostUser() } else { log.Error("getUserByID[%d]: %v", c.ID, err) } } return nil } // LoadAttachments loads attachments func (c *Comment) LoadAttachments() error { if len(c.Attachments) > 0 { return nil } var err error c.Attachments, err = getAttachmentsByCommentID(x, c.ID) if err != nil { log.Error("getAttachmentsByCommentID[%d]: %v", c.ID, err) } return nil } // LoadAssigneeUser if comment.Type is CommentTypeAssignees, then load assignees func (c *Comment) LoadAssigneeUser() error { var err error if c.AssigneeID > 0 { c.Assignee, err = getUserByID(x, c.AssigneeID) if err != nil { if !IsErrUserNotExist(err) { return err } c.Assignee = NewGhostUser() } } return nil } // LoadDepIssueDetails loads Dependent Issue Details func (c *Comment) LoadDepIssueDetails() (err error) { if c.DependentIssueID <= 0 || c.DependentIssue != nil { return nil } c.DependentIssue, err = getIssueByID(x, c.DependentIssueID) return err } // MailParticipants sends new comment emails to repository watchers // and mentioned people. func (c *Comment) MailParticipants(opType ActionType, issue *Issue) (err error) { return c.mailParticipants(x, opType, issue) } func (c *Comment) mailParticipants(e Engine, opType ActionType, issue *Issue) (err error) { mentions := markup.FindAllMentions(c.Content) if err = UpdateIssueMentions(e, c.IssueID, mentions); err != nil { return fmt.Errorf("UpdateIssueMentions [%d]: %v", c.IssueID, err) } if len(c.Content) > 0 { if err = mailIssueCommentToParticipants(e, issue, c.Poster, c.Content, c, mentions); err != nil { log.Error("mailIssueCommentToParticipants: %v", err) } } switch opType { case ActionCloseIssue: ct := fmt.Sprintf("Closed #%d.", issue.Index) if err = mailIssueCommentToParticipants(e, issue, c.Poster, ct, c, mentions); err != nil { log.Error("mailIssueCommentToParticipants: %v", err) } case ActionReopenIssue: ct := fmt.Sprintf("Reopened #%d.", issue.Index) if err = mailIssueCommentToParticipants(e, issue, c.Poster, ct, c, mentions); err != nil { log.Error("mailIssueCommentToParticipants: %v", err) } } return nil } func (c *Comment) loadReactions(e Engine) (err error) { if c.Reactions != nil { return nil } c.Reactions, err = findReactions(e, FindReactionsOptions{ IssueID: c.IssueID, CommentID: c.ID, }) if err != nil { return err } // Load reaction user data if _, err := c.Reactions.LoadUsers(); err != nil { return err } return nil } // LoadReactions loads comment reactions func (c *Comment) LoadReactions() error { return c.loadReactions(x) } func (c *Comment) loadReview(e Engine) (err error) { if c.Review == nil { if c.Review, err = getReviewByID(e, c.ReviewID); err != nil { return err } } c.Review.Issue = c.Issue return nil } // LoadReview loads the associated review func (c *Comment) LoadReview() error { return c.loadReview(x) } func (c *Comment) checkInvalidation(doer *User, repo *git.Repository, branch string) error { // FIXME differentiate between previous and proposed line commit, err := repo.LineBlame(branch, repo.Path, c.TreePath, uint(c.UnsignedLine())) if err != nil { return err } if c.CommitSHA != "" && c.CommitSHA != commit.ID.String() { c.Invalidated = true return UpdateComment(doer, c, "") } return nil } // CheckInvalidation checks if the line of code comment got changed by another commit. // If the line got changed the comment is going to be invalidated. func (c *Comment) CheckInvalidation(repo *git.Repository, doer *User, branch string) error { return c.checkInvalidation(doer, repo, branch) } // DiffSide returns "previous" if Comment.Line is a LOC of the previous changes and "proposed" if it is a LOC of the proposed changes. func (c *Comment) DiffSide() string { if c.Line < 0 { return "previous" } return "proposed" } // UnsignedLine returns the LOC of the code comment without + or - func (c *Comment) UnsignedLine() uint64 { if c.Line < 0 { return uint64(c.Line * -1) } return uint64(c.Line) } // AsDiff returns c.Patch as *Diff func (c *Comment) AsDiff() (*Diff, error) { diff, err := ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(c.Patch)) if err != nil { return nil, err } if len(diff.Files) == 0 { return nil, fmt.Errorf("no file found for comment ID: %d", c.ID) } secs := diff.Files[0].Sections if len(secs) == 0 { return nil, fmt.Errorf("no sections found for comment ID: %d", c.ID) } return diff, nil } // MustAsDiff executes AsDiff and logs the error instead of returning func (c *Comment) MustAsDiff() *Diff { diff, err := c.AsDiff() if err != nil { log.Warn("MustAsDiff: %v", err) } return diff } // CodeCommentURL returns the url to a comment in code func (c *Comment) CodeCommentURL() string { err := c.LoadIssue() if err != nil { // Silently dropping errors :unamused: log.Error("LoadIssue(%d): %v", c.IssueID, err) return "" } err = c.Issue.loadRepo(x) if err != nil { // Silently dropping errors :unamused: log.Error("loadRepo(%d): %v", c.Issue.RepoID, err) return "" } return fmt.Sprintf("%s/files#%s", c.Issue.HTMLURL(), c.HashTag()) } func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err error) { var LabelID int64 if opts.Label != nil { LabelID = opts.Label.ID } comment := &Comment{ Type: opts.Type, PosterID: opts.Doer.ID, Poster: opts.Doer, IssueID: opts.Issue.ID, LabelID: LabelID, OldMilestoneID: opts.OldMilestoneID, MilestoneID: opts.MilestoneID, RemovedAssignee: opts.RemovedAssignee, AssigneeID: opts.AssigneeID, CommitID: opts.CommitID, CommitSHA: opts.CommitSHA, Line: opts.LineNum, Content: opts.Content, OldTitle: opts.OldTitle, NewTitle: opts.NewTitle, DependentIssueID: opts.DependentIssueID, TreePath: opts.TreePath, ReviewID: opts.ReviewID, Patch: opts.Patch, } if _, err = e.Insert(comment); err != nil { return nil, err } if err = opts.Repo.getOwner(e); err != nil { return nil, err } if err = sendCreateCommentAction(e, opts, comment); err != nil { return nil, err } return comment, nil } func sendCreateCommentAction(e *xorm.Session, opts *CreateCommentOptions, comment *Comment) pre { line-height: 125%; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */OC.L10N.register( "files", { "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar", "Storage invalid" : "Speicher ungültig", "Unknown error" : "Unbekannter Fehler", "All files" : "Alle Dateien", "Recent" : "Neueste", "Favorites" : "Favoriten", "File could not be found" : "Datei konnte nicht gefunden werden", "Move or copy" : "Verschieben oder kopieren", "Download" : "Herunterladen", "Delete" : "Löschen", "Home" : "Home", "Close" : "Schließen", "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"", "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.", "Upload cancelled." : "Hochladen abgebrochen.", "Processing files …" : "Dateien werden verarbeitet…", "…" : "…", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Du möchtest{size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr", "Not enough free space" : "Nicht genügend freier Speicherplatz", "An unknown error has occurred" : "Unbekannter Fehler aufgetreten", "Uploading …" : "Lade hoch…", "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})", "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.", "Target folder does not exist any more" : "Zielordner existiert nicht mehr", "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}", "Actions" : "Aktionen", "Rename" : "Umbenennen", "Copy" : "Kopieren", "Choose target folder" : "Zielordner wählen", "Open" : "Öffnen", "Delete file" : "Datei löschen", "Delete folder" : "Ordner löschen", "Disconnect storage" : "Speicher trennen", "Unshare" : "Freigabe aufheben", "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden", "Files" : "Dateien", "Details" : "Details", "Select" : "Auswählen", "Pending" : "Ausstehend", "Unable to determine date" : "Datum konnte nicht ermittelt werden", "This operation is forbidden" : "Diese Operation ist nicht erlaubt", "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte die Logdateien überprüfen oder den Administrator kontaktieren.", "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits", "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden", "copy" : "kopieren", "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits", "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden", "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert", "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert", "{newName} already exists" : "{newName} existiert bereits", "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" konnte nicht umbenannt werden, da sie nicht mehr existiert", "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name \"{targetName}\" wird bereits bereits in diesem Ordner benutzt \"{dir}\". Bitte einen anderen Namen verwenden.", "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"", "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"", "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden , da diese bereits existiert.", "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden , da dieser bereits existiert", "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden", "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\"", "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}", "Name" : "Name", "Size" : "Größe", "Modified" : "Geändert", "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"], "_%n file_::_%n files_" : ["%n Datei","%n Dateien"], "{dirs} and {files}" : "{dirs} und {files}", "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"], "You don’t have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"], "New" : "Neu", "Select file range" : "Dateibereich auswählen", "{used} of {quota} used" : "{used} von {quota} verwendet", "{used} used" : "{used} verwendet", "\"{name}\" is an invalid file name." : "»{name}« ist kein gültiger Dateiname.", "File name cannot be empty." : "Der Dateiname darf nicht leer sein.", "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.", "\"{name}\" is not an allowed filetype" : "„{name}“ ist kein erlaubter Dateityp", "Storage of {owner} is full, files can not be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!", "Your storage is full, files can not be updated or synced anymore!" : "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Dein Speicher ist fast voll ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"], "View in folder" : "In Ordner anzeigen", "Copied!" : "Kopiert!", "Copy direct link (only works for users who have access to this file/folder)" : "Direkten Link kopieren (funktioniert nur für Nutzer, die Zugriff auf diese(n) Datei/Ordner haben)", "Path" : "Pfad", "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", "You can only favorite a single file or folder at a time" : "Du kannst gleichzeitig nur eine Datei oder einen Ordner als Favorit markieren", "New folder" : "Neuer Ordner", "Upload file" : "Datei hochladen", "Not favorited" : "Nicht favorisiert", "Remove from favorites" : "Von Favoriten entfernen", "Add to favorites" : "Zu den Favoriten hinzufügen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", "Added to favorites" : "Zu den Favoriten hinzugefügt", "Removed from favorites" : "Aus den Favoriten entfernt", "You added {file} to your favorites" : "Du hast {file} zu Deinen Favoriten hinzugefügt", "You removed {file} from your favorites" : "Du hast {file} aus Deinen Favoriten entfernt", "File changes" : "Dateiänderungen", "Created by {user}" : "Erstellt durch {user}", "Changed by {user}" : "Geändert durch {user}", "Deleted by {user}" : "Gelöscht durch {user}", "Restored by {user}" : "Wiederhergestellt durch {user}", "Renamed by {user}" : "Umbenannt durch {user}", "Moved by {user}" : "Verschoben durch {user}", "\"remote user\"" : "„Externer Benutzer“", "You created {file}" : "Du hast {file} erstellt", "You created an encrypted file in {file}" : "Du hast eine verschlüsselte Datei in {file} erstellt", "{user} created {file}" : "{user} hat {file} erstellt", "{user} created an encrypted file in {file}" : "{user} hat eine verschlüsselte Datei in {file} erstellt", "{file} was created in a public folder" : "{file} wurde in einem öffentlichen Ordner erstellt", "You changed {file}" : "Du hast {file} geändert", "You changed an encrypted file in {file}" : "Du hast eine verschlüsselte Datei in {file} geändert", "{user} changed {file}" : "{user} hat {file} geändert", "{user} changed an encrypted file in {file}" : "{user} hat eine verschlüsselte Datei in {file} geändert", "You deleted {file}" : "Du hast {file} gelöscht", "You deleted an encrypted file in {file}" : "Du hast eine verschlüsselte Datei in {file} gelöscht", "{user} deleted {file}" : "{user} hat {file} gelöscht", "{user} deleted an encrypted file in {file}" : "{user} hat eine verschlüsselte Datei in {file} gelöscht", "You restored {file}" : "Du hast {file} wiederhergestellt", "{user} restored {file}" : "{user} hat {file} wiederhergestellt", "You renamed {oldfile} to {newfile}" : "Du hast {oldfile} in {newfile} umbenannt", "{user} renamed {oldfile} to {newfile}" : "{user} hat {oldfile} in {newfile} umbenannt", "You moved {oldfile} to {newfile}" : "Du hast {oldfile} nach {newfile} verschoben", "{user} moved {oldfile} to {newfile}" : "{user} hat {oldfile} nach {newfile} verschoben", "A file has been added to or removed from your <strong>favorites</strong>" : "Eine Datei wurde Deinen <strong>Favoriten</strong> hinzugefügt oder daraus entfernt", "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurde <strong>geändert</strong> oder <strong>umbenannt</strong>", "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen auf Deine <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", "Unlimited" : "Unbegrenzt", "Upload (max. %s)" : "Hochladen (max. %s)", "Accept" : "Akzeptieren", "Reject" : "Ablehnen", "Incoming ownership transfer from {user}" : "Eingehende Besitzübertragung von {user}", "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Soll {path} angenommen werden?\n\nInfo: Der Übertragungsprozess nach der Annahme kann bis zu einer Stunde dauern.", "Ownership transfer failed" : "Besitzübertragung fehlgeschlagen", "Your ownership transfer of {path} to {user} failed." : "Die Besitzübertragung von {path} an {user} ist fehlgeschlagen.", "The ownership transfer of {path} from {user} failed." : "Die Übertragung von {path} ist fehlgeschlagen.", "Ownership transfer done" : "Besitzübertragung abgeschlossen", "Your ownership transfer of {path} to {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.", "The ownership transfer of {path} from {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.", "File Management" : "Dateiverwaltung", "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen", "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen", "Change" : "Ändern", "New owner" : "Neuer Besitzer", "Search users" : "Suche Nutzer", "Choose a file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen", "Transfer" : "Übertragen", "Transfer {path} to {userid}" : "Übertrage {path} an {userid}", "Invalid path selected" : "Ungültiger Dateipfad ausgewählt", "Ownership transfer request sent" : "Anforderung für die Übertragung des Besitzes versandt", "Tags" : "Tags", "Error while loading the file data" : "Fehler beim Laden der Datei-Daten", "Unable to change the favourite state of the file" : "Der favorisierte Status der Datei kann nicht geändert werden", "%s used" : "%s verwendet", "%s%% of %s used" : "%s%% von %s verwendet", "%1$s of %2$s used" : "%1$s von %2$s verwendet", "Settings" : "Einstellungen", "Show hidden files" : "Versteckte Dateien anzeigen", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">access your Files via WebDAV</a>" : "Diese Adresse benutzen, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">über WebDAV auf Deine Dateien zuzugreifen</a>", "Toggle grid view" : "Rasteransicht umschalten", "No files in here" : "Keine Dateien vorhanden", "Upload some content or sync with your devices!" : "Inhalte hochladen oder mit Deinen Geräten synchronisieren!", "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", "Select all" : "Alle auswählen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "No favorites yet" : "Noch keine Favoriten vorhanden", "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die als Favoriten markiert werden, erscheinen hier", "Deleted files" : "Gelöschte Dateien", "Shares" : "Freigaben", "Shared with others" : "Mit anderen geteilt", "Shared with you" : "Mit Dir geteilt", "Shared by link" : "Über einen Link geteilt", "Deleted shares" : "Gelöschte Freigaben", "Pending shares" : "Ausstehende Freigaben", "Text file" : "Textdatei", "New text file.txt" : "Neue Textdatei file.txt", "%s of %s used" : "%s von %s verwendet", "%1$s%% of %2$s used" : "%1$s%% von %2$s verwendet", "Cannot transfter ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den Du nicht besitzt, kann nicht übertragen werden" }, "nplurals=2; plural=(n != 1);");
OC.L10N.register( "files", { "Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar", "Storage invalid" : "Speicher ungültig", "Unknown error" : "Unbekannter Fehler", "All files" : "Alle Dateien", "Recent" : "Neueste", "Favorites" : "Favoriten", "File could not be found" : "Datei konnte nicht gefunden werden", "Move or copy" : "Verschieben oder kopieren", "Download" : "Herunterladen", "Delete" : "Löschen", "Home" : "Home", "Close" : "Schließen", "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"", "This will stop your current uploads." : "Hiermit werden die aktuellen Uploads angehalten.", "Upload cancelled." : "Hochladen abgebrochen.", "Processing files …" : "Dateien werden verarbeitet…", "…" : "…", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Du möchtest{size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", "Target folder \"{dir}\" does not exist any more" : "Ziel-Verzeichnis \"{dir}\" existiert nicht mehr", "Not enough free space" : "Nicht genügend freier Speicherplatz", "An unknown error has occurred" : "Unbekannter Fehler aufgetreten", "Uploading …" : "Lade hoch…", "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} von {totalSize} ({bitrate})", "Uploading that item is not supported" : "Hochladen von Daten dieser Art wird nicht unterstützt.", "Target folder does not exist any more" : "Zielordner existiert nicht mehr", "Error when assembling chunks, status code {status}" : "Fehler beim Zusammenführen der Teile (Chunks), Fehlermeldung {status}", "Actions" : "Aktionen", "Rename" : "Umbenennen", "Copy" : "Kopieren", "Choose target folder" : "Zielordner wählen", "Open" : "Öffnen", "Delete file" : "Datei löschen", "Delete folder" : "Ordner löschen", "Disconnect storage" : "Speicher trennen", "Unshare" : "Freigabe aufheben", "Could not load info for file \"{file}\"" : "Die Informationen zur Datei \"{file}\" konnten nicht geladen werden", "Files" : "Dateien", "Details" : "Details", "Select" : "Auswählen", "Pending" : "Ausstehend", "Unable to determine date" : "Datum konnte nicht ermittelt werden", "This operation is forbidden" : "Diese Operation ist nicht erlaubt", "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte die Logdateien überprüfen oder den Administrator kontaktieren.", "Could not move \"{file}\", target exists" : "\"{file}\" konnte nicht verschoben werden, Ziel existiert bereits", "Could not move \"{file}\"" : "\"{file}\" konnte nicht verschoben werden", "copy" : "kopieren", "Could not copy \"{file}\", target exists" : "\"{file}\" konnte nicht kopiert werden, Ziel existiert bereits", "Could not copy \"{file}\"" : "\"{file}\" konnte nicht kopiert werden", "Copied {origin} inside {destination}" : "{origin} wurde nach {destination} kopiert", "Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} und {nbfiles} weitere Dateien wurden nach {destination} kopiert", "{newName} already exists" : "{newName} existiert bereits", "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" konnte nicht umbenannt werden, da sie nicht mehr existiert", "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name \"{targetName}\" wird bereits bereits in diesem Ordner benutzt \"{dir}\". Bitte einen anderen Namen verwenden.", "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"", "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"", "Could not create file \"{file}\" because it already exists" : "Die Datei \"{file}\" konnte nicht erstellt werden , da diese bereits existiert.", "Could not create folder \"{dir}\" because it already exists" : "Der Ordner \"{dir}\" konnte nicht erstellt werden , da dieser bereits existiert", "Could not fetch file details \"{file}\"" : "Details zu \"{file}\" konnten nicht ermittelt werden", "Error deleting file \"{fileName}\"." : "Fehler beim Löschen der Datei \"{fileName}\"", "No search results in other folders for {tag}{filter}{endtag}" : "Keine Suchergebnisse in anderen Ordnern für {tag}{filter}{endtag}", "Name" : "Name", "Size" : "Größe", "Modified" : "Geändert", "_%n folder_::_%n folders_" : ["%n Ordner","%n Ordner"], "_%n file_::_%n files_" : ["%n Datei","%n Dateien"], "{dirs} and {files}" : "{dirs} und {files}", "_including %n hidden_::_including %n hidden_" : ["%n versteckte eingeschlossen","%n versteckte eingeschlossen"], "You don’t have permission to upload or create files here" : "Du hast keine Berechtigung, hier Dateien hochzuladen oder zu erstellen", "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"], "New" : "Neu", "Select file range" : "Dateibereich auswählen", "{used} of {quota} used" : "{used} von {quota} verwendet", "{used} used" : "{used} verwendet", "\"{name}\" is an invalid file name." : "»{name}« ist kein gültiger Dateiname.", "File name cannot be empty." : "Der Dateiname darf nicht leer sein.", "\"/\" is not allowed inside a file name." : "\"/\" ist innerhalb eines Dateinamens nicht erlaubt.", "\"{name}\" is not an allowed filetype" : "„{name}“ ist kein erlaubter Dateityp", "Storage of {owner} is full, files can not be updated or synced anymore!" : "Der Speicher von {owner} ist voll, Dateien können nicht mehr aktualisiert oder synchronisiert werden!", "Your storage is full, files can not be updated or synced anymore!" : "Dein Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Dein Speicher ist fast voll ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"], "View in folder" : "In Ordner anzeigen", "Copied!" : "Kopiert!", "Copy direct link (only works for users who have access to this file/folder)" : "Direkten Link kopieren (funktioniert nur für Nutzer, die Zugriff auf diese(n) Datei/Ordner haben)", "Path" : "Pfad", "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", "You can only favorite a single file or folder at a time" : "Du kannst gleichzeitig nur eine Datei oder einen Ordner als Favorit markieren", "New folder" : "Neuer Ordner", "Upload file" : "Datei hochladen", "Not favorited" : "Nicht favorisiert", "Remove from favorites" : "Von Favoriten entfernen", "Add to favorites" : "Zu den Favoriten hinzufügen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", "Added to favorites" : "Zu den Favoriten hinzugefügt", "Removed from favorites" : "Aus den Favoriten entfernt", "You added {file} to your favorites" : "Du hast {file} zu Deinen Favoriten hinzugefügt", "You removed {file} from your favorites" : "Du hast {file} aus Deinen Favoriten entfernt", "File changes" : "Dateiänderungen", "Created by {user}" : "Erstellt durch {user}", "Changed by {user}" : "Geändert durch {user}", "Deleted by {user}" : "Gelöscht durch {user}", "Restored by {user}" : "Wiederhergestellt durch {user}", "Renamed by {user}" : "Umbenannt durch {user}", "Moved by {user}" : "Verschoben durch {user}", "\"remote user\"" : "„Externer Benutzer“", "You created {file}" : "Du hast {file} erstellt", "You created an encrypted file in {file}" : "Du hast eine verschlüsselte Datei in {file} erstellt", "{user} created {file}" : "{user} hat {file} erstellt", "{user} created an encrypted file in {file}" : "{user} hat eine verschlüsselte Datei in {file} erstellt", "{file} was created in a public folder" : "{file} wurde in einem öffentlichen Ordner erstellt", "You changed {file}" : "Du hast {file} geändert", "You changed an encrypted file in {file}" : "Du hast eine verschlüsselte Datei in {file} geändert", "{user} changed {file}" : "{user} hat {file} geändert", "{user} changed an encrypted file in {file}" : "{user} hat eine verschlüsselte Datei in {file} geändert", "You deleted {file}" : "Du hast {file} gelöscht", "You deleted an encrypted file in {file}" : "Du hast eine verschlüsselte Datei in {file} gelöscht", "{user} deleted {file}" : "{user} hat {file} gelöscht", "{user} deleted an encrypted file in {file}" : "{user} hat eine verschlüsselte Datei in {file} gelöscht", "You restored {file}" : "Du hast {file} wiederhergestellt", "{user} restored {file}" : "{user} hat {file} wiederhergestellt", "You renamed {oldfile} to {newfile}" : "Du hast {oldfile} in {newfile} umbenannt", "{user} renamed {oldfile} to {newfile}" : "{user} hat {oldfile} in {newfile} umbenannt", "You moved {oldfile} to {newfile}" : "Du hast {oldfile} nach {newfile} verschoben", "{user} moved {oldfile} to {newfile}" : "{user} hat {oldfile} nach {newfile} verschoben", "A file has been added to or removed from your <strong>favorites</strong>" : "Eine Datei wurde Deinen <strong>Favoriten</strong> hinzugefügt oder daraus entfernt", "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurde <strong>geändert</strong> oder <strong>umbenannt</strong>", "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen auf Deine <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", "Unlimited" : "Unbegrenzt", "Upload (max. %s)" : "Hochladen (max. %s)", "Accept" : "Akzeptieren", "Reject" : "Ablehnen", "Incoming ownership transfer from {user}" : "Eingehende Besitzübertragung von {user}", "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "Soll {path} angenommen werden?\n\nInfo: Der Übertragungsprozess nach der Annahme kann bis zu einer Stunde dauern.", "Ownership transfer failed" : "Besitzübertragung fehlgeschlagen", "Your ownership transfer of {path} to {user} failed." : "Die Besitzübertragung von {path} an {user} ist fehlgeschlagen.", "The ownership transfer of {path} from {user} failed." : "Die Übertragung von {path} ist fehlgeschlagen.", "Ownership transfer done" : "Besitzübertragung abgeschlossen", "Your ownership transfer of {path} to {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.", "The ownership transfer of {path} from {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.", "File Management" : "Dateiverwaltung", "Transfer ownership of a file or folder" : "Besitz einer Datei oder eines Ordners übertragen", "Choose file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen", "Change" : "Ändern", "New owner" : "Neuer Besitzer", "Search users" : "Suche Nutzer", "Choose a file or folder to transfer" : "Datei oder Ordner zur Übertragung auswählen", "Transfer" : "Übertragen", "Transfer {path} to {userid}" : "Übertrage {path} an {userid}", "Invalid path selected" : "Ungültiger Dateipfad ausgewählt", "Ownership transfer request sent" : "Anforderung für die Übertragung des Besitzes versandt", "Tags" : "Tags", "Error while loading the file data" : "Fehler beim Laden der Datei-Daten", "Unable to change the favourite state of the file" : "Der favorisierte Status der Datei kann nicht geändert werden", "%s used" : "%s verwendet", "%s%% of %s used" : "%s%% von %s verwendet", "%1$s of %2$s used" : "%1$s von %2$s verwendet", "Settings" : "Einstellungen", "Show hidden files" : "Versteckte Dateien anzeigen", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">access your Files via WebDAV</a>" : "Diese Adresse benutzen, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">über WebDAV auf Deine Dateien zuzugreifen</a>", "Toggle grid view" : "Rasteransicht umschalten", "No files in here" : "Keine Dateien vorhanden", "Upload some content or sync with your devices!" : "Inhalte hochladen oder mit Deinen Geräten synchronisieren!", "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", "Select all" : "Alle auswählen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "No favorites yet" : "Noch keine Favoriten vorhanden", "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die als Favoriten markiert werden, erscheinen hier", "Deleted files" : "Gelöschte Dateien", "Shares" : "Freigaben", "Shared with others" : "Mit anderen geteilt", "Shared with you" : "Mit Dir geteilt", "Shared by link" : "Über einen Link geteilt", "Deleted shares" : "Gelöschte Freigaben", "Pending shares" : "Ausstehende Freigaben", "Text file" : "Textdatei", "New text file.txt" : "Neue Textdatei file.txt", "%s of %s used" : "%s von %s verwendet", "%1$s%% of %2$s used" : "%1$s%% von %2$s verwendet", "Cannot transfter ownership of a file or folder you don't own" : "Der Besitz einer Datei oder eines Ordners, den Du nicht besitzt, kann nicht übertragen werden" }, "nplurals=2; plural=(n != 1);");