Skip to content

Commit b505557

Browse files
committed
Merge remote-tracking branch 'giteaofficial/main'
* giteaofficial/main: [skip ci] Updated translations via Crowdin Display when a release attachment was uploaded (go-gitea#34261) Fix Set Email Preference dropdown and button placement (go-gitea#34255) [skip ci] Updated translations via Crowdin Update compare.tmpl (go-gitea#34251) Make public URL generation configurable (go-gitea#34250) Add API endpoint to request contents of multiple files simultaniously (go-gitea#34139)
2 parents b623b85 + 04fab18 commit b505557

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+681
-492
lines changed

custom/conf/app.example.ini

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,19 @@ RUN_USER = ; git
6363
;PROTOCOL = http
6464
;;
6565
;; Set the domain for the server.
66-
;; Most users should set it to the real website domain of their Gitea instance.
6766
;DOMAIN = localhost
6867
;;
69-
;; The AppURL used by Gitea to generate absolute links, defaults to "{PROTOCOL}://{DOMAIN}:{HTTP_PORT}/".
68+
;; The AppURL is used to generate public URL links, defaults to "{PROTOCOL}://{DOMAIN}:{HTTP_PORT}/".
7069
;; Most users should set it to the real website URL of their Gitea instance when there is a reverse proxy.
71-
;; When it is empty, Gitea will use HTTP "Host" header to generate ROOT_URL, and fall back to the default one if no "Host" header.
7270
;ROOT_URL =
7371
;;
72+
;; Controls how to detect the public URL.
73+
;; Although it defaults to "legacy" (to avoid breaking existing users), most instances should use the "auto" behavior,
74+
;; especially when the Gitea instance needs to be accessed in a container network.
75+
;; * legacy: detect the public URL from "Host" header if "X-Forwarded-Proto" header exists, otherwise use "ROOT_URL".
76+
;; * auto: always use "Host" header, and also use "X-Forwarded-Proto" header if it exists. If no "Host" header, use "ROOT_URL".
77+
;PUBLIC_URL_DETECTION = legacy
78+
;;
7479
;; For development purpose only. It makes Gitea handle sub-path ("/sub-path/owner/repo/...") directly when debugging without a reverse proxy.
7580
;; DO NOT USE IT IN PRODUCTION!!!
7681
;USE_SUB_URL_PATH = false
@@ -2439,6 +2444,8 @@ LEVEL = Info
24392444
;DEFAULT_GIT_TREES_PER_PAGE = 1000
24402445
;; Default max size of a blob returned by the blobs API (default is 10MiB)
24412446
;DEFAULT_MAX_BLOB_SIZE = 10485760
2447+
;; Default max combined size of all blobs returned by the files API (default is 100MiB)
2448+
;DEFAULT_MAX_RESPONSE_SIZE = 104857600
24422449

24432450
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24442451
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

modules/git/repo_object.go

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,3 @@ func (repo *Repository) hashObject(reader io.Reader, save bool) (string, error)
8585
}
8686
return strings.TrimSpace(stdout.String()), nil
8787
}
88-
89-
// GetRefType gets the type of the ref based on the string
90-
func (repo *Repository) GetRefType(ref string) ObjectType {
91-
if repo.IsTagExist(ref) {
92-
return ObjectTag
93-
} else if repo.IsBranchExist(ref) {
94-
return ObjectBranch
95-
} else if repo.IsCommitExist(ref) {
96-
return ObjectCommit
97-
} else if _, err := repo.GetBlob(ref); err == nil {
98-
return ObjectBlob
99-
}
100-
return ObjectType("invalid")
101-
}

modules/httplib/url.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,30 +53,31 @@ func getRequestScheme(req *http.Request) string {
5353
return ""
5454
}
5555

56-
// GuessCurrentAppURL tries to guess the current full app URL (with sub-path) by http headers. It always has a '/' suffix, exactly the same as setting.AppURL
56+
// GuessCurrentAppURL tries to guess the current full public URL (with sub-path) by http headers. It always has a '/' suffix, exactly the same as setting.AppURL
57+
// TODO: should rename it to GuessCurrentPublicURL in the future
5758
func GuessCurrentAppURL(ctx context.Context) string {
5859
return GuessCurrentHostURL(ctx) + setting.AppSubURL + "/"
5960
}
6061

6162
// GuessCurrentHostURL tries to guess the current full host URL (no sub-path) by http headers, there is no trailing slash.
6263
func GuessCurrentHostURL(ctx context.Context) string {
63-
req, ok := ctx.Value(RequestContextKey).(*http.Request)
64-
if !ok {
65-
return strings.TrimSuffix(setting.AppURL, setting.AppSubURL+"/")
66-
}
67-
// If no scheme provided by reverse proxy, then do not guess the AppURL, use the configured one.
64+
// Try the best guess to get the current host URL (will be used for public URL) by http headers.
6865
// At the moment, if site admin doesn't configure the proxy headers correctly, then Gitea would guess wrong.
6966
// There are some cases:
7067
// 1. The reverse proxy is configured correctly, it passes "X-Forwarded-Proto/Host" headers. Perfect, Gitea can handle it correctly.
7168
// 2. The reverse proxy is not configured correctly, doesn't pass "X-Forwarded-Proto/Host" headers, eg: only one "proxy_pass http://gitea:3000" in Nginx.
7269
// 3. There is no reverse proxy.
7370
// Without more information, Gitea is impossible to distinguish between case 2 and case 3, then case 2 would result in
74-
// wrong guess like guessed AppURL becomes "http://gitea:3000/" behind a "https" reverse proxy, which is not accessible by end users.
75-
// So we introduced "UseHostHeader" option, it could be enabled by setting "ROOT_URL" to empty
71+
// wrong guess like guessed public URL becomes "http://gitea:3000/" behind a "https" reverse proxy, which is not accessible by end users.
72+
// So we introduced "PUBLIC_URL_DETECTION" option, to control the guessing behavior to satisfy different use cases.
73+
req, ok := ctx.Value(RequestContextKey).(*http.Request)
74+
if !ok {
75+
return strings.TrimSuffix(setting.AppURL, setting.AppSubURL+"/")
76+
}
7677
reqScheme := getRequestScheme(req)
7778
if reqScheme == "" {
7879
// if no reverse proxy header, try to use "Host" header for absolute URL
79-
if setting.UseHostHeader && req.Host != "" {
80+
if setting.PublicURLDetection == setting.PublicURLAuto && req.Host != "" {
8081
return util.Iif(req.TLS == nil, "http://", "https://") + req.Host
8182
}
8283
// fall back to default AppURL
@@ -93,8 +94,8 @@ func GuessCurrentHostDomain(ctx context.Context) string {
9394
return util.IfZero(domain, host)
9495
}
9596

96-
// MakeAbsoluteURL tries to make a link to an absolute URL:
97-
// * If link is empty, it returns the current app URL.
97+
// MakeAbsoluteURL tries to make a link to an absolute public URL:
98+
// * If link is empty, it returns the current public URL.
9899
// * If link is absolute, it returns the link.
99100
// * Otherwise, it returns the current host URL + link, the link itself should have correct sub-path (AppSubURL) if needed.
100101
func MakeAbsoluteURL(ctx context.Context, link string) string {

modules/httplib/url_test.go

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,37 @@ func TestIsRelativeURL(t *testing.T) {
4343
func TestGuessCurrentHostURL(t *testing.T) {
4444
defer test.MockVariableValue(&setting.AppURL, "http://cfg-host/sub/")()
4545
defer test.MockVariableValue(&setting.AppSubURL, "/sub")()
46-
defer test.MockVariableValue(&setting.UseHostHeader, false)()
46+
headersWithProto := http.Header{"X-Forwarded-Proto": {"https"}}
4747

48-
ctx := t.Context()
49-
assert.Equal(t, "http://cfg-host", GuessCurrentHostURL(ctx))
48+
t.Run("Legacy", func(t *testing.T) {
49+
defer test.MockVariableValue(&setting.PublicURLDetection, setting.PublicURLLegacy)()
50+
51+
assert.Equal(t, "http://cfg-host", GuessCurrentHostURL(t.Context()))
52+
53+
// legacy: "Host" is not used when there is no "X-Forwarded-Proto" header
54+
ctx := context.WithValue(t.Context(), RequestContextKey, &http.Request{Host: "req-host:3000"})
55+
assert.Equal(t, "http://cfg-host", GuessCurrentHostURL(ctx))
56+
57+
// if "X-Forwarded-Proto" exists, then use it and "Host" header
58+
ctx = context.WithValue(t.Context(), RequestContextKey, &http.Request{Host: "req-host:3000", Header: headersWithProto})
59+
assert.Equal(t, "https://req-host:3000", GuessCurrentHostURL(ctx))
60+
})
61+
62+
t.Run("Auto", func(t *testing.T) {
63+
defer test.MockVariableValue(&setting.PublicURLDetection, setting.PublicURLAuto)()
5064

51-
ctx = context.WithValue(ctx, RequestContextKey, &http.Request{Host: "localhost:3000"})
52-
assert.Equal(t, "http://cfg-host", GuessCurrentHostURL(ctx))
65+
assert.Equal(t, "http://cfg-host", GuessCurrentHostURL(t.Context()))
5366

54-
defer test.MockVariableValue(&setting.UseHostHeader, true)()
55-
ctx = context.WithValue(ctx, RequestContextKey, &http.Request{Host: "http-host:3000"})
56-
assert.Equal(t, "http://http-host:3000", GuessCurrentHostURL(ctx))
67+
// auto: always use "Host" header, the scheme is determined by "X-Forwarded-Proto" header, or TLS config if no "X-Forwarded-Proto" header
68+
ctx := context.WithValue(t.Context(), RequestContextKey, &http.Request{Host: "req-host:3000"})
69+
assert.Equal(t, "http://req-host:3000", GuessCurrentHostURL(ctx))
5770

58-
ctx = context.WithValue(ctx, RequestContextKey, &http.Request{Host: "http-host", TLS: &tls.ConnectionState{}})
59-
assert.Equal(t, "https://http-host", GuessCurrentHostURL(ctx))
71+
ctx = context.WithValue(t.Context(), RequestContextKey, &http.Request{Host: "req-host", TLS: &tls.ConnectionState{}})
72+
assert.Equal(t, "https://req-host", GuessCurrentHostURL(ctx))
73+
74+
ctx = context.WithValue(t.Context(), RequestContextKey, &http.Request{Host: "req-host:3000", Header: headersWithProto})
75+
assert.Equal(t, "https://req-host:3000", GuessCurrentHostURL(ctx))
76+
})
6077
}
6178

6279
func TestMakeAbsoluteURL(t *testing.T) {

modules/setting/api.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ var API = struct {
1818
DefaultPagingNum int
1919
DefaultGitTreesPerPage int
2020
DefaultMaxBlobSize int64
21+
DefaultMaxResponseSize int64
2122
}{
2223
EnableSwagger: true,
2324
SwaggerURL: "",
2425
MaxResponseItems: 50,
2526
DefaultPagingNum: 30,
2627
DefaultGitTreesPerPage: 1000,
2728
DefaultMaxBlobSize: 10485760,
29+
DefaultMaxResponseSize: 104857600,
2830
}
2931

3032
func loadAPIFrom(rootCfg ConfigProvider) {

modules/setting/server.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,20 @@ const (
4141
LandingPageLogin LandingPage = "/user/login"
4242
)
4343

44+
const (
45+
PublicURLAuto = "auto"
46+
PublicURLLegacy = "legacy"
47+
)
48+
4449
// Server settings
4550
var (
4651
// AppURL is the Application ROOT_URL. It always has a '/' suffix
4752
// It maps to ini:"ROOT_URL"
4853
AppURL string
4954

55+
// PublicURLDetection controls how to use the HTTP request headers to detect public URL
56+
PublicURLDetection string
57+
5058
// AppSubURL represents the sub-url mounting point for gitea, parsed from "ROOT_URL"
5159
// It is either "" or starts with '/' and ends without '/', such as '/{sub-path}'.
5260
// This value is empty if site does not have sub-url.
@@ -56,9 +64,6 @@ var (
5664
// to make it easier to debug sub-path related problems without a reverse proxy.
5765
UseSubURLPath bool
5866

59-
// UseHostHeader makes Gitea prefer to use the "Host" request header for construction of absolute URLs.
60-
UseHostHeader bool
61-
6267
// AppDataPath is the default path for storing data.
6368
// It maps to ini:"APP_DATA_PATH" in [server] and defaults to AppWorkPath + "/data"
6469
AppDataPath string
@@ -283,10 +288,10 @@ func loadServerFrom(rootCfg ConfigProvider) {
283288
PerWritePerKbTimeout = sec.Key("PER_WRITE_PER_KB_TIMEOUT").MustDuration(PerWritePerKbTimeout)
284289

285290
defaultAppURL := string(Protocol) + "://" + Domain + ":" + HTTPPort
286-
AppURL = sec.Key("ROOT_URL").String()
287-
if AppURL == "" {
288-
UseHostHeader = true
289-
AppURL = defaultAppURL
291+
AppURL = sec.Key("ROOT_URL").MustString(defaultAppURL)
292+
PublicURLDetection = sec.Key("PUBLIC_URL_DETECTION").MustString(PublicURLLegacy)
293+
if PublicURLDetection != PublicURLAuto && PublicURLDetection != PublicURLLegacy {
294+
log.Fatal("Invalid PUBLIC_URL_DETECTION value: %s", PublicURLDetection)
290295
}
291296

292297
// Check validity of AppURL

modules/structs/git_blob.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ package structs
55

66
// GitBlobResponse represents a git blob
77
type GitBlobResponse struct {
8-
Content string `json:"content"`
9-
Encoding string `json:"encoding"`
10-
URL string `json:"url"`
11-
SHA string `json:"sha"`
12-
Size int64 `json:"size"`
8+
Content *string `json:"content"`
9+
Encoding *string `json:"encoding"`
10+
URL string `json:"url"`
11+
SHA string `json:"sha"`
12+
Size int64 `json:"size"`
1313
}

modules/structs/repo_file.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,8 @@ type FileDeleteResponse struct {
176176
Commit *FileCommitResponse `json:"commit"`
177177
Verification *PayloadCommitVerification `json:"verification"`
178178
}
179+
180+
// GetFilesOptions options for retrieving metadate and content of multiple files
181+
type GetFilesOptions struct {
182+
Files []string `json:"files" binding:"Required"`
183+
}

modules/structs/settings.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type GeneralAPISettings struct {
2626
DefaultPagingNum int `json:"default_paging_num"`
2727
DefaultGitTreesPerPage int `json:"default_git_trees_per_page"`
2828
DefaultMaxBlobSize int64 `json:"default_max_blob_size"`
29+
DefaultMaxResponseSize int64 `json:"default_max_response_size"`
2930
}
3031

3132
// GeneralAttachmentSettings contains global Attachment settings exposed by API

options/locale/locale_cs-CZ.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1652,7 +1652,6 @@ issues.pin_comment=připnuto %s
16521652
issues.unpin_comment=odepnul/a tento %s
16531653
issues.lock=Uzamknout konverzaci
16541654
issues.unlock=Odemknout konverzaci
1655-
issues.lock.unknown_reason=Úkol nelze z neznámého důvodu uzamknout.
16561655
issues.lock_duplicate=Úkol nemůže být uzamčený dvakrát.
16571656
issues.unlock_error=Nelze odemknout úkol, který je uzamčený.
16581657
issues.lock_with_reason=uzamkl/a jako <strong>%s</strong> a omezil/a konverzaci na spolupracovníky %s

options/locale/locale_de-DE.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1653,7 +1653,6 @@ issues.pin_comment=hat das %s angeheftet
16531653
issues.unpin_comment=hat das %s abgeheftet
16541654
issues.lock=Diskussion sperren
16551655
issues.unlock=Diskussion entsperren
1656-
issues.lock.unknown_reason=Es ist nicht möglich, einen Issue mit unbekanntem Grund zu sperren.
16571656
issues.lock_duplicate=Eine Diskussion kann nicht mehrfach gesperrt werden.
16581657
issues.unlock_error=Es ist nicht möglich, einen nicht gesperrten Issue zu entsperren.
16591658
issues.lock_with_reason=gesperrt als <strong>%s</strong> und Diskussion auf Mitarbeiter beschränkt %s

options/locale/locale_el-GR.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1497,7 +1497,6 @@ issues.pin_comment=διατήρησε αυτό %s
14971497
issues.unpin_comment=άφησε αυτό %s
14981498
issues.lock=Κλείδωμα συνομιλίας
14991499
issues.unlock=Ξεκλείδωμα συνομιλίας
1500-
issues.lock.unknown_reason=Αδυναμία κλειδώματος ενός ζητήματος με άγνωστο λόγο.
15011500
issues.lock_duplicate=Ένα ζήτημα δεν μπορεί να κλειδωθεί δύο φορές.
15021501
issues.unlock_error=Δεν είναι δυνατό να ξεκλειδώσετε ένα ζήτημα που δεν είναι κλειδωμένο.
15031502
issues.lock_with_reason=κλειδωμένο ως <strong>%s</strong> και περιορισμένη συνομιλία με συνεργάτες %s

options/locale/locale_es-ES.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1487,7 +1487,6 @@ issues.pin_comment=anclado este %s
14871487
issues.unpin_comment=desanclado este %s
14881488
issues.lock=Bloquear conversación
14891489
issues.unlock=Desbloquear conversación
1490-
issues.lock.unknown_reason=No se puede bloquear una incidencia con una razón desconocida.
14911490
issues.lock_duplicate=Una incidencia no puede ser bloqueada dos veces.
14921491
issues.unlock_error=No puede desbloquear una incidencia que no esta bloqueada.
14931492
issues.lock_with_reason=bloqueado como <strong>%s</strong> y conversación limitada a colaboradores %s

options/locale/locale_fa-IR.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1146,7 +1146,6 @@ issues.subscribe=مشترک شدن
11461146
issues.unsubscribe=لغو اشتراک
11471147
issues.lock=قفل کردن مکالمه
11481148
issues.unlock=بازکردن مکالمه
1149-
issues.lock.unknown_reason=نمیتوانید این موضوع را بدون دلیل ببندید.
11501149
issues.lock_duplicate=یک مسئله دومرتبه نمی‎تواند بسته شود.
11511150
issues.unlock_error=این مسئله نمی‎تواند باز شود لذا قفل نشده بود.
11521151
issues.lock_with_reason=قفل شده با عنوان <strong>%s</strong> و مکالمه همکاران %s محدود شده است

options/locale/locale_fr-FR.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1680,7 +1680,6 @@ issues.pin_comment=a épinglé ça %s.
16801680
issues.unpin_comment=a désépinglé ça %s.
16811681
issues.lock=Verrouiller la conversation
16821682
issues.unlock=Déverrouiller la conversation
1683-
issues.lock.unknown_reason=Impossible de verrouiller un ticket avec une raison inconnue.
16841683
issues.lock_duplicate=Un ticket ne peut pas être verrouillé à deux reprises.
16851684
issues.unlock_error=Impossible de déverrouiller un ticket qui n'est pas verrouillé.
16861685
issues.lock_with_reason=a verrouillé en tant que <strong>%s</strong> et limité la conversation aux collaborateurs %s

options/locale/locale_ga-IE.ini

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ files=Comhaid
117117
118118
error=Earráid
119119
error404=Níl an leathanach atá tú ag iarraidh a bhaint amach <strong>ann</strong> nó <strong>níl tú údaraithe</strong> chun é a fheiceáil.
120+
error503=Níorbh fhéidir leis an bhfreastalaí d'iarratas a chur i gcrích. Bain triail eile as ar ball.
120121
go_back=Ar ais
121122
invalid_data=Sonraí neamhbhailí: %v
122123

@@ -730,6 +731,8 @@ public_profile=Próifíl Phoiblí
730731
biography_placeholder=Inis dúinn beagán fút féin! (Is féidir leat Markdown a úsáid)
731732
location_placeholder=Comhroinn do shuíomh thart le daoine eile
732733
profile_desc=Rialú conas a thaispeánfar do phróifíl d'úsáideoirí eile. Úsáidfear do phríomhsheoladh ríomhphoist le haghaidh fógraí, aisghabháil pasfhocail agus oibríochtaí Git gréasán-bhunaithe.
734+
password_username_disabled=Níl cead agat d'ainm úsáideora a athrú. Déan teagmháil le do riarthóir suímh le haghaidh tuilleadh sonraí.
735+
password_full_name_disabled=Níl cead agat d’ainm iomlán a athrú. Déan teagmháil le do riarthóir suímh le haghaidh tuilleadh sonraí.
733736
full_name=Ainm Iomlán
734737
website=Láithreán Gréasáin
735738
location=Suíomh
@@ -1548,6 +1551,7 @@ issues.filter_project=Tionscadal
15481551
issues.filter_project_all=Gach tionscadal
15491552
issues.filter_project_none=Gan aon tionscadal
15501553
issues.filter_assignee=Sannaitheoir
1554+
issues.filter_assignee_no_assignee=Sannta do dhuine ar bith
15511555
issues.filter_assignee_any_assignee=Sannta do dhuine ar bith
15521556
issues.filter_poster=Údar
15531557
issues.filter_user_placeholder=Cuardaigh úsáideoirí
@@ -1651,6 +1655,8 @@ issues.label_archived_filter=Taispeáin lipéid cartlainne
16511655
issues.label_archive_tooltip=Eisiatar lipéid chartlainne de réir réamhshocraithe ó na moltaí nuair a dhéantar cuardach de réir lipéid.
16521656
issues.label_exclusive_desc=Ainmnigh an lipéad <code>scope/item</code> chun é a dhéanamh comheisiatach le lipéid <code>scope/</code> eile.
16531657
issues.label_exclusive_warning=Bainfear aon lipéid scóipe contrártha le linn eagarthóireacht a dhéanamh ar lipéid iarratais eisiúna nó tarraingthe.
1658+
issues.label_exclusive_order=Ordú Sórtála
1659+
issues.label_exclusive_order_tooltip=Déanfar lipéid eisiacha sa raon feidhme céanna a shórtáil de réir an oird uimhriúil seo.
16541660
issues.label_count=%d lipéid
16551661
issues.label_open_issues=%d saincheisteanna oscailte/iarratais tarraing
16561662
issues.label_edit=Cuir in eagar
@@ -1674,7 +1680,6 @@ issues.pin_comment=phionnáil an %s seo
16741680
issues.unpin_comment=bain pionna an %s seo
16751681
issues.lock=Cuir glas ar an gcomhrá
16761682
issues.unlock=Díghlasáil comhrá
1677-
issues.lock.unknown_reason=Ní féidir fadhb a ghlasáil le cúis anaithnid.
16781683
issues.lock_duplicate=Ní féidir saincheist a ghlasáil faoi dhó.
16791684
issues.unlock_error=Ní féidir saincheist nach bhfuil glasáilte a dhíghlasáil.
16801685
issues.lock_with_reason=curtha ar ceal mar <strong>%s</strong> agus comhrá teoranta do chomhoibrithe %s
@@ -2729,6 +2734,7 @@ branch.restore_success=Tá brainse "%s" curtha ar ais.
27292734
branch.restore_failed=Theip ar chur ar ais brainse "%s".
27302735
branch.protected_deletion_failed=Tá brainse "%s" cosanta. Ní féidir é a scriosadh.
27312736
branch.default_deletion_failed=Is é brainse "%s" an brainse réamhshocraithe. Ní féidir é a scriosadh.
2737+
branch.default_branch_not_exist=Níl an brainse réamhshocraithe "%s" ann.
27322738
branch.restore=`Athchóirigh Brainse "%s"`
27332739
branch.download=`Brainse Íosluchtaithe "%s"`
27342740
branch.rename=`Athainmnigh Brainse "%s"`

options/locale/locale_hu-HU.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -844,7 +844,6 @@ issues.subscribe=Feliratkozás
844844
issues.unsubscribe=Leiratkozás
845845
issues.lock=Beszélgetés lezárása
846846
issues.unlock=Beszélgetés feloldása
847-
issues.lock.unknown_reason=Egy hibajegy nem zárolható ismeretlen okból.
848847
issues.lock_duplicate=Egy hibajegy nem zárható be kétszer.
849848
issues.unlock_error=Nem nyithatsz meg egy hibajegyet ami nincs is lezárva.
850849
issues.lock_confirm=Lezárás

options/locale/locale_it-IT.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1236,7 +1236,6 @@ issues.subscribe=Iscriviti
12361236
issues.unsubscribe=Annulla iscrizione
12371237
issues.lock=Blocca conversazione
12381238
issues.unlock=Sblocca conversazione
1239-
issues.lock.unknown_reason=Impossibile bloccare un problema con un motivo sconosciuto.
12401239
issues.lock_duplicate=Un issue non può essere bloccato due volte.
12411240
issues.unlock_error=Impossibile sbloccare un problema che non è bloccato.
12421241
issues.lock_with_reason=ha bloccato come <strong>%s</strong> e limitato la conversazione ai collaboratori %s

options/locale/locale_ja-JP.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1680,7 +1680,6 @@ issues.pin_comment=がピン留め %s
16801680
issues.unpin_comment=がピン留めを解除 %s
16811681
issues.lock=会話をロック
16821682
issues.unlock=会話をアンロック
1683-
issues.lock.unknown_reason=未定義の理由ではイシューをロックできません。
16841683
issues.lock_duplicate=イシューは二重にロックできません。
16851684
issues.unlock_error=ロックされていないイシューをアンロックできません。
16861685
issues.lock_with_reason=が<strong>%s</strong>のためロックし会話を共同作業者に限定 %s

0 commit comments

Comments
 (0)