Skip to content

Commit 164e62d

Browse files
committed
Merge remote-tracking branch 'giteaofficial/main'
* giteaofficial/main: [skip ci] Updated translations via Crowdin Allow searching issues by ID (go-gitea#31479) allow synchronizing user status from OAuth2 login providers (go-gitea#31572) Enable `no-jquery/no-class-state` (go-gitea#31639) Added default sorting milestones by name (go-gitea#27084)
2 parents bf21df7 + de1a550 commit 164e62d

Some content is hidden

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

49 files changed

+461
-57
lines changed

.eslintrc.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ rules:
512512
no-jquery/no-box-model: [2]
513513
no-jquery/no-browser: [2]
514514
no-jquery/no-camel-case: [2]
515-
no-jquery/no-class-state: [0]
515+
no-jquery/no-class-state: [2]
516516
no-jquery/no-class: [0]
517517
no-jquery/no-clone: [2]
518518
no-jquery/no-closest: [0]

models/auth/source.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ func CreateSource(ctx context.Context, source *Source) error {
210210
return ErrSourceAlreadyExist{source.Name}
211211
}
212212
// Synchronization is only available with LDAP for now
213-
if !source.IsLDAP() {
213+
if !source.IsLDAP() && !source.IsOAuth2() {
214214
source.IsSyncEnabled = false
215215
}
216216

models/issues/milestone_list.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ func (opts FindMilestoneOptions) ToOrders() string {
7070
return "num_issues DESC"
7171
case "id":
7272
return "id ASC"
73+
case "name":
74+
return "name DESC"
7375
default:
74-
return "deadline_unix ASC, id ASC"
76+
return "deadline_unix ASC, name ASC"
7577
}
7678
}
7779

models/user/external_login_user.go

+38-3
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,34 @@ func UpdateExternalUserByExternalID(ctx context.Context, external *ExternalLogin
160160
return err
161161
}
162162

163+
// EnsureLinkExternalToUser link the external user to the user
164+
func EnsureLinkExternalToUser(ctx context.Context, external *ExternalLoginUser) error {
165+
has, err := db.Exist[ExternalLoginUser](ctx, builder.Eq{
166+
"external_id": external.ExternalID,
167+
"login_source_id": external.LoginSourceID,
168+
})
169+
if err != nil {
170+
return err
171+
}
172+
173+
if has {
174+
_, err = db.GetEngine(ctx).Where("external_id=? AND login_source_id=?", external.ExternalID, external.LoginSourceID).AllCols().Update(external)
175+
return err
176+
}
177+
178+
_, err = db.GetEngine(ctx).Insert(external)
179+
return err
180+
}
181+
163182
// FindExternalUserOptions represents an options to find external users
164183
type FindExternalUserOptions struct {
165184
db.ListOptions
166-
Provider string
167-
UserID int64
168-
OrderBy string
185+
Provider string
186+
UserID int64
187+
LoginSourceID int64
188+
HasRefreshToken bool
189+
Expired bool
190+
OrderBy string
169191
}
170192

171193
func (opts FindExternalUserOptions) ToConds() builder.Cond {
@@ -176,9 +198,22 @@ func (opts FindExternalUserOptions) ToConds() builder.Cond {
176198
if opts.UserID > 0 {
177199
cond = cond.And(builder.Eq{"user_id": opts.UserID})
178200
}
201+
if opts.Expired {
202+
cond = cond.And(builder.Lt{"expires_at": time.Now()})
203+
}
204+
if opts.HasRefreshToken {
205+
cond = cond.And(builder.Neq{"refresh_token": ""})
206+
}
207+
if opts.LoginSourceID != 0 {
208+
cond = cond.And(builder.Eq{"login_source_id": opts.LoginSourceID})
209+
}
179210
return cond
180211
}
181212

182213
func (opts FindExternalUserOptions) ToOrders() string {
183214
return opts.OrderBy
184215
}
216+
217+
func IterateExternalLogin(ctx context.Context, opts FindExternalUserOptions, f func(ctx context.Context, u *ExternalLoginUser) error) error {
218+
return db.Iterate(ctx, opts.ToConds(), f)
219+
}

modules/indexer/issues/db/db.go

+6
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ func (i *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (
7171
)),
7272
),
7373
)
74+
75+
if options.IsKeywordNumeric() {
76+
cond = cond.Or(
77+
builder.Eq{"`index`": options.Keyword},
78+
)
79+
}
7480
}
7581

7682
opt, err := ToDBOptions(ctx, options)

modules/indexer/issues/indexer.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -283,9 +283,9 @@ const (
283283
func SearchIssues(ctx context.Context, opts *SearchOptions) ([]int64, int64, error) {
284284
indexer := *globalIndexer.Load()
285285

286-
if opts.Keyword == "" {
286+
if opts.Keyword == "" || opts.IsKeywordNumeric() {
287287
// This is a conservative shortcut.
288-
// If the keyword is empty, db has better (at least not worse) performance to filter issues.
288+
// If the keyword is empty or an integer, db has better (at least not worse) performance to filter issues.
289289
// When the keyword is empty, it tends to listing rather than searching issues.
290290
// So if the user creates an issue and list issues immediately, the issue may not be listed because the indexer needs time to index the issue.
291291
// Even worse, the external indexer like elastic search may not be available for a while,

modules/indexer/issues/indexer_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func TestDBSearchIssues(t *testing.T) {
3131
InitIssueIndexer(true)
3232

3333
t.Run("search issues with keyword", searchIssueWithKeyword)
34+
t.Run("search issues by index", searchIssueByIndex)
3435
t.Run("search issues in repo", searchIssueInRepo)
3536
t.Run("search issues by ID", searchIssueByID)
3637
t.Run("search issues is pr", searchIssueIsPull)
@@ -87,6 +88,43 @@ func searchIssueWithKeyword(t *testing.T) {
8788
}
8889
}
8990

91+
func searchIssueByIndex(t *testing.T) {
92+
tests := []struct {
93+
opts SearchOptions
94+
expectedIDs []int64
95+
}{
96+
{
97+
SearchOptions{
98+
Keyword: "1000",
99+
RepoIDs: []int64{1},
100+
},
101+
[]int64{},
102+
},
103+
{
104+
SearchOptions{
105+
Keyword: "2",
106+
RepoIDs: []int64{1, 2, 3, 32},
107+
},
108+
[]int64{17, 12, 7, 2},
109+
},
110+
{
111+
SearchOptions{
112+
Keyword: "1",
113+
RepoIDs: []int64{58},
114+
},
115+
[]int64{19},
116+
},
117+
}
118+
119+
for _, test := range tests {
120+
issueIDs, _, err := SearchIssues(context.TODO(), &test.opts)
121+
if !assert.NoError(t, err) {
122+
return
123+
}
124+
assert.Equal(t, test.expectedIDs, issueIDs)
125+
}
126+
}
127+
90128
func searchIssueInRepo(t *testing.T) {
91129
tests := []struct {
92130
opts SearchOptions

modules/indexer/issues/internal/model.go

+8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package internal
55

66
import (
7+
"strconv"
8+
79
"code.gitea.io/gitea/models/db"
810
"code.gitea.io/gitea/modules/optional"
911
"code.gitea.io/gitea/modules/timeutil"
@@ -124,6 +126,12 @@ func (o *SearchOptions) Copy(edit ...func(options *SearchOptions)) *SearchOption
124126
return &v
125127
}
126128

129+
// used for optimized issue index based search
130+
func (o *SearchOptions) IsKeywordNumeric() bool {
131+
_, err := strconv.Atoi(o.Keyword)
132+
return err == nil
133+
}
134+
127135
type SortBy string
128136

129137
const (

options/locale/locale_cs-CZ.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1927,6 +1927,7 @@ milestones.edit_success=Milník „%s“ byl aktualizován.
19271927
milestones.deletion=Smazat milník
19281928
milestones.deletion_desc=Odstranění milníku jej smaže ze všech souvisejících úkolů. Pokračovat?
19291929
milestones.deletion_success=Milník byl odstraněn.
1930+
milestones.filter_sort.name=Název
19301931
milestones.filter_sort.earliest_due_data=Nejstarší datum dokončení
19311932
milestones.filter_sort.latest_due_date=Nejnovější datum dokončení
19321933
milestones.filter_sort.least_complete=Nejméně dokončené

options/locale/locale_de-DE.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1907,6 +1907,7 @@ milestones.edit_success=Meilenstein "%s" wurde aktualisiert.
19071907
milestones.deletion=Meilenstein löschen
19081908
milestones.deletion_desc=Das Löschen des Meilensteins entfernt ihn von allen Issues. Fortfahren?
19091909
milestones.deletion_success=Der Meilenstein wurde gelöscht.
1910+
milestones.filter_sort.name=Name
19101911
milestones.filter_sort.earliest_due_data=Frühestes Fälligkeitsdatum
19111912
milestones.filter_sort.latest_due_date=Spätestes Fälligkeitsdatum
19121913
milestones.filter_sort.least_complete=Am wenigsten vollständig

options/locale/locale_el-GR.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1826,6 +1826,7 @@ milestones.edit_success=Το ορόσημο "%s" ενημερώθηκε.
18261826
milestones.deletion=Διαγραφή Ορόσημου
18271827
milestones.deletion_desc=Η διαγραφή ενός ορόσημου το αφαιρεί από όλα τα συναφή ζητήματα. Συνέχεια;
18281828
milestones.deletion_success=Το ορόσημο έχει διαγραφεί.
1829+
milestones.filter_sort.name=Όνομα
18291830
milestones.filter_sort.earliest_due_data=Πλησιέστερη παράδοση
18301831
milestones.filter_sort.latest_due_date=Απώτερη παράδοση
18311832
milestones.filter_sort.least_complete=Λιγότερο πλήρη

options/locale/locale_en-US.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1935,6 +1935,7 @@ milestones.edit_success = Milestone "%s" has been updated.
19351935
milestones.deletion = Delete Milestone
19361936
milestones.deletion_desc = Deleting a milestone removes it from all related issues. Continue?
19371937
milestones.deletion_success = The milestone has been deleted.
1938+
milestones.filter_sort.name = Name
19381939
milestones.filter_sort.earliest_due_data = Earliest due date
19391940
milestones.filter_sort.latest_due_date = Latest due date
19401941
milestones.filter_sort.least_complete = Least complete

options/locale/locale_es-ES.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1812,6 +1812,7 @@ milestones.edit_success=Se ha actualizado el hito "%s".
18121812
milestones.deletion=Eliminar hito
18131813
milestones.deletion_desc=Eliminando un hito lo elimina de todos los problemas relacionados. ¿Continuar?
18141814
milestones.deletion_success=El hito se ha eliminado.
1815+
milestones.filter_sort.name=Nombre
18151816
milestones.filter_sort.earliest_due_data=Fecha de vencimiento más temprana
18161817
milestones.filter_sort.latest_due_date=Fecha de vencimiento más lejana
18171818
milestones.filter_sort.least_complete=Menos completa

options/locale/locale_fa-IR.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1389,6 +1389,7 @@ milestones.modify=به روزرسانی نقطه عطف
13891389
milestones.deletion=حذف نقطه عطف
13901390
milestones.deletion_desc=نقاط عطف از تمام مسائل مرتبط حذف میشوند. آیا ادامه میدهید؟
13911391
milestones.deletion_success=نقطه عطف حذف شد.
1392+
milestones.filter_sort.name=نام
13921393
milestones.filter_sort.least_complete=حداقل کامل شده
13931394
milestones.filter_sort.most_complete=بیشترین کامل شده
13941395
milestones.filter_sort.most_issues=بیشترین مسائل

options/locale/locale_fi-FI.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,7 @@ milestones.clear=Tyhjennä
10091009
milestones.edit=Muokkaa merkkipaalua
10101010
milestones.cancel=Peruuta
10111011
milestones.modify=Päivitä merkkipaalu
1012+
milestones.filter_sort.name=Nimi
10121013
milestones.filter_sort.most_issues=Eniten ongelmia
10131014
milestones.filter_sort.least_issues=Vähiten ongelmia
10141015

options/locale/locale_fr-FR.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1927,6 +1927,7 @@ milestones.edit_success=Le jalon "%s" a été mis à jour.
19271927
milestones.deletion=Supprimer un Jalon
19281928
milestones.deletion_desc=Supprimer un jalon le retire de tous les tickets. Continuer ?
19291929
milestones.deletion_success=Le jalon a été supprimé.
1930+
milestones.filter_sort.name=Nom
19301931
milestones.filter_sort.earliest_due_data=Date d’échéance la plus ancienne
19311932
milestones.filter_sort.latest_due_date=Date d’échéance la plus récente
19321933
milestones.filter_sort.least_complete=Le moins complété

options/locale/locale_hu-HU.ini

+1
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,7 @@ milestones.modify=Mérföldkő frissítése
962962
milestones.deletion=Mérföldkő törlése
963963
milestones.deletion_desc=A mérföldkő törlése eltávolítja az összes hozzárendelt hibajegyet. Biztosan folytatja?
964964
milestones.deletion_success=A mérföldkő törölve.
965+
milestones.filter_sort.name=Név
965966
milestones.filter_sort.least_complete=Legkevésbé befejezve
966967
milestones.filter_sort.most_complete=Leginkább befejezve
967968
milestones.filter_sort.most_issues=Legtöbb hibajegy

options/locale/locale_id-ID.ini

+1
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,7 @@ milestones.due_date=Jatuh Tempo (opsional)
770770
milestones.clear=Bersihkan
771771
milestones.edit=Ubah Milestone
772772
milestones.cancel=Batal
773+
milestones.filter_sort.name=Nama
773774
milestones.filter_sort.least_complete=Paling tidak lengkap
774775
milestones.filter_sort.most_complete=Paling lengkap
775776
milestones.filter_sort.most_issues=Paling banyak masalah

options/locale/locale_is-IS.ini

+1
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,7 @@ milestones.desc=Lýsing
916916
milestones.due_date=Eindagi (valfrjálst)
917917
milestones.clear=Hreinsa
918918
milestones.cancel=Hætta við
919+
milestones.filter_sort.name=Heiti
919920
milestones.filter_sort.most_issues=Flest vandamál
920921
milestones.filter_sort.least_issues=Fæst vandamál
921922

options/locale/locale_it-IT.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1512,6 +1512,7 @@ milestones.modify=Aggiorna pietra miliare
15121512
milestones.deletion=Elimina pietra miliare
15131513
milestones.deletion_desc=Eliminare una pietra miliare la rimuove da tutte le relative issue. Continuare?
15141514
milestones.deletion_success=La pietra miliare è stata eliminata.
1515+
milestones.filter_sort.name=Nome
15151516
milestones.filter_sort.least_complete=Meno completato
15161517
milestones.filter_sort.most_complete=Più completato
15171518
milestones.filter_sort.most_issues=Più problemi

options/locale/locale_ja-JP.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,7 @@ milestones.edit_success=マイルストーン "%s" を更新しました。
19331933
milestones.deletion=マイルストーンの削除
19341934
milestones.deletion_desc=マイルストーンを削除すると、関連するすべてのイシューから除去されます。 続行しますか?
19351935
milestones.deletion_success=マイルストーンを削除しました。
1936+
milestones.filter_sort.name=名称
19361937
milestones.filter_sort.earliest_due_data=期日が早い順
19371938
milestones.filter_sort.latest_due_date=期日が遅い順
19381939
milestones.filter_sort.least_complete=消化率の低い順

options/locale/locale_ko-KR.ini

+1
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,7 @@ milestones.modify=마일스톤 갱신
875875
milestones.deletion=마일스톤 삭제
876876
milestones.deletion_desc=마일스톤을 삭제하면 연관된 모든 이슈에서 삭제됩니다. 계속 하시겠습니까?
877877
milestones.deletion_success=마일스톤이 삭제되었습니다.
878+
milestones.filter_sort.name=이름
878879
milestones.filter_sort.least_complete=완료율이 낮은 순
879880
milestones.filter_sort.most_complete=완료율이 높은 순
880881
milestones.filter_sort.most_issues=이슈 많은 순

options/locale/locale_lv-LV.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1828,6 +1828,7 @@ milestones.edit_success=Izmaiņas atskaites punktā "%s" tika veiksmīgi saglab
18281828
milestones.deletion=Dzēst atskaites punktu
18291829
milestones.deletion_desc=Dzēšot šo atskaites punktu, tas tiks noņemts no visām saistītajām problēmām un izmaiņu pieprasījumiem. Vai turpināt?
18301830
milestones.deletion_success=Atskaites punkts tika veiksmīgi izdzēsts.
1831+
milestones.filter_sort.name=Nosaukums
18311832
milestones.filter_sort.earliest_due_data=Agrākais izpildes laiks
18321833
milestones.filter_sort.latest_due_date=Vēlākais izpildes laiks
18331834
milestones.filter_sort.least_complete=Vismazāk pabeigtais

options/locale/locale_nl-NL.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1507,6 +1507,7 @@ milestones.modify=Mijlpaal bijwerken
15071507
milestones.deletion=Mijlpaal verwijderen
15081508
milestones.deletion_desc=Als je een mijlpaal verwijdert, wordt hij van alle gerelateerde kwesties verwijderd. Doorgaan?
15091509
milestones.deletion_success=De mijlpaal is verwijderd.
1510+
milestones.filter_sort.name=Naam
15101511
milestones.filter_sort.least_complete=Minst compleet
15111512
milestones.filter_sort.most_complete=Meest compleet
15121513
milestones.filter_sort.most_issues=Meeste problemen

options/locale/locale_pl-PL.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,7 @@ milestones.modify=Zaktualizuj cel
13601360
milestones.deletion=Usuń kamień milowy
13611361
milestones.deletion_desc=Usunięcie celu usuwa go z wszystkich pozostałych zagadnień. Kontynuować?
13621362
milestones.deletion_success=Cel został usunięty.
1363+
milestones.filter_sort.name=Nazwa
13631364
milestones.filter_sort.least_complete=Najmniej kompletne
13641365
milestones.filter_sort.most_complete=Najbardziej kompletne
13651366
milestones.filter_sort.most_issues=Najwięcej zgłoszeń

options/locale/locale_pt-BR.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1820,6 +1820,7 @@ milestones.edit_success=O marco "%s" foi atualizado.
18201820
milestones.deletion=Excluir marco
18211821
milestones.deletion_desc=A exclusão deste marco irá removê-lo de todas as issues. Tem certeza que deseja continuar?
18221822
milestones.deletion_success=O marco foi excluído.
1823+
milestones.filter_sort.name=Nome
18231824
milestones.filter_sort.earliest_due_data=Data limite mais próxima
18241825
milestones.filter_sort.latest_due_date=Data limite mais distante
18251826
milestones.filter_sort.least_complete=Menos completo

options/locale/locale_pt-PT.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,7 @@ milestones.edit_success=A etapa "%s" foi modificada.
19331933
milestones.deletion=Eliminar etapa
19341934
milestones.deletion_desc=Se eliminar uma etapa, irá removê-la de todas as questões relacionadas. Quer continuar?
19351935
milestones.deletion_success=A etapa foi eliminada.
1936+
milestones.filter_sort.name=Nome
19361937
milestones.filter_sort.earliest_due_data=Data de vencimento mais próxima
19371938
milestones.filter_sort.latest_due_date=Data de vencimento mais distante
19381939
milestones.filter_sort.least_complete=Menos completo

options/locale/locale_ru-RU.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1789,6 +1789,7 @@ milestones.edit_success=Этап «%s» обновлён.
17891789
milestones.deletion=Удалить этап
17901790
milestones.deletion_desc=Удаление этапа приведет к его удалению из всех связанных задач. Продолжить?
17911791
milestones.deletion_success=Этап успешно удалён.
1792+
milestones.filter_sort.name=Название
17921793
milestones.filter_sort.earliest_due_data=По возрастанию даты завершения
17931794
milestones.filter_sort.latest_due_date=По убыванию даты завершения
17941795
milestones.filter_sort.least_complete=Менее полное

options/locale/locale_si-LK.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1352,6 +1352,7 @@ milestones.modify=සන්ධිස්ථානයක් යාවත්කා
13521352
milestones.deletion=සන්ධිස්ථානය මකන්න
13531353
milestones.deletion_desc=සන්ධිස්ථානයක් මකා දැමීම සම්බන්ධ සියලු ගැටළු වලින් එය ඉවත් කරයි. දිගටම?
13541354
milestones.deletion_success=සන්ධිස්ථානය මකා දමා ඇත.
1355+
milestones.filter_sort.name=නම
13551356
milestones.filter_sort.least_complete=අවම වශයෙන් සම්පූර්ණයි
13561357
milestones.filter_sort.most_complete=වඩාත්ම සම්පූර්ණයි
13571358
milestones.filter_sort.most_issues=බොහෝ ප්රශ්න

options/locale/locale_sv-SE.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1132,6 +1132,7 @@ milestones.modify=Uppdatera milstolpe
11321132
milestones.deletion=Ta bort milstolpe
11331133
milestones.deletion_desc=Borttagning av en milstolpe tar bort den från samtliga relaterade ärende. Fortsätta?
11341134
milestones.deletion_success=Milstolpen har blivit borttagen.
1135+
milestones.filter_sort.name=Namn
11351136
milestones.filter_sort.least_complete=Minst klar
11361137
milestones.filter_sort.most_complete=Mest klar
11371138
milestones.filter_sort.most_issues=Mest ärenden

options/locale/locale_tr-TR.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1920,6 +1920,7 @@ milestones.edit_success=`"%s" dönüm noktası güncellendi.`
19201920
milestones.deletion=Kilometre Taşını Sil
19211921
milestones.deletion_desc=Bir kilometre taşını silmek, onu ilgili tüm sorunlardan kaldırır. Devam edilsin mi?
19221922
milestones.deletion_success=Kilometre taşı silindi.
1923+
milestones.filter_sort.name=İsim
19231924
milestones.filter_sort.earliest_due_data=En erken bitiş tarihi
19241925
milestones.filter_sort.latest_due_date=En uzak bitiş tarihi
19251926
milestones.filter_sort.least_complete=En az tamamlama

options/locale/locale_uk-UA.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,7 @@ milestones.modify=Оновити етап
13991399
milestones.deletion=Видалити етап
14001400
milestones.deletion_desc=Видалення етапу призведе до його видалення з усіх пов'язаних задач. Продовжити?
14011401
milestones.deletion_success=Етап успішно видалено.
1402+
milestones.filter_sort.name=Назва
14021403
milestones.filter_sort.least_complete=Менш повне
14031404
milestones.filter_sort.most_complete=Більш повне
14041405
milestones.filter_sort.most_issues=Найбільш задач

options/locale/locale_zh-CN.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1923,6 +1923,7 @@ milestones.edit_success=里程碑 %s 已经更新。
19231923
milestones.deletion=删除里程碑
19241924
milestones.deletion_desc=删除该里程碑将会移除所有工单中相关的信息。是否继续?
19251925
milestones.deletion_success=里程碑已被删除。
1926+
milestones.filter_sort.name=名称
19261927
milestones.filter_sort.earliest_due_data=到期日从远到近
19271928
milestones.filter_sort.latest_due_date=到期日从近到远
19281929
milestones.filter_sort.least_complete=完成度从低到高

options/locale/locale_zh-HK.ini

+1
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ milestones.due_date=截止日期(可選)
511511
milestones.clear=清除
512512
milestones.edit=編輯里程碑
513513
milestones.cancel=取消
514+
milestones.filter_sort.name=組織名稱
514515
milestones.filter_sort.least_complete=完成度由低到高
515516
milestones.filter_sort.most_complete=完成度由高到低
516517
milestones.filter_sort.most_issues=問題由多到少

0 commit comments

Comments
 (0)