diff --git a/docs/content/usage/actions/act-runner.zh-cn.md b/docs/content/usage/actions/act-runner.zh-cn.md index f1404bf0b4db4..11b69960f78af 100644 --- a/docs/content/usage/actions/act-runner.zh-cn.md +++ b/docs/content/usage/actions/act-runner.zh-cn.md @@ -208,12 +208,12 @@ services: ```yaml cache: -enabled: true -dir: "" -# 使用步骤 1. 获取的 LAN IP -host: "192.168.8.17" -# 使用步骤 2. 获取的端口号 -port: 8088 + enabled: true + dir: "" + # 使用步骤 1. 获取的 LAN IP + host: "192.168.8.17" + # 使用步骤 2. 获取的端口号 + port: 8088 ``` - 4.启动容器时, 将 Cache 端口映射至主机。 diff --git a/models/db/iterate.go b/models/db/iterate.go index fc8c78d83ea36..e1caefa72b8bf 100644 --- a/models/db/iterate.go +++ b/models/db/iterate.go @@ -17,22 +17,27 @@ func Iterate[Bean any](ctx context.Context, cond builder.Cond, f func(ctx contex batchSize := setting.Database.IterateBufferSize sess := GetEngine(ctx) for { - beans := make([]*Bean, 0, batchSize) - if cond != nil { - sess = sess.Where(cond) - } - if err := sess.Limit(batchSize, start).Find(&beans); err != nil { - return err - } - if len(beans) == 0 { - return nil - } - start += len(beans) - - for _, bean := range beans { - if err := f(ctx, bean); err != nil { + select { + case <-ctx.Done(): + return ctx.Err() + default: + beans := make([]*Bean, 0, batchSize) + if cond != nil { + sess = sess.Where(cond) + } + if err := sess.Limit(batchSize, start).Find(&beans); err != nil { return err } + if len(beans) == 0 { + return nil + } + start += len(beans) + + for _, bean := range beans { + if err := f(ctx, bean); err != nil { + return err + } + } } } } diff --git a/models/issues/comment.go b/models/issues/comment.go index 901958dc5d5fe..8e06838f73a32 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -349,7 +349,7 @@ func (c *Comment) LoadPoster(ctx context.Context) (err error) { c.Poster, err = user_model.GetPossibleUserByID(ctx, c.PosterID) if err != nil { if user_model.IsErrUserNotExist(err) { - c.PosterID = -1 + c.PosterID = user_model.GhostUserID c.Poster = user_model.NewGhostUser() } else { log.Error("getUserByID[%d]: %v", c.ID, err) diff --git a/models/issues/issue.go b/models/issues/issue.go index 6d9c8727b33f0..8655b9de3fe42 100644 --- a/models/issues/issue.go +++ b/models/issues/issue.go @@ -219,7 +219,7 @@ func (issue *Issue) LoadPoster(ctx context.Context) (err error) { if issue.Poster == nil && issue.PosterID != 0 { issue.Poster, err = user_model.GetPossibleUserByID(ctx, issue.PosterID) if err != nil { - issue.PosterID = -1 + issue.PosterID = user_model.GhostUserID issue.Poster = user_model.NewGhostUser() if !user_model.IsErrUserNotExist(err) { return fmt.Errorf("getUserByID.(poster) [%d]: %w", issue.PosterID, err) diff --git a/models/issues/issue_project.go b/models/issues/issue_project.go index 7906c3eace723..cc7ffb356a6ca 100644 --- a/models/issues/issue_project.go +++ b/models/issues/issue_project.go @@ -51,7 +51,7 @@ func (issue *Issue) ProjectBoardID(ctx context.Context) int64 { func LoadIssuesFromBoard(ctx context.Context, b *project_model.Board) (IssueList, error) { issueList := make(IssueList, 0, 10) - if b.ID != 0 { + if b.ID > 0 { issues, err := Issues(ctx, &IssuesOptions{ ProjectBoardID: b.ID, ProjectID: b.ProjectID, @@ -65,7 +65,7 @@ func LoadIssuesFromBoard(ctx context.Context, b *project_model.Board) (IssueList if b.Default { issues, err := Issues(ctx, &IssuesOptions{ - ProjectBoardID: -1, // Issues without ProjectBoardID + ProjectBoardID: db.NoConditionID, ProjectID: b.ProjectID, SortType: "project-column-sorting", }) @@ -150,30 +150,3 @@ func addUpdateIssueProject(ctx context.Context, issue *Issue, doer *user_model.U ProjectID: newProjectID, }) } - -// MoveIssueAcrossProjectBoards move a card from one board to another -func MoveIssueAcrossProjectBoards(ctx context.Context, issue *Issue, board *project_model.Board) error { - ctx, committer, err := db.TxContext(ctx) - if err != nil { - return err - } - defer committer.Close() - sess := db.GetEngine(ctx) - - var pis project_model.ProjectIssue - has, err := sess.Where("issue_id=?", issue.ID).Get(&pis) - if err != nil { - return err - } - - if !has { - return fmt.Errorf("issue has to be added to a project first") - } - - pis.ProjectBoardID = board.ID - if _, err := sess.ID(pis.ID).Cols("project_board_id").Update(&pis); err != nil { - return err - } - - return committer.Commit() -} diff --git a/models/issues/issue_search.go b/models/issues/issue_search.go index 3e878ff1e7a09..9b6bf117b1f84 100644 --- a/models/issues/issue_search.go +++ b/models/issues/issue_search.go @@ -180,6 +180,17 @@ func applyProjectCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Sessio return sess } +func applyProjectBoardCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Session { + // opts.ProjectBoardID == 0 means all project boards, + // do not need to apply any condition + if opts.ProjectBoardID > 0 { + sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": opts.ProjectBoardID})) + } else if opts.ProjectBoardID == db.NoConditionID { + sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Neq{"project_board_id": 0})) + } + return sess +} + func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) *xorm.Session { if len(opts.RepoIDs) == 1 { opts.RepoCond = builder.Eq{"issue.repo_id": opts.RepoIDs[0]} @@ -240,13 +251,7 @@ func applyConditions(sess *xorm.Session, opts *IssuesOptions) *xorm.Session { applyProjectCondition(sess, opts) - if opts.ProjectBoardID != 0 { - if opts.ProjectBoardID > 0 { - sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": opts.ProjectBoardID})) - } else { - sess.In("issue.id", builder.Select("issue_id").From("project_issue").Where(builder.Eq{"project_board_id": 0})) - } - } + applyProjectBoardCondition(sess, opts) switch opts.IsPull { case util.OptionalBoolTrue: diff --git a/models/issues/pull.go b/models/issues/pull.go index 971ce049c3112..2379c61976635 100644 --- a/models/issues/pull.go +++ b/models/issues/pull.go @@ -272,7 +272,7 @@ func (pr *PullRequest) LoadAttributes(ctx context.Context) (err error) { if pr.HasMerged && pr.Merger == nil { pr.Merger, err = user_model.GetUserByID(ctx, pr.MergerID) if user_model.IsErrUserNotExist(err) { - pr.MergerID = -1 + pr.MergerID = user_model.GhostUserID pr.Merger = user_model.NewGhostUser() } else if err != nil { return fmt.Errorf("getUserByID [%d]: %w", pr.MergerID, err) diff --git a/models/user/avatar.go b/models/user/avatar.go index 8c9abecbea9cb..c6937d7b51f76 100644 --- a/models/user/avatar.go +++ b/models/user/avatar.go @@ -58,8 +58,7 @@ func GenerateRandomAvatar(ctx context.Context, u *User) error { // AvatarLinkWithSize returns a link to the user's avatar with size. size <= 0 means default size func (u *User) AvatarLinkWithSize(ctx context.Context, size int) string { - if u.ID == -1 { - // ghost user + if u.IsGhost() { return avatars.DefaultAvatarLink() } diff --git a/models/user/user.go b/models/user/user.go index 5e88077ee122e..b02d4eaddf565 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -933,7 +933,7 @@ func GetUserByIDs(ctx context.Context, ids []int64) ([]*User, error) { // GetPossibleUserByID returns the user if id > 0 or return system usrs if id < 0 func GetPossibleUserByID(ctx context.Context, id int64) (*User, error) { switch id { - case -1: + case GhostUserID: return NewGhostUser(), nil case ActionsUserID: return NewActionsUser(), nil @@ -949,7 +949,7 @@ func GetPossibleUserByIDs(ctx context.Context, ids []int64) ([]*User, error) { uniqueIDs := container.SetOf(ids...) users := make([]*User, 0, len(ids)) _ = uniqueIDs.Remove(0) - if uniqueIDs.Remove(-1) { + if uniqueIDs.Remove(GhostUserID) { users = append(users, NewGhostUser()) } if uniqueIDs.Remove(ActionsUserID) { diff --git a/models/user/user_system.go b/models/user/user_system.go index f54f4e3ffb5bb..612cdb2caef26 100644 --- a/models/user/user_system.go +++ b/models/user/user_system.go @@ -9,12 +9,18 @@ import ( "code.gitea.io/gitea/modules/structs" ) +const ( + GhostUserID = -1 + GhostUserName = "Ghost" + GhostUserLowerName = "ghost" +) + // NewGhostUser creates and returns a fake user for someone has deleted their account. func NewGhostUser() *User { return &User{ - ID: -1, - Name: "Ghost", - LowerName: "ghost", + ID: GhostUserID, + Name: GhostUserName, + LowerName: GhostUserLowerName, } } @@ -23,13 +29,13 @@ func (u *User) IsGhost() bool { if u == nil { return false } - return u.ID == -1 && u.Name == "Ghost" + return u.ID == GhostUserID && u.Name == GhostUserName } // NewReplaceUser creates and returns a fake user for external user func NewReplaceUser(name string) *User { return &User{ - ID: -1, + ID: 0, Name: name, LowerName: strings.ToLower(name), } diff --git a/modules/doctor/repository.go b/modules/doctor/repository.go index aa3f064ddd84c..d69ba2048bb2e 100644 --- a/modules/doctor/repository.go +++ b/modules/doctor/repository.go @@ -37,24 +37,29 @@ func deleteOrphanedRepos(ctx context.Context) (int64, error) { adminUser := &user_model.User{IsAdmin: true} for { - var ids []int64 - if err := e.Table("`repository`"). - Join("LEFT", "`user`", "repository.owner_id=user.id"). - Where(builder.IsNull{"`user`.id"}). - Select("`repository`.id").Limit(batchSize).Find(&ids); err != nil { - return deleted, err - } + select { + case <-ctx.Done(): + return deleted, ctx.Err() + default: + var ids []int64 + if err := e.Table("`repository`"). + Join("LEFT", "`user`", "repository.owner_id=user.id"). + Where(builder.IsNull{"`user`.id"}). + Select("`repository`.id").Limit(batchSize).Find(&ids); err != nil { + return deleted, err + } - // if we don't get ids we have deleted them all - if len(ids) == 0 { - return deleted, nil - } + // if we don't get ids we have deleted them all + if len(ids) == 0 { + return deleted, nil + } - for _, id := range ids { - if err := repo_service.DeleteRepositoryDirectly(ctx, adminUser, id, true); err != nil { - return deleted, err + for _, id := range ids { + if err := repo_service.DeleteRepositoryDirectly(ctx, adminUser, id, true); err != nil { + return deleted, err + } + deleted++ } - deleted++ } } } diff --git a/modules/indexer/issues/db/options.go b/modules/indexer/issues/db/options.go index 4d3fa44ca6cf7..e149066494f52 100644 --- a/modules/indexer/issues/db/options.go +++ b/modules/indexer/issues/db/options.go @@ -96,7 +96,6 @@ func ToDBOptions(ctx context.Context, options *internal.SearchOptions) (*issue_m } if len(options.IncludedLabelIDs) == 0 && len(options.IncludedAnyLabelIDs) > 0 { - _ = ctx // issue_model.GetLabelsByIDs should be called with ctx, this line can be removed when it's done. labels, err := issue_model.GetLabelsByIDs(ctx, options.IncludedAnyLabelIDs, "name") if err != nil { return nil, fmt.Errorf("GetLabelsByIDs: %v", err) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 84c457e9e848b..b0c21816ae936 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -91,6 +91,7 @@ remove = Remove remove_all = Remove All remove_label_str = Remove item "%s" edit = Edit +view = View enabled = Enabled disabled = Disabled @@ -355,7 +356,6 @@ code_last_indexed_at = Last indexed %s relevant_repositories_tooltip = Repositories that are forks or that have no topic, no icon, and no description are hidden. relevant_repositories = Only relevant repositories are being shown, show unfiltered results. - [auth] create_new_account = Register Account register_helper_msg = Already have an account? Sign in now! @@ -858,7 +858,7 @@ oauth2_client_secret_hint = The secret will not be shown again after you leave o oauth2_application_edit = Edit oauth2_application_create_description = OAuth2 applications gives your third-party application access to user accounts on this instance. oauth2_application_remove_description = Removing an OAuth2 application will prevent it from accessing authorized user accounts on this instance. Continue? -oauth2_application_locked = Gitea pre-registers some OAuth2 applications on startup if enabled in config. To prevent unexpected bahavior, these can neither be edited nor removed. Please refer to the OAuth2 documentation for more information. +oauth2_application_locked = Gitea pre-registers some OAuth2 applications on startup if enabled in config. To prevent unexpected behavior, these can neither be edited nor removed. Please refer to the OAuth2 documentation for more information. authorized_oauth2_applications = Authorized OAuth2 Applications authorized_oauth2_applications_description = You have granted access to your personal Gitea account to these third party applications. Please revoke access for applications you no longer need. @@ -926,7 +926,7 @@ visibility.private = Private visibility.private_tooltip = Visible only to members of organizations you have joined [repo] -new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? Migrate repository. +new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? Migrate repository. owner = Owner owner_helper = Some organizations may not show up in the dropdown due to a maximum repository count limit. repo_name = Repository Name @@ -1023,9 +1023,9 @@ tree_path_not_found_branch = Path %[1]s doesn't exist in branch %[2]s tree_path_not_found_tag = Path %[1]s doesn't exist in tag %[2]s transfer.accept = Accept Transfer -transfer.accept_desc = Transfer to "%s" +transfer.accept_desc = Transfer to "%s" transfer.reject = Reject Transfer -transfer.reject_desc = Cancel transfer to "%s" +transfer.reject_desc = Cancel transfer to "%s" transfer.no_permission_to_accept = You do not have permission to accept this transfer. transfer.no_permission_to_reject = You do not have permission to reject this transfer. @@ -1159,7 +1159,7 @@ releases = Releases tag = Tag released_this = released this tagged_this = tagged this -file.title = %s at %s +file.title = %s at %s file_raw = Raw file_history = History file_view_source = View Source @@ -2507,7 +2507,6 @@ release.releases_for = Releases for %s release.tags_for = Tags for %s branch.name = Branch Name -branch.search = Search branches branch.already_exists = A branch named "%s" already exists. branch.delete_head = Delete branch.delete = Delete Branch "%s" @@ -3174,8 +3173,8 @@ monitor.start = Start Time monitor.execute_time = Execution Time monitor.last_execution_result = Result monitor.process.cancel = Cancel process -monitor.process.cancel_desc = Cancelling a process may cause data loss -monitor.process.cancel_notices = Cancel: %s? +monitor.process.cancel_desc = Cancelling a process may cause data loss +monitor.process.cancel_notices = Cancel: %s? monitor.process.children = Children monitor.queues = Queues @@ -3239,7 +3238,7 @@ mirror_sync_create = synced new reference %[3]s to %[3]s from mirror approve_pull_request = `approved %[3]s#%[2]s` reject_pull_request = `suggested changes for %[3]s#%[2]s` -publish_release = `released "%[4]s" at %[3]s` +publish_release = `released "%[4]s" at %[3]s` review_dismissed = `dismissed review from %[4]s for %[3]s#%[2]s` review_dismissed_reason = Reason: create_branch = created branch %[3]s in %[4]s @@ -3565,7 +3564,7 @@ type-3.display_name = Organization Project [git.filemode] changed_filemode = %[1]s → %[2]s -# Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … +; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … directory = Directory normal_file = Normal file executable_file = Executable file diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 5654d30cec0b5..9eb9e856cef14 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -1012,12 +1012,20 @@ delete_preexisting=Eliminar archivos preexistentes delete_preexisting_content=Eliminar archivos en %s delete_preexisting_success=Eliminó archivos no adoptados en %s blame_prior=Ver la culpa antes de este cambio +blame.ignore_revs=Ignorando revisiones en .git-blame-ignore-revs. Haga clic aquí para saltar y para a la vista normal. +blame.ignore_revs.failed=No se pudieron ignorar las revisiones en .git-blame-ignore-revs. +author_search_tooltip=Muestra un máximo de 30 usuarios +tree_path_not_found_commit=La ruta %[1]s no existe en el commit %[2]s +tree_path_not_found_branch=La ruta %[1]s no existe en la rama %[2]s +tree_path_not_found_tag=La ruta %[1]s no existe en la etiqueta %[2]s transfer.accept=Aceptar transferencia transfer.accept_desc=`Transferir a "%s"` transfer.reject=Rechazar transferencia transfer.reject_desc=`Cancelar transferencia a "%s"` +transfer.no_permission_to_accept=No tienes permiso para aceptar esta transferencia. +transfer.no_permission_to_reject=No tienes permiso para rechazar esta transferencia. desc.private=Privado desc.public=Público @@ -1038,11 +1046,15 @@ template.issue_labels=Etiquetas de incidencia template.one_item=Debe seleccionar al menos un elemento de plantilla template.invalid=Debe seleccionar una plantilla de repositorio +archive.title=Este repositorio está archivado. Usted puede ver los archivos y clonarlos, pero no puede hace push o abrir incidencias o pull requests. +archive.title_date=Este repositorio ha sido archivado en %s. Puedes ver archivos y clonarlo, pero no puedes hacer push o abrir incidencias o pull request. archive.issue.nocomment=Este repositorio está archivado. No se puede comentar en las incidencias. archive.pull.nocomment=Este repositorio está archivado. No se puede comentar en los pull requests. form.reach_limit_of_creation_1=Ya han alcanzado su límite de %d repositorios. form.reach_limit_of_creation_n=Ya han alcanzado su límite de repositorios de %d. +form.name_reserved=El nombre del repositorio "%s" está reservado. +form.name_pattern_not_allowed=El patrón "%s" no está permitido en un nombre de repositorio. need_auth=Autorización migrate_options=Opciones de migración @@ -1052,6 +1064,7 @@ migrate_options_lfs=Migrar archivos LFS migrate_options_lfs_endpoint.label=Punto final de LFS migrate_options_lfs_endpoint.description=Migración intentará usar su mando Git para determinar el servidor LFS. También puede especificar un punto final personalizado si los datos LFS del repositorio se almacenan en otro lugar. migrate_options_lfs_endpoint.description.local=También se admite una ruta del servidor local. +migrate_options_lfs_endpoint.placeholder=Si se deja en blanco, el punto final se derivará de la URL de clonación migrate_items=Objetos de migración migrate_items_wiki=Wiki migrate_items_milestones=Hitos @@ -1067,6 +1080,7 @@ migrate.github_token_desc=Puedes poner uno o más tokens con comas separadas aqu migrate.clone_local_path=o una ruta local del servidor migrate.permission_denied=No te está permitido importar repositorios locales. migrate.permission_denied_blocked=No puede importar desde hosts no permitidos, por favor pida al administrador que marque ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS configuración. +migrate.invalid_local_path=La ruta local no es válida. No existe o no es un directorio. migrate.invalid_lfs_endpoint=El punto final de LFS no es válido. migrate.failed=Migración fallida: %v migrate.migrate_items_options=Un token de acceso es necesario para migrar elementos adicionales @@ -1075,6 +1089,7 @@ migrated_from_fake=Migrado desde %[1]s migrate.migrate=Migrar desde %s migrate.migrating=Migrando desde %s... migrate.migrating_failed=La migración desde %s ha fallado. +migrate.migrating_failed.error=Error al migrar: %s migrate.migrating_failed_no_addr=Migración fallida. migrate.github.description=Migrar datos desde github.com u otra instancia de GitHub. migrate.git.description=Migrar un repositorio sólo desde cualquier servicio Git. @@ -1091,6 +1106,8 @@ migrate.migrating_labels=Migrando etiquetas migrate.migrating_releases=Migrando Lanzamientos migrate.migrating_issues=Migrando incidencias migrate.migrating_pulls=Migrando Pull Requests +migrate.cancel_migrating_title=Cancelar la migración +migrate.cancel_migrating_confirm=¿Quiere cancelar esta migración? mirror_from=réplica de forked_from=forkeado de @@ -1105,10 +1122,12 @@ unstar=Eliminar de favoritos star=Destacar fork=Fork download_archive=Descargar repositorio +more_operations=Más operaciones no_desc=Sin descripción quick_guide=Guía rápida clone_this_repo=Clonar este repositorio +cite_this_repo=Citar este repositorio create_new_repo_command=Crear un nuevo repositorio desde línea de comandos push_exist_repo=Hacer push de un repositorio existente desde línea de comandos empty_message=Este repositorio no contiene ningún contenido. @@ -1139,6 +1158,7 @@ release=Lanzamiento releases=Lanzamientos tag=Etiqueta released_this=publicó esto +tagged_this=etiquetó esto file.title=%s de %s file_raw=Original file_history=Histórico @@ -1147,6 +1167,10 @@ file_view_rendered=Ver procesado file_view_raw=Ver original file_permalink=Enlace permanente file_too_large=El archivo es demasiado grande para ser mostrado. +invisible_runes_header=`Este archivo contiene caracteres Unicode invisibles` +invisible_runes_description=`Este archivo contiene caracteres Unicode invisibles que son indistinguibles para los humanos, pero que pueden ser procesados de forma diferente por un ordenador. Si crees que esto es intencional, puedes ignorar esta advertencia. Usa el botón de Escape para revelarlos.` +ambiguous_runes_header=`Este archivo contiene caracteres Unicode ambiguos` +ambiguous_runes_description=`Este archivo contiene caracteres Unicode que pueden confundirse con otros caracteres. Si crees que esto es intencional, puedes ignorar esta advertencia. Usa el botón de Escape para revelarlos.` invisible_runes_line=`Esta línea tiene caracteres unicode invisibles` ambiguous_runes_line=`Esta línea tiene caracteres unicode ambiguos` ambiguous_character=`%[1]c [U+%04[1]X] es confusable con %[2]c [U+%04[2]X]` @@ -1159,16 +1183,21 @@ video_not_supported_in_browser=Su navegador no soporta el tag video de HTML5. audio_not_supported_in_browser=Su navegador no soporta el tag audio de HTML5. stored_lfs=Almacenados con Git LFS symbolic_link=Enlace simbólico +executable_file=Archivo Ejecutable commit_graph=Gráfico de commits commit_graph.select=Seleccionar ramas commit_graph.hide_pr_refs=Ocultar Pull Requests commit_graph.monochrome=Mono commit_graph.color=Color +commit.contained_in=Este commit está contenido en: +commit.contained_in_default_branch=Este commit es parte de la rama por defecto +commit.load_referencing_branches_and_tags=Cargar ramas y etiquetas referenciando este commit blame=Blame download_file=Descargar archivo normal_view=Vista normal line=línea lines=líneas +from_comment=(comentario) editor.add_file=Añadir archivo editor.new_file=Nuevo Archivo @@ -1183,6 +1212,7 @@ editor.must_be_on_a_branch=Debes estar en una rama para hacer o proponer cambios editor.fork_before_edit=Debes hacer fork a este repositorio para hacer o proponer cambios a este archivo. editor.delete_this_file=Eliminar archivo editor.must_have_write_access=Debes tener permisos de escritura para hacer o proponer cambios a este archivo. +editor.file_delete_success=El archivo "%s" ha sido eliminado. editor.name_your_file=Nombre su archivo… editor.filename_help=Añade un directorio escribiendo su nombre seguido de una barra ('/'). Para eliminar un directorio, presione la tecla de retroceso al comienzo del campo de entrada. editor.or=o @@ -1190,8 +1220,12 @@ editor.cancel_lower=Cancelar editor.commit_signed_changes=Crear commit firmado de los cambios editor.commit_changes=Crear commit de los cambios editor.add_tmpl=Añadir '' +editor.add=Añadir %s +editor.update=Actualizar %s +editor.delete=Eliminar %s editor.patch=Aplicar parche editor.patching=Parcheando: +editor.fail_to_apply_patch=`No se puede aplicar el parche "%s"` editor.new_patch=Nuevo parche editor.commit_message_desc=Añadir una descripción extendida opcional… editor.signoff_desc=Añadir un trailer firmado por el committer al final del mensaje de registro de confirmación. @@ -1199,18 +1233,33 @@ editor.commit_directly_to_this_branch=Hacer commit directamente en la rama nueva rama para este commit y hacer un pull request. editor.create_new_branch_np=Crear una nueva rama para este commit. editor.propose_file_change=Proponer cambio de archivo +editor.new_branch_name=Nombra la nueva rama para este commit editor.new_branch_name_desc=Nombre de la rama nueva… editor.cancel=Cancelar editor.filename_cannot_be_empty=El nombre del archivo no puede estar vacío. +editor.filename_is_invalid=El nombre de archivo no es válido: "%s". +editor.branch_does_not_exist=La rama "%s" no existe en este repositorio. +editor.branch_already_exists=La rama "%s" ya existe en este repositorio. +editor.directory_is_a_file=Nombre del directorio "%s" ya se utiliza como nombre de archivo en este repositorio. +editor.file_is_a_symlink=`"%s" es un enlace simbólico. Los enlaces simbólicos no se pueden editar en el editor web` +editor.filename_is_a_directory=Nombre de archivo "%s" ya se utiliza como nombre de directorio en este repositorio. +editor.file_editing_no_longer_exists=El archivo que se está editando, "%s", ya no existe en este repositorio. +editor.file_deleting_no_longer_exists=El archivo que se está eliminando, "%s", ya no existe en este repositorio. editor.file_changed_while_editing=Desde que comenzó a editar, el contenido del archivo ha sido cambiado. Haga clic aquí para ver qué ha cambiado o presione confirmar de nuevo para sobrescribir los cambios. +editor.file_already_exists=Ya existe un archivo llamado "%s" en este repositorio. editor.commit_empty_file_header=Commit un archivo vacío editor.commit_empty_file_text=El archivo que estás tratando de commit está vacío. ¿Proceder? editor.no_changes_to_show=No existen cambios para mostrar. +editor.fail_to_update_file=Error al actualizar/crear el archivo "%s". editor.fail_to_update_file_summary=Mensaje de error editor.push_rejected_no_message=El cambio fue rechazado por el servidor sin un mensaje. Por favor, compruebe Git Hooks. editor.push_rejected=El cambio fue rechazado por el servidor. Por favor, comprueba los Git Hooks. editor.push_rejected_summary=Mensaje completo de rechazo editor.add_subdir=Añadir un directorio… +editor.unable_to_upload_files=Error al subir los archivos a "%s" con error: %v +editor.upload_file_is_locked=El archivo "%s" está bloqueado por %s. +editor.upload_files_to_dir=`Subir archivos a "%s"` +editor.cannot_commit_to_protected_branch=No se puede hacer commit a la rama protegida "%s". editor.no_commit_to_branch=No se puede hacer commit directamente a la rama porque: editor.user_no_push_to_branch=El usuario no puede hacer push a la rama editor.require_signed_commit=Esta rama requiere un commit firmado @@ -1496,6 +1545,7 @@ issues.unsubscribe=Desuscribirse issues.unpin_issue=Desanclar incidencia issues.max_pinned=No puedes anclar más incidencias issues.pin_comment=anclado este %s +issues.unpin_comment=desanclado este %s issues.lock=Bloquear conversación issues.unlock=Desbloquear conversación issues.lock.unknown_reason=No se puede bloquear una incidencia con una razón desconocida. @@ -1527,6 +1577,7 @@ issues.tracking_already_started=`¡Ya has iniciado el seguimiento de tiempo en < issues.stop_tracking=Detener temporizador issues.stop_tracking_history=`dejó de trabajar %s` issues.cancel_tracking=Descartar +issues.cancel_tracking_history=`canceló el seguimiento de tiempo %s` issues.add_time=Añadir tiempo gastado manualmente issues.del_time=Eliminar este registro de tiempo issues.add_time_short=Añadir tiempo gastado @@ -1550,6 +1601,7 @@ issues.due_date_form=aaaa-mm-dd issues.due_date_form_add=Añadir fecha de vencimiento issues.due_date_form_edit=Editar issues.due_date_form_remove=Eliminar +issues.due_date_not_writer=Necesita acceso de escritura a este repositorio para actualizar la fecha límite de de una incidencia. issues.due_date_not_set=Sin fecha de vencimiento. issues.due_date_added=añadió la fecha de vencimiento %s %s issues.due_date_modified=modificó la fecha de vencimiento de %[2]s a %[1]s %[3]s @@ -1559,6 +1611,9 @@ issues.due_date_invalid=La fecha de vencimiento es inválida o está fuera de ra issues.dependency.title=Dependencias issues.dependency.issue_no_dependencies=No se han establecido dependencias. issues.dependency.pr_no_dependencies=No se han establecido dependencias. +issues.dependency.no_permission_1=No tienes permiso para leer la dependencia %d +issues.dependency.no_permission_n=No tienes permiso para leer las dependencias %d +issues.dependency.no_permission.can_remove=No tienes permiso para leer esta dependencia, pero puedes eliminarla issues.dependency.add=Añadir dependencia… issues.dependency.cancel=Cancelar issues.dependency.remove=Eliminar @@ -1570,6 +1625,7 @@ issues.dependency.issue_closing_blockedby=Cerrando esta incidencia esta bloquead issues.dependency.issue_close_blocks=Esta incidencia bloquea el cierre de las siguientes incidencias issues.dependency.pr_close_blocks=Este pull request bloquea el cierre de las siguientes incidencias issues.dependency.issue_close_blocked=Necesita cerrar todos las incidencias que bloquean esta incidencia antes de que se puede cerrar. +issues.dependency.issue_batch_close_blocked=No se pueden cerrar por lotes las incidencias que has seleccionado, ya que la incidencia #%d todavía tiene dependencias abiertas issues.dependency.pr_close_blocked=Necesita cerrar todos las incidencias que bloquean este pull request antes de poder fusionarse. issues.dependency.blocks_short=Bloquea issues.dependency.blocked_by_short=Depende de @@ -1597,9 +1653,13 @@ issues.review.add_review_request=solicitud de revisión de %s %s issues.review.remove_review_request=solicitud de revisión eliminada para %s %s issues.review.remove_review_request_self=rechazó revisar %s issues.review.pending=Pendiente +issues.review.pending.tooltip=Este comentario no es visible actualmente para otros usuarios. Para enviar sus comentarios pendientes, seleccione "%s" -> "%s/%s/%s" en la parte superior de la página. issues.review.review=Revisar issues.review.reviewers=Revisores issues.review.outdated=Obsoleto +issues.review.outdated_description=El contenido ha cambiado desde que se hizo este comentario +issues.review.option.show_outdated_comments=Mostrar comentarios desactualizados +issues.review.option.hide_outdated_comments=Ocultar comentarios desactualizados issues.review.show_outdated=Mostrar obsoletos issues.review.hide_outdated=Ocultar obsoletos issues.review.show_resolved=Mostrar resueltos @@ -1631,12 +1691,21 @@ pulls.compare_changes_desc=Seleccione la rama en la que se fusiona y la rama a r pulls.has_viewed_file=Visto pulls.has_changed_since_last_review=Cambiado desde tu última revisión pulls.viewed_files_label=%[1]d / %[2]d archivos vistos +pulls.expand_files=Expandir todos los archivos +pulls.collapse_files=Contraer todos los archivos pulls.compare_base=fusionar en pulls.compare_compare=recuperar de pulls.switch_comparison_type=Cambiar tipo de comparación pulls.switch_head_and_base=Intercambiar cabeza y base pulls.filter_branch=Filtrar rama pulls.no_results=Sin resultados. +pulls.show_all_commits=Mostrar todos los commits +pulls.show_changes_since_your_last_review=Mostrar cambios desde tu última revisión +pulls.showing_only_single_commit=Mostrando solo los cambios del commit %[1]s +pulls.showing_specified_commit_range=Mostrando solo cambios entre %[1]s..%[2]s +pulls.select_commit_hold_shift_for_range=Seleccionar commit. Mantener pulsado shift + clic para seleccionar un rango +pulls.review_only_possible_for_full_diff=La revisión solo es posible cuando se ve la diff completa +pulls.filter_changes_by_commit=Filtrar por commit pulls.nothing_to_compare=Estas ramas son iguales. No hay necesidad para crear un pull request. pulls.nothing_to_compare_and_allow_empty_pr=Estas ramas son iguales. Este PR estará vacío. pulls.has_pull_request=`Ya existe un pull request entre estas ramas: %[2]s#%[3]d` @@ -1650,7 +1719,10 @@ pulls.tab_files=Archivos modificados pulls.reopen_to_merge=Vuelva a abrir este Pull Request para realizar una fusión. pulls.cant_reopen_deleted_branch=Este pull request no se puede reabrir porque la rama fue eliminada. pulls.merged=Fusionado +pulls.merged_success=Se fusionó y cerró la solicitud de incorporación correctamente +pulls.closed=Se cerró la solicitud de incorporación pulls.manually_merged=Fusionado manualmente +pulls.merged_info_text=Ahora se puede eliminar la rama %s. pulls.is_closed=El pull request ha sido cerrado. pulls.title_wip_desc=`Comience el título con %s para prevenir que el pull request se fusione accidentalmente.` pulls.cannot_merge_work_in_progress=Este pull request está marcado como un trabajo en curso. @@ -1665,6 +1737,12 @@ pulls.is_empty=Los cambios en esta rama ya están en la rama de destino. Esto se pulls.required_status_check_failed=Algunos controles requeridos no han tenido éxito. pulls.required_status_check_missing=Faltan algunos controles necesarios. pulls.required_status_check_administrator=Como administrador, aún puede fusionar este Pull Request. +pulls.blocked_by_approvals=Esta pull request aún no tiene suficientes aprobaciones. %d de %d aprobaciones concedidas. +pulls.blocked_by_rejection=Este pull request tiene cambios solicitados por un revisor oficial. +pulls.blocked_by_official_review_requests=Esta pull request tiene solicitudes de revisión oficiales. +pulls.blocked_by_outdated_branch=Esta pull request está bloqueada porque está desactualizada. +pulls.blocked_by_changed_protected_files_1=Esta pull request está bloqueada porque cambia un archivo protegido: +pulls.blocked_by_changed_protected_files_n=Esta pull request está bloqueada porque cambia archivos protegidos: pulls.can_auto_merge_desc=Este Pull Request puede ser fusionado automáticamente. pulls.cannot_auto_merge_desc=Este pull request no se puede combinar automáticamente debido a conflictos. pulls.cannot_auto_merge_helper=Combinar manualmente para resolver los conflictos. @@ -1699,6 +1777,7 @@ pulls.rebase_conflict_summary=Mensaje de error pulls.unrelated_histories=Fusionar Fallidos: El jefe de fusión y la base no comparten un historial común. Pista: Prueba una estrategia diferente pulls.merge_out_of_date=Fusión fallida: Mientras se generaba la fusión, la base fue actualizada. Pista: Inténtelo de nuevo. pulls.head_out_of_date=Fusión fallida: Mientras se generaba la fusión, la cabeza fue actualizada. Pista: Inténtelo de nuevo. +pulls.has_merged=Error: La pull request ha sido fusionada, no puedes fusionarla de nuevo ni cambiar la rama objetivo. pulls.push_rejected=Fusión fallida: El push fue rechazado. Revise los Git Hooks para este repositorio. pulls.push_rejected_summary=Mensaje completo de rechazo pulls.push_rejected_no_message=Fusión fallida: El push fue rechazado pero no hubo mensaje remoto.
Revise los Git Hooks para este repositorio @@ -1715,11 +1794,14 @@ pulls.update_branch_rebase=Actualizar rama por cambio de base pulls.update_branch_success=La actualización de la rama ha finalizado correctamente pulls.update_not_allowed=No tiene permisos para actualizar esta rama pulls.outdated_with_base_branch=Esta rama está desactualizada con la rama base +pulls.close=Cerrar Pull Request pulls.closed_at=`cerró este pull request %[2]s` pulls.reopened_at=`reabrió este pull request %[2]s` pulls.merge_instruction_hint=`También puede ver instrucciones de línea de comandos.` pulls.merge_instruction_step1_desc=Desde el repositorio de su proyecto, revisa una nueva rama y prueba los cambios. pulls.merge_instruction_step2_desc=Combine los cambios y actualice en Gitea. +pulls.clear_merge_message=Borrar mensaje de fusión +pulls.clear_merge_message_hint=Limpiar el mensaje de fusión solo eliminará el contenido del mensaje de commit y mantendrá frases generadas como "Co-Autorizado por …". pulls.auto_merge_button_when_succeed=(cuando las comprobaciones tengan éxito) pulls.auto_merge_when_succeed=Fusionar automática cuando todas las comprobaciones tengan éxito @@ -1736,13 +1818,17 @@ pulls.auto_merge_canceled_schedule_comment=`canceló la fusión automática de e pulls.delete.title=¿Borrar este pull request? pulls.delete.text=¿Realmente quieres eliminar esta pull request? (Esto eliminará permanentemente todo el contenido. Considera cerrarlo si simplemente deseas archivarlo) +pulls.recently_pushed_new_branches=Has realizado push en la rama %[1]s %[2]s +pull.deleted_branch=(eliminado):%s milestones.new=Nuevo hito milestones.closed=Cerrada %s +milestones.update_ago=Actualizado %s milestones.no_due_date=Sin fecha límite milestones.open=Abrir milestones.close=Cerrar +milestones.new_subheader=Los hitos pueden ayudarle a organizar los problemas y monitorizar su progreso. milestones.completeness=%d%% Completado milestones.create=Crear hito milestones.title=Título @@ -1750,18 +1836,31 @@ milestones.desc=Descripción milestones.due_date=Fecha límite (opcional) milestones.clear=Limpiar milestones.invalid_due_date_format=El formato de fecha de vencimiento debe ser 'AAAA-mm-dd'. +milestones.create_success=Se ha creado el hito "%s". milestones.edit=Editar Milestone milestones.edit_subheader=Los hitos organizan los problemas y siguen el progreso. milestones.cancel=Cancelar milestones.modify=Actualizar hito +milestones.edit_success=Se ha actualizado el hito "%s". milestones.deletion=Eliminar hito milestones.deletion_desc=Eliminando un hito lo elimina de todos los problemas relacionados. ¿Continuar? milestones.deletion_success=El hito se ha eliminado. +milestones.filter_sort.earliest_due_data=Fecha de vencimiento más temprana +milestones.filter_sort.latest_due_date=Fecha de vencimiento más lejana milestones.filter_sort.least_complete=Menos completa milestones.filter_sort.most_complete=Más completa milestones.filter_sort.most_issues=Mayoría de los problemas milestones.filter_sort.least_issues=Menos problemas +signing.will_sign=Este commit se firmará con la clave "%s". +signing.wont_sign.error=Hubo un error mientras se comprobaba si la confirmación podía ser firmada. +signing.wont_sign.nokey=No hay ninguna clave disponible para firmar este commit. +signing.wont_sign.never=Nunca se firman los commits. +signing.wont_sign.always=Siempre se firman los commits. +signing.wont_sign.pubkey=El commit no se firmará porque no tiene una clave pública asociada a su cuenta. +signing.wont_sign.twofa=Debe tener habilitada la autenticación de doble factor para tener los commits firmados. +signing.wont_sign.parentsigned=El commit no será firmado ya que el commit padre no está firmado. +signing.wont_sign.basesigned=La fusión no se firmará ya que el commit base no está firmado. signing.wont_sign.headsigned=La fusión no se firmará ya que el commit principal no está firmado. signing.wont_sign.commitssigned=La fusión no se firmará ya que todos los commits asociados no están firmados. signing.wont_sign.approved=La fusión no se firmará ya que el PR no está aprobado. @@ -2212,8 +2311,17 @@ settings.dismiss_stale_approvals_desc=Cuando los nuevos commits que cambien el c settings.require_signed_commits=Requiere commits firmados settings.require_signed_commits_desc=Rechazar push en esta rama si los commits no están firmados o no son verificables. settings.protect_branch_name_pattern=Patrón de nombre de la rama protegida +settings.protect_branch_name_pattern_desc=Patrones de nombre de rama protegidos. Consulte la documentación para la sintaxis de patrones. Ejemplos: principal, lanzamiento/** +settings.protect_patterns=Patrones +settings.protect_protected_file_patterns=Patrones de archivos protegidos (separados con punto y coma ';'): +settings.protect_protected_file_patterns_desc=No está permitido cambiar archivos directamente incluso si el usuario tiene permiso para agregar, editar o borrar archivos en esta rama. Múltiples patrones pueden separarse usando punto y coma (';'). Refvisa la documentación de github.com/gobwas/glob para la sintaxis de patrones. Ejemplos: .drone.yml, /docs/**/*.txt. +settings.protect_unprotected_file_patterns=Patrones de archivos sin protección (separados con punto y coma ';'): +settings.protect_unprotected_file_patterns_desc=Los archivos sin protección se pueden cambiar directamente si el usuario tiene acceso de escritura, evitando la restricción push. Múltiples patrones pueden separarse usando punto y coma (';'). Vea la documentación de github.com/gobwas/glob para la sintaxis de patrones. Ejemplos: .drone.yml, /docs/**/*.txt. settings.add_protected_branch=Activar protección settings.delete_protected_branch=Desactivar protección +settings.update_protect_branch_success=Se ha actualizado la protección de la rama para la regla "%s". +settings.remove_protected_branch_success=Se ha eliminado la protección de la rama para la regla "%s". +settings.remove_protected_branch_failed=Error al eliminar la regla de protección de rama "%s". settings.protected_branch_deletion=Desactivar protección de rama settings.protected_branch_deletion_desc=Desactivar la protección de la rama permite a los usuarios con permiso de escritura hacer push a la rama. ¿Continuar? settings.block_rejected_reviews=Bloquear fusión en las revisión rechazadas @@ -2223,10 +2331,13 @@ settings.block_on_official_review_requests_desc=Fusionar no será posible cuando settings.block_outdated_branch=Bloquear fusión si la pull request está desactualizada settings.block_outdated_branch_desc=La fusión no será posible cuando la rama principal esté detrás de la rama base. settings.default_branch_desc=Seleccione una rama de repositorio por defecto para los pull request y los commits: +settings.merge_style_desc=Estilos de fusión settings.default_merge_style_desc=Estilo de fusión por defecto para pull requests: settings.choose_branch=Elija una rama… settings.no_protected_branch=No hay ramas protegidas. settings.edit_protected_branch=Editar +settings.protected_branch_required_rule_name=Nombre de regla requerido +settings.protected_branch_duplicate_rule_name=Nombre de regla duplicado settings.protected_branch_required_approvals_min=Las aprobaciones necesarias no pueden ser negativas. settings.tags=Etiquetas settings.tags.protection=Protección de etiquetas @@ -2237,18 +2348,26 @@ settings.tags.protection.allowed.teams=Equipos permitidos settings.tags.protection.allowed.noone=Ningún settings.tags.protection.create=Proteger Etiqueta settings.tags.protection.none=No hay etiquetas protegidas. +settings.tags.protection.pattern.description=Puede usar un solo nombre, un patrón de glob o expresión regular para que coincida con varias etiquetas. Lea más en la guía de etiquetas protegidas. settings.bot_token=Token del Bot settings.chat_id=ID Chat +settings.thread_id=ID del hilo settings.matrix.homeserver_url=URL de Homeserver settings.matrix.room_id=ID de sala settings.matrix.message_type=Tipo de mensaje settings.archive.button=Archivar Repositorio settings.archive.header=Archivar este repositorio +settings.archive.text=Archivar el repositorio lo hará de sólo lectura. Se ocultará del tablero. Nadie (¡ni siquiera tú!) será capaz de hacer nuevos commits, o abrir nuevas incidencias o pull requests. settings.archive.success=El repositorio ha sido archivado exitosamente. settings.archive.error=Ha ocurrido un error al intentar archivar el repositorio. Vea el registro para más detalles. settings.archive.error_ismirror=No puede archivar un repositorio replicado. settings.archive.branchsettings_unavailable=Los ajustes de rama no están disponibles si el repositorio está archivado. settings.archive.tagsettings_unavailable=Los ajustes de las etiquetas no están disponibles si el repositorio está archivado. +settings.unarchive.button=Desarchivar repositorio +settings.unarchive.header=Desarchivar este repositorio +settings.unarchive.text=La desarchivación del repositorio restablecerá su capacidad de recibir commits y pushes, así como nuevas incidencias y pull requests. +settings.unarchive.success=El repositorio se ha desarchivado correctamente. +settings.unarchive.error=Ocurrió un error mientras se trataba de des-archivar el repositorio. Revisa el registro para más detalles. settings.update_avatar_success=El avatar del repositorio ha sido actualizado. settings.lfs=LFS settings.lfs_filelist=No hay archivos LFS almacenados en este repositorio @@ -2315,6 +2434,7 @@ diff.show_more=Ver más diff.load=Cargar Diff diff.generated=generado diff.vendored=vendido +diff.comment.add_line_comment=Añadir comentario en línea diff.comment.placeholder=Deja un comentario diff.comment.markdown_info=Es posible estilizar con markdown. diff.comment.add_single_comment=Añadir solo comentario @@ -2326,13 +2446,17 @@ diff.review.header=Enviar revisión diff.review.placeholder=Comentario de revisión diff.review.comment=Comentario diff.review.approve=Aprobar +diff.review.self_reject=Los autores del pull request no pueden solicitar cambios diff.review.reject=Solicitud de cambios +diff.review.self_approve=Los autores del pull request no pueden aprobarlo diff.committed_by=cometido por diff.protected=Protegido diff.image.side_by_side=Lado a lado diff.image.swipe=Deslizar diff.image.overlay=Superposición diff.has_escaped=Esta línea tiene caracteres Unicode ocultos +diff.show_file_tree=Mostrar árbol de archivos +diff.hide_file_tree=Ocultar árbol de archivos releases.desc=Seguir las versiones y descargas del proyecto. release.releases=Lanzamientos @@ -2346,12 +2470,18 @@ release.compare=Comparar release.edit=editar release.ahead.commits=%d commits release.ahead.target=a %s desde esta versión +tag.ahead.target=a %s desde esta etiqueta release.source_code=Código Fuente release.new_subheader=Los lanzamientos organizan las versiones de proyectos. release.edit_subheader=Los lanzamientos organizan las versiones de proyectos. release.tag_name=Nombre de la etiqueta release.target=Destino release.tag_helper=Escoge una etiqueta existente o crea una nueva. +release.tag_helper_new=Nueva etiqueta. Esta etiqueta se creará desde el destino. +release.tag_helper_existing=Etiqueta actual. +release.title=Título de lanzamiento +release.title_empty=El título no puede estar vacío. +release.message=Describe esta versión release.prerelease_desc=Marcar como Pre-Lanzamiento release.prerelease_helper=Marcar este lanzamiento como no es adecuada para usar en producción. release.cancel=Cancelar @@ -2361,6 +2491,7 @@ release.edit_release=Actualizar Lanzamiento release.delete_release=Eliminar Lanzamiento release.delete_tag=Eliminar Etiqueta release.deletion=Eliminar Lanzamiento +release.deletion_desc=Eliminar un lanzamiento sólo lo elimina de Gitea. No afectará la etiqueta Git, el contenido de su repositorio o su historial. ¿Continuar? release.deletion_success=El lanzamiento ha sido eliminado. release.deletion_tag_desc=Eliminará esta etiqueta del repositorio. El contenido del repositorio y el historial permanecerán sin cambios. ¿Continuar? release.deletion_tag_success=La etiqueta ha sido eliminada. @@ -2372,12 +2503,30 @@ release.downloads=Descargas release.download_count=Descargas: %s release.add_tag_msg=Utilice el título y el contenido de la liberación como mensaje de etiqueta. release.add_tag=Crear solo etiqueta +release.releases_for=Lanzamientos para %s +release.tags_for=Etiquetas para %s branch.name=Nombre de la rama +branch.search=Buscar rama +branch.already_exists=Una rama llamada "%s" ya existe. branch.delete_head=Eliminar +branch.delete=`Eliminar rama "%s "` branch.delete_html=Eliminar rama +branch.delete_desc=Eliminar una rama es permanente. Aunque la rama eliminada puede continuar existiendo durante un corto tiempo antes de que sea eliminada, en la mayoría de los casos NO PUEDE deshacerse. ¿Continuar? +branch.deletion_success=La rama "%s" ha sido eliminada. +branch.deletion_failed=Error al eliminar la rama "%s". +branch.delete_branch_has_new_commits=La rama "%s" no se puede eliminar porque se han añadido nuevos commits después de la fusión. branch.create_branch=Crear rama %s +branch.create_from=`de "%s"` +branch.create_success=La rama "%s" ha sido creada. +branch.branch_already_exists=La rama "%s" ya existe en este repositorio. +branch.branch_name_conflict=El nombre de la rama "%s" entra en conflicto con la rama existente "%s". +branch.tag_collision=La rama "%s" no se puede crear como una etiqueta con el mismo nombre ya existe en el repositorio. branch.deleted_by=Eliminada por %s +branch.restore_success=La rama "%s" ha sido restaurada. +branch.restore_failed=Error al restaurar la rama "%s". +branch.protected_deletion_failed=La rama "%s" está protegida. No se puede eliminar. +branch.default_deletion_failed=La rama "%s" es la rama por defecto. No se puede eliminar. branch.restore=`Restaurar rama "%s"` branch.download=`Descargar rama "%s"` branch.rename=`Renombrar rama "%s"` @@ -2869,6 +3018,7 @@ auths.deletion_success=El origen de autenticación ha sido eliminado. auths.login_source_exist=La fuente de autenticación "%s" ya existe. auths.login_source_of_type_exist=Ya existe un origen de autenticación de este tipo. auths.unable_to_initialize_openid=No se puede inicializar el proveedor de OpenID Connect: %s +auths.invalid_openIdConnectAutoDiscoveryURL=URL de auto descubrimiento no válida (esta debe ser una URL válida comenzando con http:// o https://) config.server_config=Configuración del servidor config.app_name=Título del sitio @@ -2882,6 +3032,7 @@ config.disable_router_log=Deshabilitar Log del Router config.run_user=Ejecutar como usuario config.run_mode=Modo de ejecución config.git_version=Versión de Git +config.app_data_path=Ruta de datos de Gitea config.repo_root_path=Ruta del Repositorio config.lfs_root_path=Ruta raíz de LFS config.log_file_root_path=Ruta de ficheros de registro @@ -2957,6 +3108,9 @@ config.mailer_sendmail_timeout=Tiempo de espera de Sendmail config.mailer_use_dummy=Dummy config.test_email_placeholder=Correo electrónico (ej. test@ejemplo.com) config.send_test_mail=Enviar prueba de correo +config.send_test_mail_submit=Enviar +config.test_mail_failed=Fallo al enviar un correo electrónico de prueba a "%s": %v +config.test_mail_sent=Se ha enviado un correo electrónico de prueba a "%s". config.oauth_config=Configuración OAuth config.oauth_enabled=Activado @@ -2994,12 +3148,15 @@ config.git_pull_timeout=Tiempo de espera de operación de pull config.git_gc_timeout=Tiempo de espera de operación de GC config.log_config=Configuración del Log +config.logger_name_fmt=Registro: %s config.disabled_logger=Desactivado config.access_log_mode=Modo de registro del Acceso +config.access_log_template=Plantilla de registro de acceso config.xorm_log_sql=Registrar SQL config.set_setting_failed=Error al configurar %s +monitor.stats=Estadísticas monitor.cron=Tareas de Cron monitor.name=Nombre @@ -3009,6 +3166,8 @@ monitor.previous=Anterior monitor.execute_times=Ejecuciones monitor.process=Procesos en ejecución monitor.stacktrace=Rastros de pila +monitor.processes_count=%d procesos +monitor.download_diagnosis_report=Descargar informe de diagnóstico monitor.desc=Descripción monitor.start=Hora de Inicio monitor.execute_time=Tiempo de ejecución @@ -3024,14 +3183,19 @@ monitor.queue.name=Nombre monitor.queue.type=Tipo monitor.queue.exemplar=Ejemplo monitor.queue.numberworkers=Número de trabajadores +monitor.queue.activeworkers=Trabajadores activos monitor.queue.maxnumberworkers=Número máximo de trabajadores monitor.queue.numberinqueue=Número en cola +monitor.queue.review_add=Revisar / Añadir Trabajadores monitor.queue.settings.title=Ajustes del grupo +monitor.queue.settings.desc=Los grupos de trabajadores crecen dinámicamente en respuesta al bloqueo de cola de sus trabajadores. monitor.queue.settings.maxnumberworkers=Número máximo de trabajadores monitor.queue.settings.maxnumberworkers.placeholder=Actualmente %[1]d monitor.queue.settings.maxnumberworkers.error=El número máximo de trabajadores debe ser un número monitor.queue.settings.submit=Actualizar ajustes monitor.queue.settings.changed=Ajustes actualizados +monitor.queue.settings.remove_all_items=Eliminar todo +monitor.queue.settings.remove_all_items_done=Todos los elementos en la cola han sido eliminados. notices.system_notice_list=Notificaciones del Sistema notices.view_detail_header=Ver detalles de notificación @@ -3141,7 +3305,9 @@ error.unit_not_allowed=No tiene permisos para acceder a esta sección del reposi title=Paquetes desc=Administrar paquetes del repositorio. empty=Todavía no hay paquetes. +empty.documentation=Para más información sobre el registro de paquetes, consulte la documentación. empty.repo=¿Has subido un paquete, pero no se muestra aquí? Ve a la configuración del paquete y añade el link a este repositorio. +registry.documentation=Para obtener más información sobre el registro %s, consulte la documentación. filter.type=Tipo filter.type.all=Todo filter.no_result=El filtro no produjo ningún resultado. @@ -3157,15 +3323,27 @@ keywords=Palabras clave details=Detalles details.author=Autoría details.project_site=Sitio del proyecto +details.repository_site=Sitio del repositorio +details.documentation_site=Sitio de documentación details.license=Licencia assets=Activos versions=Versiones versions.view_all=Ver todo dependency.id=Id. dependency.version=Versión +alpine.registry=Configura este registro agregando la url en tu archivo ./apk/repositories: +alpine.registry.key=Descargue la clave RSA pública del registro en la carpeta ./apk/keys/ para verificar la firma del índice: +alpine.registry.info=Seleccione $branch y $repository de la siguiente lista. alpine.install=Para instalar el paquete, ejecute el siguiente comando: +alpine.repository=Información del repositorio alpine.repository.branches=Ramas alpine.repository.repositories=Repositorios +alpine.repository.architectures=Arquitecturas +cargo.registry=Configurar este registro en el archivo de configuración de Cargo (por ejemplo ~/.cargo/config.toml): +cargo.install=Para instalar el paquete usando Cargo, ejecute el siguiente comando: +cargo.details.repository_site=Sitio del repositorio +cargo.details.documentation_site=Sitio de documentación +chef.registry=Configura este registro en tu archivo ~/.chef/config.rb: chef.install=Para instalar el paquete, ejecute el siguiente comando: composer.registry=Configura este registro en el archivo ~/.composer/config.json: composer.install=Para instalar el paquete usando Composer, ejecute el siguiente comando: @@ -3174,6 +3352,10 @@ composer.dependencies.development=Dependencias de desarrollo conan.details.repository=Repositorio conan.registry=Configurar este registro desde la línea de comandos: conan.install=Para instalar el paquete usando Conan, ejecuta el siguiente comando: +conda.registry=Configura este registro como un repositorio Conda en tu archivo .condarc: +conda.install=Para instalar el paquete usando Conda, ejecute el siguiente comando: +conda.details.repository_site=Sitio del repositorio +conda.details.documentation_site=Sitio de documentación container.details.type=Tipo de imagen container.details.platform=Plataforma container.pull=Arrastra la imagen desde la línea de comandos: @@ -3183,10 +3365,17 @@ container.layers=Capas de imagen container.labels=Etiquetas container.labels.key=Clave container.labels.value=Valor +cran.registry=Configurar este registro en su archivo Rprofile.site: cran.install=Para instalar el paquete, ejecute el siguiente comando: debian.registry=Configurar este registro desde la línea de comandos: +debian.registry.info=Seleccione $distribution y $component de la siguiente lista. debian.install=Para instalar el paquete, ejecute el siguiente comando: +debian.repository=Información del repositorio +debian.repository.distributions=Distribuciones +debian.repository.components=Componentes +debian.repository.architectures=Arquitecturas generic.download=Descargar paquete desde la línea de comandos: +go.install=Instalar el paquete desde la línea de comandos: helm.registry=Configurar este registro desde la línea de comandos: helm.install=Para instalar el paquete, ejecute el siguiente comando: maven.registry=Configure este registro en su proyecto pom.xml archivo: @@ -3208,6 +3397,8 @@ pub.install=Para instalar el paquete usando Dart, ejecute el siguiente comando: pypi.requires=Requiere Python pypi.install=Para instalar el paquete usando pip, ejecute el siguiente comando: rpm.registry=Configurar este registro desde la línea de comandos: +rpm.distros.redhat=en distribuciones basadas en RedHat +rpm.distros.suse=en distribuciones basadas en SUSE rpm.install=Para instalar el paquete, ejecute el siguiente comando: rubygems.install=Para instalar el paquete usando gem, ejecute el siguiente comando: rubygems.install2=o añádelo al archivo Gemfile: @@ -3216,6 +3407,8 @@ rubygems.dependencies.development=Dependencias de desarrollo rubygems.required.ruby=Requiere versión Ruby rubygems.required.rubygems=Requiere la versión de RubyGem swift.registry=Configurar este registro desde la línea de comandos: +swift.install=Añade el paquete en tu archivo Package.swift: +swift.install2=y ejecuta el siguiente comando: vagrant.install=Para añadir un paquete Vagrant, ejecuta el siguiente comando: settings.link=Vincular este paquete a un repositorio settings.link.description=Si enlaza un paquete con un repositorio, el paquete se enumera en la lista de paquetes del repositorio. @@ -3228,6 +3421,12 @@ settings.delete.description=La eliminación de un paquete es permanente y no se settings.delete.notice=Está a punto de eliminar %s (%s). Esta operación es irreversible, ¿está seguro? settings.delete.success=Se ha eliminado el paquete. settings.delete.error=No se pudo eliminar el paquete. +owner.settings.cargo.title=Índice del registro Cargo +owner.settings.cargo.initialize=Inicializar índice +owner.settings.cargo.initialize.description=Se necesita un repositorio Git de índice especial para usar el registro de Cargo. Usar esta opción (re)creará el repositorio y lo configurará automáticamente. +owner.settings.cargo.initialize.error=Fallo al inicializar el índice de Cargo: %v +owner.settings.cargo.initialize.success=El índice de Cargo se ha creado correctamente. +owner.settings.cargo.rebuild=Reconstruir índice owner.settings.cargo.rebuild.description=Reconstruir puede ser útil si el índice no se sincroniza con los paquetes de Cargo almacenados. owner.settings.cargo.rebuild.error=Fallo al reconstruir el índice de Cargo: %v owner.settings.cargo.rebuild.success=El índice de Cargo se ha reconstruido correctamente. @@ -3294,19 +3493,68 @@ runners.name=Nombre runners.owner_type=Tipo runners.description=Descripción runners.labels=Etiquetas +runners.last_online=Última hora en línea +runners.runner_title=Nodo +runners.task_list=Tareas recientes en este nodo +runners.task_list.no_tasks=Todavía no hay tarea. runners.task_list.run=Ejecutar runners.task_list.status=Estado runners.task_list.repository=Repositorio runners.task_list.commit=Commit +runners.task_list.done_at=Hecho en +runners.edit_runner=Editar nodo +runners.update_runner=Actualizar cambios +runners.update_runner_success=Nodo actualizado correctamente +runners.update_runner_failed=Fallo al actualizar el nodo +runners.delete_runner=Eliminar este nodo +runners.delete_runner_success=Nodo eliminado con éxito +runners.delete_runner_failed=Fallo al eliminar el nodo +runners.delete_runner_header=Confirma para eliminar el nodo +runners.delete_runner_notice=Si una tarea se está ejecutando en este nodo, se terminará y marcará como fallida. Puede romper el flujo de trabajo en curso. +runners.none=No hay nodos disponibles runners.status.unspecified=Desconocido +runners.status.idle=Inactivo runners.status.active=Activo +runners.status.offline=Desconectado runners.version=Versión +runners.reset_registration_token=Restablecer token de registro +runners.reset_registration_token_success=Se ha restablecido correctamente el token de registro del nodo +runs.all_workflows=Todos los flujos de trabajo runs.commit=Commit +runs.scheduled=Programado +runs.pushed_by=push enviado por +runs.invalid_workflow_helper=El archivo de configuración del trabajo no es válido. Revisa tu archivo de configuración: %s +runs.no_matching_runner_helper=No hay nodo coincidente: %s +runs.actor=Actor runs.status=Estado - - - +runs.actors_no_select=Todos los actores +runs.status_no_select=Todo el estado +runs.no_results=No hay resultados coincidentes. +runs.no_runs=El flujo de trabajo no tiene ejecuciones todavía. + +workflow.disable=Desactivar fllujo de trabajo +workflow.disable_success=Flujo de trabajo '%s' deshabilitado correctamente. +workflow.enable=Activar flujo de trabajo +workflow.enable_success=Flujo de trabajo '%s' habilitado con éxito. +workflow.disabled=El flujo de trabajo está deshabilitado. + +need_approval_desc=Necesita aprobación para ejecutar flujos de trabajo para el pull request del fork. + +variables=Variables +variables.management=Gestión de variables +variables.creation=Añadir variable +variables.none=Aún no hay variables. +variables.deletion=Eliminar variable +variables.deletion.description=Eliminar una variable es permanente y no se puede deshacer. ¿Continuar? +variables.description=Las variables se pasarán a ciertas acciones y no se podrán leer de otro modo. +variables.id_not_exist=Variable con id %d no existe. +variables.edit=Editar variable +variables.deletion.failed=No se pudo eliminar la variable. +variables.deletion.success=La variable ha sido eliminada. +variables.creation.failed=No se pudo agregar la variable. +variables.creation.success=La variable "%s" ha sido añadida. +variables.update.failed=Error al editar la variable. variables.update.success=La variable ha sido editada. [projects] diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 8d8373f0aa1a5..53ae8c4d016a0 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -1444,10 +1444,10 @@ func Routes() *web.Route { Delete(reqToken(), reqOrgMembership(), org.ConcealMember) }) m.Group("/teams", func() { - m.Get("", reqToken(), org.ListTeams) - m.Post("", reqToken(), reqOrgOwnership(), bind(api.CreateTeamOption{}), org.CreateTeam) - m.Get("/search", reqToken(), org.SearchTeam) - }, reqOrgMembership()) + m.Get("", org.ListTeams) + m.Post("", reqOrgOwnership(), bind(api.CreateTeamOption{}), org.CreateTeam) + m.Get("/search", org.SearchTeam) + }, reqToken(), reqOrgMembership()) m.Group("/labels", func() { m.Get("", org.ListLabels) m.Post("", reqToken(), reqOrgOwnership(), bind(api.CreateLabelOption{}), org.CreateLabel) diff --git a/routers/web/user/avatar.go b/routers/web/user/avatar.go index 01df2fd294bc6..772cc38bea027 100644 --- a/routers/web/user/avatar.go +++ b/routers/web/user/avatar.go @@ -27,7 +27,7 @@ func AvatarByUserName(ctx *context.Context) { size := int(ctx.ParamsInt64(":size")) var user *user_model.User - if strings.ToLower(userName) != "ghost" { + if strings.ToLower(userName) != user_model.GhostUserLowerName { var err error if user, err = user_model.GetUserByName(ctx, userName); err != nil { if user_model.IsErrUserNotExist(err) { diff --git a/services/task/migrate.go b/services/task/migrate.go index 475fa7a61b537..9cef77a6c8983 100644 --- a/services/task/migrate.go +++ b/services/task/migrate.go @@ -42,13 +42,11 @@ func handleCreateError(owner *user_model.User, err error) error { } func runMigrateTask(ctx context.Context, t *admin_model.Task) (err error) { - defer func() { + defer func(ctx context.Context) { if e := recover(); e != nil { err = fmt.Errorf("PANIC whilst trying to do migrate task: %v", e) log.Critical("PANIC during runMigrateTask[%d] by DoerID[%d] to RepoID[%d] for OwnerID[%d]: %v\nStacktrace: %v", t.ID, t.DoerID, t.RepoID, t.OwnerID, e, log.Stack(2)) } - // fixme: Because ctx is canceled here, so the db.DefaultContext is needed. - ctx := db.DefaultContext if err == nil { err = admin_model.FinishMigrateTask(ctx, t) if err == nil { @@ -69,7 +67,7 @@ func runMigrateTask(ctx context.Context, t *admin_model.Task) (err error) { } // then, do not delete the repository, otherwise the users won't be able to see the last error - }() + }(graceful.GetManager().ShutdownContext()) // even if the parent ctx is canceled, this defer-function still needs to update the task record in database if err = t.LoadRepo(ctx); err != nil { return err diff --git a/templates/org/team/teams.tmpl b/templates/org/team/teams.tmpl index 6b16da9d113f6..9723294fd6bcf 100644 --- a/templates/org/team/teams.tmpl +++ b/templates/org/team/teams.tmpl @@ -16,6 +16,7 @@
{{.Name}}
+ {{ctx.Locale.Tr "view"}} {{if .IsMember ctx $.SignedUser.ID}}