diff --git a/README.md b/README.md
index 3ba47dcce6..a5b2f38d53 100644
--- a/README.md
+++ b/README.md
@@ -21,11 +21,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**.
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
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"
}
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",