From d61f84ca7f26e771ff15b03446521febb74f21c3 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 26 Mar 2025 09:58:05 +0000 Subject: [PATCH 1/5] chore(cleanup): remove comment from README Codeberg is prominently mentioned as a public instance on https://forgejo.org already. --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 0c4becacc4..f95aebadeb 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,6 @@ Our promise: **Independent Free/Libre Software forever!** ## What does Forgejo offer? - - If you like any of the following, Forgejo is literally meant for you: - Lightweight: Forgejo can easily be hosted on nearly **every machine**. From 6d7b4c80000a914c3b0f6d951c24902866c95643 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 26 Mar 2025 12:47:35 +0000 Subject: [PATCH 2/5] Update dependency mermaid to v11.6.0 (forgejo) (#7339) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7339 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index dfd359b31b..6e597bc511 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.21", - "mermaid": "11.5.0", + "mermaid": "11.6.0", "mini-css-extract-plugin": "2.9.2", "minimatch": "10.0.1", "monaco-editor": "0.52.2", @@ -1634,12 +1634,12 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.3.0.tgz", - "integrity": "sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.4.0.tgz", + "integrity": "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==", "license": "MIT", "dependencies": { - "langium": "3.0.0" + "langium": "3.3.1" } }, "node_modules/@napi-rs/wasm-runtime": { @@ -9361,9 +9361,9 @@ "license": "MIT" }, "node_modules/langium": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.0.0.tgz", - "integrity": "sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", "license": "MIT", "dependencies": { "chevrotain": "~11.0.3", @@ -9847,14 +9847,14 @@ } }, "node_modules/mermaid": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.5.0.tgz", - "integrity": "sha512-IYhyukID3zzDj1EihKiN1lp+PXNImoJ3Iyz73qeDAgnus4BNGsJV1n471P4PyeGxPVONerZxignwGxGTSwZnlg==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.6.0.tgz", + "integrity": "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==", "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", - "@mermaid-js/parser": "^0.3.0", + "@mermaid-js/parser": "^0.4.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", diff --git a/package.json b/package.json index 75739b3be0..a903935464 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.21", - "mermaid": "11.5.0", + "mermaid": "11.6.0", "mini-css-extract-plugin": "2.9.2", "minimatch": "10.0.1", "monaco-editor": "0.52.2", From e84d3a0f53dcfea75561e60dfa3da8254ee5b5bb Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 26 Mar 2025 13:08:03 +0000 Subject: [PATCH 3/5] fix(ui): Do not check for `vertical-align` (#7344) - This makes the `repo-settings` e2e testing happy. - There's no point into checking `vertical-align`; it has no effect when `position: absolute` is set, which is is currently set unconditionally for checkboxes and radios on forms. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7344 Reviewed-by: Michael Kriese Co-authored-by: Gusted Co-committed-by: Gusted --- tests/e2e/shared/forms.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/shared/forms.ts b/tests/e2e/shared/forms.ts index fc608489b0..adb5b6e3cb 100644 --- a/tests/e2e/shared/forms.ts +++ b/tests/e2e/shared/forms.ts @@ -18,7 +18,6 @@ export async function validate_form({page}: {page: Page}, scope: 'form' | 'field for (const b of await boxes.all()) { await expect(b).toHaveCSS('margin-left', '0px'); await expect(b).toHaveCSS('margin-top', '0px'); - await expect(b).toHaveCSS('vertical-align', 'baseline'); } // assert no (trailing) colon is used in labels From d0a5531ebcbc734726604cbea01059f1719534e2 Mon Sep 17 00:00:00 2001 From: Ellen Emilia Anna Zscheile Date: Wed, 26 Mar 2025 14:06:44 +0000 Subject: [PATCH 4/5] feat(build): lint-locale-usage should detect more Tr functions (#7278) Followup to https://codeberg.org/forgejo/forgejo/pulls/7109 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7278 Reviewed-by: Gusted Co-authored-by: Ellen Emilia Anna Zscheile Co-committed-by: Ellen Emilia Anna Zscheile --- build/lint-locale-usage/lint-locale-usage.go | 157 ++++++++++++------ .../lint-locale-usage_test.go | 22 ++- modules/translation/translation.go | 4 + 3 files changed, 121 insertions(+), 62 deletions(-) diff --git a/build/lint-locale-usage/lint-locale-usage.go b/build/lint-locale-usage/lint-locale-usage.go index f42bc59cbb..e1d04da301 100644 --- a/build/lint-locale-usage/lint-locale-usage.go +++ b/build/lint-locale-usage/lint-locale-usage.go @@ -26,8 +26,6 @@ import ( // this works by first gathering all valid source string IDs from `en-US` reference files // and then checking if all used source strings are actually defined -type OnMsgidHandler func(fset *token.FileSet, pos token.Pos, msgid string) - type LocatedError struct { Location string Kind string @@ -49,8 +47,24 @@ func (e LocatedError) Error() string { return sb.String() } -func isLocaleTrFunction(funcname string) bool { - return funcname == "Tr" || funcname == "TrN" +func InitLocaleTrFunctions() map[string][]uint { + ret := make(map[string][]uint) + + f0 := []uint{0} + ret["Tr"] = f0 + ret["TrString"] = f0 + ret["TrHTML"] = f0 + + ret["TrPluralString"] = []uint{1} + ret["TrN"] = []uint{1, 2} + + return ret +} + +type Handler struct { + OnMsgid func(fset *token.FileSet, pos token.Pos, msgid string) + OnUnexpectedInvoke func(fset *token.FileSet, pos token.Pos, funcname string, argc int) + LocaleTrFunctions map[string][]uint } // the `Handle*File` functions follow the following calling convention: @@ -58,7 +72,7 @@ func isLocaleTrFunction(funcname string) bool { // * `src` is either `nil` (then the function invokes `ReadFile` to read the file) // or the contents of the file as {`[]byte`, or a `string`} -func (omh OnMsgidHandler) HandleGoFile(fname string, src any) error { +func (handler Handler) HandleGoFile(fname string, src any) error { fset := token.NewFileSet() node, err := goParser.ParseFile(fset, fname, src, goParser.SkipObjectResolution) if err != nil { @@ -70,31 +84,47 @@ func (omh OnMsgidHandler) HandleGoFile(fname string, src any) error { } ast.Inspect(node, func(n ast.Node) bool { - // search for function calls of the form `anything.Tr(any-string-lit)` + // search for function calls of the form `anything.Tr(any-string-lit, ...)` call, ok := n.(*ast.CallExpr) - if !ok || len(call.Args) != 1 { + if !ok || len(call.Args) < 1 { return true } funSel, ok := call.Fun.(*ast.SelectorExpr) - if (!ok) || !isLocaleTrFunction(funSel.Sel.Name) { + if !ok { return true } - argLit, ok := call.Args[0].(*ast.BasicLit) - if (!ok) || argLit.Kind != token.STRING { + ltf, ok := handler.LocaleTrFunctions[funSel.Sel.Name] + if !ok { return true } - // extract string content - arg, err := strconv.Unquote(argLit.Value) - if err != nil { - return true + var gotUnexpectedInvoke *int + + for _, argNum := range ltf { + if len(call.Args) >= int(argNum+1) { + argLit, ok := call.Args[int(argNum)].(*ast.BasicLit) + if !ok || argLit.Kind != token.STRING { + continue + } + + // extract string content + arg, err := strconv.Unquote(argLit.Value) + if err == nil { + // found interesting strings + handler.OnMsgid(fset, argLit.ValuePos, arg) + } + } else { + argc := len(call.Args) + gotUnexpectedInvoke = &argc + } } - // found interesting string - omh(fset, argLit.ValuePos, arg) + if gotUnexpectedInvoke != nil { + handler.OnUnexpectedInvoke(fset, funSel.Sel.NamePos, funSel.Sel.Name, *gotUnexpectedInvoke) + } return true }) @@ -103,33 +133,33 @@ func (omh OnMsgidHandler) HandleGoFile(fname string, src any) error { } // derived from source: modules/templates/scopedtmpl/scopedtmpl.go, L169-L213 -func (omh OnMsgidHandler) handleTemplateNode(fset *token.FileSet, node tmplParser.Node) { +func (handler Handler) handleTemplateNode(fset *token.FileSet, node tmplParser.Node) { switch node.Type() { case tmplParser.NodeAction: - omh.handleTemplatePipeNode(fset, node.(*tmplParser.ActionNode).Pipe) + handler.handleTemplatePipeNode(fset, node.(*tmplParser.ActionNode).Pipe) case tmplParser.NodeList: nodeList := node.(*tmplParser.ListNode) - omh.handleTemplateFileNodes(fset, nodeList.Nodes) + handler.handleTemplateFileNodes(fset, nodeList.Nodes) case tmplParser.NodePipe: - omh.handleTemplatePipeNode(fset, node.(*tmplParser.PipeNode)) + handler.handleTemplatePipeNode(fset, node.(*tmplParser.PipeNode)) case tmplParser.NodeTemplate: - omh.handleTemplatePipeNode(fset, node.(*tmplParser.TemplateNode).Pipe) + handler.handleTemplatePipeNode(fset, node.(*tmplParser.TemplateNode).Pipe) case tmplParser.NodeIf: nodeIf := node.(*tmplParser.IfNode) - omh.handleTemplateBranchNode(fset, nodeIf.BranchNode) + handler.handleTemplateBranchNode(fset, nodeIf.BranchNode) case tmplParser.NodeRange: nodeRange := node.(*tmplParser.RangeNode) - omh.handleTemplateBranchNode(fset, nodeRange.BranchNode) + handler.handleTemplateBranchNode(fset, nodeRange.BranchNode) case tmplParser.NodeWith: nodeWith := node.(*tmplParser.WithNode) - omh.handleTemplateBranchNode(fset, nodeWith.BranchNode) + handler.handleTemplateBranchNode(fset, nodeWith.BranchNode) case tmplParser.NodeCommand: nodeCommand := node.(*tmplParser.CommandNode) - omh.handleTemplateFileNodes(fset, nodeCommand.Args) + handler.handleTemplateFileNodes(fset, nodeCommand.Args) - if len(nodeCommand.Args) != 2 { + if len(nodeCommand.Args) < 2 { return } @@ -138,54 +168,66 @@ func (omh OnMsgidHandler) handleTemplateNode(fset *token.FileSet, node tmplParse return } - nodeString, ok := nodeCommand.Args[1].(*tmplParser.StringNode) + nodeIdent, ok := nodeChain.Node.(*tmplParser.IdentifierNode) + if !ok || nodeIdent.Ident != "ctx" || len(nodeChain.Field) != 2 || nodeChain.Field[0] != "Locale" { + return + } + + ltf, ok := handler.LocaleTrFunctions[nodeChain.Field[1]] if !ok { return } - nodeIdent, ok := nodeChain.Node.(*tmplParser.IdentifierNode) - if !ok || nodeIdent.Ident != "ctx" { - return + var gotUnexpectedInvoke *int + + for _, argNum := range ltf { + if len(nodeCommand.Args) >= int(argNum+2) { + nodeString, ok := nodeCommand.Args[int(argNum+1)].(*tmplParser.StringNode) + if ok { + // found interesting strings + // the column numbers are a bit "off", but much better than nothing + handler.OnMsgid(fset, token.Pos(nodeString.Pos), nodeString.Text) + } + } else { + argc := len(nodeCommand.Args) - 1 + gotUnexpectedInvoke = &argc + } } - if len(nodeChain.Field) != 2 || nodeChain.Field[0] != "Locale" || !isLocaleTrFunction(nodeChain.Field[1]) { - return + if gotUnexpectedInvoke != nil { + handler.OnUnexpectedInvoke(fset, token.Pos(nodeChain.Pos), nodeChain.Field[1], *gotUnexpectedInvoke) } - // found interesting string - // the column numbers are a bit "off", but much better than nothing - omh(fset, token.Pos(nodeString.Pos), nodeString.Text) - default: } } -func (omh OnMsgidHandler) handleTemplatePipeNode(fset *token.FileSet, pipeNode *tmplParser.PipeNode) { +func (handler Handler) handleTemplatePipeNode(fset *token.FileSet, pipeNode *tmplParser.PipeNode) { if pipeNode == nil { return } // NOTE: we can't pass `pipeNode.Cmds` to handleTemplateFileNodes due to incompatible argument types for _, node := range pipeNode.Cmds { - omh.handleTemplateNode(fset, node) + handler.handleTemplateNode(fset, node) } } -func (omh OnMsgidHandler) handleTemplateBranchNode(fset *token.FileSet, branchNode tmplParser.BranchNode) { - omh.handleTemplatePipeNode(fset, branchNode.Pipe) - omh.handleTemplateFileNodes(fset, branchNode.List.Nodes) +func (handler Handler) handleTemplateBranchNode(fset *token.FileSet, branchNode tmplParser.BranchNode) { + handler.handleTemplatePipeNode(fset, branchNode.Pipe) + handler.handleTemplateFileNodes(fset, branchNode.List.Nodes) if branchNode.ElseList != nil { - omh.handleTemplateFileNodes(fset, branchNode.ElseList.Nodes) + handler.handleTemplateFileNodes(fset, branchNode.ElseList.Nodes) } } -func (omh OnMsgidHandler) handleTemplateFileNodes(fset *token.FileSet, nodes []tmplParser.Node) { +func (handler Handler) handleTemplateFileNodes(fset *token.FileSet, nodes []tmplParser.Node) { for _, node := range nodes { - omh.handleTemplateNode(fset, node) + handler.handleTemplateNode(fset, node) } } -func (omh OnMsgidHandler) HandleTemplateFile(fname string, src any) error { +func (handler Handler) HandleTemplateFile(fname string, src any) error { var tmplContent []byte switch src2 := src.(type) { case nil: @@ -222,7 +264,7 @@ func (omh OnMsgidHandler) HandleTemplateFile(fname string, src any) error { Err: err, } } - omh.handleTemplateFileNodes(fset, tmplParsed.Tree.Root.Nodes) + handler.handleTemplateFileNodes(fset, tmplParsed.Tree.Root.Nodes) return nil } @@ -289,12 +331,19 @@ func main() { gotAnyMsgidError := false - omh := OnMsgidHandler(func(fset *token.FileSet, pos token.Pos, msgid string) { - if !msgids.Contains(msgid) { + handler := Handler{ + OnMsgid: func(fset *token.FileSet, pos token.Pos, msgid string) { + if !msgids.Contains(msgid) { + gotAnyMsgidError = true + fmt.Printf("%s:\tmissing msgid: %s\n", fset.Position(pos).String(), msgid) + } + }, + OnUnexpectedInvoke: func(fset *token.FileSet, pos token.Pos, funcname string, argc int) { gotAnyMsgidError = true - fmt.Printf("%s:\tmissing msgid: %s\n", fset.Position(pos).String(), msgid) - } - }) + fmt.Printf("%s:\tunexpected invocation of %s with %d arguments\n", fset.Position(pos).String(), funcname, argc) + }, + LocaleTrFunctions: InitLocaleTrFunctions(), + } if err := filepath.WalkDir(".", func(fpath string, d fs.DirEntry, err error) error { if err != nil { @@ -308,15 +357,15 @@ func main() { if name == "docker" || name == ".git" || name == "node_modules" { return fs.SkipDir } - } else if name == "bindata.go" { + } else if name == "bindata.go" || fpath == "modules/translation/i18n/i18n_test.go" { // skip false positives } else if strings.HasSuffix(name, ".go") { - onError(omh.HandleGoFile(fpath, nil)) + onError(handler.HandleGoFile(fpath, nil)) } else if strings.HasSuffix(name, ".tmpl") { if strings.HasPrefix(fpath, "tests") && strings.HasSuffix(name, ".ini.tmpl") { // skip false positives } else { - onError(omh.HandleTemplateFile(fpath, nil)) + onError(handler.HandleTemplateFile(fpath, nil)) } } return nil diff --git a/build/lint-locale-usage/lint-locale-usage_test.go b/build/lint-locale-usage/lint-locale-usage_test.go index 3b3b746053..e573fb196e 100644 --- a/build/lint-locale-usage/lint-locale-usage_test.go +++ b/build/lint-locale-usage/lint-locale-usage_test.go @@ -11,21 +11,27 @@ import ( "github.com/stretchr/testify/require" ) +func buildHandler(ret *[]string) Handler { + return Handler{ + OnMsgid: func(fset *token.FileSet, pos token.Pos, msgid string) { + *ret = append(*ret, msgid) + }, + OnUnexpectedInvoke: func(fset *token.FileSet, pos token.Pos, funcname string, argc int) {}, + LocaleTrFunctions: InitLocaleTrFunctions(), + } +} + func HandleGoFileWrapped(t *testing.T, fname, src string) []string { var ret []string - omh := OnMsgidHandler(func(fset *token.FileSet, pos token.Pos, msgid string) { - ret = append(ret, msgid) - }) - require.NoError(t, omh.HandleGoFile(fname, src)) + handler := buildHandler(&ret) + require.NoError(t, handler.HandleGoFile(fname, src)) return ret } func HandleTemplateFileWrapped(t *testing.T, fname, src string) []string { var ret []string - omh := OnMsgidHandler(func(fset *token.FileSet, pos token.Pos, msgid string) { - ret = append(ret, msgid) - }) - require.NoError(t, omh.HandleTemplateFile(fname, src)) + handler := buildHandler(&ret) + require.NoError(t, handler.HandleTemplateFile(fname, src)) return ret } diff --git a/modules/translation/translation.go b/modules/translation/translation.go index 7be77536ca..3ecf8715a3 100644 --- a/modules/translation/translation.go +++ b/modules/translation/translation.go @@ -27,6 +27,10 @@ type contextKey struct{} var ContextKey any = &contextKey{} // Locale represents an interface to translation +// +// If this gets modified, remember to also adjust +// build/lint-locale-usage/lint-locale-usage.go's InitLocaleTrFunctions(), +// which requires to know in what argument positions `trKey`'s are given. type Locale interface { Language() string TrString(string, ...any) string From 372a3dad83dbea80660a6aa702cad860927acb59 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Thu, 27 Mar 2025 07:35:27 +0000 Subject: [PATCH 5/5] i18n: update of translations from Codeberg Translate (#7275) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7275 Reviewed-by: Earl Warren Co-authored-by: Codeberg Translate Co-committed-by: Codeberg Translate --- options/locale/locale_da.ini | 570 +++++++++++++++++++++++++- options/locale/locale_fr-FR.ini | 16 +- options/locale/locale_lv-LV.ini | 4 +- options/locale/locale_ru-RU.ini | 2 +- options/locale_next/locale_pt-BR.json | 7 +- 5 files changed, 579 insertions(+), 20 deletions(-) diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini index 87bd4dae2b..5bbd535b2a 100644 --- a/options/locale/locale_da.ini +++ b/options/locale/locale_da.ini @@ -158,7 +158,7 @@ exact_tooltip = Medtag kun resultater, der matcher den nøjagtige søgeterm regexp = RegExp regexp_tooltip = Fortolk søgetermen som et regulært udtryk org_kind = Søg i organisationer… -team_kind = Søg efter hold… +team_kind = Søg efter teams… code_kind = Søg kode… code_search_by_git_grep = Aktuelle kodesøgeresultater leveres af "git grep". Der kan være bedre resultater, hvis webstedsadministratoren aktiverer kodeindeksering. package_kind = Søg pakker… @@ -186,7 +186,7 @@ number_of_contributions_in_the_last_12_months = %s bidrag inden for de sidste 12 contributions_zero = Ingen bidrag contributions_format = {contributions} på {month} {day}, {year} contributions_one = bidrag -contributions_few = bidragene +contributions_few = bidrag less = Mindre more = Mere @@ -200,7 +200,7 @@ buttons.link.tooltip = Tilføj et link buttons.list.unordered.tooltip = Tilføj en punktliste buttons.list.task.tooltip = Tilføj en liste over opgaver buttons.list.ordered.tooltip = Tilføj en nummereret liste -buttons.mention.tooltip = Nævn en bruger eller et hold +buttons.mention.tooltip = Nævn en bruger eller et team buttons.ref.tooltip = Henvis til et problem eller pull-anmodning buttons.enable_monospace_font = Aktiver monospace-skrifttype buttons.disable_monospace_font = Deaktiver monospace-skrifttype @@ -363,7 +363,7 @@ my_repos = Depoter my_orgs = Organisationer view_home = Se %s filter = Andre filtre -filter_by_team_repositories = Filtrer efter holddepoter +filter_by_team_repositories = Filtrer efter team depoter feed_of = Feed af "%s" show_archived = Arkiveret show_both_archived_unarchived = Viser både arkiveret og ikke-arkiveret @@ -530,7 +530,7 @@ repo.collaborator.added.subject = %s føjede dig til %s som samarbejdspartner repo.collaborator.added.text = Du er blevet tilføjet som samarbejdspartner til depotet: team_invite.subject = %[1]s har inviteret dig til at deltage i %[2]s organisationen team_invite.text_1 = %[1]s har inviteret dig til at deltage i teamet %[2]s i organisationen %[3]s. -team_invite.text_2 = Klik venligst på følgende link for at blive medlem af holdet: +team_invite.text_2 = Klik venligst på følgende link for at blive medlem af teamet: team_invite.text_3 = Note: Denne invitation var beregnet til %[1]s. Hvis du ikke forventede denne invitation, kan du ignorere denne e-mail. [modal] @@ -553,7 +553,7 @@ Email = E-mailadresse Password = Adgangskode Retype = Bekræft adgangskode PayloadUrl = Payload URL -TeamName = Holdnavn +TeamName = Team navn AuthName = Autorisationsnavn AdminEmail = Admin email To = Gren navn @@ -2525,10 +2525,216 @@ settings.ignore_stale_approvals_desc = Tæl ikke godkendelser, der er foretaget settings.require_signed_commits = Kræv underskrevne commits settings.remove_protected_branch_success = Grenbeskyttelse for reglen "%s" er blevet fjernet. settings.enforce_on_admins = Håndhæv denne regel for depotadministratorer +settings.matrix.homeserver_url = Hjemmeserver URL +settings.matrix.room_id = Rum ID +branch.branch_name_conflict = Gren navn "%s" er i konflikt med den allerede eksisterende gren "%s". +release.tag_name_protected = Tagnavnet er beskyttet. +branch.name = Gren navn +settings.archive.error = Der opstod en fejl under forsøg på at arkivere depotet. Se loggen for flere detaljer. +settings.archive.error_ismirror = Du kan ikke arkivere et spejlet depot. +settings.unarchive.button = Fjern arkivering af depot +settings.unarchive.header = Fjern arkivering af dette depot +settings.lfs = LFS +settings.lfs_filelist = LFS-filer gemt i dette depot +settings.lfs_no_lfs_files = Ingen LFS-filer gemt i dette depot +settings.lfs_locks = Låse +settings.lfs_findcommits = Find commits +settings.lfs_lfs_file_no_commits = Ingen commits fundet for denne LFS-fil +settings.lfs_noattribute = Denne sti har ikke den låsbare attribut i standardgrenen +settings.lfs_delete = Slet LFS-fil med OID %s +settings.lfs_delete_warning = Sletning af en LFS-fil kan forårsage "objekt findes ikke"-fejl ved checkout. Er du sikker? +settings.lfs_findpointerfiles = Find pointer-filer +diff.download_patch = Download patch-fil +diff.whitespace_ignore_at_eol = Ignorer ændringer i blanke mellemrum på EOL +diff.stats_desc = %d ændrede filer med %d tilføjelser og %d sletninger +diff.stats_desc_file = %d ændringer: %d tilføjelser og %d sletninger +diff.bin = BIN +diff.file_suppressed = Filforskellen er undertrykt, fordi den er for stor +diff.generated = genereret +diff.vendored = forhandlet +diff.comment.add_line_comment = Tilføj linjekommentar +diff.comment.placeholder = Efterlad en kommentar +diff.comment.markdown_info = Styling med Markdown understøttes. +diff.comment.add_single_comment = Tilføj en enkelt kommentar +diff.comment.add_review_comment = Tilføj kommentar +diff.has_escaped = Denne linje har skjulte Unicode-tegn +release.tag_name = Tag navn +release.tag_helper_new = Nyt tag. Dette tag vil blive oprettet fra målet. +release.deletion_tag_desc = Vil slette dette tag fra depotet. Depotindhold og -historik forbliver uændret. Vil du fortsætte? +release.tag_already_exist = Dette tagnavn findes allerede. +release.add_tag_msg = Brug udgivelsens titel og indhold som tagmeddelelse. +release.tags_for = Tags for %s +release.asset_external_url = Ekstern URL +release.add_external_asset = Tilføj eksternt aktiv +branch.already_exists = En gren med navnet "%s" eksisterer allerede. +branch.tag_collision = Gren "%s" kan ikke oprettes, da et tag med samme navn allerede eksisterer i depotet. +releases.desc = Spor projektversioner og downloads. +release.detail = Udgivelsesdetaljer +release.tags = Tags +release.new_release = Ny udgivelse +release.stable = Stabil +release.compare = Sammenlign +release.deletion_desc = Sletning af en udgivelse fjerner den kun fra Forgejo. Det vil ikke påvirke Git-tagget, indholdet af dit depot eller dets historie. Vil du fortsætte? +release.deletion_tag_success = Tagget er blevet slettet. +release.tag_name_already_exist = Der findes allerede en udgivelse med dette tagnavn. +release.tag_name_invalid = Tagnavnet er ikke gyldigt. +release.downloads = Downloads +release.system_generated = Denne vedhæftede fil genereres automatisk. +release.invalid_external_url = Ugyldig ekstern URL: "%s" +branch.deleted_by = Slettet af %s +diff.comment.start_review = Start anmeldelse +diff.comment.reply = Svar +diff.review.comment = Kommentar +diff.review.approve = Godkend +diff.review.self_reject = Forfattere af pull-anmodninger kan ikke anmode om ændringer på deres egen pull-anmodning +diff.review.reject = Anmod om ændringer +diff.review.self_approve = Forfattere af pull-anmodninger kan ikke godkende deres egen pull-anmodning +diff.committed_by = committed af +diff.protected = Beskyttet +diff.image.side_by_side = Side om side +diff.image.swipe = Swipe +diff.image.overlay = Overlejring +release.prerelease = Forhåndsudgivelse +settings.tags.protection.allowed.teams = Tilladte hold +settings.tags.protection.create = Tilføj regel +settings.tags.protection.none = Der er ingen beskyttede tags. +settings.tags.protection.pattern.description = Du kan bruge et enkelt navn eller et globmønster eller regulært udtryk til at matche flere tags. Læs mere i guiden til beskyttede tags. +settings.thread_id = Thread ID +settings.matrix.message_type = Meddelelsestype +settings.matrix.access_token_helper = Det anbefales at opsætte en dedikeret Matrix-konto til dette. Adgangstokenet kan hentes fra Element-webklienten (i en privat/inkognito-fane) > Brugermenu (øverst til venstre) > Alle indstillinger > Hjælp og om > Avanceret > Adgangstoken (lige under hjemmeserverens URL). Luk privat-/inkognitofanen (logging ud ville ugyldiggøre tokenet). +settings.lfs_invalid_locking_path = Ugyldig sti: %s +settings.lfs_invalid_lock_directory = Kan ikke låse mappe: %s +diff.options_button = Diff muligheder +release.hide_archive_links = Skjul automatisk genererede arkiver +release.hide_archive_links_helper = Skjul automatisk genererede kildekodearkiver for denne udgivelse. For eksempel hvis du uploader din egen. +release.add_tag = Opret tag +release.releases_for = Udgivelser for %s +branch.delete_branch_has_new_commits = Gren "%s" kan ikke slettes, fordi nye commits er blevet tilføjet efter fletning. +branch.create_branch = Opret gren %s +branch.create_from = fra "%s" +branch.create_success = Gren "%s" er blevet oprettet. +branch.branch_already_exists = Gren "%s" findes allerede i dette depot. +release.releases = Udgivelser +release.draft = Udkast +release.type_attachment = Vedhæftning +release.type_external_asset = Eksternt aktiv +release.asset_name = Aktivets navn +release.tag_helper_existing = Eksisterende tag. +release.title_empty = Titel må ikke være tom. +release.message = Beskriv denne udgivelse +settings.bot_token = Bot token +settings.chat_id = Chat ID +diff.show_file_tree = Vis filtræ +diff.hide_file_tree = Skjul filtræ +release.ahead.commits = %d commits +release.ahead.target = til %s siden denne udgivelse +release.source_code = Kildekode +release.edit_subheader = Udgivelser organiserer projektversioner. +release.tag_helper = Vælg et eksisterende tag, eller opret et nyt tag. +release.target = Mål +tag.ahead.target = til %s siden dette tag +release.new_subheader = Udgivelser organiserer projektversioner. +release.title = Udgivelsestitel +release.prerelease_desc = Markér som pre-release +release.prerelease_helper = Marker denne udgivelse uegnet til produktionsbrug. +release.deletion_success = Udgivelsen er blevet slettet. +release.summary_card_alt = Oversigtskort for en udgivelse med titlen "%s" i depots %s +settings.unarchive.text = Fjernelse af arkivering af depotet vil genoprette dens evne til at modtage commits og push, såvel som nye problemer og pull-anmodninger. +settings.unarchive.success = Depotet blev fjernet fra arkivet. +settings.unarchive.error = Der opstod en fejl under forsøg på at fjerne depotet fra arkivet. Se loggen for flere detaljer. +settings.update_avatar_success = Depot avataren er blevet opdateret. +branch.restore_success = Gren "%s" er blevet gendannet. +branch.restore_failed = Kunne ikke gendanne grenen "%s". +branch.protected_deletion_failed = Gren "%s" er beskyttet. Det kan ikke slettes. +branch.default_deletion_failed = Gren "%s" er standardgrenen. Det kan ikke slettes. +tag.create_tag_operation = Opret tag +tag.confirm_create_tag = Opret tag +settings.tags.protection.allowed.noone = Ingen +settings.archive.header = Arkivere dette depot +settings.matrix.room_id_helper = Rum-id'et kan hentes fra Element-webklienten > Rumindstillinger > Avanceret > Internt rum-id. Eksempel: %s. +settings.archive.text = Arkivering af depotet vil gøre den fuldstændig skrivebeskyttet. Det vil blive skjult fra dashboardet. Ingen (ikke engang dig!) vil være i stand til at foretage nye commits eller åbne nogen problemer eller pull-anmodninger. +settings.archive.success = Depotet blev arkiveret. +settings.archive.button = Arkivere depot +settings.rename_branch_success = Grenen %s blev omdøbt til %s. +diff.whitespace_ignore_amount_changes = Ignorer ændringer i mængden af blanke mellemrum +diff.download_diff = Download diff fil +diff.show_split_view = Opdelt visning +diff.show_unified_view = Samlet visning +diff.whitespace_button = Blanke mellemrum +diff.whitespace_show_everything = Vis alle ændringer +diff.whitespace_ignore_all_whitespace = Ignorer blanke mellemrum, når du sammenligner linjer +diff.too_many_files = Nogle filer blev ikke vist, fordi der er ændret for mange filer i denne diff +diff.show_more = Vis mere +diff.load = Load diff +settings.archive.branchsettings_unavailable = Indstillinger for gren er ikke tilgængelige i arkiverede depoter. +settings.archive.tagsettings_unavailable = Tag-indstillinger er ikke tilgængelige i arkiverede depoter. +settings.archive.mirrors_unavailable = Spejle er ikke tilgængelige i arkiverede depoter. +settings.lfs_lock_already_exists = Låsen findes allerede: %s +settings.lfs_pointers.associateAccessible = Tilknyt tilgængelige %d OID'er +settings.rename_branch_failed_protected = Kan ikke omdøbe grenen %s, fordi den er en beskyttet gren. +settings.rename_branch_failed_exist = Kan ikke omdøbe grenen, fordi målgrenen %s eksisterer. +settings.rename_branch_failed_not_exist = Kan ikke omdøbe grenen %s, fordi den ikke eksisterer. +settings.rename_branch = Omdøb gren +diff.browse_source = Gennemse kilde +diff.parent = forælder +diff.commit = commit +diff.git-notes = Noter +diff.git-notes.add = Tilføj note +diff.git-notes.remove-header = Fjern note +diff.git-notes.remove-body = Denne note vil blive fjernet. +diff.data_not_available = Diff-indhold er ikke tilgængeligt +diff.bin_not_shown = Binær fil vises ikke. +diff.view_file = Se fil +diff.file_before = Før +diff.file_after = Efter +diff.file_image_width = Bredde +diff.file_image_height = Højde +diff.file_byte_size = Størrelse +diff.file_suppressed_line_too_long = Filforskellen er undertrykt, fordi en eller flere linjer er for lange +diff.review = Afslut gennemgangen +diff.review.header = Send anmeldelse +diff.review.placeholder = Gennemgå kommentar +release.download_count_one = %s download +release.download_count_few = %s downloads +topic.format_prompt = Emner skal starte med et bogstav eller tal, kan indeholde bindestreger ("-") og prikker ("."), kan være op til 35 tegn lange. Bogstaver skal være små. +branch.warning_rename_default_branch = Du omdøber standardgrenen. +topic.done = Færdig +topic.count_prompt = Du kan ikke vælge mere end 25 emner +find_file.go_to_file = Find en fil +find_file.no_matching = Ingen matchende fil fundet +topic.manage_topics = Administrer emner +tag.create_tag_from = Opret nyt tag fra "%s" +tag.create_success = Tag "%s" er blevet oprettet. +branch.restore = Gendan grenen "%s" +branch.new_branch_from = Opret ny gren fra "%s" +branch.create_branch_operation = Opret gren +branch.renamed = Gren %s blev omdøbt til %s. +branch.new_branch = Opret ny gren +tag.create_tag = Opret tag %s +error.csv.too_large = Denne fil kan ikke gengives, fordi den er for stor. +error.csv.unexpected = Denne fil kan ikke gengives, fordi den indeholder et uventet tegn i linje %d og kolonne %d. +error.csv.invalid_field_count = Denne fil kan ikke gengives, fordi den har et forkert antal felter i linje %d. +branch.download = Download gren "%s" +branch.rename = Omdøb grenen "%s" +branch.included_desc = Denne gren er en del af standardgrenen +branch.included = Inkluderet +error.broken_git_hook = Git hooks af dette depot ser ud til at være brudt. Følg venligst dokumentationen for at rette dem, og push derefter på nogle commits for at opdatere statussen. +branch.create_new_branch = Opret en gren fra gren: +branch.confirm_create_branch = Opret gren +branch.rename_branch_to = Omdøb "%s" til: [notification] watching = Overvåger read = Læs +notifications = Notifikationer +no_unread = Ingen ulæste notifikationer. +unread = Ulæst +mark_as_read = Markér som læst +no_read = Ingen læste notifikationer. +mark_all_as_read = Markér alle som læste +mark_as_unread = Markér som ulæst +subscriptions = Abonnementer +no_subscriptions = Ingen abonnementer [action] watched_repo = begyndte at overvåge %[2]s @@ -2561,6 +2767,93 @@ settings.location = Lokation settings.permission = Tilladelser settings.visibility = Synlighed members.remove = Slet +org_name_holder = Organisationens navn +create_team = Opret team +org_full_name_holder = Organisationens fulde navn +open_dashboard = Åbn dashboard +lower_repositories = depoter +team_unit_desc = Tillad adgang til depotsektioner +follow_blocked_user = Du kan ikke følge denne organisation, fordi denne organisation har blokeret dig. +org_name_helper = Organisationsnavne skal være korte og mindeværdige. +create_org = Opret organisation +form.name_reserved = Organisationsnavnet "%s" er reserveret. +create_new_team = Nyt team +team_unit_disabled = (Deaktiveret) +code = Kode +team_name = Team navn +team_name_helper = Team navne skal være korte og mindeværdige. +team_desc_helper = Beskriv teamets formål eller rolle. +team_access_desc = Depot adgang +team_permission_desc = Tilladelse +members.member = Medlem +settings.change_orgname_prompt = Bemærk: Ændring af organisationens navn vil også ændre din organisations URL og frigøre det gamle navn. +settings.change_orgname_redirect_prompt = Det gamle navn vil omdirigere, indtil det gøres krav på. +settings.change_orgname_redirect_prompt.with_cooldown.one = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, du kan stadig kræve det gamle navn tilbage i nedkølingsperioden. +settings.change_orgname_redirect_prompt.with_cooldown.few = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, du kan stadig kræve det gamle navn tilbage i . +settings.update_avatar_success = Organisationens avatar er blevet opdateret. +members.public_helper = Gør skjult +members.private = Skjult +members.private_helper = Gør synlig +members.member_role = Medlemsrolle: +members.remove.detail = Vil du fjerne %[1]s fra %[2]s? +members.invite_desc = Tilføj et nyt medlem til %s: +teams.read_permission_desc = Dette team giver læse adgang: medlemmer kan se og klone teamdepoter. +teams.remove_all_repos_title = Slet alle team depoter +members.leave.detail = Er du sikker på, at du vil forlade organisationen "%s"? +settings.email = Kontakt email +settings.delete_account = Slet denne organisation +teams.can_create_org_repo_helper = Medlemmer kan oprette nye arkiver i organisationen. Skaberen får administratoradgang til det nye lager. +teams.remove_all_repos_desc = Dette vil slette alle depoter fra teamet +teams.add_all_repos_title = Tilføj alle depoter +settings.update_settings = Opdater indstillinger +settings.update_setting_success = Organisationsindstillingerne er blevet opdateret. +settings.delete = Slet organisation +members.invite_now = Inviter nu +teams.members = Team medlemmer +teams.owners_permission_desc = Ejere har fuld adgang til alle depoter og har administratoradgang til organisationen. +teams.update_settings = Opdater indstillinger +settings.labels_desc = Tilføj etiketter, som kan bruges til problemer for alle lagre under denne organisation. +members.membership_visibility = Medlemskabs synlighed: +members.public = Synlig +settings.delete_prompt = Organisationen fjernes permanent. Dette KAN IKKE fortrydes! +settings.confirm_delete_account = Bekræft sletning +settings.delete_org_title = Slet organisation +settings.delete_org_desc = Denne organisation vil blive slettet permanent. Vil du fortsætte? +settings.hooks_desc = Tilføj webhooks, som vil blive udløst for alle lagre under denne organisation. +teams.leave.detail = Er du sikker på, at du vil forlade teamet "%s"? +teams.can_create_org_repo = Opret depoter +teams.general_access_helper = Medlemmers tilladelser bestemmes af nedenstående tilladelsestabell. +teams.delete_team = Slet team +teams.add_team_member = Slet team +form.name_pattern_not_allowed = Mønsteret "%s" er ikke tilladt i et organisationsnavn. +form.create_org_not_allowed = Du har ikke tilladelse til at oprette en organisation. +teams.none_access = Ingen adgang +teams.none_access_helper = Muligheden "ingen adgang" har kun effekt på private arkiver. +teams.general_access = Brugerdefineret adgang +members.leave = Forlad +teams.leave = Forlad +teams.join = Deltag +teams.delete_team_success = Teamet er blevet slettet. +teams.write_permission_desc = Dette team giver Skrive adgang: medlemmer kan læse fra og skubbe til teamdepoter. +teams.invite_team_member = Inviter til %s +teams.invite_team_member.list = Afventende invitationer +teams.admin_permission_desc = Dette team giver Administrator adgang: medlemmer kan læse fra, skubbe til og tilføje samarbejdspartnere til teamdepoter. +teams.create_repo_permission_desc = Derudover giver dette team tilladelse til Opret depot: medlemmer kan oprette nye lagre i organisationen. +teams.delete_team_title = Slet team +teams.repositories = Team depoter +teams.delete_team_desc = Sletning af et team tilbagekalder depotadgang fra dets medlemmer. Vil du fortsætte? +teams.add_all_repos_desc = Dette vil tilføje alle organisationens depoter til teamet. +teams.add_nonexistent_repo = Depotet, du forsøger at tilføje, eksisterer ikke, opret det først. +teams.invite.by = Inviteret af %s +teams.all_repositories_helper = Teamet har adgang til alle depoter. Hvis du vælger dette, føjes alle eksisterende depoter til teamet. +teams.invite.title = Du er blevet inviteret til at deltage i teamet %s i organisationen %s. +teams.add_duplicate_users = Brugeren er allerede et teammedlem. +teams.repos.none = Ingen depoter kunne tilgås af dette team. +teams.members.none = Ingen medlemmer på dette team. +teams.specific_repositories = Specifikke depoter +teams.specific_repositories_helper = Medlemmer vil kun have adgang til depoter, der udtrykkeligt er føjet til teamet. Hvis du vælger dette vil det ikke automatisk fjerne depoter, der allerede er tilføjet med Alle depoter. +teams.all_repositories = Alle depoter +teams.invite.description = Klik venligst på knappen nedenfor for at blive medlem af teamet. [admin] orgs.members = Medlemmer @@ -2601,6 +2894,207 @@ config.allow_dots_in_usernames = Tillad brugere at bruge prikker i deres brugern auths.oauth2_icon_url = Icon URL users.edit = Redigere users.auth_source = Godkendelseskilde +monitor.queue.settings.maxnumberworkers.placeholder = I øjeblikket %[1]d +monitor.queue.settings.submit = Opdater indstillinger +monitor.queue.settings.changed = Indstillinger opdateret +monitor.queue.settings.remove_all_items = Slet alle +monitor.queue.settings.remove_all_items_done = Alle varer i køen er blevet fjernet. +notices.system_notice_list = Systemmeddelelser +dashboard.delete_repo_archives = Slet alle depoters arkiver (ZIP, TAR.GZ osv..) +organizations = Organisationer +dashboard.delete_repo_archives.started = Slet alle repository arkiver opgave startet. +dashboard.statistic = Oversigt +dashboard.task.finished = Opgave: %[1]s startet af %[2]s er afsluttet +dashboard.task.unknown = Ukendt opgave: %[1]s +dashboard.cron.error = Fejl i Cron: %s: %[3]s +dashboard.operation_name = Operations navn +dashboard.delete_missing_repos.started = Slet alle depoter, der mangler deres Git-filopgave startet. +dashboard.delete_generated_repository_avatars = Slet genererede depot avatarer +dashboard.sync_repo_branches = Synkroniser mistede grene fra Git-data til databasen +dashboard.sync_repo_tags = Synkroniser tags fra Git-data til database +dashboard.archive_cleanup = Slet gamle depotarkiver +dashboard.deleted_branches_cleanup = Ryd op i slettede grene +dashboard = Dashboard +self_check = Selvtjek +assets = Kode aktiver +repositories = Depoter +authentication = Godkendelseskilder +emails = Bruger e-mails +monitor = Overvågning +settings = Admin indstillinger +dashboard.new_version_hint = Forgejo %s er nu tilgængelig, du kører %s. Tjek bloggen for flere detaljer. +dashboard.operation_switch = Skift +dashboard.operation_run = Kør +dashboard.clean_unbind_oauth = Rens ubundne OAuth-forbindelser +dashboard.delete_inactive_accounts.started = Slet alle uaktiverede konti opgave startet. +dashboard.delete_missing_repos = Slet alle depoter, der mangler deres Git-filer +dashboard.update_migration_poster_id = Opdater migrationsplakat-id'er +dashboard.memory_obtained = Hukommelse opnået +dashboard.pointer_lookup_times = Pointer-opslagstider +hooks = Webhooks +dashboard.cron.finished = Cron: %[1]s er færdig +dashboard.delete_inactive_accounts = Slet alle uaktiverede konti +config = Konfiguration +notices = Systemmeddelelser +config_summary = Oversigt +dashboard.system_status = System status +dashboard.update_mirrors = Opdater spejle +dashboard.server_uptime = Server oppetid +dashboard.current_goroutine = Nuværende goroutiner +dashboard.current_memory_usage = Aktuel hukommelsesbrug +dashboard.total_memory_allocated = Samlet hukommelse tildelt +integrations = Integrationer +dashboard.operations = Vedligeholdelses operationer +dashboard.repo_health_check = Sundhedstjek alle depoter +dashboard.check_repo_stats = Tjek alle depotstatistikker +dashboard.git_gc_repos = Samle alt affald fra alle depoter +dashboard.resync_all_sshkeys = Opdater filen ".ssh/authorized_keys" med Forgejo SSH-nøgler. +dashboard.resync_all_sshprincipals = Opdater ".ssh/authorized_principals" filen med Forgejo SSH principals. +users = Brugerkonti +identity_access = Identitet og adgang +first_page = Først +last_page = Sidst +dashboard.task.process = Opgave: %[1]s +total = Total: %d +dashboard.cron.started = Startede Cron: %[1]s +dashboard.cron.process = Cron: %[1]s +dashboard.cron.cancelled = Cron: %[1]s annulleret: %[3]s +dashboard.clean_unbind_oauth_success = Alle ubundne OAuth-forbindelser er blevet slettet. +dashboard.task.started = Startet opgave: %[1]s +dashboard.task.cancelled = Opgave: %[1]s annulleret: %[3]s +dashboard.task.error = Fejl i Opgave: %[1]s: %[3]s +dashboard.resync_all_hooks = Gensynkroniser pre-receive, update og post-receive hooks for alle depoter +dashboard.reinit_missing_repos = Geninitialiser alle manglende Git-depoter, som der findes poster for +dashboard.sync_external_users = Synkroniser eksterne brugerdata +dashboard.cleanup_hook_task_table = Oprydning hook_task tabel +dashboard.cleanup_packages = Ryd udløbne pakker +dashboard.cleanup_actions = Oprydning af udløbne logfiler og artefakter fra handlinger +users.remote = Remote +users.password_helper = Lad adgangskoden være tom for at bevare den uændret. +dashboard.cancel_abandoned_jobs = Annuller forladte handlingsjob +users.activated.description = Afslutning af e-mailbekræftelse. Ejeren af en uaktiveret konto vil ikke være i stand til at logge ind, før e-mailbekræftelsen er gennemført. +users.admin.description = Giv denne bruger fuld adgang til alle administrative funktioner, der er tilgængelige via web-UI og API. +users.update_profile = Opdater brugerkonto +users.still_has_org = Denne bruger er medlem af en organisation. Fjern først brugeren fra enhver organisation. +users.purge_help = Tvangsslet brugeren og eventuelle depoter, organisationer og pakker, der ejes af brugeren. Alle kommentarer og problemer indsendt af denne bruger vil også blive slettet. +users.is_admin = Administrator konto +dashboard.mspan_structures_obtained = Mspan strukturer opnået +dashboard.mcache_structures_usage = MCache strukturer brug +dashboard.mspan_structures_usage = MSpan strukturer brug +dashboard.mcache_structures_obtained = MCache-strukturer opnået +dashboard.profiling_bucket_hash_table_obtained = Profilering bucket hash tabel opnået +dashboard.gc_metadata_obtained = GC-metadata opnået +dashboard.other_system_allocation_obtained = Anden systemallokering opnået +dashboard.next_gc_recycle = Næste GC genbrug +dashboard.total_gc_pause = Total GC-pause +dashboard.last_gc_time = Tid siden sidste GC +dashboard.delete_old_system_notices = Slet alle gamle systemmeddelelser fra databasen +dashboard.gc_lfs = Affaldssamler LFS-metaobjekter +dashboard.start_schedule_tasks = Start planlæg handlingsopgaver +dashboard.sync_branch.started = Gren synkronisering startede +dashboard.sync_tag.started = Tag-synkronisering er startet +dashboard.rebuild_issue_indexer = Genopbyg problemindekser +users.update_profile_success = Brugerkontoen er blevet opdateret. +users.created = Oprettet +users.max_repo_creation = Maksimalt antal depoter +users.prohibit_login = Suspenderet konto +users.is_restricted = Begrænset konto +dashboard.memory_allocate_times = Hukommelsestildelinger +dashboard.memory_free_times = Hukommelses frigørelse +dashboard.current_heap_usage = Nuværende heap-brug +dashboard.heap_memory_obtained = Heap-hukommelse opnået +dashboard.heap_objects = Heap genstande +dashboard.bootstrap_stack_usage = Brug af bootstrap-stak +dashboard.update_checker = Opdateringskontrol +dashboard.delete_old_actions.started = Slet alle gamle aktiviteter fra den påbegyndte database. +dashboard.stop_zombie_tasks = Stop zombiehandlingsopgaver +dashboard.stop_endless_tasks = Stop endeløse handlingsopgaver +users.2fa = 2FA +users.last_login = Sidst logget ind +users.never_login = Aldrig logget ind +users.new_success = Brugerkontoen "%s" er blevet oprettet. +users.local_import.description = Tillad import af depoter fra serverens lokale filsystem. Dette kan være et sikkerhedsproblem. +users.organization_creation.description = Tillad oprettelse af nye organisationer. +users.delete_account = Slet brugerkonto +users.cannot_delete_self = Du kan ikke slette dig selv +users.still_own_repo = Denne bruger ejer stadig et eller flere arkiver. Slet eller overfør disse depoter først. +users.list_status_filter.is_admin = Admin +users.block.description = Bloker denne bruger i at interagere med denne tjeneste via deres konto, og forbyd at logge ind. +users.restricted.description = Tillad kun interaktion med de depoter og organisationer, hvor denne bruger er tilføjet som en samarbejdspartner. Dette forhindrer adgang til offentlige arkiver i denne instans. +users.list_status_filter.menu_text = Filter +dashboard.heap_memory_idle = Heap hukommelse inaktiv +dashboard.heap_memory_in_use = Heap hukommelse i brug +dashboard.heap_memory_released = Heap-hukommelse frigivet +dashboard.stack_memory_obtained = Stakhukommelse opnået +dashboard.last_gc_pause = Sidste GC-pause +dashboard.gc_times = GC times +dashboard.delete_old_actions = Slet alle gamle aktiviteter fra databasen +users.allow_create_organization = Kan skabe organisationer +users.list_status_filter.not_admin = Ikke admin +users.allow_import_local = Kan importere lokale depoter +users.send_register_notify = Giv besked om tilmelding via e-mail +users.local = Lokal +users.auth_login_name = Godkendelses-loginnavn +users.allow_git_hook = Kan skabe Git hooks +users.allow_git_hook_tooltip = Git hooks udføres som OS-brugeren, der kører Forgejo og vil have samme niveau af værtsadgang. Som et resultat kan brugere med dette specielle Git hook-privilegium få adgang til og ændre alle Forgejo-depoter såvel som databasen, der bruges af Forgejo. Derfor er de også i stand til at opnå Forgejo-administratorrettigheder. +users.repos = Depoter +users.still_own_packages = Denne bruger ejer stadig en eller flere pakker, slet disse pakker først. +users.deletion_success = Brugerkontoen er blevet slettet. +users.reset_2fa = Nulstil 2FA +users.max_repo_creation_desc = (Indtast -1 for at bruge den globale standardgrænse.) +users.is_activated = Aktiveret konto +users.edit_account = Rediger brugerkonto +packages.version = Version +users.list_status_filter.reset = Nulstil +users.list_status_filter.is_active = Aktiv +users.list_status_filter.not_active = Inaktiv +users.purge = Udrens bruger +users.user_manage_panel = Administrer brugerkonti +users.new_account = Opret brugerkonto +users.admin = Admin +users.restricted = Begrænset +users.reserved = Reserveret +users.bot = Bot +emails.primary = Primær +emails.updated = E-mail opdateret +emails.not_updated = Kunne ikke opdatere den anmodede e-mailadresse: %v +packages.package_manage_panel = Administrer pakker +packages.total_size = Samlet størrelse: %s +packages.unreferenced_size = Ikke-referencestørrelse: %s +users.list_status_filter.is_2fa_enabled = 2FA aktiveret +users.list_status_filter.not_2fa_enabled = 2FA deaktiveret +emails.filter_sort.email_reverse = E-mail (omvendt) +emails.filter_sort.name_reverse = Brugernavn (omvendt) +emails.delete = Slet e-mail +emails.delete_desc = Er du sikker på, at du vil slette denne e-mailadresse? +emails.deletion_success = E-mailadressen er blevet slettet. +users.list_status_filter.is_restricted = Begrænset +emails.duplicate_active = Denne e-mailadresse er allerede aktiv for en anden bruger. +emails.change_email_header = Opdater e-mail-egenskaber +emails.change_email_text = Er du sikker på, at du vil opdatere denne e-mailadresse? +repos.issues = Problemer +repos.size = Størrelse +repos.lfs_size = LFS størrelse +users.list_status_filter.not_restricted = Ikke begrænset +users.details = Brugeroplysninger +emails.email_manage_panel = Administrer bruger-e-mails +users.list_status_filter.is_prohibit_login = Forbyd login +users.list_status_filter.not_prohibit_login = Tillad login +emails.delete_primary_email_error = Du kan ikke slette den primære e-mail. +orgs.org_manage_panel = Administrer organisationer +repos.repo_manage_panel = Administrer depoter +repos.unadopted = Ikke-adopterede depoter +repos.unadopted.no_more = Ingen ikke-adopterede depoter fundet. +auths.domain = Domæne +auths.port = Port +auths.host = Host +packages.size = Størrelse +auths.security_protocol = Sikkerhedsprotokol +auths.updated = Opdateret +auths.type = Type +auths.syncenabled = Slå brugersynkronisering til +packages.published = Offentliggjort +packages.type = Type [packages] arch.version.description = Beskrivelse @@ -2646,15 +3140,77 @@ rpm.repository = Depot info rpm.repository.architectures = Arkitekturer alt.registry = Konfigurer dette register fra kommandolinjen: alt.repository = Depot info +alpine.repository.repositories = Depoter +search_in_external_registry = Søg i %s +dependency.version = Version +alpine.registry = Konfigurer dette register ved at tilføje url'en i din /etc/apk/repositories fil: +alpine.registry.key = Download den offentlige RSA-nøgle til registreringsdatabasen i mappen /etc/apk/keys/ for at bekræfte indekssignaturen: +alpine.registry.info = Vælg $branch og $repository fra listen nedenfor. [actions] runners.description = Beskrivelse runners.labels = Etiketter runners.name = Navn runners.task_list.repository = Depot +runners.status.active = Aktiv +runners.status.offline = Offline +runners.version = Version [tool] 1d = 1 dag 1w = 1 uge 1mon = 1 måned -1y = 1 år \ No newline at end of file +1y = 1 år +months = %d måneder +years = %d år +raw_seconds = sekunder +raw_minutes = minutter +future = fremtid +1h = 1 time +seconds = %d sekunder +minutes = %d minutter +hours = %d timer +weeks = %d uger +1s = 1 sekund +1m = 1 minut +days = %d dage + +[repo.permissions] +actions.read = Læs: Se integrerede CI/CD-pipelines og deres logfiler. +releases.write = Skriv: Udgiv, rediger og slet udgivelser og deres aktiver. +wiki.read = Læs: Læs den integrerede wiki og dens historie. +wiki.write = Skriv: Opret, opdater og slet sider i den integrerede wiki. +actions.write = Skriv: Udløs, genstart, annuller eller godkend afventende CI/CD-pipelines manuelt. +ext_issues = Få adgang til linket til en ekstern problemsporing. Tilladelserne administreres eksternt. +issues.write = Skriv: Luk problemer og administrer metadata som etiketter, milepæle, modtagere, forfaldsdatoer og afhængigheder. +releases.read = Læs: Se og download udgivelser. +projects.read = Læs: Få adgang til depot-projekttavler. +projects.write = Skriv: Opret projekter og kolonner, og rediger dem. +packages.read = Læs: Se og download pakker, der er tildelt depotet. +packages.write = Skriv: Udgiv og slet pakker, der er tildelt depotet. +ext_wiki = Få adgang til linket til en ekstern wiki. Tilladelserne administreres eksternt. +pulls.read = Læs: Læsning og oprettelse af pull-anmodninger. +pulls.write = Skriv: Luk pull-anmodninger og administrer metadata som etiketter, milepæle, modtagere, forfaldsdatoer og afhængigheder. +code.read = Læs: Få adgang til og klon koden for depotet. +code.write = Skriv: Skub til depotet, opret filialer og tags. +issues.read = Læs: Læs og opret problemer og kommentarer. + +[graphs] +component_failed_to_load = Der skete en uventet fejl. +code_frequency.what = kode frekvens +contributors.what = bidrag +component_loading = Indlæser %s… +component_loading_info = Dette kan tage lidt tid… +recent_commits.what = nylige commits +component_loading_failed = Kunne ikke indlæse %s + +[secrets] +creation.name_placeholder = uafhængig af store og små bogstaver, alfanumeriske tegn eller understregninger, kan ikke starte med GITEA_ eller GITHUB_ +creation.value_placeholder = Indtast ethvert indhold. Mellemrum i starten og slutningen vil blive udeladt. + +[dropzone] +invalid_input_type = Filer af denne type må ikke uploades. +remove_file = Fjern fil + +[gpg] +default_key = Underskrevet med standardnøglen \ No newline at end of file diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 42f05bb0c7..1e78443b89 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -3978,7 +3978,7 @@ submodule=Sous-module [search] -search = Rechercher... +search = Rechercher… type_tooltip = Type de recherche fuzzy = Approximatif code_search_by_git_grep = Les résultats de recherche dans le code sont fournis par "git grep". Les résultats pourraient être plus pertinents si l'administrateur du site active les indexeurs de code source. @@ -3988,14 +3988,14 @@ keyword_search_unavailable = La recherche par mot-clé n'est pas disponible actu fuzzy_tooltip = Inclure les résultats proches des termes recherchés match = Correspondance match_tooltip = Uniquement inclure les résultats correspondant exactement aux termes recherchés -repo_kind = Chercher dans les dépôts... -user_kind = Chercher les utilisateurs... -org_kind = Chercher les organisations... -team_kind = Chercher les équipes... -code_kind = Chercher le code... +repo_kind = Chercher dans les dépôts… +user_kind = Chercher les utilisateurs… +org_kind = Chercher les organisations… +team_kind = Chercher les équipes… +code_kind = Chercher le code… code_search_unavailable = La recherche dans le code n'est pas disponible. Veuillez contacter l'administrateur du site. -package_kind = Chercher les paquets... -project_kind = Chercher les projets... +package_kind = Chercher les paquets… +project_kind = Chercher les projets… branch_kind = Chercher les branches... commit_kind = Chercher les commits... exact = Exact diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 2e2a165f1f..7f4ae4262b 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1571,7 +1571,7 @@ issues.self_assign_at=`piešķīra sev %s` issues.add_assignee_at=`%s piešķīra %s` issues.remove_assignee_at=`%s noņēma %s` issues.remove_self_assignment=`noņēma sev %s` -issues.change_title_at=`nomainīts nosaukums no %s uz %s %s` +issues.change_title_at=`nomainīja nosaukumu no %s uz %s %s` issues.change_ref_at=`nomainīta atsauce no %s uz %s %s` issues.remove_ref_at=`noņēma atsauci no %s %s` issues.add_ref_at=`pievienoja atsauci uz %s %s` @@ -3658,7 +3658,7 @@ raw_seconds=sekundes raw_minutes=minūtes [dropzone] -default_message=Jāievelk datnes vai jāklikšķina šeit, lai augšupielādētu. +default_message=Ievilkt datnes vai klikšķināt šeit, lai augšupielādētu. invalid_input_type=Šī veida datnes nevar augšupielādēt. file_too_big=Datnes izmērs ({{filesize}} MB) pārsniedz pieļaujamo izmēru ({{maxFilesize}} MB). remove_file=Noņemt datni diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 5830a32285..e0f8065063 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -4060,7 +4060,7 @@ filepreview.lines = Строки с %[1]d по %[2]d в %[3]s filepreview.truncated = Предпросмотр был обрезан [translation_meta] -test = Forgejo! +test = Forgejo [repo.permissions] code.write = Запись: отправка изменений в репозиторий, создание веток и тегов. diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index a66d679e96..218669787d 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -9,11 +9,14 @@ "many": "quer mesclar %[1]d commits de %[2]s em %[3]s", "other": "" }, - "search.milestone_kind": "Pesquisar marcos...", + "search.milestone_kind": "Pesquisar marcos…", "home.welcome.no_activity": "Sem atividade", "home.welcome.activity_hint": "Ainda não tem nada no seu feed. Suas ações e atividade dos seus repositórios vigiados aparecerão aqui.", "home.explore_repos": "Explorar repositórios", "home.explore_users": "Explorar usuários", "home.explore_orgs": "Explorar organizações", - "incorrect_root_url": "Esta instância do Forgejo está configurada para o endereço \"%s\". Você está atualmente vendo o Forgejo através de uma URL diferente, o que pode causar erros em algumas partes da aplicação. A URL oficial é controlada pela administração do Forgejo através da configuração ROOT_URL no arquivo app.ini." + "incorrect_root_url": "Esta instância do Forgejo está configurada para o endereço \"%s\". Você está atualmente vendo o Forgejo através de uma URL diferente, o que pode causar erros em algumas partes da aplicação. A URL oficial é controlada pela administração do Forgejo através da configuração ROOT_URL no arquivo app.ini.", + "themes.names.forgejo-auto": "Forgejo (usar o tema do sistema)", + "themes.names.forgejo-light": "Forgejo claro", + "themes.names.forgejo-dark": "Forgejo escuro" }