Merge commit '372a3dad83dbea80660a6aa702cad860927acb59' into v11.0/forgejo
Some checks are pending
/ release (push) Waiting to run
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
testing / test-unit (push) Blocked by required conditions
testing / test-e2e (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
testing / security-check (push) Blocked by required conditions

This commit is contained in:
Minecon724 2025-03-29 20:01:04 +01:00
commit b26c24e45c
Signed by: Minecon724
GPG key ID: A02E6E67AB961189
11 changed files with 713 additions and 100 deletions

View file

@ -21,11 +21,6 @@ Our promise: **Independent Free/Libre Software forever!**
## What does Forgejo offer?
<!-- If you want to know what Forgejo is like,
you can check out public instances,
e.g. [Codeberg.org](https://codeberg.org).
-->
If you like any of the following, Forgejo is literally meant for you:
- Lightweight: Forgejo can easily be hosted on nearly **every machine**.

View file

@ -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
}
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 {
return true
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
if len(nodeChain.Field) != 2 || nodeChain.Field[0] != "Locale" || !isLocaleTrFunction(nodeChain.Field[1]) {
return
}
// found interesting string
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
omh(fset, token.Pos(nodeString.Pos), nodeString.Text)
handler.OnMsgid(fset, token.Pos(nodeString.Pos), nodeString.Text)
}
} else {
argc := len(nodeCommand.Args) - 1
gotUnexpectedInvoke = &argc
}
}
if gotUnexpectedInvoke != nil {
handler.OnUnexpectedInvoke(fset, token.Pos(nodeChain.Pos), nodeChain.Field[1], *gotUnexpectedInvoke)
}
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) {
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:\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

View file

@ -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
}

View file

@ -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

View file

@ -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 = <strong> %d ændrede filer</strong> med <strong>%d tilføjelser</strong> og <strong>%d sletninger</strong>
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 <a target="_blank" rel="noopener" href="%s">guiden til beskyttede tags</a>.
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 = <strong>%d</strong> 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 <a target="_blank" rel="noreferrer" href="%s">dokumentationen</a> 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 <a href="%[1]s">%[2]s</a>
@ -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 <strong>læse</strong> 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 <strong>alle depoter</strong> og har <strong>administratoradgang</strong> til organisationen.
teams.update_settings = Opdater indstillinger
settings.labels_desc = Tilføj etiketter, som kan bruges til problemer for <strong>alle lagre</strong> under denne organisation.
members.membership_visibility = Medlemskabs synlighed:
members.public = Synlig
settings.delete_prompt = Organisationen fjernes permanent. Dette <strong>KAN IKKE</strong> 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 <strong>alle lagre</strong> 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 <strong>Skrive</strong> 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 <strong>Administrator</strong> 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 <strong>Opret depot</strong>: 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, <strong>føjes alle eksisterende</strong> depoter til teamet.
teams.invite.title = Du er blevet inviteret til at deltage i teamet <strong>%s</strong> i organisationen <strong>%s</strong>.
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 <strong>vil det ikke</strong> automatisk fjerne depoter, der allerede er tilføjet med <i>Alle depoter</i>.
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 <a target="_blank" rel="noreferrer" href="%s">bloggen</a> 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 <code>/etc/apk/repositories</code> fil:
alpine.registry.key = Download den offentlige RSA-nøgle til registreringsdatabasen i mappen <code>/etc/apk/keys/</code> 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
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 = <b>Læs:</b> Se integrerede CI/CD-pipelines og deres logfiler.
releases.write = <b>Skriv:</b> Udgiv, rediger og slet udgivelser og deres aktiver.
wiki.read = <b>Læs:</b> Læs den integrerede wiki og dens historie.
wiki.write = <b>Skriv:</b> Opret, opdater og slet sider i den integrerede wiki.
actions.write = <b>Skriv:</b> 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 = <b>Skriv:</b> Luk problemer og administrer metadata som etiketter, milepæle, modtagere, forfaldsdatoer og afhængigheder.
releases.read = <b>Læs:</b> Se og download udgivelser.
projects.read = <b>Læs:</b> Få adgang til depot-projekttavler.
projects.write = <b>Skriv:</b> Opret projekter og kolonner, og rediger dem.
packages.read = <b>Læs:</b> Se og download pakker, der er tildelt depotet.
packages.write = <b>Skriv:</b> Udgiv og slet pakker, der er tildelt depotet.
ext_wiki = Få adgang til linket til en ekstern wiki. Tilladelserne administreres eksternt.
pulls.read = <b>Læs:</b> Læsning og oprettelse af pull-anmodninger.
pulls.write = <b>Skriv:</b> Luk pull-anmodninger og administrer metadata som etiketter, milepæle, modtagere, forfaldsdatoer og afhængigheder.
code.read = <b>Læs:</b> Få adgang til og klon koden for depotet.
code.write = <b>Skriv:</b> Skub til depotet, opret filialer og tags.
issues.read = <b>Læs:</b> 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

View file

@ -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

View file

@ -1571,7 +1571,7 @@ issues.self_assign_at=`piešķīra sev %s`
issues.add_assignee_at=`<b>%s</b> piešķīra %s`
issues.remove_assignee_at=`<b>%s</b> noņēma %s`
issues.remove_self_assignment=`noņēma sev %s`
issues.change_title_at=`nomainīts nosaukums no <b><strike>%s</strike></b> uz <b>%s</b> %s`
issues.change_title_at=`nomainīja nosaukumu no <b><strike>%s</strike></b> uz <b>%s</b> %s`
issues.change_ref_at=`nomainīta atsauce no <b><strike>%s</strike></b> uz <b>%s</b> %s`
issues.remove_ref_at=`noņēma atsauci no <b>%s</b> %s`
issues.add_ref_at=`pievienoja atsauci uz <b>%s</b> %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

View file

@ -4060,7 +4060,7 @@ filepreview.lines = Строки с %[1]d по %[2]d в %[3]s
filepreview.truncated = Предпросмотр был обрезан
[translation_meta]
test = Forgejo!
test = Forgejo
[repo.permissions]
code.write = <b>Запись:</b> отправка изменений в репозиторий, создание веток и тегов.

View file

@ -9,11 +9,14 @@
"many": "quer mesclar %[1]d commits de <code>%[2]s</code> em <code id=\"%[4]s\">%[3]s</code>",
"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"
}

24
package-lock.json generated
View file

@ -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",

View file

@ -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",