From 0bfcbcc5e769bd258e4f530e0f007f5465f42de5 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 3 Mar 2023 17:45:19 +0800 Subject: [PATCH 01/28] Add document for `webcomponents` (#23261) --- web_src/js/webcomponents/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 web_src/js/webcomponents/README.md diff --git a/web_src/js/webcomponents/README.md b/web_src/js/webcomponents/README.md new file mode 100644 index 000000000000..eabbc24ad1da --- /dev/null +++ b/web_src/js/webcomponents/README.md @@ -0,0 +1,19 @@ +# Web Components + +This `webcomponents` directory contains the source code for the web components used in the Gitea Web UI. + +https://developer.mozilla.org/en-US/docs/Web/Web_Components + +# Guidelines + +* These components are loaded in `` (before DOM body), + so they should have their own dependencies and should be very light, + then they won't affect the page loading time too much. +* If the component is not a public one, it's suggested to have its own `Gitea` or `gitea-` prefix to avoid conflicts. + +# TODO + +There are still some components that are not migrated to web components yet: + +* `` +* ` {{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush)}} -
+ + {{if and .Issue.IsClosed (gt .ID $.LatestCloseCommentID)}} + {{continue}} + {{end}}` +
` {{svg "octicon-repo-push"}} {{template "shared/user/authorlink" .Poster}} From 807e8e280c02b4e9082899c7e364731b44d09143 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 3 Mar 2023 22:43:30 +0800 Subject: [PATCH 04/28] Revert relative links to absolute links in mail templates (#23267) Follow #21986 , fix regression. The mail templates should always use `AppURL` (the full absolute URL) --- templates/mail/issue/assigned.tmpl | 2 +- templates/mail/issue/default.tmpl | 6 +++--- templates/mail/release.tmpl | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/templates/mail/issue/assigned.tmpl b/templates/mail/issue/assigned.tmpl index 232a41b56f8a..05bed6902221 100644 --- a/templates/mail/issue/assigned.tmpl +++ b/templates/mail/issue/assigned.tmpl @@ -8,7 +8,7 @@ {{.Subject}} -{{$repo_url := printf "%s" (Escape .Issue.Repo.Link) (Escape .Issue.Repo.FullName)}} +{{$repo_url := printf "%s" (Escape .Issue.Repo.HTMLURL) (Escape .Issue.Repo.FullName)}} {{$link := printf "#%d" (Escape .Link) .Issue.Index}}

diff --git a/templates/mail/issue/default.tmpl b/templates/mail/issue/default.tmpl index 3bda408a0581..64dbb3df681e 100644 --- a/templates/mail/issue/default.tmpl +++ b/templates/mail/issue/default.tmpl @@ -20,11 +20,11 @@ {{if eq .ActionName "push"}}

{{if .Comment.IsForcePush}} - {{$oldCommitUrl := printf "%s/commit/%s" .Comment.Issue.PullRequest.BaseRepo.Link .Comment.OldCommit}} + {{$oldCommitUrl := printf "%s/commit/%s" .Comment.Issue.PullRequest.BaseRepo.HTMLURL .Comment.OldCommit}} {{$oldShortSha := ShortSha .Comment.OldCommit}} {{$oldCommitLink := printf "%[2]s" (Escape $oldCommitUrl) (Escape $oldShortSha)}} - {{$newCommitUrl := printf "%s/commit/%s" .Comment.Issue.PullRequest.BaseRepo.Link .Comment.NewCommit}} + {{$newCommitUrl := printf "%s/commit/%s" .Comment.Issue.PullRequest.BaseRepo.HTMLURL .Comment.NewCommit}} {{$newShortSha := ShortSha .Comment.NewCommit}} {{$newCommitLink := printf "%[2]s" (Escape $newCommitUrl) (Escape $newShortSha)}} @@ -72,7 +72,7 @@

    {{range .Comment.Commits}}
  • - + {{ShortSha .ID.String}} - {{.Summary}}
  • diff --git a/templates/mail/release.tmpl b/templates/mail/release.tmpl index 42504335231a..b2acdce8b2b4 100644 --- a/templates/mail/release.tmpl +++ b/templates/mail/release.tmpl @@ -11,8 +11,8 @@ -{{$release_url := printf "%s" (.Release.Link | Escape) (.Release.TagName | Escape)}} -{{$repo_url := printf "%s" (.Release.Repo.Link | Escape) (.Release.Repo.FullName | Escape)}} +{{$release_url := printf "%s" (.Release.HTMLURL | Escape) (.Release.TagName | Escape)}} +{{$repo_url := printf "%s" (.Release.Repo.HTMLURL | Escape) (.Release.Repo.FullName | Escape)}}

    {{.locale.Tr "mail.release.new.text" .Release.Publisher.Name $release_url $repo_url | Str2html}} From 79acf7acc4f74d0fe071c1748ae80ff51499706f Mon Sep 17 00:00:00 2001 From: ChristianSch Date: Fri, 3 Mar 2023 21:53:46 +0100 Subject: [PATCH 05/28] Fix grammar in error message (#23273) Fixes the grammar in the error message in case a runner token has already been activated --- routers/api/actions/runner/runner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/api/actions/runner/runner.go b/routers/api/actions/runner/runner.go index d0bfb2363e0c..3299eaf1e41d 100644 --- a/routers/api/actions/runner/runner.go +++ b/routers/api/actions/runner/runner.go @@ -52,7 +52,7 @@ func (s *Service) Register( } if runnerToken.IsActive { - return nil, errors.New("runner token has already activated") + return nil, errors.New("runner token has already been activated") } // create new runner From 7f9d58fab8a3c4fd1a8f18d58e36fbfab7b30f33 Mon Sep 17 00:00:00 2001 From: Hester Gong Date: Sat, 4 Mar 2023 06:28:20 +0800 Subject: [PATCH 06/28] Support paste treepath when creating a new file or updating the file name (#23209) Close #23204 Quick Demo: https://user-images.githubusercontent.com/17645053/222058727-ad30a37c-f0ac-4184-9946-a71fcee473b5.mov --------- Co-authored-by: delvh --- web_src/js/features/repo-editor.js | 66 +++++++++++++++++------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/web_src/js/features/repo-editor.js b/web_src/js/features/repo-editor.js index a9d143847db2..b3e9b65f2167 100644 --- a/web_src/js/features/repo-editor.js +++ b/web_src/js/features/repo-editor.js @@ -91,24 +91,27 @@ export function initRepoEditor() { $('#commit-button').text($(this).attr('button_text')); }); + const joinTreePath = ($fileNameEl) => { + const parts = []; + $('.breadcrumb span.section').each(function () { + const element = $(this); + if (element.find('a').length) { + parts.push(element.find('a').text()); + } else { + parts.push(element.text()); + } + }); + if ($fileNameEl.val()) parts.push($fileNameEl.val()); + $('#tree_path').val(parts.join('/')); + }; + const $editFilename = $('#file-name'); - $editFilename.on('keyup', function (e) { - const $section = $('.breadcrumb span.section'); - const $divider = $('.breadcrumb div.divider'); - let value; - let parts; + $editFilename.on('input', function () { + const parts = $(this).val().split('/'); - if (e.keyCode === 8 && getCursorPosition($(this)) === 0 && $section.length > 0) { - value = $section.last().find('a').text(); - $(this).val(value + $(this).val()); - $(this)[0].setSelectionRange(value.length, value.length); - $section.last().remove(); - $divider.last().remove(); - } - if (e.keyCode === 191) { - parts = $(this).val().split('/'); + if (parts.length > 1) { for (let i = 0; i < parts.length; ++i) { - value = parts[i]; + const value = parts[i]; if (i < parts.length - 1) { if (value.length) { $(`${htmlEscape(value)}`).insertBefore($(this)); @@ -117,21 +120,28 @@ export function initRepoEditor() { } else { $(this).val(value); } - $(this)[0].setSelectionRange(0, 0); + this.setSelectionRange(0, 0); } } - parts = []; - $('.breadcrumb span.section').each(function () { - const element = $(this); - if (element.find('a').length) { - parts.push(element.find('a').text()); - } else { - parts.push(element.text()); - } - }); - if ($(this).val()) parts.push($(this).val()); - $('#tree_path').val(parts.join('/')); - }).trigger('keyup'); + + joinTreePath($(this)); + }); + + $editFilename.on('keydown', function (e) { + const $section = $('.breadcrumb span.section'); + + // Jump back to last directory once the filename is empty + if (e.code === 'Backspace' && getCursorPosition($(this)) === 0 && $section.length > 0) { + e.preventDefault(); + const $divider = $('.breadcrumb div.divider'); + const value = $section.last().find('a').text(); + $(this).val(value + $(this).val()); + this.setSelectionRange(value.length, value.length); + $section.last().remove(); + $divider.last().remove(); + joinTreePath($(this)); + } + }); const $editArea = $('.repository.editor textarea#edit_area'); if (!$editArea.length) return; From 5c4075e16dd7afc75557b178239b8172e286d5c3 Mon Sep 17 00:00:00 2001 From: zeripath Date: Fri, 3 Mar 2023 22:28:38 +0000 Subject: [PATCH 07/28] Fix GetFilesChangedBetween if the file name may be escaped (#23272) The code for GetFilesChangedBetween uses `git diff --name-only base..head` to get the names of files changed between base and head however this forgets that git will escape certain values. This PR simply switches to use `-z` which has the `NUL` character as the separator. Ref https://github.com/go-gitea/gitea/pull/22568#discussion_r1123138096 Signed-off-by: Andrew Thornton Co-authored-by: techknowlogick --- modules/git/repo_compare.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index 9a4d66f2f521..439455e3c295 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -277,11 +277,18 @@ func (repo *Repository) GetPatch(base, head string, w io.Writer) error { // GetFilesChangedBetween returns a list of all files that have been changed between the given commits func (repo *Repository) GetFilesChangedBetween(base, head string) ([]string, error) { - stdout, _, err := NewCommand(repo.Ctx, "diff", "--name-only").AddDynamicArguments(base + ".." + head).RunStdString(&RunOpts{Dir: repo.Path}) + stdout, _, err := NewCommand(repo.Ctx, "diff", "--name-only", "-z").AddDynamicArguments(base + ".." + head).RunStdString(&RunOpts{Dir: repo.Path}) if err != nil { return nil, err } - return strings.Split(stdout, "\n"), err + split := strings.Split(stdout, "\000") + + // Because Git will always emit filenames with a terminal NUL ignore the last entry in the split - which will always be empty. + if len(split) > 0 { + split = split[:len(split)-1] + } + + return split, err } // GetDiffFromMergeBase generates and return patch data from merge base to head From b2359f3df6673c1b2d04f0112be62990c139aba0 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sat, 4 Mar 2023 10:12:02 +0800 Subject: [PATCH 08/28] Fix various bugs for "install" page (#23194) ## TLDR * Fix the broken page / broken image problem when click "Install" * Close #20089 * Fix the Password Hash Algorithm display problem for #22942 * Close #23183 * Close #23184 ## Details ### The broken page / broken image problem when click "Install" (Redirect failed after install gitea #23184) Before: when click "install", all new requests will fail, because the server has been restarted. Users just see a broken page with broken images, sometimes the server is not ready but the user would have been redirect to "/user/login" page, then the users see a new broken page (connection refused or something wrong ...) After: only check InstallLock=true for necessary handlers, and sleep for a while before restarting the server, then the browser has enough time to load the "post-install" page. And there is a script to check whether "/user/login" is ready, the user will only be redirected to the login page when the server is ready. ### During new instance setup make 'Gitea Base URL' filled from window.location.origin #20089 If the "app_url" input contains `localhost` (the default value from config), use current window's location href as the `app_url` (aka ROOT_URL) ### Fix the Password Hash Algorithm display problem for "Provide the ability to set password hash algorithm parameters #22942" Before: the UI shows `pbkdf2$50000$50`

    ![image](https://user-images.githubusercontent.com/2114189/221917143-e1e54798-1698-4fee-a18d-00c48081fc39.png)
    After: the UI shows `pbkdf2`
    ![image](https://user-images.githubusercontent.com/2114189/221916999-97a15be8-2ebb-4a01-bf93-dac18e354fcc.png)
    ### GET data: net::ERR_INVALID_URL #23183 Cause by empty `data:` in `` --------- Co-authored-by: Jason Song Co-authored-by: Lunny Xiao Co-authored-by: techknowlogick --- modules/auth/password/hash/setting.go | 29 ++++++++++++---- options/locale/locale_en-US.ini | 2 +- routers/install/install.go | 48 ++++++++++++++++++--------- routers/install/routes.go | 13 ++++++-- templates/base/head.tmpl | 2 +- templates/post-install.tmpl | 4 +-- web_src/js/features/install.js | 39 +++++++++++++++++++++- 7 files changed, 107 insertions(+), 30 deletions(-) diff --git a/modules/auth/password/hash/setting.go b/modules/auth/password/hash/setting.go index 70169743040a..f0715f31e1a4 100644 --- a/modules/auth/password/hash/setting.go +++ b/modules/auth/password/hash/setting.go @@ -41,9 +41,8 @@ var RecommendedHashAlgorithms = []string{ "pbkdf2_hi", } -// SetDefaultPasswordHashAlgorithm will take a provided algorithmName and dealias it to -// a complete algorithm specification. -func SetDefaultPasswordHashAlgorithm(algorithmName string) (string, *PasswordHashAlgorithm) { +// hashAlgorithmToSpec converts an algorithm name or a specification to a full algorithm specification +func hashAlgorithmToSpec(algorithmName string) string { if algorithmName == "" { algorithmName = DefaultHashAlgorithmName } @@ -52,10 +51,26 @@ func SetDefaultPasswordHashAlgorithm(algorithmName string) (string, *PasswordHas algorithmName = alias alias, has = aliasAlgorithmNames[algorithmName] } + return algorithmName +} - // algorithmName should now be a full algorithm specification - // e.g. pbkdf2$50000$50 rather than pbdkf2 - DefaultHashAlgorithm = Parse(algorithmName) +// SetDefaultPasswordHashAlgorithm will take a provided algorithmName and de-alias it to +// a complete algorithm specification. +func SetDefaultPasswordHashAlgorithm(algorithmName string) (string, *PasswordHashAlgorithm) { + algoSpec := hashAlgorithmToSpec(algorithmName) + // now we get a full specification, e.g. pbkdf2$50000$50 rather than pbdkf2 + DefaultHashAlgorithm = Parse(algoSpec) + return algoSpec, DefaultHashAlgorithm +} - return algorithmName, DefaultHashAlgorithm +// ConfigHashAlgorithm will try to find a "recommended algorithm name" defined by RecommendedHashAlgorithms for config +// This function is not fast and is only used for the installation page +func ConfigHashAlgorithm(algorithm string) string { + algorithm = hashAlgorithmToSpec(algorithm) + for _, recommAlgo := range RecommendedHashAlgorithms { + if algorithm == hashAlgorithmToSpec(recommAlgo) { + return recommAlgo + } + } + return algorithm } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 1d1a0f588d25..3695bd0384aa 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -237,7 +237,6 @@ internal_token_failed = Failed to generate internal token: %v secret_key_failed = Failed to generate secret key: %v save_config_failed = Failed to save configuration: %v invalid_admin_setting = Administrator account setting is invalid: %v -install_success = Welcome! Thank you for choosing Gitea. Have fun and take care! invalid_log_root_path = The log path is invalid: %v default_keep_email_private = Hide Email Addresses by Default default_keep_email_private_popup = Hide email addresses of new user accounts by default. @@ -248,6 +247,7 @@ default_enable_timetracking_popup = Enable time tracking for new repositories by no_reply_address = Hidden Email Domain no_reply_address_helper = Domain name for users with a hidden email address. For example, the username 'joe' will be logged in Git as 'joe@noreply.example.org' if the hidden email domain is set to 'noreply.example.org'. password_algorithm = Password Hash Algorithm +invalid_password_algorithm = Invalid password hash algorithm password_algorithm_helper = Set the password hashing algorithm. Algorithms have differing requirements and strength. `argon2` whilst having good characteristics uses a lot of memory and may be inappropriate for small systems. enable_update_checker = Enable Update Checker enable_update_checker_helper = Checks for new version releases periodically by connecting to gitea.io. diff --git a/routers/install/install.go b/routers/install/install.go index a3d64e5f73a5..a377c2950ba3 100644 --- a/routers/install/install.go +++ b/routers/install/install.go @@ -59,11 +59,6 @@ func Init(ctx goctx.Context) func(next http.Handler) http.Handler { dbTypeNames := getSupportedDbTypeNames() return func(next http.Handler) http.Handler { return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { - if setting.InstallLock { - resp.Header().Add("Refresh", "1; url="+setting.AppURL+"user/login") - _ = rnd.HTML(resp, http.StatusOK, string(tplPostInstall), nil) - return - } locale := middleware.Locale(resp, req) startTime := time.Now() ctx := context.Context{ @@ -93,6 +88,11 @@ func Init(ctx goctx.Context) func(next http.Handler) http.Handler { // Install render installation page func Install(ctx *context.Context) { + if setting.InstallLock { + InstallDone(ctx) + return + } + form := forms.InstallForm{} // Database settings @@ -162,7 +162,7 @@ func Install(ctx *context.Context) { form.DefaultAllowCreateOrganization = setting.Service.DefaultAllowCreateOrganization form.DefaultEnableTimetracking = setting.Service.DefaultEnableTimetracking form.NoReplyAddress = setting.Service.NoReplyAddress - form.PasswordAlgorithm = setting.PasswordHashAlgo + form.PasswordAlgorithm = hash.ConfigHashAlgorithm(setting.PasswordHashAlgo) middleware.AssignForm(form, ctx.Data) ctx.HTML(http.StatusOK, tplInstall) @@ -234,6 +234,11 @@ func checkDatabase(ctx *context.Context, form *forms.InstallForm) bool { // SubmitInstall response for submit install items func SubmitInstall(ctx *context.Context) { + if setting.InstallLock { + InstallDone(ctx) + return + } + var err error form := *web.GetForm(ctx).(*forms.InstallForm) @@ -277,7 +282,6 @@ func SubmitInstall(ctx *context.Context) { setting.Database.Charset = form.Charset setting.Database.Path = form.DbPath setting.Database.LogSQL = !setting.IsProd - setting.PasswordHashAlgo = form.PasswordAlgorithm if !checkDatabase(ctx, &form) { return @@ -499,6 +503,12 @@ func SubmitInstall(ctx *context.Context) { } if len(form.PasswordAlgorithm) > 0 { + var algorithm *hash.PasswordHashAlgorithm + setting.PasswordHashAlgo, algorithm = hash.SetDefaultPasswordHashAlgorithm(form.PasswordAlgorithm) + if algorithm == nil { + ctx.RenderWithErr(ctx.Tr("install.invalid_password_algorithm"), tplInstall, &form) + return + } cfg.Section("security").Key("PASSWORD_HASH_ALGO").SetValue(form.PasswordAlgorithm) } @@ -571,18 +581,26 @@ func SubmitInstall(ctx *context.Context) { } log.Info("First-time run install finished!") + InstallDone(ctx) - ctx.Flash.Success(ctx.Tr("install.install_success")) - - ctx.RespHeader().Add("Refresh", "1; url="+setting.AppURL+"user/login") - ctx.HTML(http.StatusOK, tplPostInstall) - - // Now get the http.Server from this request and shut it down - // NB: This is not our hammerable graceful shutdown this is http.Server.Shutdown - srv := ctx.Value(http.ServerContextKey).(*http.Server) go func() { + // Sleep for a while to make sure the user's browser has loaded the post-install page and its assets (images, css, js) + // What if this duration is not long enough? That's impossible -- if the user can't load the simple page in time, how could they install or use Gitea in the future .... + time.Sleep(3 * time.Second) + + // Now get the http.Server from this request and shut it down + // NB: This is not our hammerable graceful shutdown this is http.Server.Shutdown + srv := ctx.Value(http.ServerContextKey).(*http.Server) if err := srv.Shutdown(graceful.GetManager().HammerContext()); err != nil { log.Error("Unable to shutdown the install server! Error: %v", err) } + + // After the HTTP server for "install" shuts down, the `runWeb()` will continue to run the "normal" server }() } + +// InstallDone shows the "post-install" page, makes it easier to develop the page. +// The name is not called as "PostInstall" to avoid misinterpretation as a handler for "POST /install" +func InstallDone(ctx *context.Context) { //nolint + ctx.HTML(http.StatusOK, tplPostInstall) +} diff --git a/routers/install/routes.go b/routers/install/routes.go index 9aa5a88d24b1..a8efc92fe17c 100644 --- a/routers/install/routes.go +++ b/routers/install/routes.go @@ -6,6 +6,7 @@ package install import ( goctx "context" "fmt" + "html" "net/http" "path" @@ -37,7 +38,7 @@ func installRecovery(ctx goctx.Context) func(next http.Handler) http.Handler { // Why we need this? The first recover will try to render a beautiful // error page for user, but the process can still panic again, then // we have to just recover twice and send a simple error page that - // should not panic any more. + // should not panic anymore. defer func() { if err := recover(); err != nil { combinedErr := fmt.Sprintf("PANIC: %v\n%s", err, log.Stack(2)) @@ -107,8 +108,9 @@ func Routes(ctx goctx.Context) *web.Route { r.Use(installRecovery(ctx)) r.Use(Init(ctx)) - r.Get("/", Install) + r.Get("/", Install) // it must be on the root, because the "install.js" use the window.location to replace the "localhost" AppURL r.Post("/", web.Bind(forms.InstallForm{}), SubmitInstall) + r.Get("/post-install", InstallDone) r.Get("/api/healthz", healthcheck.Check) r.NotFound(web.Wrap(installNotFound)) @@ -116,5 +118,10 @@ func Routes(ctx goctx.Context) *web.Route { } func installNotFound(w http.ResponseWriter, req *http.Request) { - http.Redirect(w, req, setting.AppURL, http.StatusFound) + w.Header().Add("Content-Type", "text/html; charset=utf-8") + w.Header().Add("Refresh", fmt.Sprintf("1; url=%s", setting.AppSubURL+"/")) + // do not use 30x status, because the "post-install" page needs to use 404/200 to detect if Gitea has been installed. + // the fetch API could follow 30x requests to the page with 200 status. + w.WriteHeader(http.StatusNotFound) + _, _ = fmt.Fprintf(w, `Not Found. Go to default page.`, html.EscapeString(setting.AppSubURL+"/")) } diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index c552dcfd2d98..d179140b23b2 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -4,7 +4,7 @@ {{if .Title}}{{.Title | RenderEmojiPlain}} - {{end}}{{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}} - + {{if .ManifestData}}{{end}} diff --git a/templates/post-install.tmpl b/templates/post-install.tmpl index 0d6cd3082c18..f237a6e01b10 100644 --- a/templates/post-install.tmpl +++ b/templates/post-install.tmpl @@ -1,5 +1,5 @@ {{template "base/head" .}} -
    +
    diff --git a/web_src/js/features/install.js b/web_src/js/features/install.js index 2ba6fe1279e0..23122ca4c383 100644 --- a/web_src/js/features/install.js +++ b/web_src/js/features/install.js @@ -2,10 +2,18 @@ import $ from 'jquery'; import {hideElem, showElem} from '../utils/dom.js'; export function initInstall() { - if ($('.page-content.install').length === 0) { + const $page = $('.page-content.install'); + if ($page.length === 0) { return; } + if ($page.is('.post-install')) { + initPostInstall(); + } else { + initPreInstall(); + } +} +function initPreInstall() { const defaultDbUser = 'gitea'; const defaultDbName = 'gitea'; @@ -40,6 +48,18 @@ export function initInstall() { } // else: for SQLite3, the default path is always prepared by backend code (setting) }).trigger('change'); + const $appUrl = $('#app_url'); + const configAppUrl = $appUrl.val(); + if (configAppUrl.includes('://localhost')) { + $appUrl.val(window.location.href); + } + + const $domain = $('#domain'); + const configDomain = $domain.val().trim(); + if (configDomain === 'localhost') { + $domain.val(window.location.hostname); + } + // TODO: better handling of exclusive relations. $('#offline-mode input').on('change', function () { if ($(this).is(':checked')) { @@ -83,3 +103,20 @@ export function initInstall() { } }); } + +function initPostInstall() { + const el = document.getElementById('goto-user-login'); + if (!el) return; + + const targetUrl = el.getAttribute('href'); + let tid = setInterval(async () => { + try { + const resp = await fetch(targetUrl); + if (tid && resp.status === 200) { + clearInterval(tid); + tid = null; + window.location.href = targetUrl; + } + } catch {} + }, 1000); +} From 7b9e23cc1d1e8d757f241b37b0799083149d91f3 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Sat, 4 Mar 2023 12:45:53 +0800 Subject: [PATCH 09/28] Fill head commit to in payload when notifying push commits for mirroring (#23215) Just like what has been done when pushing manually: https://github.com/go-gitea/gitea/blob/7a5af25592003ddc3017fcd7b822a3e02fc40ef6/services/repository/push.go#L225-L226 Before: image After: image --------- Co-authored-by: delvh Co-authored-by: Lunny Xiao --- services/mirror/mirror_pull.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/services/mirror/mirror_pull.go b/services/mirror/mirror_pull.go index 126d2bf35468..60699294c18b 100644 --- a/services/mirror/mirror_pull.go +++ b/services/mirror/mirror_pull.go @@ -499,6 +499,13 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { theCommits.Commits = theCommits.Commits[:setting.UI.FeedMaxCommitNum] } + if newCommit, err := gitRepo.GetCommit(newCommitID); err != nil { + log.Error("SyncMirrors [repo: %-v]: unable to get commit %s: %v", m.Repo, newCommitID, err) + continue + } else { + theCommits.HeadCommit = repo_module.CommitToPushCommit(newCommit) + } + theCommits.CompareURL = m.Repo.ComposeCompareURL(oldCommitID, newCommitID) notification.NotifySyncPushCommits(ctx, m.Repo.MustOwner(ctx), m.Repo, &repo_module.PushUpdateOptions{ From 47bb5f11cb8c6976c14e92e7aa37ebb39a09416b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 4 Mar 2023 05:48:05 +0100 Subject: [PATCH 10/28] Fix stray backticks appearing in pull request timeline (#23282) Caused by #23189. --- templates/repo/issue/view_content/comments.tmpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 03f48ace6638..4839e8084b62 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -700,8 +700,8 @@ {{if and .Issue.IsClosed (gt .ID $.LatestCloseCommentID)}} {{continue}} - {{end}}` -
    ` + {{end}} +
    {{svg "octicon-repo-push"}} {{template "shared/user/authorlink" .Poster}} From 787a05a3a2db1715aa90517029a364c36403a6b1 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sat, 4 Mar 2023 12:48:59 +0800 Subject: [PATCH 11/28] Fix code wrap for unbroken lines (#23268) ## The Problem `overflow-wrap: break-word` doesn't work well for unbroken lines. Use `overflow-wrap: anywhere` instead, and remove legacy alias `word-wrap` ## Before ![image](https://user-images.githubusercontent.com/2114189/222743939-5f38d9e4-18d8-4ae0-8078-4b3a59195a30.png) ## After ![image](https://user-images.githubusercontent.com/2114189/222743833-0e0cfdbb-7b2e-420d-99f9-b1b45dde521a.png) --------- Co-authored-by: silverwind --- web_src/less/_base.less | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web_src/less/_base.less b/web_src/less/_base.less index a73dae6bf37a..1cf65e784cd4 100644 --- a/web_src/less/_base.less +++ b/web_src/less/_base.less @@ -2121,8 +2121,7 @@ a.ui.label:hover { font: 12px var(--fonts-monospace); white-space: pre-wrap; word-break: break-all; - overflow-wrap: break-word; - word-wrap: break-word; + overflow-wrap: anywhere; } .blame .code-inner { From af4b00c2836342e8bb76a68ad3d05420c2ee6988 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sat, 4 Mar 2023 00:39:07 -0500 Subject: [PATCH 12/28] update to mermaid v10 (#23178) fix #23153 --------- Co-authored-by: silverwind --- package-lock.json | 256 +++++++++++++++++++++++++++++------ package.json | 2 +- web_src/js/markup/mermaid.js | 41 +++--- webpack.config.js | 2 +- 4 files changed, 233 insertions(+), 68 deletions(-) diff --git a/package-lock.json b/package-lock.json index 641a42b84670..7ec6d09d1996 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "less": "4.1.3", "less-loader": "11.1.0", "license-checker-webpack-plugin": "0.2.1", - "mermaid": "9.3.0", + "mermaid": "10.0.2", "mini-css-extract-plugin": "2.7.2", "monaco-editor": "0.34.1", "monaco-editor-webpack-plugin": "7.0.1", @@ -2680,6 +2680,14 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/cosmiconfig": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", @@ -2888,6 +2896,53 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "node_modules/cytoscape": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.23.0.tgz", + "integrity": "sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==", + "dependencies": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" + }, "node_modules/d3": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz", @@ -3267,11 +3322,11 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz", - "integrity": "sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", + "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", "dependencies": { - "d3": "^7.7.0", + "d3": "^7.8.2", "lodash-es": "^4.17.21" } }, @@ -3298,6 +3353,11 @@ "node": ">=12" } }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3632,9 +3692,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", - "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", + "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==" }, "node_modules/domutils": { "version": "3.0.1", @@ -3681,6 +3741,11 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, + "node_modules/elkjs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -5043,6 +5108,11 @@ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -5877,6 +5947,11 @@ "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", "dev": true }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, "node_modules/less": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", @@ -6049,8 +6124,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", @@ -6393,20 +6467,26 @@ } }, "node_modules/mermaid": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.3.0.tgz", - "integrity": "sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.0.2.tgz", + "integrity": "sha512-slwoB9WdNUT+/W9VhxLYRLZ0Ey12fIE+cAZjm3FmHTD+0F1uoJETfsNbVS1POnvQZhFYzfT6/z6hJZXgecqVBA==", "dependencies": { "@braintree/sanitize-url": "^6.0.0", - "d3": "^7.0.0", - "dagre-d3-es": "7.0.6", - "dompurify": "2.4.1", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.9", + "dayjs": "^1.11.7", + "dompurify": "2.4.3", + "elkjs": "^0.8.2", "khroma": "^2.0.0", "lodash-es": "^4.17.21", - "moment-mini": "^2.24.0", "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.2", - "uuid": "^9.0.0" + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" } }, "node_modules/micromatch": { @@ -6531,11 +6611,6 @@ "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==", "dev": true }, - "node_modules/moment-mini": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.29.4.tgz", - "integrity": "sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==" - }, "node_modules/monaco-editor": { "version": "0.34.1", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.1.tgz", @@ -8807,6 +8882,14 @@ "node": ">=8" } }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -9315,6 +9398,11 @@ "node": ">=10.13.0" } }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -11774,6 +11862,14 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "requires": { + "layout-base": "^1.0.0" + } + }, "cosmiconfig": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", @@ -11937,6 +12033,46 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "cytoscape": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.23.0.tgz", + "integrity": "sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==", + "requires": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + } + }, + "cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "requires": { + "cose-base": "^1.0.0" + } + }, + "cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "requires": { + "cose-base": "^2.2.0" + }, + "dependencies": { + "cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "requires": { + "layout-base": "^2.0.0" + } + }, + "layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" + } + } + }, "d3": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz", @@ -12208,11 +12344,11 @@ } }, "dagre-d3-es": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz", - "integrity": "sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", + "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", "requires": { - "d3": "^7.7.0", + "d3": "^7.8.2", "lodash-es": "^4.17.21" } }, @@ -12233,6 +12369,11 @@ "whatwg-url": "^11.0.0" } }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -12472,9 +12613,9 @@ } }, "dompurify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", - "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", + "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==" }, "domutils": { "version": "3.0.1", @@ -12518,6 +12659,11 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, + "elkjs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -13548,6 +13694,11 @@ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" }, + "heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -14129,6 +14280,11 @@ "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", "dev": true }, + "layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, "less": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", @@ -14251,8 +14407,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash-es": { "version": "4.17.21", @@ -14531,20 +14686,26 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "mermaid": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.3.0.tgz", - "integrity": "sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.0.2.tgz", + "integrity": "sha512-slwoB9WdNUT+/W9VhxLYRLZ0Ey12fIE+cAZjm3FmHTD+0F1uoJETfsNbVS1POnvQZhFYzfT6/z6hJZXgecqVBA==", "requires": { "@braintree/sanitize-url": "^6.0.0", - "d3": "^7.0.0", - "dagre-d3-es": "7.0.6", - "dompurify": "2.4.1", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.9", + "dayjs": "^1.11.7", + "dompurify": "2.4.3", + "elkjs": "^0.8.2", "khroma": "^2.0.0", "lodash-es": "^4.17.21", - "moment-mini": "^2.24.0", "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.2", - "uuid": "^9.0.0" + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" } }, "micromatch": { @@ -14634,11 +14795,6 @@ } } }, - "moment-mini": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.29.4.tgz", - "integrity": "sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==" - }, "monaco-editor": { "version": "0.34.1", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.1.tgz", @@ -16340,6 +16496,11 @@ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==" + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -16674,6 +16835,11 @@ "graceful-fs": "^4.1.2" } }, + "web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index fc063d66dacb..c4457fe9708f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "less": "4.1.3", "less-loader": "11.1.0", "license-checker-webpack-plugin": "0.2.1", - "mermaid": "9.3.0", + "mermaid": "10.0.2", "mini-css-extract-plugin": "2.7.2", "monaco-editor": "0.34.1", "monaco-editor-webpack-plugin": "7.0.1", diff --git a/web_src/js/markup/mermaid.js b/web_src/js/markup/mermaid.js index 60f53d2b341d..b519e2dcdc35 100644 --- a/web_src/js/markup/mermaid.js +++ b/web_src/js/markup/mermaid.js @@ -37,14 +37,10 @@ export async function renderMermaid() { continue; } - let valid; try { - valid = mermaid.parse(source); + await mermaid.parse(source); } catch (err) { displayError(el, err); - } - - if (!valid) { el.closest('pre').classList.remove('is-loading'); continue; } @@ -52,22 +48,25 @@ export async function renderMermaid() { try { // can't use bindFunctions here because we can't cross the iframe boundary. This // means js-based interactions won't work but they aren't intended to work either - mermaid.mermaidAPI.render('mermaid', source, (svgStr) => { - const heightStr = (svgStr.match(/viewBox="(.+?)"/) || ['', ''])[1].split(/\s+/)[3]; - if (!heightStr) return displayError(el, new Error('Could not determine chart height')); - const iframe = document.createElement('iframe'); - iframe.classList.add('markup-render'); - iframe.sandbox = 'allow-scripts'; - iframe.style.height = `${Math.ceil(parseFloat(heightStr))}px`; - iframe.srcdoc = ` ${svgStr}`; - const mermaidBlock = document.createElement('div'); - mermaidBlock.classList.add('mermaid-block'); - mermaidBlock.append(iframe); - const btn = makeCodeCopyButton(); - btn.setAttribute('data-clipboard-text', source); - mermaidBlock.append(btn); - el.closest('pre').replaceWith(mermaidBlock); - }); + const {svg} = await mermaid.render('mermaid', source); + const heightStr = (svg.match(/viewBox="(.+?)"/) || ['', ''])[1].split(/\s+/)[3]; + if (!heightStr) return displayError(el, new Error('Could not determine chart height')); + + const iframe = document.createElement('iframe'); + iframe.classList.add('markup-render'); + iframe.sandbox = 'allow-scripts'; + iframe.style.height = `${Math.ceil(parseFloat(heightStr))}px`; + iframe.srcdoc = ` ${svg}`; + + const mermaidBlock = document.createElement('div'); + mermaidBlock.classList.add('mermaid-block'); + mermaidBlock.append(iframe); + + const btn = makeCodeCopyButton(); + btn.setAttribute('data-clipboard-text', source); + + mermaidBlock.append(btn); + el.closest('pre').replaceWith(mermaidBlock); } catch (err) { displayError(el, err); } diff --git a/webpack.config.js b/webpack.config.js index 2ac463abef2b..245791e7ea6e 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -234,7 +234,7 @@ export default { 'khroma@*': {licenseName: 'MIT'}, // https://github.com/fabiospampinato/khroma/pull/33 }, emitError: true, - allow: '(Apache-2.0 OR BSD-2-Clause OR BSD-3-Clause OR MIT OR ISC OR CPAL-1.0 OR Unlicense)', + allow: '(Apache-2.0 OR BSD-2-Clause OR BSD-3-Clause OR MIT OR ISC OR CPAL-1.0 OR Unlicense OR EPL-1.0 OR EPL-2.0)', ignore: [ 'font-awesome', ], From ca84a61761dc78fea7afe5a692deac7db5368dff Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Sat, 4 Mar 2023 14:41:37 +0900 Subject: [PATCH 13/28] Add run status in action view page (#23212) Before: ![image](https://user-images.githubusercontent.com/18380374/222084932-a7643fbe-2d9f-48db-b25d-74ace49e03f4.png) ![image](https://user-images.githubusercontent.com/18380374/222084887-fde3500d-dad3-4902-9c82-c4f71f23f83b.png) After: ![image](https://user-images.githubusercontent.com/18380374/222084565-eeef1110-9d9d-40b4-a26b-fbd5a307f14e.png) ![image](https://user-images.githubusercontent.com/18380374/222084728-6c96d7c1-a399-43d5-8369-392ad5017b7f.png) --------- Co-authored-by: techknowlogick --- routers/web/repo/actions/view.go | 2 ++ web_src/js/components/RepoActionView.vue | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go index dd2750f90588..5569709368ce 100644 --- a/routers/web/repo/actions/view.go +++ b/routers/web/repo/actions/view.go @@ -51,6 +51,7 @@ type ViewResponse struct { Run struct { Link string `json:"link"` Title string `json:"title"` + Status string `json:"status"` CanCancel bool `json:"canCancel"` CanApprove bool `json:"canApprove"` // the run needs an approval and the doer has permission to approve Done bool `json:"done"` @@ -111,6 +112,7 @@ func ViewPost(ctx *context_module.Context) { resp.State.Run.CanApprove = run.NeedApproval && ctx.Repo.CanWrite(unit.TypeActions) resp.State.Run.Done = run.Status.IsDone() resp.State.Run.Jobs = make([]*ViewJob, 0, len(jobs)) // marshal to '[]' instead fo 'null' in json + resp.State.Run.Status = run.Status.String() for _, v := range jobs { resp.State.Run.Jobs = append(resp.State.Run.Jobs, &ViewJob{ ID: v.ID, diff --git a/web_src/js/components/RepoActionView.vue b/web_src/js/components/RepoActionView.vue index 762067f52388..a5c12c754ece 100644 --- a/web_src/js/components/RepoActionView.vue +++ b/web_src/js/components/RepoActionView.vue @@ -2,7 +2,13 @@
    - {{ run.title }} + + + + +
    + {{ run.title }} +
    @@ -99,6 +105,7 @@ const sfc = { run: { link: '', title: '', + status: '', canCancel: false, canApprove: false, done: false, @@ -327,7 +334,11 @@ export function initRepositoryActionView() { .action-info-summary { font-size: 150%; height: 20px; - padding: 0 10px; + display: flex; + + .action-title { + padding: 0 5px; + } } // ================ From 47b912cd526207f831bff759b29a734049d1c8f2 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Sat, 4 Mar 2023 15:12:37 +0800 Subject: [PATCH 14/28] Avoid panic caused by broken payload when creating commit status (#23216) When creating commit status for Actons jobs, a payload with nil `HeadCommit` will cause panic. Reported at: https://gitea.com/gitea/act_runner/issues/28#issuecomment-732166 Although the `HeadCommit` probably can not be nil after #23215, `CreateCommitStatus` should protect itself, to avoid being broken in the future. In addition, it's enough to print error log instead of returning err when `CreateCommitStatus` failed. --------- Co-authored-by: delvh --- routers/api/actions/runner/runner.go | 2 +- routers/web/repo/actions/view.go | 22 +++++++++++++++------- services/actions/clear_tasks.go | 22 +++++++++++++++++----- services/actions/commit_status.go | 10 ++++++++++ services/actions/notifier_helper.go | 3 ++- 5 files changed, 45 insertions(+), 14 deletions(-) diff --git a/routers/api/actions/runner/runner.go b/routers/api/actions/runner/runner.go index 3299eaf1e41d..07657c91207e 100644 --- a/routers/api/actions/runner/runner.go +++ b/routers/api/actions/runner/runner.go @@ -150,7 +150,7 @@ func (s *Service) UpdateTask( } if err := actions_service.CreateCommitStatus(ctx, task.Job); err != nil { - log.Error("Update commit status failed: %v", err) + log.Error("Update commit status for job %v failed: %v", task.Job.ID, err) // go on } diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go index 5569709368ce..35b99d577d0a 100644 --- a/routers/web/repo/actions/view.go +++ b/routers/web/repo/actions/view.go @@ -15,6 +15,7 @@ import ( "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/modules/actions" context_module "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" @@ -214,15 +215,18 @@ func Rerun(ctx *context_module.Context) { job.Stopped = 0 if err := db.WithTx(ctx, func(ctx context.Context) error { - if _, err := actions_model.UpdateRunJob(ctx, job, builder.Eq{"status": status}, "task_id", "status", "started", "stopped"); err != nil { - return err - } - return actions_service.CreateCommitStatus(ctx, job) + _, err := actions_model.UpdateRunJob(ctx, job, builder.Eq{"status": status}, "task_id", "status", "started", "stopped") + return err }); err != nil { ctx.Error(http.StatusInternalServerError, err.Error()) return } + if err := actions_service.CreateCommitStatus(ctx, job); err != nil { + log.Error("Update commit status for job %v failed: %v", job.ID, err) + // go on + } + ctx.JSON(http.StatusOK, struct{}{}) } @@ -255,9 +259,6 @@ func Cancel(ctx *context_module.Context) { if err := actions_model.StopTask(ctx, job.TaskID, actions_model.StatusCancelled); err != nil { return err } - if err := actions_service.CreateCommitStatus(ctx, job); err != nil { - return err - } } return nil }); err != nil { @@ -265,6 +266,13 @@ func Cancel(ctx *context_module.Context) { return } + for _, job := range jobs { + if err := actions_service.CreateCommitStatus(ctx, job); err != nil { + log.Error("Update commit status for job %v failed: %v", job.ID, err) + // go on + } + } + ctx.JSON(http.StatusOK, struct{}{}) } diff --git a/services/actions/clear_tasks.go b/services/actions/clear_tasks.go index 583e588de405..6f8e95218d67 100644 --- a/services/actions/clear_tasks.go +++ b/services/actions/clear_tasks.go @@ -43,6 +43,7 @@ func stopTasks(ctx context.Context, opts actions_model.FindTaskOptions) error { return fmt.Errorf("find tasks: %w", err) } + jobs := make([]*actions_model.ActionRunJob, 0, len(tasks)) for _, task := range tasks { if err := db.WithTx(ctx, func(ctx context.Context) error { if err := actions_model.StopTask(ctx, task.ID, actions_model.StatusFailure); err != nil { @@ -51,7 +52,8 @@ func stopTasks(ctx context.Context, opts actions_model.FindTaskOptions) error { if err := task.LoadJob(ctx); err != nil { return err } - return CreateCommitStatus(ctx, task.Job) + jobs = append(jobs, task.Job) + return nil }); err != nil { log.Warn("Cannot stop task %v: %v", task.ID, err) // go on @@ -61,6 +63,14 @@ func stopTasks(ctx context.Context, opts actions_model.FindTaskOptions) error { remove() } } + + for _, job := range jobs { + if err := CreateCommitStatus(ctx, job); err != nil { + log.Error("Update commit status for job %v failed: %v", job.ID, err) + // go on + } + } + return nil } @@ -80,14 +90,16 @@ func CancelAbandonedJobs(ctx context.Context) error { job.Status = actions_model.StatusCancelled job.Stopped = now if err := db.WithTx(ctx, func(ctx context.Context) error { - if _, err := actions_model.UpdateRunJob(ctx, job, nil, "status", "stopped"); err != nil { - return err - } - return CreateCommitStatus(ctx, job) + _, err := actions_model.UpdateRunJob(ctx, job, nil, "status", "stopped") + return err }); err != nil { log.Warn("cancel abandoned job %v: %v", job.ID, err) // go on } + if err := CreateCommitStatus(ctx, job); err != nil { + log.Error("Update commit status for job %v failed: %v", job.ID, err) + // go on + } } return nil diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index efb5ec6d44a3..4f313493523e 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -30,6 +30,16 @@ func CreateCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er return fmt.Errorf("GetPushEventPayload: %w", err) } + // Since the payload comes from json data, we should check if it's broken, or it will cause panic + switch { + case payload.Repo == nil: + return fmt.Errorf("repo is missing in event payload") + case payload.Pusher == nil: + return fmt.Errorf("pusher is missing in event payload") + case payload.HeadCommit == nil: + return fmt.Errorf("head commit is missing in event payload") + } + creator, err := user_model.GetUserByID(ctx, payload.Pusher.ID) if err != nil { return fmt.Errorf("GetUserByID: %w", err) diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index ef63b8cf9464..574a37e9ab16 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -187,7 +187,8 @@ func notify(ctx context.Context, input *notifyInput) error { } else { for _, job := range jobs { if err := CreateCommitStatus(ctx, job); err != nil { - log.Error("CreateCommitStatus: %v", err) + log.Error("Update commit status for job %v failed: %v", job.ID, err) + // go on } } } From 188c8c12c290e131fb342e3203634828652b0af5 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sat, 4 Mar 2023 15:13:37 +0800 Subject: [PATCH 15/28] Make Ctrl+Enter submit a pending comment (starting review) instead of submitting a single comment (#23245) Close #23241 Before: press Ctrl+Enter in the Code Review Form, a single comment will be added. After: press Ctrl+Enter in the Code Review Form, start the review with pending comments. The old name `is_review` is not clear, so the new code use `pending_review` as the new name. Co-authored-by: delvh Co-authored-by: techknowlogick --- routers/api/v1/repo/pull_review.go | 4 ++-- routers/web/repo/pull_review.go | 2 +- services/forms/repo_form.go | 2 +- services/mailer/incoming/incoming_handler.go | 2 +- services/pull/review.go | 8 ++++---- templates/repo/diff/comment_form.tmpl | 13 ++++--------- web_src/js/features/repo-diff.js | 14 ++++++++++---- web_src/js/features/repo-issue.js | 2 +- web_src/less/_repository.less | 6 +----- 9 files changed, 25 insertions(+), 28 deletions(-) diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go index f6acaa780a02..8f4b9dafec67 100644 --- a/routers/api/v1/repo/pull_review.go +++ b/routers/api/v1/repo/pull_review.go @@ -268,7 +268,7 @@ func DeletePullReview(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } -// CreatePullReview create a review to an pull request +// CreatePullReview create a review to a pull request func CreatePullReview(ctx *context.APIContext) { // swagger:operation POST /repos/{owner}/{repo}/pulls/{index}/reviews repository repoCreatePullReview // --- @@ -360,7 +360,7 @@ func CreatePullReview(ctx *context.APIContext) { line, c.Body, c.Path, - true, // is review + true, // pending review 0, // no reply opts.CommitID, ); err != nil { diff --git a/routers/web/repo/pull_review.go b/routers/web/repo/pull_review.go index d43a786c5668..90cfd5bfcdb3 100644 --- a/routers/web/repo/pull_review.go +++ b/routers/web/repo/pull_review.go @@ -77,7 +77,7 @@ func CreateCodeComment(ctx *context.Context) { signedLine, form.Content, form.TreePath, - form.IsReview, + !form.SingleReview, form.Reply, form.LatestCommitID, ) diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go index e9645b5ab737..3bd073c070d3 100644 --- a/services/forms/repo_form.go +++ b/services/forms/repo_form.go @@ -622,7 +622,7 @@ type CodeCommentForm struct { Side string `binding:"Required;In(previous,proposed)"` Line int64 TreePath string `form:"path" binding:"Required"` - IsReview bool `form:"is_review"` + SingleReview bool `form:"single_review"` Reply int64 `form:"reply"` LatestCommitID string } diff --git a/services/mailer/incoming/incoming_handler.go b/services/mailer/incoming/incoming_handler.go index d89a5eab3d1b..454039c60fb5 100644 --- a/services/mailer/incoming/incoming_handler.go +++ b/services/mailer/incoming/incoming_handler.go @@ -127,7 +127,7 @@ func (h *ReplyHandler) Handle(ctx context.Context, content *MailContent, doer *u comment.Line, content.Content, comment.TreePath, - false, + false, // not pending review but a single review comment.ReviewID, "", ) diff --git a/services/pull/review.go b/services/pull/review.go index ca386ca6b027..ba93b5e2f540 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -71,7 +71,7 @@ func InvalidateCodeComments(ctx context.Context, prs issues_model.PullRequestLis } // CreateCodeComment creates a comment on the code line -func CreateCodeComment(ctx context.Context, doer *user_model.User, gitRepo *git.Repository, issue *issues_model.Issue, line int64, content, treePath string, isReview bool, replyReviewID int64, latestCommitID string) (*issues_model.Comment, error) { +func CreateCodeComment(ctx context.Context, doer *user_model.User, gitRepo *git.Repository, issue *issues_model.Issue, line int64, content, treePath string, pendingReview bool, replyReviewID int64, latestCommitID string) (*issues_model.Comment, error) { var ( existsReview bool err error @@ -82,7 +82,7 @@ func CreateCodeComment(ctx context.Context, doer *user_model.User, gitRepo *git. // - Comments that are part of a review // - Comments that reply to an existing review - if !isReview && replyReviewID != 0 { + if !pendingReview && replyReviewID != 0 { // It's not part of a review; maybe a reply to a review comment or a single comment. // Check if there are reviews for that line already; if there are, this is a reply if existsReview, err = issues_model.ReviewExists(issue, treePath, line); err != nil { @@ -91,7 +91,7 @@ func CreateCodeComment(ctx context.Context, doer *user_model.User, gitRepo *git. } // Comments that are replies don't require a review header to show up in the issue view - if !isReview && existsReview { + if !pendingReview && existsReview { if err = issue.LoadRepo(ctx); err != nil { return nil, err } @@ -149,7 +149,7 @@ func CreateCodeComment(ctx context.Context, doer *user_model.User, gitRepo *git. return nil, err } - if !isReview && !existsReview { + if !pendingReview && !existsReview { // Submit the review we've just created so the comment shows up in the issue view if _, _, err = SubmitReview(ctx, doer, gitRepo, issue, issues_model.ReviewTypeComment, "", latestCommitID, nil); err != nil { return nil, err diff --git a/templates/repo/diff/comment_form.tmpl b/templates/repo/diff/comment_form.tmpl index 407f84e5c900..225e40f7f01d 100644 --- a/templates/repo/diff/comment_form.tmpl +++ b/templates/repo/diff/comment_form.tmpl @@ -1,5 +1,5 @@ {{if and $.root.SignedUserID (not $.Repository.IsArchived)}} -
    + {{$.root.CsrfTokenHtml}} @@ -29,15 +29,10 @@ {{else}} {{if $.root.CurrentReview}} - {{/* if there is only one "Add comment" button, the quick-submit should submit the form with is_review=true even if the "Add comment" button is not really clicked */}} - - + {{else}} - - + + {{end}} {{end}} {{if or (not $.HasComments) $.hidden}} diff --git a/web_src/js/features/repo-diff.js b/web_src/js/features/repo-diff.js index d2559b123707..56ebe4fc991e 100644 --- a/web_src/js/features/repo-diff.js +++ b/web_src/js/features/repo-diff.js @@ -11,10 +11,8 @@ export function initRepoDiffReviewButton() { const $reviewBox = $('#review-box'); const $counter = $reviewBox.find('.review-comments-counter'); - $(document).on('click', 'button[name="is_review"]', (e) => { + $(document).on('click', 'button[name="pending_review"]', (e) => { const $form = $(e.target).closest('form'); - $form.append(''); - // Watch for the form's submit event. $form.on('submit', () => { const num = parseInt($counter.attr('data-pending-comment-number')) + 1 || 1; @@ -50,7 +48,15 @@ export function initRepoDiffConversationForm() { return; } - const formDataString = String(new URLSearchParams(new FormData($form[0]))); + const formData = new FormData($form[0]); + + // if the form is submitted by a button, append the button's name and value to the form data + const submitter = e.originalEvent?.submitter; + const isSubmittedByButton = (submitter?.nodeName === 'BUTTON') || (submitter?.nodeName === 'INPUT' && submitter.type === 'submit'); + if (isSubmittedByButton && submitter.name) { + formData.append(submitter.name, submitter.value); + } + const formDataString = String(new URLSearchParams(formData)); const $newConversationHolder = $(await $.post($form.attr('action'), formDataString)); const {path, side, idx} = $newConversationHolder.data(); diff --git a/web_src/js/features/repo-issue.js b/web_src/js/features/repo-issue.js index 4163fb120e52..41c9dd118f2f 100644 --- a/web_src/js/features/repo-issue.js +++ b/web_src/js/features/repo-issue.js @@ -535,7 +535,7 @@ export function initRepoPullRequestReview() { const td = ntr.find(`.add-comment-${side}`); let commentCloud = td.find('.comment-code-cloud'); - if (commentCloud.length === 0 && !ntr.find('button[name="is_review"]').length) { + if (commentCloud.length === 0 && !ntr.find('button[name="pending_review"]').length) { const data = await $.get($(this).closest('[data-new-comment-url]').data('new-comment-url')); td.html(data); commentCloud = td.find('.comment-code-cloud'); diff --git a/web_src/less/_repository.less b/web_src/less/_repository.less index abbacfb53246..9eaa8644f141 100644 --- a/web_src/less/_repository.less +++ b/web_src/less/_repository.less @@ -963,10 +963,6 @@ } } - .comment-form-reply .footer { - padding-bottom: 1em; - } - @media @mediaSm { .ui.segments { margin-left: -2rem; @@ -3282,7 +3278,7 @@ td.blob-excerpt { position: sticky; top: 77px; z-index: 7; - + @media (max-width: 480px) { position: static; } From 547c173dabb10ec973ce9af24243072466960d6e Mon Sep 17 00:00:00 2001 From: Sandeep Bhat Date: Sat, 4 Mar 2023 19:01:24 +0530 Subject: [PATCH 16/28] Support sanitising the URL by removing extra slashes in the URL (#21333) Changes in this PR : Strips incoming request URL of additional slashes (/). For example an input like `https://git.data.coop//halfd/new-website.git` is translated to `https://git.data.coop/halfd/new-website.git` Fixes https://github.com/go-gitea/gitea/issues/20462 Fix #23242 --------- Co-authored-by: zeripath Co-authored-by: Jason Song Co-authored-by: Lunny Xiao --- routers/common/middleware.go | 35 +++++++++++++++- routers/common/middleware_test.go | 70 +++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 routers/common/middleware_test.go diff --git a/routers/common/middleware.go b/routers/common/middleware.go index 4f9d43c36218..2abdcb583d8f 100644 --- a/routers/common/middleware.go +++ b/routers/common/middleware.go @@ -16,7 +16,7 @@ import ( "code.gitea.io/gitea/modules/web/routing" "github.com/chi-middleware/proxy" - "github.com/go-chi/chi/v5/middleware" + chi "github.com/go-chi/chi/v5" ) // Middlewares returns common middlewares @@ -48,7 +48,8 @@ func Middlewares() []func(http.Handler) http.Handler { handlers = append(handlers, proxy.ForwardedHeaders(opt)) } - handlers = append(handlers, middleware.StripSlashes) + // Strip slashes. + handlers = append(handlers, stripSlashesMiddleware) if !setting.Log.DisableRouterLog { handlers = append(handlers, routing.NewLoggerHandler()) @@ -81,3 +82,33 @@ func Middlewares() []func(http.Handler) http.Handler { }) return handlers } + +func stripSlashesMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { + var urlPath string + rctx := chi.RouteContext(req.Context()) + if rctx != nil && rctx.RoutePath != "" { + urlPath = rctx.RoutePath + } else if req.URL.RawPath != "" { + urlPath = req.URL.RawPath + } else { + urlPath = req.URL.Path + } + + sanitizedPath := &strings.Builder{} + prevWasSlash := false + for _, chr := range strings.TrimRight(urlPath, "/") { + if chr != '/' || !prevWasSlash { + sanitizedPath.WriteRune(chr) + } + prevWasSlash = chr == '/' + } + + if rctx == nil { + req.URL.Path = sanitizedPath.String() + } else { + rctx.RoutePath = sanitizedPath.String() + } + next.ServeHTTP(resp, req) + }) +} diff --git a/routers/common/middleware_test.go b/routers/common/middleware_test.go new file mode 100644 index 000000000000..f16b9374eca7 --- /dev/null +++ b/routers/common/middleware_test.go @@ -0,0 +1,70 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT +package common + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestStripSlashesMiddleware(t *testing.T) { + type test struct { + name string + expectedPath string + inputPath string + } + + tests := []test{ + { + name: "path with multiple slashes", + inputPath: "https://github.com///go-gitea//gitea.git", + expectedPath: "/go-gitea/gitea.git", + }, + { + name: "path with no slashes", + inputPath: "https://github.com/go-gitea/gitea.git", + expectedPath: "/go-gitea/gitea.git", + }, + { + name: "path with slashes in the middle", + inputPath: "https://git.data.coop//halfd/new-website.git", + expectedPath: "/halfd/new-website.git", + }, + { + name: "path with slashes in the middle", + inputPath: "https://git.data.coop//halfd/new-website.git", + expectedPath: "/halfd/new-website.git", + }, + { + name: "path with slashes in the end", + inputPath: "/user2//repo1/", + expectedPath: "/user2/repo1", + }, + { + name: "path with slashes and query params", + inputPath: "/repo//migrate?service_type=3", + expectedPath: "/repo/migrate", + }, + { + name: "path with encoded slash", + inputPath: "/user2/%2F%2Frepo1", + expectedPath: "/user2/%2F%2Frepo1", + }, + } + + for _, tt := range tests { + testMiddleware := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, tt.expectedPath, r.URL.Path) + }) + + // pass the test middleware to validate the changes + handlerToTest := stripSlashesMiddleware(testMiddleware) + // create a mock request to use + req := httptest.NewRequest("GET", tt.inputPath, nil) + // call the handler using a mock response recorder + handlerToTest.ServeHTTP(httptest.NewRecorder(), req) + } +} From b6d2c94966d9911dbc967e0080e07929b179128e Mon Sep 17 00:00:00 2001 From: silverwind Date: Sat, 4 Mar 2023 15:29:28 +0100 Subject: [PATCH 17/28] Improve sed detection in update-locales.sh (#23254) - ~~Make scripts work from any directory~~ - Detect sed version just like Makefile does --------- Co-authored-by: Lunny Xiao Co-authored-by: wxiaoguang Co-authored-by: John Olheiser --- build/update-locales.sh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/build/update-locales.sh b/build/update-locales.sh index b7611c0c9a74..596ddfec032b 100755 --- a/build/update-locales.sh +++ b/build/update-locales.sh @@ -1,13 +1,14 @@ -#!/bin/bash +#!/bin/sh -set -e - -SED=sed +# this script runs in alpine image which only has `sh` shell -if [[ $OSTYPE == 'darwin'* ]]; then - # for macOS developers, use "brew install gnu-sed" - SED=gsed +set +e +if sed --version 2>/dev/null | grep -q GNU; then + SED_INPLACE="sed -i" +else + SED_INPLACE="sed -i ''" fi +set -e if [ ! -f ./options/locale/locale_en-US.ini ]; then echo "please run this script in the root directory of the project" @@ -32,7 +33,7 @@ mv ./options/locale/locale_en-US.ini ./options/ # * remove the trailing quote # * unescape the quotes # * eg: key="...\"..." => key=..."... -$SED -i -r -e '/^[-.A-Za-z0-9_]+[ ]*=[ ]*".*"$/ { +$SED_INPLACE -r -e '/^[-.A-Za-z0-9_]+[ ]*=[ ]*".*"$/ { s/^([-.A-Za-z0-9_]+)[ ]*=[ ]*"/\1=/ s/"$// s/\\"/"/g @@ -41,8 +42,8 @@ $SED -i -r -e '/^[-.A-Za-z0-9_]+[ ]*=[ ]*".*"$/ { # * if the escaped line is incomplete like `key="...` or `key=..."`, quote it with backticks # * eg: key="... => key=`"...` # * eg: key=..." => key=`..."` -$SED -i -r -e 's/^([-.A-Za-z0-9_]+)[ ]*=[ ]*(".*[^"])$/\1=`\2`/' ./options/locale/*.ini -$SED -i -r -e 's/^([-.A-Za-z0-9_]+)[ ]*=[ ]*([^"].*")$/\1=`\2`/' ./options/locale/*.ini +$SED_INPLACE -r -e 's/^([-.A-Za-z0-9_]+)[ ]*=[ ]*(".*[^"])$/\1=`\2`/' ./options/locale/*.ini +$SED_INPLACE -r -e 's/^([-.A-Za-z0-9_]+)[ ]*=[ ]*([^"].*")$/\1=`\2`/' ./options/locale/*.ini # Remove translation under 25% of en_us baselines=$(wc -l "./options/locale_en-US.ini" | cut -d" " -f1) From 68645839570d37e8b172b25c3249d80e0a4678bd Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Sun, 5 Mar 2023 04:23:51 +0900 Subject: [PATCH 18/28] Add default owner team to privated_org and limited_org in unit test (#23109) Related to https://github.com/go-gitea/gitea/pull/22705 's CI result [here](https://drone.gitea.io/go-gitea/gitea/68043/2/16) > IsOrganizationOwner() [E] [63f61849-7] Organization does not have owner team: 23 --- models/fixtures/team.yml | 22 ++++++++++++++++++++++ models/fixtures/user.yml | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/models/fixtures/team.yml b/models/fixtures/team.yml index dd434d78a980..be988b8fce12 100644 --- a/models/fixtures/team.yml +++ b/models/fixtures/team.yml @@ -151,3 +151,25 @@ num_members: 1 includes_all_repositories: false can_create_org_repo: true + +- + id: 15 + org_id: 22 + lower_name: owners + name: Owners + authorize: 4 # owner + num_repos: 0 + num_members: 0 + includes_all_repositories: false + can_create_org_repo: true + +- + id: 16 + org_id: 23 + lower_name: owners + name: Owners + authorize: 4 # owner + num_repos: 0 + num_members: 0 + includes_all_repositories: false + can_create_org_repo: true \ No newline at end of file diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index b1c7fc003067..c6081f07d06b 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -807,7 +807,7 @@ num_following: 0 num_stars: 0 num_repos: 2 - num_teams: 0 + num_teams: 1 num_members: 0 visibility: 1 repo_admin_change_team_access: false @@ -844,7 +844,7 @@ num_following: 0 num_stars: 0 num_repos: 2 - num_teams: 0 + num_teams: 1 num_members: 0 visibility: 2 repo_admin_change_team_access: false From 8d6e9bc819bc83c345dfbbe67db4fe34e8449680 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 5 Mar 2023 05:34:02 +0800 Subject: [PATCH 19/28] Re-add accidentally removed `hacking-on-gitea.zh-cn.md` (#23297) #21627 accidentally removed the docs file `hacking-on-gitea.zh-cn.md`. This re-adds it and merges some changes from #23289 --- .../doc/developers/hacking-on-gitea.zh-cn.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 docs/content/doc/developers/hacking-on-gitea.zh-cn.md diff --git a/docs/content/doc/developers/hacking-on-gitea.zh-cn.md b/docs/content/doc/developers/hacking-on-gitea.zh-cn.md new file mode 100644 index 000000000000..3e8cd3ec573a --- /dev/null +++ b/docs/content/doc/developers/hacking-on-gitea.zh-cn.md @@ -0,0 +1,43 @@ +--- +date: "2016-12-01T16:00:00+02:00" +title: "加入 Gitea 开源" +slug: "hacking-on-gitea" +weight: 10 +toc: false +draft: false +menu: + sidebar: + parent: "developers" + name: "加入 Gitea 开源" + weight: 10 + identifier: "hacking-on-gitea" +--- + +# Hacking on Gitea + +首先你需要一些运行环境,这和 [从源代码安装]({{< relref "doc/installation/from-source.zh-cn.md" >}}) 相同,如果你还没有设置好,可以先阅读那个章节。 + +如果你想为 Gitea 贡献代码,你需要 Fork 这个项目并且以 `master` 为开发分支。Gitea 使用 Govendor +来管理依赖,因此所有依赖项都被工具自动 copy 在 vendor 子目录下。用下面的命令来下载源码: + +``` +go get -d code.gitea.io/gitea +``` + +然后你可以在 Github 上 fork [Gitea 项目](https://github.com/go-gitea/gitea),之后可以通过下面的命令进入源码目录: + +``` +cd $GOPATH/src/code.gitea.io/gitea +``` + +要创建 pull requests 你还需要在源码中新增一个 remote 指向你 Fork 的地址,直接推送到 origin 的话会告诉你没有写权限: + +``` +git remote rename origin upstream +git remote add origin git@github.com:/gitea.git +git fetch --all --prune +``` + +然后你就可以开始开发了。你可以看一下 `Makefile` 的内容。`make test` 可以运行测试程序, `make build` 将生成一个 `gitea` 可运行文件在根目录。如果你的提交比较复杂,尽量多写一些单元测试代码。 + +好了,到这里你已经设置好了所有的开发 Gitea 所需的环境。欢迎成为 Gitea 的 Contributor。 From 390d270064f431882e2cac738d7c4fdbe9555f90 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 5 Mar 2023 00:15:41 +0000 Subject: [PATCH 20/28] [skip ci] Updated translations via Crowdin --- options/locale/locale_cs-CZ.ini | 9 ++++--- options/locale/locale_de-DE.ini | 13 ++++----- options/locale/locale_el-GR.ini | 19 ++++++------- options/locale/locale_es-ES.ini | 17 ++++++------ options/locale/locale_fa-IR.ini | 11 ++++---- options/locale/locale_fi-FI.ini | 4 +-- options/locale/locale_fr-FR.ini | 41 ++++++++++++++-------------- options/locale/locale_hu-HU.ini | 7 ++--- options/locale/locale_id-ID.ini | 6 ++--- options/locale/locale_is-IS.ini | 2 +- options/locale/locale_it-IT.ini | 21 ++++++++------- options/locale/locale_ja-JP.ini | 47 +++++++++++++++++++++++++++++---- options/locale/locale_lv-LV.ini | 27 ++++++++++--------- options/locale/locale_nl-NL.ini | 11 ++++---- options/locale/locale_pl-PL.ini | 21 ++++++++------- options/locale/locale_pt-BR.ini | 23 ++++++++++------ options/locale/locale_pt-PT.ini | 19 ++++++------- options/locale/locale_ru-RU.ini | 21 ++++++++------- options/locale/locale_si-LK.ini | 3 ++- options/locale/locale_sk-SK.ini | 8 +++--- options/locale/locale_sv-SE.ini | 1 + options/locale/locale_tr-TR.ini | 13 ++++----- options/locale/locale_uk-UA.ini | 21 ++++++++------- options/locale/locale_zh-CN.ini | 18 ++++++------- options/locale/locale_zh-TW.ini | 1 + 25 files changed, 223 insertions(+), 161 deletions(-) diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 78fa7ec2cf0b..3c8d1a79fd8c 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -41,7 +41,7 @@ webauthn_use_twofa=Použít dvoufaktorový kód z vašeho telefonu webauthn_error=Nepodařilo se přečíst váš zabezpečovací klíč. webauthn_unsupported_browser=Váš prohlížeč momentálně nepodporuje WebAuthn. webauthn_error_unknown=Došlo k neznámé chybě. Opakujte akci. -webauthn_error_insecure=WebAuthn podporuje pouze zabezpečená připojení. Pro testování přes HTTP můžete použít výchozí "localhost" nebo "127.0.0.1" +webauthn_error_insecure=`WebAuthn podporuje pouze zabezpečená připojení. Pro testování přes HTTP můžete použít výchozí "localhost" nebo "127.0.0.1"` webauthn_error_unable_to_process=Server nemohl zpracovat váš požadavek. webauthn_error_duplicated=Zabezpečovací klíč není pro tento požadavek povolen. Prosím ujistěte se, zda klíč není již registrován. webauthn_error_empty=Musíte nastavit název tohoto klíče. @@ -225,7 +225,7 @@ invalid_db_setting=Nastavení databáze je neplatné: %v invalid_db_table=Databázová tabulka „%s“ je neplatná: %v invalid_repo_path=Kořenový adresář repozitářů není správný: %v invalid_app_data_path=Cesta k datům aplikace je neplatná: %v -run_user_not_match="Run as\" uživatelské jméno není aktuální uživatelské jméno: %s -> %s +run_user_not_match=`"Run as\" uživatelské jméno není aktuální uživatelské jméno: %s -> %s` internal_token_failed=Nepodařilo se vytvořit interní token: %v secret_key_failed=Nepodařilo se vytvořit tajný klíč: %v save_config_failed=Uložení konfigurace se nezdařilo: %v @@ -291,7 +291,7 @@ code_no_results=Nebyl nalezen žádný zdrojový kód odpovídající hledanému code_search_results=Výsledky hledání pro „%s“ code_last_indexed_at=Naposledy indexováno %s relevant_repositories_tooltip=Repozitáře, které jsou rozštěpení nebo nemají žádné téma, ikonu a žádný popis jsou skryty. -relevant_repositories=Zobrazují se pouze relevantní repositáře, %[2]s do %[4]s %[6]s` +issues.force_push_compare=Porovnat issues.due_date_form=rrrr-mm-dd issues.due_date_form_add=Přidat termín dokončení issues.due_date_form_edit=Upravit diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 7d844192b4db..1586fa2f02c3 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -254,7 +254,7 @@ view_home=%s ansehen search_repos=Finde ein Repository… filter=Andere Filter filter_by_team_repositories=Nach Team-Repositorys filtern -feed_of=Feed von "%s" +feed_of=`Feed von "%s"` show_archived=Archiviert show_both_archived_unarchived=Archivierte und nicht archivierte anzeigen @@ -348,11 +348,11 @@ authorize_application=Anwendung autorisieren authorize_redirect_notice=Du wirst zu %s weitergeleitet, wenn du diese Anwendung autorisierst. authorize_application_created_by=Diese Anwendung wurde von %s erstellt. authorize_application_description=Wenn du diese Anwendung autorisierst, wird sie die Berechtigung erhalten, alle Informationen zu deinem Account zu bearbeiten oder zu lesen. Dies beinhaltet auch private Repositorys und Organisationen. -authorize_title="%s\" den Zugriff auf deinen Account gestatten? +authorize_title=`"%s\" den Zugriff auf deinen Account gestatten?` authorization_failed=Autorisierung fehlgeschlagen authorization_failed_desc=Die Autorisierung ist fehlgeschlagen, da wir eine ungültige Anfrage festgestellt haben. Bitte kontaktiere den Betreiber der Anwendung, die du gerade autorisieren wolltest. sspi_auth_failed=SSPI Authentifizierung fehlgeschlagen -password_pwned=Das von dir gewählte Passwort ist auf einer %[2]s zu %[4]s force-gepusht` +issues.force_push_compare=Vergleichen issues.due_date_form=JJJJ-MM-TT issues.due_date_form_add=Fälligkeitsdatum hinzufügen issues.due_date_form_edit=Bearbeiten @@ -1849,7 +1850,7 @@ settings.transfer_notices_2=– Du wirst weiterhin Zugriff haben, wenn der neue settings.transfer_notices_3=- Wenn das Repository privat ist und an einen einzelnen Benutzer übertragen wird, wird sichergestellt, dass der Benutzer mindestens Leserechte hat (und die Berechtigungen werden gegebenenfalls ändert). settings.transfer_owner=Neuer Besitzer settings.transfer_perform=Übertragung durchführen -settings.transfer_started=Für dieses Repository wurde eine Übertragung eingeleitet und wartet nun auf die Bestätigung von "%s" +settings.transfer_started=`Für dieses Repository wurde eine Übertragung eingeleitet und wartet nun auf die Bestätigung von "%s"` settings.transfer_succeed=Das Repository wurde transferiert. settings.signing_settings=Signaturüberprüfungseinstellungen settings.trust_model=Signaturvertrauensmodell @@ -2704,7 +2705,7 @@ auths.tip.openid_connect=Benutze die OpenID-Connect-Discovery-URL (/.wel auths.tip.twitter=Gehe auf https://dev.twitter.com/apps, erstelle eine Anwendung und stelle sicher, dass die Option „Allow this application to be used to Sign in with Twitter“ aktiviert ist auths.tip.discord=Erstelle unter https://discordapp.com/developers/applications/me eine neue Anwendung. auths.tip.gitea=Registriere eine neue OAuth2-Anwendung. Eine Anleitung findest du unter https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=Erstelle eine neue Anwendung auf https://oauth.yandex.com/client/new. Wähle folgende Berechtigungen aus dem "Yandex.Passport API" Bereich: "Zugriff auf E-Mail-Adresse", "Zugriff auf Benutzeravatar" und "Zugriff auf Benutzername, Vor- und Nachname, Geschlecht" +auths.tip.yandex=`Erstelle eine neue Anwendung auf https://oauth.yandex.com/client/new. Wähle folgende Berechtigungen aus dem "Yandex.Passport API" Bereich: "Zugriff auf E-Mail-Adresse", "Zugriff auf Benutzeravatar" und "Zugriff auf Benutzername, Vor- und Nachname, Geschlecht"` auths.tip.mastodon=Gebe eine benutzerdefinierte URL für die Mastodon-Instanz ein, mit der du dich authentifizieren möchtest (oder benutze die standardmäßige) auths.edit=Authentifikationsquelle bearbeiten auths.activated=Diese Authentifikationsquelle ist aktiviert diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 4c393d31334d..88e0a6d88292 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -41,7 +41,7 @@ webauthn_use_twofa=Χρησιμοποιήστε έναν κωδικό δύο π webauthn_error=Αδύνατη η ανάγνωση του κλειδιού ασφαλείας. webauthn_unsupported_browser=Το πρόγραμμα περιήγησής σας δεν υποστηρίζει επί του παρόντος WebAuthn. webauthn_error_unknown=Παρουσιάστηκε ένα άγνωστο σφάλμα. Παρακαλώ προσπαθήστε ξανά. -webauthn_error_insecure=Το WebAuthn υποστηρίζει μόνο ασφαλείς συνδέσεις. Για δοκιμές πάνω από HTTP, μπορείτε να χρησιμοποιήσετε την προέλευση "localhost" ή "127.0.0.1" +webauthn_error_insecure=`Το WebAuthn υποστηρίζει μόνο ασφαλείς συνδέσεις. Για δοκιμές πάνω από HTTP, μπορείτε να χρησιμοποιήσετε την προέλευση "localhost" ή "127.0.0.1"` webauthn_error_unable_to_process=Ο διακομιστής δεν μπόρεσε να επεξεργαστεί το αίτημά σας. webauthn_error_duplicated=Το κλειδί ασφαλείας δεν επιτρέπεται για αυτό το αίτημα. Βεβαιωθείτε ότι το κλειδί δεν έχει ήδη καταχωρηθεί. webauthn_error_empty=Πρέπει να ορίσετε ένα όνομα για αυτό το κλειδί. @@ -256,7 +256,7 @@ view_home=Προβολή %s search_repos=Βρείτε ένα αποθετήριο… filter=Άλλα Φίλτρα filter_by_team_repositories=Φιλτράρισμα ανά αποθετήρια ομάδας -feed_of=Τροφοδοσία του "%s" +feed_of=`Τροφοδοσία του "%s"` show_archived=Αρχειοθετήθηκε show_both_archived_unarchived=Εμφάνιση και αρχειοθετημένων και μη αρχειοθετημένων @@ -413,7 +413,7 @@ release.download.zip=Πηγαίος Κώδικας (Zip) release.download.targz=Πηγαίος Κώδικας (TAR.GZ) repo.transfer.subject_to=%s θα ήθελε να μεταφέρει το "%s" σε %s -repo.transfer.subject_to_you=%s θα ήθελε να σας μεταφέρει το "%s" +repo.transfer.subject_to_you=`%s θα ήθελε να σας μεταφέρει το "%s"` repo.transfer.to_you=εσάς repo.transfer.body=Για να το αποδεχτείτε ή να το απορρίψετε, επισκεφθείτε το %s ή απλά αγνοήστε το. @@ -915,9 +915,9 @@ delete_preexisting_success=Διαγράφηκαν τα μη υιοθετημέν blame_prior=Προβολή ευθύνης πριν από αυτή την αλλαγή transfer.accept=Αποδοχή Μεταφοράς -transfer.accept_desc=Μεταφορά στο "%s" +transfer.accept_desc=`Μεταφορά στο "%s"` transfer.reject=Απόρριψη Μεταφοράς -transfer.reject_desc=Ακύρωση μεταφοράς σε "%s" +transfer.reject_desc=`Ακύρωση μεταφοράς σε "%s"` transfer.no_permission_to_accept=Δεν έχετε άδεια για να Αποδεχτείτε transfer.no_permission_to_reject=Δεν έχετε δικαιώματα να κάνετε Απόρριψη @@ -1431,6 +1431,7 @@ issues.error_removing_due_date=Αποτυχία κατάργησης της ημ issues.push_commit_1=πρόσθεσε %d υποβολή %s issues.push_commits_n=πρόσθεσε %d υποβολές %s issues.force_push_codes=`force-pushed %[1]s από το %[2]s στο %[4]s %[6]s` +issues.force_push_compare=Σύγκριση issues.due_date_form=εεεε-μμ-ηη issues.due_date_form_add=Προσθήκη ημερομηνίας παράδοσης issues.due_date_form_edit=Επεξεργασία @@ -1874,7 +1875,7 @@ settings.transfer_notices_2=- Θα διατηρήσετε την πρόσβασ settings.transfer_notices_3=- Εάν το αποθετήριο είναι ιδιωτικό και μεταβιβάζεται σε μεμονωμένο χρήστη, αυτή η ενέργεια εξασφαλίζει ότι ο χρήστης έχει τουλάχιστον άδεια ανάγνωσης (και αλλάζει τα δικαιώματα εάν είναι απαραίτητο). settings.transfer_owner=Νέος Ιδιοκτήτης settings.transfer_perform=Εκτέλεση Μεταφοράς -settings.transfer_started=Αυτό το αποθετήριο έχει επισημανθεί για μεταφορά και αναμένει επιβεβαίωση από το "%s" +settings.transfer_started=`Αυτό το αποθετήριο έχει επισημανθεί για μεταφορά και αναμένει επιβεβαίωση από το "%s"` settings.transfer_succeed=Το αποθετήριο έχει μεταφερθεί. settings.signing_settings=Ρυθμίσεις Επαλήθευσης Υπογραφής settings.trust_model=Μοντέλο Εμπιστοσύνης Υπογραφής @@ -2722,9 +2723,9 @@ auths.tips.oauth2.general=Ταυτοποίηση OAuth2 auths.tips.oauth2.general.tip=Κατά την εγγραφή νέας ταυτοποίησης τύπου OAuth2, το URL κλήσης/ανακατεύθυνσης πρέπει να είναι: /user/oauth2//callback auths.tip.oauth2_provider=Πάροχος OAuth2 auths.tip.bitbucket=Καταχωρήστε ένα νέο καταναλωτή OAuth στο https://bitbucket.org/account/user//oauth-consumers/new και προσθέστε το δικαίωμα 'Account' - 'Read' -auths.tip.nextcloud=Καταχωρήστε ένα νέο καταναλωτή OAuth στην υπηρεσία σας χρησιμοποιώντας το παρακάτω μενού "Settings -> Security -> OAuth 2.0 client" +auths.tip.nextcloud=`Καταχωρήστε ένα νέο καταναλωτή OAuth στην υπηρεσία σας χρησιμοποιώντας το παρακάτω μενού "Settings -> Security -> OAuth 2.0 client"` auths.tip.dropbox=Δημιουργήστε μια νέα εφαρμογή στο https://www.dropbox.com/developers/apps -auths.tip.facebook=Καταχωρήστε μια νέα εφαρμογή στο https://developers.facebook.com/apps και προσθέστε το προϊόν "Facebook Login" +auths.tip.facebook=`Καταχωρήστε μια νέα εφαρμογή στο https://developers.facebook.com/apps και προσθέστε το προϊόν "Facebook Login"` auths.tip.github=Καταχωρήστε μια νέα εφαρμογή OAuth στο https://github.com/settings/applications/new auths.tip.gitlab=Καταχωρήστε μια νέα εφαρμογή στο https://gitlab.com/profile/applications auths.tip.google_plus=Αποκτήστε τα διαπιστευτήρια πελάτη OAuth2 από την κονσόλα API της Google στο https://console.developers.google.com/ @@ -2732,7 +2733,7 @@ auths.tip.openid_connect=Χρησιμοποιήστε το OpenID Connect Discov auths.tip.twitter=Πηγαίνετε στο https://dev.twitter.com/apps, δημιουργήστε μια εφαρμογή και βεβαιωθείτε ότι η επιλογή “Allow this application to be used to Sign in with Twitter” είναι ενεργοποιημένη auths.tip.discord=Καταχωρήστε μια νέα εφαρμογή στο https://discordapp.com/developers/applications/me auths.tip.gitea=Καταχωρήστε μια νέα εφαρμογή OAuth2. Ο οδηγός μπορεί να βρεθεί στο https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=Δημιουργήστε μια νέα εφαρμογή στο https://oauth.yandex.com/client/new. Επιλέξτε τα ακόλουθα δικαιώματα από την ενότητα "Yandex.Passport API": "Access to email address", "Access to user avatar" και "Access to username, first name and surname, gender" +auths.tip.yandex=`Δημιουργήστε μια νέα εφαρμογή στο https://oauth.yandex.com/client/new. Επιλέξτε τα ακόλουθα δικαιώματα από την ενότητα "Yandex.Passport API": "Access to email address", "Access to user avatar" και "Access to username, first name and surname, gender"` auths.tip.mastodon=Εισαγάγετε ένα προσαρμομένο URL για την υπηρεσία mastodon με την οποία θέλετε να πιστοποιήσετε (ή να χρησιμοποιήσετε την προεπιλεγμένη) auths.edit=Επεξεργασία Πηγής Ταυτοποίησης auths.activated=Αυτή η Πηγή Ταυτοποίησης είναι Ενεργοποιημένη diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 21a5327621b1..cd560c18c093 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -41,7 +41,7 @@ webauthn_use_twofa=Utilice un código de doble factor desde su teléfono móvil webauthn_error=No se pudo leer su llave de seguridad. webauthn_unsupported_browser=Su navegador no soporta actualmente WebAuthn. webauthn_error_unknown=Ha ocurrido un error desconocido. Por favor, inténtelo de nuevo. -webauthn_error_insecure=WebAuthn sólo soporta conexiones seguras. Para probar sobre HTTP, puede utilizar el origen "localhost" o "127.0.0.1" +webauthn_error_insecure=`WebAuthn sólo soporta conexiones seguras. Para probar sobre HTTP, puede utilizar el origen "localhost" o "127.0.0.1"` webauthn_error_unable_to_process=El servidor no pudo procesar su solicitud. webauthn_error_duplicated=La clave de seguridad no está permitida para esta solicitud. Por favor, asegúrese de que la clave no está ya registrada. webauthn_error_empty=Debe establecer un nombre para esta clave. @@ -256,7 +256,7 @@ view_home=Ver %s search_repos=Buscar un repositorio… filter=Otros filtros filter_by_team_repositories=Filtrar por repositorios de equipo -feed_of=Suministro de noticias de "%s" +feed_of=`Suministro de noticias de "%s"` show_archived=Archivado show_both_archived_unarchived=Mostrar respositorios archivados y desarchivados @@ -914,9 +914,9 @@ delete_preexisting_success=Eliminó archivos no adoptados en %s blame_prior=Ver la culpa antes de este cambio transfer.accept=Aceptar transferencia -transfer.accept_desc=Transferir a "%s" +transfer.accept_desc=`Transferir a "%s"` transfer.reject=Rechazar transferencia -transfer.reject_desc=Cancelar transferencia a "%s" +transfer.reject_desc=`Cancelar transferencia a "%s"` transfer.no_permission_to_accept=No tiene permiso para aceptar transfer.no_permission_to_reject=No tienes permiso para rechazar @@ -1430,6 +1430,7 @@ issues.error_removing_due_date=Fallo al eliminar la fecha de vencimiento. issues.push_commit_1=añadido %d commit %s issues.push_commits_n=añadido %d commits %s issues.force_push_codes=`hizo push forzado %[1]s de %[2]s a %[4]s %[6]s` +issues.force_push_compare=Comparar issues.due_date_form=aaaa-mm-dd issues.due_date_form_add=Añadir fecha de vencimiento issues.due_date_form_edit=Editar @@ -1873,7 +1874,7 @@ settings.transfer_notices_2=- Mantendrá el acceso al repositorio si lo transfie settings.transfer_notices_3=- Si el repositorio es privado y se transfiere a un usuario individual, esta acción se asegura de que el usuario tenga al menos permisos de lectura (y cambie los permisos si es necesario). settings.transfer_owner=Nuevo Propietario settings.transfer_perform=Realizar transferencia -settings.transfer_started=Este repositorio ha sido marcado para transferencia y espera confirmación de "%s" +settings.transfer_started=`Este repositorio ha sido marcado para transferencia y espera confirmación de "%s"` settings.transfer_succeed=El repositorio ha sido transferido. settings.signing_settings=Configuración de verificación de firmas settings.trust_model=Modelo de confianza de firma @@ -2721,9 +2722,9 @@ auths.tips.oauth2.general=Autenticación OAuth2 auths.tips.oauth2.general.tip=Al registrar una nueva autenticación vía OAuth2, la URL de devolución/redirección debe ser: /user/oauth2//callback auths.tip.oauth2_provider=Proveedor OAuth2 auths.tip.bitbucket=Registrar un nuevo usuario de OAuth en https://bitbucket.org/account/user//oauth-consumers/new y agregar el permiso 'Cuenta' - 'Lectura' -auths.tip.nextcloud=Registre un nuevo consumidor OAuth en su instancia usando el siguiente menú "Configuración-> Seguridad-> cliente OAuth 2.0" +auths.tip.nextcloud=`Registre un nuevo consumidor OAuth en su instancia usando el siguiente menú "Configuración-> Seguridad-> cliente OAuth 2.0"` auths.tip.dropbox=Crear nueva aplicación en https://www.dropbox.com/developers/apps -auths.tip.facebook=Registre una nueva aplicación en https://developers.facebook.com/apps y agregue el producto "Facebook Login" +auths.tip.facebook=`Registre una nueva aplicación en https://developers.facebook.com/apps y agregue el producto "Facebook Login"` auths.tip.github=Registre una nueva aplicación OAuth en https://github.com/settings/applications/new auths.tip.gitlab=Registrar nueva solicitud en https://gitlab.com/profile/applications auths.tip.google_plus=Obtener credenciales de cliente OAuth2 desde la consola API de Google en https://console.developers.google.com/ @@ -2731,7 +2732,7 @@ auths.tip.openid_connect=Use el OpenID Connect Discovery URL (/.well-kno auths.tip.twitter=Ir a https://dev.twitter.com/apps, crear una aplicación y asegurarse de que la opción "Permitir que esta aplicación sea usada para iniciar sesión con Twitter" está activada auths.tip.discord=Registrar una nueva aplicación en https://discordapp.com/developers/applications/me auths.tip.gitea=Registra una nueva aplicación OAuth2. La guía puede ser encontrada en https://docs.gitea.io/es-us/oauth2-provider/ -auths.tip.yandex=Crear una nueva aplicación en https://oauth.yandex.com/client/new. Seleccione los siguientes permisos del "Yandex.Passport API": "Access to email address", "Access to user avatar" y "Access to username, first name and surname, gender" +auths.tip.yandex=`Crear una nueva aplicación en https://oauth.yandex.com/client/new. Seleccione los siguientes permisos del "Yandex.Passport API": "Access to email address", "Access to user avatar" y "Access to username, first name and surname, gender"` auths.tip.mastodon=Introduzca una URL de instancia personalizada para la instancia mastodon con la que desea autenticarse (o utilice la predeterminada) auths.edit=Editar origen de autenticación auths.activated=Este origen de autenticación ha sido activado diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index 00daf9eded0f..0b29e5e9b36b 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -233,7 +233,7 @@ view_home=نمایش %s search_repos=یافتن مخزن… filter=فیلترهای دیگر filter_by_team_repositories=فیلتر کردن با مخازن تیم‌ها -feed_of=خوراک از "%s" +feed_of=`خوراک از "%s"` show_archived=بایگانی شده show_both_archived_unarchived=نمایش دادن موارد بایگانی شده و غیر بایگانی نشده @@ -596,7 +596,7 @@ add_key=افزودن کلید ssh_desc=این کلیدهای عمومی SSH با حساب شما در ارتباط هستند. کلیدهای خصوصی مربوطه اجازه دسترسی کامل به مخازن شما را می دهند. principal_desc=این گواهی‌های SSH اصلی برای حساب کاربری شما تعریف شده و به مخزن‌های‌تان دسترسی کامل دارد. gpg_desc=این کلید های عمومی GPG به حساب کاربری شما مرتبط مرتبط است. کلید خصوصی خود را محرمانه نگهدارید لذا با آن امکان ارسال commit تایید شده است. -ssh_helper="آیا نمی دانید چگونه؟ +ssh_helper=`"آیا نمی دانید چگونه؟` راهنمایی Github را برای ساخت کلید SSH برای خود ببینید یا ممکن است با راه حل استفاده از SSH در مشکلات متداول مواجه شوید." gpg_helper=به کمک نیاز دارید؟ نگاهی به در GitHub را راهنمای مورد GPG است. @@ -1052,7 +1052,7 @@ commits.commits=کامیت‌ها commits.no_commits=هیچ کامیت مشترکی وجود ندارد. '%s' و '%s' دارای تاریجچه متفاوت هستند. commits.nothing_to_compare=این شاخه ها برابرند. commits.search=جست‌وجو کامیت‌ها… -commits.search.tooltip=شما میتوانید از کلمات کلیدی پیشوند "author:", "committer:", "after:", or "before:" و ... استفاده کنید به عنوان مثال: "revert author:Ali before:1397-04-01.." +commits.search.tooltip=`شما میتوانید از کلمات کلیدی پیشوند "author:", "committer:", "after:", or "before:" و ... استفاده کنید به عنوان مثال: "revert author:Ali before:1397-04-01.."` commits.find=جستجو commits.search_all=همه شاخه ها commits.author=مولف @@ -1311,6 +1311,7 @@ issues.error_removing_due_date=حذف موعد مقرر با شکست مواجه issues.push_commit_1=%d اعمال تغییر اضافه شده است %s issues.push_commits_n=%d اعمال تغییرات اضافه شده است %s issues.force_push_codes=`پوش شده اجباری %[1]s از %[2]s به %[4]s %[6]s` +issues.force_push_compare=مقایسه issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=افزودن موعد مقرر issues.due_date_form_edit=ویرایش @@ -2491,7 +2492,7 @@ auths.tip.oauth2_provider=تامین کننده OAuth2 auths.tip.bitbucket=ثبت یک OAuth جدید مصرف کننده بر https://bitbucket.org/account/user//oauth-consumers/new و افزودن مجوز 'Account' - 'Read' auths.tip.nextcloud=با استفاده از منوی زیر "تنظیمات -> امنیت -> مشتری OAuth 2.0" مصرف کننده OAuth جدیدی را در نمونه خود ثبت کنید auths.tip.dropbox=یک برنامه جدید در https://www.dropbox.com/developers/apps بسازید -auths.tip.facebook=یک برنامه جدید در https://developers.facebook.com/apps بسازید برای ورود از طریق فیس بوک قسمت محصولات "Facebook Login" +auths.tip.facebook=`یک برنامه جدید در https://developers.facebook.com/apps بسازید برای ورود از طریق فیس بوک قسمت محصولات "Facebook Login"` auths.tip.github=یک برنامه OAuth جدید در https://github.com/settings/applications/new ثبت کنید auths.tip.gitlab=ثبت یک برنامه جدید در https://gitlab.com/profile/applications auths.tip.google_plus=اطلاعات مربوط به مشتری OAuth2 را از کلاینت API Google در https://console.developers.google.com/ @@ -2499,7 +2500,7 @@ auths.tip.openid_connect=برای مشخص کردن نقاط پایانی از auths.tip.twitter=به https://dev.twitter.com/apps بروید ، برنامه ای ایجاد کنید و اطمینان حاصل کنید که گزینه "اجازه استفاده از این برنامه برای ورود به سیستم با Twitter" را فعال کنید auths.tip.discord=یک برنامه جدید را در https://discordapp.com/developers/applications/me ثبت کنید auths.tip.gitea=یک برنامه OAuth2 ثبت کنید. راهنمایی بیشتر https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=یک برنامه جدید در https://oauth.yandex.com/client/new ایجاد کنید. مجوزهای زیر را از بخش "Yandex.Passport API" انتخاب کنید: "دسترسی به آدرس ایمیل"، "دسترسی به آواتار کاربر" و "دسترسی به نام کاربری، نام و نام خانوادگی، جنسیت" +auths.tip.yandex=`یک برنامه جدید در https://oauth.yandex.com/client/new ایجاد کنید. مجوزهای زیر را از بخش "Yandex.Passport API" انتخاب کنید: "دسترسی به آدرس ایمیل"، "دسترسی به آواتار کاربر" و "دسترسی به نام کاربری، نام و نام خانوادگی، جنسیت"` auths.tip.mastodon=یک URL نمونه سفارشی برای نمونه ماستودون که می خواهید با آن احراز هویت کنید وارد کنید (یا از یک پیش فرض استفاده کنید) auths.edit=ویرایش منبع احراز هویت auths.activated=این منبع احراز هویت فعال شده است diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 3eb9eabb7c87..9c7df1891664 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -40,7 +40,7 @@ webauthn_use_twofa=Käytä kaksivaihesta vahvistusta puhelimestasi webauthn_error=Turva-avainta ei voitu lukea. webauthn_unsupported_browser=Selaimesi ei tällä hetkellä tue WebAuthnia. webauthn_error_unknown=Tuntematon virhe. Yritä uudelleen. -webauthn_error_insecure=WebAuthn tukee vain suojattuja yhteyksiä. Testaukseen HTTP:n yli, voit käyttää osoitetta "localhost" tai "127.0.0.1" +webauthn_error_insecure=`WebAuthn tukee vain suojattuja yhteyksiä. Testaukseen HTTP:n yli, voit käyttää osoitetta "localhost" tai "127.0.0.1"` webauthn_error_unable_to_process=Palvelin ei pystynyt toteuttamaan kutsua. webauthn_error_duplicated=Turva-avainta ei ole sallittu tässä pyynnössä. Varmista, ettei avainta ole jo rekisteröity. webauthn_error_empty=Sinun täytyy asettaa nimi tälle avaimelle. @@ -243,7 +243,7 @@ view_home=Näytä %s search_repos=Etsi repo… filter=Muut suodattimet filter_by_team_repositories=Suodata tiimin repojen mukaan -feed_of=Syöte "%s" +feed_of=`Syöte "%s"` show_archived=Arkistoidut show_both_archived_unarchived=Näytetään arkistoidut ja arkistoimattomat diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index c2658472e478..e8718f21a983 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -41,7 +41,7 @@ webauthn_use_twofa=Utilisez l'authentification à deux facteurs avec votre tél webauthn_error=Impossible de lire votre clé de sécurité. webauthn_unsupported_browser=Votre navigateur ne prend actuellement pas en charge WebAuthn. webauthn_error_unknown=Une erreur indéterminée s'est produite. Veuillez réessayer. -webauthn_error_insecure=WebAuthn ne prend en charge que les connexions sécurisées. Pour les tests via HTTP, vous pouvez utiliser l'origine "localhost" ou "127.0.0.1" +webauthn_error_insecure=`WebAuthn ne prend en charge que les connexions sécurisées. Pour les tests via HTTP, vous pouvez utiliser l'origine "localhost" ou "127.0.0.1"` webauthn_error_unable_to_process=Le serveur n'a pas pu traiter votre demande. webauthn_error_duplicated=La clé de sécurité n'est pas autorisée pour cette demande. Veuillez vous assurer que la clé n'est pas déjà enregistrée. webauthn_error_empty=Vous devez définir un nom pour cette clé. @@ -284,7 +284,7 @@ repo_no_results=Aucun dépôt correspondant n'a été trouvé. user_no_results=Aucun utilisateur correspondant n'a été trouvé. org_no_results=Aucune organisation correspondante n'a été trouvée. code_no_results=Aucun code source correspondant à votre terme de recherche n'a été trouvé. -code_search_results=Résultats de recherche pour "%s" +code_search_results=`Résultats de recherche pour "%s"` code_last_indexed_at=Dernière indexation %s relevant_repositories_tooltip=Les dépôts qui sont des forks ou qui n'ont aucun sujet, aucune icône et aucune description sont cachés. relevant_repositories=Seuls les dépôts pertinents sont affichés, afficher les résultats non filtrés. @@ -411,7 +411,7 @@ release.download.zip=Code source (ZIP) release.download.targz=Code source (TAR.GZ) repo.transfer.subject_to=%s aimerait transférer "%s" à %s -repo.transfer.subject_to_you=%s aimerait vous transférer "%s" +repo.transfer.subject_to_you=`%s aimerait vous transférer "%s"` repo.transfer.to_you=vous repo.transfer.body=Pour l'accepter ou le rejeter, visitez %s ou ignorez-le. @@ -527,7 +527,7 @@ user_bio=Biographie disabled_public_activity=Cet utilisateur a désactivé la visibilité publique de l'activité. form.name_reserved=Le nom d’utilisateur "%s" est réservé. -form.name_pattern_not_allowed="%s\" n'est pas autorisé dans un nom d'utilisateur. +form.name_pattern_not_allowed=`"%s\" n'est pas autorisé dans un nom d'utilisateur.` form.name_chars_not_allowed=Le nom d'utilisateur '%s' contient des caractères non valides. [settings] @@ -648,7 +648,7 @@ add_key=Ajouter une clé ssh_desc=Ces clefs SSH publiques sont associées à votre compte. Les clefs privées correspondantes permettent l'accès complet à vos dépôts. principal_desc=Ces principaux certificats SSH sont associés à votre compte et permettent un accès complet à vos dépôts. gpg_desc=Ces clefs GPG sont associées avec votre compte. Conservez-les en lieu sûr car elles permettent la vérification de vos révisions. -ssh_helper=Besoin d'aide ? Consultez le guide Github pour %[2]s vers %[4]s %[6]s` +issues.force_push_compare=Comparer issues.due_date_form=aaaa-mm-jj issues.due_date_form_add=Ajouter une échéance issues.due_date_form_edit=Éditer @@ -1698,7 +1699,7 @@ settings.transfer_notices_2=- Vous conserverez l'accès à ce dépôt si vous le settings.transfer_notices_3=- Si le dépôt est privé et est transféré à un utilisateur individuel, cette action s'assure que l'utilisateur a au moins la permission de lire (et modifie les permissions si nécessaire). settings.transfer_owner=Nouveau propriétaire settings.transfer_perform=Effectuer le transfert -settings.transfer_started=Ce dépôt a été marqué pour le transfert et attend la confirmation de "%s" +settings.transfer_started=`Ce dépôt a été marqué pour le transfert et attend la confirmation de "%s"` settings.transfer_succeed=Le dépôt a été transféré. settings.signing_settings=Paramètres de vérification de la signature settings.trust_model=Modèle de confiance de la signature @@ -1848,7 +1849,7 @@ settings.protected_branch=Protection de branche settings.protected_branch_can_push=Autoriser la poussée ? settings.protected_branch_can_push_yes=Vous pouvez pousser settings.protected_branch_can_push_no=Vous ne pouvez pas pousser -settings.branch_protection=Protection de la branche "%s" +settings.branch_protection=`Protection de la branche "%s"` settings.protect_this_branch=Protection de la branche settings.protect_this_branch_desc=Empêche les suppressions et limite les poussées et fusions sur cette branche. settings.protect_disable_push=Désactiver le push @@ -2088,7 +2089,7 @@ team_unit_desc=Permettre l’accès aux Sections du dépôt team_unit_disabled=(Désactivé) form.name_reserved=Le nom d'organisation "%s" est réservé. -form.name_pattern_not_allowed="%s\" n'est pas autorisé dans un nom d'organisation. +form.name_pattern_not_allowed=`"%s\" n'est pas autorisé dans un nom d'organisation.` form.create_org_not_allowed=Vous n'êtes pas autorisé à créer une organisation. settings=Paramètres @@ -2329,7 +2330,7 @@ packages.published=Publiés systemhooks=Rappels système -systemhooks.desc=Les Webhooks font automatiquement des requêtes HTTP POST à un serveur lorsque certains événements Gitea se déclenchent. Les Webhooks définis ici agiront sur tous les dépots du système, donc veuillez prendre en compte les implications en termes de performances que cela peut avoir. Lire la suite dans le /user/oauth2 //callback auths.tip.oauth2_provider=Fournisseur OAuth2 -auths.tip.bitbucket=Créez un nouveau jeton OAuth sur https://bitbucket.org/account/user//oauth-consumers/new et ajoutez la permission "Compte"-"Lecture" -auths.tip.nextcloud=Enregistrez un nouveau consommateur OAuth sur votre instance en utilisant le menu "Paramètres -> Sécurité -> Client OAuth 2.0" +auths.tip.bitbucket=`Créez un nouveau jeton OAuth sur https://bitbucket.org/account/user//oauth-consumers/new et ajoutez la permission "Compte"-"Lecture"` +auths.tip.nextcloud=`Enregistrez un nouveau consommateur OAuth sur votre instance en utilisant le menu "Paramètres -> Sécurité -> Client OAuth 2.0"` auths.tip.dropbox=Créez une nouvelle application sur https://www.dropbox.com/developers/apps -auths.tip.facebook=Enregistrez une nouvelle application sur https://developers.facebook.com/apps et ajoutez le produit "Facebook Login" +auths.tip.facebook=`Enregistrez une nouvelle application sur https://developers.facebook.com/apps et ajoutez le produit "Facebook Login"` auths.tip.github=Créez une nouvelle application OAuth sur https://github.com/settings/applications/new auths.tip.gitlab=Créez une nouvelle application sur https://gitlab.com/profile/applications auths.tip.google_plus=Obtenez des identifiants OAuth2 sur la console API de Google (https://console.developers.google.com/) @@ -2659,7 +2660,7 @@ auths.tip.openid_connect=Utilisez l'URL de découvert OpenID (/.well-kno auths.tip.twitter=Rendez-vous sur https://dev.twitter.com/apps, créez une application et assurez-vous que l'option "Autoriser l'application à être utilisée avec Twitter Connect" est activée auths.tip.discord=Enregistrer une nouvelle application sur https://discordapp.com/developers/applications/me auths.tip.gitea=Enregistrez une nouvelle application OAuth2. Un guide peut être trouvé sur https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=Créez une nouvelle application sur https://oauth.yandex.com/client/new. Sélectionnez les autorisations suivantes dans la section "Yandex API passport" : "Accès à l'adresse e-mail", "Accès à l'avatar de l'utilisateur" et "Accès au nom d'utilisateur, prénom et prénom, genre" +auths.tip.yandex=`Créez une nouvelle application sur https://oauth.yandex.com/client/new. Sélectionnez les autorisations suivantes dans la section "Yandex API passport" : "Accès à l'adresse e-mail", "Accès à l'avatar de l'utilisateur" et "Accès au nom d'utilisateur, prénom et prénom, genre"` auths.tip.mastodon=Entrez une URL d'instance personnalisée pour l'instance mastodon avec laquelle vous voulez vous authentifier (ou utiliser celle par défaut) auths.edit=Mettre à jour la source d'authentification auths.activated=Cette source d'authentification est activée @@ -2789,9 +2790,9 @@ config.git_max_diff_files=Nombre max de fichiers de Diff (à afficher) config.git_gc_args=Arguments de GC config.git_migrate_timeout=Délai imparti pour une migration config.git_mirror_timeout=Délai imparti pour mettre à jour le miroir -config.git_clone_timeout=Délai imparti pour l'opération "Clone" -config.git_pull_timeout=Délai imparti pour l'opération "Pull" -config.git_gc_timeout=Délai imparti pour l'opération "GC" +config.git_clone_timeout=`Délai imparti pour l'opération "Clone"` +config.git_pull_timeout=`Délai imparti pour l'opération "Pull"` +config.git_gc_timeout=`Délai imparti pour l'opération "GC"` config.log_config=Configuration du journal config.log_mode=Mode du journal diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index d55336267779..562e87eedffc 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -222,7 +222,7 @@ repo_no_results=Nincs ilyen tároló. user_no_results=Nincs ilyen felhasználó. org_no_results=Nincs ilyen szervezet. code_no_results=Nincs találat a keresési kifejezésedre. -code_search_results=Keresési találatok "%s" +code_search_results=`Keresési találatok "%s"` code_last_indexed_at=Utoljára indexelve: %s @@ -946,6 +946,7 @@ issues.due_date=Határidő issues.invalid_due_date_format=A határidőt 'éééé-hh-nn' formátumban kell megadni. issues.error_modifying_due_date=Határidő módosítása sikertelen. issues.error_removing_due_date=Határidő eltávolítása sikertelen. +issues.force_push_compare=Összehasonlítás issues.due_date_form=éééé-hh-nn issues.due_date_form_add=Határidő hozzáadása issues.due_date_form_edit=Szerkesztés @@ -1116,7 +1117,7 @@ activity.git_stats_deletion_n=%d törlés search=Keresés search.search_repo=Tároló keresés -search.results="%s\" találatok keresése itt: %s +search.results=`"%s\" találatok keresése itt: %s` settings=Beállítások settings.desc=A beállítások menüpontban állítható a tároló paraméterei @@ -1564,7 +1565,7 @@ auths.tips=Tippek auths.tips.oauth2.general=OAuth2 hitelesítés auths.tips.oauth2.general.tip=Amikor egy új OAuth2 hitelesítési módot hoz létre, a visszahívási/átirányítási URL-nek így kell kinéznie: /user/oauth2//callback auths.tip.oauth2_provider=OAuth2 szolgáltató -auths.tip.bitbucket=Igényeljen egy új OAuth jogosultságot itt: https://bitbucket.org/account/user//oauth-consumers/new és adja hozzá jogosultságot a " +auths.tip.bitbucket=`Igényeljen egy új OAuth jogosultságot itt: https://bitbucket.org/account/user//oauth-consumers/new és adja hozzá jogosultságot a "` search.code_no_results=Nincs találat a keresési kifejezésedre. settings=Beállítások diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 915e46c7239a..eb6a38afcdf8 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -91,12 +91,12 @@ platform_desc=Gitea bisa digunakan di mana code.gitea.io/gitea! Mari bergabung dengan berkontribusi untuk membuat proyek ini lebih baik. Jangan malu untuk menjadi kontributor! +license_desc=`"Go get\" (Dapatkan kode sumber dari) code.gitea.io/gitea! Mari bergabung dengan berkontribusi untuk membuat proyek ini lebih baik. Jangan malu untuk menjadi kontributor!` [install] install=Pemasangan title=Konfigurasi Awal -docker_helper=Jika Anda menjalankan Gitea di dalam Docker, baca /user/oauth2//callback auths.tip.oauth2_provider=Penyediaan OAuth2 auths.tip.dropbox=Membuat aplikasi baru di https://www.dropbox.com/developers/apps -auths.tip.facebook=Daftarkan sebuah aplikasi baru di https://developers.facebook.com/apps dan tambakan produk "Facebook Masuk" +auths.tip.facebook=`Daftarkan sebuah aplikasi baru di https://developers.facebook.com/apps dan tambakan produk "Facebook Masuk"` auths.tip.github=Mendaftar aplikasi OAuth baru di https://github.com/settings/applications/new auths.tip.gitlab=Mendaftar aplikasi baru di https://gitlab.com/profile/applications auths.tip.openid_connect=Gunakan membuka ID yang terhubung ke jelajah URL (/.well-known/openid-configuration) untuk menentukan titik akhir diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index df303242edc4..40915596adf1 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -1259,7 +1259,7 @@ auths.oauth2_icon_url=Táknmyndarvefslóð auths.oauth2_profileURL=Notandasíðuslóð auths.tips=Ábendingar auths.tip.dropbox=Búðu til nýtt forrit á https://www.dropbox.com/developers/apps -auths.tip.yandex=Búðu til nýja umsókn á https://oauth.yandex.com/client/new. Veldu eftirfarandi heimildir úr „Yandex.Passport API“ kaflanum: "Aðgangur að netfangi", "Aðgangur að notandamynd" og "Aðgangur að notendanafni, fornafni og eftirnafni, kyni" +auths.tip.yandex=`Búðu til nýja umsókn á https://oauth.yandex.com/client/new. Veldu eftirfarandi heimildir úr „Yandex.Passport API“ kaflanum: "Aðgangur að netfangi", "Aðgangur að notandamynd" og "Aðgangur að notendanafni, fornafni og eftirnafni, kyni"` config.app_name=Heiti Vefsvæðis config.app_ver=Útgáfu Gitea diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 59930fff8d38..b3520b17790d 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -41,7 +41,7 @@ webauthn_use_twofa=Usa un codice a due fattori dal tuo telefono webauthn_error=Impossibile leggere la tua chiave di sicurezza. webauthn_unsupported_browser=Il tuo browser al momento non supporta WebAuthn. webauthn_error_unknown=Si è verificato un errore sconosciuto. Riprova. -webauthn_error_insecure=WebAuthn supporta solo connessioni sicure. Per il test su HTTP, è possibile utilizzare l'origine "localhost" o "127.0.0.1" +webauthn_error_insecure=`WebAuthn supporta solo connessioni sicure. Per il test su HTTP, è possibile utilizzare l'origine "localhost" o "127.0.0.1"` webauthn_error_unable_to_process=Il server non può elaborare la richiesta. webauthn_error_duplicated=La chiave di sicurezza non è consentita per questa richiesta. Assicurati che la chiave non sia già registrata. webauthn_error_empty=Devi impostare un nome per questa chiave. @@ -254,7 +254,7 @@ view_home=Vedi %s search_repos=Trova un repository… filter=Altro filtri filter_by_team_repositories=Filtra per repository del team -feed_of=Feed di "%s" +feed_of=`Feed di "%s"` show_archived=Archiviato show_both_archived_unarchived=Mostra sia gli archiviati che i non archiviati @@ -901,9 +901,9 @@ delete_preexisting_success=Eliminato file non adottati in %s blame_prior=Visualizza la colpa prima di questa modifica transfer.accept=Accetta trasferimento -transfer.accept_desc=Trasferisci a "%s" +transfer.accept_desc=`Trasferisci a "%s"` transfer.reject=Rifiuta trasferimento -transfer.reject_desc=Annulla il trasferimento a "%s" +transfer.reject_desc=`Annulla il trasferimento a "%s"` transfer.no_permission_to_accept=Non hai i permessi per accettare transfer.no_permission_to_reject=Non hai i permessi per rifiutare @@ -1415,6 +1415,7 @@ issues.error_removing_due_date=Impossibile rimuovere la data di scadenza. issues.push_commit_1=aggiunto %d commit %s issues.push_commits_n=aggiunto %d commit %s issues.force_push_codes=`force-pushed %[1]s from %[2]s to %[4]s %[6]s` +issues.force_push_compare=Confronta issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=Aggiungi data di scadenza issues.due_date_form_edit=Modifica @@ -1855,7 +1856,7 @@ settings.transfer_notices_2=-Si manterrà l'accesso al repository se si trasferi settings.transfer_notices_3=- Se il repository è privato e viene trasferito a un singolo utente, questa azione si assicura che l'utente abbia almeno i permessi di lettura (e le modifiche se necessario). settings.transfer_owner=Nuovo Proprietario settings.transfer_perform=Esegui trasferimento -settings.transfer_started=Questo repository è stato contrassegnato per il trasferimento e attende conferma da "%s" +settings.transfer_started=`Questo repository è stato contrassegnato per il trasferimento e attende conferma da "%s"` settings.transfer_succeed=Il repository è stato trasferito. settings.signing_settings=Impostazioni Verifica Firma settings.trust_model=Modello di Fiducia per la Firma @@ -2690,15 +2691,15 @@ auths.sspi_default_language=Lingua predefinita dell'utente auths.sspi_default_language_helper=Lingua predefinita per gli utenti creati automaticamente dal metodo di autenticazione SSPI. Lascia vuoto se preferisci che la lingua venga rilevata automaticamente. auths.tips=Consigli auths.tips.oauth2.general=Autenticazione OAuth2 -auths.tips.oauth2.general.tip="Quando si registra una nuova autenticazione OAuth2, l'URL di callback/reindirizzamento deve essere:/user/oauth2//callback +auths.tips.oauth2.general.tip=`"Quando si registra una nuova autenticazione OAuth2, l'URL di callback/reindirizzamento deve essere:/user/oauth2//callback` auths.tip.oauth2_provider=OAuth2 Provider auths.tip.bitbucket=Registra un nuovo cliente OAuth su https://bitbucket.org/account/user//oauth-consumers/new e aggiungi il permesso 'Account' - 'Read' -auths.tip.nextcloud=Registra un nuovo OAuth sulla tua istanza utilizzando il seguente menu " +auths.tip.nextcloud=`Registra un nuovo OAuth sulla tua istanza utilizzando il seguente menu "` auths.tip.oauth2_provider=OAuth2 Provider auths.tip.bitbucket=Registra un nuovo cliente OAuth su https://bitbucket.org/account/user//oauth-consumers/new e aggiungi il permesso 'Account' - 'Read' -auths.tip.nextcloud=Registra un nuovo OAuth sulla tua istanza utilizzando il seguente menu "Impostazioni -> Sicurezza -> OAuth 2.0 client" +auths.tip.nextcloud=`Registra un nuovo OAuth sulla tua istanza utilizzando il seguente menu "Impostazioni -> Sicurezza -> OAuth 2.0 client"` auths.tip.dropbox=Crea una nuova applicazione su https://www.dropbox.com/developers/apps -auths.tip.facebook=Registra una nuova applicazione su https://developers.facebook.com/apps e aggiungi il prodotto "Facebook Login" +auths.tip.facebook=`Registra una nuova applicazione su https://developers.facebook.com/apps e aggiungi il prodotto "Facebook Login"` auths.tip.github=Registra una nuova applicazione OAuth su https://github.com/settings/applications/new auths.tip.gitlab=Registra una nuova applicazione su https://gitlab.com/profile/applications auths.tip.google_plus=Ottieni le credenziali del client OAuth2 dalla console API di Google su https://console.developers.google.com/ @@ -2706,7 +2707,7 @@ auths.tip.openid_connect=Utilizza l'OpenID Connect Discovery URL (/.well auths.tip.twitter=Vai su https://dev.twitter.com/apps, crea una applicazione e assicurati che l'opzione "Allow this application to be used to Sign In with Twitter" sia abilitata auths.tip.discord=Registra una nuova applicazione su https://discordapp.com/developers/applications/me auths.tip.gitea=Registra una nuova applicazione OAuth2. La guida può essere trovata a https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=Crea una nuova applicazione su https://oauth.yandex.com/client/new. Seleziona i seguenti permessi da "Yandex. assport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender" +auths.tip.yandex=`Crea una nuova applicazione su https://oauth.yandex.com/client/new. Seleziona i seguenti permessi da "Yandex. assport API": "Access to email address", "Access to user avatar" e "Access to username, name and surname, gender"` auths.tip.mastodon=Inserisci un URL di istanza personalizzato per l'istanza mastodon con cui vuoi autenticarti (o usa quella predefinita) auths.edit=Modifica fonte di autenticazione auths.activated=Questa fonte di autenticazione è attiva diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index b06c8ecc71f9..49745fc779c5 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -476,6 +476,8 @@ url_error=`'%s' は有効なURLではありません。` include_error=`は文字列 '%s' を含んでいる必要があります。` glob_pattern_error=`のglobパターンが不正です: %s.` regex_pattern_error=`の正規表現パターンが不正です: %s.` +username_error=`は、英数字('0-9','a-z','A-Z')、ダッシュ('-')、アンダースコア('_')、ドット('.')だけを含めることができます。 先頭と末尾は英数字以外の文字にはできません。 また、連続した英数字以外の文字も許されません。` +invalid_group_team_map_error=`のマッピングが無効です: %s` unknown_error=不明なエラー: captcha_incorrect=CAPTCHAコードが正しくありません。 password_not_match=パスワードが一致しません。 @@ -512,6 +514,7 @@ team_not_exist=チームが存在していません。 last_org_owner='Owners'チームから最後のユーザーを削除することはできません。ひとつの組織には少なくとも一人のオーナーが必要です。 cannot_add_org_to_team=組織はチームメンバーとして追加できません。 duplicate_invite_to_team=指定したユーザーはすでにチームメンバーに招待されています。 +organization_leave_success=あなたは組織 %s から脱退しました。 invalid_ssh_key=SSHキーが確認できません: %s invalid_gpg_key=GPGキーが確認できません: %s @@ -1169,7 +1172,7 @@ commits.commits=コミット commits.no_commits=共通のコミットはありません。 '%s' と '%s' の履歴はすべて異なっています。 commits.nothing_to_compare=二つのブランチは同じ内容です。 commits.search=コミットの検索… -commits.search.tooltip=キーワード "author:"、"committer:"、"after:"、"before:" を付けて指定できます。 例 "revert author:Alice before:2019-04-01" +commits.search.tooltip=`キーワード "author:"、"committer:"、"after:"、"before:" を付けて指定できます。 例 "revert author:Alice before:2019-04-01"` commits.find=検索 commits.search_all=すべてのブランチ commits.author=作成者 @@ -1394,9 +1397,12 @@ issues.sign_in_require_desc=サインインしてこの会話 issues.edit=編集 issues.cancel=キャンセル issues.save=保存 -issues.label_title=ラベル名 -issues.label_description=ラベルの説明 -issues.label_color=ラベルの色 +issues.label_title=名前 +issues.label_description=説明 +issues.label_color=カラー +issues.label_exclusive=排他 +issues.label_exclusive_desc=ラベル名を スコープ/アイテム の形にすることで、他の スコープ/ ラベルと排他的になります。 +issues.label_exclusive_warning=イシューやプルリクエストのラベル編集では、競合するスコープ付きラベルは解除されます。 issues.label_count=ラベル %d件 issues.label_open_issues=オープン中のイシュー %d件 issues.label_edit=編集 @@ -1464,6 +1470,7 @@ issues.error_removing_due_date=期日を削除できませんでした。 issues.push_commit_1=が %d コミット追加 %s issues.push_commits_n=が %d コミット追加 %s issues.force_push_codes=`が %[1]s を強制プッシュ ( %[2]s から %[4]s へ ) %[6]s` +issues.force_push_compare=比較 issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=期日の追加 issues.due_date_form_edit=変更 @@ -1651,6 +1658,7 @@ pulls.merge_instruction_hint=`コマンドライン pulls.merge_instruction_step1_desc=あなたのプロジェクトリポジトリで新しいブランチをチェックアウトし、変更内容をテストします。 pulls.merge_instruction_step2_desc=変更内容をマージして、Giteaに反映します。 pulls.clear_merge_message=マージメッセージをクリア +pulls.clear_merge_message_hint=マージメッセージのクリアは、コミットメッセージの除去だけを行います。 生成されたGitトレーラー("Co-Authored-By …" 等)はそのまま残ります。 pulls.auto_merge_button_when_succeed=(チェックがすべて成功した場合) pulls.auto_merge_when_succeed=すべてのチェックが成功したら自動マージ @@ -2303,6 +2311,8 @@ release.downloads=ダウンロード release.download_count=ダウンロード数: %s release.add_tag_msg=リリースのタイトルと内容をタグのメッセージにする release.add_tag=タグのみ作成 +release.releases_for=%s のリリース +release.tags_for=%s のタグ branch.name=ブランチ名 branch.search=ブランチを検索 @@ -2662,6 +2672,7 @@ repos.size=サイズ packages.package_manage_panel=パッケージ管理 packages.total_size=合計サイズ: %s +packages.unreferenced_size=非参照サイズ: %s packages.owner=オーナー packages.creator=作成者 packages.name=名前 @@ -2755,6 +2766,8 @@ auths.oauth2_required_claim_value_helper=この値を設定すると、このソ auths.oauth2_group_claim_name=このソースでグループ名を提供するClaim名 (オプション) auths.oauth2_admin_group=管理者ユーザーのグループClaim値 (オプション - 上のClaim名が必要) auths.oauth2_restricted_group=制限付きユーザーのグループClaim値 (オプション - 上のClaim名が必要) +auths.oauth2_map_group_to_team=見つかったグループを組織のチームにマップ (オプション - 上のClaim名が必要) +auths.oauth2_map_group_to_team_removal=対応するグループにユーザーが含まれない場合、同期しているチームからユーザーを削除する auths.enable_auto_register=自動登録を有効にする auths.sspi_auto_create_users=自動的にユーザーを作成 auths.sspi_auto_create_users_helper=初回ログインのユーザーに対して、SSPI認証処理が新しいアカウントを自動的に作成することを許可します @@ -2781,7 +2794,7 @@ auths.tip.openid_connect=OpenID Connect DiscoveryのURL (/.well-known/op auths.tip.twitter=https://dev.twitter.com/apps へアクセスしてアプリケーションを作成し、“Allow this application to be used to Sign in with Twitter”オプションを有効にしてください。 auths.tip.discord=新しいアプリケーションを https://discordapp.com/developers/applications/me から登録してください。 auths.tip.gitea=新しいOAuthアプリケーションを登録してください。 利用ガイドは https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=https://oauth.yandex.com/client/new で新しいアプリケーションを作成してください。 "Yandex.Passport API" セクションで次の項目を許可します: "Access to email address"、"Access to user avatar"、"Access to username, first name and surname, gender" +auths.tip.yandex=`https://oauth.yandex.com/client/new で新しいアプリケーションを作成してください。 "Yandex.Passport API" セクションで次の項目を許可します: "Access to email address"、"Access to user avatar"、"Access to username, first name and surname, gender"` auths.tip.mastodon=認証したいMastodonインスタンスのカスタムURLを入力してください (入力しない場合はデフォルトのURLを使用します) auths.edit=認証ソースの編集 auths.activated=認証ソースはアクティベート済み @@ -3151,9 +3164,14 @@ versions.on=on versions.view_all=すべて表示 dependency.id=ID dependency.version=バージョン +cargo.registry=Cargo 設定ファイルでこのレジストリをセットアップします。(例 ~/.cargo/config.toml): +cargo.install=Cargo を使用してパッケージをインストールするには、次のコマンドを実行します: +cargo.documentation=Cargoレジストリの詳細については、 ドキュメント を参照してください。 cargo.details.repository_site=リポジトリサイト cargo.details.documentation_site=ドキュメンテーションサイト +chef.registry=あなたの ~/.chef/config.rb ファイルに、このレジストリをセットアップします: chef.install=パッケージをインストールするには、次のコマンドを実行します: +chef.documentation=Chefレジストリの詳細については、ドキュメント を参照してください。 composer.registry=あなたの ~/.composer/config.json ファイルに、このレジストリをセットアップします: composer.install=Composer を使用してパッケージをインストールするには、次のコマンドを実行します: composer.documentation=Composer レジストリの詳細については、 ドキュメント を参照してください。 @@ -3226,6 +3244,15 @@ settings.delete.description=パッケージの削除は恒久的で元に戻す settings.delete.notice=%s (%s) を削除しようとしています。この操作は元に戻せません。よろしいですか? settings.delete.success=パッケージを削除しました。 settings.delete.error=パッケージの削除に失敗しました。 +owner.settings.cargo.title=Cargoレジストリ インデックス +owner.settings.cargo.initialize=インデックスを初期化 +owner.settings.cargo.initialize.description=Cargoレジストリを使用するには、インデックス用の特別なgitリポジトリが必要です。 ここでそのリポジトリを必要な構成で(再)作成します。 +owner.settings.cargo.initialize.error=Cargoインデックスの初期化に失敗しました: %v +owner.settings.cargo.initialize.success=Cargoインデックスは正常に作成されました。 +owner.settings.cargo.rebuild=インデックスを再構築 +owner.settings.cargo.rebuild.description=保存したCargoパッケージとインデックスが同期しない場合、ここでインデックスを再構築できます。 +owner.settings.cargo.rebuild.error=Cargoインデックスの再構築に失敗しました: %v +owner.settings.cargo.rebuild.success=Cargoインデックスは正常に再構築されました。 owner.settings.cleanuprules.title=クリーンアップルールの管理 owner.settings.cleanuprules.add=クリーンアップルールを追加 owner.settings.cleanuprules.edit=クリーンアップルールを編集 @@ -3234,6 +3261,16 @@ owner.settings.cleanuprules.preview=クリーンアップルールをプレビ owner.settings.cleanuprules.preview.overview=%d パッケージが削除される予定です。 owner.settings.cleanuprules.preview.none=クリーンアップルールと一致するパッケージがありません。 owner.settings.cleanuprules.enabled=有効 +owner.settings.cleanuprules.pattern_full_match=フルパッケージ名にパターンを適用 +owner.settings.cleanuprules.keep.title=以下のルールにマッチするバージョンを残します。 (下にある削除ルールにマッチしていても残します) +owner.settings.cleanuprules.keep.count=最近のものを残す +owner.settings.cleanuprules.keep.count.1=1 パッケージにつき 1 バージョン +owner.settings.cleanuprules.keep.count.n=1 パッケージにつき %d バージョン +owner.settings.cleanuprules.keep.pattern=マッチするバージョンを残す +owner.settings.cleanuprules.keep.pattern.container=Containerパッケージの場合、最新バージョンは常に残します。 +owner.settings.cleanuprules.remove.title=以下のルールにマッチするバージョンを削除します。 (上にあるルールが残す対象としている場合を除きます) +owner.settings.cleanuprules.remove.days=これより古いバージョンを削除する +owner.settings.cleanuprules.remove.pattern=マッチするバージョンを削除する owner.settings.cleanuprules.success.update=クリーンアップルールが更新されました。 owner.settings.cleanuprules.success.delete=クリーンアップルールが削除されました。 owner.settings.chef.title=Chefレジストリ diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 330d474f0ad8..1cb9c0032e66 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -253,7 +253,7 @@ view_home=Skatīties %s search_repos=Meklēt repozitoriju… filter=Citi filtri filter_by_team_repositories=Filtrēt pēc komandas repozitorijiem -feed_of="%s\" plūsma +feed_of=`"%s\" plūsma` show_archived=Arhivētie show_both_archived_unarchived=Attēlo gan arhivētie, gan nearhivētie @@ -345,7 +345,7 @@ authorize_application=Autorizēt lietotni authorize_redirect_notice=Jūs tiksiet nosūtīts uz %s, ja autorizēsiet šo lietotni. authorize_application_created_by=Šo lietotni izveidoja %s. authorize_application_description=Ja piešķirsiet tiesības, tā varēs piekļūt un mainīt Jūsu konta informāciju, ieskaitot privātos repozitorijus un organizācijas. -authorize_title=Autorizēt " +authorize_title=`Autorizēt "` show_private=Privāts @@ -414,7 +414,7 @@ release.download.zip=Izejas kods (ZIP) release.download.targz=Izejas kods (TAR.GZ) repo.transfer.subject_to=%s vēlas pārsūtīt repozitoriju "%s" organizācijai %s -repo.transfer.subject_to_you=%s vēlas Jums pārsūtīt repozitoriju "%s" +repo.transfer.subject_to_you=`%s vēlas Jums pārsūtīt repozitoriju "%s"` repo.transfer.to_you=Jums repo.transfer.body=Ja vēlaties to noraidīt vai apstiprināt, tad apmeklējiet saiti %s. @@ -908,9 +908,9 @@ delete_preexisting_success=Dzēst nepārņemtos failus direktorijā %s blame_prior=Aplūkot vainīgo par izmaiņām pirms šīs revīzijas transfer.accept=Apstiprināt īpašnieka maiņu -transfer.accept_desc=Mainīt īpašnieku uz "%s" +transfer.accept_desc=`Mainīt īpašnieku uz "%s"` transfer.reject=Noraidīt īpašnieka maiņu -transfer.reject_desc=Atcelt īpašnieka maiņu uz "%s" +transfer.reject_desc=`Atcelt īpašnieka maiņu uz "%s"` transfer.no_permission_to_accept=Jums nav tiesību apstiprināt transfer.no_permission_to_reject=Jums nav tiesību noraidīt @@ -1179,7 +1179,7 @@ projects.edit_subheader=Projekti organizē problēmas un ļauj izsekot to progre projects.modify=Mainīt projektu projects.edit_success=Projekta '%s' izmaiņas tika saglabātas. projects.type.none=Nav -projects.type.basic_kanban=Vienkāršots "Kanban" +projects.type.basic_kanban=`Vienkāršots "Kanban"` projects.type.bug_triage=Kļūdu šķirošana projects.template.desc=Projekta sagatave projects.template.desc_helper=Izvēlieties projekta sagatavi, lai sāktu darbu @@ -1414,6 +1414,7 @@ issues.error_removing_due_date=Neizdevās noņemt izpildes termiņu. issues.push_commit_1=iesūtīja %d revīziju %s issues.push_commits_n=iesūtīja %d revīzijas %s issues.force_push_codes=`veica piespiedu izmaiņu iesūtīšanu atzarā %[1]s no revīzijas %[2]s uz %[4]s %[6]s` +issues.force_push_compare=Salīdzināt issues.due_date_form_add=Pievienot izpildes termiņu issues.due_date_form_edit=Labot issues.due_date_form_remove=Noņemt @@ -1853,7 +1854,7 @@ settings.transfer_notices_2=- Jūs saglabāsiet piekļuvi, ja jaunais īpašniek settings.transfer_notices_3=- Ja repozitorijs ir privāts un tas tiks pārsūtīts lietotājam, tad pārliecināties, ka lietotājam ir vismaz skatīšanās tiesības (veiciet nepieciešamās izmaiņas, ja nepieciešams). settings.transfer_owner=Jaunais īpašnieks settings.transfer_perform=Veikt īpašnieka maiņu -settings.transfer_started=Šim repozitorijam tiek veikta īpašnieka maiņa un nepieciešams apstiprinājums no "%s" +settings.transfer_started=`Šim repozitorijam tiek veikta īpašnieka maiņa un nepieciešams apstiprinājums no "%s"` settings.transfer_succeed=Repozitorijs tika pārcelts. settings.signing_settings=Parakstu pārbaudes iestatījumi settings.trust_model=Uzticēšanās modelis parakstiem @@ -2380,7 +2381,7 @@ teams.members=Komandas biedri teams.update_settings=Saglabāt iestatījumus teams.delete_team=Dzēst komandu teams.add_team_member=Pievienot komandas biedru -teams.invite_team_member=Uzaicināt komandā "%s" +teams.invite_team_member=`Uzaicināt komandā "%s"` teams.invite_team_member.list=Neapstiprinātie uzaicinājumi teams.delete_team_title=Dzēst komandu teams.delete_team_desc=Dzēšot komandu, tās biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem. Vai turpināt? @@ -2699,9 +2700,9 @@ auths.tips.oauth2.general=OAuth2 autentifikācija auths.tips.oauth2.general.tip=Reģistrējot jaunu OAuth2 autentifikāciju, atsauces/pārsūtīšanas URL ir jābūt: /user/oauth2//callback auths.tip.oauth2_provider=OAuth2 pakalpojuma sniedzējs auths.tip.bitbucket=Reģistrējiet jaunu OAuth klientu adresē https://bitbucket.org/account/user//oauth-consumers/new un piešķiriet tam "Account" - "Read" tiesības -auths.tip.nextcloud=Reģistrējiet jaunu OAuth klientu jūsu instances sadāļā "Settings -> Security -> OAuth 2.0 client" +auths.tip.nextcloud=`Reģistrējiet jaunu OAuth klientu jūsu instances sadāļā "Settings -> Security -> OAuth 2.0 client"` auths.tip.dropbox=Izveidojiet jaunu aplikāciju adresē https://www.dropbox.com/developers/apps -auths.tip.facebook=Reģistrējiet jaunu aplikāciju adresē https://developers.facebook.com/apps un pievienojiet produktu "Facebook Login" +auths.tip.facebook=`Reģistrējiet jaunu aplikāciju adresē https://developers.facebook.com/apps un pievienojiet produktu "Facebook Login"` auths.tip.github=Reģistrējiet jaunu aplikāciju adresē https://github.com/settings/applications/new auths.tip.gitlab=Reģistrējiet jaunu aplikāciju adresē https://gitlab.com/profile/applications auths.tip.google_plus=Iegūstiet OAuth2 klienta pilnvaru no Google API konsoles adresē https://console.developers.google.com/ @@ -2709,7 +2710,7 @@ auths.tip.openid_connect=Izmantojiet OpenID pieslēgšanās atklāšanas URL (%[2]s naar %[4]s %[6]s` +issues.force_push_compare=Vergelijk issues.due_date_form=jjjj-mm-dd issues.due_date_form_add=Vervaldatum toevoegen issues.due_date_form_edit=Bewerk @@ -2538,14 +2539,14 @@ auths.sspi_default_language_helper=Standaardtaal voor gebruikers wordt automatis auths.tips=Tips auths.tips.oauth2.general=OAuth2 authenticatie auths.tip.oauth2_provider=OAuth2 Provider -auths.tip.nextcloud=Registreer een nieuwe OAuth consument op je installatie met behulp van het volgende menu "Instellingen -> Security -> OAuth 2.0 client" +auths.tip.nextcloud=`Registreer een nieuwe OAuth consument op je installatie met behulp van het volgende menu "Instellingen -> Security -> OAuth 2.0 client"` auths.tip.dropbox=Maak een nieuwe applicatie aan op https://www.dropbox.com/developers/apps auths.tip.facebook=Registreer een nieuwe applicatie op https://developers.facebook.com/apps en voeg het product "Facebook Login" toe auths.tip.github=Registreer een nieuwe OAuth toepassing op https://github.com/settings/applications/new auths.tip.gitlab=Registreer een nieuwe applicatie op https://gitlab.com/profile/applicaties auths.tip.google_plus=Verkrijg OAuth2 client referenties van de Google API console op https://console.developers.google.com/ auths.tip.openid_connect=Gebruik de OpenID Connect Discovery URL (/.well-known/openid-configuration) om de eindpunten op te geven -auths.tip.yandex=Maak een nieuwe applicatie aan op https://oauth.yandex.com/client/new. Selecteer de volgende machtigingen van de "Yandex". assport API" sectie: "Toegang tot e-mailadres", "Toegang tot avatar" en "Toegang tot gebruikersnaam, voornaam en achternaam, geslacht" +auths.tip.yandex=`Maak een nieuwe applicatie aan op https://oauth.yandex.com/client/new. Selecteer de volgende machtigingen van de "Yandex". assport API" sectie: "Toegang tot e-mailadres", "Toegang tot avatar" en "Toegang tot gebruikersnaam, voornaam en achternaam, geslacht"` auths.edit=Authenticatiebron bewerken auths.activated=Deze authenticatiebron is geactiveerd auths.new_success=De authenticatie-bron '%s' is toegevoegd. diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 3093b81265dd..a9a35066d8c4 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -40,7 +40,7 @@ webauthn_use_twofa=Użyj kodu uwierzytelniania dwuskładnikowego ze swojego tele webauthn_error=Nie można odczytać Twojego klucza bezpieczeństwa. webauthn_unsupported_browser=Twoja przeglądarka nie obsługuje obecnie WebAuthn. webauthn_error_unknown=Wystąpił nieznany błąd. Spróbuj ponownie. -webauthn_error_insecure=WebAuthn obsługuje tylko bezpieczne połączenia. Do testowania przez HTTP można użyć "localhost" lub "127.0.0.1" +webauthn_error_insecure=`WebAuthn obsługuje tylko bezpieczne połączenia. Do testowania przez HTTP można użyć "localhost" lub "127.0.0.1"` webauthn_error_unable_to_process=Serwer nie mógł obsłużyć Twojego żądania. webauthn_error_duplicated=Klucz bezpieczeństwa nie jest dozwolony dla tego żądania. Upewnij się, że klucz nie jest już zarejestrowany. webauthn_error_empty=Musisz ustawić nazwę dla tego klucza. @@ -252,7 +252,7 @@ view_home=Zobacz %s search_repos=Znajdź repozytorium… filter=Inne filtry filter_by_team_repositories=Filtruj według repozytoriów zespołu -feed_of=Kanał "%s" +feed_of=`Kanał "%s"` show_archived=Zarchiwizowane show_both_archived_unarchived=Wyświetlanie zarchiwizowanych i niezarchiwizowanych @@ -843,9 +843,9 @@ delete_preexisting_content=Usuń pliki w %s delete_preexisting_success=Usunięto nieprzyjęte pliki w %s transfer.accept=Akceptuj transfer -transfer.accept_desc=Przenieś do "%s" +transfer.accept_desc=`Przenieś do "%s"` transfer.reject=Odrzuć transfer -transfer.reject_desc=Anuluj transfer do "%s" +transfer.reject_desc=`Anuluj transfer do "%s"` transfer.no_permission_to_accept=Nie masz uprawnień do akceptacji transfer.no_permission_to_reject=Nie masz uprawnień do odrzucenia @@ -1297,6 +1297,7 @@ issues.error_modifying_due_date=Nie udało się zmodyfikować terminu realizacji issues.error_removing_due_date=Nie udało się usunąć terminu realizacji. issues.push_commit_1=dodał(-a) %d commit %s issues.push_commits_n=dodał(-a) %d commity(-ów) %s +issues.force_push_compare=Porównaj issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=Dodaj termin realizacji issues.due_date_form_edit=Edytuj @@ -1672,7 +1673,7 @@ settings.transfer_notices_2=- Utrzymasz dostęp do tego repozytorium, jeśli prz settings.transfer_notices_3=- Jeśli repozytorium jest prywatne i jest przenoszone do indywidualnego użytkownika, ta czynność upewnia się, że użytkownik ma co najmniej uprawnienia do odczytu (i w razie potrzeby zmienia uprawnienia). settings.transfer_owner=Nowy właściciel settings.transfer_perform=Wykonaj transfer -settings.transfer_started=To repozytorium zostało oznaczone do transferu i oczekuje na potwierdzenie od "%s" +settings.transfer_started=`To repozytorium zostało oznaczone do transferu i oczekuje na potwierdzenie od "%s"` settings.transfer_succeed=Repozytorium zostało przeniesione. settings.signing_settings=Ustawienia weryfikacji podpisu settings.trust_model=Model zaufania do podpisu @@ -1819,7 +1820,7 @@ settings.protected_branch=Ochrona gałęzi settings.protected_branch_can_push=Umożliwić push? settings.protected_branch_can_push_yes=Możesz wysyłać settings.protected_branch_can_push_no=Nie możesz wysyłać -settings.branch_protection=Ochrona gałęzi dla "%s" +settings.branch_protection=`Ochrona gałęzi dla "%s"` settings.protect_this_branch=Włącz ochronę gałęzi settings.protect_this_branch_desc=Zapobiega usunięciu oraz ogranicza wypychanie i scalanie zmian do tej gałęzi. settings.protect_disable_push=Wyłącz wypychanie @@ -2410,10 +2411,10 @@ auths.tips=Wskazówki auths.tips.oauth2.general=Uwierzytelnianie OAuth2 auths.tips.oauth2.general.tip=Przy rejestracji nowego uwierzytelnienia OAuth2, URL zwrotny/przekierowań powinien mieć postać /user/oauth2//callback auths.tip.oauth2_provider=Dostawca OAuth2 -auths.tip.bitbucket=Zarejestruj nowego konsumenta OAuth na https://bitbucket.org/account/user//oauth-consumers/new i dodaj uprawnienie "Account" - "Read" -auths.tip.nextcloud=Zarejestruj nowego klienta OAuth w swojej instancji za pomocą menu "Ustawienia -> Bezpieczeństwo -> Klient OAuth 2.0" +auths.tip.bitbucket=`Zarejestruj nowego konsumenta OAuth na https://bitbucket.org/account/user//oauth-consumers/new i dodaj uprawnienie "Account" - "Read"` +auths.tip.nextcloud=`Zarejestruj nowego klienta OAuth w swojej instancji za pomocą menu "Ustawienia -> Bezpieczeństwo -> Klient OAuth 2.0"` auths.tip.dropbox=Stwórz nową aplikację na https://www.dropbox.com/developers/apps -auths.tip.facebook=Zarejestruj nową aplikację na https://developers.facebook.com/apps i dodaj produkt "Facebook Login" +auths.tip.facebook=`Zarejestruj nową aplikację na https://developers.facebook.com/apps i dodaj produkt "Facebook Login"` auths.tip.github=Zarejestruj nową aplikację OAuth na https://github.com/settings/applications/new auths.tip.gitlab=Zarejestruj nową aplikację na https://gitlab.com/profile/applications auths.tip.google_plus=Uzyskaj dane uwierzytelniające klienta OAuth2 z konsoli Google API na https://console.developers.google.com/ @@ -2421,7 +2422,7 @@ auths.tip.openid_connect=Użyj adresu URL OpenID Connect Discovery (/.we auths.tip.twitter=Przejdź na https://dev.twitter.com/apps, stwórz aplikację i upewnij się, że opcja “Allow this application to be used to Sign in with Twitter” jest włączona auths.tip.discord=Zarejestruj nową aplikację na https://discordapp.com/developers/applications/me auths.tip.gitea=Zarejestruj nową aplikację OAuth2. Przewodnik można znaleźć na https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=Utwórz nową aplikację na https://oauth.yandex.com/client/new. Wybierz następujące uprawnienia z "Yandex.Passport API": "Access to email address", "Access to user avatar" and "Access to username, first name and surname, gender" +auths.tip.yandex=`Utwórz nową aplikację na https://oauth.yandex.com/client/new. Wybierz następujące uprawnienia z "Yandex.Passport API": "Access to email address", "Access to user avatar" and "Access to username, first name and surname, gender"` auths.tip.mastodon=Wprowadź niestandardowy adres URL instancji mastodona, którą chcesz uwierzytelnić (lub użyj domyślnego) auths.edit=Edytuj źródło uwierzytelniania auths.activated=To źródło uwierzytelniania jest aktywne diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 986a3d99efe9..96c3c9b8f409 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -41,7 +41,7 @@ webauthn_use_twofa=Use um código de duas etapas do seu telefone webauthn_error=Não foi possível ler sua chave de segurança. webauthn_unsupported_browser=Seu navegador não oferece suporte ao WebAuthn. webauthn_error_unknown=Ocorreu um erro desconhecido. Por favor, tente novamente. -webauthn_error_insecure=WebAuthn suporta apenas conexões seguras. Para testar via HTTP, você pode usar a origem "localhost" ou "127.0.0.1" +webauthn_error_insecure=`WebAuthn suporta apenas conexões seguras. Para testar via HTTP, você pode usar a origem "localhost" ou "127.0.0.1"` webauthn_error_unable_to_process=O servidor não pôde processar sua solicitação. webauthn_error_duplicated=A chave de segurança não é permitida para esta solicitação. Por favor, certifique-se que a chave já não está registrada. webauthn_error_empty=Você deve definir um nome para esta chave. @@ -265,7 +265,7 @@ view_home=Ver %s search_repos=Encontre um repositório… filter=Outros filtros filter_by_team_repositories=Filtrar por repositórios da equipe -feed_of=Feed de "%s" +feed_of=`Feed de "%s"` show_archived=Arquivado show_both_archived_unarchived=Mostrando arquivados e não arquivados @@ -769,6 +769,7 @@ create_oauth2_application_button=Criar aplicativo create_oauth2_application_success=Você criou com sucesso um novo aplicativo OAuth2. update_oauth2_application_success=Você alterou com sucesso o aplicativo OAuth2. oauth2_application_name=Nome do aplicativo +oauth2_confidential_client=Cliente Confidencial. Selecione para aplicativos que mantêm a confidencialidade do segredo, como aplicativos web. Não selecione para aplicativos nativos, incluindo aplicativos desktop e celulares. oauth2_redirect_uri=Redirecionar URI save_application=Salvar oauth2_client_id=Client ID @@ -930,9 +931,9 @@ delete_preexisting_success=Arquivos órfãos excluídos em %s blame_prior=Ver a responsabilização anterior a esta modificação transfer.accept=Aceitar transferência -transfer.accept_desc=Transferir para "%s" +transfer.accept_desc=`Transferir para "%s"` transfer.reject=Rejeitar transferência -transfer.reject_desc=Cancelar a transferência para "%s" +transfer.reject_desc=`Cancelar a transferência para "%s"` transfer.no_permission_to_accept=Você não tem permissão para Aceitar transfer.no_permission_to_reject=Você não tem permissão para Rejeitar @@ -1342,6 +1343,8 @@ issues.action_milestone=Marco issues.action_milestone_no_select=Sem marco issues.action_assignee=Responsável issues.action_assignee_no_select=Sem responsável +issues.action_check=Marcar/Desmarcar +issues.action_check_all=Marcar/Desmarcar todos os itens issues.opened_by=aberto por %[3]s %[1]s pulls.merged_by=por %[3]s foi aplicado em %[1]s pulls.merged_by_fake=por %[2]s foi aplicado %[1]s @@ -1396,6 +1399,7 @@ issues.label_title=Nome da etiqueta issues.label_description=Descrição da etiqueta issues.label_color=Cor da etiqueta issues.label_exclusive=Exclusivo +issues.label_exclusive_warning=Quaisquer rótulos com escopo conflitantes serão removidos ao editar os rótulos de uma issue ou pull request. issues.label_count=%d etiquetas issues.label_open_issues=%d issues abertas issues.label_edit=Editar @@ -1463,6 +1467,7 @@ issues.error_removing_due_date=Falha ao remover a data limite. issues.push_commit_1=adicionou %d commit %s issues.push_commits_n=adicionou %d commits %s issues.force_push_codes=`forçou o push %[1]s de %[2]s para %[4]s %[6]s` +issues.force_push_compare=Comparar issues.due_date_form=dd/mm/aaaa issues.due_date_form_add=Adicionar data limite issues.due_date_form_edit=Editar @@ -1910,7 +1915,7 @@ settings.transfer_notices_2=- Você manterá acesso ao repositório se transferi settings.transfer_notices_3=- Se o repositório for privado e for transferido para um usuário individual, esta ação certifica que o usuário tem pelo menos permissão de leitura (e altera as permissões se necessário). settings.transfer_owner=Novo proprietário settings.transfer_perform=Executar Transferência -settings.transfer_started=Este repositório foi marcado para transferência e aguarda a confirmação de "%s" +settings.transfer_started=`Este repositório foi marcado para transferência e aguarda a confirmação de "%s"` settings.transfer_succeed=O repositório foi transferido. settings.signing_settings=Configurações de Verificação de Assinatura settings.trust_model=Modelo de Confiança na Assinatura @@ -2296,6 +2301,8 @@ release.downloads=Downloads release.download_count=Downloads: %s release.add_tag_msg=Use o título e o conteúdo do lançamento como mensagem da tag. release.add_tag=Criar apenas a tag +release.releases_for=Versões para %s +release.tags_for=Tags para %s branch.name=Nome do Branch branch.search=Pesquisar branches @@ -2760,9 +2767,9 @@ auths.tips.oauth2.general=Autenticação OAuth2 auths.tips.oauth2.general.tip=Ao cadastrar uma nova autenticação OAuth2, o retorno de chamada/redirecionamento URL deve ser: /user/oauth2//callback auths.tip.oauth2_provider=Provedor OAuth2 auths.tip.bitbucket=Cadastrar um novo consumidor de OAuth em https://bitbucket.org/account/user/ e adicionar a permissão 'Account' - 'Read' -auths.tip.nextcloud=Registre um novo consumidor OAuth em sua instância usando o seguinte menu "Configurações -> Segurança -> Cliente OAuth 2.0" +auths.tip.nextcloud=`Registre um novo consumidor OAuth em sua instância usando o seguinte menu "Configurações -> Segurança -> Cliente OAuth 2.0"` auths.tip.dropbox=Criar um novo aplicativo em https://www.dropbox.com/developers/apps -auths.tip.facebook=Cadastrar um novo aplicativo em https://developers.facebook.com/apps e adicionar o produto "Facebook Login" +auths.tip.facebook=`Cadastrar um novo aplicativo em https://developers.facebook.com/apps e adicionar o produto "Facebook Login"` auths.tip.github=Cadastrar um novo aplicativo de OAuth na https://github.com/settings/applications/new auths.tip.gitlab=Cadastrar um novo aplicativo em https://gitlab.com/profile/applications auths.tip.google_plus=Obter credenciais de cliente OAuth2 do console de API do Google em https://console.developers.google.com/ @@ -2770,7 +2777,7 @@ auths.tip.openid_connect=Use o OpenID Connect Discovery URL (/.well-kn auths.tip.twitter=Vá em https://dev.twitter.com/apps, crie um aplicativo e certifique-se de que está habilitada a opção “Allow this application to be used to Sign in with Twitter“ auths.tip.discord=Cadastrar um novo aplicativo em https://discordapp.com/developers/applications/me auths.tip.gitea=Cadastrar um novo aplicativo OAuth2. Guia pode ser encontrado em https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=Crie um novo aplicativo em https://oauth.yandex.com/client/new. Selecione as seguintes permissões da seção "Yandex.Passport API": "Access to email address", "Access to user avatar" and "Access to username, first name and surname, gender" +auths.tip.yandex=`Crie um novo aplicativo em https://oauth.yandex.com/client/new. Selecione as seguintes permissões da seção "Yandex.Passport API": "Access to email address", "Access to user avatar" and "Access to username, first name and surname, gender"` auths.tip.mastodon=Insira a URL da instância personalizada do mastodon que você deseja usar para autenticar (ou use o padrão) auths.edit=Editar fonte de autenticação auths.activated=Esta fonte de autenticação está ativada diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 60b8f14db2f0..daabe979b5d7 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -41,7 +41,7 @@ webauthn_use_twofa=Usar um código de dois passos do seu telefone webauthn_error=Não foi possível ler a sua chave de segurança. webauthn_unsupported_browser=O seu navegador não oferece suporte ao WebAuthn. webauthn_error_unknown=Ocorreu um erro desconhecido. Tente novamente, por favor. -webauthn_error_insecure=WebAuthn apenas suporta conexões seguras. Para testar sobre HTTP, pode usar a origem "localhost" ou "127.0.0.1" +webauthn_error_insecure=`WebAuthn apenas suporta conexões seguras. Para testar sobre HTTP, pode usar a origem "localhost" ou "127.0.0.1"` webauthn_error_unable_to_process=O servidor não conseguiu processar o seu pedido. webauthn_error_duplicated=A chave de segurança não é permitida neste pedido. Certifique-se de que a chave não está já registada. webauthn_error_empty=Você tem que definir um nome para esta chave. @@ -265,7 +265,7 @@ view_home=Ver %s search_repos=Procurar um repositório… filter=Outros filtros filter_by_team_repositories=Filtrar por repositórios da equipa -feed_of=Fonte de "%s" +feed_of=`Fonte de "%s"` show_archived=Arquivado show_both_archived_unarchived=Apresentando arquivados e não arquivados @@ -932,9 +932,9 @@ delete_preexisting_success=Eliminados os ficheiros não adoptados em %s blame_prior=Ver a responsabilização anterior a esta modificação transfer.accept=Aceitar transferência -transfer.accept_desc=Transferir para "%s" +transfer.accept_desc=`Transferir para "%s"` transfer.reject=Rejeitar transferência -transfer.reject_desc=Cancelar transferência para "%s" +transfer.reject_desc=`Cancelar transferência para "%s"` transfer.no_permission_to_accept=Não tem permissão para Aceitar transfer.no_permission_to_reject=Não tem permissão para Rejeitar @@ -1470,6 +1470,7 @@ issues.error_removing_due_date=Falhou a remoção da data de vencimento. issues.push_commit_1=adicionou %d cometimento %s issues.push_commits_n=adicionou %d cometimentos %s issues.force_push_codes=`forçou o envio %[1]s de %[2]s para %[4]s %[6]s` +issues.force_push_compare=Comparar issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=Adicionar data de vencimento issues.due_date_form_edit=Editar @@ -1919,7 +1920,7 @@ settings.transfer_notices_2=- Você manterá o acesso ao repositório se o trans settings.transfer_notices_3=- Se o repositório for privado e for transferido para um utilizador individual, esta operação certifica que o utilizador tem pelo menos a permissão de leitura (e altera as permissões se for necessário). settings.transfer_owner=Novo proprietário settings.transfer_perform=Executar transferência -settings.transfer_started=Este repositório foi marcado para ser transferido e aguarda a confirmação de "%s" +settings.transfer_started=`Este repositório foi marcado para ser transferido e aguarda a confirmação de "%s"` settings.transfer_succeed=O repositório foi transferido. settings.signing_settings=Configuração da validação de assinaturas settings.trust_model=Modelo de confiança na assinatura @@ -2783,17 +2784,17 @@ auths.tips.oauth2.general=Autenticação OAuth2 auths.tips.oauth2.general.tip=Ao registar uma nova autenticação OAuth2, o URL de retorno de chamada/reencaminhamento deve ser: /user/oauth2//callback auths.tip.oauth2_provider=Fornecedor OAuth2 auths.tip.bitbucket=Registe um novo consumidor de OAuth em https://bitbucket.org/account/user//oauth-consumers/new e adicione a permissão 'Account' - 'Read' -auths.tip.nextcloud=Registe um novo consumidor OAuth na sua instância usando o seguinte menu "Configurações → Segurança → Cliente OAuth 2.0" +auths.tip.nextcloud=`Registe um novo consumidor OAuth na sua instância usando o seguinte menu "Configurações → Segurança → Cliente OAuth 2.0"` auths.tip.dropbox=Crie uma nova aplicação em https://www.dropbox.com/developers/apps -auths.tip.facebook=Registe uma nova aplicação em https://developers.facebook.com/apps e adicione o produto "Facebook Login" +auths.tip.facebook=`Registe uma nova aplicação em https://developers.facebook.com/apps e adicione o produto "Facebook Login"` auths.tip.github=Registe uma nova aplicação OAuth em https://github.com/settings/applications/new auths.tip.gitlab=Registe uma nova aplicação em https://gitlab.com/profile/applications auths.tip.google_plus=Obtenha credenciais de cliente OAuth2 a partir da consola do Google API em https://console.developers.google.com/ auths.tip.openid_connect=Use o URL da descoberta de conexão OpenID (/.well-known/openid-configuration) para especificar os extremos -auths.tip.twitter=Vá a https://dev.twitter.com/apps, crie uma aplicação e certifique-se de que está habilitada a opção "Allow this application to be used to Sign in with Twitter" +auths.tip.twitter=`Vá a https://dev.twitter.com/apps, crie uma aplicação e certifique-se de que está habilitada a opção "Allow this application to be used to Sign in with Twitter"` auths.tip.discord=Registe uma nova aplicação em https://discordapp.com/developers/applications/me auths.tip.gitea=Registe uma nova aplicação OAuth2. O guia pode ser encontrado em https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=Crie uma nova aplicação em https://oauth.yandex.com/client/new. Escolha as seguintes permissões da secção "Yandex.Passport API": "Acesso ao endereço de email", "Acesso ao avatar do utilizador" e "Acesso ao nome de utilizador, nome e sobrenome, género" +auths.tip.yandex=`Crie uma nova aplicação em https://oauth.yandex.com/client/new. Escolha as seguintes permissões da secção "Yandex.Passport API": "Acesso ao endereço de email", "Acesso ao avatar do utilizador" e "Acesso ao nome de utilizador, nome e sobrenome, género"` auths.tip.mastodon=Insira o URL de uma instância personalizada para a instância do mastodon com que se pretende autenticar (ou então use a predefinida) auths.edit=Editar fonte de autenticação auths.activated=Esta fonte de autenticação está em funcionamento diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 41664382308e..5289a59ead0e 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -41,7 +41,7 @@ webauthn_use_twofa=Используйте двухфакторный код с webauthn_error=Не удалось прочитать ваш ключ безопасности. webauthn_unsupported_browser=Ваш браузер в настоящее время не поддерживает WebAuthn. webauthn_error_unknown=Произошла неизвестная ошибка. Повторите попытку. -webauthn_error_insecure=WebAuthn поддерживает только безопасные соединения. Для тестирования по HTTP, вы можете использовать "localhost" или "127.0.0.1" +webauthn_error_insecure=`WebAuthn поддерживает только безопасные соединения. Для тестирования по HTTP, вы можете использовать "localhost" или "127.0.0.1"` webauthn_error_unable_to_process=Сервер не смог обработать ваш запрос. webauthn_error_duplicated=Представленный ключ не подходит для этого запроса. Если вы пытаетесь зарегистрировать его, убедитесь, что ключ ещё не зарегистрирован. webauthn_error_empty=Вы должны указать имя для этого ключа. @@ -252,7 +252,7 @@ view_home=Показать %s search_repos=Поиск репозитория… filter=Другие фильтры filter_by_team_repositories=Фильтровать по репозиториям команды -feed_of=Лента "%s" +feed_of=`Лента "%s"` show_archived=Архивировано show_both_archived_unarchived=Показаны архивированные и разархивированные @@ -890,9 +890,9 @@ delete_preexisting_success=Удалены непринятые файлы в %s blame_prior=Посмотреть авторство до этих изменений transfer.accept=Принять трансфер -transfer.accept_desc=Переместить в "%s" +transfer.accept_desc=`Переместить в "%s"` transfer.reject=Отказаться от перемещения -transfer.reject_desc=Отменить перемещение в "%s" +transfer.reject_desc=`Отменить перемещение в "%s"` transfer.no_permission_to_accept=Недостаточно прав чтобы принять transfer.no_permission_to_reject=Недостаточно прав чтобы отказать @@ -1374,6 +1374,7 @@ issues.error_removing_due_date=Не удалось убрать срок вып issues.push_commit_1=добавил(а) %d коммит %s issues.push_commits_n=добавил(а) %d коммитов %s issues.force_push_codes=`принудительно залито %[1]s от %[2]s к %[4]s %[6]s` +issues.force_push_compare=Сравнить issues.due_date_form=гггг-мм-дд issues.due_date_form_add=Добавить срок выполнения issues.due_date_form_edit=Редактировать @@ -1785,7 +1786,7 @@ settings.transfer_notices_2=- Вы сохраните доступ, если н settings.transfer_notices_3=- если репозиторий является приватным и передается отдельному пользователю, это действие позволяет убедиться, что пользователь имеет хотя бы права на чтение (и при необходимости изменяет права доступа). settings.transfer_owner=Новый владелец settings.transfer_perform=Выполнить трансфер -settings.transfer_started=Репозиторий ожидает подтверждения трансфера от "%s" +settings.transfer_started=`Репозиторий ожидает подтверждения трансфера от "%s"` settings.transfer_succeed=Репозиторий перенесён. settings.signing_settings=Настройки подписи верификации settings.trust_model=Модель доверия подписи @@ -2107,7 +2108,7 @@ diff.review.approve=Утвердить diff.review.reject=Запрос изменений diff.committed_by=коммит произвёл diff.protected=Защищено -diff.image.side_by_side=Режим "рядом" +diff.image.side_by_side=`Режим "рядом"` diff.image.swipe=Свайп diff.image.overlay=Оверлей @@ -2580,10 +2581,10 @@ auths.tips=Советы auths.tips.oauth2.general=OAuth2 аутентификация auths.tips.oauth2.general.tip=При добавлении нового OAuth2 провайдера, URL адрес переадресации по завершении аутентификации должен выглядеть так: /user/oauth2//callback auths.tip.oauth2_provider=Поставщик OAuth2 -auths.tip.bitbucket=Создайте OAuth URI на странице https://bitbucket.org/account/user/<имя пользователя>/oauth-consumers/new и добавьте права "Account" - "Read" -auths.tip.nextcloud=Зарегистрируйте нового потребителя OAuth в вашем экземпляре, используя меню "Settings -> Security -> OAuth 2.0 client" +auths.tip.bitbucket=`Создайте OAuth URI на странице https://bitbucket.org/account/user/<имя пользователя>/oauth-consumers/new и добавьте права "Account" - "Read"` +auths.tip.nextcloud=`Зарегистрируйте нового потребителя OAuth в вашем экземпляре, используя меню "Settings -> Security -> OAuth 2.0 client"` auths.tip.dropbox=Добавьте новое приложение на https://www.dropbox.com/developers/apps -auths.tip.facebook=Создайте новое приложение на https://developers.facebook.com/apps и добавьте модуль "Facebook Login" +auths.tip.facebook=`Создайте новое приложение на https://developers.facebook.com/apps и добавьте модуль "Facebook Login"` auths.tip.github=Добавьте OAuth приложение на https://github.com/settings/applications/new auths.tip.gitlab=Добавьте новое приложение на https://gitlab.com/profile/applications auths.tip.google_plus=Получите учетные данные клиента OAuth2 в консоли Google API на странице https://console.developers.google.com/ @@ -2591,7 +2592,7 @@ auths.tip.openid_connect=Используйте OpenID Connect Discovery URL (%[2]s %[4]ගේ %[6]s` +issues.force_push_compare=සසඳන්න issues.due_date_form=Yyy-mm-dd issues.due_date_form_add=නියමිත දිනය එකතු කරන්න issues.due_date_form_edit=සංස්කරණය diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 5d599e997b42..2ea7cfa8598d 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -41,7 +41,7 @@ webauthn_use_twofa=Použite kód dvojfaktorového overenia z vášho telefónu webauthn_error=Nie je možné prečítať váš bezpečnostný kód. webauthn_unsupported_browser=Váš prehliadač aktuálne nepodporuje WebAuthn. webauthn_error_unknown=Vyskytla sa neznáma chyba. Skúste to znova. -webauthn_error_insecure=WebAuthn podporuje iba bezpečné spojenia. Na testovanie cez HTTP môžete použiť "localhost" alebo "127.0.0.1" +webauthn_error_insecure=`WebAuthn podporuje iba bezpečné spojenia. Na testovanie cez HTTP môžete použiť "localhost" alebo "127.0.0.1"` webauthn_error_unable_to_process=Server nemohol spracovať vašu požiadavku. webauthn_error_duplicated=Bezpečnostný kľúč nie je pre túto požiadavku povolený. Uistite sa, že kľúč ešte nie je zaregistrovaný. webauthn_error_empty=Musíte nastaviť meno pre tento kľúč. @@ -881,9 +881,9 @@ delete_preexisting_content=Vymazať súbory v %s delete_preexisting_success=Vymazané neprijaté súbory v %s transfer.accept=Prijať prevod -transfer.accept_desc=Previesť do "%s" +transfer.accept_desc=`Previesť do "%s"` transfer.reject=Odmietnuť prevod -transfer.reject_desc=Zrušiť prevod do "%s" +transfer.reject_desc=`Zrušiť prevod do "%s"` transfer.no_permission_to_accept=Nemáte povolenie na prijatie desc.private=Súkromný @@ -1158,7 +1158,7 @@ settings.transfer=Previesť vlastníctvo settings.transfer_notices_1=- Ak prenesiete repozitár na užívateľa, stratíte k nemu prístup. settings.transfer_notices_2=- Prístup k repozitáru si ponecháte, ak ho prevediete na organizáciu, ktorú (spolu)vlastníte. settings.transfer_owner=Nový vlastník -settings.transfer_started=Tento repozitár bol označený na prenos a čaká na potvrdenie od "%s" +settings.transfer_started=`Tento repozitár bol označený na prenos a čaká na potvrdenie od "%s"` settings.transfer_succeed=Repozitár bol prenesený. settings.trust_model.collaborator.long=Spolupracovník: Dôverovať podpisom spolupracovníkov settings.trust_model.collaborator.desc=Platné podpisy spolupracovníkov tohto úložiska budú označené ako "dôveryhodné" - (bez ohľadu na to, či sa zhodujú s prispievateľom alebo nie). V opačnom prípade budú platné podpisy označené ako „nedôveryhodné“, ak sa podpis zhoduje s prispievateľom, a „nezhodujúce sa“, ak nie. diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 74732b1e63e2..ed26e35f3cca 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -1090,6 +1090,7 @@ issues.error_modifying_due_date=Det gick inte att ändra förfallodatumet. issues.error_removing_due_date=Det gick inte att ta bort förfallodatumet. issues.push_commit_1=lade till %d commit %s issues.push_commits_n=lade till %d committer %s +issues.force_push_compare=Jämför issues.due_date_form=yyyy-MM-dd issues.due_date_form_add=Lägg till förfallodatum issues.due_date_form_edit=Ändra diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 3fe3aaf7c163..412705a44af2 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -256,7 +256,7 @@ view_home=%s Görüntüle search_repos=Depo bul… filter=Diğer Süzgeçler filter_by_team_repositories=Takım depolarına göre süz -feed_of="%s\" beslemesi +feed_of=`"%s\" beslemesi` show_archived=Arşivlenmiş show_both_archived_unarchived=Arşivlenenler ve arşivlenmeyenlerin hepsi gösteriliyor @@ -289,7 +289,7 @@ code_no_results=Aranan terimlerle eşleşen bir kaynak kod bulunamadı. code_search_results='%s' için arama sonuçları code_last_indexed_at=Son endekslenen %s relevant_repositories_tooltip=Çatal olan veya konusu, simgesi veya açıklaması olmayan depolar gizlenmiştir. -relevant_repositories=Sadece ilişkili depolar gösteriliyor, %[2]s hedefinden %[4]s hedefine zorla gönderildi %[6]s` +issues.force_push_compare=Karşılaştır issues.due_date_form=yyyy-aa-gg issues.due_date_form_add=Bitiş tarihi ekle issues.due_date_form_edit=Düzenle @@ -1784,7 +1785,7 @@ search.fuzzy=Belirsiz search.fuzzy.tooltip=Arama terimine benzeyen sonuçları da içer search.match=Eşleştir search.match.tooltip=Sadece arama terimiyle tamamen eşleşen sonuçları içer -search.results="%s\" için %s içinde sonuçları ara +search.results=`"%s\" için %s içinde sonuçları ara` search.code_no_results=Arama teriminizle eşleşen bir kaynak kod bulunamadı. search.code_search_unavailable=Kod arama şu an mevcut değil. Lütfen site yöneticisiyle iletişime geçin. @@ -1801,7 +1802,7 @@ settings.hooks=Web İstemcileri settings.githooks=Git İstemcileri settings.basic_settings=Temel Ayarlar settings.mirror_settings=Yansıma Ayarları -settings.mirror_settings.docs=Projenizi, değişiklikleri başka bir depoya/depodan otomatik olarak gönderecek ve/veya çekecek şekilde ayarlayın. Dallar, etiketler ve işlemeler otomatik olarak senkronize edilecektir. %[2] до %[4]s %[6]s` +issues.force_push_compare=Порівняти issues.due_date_form=рррр-мм-дд issues.due_date_form_add=Додати дату завершення issues.due_date_form_edit=Редагувати @@ -1718,7 +1719,7 @@ settings.transfer_notices_2=- Ви збережете доступ, якщо н settings.transfer_notices_3=- Якщо репозиторій є приватним і передається окремому користувачеві, ця дія гарантує, що користувач має хоча б дозвіл на читаня репозитарію (і при необхідності змінює права дозволів). settings.transfer_owner=Новий власник settings.transfer_perform=Здіснити перенесення -settings.transfer_started=Цей репозиторій чекає підтвердження перенесення від "%s" +settings.transfer_started=`Цей репозиторій чекає підтвердження перенесення від "%s"` settings.transfer_succeed=Репозиторій був перенесений. settings.signing_settings=Параметри перевірки підпису settings.trust_model=Модель довіри для підпису @@ -2496,9 +2497,9 @@ auths.tips.oauth2.general=OAuth2 автентифікація auths.tips.oauth2.general.tip=При додаванні нового OAuth2 провайдера, URL адреса переадресації по завершенні автентифікації повинена виглядати так:/user/oauth2//callback auths.tip.oauth2_provider=Постачальник OAuth2 auths.tip.bitbucket=Створіть OAuth URI на сторінці https://bitbucket.org/account/user//oauth-consumers/new і додайте права 'Account' - 'Read' -auths.tip.nextcloud=Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0" +auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"` auths.tip.dropbox=Додайте новий додаток на https://www.dropbox.com/developers/apps -auths.tip.facebook=Створіть новий додаток на https://developers.facebook.com/apps і додайте модуль "Facebook Login" +auths.tip.facebook=`Створіть новий додаток на https://developers.facebook.com/apps і додайте модуль "Facebook Login"` auths.tip.github=Додайте OAuth додаток на https://github.com/settings/applications/new auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці https://console.developers.google.com/ @@ -2506,7 +2507,7 @@ auths.tip.openid_connect=Використовуйте OpenID Connect Discovery U auths.tip.twitter=Перейдіть на https://dev.twitter.com/apps, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter» auths.tip.discord=Зареєструйте новий додаток на https://discordapp.com/developers/applications/me auths.tip.gitea=Зареєструйте новий додаток OAuth2. Керівництво можна знайти на https://docs.gitea.io/en-us/oauth2-provider/ -auths.tip.yandex=Створіть нову програму в https://oauth.yandex.com/client/new. Виберіть наступні дозволи з "Yandex. assport API": "Доступ до адреси електронної пошти", "Доступ до аватара" і "Доступ до імені користувача, імені та прізвища, статі" +auths.tip.yandex=`Створіть нову програму в https://oauth.yandex.com/client/new. Виберіть наступні дозволи з "Yandex. assport API": "Доступ до адреси електронної пошти", "Доступ до аватара" і "Доступ до імені користувача, імені та прізвища, статі"` auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням) auths.edit=Редагувати джерело автентифікації auths.activated=Ця аутентифікація активована @@ -2573,7 +2574,7 @@ config.allow_only_internal_registration=Дозволити реєстрацію config.allow_only_external_registration=Дозволити реєстрацію тільки через сторонні сервіси config.enable_openid_signup=Увімкнути самостійну реєстрацію за допомогою OpenID config.enable_openid_signin=Увімкнути реєстрацію за допомогою OpenID -config.show_registration_button=Показувати кнопку "Реєстрація" +config.show_registration_button=`Показувати кнопку "Реєстрація"` config.require_sign_in_view=Вимагати авторизації для перегляду сторінок config.mail_notify=Увімкнути сповіщення електронною поштою config.disable_key_size_check=Вимкнути перевірку мінімального розміру ключа @@ -2693,7 +2694,7 @@ monitor.queue.pool.addworkers.mustnumbergreaterzero=Кількість дода monitor.queue.pool.addworkers.musttimeoutduration=Тайм-аут має бути довжиною golang, наприклад 5m або 0 monitor.queue.pool.flush.title=Очистити чергу monitor.queue.pool.flush.desc=Очистка додасть потік, який припиниться, коли черга буде порожньою, або по тайм-ауту. -monitor.queue.pool.flush.submit=Додати робочий потік "Очистка" +monitor.queue.pool.flush.submit=`Додати робочий потік "Очистка"` monitor.queue.pool.flush.added=Потік очистки додано до %[1]s monitor.queue.settings.title=Налаштування пулу diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 7f5525e65245..538dd8bef5d6 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1225,7 +1225,7 @@ projects.column.new_title=名称 projects.column.new_submit=创建列 projects.column.new=创建列 projects.column.set_default=设为默认 -projects.column.set_default_desc=Set this column as default for uncategorized issues and pulls +projects.column.set_default_desc=设置此列为未分类问题和合并请求的默认值 projects.column.delete=删除列 projects.column.deletion_desc=删除项目列会将所有相关问题移到“未分类”。是否继续? projects.column.color=彩色 @@ -1658,7 +1658,7 @@ pulls.merge_instruction_hint=`你也可以查看 命 pulls.merge_instruction_step1_desc=从你的仓库中签出一个新的分支并测试变更。 pulls.merge_instruction_step2_desc=合并变更并更新到 Gitea 上 pulls.clear_merge_message=清除合并信息 -pulls.clear_merge_message_hint=Clearing the merge message will only remove the commit message content and keep generated git trailers such as "Co-Authored-By …". +pulls.clear_merge_message_hint=清除合并消息只会删除提交消息内容,并保留生成的 git 附加内容,如“Co-Authored-By …”。 pulls.auto_merge_button_when_succeed=(当检查成功时) pulls.auto_merge_when_succeed=在所有检查成功后自动合并 @@ -2766,7 +2766,7 @@ auths.oauth2_required_claim_value_helper=设置此值,只有拥有对应的声 auths.oauth2_group_claim_name=用于提供用户组名称的 Claim 声明名称。(可选) auths.oauth2_admin_group=管理员用户组的 Claim 声明值。(可选 - 需要上面的声明名称) auths.oauth2_restricted_group=受限用户组的 Claim 声明值。(可选 - 需要上面的声明名称) -auths.oauth2_map_group_to_team=Map claimed groups to Organization teams. (Optional - requires claim name above) +auths.oauth2_map_group_to_team=映射声明的组到组织团队。(可选 - 要求在上面填写声明的名字) auths.oauth2_map_group_to_team_removal=如果用户不属于相应的组,从已同步团队中移除用户 auths.enable_auto_register=允许用户自动注册 auths.sspi_auto_create_users=自动创建用户 @@ -3246,11 +3246,11 @@ settings.delete.success=软件包已被删除。 settings.delete.error=删除软件包失败。 owner.settings.cargo.title=Cargo 注册中心索引 owner.settings.cargo.initialize=初始化索引 -owner.settings.cargo.initialize.description=To use the Cargo registry a special index git repository is needed. Here you can (re)create it with the required config. +owner.settings.cargo.initialize.description=使用 Cargo 包管理需要一个特殊的 Git 仓库。你可以在这里使用要求的配置创建或重建它。 owner.settings.cargo.initialize.error=初始化Cargo索引失败: %v owner.settings.cargo.initialize.success=Cargo索引已经成功创建。 owner.settings.cargo.rebuild=重建索引 -owner.settings.cargo.rebuild.description=If the index is out of sync with the cargo packages stored you can rebuild it here. +owner.settings.cargo.rebuild.description=如果 cargo 包的索引没有同步,你可以重建索引。 owner.settings.cargo.rebuild.error=无法重建 Cargo 索引: %v owner.settings.cargo.rebuild.success=Cargo 索引已成功重建。 owner.settings.cleanuprules.title=管理清理规则 @@ -3261,13 +3261,13 @@ owner.settings.cleanuprules.preview=清理规则预览 owner.settings.cleanuprules.preview.overview=%d 个软件包计划被删除。 owner.settings.cleanuprules.preview.none=清理规则与任何软件包都不匹配。 owner.settings.cleanuprules.enabled=启用 -owner.settings.cleanuprules.pattern_full_match=Apply pattern to full package name -owner.settings.cleanuprules.keep.title=Versions that match these rules are kept, even if they match a removal rule below. +owner.settings.cleanuprules.pattern_full_match=应用规则到完整软件包名称 +owner.settings.cleanuprules.keep.title=与这些规则相匹配的版本即使与下面的删除规则相匹配,也将予以保留。 owner.settings.cleanuprules.keep.count=保留最新的 owner.settings.cleanuprules.keep.count.1=每个软件包1个版本 owner.settings.cleanuprules.keep.count.n=每个软件包 %d 个版本 owner.settings.cleanuprules.keep.pattern=保持版本匹配 -owner.settings.cleanuprules.keep.pattern.container=The latest version is always kept for Container packages. +owner.settings.cleanuprules.keep.pattern.container=容器包的 最新版本 总是会保留。 owner.settings.cleanuprules.remove.title=与这些规则相匹配的版本将被删除,除非其中存在某个保留它们的规则。 owner.settings.cleanuprules.remove.days=移除旧于天数的版本 owner.settings.cleanuprules.remove.pattern=删除匹配的版本 @@ -3279,7 +3279,7 @@ owner.settings.chef.keypair.description=生成用于验证Chef 注册中心的 [secrets] secrets=密钥 -description=Secrets will be passed to certain actions and cannot be read otherwise. +description=Secrets 将被传给特定的 Actions,其它情况将不能读取 none=还没有密钥。 value=值 name=名称 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index a8dbdd6f6c45..cceba90ab1f1 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1421,6 +1421,7 @@ issues.error_removing_due_date=無法移除截止日期。 issues.push_commit_1=加入了 %d 個提交 %s issues.push_commits_n=加入了 %d 個提交 %s issues.force_push_codes=`強制推送了 %[1]s 自 %[2]s%[4]s %[6]s` +issues.force_push_compare=比較 issues.due_date_form=yyyy年mm月dd日 issues.due_date_form_add=新增截止日期 issues.due_date_form_edit=編輯 From 5d621fe9a7f27b5168db22dc38423b71037bcae0 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 5 Mar 2023 13:35:12 +0100 Subject: [PATCH 21/28] Add basic documentation for labels, including scoped labels (#23304) Part of #22974 --------- Co-authored-by: delvh --- docs/content/doc/usage/labels.en-us.md | 42 ++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 docs/content/doc/usage/labels.en-us.md diff --git a/docs/content/doc/usage/labels.en-us.md b/docs/content/doc/usage/labels.en-us.md new file mode 100644 index 000000000000..bf07c074edc6 --- /dev/null +++ b/docs/content/doc/usage/labels.en-us.md @@ -0,0 +1,42 @@ +--- +date: "2023-03-04T19:00:00+00:00" +title: "Usage: Labels" +slug: "labels" +weight: 13 +toc: false +draft: false +menu: + sidebar: + parent: "usage" + name: "Labels" + weight: 13 + identifier: "labels" +--- + +# Labels + +You can use labels to classify issues and pull requests and to improve your overview over them. + +## Creating Labels + +For repositories, labels can be created by going to `Issues` and clicking on `Labels`. + +For organizations, you can define organization-wide labels that are shared with all organization repositories, including both already-existing repositories as well as newly created ones. Organization-wide labels can be created in the organization `Settings`. + +Labels have a mandatory name, a mandatory color, an optional description, and must either be exclusive or not (see `Scoped labels` below). + +When you create a repository, you can ensure certain labels exist by using the `Issue Labels` option. This option lists a number of available label sets that are [configured globally on your instance](../customizing-gitea/#labels). Its contained labels will all be created as well while creating the repository. + +## Scoped Labels + +A scoped label is a label that contains `/` in its name (not at either end of the name). For example labels `kind/bug` and `kind/enhancement` both have scope `kind`. Such labels will display the scope with slightly darker color. + +The scope of a label is determined based on the **last** `/`, so for example the scope of label `scope/subscope/item` is `scope/subscope`. + +Scoped labels can be marked as exclusive. This ensures at most a single label with the same scope is assigned to an issue or pull request. For example, if `kind/bug` and `kind/enhancement` are marked exclusive, an issue can only be classified as a bug or an enhancement. + +## Filtering by Label + +Issue and pull request lists can be filtered by label. Selecting multiple labels shows issues and pull requests that have all selected labels assigned. + +By holding alt to click the label, issues and pull requests with the chosen label are excluded from the list. From e8935606f5f1fff3c59222ebca6d4615ab06fb0b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 5 Mar 2023 14:25:25 +0100 Subject: [PATCH 22/28] Scoped labels: set aria-disabled on muted Exclusive option for a11y (#23306) It is convenient to be able to toggle off this option after removing / from the name. This ensures the muted state is communicated to blind users even when the input is not fully disabled. Part of #22974 Co-authored-by: Lunny Xiao --- web_src/js/features/comp/LabelEdit.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web_src/js/features/comp/LabelEdit.js b/web_src/js/features/comp/LabelEdit.js index 313d4068218b..18676d25e6cc 100644 --- a/web_src/js/features/comp/LabelEdit.js +++ b/web_src/js/features/comp/LabelEdit.js @@ -13,6 +13,7 @@ function updateExclusiveLabelEdit(form) { if (isExclusiveScopeName(nameInput.val())) { exclusiveField.removeClass('muted'); + exclusiveField.removeAttr('aria-disabled'); if (exclusiveCheckbox.prop('checked') && exclusiveCheckbox.data('exclusive-warn')) { exclusiveWarning.removeClass('gt-hidden'); } else { @@ -20,6 +21,7 @@ function updateExclusiveLabelEdit(form) { } } else { exclusiveField.addClass('muted'); + exclusiveField.attr('aria-disabled', 'true'); exclusiveWarning.addClass('gt-hidden'); } } From 21a1d7691124dc5c1fca0ecab3de852a8671f4b8 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Sun, 5 Mar 2023 22:23:42 +0800 Subject: [PATCH 23/28] Improve the frontend guideline (#23298) ### The CustomEvent prefix There was already `ce-quick-submit`, the `ce-` prefix seems better than `us-`. Rename the only `us-` prefixed `us-load-context-popup` to `ce-` prefixed. ### Styles and Attributes in Go HTML Template https://github.com/go-gitea/gitea/pull/21855#issuecomment-1429643073 Suggest to stick to `class="c1 {{if $var}}c2{{end}}"` The readability and maintainability should be applied to the code which is read by developers, but not for the generated outputs. The template code is the code for developers, while the generated HTML are only for browsers. The `class="c1 {{if $var}}c2{{end}}"` style is clearer for developers and more intuitive, and the generated HTML also makes browsers happy (a few spaces do not affect anything) Think about a more complex case: * `class="{{if $active}}active{{end}} menu item {{if $show}}show{{end}} {{if $warn}}warn{{end}}"` * --vs-- * `class="{{if $active}}active {{end}}menu item{{if $show}} show{{end}}{{if $warn}} warn{{end}}"` The first style make it clearer to see each CSS class name with its `{{if}}` block. Co-authored-by: Lunny Xiao --- .../developers/guidelines-frontend.en-us.md | 18 ++++++++++++++++++ web_src/js/components/ContextPopup.vue | 2 +- web_src/js/features/contextpopup.js | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/docs/content/doc/developers/guidelines-frontend.en-us.md b/docs/content/doc/developers/guidelines-frontend.en-us.md index 66d3e83e938c..9ac317f40190 100644 --- a/docs/content/doc/developers/guidelines-frontend.en-us.md +++ b/docs/content/doc/developers/guidelines-frontend.en-us.md @@ -47,6 +47,8 @@ We recommend [Google HTML/CSS Style Guide](https://google.github.io/styleguide/h 7. Clarify variable types, prefer `elem.disabled = true` instead of `elem.setAttribute('disabled', 'anything')`, prefer `$el.prop('checked', var === 'yes')` instead of `$el.prop('checked', var)`. 8. Use semantic elements, prefer `
    @@ -231,7 +231,7 @@ {{template "shared/user/avatarlink" Dict "Context" $.Context "user" .Poster}} {{template "shared/user/authorlink" .Poster}} - {{$.locale.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji) (.NewTitle|RenderEmoji) $createdStr | Safe}} + {{$.locale.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji $.Context) (.NewTitle|RenderEmoji $.Context) $createdStr | Safe}}
    {{else if eq .Type 11}} diff --git a/templates/repo/issue/view_content/sidebar.tmpl b/templates/repo/issue/view_content/sidebar.tmpl index 3880e6624440..29bfac7c27ea 100644 --- a/templates/repo/issue/view_content/sidebar.tmpl +++ b/templates/repo/issue/view_content/sidebar.tmpl @@ -130,8 +130,8 @@
    {{end}} {{$previousExclusiveScope = $exclusiveScope}} - {{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}  {{RenderLabel .}} - {{if .Description}}
    {{.Description | RenderEmoji}}{{end}}
    + {{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}  {{RenderLabel $.Context .}} + {{if .Description}}
    {{.Description | RenderEmoji $.Context}}{{end}}
    {{end}}
    {{$previousExclusiveScope := "_no_scope"}} @@ -141,8 +141,8 @@
    {{end}} {{$previousExclusiveScope = $exclusiveScope}} - {{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}  {{RenderLabel .}} - {{if .Description}}
    {{.Description | RenderEmoji}}{{end}}
    + {{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}  {{RenderLabel $.Context .}} + {{if .Description}}
    {{.Description | RenderEmoji $.Context}}{{end}}
    {{end}} {{else}}
    {{.locale.Tr "repo.issues.new.no_items"}}
    @@ -487,8 +487,8 @@ {{range .BlockingDependencies}}
    - - #{{.Issue.Index}} {{.Issue.Title | RenderEmoji}} + + #{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}
    {{.Repository.OwnerName}}/{{.Repository.Name}} @@ -514,8 +514,8 @@ {{range .BlockedByDependencies}}
    - - #{{.Issue.Index}} {{.Issue.Title | RenderEmoji}} + + #{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}
    {{.Repository.OwnerName}}/{{.Repository.Name}} diff --git a/templates/repo/projects/view.tmpl b/templates/repo/projects/view.tmpl index 1450fdac1c5f..f6bc6e1a42a6 100644 --- a/templates/repo/projects/view.tmpl +++ b/templates/repo/projects/view.tmpl @@ -245,7 +245,7 @@ {{if or .Labels .Assignees}}
    {{range .Labels}} - {{RenderLabel .}} + {{RenderLabel $.Context .}} {{end}}
    {{range .Assignees}} diff --git a/templates/repo/settings/lfs_file_find.tmpl b/templates/repo/settings/lfs_file_find.tmpl index d5983ca1cc8d..81cb6498374a 100644 --- a/templates/repo/settings/lfs_file_find.tmpl +++ b/templates/repo/settings/lfs_file_find.tmpl @@ -19,7 +19,7 @@ - {{.Summary | RenderEmoji}} + {{.Summary | RenderEmoji $.Context}} diff --git a/templates/shared/issuelist.tmpl b/templates/shared/issuelist.tmpl index a43047c79de9..6f3fd0f9167d 100644 --- a/templates/shared/issuelist.tmpl +++ b/templates/shared/issuelist.tmpl @@ -34,7 +34,7 @@
    - {{RenderEmoji .Title | RenderCodeBlock}} + {{RenderEmoji $.Context .Title | RenderCodeBlock}} {{if .IsPull}} {{if (index $.CommitStatuses .PullRequest.ID)}} {{template "repo/commit_statuses" dict "Status" (index $.CommitLastStatus .PullRequest.ID) "Statuses" (index $.CommitStatuses .PullRequest.ID) "root" $}} @@ -42,7 +42,7 @@ {{end}} {{range .Labels}} - {{RenderLabel .}} + {{RenderLabel $.Context .}} {{end}}
    diff --git a/templates/user/dashboard/feeds.tmpl b/templates/user/dashboard/feeds.tmpl index 75a76db570e0..64daf4b2e7c4 100644 --- a/templates/user/dashboard/feeds.tmpl +++ b/templates/user/dashboard/feeds.tmpl @@ -72,7 +72,7 @@ {{$index := index .GetIssueInfos 0}} {{$.locale.Tr "action.comment_pull" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} {{else if eq .GetOpType 24}} - {{$linkText := .Content | RenderEmoji}} + {{$linkText := .Content | RenderEmoji $.Context}} {{$.locale.Tr "action.publish_release" (.GetRepoLink|Escape) ((printf "%s/releases/tag/%s" .GetRepoLink .GetTag)|Escape) (.ShortRepoPath|Escape) $linkText | Str2html}} {{else if eq .GetOpType 25}} {{$index := index .GetIssueInfos 0}} @@ -99,20 +99,20 @@
{{else if eq .GetOpType 6}} - {{index .GetIssueInfos 1 | RenderEmoji | RenderCodeBlock}} + {{index .GetIssueInfos 1 | RenderEmoji $.Context | RenderCodeBlock}} {{else if eq .GetOpType 7}} - {{index .GetIssueInfos 1 | RenderEmoji | RenderCodeBlock}} + {{index .GetIssueInfos 1 | RenderEmoji $.Context | RenderCodeBlock}} {{else if or (eq .GetOpType 10) (eq .GetOpType 21) (eq .GetOpType 22) (eq .GetOpType 23)}} - {{.GetIssueTitle | RenderEmoji | RenderCodeBlock}} + {{.GetIssueTitle | RenderEmoji $.Context | RenderCodeBlock}} {{$comment := index .GetIssueInfos 1}} - {{if gt (len $comment) 0}}

{{$comment | RenderEmoji}}

{{end}} + {{if gt (len $comment) 0}}

{{$comment | RenderEmoji $.Context}}

{{end}} {{else if eq .GetOpType 11}}

{{index .GetIssueInfos 1}}

{{else if or (eq .GetOpType 12) (eq .GetOpType 13) (eq .GetOpType 14) (eq .GetOpType 15)}} - {{.GetIssueTitle | RenderEmoji | RenderCodeBlock}} + {{.GetIssueTitle | RenderEmoji $.Context | RenderCodeBlock}} {{else if eq .GetOpType 25}}

{{$.locale.Tr "action.review_dismissed_reason"}}

-

{{index .GetIssueInfos 2 | RenderEmoji}}

+

{{index .GetIssueInfos 2 | RenderEmoji $.Context}}

{{end}}

{{TimeSince .GetCreate $.locale}}

From ce43208c6a36ee89875757155a0590cc24ecfb68 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 6 Mar 2023 00:15:51 +0000 Subject: [PATCH 26/28] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 1 - options/locale/locale_el-GR.ini | 1 - options/locale/locale_es-ES.ini | 1 - options/locale/locale_fa-IR.ini | 1 - options/locale/locale_fi-FI.ini | 1 - options/locale/locale_fr-FR.ini | 1 - options/locale/locale_hu-HU.ini | 1 - options/locale/locale_it-IT.ini | 1 - options/locale/locale_ja-JP.ini | 1 - options/locale/locale_ko-KR.ini | 1 - options/locale/locale_lv-LV.ini | 1 - options/locale/locale_nl-NL.ini | 1 - options/locale/locale_pl-PL.ini | 1 - options/locale/locale_pt-BR.ini | 1 - options/locale/locale_pt-PT.ini | 2 +- options/locale/locale_ru-RU.ini | 1 - options/locale/locale_si-LK.ini | 1 - options/locale/locale_sk-SK.ini | 1 - options/locale/locale_sv-SE.ini | 1 - options/locale/locale_tr-TR.ini | 1 - options/locale/locale_uk-UA.ini | 1 - options/locale/locale_zh-CN.ini | 2 +- options/locale/locale_zh-TW.ini | 1 - 23 files changed, 2 insertions(+), 23 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 1586fa2f02c3..e8e54ded92a1 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -228,7 +228,6 @@ internal_token_failed=Fehler beim Generieren des internen Tokens: %v secret_key_failed=Fehler beim Generieren des geheimen Schlüssels: %v save_config_failed=Fehler beim Speichern der Konfiguration: %v invalid_admin_setting=Administrator-Konto Einstellungen sind ungültig: %v -install_success=Willkommen! Danke, dass du Gitea gewählt hast. Viel Spaß! invalid_log_root_path=Pfad zum Log-Verzeichnis ist ungültig: %v default_keep_email_private=E-Mail-Adressen standardmäßig verbergen default_keep_email_private_popup=E-Mail-Adressen von neuen Benutzern standardmäßig verbergen. diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 88e0a6d88292..17e5f336c01f 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -230,7 +230,6 @@ internal_token_failed=Αποτυχία δημιουργίας εσωτερικο secret_key_failed=Αποτυχία δημιουργίας μυστικού κλειδιού: %v save_config_failed=Αποτυχία αποθήκευσης ρυθμίσεων: %v invalid_admin_setting=Η ρύθμιση λογαριασμού διαχειριστή δεν είναι έγκυρη: %v -install_success=Καλώς ορίσατε! Σας ευχαριστούμε που επιλέξατε το Gitea. Διασκεδάστε το και να είστε καλά! invalid_log_root_path=Η διαδρομή της καταγραφής δεν είναι έγκυρη: %v default_keep_email_private=Απόκρυψη διευθύνσεων email από προεπιλογή default_keep_email_private_popup=Απόκρυψη διευθύνσεων email των νέων λογαριασμών χρήστη σαν προεπιλογή. diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index cd560c18c093..c705740e46fe 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -230,7 +230,6 @@ internal_token_failed=Fallo al generar el INTERNAL_TOKEN: %v secret_key_failed=Fallo al generar el SECRET_KEY: %v save_config_failed=Error al guardar la configuración: %v invalid_admin_setting=La configuración de la cuenta de administración no es válida: %v -install_success=¡Bienvenido! Gracias por elegir Gitea. ¡Diviértete y cuidate! invalid_log_root_path=La ruta para los registros no es válida: %v default_keep_email_private=Ocultar direcciones de correo electrónico por defecto default_keep_email_private_popup=Ocultar direcciones de correo electrónico de nuevas cuentas de usuario por defecto. diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index 0b29e5e9b36b..7786dd69a881 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -207,7 +207,6 @@ internal_token_failed=کد داخلی ایجاد نشد: %v secret_key_failed=کلید مخفی ایجاد نشد: %v save_config_failed=تنظیمات ذخیره نشد: %v invalid_admin_setting=تنظیمات حساب مدیر نامعتبر است: %v -install_success=خوش آمدی! از شما به خاطر انتخاب گیتی یا گیت‌گو تشکر میکنیم. لذت ببرید و مراقب باشید! invalid_log_root_path=مسیر گزارش معتبر نیست: %v default_keep_email_private=مخفی کردن نشانی های ایمیل به صورت پیش فرض default_keep_email_private_popup=مخفی کردن نشانی های ایمیل از حساب های کاربر جدید به صورت پیش فرض. diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 9c7df1891664..d0f4c6e9ca52 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -220,7 +220,6 @@ invalid_repo_path=Repojen juuri polku on virheellinen: %v invalid_app_data_path=Sovelluksen datapolku on virheellinen: %v internal_token_failed=Sisäisen pääsymerkin luonti epäonnistui: %v save_config_failed=Asetusten tallentaminen epäonnistui: %v -install_success=Tervetuloa! Kiitos kun valitsit Gitean. Pidä hauskaa! default_keep_email_private=Piilota sähköpostiosoitteet oletuksena default_keep_email_private_popup=Piilota oletusarvoisesti uusien käyttäjätilien sähköpostiosoitteet. default_enable_timetracking=Ota ajan seuranta oletusarvoisesti käyttöön diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index e8718f21a983..477db4f7adb6 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -228,7 +228,6 @@ internal_token_failed=Impossible de générer le jeton interne : %v secret_key_failed=Impossible de générer la clé secrète : %v save_config_failed=L'enregistrement de la configuration %v a échoué invalid_admin_setting=Paramètres du compte administrateur invalides : %v -install_success=Bienvenue et merci d'avoir choisi Gitea. Profitez-en bien ! invalid_log_root_path=Le répertoire des fichiers de journalisation est invalide : %v default_keep_email_private=Masquer les adresses e-mail par défaut default_keep_email_private_popup=Masquer les adresses e-mail des nouveaux comptes utilisateurs par défaut. diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 562e87eedffc..542979bbf93f 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -180,7 +180,6 @@ invalid_repo_path=Repository gyökérkönyvtára helytelen: %v run_user_not_match=Futtató felhasználó más, mint az aktuális felhasználó: %s -> %s save_config_failed=Hiba történt a konfiguráció mentése közben: %v invalid_admin_setting=Hibás a rendszergazdai fiók beállítása: %v -install_success=Üdvözlünk! Köszönjük, hogy a Gitea-t választottad és jó szórakozást kívánunk a használatához! invalid_log_root_path=Naplózás gyökérmappa érvénytelen: %v default_keep_email_private=E-mail címek elrejtése alapértelmezetten default_keep_email_private_popup=Az új felhasználói fiókok e-mail címeinek elrejtése alapértelmezetten. diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index b3520b17790d..411c34663f3d 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -228,7 +228,6 @@ internal_token_failed=Generazione del token interno non riuscita: %v secret_key_failed=Generazione della chiave segreta non riuscita: %v save_config_failed=Salvataggio della configurazione non riuscito: %v invalid_admin_setting=Le impostazioni dell'account amministratore sono invalide: %v -install_success=Benvenuto! Grazie per aver scelto Gitea. Attenzione e buon divertimento! invalid_log_root_path=Il percorso del log non è valido: %v default_keep_email_private=Nascondi Indirizzo Email di Default default_keep_email_private_popup=Nasconi l'indirizzo email dei nuovi account utente di default. diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 49745fc779c5..5ad66a510166 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -237,7 +237,6 @@ internal_token_failed=内部トークンの生成に失敗しました: %v secret_key_failed=シークレットキーの生成に失敗しました: %v save_config_failed=設定ファイルの保存に失敗しました: %v invalid_admin_setting=管理者アカウントの設定が無効です: %v -install_success=ようこそ! Giteaを選択していただき、ありがとうございます。楽しんでください! invalid_log_root_path=ログの保存先パスが無効です: %v default_keep_email_private=デフォルトでメールアドレスを隠す default_keep_email_private_popup=新しいユーザーアカウントで、デフォルトでメールアドレスを隠す設定にします。 diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 777c2c0eaafa..9f4509839beb 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -170,7 +170,6 @@ invalid_repo_path=저장소(레파지토리) 의 경로가 올바르지 않습 run_user_not_match=실행 사용자명이 현재 사용자명과 다릅니다.: %s -> %s save_config_failed=설정을 저장할 수 없습니다: %v invalid_admin_setting=관리자 계정 설정이 올바르지 않습니다: %v -install_success=환영합니다! Gitea를 찾아주셔서 감사합니다. 즐거운 시간 보내세요! invalid_log_root_path=로그(Log) 의 경로가 올바르지 않습니다: %v default_keep_email_private=이메일 주소 숨김처리를 기본값으로 설정합니다. default_keep_email_private_popup=새 사용자에 대한 이메일 주소 숨김처리를 기본값으로 설정합니다. diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 1cb9c0032e66..13c2cee221f1 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -227,7 +227,6 @@ internal_token_failed=Neizdevās uzģenerēt iekšējās saziņas talonu: %v secret_key_failed=Neizdevās uzģenerēt drošības atslēgu: %v save_config_failed=Neizdevās saglabāt konfigurāciju: %v invalid_admin_setting=Nederīgs administratora iestatījums: %v -install_success=Laipni lūdzam! Paldies, ka izvēlējāties Gitea, patīkamu lietošanu! invalid_log_root_path=Nederīgs žurnalizēšanas ceļš: %v default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses default_keep_email_private_popup=Šī ir noklusētā pazīme, lai noteiktu lietotāja e-pasta adreses redzamību. Atzīmējot to e-pasta adrese visiem jaunajiem lietotājiem nebūs redzama līdz lietotājs neizmainīs to savos iestatījumos. diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index e23ed7cc2534..0feda076afb5 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -228,7 +228,6 @@ internal_token_failed=Interne token genereren mislukt: %v secret_key_failed=Geheime sleutel genereren mislukt: %v save_config_failed=Kan de configuratie niet opslaan: %v invalid_admin_setting=Instelling van de administrator-account is ongeldig: %v -install_success=Welkom! Bedankt dat u voor Gitea heeft gekozen. Veel plezier en succes ermee! invalid_log_root_path=Ongeldig log-pad: %v default_keep_email_private=Verberg standaard alle e-mailadressen default_keep_email_private_popup=Verberg standaard de email-adressen van nieuwe gebruikers. diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index a9a35066d8c4..4f5811d53f6b 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -226,7 +226,6 @@ internal_token_failed=Nie udało się wygenerować tokenu wewnętrznego: %v secret_key_failed=Nie udało się wygenerować tajnego klucza: %v save_config_failed=Nie udało się zapisać konfiguracji: %v invalid_admin_setting=Nieprawidłowe ustawienia konta administratora: %v -install_success=Witaj! Dziękujemy za wybranie Gitea. Miłej zabawy i trzymaj się! invalid_log_root_path=Ścieżka dla logów jest niepoprawna: %v default_keep_email_private=Domyślne ukrywanie adresów e-mail default_keep_email_private_popup=Domyślnie ukrywaj adresy e-mail nowych kont użytkowników. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 96c3c9b8f409..8909235d012f 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -237,7 +237,6 @@ internal_token_failed=Falha ao gerar o token interno: %v secret_key_failed=Falha ao gerar a chave secreta: %v save_config_failed=Falha ao salvar a configuração: %v invalid_admin_setting=Configuração da conta de administrador está inválida: %v -install_success=Bem-vindo! Obrigado por escolher Gitea. Divertir-se. E, tome cuidado! invalid_log_root_path=Pasta raíz do log está inválida: %v default_keep_email_private=Ocultar endereços de e-mail por padrão default_keep_email_private_popup=Ocultar endereços de e-mail de novas contas de usuário por padrão. diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index daabe979b5d7..fb2a191b4a06 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -237,7 +237,6 @@ internal_token_failed=Falha ao gerar o código interno: %v secret_key_failed=Falha ao gerar a chave secreta: %v save_config_failed=Falhou ao guardar a configuração: %v invalid_admin_setting=A configuração da conta de administrador é inválida: %v -install_success=Bem-vindo(a)! Obrigado por escolher o Gitea. Divirta-se e aproveite! invalid_log_root_path=A localização dos registos é inválida: %v default_keep_email_private=Esconder, por norma, os endereços de email default_keep_email_private_popup=Esconder, por norma, os endereços de email de novos utilizadores. @@ -248,6 +247,7 @@ default_enable_timetracking_popup=Habilitar, por norma, a contagem do tempo nos no_reply_address=Domínio dos emails ocultos no_reply_address_helper=Nome de domínio para utilizadores com um endereço de email oculto. Por exemplo, o nome de utilizador 'silva' será registado no Git como 'silva@semresposta.exemplo.org' se o domínio de email oculto estiver definido como 'semresposta.exemplo.org'. password_algorithm=Algoritmo de Hash da Senha +invalid_password_algorithm=Algoritmo de hash da senha inválido password_algorithm_helper=Definir o algoritmo de hash da senha. Os algoritmos têm requisitos e resistência distintos. `argon2`, embora tenha boas características, usa muita memória e pode ser inapropriado para sistemas pequenos. enable_update_checker=Habilitar verificador de novidades enable_update_checker_helper=Verifica, periodicamente, se foi lançada alguma versão nova, fazendo uma ligação ao gitea.io. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 5289a59ead0e..7a400451f308 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -226,7 +226,6 @@ internal_token_failed=Не удалось создать внутренний т secret_key_failed=Не удалось создать секретный ключ: %v save_config_failed=Не удалось сохранить конфигурацию: %v invalid_admin_setting=Некорректные настройки учётной записи администратора: %v -install_success=Добро пожаловать! Благодарим вас за выбор Gitea, пользуйтесь с удовольствием! invalid_log_root_path=Недопустимый путь для логов: %v default_keep_email_private=Скрывать адреса электронной почты по умолчанию default_keep_email_private_popup=Скрывать адреса электронной почты новых учетных записей по умолчанию. diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index b8d14b409d5c..23ab03b00897 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -196,7 +196,6 @@ invalid_repo_path=නිධි මූල මාර්ගය අවලංගු run_user_not_match='ලෙස ධාවනය කරන්න' පරිශීලක නාමය වත්මන් පරිශීලක නාමය නොවේ: %s -> %s save_config_failed=වින්යාසය සුරැකීමට අසමත් විය: %v invalid_admin_setting=පරිපාලක ගිණුම් සැකසුම අවලංගුයි: %v -install_success=සාදරයෙන් පිළිගනිමු! ගිටියා තෝරා ගැනීම ගැන ස්තූතියි. විනෝද වන්න! invalid_log_root_path=ලොග් මාර්ගය අවලංගුයි: %v default_keep_email_private=පෙරනිමියෙන් ඊමේල් ලිපින සඟවන්න default_keep_email_private_popup=පෙරනිමියෙන් නව පරිශීලක ගිණුම්වල විද්යුත් තැපැල් ලිපින සඟවන්න. diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 2ea7cfa8598d..f7612d4c503f 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -227,7 +227,6 @@ internal_token_failed=Nepodarilo sa vygenerovať interný token: %v secret_key_failed=Nepodarilo sa vygenerovať tajný kľúč: %v save_config_failed=Nepodarilo sa uložiť konfiguráciu: %v invalid_admin_setting=Nastavenie administrátorského účtu je neplatné: %v -install_success=Vitajte! Ďakujeme že ste si vybrali Gitea. Veľa zábavy a opatrujte sa! invalid_log_root_path=Cesta k logom je neplatná: %v default_keep_email_private=Skrývanie e-mail adries ako predvolené default_keep_email_private_popup=Predvolene skryť e-mailové adresy nových používateľských účtov. diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index ed26e35f3cca..6afe9e71181f 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -184,7 +184,6 @@ invalid_repo_path=Utvecklingskatalogens rotsökväg är ogiltig: %v run_user_not_match=Systemtjänstanvändaren är inte den nuvarande användaren: %s -> %s save_config_failed=Misslyckades att spara konfigurationen: %v invalid_admin_setting=Inställning för administartörskontot är ogiltig: %v -install_success=Välkommen! Tack för att du valt Gitea. Ha det så roligt, väl mött! invalid_log_root_path=Sökvägen för loggar är ogiltig: %v default_keep_email_private=Dölj mailadresser som standard default_keep_email_private_popup=Dölj mailadresser för nya användarkonton som standard. diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 412705a44af2..c0e5bb220847 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -230,7 +230,6 @@ internal_token_failed=Dahili belirteç oluşturulamadı: %v secret_key_failed=Gizli anahtar oluşturulamadı: %v save_config_failed=%v Yapılandırması kaydedilirken hata oluştu invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v -install_success=Hoşgeldiniz! Gitea'yı seçtiğiniz için teşekkür ederiz. Eğlenin ve kendinize iyi bakın! invalid_log_root_path=Log dosya yolu geçersiz: %v default_keep_email_private=E-posta adreslerini varsayılan olarak gizle default_keep_email_private_popup=Yeni kullanıcı hesaplarının e-posta adreslerini varsayılan olarak gizle. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index d2af5492a529..293803c10e47 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -210,7 +210,6 @@ internal_token_failed=Не вдалося згенерувати внутріш secret_key_failed=Не вдалося згенерувати секретний ключ: %v save_config_failed=Не в змозі зберегти конфігурацію: %v invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v -install_success=Ласкаво просимо! Дякуємо вам за вибір Gitea. Розважайтеся, і будьте обережні! invalid_log_root_path=Неприпустимий шлях для логів: %v default_keep_email_private=Приховати адресу електронної пошти за замовчуванням default_keep_email_private_popup=Приховати адресу електронної пошти нових облікових записів за замовчуванням. diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 538dd8bef5d6..36afb5d442f8 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -237,7 +237,6 @@ internal_token_failed=生成内部令牌失败: %v secret_key_failed=生成密钥失败: %v save_config_failed=应用配置保存失败:%v invalid_admin_setting=管理员帐户设置无效: %v -install_success=欢迎 !非常感谢您选择 Gitea,玩得开心。 invalid_log_root_path=日志路径无效: %v default_keep_email_private=默认情况下隐藏电子邮件地址 default_keep_email_private_popup=默认情况下, 隐藏新用户帐户的电子邮件地址。 @@ -248,6 +247,7 @@ default_enable_timetracking_popup=默认情况下启用新仓库的时间跟踪 no_reply_address=隐藏电子邮件 no_reply_address_helper=具有隐藏电子邮件地址的用户的域名。例如, 用户名 "joe" 将以 "joe@noreply.example.org" 的身份登录到 Git 中. 如果隐藏的电子邮件域设置为 "noreply.example.org"。 password_algorithm=密码哈希算法 +invalid_password_algorithm=无效的密码哈希算法 password_algorithm_helper=设置密码哈希算法。 算法具有不同的要求和强度。 具有良好特性的`argon2`却会占用大量内存,可能不适用于小型系统。 enable_update_checker=启用更新检查 enable_update_checker_helper=通过连接到 gitea.io 定期检查新版本发布。 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index cceba90ab1f1..edf7376e7cc4 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -228,7 +228,6 @@ internal_token_failed=產生內部 Token 失敗:%v secret_key_failed=產生密鑰失敗:%v save_config_failed=儲存設定失敗:%v invalid_admin_setting=管理員帳戶設定不正確:%v -install_success=歡迎!非常感謝您選擇 Gitea,祝你一切順利。 invalid_log_root_path=日誌根目錄設定不正確: %v default_keep_email_private=預設隱藏電子信箱 default_keep_email_private_popup=預設隱藏新使用者的電子信箱。 From 6886706f5ab6ebf5526256f422069e620e38e6bc Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Mon, 6 Mar 2023 09:37:58 +0800 Subject: [PATCH 27/28] Fix broken code editor diff preview (#23307) Close #23265, the code editor diff preview has been broken for long time. * Fix the regression for `data-line-num` * `.code-diff` is necessary to show the line number * Fix the regression for #12434 * The diff: [12434](https://github.com/go-gitea/gitea/pull/12434/files?diff=unified&w=1) * It hides the Type(4) (aka HunkHeader) for unexpected cases. Diff with ignoring whitespaces: https://github.com/go-gitea/gitea/pull/23307/files?diff=unified&w=1 Before: see the issue #23265 After: ![image](https://user-images.githubusercontent.com/2114189/222942810-286dc9af-0b39-4e9d-8585-8c299b881241.png) --- services/gitdiff/gitdiff.go | 2 +- templates/repo/diff/section_unified.tmpl | 63 +++++++++++++----------- templates/repo/editor/diff_preview.tmpl | 2 +- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 4a74c1a8944e..c50e8137ab18 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -474,7 +474,7 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader, ski sb := strings.Builder{} // OK let's set a reasonable buffer size. - // This should be let's say at least the size of maxLineCharacters or 4096 whichever is larger. + // This should be at least the size of maxLineCharacters or 4096 whichever is larger. readerSize := maxLineCharacters if readerSize < 4096 { readerSize = 4096 diff --git a/templates/repo/diff/section_unified.tmpl b/templates/repo/diff/section_unified.tmpl index 63cd510221fb..e0ec85f9a6ac 100644 --- a/templates/repo/diff/section_unified.tmpl +++ b/templates/repo/diff/section_unified.tmpl @@ -1,9 +1,9 @@ {{$file := .file}} {{range $j, $section := $file.Sections}} {{range $k, $line := $section.Lines}} - {{if or $.root.AfterCommitID (ne .GetType 4)}} - - {{if eq .GetType 4}} + + {{if eq .GetType 4}} + {{if $.root.AfterCommitID}} {{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}} @@ -22,35 +22,38 @@ {{end}} {{else}} - - + {{/* for code file preview page or comment diffs on pull comment pages, do not show the expansion arrows */}} + {{end}} - {{$inlineDiff := $section.GetComputedInlineDiffFor $line $.root.locale -}} - {{if $inlineDiff.EscapeStatus.Escaped}}{{end}} - - {{if eq .GetType 4}} - {{/* - */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/* - */}} - {{else}} - {{/* - */}}{{if and $.root.SignedUserID $.root.PageIsPullFiles}}{{/* - */}}{{/* - */}}{{svg "octicon-plus"}}{{/* - */}}{{/* - */}}{{end}}{{/* - */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/* - */}} - {{end}} - - {{if gt (len $line.Comments) 0}} - - - - {{template "repo/diff/conversation" mergeinto $.root "comments" $line.Comments}} - - + {{else}} + + + {{end}} + {{$inlineDiff := $section.GetComputedInlineDiffFor $line $.root.locale -}} + {{if $inlineDiff.EscapeStatus.Escaped}}{{end}} + + {{if eq .GetType 4}} + {{/* + */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/* + */}} + {{else}} + {{/* + */}}{{if and $.root.SignedUserID $.root.PageIsPullFiles}}{{/* + */}}{{/* + */}}{{svg "octicon-plus"}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/* + */}} {{end}} + + {{if gt (len $line.Comments) 0}} + + + + {{template "repo/diff/conversation" mergeinto $.root "comments" $line.Comments}} + + {{end}} {{end}} {{end}} diff --git a/templates/repo/editor/diff_preview.tmpl b/templates/repo/editor/diff_preview.tmpl index e6956648ca8b..e2e922be343c 100644 --- a/templates/repo/editor/diff_preview.tmpl +++ b/templates/repo/editor/diff_preview.tmpl @@ -1,6 +1,6 @@
-
+
{{template "repo/diff/section_unified" dict "file" .File "root" $}} From e0800133dc1c2cf90cef08e5bcf7e64a4b71c443 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 6 Mar 2023 15:14:00 +0800 Subject: [PATCH 28/28] Update hacking-on-gitea-zh_cn documentation (#23315) This PR fix outdated hacking-on-gitea-zh_cn documentation. --------- Co-authored-by: Jason Song --- .../doc/developers/hacking-on-gitea.zh-cn.md | 334 +++++++++++++++++- 1 file changed, 320 insertions(+), 14 deletions(-) diff --git a/docs/content/doc/developers/hacking-on-gitea.zh-cn.md b/docs/content/doc/developers/hacking-on-gitea.zh-cn.md index 3e8cd3ec573a..9c9141bf50cd 100644 --- a/docs/content/doc/developers/hacking-on-gitea.zh-cn.md +++ b/docs/content/doc/developers/hacking-on-gitea.zh-cn.md @@ -1,6 +1,6 @@ --- date: "2016-12-01T16:00:00+02:00" -title: "加入 Gitea 开源" +title: "玩转 Gitea" slug: "hacking-on-gitea" weight: 10 toc: false @@ -8,36 +8,342 @@ draft: false menu: sidebar: parent: "developers" - name: "加入 Gitea 开源" + name: "玩转 Gitea" weight: 10 identifier: "hacking-on-gitea" --- # Hacking on Gitea -首先你需要一些运行环境,这和 [从源代码安装]({{< relref "doc/installation/from-source.zh-cn.md" >}}) 相同,如果你还没有设置好,可以先阅读那个章节。 +**目录** -如果你想为 Gitea 贡献代码,你需要 Fork 这个项目并且以 `master` 为开发分支。Gitea 使用 Govendor -来管理依赖,因此所有依赖项都被工具自动 copy 在 vendor 子目录下。用下面的命令来下载源码: +{{< toc >}} -``` -go get -d code.gitea.io/gitea -``` +## 快速入门 + +要获得快速工作的开发环境,您可以使用 Gitpod。 + +[![在 Gitpod 中打开](/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/go-gitea/gitea) + +## 安装 Golang + +您需要 [安装 go]( https://golang.org/doc/install ) 并设置您的 go 环境。 + +接下来,[使用 npm 安装 Node.js](https://nodejs.org/en/download/) ,这是构建 +JavaScript 和 CSS 文件的必要工具。最低支持的 Node.js 版本是 {{< min-node-version >}} +并且推荐使用最新的 LTS 版本。 + +**注意** :当执行需要外部工具的 make 任务时,比如 +`make watch-backend`,Gitea 会自动下载并构建这些必要的组件。为了能够使用这些,你必须 +将 `"$GOPATH"/bin` 目录加入到可执行路径上。如果你不把go bin目录添加到可执行路径你必须手动 +指定可执行程序路径。 -然后你可以在 Github 上 fork [Gitea 项目](https://github.com/go-gitea/gitea),之后可以通过下面的命令进入源码目录: +**注意2** :Go版本 {{< min-go-version >}} 或更高版本是必须的。Gitea 使用 `gofmt` 来 +格式化源代码。然而,`gofmt` 的结果可能因 `go` 的版本而有差异。因此推荐安装我们持续集成使用 +的 Go版本。截至上次更新,Go 版本应该是 {{< go-version >}}。 +## 安装 Make + +Gitea 大量使用 `Make` 来自动化任务和改进开发。本指南涵盖了如何安装 Make。 + +### 在 Linux 上 + +使用包管理器安装。 + +在 Ubuntu/Debian 上: + +```bash +sudo apt-get install make ``` -cd $GOPATH/src/code.gitea.io/gitea + +在 Fedora/RHEL/CentOS 上: + +```bash +sudo yum install make ``` -要创建 pull requests 你还需要在源码中新增一个 remote 指向你 Fork 的地址,直接推送到 origin 的话会告诉你没有写权限: +### 在 Windows 上 + +Make 的这三个发行版都可以在 Windows 上运行: +- [单个二进制构建]( http://www.equation.com/servlet/equation.cmd?fa=make )。复制到某处并添加到 `PATH`。 + - [32 位版本](http://www.equation.com/ftpdir/make/32/make.exe) + - [64 位版本](http://www.equation.com/ftpdir/make/64/make.exe) +- [MinGW-w64](https://www.mingw-w64.org) / [MSYS2](https://www.msys2.org/)。 + - MSYS2 是一个工具和库的集合,为您提供一个易于使用的环境来构建、安装和运行本机 Windows 软件,它包括 MinGW-w64。 + - 在 MingGW-w64 中,二进制文件称为 `mingw32-make.exe` 而不是 `make.exe`。将 `bin` 文件夹添加到 `PATH`。 + - 在 MSYS2 中,您可以直接使用 `make`。请参阅 [MSYS2 移植](https://www.msys2.org/wiki/Porting/)。 + - 要使用 CGO_ENABLED(例如:SQLite3)编译 Gitea,您可能需要使用 [tdm-gcc](https://jmeubank.github.io/tdm-gcc/) 而不是 MSYS2 gcc,因为 MSYS2 gcc 标头缺少一些 Windows -只有 CRT 函数像 _beginthread 一样。 +- [Chocolatey包管理器]( https://chocolatey.org/packages/make )。运行`choco install make` + +**注意** :如果您尝试在 Windows 命令提示符下使用 make 进行构建,您可能会遇到问题。建议使用上述提示(Git bash 或 MinGW),但是如果您只有命令提示符(或可能是 PowerShell),则可以使用 [set](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1) 命令,例如 `set TAGS=bindata`。 + +## 下载并克隆 Gitea 源代码 + +获取源代码的推荐方法是使用 `git clone`。 + +```bash +git clone https://github.com/go-gitea/gitea ``` + +(自从go modules出现后,不再需要构建 go 项目从 `$GOPATH` 中获取,因此不再推荐使用 `go get` 方法。) + +## 派生 Gitea + +如上所述下载主要的 Gitea 源代码。然后,派生 [Gitea 仓库](https://github.com/go-gitea/gitea), +并为您的本地仓库切换 git 远程源,或添加另一个远程源: + +```bash +# 将原来的 Gitea origin 重命名为 upstream git remote rename origin upstream -git remote add origin git@github.com:/gitea.git +git remote add origin "git@github.com:$GITHUB_USERNAME/gitea.git" git fetch --all --prune ``` -然后你就可以开始开发了。你可以看一下 `Makefile` 的内容。`make test` 可以运行测试程序, `make build` 将生成一个 `gitea` 可运行文件在根目录。如果你的提交比较复杂,尽量多写一些单元测试代码。 +或者: + +```bash +# 为我们的 fork 添加新的远程 +git remote add "$FORK_NAME" "git@github.com:$GITHUB_USERNAME/gitea.git" +git fetch --all --prune +``` + +为了能够创建合并请求,应将分叉存储库添加为 Gitea 本地仓库的远程,否则无法推送更改。 + +## 构建 Gitea(基本) + +看看我们的 +说明 +关于如何 从源代码构建 。 + +从源代码构建的最简单推荐方法是: + +```bash +TAGS="bindata sqlite sqlite_unlock_notify" make build +``` + +`build` 目标将同时执行 `frontend` 和 `backend` 子目标。如果存在 `bindata` 标签,资源文件将被编译成二进制文件。建议在进行前端开发时省略 `bindata` 标签,以便实时反映更改。 + +有关所有可用的 `make` 目标,请参阅 `make help`。另请参阅 [`.drone.yml`](https://github.com/go-gitea/gitea/blob/main/.drone.yml) 以了解我们的持续集成是如何工作的。 + +## 持续构建 + +要在源文件更改时运行并持续构建: + +```bash +# 对于前端和后端 +make watch + +# 或者:只看前端文件(html/js/css) +make watch-frontend + +# 或者:只看后端文件 (go) +make watch-backend +``` + +在 macOS 上,监视所有后端源文件可能会达到默认的打开文件限制,这可以通过当前 shell 的 `ulimit -n 12288` 或所有未来 shell 的 shell 启动文件来增加。 + +### 格式化、代码分析和拼写检查 + +我们的持续集成将拒绝未通过代码检查(包括格式检查、代码分析和拼写检查)的 PR。 + +你应该格式化你的代码: + +```bash +make fmt +``` + +并检查源代码: + +```bash +# lint 前端和后端代码 +make lint +# 仅 lint 后端代码 +make lint-backend +``` + +**注意** :`gofmt` 的结果取决于 `go` 的版本。您应该运行与持续集成相同的 go 版本。 + +### 处理 JS 和 CSS + +前端开发应遵循 [Guidelines for Frontend Development]({{ < 相关参考 "doc/developers/guidelines-frontend.en-us.md" > }}) + +要使用前端资源构建,请使用上面提到的“watch-frontend”目标或只构建一次: + +```bash +make build && ./gitea +``` + +在提交之前,确保 linters 通过: + +```bash +make lint-frontend +``` + +### 配置本地 ElasticSearch 实例 + +使用 docker 启动本地 ElasticSearch 实例: + +```sh +mkdir -p $(pwd) /data/elasticsearch +sudo chown -R 1000:1000 $(pwd) /data/elasticsearch +docker run --rm --memory= "4g" -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.type=single-node" -v "$(pwd)/data /elasticsearch:/usr/share/elasticsearch/data" docker.elastic.co/elasticsearch/elasticsearch:7.16.3 +``` + +配置`app.ini`: + +```ini +[indexer] +ISSUE_INDEXER_TYPE = elasticsearch +ISSUE_INDEXER_CONN_STR = http://elastic:changeme@localhost:9200 +REPO_INDEXER_ENABLED = true +REPO_INDEXER_TYPE = elasticsearch +REPO_INDEXER_CONN_STR = http://elastic:changeme@localhost:9200 +``` + +### 构建和添加 SVGs + +SVG 图标是使用 `make svg` 目标构建的,该目标将 `build/generate-svg.js` 中定义的图标源编译到输出目录 `public/img/svg` 中。可以在 `web_src/svg` 目录中添加自定义图标。 + +### 构建 Logo + +Gitea Logo的 PNG 和 SVG 版本是使用 `TAGS="gitea" make generate-images` 目标从单个 SVG 源文件 assets/logo.svg 构建的。要运行它,Node.js 和 npm 必须可用。 + +通过更新 `assets/logo.svg` 并运行 `make generate-images`,同样的过程也可用于从 SVG 源文件生成自定义 Logo PNG。忽略 gitea 编译选项将仅更新用户指定的 LOGO 文件。 + +### 更新 API + +创建新的 API 路由或修改现有的 API 路由时,您**必须** +更新和/或创建 [Swagger](https://swagger.io/docs/specification/2-0/what-is-swagger/) +这些使用 [go-swagger](https://goswagger.io/) 评论的文档。 +[规范]( https://goswagger.io/use/spec.html#annotation-syntax )中描述了这些注释的结构。 +如果您想了解更多有关 Swagger 结构的信息,可以查看 +[Swagger 2.0 文档](https://swagger.io/docs/specification/2-0/basic-structure/) +或与添加新 API 端点的先前 PR 进行比较,例如 [PR #5483](https://github.com/go-gitea/gitea/pull/5843/files#diff-2e0a7b644cf31e1c8ef7d76b444fe3aaR20) + +您应该注意不要破坏下游用户依赖的 API。在稳定的 API 上,一般来说添加是可以接受的,但删除 +或对 API 进行根本性更改将会被拒绝。 + +创建或更改 API 端点后,请用以下命令重新生成 Swagger 文档: + +```bash +make generate-swagger +``` + +您应该验证生成的 Swagger 文件并使用以下命令对其进行拼写检查: + +```bash +make swagger-validate misspell-check +``` + +您应该提交更改后的 swagger JSON 文件。持续集成服务器将使用以下方法检查是否已完成: + +```bash +make swagger-check +``` + +**注意** :请注意,您应该使用 Swagger 2.0 文档,而不是 OpenAPI 3 文档。 + +### 创建新的配置选项 + +创建新的配置选项时,将它们添加到 `modules/setting` 的对应文件。您应该将信息添加到 `custom/conf/app.ini` +并到 配置备忘单 +在 `docs/content/doc/advanced/config-cheat-sheet.en-us.md` 中找到 + +### 更改Logo + +更改 Gitea Logo SVG 时,您将需要运行并提交结果的: + +```bash +make generate-images +``` + +这将创建必要的 Gitea 图标和其他图标。 + +### 数据库迁移 + +如果您对数据库中的任何数据库持久结构进行重大更改 +`models/` 目录,您将需要进行新的迁移。可以找到这些 +在 `models/migrations/` 中。您可以确保您的迁移适用于主要 +数据库类型使用: + +```bash +make test-sqlite-migration # 将 SQLite 切换为适当的数据库 +``` + +## 测试 + +Gitea 运行两种类型的测试:单元测试和集成测试。 + +### 单元测试 + +`go test` 系统中的`*_test.go` 涵盖了单元测试。 +您可以设置环境变量 `GITEA_UNIT_TESTS_LOG_SQL=1` 以在详细模式下运行测试时显示所有 SQL 语句(即设置`GOTESTFLAGS=-v` 时)。 + +```bash +TAGS="bindata sqlite sqlite_unlock_notify" make test # Runs the unit tests +``` + +### 集成测试 + +单元测试不会也不能完全单独测试 Gitea。因此,我们编写了集成测试;但是,这些依赖于数据库。 + +```bash +TAGS="bindata sqlite sqlite_unlock_notify" make build test-sqlite +``` + +将在 SQLite 环境中运行集成测试。集成测试需要安装 `git lfs`。其他数据库测试可用,但 +可能需要适应当地环境。 + +看看 [`tests/integration/README.md`](https://github.com/go-gitea/gitea/blob/main/tests/integration/README.md) 有关更多信息以及如何运行单个测试。 + +### 测试 PR + +我们的持续集成将测试代码是否通过了单元测试,并且所有支持的数据库都将在 Docker 环境中通过集成测试。 +还将测试从几个最新版本的 Gitea 迁移。 + +请在PR中附带提交适当的单元测试和集成测试。 + +## 网站文档 + +该网站的文档位于 `docs/` 中。如果你改变了文档内容,你可以使用以下测试方法进行持续集成: + +```bash +# 来自 Gitea 中的 docs 目录 +make trans-copy clean build +``` + +运行此任务依赖于 [Hugo](https://gohugo.io/)。请注意:这可能会生成一些未跟踪的 Git 对象, +需要被清理干净。 + +## Visual Studio Code + +`contrib/ide/vscode` 中为 Visual Studio Code 提供了 `launch.json` 和 `tasks.json`。查看 +[`contrib/ide/README.md`](https://github.com/go-gitea/gitea/blob/main/contrib/ide/README.md) 了解更多信息。 + +## Goland + +单击 `/main.go` 中函数 `func main()` 上的 `Run Application` 箭头 +可以快速启动一个可调试的 Gitea 实例。 + +`Run/Debug Configuration` 中的 `Output Directory` 必须设置为 +gitea 项目目录(包含 `main.go` 和 `go.mod`), +否则,启动实例的工作目录是 GoLand 的临时目录 +并防止 Gitea 在开发环境中加载动态资源(例如:模板)。 + +要在 GoLand 中使用 SQLite 运行单元测试,请设置 `-tags sqlite,sqlite_unlock_notify` +在 `运行/调试配置` 的 `Go 工具参数` 中。 + +## 提交 PR + +对更改感到满意后,将它们推送并打开拉取请求。它建议您允许 Gitea Managers 和 Owners 修改您的 PR +分支,因为我们需要在合并之前将其更新为 main 和/或可能是能够直接帮助解决问题。 + +任何 PR 都需要 Gitea 维护者的两次批准,并且需要通过持续集成。看看我们的 +[CONTRIBUTING.md](https://github.com/go-gitea/gitea/blob/main/CONTRIBUTING.md) +文档。 + +如果您需要更多帮助,请访问 [Discord](https://discord.gg/gitea) #Develop 频道 +并在那里聊天。 -好了,到这里你已经设置好了所有的开发 Gitea 所需的环境。欢迎成为 Gitea 的 Contributor。 +现在,您已准备好 Hacking Gitea。