From 44deae8f3dfcbdc9edda5a817c168e110864266b Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 20 Jan 2022 21:52:56 +0000 Subject: [PATCH 1/5] Refactor jwt.StandardClaims to RegisteredClaims (#18344) * Refactor jwt.StandardClaims to RegisteredClaims go-jwt/jwt has deprecated the StandardClaims interface to use RegisteredClaims instead. This PR migrates to use this new format. Signed-off-by: Andrew Thornton * Apply suggestions from code review Co-authored-by: Gusted Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: Gusted --- cmd/serv.go | 7 +++---- routers/web/auth/oauth.go | 24 ++++++++++-------------- services/auth/oauth2.go | 2 +- services/auth/source/oauth2/token.go | 10 ++++------ services/lfs/server.go | 3 +-- 5 files changed, 19 insertions(+), 27 deletions(-) diff --git a/cmd/serv.go b/cmd/serv.go index e42213cb9854f..b4ef37f1dc6c8 100644 --- a/cmd/serv.go +++ b/cmd/serv.go @@ -253,10 +253,9 @@ func runServ(c *cli.Context) error { now := time.Now() claims := lfs.Claims{ - // FIXME: we need to migrate to RegisteredClaims - StandardClaims: jwt.StandardClaims{ // nolint - ExpiresAt: now.Add(setting.LFS.HTTPAuthExpiry).Unix(), - NotBefore: now.Unix(), + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(now.Add(setting.LFS.HTTPAuthExpiry)), + NotBefore: jwt.NewNumericDate(now), }, RepoID: results.RepoID, Op: lfsVerb, diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index 7bf1adf308c5e..7793a408d84f7 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -149,9 +149,8 @@ func newAccessTokenResponse(grant *auth.OAuth2Grant, serverKey, clientKey oauth2 accessToken := &oauth2.Token{ GrantID: grant.ID, Type: oauth2.TypeAccessToken, - // FIXME: Migrate to RegisteredClaims - StandardClaims: jwt.StandardClaims{ //nolint - ExpiresAt: expirationDate.AsTime().Unix(), + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(expirationDate.AsTime()), }, } signedAccessToken, err := accessToken.SignToken(serverKey) @@ -163,14 +162,13 @@ func newAccessTokenResponse(grant *auth.OAuth2Grant, serverKey, clientKey oauth2 } // generate refresh token to request an access token after it expired later - refreshExpirationDate := timeutil.TimeStampNow().Add(setting.OAuth2.RefreshTokenExpirationTime * 60 * 60).AsTime().Unix() + refreshExpirationDate := timeutil.TimeStampNow().Add(setting.OAuth2.RefreshTokenExpirationTime * 60 * 60).AsTime() refreshToken := &oauth2.Token{ GrantID: grant.ID, Counter: grant.Counter, Type: oauth2.TypeRefreshToken, - // FIXME: Migrate to RegisteredClaims - StandardClaims: jwt.StandardClaims{ // nolint - ExpiresAt: refreshExpirationDate, + RegisteredClaims: jwt.RegisteredClaims{ // nolint + ExpiresAt: jwt.NewNumericDate(refreshExpirationDate), }, } signedRefreshToken, err := refreshToken.SignToken(serverKey) @@ -207,11 +205,10 @@ func newAccessTokenResponse(grant *auth.OAuth2Grant, serverKey, clientKey oauth2 } idToken := &oauth2.OIDCToken{ - // FIXME: migrate to RegisteredClaims - StandardClaims: jwt.StandardClaims{ //nolint - ExpiresAt: expirationDate.AsTime().Unix(), + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(expirationDate.AsTime()), Issuer: setting.AppURL, - Audience: app.ClientID, + Audience: []string{app.ClientID}, Subject: fmt.Sprint(grant.UserID), }, Nonce: grant.Nonce, @@ -329,8 +326,7 @@ func IntrospectOAuth(ctx *context.Context) { var response struct { Active bool `json:"active"` Scope string `json:"scope,omitempty"` - // FIXME: Migrate to RegisteredClaims - jwt.StandardClaims //nolint + jwt.RegisteredClaims } form := web.GetForm(ctx).(*forms.IntrospectTokenForm) @@ -344,7 +340,7 @@ func IntrospectOAuth(ctx *context.Context) { response.Active = true response.Scope = grant.Scope response.Issuer = setting.AppURL - response.Audience = app.ClientID + response.Audience = []string{app.ClientID} response.Subject = fmt.Sprint(grant.UserID) } } diff --git a/services/auth/oauth2.go b/services/auth/oauth2.go index fcff5313e3920..42c91fac37593 100644 --- a/services/auth/oauth2.go +++ b/services/auth/oauth2.go @@ -44,7 +44,7 @@ func CheckOAuthAccessToken(accessToken string) int64 { if token.Type != oauth2.TypeAccessToken { return 0 } - if token.ExpiresAt < time.Now().Unix() || token.IssuedAt > time.Now().Unix() { + if token.ExpiresAt.Before(time.Now()) || token.IssuedAt.After(time.Now()) { return 0 } return grant.UserID diff --git a/services/auth/source/oauth2/token.go b/services/auth/source/oauth2/token.go index 944b8da387cfd..0c69913ff4890 100644 --- a/services/auth/source/oauth2/token.go +++ b/services/auth/source/oauth2/token.go @@ -37,8 +37,7 @@ type Token struct { GrantID int64 `json:"gnt"` Type TokenType `json:"tt"` Counter int64 `json:"cnt,omitempty"` - // FIXME: Migrate to registered claims - jwt.StandardClaims + jwt.RegisteredClaims } // ParseToken parses a signed jwt string @@ -62,7 +61,7 @@ func ParseToken(jwtToken string, signingKey JWTSigningKey) (*Token, error) { // SignToken signs the token with the JWT secret func (token *Token) SignToken(signingKey JWTSigningKey) (string, error) { - token.IssuedAt = time.Now().Unix() + token.IssuedAt = jwt.NewNumericDate(time.Now()) jwtToken := jwt.NewWithClaims(signingKey.SigningMethod(), token) signingKey.PreProcessToken(jwtToken) return jwtToken.SignedString(signingKey.SignKey()) @@ -70,8 +69,7 @@ func (token *Token) SignToken(signingKey JWTSigningKey) (string, error) { // OIDCToken represents an OpenID Connect id_token type OIDCToken struct { - // FIXME: Migrate to RegisteredClaims - jwt.StandardClaims + jwt.RegisteredClaims Nonce string `json:"nonce,omitempty"` // Scope profile @@ -93,7 +91,7 @@ type OIDCToken struct { // SignToken signs an id_token with the (symmetric) client secret key func (token *OIDCToken) SignToken(signingKey JWTSigningKey) (string, error) { - token.IssuedAt = time.Now().Unix() + token.IssuedAt = jwt.NewNumericDate(time.Now()) jwtToken := jwt.NewWithClaims(signingKey.SigningMethod(), token) signingKey.PreProcessToken(jwtToken) return jwtToken.SignedString(signingKey.SignKey()) diff --git a/services/lfs/server.go b/services/lfs/server.go index cdce0046b3fd3..7c3f88e57bec1 100644 --- a/services/lfs/server.go +++ b/services/lfs/server.go @@ -45,8 +45,7 @@ type Claims struct { RepoID int64 Op string UserID int64 - // FIXME: Migrate to RegisteredClaims - jwt.StandardClaims + jwt.RegisteredClaims } // DownloadLink builds a URL to download the object. From 6c7084cbee1334c0e21118b5dbbd7368aff27ee8 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 21 Jan 2022 00:30:19 +0000 Subject: [PATCH 2/5] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 4f5a58bf76229..c82f11e7bd649 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -41,6 +41,7 @@ webauthn_use_twofa=Zwei-Faktor-Authentifizierung via Handy verwenden webauthn_error=Dein Sicherheitsschlüssel konnte nicht gelesen werden. webauthn_unsupported_browser=Dein Browser unterstützt derzeit keinen WebAuthn. webauthn_error_unknown=Ein unbekannter Fehler ist aufgetreten. Bitte versuche es erneut. +webauthn_error_insecure=WebAuthn unterstützt nur sichere Verbindungen. Zum Testen über HTTP kannst du "localhost" oder "127.0.0.1" als Host verwenden webauthn_error_unable_to_process=Der Server konnte deine Anfrage nicht bearbeiten. webauthn_error_duplicated=Für diese Anfrage ist der Sicherheitsschlüssel nicht erlaubt. Bitte stell sicher, dass er nicht bereits registriert ist. webauthn_error_timeout=Das Zeitlimit wurde erreicht, bevor dein Schlüssel gelesen werden konnte. Bitte lade die Seite erneut. From 108f1aab5cc4e667288a507acadb53a7b6ea4dbe Mon Sep 17 00:00:00 2001 From: silverwind Date: Fri, 21 Jan 2022 07:42:38 -0800 Subject: [PATCH 3/5] Add js vendor directory to .gitattributes (#18350) --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 05dde22cccb4a..4e83849e03e7e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,7 @@ * text=auto eol=lf /vendor/** -text -eol linguist-vendored /public/vendor/** -text -eol linguist-vendored +/web_src/js/vendor/** -text -eol linguist-vendored /templates/**/*.tmpl linguist-language=Handlebars /.eslintrc linguist-language=YAML /.stylelintrc linguist-language=YAML From 1f40933d38b58b60938a77cbea1c847fc8f8c3e5 Mon Sep 17 00:00:00 2001 From: qwerty287 <80460567+qwerty287@users.noreply.github.com> Date: Fri, 21 Jan 2022 18:59:26 +0100 Subject: [PATCH 4/5] Add config options to hide issue events (#17414) * Add config option to hide issue events Adds a config option `HIDE_ISSUE_EVENTS` to hide most issue events (changed labels, milestones, projects...) on the issue detail page. If this is true, only the following events (comment types) are shown: * plain comments * closed/reopned/merged * reviews * Make configurable using a list * Add docs * Add missing newline * Fix merge issues * Allow changes per user settings * Fix lint * Rm old docs * Apply suggestions from code review * Use bitsets * Rm comment * fmt * Fix lint * Use variable/constant to provide key * fmt * fix lint * refactor * Add a prefix for user setting key * Add license comment * Add license comment * Update services/forms/user_form_hidden_comments.go Co-authored-by: Gusted * check len == 0 Co-authored-by: wxiaoguang Co-authored-by: zeripath Co-authored-by: Gusted Co-authored-by: 6543 <6543@obermui.de> --- models/issue_comment.go | 6 +- models/user/setting.go | 54 +- models/user/setting_keys.go | 10 + models/user/setting_test.go | 18 +- modules/context/form.go | 10 +- modules/notification/mail/mail.go | 2 +- options/locale/locale_en-US.ini | 16 + routers/web/repo/issue.go | 17 +- routers/web/user/setting/profile.go | 26 + routers/web/web.go | 1 + services/forms/user_form_hidden_comments.go | 105 ++ services/mailer/mail.go | 2 +- services/mailer/mail_comment.go | 2 +- services/pull/pull.go | 2 +- .../repo/issue/view_content/comments.tmpl | 1486 +++++++++-------- templates/user/settings/appearance.tmpl | 98 ++ 16 files changed, 1086 insertions(+), 769 deletions(-) create mode 100644 models/user/setting_keys.go create mode 100644 services/forms/user_form_hidden_comments.go diff --git a/models/issue_comment.go b/models/issue_comment.go index bf36881a00bec..34541dc3cdf1c 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -99,7 +99,7 @@ const ( // 28 merge pull request CommentTypeMergePull // 29 push to PR head branch - CommentTypePullPush + CommentTypePullRequestPush // 30 Project changed CommentTypeProject // 31 Project board changed @@ -725,7 +725,7 @@ func (c *Comment) CodeCommentURL() string { // LoadPushCommits Load push commits func (c *Comment) LoadPushCommits(ctx context.Context) (err error) { - if c.Content == "" || c.Commits != nil || c.Type != CommentTypePullPush { + if c.Content == "" || c.Commits != nil || c.Type != CommentTypePullRequestPush { return nil } @@ -1325,7 +1325,7 @@ func CreatePushPullComment(ctx context.Context, pusher *user_model.User, pr *Pul } ops := &CreateCommentOptions{ - Type: CommentTypePullPush, + Type: CommentTypePullRequestPush, Doer: pusher, Repo: pr.BaseRepo, } diff --git a/models/user/setting.go b/models/user/setting.go index 5ff18f8265400..fbb6fbab30337 100644 --- a/models/user/setting.go +++ b/models/user/setting.go @@ -31,8 +31,8 @@ func init() { db.RegisterModel(new(Setting)) } -// GetSettings returns specific settings from user -func GetSettings(uid int64, keys []string) (map[string]*Setting, error) { +// GetUserSettings returns specific settings from user +func GetUserSettings(uid int64, keys []string) (map[string]*Setting, error) { settings := make([]*Setting, 0, len(keys)) if err := db.GetEngine(db.DefaultContext). Where("user_id=?", uid). @@ -62,21 +62,53 @@ func GetUserAllSettings(uid int64) (map[string]*Setting, error) { return settingsMap, nil } -// DeleteSetting deletes a specific setting for a user -func DeleteSetting(setting *Setting) error { - _, err := db.GetEngine(db.DefaultContext).Delete(setting) +func validateUserSettingKey(key string) error { + if len(key) == 0 { + return fmt.Errorf("setting key must be set") + } + if strings.ToLower(key) != key { + return fmt.Errorf("setting key should be lowercase") + } + return nil +} + +// GetUserSetting gets a specific setting for a user +func GetUserSetting(userID int64, key string, def ...string) (string, error) { + if err := validateUserSettingKey(key); err != nil { + return "", err + } + setting := &Setting{UserID: userID, SettingKey: key} + has, err := db.GetEngine(db.DefaultContext).Get(setting) + if err != nil { + return "", err + } + if !has { + if len(def) == 1 { + return def[0], nil + } + return "", nil + } + return setting.SettingValue, nil +} + +// DeleteUserSetting deletes a specific setting for a user +func DeleteUserSetting(userID int64, key string) error { + if err := validateUserSettingKey(key); err != nil { + return err + } + _, err := db.GetEngine(db.DefaultContext).Delete(&Setting{UserID: userID, SettingKey: key}) return err } -// SetSetting updates a users' setting for a specific key -func SetSetting(setting *Setting) error { - if strings.ToLower(setting.SettingKey) != setting.SettingKey { - return fmt.Errorf("setting key should be lowercase") +// SetUserSetting updates a users' setting for a specific key +func SetUserSetting(userID int64, key, value string) error { + if err := validateUserSettingKey(key); err != nil { + return err } - return upsertSettingValue(setting.UserID, setting.SettingKey, setting.SettingValue) + return upsertUserSettingValue(userID, key, value) } -func upsertSettingValue(userID int64, key, value string) error { +func upsertUserSettingValue(userID int64, key, value string) error { return db.WithTx(func(ctx context.Context) error { e := db.GetEngine(ctx) diff --git a/models/user/setting_keys.go b/models/user/setting_keys.go new file mode 100644 index 0000000000000..458b78e357f0c --- /dev/null +++ b/models/user/setting_keys.go @@ -0,0 +1,10 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package user + +const ( + // SettingsKeyHiddenCommentTypes is the settings key for hidden comment types + SettingsKeyHiddenCommentTypes = "issue.hidden_comment_types" +) diff --git a/models/user/setting_test.go b/models/user/setting_test.go index 81445a9f6f782..0b42e0fe2a1d9 100644 --- a/models/user/setting_test.go +++ b/models/user/setting_test.go @@ -19,21 +19,29 @@ func TestSettings(t *testing.T) { newSetting := &Setting{UserID: 99, SettingKey: keyName, SettingValue: "Gitea User Setting Test"} // create setting - err := SetSetting(newSetting) + err := SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue) assert.NoError(t, err) // test about saving unchanged values - err = SetSetting(newSetting) + err = SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue) assert.NoError(t, err) // get specific setting - settings, err := GetSettings(99, []string{keyName}) + settings, err := GetUserSettings(99, []string{keyName}) assert.NoError(t, err) assert.Len(t, settings, 1) assert.EqualValues(t, newSetting.SettingValue, settings[keyName].SettingValue) + settingValue, err := GetUserSetting(99, keyName) + assert.NoError(t, err) + assert.EqualValues(t, newSetting.SettingValue, settingValue) + + settingValue, err = GetUserSetting(99, "no_such") + assert.NoError(t, err) + assert.EqualValues(t, "", settingValue) + // updated setting updatedSetting := &Setting{UserID: 99, SettingKey: keyName, SettingValue: "Updated"} - err = SetSetting(updatedSetting) + err = SetUserSetting(updatedSetting.UserID, updatedSetting.SettingKey, updatedSetting.SettingValue) assert.NoError(t, err) // get all settings @@ -43,7 +51,7 @@ func TestSettings(t *testing.T) { assert.EqualValues(t, updatedSetting.SettingValue, settings[updatedSetting.SettingKey].SettingValue) // delete setting - err = DeleteSetting(&Setting{UserID: 99, SettingKey: keyName}) + err = DeleteUserSetting(99, keyName) assert.NoError(t, err) settings, err = GetUserAllSettings(99) assert.NoError(t, err) diff --git a/modules/context/form.go b/modules/context/form.go index 8d185909737c7..4f48d746b95c8 100644 --- a/modules/context/form.go +++ b/modules/context/form.go @@ -46,9 +46,11 @@ func (ctx *Context) FormInt64(key string) int64 { return v } -// FormBool returns true if the value for the provided key in the form is "1" or "true" +// FormBool returns true if the value for the provided key in the form is "1", "true" or "on" func (ctx *Context) FormBool(key string) bool { - v, _ := strconv.ParseBool(ctx.Req.FormValue(key)) + s := ctx.Req.FormValue(key) + v, _ := strconv.ParseBool(s) + v = v || strings.EqualFold(s, "on") return v } @@ -59,6 +61,8 @@ func (ctx *Context) FormOptionalBool(key string) util.OptionalBool { if len(value) == 0 { return util.OptionalBoolNone } - v, _ := strconv.ParseBool(ctx.Req.FormValue(key)) + s := ctx.Req.FormValue(key) + v, _ := strconv.ParseBool(s) + v = v || strings.EqualFold(s, "on") return util.OptionalBoolOf(v) } diff --git a/modules/notification/mail/mail.go b/modules/notification/mail/mail.go index 94ee16ff8c158..21709d9454c47 100644 --- a/modules/notification/mail/mail.go +++ b/modules/notification/mail/mail.go @@ -42,7 +42,7 @@ func (m *mailNotifier) NotifyCreateIssueComment(doer *user_model.User, repo *rep act = models.ActionCommentIssue } else if comment.Type == models.CommentTypeCode { act = models.ActionCommentIssue - } else if comment.Type == models.CommentTypePullPush { + } else if comment.Type == models.CommentTypePullRequestPush { act = 0 } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index d8398f6d9fc5b..301bd4f66e31b 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -549,6 +549,22 @@ continue = Continue cancel = Cancel language = Language ui = Theme +hidden_comment_types = Hidden comment types +comment_type_group_reference = Reference +comment_type_group_label = Label +comment_type_group_milestone = Milestone +comment_type_group_assignee = Assignee +comment_type_group_title = Title +comment_type_group_branch = Branch +comment_type_group_time_tracking = Time Tracking +comment_type_group_deadline = Deadline +comment_type_group_dependency = Dependency +comment_type_group_lock = Lock Status +comment_type_group_review_request = Review request +comment_type_group_pull_request_push = Added commits +comment_type_group_project = Project +comment_type_group_issue_ref = Issue reference +saved_successfully = Your settings were saved successfully. privacy = Privacy keep_activity_private = Hide the activity from the profile page keep_activity_private_popup = Makes the activity visible only for you and the admins diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index aff5fa8498554..4f2716763acd3 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -10,6 +10,7 @@ import ( "errors" "fmt" "io" + "math/big" "net/http" "net/url" "path" @@ -1465,7 +1466,7 @@ func ViewIssue(ctx *context.Context) { ctx.ServerError("LoadResolveDoer", err) return } - } else if comment.Type == models.CommentTypePullPush { + } else if comment.Type == models.CommentTypePullRequestPush { participants = addParticipant(comment.Poster, participants) if err = comment.LoadPushCommits(ctx); err != nil { ctx.ServerError("LoadPushCommits", err) @@ -1650,6 +1651,20 @@ func ViewIssue(ctx *context.Context) { ctx.Data["IsRepoAdmin"] = ctx.IsSigned && (ctx.Repo.IsAdmin() || ctx.User.IsAdmin) ctx.Data["LockReasons"] = setting.Repository.Issue.LockReasons ctx.Data["RefEndName"] = git.RefEndName(issue.Ref) + + var hiddenCommentTypes *big.Int + if ctx.IsSigned { + val, err := user_model.GetUserSetting(ctx.User.ID, user_model.SettingsKeyHiddenCommentTypes) + if err != nil { + ctx.ServerError("GetUserSetting", err) + return + } + hiddenCommentTypes, _ = new(big.Int).SetString(val, 10) // we can safely ignore the failed conversion here + } + ctx.Data["ShouldShowCommentType"] = func(commentType models.CommentType) bool { + return hiddenCommentTypes == nil || hiddenCommentTypes.Bit(int(commentType)) == 0 + } + ctx.HTML(http.StatusOK, tplIssueView) } diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 3a61f2f92a616..e77e02348c6e1 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "io" + "math/big" "net/http" "os" "path/filepath" @@ -358,6 +359,18 @@ func Appearance(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsAppearance"] = true + var hiddenCommentTypes *big.Int + val, err := user_model.GetUserSetting(ctx.User.ID, user_model.SettingsKeyHiddenCommentTypes) + if err != nil { + ctx.ServerError("GetUserSetting", err) + return + } + hiddenCommentTypes, _ = new(big.Int).SetString(val, 10) // we can safely ignore the failed conversion here + + ctx.Data["IsCommentTypeGroupChecked"] = func(commentTypeGroup string) bool { + return forms.IsUserHiddenCommentTypeGroupChecked(commentTypeGroup, hiddenCommentTypes) + } + ctx.HTML(http.StatusOK, tplSettingsAppearance) } @@ -416,3 +429,16 @@ func UpdateUserLang(ctx *context.Context) { ctx.Flash.Success(i18n.Tr(ctx.User.Language, "settings.update_language_success")) ctx.Redirect(setting.AppSubURL + "/user/settings/appearance") } + +// UpdateUserHiddenComments update a user's shown comment types +func UpdateUserHiddenComments(ctx *context.Context) { + err := user_model.SetUserSetting(ctx.User.ID, user_model.SettingsKeyHiddenCommentTypes, forms.UserHiddenCommentTypesFromRequest(ctx).String()) + if err != nil { + ctx.ServerError("SetUserSetting", err) + return + } + + log.Trace("User settings updated: %s", ctx.User.Name) + ctx.Flash.Success(ctx.Tr("settings.saved_successfully")) + ctx.Redirect(setting.AppSubURL + "/user/settings/appearance") +} diff --git a/routers/web/web.go b/routers/web/web.go index 698f91b8cafa8..6415788e446ba 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -323,6 +323,7 @@ func RegisterRoutes(m *web.Route) { m.Group("/appearance", func() { m.Get("", user_setting.Appearance) m.Post("/language", bindIgnErr(forms.UpdateLanguageForm{}), user_setting.UpdateUserLang) + m.Post("/hidden_comments", user_setting.UpdateUserHiddenComments) m.Post("/theme", bindIgnErr(forms.UpdateThemeForm{}), user_setting.UpdateUIThemePost) }) m.Group("/security", func() { diff --git a/services/forms/user_form_hidden_comments.go b/services/forms/user_form_hidden_comments.go new file mode 100644 index 0000000000000..e0c26e8ddf880 --- /dev/null +++ b/services/forms/user_form_hidden_comments.go @@ -0,0 +1,105 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package forms + +import ( + "math/big" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" +) + +type hiddenCommentTypeGroupsType map[string][]models.CommentType + +// hiddenCommentTypeGroups maps the group names to comment types, these group names comes from the Web UI (appearance.tmpl) +var hiddenCommentTypeGroups = hiddenCommentTypeGroupsType{ + "reference": { + /*3*/ models.CommentTypeIssueRef, + /*4*/ models.CommentTypeCommitRef, + /*5*/ models.CommentTypeCommentRef, + /*6*/ models.CommentTypePullRef, + }, + "label": { + /*7*/ models.CommentTypeLabel, + }, + "milestone": { + /*8*/ models.CommentTypeMilestone, + }, + "assignee": { + /*9*/ models.CommentTypeAssignees, + }, + "title": { + /*10*/ models.CommentTypeChangeTitle, + }, + "branch": { + /*11*/ models.CommentTypeDeleteBranch, + /*25*/ models.CommentTypeChangeTargetBranch, + }, + "time_tracking": { + /*12*/ models.CommentTypeStartTracking, + /*13*/ models.CommentTypeStopTracking, + /*14*/ models.CommentTypeAddTimeManual, + /*15*/ models.CommentTypeCancelTracking, + /*26*/ models.CommentTypeDeleteTimeManual, + }, + "deadline": { + /*16*/ models.CommentTypeAddedDeadline, + /*17*/ models.CommentTypeModifiedDeadline, + /*18*/ models.CommentTypeRemovedDeadline, + }, + "dependency": { + /*19*/ models.CommentTypeAddDependency, + /*20*/ models.CommentTypeRemoveDependency, + }, + "lock": { + /*23*/ models.CommentTypeLock, + /*24*/ models.CommentTypeUnlock, + }, + "review_request": { + /*27*/ models.CommentTypeReviewRequest, + }, + "pull_request_push": { + /*29*/ models.CommentTypePullRequestPush, + }, + "project": { + /*30*/ models.CommentTypeProject, + /*31*/ models.CommentTypeProjectBoard, + }, + "issue_ref": { + /*33*/ models.CommentTypeChangeIssueRef, + }, +} + +// UserHiddenCommentTypesFromRequest parse the form to hidden comment types bitset +func UserHiddenCommentTypesFromRequest(ctx *context.Context) *big.Int { + bitset := new(big.Int) + for group, commentTypes := range hiddenCommentTypeGroups { + if ctx.FormBool(group) { + for _, commentType := range commentTypes { + bitset = bitset.SetBit(bitset, int(commentType), 1) + } + } + } + return bitset +} + +// IsUserHiddenCommentTypeGroupChecked check whether a hidden comment type group is "enabled" (checked on UI) +func IsUserHiddenCommentTypeGroupChecked(group string, hiddenCommentTypes *big.Int) (ret bool) { + commentTypes, ok := hiddenCommentTypeGroups[group] + if !ok { + log.Critical("the group map for hidden comment types is out of sync, unknown group: %v", group) + return + } + if hiddenCommentTypes == nil { + return false + } + for _, commentType := range commentTypes { + if hiddenCommentTypes.Bit(int(commentType)) == 1 { + return true + } + } + return false +} diff --git a/services/mailer/mail.go b/services/mailer/mail.go index 5244cd043301e..e5aa2500837b6 100644 --- a/services/mailer/mail.go +++ b/services/mailer/mail.go @@ -449,7 +449,7 @@ func actionToTemplate(issue *models.Issue, actionType models.ActionType, name = "code" case models.CommentTypeAssignees: name = "assigned" - case models.CommentTypePullPush: + case models.CommentTypePullRequestPush: name = "push" default: name = "default" diff --git a/services/mailer/mail_comment.go b/services/mailer/mail_comment.go index a42458b2c2c82..baecd2a101664 100644 --- a/services/mailer/mail_comment.go +++ b/services/mailer/mail_comment.go @@ -21,7 +21,7 @@ func MailParticipantsComment(ctx context.Context, c *models.Comment, opType mode } content := c.Content - if c.Type == models.CommentTypePullPush { + if c.Type == models.CommentTypePullRequestPush { content = "" } if err := mailIssueCommentToParticipants( diff --git a/services/pull/pull.go b/services/pull/pull.go index 4f691c0eba0eb..10fbc124ac671 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -108,7 +108,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, pull *mode } ops := &models.CreateCommentOptions{ - Type: models.CommentTypePullPush, + Type: models.CommentTypePullRequestPush, Doer: pull.Poster, Repo: repo, Issue: pr.Issue, diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 73057248c7e20..e7c161a3f3ba5 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -1,835 +1,837 @@ {{ template "base/alert" }} {{range .Issue.Comments}} - {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} + {{if call $.ShouldShowCommentType .Type}} + {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} - - {{if eq .Type 0}} -
- {{if .OriginalAuthor }} - - {{else}} - - {{avatar .Poster}} - - {{end}} -
-
-
- {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} - - - {{$.i18n.Tr "repo.issues.commented_at" (.Issue.HashTag|Escape) $createdStr | Safe}} {{if $.Repository.OriginalURL}} - - - ({{$.i18n.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe }}){{end}} - - {{else}} - - - {{.Poster.GetDisplayName}} - - {{$.i18n.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdStr | Safe}} - - {{end}} -
-
- {{if (.ShowRole.HasRole "Poster")}} -
- {{$.i18n.Tr "repo.issues.poster"}} -
- {{end}} - {{if (.ShowRole.HasRole "Writer")}} -
- {{$.i18n.Tr "repo.issues.collaborator"}} -
- {{end}} - {{if (.ShowRole.HasRole "Owner")}} -
- {{$.i18n.Tr "repo.issues.owner"}} -
- {{end}} - {{if not $.Repository.IsArchived}} - {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} - {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} - {{end}} + + {{if eq .Type 0}} +
+ {{if .OriginalAuthor }} + + {{else}} + + {{avatar .Poster}} + + {{end}} +
+
+
+ {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + + {{$.i18n.Tr "repo.issues.commented_at" (.Issue.HashTag|Escape) $createdStr | Safe}} {{if $.Repository.OriginalURL}} + + + ({{$.i18n.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe }}){{end}} + + {{else}} + + + {{.Poster.GetDisplayName}} + + {{$.i18n.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdStr | Safe}} + + {{end}} +
+
+ {{if (.ShowRole.HasRole "Poster")}} +
+ {{$.i18n.Tr "repo.issues.poster"}} +
+ {{end}} + {{if (.ShowRole.HasRole "Writer")}} +
+ {{$.i18n.Tr "repo.issues.collaborator"}} +
+ {{end}} + {{if (.ShowRole.HasRole "Owner")}} +
+ {{$.i18n.Tr "repo.issues.owner"}} +
+ {{end}} + {{if not $.Repository.IsArchived}} + {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} + {{end}} +
-
-
-
- {{if .RenderedContent}} - {{.RenderedContent|Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.no_content"}} +
+
+ {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.i18n.Tr "repo.issues.no_content"}} + {{end}} +
+
{{.Content}}
+
+ {{if .Attachments}} + {{template "repo/issue/view_content/attachments" Dict "ctx" $ "Attachments" .Attachments "Content" .RenderedContent}} {{end}}
-
{{.Content}}
-
- {{if .Attachments}} - {{template "repo/issue/view_content/attachments" Dict "ctx" $ "Attachments" .Attachments "Content" .RenderedContent}} + {{$reactions := .Reactions.GroupByType}} + {{if $reactions}} +
+ {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} +
{{end}}
- {{$reactions := .Reactions.GroupByType}} - {{if $reactions}} -
- {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} -
- {{end}}
-
- {{else if eq .Type 1}} -
- {{svg "octicon-dot-fill"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if .Issue.IsPull }} - {{$.i18n.Tr "repo.pulls.reopened_at" .EventTag $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.reopened_at" .EventTag $createdStr | Safe}} - {{end}} - -
- {{else if eq .Type 2}} -
- {{svg "octicon-circle-slash"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if .Issue.IsPull }} - {{$.i18n.Tr "repo.pulls.closed_at" .EventTag $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.closed_at" .EventTag $createdStr | Safe}} - {{end}} - -
- {{else if eq .Type 28}} -
- {{svg "octicon-git-merge"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$link := printf "%s/commit/%s" $.Repository.HTMLURL ($.Issue.PullRequest.MergedCommitID|PathEscape)}} - {{if eq $.Issue.PullRequest.Status 3}} - {{$.i18n.Tr "repo.issues.manually_pull_merged_at" ($link|Escape) (ShortSha $.Issue.PullRequest.MergedCommitID) ($.BaseTarget|Escape) $createdStr | Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.pull_merged_at" ($link|Escape) (ShortSha $.Issue.PullRequest.MergedCommitID) ($.BaseTarget|Escape) $createdStr | Str2html}} - {{end}} - -
- {{else if eq .Type 3 5 6}} - {{ $refFrom:= "" }} - {{if ne .RefRepoID .Issue.RepoID}} - {{ $refFrom = $.i18n.Tr "repo.issues.ref_from" (.RefRepo.FullName|Escape) }} - {{end}} - {{ $refTr := "repo.issues.ref_issue_from" }} - {{if .Issue.IsPull}} - {{ $refTr = "repo.issues.ref_pull_from" }} - {{else if eq .RefAction 1 }} - {{ $refTr = "repo.issues.ref_closing_from" }} - {{else if eq .RefAction 2 }} - {{ $refTr = "repo.issues.ref_reopening_from" }} - {{end}} - {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} -
- {{svg "octicon-bookmark"}} - - {{avatar .Poster}} - - {{if eq .RefAction 3}}{{end}} - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr $refTr (.EventTag|Escape) $createdStr (.RefCommentHTMLURL|Escape) $refFrom | Safe}} - - {{if eq .RefAction 3}}{{end}} - -
- {{.RefIssueTitle}} {{.RefIssueIdent}} + {{else if eq .Type 1}} +
+ {{svg "octicon-dot-fill"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if .Issue.IsPull }} + {{$.i18n.Tr "repo.pulls.reopened_at" .EventTag $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.reopened_at" .EventTag $createdStr | Safe}} + {{end}} +
-
- {{else if eq .Type 4}} -
- {{svg "octicon-bookmark"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.commit_ref_at" .EventTag $createdStr | Safe}} - -
- {{svg "octicon-git-commit"}} - {{.Content | Str2html}} + {{else if eq .Type 2}} +
+ {{svg "octicon-circle-slash"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if .Issue.IsPull }} + {{$.i18n.Tr "repo.pulls.closed_at" .EventTag $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.closed_at" .EventTag $createdStr | Safe}} + {{end}} +
-
- {{else if eq .Type 7}} - {{if or .AddedLabels .RemovedLabels}} + {{else if eq .Type 28}}
- {{svg "octicon-tag"}} + {{svg "octicon-git-merge"}} {{avatar .Poster}} {{.Poster.GetDisplayName}} - {{if and .AddedLabels (not .RemovedLabels)}} - {{$.i18n.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels .AddedLabels) $createdStr | Safe}} - {{else if and (not .AddedLabels) .RemovedLabels}} - {{$.i18n.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels .RemovedLabels) $createdStr | Safe}} + {{$link := printf "%s/commit/%s" $.Repository.HTMLURL ($.Issue.PullRequest.MergedCommitID|PathEscape)}} + {{if eq $.Issue.PullRequest.Status 3}} + {{$.i18n.Tr "repo.issues.manually_pull_merged_at" ($link|Escape) (ShortSha $.Issue.PullRequest.MergedCommitID) ($.BaseTarget|Escape) $createdStr | Str2html}} {{else}} - {{$.i18n.Tr "repo.issues.add_remove_labels" (RenderLabels .AddedLabels) (RenderLabels .RemovedLabels) $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.pull_merged_at" ($link|Escape) (ShortSha $.Issue.PullRequest.MergedCommitID) ($.BaseTarget|Escape) $createdStr | Str2html}} {{end}}
- {{end}} - {{else if eq .Type 8}} -
- {{svg "octicon-milestone"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if gt .OldMilestoneID 0}}{{if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.change_milestone_at" (.OldMilestone.Name|Escape) (.Milestone.Name|Escape) $createdStr | Safe}}{{else}}{{$.i18n.Tr "repo.issues.remove_milestone_at" (.OldMilestone.Name|Escape) $createdStr | Safe}}{{end}}{{else if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.add_milestone_at" (.Milestone.Name|Escape) $createdStr | Safe}}{{end}} - -
- {{else if eq .Type 9}} -
- {{svg "octicon-person"}} - {{if gt .AssigneeID 0}} - {{if .RemovedAssignee}} - - {{avatar .Assignee}} - - - {{.Assignee.GetDisplayName}} - {{ if eq .Poster.ID .Assignee.ID }} - {{$.i18n.Tr "repo.issues.remove_self_assignment" $createdStr | Safe}} - {{ else }} - {{$.i18n.Tr "repo.issues.remove_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} - {{ end }} - - {{else}} - - {{avatar .Assignee}} + {{else if eq .Type 3 5 6}} + {{ $refFrom:= "" }} + {{if ne .RefRepoID .Issue.RepoID}} + {{ $refFrom = $.i18n.Tr "repo.issues.ref_from" (.RefRepo.FullName|Escape) }} + {{end}} + {{ $refTr := "repo.issues.ref_issue_from" }} + {{if .Issue.IsPull}} + {{ $refTr = "repo.issues.ref_pull_from" }} + {{else if eq .RefAction 1 }} + {{ $refTr = "repo.issues.ref_closing_from" }} + {{else if eq .RefAction 2 }} + {{ $refTr = "repo.issues.ref_reopening_from" }} + {{end}} + {{ $createdStr:= TimeSinceUnix .CreatedUnix $.Lang }} +
+ {{svg "octicon-bookmark"}} + + {{avatar .Poster}} + + {{if eq .RefAction 3}}{{end}} + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr $refTr (.EventTag|Escape) $createdStr (.RefCommentHTMLURL|Escape) $refFrom | Safe}} + + {{if eq .RefAction 3}}{{end}} + + +
+ {{else if eq .Type 4}} +
+ {{svg "octicon-bookmark"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.commit_ref_at" .EventTag $createdStr | Safe}} + +
+ {{svg "octicon-git-commit"}} + {{.Content | Str2html}} +
+
+ {{else if eq .Type 7}} + {{if or .AddedLabels .RemovedLabels}} +
+ {{svg "octicon-tag"}} + + {{avatar .Poster}} - {{.Assignee.GetDisplayName}} - {{if eq .Poster.ID .AssigneeID}} - {{$.i18n.Tr "repo.issues.self_assign_at" $createdStr | Safe}} + {{.Poster.GetDisplayName}} + {{if and .AddedLabels (not .RemovedLabels)}} + {{$.i18n.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels .AddedLabels) $createdStr | Safe}} + {{else if and (not .AddedLabels) .RemovedLabels}} + {{$.i18n.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels .RemovedLabels) $createdStr | Safe}} {{else}} - {{$.i18n.Tr "repo.issues.add_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.add_remove_labels" (RenderLabels .AddedLabels) (RenderLabels .RemovedLabels) $createdStr | Safe}} {{end}} - {{end}} +
{{end}} -
- {{else if eq .Type 10}} -
- {{svg "octicon-pencil"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji) (.NewTitle|RenderEmoji) $createdStr | Safe}} - -
- {{else if eq .Type 11}} -
- {{svg "octicon-git-branch"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.delete_branch_at" (.OldRef|Escape) $createdStr | Safe}} - -
- {{else if eq .Type 12}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.start_tracking_history" $createdStr | Safe}} - -
- {{else if eq .Type 13}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.stop_tracking_history" $createdStr | Safe}} - - {{ template "repo/issue/view_content/comments_delete_time" Dict "ctx" $ "comment" . }} -
- {{svg "octicon-clock"}} - {{.Content}} -
-
- {{else if eq .Type 14}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.add_time_history" $createdStr | Safe}} - - {{ template "repo/issue/view_content/comments_delete_time" Dict "ctx" $ "comment" . }} -
- {{svg "octicon-clock"}} - {{.Content}} + {{else if eq .Type 8}} +
+ {{svg "octicon-milestone"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if gt .OldMilestoneID 0}}{{if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.change_milestone_at" (.OldMilestone.Name|Escape) (.Milestone.Name|Escape) $createdStr | Safe}}{{else}}{{$.i18n.Tr "repo.issues.remove_milestone_at" (.OldMilestone.Name|Escape) $createdStr | Safe}}{{end}}{{else if gt .MilestoneID 0}}{{$.i18n.Tr "repo.issues.add_milestone_at" (.Milestone.Name|Escape) $createdStr | Safe}}{{end}} +
-
- {{else if eq .Type 15}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.cancel_tracking_history" $createdStr | Safe}} - -
- {{else if eq .Type 16}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.due_date_added" .Content $createdStr | Safe}} - -
- {{else if eq .Type 17}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.due_date_modified" (.Content | ParseDeadline) $createdStr | Safe}} - -
- {{else if eq .Type 18}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.due_date_remove" .Content $createdStr | Safe}} - -
- {{else if eq .Type 19}} -
- {{svg "octicon-package-dependents"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.dependency.added_dependency" $createdStr | Safe}} - - {{if .DependentIssue}} -
- {{svg "octicon-plus"}} - - - {{if eq .DependentIssue.RepoID .Issue.RepoID}} - #{{.DependentIssue.Index}} {{.DependentIssue.Title}} + {{else if eq .Type 9}} +
+ {{svg "octicon-person"}} + {{if gt .AssigneeID 0}} + {{if .RemovedAssignee}} + + {{avatar .Assignee}} + + + {{.Assignee.GetDisplayName}} + {{ if eq .Poster.ID .Assignee.ID }} + {{$.i18n.Tr "repo.issues.remove_self_assignment" $createdStr | Safe}} + {{ else }} + {{$.i18n.Tr "repo.issues.remove_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} + {{ end }} + + {{else}} + + {{avatar .Assignee}} + + + {{.Assignee.GetDisplayName}} + {{if eq .Poster.ID .AssigneeID}} + {{$.i18n.Tr "repo.issues.self_assign_at" $createdStr | Safe}} {{else}} - {{.DependentIssue.Repo.FullName}}#{{.DependentIssue.Index}} - {{.DependentIssue.Title}} + {{$.i18n.Tr "repo.issues.add_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} {{end}} - - + + {{end}} + {{end}} +
+ {{else if eq .Type 10}} +
+ {{svg "octicon-pencil"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji) (.NewTitle|RenderEmoji) $createdStr | Safe}} + +
+ {{else if eq .Type 11}} +
+ {{svg "octicon-git-branch"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.delete_branch_at" (.OldRef|Escape) $createdStr | Safe}} + +
+ {{else if eq .Type 12}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.start_tracking_history" $createdStr | Safe}} + +
+ {{else if eq .Type 13}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.stop_tracking_history" $createdStr | Safe}} + + {{ template "repo/issue/view_content/comments_delete_time" Dict "ctx" $ "comment" . }} +
+ {{svg "octicon-clock"}} + {{.Content}}
- {{end}} -
- {{else if eq .Type 20}} -
- {{svg "octicon-package-dependents"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.dependency.removed_dependency" $createdStr | Safe}} - - {{if .DependentIssue}} +
+ {{else if eq .Type 14}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.add_time_history" $createdStr | Safe}} + + {{ template "repo/issue/view_content/comments_delete_time" Dict "ctx" $ "comment" . }} - {{end}} -
- {{else if eq .Type 22}} -
-
- {{if .OriginalAuthor }} - {{else}} - +
+ {{else if eq .Type 15}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.cancel_tracking_history" $createdStr | Safe}} + +
+ {{else if eq .Type 16}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.due_date_added" .Content $createdStr | Safe}} + +
+ {{else if eq .Type 17}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.due_date_modified" (.Content | ParseDeadline) $createdStr | Safe}} + +
+ {{else if eq .Type 18}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.due_date_remove" .Content $createdStr | Safe}} + +
+ {{else if eq .Type 19}} +
+ {{svg "octicon-package-dependents"}} + {{avatar .Poster}} + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.dependency.added_dependency" $createdStr | Safe}} + + {{if .DependentIssue}} + {{end}} - {{svg (printf "octicon-%s" .Review.Type.Icon)}} +
+ {{else if eq .Type 20}} +
+ {{svg "octicon-package-dependents"}} + + {{avatar .Poster}} + - {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.dependency.removed_dependency" $createdStr | Safe}} + + {{if .DependentIssue}} +
+ {{svg "octicon-trash"}} + + + {{if eq .DependentIssue.RepoID .Issue.RepoID}} + #{{.DependentIssue.Index}} {{.DependentIssue.Title}} + {{else}} + {{.DependentIssue.Repo.FullName}}#{{.DependentIssue.Index}} - {{.DependentIssue.Title}} + {{end}} + - {{if $.Repository.OriginalURL}} - ({{$.i18n.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe }}){{end}} +
+ {{end}} +
+ {{else if eq .Type 22}} +
+
+ {{if .OriginalAuthor }} {{else}} - {{.Poster.GetDisplayName}} + + {{avatar .Poster}} + {{end}} + {{svg (printf "octicon-%s" .Review.Type.Icon)}} + + {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + {{if $.Repository.OriginalURL}} + ({{$.i18n.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe }}){{end}} + {{else}} + {{.Poster.GetDisplayName}} + {{end}} - {{if eq .Review.Type 1}} - {{$.i18n.Tr "repo.issues.review.approve" $createdStr | Safe}} - {{else if eq .Review.Type 2}} - {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} - {{else if eq .Review.Type 3}} - {{$.i18n.Tr "repo.issues.review.reject" $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} - {{end}} - {{if .Review.Dismissed}} -
{{$.i18n.Tr "repo.issues.review.dismissed_label"}}
- {{end}} -
-
- {{if .Content}} -
-
-
-
- - {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} - - {{if $.Repository.OriginalURL}} - ({{$.i18n.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe }}){{end}} - {{else}} - {{.Poster.GetDisplayName}} - {{end}} + {{if eq .Review.Type 1}} + {{$.i18n.Tr "repo.issues.review.approve" $createdStr | Safe}} + {{else if eq .Review.Type 2}} + {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} + {{else if eq .Review.Type 3}} + {{$.i18n.Tr "repo.issues.review.reject" $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} + {{end}} + {{if .Review.Dismissed}} +
{{$.i18n.Tr "repo.issues.review.dismissed_label"}}
+ {{end}} +
+
+ {{if .Content}} +
+
+
+
+ + {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + {{if $.Repository.OriginalURL}} + ({{$.i18n.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe }}){{end}} + {{else}} + {{.Poster.GetDisplayName}} + {{end}} - {{$.i18n.Tr "repo.issues.review.left_comment" | Safe}} - + {{$.i18n.Tr "repo.issues.review.left_comment" | Safe}} + +
+
+ {{if (.ShowRole.HasRole "Poster")}} +
+ {{$.i18n.Tr "repo.issues.poster"}} +
+ {{end}} + {{if (.ShowRole.HasRole "Writer")}} +
+ {{$.i18n.Tr "repo.issues.collaborator"}} +
+ {{end}} + {{if (.ShowRole.HasRole "Owner")}} +
+ {{$.i18n.Tr "repo.issues.owner"}} +
+ {{end}} + {{if not $.Repository.IsArchived}} + {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} + {{end}} +
-
- {{if (.ShowRole.HasRole "Poster")}} -
- {{$.i18n.Tr "repo.issues.poster"}} -
- {{end}} - {{if (.ShowRole.HasRole "Writer")}} -
- {{$.i18n.Tr "repo.issues.collaborator"}} -
- {{end}} - {{if (.ShowRole.HasRole "Owner")}} -
- {{$.i18n.Tr "repo.issues.owner"}} -
- {{end}} - {{if not $.Repository.IsArchived}} - {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} - {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} +
+
+ {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.i18n.Tr "repo.issues.no_content"}} {{end}} -
-
-
-
- {{if .RenderedContent}} - {{.RenderedContent|Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.no_content"}} +
+
{{.Content}}
+
+ {{if .Attachments}} + {{template "repo/issue/view_content/attachments" Dict "ctx" $ "Attachments" .Attachments "Content" .RenderedContent}} {{end}}
-
{{.Content}}
-
- {{if .Attachments}} - {{template "repo/issue/view_content/attachments" Dict "ctx" $ "Attachments" .Attachments "Content" .RenderedContent}} + {{$reactions := .Reactions.GroupByType}} + {{if $reactions}} +
+ {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} +
{{end}}
- {{$reactions := .Reactions.GroupByType}} - {{if $reactions}} -
- {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} -
- {{end}}
-
- {{end}} + {{end}} - {{if .Review.CodeComments}} -
- {{ range $filename, $lines := .Review.CodeComments}} - {{range $line, $comms := $lines}} -
-
- {{$invalid := (index $comms 0).Invalidated}} - {{$resolved := (index $comms 0).IsResolved}} - {{$resolveDoer := (index $comms 0).ResolveDoer}} - {{$isNotPending := (not (eq (index $comms 0).Review.Type 0))}} -
- {{$filename}} - {{if $invalid }} - - {{$.i18n.Tr "repo.issues.review.outdated"}} - - {{end}} -
-
- {{if or $invalid $resolved}} - - - {{end}} + {{if .Review.CodeComments}} +
+ {{ range $filename, $lines := .Review.CodeComments}} + {{range $line, $comms := $lines}} +
+
+ {{$invalid := (index $comms 0).Invalidated}} + {{$resolved := (index $comms 0).IsResolved}} + {{$resolveDoer := (index $comms 0).ResolveDoer}} + {{$isNotPending := (not (eq (index $comms 0).Review.Type 0))}} +
+ {{$filename}} + {{if $invalid }} + + {{$.i18n.Tr "repo.issues.review.outdated"}} + + {{end}} +
+
+ {{if or $invalid $resolved}} + + + {{end}} +
-
- {{$diff := (CommentMustAsDiff (index $comms 0))}} - {{if $diff}} - {{$file := (index $diff.Files 0)}} -
-
-
- - - {{template "repo/diff/section_unified" dict "file" $file "root" $}} - -
+ {{$diff := (CommentMustAsDiff (index $comms 0))}} + {{if $diff}} + {{$file := (index $diff.Files 0)}} +
+
+
+ + + {{template "repo/diff/section_unified" dict "file" $file "root" $}} + +
+
-
- {{end}} -
-
- {{range $comms}} - {{ $createdSubStr:= TimeSinceUnix .CreatedUnix $.Lang }} -
-
-
-
- {{if not .OriginalAuthor }} - - {{avatar .Poster}} - - {{end}} - - {{if .OriginalAuthor }} - - {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} - {{ .OriginalAuthor }} - - {{if $.Repository.OriginalURL}} - ({{$.i18n.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe }}){{end}} - {{else}} - {{.Poster.GetDisplayName}} + {{end}} +
+
+ {{range $comms}} + {{ $createdSubStr:= TimeSinceUnix .CreatedUnix $.Lang }} +
+
+
+
+ {{if not .OriginalAuthor }} + + {{avatar .Poster}} + + {{end}} + + {{if .OriginalAuthor }} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{ .OriginalAuthor }} + + {{if $.Repository.OriginalURL}} + ({{$.i18n.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe }}){{end}} + {{else}} + {{.Poster.GetDisplayName}} + {{end}} + {{$.i18n.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdSubStr | Safe}} + +
+
+ {{if (.ShowRole.HasRole "Poster")}} +
+ {{$.i18n.Tr "repo.issues.poster"}} +
{{end}} - {{$.i18n.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdSubStr | Safe}} - + {{if (.ShowRole.HasRole "Writer")}} +
+ {{$.i18n.Tr "repo.issues.collaborator"}} +
+ {{end}} + {{if (.ShowRole.HasRole "Owner")}} +
+ {{$.i18n.Tr "repo.issues.owner"}} +
+ {{end}} + {{if not $.Repository.IsArchived}} + {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} + {{end}} +
-
- {{if (.ShowRole.HasRole "Poster")}} -
- {{$.i18n.Tr "repo.issues.poster"}} -
- {{end}} - {{if (.ShowRole.HasRole "Writer")}} -
- {{$.i18n.Tr "repo.issues.collaborator"}} -
- {{end}} - {{if (.ShowRole.HasRole "Owner")}} -
- {{$.i18n.Tr "repo.issues.owner"}} -
- {{end}} - {{if not $.Repository.IsArchived}} - {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} - {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} +
+
+ {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.i18n.Tr "repo.issues.no_content"}} {{end}} +
+
{{.Content}}
+
-
-
-
- {{if .RenderedContent}} - {{.RenderedContent|Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.no_content"}} + {{$reactions := .Reactions.GroupByType}} + {{if $reactions}} +
+ {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} +
{{end}} -
-
{{.Content}}
-
- {{$reactions := .Reactions.GroupByType}} - {{if $reactions}} -
- {{template "repo/issue/view_content/reactions" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} -
- {{end}} -
-
- {{end}} -
-
-
- {{if $resolved}} -
- {{svg "octicon-check" 16 "mr-2"}} - {{$resolveDoer.Name}} {{$.i18n.Tr "repo.issues.review.resolved_by"}}
{{end}}
-
- {{if and $.CanMarkConversation $isNotPending}} - - {{end}} - {{if and $.SignedUserID (not $.Repository.IsArchived)}} - - {{end}} +
+
+ {{if $resolved}} +
+ {{svg "octicon-check" 16 "mr-2"}} + {{$resolveDoer.Name}} {{$.i18n.Tr "repo.issues.review.resolved_by"}} +
+ {{end}} +
+
+ {{if and $.CanMarkConversation $isNotPending}} + + {{end}} + {{if and $.SignedUserID (not $.Repository.IsArchived)}} + + {{end}} +
+ {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" (index $comms 0).ReviewID "root" $ "comment" (index $comms 0)}}
- {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" (index $comms 0).ReviewID "root" $ "comment" (index $comms 0)}}
-
+ {{end}} {{end}} +
{{end}}
- {{end}} -
- {{else if eq .Type 23}} -
- {{svg "octicon-lock"}} - - {{avatar .Poster}} - - {{ if .Content }} + {{else if eq .Type 23}} +
+ {{svg "octicon-lock"}} + + {{avatar .Poster}} + + {{ if .Content }} + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.lock_with_reason" .Content $createdStr | Safe}} + + {{ else }} + + {{.Poster.GetDisplayName}} + {{$.i18n.Tr "repo.issues.lock_no_reason" $createdStr | Safe}} + + {{ end }} +
+ {{else if eq .Type 24}} +
+ {{svg "octicon-key"}} + + {{avatar .Poster}} + {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.lock_with_reason" .Content $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.unlock_comment" $createdStr | Safe}} + +
+ {{else if eq .Type 25}} +
+ {{svg "octicon-git-branch"}} + + {{avatar .Poster}} + + + {{.Poster.Name}} + {{$.i18n.Tr "repo.pulls.change_target_branch_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}} - {{ else }} +
+ {{else if eq .Type 26}} +
+ {{svg "octicon-clock"}} + + {{avatar .Poster}} + {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.lock_no_reason" $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.del_time_history" $createdStr | Safe}} - {{ end }} -
- {{else if eq .Type 24}} -
- {{svg "octicon-key"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.unlock_comment" $createdStr | Safe}} - -
- {{else if eq .Type 25}} -
- {{svg "octicon-git-branch"}} - - {{avatar .Poster}} - - - {{.Poster.Name}} - {{$.i18n.Tr "repo.pulls.change_target_branch_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}} - -
- {{else if eq .Type 26}} -
- {{svg "octicon-clock"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{$.i18n.Tr "repo.issues.del_time_history" $createdStr | Safe}} - -
- {{svg "octicon-clock"}} - {{.Content}} +
+ {{svg "octicon-clock"}} + {{.Content}} +
-
- {{else if eq .Type 27}} -
- {{svg "octicon-eye"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if (gt .AssigneeID 0)}} - {{if .RemovedAssignee}} - {{if eq .PosterID .AssigneeID}} - {{$.i18n.Tr "repo.issues.review.remove_review_request_self" $createdStr | Safe}} + {{else if eq .Type 27}} +
+ {{svg "octicon-eye"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if (gt .AssigneeID 0)}} + {{if .RemovedAssignee}} + {{if eq .PosterID .AssigneeID}} + {{$.i18n.Tr "repo.issues.review.remove_review_request_self" $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.review.remove_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} + {{end}} {{else}} - {{$.i18n.Tr "repo.issues.review.remove_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} + {{$.i18n.Tr "repo.issues.review.add_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} {{end}} {{else}} - {{$.i18n.Tr "repo.issues.review.add_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} - {{end}} - {{else}} - {{if .RemovedAssignee}} - {{$.i18n.Tr "repo.issues.review.remove_review_request" (.AssigneeTeam.Name|Escape) $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.review.add_review_request" (.AssigneeTeam.Name|Escape) $createdStr | Safe}} + {{if .RemovedAssignee}} + {{$.i18n.Tr "repo.issues.review.remove_review_request" (.AssigneeTeam.Name|Escape) $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.review.add_review_request" (.AssigneeTeam.Name|Escape) $createdStr | Safe}} + {{end}} {{end}} - {{end}} - -
- {{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush)}} -
- {{svg "octicon-repo-push"}} - - {{.Poster.GetDisplayName}} - {{ if .IsForcePush }} - {{$.i18n.Tr "repo.issues.force_push_codes" ($.Issue.PullRequest.HeadBranch|Escape) (ShortSha .OldCommit) (($.Issue.Repo.CommitLink .OldCommit)|Escape) (ShortSha .NewCommit) (($.Issue.Repo.CommitLink .NewCommit)|Escape) $createdStr | Safe}} - {{else}} - {{$.i18n.TrN (len .Commits) "repo.issues.push_commit_1" "repo.issues.push_commits_n" (len .Commits) $createdStr | Safe}} - {{end}} - -
- {{if not .IsForcePush}} - {{template "repo/commits_list_small" dict "comment" . "root" $}} - {{end}} - {{else if eq .Type 30}} - {{if not $.UnitProjectsGlobalDisabled}} -
- {{svg "octicon-project"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if gt .OldProjectID 0}} - {{if gt .ProjectID 0}} - {{$.i18n.Tr "repo.issues.change_project_at" (.OldProject.Title|Escape) (.Project.Title|Escape) $createdStr | Safe}} + +
+ {{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush)}} +
+ {{svg "octicon-repo-push"}} + + {{.Poster.GetDisplayName}} + {{ if .IsForcePush }} + {{$.i18n.Tr "repo.issues.force_push_codes" ($.Issue.PullRequest.HeadBranch|Escape) (ShortSha .OldCommit) (($.Issue.Repo.CommitLink .OldCommit)|Escape) (ShortSha .NewCommit) (($.Issue.Repo.CommitLink .NewCommit)|Escape) $createdStr | Safe}} {{else}} - {{$.i18n.Tr "repo.issues.remove_project_at" (.OldProject.Title|Escape) $createdStr | Safe}} + {{$.i18n.TrN (len .Commits) "repo.issues.push_commit_1" "repo.issues.push_commits_n" (len .Commits) $createdStr | Safe}} {{end}} - {{else if gt .ProjectID 0}} - {{$.i18n.Tr "repo.issues.add_project_at" (.Project.Title|Escape) $createdStr | Safe}} - {{end}} - -
- {{end}} - {{else if eq .Type 32}} -
+ +
+ {{if not .IsForcePush}} + {{template "repo/commits_list_small" dict "comment" . "root" $}} + {{end}} + {{else if eq .Type 30}} + {{if not $.UnitProjectsGlobalDisabled}}
- - + {{svg "octicon-project"}} + + {{avatar .Poster}} - {{svg "octicon-x" 16}} - {{.Poster.GetDisplayName}} - {{$reviewerName := ""}} - {{if eq .Review.OriginalAuthor ""}} - {{$reviewerName = .Review.Reviewer.Name}} - {{else}} - {{$reviewerName = .Review.OriginalAuthor}} + {{.Poster.GetDisplayName}} + {{if gt .OldProjectID 0}} + {{if gt .ProjectID 0}} + {{$.i18n.Tr "repo.issues.change_project_at" (.OldProject.Title|Escape) (.Project.Title|Escape) $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.remove_project_at" (.OldProject.Title|Escape) $createdStr | Safe}} + {{end}} + {{else if gt .ProjectID 0}} + {{$.i18n.Tr "repo.issues.add_project_at" (.Project.Title|Escape) $createdStr | Safe}} {{end}} - {{$.i18n.Tr "repo.issues.review.dismissed" $reviewerName $createdStr | Safe}}
- {{if .Content}} -
-
-
- - {{$.i18n.Tr "action.review_dismissed_reason"}} - -
-
-
- {{if .RenderedContent}} - {{.RenderedContent|Str2html}} - {{else}} - {{$.i18n.Tr "repo.issues.no_content"}} - {{end}} + {{end}} + {{else if eq .Type 32}} +
+
+ + + + {{svg "octicon-x" 16}} + + {{.Poster.GetDisplayName}} + {{$reviewerName := ""}} + {{if eq .Review.OriginalAuthor ""}} + {{$reviewerName = .Review.Reviewer.Name}} + {{else}} + {{$reviewerName = .Review.OriginalAuthor}} + {{end}} + {{$.i18n.Tr "repo.issues.review.dismissed" $reviewerName $createdStr | Safe}} + +
+ {{if .Content}} +
+
+
+ + {{$.i18n.Tr "action.review_dismissed_reason"}} + +
+
+
+ {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.i18n.Tr "repo.issues.no_content"}} + {{end}} +
-
- {{end}} -
- {{else if eq .Type 33}} -
- {{svg "octicon-git-branch"}} - - {{avatar .Poster}} - - - {{.Poster.GetDisplayName}} - {{if and .OldRef .NewRef}} - {{$.i18n.Tr "repo.issues.change_ref_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}} - {{else if .OldRef}} - {{$.i18n.Tr "repo.issues.remove_ref_at" (.OldRef|Escape) $createdStr | Safe}} - {{else}} - {{$.i18n.Tr "repo.issues.add_ref_at" (.NewRef|Escape) $createdStr | Safe}} {{end}} - -
+
+ {{else if eq .Type 33}} +
+ {{svg "octicon-git-branch"}} + + {{avatar .Poster}} + + + {{.Poster.GetDisplayName}} + {{if and .OldRef .NewRef}} + {{$.i18n.Tr "repo.issues.change_ref_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}} + {{else if .OldRef}} + {{$.i18n.Tr "repo.issues.remove_ref_at" (.OldRef|Escape) $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.add_ref_at" (.NewRef|Escape) $createdStr | Safe}} + {{end}} + +
+ {{end}} {{end}} {{end}} diff --git a/templates/user/settings/appearance.tmpl b/templates/user/settings/appearance.tmpl index 777b89c750ece..fe4a668dd5251 100644 --- a/templates/user/settings/appearance.tmpl +++ b/templates/user/settings/appearance.tmpl @@ -68,6 +68,104 @@
+ + +

+ {{.i18n.Tr "settings.hidden_comment_types"}} +

+
+
+ {{.CsrfTokenHtml}} +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
From f91092453ed0269420ab5161b4742a692dd500fe Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sat, 22 Jan 2022 00:28:20 +0000 Subject: [PATCH 5/5] [skip ci] Updated translations via Crowdin --- options/locale/locale_sr-SP.ini | 731 -------------------------------- options/locale/locale_uk-UA.ini | 147 +++---- 2 files changed, 74 insertions(+), 804 deletions(-) delete mode 100644 options/locale/locale_sr-SP.ini diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini deleted file mode 100644 index 402f994d591c6..0000000000000 --- a/options/locale/locale_sr-SP.ini +++ /dev/null @@ -1,731 +0,0 @@ -home=Почетна -dashboard=Контролни панел -explore=Преглед -help=Помоћ -sign_in=Пријавите Се -sign_out=Одјава -register=Регистрација -website=Веб-страница -version=Верзија -page=Страница -template=Шаблон -language=Језик -signed_in_as=Пријављени сте као - -username=Корисничко име -password=Лозинка - - -repository=Спремиште -organization=Организација -mirror=Огледало -new_repo=Ново спремиште -new_migrate=Нова миграција -new_mirror=Ново огледало -new_org=Нова организација -manage_org=Управљање организацијама -account_settings=Подешавања налога -settings=Подешавања - - -activities=Активности -pull_requests=Захтеви за спајање -issues=Дискусије - -cancel=Откажи - - - - - - -[error] - -[startpage] - -[install] -install=Инсталација -db_title=Подешавања базе -db_type=Тип базе података -host=Хост -password=Лозинка -db_name=Име базе података -path=Пут - -repo_path=Пут до корена спремишта -log_root_path=Пут до журнала - -optional_title=Напредна подешавања -smtp_host=SMTP сервер -federated_avatar_lookup_popup=Омогућите federated avatars lookup да би сте користили федеративни сервис помоћу libravatar. -enable_captcha_popup=Тражи Captcha приликом регистрације корисника. -admin_password=Лозинка -confirm_password=Потврдите лозинку -install_btn_confirm=Успостави Gitea -test_git_failed=Команда 'git' није успела: %v - -[home] -password_holder=Лозинка -switch_dashboard_context=Пребаците контекст контролној панели -collaborative_repos=Заједничка спремишта -my_orgs=Моје организације -my_mirrors=Моја огледала -view_home=Прикажи %s - - - -issues.in_your_repos=У вашим спремиштима - -[explore] -repos=Спремишта -users=Корисници -search=Претрага - -[auth] -register_helper_msg=Већ имате налог? Пријавите се! -active_your_account=Активирајте ваш налог -has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (%s). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме. -resend_mail=Кликните овде да поново пошаљете писмо - -[mail] - -activate_account=Молимо вас активирајте ваш налог - -activate_email=Потврдите вашу адресу е-поште - - - - - - - - - -[modal] -yes=Да -no=Не - -[form] -UserName=Корисничко име -RepoName=Име спремишта -Email=Адреса ел. поште -Password=Лозинка -SSHTitle=Име SSH кључа -HttpsUrl=HTTPS URL адреса -PayloadUrl=URL адреса за слање -TeamName=Име тима -AuthName=Ауторизацијско име -AdminEmail=Адреса е-поште администратора - -NewBranchName=Име нове гране -CommitSummary=Опис за ревизију -CommitMessage=Ревизни текст -CommitChoice=Избор ревизије -TreeName=Пут до датотеке -Content=Садржај - - -require_error=` не може бити празно.` -size_error=` мора бити величине %s.` -min_size_error=` мора да садржи најмање %s карактера.` -max_size_error=` мора да садржи највише %s карактера.` -email_error=` није важећа адреса е-поште.` -url_error=` није исправна URL адреса.` -include_error=` мора да садржи текст '%s'.` -unknown_error=Непозната грешка: - - -auth_failed=Грешка идентитета: %v - - -target_branch_not_exist=Ова грана не постоји. - -[user] -join_on=Регистриран -repositories=Спремишта -activity=Активности -followers=Пратиоци -following=Пратим -follow=Прати -unfollow=Престани да пратиш - - -[settings] -profile=Профил -password=Лозинка -avatar=Аватар -social=Налози на друштвеним мрежама -delete=Уклоните налог - -public_profile=Јавни профил -full_name=Име и презиме -website=Веб страница -location=Локација -update_profile=Ажурирај профил -continue=Настави -cancel=Откажи - -federated_avatar_lookup=Federated Avatar претрага -enable_custom_avatar=Укључи ваш аватар -choose_new_avatar=Изаберите нови аватар -delete_current_avatar=Обришите тренутни аватар - -old_password=Тренутна лозинка -new_password=Нова лозинка - -emails=Адреса ел. поште -email_desc=Ваша главна адреса ће се користити за обавештења и других операција. -primary=Главно - -manage_ssh_keys=Управљање SSH кључева -add_key=Додај кључ -add_new_key=Додај SSH кључ -key_name=Име кључа -key_content=Садржај -add_on=Додато -last_used=Задње корршћено -no_activity=Нема недавних активности -manage_social=Управљање прикључених друштвеним мрежама - -generate_new_token=Генериши нови токен -token_name=Име токена -generate_token=Генериши токен -delete_token=Уклони - - - - - - - -delete_account=Уклоните ваш налог -confirm_delete_account=Потврдите брисање - - - -[repo] -owner=Власник -repo_name=Име спремишта -visibility=Видљивост -fork_repo=Креирај огранак спремишта -fork_from=Огранак од -repo_desc=Опис -repo_lang=Језик -license=Лиценца -create_repo=Ново спремиште -default_branch=Главна грана -mirror_prune=Очисти -watchers=Посматрачи -stargazers=Пратиоци -forks=Огранци - - - - - - -migrate_repo=Мигрирајте спремиште -migrate.permission_denied=Немате права на увезете локално спремиште. -migrate.failed=Миграција није успела: %v - -mirror_from=огледало од -forked_from=изданак од -unwatch=Престани пратити -watch=Прати -unstar=Улкони звезду -star=Волим -fork=Креирај огранак - -no_desc=Нема описа -quick_guide=Кратак водич -clone_this_repo=Клонирај спремиште - -code=Код -branch=Грана -tree=Дрво -filter_branch_and_tag=Профилтрирај по грани или ознаци -branches=Гране -tags=Ознаке -issues=Дискусије -pulls=Захтеви за спајање -labels=Лабеле - -milestones=Фазе -commits=Комити -releases=Издања -file_raw=Датотека -file_history=Историја -file_view_raw=Прегледај саму датотеку -file_permalink=Пермалинк - - -editor.preview_changes=Преглед промена -editor.or=или -editor.commit_changes=Изврши комит промена -editor.add=Додај '%s' -editor.update=Ажурирај '%s' -editor.delete=Уклони '%s' -editor.commit_directly_to_this_branch=Изврши комит директно на %s грану. -editor.create_new_branch=Креирај нову грану за овај комит и поднеси захтев за спајање. -editor.cancel=Откажи -editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште. -editor.no_changes_to_show=Нема никаквих промена. -editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v -editor.upload_files_to_dir=Пошаљи датотеке на '%s' - -commits.commits=Комити -commits.author=Аутор -commits.message=Порука -commits.date=Датум -commits.older=Старије -commits.newer=Новије - - - -issues.new=Нови задатак -issues.new.labels=Лавеле -issues.new.no_label=Нема лабеле -issues.new.clear_labels=Уклони лабеле -issues.new.milestone=Фаза -issues.new.no_milestone=Нема фазе -issues.new.clear_milestone=Уклони фазу -issues.new.open_milestone=Отворене фазе -issues.new.closed_milestone=Затворене фазе -issues.create=Додај задатак -issues.new_label=Нова лабела -issues.create_label=Креирај лабелу -issues.label_templates.title=Преузмите унапред дефинисани скуп лабела -issues.label_templates.helper=Изаберите скуп лабела -issues.label_templates.fail_to_load_file=Није могуће преузети датотеку '%s': %v -issues.open_tab=%d отворено -issues.close_tab=%d затворено -issues.filter_label=Лабела -issues.filter_milestone=Фаза -issues.filter_assignee=Одговорни -issues.filter_type=Тип -issues.filter_type.all_issues=Сви задаци -issues.filter_type.assigned_to_you=Заказано вама -issues.filter_type.created_by_you=креирано од вас -issues.filter_type.mentioning_you=Помењује вас -issues.filter_sort=Сортирај -issues.filter_sort.latest=Најновије -issues.filter_sort.oldest=Најстарије -issues.filter_sort.recentupdate=Недавно ажурирано -issues.filter_sort.leastupdate=Давно ажуриано -issues.filter_sort.mostcomment=Највише коментара -issues.filter_sort.leastcomment=Најмање коментара -issues.opened_by=отворено %[1]s од %[3]s -issues.previous=Претходна -issues.next=Следеће -issues.open_title=Отворено -issues.closed_title=Затворено -issues.num_comments=%d коментара -issues.commented_at=`коментирира %s` -issues.delete_comment_confirm=Да ли желите да избришете овај коментар? -issues.no_content=Још нема садржаја. -issues.close_issue=Затвори -issues.reopen_issue=Поново отвори -issues.create_comment=Коментирај -issues.commit_ref_at=`поменуо овај задатак у комит %[2]s` -issues.poster=Аутор -issues.collaborator=Коаутор -issues.owner=Власник -issues.sign_in_require_desc=Пријавите се да се прикључе у овом разговору. -issues.edit=Уреди -issues.cancel=Откажи -issues.save=Сачувај -issues.label_title=Име лабеле -issues.label_color=Боја лабеле -issues.label_count=%d лабела -issues.label_open_issues=%d отворених задатака -issues.label_edit=Уреди -issues.label_delete=Уклони -issues.num_participants=%d учесника -issues.attachment.open_tab=`Кликните "%s" да видите у новом прозору` -issues.attachment.download=`Кликните да преузмете "%s"` - - -pulls.new=Нови захтев за спајање -pulls.filter_branch=Филтер по грани -pulls.no_results=Нема резултата. -pulls.create=Поднеси захтев за спајање -pulls.merged_title_desc=споји(ла) %[1]d комит(е) из %[2]s у %[3]s %[4]s -pulls.tab_conversation=Дискусија -pulls.tab_commits=Комити -pulls.merged=Спојено -pulls.can_auto_merge_desc=Овај захтев за спајање може бити обављен аутоматски. - -; %[2]s
%[3]s
- - -milestones.new=Нова фаза -milestones.open_tab=%d отворено -milestones.close_tab=%d затворено -milestones.closed=Затворено %s -milestones.no_due_date=Рок није наведен -milestones.open=Отвори -milestones.close=Затвори -milestones.create=Креирај фазу -milestones.title=Наслов -milestones.desc=Опис -milestones.due_date=Датум завршетка (опционо) -milestones.clear=Уклони -milestones.edit=Ажурирај фазу -milestones.cancel=Откажи - - - -wiki=Вики -wiki.page=Страница -wiki.filter_page=Филтер странице -wiki.save_page=Сачувај страницу -wiki.last_commit_info=%s урећивао ову страницу %s -wiki.edit_page_button=Уреди -wiki.new_page_button=Нова страница -wiki.delete_page_button=Уклони страницу -wiki.page_already_exists=Страница са овим именом већ постоји. -wiki.pages=Странице -wiki.last_updated=Последње ажурирано %s - - - -settings=Подешавања -settings.collaboration.write=За писање -settings.collaboration.read=Читање -settings.collaboration.undefined=Није дефинисано -settings.githooks=Git хуки -settings.basic_settings=Основна подешавања -settings.mirror_settings=Подешавања огледала -settings.update_settings=Примени промене -settings.advanced_settings=Напредна подешавања -settings.external_wiki_url=URL адреса спољног Вики -settings.tracker_url_format=Спољни формат везе система за праћење грешака -settings.tracker_issue_style.numeric=Нумерично -settings.tracker_issue_style.alphanumeric=Алфанумерично -settings.danger_zone=Опасна зона -settings.new_owner_has_same_repo=Нови власник већ има спремиште по истим називом. Молимо вас изаберите друго име. -settings.transfer=Пренеси власништво -settings.transfer_owner=Нови власник -settings.delete=Уклони ово спремиште -settings.delete_notices_1=- Ова операција НЕЋЕ МОЧИ бити укинута. -settings.add_webhook=Додај Webhook -settings.webhook.test_delivery=Провери испоруку -settings.webhook.request=Захтев -settings.webhook.response=Одговор -settings.webhook.headers=Наслови -settings.webhook.body=Тело -settings.githook_edit_desc=Aко Webhook није активан, примерни садржај ће бити представљен. Ако оставите празно, Webhook ће бити онемогућен. -settings.githook_name=Име Hook-а -settings.githook_content=Садржај Hook-а -settings.update_githook=Ажурирај Hook -settings.secret=Тајна -settings.slack_username=Корисничко име -settings.slack_icon_url=URL адреса иконице -settings.event_create=Креирај -settings.event_pull_request=Захтев за спајање -settings.update_webhook=Ажурирај Webhook -settings.recent_deliveries=Недавне испоруке -settings.hook_type=Тип Hook-а -settings.slack_token=Токен -settings.slack_domain=Домен -settings.slack_channel=Канал -settings.deploy_keys=Кључеви за распоређивање -settings.add_deploy_key=Додај кључ за распоређивање -settings.title=Наслов -settings.deploy_key_content=Садржај - -diff.browse_source=Преглед изворни кода -diff.parent=родитељ -diff.commit=комит -diff.show_split_view=Подељен поглед -diff.show_unified_view=Један поглед -diff.stats_desc= %d измењених фајлова са %d додато и %d уклоњено -diff.view_file=Прегледај датотеку -diff.file_suppressed=Разлика између датотеке није приказан због своје велике величине - -release.releases=Издања -release.new_release=Ново издање -release.draft=Нацрт -release.prerelease=Пред-верзија -release.stable=Стабилно -release.edit=уреди -release.source_code=Изворни код -release.tag_name=Име ознаке -release.target=Циљ -release.title=Наслов -release.content=Садржај -release.cancel=Откажи -release.publish=Објави издање -release.save_draft=Сачувај нацрт -release.downloads=Преузимања - - - - - -[org] -org_name_holder=Име организације -org_full_name_holder=Пун назив организације -create_org=Створи Организацију -repo_updated=Ажурирано -people=Особе -teams=Тимови -lower_members=чланови -lower_repositories=спремишта -org_desc=Опис -team_name=Име тима -team_desc=Опис - - -settings=Подешавања -settings.full_name=Пуно име -settings.website=Саит -settings.location=Локација - -settings.update_settings=Ажурирај подешавања -settings.delete=Уклони организацију -settings.delete_account=Уклони ову организацију -settings.confirm_delete_account=Потврди брисање - - -members.membership_visibility=Видљивост: -members.member_role=Улога учесника: -members.owner=Власник -members.member=Члан -members.remove=Уклони -members.leave=Изађи -members.invite_desc=Додја новог члана %s: -members.invite_now=Позовите сада - -teams.join=Придружи се -teams.leave=Изаћи -teams.no_desc=Овај тим нема описа -teams.settings=Подешавања -teams.members=Чланови тима -teams.update_settings=Примени промене -teams.add_team_member=Додај члан тиму -teams.repositories=Тимска спремишта -teams.add_nonexistent_repo=Овакво спремиште не постоји, молим вас прво да га направите. - -[admin] -dashboard=Контролни панел -organizations=Организације -repositories=Спремишта -config=Подешавања -notices=Системска обавештења -monitor=Праћење -first_page=Први -last_page=Последњи -total=Укупно: %d - -dashboard.operation_name=Име операције -dashboard.operation_switch=Пребаци -dashboard.operation_run=Покрени -dashboard.server_uptime=Време непрекидног рада сервера -dashboard.current_goroutine=Тренутнe Goroutine -dashboard.current_memory_usage=Тренутна употреба меморије -dashboard.total_memory_allocated=Укупно меморије алоцирано -dashboard.memory_obtained=Коришћена меморија -dashboard.pointer_lookup_times=Захтева показивача -dashboard.current_heap_usage=Тренутна употреба динамичке меморије -dashboard.heap_memory_obtained=Слободно динамичке меморије -dashboard.heap_memory_idle=Неактиво динамичке меморије -dashboard.heap_memory_in_use=Динамичка меморија у употреби -dashboard.heap_memory_released=Ослобођено динамичке меморије -dashboard.heap_objects=Објекти динамичке меморије -dashboard.bootstrap_stack_usage=Коришћење стек меморије -dashboard.stack_memory_obtained=Слободно стек меморије -dashboard.mspan_structures_usage=Употреба структуре MSpan -dashboard.mspan_structures_obtained=Добијено структуре MSpan -dashboard.mcache_structures_usage=Употреба структурa MCache -dashboard.mcache_structures_obtained=Добијено структурa MCache -dashboard.profiling_bucket_hash_table_obtained=Хеш-таблеа постигнуто за Profiling Bucket -dashboard.gc_metadata_obtained=Добијених метаподатака cакупљању смећа -dashboard.other_system_allocation_obtained=Добијено друга системска меморија -dashboard.next_gc_recycle=Следећа рециклажа cакупљању смећа -dashboard.last_gc_time=Времена од прошлог cакупљању смећа -dashboard.total_gc_time=Укупно време cакупљању смећа -dashboard.total_gc_pause=Укупно време cакупљању смећа -dashboard.last_gc_pause=Задња пауза у cакупљању смећа -dashboard.gc_times=Времена cакупљању смећа - -users.activated=Активиран -users.admin=Администратор -users.repos=Спремишта -users.created=Креирано -users.edit=Уреди -users.auth_source=Извор аутентикације -users.local=Локално - - -orgs.name=Име -orgs.teams=Тимови -orgs.members=Чланови - -repos.owner=Власник -repos.name=Име -repos.private=Приватно -repos.stars=Фаворити -repos.issues=Задаци - - - -auths.name=Име -auths.type=Тип -auths.enabled=Омогућено -auths.updated=Ажурирано -auths.auth_type=Врста провере аутентичности -auths.auth_name=Име провере аутентичности -auths.security_protocol=Протокол безбедности -auths.domain=Домен -auths.host=Хост -auths.port=Порт -auths.bind_password=Bind лозинкa -auths.user_base=База претраживање корисника -auths.user_dn=DN корисника -auths.filter=Филтер корисника -auths.admin_filter=Филтер администратора -auths.smtp_auth=Тип SMTP аутентикације -auths.smtphost=SMTP хост -auths.smtpport=SMTP порт -auths.allowed_domains=Дозвољени домени -auths.skip_tls_verify=Прескочи TLS проверу -auths.pam_service_name=Назив PAM сервиса -auths.enable_auto_register=Омогући аутоматску регистрацију -auths.tips=Савети - -config.server_config=Конфигурација сервера -config.disable_router_log=Онемогући журнал рутера -config.run_mode=Режим извршавања -config.repo_root_path=Пут до корена спремишта -config.static_file_root_path=Пут до статичке датотеке -config.script_type=Врста скрипта -config.reverse_auth_user=Корисничко име при обрнуту аутентикацију - -config.ssh_config=SSH конфигурација -config.ssh_enabled=Омогућено -config.ssh_port=Порт -config.ssh_listen_port=Порт за слушање -config.ssh_root_path=Основни пут -config.ssh_key_test_path=Пут до кључу -config.ssh_keygen_path=Пут до генератор кључева ('ssh-keygen') -config.ssh_minimum_key_size_check=Минимална величина провера кључа -config.ssh_minimum_key_sizes=Минимална величина кључева - - -config.db_config=Конфигурација базе података -config.db_type=Тип -config.db_host=Хост -config.db_name=Име -config.db_path=Пут - -config.service_config=Подешавања сервиса -config.show_registration_button=Прикажи дугме за регистрацију -config.disable_key_size_check=Онемогући проверу на минималној величини кључа -config.active_code_lives=Дужина живота активних кодова - -config.webhook_config=Подешавања Webhook -config.queue_length=Дужина реда -config.deliver_timeout=Време до отказивање слања - -config.mailer_enabled=Омогућено -config.mailer_disable_helo=Онемогући HELO -config.mailer_name=Име -config.mailer_host=Хост -config.mailer_user=Корисник - -config.oauth_config=Подешавања OAuth -config.oauth_enabled=Укључено - -config.cache_config=Подешавања кеша -config.cache_adapter=Кеш адаптер -config.cache_interval=Кеш интервал -config.cache_conn=Кеш на вези - -config.session_config=Подешавања сесије -config.session_provider=Добављач сесија -config.provider_config=Конфигурација на добављачу -config.cookie_name=Име датотеке cookie -config.gc_interval_time=Интервал cакупљања смећа -config.session_life_time=Дужина живота сесјие -config.https_only=Само HTTPS -config.cookie_life_time=Дужина живота датотеке cookie - -config.picture_service=Услуга за слике -config.disable_gravatar=Онемогући Gravatar -config.enable_federated_avatar=Омогући Federated Avatars - -config.git_config=Git конфигурација -config.git_disable_diff_highlight=Онемогући бојење синтаксе када гледате разлике -config.git_max_diff_lines=Максималан број различитих редова (у датотеци) -config.git_max_diff_line_characters=Максималан број различитих карактера (у реду) -config.git_max_diff_files=Максималан број измењених датотека (приказаних) -config.git_gc_args=Аргументи на cакупљање смећа -config.git_migrate_timeout=Време до отказања миграције -config.git_mirror_timeout=Време до отазање синхронизацији огледала -config.git_clone_timeout=Време до отказивања клонирањем -config.git_pull_timeout=Време до отказивања pull операцији -config.git_gc_timeout=Време до отказивања cакупљање смећа - -config.log_config=Kонфигурација журнала -config.log_mode=Режим журналовања - -monitor.cron=Cron задаци -monitor.name=Име -monitor.schedule=Распоред -monitor.next=Следећи пут -monitor.previous=Претходни пут -monitor.process=Покренути процеси -monitor.desc=Опис -monitor.start=Почетно време -monitor.execute_time=Време извршивања - - - -notices.system_notice_list=Системска обавештавања -notices.actions=Акције -notices.select_all=Изабери све -notices.deselect_all=Уклоните избор свих -notices.inverse_selection=Обрна селекција -notices.delete_selected=Избриши изабране -notices.delete_all=Уклони сва обавештења -notices.type=Тип -notices.type_1=Спремиште -notices.desc=Опис -notices.op=Oп. - -[action] -create_repo=креира спремиште %s -rename_repo=преимензје спремиште од %[1]s на %[3]s -transfer_repo=преноси спремиште %s на %s - -[tool] -ago=пре %s -from_now=од сада %s -now=сада -1s=1 секунд -1m=1 минут -1h=1 час -1d=1 дан -1w=1 недеља -1mon=1 месец -1y=1 година -seconds=%d секунди -minutes=%d минута -hours=%d часа -days=%d дана -weeks=%d недеља -months=%d месеци -years=%d година -raw_seconds=секунди -raw_minutes=минута - -[dropzone] -remove_file=Уклони датотеку - -[notification] - -[gpg] - -[units] - diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 25eb059ca4dfa..891517d57f438 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -61,7 +61,7 @@ forks=Форки activities=Дії pull_requests=Запити на злиття -issues=Проблеми +issues=Задачі milestones=Етапи ok=OK @@ -346,7 +346,7 @@ reset_password.text=Перейдіть за цим посиланням, щоб register_success=Реєстрація успішна issue_assigned.pull=@%[1]s призначив вам запит злиття %[2]s в репозиторії %[3]s. -issue_assigned.issue=@%[1]s призначив вам завдання %[2]s у репозиторії %[3]s. +issue_assigned.issue=@%[1]s призначив вам задачу %[2]s у репозиторії %[3]s. issue.x_mentioned_you=@%s згадав вас: issue.action.force_push=%[1]s force-pushed %[2]s з %[3]s в %[4]s. @@ -774,8 +774,8 @@ repo_desc_helper=Введіть короткий опис (опціональн repo_lang=Мова repo_gitignore_helper=Виберіть шаблон .gitignore. repo_gitignore_helper_desc=Оберіть з списку мовних шаблонів файли, які не будуть відстежуватись. Типові артефакти, які генеруються за допомогою інструментів побудови кожної мови, за замовчуванням включені до .gitignor. -issue_labels=Мітки проблем -issue_labels_helper=Вибрати мітку для проблеми. +issue_labels=Мітки задачі +issue_labels_helper=Вибрати мітку для задачі. license=Ліцензія license_helper=Виберіть ліцензійний файл. license_helper_desc=Ліцензія регулює те, що інші можуть і не можуть робити з вашим кодом. Не впевнені, що саме підходить для вашого проекту? Дивіться Виберіть ліцензію. @@ -846,12 +846,12 @@ template.git_hooks=Перехоплювачі Git template.webhooks=Webhook'и template.topics=Теми template.avatar=Аватар -template.issue_labels=Мітки проблем +template.issue_labels=Мітки задачі template.one_item=Слід обрати хоча б один елемент шаблону template.invalid=Слід обрати шаблонний репозиторій -archive.title=Це архівний репозитарій. Ви можете переглядати і клонувати файли, але не можете робити пуш або відкривати питання/запити. -archive.issue.nocomment=Це архівний репозитарій. Ви не можете коментувати запити. +archive.title=Цей репозиторій архівовано. Ви можете переглядати файли та клонувати його, але не можете виконувати push чи відкривати задачі та запити злиття. +archive.issue.nocomment=Цей репозиторій архівовано. Ви не можете коментувати задачі. archive.pull.nocomment=Це архівний репозитарій. Ви не можете коментувати пулл-реквести. form.reach_limit_of_creation_1=Ви вже досягли ліміту в %d репозиторіїв. @@ -873,7 +873,7 @@ migrate_items=Деталі міграції migrate_items_wiki=Вікі migrate_items_milestones=Етапи migrate_items_labels=Мітки -migrate_items_issues=Проблеми +migrate_items_issues=Задачі migrate_items_pullrequests=Запити на злиття migrate_items_merge_requests=Запити на злиття migrate_items_releases=Релізи @@ -906,7 +906,7 @@ migrate.migrating_topics=Міграція тем migrate.migrating_milestones=Міграція етапів migrate.migrating_labels=Міграція міток migrate.migrating_releases=Міграція релізів -migrate.migrating_issues=Міграція проблем +migrate.migrating_issues=Міграція задач migrate.migrating_pulls=Міграція запитів на злиття mirror_from=дзеркало @@ -939,7 +939,7 @@ filter_branch_and_tag=Фільтрувати гілку або тег find_tag=Знайти тег branches=Гілки tags=Теги -issues=Проблеми +issues=Задачі pulls=Запити на злиття project_board=Проєкти labels=Мітки @@ -1053,10 +1053,11 @@ commits.signed_by_untrusted_user=Підписаний недовіреним к commits.signed_by_untrusted_user_unmatched=Підписаний недовіреним користувачем, який не відповідає комітеру commits.gpg_key_id=Ідентифікатор GPG ключа -ext_issues.desc=Посилання на зовнішню систему відстеження проблем. +ext_issues=Доступ до зовнішніх задач +ext_issues.desc=Посилання на зовнішню систему відстеження задач. projects=Проєкти -projects.desc=Керуйте проблемами та запитами злиття на дошках проєкту. +projects.desc=Керуйте задачами та запитами злиття на дошках проєкту. projects.description=Опис (необов'язково) projects.description_placeholder=Опис projects.create=Створити проєкт @@ -1065,10 +1066,10 @@ projects.new=Новий проєкт projects.new_subheader=Координуйте, відстежуйте та оновлюйте інформацію про виконувану роботу в одному місці, аби проєкти залишалися прозорими та за розкладом. projects.create_success=Проєкт '%s' створено. projects.deletion=Видалити проєкт -projects.deletion_desc=Видалення проєкту видаляє його з усіх пов'язаних проблем. Продовжити? +projects.deletion_desc=Видалення проєкту видаляє його з усіх пов'язаних задач. Продовжити? projects.deletion_success=Проєкт видалено. projects.edit=Редагувати проєкти -projects.edit_subheader=Проєкти призначені для організації проблем та відстеження поступу. +projects.edit_subheader=Проєкти організовують задачі та відстежують прогрес. projects.modify=Оновити проєкт projects.edit_success=Проєкт '%s' оновлено. projects.type.none=Відсутній @@ -1083,9 +1084,9 @@ projects.board.new_title=Назва нової дошки projects.board.new_submit=Створити projects.board.new=Нова дошка projects.board.set_default=Встановити за замовчуванням -projects.board.set_default_desc=Встановити цю дошку за замовчуванням для проблем без категорії та витягувань +projects.board.set_default_desc=Встановити цю дошку за замовчуванням для задач без категорії та витягувань projects.board.delete=Видалити дошку -projects.board.deletion_desc=Видалення дошки проєкту перенесе всі пов'язані проблеми в дошку 'Без категорії'. Продовжити? +projects.board.deletion_desc=Видалення дошки проєкту перенесе всі пов'язані задачі в дошку 'Без категорії'. Продовжити? projects.board.color=Колір projects.open=Відкрити projects.close=Закрити @@ -1096,7 +1097,7 @@ issues.filter_milestones=Фільтр етапів issues.filter_projects=Фільтр проєктів issues.filter_labels=Фільтр міток issues.filter_reviewers=Фільтр рецензентів -issues.new=Нова проблема +issues.new=Нова задача issues.new.title_empty=Заголовок не може бути пустим issues.new.labels=Мітки issues.new.add_labels_title=Застосувати мітки @@ -1125,7 +1126,7 @@ issues.choose.get_started=Початок роботи issues.choose.blank=Типово issues.choose.blank_about=Створити задачу із шаблону за замовчуванням. issues.no_ref=Не вказана гілка або тег -issues.create=Створити проблему +issues.create=Створити задачу issues.new_label=Нова мітка issues.new_label_placeholder=Назва мітки issues.new_label_desc_placeholder=Опис @@ -1167,7 +1168,7 @@ issues.filter_milestone_no_select=Всі етапи issues.filter_assignee=Виконавець issues.filter_assginee_no_select=Всі виконавці issues.filter_type=Тип -issues.filter_type.all_issues=Всі проблеми +issues.filter_type.all_issues=Всі задачі issues.filter_type.assigned_to_you=Призначене вам issues.filter_type.created_by_you=Створено вами issues.filter_type.mentioning_you=Вас згадано @@ -1203,7 +1204,7 @@ issues.commented_at=`прокоментував(ла) %s` issues.delete_comment_confirm=Ви впевнені, що хочете видалити цей коментар? issues.context.copy_link=Скопіювати посилання issues.context.quote_reply=Цитувати відповідь -issues.context.reference_issue=Посилання в новій проблемі +issues.context.reference_issue=Посилання в новій задачі issues.context.edit=Редагувати issues.context.delete=Видалити issues.no_content=Тут ще немає жодного змісту. @@ -1214,15 +1215,15 @@ issues.close_comment_issue=Прокоментувати і закрити issues.reopen_issue=Відкрити знову issues.reopen_comment_issue=Прокоментувати та відкрити знову issues.create_comment=Коментар -issues.closed_at=`закрив цю проблему %[2]s` -issues.reopened_at=`повторно відкрив цю проблему %[2]s` -issues.commit_ref_at=`згадано цю проблему в коміті %[2]s` -issues.ref_issue_from=`послався на цю проблему %[4]s %[2]s` +issues.closed_at=`закрив цю задачу %[2]s` +issues.reopened_at=`повторно відкрив цю задачу %[2]s` +issues.commit_ref_at=`згадано цю задачу в коміті %[2]s` +issues.ref_issue_from=`посилання на цю задачу %[4] %[2]s` issues.ref_pull_from=`послався на цей запит злиття %[4]s %[2]s` -issues.ref_closing_from=`послався на запит злиття %[4]s, який закриває цю проблему %[2]s` -issues.ref_reopening_from=`послався на запит злиття %[4]s, який повторно відкриває цю проблему %[2]s` -issues.ref_closed_from=`закрив цю проблему %[4]s %[2]s` -issues.ref_reopened_from=`повторно відкрив цю проблему %[4]s %[2]s` +issues.ref_closing_from=`згадав запит на злиття %[4]с, які закриють цю задачу %[2]s` +issues.ref_reopening_from=`згадав запит на злиття %[4]с, які повторно відкриють цю задачу %[2]s` +issues.ref_closed_from=`закрив цю задачу %[4]s %[2]s` +issues.ref_reopened_from=`повторно відкрито цю задачу %[4]s %[2]s` issues.ref_from=`із %[1]s` issues.poster=Автор issues.collaborator=Співавтор @@ -1241,12 +1242,12 @@ issues.label_title=Назва мітки issues.label_description=Опис мітки issues.label_color=Колір мітки issues.label_count=%d міток -issues.label_open_issues=%d відкритих проблем +issues.label_open_issues=%d відкритих задач issues.label_edit=Редагувати issues.label_delete=Видалити issues.label_modify=Редагувати мітку issues.label_deletion=Видалити мітку -issues.label_deletion_desc=Видалення мітки видаляє її з усіх обговорень. Продовжити? +issues.label_deletion_desc=Видалення мітки видаляє її з усіх задач. Продовжити? issues.label_deletion_success=Мітку було видалено. issues.label.filter_sort.alphabetically=За алфавітом issues.label.filter_sort.reverse_alphabetically=З кінця алфавіту @@ -1259,29 +1260,29 @@ issues.subscribe=Підписатися issues.unsubscribe=Відписатися issues.lock=Блокування обговорення issues.unlock=Розблокування обговорення -issues.lock.unknown_reason=Неможливо заблокувати проблему з невідомою причиною. -issues.lock_duplicate=Проблема не може бути заблокованим двічі. -issues.unlock_error=Не можливо розблокувати проблему, яка не заблокована. +issues.lock.unknown_reason=Неможливо заблокувати задачу з невідомою причиною. +issues.lock_duplicate=Задача не може бути заблокованим двічі. +issues.unlock_error=Не можливо розблокувати задачу, яка не заблокована. issues.lock_with_reason=заблоковано як %s та обмежене обговорення для співавторів %s issues.lock_no_reason=заблоковано та обмежене обговорення для співавторів %s issues.unlock_comment=розблоковане обговорення %s issues.lock_confirm=Заблокувати issues.unlock_confirm=Розблокувати -issues.lock.notice_1=- Інші користувачі не можуть додавати нові коментарі до цієї проблеми. +issues.lock.notice_1=- Інші користувачі не можуть додавати нові коментарі до цієї задачі. issues.lock.notice_2=- Ви й інші співавтори, які мають доступ до цього репозиторію, можете залишати коментарі, які інші можуть бачити. -issues.lock.notice_3=- Ви завжди зможете розблокувати цю проблему в майбутньому. -issues.unlock.notice_1=- Кожен зможе прокоментувати це питання ще раз. -issues.unlock.notice_2=- Ви завжди зможете заблокувати цю проблему в майбутньому. +issues.lock.notice_3=- Ви завжди зможете розблокувати цю задачу в майбутньому. +issues.unlock.notice_1=- Кожен зможе прокоментувати цю задачу ще раз. +issues.unlock.notice_2=- Ви завжди зможете заблокувати цю задачу в майбутньому. issues.lock.reason=Причина блокування -issues.lock.title=Заблокувати обговорення цієї проблеми. -issues.unlock.title=Розблокувати обговорення цієї проблеми. -issues.comment_on_locked=Ви не можете коментувати заблоковану проблему. +issues.lock.title=Заблокувати обговорення цієї задачі. +issues.unlock.title=Розблокувати обговорення цієї задачі. +issues.comment_on_locked=Ви не можете коментувати заблоковану задачу. issues.tracker=Відстеження часу issues.start_tracking_short=Запустити таймер issues.start_tracking=Почати відстеження часу issues.start_tracking_history=`почав працювати %s` -issues.tracker_auto_close=Таймер буде автоматично зупинено, коли ця проблема буде закрита -issues.tracking_already_started=`Ви вже почали відстежувати час для іншої проблеми!` +issues.tracker_auto_close=Таймер буде автоматично зупинено, коли ця задача буде закрита +issues.tracking_already_started=`Ви вже почали відстежувати час для іншої задачі!` issues.stop_tracking=Зупинити таймер issues.stop_tracking_history=`перестав(-ла) працювати %s` issues.cancel_tracking=Скасувати @@ -1308,7 +1309,7 @@ issues.due_date_form=рррр-мм-дд issues.due_date_form_add=Додати дату завершення issues.due_date_form_edit=Редагувати issues.due_date_form_remove=Видалити -issues.due_date_not_writer=Вам потрібен доступ до запису в репозиторії, щоб оновити дату завершення проблем. +issues.due_date_not_writer=Вам потрібен доступ до запису в репозиторії, щоб оновити дату завершення задач. issues.due_date_not_set=Термін виконання не встановлений. issues.due_date_added=додав(ла) дату завершення %s %s issues.due_date_modified=термін змінено з %s %s на %s @@ -1316,7 +1317,7 @@ issues.due_date_remove=видалив(ла) дату завершення %s %s issues.due_date_overdue=Прострочено issues.due_date_invalid=Термін дії не дійсний або знаходиться за межами допустимого діапазону. Будь ласка використовуйте формат 'yyyy-mm-dd'. issues.dependency.title=Залежності -issues.dependency.issue_no_dependencies=Ця проблема в даний час не має залежностей. +issues.dependency.issue_no_dependencies=Ця задача тепер не має залежностей. issues.dependency.pr_no_dependencies=Цей запит на злиття в даний час не має залежностей. issues.dependency.add=Додати залежність… issues.dependency.cancel=Відмінити @@ -1324,24 +1325,24 @@ issues.dependency.remove=Видалити issues.dependency.remove_info=Видалити цю залежність issues.dependency.added_dependency=`додав нову залежність %s` issues.dependency.removed_dependency=`видалив залежність %s` -issues.dependency.pr_closing_blockedby=Закриття цього запиту злиття заблоковано наступними проблемами -issues.dependency.issue_closing_blockedby=Закриття цієї проблеми заблоковано наступними проблемами -issues.dependency.issue_close_blocks=Ця проблема блокує закриття залежних проблем -issues.dependency.pr_close_blocks=Цей пулл-реквест блокує закриття залежних проблем -issues.dependency.issue_close_blocked=Вам потрібно закрити всі проблеми, що блокують цю проблему, перед її закриттям. -issues.dependency.pr_close_blocked=Вам потрібно закрити всі проблеми, що блокують цей пулл-реквест, перед його злиттям. +issues.dependency.pr_closing_blockedby=Закриття цього запиту злиття заблоковано наступними задачами +issues.dependency.issue_closing_blockedby=Закриття цієї задачи заблоковано наступними задачами +issues.dependency.issue_close_blocks=Ця задача блокує закриття залежних задач +issues.dependency.pr_close_blocks=Цей запит на злиття блокує закриття залежних задач +issues.dependency.issue_close_blocked=Вам потрібно закрити всі задачі, що блокують цю задачу, перед її закриттям. +issues.dependency.pr_close_blocked=Вам потрібно закрити всі задачі, що блокують цей запит, перед його злиттям. issues.dependency.blocks_short=Блоки issues.dependency.blocked_by_short=Залежить від issues.dependency.remove_header=Видалити залежність -issues.dependency.issue_remove_text=Це призведе до видалення залежності з цієї проблеми. Продовжити? +issues.dependency.issue_remove_text=Це призведе до видалення залежності з цієї задачі. Продовжити? issues.dependency.pr_remove_text=Це призведе до видалення залежності з цього пулл-реквесту. Продовжити? -issues.dependency.setting=Увімкнути залежності для проблем та пулл-реквестів -issues.dependency.add_error_same_issue=Ви не можете зробити проблему залежною від себе. -issues.dependency.add_error_dep_issue_not_exist=Залежність для проблеми не існує. +issues.dependency.setting=Увімкнути залежності для задач та запитів на злиття +issues.dependency.add_error_same_issue=Ви не можете зробити задачу залежною від себе. +issues.dependency.add_error_dep_issue_not_exist=Залежність для задачі не існує. issues.dependency.add_error_dep_not_exist=Залежність не існує. issues.dependency.add_error_dep_exists=Залежність уже існує. -issues.dependency.add_error_cannot_create_circular=Ви не можете створити залежність з двома проблемами, які блокують одна одну. -issues.dependency.add_error_dep_not_same_repo=Обидві проблеми повинні бути в одному репозиторії. +issues.dependency.add_error_cannot_create_circular=Ви не можете створити залежність з двома задачами, які блокують одна одну. +issues.dependency.add_error_dep_not_same_repo=Обидві задачі повинні бути в одному репозиторії. issues.review.self.approval=Ви не можете схвалити власний пулл-реквест. issues.review.self.rejection=Ви не можете надіслати запит на зміну на власний пулл-реквест. issues.review.approve=зміни затверджено %s @@ -1486,7 +1487,7 @@ milestones.update_ago=Оновлено %s назад milestones.no_due_date=Немає дати завершення milestones.open=Відкрити milestones.close=Закрити -milestones.new_subheader=Створюйте етапи для організації ваших завдань. +milestones.new_subheader=Створюйте етапи для організації ваших задач. milestones.completeness=%d%% завершено milestones.create=Створити етап milestones.title=Заголовок @@ -1496,19 +1497,19 @@ milestones.clear=Очистити milestones.invalid_due_date_format=Дата завершення має бути в форматі 'рррр-мм-дд'. milestones.create_success=Етап '%s' створений. milestones.edit=Редагувати етап -milestones.edit_subheader=Використовуйте кращий опис контрольної точки, щоб уникнути нерозуміння з боку інших людей. +milestones.edit_subheader=Створюйте етапи для організації ваших задач. milestones.cancel=Відмінити milestones.modify=Оновити етап milestones.edit_success=Етап '%s' був оновлений. milestones.deletion=Видалити етап -milestones.deletion_desc=Видалення етапу призведе до його видалення з усіх пов'язаних завдань. Продовжити? +milestones.deletion_desc=Видалення етапу призведе до його видалення з усіх пов'язаних задач. Продовжити? milestones.deletion_success=Етап успішно видалено. milestones.filter_sort.closest_due_date=Найближче за датою milestones.filter_sort.furthest_due_date=Далі за датою milestones.filter_sort.least_complete=Менш повне milestones.filter_sort.most_complete=Більш повне -milestones.filter_sort.most_issues=Найбільш проблем -milestones.filter_sort.least_issues=Найменш проблем +milestones.filter_sort.most_issues=Найбільш задач +milestones.filter_sort.least_issues=Найменш задач signing.will_sign=Цей коміт буде підписано ключем '%s' signing.wont_sign.error=Під час підписання коміту, сталася помилка @@ -1575,20 +1576,20 @@ activity.title.prs_opened_by=%s запропоновано %s activity.merged_prs_label=Злито activity.opened_prs_label=Запропоновано activity.active_issues_count_1=%d Активна проблема -activity.active_issues_count_n=%d Активні проблеми +activity.active_issues_count_n=%d Активні задачі activity.closed_issues_count_1=Закрита проблема -activity.closed_issues_count_n=Закриті проблеми +activity.closed_issues_count_n=Закриті задачі activity.title.issues_1=%d Проблема -activity.title.issues_n=%d Проблеми +activity.title.issues_n=%d Задач activity.title.issues_closed_from=%s закрито %s activity.title.issues_created_by=%s створена(і) %s activity.closed_issue_label=Закрито activity.new_issues_count_1=Нова Проблема -activity.new_issues_count_n=%d Проблем +activity.new_issues_count_n=Нові Задачі activity.new_issue_label=Відкриті activity.title.unresolved_conv_1=%d Незавершене обговорення activity.title.unresolved_conv_n=%d Незавершених обговорень -activity.unresolved_conv_desc=Список всіх старих тікетів і Pull Request'ів з недавньої активністю, але ще не закритих або прийнятих. +activity.unresolved_conv_desc=Список всіх старих задач і Pull Request'ів з недавньої активністю, але ще не закритих або прийнятих. activity.unresolved_conv_label=Відкрити activity.title.releases_1=%d Реліз activity.title.releases_n=%d Релізів @@ -1665,7 +1666,7 @@ settings.use_internal_issue_tracker=Використовувати вбудов settings.use_external_issue_tracker=Використовувати зовнішню систему обліку завдань settings.external_tracker_url=URL зовнішньої системи відстеження проблем settings.external_tracker_url_error=URL зовнішнього баг-трекера не є допустимою URL-адресою. -settings.external_tracker_url_desc=Відвідувачі перенаправляються на зовнішню URL-адресу, коли натискають вкладку 'Проблеми'. +settings.external_tracker_url_desc=Відвідувачі перенаправляються на зовнішню URL-адресу, коли натискають вкладку 'Задачі'. settings.tracker_url_format=Формат URL зовнішнього трекера задач settings.tracker_url_format_error=Неправильний формат URL-адреси зовнішнього баг-трекера. settings.tracker_issue_style=Формат номеру для зовнішньої системи обліку задач @@ -1736,7 +1737,7 @@ settings.wiki_deletion_success=Дані wiki були видалені. settings.delete=Видалити цей репозиторій settings.delete_desc=Будьте уважні! Як тільки ви видалите репозиторій - шляху назад не буде. settings.delete_notices_1=- Цю операцію НЕ МОЖНА відмінити. -settings.delete_notices_2=- Ця операція назавжди видалить все з репозиторію %s, включаючи дані Git, пов'язані з ним завдання, коментарі і права доступу для співробітників. +settings.delete_notices_2=- Ця операція остаточно видалить %s репозиторій, включаючи код, задачі, коментарі, вікі та налаштування співавторів. settings.delete_notices_fork_1=- Всі форки стануть незалежними репозиторіями після видалення. settings.deletion_success=Репозиторій успішно видалено. settings.update_settings_success=Налаштування репозиторію було оновлено. @@ -1806,7 +1807,7 @@ settings.event_push_desc=Git push до репозиторію. settings.event_repository=Репозиторій settings.event_repository_desc=Репозиторій створений або видалено. settings.event_header_issue=Події задачі -settings.event_issues=Проблеми +settings.event_issues=Задачі settings.event_issues_desc=Проблема відкрита, закрита, повторно відкрита або відредагована. settings.event_issue_assign=Проблема прив'язана settings.event_issue_assign_desc=Проблема призначена або скасована. @@ -1942,7 +1943,7 @@ settings.matrix.access_token=Токен Доступу settings.matrix.message_type=Тип повідомлення settings.archive.button=Архівний репозиторій settings.archive.header=Відправити репозиторій в архів -settings.archive.text=Архівування репозиторія зробить його доступним лише для читання. Він не відображається на панелі, в нього не можуть вноситись зміни і не можна створювати запити з проблем та пулл-реквести. +settings.archive.text=Архівування репозиторія зробить його доступним лише для читання. Він не відображається на панелі, в нього не можуть вноситись зміни і не можна створювати запити з задач та пулл-реквести. settings.archive.success=Репозиторію успішно присвоєно статус архівного. settings.archive.error=Сталася помилка при спробі архівувати репозиторій. Докладнішу інформацію див. у журналі. settings.archive.error_ismirror=Неможливо архівувати дзеркальний репозиротрій. @@ -1950,7 +1951,7 @@ settings.archive.branchsettings_unavailable=Параметри гілки не settings.archive.tagsettings_unavailable=Параметри міток недоступні, якщо репозиторій архівний. settings.unarchive.button=Зняти архівний статус settings.unarchive.header=Зняти архівний статус для репозиторія -settings.unarchive.text=Зняття статусу архівного відновить запис в репозиторій, а також відкриє можливість створювати запити з нових проблем та пулл-запити. +settings.unarchive.text=Зняття статусу архівного відновить запис в репозиторій, а також відкриє можливість створювати запити з нових задачах та пулл-запити. settings.unarchive.success=Статус архівний успішно знято. settings.unarchive.error=Сталася помилка при спробі скасувати архівний статус репозиторія. Докладнішу інформацію див. у журналі. settings.update_avatar_success=Аватар репозиторію оновлений. @@ -2175,7 +2176,7 @@ settings.delete_org_title=Видалити організацію settings.delete_org_desc=Ця організація буде безповоротно видалена. Продовжити? settings.hooks_desc=Додайте webhooks, який буде викликатися для всіх репозиторіїв якими володіє ця організація. -settings.labels_desc=Додайте мітки, які можуть використовуватися для всіх репозиторіїв цієї органцізації. +settings.labels_desc=Додати мітки, які можуть бути використані для задач для всіх репозиторіїв в цій організації. members.membership_visibility=Видимість учасника: members.public=Показувати @@ -2400,7 +2401,7 @@ repos.private=Приватний repos.watches=Стежать repos.stars=В обраному repos.forks=Форки -repos.issues=Проблеми +repos.issues=Задачі repos.size=Розмір defaulthooks=Веб-хуки за замовчуванням