From c9c5d164d57b44728acb0dd9068a535814ecae7b Mon Sep 17 00:00:00 2001 From: Fluf <36822577+flufmonster@users.noreply.github.com> Date: Thu, 7 Jun 2018 21:23:39 -0400 Subject: [PATCH 01/86] Add myself as a maintainer (#4172) --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index 0150e8370..5deb40961 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -22,3 +22,4 @@ Peter Žeby (@morlinest) Matti Ranta (@techknowlogick) Michael Lustfield (@MTecknology) Jonas Franz (@JonasFranzDEV) +Flynn Lufmons (@flufmonster) From 3fbba2553a615efbda3f5b28a585a71824c84cc8 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 8 Jun 2018 01:24:38 +0000 Subject: [PATCH 02/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_bg-BG.ini | 2 -- options/locale/locale_cs-CZ.ini | 2 -- options/locale/locale_de-DE.ini | 2 -- options/locale/locale_es-ES.ini | 2 -- options/locale/locale_fi-FI.ini | 2 -- options/locale/locale_fr-FR.ini | 2 -- options/locale/locale_hu-HU.ini | 2 -- options/locale/locale_id-ID.ini | 2 -- options/locale/locale_it-IT.ini | 2 -- options/locale/locale_ja-JP.ini | 2 -- options/locale/locale_ko-KR.ini | 2 -- options/locale/locale_lv-LV.ini | 2 -- options/locale/locale_nl-NL.ini | 2 -- options/locale/locale_pl-PL.ini | 2 -- options/locale/locale_pt-BR.ini | 2 -- options/locale/locale_ru-RU.ini | 2 -- options/locale/locale_sr-SP.ini | 2 -- options/locale/locale_sv-SE.ini | 2 -- options/locale/locale_tr-TR.ini | 2 -- options/locale/locale_uk-UA.ini | 2 -- options/locale/locale_zh-CN.ini | 2 -- options/locale/locale_zh-HK.ini | 2 -- options/locale/locale_zh-TW.ini | 2 -- 23 files changed, 46 deletions(-) diff --git a/options/locale/locale_bg-BG.ini b/options/locale/locale_bg-BG.ini index 49b0bda05..810e8d471 100644 --- a/options/locale/locale_bg-BG.ini +++ b/options/locale/locale_bg-BG.ini @@ -606,9 +606,7 @@ config.db_config=Настройки на базата данни config.db_type=Тип config.db_host=Сървър config.db_name=Име -config.db_ssl_mode_helper=(само за postgres) config.db_path=Път -config.db_path_helper=(за "sqlite3" и "tidb") config.service_config=Настройка на услугата config.show_registration_button=Покажи бутон за регистрация diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 81a561729..818611ee2 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -603,9 +603,7 @@ config.db_config=Nastavení databáze config.db_type=Typ config.db_host=Server config.db_name=Název -config.db_ssl_mode_helper=(pouze pro 'postgres') config.db_path=Cesta -config.db_path_helper=(pro "sqlite3" a "tidb") config.service_config=Nastavení služby config.show_registration_button=Ukázat tlačítko registrace diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 68fc99a84..d3e3a8098 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -1472,9 +1472,7 @@ config.db_host=Host config.db_name=Name config.db_user=Benutzername config.db_ssl_mode=SSL -config.db_ssl_mode_helper=(nur für "postgres") config.db_path=Verzeichnis -config.db_path_helper=(für "sqlite3" und "tidb") config.service_config=Service-Konfiguration config.register_email_confirm=E-Mail-Bestätigung benötigt zum Registrieren diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 751cbd44d..5f05cce65 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -741,9 +741,7 @@ config.ssh_minimum_key_sizes=Tamaños de clave mínimos config.db_config=Configuración de la Base de Datos config.db_type=Tipo config.db_name=Nombre -config.db_ssl_mode_helper=(sólo para "postgres") config.db_path=Ruta -config.db_path_helper=(para "sqlite3" y "tidb") config.service_config=Configuración del servicio config.show_registration_button=Mostrar Botón de Registro diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index a0c76dd6c..aefe26919 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -585,9 +585,7 @@ config.db_config=Tietokannan asetukset config.db_type=Tyyppi config.db_host=Isäntä config.db_name=Nimi -config.db_ssl_mode_helper=(vain "postgres") config.db_path=Polku -config.db_path_helper=("sqlite3" ja "tidb") config.service_config=Palvelu asetukset config.show_registration_button=Näytä rekisteröidy painike diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index c22916dff..91961719e 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -818,9 +818,7 @@ config.db_config=Configuration de la base de données config.db_type=Type config.db_host=Hôte config.db_name=Nom -config.db_ssl_mode_helper=("postgres" uniquement) config.db_path=Emplacement -config.db_path_helper=(pour « sqlite3 » et « TIDB ») config.service_config=Configuration du service config.show_registration_button=Afficher le bouton d'enregistrement diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 450ae826c..b52f8f840 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -835,9 +835,7 @@ config.db_config=Adatbázis Konfiguráció config.db_type=Típus config.db_host=Kiszolgáló config.db_name=Név -config.db_ssl_mode_helper=(csak "postgres"-nek) config.db_path=Elérési út -config.db_path_helper=("sqlite3" és "tidb"-nek) config.service_config=Szolgáltatás konfiguráció config.show_registration_button=Regisztráció gomb megjelenítése diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index fb2b261e3..b6999654f 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -807,9 +807,7 @@ config.ssh_minimum_key_sizes=Ukuran kunci minimum config.db_config=Konfigurasi basis data config.db_name=Nama -config.db_ssl_mode_helper=(untuk "postgres" saja) config.db_path=Jalur -config.db_path_helper=(untuk "sqlite3 dan "tidb") config.service_config=Konfigurasi layanan config.show_registration_button=Tampilkan tombol mendaftar diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index af9acccaa..9ea365639 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -638,9 +638,7 @@ config.ssh_minimum_key_sizes=Dimensioni minime della chiave config.db_config=Configurazione Database config.db_type=Tipo config.db_name=Nome -config.db_ssl_mode_helper=(solo per "postgres") config.db_path=Percorso -config.db_path_helper=(per "sqlite3" e "tidb") config.service_config=Configurazione Servizio config.show_registration_button=Mostra Pulsane Registrazione diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 557110b1f..3c422034e 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -833,9 +833,7 @@ config.db_config=データベースの構成 config.db_type=タイプ config.db_host=ホスト config.db_name=名前 -config.db_ssl_mode_helper=(「postgres」のみ) config.db_path=パス -config.db_path_helper=("sqlite3"および"tidb"のみ) config.service_config=サービスの構成 config.show_registration_button=登録ボタンを表示します。 diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index eb17fab5d..cd4528ffb 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -687,9 +687,7 @@ config.db_config=데이터베이스 설정 config.db_type=유형 config.db_host=호스트 config.db_name=이름 -config.db_ssl_mode_helper=("postgres" 전용) config.db_path=경로 -config.db_path_helper=("sqlite3" 및 "tidb"만) config.service_config=서비스 설정 config.show_registration_button=등록 버튼을 표시 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index d2f34e08b..656910dc8 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -833,9 +833,7 @@ config.db_config=Datu bāzes konfigurācija config.db_type=Veids config.db_host=Resursdators config.db_name=Nosaukums -config.db_ssl_mode_helper=(tikai PostgreSQL datu bāzei) config.db_path=Ceļš -config.db_path_helper=(priekš "sqlite3" and "tidb") config.service_config=Pakalpojuma konfigurācija config.show_registration_button=Rādīt reģistrēšanās pogu diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 6815ce6c3..6b96b91de 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -784,9 +784,7 @@ config.db_config=Databaseconfiguratie config.db_type=Type config.db_host=Host config.db_name=Naam -config.db_ssl_mode_helper=(alleen voor "postgres") config.db_path=Pad -config.db_path_helper=(voor "sqlite3" en "tidb") config.service_config=Serviceconfiguratie config.show_registration_button=Registeren knop weergeven diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 7ed8b4715..954a37f5f 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -816,9 +816,7 @@ config.db_config=Konfiguracja bazy danych config.db_type=Typ config.db_host=Serwer config.db_name=Nazwa -config.db_ssl_mode_helper=(tylko dla „postgres”) config.db_path=Ścieżka -config.db_path_helper=(dla „sqlite3” i „tidb”) config.service_config=Konfiguracja usługi config.show_registration_button=Pokazuj przycisk rejestracji diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 62429100f..17b59f7b1 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1475,9 +1475,7 @@ config.db_host=Servidor config.db_name=Nome config.db_user=Nome de usuário config.db_ssl_mode=SSL -config.db_ssl_mode_helper=(apenas para "postgres") config.db_path=Caminho -config.db_path_helper=(para "sqlite3" e "tidb") config.service_config=Configuração do serviço config.register_email_confirm=Exigir confirmação de e-mail para se cadastrar diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index ad480edc2..a8cf3098b 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1475,9 +1475,7 @@ config.db_host=Сервер config.db_name=Имя config.db_user=Пользователь config.db_ssl_mode=SSL -config.db_ssl_mode_helper=(только для "postgres") config.db_path=Путь -config.db_path_helper=(для "sqlite3" и "tidb") config.service_config=Сервисная конфигурация config.register_email_confirm=Требуется подтверждение по электронной почте diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index fa8430e7a..3acc22c3a 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -601,9 +601,7 @@ config.db_config=Конфигурација базе података config.db_type=Тип config.db_host=Хост config.db_name=Име -config.db_ssl_mode_helper=(само за postgres) config.db_path=Пут -config.db_path_helper=(за "sqlite3" и "tidb") config.service_config=Подешавања сервиса config.show_registration_button=Прикажи дугме за регистрацију diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index b735943f6..e6bb938a5 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -738,9 +738,7 @@ config.db_config=Databaskonfiguration config.db_type=Typ config.db_host=Värd config.db_name=Namn -config.db_ssl_mode_helper=(endast för "postgres") config.db_path=Sökväg -config.db_path_helper=(för "sqlite3" och "tidb") config.service_config=Tjänstkonfiguration config.show_registration_button=Visa registreringsknapp diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 4e33fad25..f3ed0f727 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -802,9 +802,7 @@ config.db_config=Veritabanı Yapılandırması config.db_type=Türü config.db_host=Sunucu config.db_name=İsim -config.db_ssl_mode_helper=(sadece "postgres" için) config.db_path=Yol -config.db_path_helper=("sqlite3" ve "tidb" için) config.service_config=Servis Yapılandırması config.show_registration_button=Kaydolma Tuşunu Göster diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index c466e9632..4d431d711 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -1148,9 +1148,7 @@ config.db_host=Хост config.db_name=Ім'я config.db_user=Ім'я кристувача config.db_ssl_mode=SSL -config.db_ssl_mode_helper=(тільки для "postgres") config.db_path=Шлях -config.db_path_helper=(для "sqlite3" і "tidb") config.service_config=Конфігурація сервісу config.register_email_confirm=Потрібно підтвердити електронну пошту для реєстрації diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index b57eeed1a..8b23e404c 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1475,9 +1475,7 @@ config.db_host=主机 config.db_name=数据库名称 config.db_user=用户名 config.db_ssl_mode=SSL -config.db_ssl_mode_helper=(仅限 "postgres" 使用) config.db_path=数据库路径 -config.db_path_helper=(用于 "sqlite3" 和 "tidb") config.service_config=服务配置 config.register_email_confirm=需要电子邮件确认注册 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index 75d6a2db5..a64367d39 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -737,9 +737,7 @@ config.db_config=資料庫設定 config.db_type=資料庫類型 config.db_host=主機地址 config.db_name=資料庫名稱 -config.db_ssl_mode_helper=(僅限 "postgres" 使用) config.db_path=資料庫路徑 -config.db_path_helper=(用於 "sqlite3" 和 "tidb") config.service_config=服務設定 config.show_registration_button=顯示註冊按鈕 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index fbe418a7d..fa716b27d 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -808,9 +808,7 @@ config.db_config=資料庫設定 config.db_type=資料庫類型 config.db_host=主機地址 config.db_name=資料庫名稱 -config.db_ssl_mode_helper=(僅限 "postgres" 使用) config.db_path=資料庫路徑 -config.db_path_helper=(用於 "sqlite3" 和 "tidb") config.service_config=服務設定 config.show_registration_button=顯示註冊按鈕 From b5f61f1d15647a3d46eb40c951fdebb8253c04c8 Mon Sep 17 00:00:00 2001 From: Christopher Medlin Date: Fri, 8 Jun 2018 11:09:10 -0700 Subject: [PATCH 03/86] Improve logging for e-mail and OpenID already in use errors (#4174) --- models/error.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/error.go b/models/error.go index 316f8c34b..075704447 100644 --- a/models/error.go +++ b/models/error.go @@ -102,7 +102,7 @@ func IsErrEmailAlreadyUsed(err error) bool { } func (err ErrEmailAlreadyUsed) Error() string { - return fmt.Sprintf("e-mail has been used [email: %s]", err.Email) + return fmt.Sprintf("e-mail already in use [email: %s]", err.Email) } // ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error. @@ -117,7 +117,7 @@ func IsErrOpenIDAlreadyUsed(err error) bool { } func (err ErrOpenIDAlreadyUsed) Error() string { - return fmt.Sprintf("OpenID has been used [oid: %s]", err.OpenID) + return fmt.Sprintf("OpenID already in use [oid: %s]", err.OpenID) } // ErrUserOwnRepos represents a "UserOwnRepos" kind of error. From d41084c54a9cc7b32492f31ff99ac4439deec6a0 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 8 Jun 2018 18:10:06 +0000 Subject: [PATCH 04/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 3 +++ 1 file changed, 3 insertions(+) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index d3e3a8098..7895827ba 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -693,6 +693,8 @@ issues.filter_sort.recentupdate=Kürzlich aktualisiert issues.filter_sort.leastupdate=Am Längsten nicht aktualisiert issues.filter_sort.mostcomment=Am meisten kommentiert issues.filter_sort.leastcomment=Am wenigsten kommentiert +issues.filter_sort.moststars=Meiste Favoriten +issues.filter_sort.feweststars=Wenigste Favoriten issues.filter_sort.mostforks=Meiste Forks issues.filter_sort.fewestforks=Wenigste Forks issues.action_open=Öffnen @@ -1388,6 +1390,7 @@ auths.attribute_username_placeholder=Leerlassen, um den in Gitea eingegebenen Be auths.attribute_name=Vornamensattribut auths.attribute_surname=Nachnamensattribut auths.attribute_mail=E-Mail Attribut +auths.attribute_ssh_public_key=Öffentliches SSH-Schlüssel Attribut auths.attributes_in_bind=Hole Attribute im Bind-Kontext auths.use_paged_search=Seitensuche verwenden auths.search_page_size=Seitengröße From ed51aa9c92acc75a82769936ddf92ce34f538f0f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 9 Jun 2018 07:47:51 +0800 Subject: [PATCH 05/86] improve backup document and add zh-cn backup document (#4145) --- .../doc/usage/backup-and-restore.en-us.md | 3 +- .../doc/usage/backup-and-restore.zh-cn.md | 60 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 docs/content/doc/usage/backup-and-restore.zh-cn.md diff --git a/docs/content/doc/usage/backup-and-restore.en-us.md b/docs/content/doc/usage/backup-and-restore.en-us.md index aa1e4805d..fa73c38bc 100644 --- a/docs/content/doc/usage/backup-and-restore.en-us.md +++ b/docs/content/doc/usage/backup-and-restore.en-us.md @@ -34,7 +34,8 @@ directory. There should be some output similar to the following: Inside the `gitea-dump-1482906742.zip` file, will be the following: -* `custom/conf/app.ini` - Server config. +* `custom` - All config or customerize files in `custom/`. +* `data` - Data directory in , except sessions if you are using file session. This directory includes `attachments`, `avatars`, `lfs`, `indexers`, sqlite file if you are using sqlite. * `gitea-db.sql` - SQL dump of database * `gitea-repo.zip` - Complete copy of the repository directory. * `log/` - Various logs. They are not needed for a recovery or migration. diff --git a/docs/content/doc/usage/backup-and-restore.zh-cn.md b/docs/content/doc/usage/backup-and-restore.zh-cn.md new file mode 100644 index 000000000..8797d5772 --- /dev/null +++ b/docs/content/doc/usage/backup-and-restore.zh-cn.md @@ -0,0 +1,60 @@ +--- +date: "2018-06-06T09:33:00+08:00" +title: "使用: 备份与恢复" +slug: "backup-and-restore" +weight: 11 +toc: true +draft: false +menu: + sidebar: + parent: "usage" + name: "备份与恢复" + weight: 11 + identifier: "backup-and-restore" +--- + +# 备份与恢复 + +Gitea 已经实现了 `dump` 命令可以用来备份所有需要的文件到一个zip压缩文件。该压缩文件可以被用来进行数据恢复。 + +## 备份命令 (`dump`) + +先转到git用户的权限: `su git`. 再Gitea目录运行 `./gitea dump`。一般会显示类似如下的输出: + +``` +2016/12/27 22:32:09 Creating tmp work dir: /tmp/gitea-dump-417443001 +2016/12/27 22:32:09 Dumping local repositories.../home/git/gitea-repositories +2016/12/27 22:32:22 Dumping database... +2016/12/27 22:32:22 Packing dump files... +2016/12/27 22:32:34 Removing tmp work dir: /tmp/gitea-dump-417443001 +2016/12/27 22:32:34 Finish dumping in file gitea-dump-1482906742.zip +``` + +最后生成的 `gitea-dump-1482906742.zip` 文件将会包含如下内容: + +* `custom` - 所有保存在 `custom/` 目录下的配置和自定义的文件。 +* `data` - 数据目录下的所有内容不包含使用文件session的文件。该目录包含 `attachments`, `avatars`, `lfs`, `indexers`, 如果使用sqlite 还会包含 sqlite 数据库文件。 +* `gitea-db.sql` - 数据库dump出来的 SQL。 +* `gitea-repo.zip` - Git仓库压缩文件。 +* `log/` - Logs文件,如果用作迁移不是必须的。 + +中间备份文件将会在临时目录进行创建,如果您要重新指定临时目录,可以用 `--tempdir` 参数,或者用 `TMPDIR` 环境变量。 + +## Restore Command (`restore`) + +当前还没有恢复命令,恢复需要人工进行。主要是把文件和数据库进行恢复。 + +例如: + +``` +apt-get install gitea +unzip gitea-dump-1482906742.zip +cd gitea-dump-1482906742 +mv custom/conf/app.ini /etc/gitea/conf/app.ini +unzip gitea-repo.zip +mv gitea-repo/* /var/lib/gitea/repositories/ +chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea/repositories/ +mysql -u$USER -p$PASS $DATABASE Date: Fri, 8 Jun 2018 19:13:41 -0500 Subject: [PATCH 06/86] Move Screenshots to Bottom (#4128) The 'above the fold' space is very important, it seems possibly wasted with screenshots which aren't legible without enlarging. This is a proposal to move them down. --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 083c7c2d3..cf5c1df9b 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,6 @@ [![Help Contribute to Open Source](https://www.codetriage.com/go-gitea/gitea/badges/users.svg)](https://www.codetriage.com/go-gitea/gitea) [![Become a backer/sponsor of gitea](https://opencollective.com/gitea/tiers/backer/badge.svg?label=backer&color=brightgreen)](https://opencollective.com/gitea) -| | | | -|:---:|:---:|:---:| -|![Dashboard](https://image.ibb.co/dms6DG/1.png)|![Repository](https://image.ibb.co/m6MSLw/2.png)|![Commits History](https://image.ibb.co/cjrSLw/3.png)| -|![Branches](https://image.ibb.co/e6vbDG/4.png)|![Issues](https://image.ibb.co/bJTJSb/5.png)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)| -|![Releases](https://image.ibb.co/cUzgfw/7.png)|![Activity](https://image.ibb.co/eZgGDG/8.png)|![Wiki](https://image.ibb.co/dYV9YG/9.png)| -|![Diff](https://image.ibb.co/ewA9YG/10.png)|![Organization](https://image.ibb.co/ceOwDG/11.png)|![Profile](https://image.ibb.co/c44Q7b/12.png)| - ## Purpose The goal of this project is to make the easiest, fastest, and most @@ -102,3 +95,13 @@ Gitea is pronounced [/ɡɪ’ti:/](https://youtu.be/EM71-2uDAoY) as in "gi-tea" This project is licensed under the MIT License. See the [LICENSE](https://github.com/go-gitea/gitea/blob/master/LICENSE) file for the full license text. + +## Screenshots +Looking for an overview of the interface? Check it out! + +| | | | +|:---:|:---:|:---:| +|![Dashboard](https://image.ibb.co/dms6DG/1.png)|![Repository](https://image.ibb.co/m6MSLw/2.png)|![Commits History](https://image.ibb.co/cjrSLw/3.png)| +|![Branches](https://image.ibb.co/e6vbDG/4.png)|![Issues](https://image.ibb.co/bJTJSb/5.png)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)| +|![Releases](https://image.ibb.co/cUzgfw/7.png)|![Activity](https://image.ibb.co/eZgGDG/8.png)|![Wiki](https://image.ibb.co/dYV9YG/9.png)| +|![Diff](https://image.ibb.co/ewA9YG/10.png)|![Organization](https://image.ibb.co/ceOwDG/11.png)|![Profile](https://image.ibb.co/c44Q7b/12.png)| From 8786c152218a656afad8c016cf8cd678ef0c681b Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sat, 9 Jun 2018 00:14:00 +0000 Subject: [PATCH 07/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 4d431d711..4f4fda0de 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -32,6 +32,13 @@ twofa_scratch=Двофакторний одноразовий пароль passcode=Код доступу u2f_insert_key=Вставте ключ безпеки +u2f_sign_in=Натисніть кнопку на ключі безпеки. Якщо не вдається знайти кнопки, повторно вставте ключ. +u2f_press_button=Будь ласка, натисніть кнопку на ключі захисту... +u2f_use_twofa=Використовуйте дво-факторний код з вашого телефону +u2f_error=Неможливо прочитати ваш ключ безпеки! +u2f_unsupported_browser=Ваш браузер не підтримує U2F ключі. Будь ласка, спробуйте інший браузер. +u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. +u2f_error_3=Сервер не може обробити, ваш запит. u2f_reload=Оновити repository=Репозиторій @@ -132,6 +139,7 @@ confirm_password=Підтвердження пароля admin_email=Адреса електронної пошти install_btn_confirm=Встановлення Gitea test_git_failed=Не в змозі перевірити 'git' команду: %v +invalid_db_setting=Налаштування бази даних є некоректними: %v save_config_failed=Не в змозі зберегти конфігурацію: %v invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v install_success=Ласкаво просимо! Дякуємо вам за вибір Gitea. Розважайтеся, і будьте обережні! @@ -257,8 +265,12 @@ team_name_been_taken=Назва команди вже зайнято. email_been_used=Ця електронна адреса вже використовується. openid_been_used=OpenID адреса '%s' вже використовується. username_password_incorrect=Неправильне ім'я користувача або пароль. +enterred_invalid_repo_name=Невірно введено ім'я репозиторію. user_not_exist=Даний користувач не існує. +cannot_add_org_to_team=Організацію неможливо додати як учасника команди. +invalid_ssh_key=Неможливо перевірити ваш SSH ключ: %s +invalid_gpg_key=Неможливо перевірити ваш GPG ключ: %s auth_failed=Помилка автентифікації: %v @@ -383,7 +395,9 @@ access_token_deletion=Видалити токен доступу twofa_disable=Вимкнути двофакторну автентифікацію or_enter_secret=Або введіть секрет: %s +u2f_register_key=Додати ключ безпеки u2f_nickname=Псевдонім +u2f_delete_key=Видалити ключ безпеки manage_account_links=Керування обліковими записами remove_account_link=Видалити облікові записи @@ -414,6 +428,7 @@ create_repo=Створити репозиторій default_branch=Головна гілка mirror_prune=Очистити mirror_interval=Інтервал дзеркалювання (доступні значення 'h', 'm', 's') +mirror_interval_invalid=Інтервал дзеркалювання є неприпустимим. mirror_address=Клонування з URL-адреси mirror_last_synced=Остання синхронізація watchers=Спостерігачі @@ -423,6 +438,7 @@ pick_reaction=Залиште свою оцінку reactions_more=додати %d більше form.reach_limit_of_creation=Ви досягли максимальної кількості %d створених репозиторіїв. +form.name_reserved=Назву репозиторію '%s' зарезервовано. need_auth=Клонувати з авторизацією migrate_type=Тип міграції @@ -439,6 +455,7 @@ mirror_from=дзеркало forked_from=форк від fork_from_self=Ви не можете форкнути репозиторій, так як ви його власник. copy_link=Копіювати +copy_link_success=Посилання було скопійоване copy_link_error=Натисніть ⌘-C або Ctrl-C, щоб скопіювати copied=Скопійовано unwatch=Не стежити @@ -472,6 +489,7 @@ file_raw=Неформатований file_history=Історія file_view_raw=Перегляд Raw file_permalink=Постійне посилання +file_too_large=Цей файл завеликий щоб бути показаним. stored_lfs=Збережено з Git LFS commit_graph=Графік комітів @@ -498,7 +516,10 @@ editor.commit_directly_to_this_branch=Зробіть коміт прямо в г editor.create_new_branch=Створити нову гілку для цього коміту та відкрити запит на злиття. editor.new_branch_name_desc=Ім'я нової гілки… editor.cancel=Відміна +editor.filename_cannot_be_empty=Ім'я файлу не може бути порожнім. editor.branch_already_exists=Гілка '%s' вже присутня в репозиторії. +editor.directory_is_a_file=Ім'я каталогу "%s" уже використовується як ім'я файлу в цьому репозиторії. +editor.file_already_exists=Файл з назвою "%s" уже існує у цьому репозиторію. editor.no_changes_to_show=Нема змін для показу. editor.fail_to_update_file=Не вдалося оновити/створити файл '%s' через помилку: %v editor.add_subdir=Додати каталог… @@ -514,6 +535,7 @@ commits.message=Повідомлення commits.date=Дата commits.older=Давніше commits.newer=Новіше +commits.signed_by=Підписано ext_issues=Зов. Проблеми @@ -606,6 +628,7 @@ issues.label_edit=Редагувати issues.label_delete=Видалити issues.label_modify=Редагувати мітку issues.label_deletion=Видалити мітку +issues.label_deletion_success=Мітку було видалено. issues.label.filter_sort.alphabetically=За алфавітом issues.label.filter_sort.reverse_alphabetically=З кінця алфавіту issues.label.filter_sort.by_size=Розмір @@ -854,6 +877,8 @@ settings.add_deploy_key=Додати ключ для розгортування settings.is_writable=Увімкнути доступ для запису settings.title=Заголовок settings.deploy_key_content=Зміст +settings.deploy_key_deletion=Видалити ключ для розгортування +settings.deploy_key_deletion_success=Ключі розгортання було видалено. settings.branches=Гілки settings.protected_branch=Захист гілки settings.protected_branch_can_push=Дозволити push? @@ -863,6 +888,7 @@ settings.protect_whitelist_search_users=Пошук користувачів… settings.protect_whitelist_search_teams=Пошук команд… settings.add_protected_branch=Увімкнути захист settings.delete_protected_branch=Вимкнути захист +settings.protected_branch_deletion=Відключити захист гілки settings.choose_branch=Оберіть гілку… settings.no_protected_branch=Немає захищених гілок. @@ -902,6 +928,8 @@ release.save_draft=Зберегти чернетку release.edit_release=Оновити реліз release.delete_release=Видалити реліз release.deletion=Видалити реліз +release.deletion_success=Реліз, було видалено. +release.tag_name_invalid=Неприпустиме ім'я тега. release.downloads=Завантажити branch.name=Ім'я гілки @@ -909,9 +937,13 @@ branch.search=Пошук гілок branch.delete_head=Видалити branch.delete=Видалити гілку '%s' branch.delete_html=Видалити гілку +branch.deletion_success=Гілка '%s' видалена. +branch.deletion_failed=Не вдалося видалити гілку "%s". branch.create_from=з '%s' +branch.create_success=Створено гілку "%s". branch.branch_already_exists=Гілка '%s' вже присутня в репозиторії. branch.deleted_by=Видалено %s +branch.restore_success=Гілку "%s" відновлено. topic.manage_topics=Керувати тематичними мітками topic.done=Готово @@ -934,6 +966,7 @@ team_name_helper=Назва команди має бути простою та team_permission_desc=Права доступу team_unit_desc=Дозволити доступ до розділів репозиторію +form.name_reserved=Назву організації '%s' зарезервовано. settings=Налаштування settings.options=Організація @@ -941,6 +974,7 @@ settings.full_name=Повне ім'я settings.website=Веб-сайт settings.location=Розташування settings.update_settings=Оновити налаштування +settings.update_setting_success=Налаштування організації оновлені. settings.delete=Видалити організацію settings.delete_account=Видалити цю організацію settings.confirm_delete_account=Підтвердіть видалення @@ -972,6 +1006,7 @@ teams.update_settings=Оновити налаштування teams.delete_team=Видалити команду teams.add_team_member=Додати учасника команди teams.delete_team_title=Видалити команду +teams.delete_team_success=Команду було видалено. teams.read_permission_desc=Ця команда має доступ для читання: учасники можуть переглядати та клонувати репозиторії. teams.write_permission_desc=Ця команда надає доступ на запис: учасники можуть отримувати й виконувати push команди до репозитрію. teams.admin_permission_desc=Ця команда надає адміністраторський доступ: учасники можуть читати, виконувати push команди та додавати співробітників до репозиторію. @@ -1008,6 +1043,7 @@ dashboard.server_uptime=Uptime серверу dashboard.current_memory_usage=Поточне використання пам'яті dashboard.total_memory_allocated=Виділено пам'яті загалом dashboard.memory_obtained=Отримано пам'яті +dashboard.memory_allocate_times=Виділення пам'яті dashboard.current_heap_usage=Поточне використання динамічної пам'яті dashboard.heap_memory_obtained=Отримано динамічної пам'яті dashboard.heap_memory_idle=Не використовується динамічною пам'яттю @@ -1041,6 +1077,7 @@ users.send_register_notify=Надіслати повідомлення про р users.edit=Редагувати users.auth_source=Джерело автентифікації users.local=Локальні +users.update_profile_success=Обліковий запис користувача було оновлено. users.edit_account=Редагувати обліковий запис users.max_repo_creation=Максимальна кількість репозиторіїв users.max_repo_creation_desc=(Введіть -1, щоб використовувати глобальний ліміт за замовчуванням.) @@ -1052,6 +1089,7 @@ users.allow_import_local=Може імпортувати локальні реп users.allow_create_organization=Може створювати організацій users.update_profile=Оновити обліковий запис users.delete_account=Видалити цей обліковий запис +users.deletion_success=Обліковий запис користувача було видалено. orgs.org_manage_panel=Керування організаціями orgs.name=Назва @@ -1074,6 +1112,7 @@ auths.new=Додати джерело автентифікації auths.name=Ім'я auths.type=Тип auths.enabled=Увімкнено +auths.syncenabled=Увімкнути синхронізацію користувача auths.updated=Оновлено auths.auth_type=Тип автентифікації auths.auth_name=Назва автентифікації @@ -1081,6 +1120,8 @@ auths.security_protocol=Протокол безпеки auths.domain=Домен auths.host=Хост auths.port=Порт +auths.bind_dn=Прив'язати DN +auths.bind_password=Прив'язати пароль auths.user_base=База пошуку користувачів auths.user_dn=DN користувача auths.search_page_size=Розмір сторінки @@ -1094,6 +1135,7 @@ auths.enable_tls=Увімкнути TLS-шифрування auths.skip_tls_verify=Пропустити перевірку TLS auths.pam_service_name=Ім'я служби PAM auths.oauth2_provider=Постачальник OAuth2 +auths.oauth2_clientID=ID клієнта (ключ) auths.oauth2_clientSecret=Ключ клієнта auths.oauth2_tokenURL=URL токену auths.oauth2_authURL=URL авторизації @@ -1133,6 +1175,7 @@ config.script_type=Тип скрипта config.ssh_config=Конфігурація SSH config.ssh_enabled=Увімкнено +config.ssh_start_builtin_server=Використовувати вбудований сервер config.ssh_domain=Домен сервера config.ssh_port=Порт config.ssh_listen_port=Порт що прослуховується @@ -1199,6 +1242,7 @@ config.session_life_time=Час життя сесії config.https_only=Тільки HTTPS config.cookie_life_time=Час життя cookie-файлу +config.picture_config=Налаштування фотографії або аватари config.picture_service=Сервіс зображень config.disable_gravatar=Вимкнути Gravatar config.enable_federated_avatar=Увімкнути зовнішні аватари @@ -1298,6 +1342,7 @@ mark_as_unread=Позначити як непрочитане mark_all_as_read=Позначити всі як прочитані [gpg] +error.generate_hash=Не вдалося згенерувати хеш коміту error.not_signed_commit=Непідписаний коміт [units] From 048468560f98929bdb252403ef5c3012900769ea Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sat, 9 Jun 2018 18:03:23 +0200 Subject: [PATCH 08/86] Add security advice to contrib guide (#4187) * Improve contributing guidelines for security --- CONTRIBUTING.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e02110b57..13f1ce41c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -201,6 +201,10 @@ an advisor has time to code review, we will gladly welcome them back to the maintainers team. If a maintainer is inactive for more than 3 months and forgets to leave the maintainers team, the owners may move him or her from the maintainers team to the advisors team. +For security reasons, Maintainers should use 2FA for their accounts and +if possible provide gpg signed commits. +https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/ +https://help.github.com/articles/signing-commits-with-gpg/ ## Owners @@ -211,6 +215,9 @@ be the main owner, and the other two the assistant owners. When the new owners have been elected, the old owners will give up ownership to the newly elected owners. If an owner is unable to do so, the other owners will assist in ceding ownership to the newly elected owners. +For security reasons, Owners or any account with write access (like a bot) +must use 2FA. +https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/ After the election, the new owners should proactively agree with our [CONTRIBUTING](CONTRIBUTING.md) requirements in the From 47f59589c5971f69b6ad9a066bcd6798384266df Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 9 Jun 2018 15:16:16 -0400 Subject: [PATCH 09/86] Update backup and restore doc usage (#4165) Edit example of `./gitea dump` to include -c option to pass app.ini Signed-off-by: Jesse Lucas --- docs/content/doc/usage/backup-and-restore.en-us.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/doc/usage/backup-and-restore.en-us.md b/docs/content/doc/usage/backup-and-restore.en-us.md index fa73c38bc..a0816ebe4 100644 --- a/docs/content/doc/usage/backup-and-restore.en-us.md +++ b/docs/content/doc/usage/backup-and-restore.en-us.md @@ -20,7 +20,7 @@ file can be unpacked and used to restore an instance. ## Backup Command (`dump`) -Switch to the user running gitea: `su git`. Run `./gitea dump` in the gitea installation +Switch to the user running gitea: `su git`. Run `./gitea dump -c /path/to/app.ini` in the gitea installation directory. There should be some output similar to the following: ``` From ef0bc57ae7df50736534563d359ef9d0f2015c1d Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sat, 9 Jun 2018 19:16:38 +0000 Subject: [PATCH 10/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 4f4fda0de..70d31b18e 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -343,9 +343,13 @@ primary=Основний primary_email=Зробити основним delete_email=Видалити email_deletion=Видалити адресу електронної пошти +openid_deletion=Видалити адресу OpenID add_new_email=Додати нову адресу електронної пошти +add_new_openid=Додати новий OpenID URI add_email=Додати адресу електронної пошти +add_openid=Додати OpenID URI add_email_confirmation_sent=Електронний лист із підтвердженням було відправлено на '%s', будь ласка, перевірте вашу поштову скриньку протягом наступних %s, щоб підтвердити адресу. +add_email_success=Додано нову адресу електронної пошти. keep_email_private=Приховати адресу електронної пошти keep_email_private_popup=Вашу адресу електронної пошти буде приховано від інших користувачів. @@ -394,6 +398,7 @@ access_token_deletion=Видалити токен доступу twofa_disable=Вимкнути двофакторну автентифікацію or_enter_secret=Або введіть секрет: %s +passcode_invalid=Некоректний пароль. Спробуй ще раз. u2f_register_key=Додати ключ безпеки u2f_nickname=Псевдонім @@ -403,8 +408,10 @@ manage_account_links=Керування обліковими записами remove_account_link=Видалити облікові записи orgs_none=Ви не є учасником будь-якої організації. +repos_none=У вас немає власних репозиторіїв delete_account=Видалити ваш обліковий запис +delete_prompt=Ця операція остаточно видалить обліковий запис користувача. Це НЕ МОЖЛИВО відмінити. confirm_delete_account=Підтвердження видалення delete_account_title=Видалити цей обліковий запис @@ -490,6 +497,7 @@ file_history=Історія file_view_raw=Перегляд Raw file_permalink=Постійне посилання file_too_large=Цей файл завеликий щоб бути показаним. +video_not_supported_in_browser=Ваш браузер не підтримує тег 'video' HTML5. stored_lfs=Збережено з Git LFS commit_graph=Графік комітів @@ -497,6 +505,7 @@ editor.new_file=Новий файл editor.upload_file=Завантажити файл editor.edit_file=Редагування файлу editor.preview_changes=Попередній перегляд змін +editor.cannot_edit_non_text_files=Бінарні файли не можливо редагувати у веб-інтерфейсі. editor.edit_this_file=Редагувати файл editor.must_be_on_a_branch=Ви повинні бути у гілці щоб зробити, або запропонувати зміни до цього файлу. editor.fork_before_edit=Необхідно зробити форк цього репозиторій, щоб внести або запропонувати зміни в цей файл. From 9033eaeec1a082bd03a726daaccb85cb64b364d1 Mon Sep 17 00:00:00 2001 From: Fluf <36822577+flufmonster@users.noreply.github.com> Date: Sat, 9 Jun 2018 16:51:10 -0400 Subject: [PATCH 11/86] Only show "You cannot fork a repository you own" when needed (#4130) --- templates/repo/header.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 6d1d9edf8..6f54cb9f6 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -32,7 +32,7 @@ {{if .CanBeForked}}
- + {{$.i18n.Tr "repo.fork"}} From f54626df0b8aed0c3374cb6caafdb49aa4198006 Mon Sep 17 00:00:00 2001 From: Fluf <36822577+flufmonster@users.noreply.github.com> Date: Sat, 9 Jun 2018 18:35:14 -0400 Subject: [PATCH 12/86] Add config path as an optional flag when changing pass via CLI (#4184) --- cmd/admin.go | 9 +++++++++ docs/content/doc/usage/command-line.md | 1 + 2 files changed, 10 insertions(+) diff --git a/cmd/admin.go b/cmd/admin.go index 6c79141ea..4fb0810c6 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -73,6 +73,11 @@ var ( Value: "", Usage: "New password to set for user", }, + cli.StringFlag{ + Name: "config, c", + Value: "custom/conf/app.ini", + Usage: "Custom configuration file path", + }, }, } @@ -123,6 +128,10 @@ func runChangePassword(c *cli.Context) error { return err } + if c.IsSet("config") { + setting.CustomConf = c.String("config") + } + if err := initDB(); err != nil { return err } diff --git a/docs/content/doc/usage/command-line.md b/docs/content/doc/usage/command-line.md index 9c16d4904..a7a10b4e4 100644 --- a/docs/content/doc/usage/command-line.md +++ b/docs/content/doc/usage/command-line.md @@ -62,6 +62,7 @@ Admin operations: - Options: - `--username value`, `-u value`: Username. Required. - `--password value`, `-p value`: New password. Required. + - `--config path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini). - Examples: - `gitea admin change-password --username myname --password asecurepassword` - `regenerate` From af57d6ab8a5a1f0f8bb3f52a081736c8c57cbd72 Mon Sep 17 00:00:00 2001 From: David Schneiderbauer Date: Sun, 10 Jun 2018 03:48:45 +0200 Subject: [PATCH 13/86] undo #3142 because processes don't use the util.Timestamp (#4203) --- templates/admin/monitor.tmpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/admin/monitor.tmpl b/templates/admin/monitor.tmpl index ceca29146..6cc927d68 100644 --- a/templates/admin/monitor.tmpl +++ b/templates/admin/monitor.tmpl @@ -49,8 +49,8 @@ {{.PID}} {{.Description}} - {{.Start.FormatLong}} - {{TimeSinceUnix .Start $.Lang}} + {{DateFmtLong .Start}} + {{TimeSince .Start $.Lang}} {{end}} From 2bb73fe12c1377f133192afd40197d897558de63 Mon Sep 17 00:00:00 2001 From: nickolas360 Date: Sun, 10 Jun 2018 11:42:16 -0700 Subject: [PATCH 14/86] HTML-escape text READMEs (#4192) --- routers/repo/view.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/routers/repo/view.go b/routers/repo/view.go index d2efe3009..4f1deeae4 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -105,7 +105,9 @@ func renderDirectory(ctx *context.Context, treeLink string) { ctx.Data["FileContent"] = string(markup.Render(readmeFile.Name(), buf, treeLink, ctx.Repo.Repository.ComposeMetas())) } else { ctx.Data["IsRenderedHTML"] = true - ctx.Data["FileContent"] = string(bytes.Replace(buf, []byte("\n"), []byte(`
`), -1)) + ctx.Data["FileContent"] = strings.Replace( + gotemplate.HTMLEscapeString(string(buf)), "\n", `
`, -1, + ) } } } @@ -208,7 +210,9 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st ctx.Data["FileContent"] = string(markup.Render(blob.Name(), buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas())) } else if readmeExist { ctx.Data["IsRenderedHTML"] = true - ctx.Data["FileContent"] = string(bytes.Replace(buf, []byte("\n"), []byte(`
`), -1)) + ctx.Data["FileContent"] = strings.Replace( + gotemplate.HTMLEscapeString(string(buf)), "\n", `
`, -1, + ) } else { // Building code view blocks with line number on server side. var fileContent string From e3b77f92c1213159c7c4b14fbc65798e8c85706d Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 10 Jun 2018 18:43:21 +0000 Subject: [PATCH 15/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 70d31b18e..f205decda 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -365,6 +365,7 @@ key_id=ID ключа key_name=Ім'я ключа key_content=Зміст add_key_success=SSH ключ '%s' додано. +add_gpg_key_success=GPG ключ '%s' додано. delete_key=Видалити ssh_key_deletion=Видалити SSH ключ gpg_key_deletion=Видалити GPG ключ @@ -972,6 +973,7 @@ org_desc=Опис team_name=Назва команди team_desc=Опис team_name_helper=Назва команди має бути простою та зрозумілою. +team_desc_helper=Опишіть мету або роль команди. team_permission_desc=Права доступу team_unit_desc=Дозволити доступ до розділів репозиторію @@ -984,6 +986,8 @@ settings.website=Веб-сайт settings.location=Розташування settings.update_settings=Оновити налаштування settings.update_setting_success=Налаштування організації оновлені. +settings.change_orgname_prompt=Ця зміна змінить посилання на організацію. +settings.update_avatar_success=Аватар організації оновлений. settings.delete=Видалити організацію settings.delete_account=Видалити цю організацію settings.confirm_delete_account=Підтвердіть видалення @@ -1049,9 +1053,11 @@ dashboard.delete_inactivate_accounts_success=Усі неактивні облі dashboard.delete_repo_archives=Видалити всі архіви репозиторіїв dashboard.git_gc_repos_success=Всі репозиторії завершили збирання сміття. dashboard.server_uptime=Uptime серверу +dashboard.current_goroutine=Поточна кількість Goroutines dashboard.current_memory_usage=Поточне використання пам'яті dashboard.total_memory_allocated=Виділено пам'яті загалом dashboard.memory_obtained=Отримано пам'яті +dashboard.pointer_lookup_times=Пошуків вказівника dashboard.memory_allocate_times=Виділення пам'яті dashboard.current_heap_usage=Поточне використання динамічної пам'яті dashboard.heap_memory_obtained=Отримано динамічної пам'яті @@ -1059,6 +1065,7 @@ dashboard.heap_memory_idle=Не використовується динаміч dashboard.heap_memory_in_use=Використовується динамічною пам'яттю dashboard.heap_memory_released=Звільнено динамічної пам'яті dashboard.heap_objects=Об'єктів динамічної пам'яті +dashboard.bootstrap_stack_usage=Використання стеку Bootstrap dashboard.stack_memory_obtained=Зайнято пам'яті стеком dashboard.mspan_structures_usage=Використання структур MSpan dashboard.mspan_structures_obtained=Отримано структур MSpan @@ -1133,6 +1140,7 @@ auths.bind_dn=Прив'язати DN auths.bind_password=Прив'язати пароль auths.user_base=База пошуку користувачів auths.user_dn=DN користувача +auths.attribute_username=Атрибут імені користувача auths.search_page_size=Розмір сторінки auths.filter=Користувацький фільтр auths.admin_filter=Фільтр адміністратора @@ -1276,12 +1284,14 @@ monitor.name=Ім'я monitor.schedule=Розклад monitor.next=Наступного разу monitor.previous=Попереднього разу +monitor.execute_times=Кількість виконань monitor.process=Запущені процеси monitor.desc=Опис monitor.start=Час початку monitor.execute_time=Час виконання notices.system_notice_list=Сповіщення системи +notices.view_detail_header=Переглянути деталі повідомлення notices.actions=Дії notices.select_all=Вибрати все notices.deselect_all=Скасувати виділення @@ -1336,6 +1346,7 @@ raw_minutes=хвилини [dropzone] default_message=Перетягніть файли або натисніть тут, щоб завантажити. +invalid_input_type=Ви не можете завантажувати файли цього типу. file_too_big=Розмір файлу ({{filesize}} MB), що більше ніж максимальний розмір: ({{maxFilesize}} MB). remove_file=Видалити файл From 3da0d437e9a32dd5ba1df29debde3c5c2bc06782 Mon Sep 17 00:00:00 2001 From: BNolet Date: Mon, 11 Jun 2018 03:12:38 -0400 Subject: [PATCH 16/86] Fixed spelling + clarity (#4213) Message given when password was too short was incorrectly spelled and was not clear enough. --- options/locale/locale_en-US.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index e510e9954..8cf6111c6 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -213,7 +213,7 @@ send_reset_mail = Click here to resend your password reset email reset_password = Reset Your Password invalid_code = Your confirmation code is invalid or has expired. reset_password_helper = Click here to reset your password -password_too_short = Password length cannot be less then %d. +password_too_short = Password length cannot be less than %d characters. non_local_account = Non-local users can not update their password through the Gitea web interface. verify = Verify scratch_code = Scratch code From 508092a24859732f1669610051a627c12f713234 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 11 Jun 2018 07:13:54 +0000 Subject: [PATCH 17/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index f205decda..4fae01062 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -266,6 +266,8 @@ email_been_used=Ця електронна адреса вже використо openid_been_used=OpenID адреса '%s' вже використовується. username_password_incorrect=Неправильне ім'я користувача або пароль. enterred_invalid_repo_name=Невірно введено ім'я репозиторію. +enterred_invalid_owner_name=Ім'я нового власника не є дійсним. +enterred_invalid_password=Введений вами пароль некоректний. user_not_exist=Даний користувач не існує. cannot_add_org_to_team=Організацію неможливо додати як учасника команди. From da898d4066e4d2a0f10ba668faf43879fd927dd2 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 12 Jun 2018 06:54:30 +0800 Subject: [PATCH 18/86] fix delete comment bug (#4216) --- models/issue_comment.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/models/issue_comment.go b/models/issue_comment.go index a829c8066..1c7c57dd0 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -147,6 +147,10 @@ func (c *Comment) AfterLoad(session *xorm.Session) { // AfterDelete is invoked from XORM after the object is deleted. func (c *Comment) AfterDelete() { + if c.ID <= 0 { + return + } + _, err := DeleteAttachmentsByComment(c.ID, true) if err != nil { From 37359aee6801c6ff034c832800e3d90e256aa21a Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 11 Jun 2018 22:55:33 +0000 Subject: [PATCH 19/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_bg-BG.ini | 1 - options/locale/locale_cs-CZ.ini | 1 - options/locale/locale_de-DE.ini | 1 - options/locale/locale_es-ES.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_id-ID.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_lt-LT.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 | 2 +- options/locale/locale_ru-RU.ini | 1 - options/locale/locale_sr-SP.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 | 1 - options/locale/locale_zh-HK.ini | 1 - options/locale/locale_zh-TW.ini | 1 - 24 files changed, 1 insertion(+), 24 deletions(-) diff --git a/options/locale/locale_bg-BG.ini b/options/locale/locale_bg-BG.ini index 810e8d471..f0d6b1c0a 100644 --- a/options/locale/locale_bg-BG.ini +++ b/options/locale/locale_bg-BG.ini @@ -79,7 +79,6 @@ has_unconfirmed_mail=Здравейте %s, имате непотвърден а resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение reset_password=Нулиране на паролата reset_password_helper=Щракнете тук, за да нулирате паролата си -password_too_short=Размерът на паролата не може да бъде по-малък от %d знака. [mail] activate_account=Моля активирайте Вашия профил diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 818611ee2..1fc7e193d 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -79,7 +79,6 @@ has_unconfirmed_mail=Zdravím, %s, máte nepotvrzenou e-mailovou adresu (%s%s resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi reset_password=Nollaa salasanasi reset_password_helper=Klikkaa tästä nollataksesi salasanasi -password_too_short=Salasanan pituus ei voi olla vähemmän kuin %d merkkiä. verify=Vahvista [mail] diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 91961719e..50e90b96f 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -97,7 +97,6 @@ email_not_associate=L'adresse e-mail n'est associée à aucun compte. send_reset_mail=Cliquez ici pour renvoyer le mail de réinitialisation de votre mot de passe reset_password=Réinitialiser le mot de passe reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe -password_too_short=Le mot de passe doit contenir %d caractères minimum. verify=Vérifier scratch_code=Code de secours use_scratch_code=Utiliser un code de secours diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index b52f8f840..7693a4312 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -101,7 +101,6 @@ email_not_associate=Az email cím nincsen hozzárendelve egyetlen fiókhoz sem. send_reset_mail=Kattints ide hogy újraküldd a jelszó visszaállító emailt reset_password=Jelszó visszaállítása reset_password_helper=Kattintson ide, hogy visszaállítsa a jelszavát -password_too_short=A jelszó nem lehet rövidebb, mint %d karakter. verify=Ellenőrzés scratch_code=Kaparós kód use_scratch_code=Kaparós kód használata diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index b6999654f..56f14d771 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -97,7 +97,6 @@ email_not_associate=Alamat surel tidak terhubung dengan akun apapun. send_reset_mail=Klik di sini untuk mengirim ulang surel pengaturan ulang kata sandi reset_password=Atur Ulang Kata Sandi Anda reset_password_helper=Klik di sini untuk mengatur ulang kata sandi anda -password_too_short=Panjang kata sandi tidak boleh kurang dari %d. verify=Verifikasi scratch_code=Kode coretan use_scratch_code=Gunakan kode coretan diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 9ea365639..e3b752851 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -97,7 +97,6 @@ email_not_associate=L'indirizzo email non è associato ad alcuna conta. send_reset_mail=Clicca qui per inviare nuovamente la tua email di reimpostazione della password reset_password=Reimposta la tua Password reset_password_helper=Clicca qui per reimpostare la password -password_too_short=La lunghezza della password non può essere meno %d caratteri. verify=Verifica scratch_code=Codice Gratta e Vinci use_scratch_code=Utilizza un codice di zero diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 3c422034e..ea32ad3c3 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -101,7 +101,6 @@ email_not_associate=このEメールアドレスは、どのアカウントに send_reset_mail=パスワードリセットメールを再送するにはここをクリックしてください reset_password=パスワードリセット reset_password_helper=パスワードをリセットするにはここをクリック -password_too_short=%d文字未満のパスワードは設定できません。 verify=確認 scratch_code=スクラッチコード use_scratch_code=スクラッチコードを使う diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index cd4528ffb..6497467f4 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -97,7 +97,6 @@ email_not_associate=이 이메일 주소로 등록된 계정이 없습니다. send_reset_mail=여기를 눌러 비밀번호 초기화 메일을 재전송 reset_password=비밀번호 초기화 reset_password_helper=이곳을 눌러 비밀번호를 재설정 -password_too_short=비밀번호의 길이는 %d글자 미만일 수 없습니다. verify=확인 scratch_code=스크래치 코드 use_scratch_code=스크래치 코드 사용 diff --git a/options/locale/locale_lt-LT.ini b/options/locale/locale_lt-LT.ini index 8a9f067ab..e12afe377 100644 --- a/options/locale/locale_lt-LT.ini +++ b/options/locale/locale_lt-LT.ini @@ -75,7 +75,6 @@ active_your_account=Aktyvinkite savo paskyrą resend_mail=Spauskite čia norėdami persiųsti aktyvacijos laišką reset_password=Atstatyti slaptažodį reset_password_helper=Paspauskite čia norėdami pakeisti savo slaptažodį -password_too_short=Slaptažodis negali būti trumpesnis nei %d simbolių. verify=Patikrinti [mail] diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 656910dc8..c2274b99a 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -101,7 +101,6 @@ email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu. send_reset_mail=Spiediet šeit, lai nosūtītu paroles maiņas vēstuli uz Jūsu e-pastu reset_password=Atjaunot savu paroli reset_password_helper=Nospiediet šeit, lai atjaunotu paroli -password_too_short=Paroles garums nedrīkst būt mazāks par %d. verify=Pārbaudīt scratch_code=Vienreizējais kods use_scratch_code=Izmantot vienreizējo kodu diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 6b96b91de..64db50357 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -101,7 +101,6 @@ email_not_associate=Dit emailadres is niet gekoppeld aan een account. send_reset_mail=Klik hier om de wachtwoord reset mail (nogmaals) te versturen reset_password=Reset uw wachtwoord reset_password_helper=Klik hier om uw wachtwoord opnieuw in te stellen. -password_too_short=De lengte van uw wachtwoord moet minimaal %d karakters zijn. verify=Verifiëren scratch_code=Eenmalige code use_scratch_code=Gebruik een eenmalige code diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 954a37f5f..3dcb05082 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -97,7 +97,6 @@ email_not_associate=Adres e-mail nie jest powiązany z żadnym kontem. send_reset_mail=Kliknij tutaj, aby ponownie wysłać e-mail resetowania hasła reset_password=Resetowanie hasła reset_password_helper=Kliknij tutaj, aby zresetować hasło -password_too_short=Długość hasła nie może być mniejsza niż %d znaków. verify=Potwierdź scratch_code=Kod jednorazowy use_scratch_code=Użyj kodu jednorazowego diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 17b59f7b1..0df553778 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -213,7 +213,7 @@ send_reset_mail=Clique aqui para re-enviar seu e-mail de redefinição de senha reset_password=Redefinir sua senha invalid_code=Seu código de confirmação é inválido ou expirou. reset_password_helper=Clique aqui para redefinir sua senha -password_too_short=O comprimento da senha não pode ser menor que %d. +password_too_short=A senha deve ter %d ou mais caracteres. non_local_account=Usuários não-locais não podem atualizar sua senha através da interface web do Gitea. verify=Verificar scratch_code=Código de backup diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index a8cf3098b..dfe8e9fa2 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -213,7 +213,6 @@ send_reset_mail=Нажмите сюда, чтобы отправить пись reset_password=Сброс пароля invalid_code=Этот код подтверждения недействителен или истек. reset_password_helper=Нажмите здесь, чтобы сбросить свой пароль -password_too_short=Длина пароля не менее %d символов. non_local_account=Нелокальные аккаунты не могут изменить пароль через Gitea. verify=Проверить scratch_code=Одноразовый пароль diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index 3acc22c3a..e20c9ba91 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -79,7 +79,6 @@ has_unconfirmed_mail=Здраво, %s! Имате непотврђену адр resend_mail=Кликните овде да поново пошаљете писмо reset_password=Ресет лозинке reset_password_helper=Кликните овде да ресетујете вашу лозинку -password_too_short=Лозинка неможе бити краћа од %d карактера. [mail] activate_account=Молимо вас активирајте ваш налог diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index e6bb938a5..ca3d703f1 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -97,7 +97,6 @@ email_not_associate=Denna e-postadress är inte knutet till något konto. send_reset_mail=Klicka här för att skicka e-post med lösenordsåterställning igen reset_password=Återställ ditt lösenord reset_password_helper=Klicka här för att återställa ditt lösenord -password_too_short=Lösenordet får ej vara kortare än %d tecken. verify=Verifiera scratch_code=Skrapkod use_scratch_code=Använd en skrapkod diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index f3ed0f727..17f4fe02b 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -97,7 +97,6 @@ email_not_associate=Bu e-posta adresi hiçbir hesap ile ilişkilendirilmemiştir send_reset_mail=Parola sıfırlama e-postasını (yeniden) göndermek için buraya tıklayın reset_password=Parolanızı Sıfırlayın reset_password_helper=Parolanızı sıfırlamak için buraya tıklayın -password_too_short=Parola uzunluğu %d karakterden az olamaz. verify=Doğrula scratch_code=Çizgi kodu use_scratch_code=Bir çizgi kodu kullanınız diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 4fae01062..3bc79cdd5 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -199,7 +199,6 @@ send_reset_mail=Натисніть сюди, щоб відправити лис reset_password=Скинути пароль invalid_code=Цей код підтвердження недійсний або закінчився. reset_password_helper=Натисніть тут для скидання пароля -password_too_short=Довжина пароля не може бути меншою за %d. non_local_account=Нелокальні акаунти не можуть змінити пароль через Gitea. verify=Підтвердити scratch_code=Одноразовий пароль diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 8b23e404c..658f133a2 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -213,7 +213,6 @@ send_reset_mail=单击此处(重新)发送您的密码重置邮件 reset_password=重置密码 invalid_code=此确认密钥无效或已过期。 reset_password_helper=单击此处重置密码 -password_too_short=密码长度不能少于 %d 位! non_local_account=非本地帐户不能通过 Gitea 的 web 界面更改密码。 verify=验证 scratch_code=验证口令 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index a64367d39..d8b8e210c 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -94,7 +94,6 @@ email_not_associate=此電子郵件地址未與任何帳戶連結 send_reset_mail=點選此處重發您的密碼重製郵件 reset_password=重置密碼 reset_password_helper=單擊此處重置密碼 -password_too_short=密碼長度不能少於 %d 位! verify=驗證 scratch_code=備用碼 use_scratch_code=使用備用碼 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index fa716b27d..8a6914af2 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -97,7 +97,6 @@ email_not_associate=此電子郵件地址未與任何帳戶連結 send_reset_mail=點選此處重發您的密碼重製郵件 reset_password=重置密碼 reset_password_helper=單擊此處重置密碼 -password_too_short=密碼長度不能少於 %d 位! verify=驗證 scratch_code=備用碼 use_scratch_code=使用備用碼 From 7b773bd49fddec4101e42690546d606ae7378ba0 Mon Sep 17 00:00:00 2001 From: Alexey Terentyev Date: Tue, 12 Jun 2018 13:34:56 +0300 Subject: [PATCH 20/86] Fixed drone command in readme (#4222) Signed-off-by: Alexey Terentyev --- integrations/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/README.md b/integrations/README.md index 64041b546..927368818 100644 --- a/integrations/README.md +++ b/integrations/README.md @@ -13,7 +13,7 @@ Make sure to perform a clean build before running tests: ## Run all tests via local drone ``` -drone exec --local --build.event "pull_request" +drone exec --local --build-event "pull_request" ``` ## Run sqlite integrations tests From 0ea18698af39491f38c8bb246b02f2820ec49b4f Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 12 Jun 2018 10:36:20 +0000 Subject: [PATCH 21/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_ru-RU.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index dfe8e9fa2..008895181 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -213,6 +213,7 @@ send_reset_mail=Нажмите сюда, чтобы отправить пись reset_password=Сброс пароля invalid_code=Этот код подтверждения недействителен или истек. reset_password_helper=Нажмите здесь, чтобы сбросить свой пароль +password_too_short=Длина пароля не может быть меньше, чем %d символов. non_local_account=Нелокальные аккаунты не могут изменить пароль через Gitea. verify=Проверить scratch_code=Одноразовый пароль @@ -489,7 +490,7 @@ delete_account_desc=Вы уверены, что хотите навсегда у [repo] owner=Владелец repo_name=Имя репозитория -repo_name_helper=Лучшие названия репозиториев состоят их коротких, легко запоминаемых и уникальных ключевых слов. +repo_name_helper=Лучшие названия репозиториев состоят из коротких, легко запоминаемых и уникальных ключевых слов. visibility=Видимость visiblity_helper=Сделать репозиторий приватным visiblity_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию. From 0ba165e2ea451c67448d584822ce29ddf62a6c7c Mon Sep 17 00:00:00 2001 From: harry Date: Tue, 12 Jun 2018 19:27:18 +0800 Subject: [PATCH 22/86] Improve wiki content width. (#4195) --- public/css/index.css | 2 +- public/less/_markdown.less | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/public/css/index.css b/public/css/index.css index 607ab3f6a..2ee3e8314 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -1 +1 @@ -.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}.repository #clone-panel input{border-radius:0;padding:5px 10px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file +.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).ui.segment{padding:3em}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}.repository #clone-panel input{border-radius:0;padding:5px 10px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file diff --git a/public/less/_markdown.less b/public/less/_markdown.less index 9e2734e42..458016d71 100644 --- a/public/less/_markdown.less +++ b/public/less/_markdown.less @@ -5,6 +5,10 @@ line-height: 1.6 !important; word-wrap: break-word; + &.ui.segment { + padding: 3em; + } + &.file-view { padding: 2em 2em 2em !important; } From 908e8942ccae5b7966c7084780b3441e2190d9c1 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Tue, 12 Jun 2018 16:59:22 +0200 Subject: [PATCH 23/86] Fix swagger errors (#4220) Fix all the resting errors to have a valid swagger file. They are still some warnings but nothing blocking. Doing so I found that some request still misses son parameters for some POST/PUT/PATCH request. This means the a client generated from the swagger file will not work completely. Fix #4088 by activating validation in drone Should fix #4010. --- .drone.yml | 1 + public/swagger.v1.json | 476 +++++++++++++--------- routers/api/v1/misc/markdown.go | 9 +- routers/api/v1/org/hook.go | 49 +++ routers/api/v1/org/team.go | 6 +- routers/api/v1/repo/file.go | 2 +- routers/api/v1/repo/hook.go | 7 +- routers/api/v1/repo/issue_comment.go | 4 +- routers/api/v1/repo/issue_tracked_time.go | 8 +- routers/api/v1/repo/milestone.go | 59 +-- routers/api/v1/repo/repo.go | 12 +- routers/api/v1/swagger/options.go | 52 ++- routers/api/v1/swagger/repo.go | 1 + routers/api/v1/user/app.go | 12 + routers/api/v1/user/follower.go | 4 +- 15 files changed, 440 insertions(+), 262 deletions(-) diff --git a/.drone.yml b/.drone.yml index 011d4fefd..6ab40a39d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -75,6 +75,7 @@ pipeline: - make lint - make fmt-check - make swagger-check + - make swagger-validate - make misspell-check - make test-vendor - make build diff --git a/public/swagger.v1.json b/public/swagger.v1.json index 2c263ef1f..1c381a829 100644 --- a/public/swagger.v1.json +++ b/public/swagger.v1.json @@ -321,9 +321,13 @@ "operationId": "renderMarkdownRaw", "parameters": [ { - "type": "string", + "description": "Request body to render", "name": "body", - "in": "body" + "in": "body", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -448,6 +452,15 @@ ], "summary": "List an organization's webhooks", "operationId": "orgListHooks", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/HookList" @@ -468,6 +481,15 @@ ], "summary": "Create a hook", "operationId": "orgCreateHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], "responses": { "201": { "$ref": "#/responses/Hook" @@ -485,6 +507,22 @@ ], "summary": "Get a hook", "operationId": "orgGetHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/Hook" @@ -500,6 +538,22 @@ ], "summary": "Delete a hook", "operationId": "orgDeleteHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "204": { "$ref": "#/responses/empty" @@ -518,6 +572,22 @@ ], "summary": "Update a hook", "operationId": "orgEditHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to update", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/Hook" @@ -994,7 +1064,7 @@ } } }, - "/repos/{owner}/{repo}/archive/{filepath}": { + "/repos/{owner}/{repo}/archive/{archive}": { "get": { "produces": [ "application/json" @@ -1530,6 +1600,47 @@ } } }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a hook in a repository", + "operationId": "repoDeleteHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, "patch": { "produces": [ "application/json" @@ -1554,6 +1665,13 @@ "in": "path", "required": true }, + { + "type": "integer", + "description": "index of the hook", + "name": "id", + "in": "path", + "required": true + }, { "name": "body", "in": "body", @@ -1825,6 +1943,100 @@ } } }, + "/repos/{owner}/{repo}/issues/{id}/times": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List an issue's tracked times", + "operationId": "issueTrackedTimes", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a tracked time to a issue", + "operationId": "issueAddTime", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue to add tracked time to", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/AddTimeOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTime" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/error" + } + } + } + }, "/repos/{owner}/{repo}/issues/{index}": { "get": { "produces": [ @@ -1941,7 +2153,7 @@ { "type": "integer", "description": "index of the issue", - "name": "id", + "name": "index", "in": "path", "required": true }, @@ -1988,7 +2200,7 @@ { "type": "integer", "description": "index of the issue", - "name": "id", + "name": "index", "in": "path", "required": true }, @@ -2332,100 +2544,6 @@ } } }, - "/repos/{owner}/{repo}/issues/{index}/times": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "issue" - ], - "summary": "List an issue's tracked times", - "operationId": "issueTrackedTimes", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "index of the issue", - "name": "repo", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/TrackedTimeList" - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "issue" - ], - "summary": "Add a tracked time to a issue", - "operationId": "issueAddTime", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "index of the issue to add tracked time to", - "name": "id", - "in": "path", - "required": true - }, - { - "name": "body", - "in": "body", - "schema": { - "$ref": "#/definitions/AddTimeOption" - } - } - ], - "responses": { - "200": { - "$ref": "#/responses/TrackedTime" - }, - "400": { - "$ref": "#/responses/error" - }, - "403": { - "$ref": "#/responses/error" - } - } - } - }, "/repos/{owner}/{repo}/keys": { "get": { "produces": [ @@ -2781,7 +2899,7 @@ "issue" ], "summary": "Get all of a repository's milestones", - "operationId": "issueGetMilestones", + "operationId": "issueGetMilestonesList", "parameters": [ { "type": "string", @@ -2796,13 +2914,6 @@ "name": "repo", "in": "path", "required": true - }, - { - "type": "integer", - "description": "id of the milestone to get", - "name": "id", - "in": "path", - "required": true } ], "responses": { @@ -2863,6 +2974,29 @@ ], "summary": "Get a milestone", "operationId": "issueGetMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the milestone", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/Milestone" @@ -2893,7 +3027,7 @@ { "type": "integer", "description": "id of the milestone to delete", - "name": "body", + "name": "id", "in": "path", "required": true } @@ -2931,6 +3065,13 @@ "in": "path", "required": true }, + { + "type": "integer", + "description": "id of the milestone", + "name": "id", + "in": "path", + "required": true + }, { "name": "body", "in": "body", @@ -3979,7 +4120,7 @@ } } }, - "/repos/{owner}/{repo}/times/{tracker}": { + "/repos/{owner}/{repo}/times/{user}": { "get": { "produces": [ "application/json" @@ -4019,49 +4160,6 @@ } } }, - "/repos/{user}/{repo}/hooks/{id}": { - "delete": { - "produces": [ - "application/json" - ], - "tags": [ - "repository" - ], - "summary": "Delete a hook in a repository", - "operationId": "repoDeleteHook", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "id of the hook to delete", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "$ref": "#/responses/empty" - }, - "404": { - "$ref": "#/responses/notFound" - } - } - } - }, "/repositories/{id}": { "get": { "produces": [ @@ -4238,7 +4336,7 @@ "organization" ], "summary": "Remove a team member", - "operationId": "orgAddTeamMember", + "operationId": "orgRemoveTeamMember", "parameters": [ { "type": "integer", @@ -4297,7 +4395,7 @@ "organization" ], "summary": "Add a repository to a team", - "operationId": "orgAddTeamMember", + "operationId": "orgAddTeamRepository", "parameters": [ { "type": "integer", @@ -4336,7 +4434,7 @@ "organization" ], "summary": "Remove a repository from a team", - "operationId": "orgAddTeamMember", + "operationId": "orgRemoveTeamRepository", "parameters": [ { "type": "integer", @@ -4379,10 +4477,10 @@ "operationId": "topicSearch", "parameters": [ { - "type": "integer", - "description": "id of the repo to get", - "name": "keyword", - "in": "path", + "type": "string", + "description": "keywords to search", + "name": "q", + "in": "query", "required": true } ], @@ -4509,7 +4607,7 @@ } } }, - "/user/following/{followee}": { + "/user/following/{username}": { "get": { "tags": [ "user" @@ -4520,7 +4618,7 @@ { "type": "string", "description": "username of followed user", - "name": "followee", + "name": "username", "in": "path", "required": true } @@ -4533,9 +4631,7 @@ "$ref": "#/responses/notFound" } } - } - }, - "/user/following/{username}": { + }, "put": { "tags": [ "user" @@ -5301,6 +5397,15 @@ ], "summary": "List the authenticated user's access tokens", "operationId": "userGetTokens", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/AccessTokenList" @@ -5323,8 +5428,10 @@ { "type": "string", "x-go-name": "Name", - "name": "name", - "in": "query" + "description": "username of user", + "name": "username", + "in": "path", + "required": true } ], "responses": { @@ -7612,9 +7719,6 @@ "description": "SearchResults", "schema": { "$ref": "#/definitions/SearchResults" - }, - "headers": { - "body": {} } }, "ServerVersion": { @@ -7721,40 +7825,6 @@ "description": "parameterBodies", "schema": { "$ref": "#/definitions/EditAttachmentOptions" - }, - "headers": { - "AddCollaboratorOption": {}, - "AddTimeOption": {}, - "CreateEmailOption": {}, - "CreateForkOption": {}, - "CreateHookOption": {}, - "CreateIssueCommentOption": {}, - "CreateIssueOption": {}, - "CreateKeyOption": {}, - "CreateLabelOption": {}, - "CreateMilestoneOption": {}, - "CreateOrgOption": {}, - "CreatePullRequestOption": {}, - "CreateReleaseOption": {}, - "CreateRepoOption": {}, - "CreateStatusOption": {}, - "CreateTeamOption": {}, - "CreateUserOption": {}, - "DeleteEmailOption": {}, - "EditAttachmentOptions": {}, - "EditHookOption": {}, - "EditIssueCommentOption": {}, - "EditIssueOption": {}, - "EditLabelOption": {}, - "EditMilestoneOption": {}, - "EditOrgOption": {}, - "EditPullRequestOption": {}, - "EditReleaseOption": {}, - "EditTeamOption": {}, - "EditUserOption": {}, - "IssueLabelsOption": {}, - "MarkdownOption": {}, - "MigrateRepoForm": {} } }, "redirect": { diff --git a/routers/api/v1/misc/markdown.go b/routers/api/v1/misc/markdown.go index fd7d1489b..633dff98e 100644 --- a/routers/api/v1/misc/markdown.go +++ b/routers/api/v1/misc/markdown.go @@ -62,9 +62,12 @@ func MarkdownRaw(ctx *context.APIContext) { // --- // summary: Render raw markdown as HTML // parameters: - // - name: body - // in: body - // type: string + // - name: body + // in: body + // description: Request body to render + // required: true + // schema: + // type: string // consumes: // - text/plain // produces: diff --git a/routers/api/v1/org/hook.go b/routers/api/v1/org/hook.go index 0a77d795e..83d2a5e5b 100644 --- a/routers/api/v1/org/hook.go +++ b/routers/api/v1/org/hook.go @@ -20,6 +20,12 @@ func ListHooks(ctx *context.APIContext) { // summary: List an organization's webhooks // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true // responses: // "200": // "$ref": "#/responses/HookList" @@ -43,6 +49,17 @@ func GetHook(ctx *context.APIContext) { // summary: Get a hook // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true + // - name: id + // in: path + // description: id of the hook to get + // type: integer + // required: true // responses: // "200": // "$ref": "#/responses/Hook" @@ -64,9 +81,17 @@ func CreateHook(ctx *context.APIContext, form api.CreateHookOption) { // - application/json // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true // responses: // "201": // "$ref": "#/responses/Hook" + + //TODO in body params if !utils.CheckCreateHookOption(ctx, &form) { return } @@ -82,9 +107,22 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) { // - application/json // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true + // - name: id + // in: path + // description: id of the hook to update + // type: integer + // required: true // responses: // "200": // "$ref": "#/responses/Hook" + + //TODO in body params hookID := ctx.ParamsInt64(":id") utils.EditOrgHook(ctx, &form, hookID) } @@ -96,6 +134,17 @@ func DeleteHook(ctx *context.APIContext) { // summary: Delete a hook // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true + // - name: id + // in: path + // description: id of the hook to delete + // type: integer + // required: true // responses: // "204": // "$ref": "#/responses/empty" diff --git a/routers/api/v1/org/team.go b/routers/api/v1/org/team.go index 408d8921d..b8dd026bf 100644 --- a/routers/api/v1/org/team.go +++ b/routers/api/v1/org/team.go @@ -227,7 +227,7 @@ func AddTeamMember(ctx *context.APIContext) { // RemoveTeamMember api for remove one member from a team func RemoveTeamMember(ctx *context.APIContext) { - // swagger:operation DELETE /teams/{id}/members/{username} organization orgAddTeamMember + // swagger:operation DELETE /teams/{id}/members/{username} organization orgRemoveTeamMember // --- // summary: Remove a team member // produces: @@ -306,7 +306,7 @@ func getRepositoryByParams(ctx *context.APIContext) *models.Repository { // AddTeamRepository api for adding a repository to a team func AddTeamRepository(ctx *context.APIContext) { - // swagger:operation PUT /teams/{id}/repos/{org}/{repo} organization orgAddTeamMember + // swagger:operation PUT /teams/{id}/repos/{org}/{repo} organization orgAddTeamRepository // --- // summary: Add a repository to a team // produces: @@ -350,7 +350,7 @@ func AddTeamRepository(ctx *context.APIContext) { // RemoveTeamRepository api for removing a repository from a team func RemoveTeamRepository(ctx *context.APIContext) { - // swagger:operation DELETE /teams/{id}/repos/{org}/{repo} organization orgAddTeamMember + // swagger:operation DELETE /teams/{id}/repos/{org}/{repo} organization orgRemoveTeamRepository // --- // summary: Remove a repository from a team // description: This does not delete the repository, it only removes the diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index a3c8309ac..610247bc2 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -64,7 +64,7 @@ func GetRawFile(ctx *context.APIContext) { // GetArchive get archive of a repository func GetArchive(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/archive/{filepath} repository repoGetArchive + // swagger:operation GET /repos/{owner}/{repo}/archive/{archive} repository repoGetArchive // --- // summary: Get an archive of a repository // produces: diff --git a/routers/api/v1/repo/hook.go b/routers/api/v1/repo/hook.go index e412a7f1f..1f121dfc3 100644 --- a/routers/api/v1/repo/hook.go +++ b/routers/api/v1/repo/hook.go @@ -189,6 +189,11 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) { // description: name of the repo // type: string // required: true + // - name: id + // in: path + // description: index of the hook + // type: integer + // required: true // - name: body // in: body // schema: @@ -202,7 +207,7 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) { // DeleteHook delete a hook of a repository func DeleteHook(ctx *context.APIContext) { - // swagger:operation DELETE /repos/{user}/{repo}/hooks/{id} repository repoDeleteHook + // swagger:operation DELETE /repos/{owner}/{repo}/hooks/{id} repository repoDeleteHook // --- // summary: Delete a hook in a repository // produces: diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go index 2865ea916..0cbf6493d 100644 --- a/routers/api/v1/repo/issue_comment.go +++ b/routers/api/v1/repo/issue_comment.go @@ -31,7 +31,7 @@ func ListIssueComments(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: id + // - name: index // in: path // description: index of the issue // type: integer @@ -139,7 +139,7 @@ func CreateIssueComment(ctx *context.APIContext, form api.CreateIssueCommentOpti // description: name of the repo // type: string // required: true - // - name: id + // - name: index // in: path // description: index of the issue // type: integer diff --git a/routers/api/v1/repo/issue_tracked_time.go b/routers/api/v1/repo/issue_tracked_time.go index 1111d672a..9be9fee91 100644 --- a/routers/api/v1/repo/issue_tracked_time.go +++ b/routers/api/v1/repo/issue_tracked_time.go @@ -21,7 +21,7 @@ func trackedTimesToAPIFormat(trackedTimes []*models.TrackedTime) []*api.TrackedT // ListTrackedTimes list all the tracked times of an issue func ListTrackedTimes(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/issues/{index}/times issue issueTrackedTimes + // swagger:operation GET /repos/{owner}/{repo}/issues/{id}/times issue issueTrackedTimes // --- // summary: List an issue's tracked times // produces: @@ -37,7 +37,7 @@ func ListTrackedTimes(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: repo + // - name: id // in: path // description: index of the issue // type: integer @@ -70,7 +70,7 @@ func ListTrackedTimes(ctx *context.APIContext) { // AddTime adds time manual to the given issue func AddTime(ctx *context.APIContext, form api.AddTimeOption) { - // swagger:operation Post /repos/{owner}/{repo}/issues/{index}/times issue issueAddTime + // swagger:operation Post /repos/{owner}/{repo}/issues/{id}/times issue issueAddTime // --- // summary: Add a tracked time to a issue // consumes: @@ -132,7 +132,7 @@ func AddTime(ctx *context.APIContext, form api.AddTimeOption) { // ListTrackedTimesByUser lists all tracked times of the user func ListTrackedTimesByUser(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/times/{tracker} user userTrackedTimes + // swagger:operation GET /repos/{owner}/{repo}/times/{user} user userTrackedTimes // --- // summary: List a user's tracked times in a repo // produces: diff --git a/routers/api/v1/repo/milestone.go b/routers/api/v1/repo/milestone.go index 3953b0c3c..a138cb7a6 100644 --- a/routers/api/v1/repo/milestone.go +++ b/routers/api/v1/repo/milestone.go @@ -16,30 +16,7 @@ import ( // ListMilestones list all the milestones for a repository func ListMilestones(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/milestones/{id} issue issueGetMilestone - // --- - // summary: Get a milestone - // produces: - // - application/json - // responses: - // "200": - // "$ref": "#/responses/Milestone" - milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID) - if err != nil { - ctx.Error(500, "GetMilestonesByRepoID", err) - return - } - - apiMilestones := make([]*api.Milestone, len(milestones)) - for i := range milestones { - apiMilestones[i] = milestones[i].APIFormat() - } - ctx.JSON(200, &apiMilestones) -} - -// GetMilestone get a milestone for a repository -func GetMilestone(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestones + // swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestonesList // --- // summary: Get all of a repository's milestones // produces: @@ -55,6 +32,29 @@ func GetMilestone(ctx *context.APIContext) { // description: name of the repo // type: string // required: true + // responses: + // "200": + // "$ref": "#/responses/MilestoneList" + milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID) + if err != nil { + ctx.Error(500, "GetMilestonesByRepoID", err) + return + } + + apiMilestones := make([]*api.Milestone, len(milestones)) + for i := range milestones { + apiMilestones[i] = milestones[i].APIFormat() + } + ctx.JSON(200, &apiMilestones) +} + +// GetMilestone get a milestone for a repository +func GetMilestone(ctx *context.APIContext) { + // swagger:operation GET /repos/{owner}/{repo}/milestones/{id} issue issueGetMilestone + // --- + // summary: Get a milestone + // produces: + // - application/json // parameters: // - name: owner // in: path @@ -68,12 +68,12 @@ func GetMilestone(ctx *context.APIContext) { // required: true // - name: id // in: path - // description: id of the milestone to get + // description: id of the milestone // type: integer // required: true // responses: // "200": - // "$ref": "#/responses/MilestoneList" + // "$ref": "#/responses/Milestone" milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) if err != nil { if models.IsErrMilestoneNotExist(err) { @@ -152,6 +152,11 @@ func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) { // description: name of the repo // type: string // required: true + // - name: id + // in: path + // description: id of the milestone + // type: integer + // required: true // - name: body // in: body // schema: @@ -202,7 +207,7 @@ func DeleteMilestone(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: body + // - name: id // in: path // description: id of the milestone to delete // type: integer diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 9f64dda61..ccfe0440c 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -508,13 +508,13 @@ func TopicSearch(ctx *context.Context) { // --- // summary: search topics via keyword // produces: - // - application/json + // - application/json // parameters: - // - name: keyword - // in: path - // description: id of the repo to get - // type: integer - // required: true + // - name: q + // in: query + // description: keywords to search + // required: true + // type: string // responses: // "200": // "$ref": "#/responses/Repository" diff --git a/routers/api/v1/swagger/options.go b/routers/api/v1/swagger/options.go index 8d9363fe9..4f2461f46 100644 --- a/routers/api/v1/swagger/options.go +++ b/routers/api/v1/swagger/options.go @@ -15,55 +15,87 @@ import ( // parameterBodies // swagger:response parameterBodies type swaggerParameterBodies struct { + // in:body AddCollaboratorOption api.AddCollaboratorOption + // in:body CreateEmailOption api.CreateEmailOption + // in:body DeleteEmailOption api.DeleteEmailOption + // in:body CreateHookOption api.CreateHookOption - EditHookOption api.EditHookOption + // in:body + EditHookOption api.EditHookOption + // in:body CreateIssueOption api.CreateIssueOption - EditIssueOption api.EditIssueOption + // in:body + EditIssueOption api.EditIssueOption + // in:body CreateIssueCommentOption api.CreateIssueCommentOption - EditIssueCommentOption api.EditIssueCommentOption + // in:body + EditIssueCommentOption api.EditIssueCommentOption + // in:body IssueLabelsOption api.IssueLabelsOption + // in:body CreateKeyOption api.CreateKeyOption + // in:body CreateLabelOption api.CreateLabelOption - EditLabelOption api.EditLabelOption + // in:body + EditLabelOption api.EditLabelOption + // in:body MarkdownOption api.MarkdownOption + // in:body CreateMilestoneOption api.CreateMilestoneOption - EditMilestoneOption api.EditMilestoneOption + // in:body + EditMilestoneOption api.EditMilestoneOption + // in:body CreateOrgOption api.CreateOrgOption - EditOrgOption api.EditOrgOption + // in:body + EditOrgOption api.EditOrgOption + // in:body CreatePullRequestOption api.CreatePullRequestOption - EditPullRequestOption api.EditPullRequestOption + // in:body + EditPullRequestOption api.EditPullRequestOption + // in:body CreateReleaseOption api.CreateReleaseOption - EditReleaseOption api.EditReleaseOption + // in:body + EditReleaseOption api.EditReleaseOption + // in:body CreateRepoOption api.CreateRepoOption + // in:body CreateForkOption api.CreateForkOption + // in:body CreateStatusOption api.CreateStatusOption + // in:body CreateTeamOption api.CreateTeamOption - EditTeamOption api.EditTeamOption + // in:body + EditTeamOption api.EditTeamOption + // in:body AddTimeOption api.AddTimeOption + // in:body CreateUserOption api.CreateUserOption - EditUserOption api.EditUserOption + // in:body + EditUserOption api.EditUserOption + // in:body MigrateRepoForm auth.MigrateRepoForm + // in:body EditAttachmentOptions api.EditAttachmentOptions } diff --git a/routers/api/v1/swagger/repo.go b/routers/api/v1/swagger/repo.go index 97837dfc2..9decc8f58 100644 --- a/routers/api/v1/swagger/repo.go +++ b/routers/api/v1/swagger/repo.go @@ -102,6 +102,7 @@ type swaggerResponseWatchInfo struct { // SearchResults // swagger:response SearchResults type swaggerResponseSearchResults struct { + // in:body Body api.SearchResults `json:"body"` } diff --git a/routers/api/v1/user/app.go b/routers/api/v1/user/app.go index e1f75de68..fc4118649 100644 --- a/routers/api/v1/user/app.go +++ b/routers/api/v1/user/app.go @@ -18,6 +18,12 @@ func ListAccessTokens(ctx *context.APIContext) { // summary: List the authenticated user's access tokens // produces: // - application/json + // parameters: + // - name: username + // in: path + // description: username of user + // type: string + // required: true // responses: // "200": // "$ref": "#/responses/AccessTokenList" @@ -46,6 +52,12 @@ func CreateAccessToken(ctx *context.APIContext, form api.CreateAccessTokenOption // - application/json // produces: // - application/json + // parameters: + // - name: username + // in: path + // description: username of user + // type: string + // required: true // responses: // "200": // "$ref": "#/responses/AccessToken" diff --git a/routers/api/v1/user/follower.go b/routers/api/v1/user/follower.go index 49d13cc38..284b7323c 100644 --- a/routers/api/v1/user/follower.go +++ b/routers/api/v1/user/follower.go @@ -119,11 +119,11 @@ func checkUserFollowing(ctx *context.APIContext, u *models.User, followID int64) // CheckMyFollowing whether the given user is followed by the authenticated user func CheckMyFollowing(ctx *context.APIContext) { - // swagger:operation GET /user/following/{followee} user userCurrentCheckFollowing + // swagger:operation GET /user/following/{username} user userCurrentCheckFollowing // --- // summary: Check whether a user is followed by the authenticated user // parameters: - // - name: followee + // - name: username // in: path // description: username of followed user // type: string From 406031d3ccbf844a400f8382c84c5bee3f46d98b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 13 Jun 2018 00:44:17 +0800 Subject: [PATCH 24/86] fix bug when deleting a release (#4207) --- models/release.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/models/release.go b/models/release.go index 630995a74..e3760e9ef 100644 --- a/models/release.go +++ b/models/release.go @@ -448,6 +448,11 @@ func DeleteReleaseByID(id int64, u *User, delTag bool) error { } } + rel.Repo = repo + if err = rel.LoadAttributes(); err != nil { + return fmt.Errorf("LoadAttributes: %v", err) + } + mode, _ := accessLevel(x, u.ID, rel.Repo) if err := PrepareWebhooks(rel.Repo, HookEventRelease, &api.ReleasePayload{ Action: api.HookReleaseDeleted, From 2b8c0bb5e2010d6691e80919f3e9ea65348162b1 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Tue, 12 Jun 2018 20:02:51 +0300 Subject: [PATCH 25/86] Delete reactions added to issues and comments when deleting repository (#4232) --- models/repo.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/models/repo.go b/models/repo.go index c95c867f3..f4923cf4a 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1848,6 +1848,9 @@ func DeleteRepository(doer *User, uid, repoID int64) error { if _, err = sess.In("issue_id", issueIDs).Delete(&IssueUser{}); err != nil { return err } + if _, err = sess.In("issue_id", issueIDs).Delete(&Reaction{}); err != nil { + return err + } attachments := make([]*Attachment, 0, 5) if err = sess. From 6efdcaed86565c91a3dc77631372a9cc45a58e89 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Wed, 13 Jun 2018 01:23:00 +0200 Subject: [PATCH 26/86] Fix swagger security parts (#4236) --- public/swagger.v1.json | 16 ++++------------ routers/api/v1/api.go | 8 ++++---- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/public/swagger.v1.json b/public/swagger.v1.json index 1c381a829..e0f2a7589 100644 --- a/public/swagger.v1.json +++ b/public/swagger.v1.json @@ -7864,24 +7864,16 @@ }, "security": [ { - "BasicAuth": [ - "[]" - ] + "BasicAuth": [] }, { - "Token": [ - "[]" - ] + "Token": [] }, { - "AccessToken": [ - "[]" - ] + "AccessToken": [] }, { - "AuthorizationHeaderToken": [ - "[]" - ] + "AuthorizationHeaderToken": [] } ] } \ No newline at end of file diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index eec55cac6..5007a0d56 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -20,10 +20,10 @@ // - text/html // // Security: -// - BasicAuth: [] -// - Token: [] -// - AccessToken: [] -// - AuthorizationHeaderToken: [] +// - BasicAuth : +// - Token : +// - AccessToken : +// - AuthorizationHeaderToken : // // SecurityDefinitions: // BasicAuth: From adba2ad609ca3f1612463a4ac6af22fd30b9e75f Mon Sep 17 00:00:00 2001 From: David Schneiderbauer Date: Fri, 15 Jun 2018 05:42:46 +0200 Subject: [PATCH 27/86] fix not respecting landing page setting (#4209) * fix not respecting landing page setting * fmt * add landing page test --- integrations/setting_test.go | 22 ++++++++++++++++++++++ modules/context/auth.go | 6 ------ routers/home.go | 4 ++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/integrations/setting_test.go b/integrations/setting_test.go index a8d1f01e8..2aac8e90e 100644 --- a/integrations/setting_test.go +++ b/integrations/setting_test.go @@ -68,3 +68,25 @@ func TestSettingShowUserEmailProfile(t *testing.T) { setting.UI.ShowUserEmail = showUserEmail } + +func TestSettingLandingPage(t *testing.T) { + prepareTestEnv(t) + + landingPage := setting.LandingPageURL + + setting.LandingPageURL = setting.LandingPageHome + req := NewRequest(t, "GET", "/") + MakeRequest(t, req, http.StatusOK) + + setting.LandingPageURL = setting.LandingPageExplore + req = NewRequest(t, "GET", "/") + resp := MakeRequest(t, req, http.StatusFound) + assert.Equal(t, "/explore", resp.Header().Get("Location")) + + setting.LandingPageURL = setting.LandingPageOrganizations + req = NewRequest(t, "GET", "/") + resp = MakeRequest(t, req, http.StatusFound) + assert.Equal(t, "/explore/organizations", resp.Header().Get("Location")) + + setting.LandingPageURL = landingPage +} diff --git a/modules/context/auth.go b/modules/context/auth.go index 372bcb187..c38cc3948 100644 --- a/modules/context/auth.go +++ b/modules/context/auth.go @@ -37,12 +37,6 @@ func Toggle(options *ToggleOptions) macaron.Handler { return } - // Check non-logged users landing page. - if !ctx.IsSigned && ctx.Req.RequestURI == "/" && setting.LandingPageURL != setting.LandingPageHome { - ctx.Redirect(setting.AppSubURL + string(setting.LandingPageURL)) - return - } - // Redirect to dashboard if user tries to visit any non-login page. if options.SignOutRequired && ctx.IsSigned && ctx.Req.RequestURI != "/" { ctx.Redirect(setting.AppSubURL + "/") diff --git a/routers/home.go b/routers/home.go index 5bb353c7e..0aa907658 100644 --- a/routers/home.go +++ b/routers/home.go @@ -42,6 +42,10 @@ func Home(ctx *context.Context) { user.Dashboard(ctx) } return + // Check non-logged users landing page. + } else if setting.LandingPageURL != setting.LandingPageHome { + ctx.Redirect(setting.AppSubURL + string(setting.LandingPageURL)) + return } // Check auto-login. From a75f2511951120c9ba1f954cfe48e4ce73687c72 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 15 Jun 2018 03:43:54 +0000 Subject: [PATCH 28/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 1 + options/locale/locale_uk-UA.ini | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 4e56b3028..364308424 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -213,6 +213,7 @@ send_reset_mail=E-Mail zum Passwort-zurücksetzen erneut verschicken reset_password=Passwort zurücksetzen invalid_code=Dein Bestätigungs-Code ist ungültig oder abgelaufen. reset_password_helper=Passwort zurückzusetzen +password_too_short=Das Passwort muss mindestens %d Zeichen lang sein. non_local_account=Benutzer, die nicht von Gitea verwaltet werden können ihre Passwörter nicht über das Web Interface ändern. verify=Verifizieren scratch_code=Einmalpasswort diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 3bc79cdd5..d59851e6a 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -38,6 +38,7 @@ u2f_use_twofa=Використовуйте дво-факторний код з u2f_error=Неможливо прочитати ваш ключ безпеки! u2f_unsupported_browser=Ваш браузер не підтримує U2F ключі. Будь ласка, спробуйте інший браузер. u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. +u2f_error_2=Переконайтеся, що ви використовуєте зашифроване з'єднання (https://) та відвідуєте правильну URL-адресу. u2f_error_3=Сервер не може обробити, ваш запит. u2f_reload=Оновити @@ -398,7 +399,12 @@ generate_token=Згенерувати токен delete_token=Видалити access_token_deletion=Видалити токен доступу +twofa_desc=Двофакторна аутентифікація підвищує безпеку вашого облікового запису. +twofa_is_enrolled=Ваш обліковий запис в даний час використовує двофакторну автентифікацію. twofa_disable=Вимкнути двофакторну автентифікацію +twofa_enroll=Увімкнути двофакторну автентифікацію +twofa_disabled=Двофакторна автентифікація вимкнена. +scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної аутентифікації: or_enter_secret=Або введіть секрет: %s passcode_invalid=Некоректний пароль. Спробуй ще раз. From a7aaacb633a1f391eab6e8f2aa4f57b83d41c66c Mon Sep 17 00:00:00 2001 From: stevegt Date: Fri, 15 Jun 2018 00:47:13 -0700 Subject: [PATCH 29/86] fix CreateIssueCommentOption reference (#4239) * fixes a warning remaining from #4010 and #4220 --- public/swagger.v1.json | 2 +- routers/api/v1/repo/issue_comment.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/swagger.v1.json b/public/swagger.v1.json index e0f2a7589..9fd790281 100644 --- a/public/swagger.v1.json +++ b/public/swagger.v1.json @@ -2208,7 +2208,7 @@ "name": "body", "in": "body", "schema": { - "$ref": "#/definitions/CreateIssueOption" + "$ref": "#/definitions/CreateIssueCommentOption" } } ], diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go index 0cbf6493d..af952a070 100644 --- a/routers/api/v1/repo/issue_comment.go +++ b/routers/api/v1/repo/issue_comment.go @@ -147,7 +147,7 @@ func CreateIssueComment(ctx *context.APIContext, form api.CreateIssueCommentOpti // - name: body // in: body // schema: - // "$ref": "#/definitions/CreateIssueOption" + // "$ref": "#/definitions/CreateIssueCommentOption" // responses: // "201": // "$ref": "#/responses/Comment" From c919b07a53e837a3aa7a82f8b1530e3b7ee1773d Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 15 Jun 2018 07:48:26 +0000 Subject: [PATCH 30/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index d59851e6a..511e6671f 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -400,7 +400,7 @@ delete_token=Видалити access_token_deletion=Видалити токен доступу twofa_desc=Двофакторна аутентифікація підвищує безпеку вашого облікового запису. -twofa_is_enrolled=Ваш обліковий запис в даний час використовує двофакторну автентифікацію. +twofa_is_enrolled=Ваш обліковий запис на даний час використовує двофакторну автентифікацію. twofa_disable=Вимкнути двофакторну автентифікацію twofa_enroll=Увімкнути двофакторну автентифікацію twofa_disabled=Двофакторна автентифікація вимкнена. From 23ba5c870fc27b59202c4bd90c5d5b38fb018565 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Fri, 15 Jun 2018 14:42:49 +0200 Subject: [PATCH 31/86] markup: escape short wiki link (#4091) --- modules/markup/html.go | 3 +++ modules/markup/html_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/modules/markup/html.go b/modules/markup/html.go index 4f9d02a8f..a4ef86de2 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -469,6 +469,9 @@ func shortLinkProcessorFull(ctx *postProcessCtx, node *html.Node, noLink bool) { } else { link = strings.Replace(link, " ", "-", -1) } + if !strings.Contains(link, "/") { + link = url.PathEscape(link) + } } urlPrefix := ctx.urlPrefix if image { diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index fc11532d1..bf7606e1d 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -82,12 +82,18 @@ func TestRender_ShortLinks(t *testing.T) { rawtree := util.URLJoin(AppSubURL, "raw", "master") url := util.URLJoin(tree, "Link") otherURL := util.URLJoin(tree, "Other-Link") + encodedURL := util.URLJoin(tree, "Link%3F") imgurl := util.URLJoin(rawtree, "Link.jpg") otherImgurl := util.URLJoin(rawtree, "Link+Other.jpg") + encodedImgurl := util.URLJoin(rawtree, "Link+%23.jpg") + notencodedImgurl := util.URLJoin(rawtree, "some", "path", "Link+#.jpg") urlWiki := util.URLJoin(AppSubURL, "wiki", "Link") otherURLWiki := util.URLJoin(AppSubURL, "wiki", "Other-Link") + encodedURLWiki := util.URLJoin(AppSubURL, "wiki", "Link%3F") imgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link.jpg") otherImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link+Other.jpg") + encodedImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link+%23.jpg") + notencodedImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "some", "path", "Link+#.jpg") favicon := "http://google.com/favicon.ico" test( @@ -134,4 +140,24 @@ func TestRender_ShortLinks(t *testing.T) { "[[Link]] [[Other Link]]", ``, `

Link Other Link

`) + test( + "[[Link?]]", + `

Link?

`, + `

Link?

`) + test( + "[[Link]] [[Other Link]] [[Link?]]", + `

Link Other Link Link?

`, + `

Link Other Link Link?

`) + test( + "[[Link #.jpg]]", + `

`, + `

`) + test( + "[[Name|Link #.jpg|alt=\"AltName\"|title='Title']]", + `

AltName

`, + `

AltName

`) + test( + "[[some/path/Link #.jpg]]", + `

`, + `

`) } From 3aafa0400ea3e003baed1e8c8bd1f986730d0253 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 15 Jun 2018 12:43:56 +0000 Subject: [PATCH 32/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 511e6671f..f49b98280 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -68,7 +68,7 @@ activities=Дії pull_requests=Запити на злиття issues=Проблеми -cancel=Відміна +cancel=Відмінити [install] install=Встановлення @@ -318,7 +318,7 @@ update_profile=Оновити профіль update_profile_success=Профіль успішно оновлено. change_username=Ваше Ім'я кристувача було змінено. continue=Продовжити -cancel=Відміна +cancel=Відмінити language=Мова lookup_avatar_by_mail=Знайти Аватар за адресою електронної пошти @@ -532,7 +532,7 @@ editor.commit_message_desc=Додати необов'язковий розшир editor.commit_directly_to_this_branch=Зробіть коміт прямо в гілку %s. editor.create_new_branch=Створити нову гілку для цього коміту та відкрити запит на злиття. editor.new_branch_name_desc=Ім'я нової гілки… -editor.cancel=Відміна +editor.cancel=Відмінити editor.filename_cannot_be_empty=Ім'я файлу не може бути порожнім. editor.branch_already_exists=Гілка '%s' вже присутня в репозиторії. editor.directory_is_a_file=Ім'я каталогу "%s" уже використовується як ім'я файлу в цьому репозиторії. @@ -634,7 +634,7 @@ issues.collaborator=Співавтор issues.owner=Власник issues.sign_in_require_desc=Підпишіться щоб приєднатися до обговорення. issues.edit=Редагувати -issues.cancel=Відміна +issues.cancel=Відмінити issues.save=Зберегти issues.label_title=Назва мітки issues.label_description=Опис мітки @@ -663,11 +663,11 @@ issues.tracking_already_started=`Ви вже почали відстежуват issues.stop_tracking=Стоп issues.add_time=Вручну додати час issues.add_time_short=Додати час -issues.add_time_cancel=Відміна +issues.add_time_cancel=Відмінити issues.add_time_hours=Години issues.add_time_minutes=Хвилини issues.add_time_sum_to_small=Час не введено. -issues.cancel_tracking=Відміна +issues.cancel_tracking=Відмінити issues.cancel_tracking_history=`скасував відстеження часу %s` issues.time_spent_total=Загальний витрачений час issues.time_spent_from_all_authors=`Загальний витрачений час: %s` @@ -718,7 +718,7 @@ milestones.desc=Опис milestones.due_date=Дата завершення (опціонально) milestones.clear=Очистити milestones.edit=Редагувати етап -milestones.cancel=Відміна +milestones.cancel=Відмінити milestones.modify=Оновити етап milestones.deletion=Видалити етап milestones.filter_sort.most_issues=Найбільш проблем @@ -939,7 +939,7 @@ release.preview=Переглянути release.loading=Завантаження… release.prerelease_desc=Позначити як пре-реліз release.prerelease_helper=Позначте цей випуск непридатним для ПРОД використання. -release.cancel=Відміна +release.cancel=Відмінити release.publish=Опублікувати реліз release.save_draft=Зберегти чернетку release.edit_release=Оновити реліз From 85414d8b754639cae1a9c361bbdc0714f06b87c1 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Fri, 15 Jun 2018 16:07:48 +0200 Subject: [PATCH 33/86] Show second line by using >= 1 instead of > 1 (#4251) Signed-off-by: Jonas Franz --- modules/templates/helper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/templates/helper.go b/modules/templates/helper.go index bf5c0130b..b6c835ad4 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -323,7 +323,7 @@ func RenderCommitBody(msg, urlPrefix string, metas map[string]string) template.H // IsMultilineCommitMessage checks to see if a commit message contains multiple lines. func IsMultilineCommitMessage(msg string) bool { - return strings.Count(strings.TrimSpace(msg), "\n") > 1 + return strings.Count(strings.TrimSpace(msg), "\n") >= 1 } // Actioner describes an action From 90ad73ae21b40de98bf1986e550c3d965033dc21 Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 18 Jun 2018 19:16:53 +0200 Subject: [PATCH 34/86] Reorganized feature comparison (#4264) --- docs/content/doc/features/comparison.en-us.md | 746 +++--------------- 1 file changed, 90 insertions(+), 656 deletions(-) diff --git a/docs/content/doc/features/comparison.en-us.md b/docs/content/doc/features/comparison.en-us.md index 981365c71..698de4f46 100644 --- a/docs/content/doc/features/comparison.en-us.md +++ b/docs/content/doc/features/comparison.en-us.md @@ -27,659 +27,93 @@ _Symbols used in table:_ * _✘ - unsupported_ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureGiteaGogsGitHub EEGitLab CEGitLab EEBitBucketRhodeCode CE
Open source and free
Issue tracker
Pull/Merge requests
Squash merging
Rebase merging
Pull/Merge request inline comments
Pull/Merge request approval
Merge conflict resolution
Restrict push and merge access to certain users
Markdown support
Issues and pull/merge requests templates
Revert specific commits or a merge request
Labels
Time tracking
Multiple assignees for issues
Related issues
Confidential issues
Comment reactions
Lock Discussion
Batch issue handling
Issue Boards
Create new branches from issues
Commit graph
Web code editor
Branch manager
Create new branches
Repository topics
Repository code search
Global code search
Issue search
Global issue search
Git LFS 2.0
Integrated Git-powered wiki
Static Git-powered pages
Group Milestones
Granular user roles (Code, Issues, Wiki etc)
Cherry-picking changes
GPG Signed Commits
Reject unsigned commits
Verified Committer?
Subgroups: groups within groups
Custom Git Hooks
Repository Activity page
Deploy Tokens
Repository Tokens with write rights
Easy upgrade process
Built-in Container Registry
External git mirroring
AD / LDAP integration
Multiple LDAP / AD server support
LDAP user synchronization
OpenId Connect support?
OAuth 2.0 integration (external authorization)?
Act as OAuth 2.0 provider
Two factor authentication (2FA)
FIDO U2F (2FA)
Webhook support
Mattermost/Slack integration
Discord integration
Built-in CI/CD
External CI/CD status display
Multiple database support
Multiple OS support
Low resource usage (RAM/CPU)
+#### General Features + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Open source and free | ✓ | ✓ | ✘| ✓ | ✘ | ✘ | ✓ | +| Low resource usage (RAM/CPU) | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✘ | +| Multiple database support | ✓ | ✓ | ✘ | ⁄ | ⁄ | ✓ | ✓ | +| Multiple OS support | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✓ | +| Easy upgrade process | ✓ | ✓ | ✘ | ✓ | ✓ | ✘ | ✓ | +| Markdown support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Static Git-powered pages | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Integrated Git-powered wiki | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Deploy Tokens | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Repository Tokens with write rights | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ | +| Built-in Container Registry | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| External git mirroring | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ | +| FIDO U2F (2FA) | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Built-in CI/CD | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Subgroups: groups within groups | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✓ | + +#### Code management + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Repository topics | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Repository code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Global code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Git LFS 2.0 | ✓ | ✘ | ✓ | ✓ | ✓ | ⁄ | ✓ | +| Group Milestones | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Granular user roles (Code, Issues, Wiki etc) | ✓ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Verified Committer | ✘ | ✘ | ? | ✓ | ✓ | ✓ | ✘ | +| GPG Signed Commits | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Reject unsigned commits | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ | +| Repository Activity page | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Branch manager | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Create new branches | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Web code editor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Commit graph | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | + +#### Issue Tracker + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Issue tracker | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Issue templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Labels | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Time tracking | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Multiple assignees for issues | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Related issues | ✘ | ✘ | ⁄ | ✘ | ✓ | ✘ | ✘ | +| Confidential issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Comment reactions | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Lock Discussion | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Batch issue handling | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Issue Boards | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Create new branches from issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Issue search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Global issue search | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | + +#### Pull/Merge requests + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Pull/Merge requests | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Squash merging | ✓ | ✘ | ✓ | ✘ | ✓ | ✓ | ✓ | +| Rebase merging | ✓ | ✓ | ✓ | ✘ | ⁄ | ✘ | ✓ | +| Pull/Merge request inline comments | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Pull/Merge request approval | ✘ | ✘ | ⁄ | ✓ | ✓ | ✓ | ✓ | +| Merge conflict resolution | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Restrict push and merge access to certain users | ✓ | ✘ | ✓ | ⁄ | ✓ | ✓ | ✓ | +| Revert specific commits or a merge request | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Pull/Merge requests templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Cherry-picking changes | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | + + +#### 3rd-party integrations + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Webhook support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Custom Git Hooks | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| AD / LDAP integration | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Multiple LDAP / AD server support | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ | +| LDAP user synchronization | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| OpenId Connect support | ✓ | ✘ | ✓ | ✓ | ✓ | ? | ✘ | +| OAuth 2.0 integration (external authorization) | ✓ | ✘ | ⁄ | ✓ | ✓ | ? | ✓ | +| Act as OAuth 2.0 provider | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Two factor authentication (2FA) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Mattermost/Slack integration | ✓ | ✓ | ⁄ | ✓ | ✓ | ⁄ | ✓ | +| Discord integration | ✓ | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | +| External CI/CD status display | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | From 6e39f3d422155293a06df6430766a40ebc56277c Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 18 Jun 2018 17:18:22 +0000 Subject: [PATCH 35/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 310 ++++++++++++++++---------------- options/locale/locale_uk-UA.ini | 10 +- 2 files changed, 162 insertions(+), 158 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 364308424..d618d2c9a 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -83,12 +83,12 @@ host=Host user=Benutzername password=Passwort db_name=Datenbankname -db_helper=Hinweis für MySQL-Benutzer: Bitte verwende das InnoDB Speichersubsystem und den Zeichensatz "utf8_general_ci". +db_helper=Hinweis für MySQL-Benutzer: Bitte verwende das InnoDB-Speichersubsystem und den Zeichensatz „utf8_general_ci“. ssl_mode=SSL path=Pfad sqlite_helper=Der Dateipfad zur SQLite3- oder TiDB-Datenbank.
Bitte verwende einen absoluten Pfad, wenn Gitea als Service gestartet wird. -err_empty_db_path=Der SQLite3 oder TiDB Datenbankpfad darf nicht leer sein. -err_invalid_tidb_name=Der TiDB Datenbankname darf nicht die Zeichen "." und "-" enthalten. +err_empty_db_path=Der SQLite3- oder TiDB-Datenbankpfad darf nicht leer sein. +err_invalid_tidb_name=Der TiDB-Datenbankname darf nicht die Zeichen „.“ und „-“ enthalten. no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen. err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein. @@ -101,13 +101,13 @@ lfs_path=Git LFS-Wurzelpfad lfs_path_helper=In diesem Verzeichnis werden die Dateien von Git LFS abgespeichert. Leer lassen um LFS zu deaktivieren. run_user=Ausführen als run_user_helper=Gebe den Betriebssystem-Benutzernamen ein, unter welchem Gitea laufen soll. Beachte, dass dieser Nutzer Zugriff auf den Repository-Ordner haben muss. -domain=SSH Server-Domain +domain=SSH-Server-Domain domain_helper=Domain oder Host-Adresse für die SSH-URL. -ssh_port=SSH Server Port +ssh_port=SSH-Server-Port ssh_port_helper=Der Port deines SSH-Servers. Leer lassen um SSH zu deaktivieren. -http_port=Gitea HTTP-Listen-Port -http_port_helper=Port unter dem der Gitea Web Server laufen soll. -app_url=Gitea Basis-URL +http_port=Gitea-HTTP-Listen-Port +http_port_helper=Port, unter dem der Gitea-Webserver laufen soll. +app_url=Gitea-Basis-URL app_url_helper=Adresse für HTTP(S)-Klon-URLs und E-Mail-Benachrichtigungen. log_root_path=Logdateipfad log_root_path_helper=Log-Dateien werden in diesem Verzeichnis gespeichert. @@ -117,8 +117,8 @@ email_title=E-Mail-Einstellungen smtp_host=SMTP-Server smtp_from=E-Mail senden als smtp_from_helper=E-Mail-Adresse, die von Gitea genutzt werden soll. Bitte gib die E-Mail-Adresse im '"Name" '-Format ein. -mailer_user=SMTP Benutzername -mailer_password=SMTP Passwort +mailer_user=SMTP-Benutzername +mailer_password=SMTP-Passwort register_confirm=E-Mail-Bestätigung benötigt zum Registrieren mail_notify=E-Mail-Benachrichtigungen aktivieren server_service_title=Sonstige Server- und Drittserviceeinstellungen @@ -131,9 +131,9 @@ federated_avatar_lookup_popup=Föderierte Profilbilder via Libravatar aktivieren disable_registration=Registrierung deaktivieren disable_registration_popup=Registrierung neuer Benutzer deaktivieren. Nur Administratoren werden neue Benutzerkonten anlegen können. allow_only_external_registration_popup=Registrierung nur über externe Services aktiveren. -openid_signin=OpenID Anmeldung aktivieren +openid_signin=OpenID-Anmeldung aktivieren openid_signin_popup=Benutzeranmeldung via OpenID aktivieren. -openid_signup=OpenID Selbstregistrierung aktivieren +openid_signup=OpenID-Selbstregistrierung aktivieren openid_signup_popup=OpenID-basierte Selbstregistrierung aktivieren. enable_captcha=CAPTCHA aktivieren enable_captcha_popup=Captcha-Eingabe bei der Registrierung erforderlich. @@ -147,10 +147,10 @@ confirm_password=Passwort bestätigen admin_email=E-Mail-Adresse install_btn_confirm=Gitea installieren test_git_failed=Fehler beim Test des 'git' Kommandos: %v -sqlite3_not_available=Diese Gitea-Version unterstützt SQLite3 nicht. Bitte lade die offizielle binäre Version von %s herunter (nicht die 'gobuild'-Version). +sqlite3_not_available=Diese Gitea-Version unterstützt SQLite3 nicht. Bitte lade die offizielle binäre Version von %s herunter (nicht die „gobuild“-Version). invalid_db_setting=Datenbankeinstellungen sind ungültig: %v invalid_repo_path=Repository-Verzeichnis ist ungültig: %v -run_user_not_match=Der "Ausführen als" Benutzer ist nicht der aktuelle Benutzer: %s -> %s +run_user_not_match=Der „Ausführen als“-Benutzername ist nicht der aktuelle Benutzername: %s -> %s 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ß! @@ -162,7 +162,7 @@ default_allow_create_organization_popup=Neuen Nutzern das Erstellen von Organisa default_enable_timetracking=Zeiterfassung standardmäßig aktivieren default_enable_timetracking_popup=Zeiterfassung standardmäßig für neue Repositories aktivieren. no_reply_address=Versteckte E-Mail-Domain -no_reply_address_helper=Domain-Namen für Benutzer mit einer versteckten Emailadresse. Zum Beispiel wird der Benutzername "Joe" in Git als "joe@noreply.example.org" protokolliert, wenn die versteckte E-Mail-Domäne "noreply.example.org" festgelegt ist. +no_reply_address_helper=Domain-Name für Benutzer mit einer versteckten Emailadresse. Zum Beispiel wird der Benutzername „Joe“ in Git als „joe@noreply.example.org“ protokolliert, wenn die versteckte E-Mail-Domain „noreply.example.org“ festgelegt ist. [home] uname_holder=E-Mail-Adresse oder Benutzername @@ -225,9 +225,9 @@ login_userpass=Anmelden login_openid=OpenID openid_connect_submit=Verbinden openid_connect_title=Mit bestehendem Konto verbinden -openid_connect_desc=Die gewählte OpenID URI ist unbekannt. Ordne sie hier einem neuen Account zu. +openid_connect_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu. openid_register_title=Neues Konto einrichten -openid_register_desc=Die gewählte OpenID URI ist unbekannt. Ordne sie hier einem neuen Account zu. +openid_register_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu. openid_signin_desc=Gib deine OpenID-URI ein. Zum Beispiel: https://anne.me, bob.openid.org.cn oder gnusocial.net/carry. disable_forgot_password_mail=Das Zurücksetzen von Passwörtern wurde deaktiviert. Bitte wende dich an den Administrator. @@ -264,8 +264,8 @@ TreeName=Dateipfad Content=Inhalt require_error=` darf nicht leer sein.` -alpha_dash_error=` sollte nur Buchstaben, Zahlen, Bindestriche ('-') und Unterstriche ('_') enthalten` -alpha_dash_dot_error=` sollte nur Buchstaben, Zahlen, Bindestriche ('-'), Unterstriche ('_') und Punkte ('.') enthalten` +alpha_dash_error=` sollte nur Buchstaben, Zahlen, Bindestriche („-“) und Unterstriche („_“) enthalten.` +alpha_dash_dot_error=` sollte nur Buchstaben, Zahlen, Bindestriche („-“), Unterstriche („_“) und Punkte („.“) enthalten.` git_ref_name_error=` muss ein wohlgeformter Git-Referenzname sein.` size_error=` muss die Größe %s haben.` min_size_error=` muss mindestens %s Zeichen enthalten.` @@ -283,13 +283,13 @@ org_name_been_taken=Der Organisationsname ist bereits vergeben. team_name_been_taken=Der Teamname ist bereits vergeben. team_no_units_error=Das Team muss auf mindestens einen Bereich Zugriff haben. email_been_used=Die E-Mail-Adresse wird bereits verwendet. -openid_been_used=Die OpenID-Adresse "%s" wird bereits verwendet. +openid_been_used=Die OpenID-Adresse „%s“ wird bereits verwendet. username_password_incorrect=Benutzername oder Passwort ist falsch. enterred_invalid_repo_name=Der eingegebenen Repository-Name ist falsch. -enterred_invalid_owner_name=Der Name des neuen Besitzers ist invalid. +enterred_invalid_owner_name=Der Name des neuen Besitzers ist ungültig. enterred_invalid_password=Das eingegebene Passwort ist falsch. user_not_exist=Dieser Benutzer ist nicht vorhanden. -last_org_owner=Du kannst den letzten Benutzer nicht aus dem "Besitzer"-Team entferenen. Es muss mindestens ein Besitzer in einer Organisation geben. +last_org_owner=Du kannst den letzten Benutzer nicht aus dem „Besitzer“-Team entfernen. Es muss mindestens einen Besitzer in einer Organisation geben. cannot_add_org_to_team=Eine Organisation kann nicht als Teammitglied hinzugefügt werden. invalid_ssh_key=Dein SSH-Key kann nicht überprüft werden: %s @@ -349,7 +349,7 @@ continue=Weiter cancel=Abbrechen language=Sprache -lookup_avatar_by_mail=Avatar anhand der E-Mail-Addresse suchen +lookup_avatar_by_mail=Profilbild anhand der E-Mail-Addresse suchen federated_avatar_lookup=Suche nach föderierten Profilbildern enable_custom_avatar=Benutzerdefiniertes Profilbild benutzen choose_new_avatar=Neues Profilbild auswählen @@ -364,7 +364,7 @@ new_password=Neues Passwort retype_new_password=Neues Passwort erneut eingeben password_incorrect=Das aktuelle Passwort ist falsch. change_password_success=Dein Passwort wurde aktualisiert. Bitte verwende dieses beim nächsten Einloggen. -password_change_disabled=Benutzer, die nicht von Gitea verwaltet werden, können ihr Passwort im Web Interface nicht ändern. +password_change_disabled=Benutzer, die nicht von Gitea verwaltet werden, können ihr Passwort im Web-Interface nicht ändern. emails=E-Mail-Adressen manage_emails=E-Mail-Adressen verwalten @@ -383,7 +383,7 @@ add_new_email=Neue E-Mail-Adresse hinzufügen add_new_openid=Neue OpenID-URI hinzufügen add_email=E-Mail-Adresse hinzufügen add_openid=OpenID-URI hinzufügen -add_email_confirmation_sent=Eine Bestätigungs-E-Mail wurde an '%s' gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um die E-Mail-Adresse zu bestätigen. +add_email_confirmation_sent=Eine Bestätigungs-E-Mail wurde an „%s“ gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um die E-Mail-Adresse zu bestätigen. add_email_success=Die neue E-Mail-Addresse wurde hinzugefügt. add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt. keep_email_private=E-Mail-Adresse verbergen @@ -394,8 +394,8 @@ manage_ssh_keys=SSH-Schlüssel verwalten manage_gpg_keys=GPG-Schlüssel verwalten add_key=Schlüssel hinzufügen ssh_desc=Diese öffentlichen SSH-Keys sind mit deinem Account verbunden. Der dazugehörigen privaten SSH-Keys geben dir vollen Zugriff auf deine Repositories. -gpg_desc=Diese öffentlichen GPG-Keys sind mit deinem Account verbunden. Halte die dazugehörigen privaten SSH-Keys geheim, da diese deine Commits signieren. -ssh_helper=Brauchst du Hilfe? Hier ist Githubs Anleitung zum Erzeugen von SSH-Schlüsseln oder Lösen einfacher SSH-Probleme. +gpg_desc=Diese öffentlichen GPG-Keys sind mit deinem Account verbunden. Halte die dazugehörigen privaten GPG-Keys geheim, da diese deine Commits signieren. +ssh_helper=Brauchst du Hilfe? Hier ist GitHubs Anleitung zum Erzeugen von SSH-Schlüsseln oder zum Lösen einfacher SSH-Probleme. gpg_helper=Brauchst du Hilfe? Hier ist GitHubs Anleitung über GPG. add_new_key=SSH-Schlüssel hinzufügen add_new_gpg_key=GPG-Schlüssel hinzufügen @@ -407,8 +407,8 @@ subkeys=Unterschlüssel key_id=Schlüssel-ID key_name=Schlüsselname key_content=Inhalt -add_key_success=Der SSH-Schlüssel "%s" wurde hinzugefügt. -add_gpg_key_success=Der GPG-Key "%s" wurde hinzugefügt. +add_key_success=Der SSH-Schlüssel „%s“ wurde hinzugefügt. +add_gpg_key_success=Der GPG-Key „%s“ wurde hinzugefügt. delete_key=Entfernen ssh_key_deletion=SSH-Schlüssel entfernen gpg_key_deletion=GPG-Schlüssel entfernen @@ -511,10 +511,10 @@ create_repo=Repository erstellen default_branch=Standardbranch mirror_prune=Entfernen mirror_prune_desc=Entferne veraltete remote-tracking Referenzen -mirror_interval=Spiegelintervall (gültige Zeiteinheiten sind 'h', 'm', 's') +mirror_interval=Spiegelintervall (gültige Zeiteinheiten sind „h“, „m“, „s“) mirror_interval_invalid=Das Spiegel-Intervall ist ungültig. mirror_address=Klonen via URL -mirror_address_desc=Bitte gebe alle benötigten Zugangsdaten in der URL an. +mirror_address_desc=Bitte gib alle benötigten Zugangsdaten in der URL an. mirror_last_synced=Zuletzt synchronisiert watchers=Beobachter stargazers=Favorisiert von @@ -523,7 +523,7 @@ pick_reaction=Wähle eine Reaktion reactions_more=und %d weitere form.reach_limit_of_creation=Du hast bereits dein Limit von %d Repositories erreicht. -form.name_reserved=Der Repository-Name '%s' ist reserviert. +form.name_reserved=Der Repository-Name „%s“ ist reserviert. form.name_pattern_not_allowed='%s' ist nicht erlaubt für Repository-Namen. need_auth=Authentifizierung zum Klonen benötigt @@ -598,31 +598,31 @@ editor.filename_help=Füge einen Ordner hinzu, indem du seinen Namen und anschli editor.or=oder editor.cancel_lower=Abbrechen editor.commit_changes=Änderungen committen -editor.add_tmpl='%s/' hinzufügen -editor.add='%s' hinzufügen -editor.update='%s' ändern -editor.delete='%s' löschen +editor.add_tmpl=„%s/“ hinzufügen +editor.add=„%s“ hinzufügen +editor.update=„%s“ ändern +editor.delete=„%s“ löschen editor.commit_message_desc=Eine ausführlichere (optionale) Beschreibung hinzufügen… -editor.commit_directly_to_this_branch=Direkt in die %s-Branch einchecken. -editor.create_new_branch=Einen neue Branch für diesen Commit erstellen und einen Pull Request starten. +editor.commit_directly_to_this_branch=Direkt in den Branch „%s“ einchecken. +editor.create_new_branch=Einen neuen Branch für diesen Commit erstellen und einen Pull Request starten. editor.new_branch_name_desc=Neuer Branchname… editor.cancel=Abbrechen editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein. editor.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. -editor.directory_is_a_file=Der Verzeichnisname '%s' wird bereits als Dateiname in diesem Repository verwendet. +editor.directory_is_a_file=Der Verzeichnisname „%s“ wird bereits als Dateiname in diesem Repository verwendet. editor.file_is_a_symlink='%s' ist ein symolischer Link. Symbolische Links können mit dem Web Editor nicht bearbeitet werden. -editor.filename_is_a_directory=Der Dateiname '%s' wird bereits als Verzeichnisname in diesem Repository verwendet. -editor.file_editing_no_longer_exists=Die bearbeitete Datei '%s' existiert nicht mehr in diesem Repository. -editor.file_changed_while_editing=Der Inhalt der Datei hat sich seit dem Beginn der Bearbeitung geändert. Hier klicken um die Änderungen anzusehen, oder Änderungen erneut comitten um sie zu überschreiben. -editor.file_already_exists=Eine Datei mit dem Namen '%s' ist bereits in diesem Repository vorhanden. +editor.filename_is_a_directory=Der Dateiname „%s“ wird bereits als Verzeichnisname in diesem Repository verwendet. +editor.file_editing_no_longer_exists=Die bearbeitete Datei „%s“ existiert nicht mehr in diesem Repository. +editor.file_changed_while_editing=Der Inhalt der Datei hat sich seit dem Beginn der Bearbeitung geändert. Hier klicken, um die Änderungen anzusehen, oder Änderungen erneut comitten, um sie zu überschreiben. +editor.file_already_exists=Eine Datei mit dem Namen „%s“ ist bereits in diesem Repository vorhanden. editor.no_changes_to_show=Keine Änderungen vorhanden. editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v editor.add_subdir=Verzeichnis erstellen… -editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach '%s'. Fehler: %v +editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach „%s“. Fehler: %v editor.upload_files_to_dir=Dateien hochladen nach '%s' -editor.cannot_commit_to_protected_branch=Commit in den geschützten Branch '%s' ist nicht möglich. +editor.cannot_commit_to_protected_branch=Commit in den geschützten Branch „%s“ ist nicht möglich. -commits.desc=Durchsuche die Quellcode Änderungshistorie. +commits.desc=Durchsuche die Quellcode-Änderungshistorie. commits.commits=Commits commits.search=Commits durchsuchen… commits.find=Suchen @@ -633,7 +633,7 @@ commits.date=Datum commits.older=Älter commits.newer=Neuer commits.signed_by=Signiert von -commits.gpg_key_id=GPG Schlüssel-ID +commits.gpg_key_id=GPG-Schlüssel-ID ext_issues=Externe Issues ext_issues.desc=Link zu externem Issuetracker. @@ -768,10 +768,10 @@ issues.cancel_tracking_history=hat die Zeiterfassung %s abgebrochen issues.time_spent_total=Zeitaufwand insgesamt issues.time_spent_from_all_authors=`Aufgewendete Zeit: %s` issues.due_date=Fällig am -issues.invalid_due_date_format=Das Fälligkeitsdatum muss das Format 'JJJJ-MM-TT' haben. +issues.invalid_due_date_format=Das Fälligkeitsdatum muss das Format „JJJJ-MM-TT“ haben. issues.error_modifying_due_date=Fehler beim Ändern des Fälligkeitsdatums. issues.error_removing_due_date=Fehler beim Entfernen des Fälligkeitsdatums. -issues.due_date_form=jjjj-mm-tt +issues.due_date_form=JJJJ-MM-TT issues.due_date_form_add=Fälligkeitsdatum hinzufügen issues.due_date_form_update=Fälligkeitsdatum ändern issues.due_date_form_remove=Fälligkeitsdatum löschen @@ -787,7 +787,7 @@ pulls.new=Neuer Pull-Request pulls.compare_changes=Neuer Pull-Request pulls.compare_changes_desc=Wähle die Ziel- und Quellbranch aus. pulls.compare_base=Ziel -pulls.compare_compare=pull von +pulls.compare_compare=pullen von pulls.filter_branch=Branch filtern pulls.no_results=Keine Ergebnisse verfügbar. pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Request erstellt werden. @@ -827,13 +827,13 @@ milestones.title=Titel milestones.desc=Beschreibung milestones.due_date=Fälligkeitsdatum (optional) milestones.clear=Feld leeren -milestones.invalid_due_date_format=Das Fälligkeitsdatum muss das Format 'JJJJ-MM-TT' haben. -milestones.create_success=Der Meilenstein '%s' wurde erstellt. +milestones.invalid_due_date_format=Das Fälligkeitsdatum muss das Format „JJJJ-MM-TT“ haben. +milestones.create_success=Der Meilenstein „%s“ wurde erstellt. milestones.edit=Meilenstein bearbeiten milestones.edit_subheader=Benutze Meilensteine, um Issues zu organisieren und den Fortschritt darzustellen. milestones.cancel=Abbrechen milestones.modify=Meilenstein bearbeiten -milestones.edit_success=Die Änderungen am Meilenstein "%s" wurden gespeichert. +milestones.edit_success=Die Änderungen am Meilenstein „%s“ wurden gespeichert. milestones.deletion=Meilenstein löschen milestones.deletion_desc=Das Löschen des Meilensteins entfernt ihn von allen Issues. Fortfahren? milestones.deletion_success=Der Meilenstein wurde gelöscht. @@ -849,7 +849,7 @@ ext_wiki.desc=Verweis auf externes Wiki. wiki=Wiki wiki.welcome=Willkommen im Wiki. -wiki.welcome_desc=Im Wiki kannst Dokumentation schreiben und mit Mitarbeitern teilen. +wiki.welcome_desc=Im Wiki kannst du Dokumentation schreiben und sie mit Mitarbeitern teilen. wiki.desc=Schreibe und teile Dokumentation mit Mitarbeitern. wiki.create_first_page=Erstelle die erste Seite wiki.page=Seite @@ -861,9 +861,9 @@ wiki.last_commit_info=%s hat diese Seite bearbeitet %s wiki.edit_page_button=Bearbeiten wiki.new_page_button=Neue Seite wiki.delete_page_button=Seite löschen -wiki.delete_page_notice_1=Das Löschen der Wiki-Seite '%s' kann nicht Rückgängig gemacht werden. Fortfahren? +wiki.delete_page_notice_1=Das Löschen der Wiki-Seite „%s“ kann nicht rückgängig gemacht werden. Fortfahren? wiki.page_already_exists=Eine Wiki-Seite mit dem gleichen Namen existiert bereits. -wiki.reserved_page=Der Wiki-Seitenname "%s" ist reserviert. +wiki.reserved_page=Der Wiki-Seitenname „%s“ ist reserviert. wiki.pages=Seiten wiki.last_updated=Zuletzt aktualisiert %s @@ -911,7 +911,7 @@ activity.published_release_label=Veröffentlicht search=Suchen search.search_repo=Repository durchsuchen -search.results=Suchergebnisse für "%s" in %s +search.results=Suchergebnisse für „%s“ in %s settings=Einstellungen settings.desc=In den Einstellungen kannst du die Einstellungen des Repository anpassen @@ -925,28 +925,28 @@ settings.hooks=Webhooks settings.githooks=Git-Hooks settings.basic_settings=Grundeinstellungen settings.mirror_settings=Mirror Einstellungen -settings.sync_mirror=Jetzt Synchronisieren +settings.sync_mirror=Jetzt synchronisieren settings.mirror_sync_in_progress=Mirror-Synchronisierung wird zurzeit ausgeführt. Komm in ein paar Minuten zurück. settings.site=Webseite settings.update_settings=Einstellungen speichern settings.advanced_settings=Erweiterte Einstellungen -settings.wiki_desc=Repository Wiki aktivieren +settings.wiki_desc=Repository-Wiki aktivieren settings.use_internal_wiki=Eingebautes Wiki verwenden settings.use_external_wiki=Externes Wiki verwenden settings.external_wiki_url=Externe Wiki URL settings.external_wiki_url_error=Die externe Wiki-URL ist ungültig. -settings.external_wiki_url_desc=Besucher werden auf die externe Wiki-URL weitergeleitet wenn sie auf das Wiki-Tab klicken. -settings.issues_desc=Repository Issue-Tracker aktivieren +settings.external_wiki_url_desc=Besucher werden auf die externe Wiki-URL weitergeleitet, wenn sie auf das Wiki-Tab klicken. +settings.issues_desc=Repository-Issue-Tracker aktivieren settings.use_internal_issue_tracker=Integrierten Issue-Tracker verwenden settings.use_external_issue_tracker=Externen Issue-Tracker verwenden settings.external_tracker_url=URL eines externen Issue Trackers settings.external_tracker_url_error=Die URL des externen Issue-Trackers ist ungültig. -settings.external_tracker_url_desc=Besucher werden auf die externe Issue-Tracker-URL weitergeleitet wenn sie auf das Issues-Tab klicken. +settings.external_tracker_url_desc=Besucher werden auf die externe Issue-Tracker-URL weitergeleitet, wenn sie auf das Issues-Tab klicken. settings.tracker_url_format=URL-Format des externen Issue-Systems settings.tracker_issue_style=Namenskonvention des externen Issue-Trackers settings.tracker_issue_style.numeric=Numerisch settings.tracker_issue_style.alphanumeric=Alphanumerisch -settings.tracker_url_format_desc=Du kannst die Platzhalter {user}, {repo}, {index} für den Benutzernamen, den Namen des Repositories und die Issue-Nummer verwenden. +settings.tracker_url_format_desc=Du kannst die Platzhalter {user}, {repo}, {index} für den Benutzernamen, den Namen des Repositorys und die Issue-Nummer verwenden. settings.enable_timetracker=Zeiterfassung aktivieren settings.allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen settings.pulls_desc=Repository-Pull-Requests aktivieren @@ -964,22 +964,22 @@ settings.convert_notices_1=Dieser Vorgang wandelt das Mirror-Repository in ein n settings.convert_confirm=Repository umwandeln settings.convert_succeed=Das Mirror-Repository wurde erfolgreich in ein normales Repository umgewandelt. settings.transfer=Besitz übertragen -settings.transfer_desc=Übertrage dieses Repository auf einen anderen Benutzer oder eine Organisation in der Du Admin-Rechte hast. -settings.transfer_notices_1=- Du wirst keinen Zugriff mehr haben, wenn der neue Besitzer ein individueller Benutzer ist. -settings.transfer_notices_2=- Du wirst weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und du einer der Besitzer bist. +settings.transfer_desc=Übertrage dieses Repository auf einen anderen Benutzer oder eine Organisation, in der du Admin-Rechte hast. +settings.transfer_notices_1=– Du wirst keinen Zugriff mehr haben, wenn der neue Besitzer ein individueller Benutzer ist. +settings.transfer_notices_2=– Du wirst weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und du einer der Besitzer bist. settings.transfer_form_title=Gib den Repository-Namen zur Bestätigung ein: settings.wiki_delete=Wiki-Daten löschen settings.wiki_delete_desc=Das Löschen von Wiki-Daten kann nicht rückgängig gemacht werden. Bitte sei vorsichtig. -settings.wiki_delete_notices_1=- Dies löscht und deaktiviert das Wiki für %s. +settings.wiki_delete_notices_1=– Dies löscht und deaktiviert das Wiki für %s. settings.confirm_wiki_delete=Wiki-Daten löschen -settings.wiki_deletion_success=Repository Wiki-Daten wurden gelöscht. +settings.wiki_deletion_success=Repository-Wiki-Daten wurden gelöscht. settings.delete=Dieses Repository löschen settings.delete_desc=Wenn dieses Repository gelöscht wurde, gibt es keinen Weg zurück. Bitte sei vorsichtig. settings.delete_notices_1=- Diese Operation kann NICHT rückgängig gemacht werden. -settings.delete_notices_2=- Die Operation wird das %s-Repository dauerhaft löschen, inklusive der Dateien, Issues, Kommentare und Zugriffseinstellungen. -settings.delete_notices_fork_1=- Nach dem Löschen werden alle Forks unabhängig. +settings.delete_notices_2=– Die Operation wird das %s-Repository dauerhaft löschen, inklusive der Dateien, Issues, Kommentare und Zugriffseinstellungen. +settings.delete_notices_fork_1=– Forks dieses Repositorys werden nach dem Löschen unabhängig. settings.deletion_success=Das Repository wurde gelöscht. -settings.update_settings_success=Repository Einstellungen wurden aktualisiert. +settings.update_settings_success=Repository-Einstellungen wurden aktualisiert. settings.transfer_owner=Neuer Besitzer settings.make_transfer=Transfer durchführen settings.transfer_succeed=Das Repository wurde transferiert. @@ -994,7 +994,7 @@ settings.search_user_placeholder=Benutzer suchen… settings.org_not_allowed_to_be_collaborator=Organisationen können nicht als Mitarbeiter hinzugefügt werden. settings.user_is_org_member=Der Benutzer ist ein Organisationsmitglied und kann nicht als Mitarbeiter hinzugefügt werden. settings.add_webhook=Webhook hinzufügen -settings.hooks_desc=Webhooks senden bei bestimmten Gitea-Events automatisch HTTP POST-Requets an einen Server. Lies mehr in unserer Anleitung zu Webhooks (Englisch). +settings.hooks_desc=Webhooks senden bei bestimmten Gitea-Events automatisch „HTTP POST“-Anfragen an einen Server. Lies mehr in unserer Anleitung zu Webhooks (auf Englisch). settings.webhook_deletion=Webhook löschen settings.webhook_deletion_desc=Das Entfernen eines Webhooks löscht seine Einstellungen und Zustellungsverlauf. Fortfahren? settings.webhook_deletion_success=Webhook wurde entfernt. @@ -1066,18 +1066,18 @@ settings.title=Titel settings.deploy_key_content=Inhalt settings.key_been_used=Ein Deploy-Key mit identischem Inhalt wird bereits verwendet. settings.key_name_used=Ein Deploy-Key mit diesem Namen existiert bereits. -settings.add_key_success=Der Deploy-Key '%s' wurde erfolgreich hinzugefügt. +settings.add_key_success=Der Deploy-Key „%s“ wurde erfolgreich hinzugefügt. settings.deploy_key_deletion=Deploy-Key löschen settings.deploy_key_deletion_desc=Nach dem Löschen wird dieser Deploy-Key keinen Zugriff mehr auf dieses Repository haben. Fortfahren? settings.deploy_key_deletion_success=Der Deploy-Key wurde entfernt. settings.branches=Branches -settings.protected_branch=Branch-Protection +settings.protected_branch=Branch-Schutz settings.protected_branch_can_push=Push erlauben? settings.protected_branch_can_push_yes=Du kannst pushen settings.protected_branch_can_push_no=Du kannst nicht pushen -settings.branch_protection=Branch-Schutz" für Branch '%s' +settings.branch_protection=Branch-Schutz für Branch „%s“ settings.protect_this_branch=Brach-Schutz aktivieren -settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere Git force push auf diese Branch. +settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere das sog. „force pushing” von Git auf diesen Branch. settings.protect_whitelist_committers=Push-Whitelist aktivieren settings.protect_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Push-Beschränkungen zu umgehen. settings.protect_whitelist_users=Nutzer, die pushen dürfen: @@ -1090,12 +1090,12 @@ settings.protect_merge_whitelist_users=Nutzer, die mergen dürfen: settings.protect_merge_whitelist_teams=Teams, die mergen dürfen: settings.add_protected_branch=Schutz aktivieren settings.delete_protected_branch=Schutz deaktivieren -settings.update_protect_branch_success=Branch-protection für die Branch '%s' wurde geändert. -settings.remove_protected_branch_success=Branch-protection für die Branch '%s' wurde deaktiviert. +settings.update_protect_branch_success=Branch-Schutz für den Branch „%s“ wurde geändert. +settings.remove_protected_branch_success=Branch-Schutz für den Branch „%s“ wurde deaktiviert. settings.protected_branch_deletion=Brach-Schutz deaktivieren -settings.protected_branch_deletion_desc=Wenn du die Branch-Protection deaktivierst, können alle Nutzer mit Schreibrechten auf die Branch pushen. Fortfahren? +settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren? settings.default_branch_desc=Wähle eine Standardbranch für Pull-Requests und Code-Commits: -settings.choose_branch=Wähle eine Branch… +settings.choose_branch=Wähle einen Branch … settings.no_protected_branch=Es gibt keine geschützten Branches. diff.browse_source=Quellcode durchsuchen @@ -1131,7 +1131,7 @@ release.write=Schreiben release.preview=Vorschau release.loading=Laden… release.prerelease_desc=Als Pre-Release kennzeichnen -release.prerelease_helper=Dieses Release als "ungeeignet für den produktiven Einsatz" markieren. +release.prerelease_helper=Dieses Release als „ungeeignet für den produktiven Einsatz“ markieren. release.cancel=Abbrechen release.publish=Release veröffentlichen release.save_draft=Entwurf speichern @@ -1146,24 +1146,24 @@ release.downloads=Downloads branch.name=Branchname branch.search=Branches durchsuchen -branch.already_exists=Eine Branch mit dem Namen '%s' existiert bereits. +branch.already_exists=Ein Branch mit dem Namen „%s“ existiert bereits. branch.delete_head=Löschen -branch.delete=Branch '%s' löschen +branch.delete=Branch „%s“ löschen branch.delete_html=Branch löschen -branch.delete_desc=Das Löschen einer Branch ist permanent. Es KANN NICHT Rückgängig gemacht werden. Fortfahren? -branch.deletion_success=Branch '%s' wurde gelöscht. -branch.deletion_failed=Branch '%s' konnte nicht gelöscht werden. -branch.delete_branch_has_new_commits=Die Branch '%s' kann nicht gelöscht weden, da seit dem letzten Merge neue Commits hinzugefügt wurden. +branch.delete_desc=Das Löschen eines Branches ist permanent. Es KANN NICHT rückgängig gemacht werden. Fortfahren? +branch.deletion_success=Branch „%s“ wurde gelöscht. +branch.deletion_failed=Branch „%s“ konnte nicht gelöscht werden. +branch.delete_branch_has_new_commits=Der Branch „%s“ kann nicht gelöscht weden, da seit dem letzten Merge neue Commits hinzugefügt wurden. branch.create_branch=Erstelle Branch %s branch.create_from=von '%s' -branch.create_success=Branch '%s' wurde erstellt. +branch.create_success=Branch „%s“ wurde erstellt. branch.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. -branch.branch_name_conflict=Der Branch-Name '%s' steht in Konflikt mit der bestehendem Branch '%s'. -branch.tag_collision=Branch '%s' kann nicht erstellt werden, da in diesem Repository bereits ein Tag mit dem selben Namen existiert. +branch.branch_name_conflict=Der Branch-Name „%s“ steht in Konflikt mit dem bestehenden Branch „%s“. +branch.tag_collision=Branch „%s“ kann nicht erstellt werden, da in diesem Repository bereits ein Tag mit dem selben Namen existiert. branch.deleted_by=Von %s gelöscht -branch.restore_success=Branch '%s' wurde wiederhergestellt. -branch.restore_failed=Wiederherstellung der Branch '%s' fehlgeschlagen. -branch.protected_deletion_failed=Branch '%s' ist geschützt und kann nicht gelöscht werden. +branch.restore_success=Branch „%s“ wurde wiederhergestellt. +branch.restore_failed=Wiederherstellung des Branches „%s“ fehlgeschlagen. +branch.protected_deletion_failed=Branch „%s“ ist geschützt und kann nicht gelöscht werden. topic.manage_topics=Themen verwalten topic.done=Fertig @@ -1188,9 +1188,9 @@ team_desc_helper=Beschreibe den Zweck oder die Rolle des Teams. team_permission_desc=Berechtigungen team_unit_desc=Zugriff auf Repositorybereiche erlauben -form.name_reserved=Der Organisationsname '%s' ist reserviert. -form.name_pattern_not_allowed=Das Muster '%s' ist in Organisationsnamen nicht erlaubt. -form.create_org_not_allowed=Du bist nicht berechtigt eine Organisation zu erstellen. +form.name_reserved=Der Organisationsname „%s“ ist reserviert. +form.name_pattern_not_allowed=Das Muster „%s“ ist in Organisationsnamen nicht erlaubt. +form.create_org_not_allowed=Du bist nicht berechtigt, eine Organisation zu erstellen. settings=Einstellungen settings.options=Organisation @@ -1229,7 +1229,7 @@ teams.read_access_helper=Mitglieder können Teamrepositories ansehen und klonen. teams.write_access=Schreibzugriff teams.write_access_helper=Mitglieder können Teamrepositories ansehen und auf sie pushen. teams.admin_access=Administratorzugang -teams.admin_access_helper=Mitglieder können auf Team Repositories "pushen", von ihnen "pullen" und Mitarbeiter hinzufügen. +teams.admin_access_helper=Mitglieder können auf Team-Repositorys pushen, von ihnen pullen und Mitarbeiter hinzufügen. teams.no_desc=Dieses Team hat keine Beschreibung teams.settings=Einstellungen teams.owners_permission_desc=Besitzer haben vollen Zugriff auf alle Repositories und Admin-Rechte für diese Organisation. @@ -1277,12 +1277,12 @@ dashboard.delete_repo_archives=Alle Repository-Archive löschen dashboard.delete_repo_archives_success=Alle Repository-Archive wurden gelöscht. dashboard.delete_missing_repos=Alle Repository-Datensätze mit verlorenen gegangenen Git-Dateien löschen dashboard.delete_missing_repos_success=Alle Repository-Datensätze mit verlorenen Git-Dateien wurden gelöscht. -dashboard.git_gc_repos=Garbage Collection auf Repositories ausführen -dashboard.git_gc_repos_success=Alle Repositories haben Garbage Collection beendet. -dashboard.resync_all_sshkeys='.ssh/authorized_keys'-Datei mit Gitea SSH-Keys neu schreiben. (Wenn Du den eingebauten SSH Server nutzt, musst du das nicht ausführen.) +dashboard.git_gc_repos=Garbage-Collection auf Repositories ausführen +dashboard.git_gc_repos_success=Alle Repositories haben Garbage-Collection beendet. +dashboard.resync_all_sshkeys=„.ssh/authorized_keys“-Datei mit Gitea-SSH-Keys neu schreiben. (Wenn Du den eingebauten SSH-Server nutzt, musst du das nicht ausführen.) dashboard.resync_all_sshkeys_success=Alle von Gitea verwalteten öffentlichen Schlüssel wurden neu geschrieben. -dashboard.resync_all_hooks=Synchronisiere pre-receive, update und post-receive Hooks für alle Repositories. -dashboard.resync_all_hooks_success=Alle pre-receive, update und post-receive Repository-Hooks wurden synchronisiert. +dashboard.resync_all_hooks=Synchronisiere „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositorys erneut. +dashboard.resync_all_hooks_success=Alle „pre-receive“-, „update“- und „post-receive“-Repository-Hooks wurden erneut synchronisiert. dashboard.reinit_missing_repos=Alle Git-Repositories mit Einträgen neu einlesen dashboard.reinit_missing_repos_success=Alle verlorenen Git-Repositories mit existierenden Einträgen wurden erfolgreich aktualisiert. dashboard.sync_external_users=Externe Benutzerdaten synchronisieren @@ -1305,11 +1305,11 @@ dashboard.heap_memory_released=Freigegebener Heap-Memory dashboard.heap_objects=Heap-Objekte dashboard.bootstrap_stack_usage=Bootstrap-Stack-Auslastung dashboard.stack_memory_obtained=Erhaltener Stack-Memory -dashboard.mspan_structures_usage=MSpan-Structures Auslastung -dashboard.mspan_structures_obtained=MSpan-Structures erhalten -dashboard.mcache_structures_usage=MCache-Structures Auslastung +dashboard.mspan_structures_usage=MSpan-Structures-Auslastung +dashboard.mspan_structures_obtained=Erhaltene MSpan-Structures +dashboard.mcache_structures_usage=MCache-Structures-Auslastung dashboard.mcache_structures_obtained=Erhaltene MCache-Structures -dashboard.profiling_bucket_hash_table_obtained=Analysesatz Hashtabellen erhalten +dashboard.profiling_bucket_hash_table_obtained=Erhaltene Analysesatz-Hashtabellen dashboard.gc_metadata_obtained=Erhaltene GC-Metadata dashboard.other_system_allocation_obtained=Andere erhaltene System-Allokationen dashboard.next_gc_recycle=Nächster GC-Zyklus @@ -1342,7 +1342,7 @@ users.max_repo_creation_desc=(Gib -1 ein, um das globale Standardlimit zu verwen users.is_activated=Account ist aktiviert users.prohibit_login=Anmelden deaktivieren users.is_admin=Ist Administrator -users.allow_git_hook=Darf "Git Hooks" erstellen +users.allow_git_hook=Darf „Git Hooks“ erstellen users.allow_import_local=Darf lokale Repositories importieren users.allow_create_organization=Darf Organisationen erstellen users.update_profile=Benutzerkonto aktualisieren @@ -1384,31 +1384,31 @@ auths.bind_dn=DN binden auths.bind_password=Passwort binden auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. Benutze wenn möglich einen Account mit nur Lesezugriff. auths.user_base=Basis für Benutzersuche -auths.user_dn=Benutzer DN -auths.attribute_username=Benutzername Attribut +auths.user_dn=Benutzer-DN +auths.attribute_username=Benutzernamens-Attribut auths.attribute_username_placeholder=Leerlassen, um den in Gitea eingegebenen Benutzernamen zu verwenden. auths.attribute_name=Vornamensattribut auths.attribute_surname=Nachnamensattribut -auths.attribute_mail=E-Mail Attribut -auths.attribute_ssh_public_key=Öffentliches SSH-Schlüssel Attribut +auths.attribute_mail=E-Mail-Attribut +auths.attribute_ssh_public_key=Öffentlicher-SSH-Schlüssel-Attribut auths.attributes_in_bind=Hole Attribute im Bind-Kontext auths.use_paged_search=Seitensuche verwenden auths.search_page_size=Seitengröße auths.filter=Benutzerfilter -auths.admin_filter=Admin Filter -auths.ms_ad_sa=MS AD Suchattribute +auths.admin_filter=Admin-Filter +auths.ms_ad_sa=MS-AD-Suchattribute auths.smtp_auth=SMTP-Authentifizierungstyp auths.smtphost=SMTP-Host auths.smtpport=SMTP-Port auths.allowed_domains=Erlaubte Domains -auths.allowed_domains_helper=Leerlassen, um alle Domains zuzulassen. Trenne mehrere Domänen mit einem Komma (','). +auths.allowed_domains_helper=Leerlassen, um alle Domains zuzulassen. Trenne mehrere Domänen mit einem Komma („,“). auths.enable_tls=TLS-Verschlüsselung aktivieren -auths.skip_tls_verify=TLS Verifikation überspringen -auths.pam_service_name=PAM Dienstname -auths.oauth2_provider=OAuth2 Anbieter +auths.skip_tls_verify=TLS-Verifikation überspringen +auths.pam_service_name=PAM-Dienstname +auths.oauth2_provider=OAuth2-Anbieter auths.oauth2_clientID=Client-ID (Schlüssel) auths.oauth2_clientSecret=Client-Secret -auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery URL +auths.openIdConnectAutoDiscoveryURL=OpenID-Connect-Auto-Discovery-URL auths.oauth2_use_custom_url=Benutzerdefinierte URLs anstelle von Standard-URLs verwenden auths.oauth2_tokenURL=Token-URL auths.oauth2_authURL=Authorisierungs-URL @@ -1416,48 +1416,48 @@ auths.oauth2_profileURL=Profil-URL auths.oauth2_emailURL=E-Mail-URL auths.enable_auto_register=Automatische Registrierung aktivieren auths.tips=Tipps -auths.tips.oauth2.general=OAuth2 Authentifizierung -auths.tips.oauth2.general.tip=Beim Registrieren einer neuen OAuth2 Authentifizierung sollte die Callback/Weiterleitungs-URL /user/oauth2//callback sein. -auths.tip.oauth2_provider=OAuth2 Anbieter -auths.tip.bitbucket=Registriere einen neuen OAuth-Consumer unter https://bitbucket.org/account/user//oauth-consumers/new und füge die Berechtigung "Account"-"Read" hinzu. +auths.tips.oauth2.general=OAuth2-Authentifizierung +auths.tips.oauth2.general.tip=Beim Registrieren einer neuen OAuth2-Authentifizierung sollte die Callback-/Weiterleitungs-URL „/user/oauth2//callback“ sein. +auths.tip.oauth2_provider=OAuth2-Anbieter +auths.tip.bitbucket=Registriere einen neuen OAuth-Consumer unter https://bitbucket.org/account/user//oauth-consumers/new und füge die Berechtigung „Account“ – „Read“ hinzu. auths.tip.dropbox=Erstelle eine neue App auf https://www.dropbox.com/developers/apps. -auths.tip.facebook=Erstelle eine neue Anwendung auf https://developers.facebook.com/apps und füge das Produkt "Facebook Login" hinzu. -auths.tip.github=Erstelle unter https://github.com/settings/applications/new eine neue OAuth Anwendung. +auths.tip.facebook=Erstelle eine neue Anwendung auf https://developers.facebook.com/apps und füge das Produkt „Facebook Login“ hinzu. +auths.tip.github=Erstelle unter https://github.com/settings/applications/new eine neue OAuth-Anwendung. auths.tip.gitlab=Erstelle unter https://gitlab.com/profile/applications eine neue Anwendung. -auths.tip.google_plus=Du erhältst die OAuth2 Client Zugangsdaten in der Google API Console unter https://console.developers.google.com/ +auths.tip.google_plus=Du erhältst die OAuth2-Client-Zugangsdaten in der Google-API-Konsole unter https://console.developers.google.com/ auths.tip.openid_connect=Benutze die OpenID Connect Discovery URL (/.well-known/openid-configuration) als Endpunkt. -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.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.edit=Authentifikationsquelle bearbeiten auths.activated=Diese Authentifikationsquelle ist aktiviert -auths.new_success=Die Authentifizierung "%s" wurde hinzugefügt. +auths.new_success=Die Authentifizierung „%s“ wurde hinzugefügt. auths.update_success=Diese Authentifizierungsquelle wurde aktualisiert. auths.update=Authentifizierungsquelle aktualisieren auths.delete=Authentifikationsquelle löschen auths.delete_auth_title=Authentifizierungsquelle löschen auths.delete_auth_desc=Das Löschen einer Authentifizierungsquelle verhindert, dass Benutzer sich darüber anmelden können. Fortfahren? auths.still_in_used=Diese Authentifizierungsquelle wird noch verwendet. Bearbeite oder lösche zuerst alle Benutzer, die diese Authentifizierungsquelle benutzen. -auths.deletion_success=Die Authentifizierungsquelle '%s' wurde gelöscht. -auths.login_source_exist=Die Authentifizierungsquelle '%s' existiert bereits. +auths.deletion_success=Die Authentifizierungsquelle „%s“ wurde gelöscht. +auths.login_source_exist=Die Authentifizierungsquelle „%s“ existiert bereits. config.server_config=Serverkonfiguration config.app_name=Seitentitel -config.app_ver=Gitea Version -config.app_url=Gitea Basis-URL +config.app_ver=Gitea-Version +config.app_url=Gitea-Basis-URL config.custom_conf=Konfigurations-Datei-Pfad -config.domain=SSH Server-Domain +config.domain=SSH-Server-Domain config.offline_mode=Lokaler Modus config.disable_router_log=Router-Log deaktivieren config.run_user=Ausführen als config.run_mode=Laufzeit-Modus -config.git_version=Git Version -config.repo_root_path=Repository-Verzeichnis +config.git_version=Git-Version +config.repo_root_path=Repository-Wurzelpfad config.lfs_root_path=LFS-Wurzelpfad config.static_file_root_path=Verzeichnis für statische Dateien config.log_file_root_path=Logdateipfad config.script_type=Skript-Typ config.reverse_auth_user=Nutzer bei Reverse-Authentifizierung -config.ssh_config=SSH Konfiguration +config.ssh_config=SSH-Konfiguration config.ssh_enabled=Aktiviert config.ssh_start_builtin_server=Eingebauten Server verwenden config.ssh_domain=Server-Domain @@ -1465,9 +1465,9 @@ config.ssh_port=Port config.ssh_listen_port=Listen-Port config.ssh_root_path=Wurzelverzeichnis config.ssh_key_test_path=Schlüssel-Test-Pfad -config.ssh_keygen_path=Keygen ('ssh-keygen') Pfad +config.ssh_keygen_path=Keygen-Pfad („ssh-keygen“) config.ssh_minimum_key_size_check=Prüfung der Mindestschlüssellänge -config.ssh_minimum_key_sizes=Minimale Schlüssellängen +config.ssh_minimum_key_sizes=Mindestschlüssellängen config.db_config=Datenbankkonfiguration config.db_type=Typ @@ -1481,17 +1481,17 @@ config.service_config=Service-Konfiguration config.register_email_confirm=E-Mail-Bestätigung benötigt zum Registrieren config.disable_register=Selbstegistrierung deaktivieren config.allow_only_external_registration=Registrierung nur über externe Services aktiveren -config.enable_openid_signup=OpenID Selbstregistrierung aktivieren -config.enable_openid_signin=OpenID Anmeldung aktivieren +config.enable_openid_signup=OpenID-Selbstregistrierung aktivieren +config.enable_openid_signin=OpenID-Anmeldung aktivieren config.show_registration_button=Schaltfläche zum Registrieren anzeigen config.require_sign_in_view=Seiten nur für angemeldete Benutzer zugänglich config.mail_notify=E-Mail-Benachrichtigungen aktivieren config.disable_key_size_check=Prüfung der Mindestschlüssellänge deaktiveren config.enable_captcha=CAPTCHA aktivieren -config.active_code_lives=Aktivierungscode Lebensdauer +config.active_code_lives=Aktivierungscode-Lebensdauer config.reset_password_code_lives=Ablaufdatum des Passworts zurücksetzen config.default_keep_email_private=E-Mail-Adressen standardmäßig verbergen -config.default_allow_create_organization=Erstellen von Organisationen standarmäßig erlauben +config.default_allow_create_organization=Erstellen von Organisationen standardmäßig erlauben config.enable_timetracking=Zeiterfassung aktivieren config.default_enable_timetracking=Zeiterfassung standardmäßig aktivieren config.default_allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen @@ -1500,11 +1500,11 @@ config.no_reply_address=Versteckte E-Mail-Domain config.webhook_config=Webhook-Konfiguration config.queue_length=Warteschlangenlänge config.deliver_timeout=Zeitlimit für Zustellung -config.skip_tls_verify=TLS Verifikation überspringen +config.skip_tls_verify=TLS-Verifikation überspringen -config.mailer_config=SMTP Mailer Konfiguration +config.mailer_config=SMTP-Mailer-Konfiguration config.mailer_enabled=Aktiviert -config.mailer_disable_helo=HELO Deaktivieren +config.mailer_disable_helo=HELO deaktivieren config.mailer_name=Name config.mailer_host=Host config.mailer_user=Benutzer @@ -1512,8 +1512,8 @@ config.mailer_use_sendmail=Sendmail benutzen config.mailer_sendmail_path=Sendmail-Pfad config.mailer_sendmail_args=Zusätzliche Argumente für Sendmail config.send_test_mail=Test-E-Mail senden -config.test_mail_failed=Das Senden der Test-E-Mail an '%s' ist fehlgeschlagen: %v -config.test_mail_sent=Eine Test-E-Mail wurde an '%s' gesendet. +config.test_mail_failed=Das Senden der Test-E-Mail an „%s“ ist fehlgeschlagen: %v +config.test_mail_sent=Eine Test-E-Mail wurde an „%s“ gesendet. config.oauth_config=OAuth-Konfiguration config.oauth_enabled=Aktiviert @@ -1533,16 +1533,16 @@ config.session_life_time=Session-Lebensdauer config.https_only=Nur HTTPS config.cookie_life_time=Cookie-Lebensdauer -config.picture_config=Avatar-Konfiguration +config.picture_config=Bild-und-Profilbild-Konfiguration config.picture_service=Bilderservice config.disable_gravatar=Gravatar deaktivieren config.enable_federated_avatar=Föderierte Profilbilder einschalten -config.git_config=Git Konfiguration -config.git_disable_diff_highlight=Diff Syntaxhervorhebung ausschalten -config.git_max_diff_lines=Max Diff Zeilen (in einer Datei) -config.git_max_diff_line_characters=Max Diff Zeichen (in einer Zeile) -config.git_max_diff_files=Max Diff Dateien (Anzeige) +config.git_config=Git-Konfiguration +config.git_disable_diff_highlight=Diff-Syntaxhervorhebung ausschalten +config.git_max_diff_lines=Max. Diff-Zeilen (in einer Datei) +config.git_max_diff_line_characters=Max. Diff-Zeichen (in einer Zeile) +config.git_max_diff_files=Max. Diff-Dateien (Angezeigte) config.git_gc_args=GC-Argumente config.git_migrate_timeout=Zeitlimit für Migration config.git_mirror_timeout=Zeitlimit für Mirror-Aktualisierung @@ -1638,12 +1638,12 @@ mark_all_as_read=Alle als gelesen markieren [gpg] error.extract_sign=Die Signatur konnte nicht extrahiert werden error.generate_hash=Es konnte kein Hash vom Commit generiert werden -error.no_committer_account=Es ist kein Benutzerkonto mit dieser Commiter-Email verbunden +error.no_committer_account=Es ist kein Benutzerkonto mit der E-Mail-Adresse des Committers verbunden error.no_gpg_keys_found=Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden error.not_signed_commit=Kein signierter Commit error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Kontos [units] -error.no_unit_allowed_repo=Du hast keine Berechtigung auf einen Bereich dieses Repositories zuzugreifen. -error.unit_not_allowed=Du hast keine Berechtigung auf diesen Repository-Bereich zuzugreifen. +error.no_unit_allowed_repo=Du hast keine Berechtigung, um auf irgendeinen Bereich dieses Repositories zuzugreifen. +error.unit_not_allowed=Du hast keine Berechtigung, um auf diesen Repository-Bereich zuzugreifen. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index f49b98280..b3e8a2fe0 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -280,12 +280,12 @@ target_branch_not_exist=Цільової гілки не існує. [user] change_avatar=Змінити свій аватар… -join_on=Приєднався +join_on=Приєднався(-лась) repositories=Репозиторії activity=Публічна активність -followers=Підписники +followers=Читачі starred=Обрані Репозиторії -following=Слідкувати +following=Читає follow=Підписатися unfollow=Відписатися @@ -439,6 +439,7 @@ license=Ліцензія license_helper=Виберіть ліцензійний файл. readme=README readme_helper=Виберіть шаблон README. +auto_init=Ініціалізувати репозиторій (Додає .gitignore, LICENSE та README) create_repo=Створити репозиторій default_branch=Головна гілка mirror_prune=Очистити @@ -603,6 +604,8 @@ issues.filter_sort.recentupdate=Нещодавно оновлено issues.filter_sort.leastupdate=Найдавніше оновлені issues.filter_sort.mostcomment=Найбільш коментовані issues.filter_sort.leastcomment=Найменш коментовані +issues.filter_sort.moststars=Найбільш обраних +issues.filter_sort.feweststars=Найменш обраних issues.filter_sort.mostforks=Найбільше форків issues.action_open=Відкрити issues.action_close=Закрити @@ -1232,6 +1235,7 @@ config.default_keep_email_private=Приховати адресу електро config.default_allow_create_organization=Дозволити створення організацій за замовчуванням config.enable_timetracking=Увімкнути відстеження часу config.default_enable_timetracking=Увімкнути відстеження часу за замовчуванням +config.no_reply_address=Прихований домен е-пошти config.webhook_config=Конфігурація web-хуків config.queue_length=Довжина черги From 69bfd81b1cc4b95d6bc49e7b027d2e5ff03167a5 Mon Sep 17 00:00:00 2001 From: David Schneiderbauer Date: Mon, 18 Jun 2018 20:24:45 +0200 Subject: [PATCH 36/86] fix missing data on redirects (#3975) --- routers/user/setting/account.go | 32 ++++++++------- routers/user/setting/applications.go | 24 +++++------ routers/user/setting/keys.go | 54 ++++++++++++------------- routers/user/setting/profile.go | 1 + routers/user/setting/security.go | 44 +++++++++++--------- routers/user/setting/security_openid.go | 21 ++++------ 6 files changed, 90 insertions(+), 86 deletions(-) diff --git a/routers/user/setting/account.go b/routers/user/setting/account.go index 966d96aed..bcf602c5e 100644 --- a/routers/user/setting/account.go +++ b/routers/user/setting/account.go @@ -24,12 +24,7 @@ func Account(ctx *context.Context) { ctx.Data["PageIsSettingsAccount"] = true ctx.Data["Email"] = ctx.User.Email - emails, err := models.GetEmailAddresses(ctx.User.ID) - if err != nil { - ctx.ServerError("GetEmailAddresses", err) - return - } - ctx.Data["Emails"] = emails + loadAccountData(ctx) ctx.HTML(200, tplSettingsAccount) } @@ -40,6 +35,8 @@ func AccountPost(ctx *context.Context, form auth.ChangePasswordForm) { ctx.Data["PageIsSettingsAccount"] = true if ctx.HasError() { + loadAccountData(ctx) + ctx.HTML(200, tplSettingsAccount) return } @@ -85,15 +82,9 @@ func EmailPost(ctx *context.Context, form auth.AddEmailForm) { return } - // Add Email address. - emails, err := models.GetEmailAddresses(ctx.User.ID) - if err != nil { - ctx.ServerError("GetEmailAddresses", err) - return - } - ctx.Data["Emails"] = emails - if ctx.HasError() { + loadAccountData(ctx) + ctx.HTML(200, tplSettingsAccount) return } @@ -105,6 +96,8 @@ func EmailPost(ctx *context.Context, form auth.AddEmailForm) { } if err := models.AddEmailAddress(email); err != nil { if models.IsErrEmailAlreadyUsed(err) { + loadAccountData(ctx) + ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplSettingsAccount, &form) return } @@ -149,6 +142,8 @@ func DeleteAccount(ctx *context.Context) { if _, err := models.UserSignIn(ctx.User.Name, ctx.Query("password")); err != nil { if models.IsErrUserNotExist(err) { + loadAccountData(ctx) + ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_password"), tplSettingsAccount, nil) } else { ctx.ServerError("UserSignIn", err) @@ -172,3 +167,12 @@ func DeleteAccount(ctx *context.Context) { ctx.Redirect(setting.AppSubURL + "/") } } + +func loadAccountData(ctx *context.Context) { + emails, err := models.GetEmailAddresses(ctx.User.ID) + if err != nil { + ctx.ServerError("GetEmailAddresses", err) + return + } + ctx.Data["Emails"] = emails +} diff --git a/routers/user/setting/applications.go b/routers/user/setting/applications.go index f292b65d7..ac7252469 100644 --- a/routers/user/setting/applications.go +++ b/routers/user/setting/applications.go @@ -22,12 +22,7 @@ func Applications(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsApplications"] = true - tokens, err := models.ListAccessTokens(ctx.User.ID) - if err != nil { - ctx.ServerError("ListAccessTokens", err) - return - } - ctx.Data["Tokens"] = tokens + loadApplicationsData(ctx) ctx.HTML(200, tplSettingsApplications) } @@ -38,12 +33,8 @@ func ApplicationsPost(ctx *context.Context, form auth.NewAccessTokenForm) { ctx.Data["PageIsSettingsApplications"] = true if ctx.HasError() { - tokens, err := models.ListAccessTokens(ctx.User.ID) - if err != nil { - ctx.ServerError("ListAccessTokens", err) - return - } - ctx.Data["Tokens"] = tokens + loadApplicationsData(ctx) + ctx.HTML(200, tplSettingsApplications) return } @@ -75,3 +66,12 @@ func DeleteApplication(ctx *context.Context) { "redirect": setting.AppSubURL + "/user/settings/applications", }) } + +func loadApplicationsData(ctx *context.Context) { + tokens, err := models.ListAccessTokens(ctx.User.ID) + if err != nil { + ctx.ServerError("ListAccessTokens", err) + return + } + ctx.Data["Tokens"] = tokens +} diff --git a/routers/user/setting/keys.go b/routers/user/setting/keys.go index ef986ef8c..c62b117a7 100644 --- a/routers/user/setting/keys.go +++ b/routers/user/setting/keys.go @@ -23,19 +23,7 @@ func Keys(ctx *context.Context) { ctx.Data["PageIsSettingsKeys"] = true ctx.Data["DisableSSH"] = setting.SSH.Disabled - keys, err := models.ListPublicKeys(ctx.User.ID) - if err != nil { - ctx.ServerError("ListPublicKeys", err) - return - } - ctx.Data["Keys"] = keys - - gpgkeys, err := models.ListGPGKeys(ctx.User.ID) - if err != nil { - ctx.ServerError("ListGPGKeys", err) - return - } - ctx.Data["GPGKeys"] = gpgkeys + loadKeysData(ctx) ctx.HTML(200, tplSettingsKeys) } @@ -45,21 +33,9 @@ func KeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsKeys"] = true - keys, err := models.ListPublicKeys(ctx.User.ID) - if err != nil { - ctx.ServerError("ListPublicKeys", err) - return - } - ctx.Data["Keys"] = keys - - gpgkeys, err := models.ListGPGKeys(ctx.User.ID) - if err != nil { - ctx.ServerError("ListGPGKeys", err) - return - } - ctx.Data["GPGKeys"] = gpgkeys - if ctx.HasError() { + loadKeysData(ctx) + ctx.HTML(200, tplSettingsKeys) return } @@ -73,9 +49,13 @@ func KeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Flash.Error(ctx.Tr("form.invalid_gpg_key", err.Error())) ctx.Redirect(setting.AppSubURL + "/user/settings/keys") case models.IsErrGPGKeyIDAlreadyUsed(err): + loadKeysData(ctx) + ctx.Data["Err_Content"] = true ctx.RenderWithErr(ctx.Tr("settings.gpg_key_id_used"), tplSettingsKeys, &form) case models.IsErrGPGNoEmailFound(err): + loadKeysData(ctx) + ctx.Data["Err_Content"] = true ctx.RenderWithErr(ctx.Tr("settings.gpg_no_key_email_found"), tplSettingsKeys, &form) default: @@ -103,9 +83,13 @@ func KeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Data["HasSSHError"] = true switch { case models.IsErrKeyAlreadyExist(err): + loadKeysData(ctx) + ctx.Data["Err_Content"] = true ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplSettingsKeys, &form) case models.IsErrKeyNameAlreadyUsed(err): + loadKeysData(ctx) + ctx.Data["Err_Title"] = true ctx.RenderWithErr(ctx.Tr("settings.ssh_key_name_used"), tplSettingsKeys, &form) default: @@ -147,3 +131,19 @@ func DeleteKey(ctx *context.Context) { "redirect": setting.AppSubURL + "/user/settings/keys", }) } + +func loadKeysData(ctx *context.Context) { + keys, err := models.ListPublicKeys(ctx.User.ID) + if err != nil { + ctx.ServerError("ListPublicKeys", err) + return + } + ctx.Data["Keys"] = keys + + gpgkeys, err := models.ListGPGKeys(ctx.User.ID) + if err != nil { + ctx.ServerError("ListGPGKeys", err) + return + } + ctx.Data["GPGKeys"] = gpgkeys +} diff --git a/routers/user/setting/profile.go b/routers/user/setting/profile.go index cf222d002..22511ab89 100644 --- a/routers/user/setting/profile.go +++ b/routers/user/setting/profile.go @@ -32,6 +32,7 @@ const ( func Profile(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsProfile"] = true + ctx.HTML(200, tplSettingsProfile) } diff --git a/routers/user/setting/security.go b/routers/user/setting/security.go index 860730303..862e4413c 100644 --- a/routers/user/setting/security.go +++ b/routers/user/setting/security.go @@ -22,6 +22,30 @@ func Security(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsSecurity"] = true + if ctx.Query("openid.return_to") != "" { + settingsOpenIDVerify(ctx) + return + } + + loadSecurityData(ctx) + + ctx.HTML(200, tplSettingsSecurity) +} + +// DeleteAccountLink delete a single account link +func DeleteAccountLink(ctx *context.Context) { + if _, err := models.RemoveAccountLink(ctx.User, ctx.QueryInt64("loginSourceID")); err != nil { + ctx.Flash.Error("RemoveAccountLink: " + err.Error()) + } else { + ctx.Flash.Success(ctx.Tr("settings.remove_account_link_success")) + } + + ctx.JSON(200, map[string]interface{}{ + "redirect": setting.AppSubURL + "/user/settings/security", + }) +} + +func loadSecurityData(ctx *context.Context) { enrolled := true _, err := models.GetTwoFactorByUID(ctx.User.ID) if err != nil { @@ -71,30 +95,10 @@ func Security(ctx *context.Context) { } ctx.Data["AccountLinks"] = sources - if ctx.Query("openid.return_to") != "" { - settingsOpenIDVerify(ctx) - return - } - openid, err := models.GetUserOpenIDs(ctx.User.ID) if err != nil { ctx.ServerError("GetUserOpenIDs", err) return } ctx.Data["OpenIDs"] = openid - - ctx.HTML(200, tplSettingsSecurity) -} - -// DeleteAccountLink delete a single account link -func DeleteAccountLink(ctx *context.Context) { - if _, err := models.RemoveAccountLink(ctx.User, ctx.QueryInt64("loginSourceID")); err != nil { - ctx.Flash.Error("RemoveAccountLink: " + err.Error()) - } else { - ctx.Flash.Success(ctx.Tr("settings.remove_account_link_success")) - } - - ctx.JSON(200, map[string]interface{}{ - "redirect": setting.AppSubURL + "/user/settings/security", - }) } diff --git a/routers/user/setting/security_openid.go b/routers/user/setting/security_openid.go index c98dc2cda..6813765f6 100644 --- a/routers/user/setting/security_openid.go +++ b/routers/user/setting/security_openid.go @@ -19,12 +19,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) { ctx.Data["PageIsSettingsSecurity"] = true if ctx.HasError() { - openid, err := models.GetUserOpenIDs(ctx.User.ID) - if err != nil { - ctx.ServerError("GetUserOpenIDs", err) - return - } - ctx.Data["OpenIDs"] = openid + loadSecurityData(ctx) + ctx.HTML(200, tplSettingsSecurity) return } @@ -37,6 +33,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) { id, err := openid.Normalize(form.Openid) if err != nil { + loadSecurityData(ctx) + ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &form) return } @@ -53,6 +51,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) { // Check that the OpenID is not already used for _, obj := range oids { if obj.URI == id { + loadSecurityData(ctx) + ctx.RenderWithErr(ctx.Tr("form.openid_been_used", id), tplSettingsSecurity, &form) return } @@ -61,6 +61,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) { redirectTo := setting.AppURL + "user/settings/security" url, err := openid.RedirectURL(id, redirectTo, setting.AppURL) if err != nil { + loadSecurityData(ctx) + ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &form) return } @@ -73,13 +75,6 @@ func settingsOpenIDVerify(ctx *context.Context) { fullURL := setting.AppURL + ctx.Req.Request.URL.String()[1:] log.Trace("Full URL: " + fullURL) - oids, err := models.GetUserOpenIDs(ctx.User.ID) - if err != nil { - ctx.ServerError("GetUserOpenIDs", err) - return - } - ctx.Data["OpenIDs"] = oids - id, err := openid.Verify(fullURL) if err != nil { ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &auth.AddOpenIDForm{ From 8c6b2324a71bd1335d80fac6db6921b0aa6a3009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20M?= Date: Tue, 19 Jun 2018 10:48:50 +0200 Subject: [PATCH 37/86] Fix missing close tags in U2F (#4256) --- custom/conf/app.ini.sample | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index ef88e5c32..f823f68e4 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -601,9 +601,9 @@ ko-KR = ko [U2F] ; Two Factor authentication with security keys ; https://developers.yubico.com/U2F/App_ID.html -APP_ID = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s +APP_ID = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ ; Comma seperated list of truisted facets -TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s +TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ ; Extension mapping to highlight class ; e.g. .toml=ini From 3f2f5752cb7829c8f49bdb0f03704230493347ac Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 19 Jun 2018 08:51:02 +0000 Subject: [PATCH 38/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 20 ++++++++++++++------ options/locale/locale_zh-CN.ini | 1 + 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index b3e8a2fe0..8f90f3a3f 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -204,7 +204,7 @@ non_local_account=Нелокальні акаунти не можуть змін verify=Підтвердити scratch_code=Одноразовий пароль use_scratch_code=Використовувати одноразовий пароль -twofa_scratch_used=Ви використовували одноразовий пароль. Ви були перенаправлені на сторінку налаштувань для генерації нового коду або відключення двуфакторной аутентифікації. +twofa_scratch_used=Ви використовували одноразовий пароль. Ви були перенаправлені на сторінку налаштувань для генерації нового коду або відключення двуфакторної автентифікації. twofa_passcode_incorrect=Ваш пароль є невірним. Якщо ви втратили пристрій, використовуйте ваш одноразовий пароль. twofa_scratch_token_incorrect=Невірний одноразовий пароль. login_userpass=Увійти @@ -399,20 +399,25 @@ generate_token=Згенерувати токен delete_token=Видалити access_token_deletion=Видалити токен доступу -twofa_desc=Двофакторна аутентифікація підвищує безпеку вашого облікового запису. +twofa_desc=Двофакторна автентифікація підвищує безпеку вашого облікового запису. twofa_is_enrolled=Ваш обліковий запис на даний час використовує двофакторну автентифікацію. twofa_disable=Вимкнути двофакторну автентифікацію +twofa_scratch_token_regenerate=Перестворити токен одноразового пароля twofa_enroll=Увімкнути двофакторну автентифікацію +twofa_disable_note=При необхідності можна відключити двофакторну автентифікацію. +regenerate_scratch_token_desc=Якщо ви втратили свій токен одноразового пароля або вже використовували його для входу, ви можете скинути його тут. twofa_disabled=Двофакторна автентифікація вимкнена. -scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної аутентифікації: +scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної автентифікації: or_enter_secret=Або введіть секрет: %s passcode_invalid=Некоректний пароль. Спробуй ще раз. +u2f_desc=Ключами безпеки є апаратні пристрої, що містять криптографічні ключі. Вони можуть використовуватися для двофакторної автентифікації. Ключ безпеки повинен підтримувати стандарт FIDO U2F. u2f_register_key=Додати ключ безпеки u2f_nickname=Псевдонім u2f_delete_key=Видалити ключ безпеки manage_account_links=Керування обліковими записами +manage_account_links_desc=Ці зовнішні акаунти прив'язані до вашого аккаунту Gitea. remove_account_link=Видалити облікові записи orgs_none=Ви не є учасником будь-якої організації. @@ -428,6 +433,7 @@ owner=Власник repo_name=Назва репозиторію visibility=Видимість visiblity_helper=Зробити репозиторій приватним +visiblity_fork_helper=(Зміна цього вплине на всі форки.) clone_helper=Потрібна допомога у клонуванні? Відвідайте Допомогу. fork_repo=Форкнути репозиторій fork_from=Форк з @@ -607,6 +613,7 @@ issues.filter_sort.leastcomment=Найменш коментовані issues.filter_sort.moststars=Найбільш обраних issues.filter_sort.feweststars=Найменш обраних issues.filter_sort.mostforks=Найбільше форків +issues.filter_sort.fewestforks=Найменше форків issues.action_open=Відкрити issues.action_close=Закрити issues.action_label=Мітка @@ -971,6 +978,7 @@ topic.done=Готово [org] org_name_holder=Назва організації org_full_name_holder=Повна назва організації +org_name_helper=Назва організації має бути простою та зрозумілою. create_org=Створити організацію repo_updated=Оновлено people=Учасники @@ -1133,7 +1141,7 @@ repos.forks=Форки repos.issues=Проблеми repos.size=Розмір -auths.auth_manage_panel=Керування джерелом аутентифікації +auths.auth_manage_panel=Керування джерелом автентифікації auths.new=Додати джерело автентифікації auths.name=Ім'я auths.type=Тип @@ -1170,8 +1178,8 @@ auths.oauth2_profileURL=URL профілю auths.oauth2_emailURL=URL електронної пошти auths.enable_auto_register=Увімкнути автоматичну реєстрацію auths.tips=Поради -auths.tips.oauth2.general=OAuth2 аутентифікація -auths.tips.oauth2.general.tip=При додаванні нового OAuth2 провайдера, URL адреса переадресації по завершенні аутентифікації повинена виглядати так:/user/oauth2//callback +auths.tips.oauth2.general=OAuth2 автентифікація +auths.tips.oauth2.general.tip=При додаванні нового OAuth2 провайдера, URL адреса переадресації по завершенні автентифікації повинена виглядати так:/user/oauth2//callback auths.tip.oauth2_provider=Постачальник OAuth2 auths.tip.dropbox=Додайте новий додаток на https://www.dropbox.com/developers/apps auths.tip.facebook=Створіть новий додаток на https://developers.facebook.com/apps і додайте модуль "Facebook Login diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 658f133a2..4e59ed08e 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -213,6 +213,7 @@ send_reset_mail=单击此处(重新)发送您的密码重置邮件 reset_password=重置密码 invalid_code=此确认密钥无效或已过期。 reset_password_helper=单击此处重置密码 +password_too_short=密码长度不能少于 %d 位。 non_local_account=非本地帐户不能通过 Gitea 的 web 界面更改密码。 verify=验证 scratch_code=验证口令 From 467ff4d34302f6ecab959d61bf3944a2bdf125d0 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Tue, 19 Jun 2018 17:15:11 +0200 Subject: [PATCH 39/86] Fix milestone appliance and permission checks (#4271) * Fix milestone appliance Fix missing permission check Signed-off-by: Jonas Franz * Fix comment * Add Gitea copyright line --- routers/api/v1/repo/issue.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index 211d8045a..7be39166d 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -1,4 +1,5 @@ // Copyright 2016 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -165,7 +166,7 @@ func CreateIssue(ctx *context.APIContext, form api.CreateIssueOption) { // "$ref": "#/responses/Issue" var deadlineUnix util.TimeStamp - if form.Deadline != nil { + if form.Deadline != nil && ctx.Repo.IsWriter() { deadlineUnix = util.TimeStamp(form.Deadline.Unix()) } @@ -178,15 +179,22 @@ func CreateIssue(ctx *context.APIContext, form api.CreateIssueOption) { DeadlineUnix: deadlineUnix, } - // Get all assignee IDs - assigneeIDs, err := models.MakeIDsFromAPIAssigneesToAdd(form.Assignee, form.Assignees) - if err != nil { - if models.IsErrUserNotExist(err) { - ctx.Error(422, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err)) - } else { - ctx.Error(500, "AddAssigneeByName", err) + var assigneeIDs = make([]int64, 0) + var err error + if ctx.Repo.IsWriter() { + issue.MilestoneID = form.Milestone + assigneeIDs, err = models.MakeIDsFromAPIAssigneesToAdd(form.Assignee, form.Assignees) + if err != nil { + if models.IsErrUserNotExist(err) { + ctx.Error(422, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err)) + } else { + ctx.Error(500, "AddAssigneeByName", err) + } + return } - return + } else { + // setting labels is not allowed if user is not a writer + form.Labels = make([]int64, 0) } if err := models.NewIssue(ctx.Repo.Repository, issue, form.Labels, assigneeIDs, nil); err != nil { From a93f13849cd7f54029f1dc17b642d024b98ee71e Mon Sep 17 00:00:00 2001 From: David Schneiderbauer Date: Tue, 19 Jun 2018 21:44:33 +0200 Subject: [PATCH 40/86] Fix not removed watches on unallowed repositories (#4201) --- models/issue_watch.go | 12 +++ models/migrations/migrations.go | 2 + models/migrations/v67.go | 158 ++++++++++++++++++++++++++++++++ models/org_team.go | 49 ++++++++++ models/repo.go | 3 + models/repo_collaboration.go | 9 ++ 6 files changed, 233 insertions(+) create mode 100644 models/migrations/v67.go diff --git a/models/issue_watch.go b/models/issue_watch.go index 69e218af0..3e7d24821 100644 --- a/models/issue_watch.go +++ b/models/issue_watch.go @@ -71,3 +71,15 @@ func getIssueWatchers(e Engine, issueID int64) (watches []*IssueWatch, err error Find(&watches) return } + +func removeIssueWatchersByRepoID(e Engine, userID int64, repoID int64) error { + iw := &IssueWatch{ + IsWatching: false, + } + _, err := e. + Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", repoID). + Cols("is_watching", "updated_unix"). + Where("`issue_watch`.user_id = ?", userID). + Update(iw) + return err +} diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 1300065ab..2537e5712 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -186,6 +186,8 @@ var migrations = []Migration{ NewMigration("add u2f", addU2FReg), // v66 -> v67 NewMigration("add login source id column for public_key table", addLoginSourceIDToPublicKeyTable), + // v67 -> v68 + NewMigration("remove stale watches", removeStaleWatches), } // Migrate database to current version diff --git a/models/migrations/v67.go b/models/migrations/v67.go new file mode 100644 index 000000000..278221919 --- /dev/null +++ b/models/migrations/v67.go @@ -0,0 +1,158 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "code.gitea.io/gitea/modules/setting" + + "github.com/go-xorm/xorm" +) + +func removeStaleWatches(x *xorm.Engine) error { + type Watch struct { + ID int64 + UserID int64 + RepoID int64 + } + + type IssueWatch struct { + ID int64 + UserID int64 + RepoID int64 + IsWatching bool + } + + type Repository struct { + ID int64 + IsPrivate bool + OwnerID int64 + } + + type Access struct { + UserID int64 + RepoID int64 + Mode int + } + + const ( + // AccessModeNone no access + AccessModeNone int = iota // 0 + // AccessModeRead read access + AccessModeRead // 1 + ) + + accessLevel := func(userID int64, repo *Repository) (int, error) { + mode := AccessModeNone + if !repo.IsPrivate { + mode = AccessModeRead + } + + if userID == 0 { + return mode, nil + } + + if userID == repo.OwnerID { + return 4, nil + } + + a := &Access{UserID: userID, RepoID: repo.ID} + if has, err := x.Get(a); !has || err != nil { + return mode, err + } + return a.Mode, nil + } + + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + + repoCache := make(map[int64]*Repository) + err := x.BufferSize(setting.IterateBufferSize).Iterate(new(Watch), + func(idx int, bean interface{}) error { + watch := bean.(*Watch) + + repo := repoCache[watch.RepoID] + if repo == nil { + repo = &Repository{ + ID: watch.RepoID, + } + if _, err := x.Get(repo); err != nil { + return err + } + repoCache[watch.RepoID] = repo + } + + // Remove watches from now unaccessible repositories + mode, err := accessLevel(watch.UserID, repo) + if err != nil { + return err + } + has := AccessModeRead <= mode + if has { + return nil + } + + if _, err = sess.Delete(&Watch{0, watch.UserID, repo.ID}); err != nil { + return err + } + _, err = sess.Exec("UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?", repo.ID) + + return err + }) + if err != nil { + return err + } + + repoCache = make(map[int64]*Repository) + err = x.BufferSize(setting.IterateBufferSize). + Distinct("issue_watch.user_id", "issue.repo_id"). + Join("INNER", "issue", "issue_watch.issue_id = issue.id"). + Where("issue_watch.is_watching = ?", true). + Iterate(new(IssueWatch), + func(idx int, bean interface{}) error { + watch := bean.(*IssueWatch) + + repo := repoCache[watch.RepoID] + if repo == nil { + repo = &Repository{ + ID: watch.RepoID, + } + if _, err := x.Get(repo); err != nil { + return err + } + repoCache[watch.RepoID] = repo + } + + // Remove issue watches from now unaccssible repositories + mode, err := accessLevel(watch.UserID, repo) + if err != nil { + return err + } + has := AccessModeRead <= mode + if has { + return nil + } + + iw := &IssueWatch{ + IsWatching: false, + } + + _, err = sess. + Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", watch.RepoID). + Cols("is_watching", "updated_unix"). + Where("`issue_watch`.user_id = ?", watch.UserID). + Update(iw) + + return err + + }) + if err != nil { + return err + } + + return sess.Commit() +} diff --git a/models/org_team.go b/models/org_team.go index 9d8a03141..5ea6e76cd 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -178,6 +178,11 @@ func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (e if err = watchRepo(e, teamUser.UID, repo.ID, false); err != nil { return err } + + // Remove all IssueWatches a user has subscribed to in the repositories + if err := removeIssueWatchersByRepoID(e, teamUser.UID, repo.ID); err != nil { + return err + } } return nil @@ -374,11 +379,34 @@ func DeleteTeam(t *Team) error { return err } + if err := t.getMembers(sess); err != nil { + return err + } + // Delete all accesses. for _, repo := range t.Repos { if err := repo.recalculateTeamAccesses(sess, t.ID); err != nil { return err } + + // Remove watches from all users and now unaccessible repos + for _, user := range t.Members { + has, err := hasAccess(sess, user.ID, repo, AccessModeRead) + if err != nil { + return err + } else if has { + continue + } + + if err = watchRepo(sess, user.ID, repo.ID, false); err != nil { + return err + } + + // Remove all IssueWatches a user has subscribed to in the repositories + if err = removeIssueWatchersByRepoID(sess, user.ID, repo.ID); err != nil { + return err + } + } } // Delete team-repo @@ -518,6 +546,10 @@ func AddTeamMember(team *Team, userID int64) error { if err := repo.recalculateTeamAccesses(sess, 0); err != nil { return err } + + if err = watchRepo(sess, userID, repo.ID, true); err != nil { + return err + } } return sess.Commit() @@ -558,6 +590,23 @@ func removeTeamMember(e *xorm.Session, team *Team, userID int64) error { if err := repo.recalculateTeamAccesses(e, 0); err != nil { return err } + + // Remove watches from now unaccessible + has, err := hasAccess(e, userID, repo, AccessModeRead) + if err != nil { + return err + } else if has { + continue + } + + if err = watchRepo(e, userID, repo.ID, false); err != nil { + return err + } + + // Remove all IssueWatches a user has subscribed to in the repositories + if err := removeIssueWatchersByRepoID(e, userID, repo.ID); err != nil { + return err + } } // Check if the user is a member of any team in the organization. diff --git a/models/repo.go b/models/repo.go index f4923cf4a..7f2be502a 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1851,6 +1851,9 @@ func DeleteRepository(doer *User, uid, repoID int64) error { if _, err = sess.In("issue_id", issueIDs).Delete(&Reaction{}); err != nil { return err } + if _, err = sess.In("issue_id", issueIDs).Delete(&IssueWatch{}); err != nil { + return err + } attachments := make([]*Attachment, 0, 5) if err = sess. diff --git a/models/repo_collaboration.go b/models/repo_collaboration.go index 0448149e6..9d2935d58 100644 --- a/models/repo_collaboration.go +++ b/models/repo_collaboration.go @@ -172,5 +172,14 @@ func (repo *Repository) DeleteCollaboration(uid int64) (err error) { return err } + if err = watchRepo(sess, uid, repo.ID, false); err != nil { + return err + } + + // Remove all IssueWatches a user has subscribed to in the repository + if err := removeIssueWatchersByRepoID(sess, uid, repo.ID); err != nil { + return err + } + return sess.Commit() } From d84da8fe6562d9e7d2b5bb3626631ecefdca854e Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Wed, 20 Jun 2018 01:06:01 -0400 Subject: [PATCH 41/86] Change parsing of postgresql settings (#4275) * Change parsing of postgresql settings Fix #4200 * Add copyright * update postgresql connection string * add tests --- models/models.go | 22 ++++++++++++++-------- models/models_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/models/models.go b/models/models.go index ddf784dee..5743f1862 100644 --- a/models/models.go +++ b/models/models.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -184,6 +185,18 @@ func parsePostgreSQLHostPort(info string) (string, string) { return host, port } +func getPostgreSQLConnectionString(DBHost, DBUser, DBPasswd, DBName, DBParam, DBSSLMode string) (connStr string) { + host, port := parsePostgreSQLHostPort(DBHost) + if host[0] == '/' { // looks like a unix socket + connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s", + url.PathEscape(DBUser), url.PathEscape(DBPasswd), port, DBName, DBParam, DBSSLMode, host) + } else { + connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s", + url.PathEscape(DBUser), url.PathEscape(DBPasswd), host, port, DBName, DBParam, DBSSLMode) + } + return +} + func parseMSSQLHostPort(info string) (string, string) { host, port := "127.0.0.1", "1433" if strings.Contains(info, ":") { @@ -214,14 +227,7 @@ func getEngine() (*xorm.Engine, error) { DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param) } case "postgres": - host, port := parsePostgreSQLHostPort(DbCfg.Host) - if host[0] == '/' { // looks like a unix socket - connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s", - url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), port, DbCfg.Name, Param, DbCfg.SSLMode, host) - } else { - connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s", - url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), host, port, DbCfg.Name, Param, DbCfg.SSLMode) - } + connStr = getPostgreSQLConnectionString(DbCfg.Host, DbCfg.User, DbCfg.Passwd, DbCfg.Name, Param, DbCfg.SSLMode) case "mssql": host, port := parseMSSQLHostPort(DbCfg.Host) connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, DbCfg.Name, DbCfg.User, DbCfg.Passwd) diff --git a/models/models_test.go b/models/models_test.go index 649b1e02e..7016fdb4b 100644 --- a/models/models_test.go +++ b/models/models_test.go @@ -1,4 +1,5 @@ // Copyright 2016 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -53,3 +54,42 @@ func Test_parsePostgreSQLHostPort(t *testing.T) { assert.Equal(t, test.Port, port) } } + +func Test_getPostgreSQLConnectionString(t *testing.T) { + tests := []struct { + Host string + Port string + User string + Passwd string + Name string + Param string + SSLMode string + Output string + }{ + { + Host: "/tmp/pg.sock", + Port: "4321", + User: "testuser", + Passwd: "space space !#$%^^%^```-=?=", + Name: "gitea", + Param: "", + SSLMode: "false", + Output: "postgres://testuser:space%20space%20%21%23$%25%5E%5E%25%5E%60%60%60-=%3F=@:5432/giteasslmode=false&host=/tmp/pg.sock", + }, + { + Host: "localhost", + Port: "1234", + User: "pgsqlusername", + Passwd: "I love Gitea!", + Name: "gitea", + Param: "", + SSLMode: "true", + Output: "postgres://pgsqlusername:I%20love%20Gitea%21@localhost:5432/giteasslmode=true", + }, + } + + for _, test := range tests { + connStr := getPostgreSQLConnectionString(test.Host, test.User, test.Passwd, test.Name, test.Param, test.SSLMode) + assert.Equal(t, test.Output, connStr) + } +} From cd29888906d4a0463ec2191113ca5b5399901291 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 18:03:22 +0200 Subject: [PATCH 42/86] Updated drone config to use the "next" git plugin (#4281) --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 6ab40a39d..8e571640b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,7 +4,7 @@ workspace: clone: git: - image: plugins/git:1 + image: plugins/git:next depth: 50 tags: true From ac110d1b739bdbbbac3d1156afcfa9817663e891 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 20 Jun 2018 16:04:23 +0000 Subject: [PATCH 43/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index d618d2c9a..4b1b85f92 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -588,7 +588,7 @@ editor.edit_file=Datei bearbeiten editor.preview_changes=Vorschau der Änderungen editor.cannot_edit_non_text_files=Binärdateien können nicht im Webinterface bearbeitet werden. editor.edit_this_file=Datei bearbeiten -editor.must_be_on_a_branch=Du musst dich in einer Branch befinden, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen. +editor.must_be_on_a_branch=Du musst dich in einem Branch befinden, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen. editor.fork_before_edit=Du musst dieses Repository forken, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen. editor.delete_this_file=Datei löschen editor.must_have_write_access=Du benötigst Schreibzugriff, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen. @@ -1085,16 +1085,16 @@ settings.protect_whitelist_search_users=Benutzer suchen… settings.protect_whitelist_teams=Teams, die pushen dürfen: settings.protect_whitelist_search_teams=Suche nach Teams… settings.protect_merge_whitelist_committers=Merge-Whitelist aktivieren -settings.protect_merge_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Pull-Requests in diese Branch zu mergen. +settings.protect_merge_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Pull-Requests in diesen Branch zu mergen. settings.protect_merge_whitelist_users=Nutzer, die mergen dürfen: settings.protect_merge_whitelist_teams=Teams, die mergen dürfen: settings.add_protected_branch=Schutz aktivieren settings.delete_protected_branch=Schutz deaktivieren settings.update_protect_branch_success=Branch-Schutz für den Branch „%s“ wurde geändert. settings.remove_protected_branch_success=Branch-Schutz für den Branch „%s“ wurde deaktiviert. -settings.protected_branch_deletion=Brach-Schutz deaktivieren +settings.protected_branch_deletion=Branch-Schutz deaktivieren settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren? -settings.default_branch_desc=Wähle eine Standardbranch für Pull-Requests und Code-Commits: +settings.default_branch_desc=Wähle einen Standardbranch für Pull-Requests und Code-Commits: settings.choose_branch=Wähle einen Branch … settings.no_protected_branch=Es gibt keine geschützten Branches. @@ -1238,7 +1238,7 @@ teams.update_settings=Einstellungen aktualisieren teams.delete_team=Team löschen teams.add_team_member=Teammitglied hinzufügen teams.delete_team_title=Team löschen -teams.delete_team_desc=Das Löschen eines Teams wiederruft den Repository-Zugriff für seine Mitglieder. Fortfahren? +teams.delete_team_desc=Das Löschen eines Teams widerruft den Repository-Zugriff für seine Mitglieder. Fortfahren? teams.delete_team_success=Das Team wurde gelöscht. teams.read_permission_desc=Dieses Team hat Lesezugriff: Mitglieder können Team-Repositories einsehen und klonen. teams.write_permission_desc=Dieses Team hat Schreibzugriff: Mitglieder können Team-Repositories einsehen und darauf pushen. From 9ae7664df7caa24825cc4cee4e4121e9f1d73e59 Mon Sep 17 00:00:00 2001 From: Russell Aunger Date: Thu, 21 Jun 2018 01:22:03 -0400 Subject: [PATCH 44/86] Fix webhook type conflation. (#4285) - Fix typo that caused Gogs hooks to be created as Gitea hooks. - Fix typo that caused Gogs hooks to be duplicated upon edit (though this bug was masked by the previous one). Signed-off-by: Russell Aunger --- routers/repo/webhook.go | 2 +- routers/routes/routes.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routers/repo/webhook.go b/routers/repo/webhook.go index 63450ed88..53c1afe66 100644 --- a/routers/repo/webhook.go +++ b/routers/repo/webhook.go @@ -210,7 +210,7 @@ func GogsHooksNewPost(ctx *context.Context, form auth.NewGogshookForm) { Secret: form.Secret, HookEvent: ParseHookEvent(form.WebhookForm), IsActive: form.Active, - HookTaskType: models.GITEA, + HookTaskType: models.GOGS, OrgID: orCtx.OrgID, } if err := w.UpdateEvent(); err != nil { diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 15b91f159..250b98507 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -486,7 +486,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/:id", repo.WebHooksEdit) m.Post("/:id/test", repo.TestWebhook) m.Post("/gitea/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) - m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksNewPost) + m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksEditPost) m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) m.Post("/discord/:id", bindIgnErr(auth.NewDiscordHookForm{}), repo.DiscordHooksEditPost) m.Post("/dingtalk/:id", bindIgnErr(auth.NewDingtalkHookForm{}), repo.DingtalkHooksEditPost) From 46d19c4676efe5201c5de790bcb963bfc93a95c7 Mon Sep 17 00:00:00 2001 From: Alexey Terentyev Date: Thu, 21 Jun 2018 12:09:46 +0300 Subject: [PATCH 45/86] Fix topics addition (Another solution) (#4031) (#4258) * Added topics validation, fixed repo topics duplication (#4031) Signed-off-by: Alexey Terentyev * Added tests Signed-off-by: Alexey Terentyev * Fixed fmt Signed-off-by: Alexey Terentyev * Added comments to exported functions Signed-off-by: Alexey Terentyev * Deleted RemoveDuplicateTopics function Signed-off-by: Alexey Terentyev * Fixed messages Signed-off-by: Alexey Terentyev * Added migration Signed-off-by: Alexey Terentyev * fmt migration file Signed-off-by: Alexey Terentyev * fixed lint Signed-off-by: Alexey Terentyev * Added Copyright Signed-off-by: Alexey Terentyev * Added query solution for duplicates Signed-off-by: Alexey Terentyev * Fixed migration query Signed-off-by: Alexey Terentyev * Changed RegExp. Fixed migration Signed-off-by: Alexey Terentyev * fmt migration file Signed-off-by: Alexey Terentyev * Fixed test for changed regexp Signed-off-by: Alexey Terentyev * Removed validation log messages Signed-off-by: Alexey Terentyev * Renamed migration file Signed-off-by: Alexey Terentyev * Renamed validate function Signed-off-by: Alexey Terentyev --- models/migrations/migrations.go | 2 + models/migrations/v68.go | 160 ++++++++++++++++++++++++++++++++ models/topic.go | 15 +++ models/topic_test.go | 13 +++ options/locale/locale_en-US.ini | 2 + public/js/index.js | 4 +- routers/repo/topic.go | 35 ++++++- routers/routes/routes.go | 2 +- 8 files changed, 229 insertions(+), 4 deletions(-) create mode 100644 models/migrations/v68.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 2537e5712..7732e1709 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -188,6 +188,8 @@ var migrations = []Migration{ NewMigration("add login source id column for public_key table", addLoginSourceIDToPublicKeyTable), // v67 -> v68 NewMigration("remove stale watches", removeStaleWatches), + // v68 -> V69 + NewMigration("Reformat and remove incorrect topics", reformatAndRemoveIncorrectTopics), } // Migrate database to current version diff --git a/models/migrations/v68.go b/models/migrations/v68.go new file mode 100644 index 000000000..d6a0d04c5 --- /dev/null +++ b/models/migrations/v68.go @@ -0,0 +1,160 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "strings" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + + "github.com/go-xorm/xorm" +) + +func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { + log.Info("This migration could take up to minutes, please be patient.") + type Topic struct { + ID int64 + Name string `xorm:"unique"` + } + + sess := x.NewSession() + defer sess.Close() + + const batchSize = 100 + touchedRepo := make(map[int64]struct{}) + topics := make([]*Topic, 0, batchSize) + delTopicIDs := make([]int64, 0, batchSize) + ids := make([]int64, 0, 30) + + if err := sess.Begin(); err != nil { + return err + } + log.Info("Validating existed topics...") + for start := 0; ; start += batchSize { + topics = topics[:0] + if err := sess.Asc("id").Limit(batchSize, start).Find(&topics); err != nil { + return err + } + if len(topics) == 0 { + break + } + for _, topic := range topics { + if models.ValidateTopic(topic.Name) { + continue + } + topic.Name = strings.Replace(strings.TrimSpace(strings.ToLower(topic.Name)), " ", "-", -1) + + if err := sess.Table("repo_topic").Cols("repo_id"). + Where("topic_id = ?", topic.ID).Find(&ids); err != nil { + return err + } + for _, id := range ids { + touchedRepo[id] = struct{}{} + } + + if models.ValidateTopic(topic.Name) { + log.Info("Updating topic: id = %v, name = %v", topic.ID, topic.Name) + if _, err := sess.Table("topic").ID(topic.ID). + Update(&Topic{Name: topic.Name}); err != nil { + return err + } + } else { + delTopicIDs = append(delTopicIDs, topic.ID) + } + } + } + + log.Info("Deleting incorrect topics...") + for start := 0; ; start += batchSize { + if (start + batchSize) < len(delTopicIDs) { + ids = delTopicIDs[start:(start + batchSize)] + } else { + ids = delTopicIDs[start:] + } + + log.Info("Deleting 'repo_topic' rows for topics with ids = %v", ids) + if _, err := sess.In("topic_id", ids).Delete(&models.RepoTopic{}); err != nil { + return err + } + + log.Info("Deleting topics with id = %v", ids) + if _, err := sess.In("id", ids).Delete(&Topic{}); err != nil { + return err + } + + if len(ids) < batchSize { + break + } + } + + repoTopics := make([]*models.RepoTopic, 0, batchSize) + delRepoTopics := make([]*models.RepoTopic, 0, batchSize) + tmpRepoTopics := make([]*models.RepoTopic, 0, 30) + + log.Info("Checking the number of topics in the repositories...") + for start := 0; ; start += batchSize { + repoTopics = repoTopics[:0] + if err := sess.Cols("repo_id").Asc("repo_id").Limit(batchSize, start). + GroupBy("repo_id").Having("COUNT(*) > 25").Find(&repoTopics); err != nil { + return err + } + if len(repoTopics) == 0 { + break + } + + log.Info("Number of repositories with more than 25 topics: %v", len(repoTopics)) + for _, repoTopic := range repoTopics { + touchedRepo[repoTopic.RepoID] = struct{}{} + + tmpRepoTopics = tmpRepoTopics[:0] + if err := sess.Where("repo_id = ?", repoTopic.RepoID).Find(&tmpRepoTopics); err != nil { + return err + } + + log.Info("Repository with id = %v has %v topics", repoTopic.RepoID, len(tmpRepoTopics)) + + for i := len(tmpRepoTopics) - 1; i > 24; i-- { + delRepoTopics = append(delRepoTopics, tmpRepoTopics[i]) + } + } + } + + log.Info("Deleting superfluous topics for repositories (more than 25 topics)...") + for _, repoTopic := range delRepoTopics { + log.Info("Deleting 'repo_topic' rows for 'repository' with id = %v. Topic id = %v", + repoTopic.RepoID, repoTopic.TopicID) + + if _, err := sess.Where("repo_id = ? AND topic_id = ?", repoTopic.RepoID, + repoTopic.TopicID).Delete(&models.RepoTopic{}); err != nil { + return err + } + if _, err := sess.Exec( + "UPDATE topic SET repo_count = (SELECT repo_count FROM topic WHERE id = ?) - 1 WHERE id = ?", + repoTopic.TopicID, repoTopic.TopicID); err != nil { + return err + } + } + + topicNames := make([]string, 0, 30) + log.Info("Updating repositories 'topics' fields...") + for repoID := range touchedRepo { + if err := sess.Table("topic").Cols("name"). + Join("INNER", "repo_topic", "topic.id = repo_topic.topic_id"). + Where("repo_topic.repo_id = ?", repoID).Find(&topicNames); err != nil { + return err + } + log.Info("Updating 'topics' field for repository with id = %v", repoID) + if _, err := sess.ID(repoID).Cols("topics"). + Update(&models.Repository{Topics: topicNames}); err != nil { + return err + } + } + if err := sess.Commit(); err != nil { + return err + } + + return nil +} diff --git a/models/topic.go b/models/topic.go index 3b1737f8a..247aac5ff 100644 --- a/models/topic.go +++ b/models/topic.go @@ -6,6 +6,7 @@ package models import ( "fmt" + "regexp" "strings" "code.gitea.io/gitea/modules/util" @@ -20,6 +21,8 @@ func init() { ) } +var topicPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9-]*$`) + // Topic represents a topic of repositories type Topic struct { ID int64 @@ -51,6 +54,11 @@ func (err ErrTopicNotExist) Error() string { return fmt.Sprintf("topic is not exist [name: %s]", err.Name) } +// ValidateTopic checks topics by length and match pattern rules +func ValidateTopic(topic string) bool { + return len(topic) <= 35 && topicPattern.MatchString(topic) +} + // GetTopicByName retrieves topic by name func GetTopicByName(name string) (*Topic, error) { var topic Topic @@ -182,6 +190,13 @@ func SaveTopics(repoID int64, topicNames ...string) error { } } + topicNames = topicNames[:0] + if err := sess.Table("topic").Cols("name"). + Join("INNER", "repo_topic", "topic.id = repo_topic.topic_id"). + Where("repo_topic.repo_id = ?", repoID).Find(&topicNames); err != nil { + return err + } + if _, err := sess.ID(repoID).Cols("topics").Update(&Repository{ Topics: topicNames, }); err != nil { diff --git a/models/topic_test.go b/models/topic_test.go index 472f4e52d..ef374e557 100644 --- a/models/topic_test.go +++ b/models/topic_test.go @@ -55,3 +55,16 @@ func TestAddTopic(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 2, len(topics)) } + +func TestTopicValidator(t *testing.T) { + assert.True(t, ValidateTopic("12345")) + assert.True(t, ValidateTopic("2-test")) + assert.True(t, ValidateTopic("test-3")) + assert.True(t, ValidateTopic("first")) + assert.True(t, ValidateTopic("second-test-topic")) + assert.True(t, ValidateTopic("third-project-topic-with-max-length")) + + assert.False(t, ValidateTopic("$fourth-test,topic")) + assert.False(t, ValidateTopic("-fifth-test-topic")) + assert.False(t, ValidateTopic("sixth-go-project-topic-with-excess-length")) +} diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 8cf6111c6..21ae775e4 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed = Branch '%s' is protected. It cannot be delete topic.manage_topics = Manage Topics topic.done = Done +topic.count_prompt = You can't select more than 25 topics +topic.format_prompt = Topics must start with a letter or number, can include hyphens(-) and must be no more than 35 characters long [org] org_name_holder = Organization Name diff --git a/public/js/index.js b/public/js/index.js index e98a3fe6d..823dd8766 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -2336,8 +2336,10 @@ function initTopicbar() { }).done(function() { editDiv.hide(); viewDiv.show(); + }).fail(function(xhr) { + alert(xhr.responseJSON.message) }) - }) + }); $('#topic_edit .dropdown').dropdown({ allowAdditions: true, diff --git a/routers/repo/topic.go b/routers/repo/topic.go index 2a43d53ff..63fcf793f 100644 --- a/routers/repo/topic.go +++ b/routers/repo/topic.go @@ -12,8 +12,8 @@ import ( "code.gitea.io/gitea/modules/log" ) -// TopicPost response for creating repository -func TopicPost(ctx *context.Context) { +// TopicsPost response for creating repository +func TopicsPost(ctx *context.Context) { if ctx.User == nil { ctx.JSON(403, map[string]interface{}{ "message": "Only owners could change the topics.", @@ -27,6 +27,37 @@ func TopicPost(ctx *context.Context) { topics = strings.Split(topicsStr, ",") } + invalidTopics := make([]string, 0) + i := 0 + for _, topic := range topics { + topic = strings.TrimSpace(strings.ToLower(topic)) + // ignore empty string + if len(topic) > 0 { + topics[i] = topic + i++ + } + if !models.ValidateTopic(topic) { + invalidTopics = append(invalidTopics, topic) + } + } + topics = topics[:i] + + if len(topics) > 25 { + ctx.JSON(422, map[string]interface{}{ + "invalidTopics": topics[:0], + "message": ctx.Tr("repo.topic.count_prompt"), + }) + return + } + + if len(invalidTopics) > 0 { + ctx.JSON(422, map[string]interface{}{ + "invalidTopics": invalidTopics, + "message": ctx.Tr("repo.topic.format_prompt"), + }) + return + } + err := models.SaveTopics(ctx.Repo.Repository.ID, topics...) if err != nil { log.Error(2, "SaveTopics failed: %v", err) diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 250b98507..1eefbf1b6 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -626,7 +626,7 @@ func RegisterRoutes(m *macaron.Macaron) { }, context.RepoAssignment(), context.UnitTypes(), context.LoadRepoUnits(), context.CheckUnit(models.UnitTypeReleases)) m.Group("/:username/:reponame", func() { - m.Post("/topics", repo.TopicPost) + m.Post("/topics", repo.TopicsPost) }, context.RepoAssignment(), reqRepoAdmin) m.Group("/:username/:reponame", func() { From 0b3ea428477b9da33f40252e79aafe85b09526f3 Mon Sep 17 00:00:00 2001 From: David Schneiderbauer Date: Thu, 21 Jun 2018 18:00:13 +0200 Subject: [PATCH 46/86] hide issues from org private repos w/o team assignment (#4034) --- integrations/api_repo_test.go | 6 +- models/access_test.go | 16 ++- models/fixtures/repository.yml | 15 ++- models/fixtures/team.yml | 8 +- models/fixtures/team_repo.yml | 10 +- models/fixtures/team_unit.yml | 209 ++++++++++++++++++++++++++++++++ models/fixtures/user.yml | 2 +- models/migrations/migrations.go | 2 + models/migrations/v38.go | 9 +- models/migrations/v69.go | 80 ++++++++++++ models/models.go | 1 + models/notification.go | 10 ++ models/org.go | 17 ++- models/org_team.go | 86 +++++++++++-- models/org_test.go | 12 +- models/repo.go | 18 +-- models/repo_list_test.go | 6 +- models/repo_watch.go | 17 +++ models/user.go | 38 ++++-- models/user_test.go | 22 ++++ routers/org/teams.go | 21 +++- routers/user/home.go | 6 +- routers/user/home_test.go | 4 +- templates/org/team/new.tmpl | 2 +- 24 files changed, 545 insertions(+), 72 deletions(-) create mode 100644 models/fixtures/team_unit.yml create mode 100644 models/migrations/v69.go diff --git a/integrations/api_repo_test.go b/integrations/api_repo_test.go index b766dd584..12429c88a 100644 --- a/integrations/api_repo_test.go +++ b/integrations/api_repo_test.go @@ -67,9 +67,9 @@ func TestAPISearchRepo(t *testing.T) { expectedResults }{ {name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50", expectedResults: expectedResults{ - nil: {count: 15}, - user: {count: 15}, - user2: {count: 15}}, + nil: {count: 16}, + user: {count: 16}, + user2: {count: 16}}, }, {name: "RepositoriesMax10", requestURL: "/api/v1/repos/search?limit=10", expectedResults: expectedResults{ nil: {count: 10}, diff --git a/models/access_test.go b/models/access_test.go index 59575acb7..46d6f723e 100644 --- a/models/access_test.go +++ b/models/access_test.go @@ -22,8 +22,12 @@ func TestAccessLevel(t *testing.T) { user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) - repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository) - repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository) + // A public repository owned by User 2 + repo1 := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository) + assert.False(t, repo1.IsPrivate) + // A private repository owned by Org 3 + repo2 := AssertExistsAndLoadBean(t, &Repository{ID: 3}).(*Repository) + assert.True(t, repo2.IsPrivate) level, err := AccessLevel(user1.ID, repo1) assert.NoError(t, err) @@ -47,8 +51,12 @@ func TestHasAccess(t *testing.T) { user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) - repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository) - repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository) + // A public repository owned by User 2 + repo1 := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository) + assert.False(t, repo1.IsPrivate) + // A private repository owned by Org 3 + repo2 := AssertExistsAndLoadBean(t, &Repository{ID: 3}).(*Repository) + assert.True(t, repo2.IsPrivate) for _, accessMode := range accessModes { has, err := HasAccess(user1.ID, repo1, accessMode) diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index c7d73fe17..3238b65ea 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -351,7 +351,7 @@ is_mirror: true num_forks: 1 is_fork: false - + - id: 29 fork_id: 27 @@ -365,7 +365,7 @@ num_closed_pulls: 0 is_mirror: false is_fork: true - + - id: 30 fork_id: 28 @@ -389,3 +389,14 @@ num_forks: 0 num_issues: 0 is_mirror: false + +- + id: 32 + owner_id: 3 + lower_name: repo21 + name: repo21 + is_private: false + num_stars: 0 + num_forks: 0 + num_issues: 0 + is_mirror: false diff --git a/models/fixtures/team.yml b/models/fixtures/team.yml index 1d242cb5b..4b4a1d798 100644 --- a/models/fixtures/team.yml +++ b/models/fixtures/team.yml @@ -4,9 +4,8 @@ lower_name: owners name: Owners authorize: 4 # owner - num_repos: 2 + num_repos: 3 num_members: 1 - unit_types: '[1,2,3,4,5,6,7]' - id: 2 @@ -16,7 +15,6 @@ authorize: 2 # write num_repos: 1 num_members: 2 - unit_types: '[1,2,3,4,5,6,7]' - id: 3 @@ -26,7 +24,6 @@ authorize: 4 # owner num_repos: 0 num_members: 1 - unit_types: '[1,2,3,4,5,6,7]' - id: 4 @@ -36,7 +33,6 @@ authorize: 4 # owner num_repos: 0 num_members: 1 - unit_types: '[1,2,3,4,5,6,7]' - id: 5 @@ -46,7 +42,6 @@ authorize: 4 # owner num_repos: 2 num_members: 2 - unit_types: '[1,2,3,4,5,6,7]' - id: 6 @@ -56,4 +51,3 @@ authorize: 4 # owner num_repos: 2 num_members: 1 - unit_types: '[1,2,3,4,5,6,7]' \ No newline at end of file diff --git a/models/fixtures/team_repo.yml b/models/fixtures/team_repo.yml index 9e6d74553..b324e0941 100644 --- a/models/fixtures/team_repo.yml +++ b/models/fixtures/team_repo.yml @@ -33,9 +33,15 @@ org_id: 19 team_id: 6 repo_id: 27 - + - id: 7 org_id: 19 team_id: 6 - repo_id: 28 \ No newline at end of file + repo_id: 28 + +- + id: 8 + org_id: 3 + team_id: 1 + repo_id: 32 diff --git a/models/fixtures/team_unit.yml b/models/fixtures/team_unit.yml new file mode 100644 index 000000000..ad5466a5c --- /dev/null +++ b/models/fixtures/team_unit.yml @@ -0,0 +1,209 @@ +- + id: 1 + team_id: 1 + type: 1 + +- + id: 2 + team_id: 1 + type: 2 + +- + id: 3 + team_id: 1 + type: 3 + +- + id: 4 + team_id: 1 + type: 4 + +- + id: 5 + team_id: 1 + type: 5 + +- + id: 6 + team_id: 1 + type: 6 + +- + id: 7 + team_id: 1 + type: 7 + +- + id: 8 + team_id: 2 + type: 1 + +- + id: 9 + team_id: 2 + type: 2 + +- + id: 10 + team_id: 2 + type: 3 + +- + id: 11 + team_id: 2 + type: 4 + +- + id: 12 + team_id: 2 + type: 5 + +- + id: 13 + team_id: 2 + type: 6 + +- + id: 14 + team_id: 2 + type: 7 + +- + id: 15 + team_id: 3 + type: 1 + +- + id: 16 + team_id: 3 + type: 2 + +- + id: 17 + team_id: 3 + type: 3 + +- + id: 18 + team_id: 3 + type: 4 + +- + id: 19 + team_id: 3 + type: 5 + +- + id: 20 + team_id: 3 + type: 6 + +- + id: 21 + team_id: 3 + type: 7 + +- + id: 22 + team_id: 4 + type: 1 + +- + id: 23 + team_id: 4 + type: 2 + +- + id: 24 + team_id: 4 + type: 3 + +- + id: 25 + team_id: 4 + type: 4 + +- + id: 26 + team_id: 4 + type: 5 + +- + id: 27 + team_id: 4 + type: 6 + +- + id: 28 + team_id: 4 + type: 7 + +- + id: 29 + team_id: 5 + type: 1 + +- + id: 30 + team_id: 5 + type: 2 + +- + id: 31 + team_id: 5 + type: 3 + +- + id: 32 + team_id: 5 + type: 4 + +- + id: 33 + team_id: 5 + type: 5 + +- + id: 34 + team_id: 5 + type: 6 + +- + id: 35 + team_id: 5 + type: 7 + +- + id: 36 + team_id: 6 + type: 1 + +- + id: 37 + team_id: 6 + type: 2 + +- + id: 38 + team_id: 6 + type: 3 + +- + id: 39 + team_id: 6 + type: 4 + +- + id: 40 + team_id: 6 + type: 5 + +- + id: 41 + team_id: 6 + type: 6 + +- + id: 42 + team_id: 6 + type: 7 diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index 7ad48f7fb..a2e3b88d7 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -45,7 +45,7 @@ is_admin: false avatar: avatar3 avatar_email: user3@example.com - num_repos: 2 + num_repos: 3 num_members: 2 num_teams: 2 diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 7732e1709..cc262d810 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -190,6 +190,8 @@ var migrations = []Migration{ NewMigration("remove stale watches", removeStaleWatches), // v68 -> V69 NewMigration("Reformat and remove incorrect topics", reformatAndRemoveIncorrectTopics), + // v69 -> v70 + NewMigration("move team units to team_unit table", moveTeamUnitsToTeamUnitTable), } // Migrate database to current version diff --git a/models/migrations/v38.go b/models/migrations/v38.go index 6f66484b0..eb90f9fbf 100644 --- a/models/migrations/v38.go +++ b/models/migrations/v38.go @@ -25,10 +25,15 @@ func removeCommitsUnitType(x *xorm.Engine) (err error) { Created time.Time `xorm:"-"` } + type Team struct { + ID int64 + UnitTypes []int `xorm:"json"` + } + // Update team unit types const batchSize = 100 for start := 0; ; start += batchSize { - teams := make([]*models.Team, 0, batchSize) + teams := make([]*Team, 0, batchSize) if err := x.Limit(batchSize, start).Find(&teams); err != nil { return err } @@ -36,7 +41,7 @@ func removeCommitsUnitType(x *xorm.Engine) (err error) { break } for _, team := range teams { - ut := make([]models.UnitType, 0, len(team.UnitTypes)) + ut := make([]int, 0, len(team.UnitTypes)) for _, u := range team.UnitTypes { if u < V16UnitTypeCommits { ut = append(ut, u) diff --git a/models/migrations/v69.go b/models/migrations/v69.go new file mode 100644 index 000000000..8d964688a --- /dev/null +++ b/models/migrations/v69.go @@ -0,0 +1,80 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "github.com/go-xorm/xorm" +) + +func moveTeamUnitsToTeamUnitTable(x *xorm.Engine) error { + // Team see models/team.go + type Team struct { + ID int64 + OrgID int64 + UnitTypes []int `xorm:"json"` + } + + // TeamUnit see models/org_team.go + type TeamUnit struct { + ID int64 `xorm:"pk autoincr"` + OrgID int64 `xorm:"INDEX"` + TeamID int64 `xorm:"UNIQUE(s)"` + Type int `xorm:"UNIQUE(s)"` + } + + if err := x.Sync2(new(TeamUnit)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return err + } + + // Update team unit types + const batchSize = 100 + for start := 0; ; start += batchSize { + teams := make([]*Team, 0, batchSize) + if err := x.Limit(batchSize, start).Find(&teams); err != nil { + return err + } + if len(teams) == 0 { + break + } + + for _, team := range teams { + var unitTypes []int + if len(team.UnitTypes) == 0 { + unitTypes = allUnitTypes + } else { + unitTypes = team.UnitTypes + } + + // insert units for team + var units = make([]TeamUnit, 0, len(unitTypes)) + for _, tp := range unitTypes { + units = append(units, TeamUnit{ + OrgID: team.OrgID, + TeamID: team.ID, + Type: tp, + }) + } + + if _, err := sess.Insert(&units); err != nil { + return fmt.Errorf("Insert team units: %v", err) + } + + } + } + + if err := dropTableColumns(sess, "team", "unit_types"); err != nil { + return err + } + return sess.Commit() +} diff --git a/models/models.go b/models/models.go index 5743f1862..aaf1370fd 100644 --- a/models/models.go +++ b/models/models.go @@ -122,6 +122,7 @@ func init() { new(Reaction), new(IssueAssignees), new(U2FRegistration), + new(TeamUnit), ) gonicNames := []string{"SSL", "UID"} diff --git a/models/notification.go b/models/notification.go index c8376a857..8c36c0c5c 100644 --- a/models/notification.go +++ b/models/notification.go @@ -119,7 +119,17 @@ func createOrUpdateIssueNotifications(e Engine, issue *Issue, notificationAuthor } } + issue.loadRepo(e) + for _, watch := range watches { + issue.Repo.Units = nil + if issue.IsPull && !issue.Repo.CheckUnitUser(watch.UserID, false, UnitTypePullRequests) { + continue + } + if !issue.IsPull && !issue.Repo.CheckUnitUser(watch.UserID, false, UnitTypeIssues) { + continue + } + if err := notifyUser(watch.UserID); err != nil { return err } diff --git a/models/org.go b/models/org.go index ed0d58306..23f6c58bf 100644 --- a/models/org.go +++ b/models/org.go @@ -154,12 +154,26 @@ func CreateOrganization(org, owner *User) (err error) { Name: ownerTeamName, Authorize: AccessModeOwner, NumMembers: 1, - UnitTypes: allRepUnitTypes, } if _, err = sess.Insert(t); err != nil { return fmt.Errorf("insert owner team: %v", err) } + // insert units for team + var units = make([]TeamUnit, 0, len(allRepUnitTypes)) + for _, tp := range allRepUnitTypes { + units = append(units, TeamUnit{ + OrgID: org.ID, + TeamID: t.ID, + Type: tp, + }) + } + + if _, err = sess.Insert(&units); err != nil { + sess.Rollback() + return err + } + if _, err = sess.Insert(&TeamUser{ UID: owner.ID, OrgID: org.ID, @@ -238,6 +252,7 @@ func deleteOrg(e *xorm.Session, u *User) error { &Team{OrgID: u.ID}, &OrgUser{OrgID: u.ID}, &TeamUser{OrgID: u.ID}, + &TeamUnit{OrgID: u.ID}, ); err != nil { return fmt.Errorf("deleteBeans: %v", err) } diff --git a/models/org_team.go b/models/org_team.go index 5ea6e76cd..3b37f936f 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -1,3 +1,4 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. // Copyright 2016 The Gogs Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -10,7 +11,6 @@ import ( "strings" "code.gitea.io/gitea/modules/log" - "github.com/go-xorm/xorm" ) @@ -28,15 +28,16 @@ type Team struct { Members []*User `xorm:"-"` NumRepos int NumMembers int - UnitTypes []UnitType `xorm:"json"` + Units []*TeamUnit `xorm:"-"` } -// GetUnitTypes returns unit types the team owned, empty means all the unit types -func (t *Team) GetUnitTypes() []UnitType { - if len(t.UnitTypes) == 0 { - return allRepUnitTypes +func (t *Team) getUnits(e Engine) (err error) { + if t.Units != nil { + return nil } - return t.UnitTypes + + t.Units, err = getUnitsByTeamID(e, t.ID) + return err } // HasWriteAccess returns true if team has at least write level access mode. @@ -214,11 +215,12 @@ func (t *Team) RemoveRepository(repoID int64) error { // UnitEnabled returns if the team has the given unit type enabled func (t *Team) UnitEnabled(tp UnitType) bool { - if len(t.UnitTypes) == 0 { - return true + if err := t.getUnits(x); err != nil { + log.Warn("Error loading repository (ID: %d) units: %s", t.ID, err.Error()) } - for _, u := range t.UnitTypes { - if u == tp { + + for _, unit := range t.Units { + if unit.Type == tp { return true } } @@ -275,6 +277,17 @@ func NewTeam(t *Team) (err error) { return err } + // insert units for team + if len(t.Units) > 0 { + for _, unit := range t.Units { + unit.TeamID = t.ID + } + if _, err = sess.Insert(&t.Units); err != nil { + sess.Rollback() + return err + } + } + // Update organization number of teams. if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams+1 WHERE id = ?", t.OrgID); err != nil { sess.Rollback() @@ -424,6 +437,13 @@ func DeleteTeam(t *Team) error { return err } + // Delete team-unit. + if _, err := sess. + Where("team_id=?", t.ID). + Delete(new(TeamUnit)); err != nil { + return err + } + // Delete team. if _, err := sess.ID(t.ID).Delete(new(Team)); err != nil { return err @@ -695,3 +715,47 @@ func GetTeamsWithAccessToRepo(orgID, repoID int64, mode AccessMode) ([]*Team, er And("team_repo.repo_id = ?", repoID). Find(&teams) } + +// ___________ ____ ___ .__ __ +// \__ ___/___ _____ _____ | | \____ |__|/ |_ +// | |_/ __ \\__ \ / \| | / \| \ __\ +// | |\ ___/ / __ \| Y Y \ | / | \ || | +// |____| \___ >____ /__|_| /______/|___| /__||__| +// \/ \/ \/ \/ + +// TeamUnit describes all units of a repository +type TeamUnit struct { + ID int64 `xorm:"pk autoincr"` + OrgID int64 `xorm:"INDEX"` + TeamID int64 `xorm:"UNIQUE(s)"` + Type UnitType `xorm:"UNIQUE(s)"` +} + +// Unit returns Unit +func (t *TeamUnit) Unit() Unit { + return Units[t.Type] +} + +func getUnitsByTeamID(e Engine, teamID int64) (units []*TeamUnit, err error) { + return units, e.Where("team_id = ?", teamID).Find(&units) +} + +// UpdateTeamUnits updates a teams's units +func UpdateTeamUnits(team *Team, units []TeamUnit) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Where("team_id = ?", team.ID).Delete(new(TeamUnit)); err != nil { + return err + } + + if _, err = sess.Insert(units); err != nil { + sess.Rollback() + return err + } + + return sess.Commit() +} diff --git a/models/org_test.go b/models/org_test.go index 42ab4a2a4..c54e7a93b 100644 --- a/models/org_test.go +++ b/models/org_test.go @@ -489,8 +489,8 @@ func TestAccessibleReposEnv_CountRepos(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, expectedCount, count) } - testSuccess(2, 2) - testSuccess(4, 1) + testSuccess(2, 3) + testSuccess(4, 2) } func TestAccessibleReposEnv_RepoIDs(t *testing.T) { @@ -503,8 +503,8 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) { assert.NoError(t, err) assert.Equal(t, expectedRepoIDs, repoIDs) } - testSuccess(2, 1, 100, []int64{3, 5}) - testSuccess(4, 0, 100, []int64{3}) + testSuccess(2, 1, 100, []int64{3, 5, 32}) + testSuccess(4, 0, 100, []int64{3, 32}) } func TestAccessibleReposEnv_Repos(t *testing.T) { @@ -522,8 +522,8 @@ func TestAccessibleReposEnv_Repos(t *testing.T) { } assert.Equal(t, expectedRepos, repos) } - testSuccess(2, []int64{3, 5}) - testSuccess(4, []int64{3}) + testSuccess(2, []int64{3, 5, 32}) + testSuccess(4, []int64{3, 32}) } func TestAccessibleReposEnv_MirrorRepos(t *testing.T) { diff --git a/models/repo.go b/models/repo.go index 7f2be502a..d1cc290c4 100644 --- a/models/repo.go +++ b/models/repo.go @@ -365,22 +365,14 @@ func (repo *Repository) getUnitsByUserID(e Engine, userID int64, isAdmin bool) ( return err } - var allTypes = make(map[UnitType]struct{}, len(allRepUnitTypes)) - for _, team := range teams { - // Administrators can not be limited - if team.Authorize >= AccessModeAdmin { - return nil - } - for _, unitType := range team.UnitTypes { - allTypes[unitType] = struct{}{} - } - } - // unique var newRepoUnits = make([]*RepoUnit, 0, len(repo.Units)) for _, u := range repo.Units { - if _, ok := allTypes[u.Type]; ok { - newRepoUnits = append(newRepoUnits, u) + for _, team := range teams { + if team.UnitEnabled(u.Type) { + newRepoUnits = append(newRepoUnits, u) + break + } } } diff --git a/models/repo_list_test.go b/models/repo_list_test.go index 3bccb1aeb..164bc19bf 100644 --- a/models/repo_list_test.go +++ b/models/repo_list_test.go @@ -147,10 +147,10 @@ func TestSearchRepositoryByName(t *testing.T) { count: 14}, {name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative", opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, AllPublic: true}, - count: 15}, + count: 16}, {name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative", opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, Private: true, AllPublic: true}, - count: 19}, + count: 20}, {name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName", opts: &SearchRepoOptions{Keyword: "test", Page: 1, PageSize: 10, OwnerID: 15, Private: true, AllPublic: true}, count: 13}, @@ -159,7 +159,7 @@ func TestSearchRepositoryByName(t *testing.T) { count: 11}, {name: "AllPublic/PublicRepositoriesOfOrganization", opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 17, AllPublic: true, Collaborate: util.OptionalBoolFalse}, - count: 15}, + count: 16}, } for _, testCase := range testCases { diff --git a/models/repo_watch.go b/models/repo_watch.go index fb89a55a1..8019027c1 100644 --- a/models/repo_watch.go +++ b/models/repo_watch.go @@ -109,6 +109,23 @@ func notifyWatchers(e Engine, act *Action) error { act.ID = 0 act.UserID = watches[i].UserID + act.Repo.Units = nil + + switch act.OpType { + case ActionCommitRepo, ActionPushTag, ActionDeleteTag, ActionDeleteBranch: + if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypeCode) { + continue + } + case ActionCreateIssue, ActionCommentIssue, ActionCloseIssue, ActionReopenIssue: + if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypeIssues) { + continue + } + case ActionCreatePullRequest, ActionMergePullRequest, ActionClosePullRequest, ActionReopenPullRequest: + if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypePullRequests) { + continue + } + } + if _, err = e.InsertOne(act); err != nil { return fmt.Errorf("insert new action: %v", err) } diff --git a/models/user.go b/models/user.go index 1497eef44..653e99426 100644 --- a/models/user.go +++ b/models/user.go @@ -546,28 +546,46 @@ func (u *User) GetRepositories(page, pageSize int) (err error) { return err } -// GetRepositoryIDs returns repositories IDs where user owned -func (u *User) GetRepositoryIDs() ([]int64, error) { +// GetRepositoryIDs returns repositories IDs where user owned and has unittypes +func (u *User) GetRepositoryIDs(units ...UnitType) ([]int64, error) { var ids []int64 - return ids, x.Table("repository").Cols("id").Where("owner_id = ?", u.ID).Find(&ids) + + sess := x.Table("repository").Cols("repository.id") + + if len(units) > 0 { + sess = sess.Join("INNER", "repo_unit", "repository.id = repo_unit.repo_id") + sess = sess.In("repo_unit.type", units) + } + + return ids, sess.Where("owner_id = ?", u.ID).Find(&ids) } -// GetOrgRepositoryIDs returns repositories IDs where user's team owned -func (u *User) GetOrgRepositoryIDs() ([]int64, error) { +// GetOrgRepositoryIDs returns repositories IDs where user's team owned and has unittypes +func (u *User) GetOrgRepositoryIDs(units ...UnitType) ([]int64, error) { var ids []int64 - return ids, x.Table("repository"). + + sess := x.Table("repository"). Cols("repository.id"). - Join("INNER", "team_user", "repository.owner_id = team_user.org_id AND team_user.uid = ?", u.ID). + Join("INNER", "team_user", "repository.owner_id = team_user.org_id"). + Join("INNER", "team_repo", "repository.is_private != ? OR (team_user.team_id = team_repo.team_id AND repository.id = team_repo.repo_id)", true) + + if len(units) > 0 { + sess = sess.Join("INNER", "team_unit", "team_unit.team_id = team_user.team_id") + sess = sess.In("team_unit.type", units) + } + + return ids, sess. + Where("team_user.uid = ?", u.ID). GroupBy("repository.id").Find(&ids) } // GetAccessRepoIDs returns all repositories IDs where user's or user is a team member organizations -func (u *User) GetAccessRepoIDs() ([]int64, error) { - ids, err := u.GetRepositoryIDs() +func (u *User) GetAccessRepoIDs(units ...UnitType) ([]int64, error) { + ids, err := u.GetRepositoryIDs(units...) if err != nil { return nil, err } - ids2, err := u.GetOrgRepositoryIDs() + ids2, err := u.GetOrgRepositoryIDs(units...) if err != nil { return nil, err } diff --git a/models/user_test.go b/models/user_test.go index 4fd0bc0fa..20de1a64b 100644 --- a/models/user_test.go +++ b/models/user_test.go @@ -159,3 +159,25 @@ func BenchmarkHashPassword(b *testing.B) { u.HashPassword(pass) } } + +func TestGetOrgRepositoryIDs(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + user2 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) + user4 := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User) + user5 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) + + accessibleRepos, err := user2.GetOrgRepositoryIDs() + assert.NoError(t, err) + // User 2's team has access to private repos 3, 5, repo 32 is a public repo of the organization + assert.Equal(t, []int64{3, 5, 32}, accessibleRepos) + + accessibleRepos, err = user4.GetOrgRepositoryIDs() + assert.NoError(t, err) + // User 4's team has access to private repo 3, repo 32 is a public repo of the organization + assert.Equal(t, []int64{3, 32}, accessibleRepos) + + accessibleRepos, err = user5.GetOrgRepositoryIDs() + assert.NoError(t, err) + // User 5's team has no access to any repo + assert.Len(t, accessibleRepos, 0) +} diff --git a/routers/org/teams.go b/routers/org/teams.go index d894c8661..87bfb8596 100644 --- a/routers/org/teams.go +++ b/routers/org/teams.go @@ -182,7 +182,14 @@ func NewTeamPost(ctx *context.Context, form auth.CreateTeamForm) { Authorize: models.ParseAccessMode(form.Permission), } if t.Authorize < models.AccessModeAdmin { - t.UnitTypes = form.Units + var units = make([]*models.TeamUnit, 0, len(form.Units)) + for _, tp := range form.Units { + units = append(units, &models.TeamUnit{ + OrgID: ctx.Org.Organization.ID, + Type: tp, + }) + } + t.Units = units } ctx.Data["Team"] = t @@ -264,9 +271,17 @@ func EditTeamPost(ctx *context.Context, form auth.CreateTeamForm) { } t.Description = form.Description if t.Authorize < models.AccessModeAdmin { - t.UnitTypes = form.Units + var units = make([]models.TeamUnit, 0, len(form.Units)) + for _, tp := range form.Units { + units = append(units, models.TeamUnit{ + OrgID: t.OrgID, + TeamID: t.ID, + Type: tp, + }) + } + models.UpdateTeamUnits(t, units) } else { - t.UnitTypes = nil + models.UpdateTeamUnits(t, nil) } if ctx.HasError() { diff --git a/routers/user/home.go b/routers/user/home.go index 2a193bbde..0c84b2498 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -203,7 +203,11 @@ func Issues(ctx *context.Context) { return } } else { - userRepoIDs, err = ctxUser.GetAccessRepoIDs() + unitType := models.UnitTypeIssues + if isPullList { + unitType = models.UnitTypePullRequests + } + userRepoIDs, err = ctxUser.GetAccessRepoIDs(unitType) if err != nil { ctx.ServerError("ctxUser.GetAccessRepoIDs", err) return diff --git a/routers/user/home_test.go b/routers/user/home_test.go index a9b146b76..8a3d9b9f5 100644 --- a/routers/user/home_test.go +++ b/routers/user/home_test.go @@ -26,8 +26,8 @@ func TestIssues(t *testing.T) { Issues(ctx) assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) - assert.EqualValues(t, map[int64]int64{1: 1, 2: 1}, ctx.Data["Counts"]) + assert.EqualValues(t, map[int64]int64{1: 1}, ctx.Data["Counts"]) assert.EqualValues(t, true, ctx.Data["IsShowClosed"]) assert.Len(t, ctx.Data["Issues"], 1) - assert.Len(t, ctx.Data["Repos"], 2) + assert.Len(t, ctx.Data["Repos"], 1) } diff --git a/templates/org/team/new.tmpl b/templates/org/team/new.tmpl index ec1a3dd72..12cdd697c 100644 --- a/templates/org/team/new.tmpl +++ b/templates/org/team/new.tmpl @@ -57,7 +57,7 @@ {{range $t, $unit := $.Units}}
- + {{$.i18n.Tr $unit.DescKey}}
From e2721b619098b887e6e27675450f3a4663716f59 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Thu, 21 Jun 2018 17:12:56 -0400 Subject: [PATCH 47/86] Remove call to update certs (#4296) --- docker/etc/s6/gitea/setup | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker/etc/s6/gitea/setup b/docker/etc/s6/gitea/setup index 500cca584..03758ed81 100755 --- a/docker/etc/s6/gitea/setup +++ b/docker/etc/s6/gitea/setup @@ -1,7 +1,5 @@ #!/bin/bash -/usr/sbin/update-ca-certificates - if [ ! -d /data/git/.ssh ]; then mkdir -p /data/git/.ssh chmod 700 /data/git/.ssh From 212fef08666e30419e0a94397d18e99c1222b0ca Mon Sep 17 00:00:00 2001 From: Richard Coleman Date: Sun, 24 Jun 2018 03:55:48 +0100 Subject: [PATCH 48/86] Add details about USER_UID and USER_GID environment variables (#4301) --- docs/content/doc/installation/with-docker.en-us.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/content/doc/installation/with-docker.en-us.md b/docs/content/doc/installation/with-docker.en-us.md index c672393cc..aa4337e08 100644 --- a/docs/content/doc/installation/with-docker.en-us.md +++ b/docs/content/doc/installation/with-docker.en-us.md @@ -245,6 +245,8 @@ You can configure some of Gitea's settings via environment variables: * `SECRET_KEY`: **""**: Global secret key. This should be changed. If this has a value and `INSTALL_LOCK` is empty, `INSTALL_LOCK` will automatically set to `true`. * `DISABLE_REGISTRATION`: **false**: Disable registration, after which only admin can create accounts for users. * `REQUIRE_SIGNIN_VIEW`: **false**: Enable this to force users to log in to view any page. +* `USER_UID`: **1000**: The UID (Unix user ID) of the user that runs Gitea within the container. Match this to the UID of the owner of the `/data` volume if using host volumes (this is not necessary with named volumes). +* `USER_GID`: **1000**: The GID (Unix group ID) of the user that runs Gitea within the container. Match this to the GID of the owner of the `/data` volume if using host volumes (this is not necessary with named volumes). # Customization From a747a5d05facbadf5feaf7144f576907d0cb8c23 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sun, 24 Jun 2018 08:40:30 +0200 Subject: [PATCH 49/86] Add gpg-sign step to drone (#4188) * Add gpg-sign step to drone * add compressed releases to gpg-sign targets * Use exclude to simplify file list drone-plugins/drone-gpgsign#2 --- .drone.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.drone.yml b/.drone.yml index 8e571640b..dd56477db 100644 --- a/.drone.yml +++ b/.drone.yml @@ -255,6 +255,18 @@ pipeline: when: event: [ push, tag ] + gpg-sign: + image: plugins/gpgsign:1 + pull: true + secrets: [ gpgsign_key, gpgsign_passphrase ] + detach_sign: true + files: + - dist/release/* + excludes: + - dist/release/*.sha265 + when: + event: [ push, tag ] + release: image: plugins/s3:1 pull: true From 3f0d9beece362064c2f8d521b112bba968008e5b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 24 Jun 2018 19:10:11 +0800 Subject: [PATCH 50/86] fix exclude files .sha265 to .sha256 (#4304) --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index dd56477db..9a27e1c21 100644 --- a/.drone.yml +++ b/.drone.yml @@ -263,7 +263,7 @@ pipeline: files: - dist/release/* excludes: - - dist/release/*.sha265 + - dist/release/*.sha256 when: event: [ push, tag ] From 3e6d9b355e987f148ee44bec8cd2f42fd3473e89 Mon Sep 17 00:00:00 2001 From: Antonio Huete Jimenez Date: Sun, 24 Jun 2018 21:24:00 +0000 Subject: [PATCH 51/86] Add a basic SMF manifest for SunOS platforms (#4238) Signed-off-by: Antonio Huete Jimenez --- contrib/init/sunos/gitea.xml | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 contrib/init/sunos/gitea.xml diff --git a/contrib/init/sunos/gitea.xml b/contrib/init/sunos/gitea.xml new file mode 100644 index 000000000..4b8cc3a38 --- /dev/null +++ b/contrib/init/sunos/gitea.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 8bb9b67a29e7fc8d7f3cba613c3e53c9dae70590 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 24 Jun 2018 21:25:00 +0000 Subject: [PATCH 52/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 8 +++++--- options/locale/locale_uk-UA.ini | 36 ++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 4b1b85f92..972b62261 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -97,7 +97,7 @@ app_name=Seitentitel app_name_helper=Du kannst hier den Namen deines Unternehmens eingeben. repo_path=Repository-Verzeichnis repo_path_helper=Remote-Git-Repositories werden in diesem Verzeichnis gespeichert. -lfs_path=Git LFS-Wurzelpfad +lfs_path=Git-LFS-Wurzelpfad lfs_path_helper=In diesem Verzeichnis werden die Dateien von Git LFS abgespeichert. Leer lassen um LFS zu deaktivieren. run_user=Ausführen als run_user_helper=Gebe den Betriebssystem-Benutzernamen ein, unter welchem Gitea laufen soll. Beachte, dass dieser Nutzer Zugriff auf den Repository-Ordner haben muss. @@ -658,7 +658,7 @@ issues.new_label_placeholder=Labelname issues.new_label_desc_placeholder=Beschreibung issues.create_label=Label erstellen issues.label_templates.title=Lade vordefinierte Label -issues.label_templates.info=Es existieren noch keine Labels. Erstelle ein neues Label ("Neues Label") oder verwende das Standard Label-Set: +issues.label_templates.info=Es existieren noch keine Label. Erstelle ein neues Label („Neues Label“) oder verwende das Standard-Label-Set: issues.label_templates.helper=Wähle ein Label issues.label_templates.use=Label-Set verwenden issues.label_templates.fail_to_load_file=Fehler beim Laden der Label Template Datei '%s': %v @@ -676,7 +676,7 @@ issues.delete_branch_at=`löschte die Branch %s %s` issues.open_tab=%d offen issues.close_tab=%d geschlossen issues.filter_label=Label -issues.filter_label_no_select=Alle Labels +issues.filter_label_no_select=Alle Label issues.filter_milestone=Meilenstein issues.filter_milestone_no_select=Alle Meilensteine issues.filter_assignee=Zuständig @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=Branch „%s“ ist geschützt und kann nicht g topic.manage_topics=Themen verwalten topic.done=Fertig +topic.count_prompt=Du kannst nicht mehr als 25 Themen auswählen +topic.format_prompt=Themen müssen mit einem Buchstaben oder einer Zahl beginnen. Sie können Bindestriche (-) enthalten und dürfen nicht länger als 35 Zeichen sein [org] org_name_holder=Name der Organisation diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 8f90f3a3f..c6855090a 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -40,6 +40,7 @@ u2f_unsupported_browser=Ваш браузер не підтримує U2F клю u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. u2f_error_2=Переконайтеся, що ви використовуєте зашифроване з'єднання (https://) та відвідуєте правильну URL-адресу. u2f_error_3=Сервер не може обробити, ваш запит. +u2f_error_5=Таймаут досягнуто до того, як ваш ключ можна буде прочитати. Перезавантажте, щоб повторити спробу. u2f_reload=Оновити repository=Репозиторій @@ -105,6 +106,7 @@ ssh_port_helper=Номер порту, який використовує SSH с http_port=Gitea HTTP порт http_port_helper=Номер порту, який буде прослуховуватися Giteas веб-сервером. app_url=Базова URL-адреса Gitea +app_url_helper=Базова адреса для HTTP(S) клонування через URL та повідомлень електронної пошти. log_root_path=Шлях до лог файлу log_root_path_helper=Файли журналу будуть записані в цей каталог. @@ -112,6 +114,7 @@ optional_title=Додаткові налаштування email_title=Налаштування Email smtp_host=SMTP хост smtp_from=Відправляти Email від імені +smtp_from_helper=Електронна пошта для використання в Gіtea. Введіть звичайну електронну адресу або використовуйте формат: "Ім'я" . mailer_user=SMTP Ім'я кристувача mailer_password=SMTP Пароль register_confirm=Потрібно підтвердити електронну пошту для реєстрації @@ -125,9 +128,11 @@ federated_avatar_lookup=Увімкнути федеративні аватари federated_avatar_lookup_popup=Увімкнути зовнішний Аватар за допомогою Libravatar. disable_registration=Вимкнути самостійну реєстрацію disable_registration_popup=Вимкнути самостійну реєстрацію користувачів, тільки адміністратор може створювати нові облікові записи. +allow_only_external_registration_popup=Включити реєстрацію тільки через зовнішні сервіси. openid_signin=Увімкнути реєстрацію за допомогою OpenID openid_signin_popup=Увімкнути вхід за допомогою OpenID. openid_signup=Увімкнути самостійну реєстрацію за допомогою OpenID +openid_signup_popup=Увімкнути самореєстрацію користувачів на основі OpenID. enable_captcha=Увімкнути CAPTCHA enable_captcha_popup=Вимагати перевірку CAPTCHA при самостійній реєстрації користувача. require_sign_in_view=Вимагати авторизації для перегляду сторінок @@ -141,6 +146,7 @@ admin_email=Адреса електронної пошти install_btn_confirm=Встановлення Gitea test_git_failed=Не в змозі перевірити 'git' команду: %v invalid_db_setting=Налаштування бази даних є некоректними: %v +invalid_repo_path=Помилковий шлях до кореня репозиторію: %v save_config_failed=Не в змозі зберегти конфігурацію: %v invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v install_success=Ласкаво просимо! Дякуємо вам за вибір Gitea. Розважайтеся, і будьте обережні! @@ -152,6 +158,7 @@ default_allow_create_organization_popup=Дозволити новим облік default_enable_timetracking=Увімкнути відстеження часу за замовчуванням default_enable_timetracking_popup=Включити відстеження часу для нових репозиторіїв за замовчуванням. no_reply_address=Прихований поштовий домен +no_reply_address_helper=Доменне ім'я для користувачів із прихованою електронною адресою. Наприклад, ім'я користувача 'joe' буде входити в Git як 'joe@noreply.example.org', якщо для прихованого домену електронної пошти встановлено 'noreply.example.org'. [home] uname_holder=Ім'я користувача або Ел. пошта @@ -176,11 +183,13 @@ code=Код repo_no_results=Відповідних репозиторіїв не знайдено. user_no_results=Відповідних користувачів не знайдено. org_no_results=Відповідних організацій не знайдено. +code_no_results=Відповідний пошуковому запитанню код не знайдено. code_search_results=Результати пошуку '%s' [auth] create_new_account=Реєстрація облікового запису register_helper_msg=Вже зареєстровані? Увійдіть зараз! +social_register_helper_msg=Вже є аккаунт? Зв'яжіть його зараз! disable_register_prompt=Вибачте, можливість реєстрації відключена. Будь ласка, зв'яжіться з адміністратором сайту. disable_register_mail=Підтвердження реєстрації електронною поштою вимкнено. remember_me=Запам'ятати мене @@ -200,6 +209,7 @@ send_reset_mail=Натисніть сюди, щоб відправити лис reset_password=Скинути пароль invalid_code=Цей код підтвердження недійсний або закінчився. reset_password_helper=Натисніть тут для скидання пароля +password_too_short=Довжина пароля не може бути меншою за %d символів. non_local_account=Нелокальні акаунти не можуть змінити пароль через Gitea. verify=Підтвердити scratch_code=Одноразовий пароль @@ -211,7 +221,10 @@ login_userpass=Увійти login_openid=OpenID openid_connect_submit=Під’єднатися openid_connect_title=Підключитися до існуючого облікового запису +openid_connect_desc=Вибраний OpenID URI невідомий. Пов'яжіть його з новим обліковим записом тут. openid_register_title=Створити новий обліковий запис +openid_register_desc=Вибраний OpenID URI невідомий. Пов'яжіть йогоз новим обліковим записом тут. +openid_signin_desc=Введіть свій ідентифікатор OpenID. Наприклад: https://anne.me, bob.openid.org.cn або gnusocial.net/carry. disable_forgot_password_mail=На жаль скидання пароля відключене. Будь ласка, зв'яжіться з адміністратором сайту. [mail] @@ -247,6 +260,8 @@ TreeName=Шлях до файлу Content=Зміст require_error=` не може бути пустим.` +alpha_dash_error=` повинен містити тільки літерно-цифрові символи, дефіс ('-') та підкреслення ('_'). ` +alpha_dash_dot_error=` повинен містити тільки літерно-цифрові символи, дефіс ('-') , підкреслення ('_') та точки ('.'). ` git_ref_name_error=` повинен бути правильним посилальним ім'ям Git.` size_error=` повинен бути розмір %s.` min_size_error=` повинен бути принаймні %s символів.` @@ -262,6 +277,7 @@ username_been_taken=Ім'я користувача вже зайнято. repo_name_been_taken=Ім'я репозіторію вже використовується. org_name_been_taken=Назва організації вже зайнято. team_name_been_taken=Назва команди вже зайнято. +team_no_units_error=Дозволити доступ до принаймні одного розділу репозитарію. email_been_used=Ця електронна адреса вже використовується. openid_been_used=OpenID адреса '%s' вже використовується. username_password_incorrect=Неправильне ім'я користувача або пароль. @@ -269,12 +285,15 @@ enterred_invalid_repo_name=Невірно введено ім'я репозит enterred_invalid_owner_name=Ім'я нового власника не є дійсним. enterred_invalid_password=Введений вами пароль некоректний. user_not_exist=Даний користувач не існує. +last_org_owner=Ви не можете вилучити останнього користувача з команди 'власники'. У кожній команді має бути хоча б один власник. cannot_add_org_to_team=Організацію неможливо додати як учасника команди. invalid_ssh_key=Неможливо перевірити ваш SSH ключ: %s invalid_gpg_key=Неможливо перевірити ваш GPG ключ: %s +unable_verify_ssh_key=Не вдається підтвердити ключ SSH; подвійно перевірте його на наявність похибки. auth_failed=Помилка автентифікації: %v +still_own_repo=Ваш обліковий запис володіє одним або декількома репозиторіями; видаліть або перенесіть їх в першу чергу. target_branch_not_exist=Цільової гілки не існує. @@ -290,6 +309,7 @@ follow=Підписатися unfollow=Відписатися form.name_reserved=Ім'я користувача "%s" зарезервовано. +form.name_pattern_not_allowed=Шаблон '%s' не дозволено в імені користувача. [settings] profile=Профіль @@ -311,6 +331,7 @@ u2f=Ключі безпеки public_profile=Загальнодоступний профіль profile_desc=Ваша адреса електронної пошти використовуватиметься для сповіщення та інших операцій. +password_username_disabled=Нелокальним користувачам заборонено змінювати ім'я користувача. Щоб отримати докладнішу інформацію, зв'яжіться з адміністратором сайту. full_name=Повне ім'я website=Веб-сайт location=Місцезнаходження @@ -340,28 +361,36 @@ password_change_disabled=Нелокальні акаунти не можуть emails=Адреса електронної пошти manage_emails=Керування адресами ел. пошти +manage_openid=Керування OpenID email_desc=Ваша основна адреса електронної пошти використовуватиметься для сповіщення та інших операцій. primary=Основний primary_email=Зробити основним delete_email=Видалити email_deletion=Видалити адресу електронної пошти openid_deletion=Видалити адресу OpenID +openid_deletion_success=Адреса OpenID була видалена. add_new_email=Додати нову адресу електронної пошти add_new_openid=Додати новий OpenID URI add_email=Додати адресу електронної пошти add_openid=Додати OpenID URI add_email_confirmation_sent=Електронний лист із підтвердженням було відправлено на '%s', будь ласка, перевірте вашу поштову скриньку протягом наступних %s, щоб підтвердити адресу. add_email_success=Додано нову адресу електронної пошти. +add_openid_success=Нова адреса OpenID була додана. keep_email_private=Приховати адресу електронної пошти keep_email_private_popup=Вашу адресу електронної пошти буде приховано від інших користувачів. manage_ssh_keys=Керувати SSH ключами manage_gpg_keys=Керувати GPG ключами add_key=Додати ключ +ssh_desc=Ці відкриті SSH-ключі пов'язані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. +gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють здійснювати перевірку комітів. ssh_helper=Потрібна допомога? Дивіться гід на GitHub з генерації ключів SSH або виправлення типових неполадок SSH. gpg_helper= Потрібна допомога? Перегляньте посібник GitHub про GPG . add_new_key=Додати SSH ключ add_new_gpg_key=Додати GPG ключ +ssh_key_been_used=Цей ключ SSH вже додано до вашого облікового запису. +ssh_key_name_used=Ключ SSH з таким самим ім'ям вже додано до вашого облікового запису. +gpg_key_id_used=Публічний ключ GPG з таким самим ідентифікатором вже існує. subkeys=Підключі key_id=ID ключа key_name=Ім'я ключа @@ -560,6 +589,7 @@ commits.date=Дата commits.older=Давніше commits.newer=Новіше commits.signed_by=Підписано +commits.gpg_key_id=Ідентифікатор GPG ключа ext_issues=Зов. Проблеми @@ -731,6 +761,8 @@ milestones.edit=Редагувати етап milestones.cancel=Відмінити milestones.modify=Оновити етап milestones.deletion=Видалити етап +milestones.filter_sort.closest_due_date=Найближче за датою +milestones.filter_sort.furthest_due_date=Далі за датою milestones.filter_sort.most_issues=Найбільш проблем milestones.filter_sort.least_issues=Найменш проблем @@ -1107,7 +1139,9 @@ users.admin=Адміністратор users.repos=Репозиторії users.created=Створено users.last_login=Останній вхід +users.never_login=Ніколи не входив users.send_register_notify=Надіслати повідомлення про реєстрацію користувача +users.new_success=Обліковий запис '%s' створений. users.edit=Редагувати users.auth_source=Джерело автентифікації users.local=Локальні @@ -1243,7 +1277,7 @@ config.default_keep_email_private=Приховати адресу електро config.default_allow_create_organization=Дозволити створення організацій за замовчуванням config.enable_timetracking=Увімкнути відстеження часу config.default_enable_timetracking=Увімкнути відстеження часу за замовчуванням -config.no_reply_address=Прихований домен е-пошти +config.no_reply_address=Прихований домен електронної пошти config.webhook_config=Конфігурація web-хуків config.queue_length=Довжина черги From aaf6be3ee6f6fb353571c35c68aa081dd043adc2 Mon Sep 17 00:00:00 2001 From: stevegt Date: Mon, 25 Jun 2018 05:12:46 -0700 Subject: [PATCH 53/86] Create api-usage doc page (#4306) * add api user guides in doc * update user-guides api page * fix typo: user guides -> user guide * move api-usage page under advanced category * flesh out API usage docs * Build on work by @tungsheng * Address issues raised in #4037, #3673, and #4243 * Close #4247 Signed-off-by: Steve Traugott --- docs/content/doc/advanced/api-usage.en-us.md | 75 ++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 docs/content/doc/advanced/api-usage.en-us.md diff --git a/docs/content/doc/advanced/api-usage.en-us.md b/docs/content/doc/advanced/api-usage.en-us.md new file mode 100644 index 000000000..f04a99f14 --- /dev/null +++ b/docs/content/doc/advanced/api-usage.en-us.md @@ -0,0 +1,75 @@ +--- +date: "2018-06-24:00:00+02:00" +title: "API Usage" +slug: "api-usage" +weight: 40 +toc: true +draft: false +menu: + sidebar: + parent: "advanced" + name: "API Usage" + weight: 40 + identifier: "api-usage" +--- + +# Gitea API Usage + +## Enabling/configuring API access + +By default, `ENABLE_SWAGGER_ENDPOINT` is true, and +`MAX_RESPONSE_ITEMS` is set to 50. See [Config Cheat +Sheet](https://docs.gitea.io/en-us/config-cheat-sheet/) for more +information. + +## Authentication via the API + +Gitea supports these methods of API authentication: + +- HTTP basic authentication +- `token=...` parameter in URL query string +- `access_token=...` parameter in URL query string +- `Authorization: token ...` header in HTTP headers + +All of these methods accept the same apiKey token type. You can +better understand this by looking at the code -- as of this writing, +Gitea parses queries and headers to find the token in +[modules/auth/auth.go](https://github.com/go-gitea/gitea/blob/6efdcaed86565c91a3dc77631372a9cc45a58e89/modules/auth/auth.go#L47). + +You can create an apiKey token via your gitea install's web interface: +`Settings | Applications | Generate New Token`. + +### More on the `Authorization:` header + +For historical reasons, Gitea needs the word `token` included before +the apiKey token in an authorization header, like this: + +``` +Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675 +``` + +In a `curl` command, for instance, this would look like: + +``` +curl -X POST "http://localhost:4000/api/v1/repos/test1/test1/issues" \ + -H "accept: application/json" \ + -H "Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675" \ + -H "Content-Type: application/json" -d "{ \"body\": \"testing\", \"title\": \"test 20\"}" -i +``` + +As mentioned above, the token used is the same one you would use in +the `token=` string in a GET request. + +## Listing your issued tokens via the API + +As mentioned in +[#3842](https://github.com/go-gitea/gitea/issues/3842#issuecomment-397743346), +`/users/:name/tokens` is special and requires you to authenticate +using BasicAuth, as follows: + +### Using basic authentication: + +``` +$ curl --request GET --url https://yourusername:yourpassword@gitea.your.host/api/v1/users/yourusername/tokens +[{"name":"test","sha1":"..."},{"name":"dev","sha1":"..."}] +``` From b8c2420ae283f6163826c3b8614db1e44b5c0ef0 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 25 Jun 2018 12:13:56 +0000 Subject: [PATCH 54/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index c6855090a..b0d098bad 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -430,6 +430,7 @@ access_token_deletion=Видалити токен доступу twofa_desc=Двофакторна автентифікація підвищує безпеку вашого облікового запису. twofa_is_enrolled=Ваш обліковий запис на даний час використовує двофакторну автентифікацію. +twofa_not_enrolled=Ваш обліковий запис наразі не використовує двофакторну автентифікаціїю. twofa_disable=Вимкнути двофакторну автентифікацію twofa_scratch_token_regenerate=Перестворити токен одноразового пароля twofa_enroll=Увімкнути двофакторну автентифікацію From 801843b0115e29ba2304fa6a5bea1ae169a58e02 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Tue, 26 Jun 2018 16:45:18 +0200 Subject: [PATCH 55/86] Fix open redirect vulnerability on login screen (#4312) * Fix open redirect vulnerability on login screen Signed-off-by: Jonas Franz * Reorder imports Signed-off-by: Jonas Franz * Replace www. from Domain too Signed-off-by: Jonas Franz --- modules/util/util.go | 13 +++++++++++++ modules/util/util_test.go | 35 +++++++++++++++++++++++++++++++++++ routers/user/auth.go | 3 ++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/modules/util/util.go b/modules/util/util.go index b6acb9796..5dcbe448f 100644 --- a/modules/util/util.go +++ b/modules/util/util.go @@ -10,6 +10,7 @@ import ( "strings" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) // OptionalBool a boolean that can be "null" @@ -78,6 +79,18 @@ func URLJoin(base string, elems ...string) string { return joinedURL } +// IsExternalURL checks if rawURL points to an external URL like http://example.com +func IsExternalURL(rawURL string) bool { + parsed, err := url.Parse(rawURL) + if err != nil { + return true + } + if len(parsed.Host) != 0 && strings.Replace(parsed.Host, "www.", "", 1) != strings.Replace(setting.Domain, "www.", "", 1) { + return true + } + return false +} + // Min min of two ints func Min(a, b int) int { if a > b { diff --git a/modules/util/util_test.go b/modules/util/util_test.go index 0d79df605..d9357ffa3 100644 --- a/modules/util/util_test.go +++ b/modules/util/util_test.go @@ -7,6 +7,8 @@ package util import ( "testing" + "code.gitea.io/gitea/modules/setting" + "github.com/stretchr/testify/assert" ) @@ -42,3 +44,36 @@ func TestURLJoin(t *testing.T) { assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...)) } } + +func TestIsExternalURL(t *testing.T) { + setting.Domain = "try.gitea.io" + type test struct { + Expected bool + RawURL string + } + newTest := func(expected bool, rawURL string) test { + return test{Expected: expected, RawURL: rawURL} + } + for _, test := range []test{ + newTest(false, + "https://try.gitea.io"), + newTest(true, + "https://example.com/"), + newTest(true, + "//example.com"), + newTest(true, + "http://example.com"), + newTest(false, + "a/"), + newTest(false, + "https://try.gitea.io/test?param=false"), + newTest(false, + "test?param=false"), + newTest(false, + "//try.gitea.io/test?param=false"), + newTest(false, + "/hey/hey/hey#3244"), + } { + assert.Equal(t, test.Expected, IsExternalURL(test.RawURL)) + } +} diff --git a/routers/user/auth.go b/routers/user/auth.go index 9a59f52db..317b4af3b 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -18,6 +18,7 @@ import ( "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/go-macaron/captcha" "github.com/markbates/goth" @@ -474,7 +475,7 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR return setting.AppSubURL + "/" } - if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 { + if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 && !util.IsExternalURL(redirectTo) { ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL) if obeyRedirect { ctx.RedirectToFirst(redirectTo) From a9ffbeb6791089b5ef04f5c1156f8b8cb0012d92 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 26 Jun 2018 14:46:26 +0000 Subject: [PATCH 56/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_lv-LV.ini | 5 +++-- options/locale/locale_pt-BR.ini | 2 ++ options/locale/locale_ru-RU.ini | 2 ++ options/locale/locale_uk-UA.ini | 11 ++++++++++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index c2274b99a..1b0129ba1 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -54,13 +54,14 @@ password=Parole db_name=Datu bāzes nosaukums path=Ceļš -repo_path=Repozitoriju glabāšanas vieta -log_root_path=Žurnalizēšanas direktorija +repo_path=Repozitoriju glabāšanas ceļš +log_root_path=Žurnalizēšanas ceļš optional_title=Neobligātie iestatījumi smtp_host=SMTP resursdators federated_avatar_lookup_popup=Iespējot apvienoto profila bilžu meklētāju, lai izmantotu atvērtā koda apvienoto servisu balstītu uz libravatar. openid_signin=Iespējot OpenID autorizāciju +openid_signin_popup=Iespējot lietotāju autorizāciju ar OpenID. enable_captcha_popup=Lietotājam reģistrējoties, pieprasīt ievadīt drošības kodu. admin_password=Parole confirm_password=Apstipriniet paroli diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 0df553778..f2ec96dd0 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=A branch '%s' está protegida. Ela não pode se topic.manage_topics=Gerenciar Tópicos topic.done=Feito +topic.count_prompt=Você não pode selecionar mais de 25 tópicos +topic.format_prompt=Tópicos devem começar com uma letra ou um número, podem incluir hífens (-) e não devem ter mais de 35 caracteres [org] org_name_holder=Nome da organização diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 008895181..9df7e4e16 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=Ветка '%s' защищена. Её нель topic.manage_topics=Редактировать тематические метки topic.done=Сохранить +topic.count_prompt=Вы не можете выбрать более 25 тем +topic.format_prompt=Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов [org] org_name_holder=Название организации diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index b0d098bad..8946d2894 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -40,6 +40,7 @@ u2f_unsupported_browser=Ваш браузер не підтримує U2F клю u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. u2f_error_2=Переконайтеся, що ви використовуєте зашифроване з'єднання (https://) та відвідуєте правильну URL-адресу. u2f_error_3=Сервер не може обробити, ваш запит. +u2f_error_4=Представлений ключ не дає право на цей запит. Якщо спробуєте зареєструвати його, переконайтеся, що ключ ще не зареєстровано. u2f_error_5=Таймаут досягнуто до того, як ваш ключ можна буде прочитати. Перезавантажте, щоб повторити спробу. u2f_reload=Оновити @@ -74,7 +75,7 @@ cancel=Відмінити [install] install=Встановлення title=Початкова конфігурація -docker_helper=Якщо ви запускаєте Gitea всередині Docker, будь ласка уважно прочитайте документацію перед тим, як що-небудь змінити на цій сторінці. +docker_helper=Якщо ви запускаєте Gitea всередині Docker, будь ласка уважно прочитайте документацію перед тим, як щось змінити на цій сторінці. requite_db_desc=Gitea потребує MySQL, PostgreSQL, MSSQL, SQLite3 або TiDB. db_title=Налаштування бази даних db_type=Тип бази даних @@ -593,6 +594,7 @@ commits.signed_by=Підписано commits.gpg_key_id=Ідентифікатор GPG ключа ext_issues=Зов. Проблеми +ext_issues.desc=Посилання на зовнішню систему відстеження проблем. issues.new=Нова проблема issues.new.labels=Мітки @@ -614,6 +616,7 @@ issues.new_label_desc_placeholder=Опис issues.create_label=Створити мітку issues.label_templates.title=Завантажити визначений набір міток issues.label_templates.helper=Оберіть набір міток +issues.label_templates.use=Використовувати набір міток issues.label_templates.fail_to_load_file=Не вдалося завантажити файл шаблона мітки '%s': %v issues.add_label_at=додав(ла) мітку
%s
%s issues.add_milestone_at=`додав(ла) до %s етапу %s` @@ -702,9 +705,11 @@ issues.start_tracking=Почати відстеження часу issues.start_tracking_history=`почав працювати %s` issues.tracking_already_started=`Ви вже почали відстежувати час для цієї проблеми!` issues.stop_tracking=Стоп +issues.stop_tracking_history=`перестав(-ла) працювати %s` issues.add_time=Вручну додати час issues.add_time_short=Додати час issues.add_time_cancel=Відмінити +issues.add_time_history=`додав(-ла) витрачений час %s` issues.add_time_hours=Години issues.add_time_minutes=Хвилини issues.add_time_sum_to_small=Час не введено. @@ -713,6 +718,8 @@ issues.cancel_tracking_history=`скасував відстеження часу issues.time_spent_total=Загальний витрачений час issues.time_spent_from_all_authors=`Загальний витрачений час: %s` issues.due_date=Дата завершення +issues.invalid_due_date_format=Дата закінчення має бути в форматі 'ррр-мм-дд'. +issues.error_modifying_due_date=Не вдалося змінити дату завершення. issues.due_date_form=рррр-мм-дд issues.due_date_form_add=Додати дату завершення issues.due_date_form_update=Оновити дату завершення @@ -768,6 +775,7 @@ milestones.filter_sort.most_issues=Найбільш проблем milestones.filter_sort.least_issues=Найменш проблем ext_wiki=Зов. Вікі +ext_wiki.desc=Посилання на зовнішню вікі. wiki=Вікі wiki.welcome=Ласкаво просимо до Вікі. @@ -817,6 +825,7 @@ activity.closed_issue_label=Закрито activity.new_issues_count_1=Нова Проблема activity.new_issues_count_n=%d Проблем activity.new_issue_label=Відкриті +activity.title.unresolved_conv_1=%d Незавершене обговорення activity.unresolved_conv_label=Відкрити activity.title.releases_1=%d Реліз activity.title.releases_n=%d Релізів From 91ff87c0e5caf9790cff7d2683b95a10250edcc2 Mon Sep 17 00:00:00 2001 From: Alexey Terentyev Date: Wed, 27 Jun 2018 08:23:10 +0300 Subject: [PATCH 57/86] Fixed violation of the unique constraint for v68 migration (#4297) --- models/migrations/v68.go | 147 ++++++++++++++++++++++++++------------- models/topic.go | 12 ++-- 2 files changed, 106 insertions(+), 53 deletions(-) diff --git a/models/migrations/v68.go b/models/migrations/v68.go index d6a0d04c5..e27b896c8 100644 --- a/models/migrations/v68.go +++ b/models/migrations/v68.go @@ -5,19 +5,47 @@ package migrations import ( + "fmt" + "regexp" "strings" - "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "github.com/go-xorm/xorm" ) +var topicPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9-]*$`) + +func validateTopic(topic string) bool { + return len(topic) <= 35 && topicPattern.MatchString(topic) +} + func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { log.Info("This migration could take up to minutes, please be patient.") + type Topic struct { - ID int64 - Name string `xorm:"unique"` + ID int64 + Name string `xorm:"UNIQUE"` + RepoCount int + CreatedUnix int64 `xorm:"INDEX created"` + UpdatedUnix int64 `xorm:"INDEX updated"` + } + + type RepoTopic struct { + RepoID int64 `xorm:"UNIQUE(s)"` + TopicID int64 `xorm:"UNIQUE(s)"` + } + + type Repository struct { + ID int64 `xorm:"pk autoincr"` + Topics []string `xorm:"TEXT JSON"` + } + + if err := x.Sync2(new(Topic)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + if err := x.Sync2(new(RepoTopic)); err != nil { + return fmt.Errorf("Sync2: %v", err) } sess := x.NewSession() @@ -25,79 +53,99 @@ func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { const batchSize = 100 touchedRepo := make(map[int64]struct{}) - topics := make([]*Topic, 0, batchSize) delTopicIDs := make([]int64, 0, batchSize) - ids := make([]int64, 0, 30) + log.Info("Validating existed topics...") if err := sess.Begin(); err != nil { return err } - log.Info("Validating existed topics...") for start := 0; ; start += batchSize { - topics = topics[:0] - if err := sess.Asc("id").Limit(batchSize, start).Find(&topics); err != nil { + topics := make([]*Topic, 0, batchSize) + if err := x.Cols("id", "name").Asc("id").Limit(batchSize, start).Find(&topics); err != nil { return err } if len(topics) == 0 { break } for _, topic := range topics { - if models.ValidateTopic(topic.Name) { + if validateTopic(topic.Name) { continue } + log.Info("Incorrect topic: id = %v, name = %q", topic.ID, topic.Name) + topic.Name = strings.Replace(strings.TrimSpace(strings.ToLower(topic.Name)), " ", "-", -1) + ids := make([]int64, 0, 30) if err := sess.Table("repo_topic").Cols("repo_id"). Where("topic_id = ?", topic.ID).Find(&ids); err != nil { return err } + log.Info("Touched repo ids: %v", ids) for _, id := range ids { touchedRepo[id] = struct{}{} } - if models.ValidateTopic(topic.Name) { - log.Info("Updating topic: id = %v, name = %v", topic.ID, topic.Name) - if _, err := sess.Table("topic").ID(topic.ID). - Update(&Topic{Name: topic.Name}); err != nil { + if validateTopic(topic.Name) { + unifiedTopic := Topic{Name: topic.Name} + exists, err := sess.Cols("id", "name").Get(&unifiedTopic) + log.Info("Exists topic with the name %q? %v, id = %v", topic.Name, exists, unifiedTopic.ID) + if err != nil { return err } - } else { - delTopicIDs = append(delTopicIDs, topic.ID) + if exists { + log.Info("Updating repo_topic rows with topic_id = %v to topic_id = %v", topic.ID, unifiedTopic.ID) + if _, err := sess.Where("topic_id = ? AND repo_id NOT IN "+ + "(SELECT rt1.repo_id FROM repo_topic rt1 INNER JOIN repo_topic rt2 "+ + "ON rt1.repo_id = rt2.repo_id WHERE rt1.topic_id = ? AND rt2.topic_id = ?)", + topic.ID, topic.ID, unifiedTopic.ID).Update(&RepoTopic{TopicID: unifiedTopic.ID}); err != nil { + return err + } + log.Info("Updating topic `repo_count` field") + if _, err := sess.Exec( + "UPDATE topic SET repo_count = (SELECT COUNT(*) FROM repo_topic WHERE topic_id = ? GROUP BY topic_id) WHERE id = ?", + unifiedTopic.ID, unifiedTopic.ID); err != nil { + return err + } + } else { + log.Info("Updating topic: id = %v, name = %q", topic.ID, topic.Name) + if _, err := sess.Table("topic").ID(topic.ID). + Update(&Topic{Name: topic.Name}); err != nil { + return err + } + continue + } } + delTopicIDs = append(delTopicIDs, topic.ID) } } + if err := sess.Commit(); err != nil { + return err + } + + sess.Init() log.Info("Deleting incorrect topics...") - for start := 0; ; start += batchSize { - if (start + batchSize) < len(delTopicIDs) { - ids = delTopicIDs[start:(start + batchSize)] - } else { - ids = delTopicIDs[start:] - } - - log.Info("Deleting 'repo_topic' rows for topics with ids = %v", ids) - if _, err := sess.In("topic_id", ids).Delete(&models.RepoTopic{}); err != nil { - return err - } - - log.Info("Deleting topics with id = %v", ids) - if _, err := sess.In("id", ids).Delete(&Topic{}); err != nil { - return err - } - - if len(ids) < batchSize { - break - } + if err := sess.Begin(); err != nil { + return err + } + log.Info("Deleting 'repo_topic' rows for topics with ids = %v", delTopicIDs) + if _, err := sess.In("topic_id", delTopicIDs).Delete(&RepoTopic{}); err != nil { + return err + } + log.Info("Deleting topics with id = %v", delTopicIDs) + if _, err := sess.In("id", delTopicIDs).Delete(&Topic{}); err != nil { + return err + } + if err := sess.Commit(); err != nil { + return err } - repoTopics := make([]*models.RepoTopic, 0, batchSize) - delRepoTopics := make([]*models.RepoTopic, 0, batchSize) - tmpRepoTopics := make([]*models.RepoTopic, 0, 30) + delRepoTopics := make([]*RepoTopic, 0, batchSize) log.Info("Checking the number of topics in the repositories...") for start := 0; ; start += batchSize { - repoTopics = repoTopics[:0] - if err := sess.Cols("repo_id").Asc("repo_id").Limit(batchSize, start). + repoTopics := make([]*RepoTopic, 0, batchSize) + if err := x.Cols("repo_id").Asc("repo_id").Limit(batchSize, start). GroupBy("repo_id").Having("COUNT(*) > 25").Find(&repoTopics); err != nil { return err } @@ -109,8 +157,8 @@ func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { for _, repoTopic := range repoTopics { touchedRepo[repoTopic.RepoID] = struct{}{} - tmpRepoTopics = tmpRepoTopics[:0] - if err := sess.Where("repo_id = ?", repoTopic.RepoID).Find(&tmpRepoTopics); err != nil { + tmpRepoTopics := make([]*RepoTopic, 0, 30) + if err := x.Where("repo_id = ?", repoTopic.RepoID).Find(&tmpRepoTopics); err != nil { return err } @@ -122,13 +170,18 @@ func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { } } + sess.Init() + log.Info("Deleting superfluous topics for repositories (more than 25 topics)...") + if err := sess.Begin(); err != nil { + return err + } for _, repoTopic := range delRepoTopics { log.Info("Deleting 'repo_topic' rows for 'repository' with id = %v. Topic id = %v", repoTopic.RepoID, repoTopic.TopicID) if _, err := sess.Where("repo_id = ? AND topic_id = ?", repoTopic.RepoID, - repoTopic.TopicID).Delete(&models.RepoTopic{}); err != nil { + repoTopic.TopicID).Delete(&RepoTopic{}); err != nil { return err } if _, err := sess.Exec( @@ -138,17 +191,17 @@ func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { } } - topicNames := make([]string, 0, 30) log.Info("Updating repositories 'topics' fields...") for repoID := range touchedRepo { + topicNames := make([]string, 0, 30) if err := sess.Table("topic").Cols("name"). - Join("INNER", "repo_topic", "topic.id = repo_topic.topic_id"). - Where("repo_topic.repo_id = ?", repoID).Find(&topicNames); err != nil { + Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id"). + Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil { return err } log.Info("Updating 'topics' field for repository with id = %v", repoID) if _, err := sess.ID(repoID).Cols("topics"). - Update(&models.Repository{Topics: topicNames}); err != nil { + Update(&Repository{Topics: topicNames}); err != nil { return err } } diff --git a/models/topic.go b/models/topic.go index 247aac5ff..678795a3d 100644 --- a/models/topic.go +++ b/models/topic.go @@ -26,7 +26,7 @@ var topicPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9-]*$`) // Topic represents a topic of repositories type Topic struct { ID int64 - Name string `xorm:"unique"` + Name string `xorm:"UNIQUE"` RepoCount int CreatedUnix util.TimeStamp `xorm:"INDEX created"` UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` @@ -34,8 +34,8 @@ type Topic struct { // RepoTopic represents associated repositories and topics type RepoTopic struct { - RepoID int64 `xorm:"unique(s)"` - TopicID int64 `xorm:"unique(s)"` + RepoID int64 `xorm:"UNIQUE(s)"` + TopicID int64 `xorm:"UNIQUE(s)"` } // ErrTopicNotExist represents an error that a topic is not exist @@ -190,10 +190,10 @@ func SaveTopics(repoID int64, topicNames ...string) error { } } - topicNames = topicNames[:0] + topicNames = make([]string, 0, 25) if err := sess.Table("topic").Cols("name"). - Join("INNER", "repo_topic", "topic.id = repo_topic.topic_id"). - Where("repo_topic.repo_id = ?", repoID).Find(&topicNames); err != nil { + Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id"). + Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil { return err } From a711d41f54dc4c57f5f314ef99fe79bf0105c1b8 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 27 Jun 2018 05:25:28 +0000 Subject: [PATCH 58/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 8946d2894..14d6335d8 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -1,4 +1,4 @@ -app_desc=Зручний сервіс, власного Git хостінгу +app_desc=Зручний сервіс, власного Git хостингу home=Головна dashboard=Панель управління @@ -146,6 +146,7 @@ confirm_password=Підтвердження пароля admin_email=Адреса електронної пошти install_btn_confirm=Встановлення Gitea test_git_failed=Не в змозі перевірити 'git' команду: %v +sqlite3_not_available=Ця версія Gitea не підтримує SQLite3. Будь ласка, завантажте офіційну бінарну версію з %s (не версію gobuild). invalid_db_setting=Налаштування бази даних є некоректними: %v invalid_repo_path=Помилковий шлях до кореня репозиторію: %v save_config_failed=Не в змозі зберегти конфігурацію: %v @@ -295,6 +296,8 @@ unable_verify_ssh_key=Не вдається підтвердити ключ SSH; auth_failed=Помилка автентифікації: %v still_own_repo=Ваш обліковий запис володіє одним або декількома репозиторіями; видаліть або перенесіть їх в першу чергу. +still_has_org=Ваш обліковий запис є учасником однієї чи декількох організацій; вийдіть з них в першу чергу. +org_still_own_repo=Ця організація як і раніше володіє одним або декількома репозиторіями; спочатку видаліть або перенесіть їх. target_branch_not_exist=Цільової гілки не існує. @@ -368,6 +371,7 @@ primary=Основний primary_email=Зробити основним delete_email=Видалити email_deletion=Видалити адресу електронної пошти +email_deletion_success=Адресу електронної пошти було видалено. openid_deletion=Видалити адресу OpenID openid_deletion_success=Адреса OpenID була видалена. add_new_email=Додати нову адресу електронної пошти @@ -401,6 +405,7 @@ add_gpg_key_success=GPG ключ '%s' додано. delete_key=Видалити ssh_key_deletion=Видалити SSH ключ gpg_key_deletion=Видалити GPG ключ +ssh_key_deletion_desc=Видалення ключа SSH скасовує доступ до вашого облікового запису. Продовжити? gpg_key_deletion_desc=Видалення GPG ключа скасовує перевірку підписаних ним комітів. Продовжити? ssh_key_deletion_success=SSH було видалено. gpg_key_deletion_success=GPG було видалено. @@ -624,6 +629,7 @@ issues.deleted_milestone=`(видалено)` issues.add_assignee_at=`був призначений %s %s` issues.remove_assignee_at=`видалили із призначених %s` issues.change_title_at=`змінив(ла) заголовок з %s на %s %s` +issues.delete_branch_at=`видалена гілка %s %s` issues.open_tab=%d відкрито issues.close_tab=%d закрито issues.filter_label=Мітка From e87c540a87602682d49f1b10bfa91cbebe0fc9b6 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Wed, 27 Jun 2018 03:06:39 -0400 Subject: [PATCH 59/86] Backport 1.4.3 changelog to master branch (#4323) --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 373ce00e6..b31730a09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). +## [1.4.3](https://github.com/go-gitea/gitea/releases/tag/v1.4.3) - 2018-06-26 +* SECURITY + * HTML-escape plain-text READMEs (#4192) (#4214) + * Fix open redirect vulnerability on login screen (#4312) (#4312) +* BUGFIXES + * Fix broken monitoring page when running processes are shown (#4203) (#4208) + * Fix delete comment bug (#4216) (#4228) + * Delete reactions added to issues and comments when deleting repository (#4232) (#4237) + * Fix wiki URL encoding bug (#4091) (#4254) + * Fix code tab link when viewing tags (#3908) (#4263) + * Fix webhook type conflation (#4285) (#4285) + ## [1.4.2](https://github.com/go-gitea/gitea/releases/tag/v1.4.2) - 2018-06-04 * BUGFIXES * Adjust z-index for floating labels (#3939) (#3950) From 4ee52b716144b9d0eef4564dda4d22840897c09b Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sat, 30 Jun 2018 13:13:17 -0400 Subject: [PATCH 60/86] Add scope to Gitlab oauth request (#4330) Fix #3449 --- modules/auth/oauth2/oauth2.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/auth/oauth2/oauth2.go b/modules/auth/oauth2/oauth2.go index 89286a1bd..de125c619 100644 --- a/modules/auth/oauth2/oauth2.go +++ b/modules/auth/oauth2/oauth2.go @@ -163,7 +163,7 @@ func createProvider(providerName, providerType, clientID, clientSecret, openIDCo profileURL = customURLMapping.ProfileURL } } - provider = gitlab.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL) + provider = gitlab.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL, "read_user") case "gplus": provider = gplus.New(clientID, clientSecret, callbackURL, "email") case "openidConnect": From e8a17e4558707a33fed8b975f4c43bbe435c4349 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sat, 30 Jun 2018 17:14:19 +0000 Subject: [PATCH 61/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_bg-BG.ini | 72 ++++ options/locale/locale_de-DE.ini | 98 ++--- options/locale/locale_es-ES.ini | 96 ++++- options/locale/locale_fi-FI.ini | 101 +++++ options/locale/locale_fr-FR.ini | 699 +++++++++++++++++++++++++++++++- options/locale/locale_id-ID.ini | 109 +++++ options/locale/locale_it-IT.ini | 16 +- options/locale/locale_ja-JP.ini | 2 + options/locale/locale_lv-LV.ini | 673 ++++++++++++++++++++++++++++++ options/locale/locale_nb-NO.ini | 6 + options/locale/locale_nl-NL.ini | 45 ++ options/locale/locale_pl-PL.ini | 152 +++++++ options/locale/locale_uk-UA.ini | 215 +++++++++- options/locale/locale_zh-CN.ini | 2 + options/locale/locale_zh-TW.ini | 476 ++++++++++++++++++++++ 15 files changed, 2697 insertions(+), 65 deletions(-) diff --git a/options/locale/locale_bg-BG.ini b/options/locale/locale_bg-BG.ini index f0d6b1c0a..99aa173e1 100644 --- a/options/locale/locale_bg-BG.ini +++ b/options/locale/locale_bg-BG.ini @@ -11,6 +11,7 @@ version=Версия page=Страница template=Шаблон language=Език +notifications=Известия signed_in_as=Вписан като username=Потребител @@ -28,6 +29,9 @@ manage_org=Управление на организации account_settings=Настройки на профила settings=Настройки +all=Всичко +sources=Източници +mirrors=Огледала activities=Активности pull_requests=Заявки за сливане @@ -69,7 +73,9 @@ issues.in_your_repos=Във Вашите хранилища [explore] repos=Хранилища users=Потребители +organizations=Организации search=Търсене +code=Код [auth] register_helper_msg=Вече имате профил? Впишете се сега! @@ -79,11 +85,14 @@ has_unconfirmed_mail=Здравейте %s, имате непотвърден а resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение reset_password=Нулиране на паролата reset_password_helper=Щракнете тук, за да нулирате паролата си +openid_connect_submit=Свързване [mail] activate_account=Моля активирайте Вашия профил activate_email=Провери адрес на ел. поща reset_password=Нулиране на паролата +register_success=Успешна регистрация +register_notify=Добре дошли в Gitea [modal] yes=Да @@ -117,6 +126,7 @@ url_error=` не е валиден URL адрес.` include_error=` трябва да съдържа текст '%s'.` unknown_error=Неизвестна грешка: +user_not_exist=Потребителят не съществува. auth_failed=Неуспешно удостоверяване: %v @@ -136,9 +146,11 @@ unfollow=Не следвай [settings] profile=Профил password=Парола +security=Сигурност avatar=Аватар social=Социални профили delete=Изтрий профил +twofa=Двуфакторно удостоверяване uid=UID public_profile=Публичен профил @@ -169,6 +181,8 @@ key_content=Съдържание add_on=Добавен на last_used=Последно използван на no_activity=Няма скорошна дейност +show_openid=Показване в профила +hide_openid=Скриване от профила manage_social=Управление на свързани профили в социалните мрежи @@ -239,6 +253,7 @@ file_view_raw=Виж директен файл file_permalink=Постоянна връзка editor.preview_changes=Преглед на промени +editor.name_your_file=Име на файла ви… editor.or=или editor.commit_changes=Промени в ревизия editor.add_tmpl=Добави '%s/' @@ -247,6 +262,7 @@ editor.update=Модифицирай '%s' editor.delete=Изтрий '%s' editor.commit_directly_to_this_branch=Запази ревизия директно в клон %s. editor.create_new_branch=Създай нов клон от тази ревизия и изпрати заявки за сливане. +editor.new_branch_name_desc=Име на новия клон… editor.cancel=Отказ editor.branch_already_exists=Клон '%s' вече съществува в това хранилище. editor.no_changes_to_show=Няма промени. @@ -255,6 +271,7 @@ editor.unable_to_upload_files=Невъзможно качване на файл editor.upload_files_to_dir=Качи файлове в '%s' commits.commits=Ревизии +commits.find=Търсене commits.author=Автор commits.message=Съобщение commits.date=Дата @@ -277,6 +294,7 @@ issues.create_label=Създай етикет issues.label_templates.title=Зареждане на предварително зададен набор от етикети issues.label_templates.helper=Изберете набор етикети issues.label_templates.fail_to_load_file=Неуспешно зареждане на шаблон с етикети '%s': %v +issues.deleted_milestone=`(изтрито)` issues.open_tab=%d отворени issues.close_tab=%d затворени issues.filter_label=Етикет @@ -294,6 +312,11 @@ issues.filter_sort.recentupdate=Последно променени issues.filter_sort.leastupdate=Отдавна променени issues.filter_sort.mostcomment=Най-много коментирани issues.filter_sort.leastcomment=Най-малко коментирани +issues.action_open=Отваряне +issues.action_close=Затваряне +issues.action_label=Етикет +issues.action_milestone=Етап +issues.action_milestone_no_select=Няма етап issues.opened_by=отворен %[1]s от %[3]s issues.opened_by_fake=отворен %[1]s от %[2]s issues.previous=Предишна @@ -323,9 +346,17 @@ issues.label_count=%d етикети issues.label_open_issues=%d отворени задачи issues.label_edit=Редакция issues.label_delete=Изтрий +issues.label.filter_sort.alphabetically=По азбучен ред +issues.label.filter_sort.by_size=Големина issues.num_participants=%d участника issues.attachment.open_tab=`Щракнете за да прегледате "%s" в нов раздел` issues.attachment.download=`Щракнете за да изтеглите "%s"` +issues.start_tracking_short=Начало +issues.stop_tracking=Спиране +issues.add_time_cancel=Отказ +issues.add_time_hours=Часа +issues.add_time_minutes=Минути +issues.cancel_tracking=Отказ pulls.new=Нова заявка за сливане pulls.filter_branch=Филтър по клон @@ -367,7 +398,19 @@ wiki.page_already_exists=Страница със същото име вече с wiki.pages=Страници wiki.last_updated=Последна модификация на %s +activity.period.filter_label=Период: +activity.period.daily=1 ден +activity.period.halfweekly=3 дни +activity.period.weekly=1 седмица +activity.period.monthly=1 месец +activity.title.user_1=%d потребител +activity.title.user_n=%d потребителя +activity.closed_issue_label=Затворено +activity.new_issue_label=Отворено +activity.unresolved_conv_label=Отваряне +activity.published_release_label=Публикувано +search=Търсене settings=Настройки settings.collaboration.write=За писане @@ -389,6 +432,7 @@ settings.transfer=Прехвърли притежание settings.delete=Изтрий това хранилище settings.delete_notices_1=- Тази операция НЕ МОЖЕ да бъде отменена в последствие. settings.transfer_owner=Нов притежател +settings.search_user_placeholder=Търсене на потребител… settings.add_webhook=Добави уеб-кука settings.webhook.test_delivery=Тестово изпращане settings.webhook.request=Заявка @@ -402,6 +446,8 @@ settings.update_githook=Запази куката settings.secret=Тайна settings.slack_username=Потребителско име settings.slack_icon_url=URL адрес на икона +settings.discord_username=Потребителско име +settings.discord_icon_url=URL адрес на икона settings.slack_color=Цвят settings.event_create=Създаване settings.event_pull_request=Заявка за сливане @@ -416,6 +462,11 @@ settings.deploy_keys=Ключове за внедряване settings.add_deploy_key=Добави ключ за внедряване settings.title=Заглавие settings.deploy_key_content=Съдържание +settings.branches=Клонове +settings.protected_branch=Защита на клона +settings.add_protected_branch=Включване на защита +settings.delete_protected_branch=Изключване на защита +settings.choose_branch=Изберете клон… diff.browse_source=Преглед на файлове diff.parent=родител @@ -424,6 +475,7 @@ diff.show_diff_stats=Покажи статистика за разликите diff.show_split_view=Разделен изглед diff.show_unified_view=Обединен изглед diff.stats_desc=променени са %d файла, в които са добавени %d реда и са изтрити %d реда +diff.bin=Двоични данни diff.view_file=Целия файл diff.file_suppressed=Файловите разлики са ограничени, защото са твърде много diff.too_many_files=Някои файлове не бяха показани, защото твърде много файлове са промени @@ -442,11 +494,17 @@ release.title=Заглавие release.content=Съдържание release.write=Редактор release.preview=Преглед +release.loading=Зарежда се… release.cancel=Отказ release.publish=Публикувай версия release.save_draft=Запис на чернова release.downloads=Изтегляния +branch.search=Търсене на клонове +branch.delete_head=Изтриване +branch.delete_html=Изтриване на клон +branch.create_from=от '%s' +branch.deleted_by=Изтрито от %s [org] @@ -458,6 +516,8 @@ people=Участници teams=Екипи lower_members=участници lower_repositories=хранилища +create_new_team=Нов отбор +create_team=Създаване на отбор org_desc=Описание team_name=Име на екипа team_desc=Описание @@ -546,6 +606,7 @@ users.edit=Редакция users.auth_source=Начин на удостоверяване users.local=Локално +orgs.org_manage_panel=Управление на организацията orgs.name=Име orgs.teams=Екипи orgs.members=Участници @@ -556,6 +617,7 @@ repos.private=Частно repos.watches=Наблюдавания repos.stars=Харесвания repos.issues=Задачи +repos.size=Големина auths.name=Име auths.type=Тип @@ -580,12 +642,15 @@ auths.allowed_domains=Разрешени домейни auths.enable_tls=Включи TLS криптиране auths.skip_tls_verify=Пропусни проверка на TLS сертификат auths.pam_service_name=Име на PAM услуга +auths.oauth2_profileURL=URL адрес на профила +auths.oauth2_emailURL=Имейл адрес auths.enable_auto_register=Включи автоматична регистрация auths.tips=Съвети config.server_config=Сървърни настройки config.disable_router_log=Изключи журнал на маршрутизатора config.run_mode=Режим на изпълнение +config.git_version=Версия на Git config.repo_root_path=Основен път към хранилища config.static_file_root_path=Път към статични файлове config.script_type=Тип на скрипта @@ -700,6 +765,7 @@ push_tag=предаде маркер %[2]s към '-Format ein. +smtp_from_helper=E-Mail-Adresse, die von Gitea genutzt werden soll. Bitte gib die E-Mail-Adresse im Format „"Name" “ ein. mailer_user=SMTP-Benutzername mailer_password=SMTP-Passwort register_confirm=E-Mail-Bestätigung benötigt zum Registrieren @@ -146,7 +146,7 @@ admin_password=Passwort confirm_password=Passwort bestätigen admin_email=E-Mail-Adresse install_btn_confirm=Gitea installieren -test_git_failed=Fehler beim Test des 'git' Kommandos: %v +test_git_failed=Fehler beim Test des „git“-Befehls: %v sqlite3_not_available=Diese Gitea-Version unterstützt SQLite3 nicht. Bitte lade die offizielle binäre Version von %s herunter (nicht die „gobuild“-Version). invalid_db_setting=Datenbankeinstellungen sind ungültig: %v invalid_repo_path=Repository-Verzeichnis ist ungültig: %v @@ -188,7 +188,7 @@ repo_no_results=Keine passenden Repositories gefunden. user_no_results=Keine passenden Benutzer gefunden. org_no_results=Keine passenden Organisatioen gefunden. code_no_results=Es konnte kein passender Code für deinen Suchbegriff gefunden werden. -code_search_results=Suchergebnisse für '%s' +code_search_results=Suchergebnisse für „%s“ [auth] create_new_account=Konto anlegen @@ -254,12 +254,12 @@ HttpsUrl=HTTPS-URL PayloadUrl=Payload-URL TeamName=Teamname AuthName=Name der Autorisierung -AdminEmail=Administrator E-Mail +AdminEmail=Administrator-E-Mail -NewBranchName=Neuer Branch Name -CommitSummary=Commit Zusammenfassung -CommitMessage=Commit Nachricht -CommitChoice=Commit Auswahl +NewBranchName=Neuer Branchname +CommitSummary=Commit-Zusammenfassung +CommitMessage=Commit-Nachricht +CommitChoice=Commit-Auswahl TreeName=Dateipfad Content=Inhalt @@ -272,7 +272,7 @@ min_size_error=` muss mindestens %s Zeichen enthalten.` max_size_error=` darf höchstens %s Zeichen enthalten.` email_error=` ist keine gültige E-Mail-Adresse.` url_error=` ist keine gültige URL.` -include_error=` muss den Text '%s' enthalten.` +include_error=` muss den Text „%s“ enthalten.` unknown_error=Unbekannter Fehler: captcha_incorrect=Der eingegebene CAPTCHA-Code ist falsch. password_not_match=Die Passwörter stimmen nicht überein. @@ -314,8 +314,8 @@ following=Folge ich follow=Folgen unfollow=Nicht mehr folgen -form.name_reserved=Der Benutzername '%s' ist reserviert. -form.name_pattern_not_allowed='%s' ist nicht erlaubt für Benutzernamen. +form.name_reserved=Der Benutzername „%s“ ist reserviert. +form.name_pattern_not_allowed=Das Muster „%s“ ist nicht in einem Benutzernamen erlaubt. [settings] profile=Profil @@ -323,7 +323,7 @@ account=Account password=Passwort security=Sicherheit avatar=Profilbild -ssh_gpg_keys=SSH / GPG Schlüssel +ssh_gpg_keys=SSH- / GPG-Schlüssel social=Soziale Konten applications=Anwendungen orgs=Organisationen verwalten @@ -402,7 +402,7 @@ add_new_gpg_key=GPG-Schlüssel hinzufügen ssh_key_been_used=Dieser SSH-Key wurde bereits zu deinem Account hinzugefügt. ssh_key_name_used=Ein gleichnamiger SSH-Key existiert bereits in deinem Account. gpg_key_id_used=Ein öffentlicher GPG-Schlüssel mit der gleichen ID existiert bereits. -gpg_no_key_email_found=Dieser GPG Schlüssel kann mit keiner E-Mail-Adresse deines Accounts verwendet werden. +gpg_no_key_email_found=Dieser GPG-Schlüssel kann mit keiner E-Mail-Adresse deines Kontos verwendet werden. subkeys=Unterschlüssel key_id=Schlüssel-ID key_name=Schlüsselname @@ -463,7 +463,7 @@ then_enter_passcode=Und gebe dann die angezeigte PIN der Anwendung ein: passcode_invalid=Die PIN ist falsch. Probiere es erneut. twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre dein Einmalpasswort (%s) an einem sicheren Ort auf, da es nicht wieder angezeigt werden wird. -u2f_desc=Hardware-Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den FIDO U2F-Standard unterstützen. +u2f_desc=Hardware-Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard FIDO U2F unterstützen. u2f_require_twofa=Du musst die Zwei-Faktor-Authentifizierung aktivieren, um Hardware-Sicherheitsschlüssel nutzen zu können. u2f_register_key=Sicherheitsschlüssel hinzufügen u2f_nickname=Nickname @@ -482,7 +482,7 @@ orgs_none=Du bist kein Mitglied in einer Organisation. repos_none=Du besitzt keine Repositories delete_account=Konto löschen -delete_prompt=Wenn du fortfährst wird dein Account permanent gelöscht. Dies KANN NICHT rückgängig gemacht werden. +delete_prompt=Wenn du fortfährst, wird dein Account permanent gelöscht. Dies KANN NICHT rückgängig gemacht werden. confirm_delete_account=Löschen bestätigen delete_account_title=Benutzerkonto löschen delete_account_desc=Bist du sicher, dass du diesen Account dauerhaft löschen möchtest? @@ -531,7 +531,7 @@ migrate_type=Migrationstyp migrate_type_helper=Dieses Repository wird ein Mirror sein migrate_repo=Repository migrieren migrate.clone_address=Migrations- / Klon-URL -migrate.clone_address_desc=Die HTTP(s) oder Klon-URL eines bereits existierenden Repositories +migrate.clone_address_desc=Die HTTP(S)- oder „git clone“-URL eines bereits existierenden Repositorys migrate.clone_local_path=oder ein lokaler Serverpfad migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositories. migrate.invalid_local_path=Der lokale Pfad ist ungültig, existiert nicht oder ist kein Ordner. @@ -608,7 +608,7 @@ editor.create_new_branch=Einen neuen Branch für diesen Commit editor.new_branch_name_desc=Neuer Branchname… editor.cancel=Abbrechen editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein. -editor.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. +editor.branch_already_exists=Branch „%s“ existiert bereits in diesem Repository. editor.directory_is_a_file=Der Verzeichnisname „%s“ wird bereits als Dateiname in diesem Repository verwendet. editor.file_is_a_symlink='%s' ist ein symolischer Link. Symbolische Links können mit dem Web Editor nicht bearbeitet werden. editor.filename_is_a_directory=Der Dateiname „%s“ wird bereits als Verzeichnisname in diesem Repository verwendet. @@ -616,10 +616,10 @@ editor.file_editing_no_longer_exists=Die bearbeitete Datei „%s“ existiert ni editor.file_changed_while_editing=Der Inhalt der Datei hat sich seit dem Beginn der Bearbeitung geändert. Hier klicken, um die Änderungen anzusehen, oder Änderungen erneut comitten, um sie zu überschreiben. editor.file_already_exists=Eine Datei mit dem Namen „%s“ ist bereits in diesem Repository vorhanden. editor.no_changes_to_show=Keine Änderungen vorhanden. -editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v +editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei „%s“. Fehler: %v editor.add_subdir=Verzeichnis erstellen… editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach „%s“. Fehler: %v -editor.upload_files_to_dir=Dateien hochladen nach '%s' +editor.upload_files_to_dir=Dateien hochladen nach „%s“ editor.cannot_commit_to_protected_branch=Commit in den geschützten Branch „%s“ ist nicht möglich. commits.desc=Durchsuche die Quellcode-Änderungshistorie. @@ -639,10 +639,10 @@ ext_issues=Externe Issues ext_issues.desc=Link zu externem Issuetracker. issues.desc=Verwalte Bug-Reports, Aufgaben und Meilensteine. -issues.new=Neuer Issue +issues.new=Neues Issue issues.new.labels=Label issues.new.no_label=Kein Label -issues.new.clear_labels=Labels entfernen +issues.new.clear_labels=Label entfernen issues.new.milestone=Meilenstein issues.new.no_milestone=Kein Meilenstein issues.new.clear_milestone=Meilenstein entfernen @@ -659,9 +659,9 @@ issues.new_label_desc_placeholder=Beschreibung issues.create_label=Label erstellen issues.label_templates.title=Lade vordefinierte Label issues.label_templates.info=Es existieren noch keine Label. Erstelle ein neues Label („Neues Label“) oder verwende das Standard-Label-Set: -issues.label_templates.helper=Wähle ein Label +issues.label_templates.helper=Wähle ein Label-Set issues.label_templates.use=Label-Set verwenden -issues.label_templates.fail_to_load_file=Fehler beim Laden der Label Template Datei '%s': %v +issues.label_templates.fail_to_load_file=Fehler beim Laden der Label-Vorlagendatei „%s“: %v issues.add_label_at=hat das
%s
-Label %s hinzugefügt issues.remove_label_at=hat das
%s
-Label %s entfernt issues.add_milestone_at=`hat diesen Issue %[2]s zum %[1]s Meilenstein hinzugefügt` @@ -745,8 +745,8 @@ issues.label.filter_sort.reverse_alphabetically=Umgekehrt alphabetisch issues.label.filter_sort.by_size=Kleinste zuerst issues.label.filter_sort.reverse_by_size=Größte zuerst issues.num_participants=%d Beteiligte -issues.attachment.open_tab=`Klicken um "%s" in einem neuen Tab zu öffnen` -issues.attachment.download=`Klicken um "%s" herunterzuladen` +issues.attachment.open_tab=`Klicken, um „%s“ in einem neuen Tab zu öffnen` +issues.attachment.download=`Klicken, um „%s“ herunterzuladen` issues.subscribe=Abonnieren issues.unsubscribe=Abbestellen issues.tracker=Zeiterfassung @@ -914,7 +914,7 @@ search.search_repo=Repository durchsuchen search.results=Suchergebnisse für „%s“ in %s settings=Einstellungen -settings.desc=In den Einstellungen kannst du die Einstellungen des Repository anpassen +settings.desc=In den Einstellungen kannst du die Einstellungen des Repositorys anpassen settings.options=Repository settings.collaboration=Mitarbeiter settings.collaboration.admin=Administrator @@ -924,7 +924,7 @@ settings.collaboration.undefined=Nicht definiert settings.hooks=Webhooks settings.githooks=Git-Hooks settings.basic_settings=Grundeinstellungen -settings.mirror_settings=Mirror Einstellungen +settings.mirror_settings=Mirror-Einstellungen settings.sync_mirror=Jetzt synchronisieren settings.mirror_sync_in_progress=Mirror-Synchronisierung wird zurzeit ausgeführt. Komm in ein paar Minuten zurück. settings.site=Webseite @@ -933,13 +933,13 @@ settings.advanced_settings=Erweiterte Einstellungen settings.wiki_desc=Repository-Wiki aktivieren settings.use_internal_wiki=Eingebautes Wiki verwenden settings.use_external_wiki=Externes Wiki verwenden -settings.external_wiki_url=Externe Wiki URL +settings.external_wiki_url=Externe Wiki-URL settings.external_wiki_url_error=Die externe Wiki-URL ist ungültig. settings.external_wiki_url_desc=Besucher werden auf die externe Wiki-URL weitergeleitet, wenn sie auf das Wiki-Tab klicken. settings.issues_desc=Repository-Issue-Tracker aktivieren settings.use_internal_issue_tracker=Integrierten Issue-Tracker verwenden settings.use_external_issue_tracker=Externen Issue-Tracker verwenden -settings.external_tracker_url=URL eines externen Issue Trackers +settings.external_tracker_url=URL eines externen Issue-Trackers settings.external_tracker_url_error=Die URL des externen Issue-Trackers ist ungültig. settings.external_tracker_url_desc=Besucher werden auf die externe Issue-Tracker-URL weitergeleitet, wenn sie auf das Issues-Tab klicken. settings.tracker_url_format=URL-Format des externen Issue-Systems @@ -975,7 +975,7 @@ settings.confirm_wiki_delete=Wiki-Daten löschen settings.wiki_deletion_success=Repository-Wiki-Daten wurden gelöscht. settings.delete=Dieses Repository löschen settings.delete_desc=Wenn dieses Repository gelöscht wurde, gibt es keinen Weg zurück. Bitte sei vorsichtig. -settings.delete_notices_1=- Diese Operation kann NICHT rückgängig gemacht werden. +settings.delete_notices_1=– Diese Operation KANN NICHT rückgängig gemacht werden. settings.delete_notices_2=– Die Operation wird das %s-Repository dauerhaft löschen, inklusive der Dateien, Issues, Kommentare und Zugriffseinstellungen. settings.delete_notices_fork_1=– Forks dieses Repositorys werden nach dem Löschen unabhängig. settings.deletion_success=Das Repository wurde gelöscht. @@ -1049,7 +1049,7 @@ settings.update_webhook=Webhook aktualisieren settings.update_hook_success=Webhook wurde aktualisiert. settings.delete_webhook=Webhook entfernen settings.recent_deliveries=Letzte Zustellungen -settings.hook_type=Hook Typ +settings.hook_type=Hook-Typ settings.add_slack_hook_desc=Slack-Integration zu deinem Repository hinzufügen. settings.slack_token=Token settings.slack_domain=Domain @@ -1077,7 +1077,7 @@ settings.protected_branch_can_push_yes=Du kannst pushen settings.protected_branch_can_push_no=Du kannst nicht pushen settings.branch_protection=Branch-Schutz für Branch „%s“ settings.protect_this_branch=Brach-Schutz aktivieren -settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere das sog. „force pushing” von Git auf diesen Branch. +settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere das „force pushing” von Git auf diesen Branch. settings.protect_whitelist_committers=Push-Whitelist aktivieren settings.protect_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Push-Beschränkungen zu umgehen. settings.protect_whitelist_users=Nutzer, die pushen dürfen: @@ -1155,9 +1155,9 @@ branch.deletion_success=Branch „%s“ wurde gelöscht. branch.deletion_failed=Branch „%s“ konnte nicht gelöscht werden. branch.delete_branch_has_new_commits=Der Branch „%s“ kann nicht gelöscht weden, da seit dem letzten Merge neue Commits hinzugefügt wurden. branch.create_branch=Erstelle Branch %s -branch.create_from=von '%s' +branch.create_from=von „%s“ branch.create_success=Branch „%s“ wurde erstellt. -branch.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. +branch.branch_already_exists=Branch „%s“ existiert bereits in diesem Repository. branch.branch_name_conflict=Der Branch-Name „%s“ steht in Konflikt mit dem bestehenden Branch „%s“. branch.tag_collision=Branch „%s“ kann nicht erstellt werden, da in diesem Repository bereits ein Tag mit dem selben Namen existiert. branch.deleted_by=Von %s gelöscht @@ -1206,7 +1206,7 @@ settings.update_avatar_success=Der Organisationsavatar wurde aktualisiert. settings.delete=Organisation löschen settings.delete_account=Diese Organisation löschen settings.delete_prompt=Die Organisation wird dauerhaft gelöscht. Dies KANN NICHT rückgängig gemacht werden! -settings.confirm_delete_account=Löschen +settings.confirm_delete_account=Löschen bestätigen settings.delete_org_title=Organisation löschen settings.delete_org_desc=Diese Organisation wird dauerhaft gelöscht. Fortfahren? settings.hooks_desc=Webhooks hinzufügen, die für alle Repositories dieser Organisation ausgelöst werden. @@ -1267,7 +1267,7 @@ total=Gesamt: %d dashboard.statistic=Übersicht dashboard.operations=Wartungsoperationen dashboard.system_status=System-Status -dashboard.statistic_info=Gitea's Datenbank hat %d Benutzer, %d Organisationen, %d öffentliche Schlüssel, %d Repositories, %d Beobachtungen, %d Favoriten, %d Aktionen, %d Zugriffe, %d Issues, %d Kommentare, %d Konten sozialer Netzwerke, %d Gefolgte, %d Mirrors, %d Releases, %d Login-Quellen, %d Webhooks, %d Meilensteine, %d Label, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. +dashboard.statistic_info=Giteas Datenbank hat %d Benutzer, %d Organisationen, %d öffentliche Schlüssel, %d Repositorys, %d Beobachtungen, %d Favoriten, %d Aktionen, %d Zugriffe, %d Issues, %d Kommentare, %d Konten sozialer Netzwerke, %d Gefolgte, %d Mirrors, %d Releases, %d Login-Quellen, %d Webhooks, %d Meilensteine, %d Label, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. dashboard.operation_name=Name der Operation dashboard.operation_switch=Wechseln dashboard.operation_run=Ausführen @@ -1283,7 +1283,7 @@ dashboard.git_gc_repos=Garbage-Collection auf Repositories ausführen dashboard.git_gc_repos_success=Alle Repositories haben Garbage-Collection beendet. dashboard.resync_all_sshkeys=„.ssh/authorized_keys“-Datei mit Gitea-SSH-Keys neu schreiben. (Wenn Du den eingebauten SSH-Server nutzt, musst du das nicht ausführen.) dashboard.resync_all_sshkeys_success=Alle von Gitea verwalteten öffentlichen Schlüssel wurden neu geschrieben. -dashboard.resync_all_hooks=Synchronisiere „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositorys erneut. +dashboard.resync_all_hooks=Synchronisiere „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositories erneut. dashboard.resync_all_hooks_success=Alle „pre-receive“-, „update“- und „post-receive“-Repository-Hooks wurden erneut synchronisiert. dashboard.reinit_missing_repos=Alle Git-Repositories mit Einträgen neu einlesen dashboard.reinit_missing_repos_success=Alle verlorenen Git-Repositories mit existierenden Einträgen wurden erfolgreich aktualisiert. @@ -1331,13 +1331,13 @@ users.created=Registriert am users.last_login=Letzte Anmeldung users.never_login=Hat sich noch nie eingeloggt users.send_register_notify=Benutzer-Registrierungsbenachrichtigung senden -users.new_success=Der Account '%s' wurde erstellt. +users.new_success=Der Account „%s“ wurde erstellt. users.edit=Bearbeiten users.auth_source=Authentifizierungsquelle users.local=Lokal users.auth_login_name=Anmeldename zur Authentifizierung users.password_helper=Passwort leerlassen, um es nicht zu verändern. -users.update_profile_success=Der Account '%s' wurde aktualisiert. +users.update_profile_success=Der Account „%s“ wurde aktualisiert. users.edit_account=Benutzerkonto bearbeiten users.max_repo_creation=Maximale Anzahl Repositories users.max_repo_creation_desc=(Gib -1 ein, um das globale Standardlimit zu verwenden.) @@ -1384,7 +1384,7 @@ auths.host=Host auths.port=Port auths.bind_dn=DN binden auths.bind_password=Passwort binden -auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. Benutze wenn möglich einen Account mit nur Lesezugriff. +auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. Benutze, wenn möglich, einen Account, der nur über Lesezugriff verfügt. auths.user_base=Basis für Benutzersuche auths.user_dn=Benutzer-DN auths.attribute_username=Benutzernamens-Attribut @@ -1427,7 +1427,7 @@ auths.tip.facebook=Erstelle eine neue Anwendung auf https://developers.facebook. auths.tip.github=Erstelle unter https://github.com/settings/applications/new eine neue OAuth-Anwendung. auths.tip.gitlab=Erstelle unter https://gitlab.com/profile/applications eine neue Anwendung. auths.tip.google_plus=Du erhältst die OAuth2-Client-Zugangsdaten in der Google-API-Konsole unter https://console.developers.google.com/ -auths.tip.openid_connect=Benutze die OpenID Connect Discovery URL (/.well-known/openid-configuration) als Endpunkt. +auths.tip.openid_connect=Benutze die OpenID-Connect-Discovery-URL (/.well-known/openid-configuration), um die Endpunkte zu spezifizieren 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.edit=Authentifikationsquelle bearbeiten auths.activated=Diese Authentifikationsquelle ist aktiviert @@ -1584,13 +1584,13 @@ notices.delete_success=Diese Systemmeldung wurde gelöscht. create_repo=hat das Repository %s erstellt rename_repo=hat das Repository von %[1]s zu %[3]s umbenannt commit_repo=hat auf %[3]s in %[4]s gepusht -create_issue=`hat den Issue %s#%[2]s geöffnet` -close_issue=`hat den Issue %s#%[2]s geschlossen` -reopen_issue=`hat den Issue %s#%[2]s wieder geöffnet` +create_issue=`hat das Issue %s#%[2]s geöffnet` +close_issue=`hat das Issue %s#%[2]s geschlossen` +reopen_issue=`hat das Issue %s#%[2]s erneut geöffnet` create_pull_request=`hat den Pull-Request %s#%[2]s erstellt` close_pull_request=`hat den Pull-Request %s#%[2]s geschlossen` reopen_pull_request=`hat den Pull-Request %s#%[2]s wieder geöffnet` -comment_issue=`hat den Issue %s#%[2]s kommentiert` +comment_issue=`hat das Issue %s#%[2]s kommentiert` merge_pull_request=`hat den Pull-Request %s#%[2]s zusammengeführt` transfer_repo=hat Repository %s transferiert an %s push_tag=hat Tag %[2]s auf %[3]s gepusht @@ -1640,7 +1640,7 @@ mark_all_as_read=Alle als gelesen markieren [gpg] error.extract_sign=Die Signatur konnte nicht extrahiert werden error.generate_hash=Es konnte kein Hash vom Commit generiert werden -error.no_committer_account=Es ist kein Benutzerkonto mit der E-Mail-Adresse des Committers verbunden +error.no_committer_account=Es ist kein Account mit der E-Mail-Adresse des Committers verbunden error.no_gpg_keys_found=Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden error.not_signed_commit=Kein signierter Commit error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Kontos diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index cb9c47a2b..44deec04a 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -1,11 +1,15 @@ +app_desc=Un servicio de Git auto alojado y sin complicaciones home=Inicio dashboard=Panel de control explore=Explorar help=Ayuda sign_in=Iniciar sesión +sign_in_with=Iniciar sesión con sign_out=Cerrar sesión +sign_up=Registro link_account=Vincular Cuenta +link_account_signin_or_signup=Inicia sesión con credenciales existentes para vincular tu cuenta a esta cuenta. O registra una nueva. register=Registro website=Página web version=Versión @@ -13,12 +17,27 @@ page=Página template=Plantilla language=Idioma notifications=Notificaciones +create_new=Crear… +user_profile_and_more=Perfil y ajustes… signed_in_as=Identificado como +enable_javascript=Este sitio web funciona mejor con JavaScript. username=Nombre de usuario +email=Correo electrónico password=Contraseña +re_type=Vuelva a escribir la contraseña +captcha=CAPTCHA +twofa=Autenticación de dos factores passcode=Contraseña +u2f_insert_key=Inserte su clave de seguridad +u2f_use_twofa=Use un código de dos factores de su celular +u2f_error=No podemos leer su llave de seguridad! +u2f_unsupported_browser=Su navegador no soporta llaves U2F. Por favor utilicé otro navegador. +u2f_error_1=Un error desconocido ha ocurrido. Por favor vuelva a intentarlo. +u2f_error_2=Por favor asegúrese de que está utilizando una conexión cifrada (https://) y que esta visitando la dirección URL correcta. +u2f_error_3=El servidor no pudo procesar su petición. +u2f_reload=Recargar repository=Repositorio organization=Organización @@ -31,6 +50,9 @@ new_org=Nueva organización manage_org=Administrar organizaciones account_settings=Configuraciones de la cuenta settings=Configuraciones +your_profile=Perfil +your_starred=Destacado +your_settings=Configuración all=Todos sources=Fuentes @@ -46,29 +68,64 @@ cancel=Cancelar [install] install=Instalación +title=Configuración inicial +docker_helper=Si esta ejecutando Gitea dentro de un contenedor Docker, por favor lea la documentaciónn antes de realizar cambios a la configuración. +requite_db_desc=Gitea requiere una base de datos MySQL, PostgreSQL, MSSQL, SQLite3 o TiDB. db_title=Configuración de base de datos db_type=Tipo de base de datos host=Servidor +user=Nombre de usuario password=Contraseña db_name=Nombre de la base de datos +db_helper=Nota para usuarios de la base de datos MySQL: por favor use el motor InnoDB y el esquema de caracteres 'utf8_general_ci'. +ssl_mode=SSL path=Ruta +general_title=Configuración general +app_name=Título del Sitio +app_name_helper=Puedes colocar aquí el nombre de tu empresa. repo_path=Ruta del repositorio de Raiz (Root) +run_user=Ejecutar como usuario +domain=Dominio del servidor SSH log_root_path=Ruta del registro optional_title=Configuración opcional +email_title=Configuración de Correo smtp_host=Servidor SMTP +mailer_user=Nombre de usuario SMTP +mailer_password=Contraseña SMTP +offline_mode=Habilitar autenticación Local +disable_gravatar=Desactivar Gravatar federated_avatar_lookup_popup=Habilitar búsqueda de avatares federador para usar el servicio federado de código abierto basado en libravatar. +enable_captcha=Activar CAPTCHA enable_captcha_popup=Requerir CAPTCHA para auto-registro de usuario. +require_sign_in_view=Debes iniciar sesión para ver las páginas admin_password=Contraseña confirm_password=Confirmar Contraseña +admin_email=Correo electrónico install_btn_confirm=Instalar Gitea test_git_failed=Fallo al probar el comando 'git': %v +invalid_db_setting=La configuración de la base de datos no es válida: %v +invalid_repo_path=La ruta de la raíz del repositorio no es válida: %v +run_user_not_match=El nombre de usuario 'ejecutar como' no es el nombre actual de usuario: %s -> %s 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. +default_allow_create_organization=Permitir la creación de organizaciones por defecto +default_allow_create_organization_popup=Permitir crear organizaciones a las nuevas cuentas de usuario de forma predeterminada. +default_enable_timetracking=Activar el seguimiento de tiempo por defecto +default_enable_timetracking_popup=Activar el seguimiento de tiempo para nuevos repositorios por defecto. +no_reply_address=Dominio de correos electrónicos ocultos [home] +uname_holder=Nombre de usuario o correo electrónico password_holder=Contraseña switch_dashboard_context=Cambiar el contexto del Dashboard +my_repos=Repositorios +show_more_repos=Mostrar más repositorios… collaborative_repos=Repositorios colaborativos my_orgs=Mis organizaciones my_mirrors=Mis réplicas @@ -81,28 +138,46 @@ repos=Repositorios users=Usuarios organizations=Organizaciones search=Buscar +code=Código +repo_no_results=No se ha encontrado ningún repositorio coincidente. +user_no_results=No se ha encontrado ningún usuario coincidente. +org_no_results=No se ha encontrado ninguna organización coincidente. +code_no_results=No se ha encontrado código de fuente que coincida con su término de búsqueda. +code_search_results=Resultados de búsqueda para '%s' [auth] +create_new_account=Registrar una cuenta register_helper_msg=¿Ya tienes una cuenta? ¡Inicia sesión! +social_register_helper_msg=¿Ya tienes una cuenta? ¡Enlázala! +disable_register_prompt=Registro deshabilitado. Por favor, póngase en contacto con el administrador del sitio. +disable_register_mail=Correo electrónico de confirmación de registro deshabilitado. remember_me=Recuérdame forgot_password_title=He olvidado mi contraseña forgot_password=¿Has olvidado tu contraseña? +sign_up_now=¿Necesitas una cuenta? Regístrate ahora. confirmation_mail_sent_prompt=Un nuevo correo de confirmación se ha enviado a %s. Comprueba tu bandeja de entrada en las siguientes %s para completar el registro. reset_password_mail_sent_prompt=Un correo de confirmación se ha enviado a %s. Comprueba tu bandeja de entrada en las siguientes %s para completar el reinicio de contraseña. active_your_account=Activa tu cuenta +prohibit_login=Ingreso prohibido +prohibit_login_desc=Su cuenta tiene prohibido ingresar al sistema. Por favor contacte con el administrador del sistema. +resent_limit_prompt=Ya ha solicitado recientemente un correo de activación. Por favor, espere 3 minutos y vuelva a intentarlo. has_unconfirmed_mail=Hola %s, tu correo electrónico (%s) no está confirmado. Si no has recibido un correo de confirmación o necesitas que lo enviemos de nuevo, por favor, haz click en el siguiente botón. resend_mail=Haz click aquí para reenviar tu correo electrónico de activación email_not_associate=Esta dirección de correo electrónico no esta asociada a ninguna cuenta. send_reset_mail=Haz clic aquí para reenviar tu email de restauración de contraseña reset_password=Restablecer su contraseña +invalid_code=Su código de confirmación no es válido o ha caducado. reset_password_helper=Haga Clic aquí para restablecer su contraseña +non_local_account=Los usuarios no locales no pueden actualizar su contraseña a través de la interfaz web de Gitea. verify=Verificar twofa_scratch_used=Ya has utilizado el código. Has sido redirigido a la página de configuración de dos factores poder remover la inscripción del dispositivo o generar un nuevo código. twofa_scratch_token_incorrect=El código cero es incorrecto. +login_userpass=Iniciar sesión login_openid=OpenID openid_connect_submit=Conectar openid_connect_title=Accede con una cuenta existente openid_register_title=Crear una nueva cuenta +disable_forgot_password_mail=El restablecimiento de contraseña está desactivado. Por favor, contacte con el administrador del sitio. [mail] activate_account=Por favor, active su cuenta @@ -114,12 +189,14 @@ register_notify=¡Bienvenido a Gitea [modal] yes=Sí no=No +modify=Actualizar [form] UserName=Nombre de usuario RepoName=Nombre del repositorio Email=Dirección de correo electrónico Password=Contraseña +Retype=Vuelva a escribir la contraseña SSHTitle=Nombre de la Clave de SSH HttpsUrl=URL HTTPS PayloadUrl=URL de carga @@ -135,6 +212,7 @@ TreeName=Ruta del archivo Content=Contenido require_error=` no puede estar vacío.` +alpha_dash_error=` solo debe contener caracteres alfanuméricos, guiones medios ('-') y guiones bajos ('_').` size_error=` debe ser de tamaño %s.` min_size_error=` debe contener al menos %s caracteres.` max_size_error=` debe contener como máximo %s caracteres.` @@ -142,7 +220,10 @@ email_error=` no es una dirección de correo válida.` url_error=` no es una URL válida.` include_error=` debe contener la subcadena '%s'.` unknown_error=Error desconocido: +captcha_incorrect=El código CAPTCHA no es correcto. +password_not_match=Las contraseñas no coinciden. +username_been_taken=El nombre de usuario ya está en uso. user_not_exist=Este usuario no existe. auth_failed=Autenticación fallo: %v @@ -248,6 +329,7 @@ fork_from=Crear un Fork desde repo_desc=Descripción repo_lang=Idioma license=Licencia +auto_init=Inicializar el repositorio (añade .gitignore, licencia y README) create_repo=Crear repositorio default_branch=Rama por defecto mirror_prune=Purgar @@ -343,8 +425,8 @@ issues.label_templates.helper=Seleccionar un conjunto de etiquetas issues.label_templates.fail_to_load_file=Error al cargar el archivo de plantilla de etiqueta '%s': %v issues.add_label_at=añadida la etiqueta
%s
%s issues.remove_label_at=eliminada la etiqueta
%s
%s -issues.add_milestone_at=`agregado esto al %s hito %s ' -issues.change_milestone_at=` modificó el hito de %s to %s %s` +issues.add_milestone_at=`ha añadido esto al hito %s %s ' +issues.change_milestone_at=`modificó el hito de %s a %s %s` issues.remove_milestone_at=`eliminado esto del %s hito %s ' issues.deleted_milestone=`(eliminado)` issues.self_assign_at=`auto asignado este %s` @@ -411,6 +493,8 @@ issues.attachment.open_tab='Haga clic para ver "%s" en una pestaña nueva' issues.attachment.download=`Haga clic para descargar "%s"` issues.subscribe=Suscribir issues.unsubscribe=Desuscribirse +issues.start_tracking_short=Iniciar +issues.start_tracking_history=`ha empezado a trabajar %s` issues.tracking_already_started='Ya has comenzado el tiempo de seguimiento en este tema!' issues.add_time_hours=Horas issues.add_time_minutes=Minutos @@ -461,6 +545,8 @@ wiki.page_already_exists=Ya existe una página con el mismo nombre. wiki.pages=Páginas wiki.last_updated=Última actualización %s +activity=Actividad +activity.period.filter_label=Periodo: activity.period.daily=1 día activity.period.halfweekly=3 días activity.period.weekly=1 semana @@ -503,6 +589,7 @@ settings.new_owner_has_same_repo=El nuevo propietario tiene un repositorio con e settings.transfer=Transferir la propiedad settings.delete=Eliminar este repositorio settings.delete_notices_1=- Esta operación NO PUEDE revertirse. +settings.delete_notices_fork_1=Los forks de este repositorio serán independientes después de eliminarlo. settings.transfer_owner=Nuevo Propietario settings.add_webhook=Añadir Webhook settings.webhook.test_delivery=Test de entrega @@ -531,6 +618,7 @@ settings.deploy_keys=Claves de Despliegue settings.add_deploy_key=Añadir Clave de Despliegue settings.title=Título settings.deploy_key_content=Contenido +settings.protect_merge_whitelist_committers_desc=Permitir a los usuarios o equipos de la lista a fusionar peticiones pull dentro de esta rama. settings.add_protected_branch=Activar protección settings.delete_protected_branch=Desactivar protección @@ -574,6 +662,7 @@ branch.create_from=desde '%s' branch.branch_already_exists=La rama '%s' ya existe en este repositorio. branch.deleted_by=Eliminada por %s +topic.done=Hecho [org] org_name_holder=Nombre de la organización @@ -613,6 +702,7 @@ teams.join=Unirse teams.leave=Abandonar teams.read_access=Acceso de Lectura teams.write_access=Acceso de Escritura +teams.admin_access_helper=Los miembros pueden hacer pull y push a los repositorios del equipo y añadir colaboradores a ellos. teams.no_desc=Este equipo no tiene descripción teams.settings=Configuración teams.members=Miembros del equipo @@ -640,6 +730,7 @@ dashboard.operation_run=Ejecutar dashboard.clean_unbind_oauth_success=Se han eliminado las conexiones de OAuth no vinculadas. dashboard.delete_inactivate_accounts=Eliminar todas las cuentas inactivas dashboard.delete_inactivate_accounts_success=Todas las cuentas inactivas han sido eliminadas. +dashboard.resync_all_sshkeys=Actualizar el archivo '.ssh/authorized_keys' con las claves SSH de Gitea (no es necesario para el servidor SSH incorporado). dashboard.reinit_missing_repos=Reiniciar todos los repositorios Git faltantes de los que existen registros dashboard.reinit_missing_repos_success=Todos los repositorios Git faltantes para los que existen registros se han reinicializado. dashboard.server_uptime=Tiempo de actividad del servidor @@ -859,6 +950,7 @@ file_too_big=El tamaño del archivo ({{filesize}} MB) excede el tamaño máximo remove_file=Eliminar archivo [notification] +notifications=Notificaciones unread=Sin leer read=Leídas mark_as_read=Marcar como leído diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 0d49ff4b3..fe34f0e58 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -1,10 +1,15 @@ +app_desc=Ongelmaton, itsehostattu Git-palvelu home=Etusivu dashboard=Kojelauta explore=Tutki help=Apua sign_in=Kirjaudu sisään +sign_in_with=Kirjaudu sisään tunnuksilla sign_out=Kirjaudu ulos +sign_up=Rekisteröidy +link_account=Yhdistä tili +link_account_signin_or_signup=Kirjaudu sisään olemassaolevilla tunnuksilla yhdistääksesi tilisi käyttäjätunnukseen. Tai rekisteröi uusi käyttäjätunnus. register=Rekisteröidy website=Nettisivut version=Versio @@ -12,10 +17,18 @@ page=Sivu template=Malli language=Kieli notifications=Ilmoitukset +create_new=Luo… +user_profile_and_more=Profiili ja asetukset… signed_in_as=Kirjautuneena käyttäjänä +enable_javascript=Tämä sivusto toimii paremmin JavaScriptillä. username=Käyttäjätunnus +email=Sähköpostiosoite password=Salasana +re_type=Kirjoita salasana uudelleen +captcha=CAPTCHA +twofa=Kaksivaiheinen todennus +twofa_scratch=Kaksivaiheinen kertakäyttöinen koodi passcode=Tunnuskoodi @@ -25,11 +38,21 @@ mirror=Peili new_repo=Uusi repo new_migrate=Uusi migraatio new_mirror=Uusi peilaus +new_fork=Uusi repositorio new_org=Uusi organisaatio manage_org=Ylläpidä organisaatioita +admin_panel=Sivuston ylläpito account_settings=Tilin asetukset settings=Asetukset +your_profile=Profiili +your_starred=Tähdelliset +your_settings=Asetukset +all=Kaikki +sources=Lähteet +mirrors=Peilit +collaborative=Yhteistyössä +forks=Haarat activities=Toimet pull_requests=Pull requestit @@ -39,19 +62,60 @@ cancel=Peruuta [install] install=Asennus +title=Alkuperäiset asetukset +docker_helper=Jos ajat Giteaa Dockerissa, tutustuthan dokumentaatioon ennen asetusten muuttamista. +requite_db_desc=Gitea tarvitsee toimiakseen MySQL-, PostgreSQL-, MSSQL-, SQLite3 tai TiDB-tietokannan. db_title=Tietokanta asetukset db_type=Tietokanta tyyppi host=Isäntä +user=Käyttäjätunnus password=Salasana db_name=Tietokannan nimi +db_helper=Huomio MySQL-käyttäjille: käytäthän InnoDB-kantamoottoria ja 'utf8_general_ci'-merkistöä. +ssl_mode=SSL path=Polku +sqlite_helper=Tiedostopolku SQLite3- tai TiDB-tietokantaan.
Kirjoita absoluuttinen polku, jos ajat Giteaa palveluna. +err_empty_db_path=SQLite3- tai TiDB-tietokantapolku ei voi olla tyhjä. +err_invalid_tidb_name=TiDB-tietokannan nimi ei voi sisältää '.'- tai '-'-merkkejä. +no_admin_and_disable_registration=Et voi kytkeä rekisteröintiä pois luomatta sitä ennen ylläpitotiliä. +err_empty_admin_password=Ylläpitäjän salasana ei voi olla tyhjä. +general_title=Yleiset asetukset +app_name=Sivuston otsikko repo_path=Repon juuren polku +repo_path_helper=Muualla olevat git-repositoriot tullaan tallentamaan tähän kansioon. +lfs_path=Git LFS -juuripolku +lfs_path_helper=Git LFS:n ylläpitämät tiedostot tullaan tallentamaan tähän hakemistoon. Jätä tyhjäksi kytkeäksesi toiminnon pois. +run_user=Aja käyttäjänä +run_user_helper=Anna käyttäjätunnus, jona Giteaa ajetaan. Käyttäjällä on oltava oikeudet repositorioiden juuripolkuun. +domain=SSH-palvelimen osoite (hostname) +domain_helper=Domain tai osoite SSH-klooniosoitteille. +ssh_port=SSH-palvelimen portti +ssh_port_helper=Porttinumero, jossa SSH-palvelimesi kuuntelee. Jätä tyhjäksi kytkeäksesi pois. +http_port=Gitean HTTP-kuunteluportti +http_port_helper=Portti, jossa Gitean web-palvelin kuuntelee. +app_url=Gitean juuriosoite +app_url_helper=Juuriosoite HTTP(S)-klooniosoitteille ja sähköpostimuistutuksille. log_root_path=Lokin polku +log_root_path_helper=Lokitiedostot kirjoitetaan tähän kansioon. optional_title=Valinnaiset asetukset +email_title=Sähköpostiasetukset smtp_host=SMTP isäntä +smtp_from=Lähetä sähköpostit osoitteella +smtp_from_helper=Sähköpostiosoite, jota Gitea käyttää. Kirjoita osoite ”nimi” -muodossa. +mailer_user=SMTP-käyttäjätunnus +mailer_password=SMTP-salasana +register_confirm=Vaadi sähköpostin vahvistaminen rekisteröintiin +mail_notify=Ota käyttöön sähköpostiilmoitukset +server_service_title=Palvelin ja kolmansien osapuolten palveluiden asetukset +offline_mode=Ota käyttöön lokaali tila +offline_mode_popup=Poista kolmannen osapuolen sisällöstä jakeluverkot ja tarjoa kaikki resurssit paikallisesti. +disable_gravatar=Poista Gravatar käytöstä +disable_gravatar_popup=Poista Gravatar ja kolmannen osapuolen avaratir käytöstä. Oletus-avatar näytetään, ellei käyttäjä ole ladannut omaansa. +federated_avatar_lookup=Käytä ulkopuolisia profiilikuvia federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Poista rekisteröinti käytöstä enable_captcha_popup=Pakollinen captcha käyttäjän itse rekisteröityessä. admin_password=Salasana confirm_password=Varmista salasana @@ -73,32 +137,69 @@ repos=Repot users=Käyttäjät organizations=Organisaatiot search=Hae +code_no_results=Hakuehtoasi vastaavaa lähdekoodia ei löytynyt. +code_search_results=Hakutulokset: '%s ' [auth] +create_new_account=Rekisteröi tili register_helper_msg=On jo tili? Kirjaudu sisään nyt! +social_register_helper_msg=Onko sinulla jo tili? Linkitä se nyt! +disable_register_prompt=Rekisteröinti on estetty. Ota yhteys ylläpitäjääsi. +disable_register_mail=Sähköpostivahvistus rekisteröinnille on estetty. remember_me=Muista minut +forgot_password_title=Unohtuiko salasana +forgot_password=Unohtuiko salasana? +sign_up_now=Tarvitsetko tilin? Rekisteröidy nyt. +confirmation_mail_sent_prompt=Uusi varmistussähköposti on lähetetty osoitteeseen %s, ole hyvä ja tarkista saapuneet seuraavan %s tunnin sisällä saadaksesi rekisteröintiprosessin valmiiksi. +reset_password_mail_sent_prompt=Varmistussähköposti on lähetetty osoitteeseen %s, ole hyvä ja tarkista saapuneet seuraavan %s tunnin sisällä saadaksesi salasananvaihdon valmiiksi. active_your_account=Aktivoi tilisi +prohibit_login=Kirjautuminen estetty +prohibit_login_desc=Käyttäjätilisi kirjautuminen on estetty. Ota yhteys sivuston ylläpitäjään. +resent_limit_prompt=Olet jo tilannut aktivointisähköpostin hetki sitten. Ole hyvä ja odota 3 minuuttia ja yritä sitten uudelleen. has_unconfirmed_mail=Hei %s, sinulla on varmistamaton sähköposti osoite (%s). Jos et ole saanut varmistus sähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja klikkaa allaolevaa painiketta. resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi +email_not_associate=Tätä sähköpostiosoitetta ei ole liitetty mihinkään tiliin. +send_reset_mail=Klikkaa tästä (uudelleen) lähettääksesi salasanan nollaussähköpostin reset_password=Nollaa salasanasi +invalid_code=Vahvistusavain on virheellinen tai vanhentunut. reset_password_helper=Klikkaa tästä nollataksesi salasanasi +non_local_account=Ei-lokaalit käyttäjät eivät voi päivittää salasanojaan Gitean web-käyttöliittymän kautta. verify=Vahvista +scratch_code=Kertakäyttökoodi +use_scratch_code=Käytä kertakäyttökoodia +twofa_scratch_used=Olet käyttänyt kertakäyttökoodisi. Sinut on uudelleenohjattu kaksivaiheisen kirjautumisen asetussivulle, jotta voit kytkeä sen pois tai luoda uuden kertakäyttökoodin. +twofa_passcode_incorrect=Salasanasi on väärä. Jos olet hukannut laitteesi, käytäthän kertakäyttökoodia sisäänkirjautumiseen. +twofa_scratch_token_incorrect=Kertakäyttökoodisi on virheellinen. +login_userpass=Kirjaudu sisään +login_openid=OpenID +openid_connect_submit=Connect +openid_connect_title=Yhdistä olemassaolevaan tiliin +openid_connect_desc=Valittu OpenID-osoite on tuntematon. Liitä se uuteen tiliin täällä. +openid_register_title=Luo uusi tili +openid_register_desc=Valittu OpenID-osoite on tuntematon. Liitä se uuteen tiliin täällä. +openid_signin_desc=Anna OpenID-osoitteesi. Esimerkiksi: https://anne.me, bob.openid.org.cn tai gnusocial.net/carry. +disable_forgot_password_mail=Salasanan nollaus on estetty. Ota yhteys ylläpitäjääsi. [mail] activate_account=Ole hyvä ja aktivoi tilisi activate_email=Vahvista sähköpostiosoitteesi reset_password=Tyhjennä salasana +register_success=Rekisteröinti onnistui +register_notify=Tervetuloa Giteaan [modal] yes=Kyllä no=Ei +modify=Päivitys [form] UserName=Käyttäjätunnus RepoName=Repon nimi Email=Sähköposti osoite Password=Salasana +Retype=Kirjoita salasana uudelleen SSHTitle=SSH avain nimi +HttpsUrl=HTTPS-osoite TeamName=Tiimin nimi AuthName=Luvan nimi AdminEmail=Ylläpito sähköposti diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 50e90b96f..0870d82ac 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1,11 +1,15 @@ +app_desc=Un service Git auto-hébergé sans prise de tête home=Accueil dashboard=Tableau de bord explore=Explorateur help=Aide sign_in=Connexion +sign_in_with=Se connecter avec sign_out=Déconnexion +sign_up=S'inscrire link_account=Lier un Compte +link_account_signin_or_signup=Connectez-vous avec vos identifiants pour lier votre compte existant et ce nouveau compte, ou créez un nouveau compte. register=S'inscrire website=Site web version=Version @@ -13,12 +17,32 @@ page=Page template=Modèle language=Langue notifications=Notifications +create_new=Créer… +user_profile_and_more=Profil et réglages… signed_in_as=Connecté en tant que +enable_javascript=Ce site fonctionne mieux avec JavaScript. username=Nom d'utilisateur +email=Adresse e-mail password=Mot de passe +re_type=Confirmez le mot de passe +captcha=CAPTCHA +twofa=Authentification à deux facteurs +twofa_scratch=Code de secours pour l'authentification à deux facteurs passcode=Code d'accès +u2f_insert_key=Insérez votre clef de sécurité +u2f_sign_in=Appuyez sur le bouton de votre clef de sécurité. Si vous ne voyez pas de bouton, ré-insérez là. +u2f_press_button=Veuillez appuyer sur le bouton de votre clef de sécurité… +u2f_use_twofa=Utilisez l'authentification à deux facteurs avec votre téléphone +u2f_error=Nous ne pouvons pas lire votre clé de sécurité ! +u2f_unsupported_browser=Votre navigateur n'est pas compatible avec les clefs U2F. Veuillez réessayer avec un autre navigateur. +u2f_error_1=Une erreur inconnue s'est produite. Veuillez réessayer. +u2f_error_2=Veuillez vous assurer que vous utilisez une connexion chiffrée (https) et que vous visitez la bonne adresse. +u2f_error_3=Le serveur n'a pas pu répondre à votre requête. +u2f_error_4=Cette clef n'est pas compatible avec votre requête. Si vous êtes en train de l'enregistrer, veuillez vous assurer que cette clef n'est pas déjà enregistrée. +u2f_error_5=Le délai d'attente imparti a été atteint avant que votre clef ne puisse être lue. Veuillez recharger la page pour réessayer. +u2f_reload=Recharger repository=Dépôt organization=Organisation @@ -29,8 +53,12 @@ new_mirror=Nouveau miroir new_fork=Nouveau Fork new_org=Nouvelle organisation manage_org=Gérer les organisations +admin_panel=Administration du site account_settings=Paramètres du compte settings=Paramètres +your_profile=Profil +your_starred=Favoris +your_settings=Configuration all=Tous sources=Sources @@ -46,34 +74,107 @@ cancel=Annuler [install] install=Installation +title=Configuration initiale +docker_helper=Si vous utilisez Gitea avec Docker, veuillez lire la documentation avant de modifier les paramètres. +requite_db_desc=Gitea requiert MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB. db_title=Paramètres de la base de données db_type=Type de base de données host=Hôte +user=Nom d'utilisateur password=Mot de passe db_name=Nom de base de données +db_helper=Note aux utilisateurs de MySQL : veuillez utiliser le moteur de stockage InnoDB et le jeu de caractères 'utf8_general_ci'. +ssl_mode=SSL path=Emplacement +sqlite_helper=Chemin d'accès pour la base de données SQLite3 ou TiDB.
Entrer un chemin absolu si vous exécutez Gitea en tant que service. +err_empty_db_path=Le chemin de la base de données SQLite3 ou TiDB ne peut être vide. +err_invalid_tidb_name=Le nom de la base de données TiDB ne peut pas contenir les caractères '.' et '-'. +no_admin_and_disable_registration=Vous ne pouvez pas désactiver la création de nouveaux utilisateurs avant d'avoir créé un compte administrateur. +err_empty_admin_password=Le mot de passe administrateur ne peut pas être vide. +general_title=Configuration générale +app_name=Titre du site +app_name_helper=Entrez ici le nom de votre société. repo_path=Emplacement racine des dépôts +repo_path_helper=Les dépôts Git distants seront stockés dans ce répertoire. +lfs_path=Répertoire racine Git LFS +lfs_path_helper=Les fichiers suivis par Git LFS seront stockés dans ce dossier. Laissez vide pour désactiver LFS. +run_user=Exécuter avec le compte d'un autre utilisateur +run_user_helper=Veuillez entrer le nom d'utilisateur système exécutant Gitea. Cet utilisateur doit avoir accès au dossier racine des dépôts. +domain=Domaine du serveur SSH +domain_helper=Domaine ou adresse de l'hôte pour les URLs de clonage par SSH. +ssh_port=Port du serveur SSH +ssh_port_helper=Port d'écoute du serveur SSH. Laissez le vide pour le désactiver. +http_port=Port d'écoute HTTP de Gitea +http_port_helper=Port sur lequel le serveur web Gitea attendra des requêtes. +app_url=URL de base de Gitea +app_url_helper=Adresse HTTP(S) de base pour les clones git et les notifications par e-mail. log_root_path=Chemin des fichiers log +log_root_path_helper=Les fichiers de journalisation seront écrits dans ce répertoire. optional_title=Paramètres facultatifs +email_title=Paramètres E-mail smtp_host=Hôte SMTP +smtp_from=Envoyer les e-mails en tant que +smtp_from_helper=Adresse e-mail utilisée par Gitea. Veuillez entrer votre e-mail directement ou sous la forme . +mailer_user=Utilisateur SMTP +mailer_password=Mot de passe SMTP +register_confirm=Exiger la confirmation de l'e-mail lors de l'inscription +mail_notify=Activer les notifications par e-mail +server_service_title=Paramètres Serveur et Tierce Parties +offline_mode=Activer le mode hors-ligne +offline_mode_popup=Désactiver l'utilisation de CDNs, et servir toutes les ressources localement. +disable_gravatar=Désactiver Gravatar +disable_gravatar_popup=Désactiver Gravatar et les autres sources d'avatars tierces. Un avatar par défaut sera utilisé pour les utilisateurs n'ayant pas téléversé un avatar personnalisé. +federated_avatar_lookup=Activer les avatars unifiés federated_avatar_lookup_popup=Activer la recherche unifiée d'avatars en utilisant le service open source unifié basé sur libravatar. +disable_registration=Désactiver le formulaire d'inscription +disable_registration_popup=Désactiver les nouvelles inscriptions. Seuls les administrateurs pourront créer de nouveaux comptes utilisateurs. +allow_only_external_registration_popup=N'autoriser l'inscription qu'à partir des services externes. openid_signin=Activer l'inscription OpenID +openid_signin_popup=Activer l'authentification via OpenID. +openid_signup=Activer l'inscription OpenID +openid_signup_popup=Activer l'inscription avec OpenID. +enable_captcha=Activer le CAPTCHA enable_captcha_popup=Demander un Captcha à l'inscription. +require_sign_in_view=Exiger la connexion à un compte pour afficher les pages +require_sign_in_view_popup=Limiter l'accès aux pages aux utilisateurs connectés. Les visiteurs ne verront que les pages de connexion et d'inscription. +admin_setting_desc=La création d'un compte administrateur est facultative. Le premier utilisateur enregistré deviendra automatiquement un administrateur le cas échéant. +admin_title=Paramètres de compte administrateur +admin_name=Nom d’utilisateur administrateur admin_password=Mot de passe confirm_password=Confirmez le mot de passe +admin_email=Adresse e-mail install_btn_confirm=Installer Gitea test_git_failed=Le test de la commande "git" a échoué : %v +sqlite3_not_available=Cette version de Gitea ne supporte pas SQLite3. Veuillez télécharger la version binaire officielle de %s (pas la version 'gobuild'). +invalid_db_setting=Les paramètres de la base de données sont invalides : %v +invalid_repo_path=Le chemin racine du dépôt est invalide : %v +run_user_not_match=Le nom d'utilisateur sous lequel Gitea est configuré n'est pas le nom d'utilisateur courant : %s -> %s 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. +default_allow_create_organization=Autoriser la création d'organisations par défaut +default_allow_create_organization_popup=Permettre aux nouveaux comptes utilisateurs de créer des organisations par défaut. +default_enable_timetracking=Activer le suivi de temps par défaut +default_enable_timetracking_popup=Activer le suivi du temps pour les nouveaux dépôts par défaut. +no_reply_address=Domaine pour les e-mails cachés +no_reply_address_helper=Nom de domaine pour les utilisateurs possédant une adresse email cachée. Par exemple, le nom d’utilisateur « joe » sera enregistré dans Git comme « joe@noreply.example.org » si le domaine pour les e-mails cachés a la valeur « noreply.example.org ». [home] +uname_holder=Nom d'utilisateur ou adresse e-mail password_holder=Mot de passe switch_dashboard_context=Basculer le contexte du tableau de bord +my_repos=Dépôts +show_more_repos=Afficher plus de dépôts… collaborative_repos=Dépôts collaboratifs my_orgs=Mes organisations my_mirrors=Mes miroirs view_home=Voir %s +search_repos=Trouver un dépôt … issues.in_your_repos=Dans vos dépôts @@ -82,30 +183,53 @@ repos=Dépôts users=Utilisateurs organizations=Organisations search=Rechercher +code=Code +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 [auth] +create_new_account=Créer un compte register_helper_msg=Déjà enregistré ? Connectez-vous ! +social_register_helper_msg=Déjà inscrit ? Connectez-vous ! +disable_register_prompt=Les inscriptions sont désactivées. Veuillez contacter l'administrateur du site. +disable_register_mail=La confirmation par e-mail à l'inscription est désactivée. remember_me=Se souvenir de moi forgot_password_title=Mot de passe oublié forgot_password=Mot de passe oublié ? +sign_up_now=Pas de compte ? Inscrivez-vous maintenant. confirmation_mail_sent_prompt=Un nouveau mail de confirmation a été envoyé à %s. Veuillez vérifier votre boîte de réception dans les prochaines %s pour valider votre enregistrement. reset_password_mail_sent_prompt=Un mail de confirmation a été envoyé à %s. Veuillez vérifier votre boîte de réception dans les prochaines %s pour terminer la réinitialisation du mot de passe. active_your_account=Activer votre compte +prohibit_login=Connexion interdite +prohibit_login_desc=Votre compte n'est pas autorisé à se connecter, contactez l’administrateur du site. +resent_limit_prompt=Désolé, vous avez récemment demandé un e-mail d'activation. Veuillez réessayer dans 3 minutes. has_unconfirmed_mail=Bonjour %s, votre adresse e-mail (%s) n'a pas été confirmée. Si vous n'avez reçu aucun mail de confirmation ou souhaitez renouveler l'envoi, cliquez sur le bouton ci-dessous. resend_mail=Cliquez ici pour renvoyer un mail de confirmation email_not_associate=L'adresse e-mail n'est associée à aucun compte. send_reset_mail=Cliquez ici pour renvoyer le mail de réinitialisation de votre mot de passe reset_password=Réinitialiser le mot de passe +invalid_code=Votre code de confirmation est invalide ou a expiré. reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe +password_too_short=Le mot de passe doit contenir %d caractères minimum. +non_local_account=Les mots de passes des comptes utilisateurs externes ne peuvent pas être modifiées depuis l'interface web Gitea. verify=Vérifier scratch_code=Code de secours use_scratch_code=Utiliser un code de secours twofa_scratch_used=Vous avez utilisé votre code de secours. Vous avez été redirigé vers cette page de configuration afin de supprimer l'authentification à deux facteurs de votre appareil ou afin de générer un nouveau code de secours. +twofa_passcode_incorrect=Votre code d’accès n’est pas correct. Si vous avez égaré votre appareil, utilisez votre code de secours pour vous connecter. twofa_scratch_token_incorrect=Votre code de secours est incorrect. +login_userpass=Connexion login_openid=OpenID openid_connect_submit=Se connecter openid_connect_title=Se connecter à un compte existant +openid_connect_desc=L'URI OpenID choisie est inconnue. Associez-le à un nouveau compte ici. openid_register_title=Créer un nouveau compte +openid_register_desc=L'URI OpenID choisie est inconnue. Associez-le à un nouveau compte ici. +openid_signin_desc=Veuillez entrer votre URI OpenID. Par exemple: https://anne.me, bob.openid.org.cn ou gnusocial.net/charles. +disable_forgot_password_mail=La réinitialisation de mot de passe est désactivée. Veuillez contacter l'administrateur du site. [mail] activate_account=Veuillez activer votre compte @@ -117,12 +241,14 @@ register_notify=Bienvenue sur Gitea [modal] yes=Oui no=Non +modify=Mettre à jour [form] UserName=Nom d'utilisateur RepoName=Nom du dépôt Email=Adresse e-mail Password=Mot de passe +Retype=Retapez le mot de passe SSHTitle=Nom de la clé SSH HttpsUrl=URL HTTPS PayloadUrl=URL des données utiles @@ -138,6 +264,9 @@ TreeName=Chemin du fichier Content=Contenu require_error=` ne peut pas être vide.` +alpha_dash_error=` ne doit contenir que des caractères alphanumériques, des tirets ("-") et des tirets bas (" _ ").` +alpha_dash_dot_error=` ne doit contenir que des caractères alphanumériques, des tirets ("-"), des tirets bas ("_"), et des points. (".").` +git_ref_name_error=` doit être un nom de référence Git bien formé.` size_error=` doit être à la taille de %s.` min_size_error=` %s caractères minimum ` max_size_error=` %s caractères maximum ` @@ -145,70 +274,148 @@ email_error=` adresse e-mail invalide ` url_error=` URL invalide ` include_error=`doit contenir la sous-chaîne '%s'.` unknown_error=Erreur inconnue : +captcha_incorrect=Le code CAPTCHA est incorrect. +password_not_match=Les mots de passe ne correspondent pas. +username_been_taken=Le nom d'utilisateur est déjà pris. +repo_name_been_taken=Ce nom de dépôt est déjà utilisé. +org_name_been_taken=Ce nom d'organisation est déjà pris. +team_name_been_taken=Le nom d'équipe est déjà pris. +team_no_units_error=Autoriser l’accès à au moins une section du dépôt. +email_been_used=Cette adresse e-mail est déjà utilisée. +openid_been_used=Adresse OpenID '%s' déjà utilisée. +username_password_incorrect=Identifiant ou mot de passe invalide. +enterred_invalid_repo_name=Le nom de dépôt saisi est incorrect. +enterred_invalid_owner_name=Le nom du nouveau propriétaire est invalide. +enterred_invalid_password=Le mot de passe saisi est incorrect. user_not_exist=Cet utilisateur n'existe pas. +last_org_owner=Vous ne pouvez pas supprimer le dernier utilisateur de l’équipe « propriétaires ». Il doit y avoir au moins un propriétaire dans chaque équipe. +cannot_add_org_to_team=Une organisation ne peut être ajoutée comme membre d'une équipe. +invalid_ssh_key=Impossible de vérifier votre clé SSH : %s +invalid_gpg_key=Impossible de vérifier votre clé GPG : %s +unable_verify_ssh_key=Impossible de vérifier la clé SSH ; veuillez vérifier que vous n'avez pas fait d'erreur. auth_failed=Échec d'authentification : %v +still_own_repo=Ce compte possède toujours un ou plusieurs dépôts, vous devez d'abord les supprimer ou les transférer. +still_has_org=Votre compte est un membre d’une ou plusieurs organisations, veuillez d'abord les quitter. +org_still_own_repo=Cette organisation possède encore un ou plusieurs dépôts. Vous devez d'abord les supprimer ou les transférer. target_branch_not_exist=La branche cible n'existe pas. [user] +change_avatar=Changer votre avatar… join_on=Inscrit le repositories=Dépôts activity=Activité publique followers=abonnés +starred=Dépôts favoris following=Abonnements follow=Suivre unfollow=Ne plus suivre 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. [settings] profile=Profil +account=Compte password=Mot de passe security=Sécurité avatar=Avatar ssh_gpg_keys=Clés SSH / GPG social=Réseaux Sociaux +applications=Applications +orgs=Gérer les organisations repos=Dépôts delete=Supprimer le compte twofa=Authentification à deux facteurs +account_link=Comptes associés +organization=Organisations uid=ID d'Utilisateur +u2f=Clefs de sécurité public_profile=Profil public +profile_desc=Votre adresse e-mail sera utilisée pour les notifications et d'autres opérations. +password_username_disabled=Les utilisateurs externes ne peuvent pas modifier leur nom d'utilisateur. Merci de contacter l'administrateur de votre site pour plus d'informations. full_name=Nom complet website=Site Web location=Localisation update_profile=Valider les modifications update_profile_success=Votre profil a été mis à jour. +change_username=Votre nom d'utilisateur a été modifié. +change_username_prompt=Remarque : changer votre nom d'utilisateur change également l'URL de votre compte. continue=Continuer cancel=Annuler +language=Langues +lookup_avatar_by_mail=Rechercher un avatar par adresse e-mail federated_avatar_lookup=Recherche d'avatars unifiés enable_custom_avatar=Activer l'avatar personnalisé choose_new_avatar=Sélectionner un nouvel avatar +update_avatar=Mise à jour de l'avatar delete_current_avatar=Supprimer l'avatar actuel +uploaded_avatar_not_a_image=Le fichier téléversé n'est pas une image. +update_avatar_success=Votre avatar a été mis à jour. +change_password=Modifier le mot de passe old_password=Mot de passe actuel new_password=Nouveau mot de passe +retype_new_password=Retapez le nouveau mot de passe +password_incorrect=Le mot de passe actuel est incorrect. +change_password_success=Votre mot de passe a été mis à jour. Désormais, connectez-vous avec votre nouveau mot de passe. +password_change_disabled=Les mots de passes des comptes utilisateurs externes ne peuvent pas être modifiées depuis l'interface web Gitea. emails=Adresses e-mail +manage_emails=Gérer les adresses de courriel +manage_openid=Gérer les adresses OpenID email_desc=Votre adresse e-mail principale sera utilisée pour les notifications et d'autres opérations. primary=Principale +primary_email=Faire de cette adresse votre adresse principale +delete_email=Supprimer +email_deletion=Supprimer l'adresse e-mail +email_deletion_desc=L'adresse e-mail et les informations connexes seront retirées de votre compte. Les révisions Git effectués par cette adresse resteront inchangées. Continuer ? +email_deletion_success=L'adresse e-mail a été supprimée. +openid_deletion=Supprimer l'adresse OpenID +openid_deletion_desc=La suppression de cette adresse OpenID vous empêchera de vous y connecter à l'avenir. Souhaitez-vous confirmer ? +openid_deletion_success=L'adresse OpenID a été supprimée. +add_new_email=Ajouter une adresse e-mail +add_new_openid=Ajouter une nouvelle URI OpenID +add_email=Ajouter une adresse e-mail add_openid=Ajouter une URI OpenID +add_email_confirmation_sent=Un email de confirmation a été envoyé à '%s'. Merci de relever votre boite dans les prochaines %s pour confirmer votre adresse. +add_email_success=La nouvelle adresse e-mail a été ajoutée. +add_openid_success=La nouvelle adresse OpenID a été ajoutée. +keep_email_private=Cacher l'adresse e-mail +keep_email_private_popup=Votre adresse e-mail sera cachée aux autres utilisateurs. +openid_desc=OpenID vous permet de confier l'authentification à une tierce partie. manage_ssh_keys=Gérer les clés SSH manage_gpg_keys=Gérer les clés GPG 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. +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 générer votre clé SSH ou résoudre les problèmes courants que vous pouvez rencontrer en utilisant SSH. gpg_helper=Besoin d'aide ? Consultez le guide Github à propos de GPG. add_new_key=Ajouter une clé SSH add_new_gpg_key=Ajouter une clé GPG +ssh_key_been_used=Cette clef SSH est déjà liée à votre compte. +ssh_key_name_used=Une clef SSH du même nom est déjà associée à votre compte. +gpg_key_id_used=Une clef GPG publique avec le même identifiant existe déjà. +gpg_no_key_email_found=Cette clef GPG n'est utilisable avec aucune adresse e-mail associée à ce compte. subkeys=Sous-clés key_id=Clé ID key_name=Nom de la Clé key_content=Contenu +add_key_success=La clef SSH "%s" a été ajoutée. +add_gpg_key_success=La clef GPG "%s" a été ajoutée. +delete_key=Supprimer +ssh_key_deletion=Supprimer la clé SSH +gpg_key_deletion=Supprimer la clé GPG +ssh_key_deletion_desc=La suppression d'une clé SSH révoque son accès à votre compte. Continuer ? +gpg_key_deletion_desc=Retirer une clef GPG annule la vérification des révisions l'utilisant. Continuer ? +ssh_key_deletion_success=La clé SSH a été retirée. +gpg_key_deletion_success=La clé GPG a été retirée. add_on=Ajouté le valid_until=Valide jusqu’à valid_forever=Valide pour toujours @@ -220,40 +427,95 @@ key_state_desc=Cette clé a été utilisée durant les 7 derniers jours token_state_desc=Ce jeton a été utilisé durant les 7 derniers jours show_openid=Afficher sur mon profil hide_openid=Masquer du profil +ssh_disabled=SSH désactivé manage_social=Gérer les réseaux sociaux associés +social_desc=Ces réseaux sociaux sont liés à votre compte Gitea. Veuillez vous assurer que vous les reconnaissez tous car ils peuvent être utilisés pour se connecter à votre compte Gitea. +unbind=Dissocier +unbind_success=Le réseau social a été dissocié de votre compte Gitea. +manage_access_token=Gérer les jetons d'accès generate_new_token=Générer le nouveau jeton +tokens_desc=Ces jetons permettent l'accès à votre compte à travers l'API Gitea. +new_token_desc=Les applications utilisant un jeton ont un accès total à votre compte. token_name=Nom du jeton generate_token=Générer le jeton +generate_token_success=Votre nouveau jeton a été généré. Copiez-le maintenant car il ne sera plus jamais affiché ici. delete_token=Supprimer +access_token_deletion=Suppression de jetons d'accès +access_token_deletion_desc=Supprimer un jeton révoquera l'accès à votre compte pour toutes les applications l'utilisant. Continuer ? +delete_token_success=Ce jeton a été supprimé. Les applications l'utilisant n'ont plus accès à votre compte. +twofa_desc=L'authentification à deux facteurs améliore la sécurité de votre compte. twofa_is_enrolled=Votre compte est inscrit à l'authentification à deux facteurs. twofa_not_enrolled=Votre compte n'est pas inscrit à l'authentification à deux facteurs. +twofa_disable=Désactiver l'authentification à deux facteurs +twofa_scratch_token_regenerate=Regénérer un code de secours +twofa_scratch_token_regenerated=Votre jeton de secours est maintenant %s. Gardez-le en lieu sûr. +twofa_enroll=Activer l'authentification à deux facteurs +twofa_disable_note=Vous pouvez désactiver l'authentification à deux facteurs si nécessaire. +twofa_disable_desc=Désactiver l'authentification à deux facteurs rendra votre compte plus vulnérable. Souhaitez-vous confirmer ? +regenerate_scratch_token_desc=Si vous avez perdu votre code de secours, ou avez dû l'utiliser pour vous authentifier, vous pouvez le réinitialiser. twofa_disabled=L'authentification à deux facteurs a été désactivée. scan_this_image=Scannez cette image avec votre application d'authentification : or_enter_secret=Ou saisissez le code secret: %s +then_enter_passcode=Et entrez le mot de passe s'affichant dans l'application : +passcode_invalid=Le mot de passe est invalide. Réessayez. +twofa_enrolled=L'authentification à deux facteurs a été activée pour votre compte. Gardez votre jeton de secours (%s) en lieu sûr car il ne vous sera montré qu'une seule fois ! +u2f_desc=Les clefs de sécurité sont des dispositifs matériels contenant des clefs cryptographiques. Elles peuvent être utilisées pour l'authentification à deux facteurs. La clef de sécurité doit supporter le standard FIDO U2F. +u2f_require_twofa=L'authentification à deux facteurs doit être activée afin d'utiliser une clef de sécurité. +u2f_register_key=Ajouter une clef de sécurité +u2f_nickname=Pseudonyme +u2f_press_button=Appuyer sur le bouton de votre clef de sécurité pour l'enregistrer. +u2f_delete_key=Supprimer une clef de sécurité +u2f_delete_key_desc=Si vous supprimez une clef de sécurité vous ne pourrez plus l'utiliser pour vous connecter. Continuer? +manage_account_links=Gérer les comptes liés +manage_account_links_desc=Ces comptes externes sont liés à votre compte Gitea. +account_links_not_available=Il n'y a pour l'instant pas de compte externe connecté à votre compte Gitea. +remove_account_link=Supprimer un compte lié +remove_account_link_desc=Supprimer un compte lié révoquera son accès à votre compte Gitea. Continuer ? +remove_account_link_success=Le compte lié a été supprimé. orgs_none=Vous n'êtes membre d'aucune organisation. repos_none=Vous ne possédez aucun dépôt delete_account=Supprimer votre compte +delete_prompt=Cette opération supprimera votre compte. Ceci NE PEUT PAS être annulé. confirm_delete_account=Confirmer la suppression +delete_account_title=Supprimer un compte +delete_account_desc=Êtes-vous sûr de vouloir supprimer définitivement ce compte ? [repo] owner=Propriétaire repo_name=Nom du dépôt +repo_name_helper=Idéalement, le nom d'un dépôt devrait être court, mémorisable et unique. visibility=Visibilité +visiblity_helper=Rendre le dépôt privé +visiblity_helper_forced=L'administrateur de votre site impose que les nouveaux dépôts soient privés. +visiblity_fork_helper=(Les changement de cette valeur affecteront toutes les bifurcations.) +clone_helper=Besoin d'aide pour dupliquer ? Visitez l'aide. fork_repo=Créer une bifurcation du dépôt fork_from=Bifurquer depuis +fork_visiblity_helper=La visibilité d'un dépôt bifurqué ne peut être changée. repo_desc=Description repo_lang=Langue +repo_gitignore_helper=Choisissez un modèle de fichier .gitignore. license=Licence +license_helper=Sélectionner un fichier de licence. +readme=LISEZMOI +readme_helper=Choisissez un modèle de fichier LISEZMOI. +auto_init=Initialiser le dépôt (ajoute les fichiers .gitignore, Licence et LISEZMOI) create_repo=Créer un dépôt default_branch=Branche par défaut mirror_prune=Purger +mirror_prune_desc=Supprimer les références externes obsolètes +mirror_interval=Intervalle de synchronisation (les unités de temps valides sont "h", "m" et "s") +mirror_interval_invalid=L'intervalle de synchronisation est invalide. +mirror_address=Cloner depuis une URL +mirror_address_desc=Inclure les informations d'authentification requises dans l'URL. +mirror_last_synced=Dernière synchronisation watchers=Observateurs stargazers=Fans forks=Bifurcations @@ -262,22 +524,33 @@ reactions_more=et %d de plus form.reach_limit_of_creation=Vous avez déjà atteint la limite des %d dépôts. form.name_reserved=Le dépôt "%s" a un nom réservé. +form.name_pattern_not_allowed=%s" n'est pas autorisé dans un nom de dépôt. +need_auth=Autorisations de clonage migrate_type=Type de migration migrate_type_helper=Ce dépôt sera un miroir migrate_repo=Migrer le dépôt +migrate.clone_address=Migrer/Cloner depuis une URL +migrate.clone_address_desc=L'URL HTTP(S) ou Git "clone" d'un dépôt existant +migrate.clone_local_path=ou un chemin serveur local migrate.permission_denied=Vous n'êtes pas autorisé à importer des dépôts locaux. +migrate.invalid_local_path=Chemin local non valide, non existant ou n'étant pas un dossier. migrate.failed=Echec de migration: %v +migrate.lfs_mirror_unsupported=La synchronisation des objets LFS n'est pas supportée - veuillez utiliser 'git lfs fetch --all' et 'git lfs push --all' à la place. mirror_from=miroir de forked_from=bifurqué depuis +fork_from_self=Vous ne pouvez pas bifurquer un dépôt que vous possédez. copy_link=Copier +copy_link_success=Le lien a été copié +copy_link_error=Appuyez sur ⌘-C ou Ctrl-C pour copier copied=Copié unwatch=Ne plus suivre watch=Suivre unstar=Retirer le vote star=Favoriser fork=Bifurcation +download_archive=Télécharger ce dépôt no_desc=Aucune description quick_guide=Introduction rapide @@ -287,6 +560,7 @@ push_exist_repo=Soumission d'un dépôt existant par ligne de commande bare_message=Ce dépôt ne contient aucune information. code=Code +code.desc=Accéder au code source, fichiers, révisions et branches. branch=Branche tree=Aborescence filter_branch_and_tag=Filtrer une branche ou un tag @@ -303,34 +577,68 @@ file_raw=Brut file_history=Historique file_view_raw=Voir le Raw file_permalink=Lien permanent +file_too_large=Le fichier est trop gros pour être affiché. +video_not_supported_in_browser=Votre navigateur ne supporte pas le tag HTML5 "video". stored_lfs=Stocké avec Git LFS +commit_graph=Graphique des révisions +editor.new_file=Nouveau fichier +editor.upload_file=Téléverser un fichier +editor.edit_file=Modifier le fichier editor.preview_changes=Aperçu des modifications +editor.cannot_edit_non_text_files=Les fichiers binaires ne peuvent pas être édités dans l'interface web. +editor.edit_this_file=Modifier le fichier +editor.must_be_on_a_branch=Vous devez être sur une branche pour appliquer ou proposer des modifications à ce fichier. +editor.fork_before_edit=Vous devez faire bifurquer ce dépôt pour appliquer ou proposer des modifications à ce fichier. +editor.delete_this_file=Supprimer le fichier +editor.must_have_write_access=Vous devez avoir un accès en écriture pour appliquer ou proposer des modifications à ce fichier. +editor.file_delete_success=Le fichier '%s' a été supprimé. +editor.name_your_file=Nommez votre fichier… +editor.filename_help=Ajoutez un dossier en entrant son nom suivi d'une barre oblique ('/'). Supprimez un dossier avec un retour arrière au début du champ. editor.or=ou +editor.cancel_lower=Annuler editor.commit_changes=Committer les modifications editor.add_tmpl=Ajouter '%s/' editor.add=Ajouter '%s' editor.update=Mettre à jour '%s' editor.delete=Supprimer '%s' +editor.commit_message_desc=Ajouter une description détaillée facultative… editor.commit_directly_to_this_branch=Soumettre directement dans la branche %s. editor.create_new_branch=Créer une nouvelle branche pour cette révision et envoyer une nouvelle demande d'ajout. +editor.new_branch_name_desc=Nouveau nom de la branche… editor.cancel=Annuler +editor.filename_cannot_be_empty=Le nom de fichier ne peut être vide. editor.branch_already_exists=La branche '%s' existe déjà dans ce dépôt. +editor.directory_is_a_file=Le nom de dossier '%s' est déjà utilisé comme nom de fichier dans ce dépôt. +editor.file_is_a_symlink='%s' est un lien symbolique. Les liens symboliques ne peuvent être édités dans l'interface web +editor.filename_is_a_directory=Le nom de fichier '%s' est déjà utilisé comme nom de dossier dans ce dépôt. +editor.file_editing_no_longer_exists=Le fichier en cours d'édition, '%s', n'existe plus dans ce dépôt. +editor.file_changed_while_editing=Le contenu de ce fichier a changé depuis le début de l'édition. Cliquez ici pour voir les changements ou soumettez de nouveau pour écraser ces changements. +editor.file_already_exists=Un fichier nommé '%s' existe déjà dans ce dépôt. editor.no_changes_to_show=Il n’y a aucun changement à afficher. editor.fail_to_update_file=Échec lors de la mise à jour/création du fichier '%s' avec l’erreur : %v +editor.add_subdir=Ajouter un dossier… editor.unable_to_upload_files=Échec lors de l'envoie du fichier '%s' avec l’erreur : %v editor.upload_files_to_dir=Transférer les fichiers vers '%s' +editor.cannot_commit_to_protected_branch=Impossible de créer une révision sur la branche protégée '%s'. +commits.desc=Naviguer dans l'historique des modifications. commits.commits=Révisions +commits.search=Rechercher des révisions… commits.find=Chercher +commits.search_all=Toutes les branches commits.author=Auteur commits.message=Message commits.date=Date commits.older=Précédemment commits.newer=Récemment commits.signed_by=Signé par +commits.gpg_key_id=ID de la clé GPG +ext_issues=Gestionnaire de tickets externe +ext_issues.desc=Lien vers un gestionnaire de tickets externe. +issues.desc=Organiser les rapports de bug, les tâches et les jalons. issues.new=Nouveau ticket issues.new.labels=Étiquettes issues.new.no_label=Pas d'étiquette @@ -340,12 +648,19 @@ issues.new.no_milestone=Aucun jalon issues.new.clear_milestone=Effacer le jalon issues.new.open_milestone=Ouvrir un jalon issues.new.closed_milestone=Jalons fermés +issues.new.assignees=Affecté à +issues.new.clear_assignees=Supprimer les affectations +issues.new.no_assignees=Aucune affectation issues.no_ref=Aucune branche/tag spécifiés issues.create=Créer un ticket issues.new_label=Nouvelle étiquette +issues.new_label_placeholder=Nom de l'étiquette +issues.new_label_desc_placeholder=Description issues.create_label=Créer une étiquette issues.label_templates.title=Charger un ensemble prédéfini d'étiquettes +issues.label_templates.info=Il n'existe pas encore d'étiquettes. Créez une étiquette avec 'Nouvelle étiquette' ou utilisez un jeu d'étiquettes prédéfini : issues.label_templates.helper=Sélectionnez un ensemble d'étiquettes +issues.label_templates.use=Utiliser le jeu de labels issues.label_templates.fail_to_load_file=Impossible de charger le fichier de modèle étiquette '%s' : %v issues.add_label_at=a ajouté l'étiquette
%s
%s issues.remove_label_at=a supprimé l'étiquette
%s
%s @@ -361,8 +676,11 @@ issues.delete_branch_at=`a supprimé la branche %s %s` issues.open_tab=%d Ouvert issues.close_tab=%d Fermé issues.filter_label=Étiquette +issues.filter_label_no_select=Toutes les étiquettes issues.filter_milestone=Jalon +issues.filter_milestone_no_select=Tous les jalons issues.filter_assignee=Assigné +issues.filter_assginee_no_select=Toutes les affectations issues.filter_type=Type issues.filter_type.all_issues=Tous les tickets issues.filter_type.assigned_to_you=Qui vous sont assignés @@ -375,6 +693,10 @@ issues.filter_sort.recentupdate=Mis à jour récemment issues.filter_sort.leastupdate=Moins récemment mis à jour issues.filter_sort.mostcomment=Les plus commentés issues.filter_sort.leastcomment=Les moins commentés +issues.filter_sort.moststars=Favoris (décroissant) +issues.filter_sort.feweststars=Favoris (croissant) +issues.filter_sort.mostforks=Bifurcations (décroissant) +issues.filter_sort.fewestforks=Bifurcations (croissant) issues.action_open=Ouvrir issues.action_close=Fermer issues.action_label=Étiquette @@ -393,7 +715,9 @@ issues.commented_at=`a commenté %s` issues.delete_comment_confirm=Êtes-vous certain de vouloir supprimer ce commentaire? issues.no_content=Il n'existe pas encore de contenu. issues.close_issue=Fermer +issues.close_comment_issue=Commenter et Fermer issues.reopen_issue=Réouvrir +issues.reopen_comment_issue=Commenter et Réouvrir issues.create_comment=Créer un commentaire issues.closed_at=`fermé à %[2]s` issues.reopened_at=`réouvert à %[2]s` @@ -406,11 +730,16 @@ issues.edit=Modifier issues.cancel=Annuler issues.save=Enregistrer issues.label_title=Nom de l'étiquette +issues.label_description=Description de l’étiquette issues.label_color=Couleur de l'étiquette issues.label_count=%d étiquettes issues.label_open_issues=%d tickets ouverts issues.label_edit=Éditer issues.label_delete=Supprimer +issues.label_modify=Modifier l'étiquette +issues.label_deletion=Supprimer l'étiquette +issues.label_deletion_desc=Supprimer une etiquette l'enlève de tous les tickets. Continuer ? +issues.label_deletion_success=L'étiquette a été supprimée. issues.label.filter_sort.alphabetically=Par ordre alphabétique issues.label.filter_sort.reverse_alphabetically=Par ordre alphabétique inversé issues.label.filter_sort.by_size=Taille @@ -420,32 +749,70 @@ issues.attachment.open_tab=`Cliquez ici pour voir '%s' dans un nouvel onglet` issues.attachment.download=`Cliquez pour télécharger "%s"` issues.subscribe=S’abonner issues.unsubscribe=Se désabonner +issues.tracker=Suivi du temps issues.start_tracking_short=Démarrer +issues.start_tracking=Démarrer le suivi du temps issues.start_tracking_history=`a démarré il y a %s` issues.tracking_already_started=`Vous avez déjà démarré le suivi de temps pour cette tâche!` issues.stop_tracking=Arrêter issues.stop_tracking_history=`a fini de travaillé pour %s` +issues.add_time=Ajouter un minuteur manuellement +issues.add_time_short=Ajouter un minuteur issues.add_time_cancel=Annuler issues.add_time_history=` temps passé ajouté %s` issues.add_time_hours=Heures issues.add_time_minutes=Minutes +issues.add_time_sum_to_small=Aucun minuteur n'a été saisi. issues.cancel_tracking=Annuler issues.cancel_tracking_history=`a annulé le suivi de temps pour %s` +issues.time_spent_total=Temps passé total +issues.time_spent_from_all_authors=`Temps passé total : %s` +issues.due_date=Échéance +issues.invalid_due_date_format=Le format de la date d'échéance est invalide, il doit être comme suit 'aaaa-mm-jj'. +issues.error_modifying_due_date=Impossible de modifier l'échéance. +issues.error_removing_due_date=Impossible de supprimer l'échéance. +issues.due_date_form=aaaa-mm-jj +issues.due_date_form_add=Ajouter une échéance +issues.due_date_form_update=Mettre à jour l'échéance +issues.due_date_form_remove=Retirer l'échéance +issues.due_date_not_writer=Vous devez avoir accès au dépôt en écriture pour mettre à jour l'échéance d'un ticket. +issues.due_date_not_set=Aucune échéance n'a été définie. +issues.due_date_added=a ajouté l'échéance %s %s +issues.due_date_modified=a modifié l'échéance de %[2]s vers %[1]s %[3]s +issues.due_date_remove=a supprimé l'échéance %s %s +issues.due_date_overdue=En retard +pulls.desc=Activer les demandes de fusion et la revue de code. pulls.new=Nouvelle demande d'ajout +pulls.compare_changes=Nouvelle demande de fusion +pulls.compare_changes_desc=Sélectionnez la branche dans laquelle fusionner et la branche depuis laquelle tirer les modifications. +pulls.compare_base=fusionner dans +pulls.compare_compare=tirer les modifications depuis pulls.filter_branch=Filtre de branche pulls.no_results=Aucun résultat trouvé. +pulls.nothing_to_compare=Ces branches sont identiques. Il n'y a pas besoin de créer une demande de fusion. +pulls.has_pull_request=`Une demande de fusion entre ces branches existe déjà : %[2]s#%[3]d` pulls.create=Creer une demande d'ajout pulls.title_desc=veut fusionner %[1]d révision(s) depuis %[2]s vers %[3]s pulls.merged_title_desc=a fusionné %[1]d révision(s) à partir de %[2]s vers %[3]s %[4]s pulls.tab_conversation=Discussion pulls.tab_commits=Révisions +pulls.tab_files=Fichiers Modifiés pulls.reopen_to_merge=Veuillez rouvrir cette demande d'ajout pour effectuer l'opération de fusion. pulls.merged=Fusionnée +pulls.has_merged=La pull request a été fusionnée. +pulls.data_broken=Cette demande de fusion est impossible par manque d'informations de bifurcation. +pulls.is_checking=Vérification des conflits de fusion en cours. Réessayez dans quelques instants. pulls.can_auto_merge_desc=Cette demande d'ajout peut être fusionnée automatiquement. +pulls.cannot_auto_merge_desc=Cette demande de fusion ne peut être appliquée automatiquement en raison de conflits de fusion. +pulls.cannot_auto_merge_helper=Fusionner manuellement pour résoudre les conflits. +pulls.no_merge_desc=Cette demande de fusion ne peut être appliquée directement car toutes les options de fusion du dépôt sont désactivées. +pulls.no_merge_helper=Activez des options de fusion dans les paramètres du dépôt ou fusionnez la demande manuellement. pulls.merge_pull_request=Fusionner la demande d'ajout pulls.rebase_merge_pull_request=Rebase et fusionner pulls.squash_merge_pull_request=Squash et fusionner +pulls.invalid_merge_option=Vous ne pouvez pas utiliser cette option de fusion pour cette demande. +pulls.open_unmerged_pull_exists=`Vous ne pouvez pas effectuer une opération de réouverture car il y a une demande de pull (#%d) en attente avec des propriétés identiques.` milestones.new=Nouveau jalon milestones.open_tab=%d Ouvert @@ -454,13 +821,22 @@ milestones.closed=%s fermé milestones.no_due_date=Aucune date d'échéance milestones.open=Ouvrir milestones.close=Fermer +milestones.new_subheader=Les jalons organisent les tickets et le suivi d'avancement. milestones.create=Créer un Jalon milestones.title=Titre milestones.desc=Description milestones.due_date=Date d'échéance (facultatif) milestones.clear=Effacer +milestones.invalid_due_date_format=Le format de la date d'échéance est invalide, il doit être comme suit 'aaaa-mm-jj'. +milestones.create_success=Le jalon "%s" a été créé. milestones.edit=Éditer le Jalon +milestones.edit_subheader=Les jalons organisent les tickets et le suivi d'avancement. milestones.cancel=Annuler +milestones.modify=Mettre à jour un jalon +milestones.edit_success=Le jalon "%s" a été mis à jour. +milestones.deletion=Supprimer un Jalon +milestones.deletion_desc=Supprimer un jalon le retire de tous les tickets. Continuer ? +milestones.deletion_success=Le jalon a été supprimé. milestones.filter_sort.closest_due_date=Date d'échéance la plus proche milestones.filter_sort.furthest_due_date=Date d'échéance la plus éloignée milestones.filter_sort.least_complete=Le moins complété @@ -468,17 +844,26 @@ milestones.filter_sort.most_complete=Le plus complété milestones.filter_sort.most_issues=Le plus de tickets milestones.filter_sort.least_issues=Le moins de tickets +ext_wiki=Wiki externe +ext_wiki.desc=Lier un wiki externe. wiki=Wiki +wiki.welcome=Bienvenue sur le Wiki. +wiki.welcome_desc=Le wiki vous permet d'écrire ou de partager de la documentation avec vos collaborateurs. +wiki.desc=Écrire et partager de la documentation avec vos collaborateurs. +wiki.create_first_page=Créer la première page wiki.page=Page wiki.filter_page=Filtrer la page +wiki.new_page=Page wiki.default_commit_message=Écrire une note concernant cette mise à jour (optionnel). wiki.save_page=Enregistrer la page wiki.last_commit_info=%s a édité cette page %s wiki.edit_page_button=Modifier wiki.new_page_button=Nouvelle Page wiki.delete_page_button=Supprimer la page +wiki.delete_page_notice_1=Supprimer la page de wiki "%s" ne peut être annulé. Continuer ? wiki.page_already_exists=Une page de wiki avec le même nom existe déjà. +wiki.reserved_page=Le nom de page de wiki "%s" est réservé. wiki.pages=Pages wiki.last_updated=Dernière mise à jour: %s @@ -487,7 +872,7 @@ activity.period.filter_label=Période: activity.period.daily=1 jour activity.period.halfweekly=3 jours activity.period.weekly=1 semaine -activity.period.monthly=1 semaine +activity.period.monthly=1 mois activity.overview=Vue d'ensemble activity.active_prs_count_1=%d demande d'ajout active activity.active_prs_count_n=%d demandes d'ajout actives @@ -515,6 +900,9 @@ activity.closed_issue_label=Fermé activity.new_issues_count_1=Nouveau ticket activity.new_issues_count_n=Nouveaux tickets activity.new_issue_label=Ouvert +activity.title.unresolved_conv_1=%d conversations non résolues +activity.title.unresolved_conv_n=%d conversations non résolues +activity.unresolved_conv_desc=Ces tickets et demandes de fusion récemment mis à jour n'ont pas encore été résolus. activity.unresolved_conv_label=Ouvrir activity.title.releases_1=%d version activity.title.releases_n=%d versions @@ -527,6 +915,9 @@ search.results=Résulats de la recherche « %s » dans %s settings=Paramètres settings.desc=Les paramètres sont l'endroit où gérer les options du dépôt +settings.options=Dépôt +settings.collaboration=Collaborateurs +settings.collaboration.admin=Administrateur settings.collaboration.write=Écriture settings.collaboration.read=Lecture settings.collaboration.undefined=Indéfini @@ -534,56 +925,178 @@ settings.hooks=Déclencheurs Web settings.githooks=Déclencheurs Git settings.basic_settings=Paramètres de base settings.mirror_settings=Réglages Miroir +settings.sync_mirror=Synchroniser maintenant +settings.mirror_sync_in_progress=La synchronisation est en cours. Revenez dans une minute. +settings.site=Site Web settings.update_settings=Valider settings.advanced_settings=Paramètres avancés +settings.wiki_desc=Activer le wiki du dépôt +settings.use_internal_wiki=Utiliser le wiki interne +settings.use_external_wiki=Utiliser un wiki externe settings.external_wiki_url=URL Wiki externe +settings.external_wiki_url_error=L’URL du wiki externe n’est pas une URL valide. +settings.external_wiki_url_desc=Les visiteurs sont redirigés vers l’URL du wiki externe lors d'un clic sur l’onglet wiki. +settings.issues_desc=Activer le suivi de tickets du dépôt +settings.use_internal_issue_tracker=Utiliser le suivi de tickets interne +settings.use_external_issue_tracker=Utiliser un système de suivi de tickets externe settings.external_tracker_url=Adresse du système de tickets externe +settings.external_tracker_url_error=L’URL du système de suivi de tickets externe n’est pas une URL valide. +settings.external_tracker_url_desc=Les visiteurs sont redirigés vers l’URL du système de suivi de tickets externe lors d'un clic sur l’onglet tickets. settings.tracker_url_format=Format de l'URL du système de tickets +settings.tracker_issue_style=Format du nombre de tickets du système de tickets externe settings.tracker_issue_style.numeric=Numérique settings.tracker_issue_style.alphanumeric=Alphanumérique +settings.tracker_url_format_desc=Utilisez les balises {user}, {repo} et {index} respectivement pour le nom d'utilisateur, le nom du dépôt et le numéro de ticket. +settings.enable_timetracker=Activer le suivi du temps +settings.allow_only_contributors_to_track_time=Restreindre le suivi de temps aux contributeurs +settings.pulls_desc=Activer les demandes de fusion +settings.pulls.ignore_whitespace=Ignorer les espaces lors des conflits +settings.pulls.allow_merge_commits=Activer la fusion de révisions +settings.pulls.allow_rebase_merge=Activer le rebasage pour la fusion de révisions +settings.pulls.allow_squash_commits=Activer la concaténation de révisions +settings.admin_settings=Paramètres administrateur +settings.admin_enable_health_check=Activer les vérifications de santé du dépôt (git fsck) settings.danger_zone=Zone de danger settings.new_owner_has_same_repo=Le nouveau propriétaire a déjà un dépôt nommé ainsi. +settings.convert=Convertir en dépôt standard +settings.convert_desc=Vous pouvez convertir ce miroir en dépôt standard. Ceci ne peut pas être annulé. +settings.convert_notices_1=Cette opération convertira le miroir en dépôt standard et ne peut être annulée. +settings.convert_confirm=Convertir le dépôt +settings.convert_succeed=Le miroir a été converti en dépôt standard. settings.transfer=Changer de propriétaire +settings.transfer_desc=Transférer ce dépôt à un autre utilisateur ou une organisation dont vous possédez des droits d'administrateur. +settings.transfer_notices_1=- Vous perdrez l'accès à ce dépôt si vous le transférez à un autre utilisateur. +settings.transfer_notices_2=- Vous conserverez l'accès à ce dépôt si vous le transférez à une organisation dont vous êtes (co-)propriétaire. +settings.transfer_form_title=Entrez le nom du dépôt pour confirmer : +settings.wiki_delete=Supprimer les données du Wiki +settings.wiki_delete_desc=Supprimer les données du wiki d'un dépôt est permanent et ne peut être annulé. +settings.wiki_delete_notices_1=- Ceci supprimera de manière permanente et désactivera le wiki de dépôt pour %s. +settings.confirm_wiki_delete=Supprimer les données du Wiki +settings.wiki_deletion_success=Les données du wiki de ce dépôt ont été effacées. settings.delete=Supprimer ce dépôt +settings.delete_desc=Supprimer un dépôt est permanent et ne peut être annulé. settings.delete_notices_1=- Cette opération ne peut pas être annulée. +settings.delete_notices_2=- Cette opération supprimera définitivement le dépôt %s, y compris le code, les tickets, les commentaires, les données de wiki et les accès des collaborateurs. +settings.delete_notices_fork_1=- Les bifurcations de ce dépôt deviendront indépendants après suppression. +settings.deletion_success=Le dépôt a été supprimé. +settings.update_settings_success=Les options du dépôt ont été mises à jour. settings.transfer_owner=Nouveau propriétaire +settings.make_transfer=Transférer +settings.transfer_succeed=Le dépôt a été transféré. +settings.confirm_delete=Supprimer le dépôt +settings.add_collaborator=Ajouter un collaborateur +settings.add_collaborator_success=Le collaborateur a été ajouté. +settings.delete_collaborator=Supprimer +settings.collaborator_deletion=Supprimer le collaborateur +settings.collaborator_deletion_desc=La suppression d'un collaborateur révoque son accès à ce dépôt. Continuer ? +settings.remove_collaborator_success=Le collaborateur a été retiré. +settings.search_user_placeholder=Rechercher un utilisateur… +settings.org_not_allowed_to_be_collaborator=Les organisations ne peuvent être ajoutées en tant que collaborateur. +settings.user_is_org_member=L'utilisateur est un membre d'organisation qui ne peut être ajouté comme collaborateur. settings.add_webhook=Ajouter un déclencheur Web +settings.hooks_desc=Les webhooks envoient automatiquement des requêtes HTTP POST vers un serveur lorsque certains événements Gitea sont déclenchés. Apprenez-en plus dans le guide webhooks. +settings.webhook_deletion=Retirer le Webhook +settings.webhook_deletion_desc=Supprimer un webhook supprime ses paramètres et son historique. Continuer ? +settings.webhook_deletion_success=Le webhook a été supprimé. settings.webhook.test_delivery=Tester la version +settings.webhook.test_delivery_desc=Testez ce webhook avec un faux événement. +settings.webhook.test_delivery_success=Un faux événement a été ajouté à la file d'attente. L'affichage dans l'historique peut prendre quelques secondes. settings.webhook.request=Requête settings.webhook.response=Réponse settings.webhook.headers=Entêtes +settings.webhook.payload=Contenu settings.webhook.body=Corps +settings.githooks_desc=Les déclencheurs Git sont lancés par Git lui-même. Ils sont modifiables dans la liste ci-dessous afin de configurer des opérations personnalisées. settings.githook_edit_desc=Si un Hook est inactif, un exemple de contenu vous sera proposé. Un contenu laissé vide signifie un Hook inactif. settings.githook_name=Nom du Hook settings.githook_content=Contenu du Hook settings.update_githook=Mettre le Hook à jour +settings.add_webhook_desc=Gitea enverra des requêtes POST avec un type de contenu donné à l'URL cible. Apprenez-en plus dans le guide webhooks. +settings.payload_url=URL cible +settings.content_type=Type de contenu POST settings.secret=Confidentiel settings.slack_username=Nom d'utilisateur settings.slack_icon_url=URL de l'icône settings.discord_username=Nom d'utilisateur settings.discord_icon_url=URL de l'icône settings.slack_color=Couleur +settings.event_desc=Événement déclencheur : +settings.event_push_only=Événements de pe poussée +settings.event_send_everything=Tous les événements +settings.event_choose=Événements personnalisés… settings.event_create=Créer +settings.event_create_desc=Branche ou Tag créé. +settings.event_delete=Supprimer +settings.event_delete_desc=Branche ou tag supprimé +settings.event_fork=Bifurcation +settings.event_fork_desc=Dépôt bifurqué +settings.event_issues=Tickets +settings.event_issues_desc=Ticket ouvert, fermé, réouvert, modifié, assigné, non-assigné, étiquette mise à jour, étiquette nettoyée, jalonnée, ou déjalonnée. +settings.event_issue_comment=Commentaire du ticket +settings.event_issue_comment_desc=Commentaire du ticket créé, modifié, ou supprimé. +settings.event_release=Version +settings.event_release_desc=Version publiée, mise à jour ou supprimée dans un dépôt. settings.event_pull_request=Demande d'ajout +settings.event_pull_request_desc=Demande de fusion ouverte, fermée, rouverte, éditée, attribuée, désattribuée, étiquette mise à jour, étiquette désactivée ou synchronisée. settings.event_push=Pousser +settings.event_push_desc=Git push vers un dépôt. settings.event_repository=Dépôt +settings.event_repository_desc=Dépôt créé ou supprimé. +settings.active=Inclure les détails de l'événement +settings.active_helper=Ajouter des informations sur l’événement déclencheur aux requêtes. +settings.add_hook_success=Nouveau Webhook ajouté. settings.update_webhook=Mettre à jour le Webhook +settings.update_hook_success=Webhook mis à jour. +settings.delete_webhook=Retirer le Webhook settings.recent_deliveries=Livraisons récentes settings.hook_type=Type de Hook +settings.add_slack_hook_desc=Intégrer Slack au dépôt. settings.slack_token=Jeton settings.slack_domain=Domaine settings.slack_channel=Canal +settings.add_discord_hook_desc=Intégrer Discord au dépôt. +settings.add_dingtalk_hook_desc=Intégrer Dingtalk au dépôt. settings.deploy_keys=Clés de déploiement settings.add_deploy_key=Ajouter une clé de déploiement +settings.deploy_key_desc=Les clefs de déploiement on un accès en lecture seule au dépôt. +settings.is_writable=Activer l'accès en écriture +settings.is_writable_info=Permettre à cette clef de déploiement de pousser des modifications vers ce dépôt. +settings.no_deploy_keys=Il n'y a pas encore de clefs de déploiement. settings.title=Titre settings.deploy_key_content=Contenu +settings.key_been_used=Une clef de déploiement identique est déjà en cours d'utilisation. +settings.key_name_used=Une clef de déploiement du même nom existe déjà. +settings.add_key_success=La clef de déploiement "%s" à été ajoutée. +settings.deploy_key_deletion=Supprimer une clef de déploiement +settings.deploy_key_deletion_desc=La suppression d'une clef de déploiement révoque son accès à ce dépôt. Continuer ? +settings.deploy_key_deletion_success=La clé de déploiement a été supprimée. settings.branches=Branches 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.protect_this_branch=Protection de la branche +settings.protect_this_branch_desc=Interdire de supprimer la branche et désactiver les mises à jours forcées. +settings.protect_whitelist_committers=Activer la liste blanche pour les mises à jour +settings.protect_whitelist_committers_desc=Autoriser les utilisateurs sur la liste blanche et les équipes de contourner les restrictions. +settings.protect_whitelist_users=Utilisateurs en liste blanche : +settings.protect_whitelist_search_users=Rechercher des utilisateurs… +settings.protect_whitelist_teams=Équipes en liste blanche : +settings.protect_whitelist_search_teams=Rechercher des équipes… +settings.protect_merge_whitelist_committers=Activer la liste blanche pour la fusion +settings.protect_merge_whitelist_committers_desc=N'autoriser que les utilisateurs et les équipes en liste blanche d'appliquer les demandes de fusion sur cette branche. +settings.protect_merge_whitelist_users=Utilisateurs en liste blanche de fusion : +settings.protect_merge_whitelist_teams=Équipes en liste blanche de fusion : settings.add_protected_branch=Activer la protection settings.delete_protected_branch=Désactiver la protection +settings.update_protect_branch_success=La protection de branche à été mise à jour pour la branche "%s". +settings.remove_protected_branch_success=La protection de branche à été désactivée pour la branche "%s". +settings.protected_branch_deletion=Désactiver la protection de branche +settings.protected_branch_deletion_desc=Désactiver la protection de branche permet aux utilisateurs ayant accès en écriture de pousser des modifications sur la branche. Continuer ? +settings.default_branch_desc=Sélectionnez une branche par défaut pour les demandes de fusion et les révisions : +settings.choose_branch=Choisissez une branche… +settings.no_protected_branch=Il n'y a pas de branche protégée. diff.browse_source=Parcourir la source diff.parent=Parent @@ -598,6 +1111,7 @@ diff.view_file=Voir le fichier diff.file_suppressed=Fichier diff supprimé car celui-ci est trop grand diff.too_many_files=Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff +releases.desc=Suivi des versions et des téléchargements. release.releases=Versions release.new_release=Nouvelle version release.draft=Brouillon @@ -606,53 +1120,102 @@ release.stable=Stable release.edit=Éditer release.ahead=%d révisions sur %s depuis cette publication release.source_code=Code source +release.new_subheader=Les versions organisent les versions publiées du projet. +release.edit_subheader=Les versions organisent les versions publiées du projet. release.tag_name=Nom du tag release.target=Cible +release.tag_helper=Choisissez un tag existant ou créez un nouveau tag. release.title=Titre release.content=Contenu release.write=Écrire release.preview=Prévisualiser +release.loading=Chargement… +release.prerelease_desc=Marquer comme pré-version +release.prerelease_helper=Marquer cette version comme impropre à la production. release.cancel=Annuler release.publish=Publier release.save_draft=Sauvegarder le Brouillon +release.edit_release=Modifier la version +release.delete_release=Supprimer cette version +release.deletion=Supprimer cette version +release.deletion_desc=Supprimer une version enlève sa balise du dépôt. Le contenu et l'historique du dépôt restent inchangés. Continuer ? release.deletion_success=Cette livraison a été supprimée. +release.tag_name_already_exist=Une version avec ce nom de balise existe déjà. +release.tag_name_invalid=Le nom de balise est invalide. release.downloads=Téléchargements +branch.name=Nom de la branche branch.search=Rechercher des branches +branch.already_exists=Une branche nommée %s existe déjà. branch.delete_head=Supprimer +branch.delete=Supprimer la branche '%s' branch.delete_html=Supprimer la branche +branch.delete_desc=Supprimer une branche est permanent. Cela NE PEUVENT être annulées. Continuer ? +branch.deletion_success=La branche "%s" a été supprimée. +branch.deletion_failed=Impossible de supprimer la branche %s. +branch.delete_branch_has_new_commits=La branche '%s' ne peut être supprimé car de nouvelles révisions ont été ajoutées après la fusion. branch.create_branch=Créer la branche %s branch.create_from=de '%s' +branch.create_success=La branche "%s" a été crée. branch.branch_already_exists=La branche '%s' existe déjà dans ce dépôt. +branch.branch_name_conflict=Le nom de la branche « %s » est en conflit avec une branche existante « %s ». +branch.tag_collision=La branche '%s' ne peut être créée comme une balise car un nom identique existe déjà dans le dépôt. branch.deleted_by=Supprimée par %s +branch.restore_success=La branche "%s" a été restaurée. +branch.restore_failed=La restauration de la branche '%s' a échoué. +branch.protected_deletion_failed=La branche '%s' est protégé. Il ne peut pas être supprimé. +topic.manage_topics=Gérer les sujets +topic.done=Terminé +topic.count_prompt=Vous ne pouvez pas sélectionner plus de 25 sujets +topic.format_prompt=Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets (-), sans dépasser 35 caractères [org] org_name_holder=Nom de l'organisation org_full_name_holder=Nom complet de l'organisation +org_name_helper=Le nom de l'organisation doit être court et mémorable. create_org=Créer une organisation repo_updated=Mis à jour people=Contacts teams=Équipes lower_members=Membres lower_repositories=dépôts +create_new_team=Nouvelle équipe +create_team=Créer une équipe org_desc=Description team_name=Nom de l'équipe team_desc=Description +team_name_helper=Le nom d'équipe doit être court et mémorable. +team_desc_helper=Décrire le but ou le rôle de l’équipe. +team_permission_desc=Autorisation +team_unit_desc=Permettre l’accès aux Sections du dépôt +form.name_reserved=Le nom d'organisation "%s" est réservé. +form.name_pattern_not_allowed=Le paterne '%s' n'est pas autorisé dans un nom d'oraganisation. +form.create_org_not_allowed=Vous n'êtes pas autorisé à créer une organisation. settings=Paramètres +settings.options=Organisation settings.full_name=Non Complet settings.website=Site Web settings.location=Localisation settings.update_settings=Valider settings.update_setting_success=Les paramètres de l'organisation ont été mis à jour. +settings.change_orgname_prompt=NB: changer le nom de l'organisation changera aussi son URL. +settings.update_avatar_success=L'avatar de l'organisation a été mis à jour. settings.delete=Supprimer l'organisation settings.delete_account=Supprimer cette organisation +settings.delete_prompt=Cette organisation sera supprimée définitivement. Cette opération est IRRÉVERSIBLE ! settings.confirm_delete_account=Confirmez la suppression +settings.delete_org_title=Supprimer l'organisation +settings.delete_org_desc=Cette organisation sera supprimée définitivement. Voulez-vous continuer ? settings.hooks_desc=Vous pouvez ajouter des déclencheurs qui seront activés pour tous les dépôts de cette organisation. members.membership_visibility=Visibilité des membres: +members.public=Public +members.public_helper=rendre caché +members.private=Caché +members.private_helper=rendre visible members.member_role=Rôle du membre : members.owner=Propriétaire members.member=Membre @@ -664,22 +1227,36 @@ members.invite_now=Envoyer une invitation teams.join=Rejoindre teams.leave=Quitter teams.read_access=Accès en lecture +teams.read_access_helper=Les membres peuvent voir et cloner les dépôts d'équipes. teams.write_access=Accès en écriture +teams.write_access_helper=Les membres peuvent voir et cloner les dépôts d'équipes. +teams.admin_access=Accès Administrateur +teams.admin_access_helper=Les membres peuvent tirer et pousser des modifications vers les dépôts de l'équipe, et y ajouter des collaborateurs. teams.no_desc=Aucune description teams.settings=Paramètres +teams.owners_permission_desc=Les propriétaires ont un accès complet à tous les dépôts et disposent d'un accès administrateur de l'organisation. teams.members=Membres de L'Équipe teams.update_settings=Valider +teams.delete_team=Supprimer l'équipe teams.add_team_member=Ajouter un Membre +teams.delete_team_title=Supprimer l'équipe +teams.delete_team_desc=Supprimer une équipe supprime l'accès au dépôt à ses membres. Continuer ? teams.delete_team_success=L’équipe a été supprimé. +teams.read_permission_desc=Cette équipe permet l'accès en lecture : les membres peuvent voir et dupliquer ses dépôts. +teams.write_permission_desc=Cette équipe permet l'accès en écriture : les membres peuvent participer à ses dépôts. +teams.admin_permission_desc=Cette équipe permet l'accès administrateur : les membres peuvent voir, participer et ajouter des collaborateurs à ses dépôts. teams.repositories=Dépôts de l'Équipe +teams.search_repo_placeholder=Rechercher dans le dépôt… teams.add_team_repository=Ajouter un Dépôt à l'Équipe teams.remove_repo=Supprimer teams.add_nonexistent_repo=Dépôt inexistant, veuillez d'abord le créer. [admin] dashboard=Tableau de bord +users=Comptes utilisateurs organizations=Organisations repositories=Dépôts +authentication=Sources d'authentification config=Configuration notices=Notes Systèmes monitor=Surveillance @@ -687,6 +1264,10 @@ first_page=Première last_page=Dernière total=Total : %d +dashboard.statistic=Résumé +dashboard.operations=Opérations de maintenance +dashboard.system_status=État du système +dashboard.statistic_info=La base de données Gitea contient %d utilisateurs, %d organisations, %d clés publiques, %d dépôts, %d surveillances de dépôts, %d votes, %d actions, %d accès, %d tickets, %d commentaires, %d comptes de réseaux sociaux, %d abonnements, %d miroirs, %d versions, %d sources d'authentification externes, %d webhooks, %d versions, %d labels, %d tâches hook, %d équipes, %d tâches de mise à jour, %d fichiers. dashboard.operation_name=Nom de l'Opération dashboard.operation_switch=Basculer dashboard.operation_run=Exécuter @@ -694,15 +1275,30 @@ dashboard.clean_unbind_oauth=Effacer les connexions OAuth associées dashboard.clean_unbind_oauth_success=Toutes les connexions OAuth associées ont été supprimées. dashboard.delete_inactivate_accounts=Supprimer tous les comptes inactifs dashboard.delete_inactivate_accounts_success=Tous les comptes inactifs ont été supprimés. +dashboard.delete_repo_archives=Supprimer toutes les archives du dépôt +dashboard.delete_repo_archives_success=Toutes les archives du dépôt ont été supprimées. +dashboard.delete_missing_repos=Supprimer tous les dépôts dont les fichiers Git sont manquants +dashboard.delete_missing_repos_success=Tous les dépôts dont les fichiers Git sont manquants ont été supprimés. +dashboard.git_gc_repos=Collecter les déchets des dépôts +dashboard.git_gc_repos_success=Les déchets de tous les dépôts ont été collectés. +dashboard.resync_all_sshkeys=Ajouter les clefs SSH Gitea au fichier ".ssh/authorized_keys". (Inutile si vous utilisez le serveur SSH intégré). +dashboard.resync_all_sshkeys_success=Toutes les clés publiques contrôlées par Gitea ont été réécrites. +dashboard.resync_all_hooks=Re-synchroniser les déclencheurs Git pre-receive, update et post-receive de tous les dépôts. +dashboard.resync_all_hooks_success=Tous les déclencheurs Git pre-receive, update et post-receive ont été resynchronisés. dashboard.reinit_missing_repos=Réinitialiser tous les dépôts Git manquants pour lesquels un enregistrement existe dashboard.reinit_missing_repos_success=Tous les dépôts Git manquants pour lesquels un enregistrement existait ont été réinitialisés. dashboard.sync_external_users=Synchroniser les données de l’utilisateur externe +dashboard.sync_external_users_started=La synchronisation des données des utilisateurs externes a commencé. +dashboard.git_fsck=Effectuer des contrôles de santé sur tous les dépôts +dashboard.git_fsck_started=Début des contrôles de santé du dépôt. dashboard.server_uptime=Uptime du serveur dashboard.current_goroutine=Goroutines actuelles dashboard.current_memory_usage=Utilisation Mémoire actuelle dashboard.total_memory_allocated=Mémoire totale allouée dashboard.memory_obtained=Mémoire obtenue dashboard.pointer_lookup_times=Nombre de Consultations Pointeur +dashboard.memory_allocate_times=Allocations de mémoire +dashboard.memory_free_times=Nombre de libérations de mémoire dashboard.current_heap_usage=Utilisation Tas (Heap) dashboard.heap_memory_obtained=Mémoire Tas (Heap) obtenue dashboard.heap_memory_idle=Mémoire Tas (Heap) au Repos @@ -725,18 +1321,43 @@ dashboard.total_gc_pause=Pause GC dashboard.last_gc_pause=Dernière Pause GC dashboard.gc_times=Nombres de GC +users.user_manage_panel=Gestion du compte utilisateur +users.new_account=Créer un compte +users.name=Nom d'utilisateur users.activated=Activé users.admin=Administrateur users.repos=Dépôts users.created=Créés +users.last_login=Dernière connexion +users.never_login=Jamais connecté +users.send_register_notify=Envoyer une notification d'inscription +users.new_success=L'utilisateur '%s' à bien été créé. users.edit=Éditer users.auth_source=Sources d'authentification users.local=Locales +users.auth_login_name=Nom d'utilisateur pour l'authentification +users.password_helper=Laissez le mot de passe vide pour le garder inchangé. +users.update_profile_success=Le compte a bien été mis à jour. +users.edit_account=Modifier un compte +users.max_repo_creation=Nombre maximal de dépôts +users.max_repo_creation_desc=(Mettre à -1 pour utiliser la limite globale par défaut.) +users.is_activated=Ce compte est activé +users.prohibit_login=Désactiver la connexion +users.is_admin=Est Administrateur +users.allow_git_hook=Autoriser la création de Git Hooks +users.allow_import_local=Autoriser l'importation de dépôts locaux +users.allow_create_organization=Autoriser la création d'organisations +users.update_profile=Modifier un compte +users.delete_account=Supprimer cet utilisateur +users.still_own_repo=Cet utilisateur possède un ou plusieurs dépôts. Veuillez les supprimer ou les transférer à un autre utilisateur. +users.still_has_org=Cet utilisateur est membre d'une organisation. Veuillez le retirer de toutes les organisations dont il est membre au préalable. +users.deletion_success=Le compte a été supprimé. orgs.org_manage_panel=Gestion des organisations orgs.name=Nom orgs.teams=Équipes orgs.members=Membres +orgs.new_orga=Nouvelle organisation repos.repo_manage_panel=Gestion des dépôts repos.owner=Propriétaire @@ -744,12 +1365,16 @@ repos.name=Nom repos.private=Privé repos.watches=Suivi par repos.stars=Votes +repos.forks=Bifurcations repos.issues=Tickets repos.size=Taille +auths.auth_manage_panel=Gestion des sources d'authentification +auths.new=Ajouter une source d'authentification auths.name=Nom auths.type=Type auths.enabled=Activé +auths.syncenabled=Activer la synchronisation des utilisateurs auths.updated=Mis à jour auths.auth_type=Type d'authentification auths.auth_name=Nom de l'authentification @@ -759,8 +1384,18 @@ auths.host=Hôte auths.port=Port auths.bind_dn=Bind DN auths.bind_password=Bind mot de passe +auths.bind_password_helper=Attention: ce mot de passe est stocké en clair. Veuillez utiliser, si possible, un compte avec des droits limités en lecture seule. auths.user_base=Utilisateur Search Base auths.user_dn=Utilisateur DN +auths.attribute_username=Attribut nom d'utilisateur +auths.attribute_username_placeholder=Laisser vide afin d'utiliser le nom d'utilisateur spécifié dans Gitea. +auths.attribute_name=Attribut prénom +auths.attribute_surname=Attribut nom de famille +auths.attribute_mail=Attribut e-mail +auths.attribute_ssh_public_key=Attribut clef SSH publique +auths.attributes_in_bind=Aller chercher les attributs dans le contexte de liaison DN +auths.use_paged_search=Utiliser la recherche paginée +auths.search_page_size=Taille de la page auths.filter=Filtre utilisateur auths.admin_filter=Filtre administrateur auths.ms_ad_sa=Rechercher les attributs MS AD @@ -768,6 +1403,7 @@ auths.smtp_auth=Type d'authentification SMTP auths.smtphost=Hôte SMTP auths.smtpport=Port SMTP auths.allowed_domains=Domaines autorisés +auths.allowed_domains_helper=Laisser ce champ vide autorise tous les domaines. Separez les domaines multiples avec une virgule (","). auths.enable_tls=Activer le Chiffrement TLS auths.skip_tls_verify=Ne pas vérifier TLS auths.pam_service_name=Nom du Service PAM @@ -775,6 +1411,7 @@ auths.oauth2_provider=Fournisseur OAuth2 auths.oauth2_clientID=ID du client (clé) auths.oauth2_clientSecret=Secret du client auths.openIdConnectAutoDiscoveryURL=URL de découverte OpenID Connect +auths.oauth2_use_custom_url=Utiliser des URLs personnalisées au lieu de l’URL par défaut auths.oauth2_tokenURL=URL du jeton auths.oauth2_authURL=URL d'autorisation auths.oauth2_profileURL=URL du profil @@ -784,27 +1421,48 @@ auths.tips=Conseils auths.tips.oauth2.general=Authentification OAuth2 auths.tips.oauth2.general.tip=Lorsque vous enregistrez une nouvelle authentification OAuth2, l'URL de redirection doit être de la forme : /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.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.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/) auths.tip.openid_connect=Utilisez l'URL de découvert OpenID (/.well-known/openid-configuration) pour spécifier les points d'accès +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.edit=Mettre à jour la source d'authentification +auths.activated=Cette source d'authentification est activée auths.new_success=L'authentification "%s" a été ajoutée. +auths.update_success=La source d'authentification a été mise à jour. +auths.update=Mettre à jour la source d'authentification +auths.delete=Supprimer la source d'authentification auths.delete_auth_title=Suppression de la source d'authentification +auths.delete_auth_desc=La suppression d'une source d'authentification empêche les utilisateurs de l'utiliser pour se connecter. Continuer ? +auths.still_in_used=Cette source d'authentification est utilisée par un ou plusieurs utilisateurs, veuillez convertir ou supprimer ces comptes utilisateurs avant toute action. +auths.deletion_success=La source d'authentification a été supprimée. +auths.login_source_exist=La source d'authentification "%s" existe déjà. config.server_config=Configuration du serveur +config.app_name=Titre du site +config.app_ver=Version de Gitea +config.app_url=URL de base de Gitea config.custom_conf=Chemin du fichier de configuration +config.domain=Domaine du serveur SSH +config.offline_mode=Mode hors-ligne config.disable_router_log=Désactiver la Journalisation du Routeur +config.run_user=Exécuter avec l'utilisateur config.run_mode=Mode d'Éxécution config.git_version=Version de Git config.repo_root_path=Emplacement des Dépôts config.lfs_root_path=Répertoire racine LFS config.static_file_root_path=Chemin statique des fichiers racines +config.log_file_root_path=Chemin des fichiers logs config.script_type=Type de Script config.reverse_auth_user=Annuler l'Authentification de l'Utilisateur config.ssh_config=Configuration SSH config.ssh_enabled=Activé +config.ssh_start_builtin_server=Utiliser le serveur incorporé +config.ssh_domain=Domaine du serveur config.ssh_port=Port config.ssh_listen_port=Port d'écoute config.ssh_root_path=Emplacement racine @@ -817,19 +1475,36 @@ config.db_config=Configuration de la base de données config.db_type=Type config.db_host=Hôte config.db_name=Nom +config.db_user=Nom d'utilisateur +config.db_ssl_mode=SSL config.db_path=Emplacement config.service_config=Configuration du service +config.register_email_confirm=Exiger la confirmation de l'e-mail lors de l'inscription +config.disable_register=Désactiver le formulaire d'inscription +config.allow_only_external_registration=N'autoriser l'inscription qu'à partir des services externes +config.enable_openid_signup=Activer l'inscription avec OpenID +config.enable_openid_signin=Activer la connexion avec OpenID config.show_registration_button=Afficher le bouton d'enregistrement +config.require_sign_in_view=Exiger la connexion pour afficher les pages +config.mail_notify=Activer les notifications par e-mail config.disable_key_size_check=Désactiver la vérification de la taille de clé minimale +config.enable_captcha=Activer le CAPTCHA config.active_code_lives=Limites de Code Actif config.reset_password_code_lives=Réinitialiser le délai d'expiration du code de mot de passe +config.default_keep_email_private=Masquer les adresses e-mail par défaut +config.default_allow_create_organization=Autoriser la création d'organisations par défaut +config.enable_timetracking=Activer le suivi du temps +config.default_enable_timetracking=Activer le suivi de temps par défaut +config.default_allow_only_contributors_to_track_time=Restreindre le suivi de temps aux contributeurs +config.no_reply_address=Domaine pour les e-mails cachés config.webhook_config=Configuration Webhook config.queue_length=Longueur de la file d'attente config.deliver_timeout=Expiration d'Envoi config.skip_tls_verify=Passer la vérification TLS +config.mailer_config=Configuration du service SMTP config.mailer_enabled=Activé config.mailer_disable_helo=Désactiver HELO config.mailer_name=Nom @@ -837,6 +1512,10 @@ config.mailer_host=Hôte config.mailer_user=Utilisateur config.mailer_use_sendmail=Utiliser Sendmail config.mailer_sendmail_path=Chemin d’accès à Sendmail +config.mailer_sendmail_args=Arguments supplémentaires pour Sendmail +config.send_test_mail=Envoyer un e-mail de test +config.test_mail_failed=Impossible d'envoyer un e-mail de test à '%s' : %v +config.test_mail_sent=Un e-mail de test à été envoyé à '%s'. config.oauth_config=Configuration OAuth config.oauth_enabled=Activé @@ -856,6 +1535,7 @@ config.session_life_time=Durée des sessions config.https_only=HTTPS uniquement config.cookie_life_time=Expiration du cookie +config.picture_config=Configuration de l'avatar config.picture_service=Service d'Imagerie config.disable_gravatar=Désactiver Gravatar config.enable_federated_avatar=Activer les avatars unifiés @@ -880,6 +1560,7 @@ monitor.name=Nom monitor.schedule=Planification monitor.next=Suivant monitor.previous=Précédent +monitor.execute_times=Exécutions monitor.process=Processus en cours d'exécution monitor.desc=Description monitor.start=Heure de démarrage @@ -906,11 +1587,11 @@ commit_repo=a poussé dans %[3]s sur %s#%[2]s` close_issue=`tickets clos %s#%[2]s` reopen_issue=`tickets ré-ouverts %s#%[2]s` -create_pull_request=`pull request créée le %s#%[2]s` -close_pull_request=`pull request fermé %s#%[2]s` -reopen_pull_request=`pull request ré-ouverte %s#%[2]s` +create_pull_request=`a créé la demande d'ajout %s#%[2]s` +close_pull_request=`a fermé la demande d'ajout %s#%[2]s` +reopen_pull_request=`a rouvert la demande d'ajout %s#%[2]s` comment_issue=`a commenté le ticket %s#%[2]s` -merge_pull_request=`demande d'ajout fusionnée le %s#%[2]s` +merge_pull_request=`a fusionné la demande d'ajout %s#%[2]s` transfer_repo=a transféré le dépôt %s à %s push_tag=a soumis le tag %[2]s sur %[3]s delete_tag=étiquette supprimée %[2]s de %[3]s @@ -940,6 +1621,8 @@ raw_seconds=secondes raw_minutes=minutes [dropzone] +default_message=Déposez les fichiers ou cliquez ici pour téléverser. +invalid_input_type=Vous ne pouvez pas téléverser des fichiers de ce type. file_too_big=La taille du fichier ({{filesize}} Mo) dépasse la taille maximale ({{maxFilesize}} Mo). remove_file=Supprimer le fichier @@ -947,6 +1630,8 @@ remove_file=Supprimer le fichier notifications=Notifications unread=Non lue(s) read=Lue(s) +no_unread=Aucune notification non lue. +no_read=Aucune notification lue. pin=Epingler la notification mark_as_read=Marquer comme lu mark_as_unread=Marquer comme non lue @@ -955,8 +1640,12 @@ mark_all_as_read=Tout marquer comme lu [gpg] error.extract_sign=Impossible d'extraire la signature error.generate_hash=Impossible de générer la chaine de hachage de la révision +error.no_committer_account=Aucun compte lié à l'adresse e-mail de l'auteur error.no_gpg_keys_found=Aucune clé connue n'a été trouvée dans la base pour cette signature error.not_signed_commit=Révision non signée +error.failed_retrieval_gpg_keys=Impossible de récupérer la clé liée au compte de l'auteur [units] +error.no_unit_allowed_repo=Vous n'êtes pas autorisé à accéder à n'importe quelle section de ce dépôt. +error.unit_not_allowed=Vous n'êtes pas autorisé à accéder à cette section du dépôt. diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 56f14d771..41a56ece8 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -1,11 +1,15 @@ +app_desc=Sebuah layanan Git hosting pribadi yang mudah home=Beranda dashboard=Dasbor explore=Jelajahi help=Bantuan sign_in=Masuk +sign_in_with=Masuk Dengan sign_out=Keluar +sign_up=Daftar link_account=Tautan Akun +link_account_signin_or_signup=Masuk dengan kredensial yang ada untuk menautkan akun anda yang ada ke akun ini atau daftar akun yang baru. register=Daftar website=Situs Web version=Versi @@ -13,12 +17,32 @@ page=Halaman template=Contoh language=Bahasa notifications=Notifikasi +create_new=Buat… +user_profile_and_more=Profil dan Pengaturan… signed_in_as=Masuk sebagai +enable_javascript=Situs web ini bekerja lebih baik dengan JavaScript. username=Nama Pengguna +email=Alamat Email password=Kata Sandi +re_type=Ketik Ulang Kata Sandi +captcha=CAPTCHA +twofa=Otentikasi Dua Faktor +twofa_scratch=Kode Awal Dua Faktor passcode=Kode Akses +u2f_insert_key=Masukkan kunci keamanan anda +u2f_sign_in=Tekan tombol pada kunci keamanan anda. Jika anda tidak menemukan tombol, masukkan kembali. +u2f_press_button=Silahkan tekan tombol pada kunci keamanan anda… +u2f_use_twofa=Menggunakan kode dua faktor dari telepon anda +u2f_error=Kami tidak bisa membaca kunci keamanan anda! +u2f_unsupported_browser=Browser anda tidak mendukung kunci U2F. Silakan mencoba browser lain. +u2f_error_1=Terdapat kesalahan yang tidak diketahui. Mohon coba lagi. +u2f_error_2=Pastikan bahwa anda menggunakan koneksi terenkripsi (https://) dan mengunjungi URL yang benar. +u2f_error_3=Server tidak bisa melanjutkan permintaan anda. +u2f_error_4=Kunci tidak layak untuk permintaan ini. Jika Anda mencoba untuk mendaftarkanya, pastikan bahwa kunci sudah tidak terdaftar. +u2f_error_5=Timeout tercapai sebelum kunci anda bisa terbaca. Silahkan muat ulang untuk mencoba kembali. +u2f_reload=Muat Ulang repository=Repositori organization=Organisasi @@ -29,8 +53,12 @@ new_mirror=Duplikat Baru new_fork=Fork Repositori Baru new_org=Organisasi Baru manage_org=Mengelola Organisasi +admin_panel=Administrasi Situs account_settings=Pengaturan Akun settings=Pengaturan +your_profile=Profil +your_starred=Dibintangi +your_settings=Pengaturan all=Semua sources=Sumber @@ -46,34 +74,86 @@ cancel=Batal [install] install=Pemasangan +title=Konfigurasi Awal +docker_helper=Jika Anda menjalankan Gitea di dalam Docker, baca dokumentasi sebelum mengubah pengaturan. +requite_db_desc=Gitea memerlukan MySQL, PostgreSQL, MSSQL, SQLite3 atau TiDB. db_title=Pengaturan Basis Data db_type=Tipe Basis Data host=Host +user=Nama Pengguna password=Kata Sandi db_name=Nama Basis Data +db_helper=Catatan untuk pengguna MySQL: Gunakan mesin penyimpanan InnoDB dan karakter set 'utf8_general_ci'. +ssl_mode=SSL path=Jalur +sqlite_helper=Path berkas untuk basis data SQLite3 atau TiDB.
Masukkan path absolut jika anda menjalankan Gitea sebagai layanan. +err_empty_db_path=Path basis data SQLite3 atau TiDB tidak boleh kosong. +err_invalid_tidb_name=Nama basis data TiDB tidak boleh berisi karakter '.' dan '-'. +no_admin_and_disable_registration=Anda tidak dapat menonaktifkan pendaftaran tanpa membuat akun admin. +err_empty_admin_password=Sandi administrator tidak boleh kosong. +general_title=Pengaturan Umum +app_name=Judul Situs +app_name_helper=Anda dapat memasukkan nama perusahaan anda di sini. repo_path=Path Root Repositori +repo_path_helper=Repositori Git remote akan disimpan ke direktori ini. +lfs_path=Path Akar Git LFS +lfs_path_helper=Berkas yang tersimpan dengan Git LFS akan disimpan ke direktori ini. Biarkan kosong untuk menonaktifkan LFS. +run_user=Jalankan Sebagai Nama Pengguna +run_user_helper=Masukkan nama pengguna sistem operasi yang menjalankan Gitea. Perhatikan bahwa pengguna ini harus memiliki akses ke path akar dari repositori. +domain=SSH Server Domain +domain_helper=Alamat domain atau host untuk URL klon SSH. +ssh_port=Port Server SSH +ssh_port_helper=Nomor port server SSH anda. Biarkan kosong untuk menonaktifkan. +http_port=Port HTTP Gitea +http_port_helper=Nomor port web server dimana Gitea akan berjalan. +app_url=URL Dasar Gitea +app_url_helper=Alamat dasar untuk klon URL HTTP(S) dan pemberitahuan lewat surel. log_root_path=Path Log +log_root_path_helper=Berkas log akan ditulis ke direktori ini. optional_title=Pengaturan Opsional +email_title=Pengaturan Surel smtp_host=Host SMTP +smtp_from=Kirim Surel sebagai +smtp_from_helper=Alamat surel Gitea akan digunakan. Masukkan alamat surel atau gunakan fomat "Nama" . +mailer_user=Nama Pengguna SMTP +mailer_password=Sandi SMTP +register_confirm=Memerlukan Konfirmasi Surel Untuk Mendaftar +mail_notify=Aktifkan Pemberitahuan Surel +server_service_title=Server dan Pengaturan Layanan Pihak Ketiga +offline_mode=Aktifkan Mode Lokal +offline_mode_popup=Non-aktifkan jaringan pengiriman konten dari pihak ketiga dan layani semua sumber daya secara lokal. +disable_gravatar=Non-aktifkan Gravatar federated_avatar_lookup_popup=Mengaktifkan pencarian avatar federasi menggunakan Libravatar. openid_signin=Aktifkan Login OpenID +openid_signup=Aktifkan Pendaftaran OpenID +openid_signup_popup=Aktifkan pendaftaran berdasarkan OpenID. +enable_captcha=Aktifkan CAPTCHA enable_captcha_popup=Membutukan CAPTCHA untuk pendaftaran. +require_sign_in_view=Anda Harus Login untuk Melihat Halaman +admin_title=Pengaturan Akun Admin +admin_name=Nama Pengguna Admin admin_password=Kata sandi confirm_password=Konfirmasi Kata Sandi +admin_email=Alamat Surel install_btn_confirm=Memasang Gitea test_git_failed=Tidak dapat menguji perintah 'git': %v +sqlite3_not_available=Gitea versi ini tidak mendukung SQLite3, Silahkan untuh versi biner resmi dari %s (bukan versi 'gobuild'). +invalid_db_setting=Pengaturan basis data tidak valid: %v save_config_failed=Gagal menyimpan konfigurasi: %v [home] +uname_holder=Nama Pengguna atau Alamat Surel password_holder=Kata Sandi switch_dashboard_context=Alihkan Dasbor Konteks +my_repos=Repositori +show_more_repos=Tampilkan repositori lainnya… collaborative_repos=Repositori Kolaboratif my_orgs=Organisasi Saya my_mirrors=Duplikat Saya view_home=Lihat %s +search_repos=Cari repositori… issues.in_your_repos=Dalam repositori anda @@ -82,9 +162,16 @@ repos=Repositori users=Pengguna organizations=Organisasi search=Cari +code=Kode +repo_no_results=Tidak ditemukan repositori yang cocok. +org_no_results=Tidak ada organisasi yang cocok ditemukan. +code_no_results=Tidak ada kode sumber yang cocok dengan istilah yang anda cari. +code_search_results=Hasil pencarian untuk '%s' [auth] +create_new_account=Daftar Akun register_helper_msg=Sudah memiliki akun? Masuk sekarang! +social_register_helper_msg=Sudah memiliki akun? Hubungkan sekarang! remember_me=Ingat Saya forgot_password_title=Lupa Kata Sandi forgot_password=Lupa kata sandi? @@ -306,14 +393,17 @@ file_permalink=Permalink stored_lfs=Tersimpan dengan GIT LFS editor.preview_changes=Tinjau Perubahan +editor.name_your_file=Nama berkas… editor.or=atau editor.commit_changes=Perubahan komitmen editor.add_tmpl=Tambah '%s/' editor.add=Menambah '%s' editor.update=Memperbarui '%s' editor.delete=Menghapus '%s' +editor.commit_message_desc=Tambahkan deskripsi opsional yang panjang… editor.commit_directly_to_this_branch=Komitmen langsung ke %s cabang. editor.create_new_branch=Membuat new branch untuk tarik komit ini mulai permintaan. +editor.new_branch_name_desc=Nama branch baru… editor.cancel=Membatalkan editor.branch_already_exists=Cabang '%s' sudah ada di repositori ini. editor.no_changes_to_show=Tidak ada perubahan untuk ditampilkan. @@ -406,6 +496,7 @@ issues.edit=Sunting issues.cancel=Batal issues.save=Simpan issues.label_title=Nama label +issues.label_description=Keterangan label issues.label_color=Warna label issues.label_count=%d label issues.label_open_issues=%d masalah terbuka @@ -547,6 +638,7 @@ settings.transfer=Transfer Kepemilikan settings.delete=Menghapus Repositori Ini settings.delete_notices_1=- Operasi ini TIDAK BISA dibatalkan. settings.transfer_owner=Pemilik Baru +settings.search_user_placeholder=Cari pengguna… settings.add_webhook=Tambahkan Webhook settings.webhook.test_delivery=Percobaan Pengiriman settings.webhook.request=Permintaan @@ -584,6 +676,7 @@ settings.protected_branch_can_push_yes=Anda dapat mendorong settings.protected_branch_can_push_no=Anda tidak dapat mendorong settings.add_protected_branch=Aktifkan perlindungan settings.delete_protected_branch=Nonaktifkan perlindungan +settings.choose_branch=Pilih branch… diff.browse_source=Telusuri Sumber diff.parent=orang tua @@ -612,6 +705,7 @@ release.title=Judul release.content=Konten release.write=Menulis release.preview=Pratinjau +release.loading=Memuat… release.cancel=Membatalkan release.publish=Mempublikasikan Rilis release.save_draft=Simpan Draft @@ -636,6 +730,8 @@ people=Orang teams=Tim lower_members=anggota lower_repositories=repositori +create_new_team=Tim Baru +create_team=Buat Tim Baru org_desc=Deskripsi team_name=Nama tim team_desc=Deskripsi @@ -672,6 +768,7 @@ teams.update_settings=Memperbarui pengaturan teams.add_team_member=Tambahkan Anggota Tim teams.delete_team_success=Tim sudah di hapus. teams.repositories=Tim repositori +teams.search_repo_placeholder=Cari repositori… teams.add_team_repository=Tambahkan Tim Repositori teams.remove_repo=Menghapus teams.add_nonexistent_repo=Repositori yang ingin Anda tambahkan tidak ada; Silahkan buat terlebih dahulu. @@ -697,6 +794,7 @@ dashboard.delete_inactivate_accounts_success=Semua akun yang tidak aktif telah d dashboard.reinit_missing_repos=Menginstal kembali semua repositori Git yang hilang dimana ada catatan dashboard.reinit_missing_repos_success=Semua repositori Git yang hilang yang catatannya dan telah diinisialisasi ulang. dashboard.sync_external_users=Sinkronkan data pengguna eksternal +dashboard.git_fsck=Lakukan pemeriksaan kesehatan pada semua repositori dashboard.server_uptime=Waktu tambahan server dashboard.current_goroutine=Goroutin saat ini dashboard.current_memory_usage=Penggunaan memori saat ini @@ -709,6 +807,8 @@ dashboard.heap_memory_idle=Tumpukan memori yang menganggur dashboard.heap_memory_in_use=Tumpukan memori yang digunakan dashboard.heap_memory_released=Tumpukan memori dirilis dashboard.heap_objects=Benda tumpukan +dashboard.bootstrap_stack_usage=Penggunaan bootstrap Stack +dashboard.stack_memory_obtained=Memori Stack Didapat dashboard.mspan_structures_usage=Penggunaan struktur MSpan dashboard.mspan_structures_obtained=Struktur MSpan didapatkan dashboard.mcache_structures_usage=Penggunaan struktur MCache @@ -725,6 +825,7 @@ dashboard.gc_times=Waktu GC users.activated=Diaktifkan users.admin=Pengelola +users.repos=Repo users.created=Dibuat users.edit=Edit users.auth_source=Sumber Otentikasi @@ -795,16 +896,24 @@ config.disable_router_log=Menonaktifkan router log config.run_mode=Jalankan mode config.git_version=Versi Git config.repo_root_path=Jalur akar repositori +config.lfs_root_path=Path Root LFS config.static_file_root_path=Jalur akar berkas statis config.script_type=Jenis skrip config.reverse_auth_user=Mengembalikan pengguna otentikasi config.ssh_config=Konfigurasi SSH config.ssh_enabled=Aktif +config.ssh_port=Port +config.ssh_listen_port=Listen Port +config.ssh_root_path=Path Induk +config.ssh_key_test_path=Path Key Test +config.ssh_keygen_path=Path Keygen ('ssh-keygen') config.ssh_minimum_key_size_check=Periksa ukuran kunci minimum config.ssh_minimum_key_sizes=Ukuran kunci minimum config.db_config=Konfigurasi basis data +config.db_type=Tipe +config.db_host=Host config.db_name=Nama config.db_path=Jalur diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index e3b752851..d3aa6c609 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -169,7 +169,7 @@ profile=Profilo password=Password security=Sicurezza avatar=Avatar -ssh_gpg_keys=SSH / GPG chiavi +ssh_gpg_keys=Chiavi SSH / GPG social=Account Sociali repos=Repository delete=Elimina account @@ -201,7 +201,7 @@ add_openid=Aggiungere OpenID URI manage_ssh_keys=Gestisci chiavi SSH manage_gpg_keys=Gestisci Chiavi GPG add_key=Aggiungi Chiave -ssh_helper= Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub crea le tue chiavi SSH o risolvere problemi comuni puoi trovare usando SSH. +ssh_helper= Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub percrea le tue chiavi SSH o risolvere problemi comuni che potresti trovare utilizzando SSH. gpg_helper=Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub riguardo il GPG. add_new_key=Aggiungi Chiave SSH add_new_gpg_key=Aggiungi Chiave GPG @@ -302,7 +302,7 @@ editor.delete=Eliminare '%s' editor.commit_directly_to_this_branch=Impegnarsi direttamente con il %s branch. editor.create_new_branch=Creare un nuovo branch per questo commit e inizia una pull request. editor.cancel=Cancellare -editor.branch_already_exists=Branch '%s' esiste già in questo repository. +editor.branch_already_exists=Il branch '%s' esiste già in questo repository. editor.no_changes_to_show=Non ci sono cambiamenti da mostrare. editor.fail_to_update_file=Errore durante l'aggiornamento/ creazione del file '%s' con errore: %v editor.unable_to_upload_files=Impossibile caricare i file su '%s' con errore:%v @@ -513,7 +513,7 @@ settings.confirm_delete_account=Conferma Eliminazione members.member_role=Ruolo del membro: members.owner=Proprietario members.member=Membro -members.remove=Rimuovere +members.remove=Rimuovi members.leave=Abbandona members.invite_desc=Aggiungi un nuovo membro a %s: members.invite_now=Invita ora @@ -526,7 +526,7 @@ teams.no_desc=Questo team non ha alcuna descrizione teams.settings=Impostazioni teams.members=Membri del Team teams.update_settings=Aggiorna Impostazioni -teams.add_team_member=Aggiungere un Membro al Team +teams.add_team_member=Aggiungi un Membro al Team teams.repositories=Repository di Squadra teams.add_team_repository=Aggiungere Repository di Squadra teams.remove_repo=Rimuovi @@ -619,7 +619,7 @@ auths.tips=Consigli config.server_config=Configurazione Server config.disable_router_log=Disattivare Log del Router config.run_mode=Modalità Esecuzione -config.repo_root_path=Percorso Root del Repository +config.repo_root_path=Percorso radice del Repository config.static_file_root_path=Percorso Root del File Statico config.script_type=Tipo di Script config.reverse_auth_user=Autenticazione Utente Inversa @@ -685,7 +685,7 @@ config.git_mirror_timeout=Timeout per l'aggiornamento del mirror config.log_config=Configurazione Log config.log_mode=Modalità Log -monitor.cron=Incarici di cron +monitor.cron=Incarichi Cron monitor.name=Nome monitor.schedule=Agenda monitor.next=La Prossima Volta @@ -717,7 +717,7 @@ close_pull_request=`richiesta di pull chiuso %s#%[2]s` reopen_pull_request=`richiesta di riapertura riaperta %s#%[2]s` comment_issue=`ha commentato il problema %s#%[2]s` merge_pull_request=`unita pull request %s#%[2]s` -transfer_repo=ha trasferito il repository %s a %s +transfer_repo=repository %s trasferito in %s push_tag=ha pushato il tag %[2]s a %[3]s delete_tag=tag eliminato %[2]s da %[3]s delete_branch=branch eliminato %[2]s da %[3]s diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index ea32ad3c3..c3a610908 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -1,9 +1,11 @@ +app_desc=痛みのない、自己ホスト型の Git サービス home=ホーム dashboard=ダッシュボード explore=エクスプローラ help=ヘルプ sign_in=サインイン +sign_in_with=サインインします。 sign_out=サインアウト link_account=連携アカウント register=登録 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 1b0129ba1..0a6950b84 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1,11 +1,15 @@ +app_desc=Viegli uzstādāms Git serviss home=Sākums dashboard=Infopanelis explore=Izpētīt help=Palīdzība sign_in=Pierakstīties +sign_in_with=Pierakstīties izmantojot sign_out=Izrakstīties +sign_up=Reģistrēties link_account=Saistītie konti +link_account_signin_or_signup=Autorizējieties ar esošo lietotāja vārdu un paroli, lai piesaistītu esošam kontam, vai reģistrējieties, ja nepieciešams izveidot jaunu. register=Reģistrēties website=Mājas lapa version=Versija @@ -14,12 +18,31 @@ template=Sagatave language=Valoda notifications=Paziņojumi create_new=Izveidot… +user_profile_and_more=Profils un iestatījumi… signed_in_as=Pierakstījies kā +enable_javascript=Šī lapa labāk darbojas, ja pārlūkam ir iespējots JavaScript. username=Lietotājvārds +email=E-pasta adrese password=Parole +re_type=Atkārtoti ievadiet paroli +captcha=Cilvēktests +twofa=Divu faktoru autentifikācija +twofa_scratch=Divu faktoru vienreizējais kods passcode=Kods +u2f_insert_key=Ievietojiet Jūsu drošības atslēgu +u2f_sign_in=Nospiediet drošības atslēgas pogu. Ja nevarat to atrast, ievietojiet atkārtoti. +u2f_press_button=Nospiediet drošības atslēgas pogu… +u2f_use_twofa=Izmantot divu faktoru kodu no tālruņa +u2f_error=Nav iespējams nolasīt drošības atslēgu! +u2f_unsupported_browser=Jūsu pārlūks neatbalsta U2F atslēgas. Izmantojiet citu pārlūku. +u2f_error_1=Notikusi nezināma kļūda. Atkārtojiet darbību vēlreiz. +u2f_error_2=Pārliecinieties, ka izmantojat šifrētu savienojumu (https://) un apmeklējat pareizo URL. +u2f_error_3=Serveris nevar apstrādāt Jūsu pieprasījumu. +u2f_error_4=Nav iespējams izmantot atslēgu šim pieprasījumam. Ja mēģināt to reģistrēt, pārliecinieties, ka atslēga jau nav reģistrēta. +u2f_error_5=Iestājusies noildze nolasot atslēgu. Pārlādējiet lapu, lai atkārtotu vēlreiz. +u2f_reload=Pārlādēt repository=Repozitorijs organization=Organizācija @@ -30,8 +53,12 @@ new_mirror=Jauns spogulis new_fork=Jauns atdalīts repozitorijs new_org=Jauna organizācija manage_org=Pārvaldīt organizācijas +admin_panel=Lapas administrēšana account_settings=Konta iestatījumi settings=Iestatījumi +your_profile=Profils +your_starred=Atzīmēts ar zvaigznīti +your_settings=Iestatījumi all=Visi sources=Avoti @@ -47,31 +74,101 @@ cancel=Atcelt [install] install=Instalācija +title=Sākotnējā konfigurācija +docker_helper=Ja Gitea ir uzstādīts Docker konteinerī, izlasiet vadlīninas pirms maināt iestatījumus. +requite_db_desc=Gitea nepieciešams MySQL, PostgreSQL, MSSQL, SQLite3 vai TiDB. db_title=Datu bāzes iestatījumi db_type=Datu bāzes veids host=Resursdators +user=Lietotāja vārds password=Parole db_name=Datu bāzes nosaukums +db_helper=MySQL lietotājiem: izmantojiet InnoDB dzini ar rakstzīmju kopu 'utf8_general_ci'. +ssl_mode=SSL path=Ceļš +sqlite_helper=Faila ceļš SQLite3 vai TiDB datu bāzei.
Ievadiet absolūto ceļu, ja Gitea tiek startēts kā serviss. +err_empty_db_path=Nepieciešams norādīt SQLite3 vai TiDB datu bāzes atrašanās vietu. +err_invalid_tidb_name=TiDB datu bāzes nosaukums nevar saturēt simbolus '.' un '-'. +no_admin_and_disable_registration=Reģistrāciju nevar atslēgt, kamēr nav izveidots administratora konts. +err_empty_admin_password=Administratora kontam ir obligāti jānorāda parole. +general_title=Vispārīgie iestatījumi +app_name=Vietnes nosaukums +app_name_helper=Šeit var ievadīt savas kompānijas nosaukumu. repo_path=Repozitoriju glabāšanas ceļš +repo_path_helper=Git repozitoriji tiks glabāti šajā direktorijā. +lfs_path=Git LFS glabāšanas vieta +lfs_path_helper=Faili, kas pievienoti Git LFS, tiks glabāti šajā direktorijā. Atstājiet tukšu, lai atspējotu. +run_user=Izpildes lietotājs +run_user_helper=Norādiet operētājsistēmas lietotājvārdu ar kuru tiks izpildīts Gitea process. Ņemiet vērā, ka lietotājam ir jābūt rakstīšanas tiesībām repozitoriju glabāšanas vietai. +domain=SSH servera domēns +domain_helper=Domēns vai saimniekdatora adrese SSH klonēšanas URL. +ssh_port=SSH servera ports +ssh_port_helper=Porta numurs, kuru SSH serveris klausīsies. Atstājiet tukšu, lai atspējotu. +http_port=Gitea HTTP klausīšanās ports +http_port_helper=Porta numurs, kuru Gitea tīmekļa serveris klausīsies. +app_url=Gitea pamata URL +app_url_helper=Pamata adrese HTTP(S) klonēšanas URL un e-pastu paziņojumiem. log_root_path=Žurnalizēšanas ceļš +log_root_path_helper=Žurnalizēšanas faili tiks rakstīti šajā direktorijā. optional_title=Neobligātie iestatījumi +email_title=E-pastu iestatījumi smtp_host=SMTP resursdators +smtp_from=Nosūtīt e-pastu kā +smtp_from_helper=E-pasta adrese, ko Gitea izmantos. Ievadiet tika e-pasta adrese vai izmantojiet "Vārds" formātu. +mailer_user=SMTP lietotāja vārds +mailer_password=SMTP parole +register_confirm=Reģistrējoties pieprasīt apstiprināt e-pastu +mail_notify=Iespējot e-pasta paziņojumus +server_service_title=Servera un citu servisu iestatījumi +offline_mode=Iespējot bezsaistes režīmu +offline_mode_popup=Atspējot ārējos satura piegādes tīklus, lai visi resursi tiktu piegādāti lokāli. +disable_gravatar=Atspējot Gravatar +disable_gravatar_popup=Atspējot Gravatar un citus avotus, visus avatarus augšupielādēts lietotāji vai izmantos noklusēto attēlu. +federated_avatar_lookup=Iespējot apvienotās profila bildes federated_avatar_lookup_popup=Iespējot apvienoto profila bilžu meklētāju, lai izmantotu atvērtā koda apvienoto servisu balstītu uz libravatar. +disable_registration=Atspējot lietotāju reģistrāciju +disable_registration_popup=Atspējot iespēju reģistrēties. Tikai administratori varēs izveidot jaunus kontus. +allow_only_external_registration_popup=Ļaut reģistrēties tikai izmantojot ārējos pakalpojumus. openid_signin=Iespējot OpenID autorizāciju openid_signin_popup=Iespējot lietotāju autorizāciju ar OpenID. +openid_signup=Iespējot reģistrāciju, izmantojot OpenID +openid_signup_popup=Iespējot lietotāju reģistrāciju pirms tam autorizējoties ar OpenID. +enable_captcha=Iespējot drošības kodu enable_captcha_popup=Lietotājam reģistrējoties, pieprasīt ievadīt drošības kodu. +require_sign_in_view=Iespējot nepieciešamību autorizēties, lai aplūkotu lapas +require_sign_in_view_popup=Tikai autorizēti lietotāji var aplūkot lapas. Apmeklētāji redzēs tikai autorizācijas un reģistrācijas lapu. +admin_setting_desc=Nav nepieciešams izveidot administratora kontu uzreiz, pirmais reģistrētais lietotājs saņems administratora tiesības automātiski. +admin_title=Administratora konta iestatījumi +admin_name=Administratora lietotāja vārds admin_password=Parole confirm_password=Apstipriniet paroli +admin_email=E-pasta adrese install_btn_confirm=Instalēt Gitea test_git_failed=Kļūda pārbaudot 'git' komandu: %v +sqlite3_not_available=Jūsu pašreizējā versija neatbalsta SQLite3, lūdzu lejupielādējiet oficiālo bināro versiju no %s, NEVIS gobuild versiju. +invalid_db_setting=Nederīgi datu bāzes iestatījumi: %v +invalid_repo_path=Nederīga repozitorija glabāšanas vieta: %v +run_user_not_match=Izpildes lietotājs nav pašreizējais lietotājs: %s -> %s 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. +default_allow_create_organization=Pēc noklusējuma ļaut veidot organizācijas +default_allow_create_organization_popup=Atzīmējiet šo pazīmi, ja vēlaties, lai jauniem lietotājiem pēc noklusējuma tiek piešķirtas tiesības veidot organizācijas. +default_enable_timetracking=Pēc noklusējuma iespējot laika uzskaiti +default_enable_timetracking_popup=Repozitorijiem pēc noklusējuma tiks iespējota laika uzskaite atkarībā no šī iestatījuma. +no_reply_address=Neatbildēt e-pasta adreses domēns +no_reply_address_helper=Domēns lietotāja e-pasta adresei git žurnālos, ja lietotājs izvēlas paturēt savu e-pasta adresi privātu. Piemēram, ja lietotājs ir 'janis' un domēns 'neatbildet.piemers.lv', tad e-pasta adrese būs 'janis@neatbildet.piemers.lv'. [home] +uname_holder=Lietotājvārds vai e-pasts password_holder=Parole switch_dashboard_context=Mainīt infopaneļa kontekstu +my_repos=Repozitoriji show_more_repos=Parādīt vairāk repozitorijus… collaborative_repos=Sadarbības repozitoriji my_orgs=Manas organizācijas @@ -87,30 +184,52 @@ users=Lietotāji organizations=Organizācijas search=Meklēt code=Kods +repo_no_results=Netika atrasts neviens repozitorijs, kas atbilstu kritērijiem. +user_no_results=Netika atrasts neviens lietotājs, kas atbilstu kritērijiem. +org_no_results=Netika atrasta neviena organizācija, kas atbilstu kritērijiem. +code_no_results=Netika atrasts pirmkods, kas atbilstu kritērijiem. +code_search_results=Meklēšanas rezultāti '%s' [auth] +create_new_account=Reģistrēt kontu register_helper_msg=Jau ir konts? Pieraksties tagad! +social_register_helper_msg=Jau ir konts? Pievienojies! +disable_register_prompt=Reģistrācija ir atspējota. Lūdzu, sazinieties ar vietnes administratoru. +disable_register_mail=Reģistrācijas e-pasta apstiprināšana ir atspējota. remember_me=Atcerēties mani forgot_password_title=Aizmirsu paroli forgot_password=Aizmirsi paroli? +sign_up_now=Nepieciešams konts? Reģistrējies tagad. confirmation_mail_sent_prompt=Jauns apstiprināšanas e-pasts ir nosūtīts uz %s, pārbaudies savu e-pasta kontu tuvāko %s laikā, lai pabeigtu reģistrācijas procesu. reset_password_mail_sent_prompt=Apstiprināšanas e-pasts tika nosūtīts uz %s. Pārbaudiet savu e-pasta kontu tuvāko %s laikā, lai pabeigtu paroles atjaunošanas procesu. active_your_account=Aktivizēt savu kontu +prohibit_login=Aizliegt pieteikšanos +prohibit_login_desc=Jūsu konts ir bloķēts, sazinieties ar sistēmas administratoru. +resent_limit_prompt=Jūs pieprasījāt aktivizācijas e-pastu pārāk bieži. Lūdzu, uzgaidiet 3 minūtes un mēģiniet vēlreiz. has_unconfirmed_mail=Sveiki %s, Jums ir neapstiprināta e-pasta adrese (%s). Ja neesat saņēmis apstiprināšanas e-pastu vai Jums ir nepieciešams nosūtīt jaunu, lūdzu, nospiediet pogu, kas atrodas zemāk. resend_mail=Nospiediet šeit, lai vēlreiz nosūtītu aktivizācijas e-pastu email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu. send_reset_mail=Spiediet šeit, lai nosūtītu paroles maiņas vēstuli uz Jūsu e-pastu reset_password=Atjaunot savu paroli +invalid_code=Jūsu apstiprināšanas kodam ir beidzies derīguma termiņš vai arī tas ir nepareizs. reset_password_helper=Nospiediet šeit, lai atjaunotu paroli +password_too_short=Paroles garums nedrīkst būt mazāks par %d simboliem. +non_local_account=Ārējie konti nevar mainīt paroli, izmantojot, Gitea saskarni. verify=Pārbaudīt scratch_code=Vienreizējais kods use_scratch_code=Izmantot vienreizējo kodu twofa_scratch_used=Jūs esat izmantojis vienreizējo kodu. Jūs tikāt pārsūtīts uz divu faktoru iestatījumu lapu, lai varētu piesaistīto ierīci vai lai uzģenerētu jaunu vienreizējo kodu. +twofa_passcode_incorrect=Jūsu kods nav pareizs. Ja esat pazaudējis ierīci, izmantojiet vienreizējo kodu, lai autorizētos. twofa_scratch_token_incorrect=Ievadīts nepareizs vienreizējais kods. +login_userpass=Pierakstīties login_openid=OpenID openid_connect_submit=Pievienoties openid_connect_title=Pievienoties jau esošam kontam +openid_connect_desc=Izvēlētais OpenID konts sistēmā netika atpazīts, bet Jūs to varat piesaistīt esošam kontam. openid_register_title=Izveidot jaunu kontu +openid_register_desc=Izvēlētais OpenID konts sistēmā netika atpazīts, bet Jūs to varat piesaistīt esošam kontam. +openid_signin_desc=Ievadiet savu OpenID URI, piemēram: https://anna.me, peteris.openid.org.lv, gnusocial.net/janis. +disable_forgot_password_mail=Paroles atjaunošana nav pieejama. Sazinieties ar sistēmas administratoru. [mail] activate_account=Lūdzu, aktivizējiet savu kontu @@ -122,12 +241,14 @@ register_notify=Laipni lūdzam Gitea [modal] yes=Jā no=Nē +modify=Atjaunināt [form] UserName=Lietotājvārds RepoName=Repozitorija nosaukums Email=E-pasta adrese Password=Parole +Retype=Atkārtoti ievadiet paroli SSHTitle=SSH atslēgas nosaukums HttpsUrl=HTTPS URL PayloadUrl=Vērtuma URL @@ -143,6 +264,9 @@ TreeName=Faila ceļš Content=Saturs require_error=` nedrīkst būt tukšs.` +alpha_dash_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus vai domuzīmes (-_).` +alpha_dash_dot_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus, domuzīmes (-_) vai punktu.` +git_ref_name_error=` jābūt korektam git references nosaukumam.` size_error=` jābūt %s simbolus garam.` min_size_error=` jabūt vismaz %s simbolu garumā.` max_size_error=` jabūt ne mazāk kā %s simbolu garumā.` @@ -150,70 +274,148 @@ email_error=` nav derīga e-pasta adrese.` url_error=` nav korekts URL.` include_error=` ir jāsatur tekstu '%s'.` unknown_error=Nezināma kļūda: +captcha_incorrect=Ievadīts nepareizs drošības kods. +password_not_match=Izvēlētā parole nesakrīt ar atkārtoti ievadīto. +username_been_taken=Lietotājvārds jau ir aizņemts. +repo_name_been_taken=Jau eksistē repozitorijs ar šādu nosaukumu. +org_name_been_taken=Organizācijas nosaukums jau ir aizņemts. +team_name_been_taken=Komandas nosaukums jau ir aizņemts. +team_no_units_error=Komandai ir jābūt iespējotai vismaz vienai sadaļai. +email_been_used=E-pasta adrese jau ir izmantota. +openid_been_used=OpenID adrese '%s' jau ir izmantota. +username_password_incorrect=Nepareizs lietotājvārds vai parole. +enterred_invalid_repo_name=Pārliecinieties, vai ievadītā repozitorija nosaukums ir pareizs. +enterred_invalid_owner_name=Pārliecinieties, vai ievadītā īpašnieka vārds ir pareizs. +enterred_invalid_password=Pārliecinieties, vai ievadītā parole ir pareiza. user_not_exist=Lietotājs neeksistē. +last_org_owner=Nevar noņemt pēdējo īpašnieku komandas lietotāju, jo organizācijām ir jābūt vismaz vienam īpašniekam. +cannot_add_org_to_team=Organizāciju nevar pievienot kā komandas biedru. +invalid_ssh_key=Nav iespējams pārbaudīt SSH atslēgu: %s +invalid_gpg_key=Nav iespējams pārbaudīt GPG atslēgu: %s +unable_verify_ssh_key=SSH atslēgu nav iespējams pārbaudīt, pārliecinieties, ka tajā nav kļūdu. auth_failed=Autentifikācija neizdevās: %v +still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku. +still_has_org=Jūsu konts ir piesaistīts vismaz vienai organizācijai, sākumā nepieciešams to pamest. +org_still_own_repo=Organizācijai pieder repozitoriji, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku. target_branch_not_exist=Mērķa atzars neeksistē [user] +change_avatar=Mainīt profila attēlu… join_on=Pievienojās repositories=Repozitoriji activity=Publiskā aktivitāte followers=Sekotāji +starred=Atzīmēti repozitoriji following=Seko follow=Sekot unfollow=Nesekot form.name_reserved=Lietotājvārdu '%s' nedrīkst izmantot. +form.name_pattern_not_allowed=Lietotājvārds '%s' nav atļauts. [settings] profile=Profils +account=Konts password=Parole security=Drošība avatar=Profila attēls ssh_gpg_keys=SSH / GPG atslēgas social=Sociālie konti +applications=Lietotnes +orgs=Pārvaldīt organizācijas repos=Repozitoriji delete=Dzēst kontu twofa=Divu faktoru autentifikācija +account_link=Saistītie konti +organization=Organizācijas uid=Lietotāja ID +u2f=Drošības atslēgas public_profile=Publiskais profils +profile_desc=Konta e-pasta adrese ir publiska un tiks izmantota visiem ar kontu saistītiem paziņojumiem un no pārlūka veiktajām darbībām. +password_username_disabled=Ārējiem lietotājiem nav atļauts mainīt savu lietotāja vārdu. Sazinieties ar sistēmas administratoru, lai uzzinātu sīkāk. full_name=Pilns vārds website=Mājas lapa location=Atrašanās vieta update_profile=Mainīt profilu update_profile_success=Jūsu profila informācija tika saglabāta. +change_username=Lietotājvārds mainīts. +change_username_prompt=Piezīme: Šī darbība izmainīs norādes uz šo kontu. continue=Turpināt cancel=Atcelt +language=Valoda +lookup_avatar_by_mail=Meklēt profila bildes pēc e-pasta federated_avatar_lookup=Apvienotais profila bilžu meklētājs enable_custom_avatar=Iespējot maināmu profila attēlu choose_new_avatar=Izvēlēties jaunu profila attēlu +update_avatar=Saglabāt profila bildi delete_current_avatar=Dzēst pašreizējo profila bildi +uploaded_avatar_not_a_image=Augšupielādētais fails nav attēls. +update_avatar_success=Profila attēls tika saglabāts. +change_password=Atjaunināt paroli old_password=Pašreizējā parole new_password=Jauna parole +retype_new_password=Ievadīt paroli atkāroti +password_incorrect=Ievadīta nepareiza pašreizējā parole. +change_password_success=Parole tika veiksmīgi nomainīta. Tagad varat autorizēties ar jauno paroli. +password_change_disabled=Ārējie konti nevar mainīt paroli, izmantojot, Gitea saskarni. emails=E-pasta adreses +manage_emails=Pārvaldīt e-pasta adreses +manage_openid=Pārvaldīt OpenID adreses email_desc=Primārā e-pasta adrese tiks izmantota sūtot notifikācijas un citām dabībām. primary=Primārā +primary_email=Uzstādīt kā primāro +delete_email=Noņemt +email_deletion=Dzēst e-pasta adresi +email_deletion_desc=E-pasta adrese un ar to saistītā informācija tiks dzēsta no šī konta. Git revīzijas ar šo e-pasta adresi netiks mainītas. Vai turpināt? +email_deletion_success=E-pasta adrese ir veiksmīgi izdzēsta. +openid_deletion=Dzēst OpenID adresi +openid_deletion_desc=Dzēšot šo OpenID adresi no Jūsu konta, ar to vairs nebūs iespējams autorizēties. Vai turpināt? +openid_deletion_success=OpenID adrese tika noņemta. +add_new_email=Pievienot jaunu e-pasta adresi +add_new_openid=Pievienot jaunu OpenID vietrādi +add_email=Pievienot e-pasta adresi add_openid=Pievienot OpenID vietrādi +add_email_confirmation_sent=Jauns apstiprināšanas e-pasts tika nosūtīts uz '%s'. Pārbaudiet savu e-pasta kontu tuvāko %s laikā, lai apstiprinātu savu e-pasta adresi. +add_email_success=Jūsu jaunā e-pasta adrese tika veiksmīgi pievienota. +add_openid_success=Jūsu jaunā OpenID adrese tika veiksmīgi pievienota. +keep_email_private=Paslēpt e-pasta adresi +keep_email_private_popup=Jūsu e-pasta adrese nebūs redzama citiem lietotājiem. +openid_desc=Jūsu OpenID adreses ļauj autorizēties, izmantojot, Jūsu izvēlēto pakalpojumu sniedzēju. manage_ssh_keys=Pārvaldīt SSH atslēgas manage_gpg_keys=Pārvaldīt GPG atslēgas add_key=Pievienot atslēgu +ssh_desc=Šīs SSH atslēgas ir piesaistītas Jūsu kontam. Ir svarīgi pārliecināties, ka visas atpazīstat, jo tās ļauj piekļūt Jūsu repozitorijiem. +gpg_desc=Šīs publiskās GPG atslēgas ir saistītas ar Jūsu kontu. Paturiet privātās atslēgas drošībā, jo tās ļauj parakstīt revīzijas. ssh_helper=Vajadzīga palīdzība? Iepazīstieties ar GitHub pamācību kā izveidot jaunu SSH atslēgu vai atrisinātu biežāk sastopamās problēmas ar kurām varat saskarties, izmantojot SSH. gpg_helper=Vajadzīga palīdzība? Iepazīstieties ar GitHub pamācību par GPG. add_new_key=Pievienot SSH atslēgu add_new_gpg_key=Pievienot GPG atslēgu +ssh_key_been_used=SSH atslēga jau ir pievienota kādam kontam. +ssh_key_name_used=Publiskā atslēga ar šādu nosaukumu jau eksistē Jūsu kontā. +gpg_key_id_used=Publiskā GPG atslēga ar šādu ID jau eksistē. +gpg_no_key_email_found=Jūsu kontam nav piesaistīta neviena no šīs GPG atslēgas e-pasta adresēm. subkeys=Apakšatslēgas key_id=Atslēgas ID key_name=Atslēgas nosaukums key_content=Saturs +add_key_success=SSH atslēga '%s' tika pievienota. +add_gpg_key_success=GPG atslēga '%s' tika pievienota. +delete_key=Noņemt +ssh_key_deletion=Noņemt SSH atslēgu +gpg_key_deletion=Noņemt GPG atslēgu +ssh_key_deletion_desc=Dzēšot šo SSH atslēgu, ar to vairs nebūs iespējams autorizēties Jūsu kontā. Vai turpināt? +gpg_key_deletion_desc=Noņemot GPG atslēgu, ar to parakstītās revīzijas vairs netiks attēlotas kā verificētas. Vai turpināt? +ssh_key_deletion_success=SSH atslēga tika izdzēsta. +gpg_key_deletion_success=GPG atslēga tika izdzēsta. add_on=Pievienota valid_until=Derīga līdz valid_forever=Derīgs mūžīgi @@ -225,40 +427,95 @@ key_state_desc=Šī atslēga ir izmantota pēdējo 7 dienu laikā token_state_desc=Šis talons ir izmantots pēdējo 7 dienu laikā show_openid=Rādīt profilā hide_openid=Paslēpt no profila +ssh_disabled=SSH atspējots manage_social=Pārvaldīt piesaistītos sociālos kontus +social_desc=Šis ir saraksts ar Jūsu Gitea kontam piesaistītajiem sociālajiem kontiem. Drošības nolūkos, pārliecinieties, ka atpazīstat visus no tiem, jo tos var izmantot, lai pieslēgtos Jūsu Gitea kontam. +unbind=Atsaistīt +unbind_success=Sociālais konts tika atsaistīts no Jūsu Gitea konta. +manage_access_token=Pārvaldīt piekļuves talonus generate_new_token=Ģenerēt jaunu talonu +tokens_desc=Ar šiem taloniem ir iespējams piekļūt Jūsu kontam, izmantojot, Gitea API. +new_token_desc=Lietojumprogrammām, izmantojot talonus, ir pilna piekļuve Jūsu kontam. token_name=Talona nosaukums generate_token=Ģenerēt talonu +generate_token_success=Piekļuves talons tika veiksmīgi uzģenerēts! Nokopējiet to tagad, jo vēlāk to vairs nebūs iespējams redzēt. delete_token=Dzēst +access_token_deletion=Dzēst piekļuves talonu +access_token_deletion_desc=Dzēšot piekļuves talonu tiks liegta piekļuve visām aplikācijām, kas to izmanto. Vai turpināt? +delete_token_success=Piekļuves talons tika noņemts. Neaizmirstiet atjaunot informāciju lietojumprogrammās, kas izmantoja šo talonu. +twofa_desc=Divu faktoru autentifikācija uzlabo Jūsu konta drošību. twofa_is_enrolled=Kontam ir ieslēgta divu faktoru autentifikācija. twofa_not_enrolled=Jūsu kontam nav ieslēgta divu faktoru autentifikācija. +twofa_disable=Atslēgt divu faktoru autentifikāciju +twofa_scratch_token_regenerate=Ģenerēt jaunu vienreizējo kodu +twofa_scratch_token_regenerated=Tagad Jūsu vienreizējais kods ir %s. Saglabājiet to drošā vietā. +twofa_enroll=Ieslēgt divu faktoru autentifikāciju +twofa_disable_note=Nepieciešamības gadījumā divu faktoru autentifikāciju ir iespējams atslēgt. +twofa_disable_desc=Atslēdzot divu faktoru autentifikāciju Jūsu konts vairs nebūs tik drošs. Vai turpināt? +regenerate_scratch_token_desc=Ja esat aizmirsis vienreizējo kodu vai jau esat to izmantojis, lai autorizētos, atjaunojiet to šeit. twofa_disabled=Divu faktoru autentifikācija ir atslēgta. scan_this_image=Noskenējiet šo attēlu ar autentifikācijas lietojumprogrammu: or_enter_secret=Vai ievadiet šo noslēpumu: %s +then_enter_passcode=Ievadiet piekļuves kodu no lietojumprogrammas: +passcode_invalid=Nederīgs piekļuves kods. Mēģiniet ievadīt atkārtoti. +twofa_enrolled=Kontam tagad ir ieslēgta divu faktoru autentifikācija. Saglabājiet savu vienreizējo kodu (%s), jo tas vairāk netiks parādīts! +u2f_desc=Drošības atslēgas ir aparatūras ierīces, kas satur kriptogrāfiskās atslēgas. Tās var tikt izmantotas, lai nodrošinātu divu faktoru autentifikāciju. Drošības atslēgām ir jāatbalsta FIDO U2F standarts. +u2f_require_twofa=Jābūt iespējotai divu faktoru autentifikācija, lai varētu izmantot drošības atslēgas. +u2f_register_key=Pievienot drošības atslēgu +u2f_nickname=Segvārds +u2f_press_button=Nospiediet pogu uz Jūsu drošības atslēgas, lai to reģistrētu. +u2f_delete_key=Noņemt drošības atslēgu +u2f_delete_key_desc=Noņemot drošības atslēgu ar to vairs nebūs iespējams autorizēties. Vai turpināt? +manage_account_links=Pārvaldīt saistītos kontus +manage_account_links_desc=Šādi ārējie konti ir piesaistīti Jūsu Gitea kontam. +account_links_not_available=Pašlaik nav neviena ārējā konta piesaistīta šim kontam. +remove_account_link=Noņemt saistīto kontu +remove_account_link_desc=Noņemot saistīto kontu, tam tiks liegta piekļuve Jūsu Gitea kontam. Vai turpināt? +remove_account_link_success=Saistītais konts tika noņemts. orgs_none=Jūs neesat nevienas organizācijas biedrs. repos_none=Jums nepieder neviens repozitorijs delete_account=Dzēst savu kontu +delete_prompt=Šī darbība pilnībā izdzēsīs Jūsu kontu, kā arī tā ir NEATGRIEZENISKA. confirm_delete_account=Apstiprināt dzēšanu +delete_account_title=Dzēst lietotāja kontu +delete_account_desc=Vai tiešām vēlaties dzēst šo kontu? [repo] owner=Īpašnieks repo_name=Repozitorija nosaukums +repo_name_helper=Labi repozitorija nosaukumi ir īsi, unikāli un tādi, ko viegli atcerēties. visibility=Redzamība +visiblity_helper=Padarīt repozitoriju privātu +visiblity_helper_forced=Jūsu sistēmas administrators ir noteicis, ka visiem no jauna izveidotajiem repozitorijiem ir jābūt privātiem. +visiblity_fork_helper=(Šīs vērtības maiņa ietekmēs arī visus atdalītos repozitorijus) +clone_helper=Nepieciešama palīdzība kā veikt klonēšana? Apmeklējiet Palīdzība lapu. fork_repo=Atdalīt repozitoriju fork_from=Atdalīt no +fork_visiblity_helper=Atdalītam repozitorijam nav iespējams nomainīt tā redzamību. repo_desc=Apraksts repo_lang=Valoda +repo_gitignore_helper=Izvēlieties .gitignore sagatavi. license=Licence +license_helper=Izvēlieties licences failu. +readme=LASIMANI +readme_helper=Izvēlieties LASIMANI faila sagatavi. +auto_init=Inicializēt repozitoriju (Pievieno .gitignore, licenci un README) create_repo=Izveidot repozitoriju default_branch=Noklusējuma atzars mirror_prune=Izmest +mirror_prune_desc=Izdzēst visas ārējās atsauces, kas ārējā repozitorijā vairs neeksistē +mirror_interval=Spoguļošanas intervāls (derīgās laika vienības ir "h", "m" un "s") +mirror_interval_invalid=Nekorekts spoguļošanas intervāls. +mirror_address=Spoguļa adrese +mirror_address_desc=Lūdzu iekļaujiet adresē, ja nepieciešams, arī lietotājvārdu un paroli. +mirror_last_synced=Pēdējo reizi sinhronizēts watchers=Novērotāji stargazers=Zvaigžņdevēji forks=Atdalītie repozitoriji @@ -267,22 +524,33 @@ reactions_more=un vēl %d form.reach_limit_of_creation=Ir sasniegts Jums noteiktais %d repozitoriju ierobežojums. form.name_reserved=Repozitorija nosaukums '%s' ir jau rezervēts. +form.name_pattern_not_allowed=Repozitorija nosaukums '%s' nav atļauts. +need_auth=Nepieciešama autorizācija migrate_type=Migrācijas veids migrate_type_helper=Šis repozitorijs būs spogulis migrate_repo=Migrēt repozitoriju +migrate.clone_address=Klonēšanas adrese +migrate.clone_address_desc=Tā var būt HTTP(S) adrese vai Git 'clone' URL eksistējošam repozitorijam +migrate.clone_local_path=vai servera lokālais ceļš migrate.permission_denied=Jums nav tiesību importēt lokālu repozitoriju. +migrate.invalid_local_path=Nederīgs lokālais ceļš. Tas neeksistē vai nav direktorija. migrate.failed=Migrācija neizdevās: %v +migrate.lfs_mirror_unsupported=LFS objektu spoguļošana netiek atbalstīta - tā vietā izmantojiet 'git lfs fetch --all' un 'git lfs push --all'. mirror_from=spogulis no forked_from=atdalīts no +fork_from_self=Nav iespējams atdalīt repozitoriju, kuram esat īpašnieks. copy_link=Kopēt +copy_link_success=Saite nokopēta +copy_link_error=Izmantojiet ⌘C vai Ctrl+C, lai nokopētu copied=Kopēšana notikusi veiksmīgi unwatch=Nevērot watch=Vērot unstar=Noņemt zvaigznīti star=Pievienot zvaigznīti fork=Atdalīts +download_archive=Lejupielādēt repozitoriju no_desc=Nav apraksta quick_guide=Īsa pamācība @@ -292,6 +560,7 @@ push_exist_repo=Nosūtīt izmaiņas no komandrindas eksistējošam repozitorijam bare_message=Repozitorijs ir tukšs. code=Kods +code.desc=Piekļūt pirmkodam, failiem, revīzijām un atzariem. branch=Atzars tree=Koks filter_branch_and_tag=Filtrēt atzarus vai tagus @@ -308,11 +577,26 @@ file_raw=Neapstrādāts file_history=Vēsture file_view_raw=Rādīt neapstrādātu file_permalink=Patstāvīgā saite +file_too_large=Šis fails ir par lielu, lai to parādītu. +video_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 video. stored_lfs=Saglabāts Git LFS +commit_graph=Revīziju grafs +editor.new_file=Jauna datne +editor.upload_file=Augšupielādēt failu +editor.edit_file=Labot failu editor.preview_changes=Priekšskatīt izmaiņas +editor.cannot_edit_non_text_files=Nav iespējams labot bināros failus no pārlūka saskarnes. +editor.edit_this_file=Labot failu +editor.must_be_on_a_branch=Ir jābūt izvēlētam atzaram, lai varētu veikt vai piedāvāt izmaiņas šim failam. +editor.fork_before_edit=Lai varētu labot failu, ir nepieciešams atdalīt repozitoriju. +editor.delete_this_file=Dzēst failu +editor.must_have_write_access=Jums ir jābūt rakstīšanas tiesībām, lai varētu veikt vai piedāvāt izmaiņas šim failam. +editor.file_delete_success=Fails '%s' tika izdzēsts. editor.name_your_file=Ievadiet faila nosaukumu… +editor.filename_help=Lai pievienotu direktoriju, ierakstiet tās nosaukumu un slīpsvītru ('/'). Lai noņemtu direktoriju, ielieciet kursoru pirms faila nosaukuma un nospiediet atpakaļatkāpes taustiņu. editor.or=vai +editor.cancel_lower=Atcelt editor.commit_changes=Pabeigt revīziju editor.add_tmpl=Pievienot '%s/' editor.add=Pievienot '%s' @@ -323,22 +607,38 @@ editor.commit_directly_to_this_branch=Apstiprināt revīzijas izmaiņas atzarā editor.create_new_branch=Izveidot jaunu atzaru un izmaiņu pieprasījumu šai revīzijai. editor.new_branch_name_desc=Jaunā atzara nosaukums… editor.cancel=Atcelt +editor.filename_cannot_be_empty=Faila nosaukums nevar būt tukšs. editor.branch_already_exists=Atzars '%s' šajā repozitorijā jau eksistē. +editor.directory_is_a_file=Ieraksts '%s' vecāka ceļā ir fails nevis direktorija šajā repozitorijā. +editor.file_is_a_symlink=Fails '%s' ir norāde, kuru nav iespējams labot no tīmekļa redaktora +editor.filename_is_a_directory=Faila nosaukums '%s' sakrīt ar direktorijas nosaukumu šajā repozitorijā. +editor.file_editing_no_longer_exists=Fails '%s', ko labojat, vairs neeksistē šajā repozitorijā. +editor.file_changed_while_editing=Faila saturs ir mainījies kopš sākāt to labot. Noklikšķiniet šeit, lai apskatītu, vai Nosūtiet izmaiņas atkārtoti, lai pārrakstītu. +editor.file_already_exists=Fails ar nosaukumu '%s' šajā repozitorijā jau eksistē. editor.no_changes_to_show=Nav izmaiņu, ko rādīt. editor.fail_to_update_file=Neizdevās izmainīt/izveidot failu '%s', kļūda: %v +editor.add_subdir=Pievienot direktoriju… editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju '%s', kļūda: %v editor.upload_files_to_dir=Augšupielādēt failus uz direktoriju '%s' +editor.cannot_commit_to_protected_branch=Nav atļauts veikt izmaiņas aizsargātam atzaram '%s'. +commits.desc=Pārlūkot pirmkoda izmaiņu vēsturi. commits.commits=Revīzijas +commits.search=Meklēt revīzijas… commits.find=Meklēt +commits.search_all=Visi atzari commits.author=Autors commits.message=Ziņojums commits.date=Datums commits.older=Vecāki commits.newer=Jaunāki commits.signed_by=Parakstījis +commits.gpg_key_id=GPG atslēgas ID +ext_issues=Ārējās problēmas +ext_issues.desc=Saite uz ārējo problēmu sekotāju. +issues.desc=Organizēt kļūdu ziņojumus, uzdevumus un atskaites punktus. issues.new=Jauna problēma issues.new.labels=Etiķetes issues.new.no_label=Nav etiķešu @@ -348,12 +648,19 @@ issues.new.no_milestone=Nav atskaites punktu issues.new.clear_milestone=Notīrīt atskaites punktus issues.new.open_milestone=Atvērtie atskaites punktus issues.new.closed_milestone=Aizvērtie atskaites punkti +issues.new.assignees=Atbildīgie +issues.new.clear_assignees=Noņemt atbildīgo +issues.new.no_assignees=Nav atbildīgā issues.no_ref=Nav norādīts atzars/tags issues.create=Pieteikt problēmu issues.new_label=Jauna etiķete +issues.new_label_placeholder=Etiķetes nosaukums +issues.new_label_desc_placeholder=Apraksts issues.create_label=Izveidot etiķeti issues.label_templates.title=Ielādēt sākotnēji noteikto etiķešu kopu +issues.label_templates.info=Nav izveidota neviena etiķete. Jūs varat noklikšķināt uz "Jauna etiķete" augstāk, lai to izveidotu vai izmantot zemāk piedāvātās etiķetes: issues.label_templates.helper=Izvēlieties etiķešu kopu +issues.label_templates.use=Izmantot etiķešu kopu issues.label_templates.fail_to_load_file=Neizdevās ielādēt etiķetes sagataves failu '%s': %v issues.add_label_at=pievienoja etiķeti
%s
%s issues.remove_label_at=noņēma etiķeti
%s
%s @@ -369,8 +676,11 @@ issues.delete_branch_at=`izdzēsts atzars %s %s` issues.open_tab=%d atvērti issues.close_tab=%d aizvērti issues.filter_label=Etiķete +issues.filter_label_no_select=Visas etiķetes issues.filter_milestone=Atskaites punkts +issues.filter_milestone_no_select=Visi atskaites punkti issues.filter_assignee=Atbildīgais +issues.filter_assginee_no_select=Visi atbildīgie issues.filter_type=Veids issues.filter_type.all_issues=Visas problēmas issues.filter_type.assigned_to_you=Piešķirtās Jums @@ -383,6 +693,10 @@ issues.filter_sort.recentupdate=Nesen atjaunotās issues.filter_sort.leastupdate=Vissenāk atjaunotās issues.filter_sort.mostcomment=Visvairāk komentētās issues.filter_sort.leastcomment=Vismazāk komentētās +issues.filter_sort.moststars=Visvairāk atzīmētie +issues.filter_sort.feweststars=Vismazāk atzīmētie +issues.filter_sort.mostforks=Visvairāk atdalītie +issues.filter_sort.fewestforks=Vismazāk atdalītie issues.action_open=Atvērt issues.action_close=Aizvērt issues.action_label=Etiķete @@ -401,7 +715,9 @@ issues.commented_at=` komentēja %s` issues.delete_comment_confirm=Vai patiešām vēlaties dzēst šo komentāru? issues.no_content=Vēl nav satura. issues.close_issue=Aizvērt +issues.close_comment_issue=Komentēt un aizvērt issues.reopen_issue=Atvērt atkārtoti +issues.reopen_comment_issue=Komentēt un atvērt atkārtoti issues.create_comment=Komentēt issues.closed_at=`aizvērts %[2]s` issues.reopened_at=`atvērts atkārtoti %[2]s` @@ -420,6 +736,10 @@ issues.label_count=%d etiķetes issues.label_open_issues=%d atvērtas problēmas issues.label_edit=Labot issues.label_delete=Dzēst +issues.label_modify=Labot etiķeti +issues.label_deletion=Dzēst etiķeti +issues.label_deletion_desc=Dzēšot etiķeti, tā tiks noņemta no visām problēmām un izmaiņu pieprasījumiem. Vai turpināt? +issues.label_deletion_success=Etiķete tika izdzēsta. issues.label.filter_sort.alphabetically=Alfabētiski issues.label.filter_sort.reverse_alphabetically=Pretēji alfabētiski issues.label.filter_sort.by_size=Izmērs @@ -429,32 +749,70 @@ issues.attachment.open_tab=`Noklikšķiniet, lai apskatītos "%s" jaunā logā` issues.attachment.download=`Noklikšķiniet, lai lejupielādētu "%s"` issues.subscribe=Abonēt issues.unsubscribe=Atrakstīties +issues.tracker=Laika uzskaite issues.start_tracking_short=Sākt +issues.start_tracking=Uzsākt laika uzskaiti issues.start_tracking_history=` uzsāka darbu %s` issues.tracking_already_started=`Jums jau ir iesākta laika uzskaite pie citas problēmas!` issues.stop_tracking=Beigt issues.stop_tracking_history=` beidza strādāt %s` +issues.add_time=Manuāli pievienot laiku +issues.add_time_short=Pievienot laiku issues.add_time_cancel=Atcelt issues.add_time_history=` pievienoja patērēto laiku %s` issues.add_time_hours=Stundas issues.add_time_minutes=Minūtes +issues.add_time_sum_to_small=Nav norādīts laiks. issues.cancel_tracking=Atcelt issues.cancel_tracking_history=` atcēla laika uzskaiti %s` +issues.time_spent_total=Kopējais patērētais laiks +issues.time_spent_from_all_authors=`Kopējais patērētais laiks: %s` +issues.due_date=Izpildes termiņš +issues.invalid_due_date_format=Izpildes termiņam ir jābūt formāta 'yyyy-mm-dd'. +issues.error_modifying_due_date=Neizdevās izmainīt izpildes termiņu. +issues.error_removing_due_date=Neizdevās noņemt izpildes termiņu. +issues.due_date_form=yyyy-mm-dd +issues.due_date_form_add=Pievienot izpildes termiņu +issues.due_date_form_update=Atjaunot izpildes termiņu +issues.due_date_form_remove=Noņemt izpildes termiņu +issues.due_date_not_writer=Jums ir nepieciešamas rakstīšanas tiesības uz šo repozitoriju, lai mainītu izpildes termiņu. +issues.due_date_not_set=Izpildes termiņš nav uzstādīts. +issues.due_date_added=pievienoja izpildes termiņu %s %s +issues.due_date_modified=mainīja izpildes termiņu uz %s no %s %s +issues.due_date_remove=noņēma izpildes termiņu %s %s +issues.due_date_overdue=Nokavēts +pulls.desc=Izmaiņu pieprasījumi ļauj veikt koda pārskatīšanu un sapludināt izmaiņas. pulls.new=Jauns izmaiņu pieprasījums +pulls.compare_changes=Jauns izmaiņu pieprasījums +pulls.compare_changes_desc=Izvēlieties atzaru, kurā sapludināt izmaiņas un atzaru, no kura tās saņemt. +pulls.compare_base=pamata +pulls.compare_compare=salīdzināmais pulls.filter_branch=Filtrēt atzarus pulls.no_results=Nekas netika atrasts. +pulls.nothing_to_compare=Nav ko salīdzināt, jo bāzes un salīdzināmie atzari ir vienādi. +pulls.has_pull_request=`Jau eksistē izmaiņu pieprasījums starp šiem diviem atzariem: %[2]s#%[3]d` pulls.create=Izveidot izmaiņu pieprasījumu pulls.title_desc=vēlas sapludināt %[1]d revīzijas no %[2]s uz %[3]s pulls.merged_title_desc=sapludināja %[1]d revīzijas no %[2]s uz %[3]s %[4]s pulls.tab_conversation=Saruna pulls.tab_commits=Revīzijas +pulls.tab_files=Izmainītie faili pulls.reopen_to_merge=Atkārtoti atveriet izmaiņu pieprasījumu, lai veiktu sapludināšanu. pulls.merged=Sapludināts +pulls.has_merged=Šis izmaiņu pieprasījums tika veiksmīgi sapludināts. +pulls.data_broken=Izmaiņu pieprasījums ir bojāts, jo dzēsta informācija no atdalītā repozitorija. +pulls.is_checking=Notiek konfliktu pārbaude, mirkli uzgaidiet un atjaunojiet lapu. pulls.can_auto_merge_desc=Šo izmaiņu pieprasījumu var automātiski sapludināt. +pulls.cannot_auto_merge_desc=Šis izmaiņu pieprasījums nevar tikt automātiski sapludināts konfliktu dēļ. +pulls.cannot_auto_merge_helper=Sapludiniet manuāli, lai atrisinātu konfliktus. +pulls.no_merge_desc=Šo izmaiņu pieprasījumu nav iespējams sapludināt, jo nav atļauts neviens sapludināšanas veids. +pulls.no_merge_helper=Lai sapludinātu šo izmaiņu pieprasījumu, iespējojiet vismaz vienu sapludināšanas veidu repozitorija iestatījumos vai sapludiniet to manuāli. pulls.merge_pull_request=Izmaiņu pieprasījuma sapludināšana pulls.rebase_merge_pull_request=Pārbāzēt un sapludināt pulls.squash_merge_pull_request=Saspiest un sapludināt +pulls.invalid_merge_option=Nav iespējams izmantot šādu sapludināšanas veidu šim izmaiņu pieprasījumam. +pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) ar šādu sapludināšanas informāciju.` milestones.new=Jauns atskaites punkts milestones.open_tab=%d atvērti @@ -463,13 +821,22 @@ milestones.closed=Aizvērts %s milestones.no_due_date=Bez termiņa milestones.open=Atvērta milestones.close=Aizvērt +milestones.new_subheader=Atskaites punkti, ļauj organizēt problēmas un sekot to progresam. milestones.create=Izveidot atskaites punktu milestones.title=Virsraksts milestones.desc=Apraksts milestones.due_date=Termiņš (neobligāts) milestones.clear=Notīrīt +milestones.invalid_due_date_format=Izpildes termiņam ir jābūt formāta 'yyyy-mm-dd'. +milestones.create_success=Atskaites punkts '%s' tika veiksmīgi izveidots. milestones.edit=Labot atskaites punktu +milestones.edit_subheader=Atskaites punkti, ļauj organizēt problēmas un sekot to progresam. milestones.cancel=Atcelt +milestones.modify=Labot atskaites punktu +milestones.edit_success=Izmaiņas atskaites punktā '%s' tika veiksmīgi saglabātas. +milestones.deletion=Dzēst atskaites punktu +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? +milestones.deletion_success=Atskaites punkts tika veiksmīgi izdzēsts. milestones.filter_sort.closest_due_date=Tuvākais termiņš milestones.filter_sort.furthest_due_date=Tālākais termiņš milestones.filter_sort.least_complete=Vismazāk pabeigtais @@ -477,17 +844,26 @@ milestones.filter_sort.most_complete=Visvairāk pabeigtais milestones.filter_sort.most_issues=Visvairāk problēmu milestones.filter_sort.least_issues=Vismazāk problēmu +ext_wiki=Ārējā vikivietne +ext_wiki.desc=Ārējā vikivietne norāda uz ārējo vikivietnes adresi. wiki=Vikivietne +wiki.welcome=Laipni lūgti vikivietnē. +wiki.welcome_desc=Vikivietne ļauj Jums un Jūsu līdzstrādniekiem viegli dokumentēt projektu. +wiki.desc=Vikivietne ir vieta, kur uzglabāt dokumentāciju. +wiki.create_first_page=Izveidot pirmo lapu wiki.page=Lapa wiki.filter_page=Meklēt lapu +wiki.new_page=Lapa wiki.default_commit_message=Ierakstiet piezīmes par šīs lapas izmaiņām (neobligāts). wiki.save_page=Saglabāt lapu wiki.last_commit_info=%s laboja lapu %s wiki.edit_page_button=Labot wiki.new_page_button=Jauna lapa wiki.delete_page_button=Dzēst lapu +wiki.delete_page_notice_1=Šī darbība izdzēsīs vikivietnes lapu '%s'. Vai turpināt? wiki.page_already_exists=Vikivietnes lapa ar šādu nosaukumu jau eksistē. +wiki.reserved_page=Vikivietnes lapas nosaukums '%s' ir rezervēts. wiki.pages=Lapas wiki.last_updated=Pēdējo reizi labota %s @@ -524,6 +900,9 @@ activity.closed_issue_label=Slēgta activity.new_issues_count_1=Jauna problēma activity.new_issues_count_n=Jaunas problēmas activity.new_issue_label=Atvērta +activity.title.unresolved_conv_1=%d neatrisināta diskusija +activity.title.unresolved_conv_n=%d neatrisinātas diskusijas +activity.unresolved_conv_desc=Saraksts ar visām problēmām un izmaiņu pieprasījumiem, kas nesen mainīti un vēl nav atrisināti. activity.unresolved_conv_label=Atvērts activity.title.releases_1=%d versiju activity.title.releases_n=%d versijas @@ -536,6 +915,9 @@ search.results=Meklēšanas rezultāti nosacījumam "%s" repozitorijā tīmekļa āķu rokasgrāmatā. +settings.webhook_deletion=Noņemt tīmekļa āķi +settings.webhook_deletion_desc=Noņemot tīmekļa āķi, tiks dzēsti visi tā iestatījumi un piegādes vēsture. Vai turpināt? +settings.webhook_deletion_success=Tīmekļa āķis tika noņemts. settings.webhook.test_delivery=Testa piegāde +settings.webhook.test_delivery_desc=Veikt viltus push-notikuma piegādi, lai notestētu Jūsu tīmekļa āķa iestatījumus. +settings.webhook.test_delivery_success=Pārbaudes tīmekļa āķis tika veiksmīgi pievienots piegādes rindai. Var paiet vairākas sekundes līdz tas parādās piegādes vēsturē. settings.webhook.request=Pieprasījums settings.webhook.response=Atbilde settings.webhook.headers=Galvenes +settings.webhook.payload=Saturs settings.webhook.body=Saturs +settings.githooks_desc=Git āķus apstrādā pats Git. Jūs varat labot atbalstīto āku failus sarakstā zemāk, lai veiktu pielāgotas darbības. settings.githook_edit_desc=Ja āķis nav aktīvs, tiks attēlots piemērs kā to izmantot. Atstājot āķa saturu tukšu, tas tiks atspējots. settings.githook_name=Āķa nosaukums settings.githook_content=Āķa saturs settings.update_githook=Labot āķi +settings.add_webhook_desc=Uz norādīto URL tiks nosūtīts POST pieprasījums ar notikuma datiem. Detalizētāku informāciju ir iespējams uzzināt tīmekļa āķu rokasgrāmatā. +settings.payload_url=Saņēmēja URL +settings.content_type=POST satura tips settings.secret=Noslēpums settings.slack_username=Lietotājvārds settings.slack_icon_url=Ikonas URL settings.discord_username=Lietotāja vārds settings.discord_icon_url=Ikonas URL settings.slack_color=Krāsa +settings.event_desc=Izsaukt notikumiem: +settings.event_push_only=Izmaiņu nosūtīšanas notikumi +settings.event_send_everything=Visus notikumus +settings.event_choose=Izvēlēties notikumus… settings.event_create=Izveidot +settings.event_create_desc=Atzara vai taga izveidošana. +settings.event_delete=Dzēst +settings.event_delete_desc=Atzars vai tags izdzēsts +settings.event_fork=Atdalīts +settings.event_fork_desc=Repozitorijs atdalīts +settings.event_issues=Problēmas +settings.event_issues_desc=Problēmas atvērtas, aizvērtas, atkārtoti atvērtas, labotas, pievienots vai noņemts atbildīgais, pievienota etiķete, noņemta etiķete, pievienots vai noņemts atskaites punkts. +settings.event_issue_comment=Problēmas komentārs +settings.event_issue_comment_desc=Problēmas komentārs pievienots, labots vai dzēsts. +settings.event_release=Laidiens +settings.event_release_desc=Publicēts, atjaunots vai dzēsts laidiens repozitorijā. settings.event_pull_request=Izmaiņu pieprasījums +settings.event_pull_request_desc=Atvērts, aizvērts, atkāroti atvērts, labots, piešķirts vai noņemts izmaiņu pieprasījums, vai mainīta etiķete, vai veikta sinhronizācija. settings.event_push=Izmaiņu nosūtīšana +settings.event_push_desc=Git izmaiņu nosūtīšana uz repozitoriju. settings.event_repository=Repozitorijs +settings.event_repository_desc=Repozitorijs izveidots vai dzēsts. +settings.active=Iekļaut notikuma detaļas +settings.active_helper=Pievienot pieprasījumam informāciju par notikuma izcelsmi. +settings.add_hook_success=Tīmekļa āķis tika pievienots. settings.update_webhook=Mainīt tīmekļa āķi +settings.update_hook_success=Tīmekļa āķis tika atjaunots. +settings.delete_webhook=Noņemt tīmekļa āķi settings.recent_deliveries=Pēdējās piegādes settings.hook_type=Āķa veids +settings.add_slack_hook_desc=Integrēt Slack repozitorijā. settings.slack_token=Talons settings.slack_domain=Domēns settings.slack_channel=Kanāls +settings.add_discord_hook_desc=Integrēt Discord repozitorijā. +settings.add_dingtalk_hook_desc=Integrēt Dingtalk repozitorijā. settings.deploy_keys=Izvietot atslēgas settings.add_deploy_key=Pievienot izvietošanas atslēgu +settings.deploy_key_desc=Izvietošanas atslēgām ir lasīšanas piekļuve repozitorijam. +settings.is_writable=Iespējot rakstīšanas piekļuvi +settings.is_writable_info=Atļaut šai izvietošanas atslēgai nosūtīt izmaiņas uz repozitoriju. +settings.no_deploy_keys=Pagaidām nav nevienas izvietošanas atslēgas. settings.title=Virsraksts settings.deploy_key_content=Saturs +settings.key_been_used=Izvietošanas atslēga ar šādu saturu jau ir pievienota. +settings.key_name_used=Izvietošanas atslēga ar šādu nosaukumu jau eksistē. +settings.add_key_success=Izvietošanas atslēga '%s' tika pievienota. +settings.deploy_key_deletion=Noņemt izvietošanas atslēgu +settings.deploy_key_deletion_desc=Noņemot izvietošanas atslēgu, tai tiks liegta piekļuve šim repozitorija. Vai turpināt? +settings.deploy_key_deletion_success=Izvietošanas atslēga tika noņemta. settings.branches=Atzari settings.protected_branch=Atzaru aizsargāšana settings.protected_branch_can_push=Atļaut izmaiņu nosūtīšanu? settings.protected_branch_can_push_yes=Jūs varat nosūtīt izmaiņas settings.protected_branch_can_push_no=Jūs nevarat nosūtīt izmaiņas +settings.branch_protection=Atzara aizsardzība atzaram '%s' +settings.protect_this_branch=Iespējot atzara aizsardzību +settings.protect_this_branch_desc=Neļauj dzēšanu un piespiedu Git izmaiņu nosūtīšanu uz atzaru. +settings.protect_whitelist_committers=Iespējot izmaiņu nosūtīšanas ierobežojumus +settings.protect_whitelist_committers_desc=Atļaut tikai noteiktiem lietotājiem vai komandām apiet izmaiņu nosūtīšanas ierobežojumus. +settings.protect_whitelist_users=Lietotāji, kas var veikt izmaiņu nosūtīšanu: +settings.protect_whitelist_search_users=Meklēt lietotājus… +settings.protect_whitelist_teams=Komandas, kas var veikt izmaiņu nosūtīšanu: +settings.protect_whitelist_search_teams=Meklēt komandas… +settings.protect_merge_whitelist_committers=Iespējot sapludināšanas ierobežošanu +settings.protect_merge_whitelist_committers_desc=Atļaut tikai noteiktiem lietotājiem vai komandām sapludināt izmaiņu pieprasījumus šajā atzarā. +settings.protect_merge_whitelist_users=Lietotāji, kas var veikt izmaiņu sapludināšanu: +settings.protect_merge_whitelist_teams=Komandas, kas var veikt izmaiņu sapludināšanu: settings.add_protected_branch=Iespējot aizsargāšanu settings.delete_protected_branch=Atspējot aizsargāšanu +settings.update_protect_branch_success=Atzara aizsardzība atzaram '%s' tika saglabāta. +settings.remove_protected_branch_success=Atzara aizsardzība atzaram '%s' tika atspējota. +settings.protected_branch_deletion=Atspējot atzara aizsardzību +settings.protected_branch_deletion_desc=Atspējojot atzara aizsardzību, ļaus lietotājiem ar rakstīšanas tiesībām nosūtīt izmaiņas uz atzaru. Vai turpināt? +settings.default_branch_desc=Norādiet noklusēto repozitorija atzaru izmaiņu pieprasījumiem un koda revīzijām: settings.choose_branch=Izvēlieties atzaru… +settings.no_protected_branch=Nav neviena aizsargātā atzara. diff.browse_source=Pārlūkot izejas kodu diff.parent=vecāks @@ -609,6 +1111,7 @@ diff.view_file=Parādīt failu diff.file_suppressed=Failā izmaiņas netiks attēlotas, jo tās ir par lielu diff.too_many_files=Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels +releases.desc=Pārvaldiet projekta versijas un lejupielādes. release.releases=Laidieni release.new_release=Jauns laidiens release.draft=Melnraksts @@ -617,31 +1120,60 @@ release.stable=Stabila release.edit=labot release.ahead=%d revīzijas atzarā %s kopš šī laidiena release.source_code=Izejas kods +release.new_subheader=Laidieni palīdz organizēt projekta versijas. +release.edit_subheader=Laidieni palīdz organizēt projekta versijas. release.tag_name=Taga nosaukums release.target=Mērķis +release.tag_helper=Izvēlieties jau esošu tagu vai izveidojiet jaunu. release.title=Virsraksts release.content=Saturs release.write=Rakstīt release.preview=Priekšskatītījums release.loading=Notiek ielāde… +release.prerelease_desc=Atzīmēt kā pirmslaidiena versiju +release.prerelease_helper=Atzīmēt, ka šo laidienu nav ieteicams lietot produkcijā. release.cancel=Atcelt release.publish=Publicēt laidienu release.save_draft=Saglabāt melnrakstu +release.edit_release=Labot laidienu +release.delete_release=Dzēst laidienu +release.deletion=Dzēst laidienu +release.deletion_desc=Dzēšot šo laidienu tiks izdzēsts arī attiecīgais Git tags. Repozitorija saturs un vēsture paliks nemainīta. Vai turpināt? release.deletion_success=Laidiens tika izdzēsts. +release.tag_name_already_exist=Laidiens ar šādu taga nosaukumu jau eksistē. +release.tag_name_invalid=Nekorekts taga nosaukums. release.downloads=Lejupielādes +branch.name=Atzara nosaukums branch.search=Meklēt atzarus +branch.already_exists=Atzars ar nosaukumu '%s' jau eksistē. branch.delete_head=Dzēst +branch.delete=Dzēst atzaru '%s' branch.delete_html=Dzēst atzaru +branch.delete_desc=Atzara dzēšana ir neatgriezeniska, kā arī tā ir NEATGRIEZENISKA. Vai turpināt? +branch.deletion_success=Atzars '%s' tika izdzēsts. +branch.deletion_failed=Neizdevās izdzēst atzaru '%s'. +branch.delete_branch_has_new_commits=Atzars '%s' nevar tik dzēsts, jo pēc sapludināšanas, tam ir pievienotas jaunas revīzijas. branch.create_branch=Izveidot atzaru %s branch.create_from=no '%s' +branch.create_success=Tika izveidots atzars '%s'. branch.branch_already_exists=Atzars '%s' šajā repozitorijā jau eksistē. +branch.branch_name_conflict=Atzara nosaukums '%s' konfliktē ar jau esošu atzaru '%s' šajā repozitorijā. +branch.tag_collision=Atzaru '%s' nevar izveidot, jo repozitorijā eksistē tags ar tādu pašu nosaukumu. branch.deleted_by=Izdzēsa %s +branch.restore_success=Tika atjaunots atzars '%s'. +branch.restore_failed=Neizdevās atjaunot atzaru '%s'. +branch.protected_deletion_failed=Atzars '%s' ir aizsargāts. To nevar izdzēst. +topic.manage_topics=Pārvaldīt tēmas +topic.done=Gatavs +topic.count_prompt=Nevar pievienot vairāk kā 25 tēmas +topic.format_prompt=Tēmas nosaukumam ir jāsākas ar burtu vai ciparu, tas var saturēt defisi(-), kā arī tas nevar būt garāks par 35 simboliem [org] org_name_holder=Organizācijas nosaukums org_full_name_holder=Organizācijas pilnais nosaukums +org_name_helper=Organizāciju nosaukumiem vēlams būt īsiem un tādiem, ko viegli atcerēties. create_org=Izveidot organizāciju repo_updated=Atjaunināts people=Personas @@ -653,20 +1185,37 @@ create_team=Izveidot komandu org_desc=Apraksts team_name=Komandas nosaukums team_desc=Apraksts +team_name_helper=Komandu nosaukumiem vēlams būt īsiem un tādiem, ko viegli atcerēties. +team_desc_helper=Aprakstiet komandas mērķi vai lomu. +team_permission_desc=Atļauja +team_unit_desc=Atļaut piekļuvi repozitorija sadaļām +form.name_reserved=Organizācijas nosaukums '%s' ir rezervēts. +form.name_pattern_not_allowed=Organizācijas nosaukums '%s' nav atļauts. +form.create_org_not_allowed=Jums nav tiesību veidot jauno organizāciju. settings=Iestatījumi +settings.options=Organizācija settings.full_name=Pilns vārds, uzvārds settings.website=Mājas lapa settings.location=Atrašanās vieta settings.update_settings=Mainīt iestatījumus settings.update_setting_success=Organizācijas iestatījumi tika saglabāti. +settings.change_orgname_prompt=Ņemiet vērā: Mainot organizācijas nosaukumu tiks izmainītas šīs organizācijas saites. +settings.update_avatar_success=Organizācijas attēls tika saglabāts. settings.delete=Dzēst organizāciju settings.delete_account=Dzēst šo organizāciju +settings.delete_prompt=Šī darbība pilnībā dzēsīs šo organizāciju, kā arī tā ir NEATGRIEZENISKA! settings.confirm_delete_account=Apstiprināt dzēšanu +settings.delete_org_title=Dzēst organizāciju +settings.delete_org_desc=Organizācija tiks dzēsta neatgriezeniski. Vai turpināt? settings.hooks_desc=Pievienot tīmekļa āķus, kas nostrādās visiem repozitorijiem šajā organizācijā. members.membership_visibility=Dalībnieka redzamība: +members.public=Redzams +members.public_helper=padarīt slēptu +members.private=Slēpts +members.private_helper=padarīt redzemu members.member_role=Dalībnieka loma: members.owner=Īpašnieks members.member=Biedri @@ -678,13 +1227,24 @@ members.invite_now=Uzaicināt tagad teams.join=Pievienoties teams.leave=Atstāt teams.read_access=Lasīšanas piekļuve +teams.read_access_helper=Komanda varēs skatīties un klonēt šīs organizācijas repozitorijus. teams.write_access=Rakstīšanas piekļuve +teams.write_access_helper=Šī komanda varēs lasīt un nosūtīt izmaiņas uz tās repozitorijiem. +teams.admin_access=Administratora piekļuve +teams.admin_access_helper=Šī komanda varēs nosūtīt un saņemt izmaiņas no tās repozitorijiem, kā arī pievienot tiem citus līdzstrādniekus. teams.no_desc=Komandai nav apraksta teams.settings=Iestatījumi +teams.owners_permission_desc=Īpašniekiem ir pilna piekļuve visiem repozitorijiem un ir organizācijas administratora tiesības. 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.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? teams.delete_team_success=Komanda tika izdzēsta. +teams.read_permission_desc=Šai komandai ir lasīšanas tiesības: dalībnieki var skatīties un klonēt komandas repozitorijus. +teams.write_permission_desc=Šai komandai ir rakstīšanas tiesības: dalībnieki var lasīt un nosūtīt izmaiņas repozitorijiem. +teams.admin_permission_desc=Šai komandai ir administratora tiesības: dalībnieki var lasīt, rakstīt un pievienot citus dalībniekus komandas repozitorijiem. teams.repositories=Komandas repozitoriji teams.search_repo_placeholder=Meklēt repozitorijā… teams.add_team_repository=Pievienot komandas repozitoriju @@ -693,8 +1253,10 @@ teams.add_nonexistent_repo=Repozitorijs, kuram Jūs mēģinat pievienot neeksist [admin] dashboard=Infopanelis +users=Lietotāju konti organizations=Organizācijas repositories=Repozitoriji +authentication=Autentificēšanas avoti config=Konfigurācija notices=Sistēmas paziņojumi monitor=Uzraudzība @@ -702,6 +1264,10 @@ first_page=Pirmā last_page=Pēdējā total=Kopā: %d +dashboard.statistic=Kopsavilkums +dashboard.operations=Uzturēšanas darbības +dashboard.system_status=Sistēmas statuss +dashboard.statistic_info=Gitea datu bāze satur %d lietotājus, %d organizācijas, %d publiskās atslēgas, %d repozitorijus, %d vērošanas, %d atzīmētas zvaigznītes, %d darbības, %d piekļuves, %d problēmas, %d komentārus, %d sociālos kontus, %d sekošanas, %d spoguļošanas, %d izlaides, %d autorizācijas avotus, %d tīmekļa āķus, %d starpposmus, %d etiķetes, %d āķu uzdevumus, %d komandas, %d labotus uzdevumus, %d pielikumus. dashboard.operation_name=Darbības nosaukums dashboard.operation_switch=Pārslēgt dashboard.operation_run=Palaist @@ -709,16 +1275,30 @@ dashboard.clean_unbind_oauth=Notīrīt nepiesaistītos OAuth savienojumus dashboard.clean_unbind_oauth_success=Visi nepiesaistītie OAuth savienojumu tika izdzēsti. dashboard.delete_inactivate_accounts=Dzēst visus neaktīvos kontus dashboard.delete_inactivate_accounts_success=Visi neaktīvie konti tika izdzēsti. +dashboard.delete_repo_archives=Dzēst visu repozitoriju arhīvus +dashboard.delete_repo_archives_success=Visu repozitoriju arhīvi tika izdzēsti. +dashboard.delete_missing_repos=Dzēst visus repozitorijus, kam trūkst Git failu +dashboard.delete_missing_repos_success=Visi repozitoriji, kam trūka Git failu, tika pilnībā dzēsti. +dashboard.git_gc_repos=Veikt atkritumu uzkopšanas darbus visiem repozitorijiem +dashboard.git_gc_repos_success=Atkritumu uzkopšanas darbi visiem repozitorijiem pabeigti. +dashboard.resync_all_sshkeys=Pārrakstīt '.ssh/authorized_keys' failu ar Gitea SSH atslēgām. (To nav nepieciešams darīt, ja izmantojat iebūvēto SSH serveri.) +dashboard.resync_all_sshkeys_success=Visas Gitea kontrolētās publiskās atslēgas tika pārrakstītas. +dashboard.resync_all_hooks=Pārsinhronizēt pirms-saņemšanas, atjaunošanas un pēc-saņemšanas āķus visiem repozitorijiem. +dashboard.resync_all_hooks_success=Visu repozitoriju pirms-saņemšanas, atjaunošanas un pēc-saņemšanas āķi tika atjaunoti. dashboard.reinit_missing_repos=Atkārtoti inicializēt visus pazaudētos Git repozitorijus par kuriem eksistē ieraksti dashboard.reinit_missing_repos_success=Visi pazaudētie Git repozitoriji, par kuriem eksistēja ieraksti, tika atkārtoti inicializēti. dashboard.sync_external_users=Sinhronizēt ārējo lietotāju datus +dashboard.sync_external_users_started=Uzsākta ārējo lietotāju sinhronizācija. dashboard.git_fsck=Izpildīt korektuma pārbaudes visiem repozoitorijiem +dashboard.git_fsck_started=Repozitorija veselības pārbaudes uzsāktas. dashboard.server_uptime=Servera darbības laiks dashboard.current_goroutine=Izmantotās Gorutīnas dashboard.current_memory_usage=Pašreiz izmantotā atmiņa dashboard.total_memory_allocated=Kopējā piešķirtā atmiņa dashboard.memory_obtained=Iegūtā atmiņa dashboard.pointer_lookup_times=Rādītāju meklēšanas reizes +dashboard.memory_allocate_times=Atmiņas piešķiršanas reizes +dashboard.memory_free_times=Atmiņas atbrīvošanas reizes dashboard.current_heap_usage=Pašreizējā kaudzes izmantošana dashboard.heap_memory_obtained=Iegūtā kaudzes atmiņa dashboard.heap_memory_idle=Neizmantotā kaudzes atmiņa @@ -741,18 +1321,43 @@ dashboard.total_gc_pause=Kopējais GC izpildes laiks dashboard.last_gc_pause=Pedējās GC izpildes laiks dashboard.gc_times=GC reizes +users.user_manage_panel=Lietotāju kontu pārvaldība +users.new_account=Izveidot lietotāja kontu +users.name=Lietotājvārds users.activated=Aktivizēts users.admin=Administrators users.repos=Repozitoriji users.created=Izveidots +users.last_login=Pēdējā autorizācija +users.never_login=Nekad nav autorizējies +users.send_register_notify=Nosūtīt lietotājam reģistrācijas paziņojumu +users.new_success=Lietotāja konts '%s' tika izveidots. users.edit=Labot users.auth_source=Autentificēšanas avots users.local=Iebūvētā +users.auth_login_name=Autentifikācijas pieteikšanās vārds +users.password_helper=Atstājiet paroli tukšu, ja nevēlaties mainīt. +users.update_profile_success=Lietotāja konts tika atjaunots. +users.edit_account=Labot lietotāja kontu +users.max_repo_creation=Maksimāls repozitoriju skaits +users.max_repo_creation_desc=(Ievadiet -1 lai izmantotu noklusēto globālo ierobežojumu) +users.is_activated=Lietotāja konts ir aktivizēts +users.prohibit_login=Atspējota pieslēgšanās +users.is_admin=Administratora tiesības +users.allow_git_hook=Atļaut veidot git āķus +users.allow_import_local=Atļauts importēt lokālus repozitorijus +users.allow_create_organization=Atļauts veidot organizācijas +users.update_profile=Mainīt lietotāja kontu +users.delete_account=Dzēst lietotāja kontu +users.still_own_repo=Lietotājam pieder repozitoriji, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku. +users.still_has_org=Šis lietotājs ir vienas vai vairāku organizāciju biedrs, lietotāju sākumā ir nepieciešams pamest šīs organizācijas vai viņu no tām ir jāizdzēš. +users.deletion_success=Lietotāja konts veiksmīgi izdzēsts. orgs.org_manage_panel=Organizāciju pārvaldība orgs.name=Nosaukums orgs.teams=Komandas orgs.members=Dalībnieki +orgs.new_orga=Jauna organizācija repos.repo_manage_panel=Repozitoriju pārvaldība repos.owner=Īpašnieks @@ -760,12 +1365,16 @@ repos.name=Nosaukums repos.private=Privāts repos.watches=Vērošana repos.stars=Atzīmētās zvaigznītes +repos.forks=Atdalītie repos.issues=Problēmas repos.size=Izmērs +auths.auth_manage_panel=Autentifikācijas avotu pārvaldība +auths.new=Pievienot autentifikācijas avotu auths.name=Nosaukums auths.type=Veids auths.enabled=Iespējots +auths.syncenabled=Iespējot lietotāju sinhronizāciju auths.updated=Atjaunināta auths.auth_type=Autentifikācijas tips auths.auth_name=Autentifikācijas nosaukums @@ -775,8 +1384,18 @@ auths.host=Resursdators auths.port=Ports auths.bind_dn=Saistīšanas DN auths.bind_password=Saistīšanas parole +auths.bind_password_helper=Brīdinājums: Šī parole tiks glabāta nešifrētā veidā. Ieteicams izmantot kontu ar tikai lasīšanas tiesībām. auths.user_base=Lietotāja pamatnosacījumi auths.user_dn=Lietotāja DN +auths.attribute_username=Lietotājvārda atribūts +auths.attribute_username_placeholder=Atstājiet tukšu, ja vēlaties, lai tiek izmantots Gitea ievadītais lietotājvārds. +auths.attribute_name=Vārda atribūts +auths.attribute_surname=Uzvārda atribūts +auths.attribute_mail=E-pasta atribūts +auths.attribute_ssh_public_key=Publiskās SSH atslēgas atribūts +auths.attributes_in_bind=Nolasīt atribūtus no saistīšanas DN konteksta +auths.use_paged_search=Izmantot, dalīto pa lapām, meklēšanu +auths.search_page_size=Lapas izmērs auths.filter=Lietotāju filts auths.admin_filter=Administratoru filtrs auths.ms_ad_sa=MS AD meklēšanas atribūti @@ -784,6 +1403,7 @@ auths.smtp_auth=SMTP autentifikācijas tips auths.smtphost=SMTP resursdators auths.smtpport=SMTP ports auths.allowed_domains=Atļautie domēni +auths.allowed_domains_helper=Atstājiet tukšu, lai atļautu visus domēnus. Lai norādītu vairākus domēnus, tos var atdalīt ar komatu (','). auths.enable_tls=Iespējot TLS šifrēšanu auths.skip_tls_verify=Izlaist TLS pārbaudi auths.pam_service_name=PAM servisa nosaukums @@ -791,6 +1411,7 @@ auths.oauth2_provider=OAuth2 pakalpojuma sniedzējs auths.oauth2_clientID=Klienta ID (atslēga) auths.oauth2_clientSecret=Klienta noslēpums auths.openIdConnectAutoDiscoveryURL=OpenID Connect automātiskās atklāšanas URL +auths.oauth2_use_custom_url=Noklusēto URL vietā izmantot pielāgotos URL auths.oauth2_tokenURL=Talona URL auths.oauth2_authURL=Autorizācijas URL auths.oauth2_profileURL=Profila URL @@ -800,27 +1421,48 @@ auths.tips=Padomi 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.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.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/ auths.tip.openid_connect=Izmantojiet OpenID pieslēgšanās atklāšanas URL (/.well-known/openid-configuration), lai norādītu galapunktus +auths.tip.twitter=Dodieties uz adresi https://dev.twitter.com/apps, izveidojiet aplikāciju un pārliecinieties, ka ir atzīmēts “Allow this application to be used to Sign in with Twitter” +auths.edit=Labot autentifikācijas avotu +auths.activated=Autentifikācijas avots ir atkivizēts auths.new_success=Jauna autentifikācija'%s' tika pievienota. +auths.update_success=Autentifikācijas avots tika atjaunots. +auths.update=Atjaunot autentifikācijas avotu +auths.delete=Dzēst autentifikācijas avotu auths.delete_auth_title=Dzēst autentifikācijas avotu +auths.delete_auth_desc=Izdzēšot autentifikācijas avotu, tā lietotājiem nebūs iespējams autorizēties. Vai turpināt? +auths.still_in_used=Šo autentificēšanās avotu joprojām izmanto viens vai vairāki lietotāji, tos nepieciešams izdzēst vai pārvietot uz citu autentificēšanās avotu. +auths.deletion_success=Autentifikācijas avots tika atjaunots. +auths.login_source_exist=Autentifikācijas avots ar nosaukumu '%s' jau eksistē. config.server_config=Servera konfigurācija +config.app_name=Vietnes nosaukums +config.app_ver=Gitea versija +config.app_url=Gitea pamata URL config.custom_conf=Konfigurācijas faila ceļš +config.domain=SSH servera domēns +config.offline_mode=Bezsaistes režīms config.disable_router_log=Atspējot maršrutētāja žurnalizēšanu +config.run_user=Izpildes lietotājs config.run_mode=Izpildes režīms config.git_version=Git versija config.repo_root_path=Repozitoriju glabāšanas vieta config.lfs_root_path=LFS saknes ceļš config.static_file_root_path=Statisko failu atrašanās vieta +config.log_file_root_path=Žurnalizēšanas ceļš config.script_type=Skripta veids config.reverse_auth_user=Reversā lietotāja autentifikācija config.ssh_config=SSH konfigurācija config.ssh_enabled=Iespējots +config.ssh_start_builtin_server=Izmantot iebūvēto serveri +config.ssh_domain=Servera domēns config.ssh_port=Ports config.ssh_listen_port=Klausīšanās ports config.ssh_root_path=Saknes ceļš @@ -833,19 +1475,36 @@ config.db_config=Datu bāzes konfigurācija config.db_type=Veids config.db_host=Resursdators config.db_name=Nosaukums +config.db_user=Lietotājvārds +config.db_ssl_mode=SSL config.db_path=Ceļš config.service_config=Pakalpojuma konfigurācija +config.register_email_confirm=Reģistrējoties pieprasīt apstiprināt e-pasta adresi +config.disable_register=Atspējot lietotāju reģistrāciju +config.allow_only_external_registration=Ļaut reģistrēties tikai izmantojot ārējos pakalpojumus +config.enable_openid_signup=Iespējot reģistrāciju, izmantojot OpenID +config.enable_openid_signin=Iespējot OpenID autorizāciju config.show_registration_button=Rādīt reģistrēšanās pogu +config.require_sign_in_view=Iespējot nepieciešamību autorizēties, lai aplūkotu lapas +config.mail_notify=Iespējot e-pasta paziņojumus config.disable_key_size_check=Atspējot atslēgas minimālā garuma pārbaudi +config.enable_captcha=Iespējot drošības kodu config.active_code_lives=Aktīvā koda ilgums config.reset_password_code_lives=Atjaunot paroles koda derīguma laiku +config.default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses +config.default_allow_create_organization=Pēc noklusējuma ļaut veidot organizācijas +config.enable_timetracking=Iespējot laika uzskaiti +config.default_enable_timetracking=Pēc noklusējuma iespējot laika uzskaiti +config.default_allow_only_contributors_to_track_time=Atļaut tikai dalībniekiem uzskaitīt laiku +config.no_reply_address=Neatbildēt e-pasta adreses domēns config.webhook_config=Tīkla āķu konfigurācija config.queue_length=Rindas garums config.deliver_timeout=Piegādes noildze config.skip_tls_verify=Izlaist TLS pārbaudi +config.mailer_config=SMTP sūtītāja konfigurācija config.mailer_enabled=Iespējota config.mailer_disable_helo=Atspējot HELO config.mailer_name=Nosaukums @@ -853,6 +1512,10 @@ config.mailer_host=Resursdators config.mailer_user=Lietotājs config.mailer_use_sendmail=Izmantot Sendmail config.mailer_sendmail_path=Ceļš līdz sendmail programmai +config.mailer_sendmail_args=Papildus Sendmail komandrindas argumenti +config.send_test_mail=Nosūtīt pārbaudes e-pastu +config.test_mail_failed=Neizdevās nosūtīt pārbaudes e-pastu uz '%s': %v +config.test_mail_sent=Pārbaudes e-pasts tika nosūtīts uz '%s'. config.oauth_config=OAuth konfigurācija config.oauth_enabled=Iespējots @@ -872,6 +1535,7 @@ config.session_life_time=Sesijas ilgums config.https_only=Tikai HTTPS config.cookie_life_time=Sīkdatņu glabāšanas ilgums +config.picture_config=Attēlu un profila bilžu konfigurācija config.picture_service=Lokāli attēli config.disable_gravatar=Atspējot Gravatar config.enable_federated_avatar=Iespējot apvienotās profila bildes @@ -896,6 +1560,7 @@ monitor.name=Nosaukums monitor.schedule=Grafiks monitor.next=Nākošās izpildes laiks monitor.previous=Pēdējās izpildes laiks +monitor.execute_times=Izpildes monitor.process=Darbojošies procesi monitor.desc=Apraksts monitor.start=Sākuma laiks @@ -956,6 +1621,8 @@ raw_seconds=sekundes raw_minutes=minūtes [dropzone] +default_message=Ievelciet failus vai nospiediet šeit, lai augšupielādētu. +invalid_input_type=Šādus failus nav iespējams augšupielādēt. file_too_big=Faila izmērs ({{filesize}} MB) pārsniedz maksimāli atļauto izmēru ({{maxFilesize}} MB). remove_file=Noņemt failu @@ -963,6 +1630,8 @@ remove_file=Noņemt failu notifications=Paziņojumi unread=Neizlasītie read=Izlasītie +no_unread=Nav nelasītu paziņojumu. +no_read=Nav izlasītu paziņojumu. pin=Piespraust paziņojumu mark_as_read=Atzīmēt kā izlasītu mark_as_unread=Atzīmēt kā nelasītu @@ -971,8 +1640,12 @@ mark_all_as_read=Atzīmēt visus kā izlasītus [gpg] error.extract_sign=Neizdevās izgūt parakstu error.generate_hash=Neizdevās uzģenerēt revīzijas jaucējkodu +error.no_committer_account=Revīzijas autora e-pasta adrese nav piesaistīta nevienam kontam error.no_gpg_keys_found=Šim parakstam datu bāzē netika atrasta zināma atslēga error.not_signed_commit=Nav parakstīta revīzija +error.failed_retrieval_gpg_keys=Neizdevās saņemt nevienu atslēgu, kas ir piesaistīta revīzijas autora kontam [units] +error.no_unit_allowed_repo=Jums nav tiesību aplūkot nevienu šī repozitorija sadaļu. +error.unit_not_allowed=Jums nav tiesību piekļūt šai repozitorija sadaļai. diff --git a/options/locale/locale_nb-NO.ini b/options/locale/locale_nb-NO.ini index ad90df481..c1813c92f 100644 --- a/options/locale/locale_nb-NO.ini +++ b/options/locale/locale_nb-NO.ini @@ -61,11 +61,17 @@ smtp_host=SMTP-vert admin_password=Passord [home] +password_holder=Passord [explore] +users=Brukere [auth] +register_helper_msg=Har du allerede en konto? Logg inn nå! +remember_me=Husk meg +forgot_password_title=Glemt passord +forgot_password=Glemt passord? [mail] diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 64db50357..576de0d25 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -1,11 +1,15 @@ +app_desc=Een eenvoudige, self-hosted Git service home=Beginscherm dashboard=Overzicht explore=Verkennen help=Help sign_in=Inloggen +sign_in_with=Inloggen met sign_out=Uitloggen +sign_up=Registreren link_account=Account Koppelen +link_account_signin_or_signup=Login met een bestaande gebruikersnaam/wachtwoord om een bestaand account te koppelen aan dit account, of maak een nieuw account aan. register=Registreren website=Website version=Versie @@ -14,12 +18,29 @@ template=Sjabloon language=Taal notifications=Meldingen create_new=Maken… +user_profile_and_more=Profiel en instellingen… signed_in_as=Aangemeld als +enable_javascript=Deze website werkt beter met JavaScript. username=Gebruikersnaam +email=E-mail adres password=Wachtwoord +re_type=Typ uw wachtwoord opnieuw in +captcha=CAPTCHA +twofa=Twee factor authenticatie +twofa_scratch=Eenmalige twee factor authenticatie code passcode=PIN +u2f_insert_key=Uw beveiligingssleutel invoegen +u2f_sign_in=Druk op de knop op uw beveiligingssleutel. Als u een knop niet kunt vinden, deze opnieuw invoegen. +u2f_press_button=Druk op de knop op uw beveiligingssleutel… +u2f_use_twofa=Gebruik een twee-factor code van uw telefoon +u2f_error=Wij kunnen niet uw beveiligingssleutel lezen! +u2f_unsupported_browser=Uw browser geen ondersteund U2F keys. Probeer een andere browser. +u2f_error_1=Er is een onbekende fout opgetreden. Probeer het opnieuw. +u2f_error_2=Zorg voor een versleutelde verbinding (https://) en een bezoek aan de juiste URL. +u2f_error_3=De server kan uw aanvraag niet verhandelen. +u2f_reload=Herladen repository=Repository organization=Organisatie @@ -32,6 +53,8 @@ new_org=Nieuwe organisatie manage_org=Beheer organisaties account_settings=Accountinstellingen settings=Instellingen +your_profile=Profiel +your_settings=Instellingen all=Alles sources=Bronnen @@ -47,21 +70,36 @@ cancel=Annuleren [install] install=Installatie +title=Initiële configuratie +docker_helper=Als u gebruik maakt van Gitea in Docker, lees dan de documentatie voordat u iets verandert op deze pagina. +requite_db_desc=Gitea vereist MySQL, PostgreSQL, MSSQL, SQLite3 of TiDB. db_title=Database-instellingen db_type=Database-type host=Server +user=Gebruikersnaam password=Wachtwoord db_name=Database naam +ssl_mode=SSL path=Pad +err_empty_db_path=Het SQLite3 of TiDB database pad mag niet leeg zijn. +err_empty_admin_password=Het administrator-wachtwoord mag niet leeg zijn. +general_title=Algemene Instellingen repo_path=Repositories basis map +lfs_path=Git LFS root pad +app_url=Gitea base URL log_root_path=Log-pad optional_title=Optionele instellingen +email_title=E-mail instellingen smtp_host=SMTP host +smtp_from=E-mails versturen als +mailer_user=SMTP gebruikersnaam +mailer_password=SMTP wachtwoord federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. openid_signin=OpenID-inloggen inschakelen enable_captcha_popup=Vereis captcha validatie voor zelf-registratie van gebruiker. +admin_name=Admin gebruikersnaam admin_password=Wachtwoord confirm_password=Verifieer wachtwoord install_btn_confirm=Installeer Gitea @@ -95,6 +133,8 @@ forgot_password=Wachtwoord vergeten? confirmation_mail_sent_prompt=Een nieuwe bevestigingsmail is gestuurd naar %s. De mail moet binnen %s worden bevestigd om je registratie te voltooien. reset_password_mail_sent_prompt=Een bevestigingsmail is gestuurd naar %s. De mail moet binnen %s worden bevestigd om wachtwoord reset proces te voltooien. active_your_account=Activeer uw account +prohibit_login=Inloggen niet toegestaan +prohibit_login_desc=Je mag met dit account niet inloggen, neem contact op met de beheerder van de site. has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (%s). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop. resend_mail=Klik hier om uw activatie mail nog een keer te verzenden email_not_associate=Dit emailadres is niet gekoppeld aan een account. @@ -150,6 +190,8 @@ url_error=is niet een valide URL. include_error=` moet substring '%s' bevatten.` unknown_error=Onbekende fout: +username_been_taken=Deze naam is al in gebruik. +username_password_incorrect=Gebruikersnaam of wachtwoord is onjuist. user_not_exist=De gebruiker bestaat niet. auth_failed=Verificatie mislukt: %v @@ -186,6 +228,7 @@ website=Website location=Locatie update_profile=Profiel bijwerken update_profile_success=Je profiel is bijgewerkt. +change_username=Je gebruikersnaam is gewijzigd. continue=Doorgaan cancel=Annuleren @@ -709,6 +752,7 @@ dashboard.total_gc_pause=Totaal GC verwerkingstijd dashboard.last_gc_pause=Laatste GC verwerkingstijd dashboard.gc_times=GC verwerkingen +users.name=Gebruikersnaam users.activated=Geactiveerd users.admin=Beheerder users.repos=Repos @@ -783,6 +827,7 @@ config.db_config=Databaseconfiguratie config.db_type=Type config.db_host=Host config.db_name=Naam +config.db_user=Gebruikersnaam config.db_path=Pad config.service_config=Serviceconfiguratie diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 3dcb05082..59de43ec9 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1,10 +1,13 @@ +app_desc=Bezbolesna usługa Git na własnym serwerze home=Strona główna dashboard=Pulpit explore=Odkrywaj help=Pomoc sign_in=Zaloguj się +sign_in_with=Zaloguj się za pomocą sign_out=Wyloguj +sign_up=Zarejestruj link_account=Powiąż konto register=Zarejestruj się website=Strona @@ -13,12 +16,21 @@ page=Strona template=Szablon language=Język notifications=Powiadomienia +create_new=Utwórz… +user_profile_and_more=Profil i ustawienia… signed_in_as=Zalogowany jako +enable_javascript=Strona działa najlepiej z włączonym JavaScript. username=Nazwa użytkownika +email=Adres e-mail password=Hasło +re_type=Wpisz ponownie hasło +captcha=CAPTCHA +twofa=Autoryzacja dwuskładnikowa +twofa_scratch=Kod jednorazowy weryfikacji dwuetapowej passcode=Kod dostępu +u2f_reload=Odśwież repository=Repozytorium organization=Organizacja @@ -29,8 +41,12 @@ new_mirror=Nowa kopia lustrzana new_fork=Nowy fork repozytorium new_org=Nowa organizacja manage_org=Zarządzaj organizacjami +admin_panel=Administracja stron account_settings=Ustawienia konta settings=Ustawienia +your_profile=Profil +your_starred=Z gwiazdką +your_settings=Ustawienia all=Wszystko sources=Źródła @@ -46,34 +62,61 @@ cancel=Anuluj [install] install=Instalacja +title=Wstępna konfiguracja db_title=Ustawienia bazy danych db_type=Typ bazy danych host=Serwer +user=Nazwa użytkownika password=Hasło db_name=Nazwa bazy danych +ssl_mode=SSL path=Ścieżka +err_empty_db_path=Ścieżka do bazy danych SQLite3 lub TiDB nie może być pusta. +err_empty_admin_password=Hasło administratora nie może być puste. +general_title=Ustawienia ogólne +app_name=Tytuł witryny +app_name_helper=Wprowadź nazwę firmy. repo_path=Katalog repozytoriów +lfs_path=Ścieżka główna Git LFS +run_user=Uruchom jako nazwa użytkownika +domain=Domena serwera SSH +ssh_port=Port serwera SSH +app_url=Podstawowy adres URL Gitea log_root_path=Ścieżka dla logów optional_title=Ustawienia opcjonalne +email_title=Ustawienia e-mail smtp_host=Serwer SMTP +smtp_from=Wyślij e-mail jako +mailer_user=Nazwa użytkownika SMTP +mailer_password=Hasło SMTP +register_confirm=Wymagają potwierdzenia e-mail przy rejestracji +mail_notify=Włącz powiadomienia e-mail +disable_gravatar=Wyłącz Gravatar federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Wyłącz rejestrację dwuskładnikową openid_signin=Włącz logowanie za pomocą OpenID +enable_captcha=Włącz CAPTCHA enable_captcha_popup=Wymagaj walidacji CAPTCHA przy samodzielnej rejestracji użytkownika. admin_password=Hasło confirm_password=Potwierdź hasło +admin_email=Adres e-mail install_btn_confirm=Zainstaluj Gitea test_git_failed=Nie udało się przetestować polecenia „git”: %v save_config_failed=Nie udało się zapisać konfiguracji: %v [home] +uname_holder=Nazwa użytkownika lub adres email password_holder=Hasło switch_dashboard_context=Przełącz kontekst pulpitu +my_repos=Repozytoria +show_more_repos=Pokaż więcej repozytoriów… collaborative_repos=Wspólne repozytoria my_orgs=Moje organizacje my_mirrors=Moje kopie lustrzane view_home=Zobacz %s +search_repos=Znajdź repozytorium… issues.in_your_repos=W Twoich repozytoriach @@ -82,12 +125,20 @@ repos=Repozytoria users=Użytkownicy organizations=Organizacje search=Wyszukiwanie +code=Kod +repo_no_results=Nie znaleziono pasujących repozytoriów. +user_no_results=Nie znaleziono pasującego użytkowników. +org_no_results=Nie znaleziono pasujących organizacji. +code_search_results=Wyniki wyszukiwania dla '%s' [auth] +create_new_account=Zarejestruj konto register_helper_msg=Masz już konto? Zaloguj się teraz! +social_register_helper_msg=Masz już konto? Powiąż je teraz! remember_me=Zapamiętaj mnie forgot_password_title=Zapomniałem hasła forgot_password=Zapomniałeś hasła? +sign_up_now=Potrzebujesz konta? Zarejestruj się teraz. confirmation_mail_sent_prompt=Nowy email aktywacyjny został wysłany na adres %s. Sprawdź swoją skrzynkę odbiorczą w ciągu %s aby zakończyć proces rejestracji. reset_password_mail_sent_prompt=Email potwierdzający został wysłany na adres %s. Sprawdź swoją skrzynkę odbiorczą w ciągu %s aby zakończyć proces resetowania hasła. active_your_account=Aktywuj swoje konto @@ -102,6 +153,7 @@ scratch_code=Kod jednorazowy use_scratch_code=Użyj kodu jednorazowego twofa_scratch_used=Użyłeś/aś swojego kodu jednorazowego. Przekierowano Cię do strony z ustawieniami autoryzacji dwuetapowej, gdzie możesz usunąć swoje urządzenie lub wygenerować nowy kod jednorazowy. twofa_scratch_token_incorrect=Twój kod jednorazowy jest niepoprawny. +login_userpass=Zaloguj się login_openid=OpenID openid_connect_submit=Połącz openid_connect_title=Połącz z istniejącym kontem @@ -117,12 +169,14 @@ register_notify=Witamy w Gitea [modal] yes=Tak no=Nie +modify=Aktualizuj [form] UserName=Nazwa użytkownika RepoName=Nazwa repozytorium Email=Adres e-mail Password=Hasło +Retype=Wpisz ponownie hasło SSHTitle=Nazwa klucza SSH HttpsUrl=HTTPS URL PayloadUrl=URL do wywołania @@ -145,7 +199,13 @@ email_error=` nie jest poprawnym adresem e-mail.` url_error=` nie jest poprawnym adresem URL.` include_error=`musi zawierać tekst '%s'.` unknown_error=Nieznany błąd: +captcha_incorrect=Kod CAPTCHA jest nieprawidłowy. +password_not_match=Hasła nie są identyczne. +username_been_taken=Ta nazwa użytkownika jest już zajęta. +repo_name_been_taken=Nazwa repozytorium jest już zajęta. +org_name_been_taken=Nazwa organizacji jest już zajęta. +team_name_been_taken=Nazwa zespołu jest już zajęta. user_not_exist=Użytkownik nie istnieje. auth_failed=Uwierzytelnienie się nie powiodło: %v @@ -154,6 +214,7 @@ auth_failed=Uwierzytelnienie się nie powiodło: %v target_branch_not_exist=Gałąź docelowa nie istnieje. [user] +change_avatar=Zmień swój awatar… join_on=Dołączył repositories=Repozytoria activity=Publiczna aktywność @@ -166,15 +227,21 @@ form.name_reserved=Nazwa użytkownika '%s' jest zarezerwowana. [settings] profile=Profil +account=Konto password=Hasło security=Bezpieczeństwo avatar=Awatar ssh_gpg_keys=Klucze SSH / GPG social=Konta społecznościowe +applications=Aplikacje +orgs=Zarządzaj organizacjami repos=Repozytoria delete=Usuń konto twofa=Autoryzacja dwuetapowa +account_link=Powiązane Konta +organization=Organizacje uid=UID +u2f=Klucze bezpieczeństwa public_profile=Profil publiczny full_name=Imię i nazwisko @@ -182,20 +249,33 @@ website=Strona location=Lokalizacja update_profile=Zaktualizuj profil update_profile_success=Twój profil został zaktualizowany. +change_username=Twój nick został zmieniony. continue=Kontynuuj cancel=Anuluj +language=Język federated_avatar_lookup=Wyszukiwanie zewnętrznych awatarów enable_custom_avatar=Włącz niestandardowe awatary choose_new_avatar=Wybierz nowy avatar +update_avatar=Aktualizuj awatar delete_current_avatar=Usuń obecny Avatar +uploaded_avatar_not_a_image=Załadowany plik nie jest obrazem. +update_avatar_success=Twój awatar został zmieniony. +change_password=Aktualizuj hasło old_password=Aktualne hasło new_password=Nowe hasło +retype_new_password=Powtórz nowe hasło +password_incorrect=Bieżące hasło nie jest prawidłowe. emails=Adresy e-mail +manage_emails=Zarządzaj adresami e-mail email_desc=Twój podstawowy adres e-mail będzie używany do powiadomień i innych działań. primary=Podstawowy +delete_email=Usuń +email_deletion=Usuń adres email +add_new_email=Dodaj nowy e-mail +add_email=Dodaj adres e-mail add_openid=Dodaj OpenID URI manage_ssh_keys=Zarządzaj kluczami SSH @@ -209,6 +289,11 @@ subkeys=Podklucze key_id=ID klucza key_name=Nazwa klucza key_content=Treść +delete_key=Usuń +ssh_key_deletion=Usuń klucz SSH +gpg_key_deletion=Usuń klucz GPG +ssh_key_deletion_success=Klucz SSH został usunięty. +gpg_key_deletion_success=Klucz GPG został usunięty. add_on=Dodano valid_until=Ważne do valid_forever=Ważne bezterminowo @@ -220,8 +305,10 @@ key_state_desc=Ten klucz był użyty w ciągu ostatnich 7 dni token_state_desc=Ten token był użyty w ciągu ostatnich 7 dni show_openid=Pokaż w profilu hide_openid=Ukryj w profilu +ssh_disabled=SSH jest wyłączony manage_social=Zarządzaj powiązanymi kontami społecznościowymi +unbind=Rozłącz generate_new_token=Wygeneruj nowy token token_name=Nazwa tokena @@ -230,6 +317,7 @@ delete_token=Usuń twofa_is_enrolled=Twoje konto ma obecnie włączoną autoryzację dwuetapową. twofa_not_enrolled=Twoje konto obecnie nie ma włączonej autoryzacji dwuetapowej. +twofa_disable=Wyłącz weryfikację dwuetapową twofa_disabled=Dwuetapowa autoryzacja została wyłączona. scan_this_image=Zeskanuj ten obraz za pomocą swojej aplikacji uwierzytelniającej: or_enter_secret=Lub wprowadź sekret: %s @@ -241,6 +329,7 @@ repos_none=Nie posiadasz żadnych repozytoriów delete_account=Usuń swoje konto confirm_delete_account=Potwierdź usunięcie +delete_account_title=Usuń swoje konto [repo] owner=Właściciel @@ -250,7 +339,10 @@ fork_repo=Sforkowane fork_from=Forkuj z repo_desc=Opis repo_lang=Język +repo_gitignore_helper=Wybierz szablony pliku .gitignore. license=Licencja +license_helper=Wybierz plik licencji. +readme=README create_repo=Utwórz repozytorium default_branch=Domyślna gałąź mirror_prune=Wyczyść @@ -272,12 +364,14 @@ migrate.failed=Migracja nie powiodła się: %v mirror_from=kopia lustrzana forked_from=sklonowany z copy_link=Kopiuj +copy_link_success=Link został skopiowany copied=Skopiowano unwatch=Przestań obserwować watch=Obserwuj unstar=Usuń gwiazdkę star=Gwiazdka fork=Forkuj +download_archive=Pobierz repozytorium no_desc=Brak opisu quick_guide=Skrócona instrukcja @@ -305,30 +399,45 @@ file_view_raw=Zobacz czysty file_permalink=Bezpośredni odnośnik stored_lfs=Przechowane za pomocą Git LFS +editor.new_file=Nowy plik +editor.upload_file=Wyślik plik +editor.edit_file=Edytuj plik editor.preview_changes=Podgląd zmian +editor.edit_this_file=Edytuj plik +editor.delete_this_file=Usuń plik +editor.file_delete_success=Plik %s został usunięty. +editor.name_your_file=Nazwij plik… editor.or=lub +editor.cancel_lower=Anuluj editor.commit_changes=Zatwierdź zmiany editor.add_tmpl=Dodaj '%s/' editor.add=Dodaj '%s' editor.update=Zaktualizuj '%s' editor.delete=Usuń '%s' +editor.commit_message_desc=Dodaj dodatkowy rozszerzony opis… editor.commit_directly_to_this_branch=Zmieniaj bezpośrednio gałąź %s. editor.create_new_branch=Stwórz nową gałąź dla tego commita i rozpocznij pull request. +editor.new_branch_name_desc=Nazwa nowej gałęzi… editor.cancel=Anuluj +editor.filename_cannot_be_empty=Nazwa pliku nie może być pusta. editor.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium. editor.no_changes_to_show=Brak zmian do pokazania. editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v +editor.add_subdir=Dodaj katalog… editor.unable_to_upload_files=Wysyłanie plików do '%s' nie powiodło się z błędem: %v editor.upload_files_to_dir=Prześlij pliki do '%s' commits.commits=Commity +commits.search=Przeszukaj commity… commits.find=Szukaj +commits.search_all=Wszystkie gałęzie commits.author=Autor commits.message=Wiadomość commits.date=Data commits.older=Starsze commits.newer=Nowsze commits.signed_by=Podpisane przez +commits.gpg_key_id=ID klucza GPG issues.new=Nowy problem @@ -343,6 +452,8 @@ issues.new.closed_milestone=Zamknięte kamienie milowe issues.no_ref=Nie określono gałęzi/etykiety issues.create=Utwórz problem issues.new_label=Nowa etykieta +issues.new_label_placeholder=Nazwa etykiety +issues.new_label_desc_placeholder=Opis issues.create_label=Utwórz etykietę issues.label_templates.title=Załaduj wstępnie przygotowany zestaw etykiet issues.label_templates.helper=Wybierz zestaw etykiet @@ -361,6 +472,7 @@ issues.delete_branch_at=`usunął gałąź %s %s` issues.open_tab=Otwarte %d issues.close_tab=Zamknięte %d issues.filter_label=Etykieta +issues.filter_label_no_select=Wszystkie etykiety issues.filter_milestone=Kamień milowy issues.filter_assignee=Przypisany issues.filter_type=Typ @@ -411,6 +523,8 @@ issues.label_count=Etykiety %d issues.label_open_issues=Otwarte problemy %d issues.label_edit=Edytuj issues.label_delete=Usuń +issues.label_modify=Edytuj etykietę +issues.label_deletion=Usuń etykietę issues.label.filter_sort.alphabetically=Alfabetycznie issues.label.filter_sort.reverse_alphabetically=Alfabetycznie odwrotnie issues.label.filter_sort.by_size=Rozmiar @@ -420,17 +534,20 @@ issues.attachment.open_tab=`Kliknij, aby zobaczyć „%s” w nowej karcie` issues.attachment.download=`Kliknij, aby pobrać „%s”` issues.subscribe=Subskrybuj issues.unsubscribe=Anuluj subskrypcję +issues.tracker=Śledzenie czasu issues.start_tracking_short=Rozpocznij issues.start_tracking_history=`rozpoczął pracę nad %s` issues.tracking_already_started=`Już śledzisz czas pracy nad tą sprawą!` issues.stop_tracking=Zatrzymaj issues.stop_tracking_history=`zakończył pracę nad %s` +issues.add_time_short=Dodaj czas issues.add_time_cancel=Anuluj issues.add_time_history=`dodano spędzony czas %s` issues.add_time_hours=Godziny issues.add_time_minutes=Minuty issues.cancel_tracking=Anuluj issues.cancel_tracking_history=`anulowanie śledzenie czasu %s` +issues.due_date_form=yyyy-mm-dd pulls.new=Nowy pull request pulls.filter_branch=Filtruj branch @@ -471,6 +588,7 @@ milestones.filter_sort.least_issues=Najmniej problemów wiki=Wiki wiki.page=Strona wiki.filter_page=Filtruj stronę +wiki.new_page=Strona wiki.default_commit_message=Opisz tę zmianę (opcjonalne). wiki.save_page=Zapisz stronę wiki.last_commit_info=%s edytuje tę stronę %s @@ -526,6 +644,7 @@ search.results=Wyniki wyszukiwania dla "%s" w %s settings=Ustawienia settings.desc=Ustawienia to miejsce, w którym możesz zmieniać parametry repozytorium +settings.options=Repozytorium settings.collaboration.write=Zapis settings.collaboration.read=Odczyt settings.collaboration.undefined=Niezdefiniowany @@ -533,6 +652,8 @@ settings.hooks=Webhooki settings.githooks=Hooki Git settings.basic_settings=Ustawienia podstawowe settings.mirror_settings=Kopia lustrzana ustawień +settings.sync_mirror=Synchronizuj teraz +settings.site=Strona settings.update_settings=Aktualizuj ustawienia settings.advanced_settings=Ustawienia zaawansowane settings.external_wiki_url=Adres URL zewnętrznego Wiki @@ -546,11 +667,15 @@ settings.transfer=Przeniesienie własności settings.delete=Usuń to repozytorium settings.delete_notices_1=- Ta operacja NIE MOŻE zostać cofnięta. settings.transfer_owner=Nowy właściciel +settings.confirm_delete=Usuń repozytorium +settings.delete_collaborator=Usuń +settings.search_user_placeholder=Szukaj użytkownika… settings.add_webhook=Dodaj webhooka settings.webhook.test_delivery=Testuj dostawę settings.webhook.request=Żądanie settings.webhook.response=Odpowiedź settings.webhook.headers=Nagłówki +settings.webhook.payload=Zawartość settings.webhook.body=Treść settings.githook_edit_desc=Jeśli hook jest nieaktywny, zaprezentowana zostanie przykładowa treść. Pozostawienie pustej wartości wyłączy ten hook. settings.githook_name=Nazwa hooka @@ -583,6 +708,7 @@ settings.protected_branch_can_push_yes=Możesz wysyłać settings.protected_branch_can_push_no=Nie możesz wysyłać settings.add_protected_branch=Włącz ochronę settings.delete_protected_branch=Wyłącz ochronę +settings.choose_branch=Wybierz gałąź… diff.browse_source=Przeglądaj źródła diff.parent=rodzic @@ -611,6 +737,7 @@ release.title=Tytuł release.content=Treść release.write=Napisz release.preview=Podgląd +release.loading=Ładowanie… release.cancel=Anuluj release.publish=Publikuj wersję release.save_draft=Zapisz szkic @@ -625,6 +752,7 @@ branch.create_from=z '%s' branch.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium. branch.deleted_by=Usunięta przez %s +topic.done=Gotowe [org] org_name_holder=Nazwa organizacji @@ -635,12 +763,16 @@ people=Ludzie teams=Zespoły lower_members=członkowie lower_repositories=repozytoria +create_new_team=Nowy zespół +create_team=Utwórz zespół org_desc=Opis team_name=Nazwa zespołu team_desc=Opis +team_permission_desc=Uprawnienie settings=Ustawienia +settings.options=Organizacja settings.full_name=Imię i nazwisko settings.website=Strona settings.location=Lokalizacja @@ -649,9 +781,12 @@ settings.update_setting_success=Ustawienia organizacji zostały zaktualizowane. settings.delete=Usuń organizację settings.delete_account=Usuń tą organizację settings.confirm_delete_account=Potwierdź usunięcie +settings.delete_org_title=Usuń organizację settings.hooks_desc=Dodaj webhooki, uruchamiane dla wszystkich repozytoriów w tej organizacji. members.membership_visibility=Widoczność członkostwa: +members.public=Widoczny +members.private=Ukryty members.member_role=Rola: members.owner=Właściciel members.member=Członek @@ -668,15 +803,19 @@ teams.no_desc=Ten zespół nie ma opisu teams.settings=Ustawienia teams.members=Członkowie zespołu teams.update_settings=Aktualizuj ustawienia +teams.delete_team=Usuń zespół teams.add_team_member=Dodaj członka zespołu +teams.delete_team_title=Usuń zespół teams.delete_team_success=Zespół został usunięty. teams.repositories=Repozytoria zespołu +teams.search_repo_placeholder=Szukaj repozytorium… teams.add_team_repository=Dodaj repozytorium zespołu teams.remove_repo=Usuń teams.add_nonexistent_repo=Repozytorium, które próbujesz dodać, nie istnieje. Proszę je najpierw utworzyć. [admin] dashboard=Pulpit +users=Konta użytkownika organizations=Organizacje repositories=Repozytoria config=Konfiguracja @@ -686,6 +825,8 @@ first_page=Pierwsza last_page=Ostatnia total=Ogółem: %d +dashboard.statistic=Podsumowanie +dashboard.system_status=Status strony dashboard.operation_name=Nazwa operacji dashboard.operation_switch=Przełącz dashboard.operation_run=Uruchom @@ -724,6 +865,7 @@ dashboard.total_gc_pause=Sumaryczny czas wstrzymania przez GC dashboard.last_gc_pause=Ostatnie wstrzymanie przez GC dashboard.gc_times=Ilość wywołań GC +users.name=Nazwa użytkownika users.activated=Aktywowany users.admin=Administrator users.repos=Repozytoria @@ -731,11 +873,14 @@ users.created=Utworzony users.edit=Edytuj users.auth_source=Źródło uwierzytelniania users.local=Lokalny +users.update_profile=Zaktualizuj konto użytkownika +users.delete_account=Usuń konto użytkownika orgs.org_manage_panel=Zarządzanie organizacją orgs.name=Nazwa orgs.teams=Zespoły orgs.members=Członkowie +orgs.new_orga=Nowa organizacja repos.repo_manage_panel=Zarządzanie repozytoriami repos.owner=Właściciel @@ -760,6 +905,7 @@ auths.bind_dn=DN powiązania auths.bind_password=Hasło Bind auths.user_base=Baza wyszukiwania auths.user_dn=DN użytkownika +auths.search_page_size=Rozmiar strony auths.filter=Filtr użytkownika auths.admin_filter=Filtr administratora auths.ms_ad_sa=Atrybuty wyszukiwania MS AD @@ -791,6 +937,8 @@ auths.new_success=Uwierzytelnienie '%s' zostało dodane. auths.delete_auth_title=Usuń źródło uwierzytelniania config.server_config=Konfiguracja serwera +config.app_name=Tytuł strony +config.app_ver=Wersja Gitea config.custom_conf=Ścieżka do pliku konfiguracyjnego config.disable_router_log=Wyłącz dziennik routera config.run_mode=Tryb uruchamienia @@ -798,11 +946,13 @@ config.git_version=Wersja Git config.repo_root_path=Ścieżka główna repozytoriów config.lfs_root_path=Ścieżka główna katalogu LFS config.static_file_root_path=Ścieżka główna plików statycznych +config.log_file_root_path=Ścieżka dla logów config.script_type=Typ skryptu config.reverse_auth_user=Użytkownik odwrotnego proxy config.ssh_config=Konfiguracja SSH config.ssh_enabled=Włączone +config.ssh_domain=Domena serwera config.ssh_port=Port config.ssh_listen_port=Port nasłuchiwania config.ssh_root_path=Ścieżka do katalogu głównego @@ -815,11 +965,13 @@ config.db_config=Konfiguracja bazy danych config.db_type=Typ config.db_host=Serwer config.db_name=Nazwa +config.db_ssl_mode=SSL config.db_path=Ścieżka config.service_config=Konfiguracja usługi config.show_registration_button=Pokazuj przycisk rejestracji config.disable_key_size_check=Wyłącz sprawdzanie minimalnego rozmiaru klucza +config.enable_captcha=Włącz CAPTCHA config.active_code_lives=Ważność kodów aktywacyjnych config.reset_password_code_lives=Czas wygaśnięcia kodu resetowania hasła diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 14d6335d8..dae81d2cc 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -102,6 +102,7 @@ lfs_path_helper=У цій папці будуть зберігатися фай run_user=Запуск від імені Користувача run_user_helper=Введіть ім'я користувача операційної системи, під яким працює Gitea. Зверніть увагу, що цей користувач повинен бути доступ до кореневого шляху репозиторія. domain=Домен SSH сервера +domain_helper=Домен або хост-адреса для клонування через SSH - впливає на URL-адресу. ssh_port=Порт SSH сервера ssh_port_helper=Номер порту, який використовує SSH сервер. Залиште порожнім, щоб вимкнути SSH. http_port=Gitea HTTP порт @@ -149,6 +150,7 @@ test_git_failed=Не в змозі перевірити 'git' команду: %v sqlite3_not_available=Ця версія Gitea не підтримує SQLite3. Будь ласка, завантажте офіційну бінарну версію з %s (не версію gobuild). invalid_db_setting=Налаштування бази даних є некоректними: %v invalid_repo_path=Помилковий шлях до кореня репозиторію: %v +run_user_not_match=Ім'я користувача 'run as' не є поточним ім'ям користувача: %s -> %s save_config_failed=Не в змозі зберегти конфігурацію: %v invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v install_success=Ласкаво просимо! Дякуємо вам за вибір Gitea. Розважайтеся, і будьте обережні! @@ -342,6 +344,7 @@ location=Місцезнаходження update_profile=Оновити профіль update_profile_success=Профіль успішно оновлено. change_username=Ваше Ім'я кристувача було змінено. +change_username_prompt=Примітка. Зміни в імені також змінюють URL-адресу облікового запису. continue=Продовжити cancel=Відмінити language=Мова @@ -371,8 +374,10 @@ primary=Основний primary_email=Зробити основним delete_email=Видалити email_deletion=Видалити адресу електронної пошти +email_deletion_desc=Електронна адреса та пов'язана з нею інформація буде видалена з вашого облікового запису. Git коміти, здійснені через цю електронну адресу, залишиться без змін. Продовжити? email_deletion_success=Адресу електронної пошти було видалено. openid_deletion=Видалити адресу OpenID +openid_deletion_desc=Видалення цієї OpenID-адреси з вашого облікового запису забороняє вам входити з ним. Продовжити? openid_deletion_success=Адреса OpenID була видалена. add_new_email=Додати нову адресу електронної пошти add_new_openid=Додати новий OpenID URI @@ -383,6 +388,7 @@ add_email_success=Додано нову адресу електронної по add_openid_success=Нова адреса OpenID була додана. keep_email_private=Приховати адресу електронної пошти keep_email_private_popup=Вашу адресу електронної пошти буде приховано від інших користувачів. +openid_desc=OpenID дозволяє делегувати аутентифікацію зовнішньому постачальнику послуг. manage_ssh_keys=Керувати SSH ключами manage_gpg_keys=Керувати GPG ключами @@ -396,6 +402,7 @@ add_new_gpg_key=Додати GPG ключ ssh_key_been_used=Цей ключ SSH вже додано до вашого облікового запису. ssh_key_name_used=Ключ SSH з таким самим ім'ям вже додано до вашого облікового запису. gpg_key_id_used=Публічний ключ GPG з таким самим ідентифікатором вже існує. +gpg_no_key_email_found=Цей ключ GPG непридатний для використання з будь-якою електронною адресою, що пов'язана з вашим обліковим записом. subkeys=Підключі key_id=ID ключа key_name=Ім'я ключа @@ -407,7 +414,7 @@ ssh_key_deletion=Видалити SSH ключ gpg_key_deletion=Видалити GPG ключ ssh_key_deletion_desc=Видалення ключа SSH скасовує доступ до вашого облікового запису. Продовжити? gpg_key_deletion_desc=Видалення GPG ключа скасовує перевірку підписаних ним комітів. Продовжити? -ssh_key_deletion_success=SSH було видалено. +ssh_key_deletion_success=SSH ключ був видалений. gpg_key_deletion_success=GPG було видалено. add_on=Додано valid_until=Дійсний до @@ -423,7 +430,9 @@ hide_openid=Не показувати у профілі ssh_disabled=SSH вимкнено manage_social=Керувати зв'язаними обліковими записами соціальних мереж +social_desc=Ці адреси соціальних мереж пов'язані з вашим обліковим записом Gitea. Переконайтеся, що ви їх впізнаєте, оскільки вони можуть бути використані для входу в обліковий запис Gitea. unbind=Від'єднати +unbind_success=Зв'язаний зовнішній обліковий запис було видалено. manage_access_token=Керування токенами доступу generate_new_token=Згенерувати новий токен @@ -431,30 +440,43 @@ tokens_desc=Ці токени надають доступ до вашого об new_token_desc=Додатки, що використовують токен, мають повний доступ до вашого облікового запису. token_name=Ім'я токену generate_token=Згенерувати токен +generate_token_success=Ваш новий токен був створений. Скопіюйте його зараз, оскільки він не буде показаний знову. delete_token=Видалити access_token_deletion=Видалити токен доступу +access_token_deletion_desc=Видалення токена скасовує доступ до вашого облікового запису для програм, що використовують його. Продовжити? +delete_token_success=Токен був знищений. Програми, що використовують його, більше не мають доступу до вашого облікового запису. twofa_desc=Двофакторна автентифікація підвищує безпеку вашого облікового запису. twofa_is_enrolled=Ваш обліковий запис на даний час використовує двофакторну автентифікацію. twofa_not_enrolled=Ваш обліковий запис наразі не використовує двофакторну автентифікаціїю. twofa_disable=Вимкнути двофакторну автентифікацію twofa_scratch_token_regenerate=Перестворити токен одноразового пароля +twofa_scratch_token_regenerated=Ваш новий scratch-токен %s. Зберігайте його в безпечному місці. twofa_enroll=Увімкнути двофакторну автентифікацію twofa_disable_note=При необхідності можна відключити двофакторну автентифікацію. +twofa_disable_desc=Вимкнення двофакторної автентифікації зробить ваш обліковий запис менш безпечним. Продовжити? regenerate_scratch_token_desc=Якщо ви втратили свій токен одноразового пароля або вже використовували його для входу, ви можете скинути його тут. twofa_disabled=Двофакторна автентифікація вимкнена. scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної автентифікації: or_enter_secret=Або введіть секрет: %s +then_enter_passcode=І введіть пароль, який відображається в додатку: passcode_invalid=Некоректний пароль. Спробуй ще раз. +twofa_enrolled=Для вашого облікового запису було включена двофакторна автентифікація. Зберігайте свій scratch-токен (%s) у безпечному місці, оскільки він показується лише один раз! u2f_desc=Ключами безпеки є апаратні пристрої, що містять криптографічні ключі. Вони можуть використовуватися для двофакторної автентифікації. Ключ безпеки повинен підтримувати стандарт FIDO U2F. +u2f_require_twofa=Для використання ключів безпеки необхідно зареєструвати двофакторну аутентифікацію. u2f_register_key=Додати ключ безпеки u2f_nickname=Псевдонім +u2f_press_button=Натисніть кнопку на ключі безпеки, щоб зареєструвати його. u2f_delete_key=Видалити ключ безпеки +u2f_delete_key_desc=Якщо ви видалите ключ безпеки, ви не зможете використати його для входу. Ти впевнені? manage_account_links=Керування обліковими записами manage_account_links_desc=Ці зовнішні акаунти прив'язані до вашого аккаунту Gitea. +account_links_not_available=Наразі немає зовнішніх облікових записів, пов'язаних із вашим обліковим записом Gitea. remove_account_link=Видалити облікові записи +remove_account_link_desc=Видалення пов'язаного облікового запису відкликає його доступ до вашого облікового запису Gitea. Продовжити? +remove_account_link_success=Зв'язаний обліковий запис видалено. orgs_none=Ви не є учасником будь-якої організації. repos_none=У вас немає власних репозиторіїв @@ -463,12 +485,15 @@ delete_account=Видалити ваш обліковий запис delete_prompt=Ця операція остаточно видалить обліковий запис користувача. Це НЕ МОЖЛИВО відмінити. confirm_delete_account=Підтвердження видалення delete_account_title=Видалити цей обліковий запис +delete_account_desc=Ви впевнені, що хочете остаточно видалити цей обліковий запис? [repo] owner=Власник repo_name=Назва репозиторію +repo_name_helper=Хороші назви репозиторіїв використовують короткі, унікальні ключові слова що легко запам'ятати. visibility=Видимість visiblity_helper=Зробити репозиторій приватним +visiblity_helper_forced=Адміністратор вашого сайту налаштував параметри нових репозиторіїв: всі нові репозиторії будуть приватними. visiblity_fork_helper=(Зміна цього вплине на всі форки.) clone_helper=Потрібна допомога у клонуванні? Відвідайте Допомогу. fork_repo=Форкнути репозиторій @@ -485,9 +510,11 @@ auto_init=Ініціалізувати репозиторій (Додає .gitig create_repo=Створити репозиторій default_branch=Головна гілка mirror_prune=Очистити +mirror_prune_desc=Видалення застарілих посилань які ви відслідковуєте mirror_interval=Інтервал дзеркалювання (доступні значення 'h', 'm', 's') mirror_interval_invalid=Інтервал дзеркалювання є неприпустимим. mirror_address=Клонування з URL-адреси +mirror_address_desc=Включіть необхідні облікові дані в URL-адресу. mirror_last_synced=Остання синхронізація watchers=Спостерігачі stargazers=Зацікавлені @@ -497,6 +524,7 @@ reactions_more=додати %d більше form.reach_limit_of_creation=Ви досягли максимальної кількості %d створених репозиторіїв. form.name_reserved=Назву репозиторію '%s' зарезервовано. +form.name_pattern_not_allowed=Шаблон '%s' не дозволено в назві сховища. need_auth=Клонувати з авторизацією migrate_type=Тип міграції @@ -506,6 +534,7 @@ migrate.clone_address=Міграція / клонувати з URL-адреси migrate.clone_address_desc=URL-адреса HTTP(S) або Git "clone" існуючого репозиторія migrate.clone_local_path=або шлях до локального серверу migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії. +migrate.invalid_local_path=Локальний шлях недійсний. Він не існує або не є каталогом. migrate.failed=Міграція не вдалася: %v migrate.lfs_mirror_unsupported=Дзеркалювання LFS об'єктів не підтримується - використовуйте 'git lfs fetch --all' і 'git lfs push --all' вручну. @@ -531,6 +560,7 @@ push_exist_repo=Опублікувати існуючий репозиторій bare_message=Цей репозиторій порожній. code=Код +code.desc=Доступ до коду, файлів, комітів та гілок. branch=Гілка tree=Дерево filter_branch_and_tag=Фільтрувати гілку або тег @@ -564,6 +594,7 @@ editor.delete_this_file=Видалити файл editor.must_have_write_access=Ви повинні мати доступ на запис щоб запропонувати зміни до цього файлу. editor.file_delete_success=Файл '%s' видалено. editor.name_your_file=Дайте назву файлу… +editor.filename_help=Щоб додати каталог, наберіть його назву, а потім - косу риску ('/'). Щоб видалити каталог, перейдіть до початку поля і натисніть backspace. editor.or=або editor.cancel_lower=Скасувати editor.commit_changes=Закомітити зміни @@ -579,13 +610,19 @@ editor.cancel=Відмінити editor.filename_cannot_be_empty=Ім'я файлу не може бути порожнім. editor.branch_already_exists=Гілка '%s' вже присутня в репозиторії. editor.directory_is_a_file=Ім'я каталогу "%s" уже використовується як ім'я файлу в цьому репозиторії. +editor.file_is_a_symlink='%s' є символічним посиланням. Символічні посилання не можливо редагувати в веб-редакторі +editor.filename_is_a_directory=Назва файлу '%s' вже використовується як ім'я каталогу в цьому репозиторії. +editor.file_editing_no_longer_exists=Редагований файл '%s' більше не існує в цьому репозиторії. +editor.file_changed_while_editing=Зміст файлу змінився з моменту початку редагування. Натисніть тут , щоб переглянути що було змінено, або Прийняти зміни ще раз , щоб записати свої зміни. editor.file_already_exists=Файл з назвою "%s" уже існує у цьому репозиторію. editor.no_changes_to_show=Нема змін для показу. editor.fail_to_update_file=Не вдалося оновити/створити файл '%s' через помилку: %v editor.add_subdir=Додати каталог… editor.unable_to_upload_files=Не вдалося завантажити файли до '%s' через помилку: %v editor.upload_files_to_dir=Завантажувати файли до '%s' +editor.cannot_commit_to_protected_branch=Заборонено вносити коміт до захищеної гілки '%s'. +commits.desc=Переглянути історію зміни коду. commits.commits=Коміти commits.search=Знайти коміт… commits.find=Пошук @@ -601,6 +638,7 @@ commits.gpg_key_id=Ідентифікатор GPG ключа ext_issues=Зов. Проблеми ext_issues.desc=Посилання на зовнішню систему відстеження проблем. +issues.desc=Організація звітів про помилки, завдань та етапів. issues.new=Нова проблема issues.new.labels=Мітки issues.new.no_label=Без мітки @@ -620,12 +658,17 @@ issues.new_label_placeholder=Назва мітки issues.new_label_desc_placeholder=Опис issues.create_label=Створити мітку issues.label_templates.title=Завантажити визначений набір міток +issues.label_templates.info=Ще немає міток. Натисніть 'Нова мітка' або використовуйте попередньо визначений набір міток: issues.label_templates.helper=Оберіть набір міток issues.label_templates.use=Використовувати набір міток issues.label_templates.fail_to_load_file=Не вдалося завантажити файл шаблона мітки '%s': %v issues.add_label_at=додав(ла) мітку
%s
%s +issues.remove_label_at=видалив(ла) метку
%s
%s issues.add_milestone_at=`додав(ла) до %s етапу %s` +issues.change_milestone_at=`змінено цільової етап з %s на %s %s` +issues.remove_milestone_at=`видалено з етапу%s %s` issues.deleted_milestone=`(видалено)` +issues.self_assign_at=`самонавчался %s` issues.add_assignee_at=`був призначений %s %s` issues.remove_assignee_at=`видалили із призначених %s` issues.change_title_at=`змінив(ла) заголовок з %s на %s %s` @@ -695,6 +738,7 @@ issues.label_edit=Редагувати issues.label_delete=Видалити issues.label_modify=Редагувати мітку issues.label_deletion=Видалити мітку +issues.label_deletion_desc=Видалення мітки видаляє її з усіх обговорень. Продовжити? issues.label_deletion_success=Мітку було видалено. issues.label.filter_sort.alphabetically=За алфавітом issues.label.filter_sort.reverse_alphabetically=З кінця алфавіту @@ -726,21 +770,28 @@ issues.time_spent_from_all_authors=`Загальний витрачений ча issues.due_date=Дата завершення issues.invalid_due_date_format=Дата закінчення має бути в форматі 'ррр-мм-дд'. issues.error_modifying_due_date=Не вдалося змінити дату завершення. +issues.error_removing_due_date=Не вдалося видалити дату завершення. issues.due_date_form=рррр-мм-дд issues.due_date_form_add=Додати дату завершення issues.due_date_form_update=Оновити дату завершення issues.due_date_form_remove=Видалити дату завершення +issues.due_date_not_writer=Вам потрібен доступ до запису в репозиторії, щоб оновити дату завершення проблем. issues.due_date_not_set=Термін виконання не встановлений. issues.due_date_added=додав(ла) дату завершення %s %s +issues.due_date_modified=термін змінено з %s %s на %s +issues.due_date_remove=видалив(ла) дату завершення %s %s issues.due_date_overdue=Прострочено +pulls.desc=Увімкнути запити на злиття та інтерфейс узгодження правок. pulls.new=Новий запит на злиття pulls.compare_changes=Новий запит на злиття +pulls.compare_changes_desc=Порівняти дві гілки і створити запит на злиття для змін. pulls.compare_base=злити в pulls.compare_compare=pull з pulls.filter_branch=Фільтр по гілці pulls.no_results=Результатів не знайдено. pulls.nothing_to_compare=Ці гілки однакові. Немає необхідності створювати запитів на злиття. +pulls.has_pull_request=`Вже існує запит на злиття між двома цілями: %[2]s#%[3]d` pulls.create=Створити запит на злиття pulls.title_desc=хоче злити %[1]d комітів з %[2]s до %[3]s pulls.merged_title_desc=злито %[1]d комітів з %[2]s до %[3]s %[4]s @@ -750,6 +801,8 @@ pulls.tab_files=Змінені файли pulls.reopen_to_merge=Будь ласка перевідкрийте цей запит щоб здіснити операцію злиття. pulls.merged=Злито pulls.has_merged=Запит на злиття було об'єднано. +pulls.data_broken=Вміст цього запиту було порушено внаслідок видалення інформації ФОРКОМ. +pulls.is_checking=Триває перевірка конфліктів, будь ласка обновіть сторінку дещо пізніше. pulls.can_auto_merge_desc=Цей запит можна об'єднати автоматично. pulls.cannot_auto_merge_desc=Цей запит на злиття не може бути злитий автоматично через конфлікти. pulls.cannot_auto_merge_helper=Злийте вручну для вирішення конфліктів. @@ -758,6 +811,8 @@ pulls.no_merge_helper=Увімкніть параметри злиття в на pulls.merge_pull_request=Об'єднати запит на злиття pulls.rebase_merge_pull_request=Зробити Rebase і злити pulls.squash_merge_pull_request=Об'єднати (Squash) і злити +pulls.invalid_merge_option=Цей параметр злиття не можна використовувати для цього Pull Request'а. +pulls.open_unmerged_pull_exists=`Ви не можете знову відкрити, оскільки вже існує запит на злиття (%d) з того ж сховища з тією ж інформацією про злиття і в очікуванні.` milestones.new=Новий етап milestones.open_tab=%d відкрито @@ -766,17 +821,26 @@ milestones.closed=Закрито %s milestones.no_due_date=Немає дати завершення milestones.open=Відкрити milestones.close=Закрити +milestones.new_subheader=Створюйте етапи для організації ваших завдань. milestones.create=Створити етап milestones.title=Заголовок milestones.desc=Опис milestones.due_date=Дата завершення (опціонально) milestones.clear=Очистити +milestones.invalid_due_date_format=Дата завершення має бути в форматі 'рррр-мм-дд'. +milestones.create_success=Етап '%s' створений. milestones.edit=Редагувати етап +milestones.edit_subheader=Використовуйте кращий опис контрольної точки, щоб уникнути нерозуміння з боку інших людей. milestones.cancel=Відмінити milestones.modify=Оновити етап +milestones.edit_success=Етап '%s' був оновлений. milestones.deletion=Видалити етап +milestones.deletion_desc=Видалення етапу призведе до його видалення з усіх пов'язаних завдань. Продовжити? +milestones.deletion_success=Етап успішно видалено. milestones.filter_sort.closest_due_date=Найближче за датою milestones.filter_sort.furthest_due_date=Далі за датою +milestones.filter_sort.least_complete=Менш повне +milestones.filter_sort.most_complete=Більш повне milestones.filter_sort.most_issues=Найбільш проблем milestones.filter_sort.least_issues=Найменш проблем @@ -785,16 +849,21 @@ ext_wiki.desc=Посилання на зовнішню вікі. wiki=Вікі wiki.welcome=Ласкаво просимо до Вікі. +wiki.welcome_desc=Wiki дозволяє писати та ділитися документацією з співавторами. +wiki.desc=Пишіть та обмінюйтеся документацією із співавторами. wiki.create_first_page=Створити першу сторінку wiki.page=Сторінка wiki.filter_page=Фільтр сторінок wiki.new_page=Сторінка +wiki.default_commit_message=Напишіть примітку про оновлення цієї сторінки (необов'язково). wiki.save_page=Зберегти сторінку wiki.last_commit_info=%s редагував цю сторінку %s wiki.edit_page_button=Редагувати wiki.new_page_button=Нова сторінка wiki.delete_page_button=Видалити сторінку +wiki.delete_page_notice_1=Видалення сторінки вікі '%s' не може бути скасовано. Продовжити? wiki.page_already_exists=Вікі-сторінка з таким самим ім'ям вже існує. +wiki.reserved_page=Назва сторінки вікі '%s' зарезервована. wiki.pages=Сторінки wiki.last_updated=Останні оновлення %s @@ -832,6 +901,8 @@ activity.new_issues_count_1=Нова Проблема activity.new_issues_count_n=%d Проблем activity.new_issue_label=Відкриті activity.title.unresolved_conv_1=%d Незавершене обговорення +activity.title.unresolved_conv_n=%d Незавершених обговорень +activity.unresolved_conv_desc=Список всіх старих тікетів і Pull Request'ів з недавньої активністю, але ще не закритих або прийнятих. activity.unresolved_conv_label=Відкрити activity.title.releases_1=%d Реліз activity.title.releases_n=%d Релізів @@ -840,8 +911,10 @@ activity.published_release_label=Опубліковано search=Пошук search.search_repo=Пошук репозиторію +search.results=Результати пошуку для "%s" в %s settings=Налаштування +settings.desc=У налаштуваннях ви можете змінювати різні параметри цього сховища settings.options=Репозиторій settings.collaboration=Співавтори settings.collaboration.admin=Адміністратор @@ -853,6 +926,7 @@ settings.githooks=Git хуки settings.basic_settings=Базові налаштування settings.mirror_settings=Налаштування дзеркала settings.sync_mirror=Синхронізувати зараз +settings.mirror_sync_in_progress=Синхронізуються репозиторії-дзеркала. Зачекайте хвилину і обновіть сторінку. settings.site=Веб-сайт settings.update_settings=Оновити налаштування settings.advanced_settings=Додаткові налаштування @@ -860,15 +934,24 @@ settings.wiki_desc=Увімкнути репозиторії Вікі settings.use_internal_wiki=Використовувати вбудовані Вікі settings.use_external_wiki=Використовувати зовнішні Вікі settings.external_wiki_url=URL зовнішньої вікі +settings.external_wiki_url_error=Зовнішня URL-адреса wiki не є допустимою URL-адресою. +settings.external_wiki_url_desc=Відвідувачі будуть перенаправлені на URL-адресу, коли вони клацають по вкладці. settings.issues_desc=Увімкнути відстеження проблем в репозиторію settings.use_internal_issue_tracker=Використовувати вбудовану систему відстеження проблем +settings.use_external_issue_tracker=Використовувати зовнішню систему обліку завдань settings.external_tracker_url=URL зовнішньої системи відстеження проблем +settings.external_tracker_url_error=URL зовнішнього баг-трекера не є допустимою URL-адресою. +settings.external_tracker_url_desc=Відвідувачі перенаправляються на зовнішню URL-адресу, коли натискають вкладку 'Проблеми'. settings.tracker_url_format=Формат URL зовнішнього трекера задач +settings.tracker_issue_style=Формат номеру для зовнішньої системи обліку задач settings.tracker_issue_style.numeric=Цифровий settings.tracker_issue_style.alphanumeric=Буквено-цифровий +settings.tracker_url_format_desc=Використовуйте шаблони {user}, {repo} та {index} для імені користувача, репозиторію та номеру задічі. settings.enable_timetracker=Увімкнути відстеження часу +settings.allow_only_contributors_to_track_time=Враховувати тільки учасників розробки в підрахунку часу settings.pulls_desc=Увімкнути запити на злиття в репозиторій settings.pulls.ignore_whitespace=Ігнорувати пробіл у конфліктах +settings.pulls.allow_merge_commits=Дозволити коміти злиття settings.pulls.allow_rebase_merge=Увімкнути Rebasing коміти перед злиттям settings.pulls.allow_squash_commits=Увімкнути об'єднувати коміти перед злиттям settings.admin_settings=Налаштування адміністратора @@ -877,36 +960,60 @@ settings.danger_zone=Небезпечна зона settings.new_owner_has_same_repo=Новий власник вже має репозиторій з такою назвою. Будь ласка, виберіть інше ім'я. settings.convert=Перетворити на звичайний репозиторій settings.convert_desc=Ви можете сконвертувати це дзеркало у звичайний репозиторій. Це не може бути скасовано. +settings.convert_notices_1=Ця операція перетворить дзеркало у звичайний репозиторій і не може бути скасована. settings.convert_confirm=Перетворити репозиторій +settings.convert_succeed=Репозиторій успішно перетворений в звичайний. settings.transfer=Передати новому власнику +settings.transfer_desc=Передати репозиторій користувачеві або організації, де ви маєте права адміністратора. +settings.transfer_notices_1=- Ви втратите доступ до сховища, якщо ви переведете його окремому користувачеві. +settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є. settings.transfer_form_title=Введіть ім'я репозиторія як підтвердження: settings.wiki_delete=Видалити вікі-дані +settings.wiki_delete_desc=Будьте уважні! Як тільки ви видалите Вікі - шляху назад не буде. +settings.wiki_delete_notices_1=- Це назавжди знищить і відключить wiki для %s. settings.confirm_wiki_delete=Видалити Вікі-дані +settings.wiki_deletion_success=Дані wiki були видалені. settings.delete=Видалити цей репозиторій +settings.delete_desc=Будьте уважні! Як тільки ви видалите репозиторій - шляху назад не буде. settings.delete_notices_1=- Цю операцію НЕ МОЖНА відмінити. +settings.delete_notices_2=- Ця операція назавжди видалить все з репозиторію %s, включаючи дані Git, пов'язані з ним завдання, коментарі і права доступу для співробітників. +settings.delete_notices_fork_1=- Всі форки стануть незалежними репозиторіями після видалення. settings.deletion_success=Репозиторій успішно видалено. settings.update_settings_success=Налаштування репозиторію було оновлено. settings.transfer_owner=Новий власник settings.make_transfer=Здіснити перенесення +settings.transfer_succeed=Репозиторій був перенесений. settings.confirm_delete=Видалити репозиторій settings.add_collaborator=Додати співавтора settings.add_collaborator_success=Додано співавтора. settings.delete_collaborator=Видалити settings.collaborator_deletion=Видалити співавтора +settings.collaborator_deletion_desc=Цей користувач більше не матиме доступу для спільної роботи в цьому репозиторії після видалення. Ви хочете продовжити? +settings.remove_collaborator_success=Співавтор видалений. settings.search_user_placeholder=Пошук користувача… +settings.org_not_allowed_to_be_collaborator=Організації не можуть бути додані як співавтори. +settings.user_is_org_member=Користувач є членом організації, члени якої не можуть бути додані в якості співавтора. settings.add_webhook=Додати веб-хук +settings.hooks_desc=Webhooks автоматично робить HTTP POST-запити на сервер, коли відбуваються певні події Gitea. Дізнайтеся більше в керівництві веб-вузла . settings.webhook_deletion=Видалити веб-хук +settings.webhook_deletion_desc=Видалення цього веб-хука призведе до видалення всієї пов'язаної з ним інформації, включаючи історію. Бажаєте продовжити? +settings.webhook_deletion_success=Webhook видалено. settings.webhook.test_delivery=Перевірити доставку settings.webhook.test_delivery_desc=Перевірте цей веб-хук з підробленою подією. +settings.webhook.test_delivery_success=Тест веб-хука був доданий в чергу доставки. Це може зайняти кілька секунд, перш ніж він відобразиться в історії доставки. settings.webhook.request=Запит settings.webhook.response=Відповідь settings.webhook.headers=Заголовки settings.webhook.payload=Зміст settings.webhook.body=Тіло +settings.githooks_desc=Git-хукі надаються Git самим по собі, ви можете змінювати файли підтримуваних хуков зі списку нижче щоб виконувати зовнішні операції. +settings.githook_edit_desc=Якщо хук неактивний, буде представлено зразок вмісту. Порожнє значення у цьому полі призведе до вимкнення хуку. settings.githook_name=Ім'я хуку settings.githook_content=Зміст хука settings.update_githook=Оновити хук +settings.add_webhook_desc=Gitea буде відправляти POST запити на вказану URL адресу, з інформацією про події, що відбуваються. Подробиці на сторінці інструкції по використанню webhooks . settings.payload_url=Цільова URL-адреса +settings.content_type=Тип вмісту settings.secret=Секрет settings.slack_username=Ім'я кристувача settings.slack_icon_url=URL іконки @@ -928,6 +1035,7 @@ settings.event_issues_desc=Проблему відкрито, закрито, п settings.event_issue_comment=Коментар проблеми settings.event_issue_comment_desc=Коментар проблеми створено, видалено чи відредаговано. settings.event_release=Реліз +settings.event_release_desc=Випуск опубліковано, оновлено чи видалено в сховища. settings.event_pull_request=Запити до злиття settings.event_pull_request_desc=Запит до злиття відкрито, закрито, перевідкрито, змінено, призначено, знято, мітку оновлено, мітку прибрано або синхронізовано. settings.event_push=Push @@ -935,6 +1043,7 @@ settings.event_push_desc=Git push до репозиторію. settings.event_repository=Репозиторій settings.event_repository_desc=Репозиторій створений або видалено. settings.active=Додавати інформацію про події +settings.active_helper=Також буде відправлена ​​інформація про подію, що відбулася. settings.add_hook_success=Веб-хук було додано. settings.update_webhook=Оновити веб-хук settings.update_hook_success=Веб-хук було оновлено. @@ -949,27 +1058,50 @@ settings.add_discord_hook_desc=Інтеграція Discord у settings.add_dingtalk_hook_desc=Інтеграція Dingtalk у ваш репозиторії. settings.deploy_keys=Ключі для розгортування settings.add_deploy_key=Додати ключ для розгортування +settings.deploy_key_desc=Ключі розгортання доступні тільки для читання. Це не те ж саме що і SSH-ключі аккаунта. settings.is_writable=Увімкнути доступ для запису +settings.is_writable_info=Чи може цей ключ бути використаний для виконання push в репозиторій? Ключі розгортання завжди мають доступ на pull. +settings.no_deploy_keys=Ви не додавали ключі розгортання. settings.title=Заголовок settings.deploy_key_content=Зміст +settings.key_been_used=Вміст ключа розгортання вже використовується. +settings.key_name_used=Ключ розгортання з таким заголовком вже існує. +settings.add_key_success=Новий ключ розгортання '%s' успішно доданий. settings.deploy_key_deletion=Видалити ключ для розгортування +settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до сховища з його допомогою. Ви впевнені? settings.deploy_key_deletion_success=Ключі розгортання було видалено. settings.branches=Гілки settings.protected_branch=Захист гілки settings.protected_branch_can_push=Дозволити push? settings.protected_branch_can_push_yes=Ви можете виконувати push settings.protected_branch_can_push_no=Ви не можете виконувати push +settings.branch_protection=Захист гілки %s +settings.protect_this_branch=Захистити цю гілку +settings.protect_this_branch_desc=Вимкнути примусовий push і захистити від видалення. +settings.protect_whitelist_committers=Білий список тих, хто може робити push в цю гілку +settings.protect_whitelist_committers_desc=Додати користувачів або команди в білий список гілки. На них не будуть поширюватися звичайні обмеження на push. +settings.protect_whitelist_users=Користувачі, які можуть робити push в цю гілку: settings.protect_whitelist_search_users=Пошук користувачів… +settings.protect_whitelist_teams=Команди, члени яких можуть робити push в цю гілку: settings.protect_whitelist_search_teams=Пошук команд… +settings.protect_merge_whitelist_committers=Обмежити право на прийняття Pull Request'ів в цю гілку списком +settings.protect_merge_whitelist_committers_desc=Ви можете додавати користувачів або цілі команди в 'білий' список цієї гілки. Тільки присутні в списку зможуть приймати Pull Request'и. В іншому випадку будь-хто з правами запису до головного сховища буде володіти такою можливістю. +settings.protect_merge_whitelist_users=Користувачі з правом на прийняття Pull Request'ів в цю гілку: +settings.protect_merge_whitelist_teams=Команди, члени яких мають право на прийняття Pull Request'ів в цю гілку: settings.add_protected_branch=Увімкнути захист settings.delete_protected_branch=Вимкнути захист +settings.update_protect_branch_success=Налаштування захисту гілки '%s' були успішно змінені. +settings.remove_protected_branch_success=Захист гілки '%s' був успішно відключений. settings.protected_branch_deletion=Відключити захист гілки +settings.protected_branch_deletion_desc=Будь-який користувач з дозволами на запис зможе виконувати push в цю гілку. Ви впевнені? +settings.default_branch_desc=Головна гілка є 'базовою' для вашого сховища, на яку за замовчуванням спрямовані всі Pull Request'и і яка є обличчям вашого сховища. Перше, що побачить відвідувач - це вміст головною гілки. Виберіть її з уже існуючих: settings.choose_branch=Оберіть гілку… settings.no_protected_branch=Немає захищених гілок. diff.browse_source=Переглянути джерело diff.parent=джерело diff.commit=коміт +diff.data_not_available=Різниця недоступна diff.show_diff_stats=Показати статистику Diff diff.show_split_view=Розділений перегляд diff.show_unified_view=Об'єднаний перегляд @@ -979,6 +1111,7 @@ diff.view_file=Переглянути файл diff.file_suppressed=Різницю між файлами не показано, бо вона завелика diff.too_many_files=Деякі файли не було показано, через те що забагато файлів було змінено +releases.desc=Відслідковувати версії проекту (релізи) та завантаження. release.releases=Релізи release.new_release=Новий реліз release.draft=Чернетка @@ -987,6 +1120,8 @@ release.stable=Стабільний release.edit=редагувати release.ahead=%d комітів %s після цього релізу release.source_code=Код +release.new_subheader=Публікація релізів допоможе зберігати чітку історію розвитку вашого проекту. +release.edit_subheader=Публікація релізів допоможе зберігати чітку історію розвитку вашого проекту. release.tag_name=Назва тегу release.target=Ціль release.tag_helper=Виберіть існуючий тег або створіть новий. @@ -1003,25 +1138,37 @@ release.save_draft=Зберегти чернетку release.edit_release=Оновити реліз release.delete_release=Видалити реліз release.deletion=Видалити реліз +release.deletion_desc=Видалення релізу видаляє Git-тег зі сховищ. Вміст сховища і історія залишаться незмінними. Продовжити? release.deletion_success=Реліз, було видалено. +release.tag_name_already_exist=Реліз з цим ім'ям мітки вже існує. release.tag_name_invalid=Неприпустиме ім'я тега. release.downloads=Завантажити branch.name=Ім'я гілки branch.search=Пошук гілок +branch.already_exists=Гілка з ім'ям '%s' вже існує. branch.delete_head=Видалити branch.delete=Видалити гілку '%s' branch.delete_html=Видалити гілку +branch.delete_desc=Видалення гілки НЕЗВОРОТНЕ. Дію не можна скасувати. Продовжити? branch.deletion_success=Гілка '%s' видалена. branch.deletion_failed=Не вдалося видалити гілку "%s". +branch.delete_branch_has_new_commits=Гілку '%s' не можна видалити, оскільки після злиття були додані нові коміти. +branch.create_branch=Створити гілку %s branch.create_from=з '%s' branch.create_success=Створено гілку "%s". branch.branch_already_exists=Гілка '%s' вже присутня в репозиторії. +branch.branch_name_conflict=Ім'я гілки '%s' конфліктує з уже існуючою гілкою '%s'. +branch.tag_collision=Гілка '%s' не може бути створена, так як вже існує тег з таким ім'ям. branch.deleted_by=Видалено %s branch.restore_success=Гілку "%s" відновлено. +branch.restore_failed=Не вдалося відновити гілку '%s'. +branch.protected_deletion_failed=Гілка '%s' захищена. Її не можна видалити. topic.manage_topics=Керувати тематичними мітками topic.done=Готово +topic.count_prompt=Ви не можете вибрати більше 25 тем +topic.format_prompt=Теми мають починатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів [org] org_name_holder=Назва організації @@ -1044,6 +1191,8 @@ team_permission_desc=Права доступу team_unit_desc=Дозволити доступ до розділів репозиторію form.name_reserved=Назву організації '%s' зарезервовано. +form.name_pattern_not_allowed=Шаблон '%s' не дозволено в назві організації. +form.create_org_not_allowed=Вам не дозволено створювати організації. settings=Налаштування settings.options=Організація @@ -1056,8 +1205,11 @@ settings.change_orgname_prompt=Ця зміна змінить посилання settings.update_avatar_success=Аватар організації оновлений. settings.delete=Видалити організацію settings.delete_account=Видалити цю організацію +settings.delete_prompt=Організація буде остаточно видалена. Це НЕ МОЖЛИВО відмінити! settings.confirm_delete_account=Підтвердіть видалення settings.delete_org_title=Видалити організацію +settings.delete_org_desc=Ця організація буде безповоротно видалена. Продовжити? +settings.hooks_desc=Додайте webhooks, який буде викликатися для всіх репозиторіїв якими володіє ця організація. members.membership_visibility=Видимість учасника: members.public=Показувати @@ -1075,8 +1227,11 @@ members.invite_now=Запросити зараз teams.join=Приєднатися teams.leave=Покинути teams.read_access=Доступ для читання +teams.read_access_helper=Учасники можуть переглядати та клонувати репозиторії команд. teams.write_access=Доступ на запис +teams.write_access_helper=Учасники можуть читати і виконувати push в репозиторії команд. teams.admin_access=Доступ адміністратора +teams.admin_access_helper=Учасники можуть виконувати pull, push в репозиторії команд і додавати співавторів в команду. teams.no_desc=Ця команда не має опису teams.settings=Налаштування teams.owners_permission_desc=Власник має повний доступ до усіх репозиторіїв та має права адміністратора організації. @@ -1085,6 +1240,7 @@ teams.update_settings=Оновити налаштування teams.delete_team=Видалити команду teams.add_team_member=Додати учасника команди teams.delete_team_title=Видалити команду +teams.delete_team_desc=Видалення команди скасовує доступ до сховища для її членів. Продовжити? teams.delete_team_success=Команду було видалено. teams.read_permission_desc=Ця команда має доступ для читання: учасники можуть переглядати та клонувати репозиторії. teams.write_permission_desc=Ця команда надає доступ на запис: учасники можуть отримувати й виконувати push команди до репозитрію. @@ -1111,13 +1267,30 @@ total=Разом: %d dashboard.statistic=Підсумок dashboard.operations=Технічне обслуговування dashboard.system_status=Статус системи +dashboard.statistic_info=У базі даних Gitea записано %d користувачів, %d організацій, %d публічних ключів, %d репозиторіїв, %d підписок на репозиторії, %d додавань в обране, %d дій, %d доступів, %d задач, %d коментарів, %d соціальних облікових записів, %d підписок на користувачів, %d зеркал, %d релізів, %d джерел входу, %d веб-хуків, %d етапів, %d міток, %d задач хуків, %d команд, %d задач по оновленню, %d приєднаних файлів. dashboard.operation_name=Назва операції dashboard.operation_switch=Перемкнути dashboard.operation_run=Запустити +dashboard.clean_unbind_oauth=Очистити список незавершених авторизацій OAuth +dashboard.clean_unbind_oauth_success=Всі незавершені зв'язки OAuth були видалені. dashboard.delete_inactivate_accounts=Видалити всі неактивні облікові записи dashboard.delete_inactivate_accounts_success=Усі неактивні облікові записи успішно видалено. dashboard.delete_repo_archives=Видалити всі архіви репозиторіїв +dashboard.delete_repo_archives_success=Всі архіви репозиторіїв були видалені. +dashboard.delete_missing_repos=Видалити всі записи про репозиторії з відсутніми файлами Git +dashboard.delete_missing_repos_success=Всі записи про репозиторії з відсутніми файлами Git видалені. +dashboard.git_gc_repos=Виконати очистку сміття для всіх репозиторіїв dashboard.git_gc_repos_success=Всі репозиторії завершили збирання сміття. +dashboard.resync_all_sshkeys=Перезаписати файл '.ssh/authorized_keys' для SSH ключів Gitea. (Не потрібно для вбудованого SSH сервера.) +dashboard.resync_all_sshkeys_success=Всі відкриті ключі були перезаписані. +dashboard.resync_all_hooks=Пересинхронізувати перед-прийнятні, оновлюючі та пост-прийнятні хуки в усіх репозиторіях. +dashboard.resync_all_hooks_success=Були пересинхронізовані всі pre-receive, update і post-receive Git хуки. +dashboard.reinit_missing_repos=Переініціалізувати усі репозитрії git-файли яких втрачено +dashboard.reinit_missing_repos_success=Усі репозитрії git-файли яких втрачено, успішно переініціалізовано. +dashboard.sync_external_users=Синхронізувати дані зовнішніх користувачів +dashboard.sync_external_users_started=Запущена синхронізація зовнішніх користувачів. +dashboard.git_fsck=Запустити перевірку даних всіх репозиторіїв (git fsck) +dashboard.git_fsck_started=Перевірка даних репозиторіїв запущена. dashboard.server_uptime=Uptime серверу dashboard.current_goroutine=Поточна кількість Goroutines dashboard.current_memory_usage=Поточне використання пам'яті @@ -1125,6 +1298,7 @@ dashboard.total_memory_allocated=Виділено пам'яті загалом dashboard.memory_obtained=Отримано пам'яті dashboard.pointer_lookup_times=Пошуків вказівника dashboard.memory_allocate_times=Виділення пам'яті +dashboard.memory_free_times=Звільнень пам'яті dashboard.current_heap_usage=Поточне використання динамічної пам'яті dashboard.heap_memory_obtained=Отримано динамічної пам'яті dashboard.heap_memory_idle=Не використовується динамічною пам'яттю @@ -1161,6 +1335,8 @@ users.new_success=Обліковий запис '%s' створений. users.edit=Редагувати users.auth_source=Джерело автентифікації users.local=Локальні +users.auth_login_name=Логін для авторизації +users.password_helper=Залиште пароль порожнім, щоб не змінювати його. users.update_profile_success=Обліковий запис користувача було оновлено. users.edit_account=Редагувати обліковий запис users.max_repo_creation=Максимальна кількість репозиторіїв @@ -1173,6 +1349,8 @@ users.allow_import_local=Може імпортувати локальні реп users.allow_create_organization=Може створювати організацій users.update_profile=Оновити обліковий запис users.delete_account=Видалити цей обліковий запис +users.still_own_repo=Ваш обліковий запис все ще володіє одним або кількома репозиторіями, спочатку вам потрібно видалити або передати їх. +users.still_has_org=Цей обліковий запис все ще є членом однієї або декількох організацій. Для продовження, покиньте або видаліть організації. users.deletion_success=Обліковий запис користувача було видалено. orgs.org_manage_panel=Керування організаціями @@ -1206,22 +1384,34 @@ auths.host=Хост auths.port=Порт auths.bind_dn=Прив'язати DN auths.bind_password=Прив'язати пароль +auths.bind_password_helper=Попередження: цей пароль зберігається у вигляді простого тексту. Використовуйте обліковий запис тільки для читання, якщо це можливо. auths.user_base=База пошуку користувачів auths.user_dn=DN користувача auths.attribute_username=Атрибут імені користувача +auths.attribute_username_placeholder=Залиште порожнім, щоб використовувати ім'я користувача для реєстрації. +auths.attribute_name=Атрибут імені +auths.attribute_surname=Атрибут Surname +auths.attribute_mail=Атрибут Email +auths.attribute_ssh_public_key=Атрибут Відкритий SSH ключ +auths.attributes_in_bind=Витягувати атрибути в контексті Bind DN +auths.use_paged_search=Використовувати посторінковий пошук auths.search_page_size=Розмір сторінки auths.filter=Користувацький фільтр auths.admin_filter=Фільтр адміністратора +auths.ms_ad_sa=Атрибути пошуку MS AD auths.smtp_auth=Тип автентифікації SMTP auths.smtphost=SMTP хост auths.smtpport=SMTP порт auths.allowed_domains=Дозволені домени +auths.allowed_domains_helper=Залиште порожнім, щоб дозволити всі домени. Розділіть кілька доменів за допомогою коми (','). auths.enable_tls=Увімкнути TLS-шифрування auths.skip_tls_verify=Пропустити перевірку TLS auths.pam_service_name=Ім'я служби PAM auths.oauth2_provider=Постачальник OAuth2 auths.oauth2_clientID=ID клієнта (ключ) auths.oauth2_clientSecret=Ключ клієнта +auths.openIdConnectAutoDiscoveryURL=OpenID Connect URL для автоматизації входу +auths.oauth2_use_custom_url=Використовувати для користувача URL замість URL за замовчуванням auths.oauth2_tokenURL=URL токену auths.oauth2_authURL=URL авторизації auths.oauth2_profileURL=URL профілю @@ -1231,15 +1421,25 @@ 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.dropbox=Додайте новий додаток на https://www.dropbox.com/developers/apps 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/ auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (/.well-known/openid-configuration) для автоматичної настройки входу OAuth +auths.tip.twitter=Перейдіть на https://dev.twitter.com/apps, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter» auths.edit=Редагувати джерело автентифікації +auths.activated=Ця аутентифікація активована +auths.new_success=Метод аутентифікації '%s' був доданий. +auths.update_success=Параметри аутентифікації оновлені. auths.update=Оновити джерело автентифікації auths.delete=Видалити джерело автентифікації auths.delete_auth_title=Видалити джерело автентифікації +auths.delete_auth_desc=Це джерело аутентифікації буде видалене, ви впевнені, що ви хочете продовжити? +auths.still_in_used=Ця перевірка справжності досі використовується деякими користувачами. Видаліть або змініть для цих користувачів тип входу в систему. +auths.deletion_success=Канал аутентифікації успішно знищений. +auths.login_source_exist=Джерело входу '%s' вже існує. config.server_config=Конфігурація сервера config.app_name=Назва сайту @@ -1257,6 +1457,7 @@ config.lfs_root_path=Кореневої шлях LFS config.static_file_root_path=Повний шлях до статичного файлу config.log_file_root_path=Шлях до лог файлу config.script_type=Тип скрипта +config.reverse_auth_user=Ім'я користувача для авторизації на reverse proxy config.ssh_config=Конфігурація SSH config.ssh_enabled=Увімкнено @@ -1281,6 +1482,7 @@ config.db_path=Шлях config.service_config=Конфігурація сервісу config.register_email_confirm=Потрібно підтвердити електронну пошту для реєстрації config.disable_register=Вимкнути самостійну реєстрацію +config.allow_only_external_registration=Включити реєстрацію тільки через сторонні сервіси config.enable_openid_signup=Увімкнути самостійну реєстрацію за допомогою OpenID config.enable_openid_signin=Увімкнути реєстрацію за допомогою OpenID config.show_registration_button=Показувати кнопку "Реєстрація @@ -1289,10 +1491,12 @@ config.mail_notify=Увімкнути сповіщення електронно config.disable_key_size_check=Вимкнути перевірку мінімального розміру ключа config.enable_captcha=Увімкнути CAPTCHA config.active_code_lives=Час актуальності кода підтвердження +config.reset_password_code_lives=Час життя коду на скидання пароля config.default_keep_email_private=Приховати адресу електронної пошти за замовчуванням config.default_allow_create_organization=Дозволити створення організацій за замовчуванням config.enable_timetracking=Увімкнути відстеження часу config.default_enable_timetracking=Увімкнути відстеження часу за замовчуванням +config.default_allow_only_contributors_to_track_time=Враховувати тільки учасників розробки в підрахунку часу config.no_reply_address=Прихований домен електронної пошти config.webhook_config=Конфігурація web-хуків @@ -1300,6 +1504,7 @@ config.queue_length=Довжина черги config.deliver_timeout=Затримка доставки config.skip_tls_verify=Пропустити перевірку TLS +config.mailer_config=Конфігурація SMTP-сервера config.mailer_enabled=Увімкнено config.mailer_disable_helo=Вимкнути HELO config.mailer_name=Ім'я @@ -1307,7 +1512,9 @@ config.mailer_host=Хост config.mailer_user=Користувач config.mailer_use_sendmail=Використовувати Sendmail config.mailer_sendmail_path=Шлях до Sendmail +config.mailer_sendmail_args=Додаткові аргументи до Sendmail config.send_test_mail=Відправити тестового листа +config.test_mail_failed=Не вдалося відправити тестовий лист на «%s»: %v config.test_mail_sent=Тестового листа було відправлено до '%s'. config.oauth_config=Конфігурація OAuth @@ -1431,8 +1638,14 @@ mark_as_unread=Позначити як непрочитане mark_all_as_read=Позначити всі як прочитані [gpg] +error.extract_sign=Не вдалося витягти підпис error.generate_hash=Не вдалося згенерувати хеш коміту +error.no_committer_account=Аккаунт користувача з таким Email не знайдено +error.no_gpg_keys_found=Не вдалося знайти GPG ключ що відповідає даному підпису error.not_signed_commit=Непідписаний коміт +error.failed_retrieval_gpg_keys=Не вдалося отримати відповідний GPG ключ користувача [units] +error.no_unit_allowed_repo=У вас немає доступу до жодного розділу цього репозитория. +error.unit_not_allowed=У вас немає доступу до жодного розділу цього репозитория. diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 4e59ed08e..1484e6a8f 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=分支 '%s' 已被保护,不可删除。 topic.manage_topics=管理主题 topic.done=保存 +topic.count_prompt=您最多选择25个主题 +topic.format_prompt=主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符 [org] org_name_holder=组织名称 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 8a6914af2..dece41485 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1,11 +1,15 @@ +app_desc=一個無痛、自託管的 Git 服務 home=首頁 dashboard=控制面版 explore=探索 help=說明 sign_in=登入 +sign_in_with=登入方式 sign_out=登出 +sign_up=註冊 link_account=連結帳戶 +link_account_signin_or_signup=使用現有的帳戶登入以連結到此帳號,或註冊新帳戶 register=註冊 website=網站 version=版本 @@ -13,12 +17,32 @@ page=頁面 template=樣板 language=語言 notifications=訊息 +create_new=建立... +user_profile_and_more=設定檔和設置... signed_in_as=已登入用戶 +enable_javascript=本網站在啟用 JavaScript 的情況下可以運作的更好。 username=用戶名稱 +email=電子郵件地址 password=密碼 +re_type=再次輸入密碼 +captcha=驗證碼 +twofa=兩步驟驗證 +twofa_scratch=兩步驟驗證備用碼 passcode=驗證碼 +u2f_insert_key=插入安全金鑰 +u2f_sign_in=按下安全金鑰上的按鈕。如果找不到按鈕, 請重新插入。 +u2f_press_button=請按下安全金鑰上的按鈕… +u2f_use_twofa=使用來自手機的兩步驟驗證碼 +u2f_error=找不到您的安全金鑰! +u2f_unsupported_browser=您的瀏覽器不支援 U2F 二步驟驗證技術。請嘗試其他瀏覽器。 +u2f_error_1=發生未知的錯誤,請重試。 +u2f_error_2=請確保您使用的是加密連接 (https://) 並且 URL 是正確的。 +u2f_error_3=伺服器無法執行您的請求。 +u2f_error_4=所提交的金鑰不符合此請求。如果您嘗試註冊它, 請確保該金鑰尚未註冊。 +u2f_error_5=在讀取金鑰之前已逾時,請重新載入以重試。 +u2f_reload=重新載入 repository=儲存庫 organization=組織 @@ -29,8 +53,12 @@ new_mirror=新鏡像 new_fork=Fork 新的儲存庫 new_org=新增組織 manage_org=管理組織 +admin_panel=網站管理 account_settings=帳號設定 settings=設定 +your_profile=個人訊息 +your_starred=標記星號 +your_settings=設定 all=所有 sources=來源 @@ -46,34 +74,105 @@ cancel=取消 [install] install=安裝頁面 +title=初始設定 +docker_helper=如果您正在使用 Docker 容器運行 Gitea,請務必先仔細閱讀官方文件後再對本頁面進行填寫。 +requite_db_desc=Gitea 需要安裝 MySQL、PostgreSQL、SQLite3、MSSQL 或 TiDB 其中一項。 db_title=資料庫設定 db_type=資料庫類型 host=主機 +user=使用者名稱 password=密碼 db_name=資料庫名稱 +db_helper=MySQL 使用者注意: 請使用 InnoDB 儲存引擎和 "utf8_general_ci" 字元集。 +ssl_mode=SSL path=資料庫文件路徑 +sqlite_helper=SQLite3 或 TiDB 資料庫的檔路徑。如果將 Gitea 作為服務運行,
請輸入絕對路徑。 +err_empty_db_path=SQLite3 或 TiDB 的資料庫路徑不能為空。 +err_invalid_tidb_name=TiDB 資料庫名稱不能包含 "." 和 "-" 字元。 +no_admin_and_disable_registration=您不能夠在未建立管理員使用者的情況下禁止註冊。 +err_empty_admin_password=管理員密碼不能為空。 +general_title=一般設定 +app_name=網站標題 +app_name_helper=您可以在此輸入您的公司名稱。 repo_path=儲存庫的根目錄 +repo_path_helper=所有遠端 Git 儲存庫會儲存到此目錄。 +lfs_path=Git LFS 根目錄 +lfs_path_helper=以 Git LFS 儲存檔案時會被儲存在此目錄中。請留空以停用 LFS 功能。 +run_user=以使用者名稱執行 +run_user_helper=輸入 Gitea 運行的作業系統使用者名稱。請注意, 此使用者必須具有對存儲庫根目錄的存取權限。 +domain=SSH 伺服器域名 +domain_helper=用於 SSH 複製的域名或主機位置。 +ssh_port=SSH 伺服器埠 +ssh_port_helper=SSH 伺服器使用的埠號,留空以停用此設定。 +http_port=Gitea HTTP 埠 +http_port_helper=Giteas web 伺服器將偵聽的埠號。 +app_url=Gitea 基本 URL。 +app_url_helper=用於 HTTP(S) 複製和電子郵件通知的基本地址。 log_root_path=日誌路徑 +log_root_path_helper=日誌檔將寫入此目錄。 optional_title=可選設定 +email_title=電子郵件設定 smtp_host=SMTP 主機 +smtp_from=電子郵件寄件者 +smtp_from_helper=Gitea 將會使用的電子郵件地址,輸入一個普通的電子郵件地址或使用 "名稱" 格式。 +mailer_user=SMTP 帳號 +mailer_password=SMTP 密碼 +register_confirm=要求註冊時確認電子郵件 +mail_notify=啟用郵件通知 +server_service_title=伺服器和其他服務設定 +offline_mode=啟用本地模式 +offline_mode_popup=停用其他服務並在本地提供所有資源。 +disable_gravatar=禁用 Gravatar 大頭貼 +disable_gravatar_popup=禁用 Gravatar 和其他大頭貼服務。除非使用者在本地上傳大頭貼, 否則將使用預設的大頭貼。 +federated_avatar_lookup=開啟聯合大頭貼 federated_avatar_lookup_popup=開啟聯合頭像查詢並使用基於開放源碼的 libravatar 服務 +disable_registration=關閉註冊功能 +disable_registration_popup=關閉註冊功能,只有管理員可以新增帳號。 +allow_only_external_registration_popup=僅允許通過外部服務註冊。 openid_signin=啟用 OpenID 登入 +openid_signin_popup=啟用 OpenID 登入 +openid_signup=啟用 OpenID 註冊 +openid_signup_popup=啟用基於 OpenID 的註冊 +enable_captcha=啟用驗證碼 enable_captcha_popup=要求在用戶註冊時輸入驗證碼 +require_sign_in_view=需要登錄才能查看頁面 +require_sign_in_view_popup=限制對使用者的頁面存取權限,未登入的使用者只會看到“登錄”和註冊頁面。 +admin_setting_desc=建立管理員帳號是選用的。 第一個註冊的使用者將自動成為管理員。 +admin_title=管理員帳號設定 +admin_name=管理員使用者名稱 admin_password=管理員密碼 confirm_password=確認密碼 +admin_email=電子郵件地址 install_btn_confirm=立即安裝 test_git_failed=無法識別 'git' 命令:%v +sqlite3_not_available=您目前的版本不支援 SQLite3,請從 %s 下載官方的預先編譯版本(不是 gobuild 版本)。 +invalid_db_setting=資料庫設定不正確: %v +invalid_repo_path=儲存庫根目錄設定不正確:%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=預設隱藏新使用者的電子郵件地址。 +default_allow_create_organization=預設允許建立組織 +default_allow_create_organization_popup=預設允許新使用者建立組織 +default_enable_timetracking=預設啟用時間追蹤 +default_enable_timetracking_popup=預設情況下啟用新存儲庫的時間跟蹤。 +no_reply_address=隱藏電子郵件域名 [home] +uname_holder=使用者名稱或電子郵件地址 password_holder=密碼 switch_dashboard_context=切換控制面版用戶 +my_repos=儲存庫 +show_more_repos=顯示更多儲存庫... collaborative_repos=參與協作的儲存庫 my_orgs=我的組織 my_mirrors=我的鏡像 view_home=訪問 %s +search_repos=搜尋儲存庫... issues.in_your_repos=屬於該用戶儲存庫的 @@ -82,30 +181,50 @@ repos=儲存庫 users=用戶 organizations=組織 search=搜尋 +code=程式碼 +repo_no_results=沒有找到符合的儲存庫。 +user_no_results=沒有找到符合的使用者。 +org_no_results=沒有找到符合的組織。 +code_search_results=搜尋結果:'%s' [auth] +create_new_account=註冊帳號 register_helper_msg=已經註冊?立即登錄! +social_register_helper_msg=已有帳號?立即連結! +disable_register_prompt=註冊功能已停用。 請聯繫您的網站管理員。 remember_me=記住登錄 forgot_password_title=忘記密碼 forgot_password=忘記密碼? +sign_up_now=還沒有帳戶?馬上註冊。 confirmation_mail_sent_prompt=一封新的確認郵件已發送至 %s。請檢查您的收件箱並在 %s 小時內完成確認註冊操作。 reset_password_mail_sent_prompt=一封新的確認郵件已發送至 %s。請檢查您的收件箱並在 %s 小時內完成重設密碼操作。 active_your_account=啟用您的帳戶 +prohibit_login=禁止登錄 +prohibit_login_desc=您的帳號被禁止登入,請聯繫網站管理員 +resent_limit_prompt=抱歉,您請求發送驗證電子郵件太過頻繁,請等待 3 分鐘後再試一次。 has_unconfirmed_mail=%s 您好,您有一封發送至( %s) 但未被確認的郵件。如果您未收到啟用郵件,或需要重新發送,請單擊下方的按鈕。 resend_mail=單擊此處重新發送確認郵件 email_not_associate=此電子郵件地址未與任何帳戶連結 send_reset_mail=點選此處重發您的密碼重製郵件 reset_password=重置密碼 +invalid_code=您的確認代碼無效或已過期。 reset_password_helper=單擊此處重置密碼 +non_local_account=非本機帳號無法透過 Gitea 的網頁介面更改密碼 verify=驗證 scratch_code=備用碼 use_scratch_code=使用備用碼 twofa_scratch_used=你已經使用了你的備用碼。你將會被轉到兩步驟驗證設定頁面以便移除你已註冊設備或重新產生新的備用碼。 +twofa_passcode_incorrect=你的驗證碼不正確。如果您遺失設備,請使用您的備用碼登入。 twofa_scratch_token_incorrect=您的備用碼不正確 +login_userpass=登入 login_openid=OpenID openid_connect_submit=連接 openid_connect_title=連接到現有帳戶 +openid_connect_desc=所選的 OpenID URI 未知。在這裡連結一個新帳戶。 openid_register_title=建立新帳戶 +openid_register_desc=所選的 OpenID URI 未知。在這裡連結一個新帳戶。 +openid_signin_desc=輸入您的 OpenID URI。例如: https://anne.me、bob.openid.org.cn 或 gnusocial.net/carry。 +disable_forgot_password_mail=註冊功能已停用。 請聯繫您的網站管理員。 [mail] activate_account=請啟用您的帳戶 @@ -117,12 +236,14 @@ register_notify=歡迎來到 Gitea [modal] yes=確認操作 no=取消操作 +modify=更新 [form] UserName=用戶名 RepoName=儲存庫名稱 Email=郵箱地址 Password=密碼 +Retype=再次輸入密碼 SSHTitle=SSH 金鑰名稱 HttpsUrl=HTTPS URL 地址 PayloadUrl=推送地址 @@ -138,6 +259,8 @@ TreeName=檔案路徑 Content=內容 require_error=不能為空。 +alpha_dash_error=`應該只包含英文字母、數字、破折號 ("-")、和底線 ("_") 字元。` +alpha_dash_dot_error=`應該只包含英文字母、數字、破折號 ("-")、下底線("_")和小數點 (".") 字元。` size_error=長度必須為 %s。 min_size_error=長度最小為 %s 個字符。 max_size_error=長度最大為 %s 個字符。 @@ -145,19 +268,40 @@ email_error=不是一個有效的郵箱地址。 url_error=不是一個有效的 URL。 include_error=必須包含子字符串 '%s'。 unknown_error=未知錯誤: +captcha_incorrect=驗證碼不正確。 +password_not_match=密碼錯誤。 +username_been_taken=使用者名稱已被使用 +repo_name_been_taken=儲存庫名稱已被使用。 +org_name_been_taken=組織名稱已被使用。 +team_name_been_taken=團隊名稱已被使用。 +email_been_used=此電子信箱已被使用 +openid_been_used=OpenID 位址 '%s' 已被使用。 +username_password_incorrect=使用者名稱或密碼不正確 +enterred_invalid_repo_name=輸入的儲存庫名稱不正確。 +enterred_invalid_owner_name=新的擁有者名稱無效。 +enterred_invalid_password=輸入的密碼不正確。 user_not_exist=該用戶名不存在 +cannot_add_org_to_team=組織不能被新增為團隊成員。 +invalid_ssh_key=無法驗證您的 SSH 密鑰:%s +invalid_gpg_key=無法驗證您的 GPG 密鑰:%s +unable_verify_ssh_key=無法驗證 SSH 密鑰; 請再次檢查是否有錯誤。 auth_failed=授權認證失敗:%v +still_own_repo=此帳戶仍然擁有一個或多個儲存庫,您必須先刪除或轉移它們。 +still_has_org=此帳戶仍是一個或多個組織的成員,您必須先離開它們。 +org_still_own_repo=該組織仍然是某些儲存庫的擁有者,您必須先轉移或刪除它們才能執行刪除組織! target_branch_not_exist=目標分支不存在 [user] +change_avatar=更改大頭貼... join_on=加入於 repositories=儲存庫列表 activity=公開活動 followers=關註者 +starred=已收藏 following=關註中 follow=關注 unfollow=取消關注 @@ -166,15 +310,21 @@ form.name_reserved=用戶名 '%s' 是被保留的。 [settings] profile=個人訊息 +account=帳號 password=修改密碼 security=安全性 avatar=頭像 ssh_gpg_keys=SSH / GPG 金鑰 social=社交帳號綁定 +applications=應用程式 +orgs=管理組織 repos=儲存庫 delete=刪除帳戶 twofa=兩步驟驗證 +account_link=已連結帳號 +organization=組織 uid=用戶 ID +u2f=安全密鑰 public_profile=公開訊息 full_name=自定義名稱 @@ -182,21 +332,51 @@ website=個人網站 location=所在地區 update_profile=更新訊息 update_profile_success=您的個人資料已被更新 +change_username=您的使用者名稱已更改。 +change_username_prompt=注意:使用者名更改也會更改您的帳戶的 URL。 continue=繼續操作 cancel=取消操作 +language=語言 +lookup_avatar_by_mail=以電子郵件查找大頭貼 federated_avatar_lookup=Federated Avatar 查詢 enable_custom_avatar=啟動自定義頭像 choose_new_avatar=選擇新的頭像 +update_avatar=更新大頭貼 delete_current_avatar=刪除當前頭像 +uploaded_avatar_not_a_image=上傳的文件不是圖片 +update_avatar_success=您的大頭貼已更新 +change_password=更新密碼 old_password=當前密碼 new_password=新的密碼 +retype_new_password=重新輸入新的密碼 +password_incorrect=輸入的密碼不正確! +change_password_success=您的密碼已更新。 從現在起使用您的新密碼登錄。 +password_change_disabled=非本機帳號無法透過 Gitea 的網頁介面更改密碼 emails=電子郵件地址 +manage_emails=管理電子郵件地址 +manage_openid=管理 OpenID 位址 email_desc=您的主要邮箱地址将被用于通知提醒和其它操作。 primary=主要 +primary_email=設為主要 +delete_email=移除 +email_deletion=移除電子郵件地址 +email_deletion_desc=電子郵件地址和相關資訊將從您的帳戶中刪除,此電子郵件地址所提交的 Git 將保持不變,繼續執行? +email_deletion_success=該電子郵件地址已被刪除 +openid_deletion=移除 OpenID 位址 +openid_deletion_desc=從您的帳戶刪除此 OpenID 位址將會無法使用它進行登入。你確定要繼續嗎? +openid_deletion_success=該 OpenID 已被刪除 +add_new_email=新增電子郵件地址 +add_new_openid=新增 OpenID URI +add_email=新增電子郵件地址 add_openid=新增 OpenID URI +add_email_confirmation_sent=一封新的確認郵件已發送至 '%s',請檢查您的收件匣並在 %s 內確認您的電郵地址。 +add_email_success=該電子郵件地址已添加。 +add_openid_success=該 OpenID 已添加。 +keep_email_private=隱藏電子郵件地址 +keep_email_private_popup=您的電子郵件地址將對其他使用者隱藏。 manage_ssh_keys=管理 SSH 金鑰 manage_gpg_keys=管理 GPG 金鑰 @@ -209,6 +389,13 @@ subkeys=次金鑰 key_id=金鑰 ID key_name=金鑰名稱 key_content=金鑰內容 +add_key_success=SSH 金鑰 "%s" 已被添加。 +add_gpg_key_success=GPG 金鑰 "%s" 已被添加。 +delete_key=移除 +ssh_key_deletion=移除 SSH 金鑰 +gpg_key_deletion=移除 GPG 金鑰 +ssh_key_deletion_success=SSH 金鑰已被移除。 +gpg_key_deletion_success=GPG 金鑰已被移除。 add_on=增加於 valid_until=有效期至 valid_forever=永遠有效 @@ -220,63 +407,112 @@ key_state_desc=該金鑰在 7 天內被使用過 token_state_desc=此 token 在過去七天內曾經被使用過 show_openid=在設定檔顯示 hide_openid=從設定檔隱藏 +ssh_disabled=已停用 SSH manage_social=管理關聯社交帳戶 +unbind=解除連結 +manage_access_token=管理訪問權杖 generate_new_token=生成新的令牌 token_name=令牌名稱 generate_token=生成令牌 delete_token=删除令牌 +access_token_deletion=刪除訪問權杖 twofa_is_enrolled=您的帳號已經啟用兩步驟驗證。 twofa_not_enrolled=您的帳號目前尚未啟用兩步驟驗證。 +twofa_disable=停用兩步驟驗證 +twofa_scratch_token_regenerate=重新產生備用碼 +twofa_enroll=啟用兩步驟驗證 +twofa_disable_note=如有需要,您可以停用兩步驟驗證。 +twofa_disable_desc=關閉兩步驟驗證會使您的帳號安全性降低,繼續執行? +regenerate_scratch_token_desc=如果您遺失了臨時令牌或已經使用它登錄,您可以在此處重置。 twofa_disabled=兩步驟驗證已經被關閉。 scan_this_image=使用您的授權應用程式來掃瞄圖片: or_enter_secret=或者輸入密碼: %s +then_enter_passcode=然後輸入應用程序中顯示的驗證碼: +passcode_invalid=無效的驗證碼,請重試。 +u2f_desc=安全密鑰是包含加密密鑰的硬體設備。 它們可以用於兩步驟認證。 安全密鑰必須符合 FIDO U2F 標準。 +u2f_require_twofa=必須先開啟兩步驟驗證才能使用安全密鑰。 +u2f_register_key=新增安全密鑰 +u2f_nickname=暱稱 +u2f_press_button=按下安全密鑰上的密碼進行註冊。 +u2f_delete_key=移除安全密鑰 +u2f_delete_key_desc=如果您移除安全密鑰,則無法再使用它登錄。 確定嗎? +manage_account_links=管理已連結的帳號 +manage_account_links_desc=這些外部帳號與您的 Gitea 帳號相關聯。 +account_links_not_available=目前沒有連結到您的 Gitea 帳號的外部帳號 +remove_account_link=刪除連結的帳號 +remove_account_link_success=已取消連結帳號。 orgs_none=您尚未成為任一組織的成員。 repos_none=您不擁有任何存儲庫 delete_account=刪除當前帳戶 +delete_prompt=此動作將永久刪除您的帳號,而且無法復原。 confirm_delete_account=確認刪除帳戶 +delete_account_title=刪除使用者帳號 +delete_account_desc=您是否確定要永久刪除此帳號? [repo] owner=擁有者 repo_name=儲存庫名稱 +repo_name_helper=好的儲存庫名稱通常是簡短的、好記的、且獨特的。 visibility=可見度 +visiblity_helper=將儲存庫設為私人 +visiblity_helper_forced=您的網站管理員強制新的存儲庫必需設定為私人。 +visiblity_fork_helper=(修改該值將會影響到所有派生倉庫) +clone_helper=不知道如何操作?瀏覽 幫助 ! fork_repo=複製儲存庫 fork_from=複製自 repo_desc=儲存庫描述 repo_lang=儲存庫語言 +repo_gitignore_helper=選擇 .gitignore 範本 license=授權許可 +license_helper=請選擇授權許可文件 +readme=讀我 +readme_helper=選擇讀我檔案範本。 +auto_init=初始化儲存庫(建立 .gitignore、授權許可文件和讀我檔案) create_repo=建立儲存庫 default_branch=默認分支 mirror_prune=裁減 +mirror_interval_invalid=鏡像周期無效 +mirror_address=由 URL 複製 +mirror_last_synced=上次同步 watchers=關注者 stargazers=稱讚者 forks=複製儲存庫 pick_reaction=選擇你的表情反應 +reactions_more=再多添加 %d個 form.reach_limit_of_creation=您已經達到了儲存庫 %d 的上限。 form.name_reserved=儲存庫名稱 '%s' 是預留的。 +form.name_pattern_not_allowed=儲存庫名稱無法使用 "%s"。 +need_auth=複製授權驗證 migrate_type=遷移類型 migrate_type_helper=該儲存庫將是一個鏡像 migrate_repo=遷移儲存庫 +migrate.clone_local_path=或者是本地端伺服器路徑 migrate.permission_denied=您並沒有導入本地儲存庫的權限。 +migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄! migrate.failed=遷移失敗:%v mirror_from=镜像来自 forked_from=複製自 +fork_from_self=您無法複製您的儲存庫! copy_link=複製連結 +copy_link_success=已複製連結 +copy_link_error=請按下 ⌘-C 或 Ctrl-C 複製 copied=複製成功 unwatch=取消關注 watch=關注 unstar=取消收藏 star=收藏 fork=複製 +download_archive=下载此儲存庫 no_desc=暫無描述 quick_guide=快速幫助 @@ -302,10 +538,23 @@ file_raw=原始文件 file_history=歷史記錄 file_view_raw=查看原始文件 file_permalink=永久連結 +file_too_large=檔案太大,無法顯示。 +video_not_supported_in_browser=您的瀏覽器不支援使用 HTML5 播放影片。 stored_lfs=儲存到到 Git LFS +commit_graph=提交線圖 +editor.new_file=新增文件 +editor.upload_file=上傳文件 +editor.edit_file=編輯文件 editor.preview_changes=預覽更改 +editor.cannot_edit_non_text_files=網站介面不能編輯二進位檔案 +editor.edit_this_file=編輯文件 +editor.must_be_on_a_branch=你必須在一個分支或提出對此檔的更改。 +editor.delete_this_file=刪除檔案 +editor.file_delete_success=文件 %s 已刪除。 +editor.name_your_file=命名您的檔案... editor.or=或 +editor.cancel_lower=取消 editor.commit_changes=提交更改嗎? editor.add_tmpl=新增 %s/' editor.add=新增 '%s' @@ -313,7 +562,9 @@ editor.update=更新 '%s' editor.delete=刪除 '%s' editor.commit_directly_to_this_branch=直接提交到 %s 分支。 editor.create_new_branch=建立 新的分支 為此提交和開始合併請求。 +editor.new_branch_name_desc=新的分支名稱... editor.cancel=取消 +editor.filename_cannot_be_empty=檔案名稱不能為空。 editor.branch_already_exists='%s' 已存在於此存儲庫。 editor.no_changes_to_show=沒有可以顯示的變更。 editor.fail_to_update_file=上傳/建立檔案 '%s' 失敗, 錯誤訊息: %v @@ -321,14 +572,18 @@ editor.unable_to_upload_files=上傳檔案失敗到 '%s', 錯誤訊息: %v editor.upload_files_to_dir=上傳檔案到 '%s' commits.commits=次程式碼提交 +commits.search=搜尋提交歷史... commits.find=搜尋 +commits.search_all=所有分支 commits.author=作者 commits.message=備註 commits.date=提交日期 commits.older=更舊的提交 commits.newer=更新的提交 commits.signed_by=簽署人 +commits.gpg_key_id=GPG 金鑰 ID +ext_issues=外部問題 issues.new=建立問題 issues.new.labels=標籤 @@ -339,12 +594,18 @@ issues.new.no_milestone=未選擇里程碑 issues.new.clear_milestone=清除已選取里程碑 issues.new.open_milestone=開啟中的里程碑 issues.new.closed_milestone=已關閉的里程碑 +issues.new.assignees=指派成員 +issues.new.clear_assignees=取消指派成員 +issues.new.no_assignees=未指派成員 issues.no_ref=未指定分支或標籤 issues.create=建立問題 issues.new_label=建立標籤 +issues.new_label_placeholder=標籤名稱 +issues.new_label_desc_placeholder=描述 issues.create_label=建立標籤 issues.label_templates.title=載入一組預定義的標籤 issues.label_templates.helper=選擇一個標籤集 +issues.label_templates.use=使用標籤集 issues.label_templates.fail_to_load_file=載入標籤範本檔案 '%s' 失敗: %v issues.add_label_at=加上了
%s
標籤 %s issues.remove_label_at=刪除了
%s
標籤 %s @@ -360,8 +621,11 @@ issues.delete_branch_at=`刪除分支 %s %s` issues.open_tab=%d 個開啓中 issues.close_tab=%d 個已關閉 issues.filter_label=標籤篩選 +issues.filter_label_no_select=所有標籤 issues.filter_milestone=里程碑篩選 +issues.filter_milestone_no_select=所有里程碑 issues.filter_assignee=指派人篩選 +issues.filter_assginee_no_select=所有指派成員 issues.filter_type=類型篩選 issues.filter_type.all_issues=所有問題 issues.filter_type.assigned_to_you=指派給您的 @@ -374,6 +638,10 @@ issues.filter_sort.recentupdate=最近更新 issues.filter_sort.leastupdate=最少更新 issues.filter_sort.mostcomment=最多評論 issues.filter_sort.leastcomment=最少評論 +issues.filter_sort.moststars=最多收藏 +issues.filter_sort.feweststars=最少收藏 +issues.filter_sort.mostforks=最多複製 +issues.filter_sort.fewestforks=最少複製 issues.action_open=開啟 issues.action_close=關閉 issues.action_label=標籤 @@ -392,7 +660,9 @@ issues.commented_at=` 評論 %s` issues.delete_comment_confirm=您確定要刪除該條評論嗎? issues.no_content=尚未有任何內容 issues.close_issue=關閉 +issues.close_comment_issue=評論並關閉 issues.reopen_issue=重新開啟 +issues.reopen_comment_issue=重新開啟並評論 issues.create_comment=評論 issues.closed_at=`於 %[2]s 關閉` issues.reopened_at=`於 %[2]s 重新開啟` @@ -405,11 +675,16 @@ issues.edit=編輯 issues.cancel=取消 issues.save=儲存 issues.label_title=標籤名稱 +issues.label_description=標籤描述 issues.label_color=標籤顏色 issues.label_count=%d 個標籤 issues.label_open_issues=%d 個開啓的問題 issues.label_edit=編輯 issues.label_delete=刪除 +issues.label_modify=編輯標籤 +issues.label_deletion=刪除標籤 +issues.label_deletion_desc=刪除標籤會將其從所有問題中刪除,繼續? +issues.label_deletion_success=標籤已刪除。 issues.label.filter_sort.alphabetically=按字母顺序排序 issues.label.filter_sort.reverse_alphabetically=按字母反向排序 issues.label.filter_sort.by_size=大小 @@ -419,19 +694,43 @@ issues.attachment.open_tab=`在新的標籤頁中查看 '%s'` issues.attachment.download=`點擊下載 '%s'` issues.subscribe=訂閱 issues.unsubscribe=取消訂閱 +issues.tracker=時間追蹤 issues.start_tracking_short=開始 +issues.start_tracking=開始時間追蹤 issues.start_tracking_history=`開始工作 %s` issues.tracking_already_started=`您已經開始時間追蹤這個 問題!` issues.stop_tracking=停止 issues.stop_tracking_history=`結束工作 %s` +issues.add_time=手動新增時間 +issues.add_time_short=新增時間 issues.add_time_cancel=取消 issues.add_time_history=`加入了花費時間 %s` issues.add_time_hours=小時 issues.add_time_minutes=分鐘 +issues.add_time_sum_to_small=沒有輸入時間。 issues.cancel_tracking=取消 issues.cancel_tracking_history=`取消時間追蹤 %s` +issues.time_spent_total=總花費時間 +issues.time_spent_from_all_authors=`總花費時間:%s` +issues.due_date=截止日期 +issues.invalid_due_date_format=截止日期的格式錯誤,必須是 "yyyy-mm-dd" 的形式。 +issues.error_modifying_due_date=無法修改截止日期。 +issues.error_removing_due_date=無法移除截止日期。 +issues.due_date_form=yyyy年mm月dd日 +issues.due_date_form_add=新增截止日期 +issues.due_date_form_update=更改截止日期 +issues.due_date_form_remove=移除截止日期 +issues.due_date_not_writer=您需要儲存庫寫入權限來更改問題的截止日。 +issues.due_date_not_set=未設定截止日期。 +issues.due_date_added=已新增截止日期 %s %s +issues.due_date_modified=已將截止日期修改為 %s ,原截止日期: %s %s +issues.due_date_remove=已移除截止日期 %s %s +issues.due_date_overdue=逾期 +pulls.desc=啟用合併請求及程式碼審核 pulls.new=建立合併請求 +pulls.compare_changes=建立合併請求 +pulls.compare_base=合併到 pulls.filter_branch=過濾分支 pulls.no_results=未找到結果 pulls.create=建立合併請求 @@ -439,8 +738,10 @@ pulls.title_desc=請求將 %[1]d 次程式碼提交從 %[2]s 合併 pulls.merged_title_desc=於 %[4]s 將 %[1]d 次代碼提交從 %[2]s合併至 %[3]s pulls.tab_conversation=對話內容 pulls.tab_commits=程式碼提交 +pulls.tab_files=檔案變動 pulls.reopen_to_merge=請重新開啟合併請求來完成合併操作。 pulls.merged=已合併 +pulls.has_merged=合併請求已合併。 pulls.can_auto_merge_desc=這個拉請求可以自動合併。 pulls.merge_pull_request=合併請求 pulls.rebase_merge_pull_request=Rebase 合併 @@ -460,6 +761,10 @@ milestones.due_date=截止日期(可選) milestones.clear=清除 milestones.edit=編輯里程碑 milestones.cancel=取消 +milestones.modify=更新里程碑 +milestones.edit_success=里程碑 '%s' 已更新。 +milestones.deletion=刪除里程碑 +milestones.deletion_success=里程碑已刪除 milestones.filter_sort.closest_due_date=到期日由近到遠 milestones.filter_sort.furthest_due_date=到期日由遠到近 milestones.filter_sort.least_complete=完成度由低到高 @@ -467,10 +772,17 @@ milestones.filter_sort.most_complete=完成度由高到低 milestones.filter_sort.most_issues=問題由多到少 milestones.filter_sort.least_issues=問題由少到多 +ext_wiki=外部 Wiki +ext_wiki.desc=連結外部 Wiki。 wiki=Wiki +wiki.welcome=歡迎使用 Wiki! +wiki.welcome_desc=Wiki 允許你撰寫和與協作者分享文件 +wiki.desc=撰寫與和協作者分享文件。 +wiki.create_first_page=建立第一個頁面 wiki.page=頁面 wiki.filter_page=過濾頁面 +wiki.new_page=頁面 wiki.default_commit_message=關於此次頁面修改的說明(非必要)。 wiki.save_page=儲存頁面 wiki.last_commit_info=%s 於 %s 修改了此頁面 @@ -478,6 +790,7 @@ wiki.edit_page_button=修改 wiki.new_page_button=新的頁面 wiki.delete_page_button=刪除頁面 wiki.page_already_exists=相同名稱的 Wiki 頁面已經存在。 +wiki.reserved_page=Wiki 頁面名稱 "%s" 是被保留的。 wiki.pages=所有頁面 wiki.last_updated=最後更新於 %s @@ -496,6 +809,9 @@ activity.title.user_n=%d 使用者 activity.title.prs_1=%d 合併請求 activity.title.prs_n=%d 合併請求 activity.merged_prs_label=已合併 +activity.opened_prs_label=提案 +activity.active_issues_count_1=%d 個問題 +activity.active_issues_count_n=%d 個問題 activity.closed_issues_count_1=已關閉的 Issue activity.closed_issues_count_n=已關閉的 Issue activity.title.issues_1=%d Issue @@ -506,6 +822,9 @@ activity.closed_issue_label=已關閉 activity.new_issues_count_1=建立問題 activity.new_issues_count_n=建立問題 activity.new_issue_label=已開啟 +activity.title.unresolved_conv_1=%d 未解決的對話 +activity.title.unresolved_conv_n=%d 未解決的對話 +activity.unresolved_conv_desc=這些最近更改的問題和合併請求尚未解決。 activity.unresolved_conv_label=打開 activity.title.releases_1=%d 版本發佈 activity.title.releases_n=%d 版本發佈 @@ -518,6 +837,9 @@ search.results=在 %s 中搜尋 "%s" 的结果 settings=儲存庫設定 settings.desc=設定是您可以管理儲存庫設定的地方 +settings.options=儲存庫 +settings.collaboration=協作者 +settings.collaboration.admin=管理員 settings.collaboration.write=可寫權限 settings.collaboration.read=可讀權限 settings.collaboration.undefined=未定義 @@ -525,24 +847,47 @@ settings.hooks=管理 Webhooks settings.githooks=管理 Git Hooks settings.basic_settings=基本設定 settings.mirror_settings=鏡像設定 +settings.sync_mirror=現在同步 +settings.mirror_sync_in_progress=鏡像同步正在進行中。 請稍後再回來看看。 +settings.site=網站 settings.update_settings=更新儲存庫設定 settings.advanced_settings=高級設定 +settings.wiki_desc=啟用儲存庫 Wiki +settings.use_internal_wiki=使用內建 Wiki +settings.use_external_wiki=使用外部 Wiki settings.external_wiki_url=外部 Wiki 連結 +settings.external_wiki_url_error=外部 Wiki 網址不是有效的網址。 +settings.external_wiki_url_desc=點擊問題標籤時,使用者會被導向到外部 Wiki URL。 settings.external_tracker_url=外部 Issue 追蹤網址 settings.tracker_url_format=外部問題管理系統的 URL 格式 settings.tracker_issue_style.numeric=數字 settings.tracker_issue_style.alphanumeric=字母及數字 +settings.enable_timetracker=啟用時間追蹤 settings.danger_zone=危險操作區 settings.new_owner_has_same_repo=新的儲存庫擁有者已經存在同名儲存庫! +settings.convert=轉換為普通儲存庫 +settings.convert_desc=您可以將此鏡像轉成普通儲存庫。此動作不可恢復。 +settings.convert_confirm=轉換儲存庫 +settings.convert_succeed=鏡像儲存庫已成功轉換為一般儲存庫。 settings.transfer=轉移儲存庫所有權 settings.delete=刪除本儲存庫 settings.delete_notices_1=- 此操作 不可以 被回滾。 settings.transfer_owner=新擁有者 +settings.confirm_delete=刪除儲存庫 +settings.add_collaborator=增加協作者 +settings.add_collaborator_success=成功增加協作者! +settings.delete_collaborator=移除 +settings.collaborator_deletion=移除協作者 +settings.remove_collaborator_success=已移除協作者。 +settings.search_user_placeholder=搜尋使用者... settings.add_webhook=建立 Webhook +settings.webhook_deletion=刪除 Webhook +settings.webhook_deletion_success=Webhook 已刪除。 settings.webhook.test_delivery=測試推送 settings.webhook.request=請求內容 settings.webhook.response=響應內容 settings.webhook.headers=標題 +settings.webhook.payload=內容 settings.webhook.body=響應內容 settings.githook_edit_desc=如果 Hook 未啟動,則會顯示樣例文件中的內容。如果想要刪除某個 Hook,則提交空白文本即可。 settings.githook_name=Hook 名稱 @@ -554,11 +899,26 @@ settings.slack_icon_url=圖標 URL settings.discord_username=使用者名稱 settings.discord_icon_url=Icon URL settings.slack_color=顏色代碼 +settings.event_desc=觸發條件: +settings.event_push_only=推送事件 +settings.event_send_everything=所有事件 +settings.event_choose=自訂事件... settings.event_create=建立 +settings.event_create_desc=建立分支或標籤 +settings.event_delete=刪除 +settings.event_delete_desc=分支或標籤已刪除 +settings.event_fork=複製 +settings.event_issues=問題 +settings.event_issues_desc=問題被開啟,關閉,重新開啟,編輯,指派,取消指派,更新標籤,清除標籤,設置里程碑或取消設置里程碑。 +settings.event_issue_comment=問題評論 +settings.event_issue_comment_desc=已經建立、編輯或刪除的問題評論。 settings.event_pull_request=合併請求 settings.event_push=推送 settings.event_repository=儲存庫 +settings.add_hook_success=Webhook 新增成功! settings.update_webhook=更新 Webhook +settings.update_hook_success=Webhook 更新成功! +settings.delete_webhook=刪除 Webhook settings.recent_deliveries=最近推送記錄 settings.hook_type=Hook 類型 settings.slack_token=令牌 @@ -573,8 +933,11 @@ settings.protected_branch=分支保護 settings.protected_branch_can_push=允許推送? settings.protected_branch_can_push_yes=你可以推送 settings.protected_branch_can_push_no=你不能推送 +settings.protect_whitelist_search_users=搜尋使用者... +settings.protect_whitelist_search_teams=搜尋團隊... settings.add_protected_branch=啟用保護 settings.delete_protected_branch=停用保護 +settings.choose_branch=選擇一個分支... diff.browse_source=瀏覽代碼 diff.parent=父節點 @@ -603,19 +966,34 @@ release.title=標題 release.content=內容 release.write=內容編輯 release.preview=效果預覽 +release.loading=載入中… +release.prerelease_helper=標記此版本不適合生產使用。 release.cancel=取消 release.publish=發佈版本 release.save_draft=儲存草稿 +release.edit_release=編輯發佈訊息 +release.delete_release=刪除發佈 +release.deletion=刪除發佈 release.deletion_success=已刪除此版本發佈。 +release.tag_name_already_exist=已經存在使用相同標籤的發佈版本。 +release.tag_name_invalid=標籤名稱無效。 release.downloads=下載附件 +branch.name=分支名稱 branch.search=搜尋分支 +branch.already_exists=分支名稱 ”%s“ 已經存在 branch.delete_head=刪除 +branch.delete=刪除分支 '%s' branch.delete_html=刪除分支 +branch.delete_desc=刪除分支是永久的。 此動作無法復原,繼續? +branch.deletion_success=分支 '%s' 已被刪除。 +branch.deletion_failed=刪除分支 '%s' 失敗。 branch.create_branch=建立分支 %s +branch.create_from=從 '%s' branch.branch_already_exists=分支 '%s' 已存在此儲存庫 branch.deleted_by=刪除人: %s +topic.done=完成 [org] org_name_holder=組織名稱 @@ -626,23 +1004,37 @@ people=組織成員 teams=組織團隊 lower_members=名成員 lower_repositories=個儲存庫 +create_new_team=建立團隊 +create_team=建立新的團隊 org_desc=組織描述 team_name=團隊名稱 team_desc=團隊描述 +team_permission_desc=權限 +form.name_reserved=組織名稱 '%s' 是被保留的。 +form.name_pattern_not_allowed=儲存庫名稱無法使用 "%s"。 +form.create_org_not_allowed=此帳號禁止建立組織。 settings=組織設定 +settings.options=組織 settings.full_name=組織全名 settings.website=官方網站 settings.location=所在地區 settings.update_settings=更新組織設定 settings.update_setting_success=組織設定已更新。 +settings.change_orgname_prompt=注意:修改組織名稱將會同時修改對應的 URL。 +settings.update_avatar_success=組織大頭貼已經更新。 settings.delete=刪除組織 settings.delete_account=刪除當前組織 settings.confirm_delete_account=確認刪除組織 +settings.delete_org_title=刪除組織 settings.hooks_desc=新增 webhooks 將觸發在這個組織下 全部的儲存庫 。 members.membership_visibility=成員可見性: +members.public=可見 +members.public_helper=隱藏 +members.private=隱藏 +members.private_helper=顯示 members.member_role=成員角色: members.owner=管理員 members.member=普通成員 @@ -654,22 +1046,30 @@ members.invite_now=立即邀請 teams.join=加入團隊 teams.leave=離開團隊 teams.read_access=讀取權限 +teams.read_access_helper=成員可以查看和複製團隊儲存庫。 teams.write_access=寫入權限 +teams.write_access_helper=成員可以查看和推送到團隊儲存庫。 +teams.admin_access=管理員權限 teams.no_desc=該團隊暫無描述 teams.settings=團隊設定 teams.members=團隊成員 teams.update_settings=更新團隊設定 +teams.delete_team=刪除團隊 teams.add_team_member=新增團隊成員 +teams.delete_team_title=刪除團隊 teams.delete_team_success=該團隊已被刪除。 teams.repositories=團隊儲存庫 +teams.search_repo_placeholder=搜尋儲存庫... teams.add_team_repository=新增團隊儲存庫 teams.remove_repo=移除儲存庫 teams.add_nonexistent_repo=您嘗試新增到團隊的儲存庫不存在,請先建立儲存庫! [admin] dashboard=控制面版 +users=使用者帳號 organizations=組織管理 repositories=儲存庫管理 +authentication=認證來源 config=應用設定管理 notices=系統提示管理 monitor=應用監控面版 @@ -677,6 +1077,10 @@ first_page=首頁 last_page=末頁 total=總計:%d +dashboard.statistic=摘要 +dashboard.operations=維護操作 +dashboard.system_status=系統狀態 +dashboard.statistic_info=Gitea 資料庫統計:%d 位使用者,%d 個組織,%d 個公鑰,%d 個儲存庫,%d 個儲存庫關注,%d 個讚,%d 次行為,%d 條權限記錄,%d 個問題,%d 次評論,%d 個社交帳號,%d 個用戶關註,%d 個鏡像,%d 個版本發佈,%d 個登錄源,%d 個 Webhook ,%d 個里程碑,%d 個標籤,%d 個 Hook 任務,%d 個團隊,%d 個更新任務,%d 個附件。 dashboard.operation_name=操作名稱 dashboard.operation_switch=開關 dashboard.operation_run=執行 @@ -684,6 +1088,12 @@ dashboard.clean_unbind_oauth=清理未綁定OAuth的連結 dashboard.clean_unbind_oauth_success=所有未綁定 OAuth 的連結已刪除。 dashboard.delete_inactivate_accounts=刪除所有未啟用帳戶 dashboard.delete_inactivate_accounts_success=成功清除所有未啟用帳號! +dashboard.delete_repo_archives=刪除所有儲存庫存檔 +dashboard.delete_repo_archives_success=所有儲存庫存檔已刪除。 +dashboard.delete_missing_repos=刪除所有遺失 Git 檔案的儲存庫記錄 +dashboard.delete_missing_repos_success=所有缺少 Git 檔案的儲存庫記錄均已刪除。 +dashboard.git_gc_repos=對儲存庫進行垃圾回收 +dashboard.git_gc_repos_success=所有儲存庫的垃圾回收已完成執行。 dashboard.reinit_missing_repos=重新初始化所有遺失具已存在記錄的Git 儲存庫 dashboard.reinit_missing_repos_success=所有遺失具已存在記錄的Git 儲存庫已重新初始化。 dashboard.sync_external_users=同步外部使用者資料 @@ -693,6 +1103,8 @@ dashboard.current_memory_usage=當前內存使用量 dashboard.total_memory_allocated=所有被分配的內存 dashboard.memory_obtained=內存佔用量 dashboard.pointer_lookup_times=指針查找次數 +dashboard.memory_allocate_times=記憶體分配次數 +dashboard.memory_free_times=記憶體釋放次數 dashboard.current_heap_usage=當前 Heap 內存使用量 dashboard.heap_memory_obtained=Heap 內存佔用量 dashboard.heap_memory_idle=Heap 內存空閒量 @@ -715,18 +1127,35 @@ dashboard.total_gc_pause=垃圾收集暫停時間總量 dashboard.last_gc_pause=上次垃圾收集暫停時間 dashboard.gc_times=垃圾收集執行次數 +users.user_manage_panel=帳號管理 +users.new_account=建立新帳號 +users.name=使用者名稱 users.activated=已啟用 users.admin=管理員 users.repos=儲存庫數 users.created=建立時間 +users.last_login=上次登入 +users.never_login=從未登入 users.edit=編輯 users.auth_source=認證源 users.local=本地 +users.edit_account=編輯帳號 +users.max_repo_creation=最大儲存庫數量 +users.max_repo_creation_desc=(設定 -1 使用全域預設限制) +users.is_activated=該使用者帳號已被啟用 +users.prohibit_login=停用登入 +users.is_admin=是管理員 +users.allow_import_local=允許匯入本地儲存庫 +users.allow_create_organization=允許建立組織 +users.update_profile=更新帳號 +users.delete_account=刪除帳號 +users.deletion_success=使用者帳號已被刪除。 orgs.org_manage_panel=組織管理 orgs.name=組織名稱 orgs.teams=團隊數 orgs.members=成員數 +orgs.new_orga=新增組織 repos.repo_manage_panel=儲存庫管理 repos.owner=所有者 @@ -734,12 +1163,15 @@ repos.name=儲存庫名稱 repos.private=私有庫 repos.watches=關註數 repos.stars=讚好數 +repos.forks=複製 repos.issues=問題數 repos.size=由小到大 +auths.new=新增認證來源 auths.name=認證名稱 auths.type=認證類型 auths.enabled=已啟用 +auths.syncenabled=啟用使用者同步 auths.updated=最後更新時間 auths.auth_type=認證類型 auths.auth_name=認證名稱 @@ -749,8 +1181,15 @@ auths.host=主機地址 auths.port=主機端口 auths.bind_dn=綁定DN auths.bind_password=綁定密碼 +auths.bind_password_helper=警告:此密碼以明文存儲。 如果可能請使用只讀帳號。 auths.user_base=用戶搜尋基準 auths.user_dn=用戶 DN +auths.attribute_username=使用者名稱屬性 +auths.attribute_username_placeholder=留空將使用「Gitea」作為使用者名稱 +auths.attribute_name=名字屬性 +auths.attribute_surname=姓氏屬性 +auths.attribute_mail=電子郵件屬性 +auths.search_page_size=頁面大小 auths.filter=使用者篩選器 auths.admin_filter=管理者篩選器 auths.ms_ad_sa=MS AD 搜尋屬性 @@ -765,6 +1204,7 @@ auths.oauth2_provider=OAuth2 提供者 auths.oauth2_clientID=用戶端 ID (金鑰) auths.oauth2_clientSecret=用戶端金鑰 auths.openIdConnectAutoDiscoveryURL=OpenID 連接自動探索 URL +auths.oauth2_use_custom_url=使用自定義 URL 而不是預設 URL auths.oauth2_tokenURL=Token URL auths.oauth2_authURL=授權 URL auths.oauth2_profileURL=個人訊息 URL @@ -779,22 +1219,35 @@ auths.tip.facebook=在 https://developers.facebook.com/apps 註冊一個新的 auths.tip.github=在 https://github.com/settings/applications/new 註冊一個新的 OAuth 應用程式 auths.tip.gitlab=在 https://gitlab.com/profile/applications 註冊一個新的應用程式 auths.tip.openid_connect=使用 OpenID 連接探索 URL (/.well-known/openid-configuration) 來指定節點 +auths.edit=修改認證來源 +auths.activated=該授權來源已啟用 auths.new_success=已增加認證'%s'。 +auths.update_success=認證來源已更新。 +auths.update=更新驗證來源 +auths.delete=刪除驗證來源 auths.delete_auth_title=刪除認證來源 config.server_config=伺服器設定 +config.app_name=網站標題 +config.app_ver=Gitea 版本 +config.app_url=Gitea 基本 URL config.custom_conf=設定檔案路徑 +config.domain=SSH 伺服器域名 +config.offline_mode=本地模式 config.disable_router_log=關閉路由日誌 config.run_mode=執行模式 config.git_version=Git 版本 config.repo_root_path=儲存庫目錄 config.lfs_root_path=LFS 根目錄 config.static_file_root_path=靜態檔案目錄 +config.log_file_root_path=日誌路徑 config.script_type=腳本類型 config.reverse_auth_user=反向代理認證 config.ssh_config=SSH 設定 config.ssh_enabled=已啟用 +config.ssh_start_builtin_server=使用內建的伺服器 +config.ssh_domain=伺服器域名 config.ssh_port=連接埠 config.ssh_listen_port=監聽埠 config.ssh_root_path=根路徑 @@ -807,13 +1260,28 @@ config.db_config=資料庫設定 config.db_type=資料庫類型 config.db_host=主機地址 config.db_name=資料庫名稱 +config.db_user=使用者名稱 +config.db_ssl_mode=SSL config.db_path=資料庫路徑 config.service_config=服務設定 +config.register_email_confirm=要求註冊時確認電子郵件 +config.disable_register=關閉註冊功能 +config.allow_only_external_registration=僅允許通過外部服務註冊 +config.enable_openid_signup=啟用 OpenID 註冊 +config.enable_openid_signin=啟用 OpenID 登入 config.show_registration_button=顯示註冊按鈕 +config.require_sign_in_view=啓用登錄瀏覽限制 +config.mail_notify=啟用郵件通知 config.disable_key_size_check=禁用金鑰最小長度檢查 +config.enable_captcha=啟用驗證碼 config.active_code_lives=啟用用戶連結有效期 config.reset_password_code_lives=重設密碼代碼過期時間 +config.default_keep_email_private=預設隱藏電子郵件地址 +config.default_allow_create_organization=預設允許新增組織 +config.enable_timetracking=啟用時間追蹤 +config.default_enable_timetracking=預設啟用時間追蹤 +config.no_reply_address=隱藏電子郵件域名 config.webhook_config=Webhook 設定 config.queue_length=隊列長度 @@ -827,6 +1295,9 @@ config.mailer_host=郵件主機地址 config.mailer_user=發送者帳號 config.mailer_use_sendmail=使用 Sendmail config.mailer_sendmail_path=Sendmail 路徑 +config.send_test_mail=傳送測試郵件 +config.test_mail_failed=傳送測試郵件到 '%s' 時失敗:'%v +config.test_mail_sent=測試郵件已發送到 '%s' config.oauth_config=社交帳號設定 config.oauth_enabled=啟用服務 @@ -846,6 +1317,7 @@ config.session_life_time=Session 生命周期 config.https_only=僅限 HTTPS config.cookie_life_time=Cookie 生命周期 +config.picture_config=圖片和大頭貼設定 config.picture_service=圖片服務 config.disable_gravatar=禁用 Gravatar 頭像 config.enable_federated_avatar=開啟聯合頭像 @@ -870,6 +1342,7 @@ monitor.name=任務名稱 monitor.schedule=任務安排 monitor.next=下次執行時間 monitor.previous=上次執行時間 +monitor.execute_times=執行時間 monitor.process=執行中進程 monitor.desc=進程描述 monitor.start=開始時間 @@ -928,6 +1401,7 @@ raw_seconds=秒 raw_minutes=分鐘 [dropzone] +invalid_input_type=您無法上傳此類型的檔案 file_too_big=檔案大小({{filesize}} MB) 超過了最大允許大小({{maxFilesize}} MB) remove_file=移除文件 @@ -935,6 +1409,8 @@ remove_file=移除文件 notifications=訊息 unread=未讀 read=已讀 +no_unread=沒有未讀通知 +no_read=沒有通知 pin=固定通知 mark_as_read=標記為已讀 mark_as_unread=標記為未讀 From 547f95417d88796c14901f9e7cec6cf4359eff7e Mon Sep 17 00:00:00 2001 From: Alexey Terentyev Date: Sun, 1 Jul 2018 09:02:18 +0300 Subject: [PATCH 62/86] Add myself as a maintainer (#4345) --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index 5deb40961..020a44c51 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -23,3 +23,4 @@ Matti Ranta (@techknowlogick) Michael Lustfield (@MTecknology) Jonas Franz (@JonasFranzDEV) Flynn Lufmons (@flufmonster) +Alexey Terentyev (@axifive) From f4b7b424c146ed1dcdf6ee4fa5c19ad0c1b5ed66 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 1 Jul 2018 06:03:32 +0000 Subject: [PATCH 63/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_it-IT.ini | 890 ++++++++++++++++++++++++++++++++ 1 file changed, 890 insertions(+) diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index d3aa6c609..494141667 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -1,11 +1,15 @@ +app_desc=Un servizio auto-ospitato per Git pronto all'uso home=Home dashboard=Pannello di controllo explore=Esplora help=Aiuto sign_in=Accedi +sign_in_with=Accedi con sign_out=Esci +sign_up=Registrati link_account=Collega account +link_account_signin_or_signup=Effettua il login con le credenziali esistenti per collegare il tuo account esistente con questo; oppure crea un nuovo account. register=Registrati website=Sito Web version=Versione @@ -13,12 +17,32 @@ page=Pagina template=Template language=Lingua notifications=Notifiche +create_new=Crea… +user_profile_and_more=Profilo ed Impostazioni… signed_in_as=Accesso effettuato come +enable_javascript=Il sito funziona meglio con JavaScript. username=Nome utente +email=Indirizzo Email password=Password +re_type=Reinserisci la password +captcha=CAPTCHA +twofa=Verifica in due passaggi +twofa_scratch=Codice di recupero per la verifica in due passaggi passcode=Codice di sicurezza +u2f_insert_key=Inserisci la chiave di sicurezza +u2f_sign_in=Premi il pulsante sulla tua chiave di sicurezza. Se non riesci a trovare alcun pulsante, reinseriscilo. +u2f_press_button=Si prega di premere il pulsante sulla tua chiave di sicurezza… +u2f_use_twofa=Usa un codice di verifica in due passaggi dal tuo telefono +u2f_error=Non riusciamo a leggere la tua chiave di sicurezza! +u2f_unsupported_browser=Il tuo browser non supporta le chiavi U2F. Si prega di provare un altro browser. +u2f_error_1=Si è verificato un errore sconosciuto. Si prega di riprovare. +u2f_error_2=Si prega di assicurarsi che si sta utilizza una connessione crittografata (https://) e visitando l'URL corretto. +u2f_error_3=Il server non ha potuto eseguire la richiesta. +u2f_error_4=La chiave data non è idonea per questa richiesta. Se stai provando a registrarla, assicurati che la chiave non sia già stata registrata. +u2f_error_5=Timeout raggiunto prima che la tua chiave potesse essere letta. Si prega di ricaricare per riprovare. +u2f_reload=Ricarica repository=Repository organization=Organizzazione @@ -29,8 +53,12 @@ new_mirror=Nuovo Mirror new_fork=Nuovo Fork new_org=Nuova organizzazione manage_org=Gestisci le organizzazioni +admin_panel=Amministrazione Sito account_settings=Impostazioni dell'account settings=Impostazioni +your_profile=Profilo +your_starred=Repository votate +your_settings=Impostazioni all=Tutti sources=Sorgenti @@ -46,34 +74,107 @@ cancel=Annulla [install] install=Installazione +title=Configurazione Iniziale +docker_helper=Se stai usando Gitea con Docker, si prega di leggere la documentazione prima di cambiare qualsiasi impostazione. +requite_db_desc=Gitea necessita di MySQL, PostgreSQL, MSSQL, SQLite3 o TiDB. db_title=Impostazioni Database db_type=Tipo di database host=Host +user=Nome utente password=Password db_name=Nome del database +db_helper=Nota agli utenti MySQL: si prega di utilizza l'engine InnoDB ed il carattere di tipo 'utf8_general_ci'. +ssl_mode=SSL path=Percorso +sqlite_helper=Percorso del file per il SQLite3 o TiDB.
Inserisci un percorso assoluto se stai usando Gitea come un servizio. +err_empty_db_path=Il percorso per il database SQLite3 o TiDB non può essere vuoto. +err_invalid_tidb_name=Il nome del database TiDB non può contenere i caratteri '.' e '-'. +no_admin_and_disable_registration=Non puoi disabilitare l'auto-registrazione degli utenti senza creare un account amministratore. +err_empty_admin_password=La password dell'amministratore non può essere vuota. +general_title=Impostazioni Generali +app_name=Titolo del Sito +app_name_helper=Qui puoi inserire il nome della tua società. repo_path=Percorso Root del Repository +repo_path_helper=Le Remote Git repositories saranno salvate in questa directory. +lfs_path=Percorso radice di Git LFS +lfs_path_helper=I file trovati da Git LFS saranno salvati in questa directory. Lasciare vuoto per disattivare. +run_user=Esegui come Nome utente +run_user_helper=Inserisci il nome utente del sistema operativo su cui Gitea viene eseguito. Nota che l'utente deve avere accesso al percorso radice dei repository. +domain=Dominio Server SSH +domain_helper=Dominio o nome host per SSH clone URLs. +ssh_port=Porta Server SSH +ssh_port_helper=Numero di porta in ascolto sul server SSH. Lasciare vuoto per disattivare. +http_port=Porta in ascolto HTTP Gitea +http_port_helper=Numero della porta sul quale i server web Gitea ascolteranno. +app_url=URL di base di Gitea +app_url_helper=URL di base per gli HTTP(S) clone URLs e notifiche email. log_root_path=Percorso dei log +log_root_path_helper=I file di log saranno scritti in questa directory. optional_title=Impostazioni Facoltative +email_title=Impostazioni Email smtp_host=Host SMTP +smtp_from=Invia Email come +smtp_from_helper=Indirizzo Email che Gitea utilizzerà. Enter a plain email address o usa il formato "Name" . +mailer_user=Nome utente SMTP +mailer_password=Password SMTP +register_confirm=Richiedere la conferma Email per registrarsi +mail_notify=Attila le notifiche Email +server_service_title=Impostazioni Server e Servizi di Terza Parte +offline_mode=Attiva la Modalità in Locale +offline_mode_popup=Disattivila le reti di distribuzione dei contenuti di terze parti and serve all resources locally. +disable_gravatar=Disattiva Gravatar +disable_gravatar_popup=Disattiva Gravatar e le fonti di avatar di terze parti. Verrà usato un avatar predefinito almeno che un utente non carichi un avatar in locale. +federated_avatar_lookup=Attiva i Federated Avatar federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Disattiva Self-Registration +disable_registration_popup=Disattiva la user self-registration. Solo gli amministratori saranno in grado di creare account. +allow_only_external_registration_popup=Attiva la registrazione solo tramite servizi esterni. openid_signin=Attiva l'accesso OpenID +openid_signin_popup=Attiva registrazione utente via OpenID. +openid_signup=Attiva OpenID Self-Registration +openid_signup_popup=Attiva OpenID-based user self-registration. +enable_captcha=Attiva CAPTCHA enable_captcha_popup=Richiedi convalida captcha per i nuovi utenti. +require_sign_in_view=Richiedi l'accesso per visualizzare le pagine +require_sign_in_view_popup=Limita l'accesso alle pagine agli utenti che hanno eseguito l'accesso. I visitatori visualizzeranno solamente le pagine di accesso e registrazione. +admin_setting_desc=Creare un account amministratore è opzionale. Il primo utente registrato sarà automaticamente un amministratore. +admin_title=Impostazioni Account Amministratore +admin_name=Nome utente dell'Amministratore admin_password=Password confirm_password=Conferma Password +admin_email=Indirizzo Email install_btn_confirm=Installare Gitea test_git_failed=Fallito il test del comando git: %v +sqlite3_not_available=Questa versione di Gitea non supporta SQLite3. Si prega di scaricare la versione binaria ufficiale da %s (not the 'gobuild' version). +invalid_db_setting=Le impostazioni del database sono invalide: %v +invalid_repo_path=Il percorso radice del Repository è invalido: %v +run_user_not_match=Il nome utente 'esegui come' non è il nome utente attuale: %s -> %s 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 è invalido: %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. +default_allow_create_organization=Consenti la Creazione di Organizzazioni di Default +default_allow_create_organization_popup=Consenti ai nuovi account utente di creare organizzazioni di default. +default_enable_timetracking=Attiva il cronografo di Default +default_enable_timetracking_popup=Attiva il cronografo per le nuove repositories di default. +no_reply_address=Dominio email nascosto +no_reply_address_helper=Nome dominio per utenti con un indirizzo email nascosto. Ad esempio, il nome utente 'joe' accederà a Git come 'joe@noreply.example.org' se il dominio email nascosto è impostato a 'noreply.example.org'. [home] +uname_holder=Nome utente o Indirizzo Email password_holder=Password switch_dashboard_context=Cambia Dashboard Context +my_repos=Repositories +show_more_repos=Mostra altre repositories… collaborative_repos=Repository Condivisi my_orgs=Le mie Organizzazioni my_mirrors=I miei Mirror view_home=Vedi %s +search_repos=Trova un repository… issues.in_your_repos=Nei tuoi repository @@ -82,30 +183,53 @@ repos=Repository users=Utenti organizations=Organizzazioni search=Cerca +code=Codice +repo_no_results=Nessuna repository corrispondente. +user_no_results=Nessun utente corrispondente. +org_no_results=Nessun'organizzazione corrispondente trovata. +code_no_results=Nessun codice sorgente corrispondente ai termini di ricerca. +code_search_results=Risultati di ricerca per '%s' [auth] +create_new_account=Registra un account register_helper_msg=Hai già un account? Accedi ora! +social_register_helper_msg=Hai già un account? Accedi ora! +disable_register_prompt=La registrazione è disabilitata. Si prega di contattare l'amministratore del sito. +disable_register_mail=Email di conferma per la registrazione disabilitata. remember_me=Ricordami forgot_password_title=Password Dimenticata forgot_password=Password dimenticata? +sign_up_now=Hai bisogno di un account? Registrati adesso. confirmation_mail_sent_prompt=Una nuova email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di registrazione. reset_password_mail_sent_prompt=Una email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di reset della password. active_your_account=Attiva il tuo Account +prohibit_login=Accesso proibito +prohibit_login_desc=Al tuo account è vietato l'accesso, si prega di contattare l'amministratore del sito. +resent_limit_prompt=Hai già richiesto un'e-mail d'attivazione recentemente. Si prega di attenere 3 minuti e poi riprovare. has_unconfirmed_mail=Ciao %s, hai un indirizzo di posta elettronica non confermato (%s). Se non hai ricevuto una e-mail di conferma o vuoi riceverla nuovamente, fare clic sul pulsante qui sotto. resend_mail=Clicca qui per inviare nuovamente l'e-mail di attivazione email_not_associate=L'indirizzo email non è associato ad alcuna conta. send_reset_mail=Clicca qui per inviare nuovamente la tua email di reimpostazione della password reset_password=Reimposta la tua Password +invalid_code=Il tuo codice di conferma è invalido oppure è scaduto. reset_password_helper=Clicca qui per reimpostare la password +password_too_short=La lunghezza della password non può essere minore di %d caratteri. +non_local_account=Gli utenti non locali non possono cambiare la loro password attraverso l'interfaccia web. verify=Verifica scratch_code=Codice Gratta e Vinci use_scratch_code=Utilizza un codice di zero twofa_scratch_used=Hai usato il tuo codice zero. Sei stato reindirizzato alla pagina di configurazione a due fattori quindi puoi rimuovere la registrazione dal dispositivo o generare un nuovo codice zero. +twofa_passcode_incorrect=Il tuo passcode non è corretto. Se hai smarrito il tuo dispositivo, utilizza il tuo scratch code per accedere. twofa_scratch_token_incorrect=I tuo codice scratch non è corretto. +login_userpass=Accedi login_openid=OpenID openid_connect_submit=Connetti openid_connect_title=Connetti a una conta esistente +openid_connect_desc=L'URI OpenID scelto è sconosciuto. Qui puoi associarlo a un nuovo account. openid_register_title=Crea Nuovo Account +openid_register_desc=L'URI OpenID scelto è sconosciuto. Qui puoi associarlo a un nuovo account. +openid_signin_desc=Inserisci il tuo URI OpenID. Ad esempio: https://anne.me, bob.openid.org.cn o gnusocial.net/carry. +disable_forgot_password_mail=La reimpostazione della password è disabilitata. Si prega di contattare l'amministratore del sito. [mail] activate_account=Per favore attiva il tuo account @@ -117,12 +241,14 @@ register_notify=Benvenuto su Gitea [modal] yes=Sì no=No +modify=Aggiorna [form] UserName=Nome utente RepoName=Nome Repository Email=Indirizzo E-mail Password=Password +Retype=Reinserisci la password SSHTitle=Nome chiave SSH HttpsUrl=URL HTTPS PayloadUrl=URL Payload @@ -138,6 +264,9 @@ TreeName=Percorso del file Content=Contenuto require_error=` non può essere vuoto.` +alpha_dash_error=` può contenere solo caratteri alfanumerici, dash ('-') e underscore ('_').` +alpha_dash_dot_error=` può contenere solo caratteri alfanumerici, dash ('-'), underscore ('_') e dot ('.').` +git_ref_name_error=` deve essere un Git reference name ben formato.` size_error='deve essere %s.' min_size_error=` deve contenere almeno %s caratteri.` max_size_error=` deve contenere massimo %s caratteri.` @@ -145,70 +274,148 @@ email_error=` non è un indirizzo e-mail valido.` url_error=` non è un URL valido.` include_error=` deve contenere la stringa '%s'.` unknown_error=Errore sconosciuto: +captcha_incorrect=Il codice CAPTCHA non è corretto. +password_not_match=Le password non corrispondono. +username_been_taken=Il Nome utente esiste già. +repo_name_been_taken=Il nome del repository esiste già. +org_name_been_taken=Il nome della organizzazione esiste già. +team_name_been_taken=Il nome del team esiste già. +team_no_units_error=Consenti l'accesso ad almeno una sezione del repository. +email_been_used=L'indirizzo email è già in uso. +openid_been_used=L'indirizzo OpenID '%s' è già in uso. +username_password_incorrect=Nome utente o password non corretti. +enterred_invalid_repo_name=Il nome del repository inserito non è corretto. +enterred_invalid_owner_name=Il nuovo nome del proprietario non è valido. +enterred_invalid_password=La password inserita non è corretta. user_not_exist=L'utente non esiste. +last_org_owner=Non è possibile rimuovere l'ultimo utente del team 'proprietari'. Deve esserci almeno un proprietario in qualsiasi team specificato. +cannot_add_org_to_team=Un'organizzazione non può essere aggiunto come membro del team. +invalid_ssh_key=Impossibile verificare la tua chiave SSH: %s +invalid_gpg_key=Impossibile verificare la tua chiave GPG: %s +unable_verify_ssh_key=Impossibile verificare la tua chiave SSH; si prega di ricontrollarla per verificare eventuali errori. auth_failed=Autenticazione non riuscita: %v +still_own_repo=Il tuo account possiede una o più repositories; rimuovile o trasferiscile per proseguire. +still_has_org=Il tuo account è un membro di una o più organizzazioni; abbandonali prima di proseguire. +org_still_own_repo=Questa organizzazione possiede ancora una o più repositories, rimuoverle o trasferirle per continuare. target_branch_not_exist=Il ramo (branch) di destinazione non esiste. [user] +change_avatar=Modifica il tuo avatar… join_on=Si è unito il repositories=Repository activity=Attività pubblica followers=Seguaci +starred=Repositories votate following=Seguiti follow=Segui unfollow=Non seguire più form.name_reserved=L'username '%s' è riservato. +form.name_pattern_not_allowed=Il modello '%s' non è consentito come nome di un utente. [settings] profile=Profilo +account=Account password=Password security=Sicurezza avatar=Avatar ssh_gpg_keys=Chiavi SSH / GPG social=Account Sociali +applications=Applicazioni +orgs=Gestisci le organizzazioni repos=Repository delete=Elimina account twofa=Verifica in due passaggi +account_link=Account collegati +organization=Organizzazioni uid=Uid +u2f=Chiavi di sicurezza public_profile=Profilo pubblico +profile_desc=Il tuo indirizzo email sarà utilizzato per le notifiche e altre operazioni. +password_username_disabled=Gli utenti non locali non hanno il permesso di cambiare il proprio nome utente. per maggiori dettagli si prega di contattare l'amministratore del sito. full_name=Nome Completo website=Sito web location=Posizione update_profile=Aggiorna Profilo update_profile_success=Il tuo profilo è stato aggiornato. +change_username=Il tuo nome utente è stato modificato. +change_username_prompt=Nota: i cambiamenti al nome utente vanno a modificare anche l'URL del tuo account. continue=Continua cancel=Annulla +language=Lingua +lookup_avatar_by_mail=Cerca Avatar per indirizzo Email federated_avatar_lookup=Ricerca per avatar federata enable_custom_avatar=Abilita avatar personalizzato choose_new_avatar=Scegli un nuovo avatar +update_avatar=Aggiorna Avatar delete_current_avatar=Elimina Avatar attuale +uploaded_avatar_not_a_image=Il file caricato non è un'immagine. +update_avatar_success=Il tuo avatar è stato aggiornato. +change_password=Aggiorna Password old_password=Password attuale new_password=Nuova Password +retype_new_password=Digitare nuovamente la nuova Password +password_incorrect=La password attuale non è corretta. +change_password_success=La password è stata aggiornata. Utilizza la nuova password la prossima volta che effettui il login. +password_change_disabled=Gli utenti non locali non possono cambiare la loro password attraverso l'interfaccia web. emails=Indirizzi e-mail +manage_emails=Gestisci indirizzi email +manage_openid=Gestisci gli indirizzi OpenID email_desc=Il tuo indirizzo e-mail primario sarà usato per le notifiche e altre operazioni. primary=Primario +primary_email=Rendi primario +delete_email=Rimuovi +email_deletion=Rimuovi indirizzo Email +email_deletion_desc=L'indirizzo email e le relativa informazioni verranno rimosse dal tuo account. I Git commits di questa email rimarranno invariati. Continuare? +email_deletion_success=L'indirizzo email è stato eliminato. +openid_deletion=Rimuovi Indirizzo OpenID +openid_deletion_desc=La rimozione di questo indirizzo OpenID della tua conta ti impedirà di accedere con esso. Sei sicuro di voler continuare? +openid_deletion_success=L'indirizzo OpenID è stato eliminato. +add_new_email=Aggiungi nuovo indirizzo email +add_new_openid=Aggiungi nuovo URI OpenID +add_email=Aggiungi indirizzo email add_openid=Aggiungere OpenID URI +add_email_confirmation_sent=Una nuova email di conferma è stata inviata a '%s'. Si prega di controllare la tua casella di posta entro il prossimo %s per confermare la tua email. +add_email_success=Il nuovo indirizzo email è stato aggiunto. +add_openid_success=Il nuovo indirizzo OpenID è stato aggiunto. +keep_email_private=Nascondi indirizzo email +keep_email_private_popup=Il tuo indirizzo email sarà nascosto agli altri utenti. +openid_desc=OpenID consente di delegare l'autenticazione ad un provider esterno. manage_ssh_keys=Gestisci chiavi SSH manage_gpg_keys=Gestisci Chiavi GPG add_key=Aggiungi Chiave +ssh_desc=Queste chiavi SSH pubbliche sono associate con il tuo account. Le corrispondenti chiavi private consentono l'accesso completo alle tue repositories. +gpg_desc=Queste chiavi GPG pubbliche sono associate con il tuo account. Proteggi le tue chiavi private perché permettono di verificare i commits. ssh_helper= Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub percrea le tue chiavi SSH o risolvere problemi comuni che potresti trovare utilizzando SSH. gpg_helper=Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub riguardo il GPG. add_new_key=Aggiungi Chiave SSH add_new_gpg_key=Aggiungi Chiave GPG +ssh_key_been_used=Questa chiave SSH è stata già aggiunta al tuo account. +ssh_key_name_used=Una chiave SSH con lo stesso nome è stata già aggiunta al tuo account. +gpg_key_id_used=Esiste già una chiave GPG pubblica con lo stesso ID. +gpg_no_key_email_found=Questa chiave GPG non è utilizzabile con nessun indirizzo email associato al tuo account. subkeys=Sottochiavi key_id=ID chiave key_name=Nome della Chiave key_content=Contenuto +add_key_success=La chiave SSH '%s' è stata aggiunta. +add_gpg_key_success=La chiave GPG %s' è stata aggiunta. +delete_key=Rimuovi +ssh_key_deletion=Rimuovi chiave SSH +gpg_key_deletion=Rimuovi chiave GPG +ssh_key_deletion_desc=Rimuovere una chiave SSH ne revoca l'accesso al tuo account. Continuare? +gpg_key_deletion_desc=La rimozione di una chiave GPG invalida i commits firmati da essa. Continuare? +ssh_key_deletion_success=La chiave SSH è stata rimossa. +gpg_key_deletion_success=La chiave GPG è stata rimossa. add_on=Aggiunto il valid_until=Valido fino al valid_forever=Valido per sempre @@ -220,100 +427,219 @@ key_state_desc=Questa chiave è stata utilizzata negli ultimi 7 giorni token_state_desc=Questo token è stato utilizzato negli ultimi 7 giorni show_openid=Mostra nel profilo hide_openid=Nascondi dal profilo +ssh_disabled=SSH disabilitato manage_social=Gestisci gli Account Sociali Associati +social_desc=Questi account sociali sono collegati al tuo account Gitea. Assicurati di riconoscerli tutti in quanto possono essere usati per effettuare il login con il tuo account Gitea. +unbind=Rimuovi il collegamento +unbind_success=L'account sociale è stato scollegato dal tuo account Gitea. +manage_access_token=Gestisci i tokens di accesso generate_new_token=Genera Nuovo Token +tokens_desc=Questi tokens garantiscono l'accesso al tuo account utilizzando l'API di Gitea. +new_token_desc=Le applicazioni che utilizzano un token hanno accesso completo al tuo account. token_name=Nome Token generate_token=Genera Token +generate_token_success=Il nuovo token è stato generato. Copia ora in quanto non verrà mostrato nuovamente. delete_token=Elimina +access_token_deletion=Elimina token di accesso +access_token_deletion_desc=Eliminare un token revocherà l'accesso al tuo account alle applicazioni che lo utilizzano. Continuare? +delete_token_success=Il token è stato eliminato. Le applicazioni che lo utilizzavano non hanno più accesso al tuo account. +twofa_desc=L'autenticazione a due fattori migliora la sicurezza del tuo account. +twofa_is_enrolled=La verifica in due passaggi è attualmente abilitata sul tuo account. +twofa_not_enrolled=La verifica in due passaggi al momento non è abilitata sul tuo account. +twofa_disable=Disattiva la verifica in due passaggi +twofa_scratch_token_regenerate=Rigenera il token di sicurezza +twofa_scratch_token_regenerated=Ora il tuo token di sicurezza è %s. Conservalo in un posto sicuro. +twofa_enroll=Iscriviti alla verifica in due passaggi +twofa_disable_note=Se necessario, è possibile disattivare la verifica in due passaggi. +twofa_disable_desc=Disattivare la verifica in due passaggi renderà il tuo account meno sicuro. Continuare? +regenerate_scratch_token_desc=Se hai smarrito il tuo token di sicurezza o lo hai già utilizzato per effettuare il login è possibile resettarlo qui. twofa_disabled=L'autenticazione a due fattori è stata disattivata. +scan_this_image=Scannerizza questa immagine con l'applicazione di autenticazione: or_enter_secret=O immettere il segreto: %s +then_enter_passcode=E immetti il codice di accesso indicato nell'applicazione: +passcode_invalid=Il codice di accesso non è corretto. Riprova. +twofa_enrolled=Il tuo account è stato registrato alla verifica in due passaggi. Conserva il token di sicurezza (%s) in un luogo sicuro in quanto viene visualizzato sono una volta! +u2f_desc=Le chiavi di sicurezza sono dispositivi hardware contenenti chiavi crittografiche. Potrebbero essere usate per la verifica in due passaggi. +La chiave di sicurezza deve supportare lo standard FIDO U2F. +u2f_require_twofa=La verifica in due passaggi deve essere attiva per poter utilizzare le chiavi di protezione. +u2f_register_key=Aggiungi chiave di sicurezza +u2f_nickname=Nickname +u2f_press_button=Premi il pulsante sulla tua chiave di sicurezza per registrarla. +u2f_delete_key=Rimuovi chiave di sicurezza +u2f_delete_key_desc=Se si rimuove una chiave di sicurezza non sarà più possibile effettuare l'accesso con essa. Sei sicuro? +manage_account_links=Gestisci gli account collegati +manage_account_links_desc=Questi account esterni sono collegati al tuo account Gitea. +account_links_not_available=Attualmente non è collegato alcun account esterno al tuo account Gitea. +remove_account_link=Rimuovi account collegato +remove_account_link_desc=Rimuovere un account collegato ne revoca l'accesso al tuo account Gitea. Continuare? +remove_account_link_success=L'account collegato è stato rimosso. +orgs_none=Non sei membro di alcuna organizzazione. repos_none=Non possiedi alcun repository delete_account=Elimina Account +delete_prompt=Questa operazione eliminerà permanentemente il tuo account utente. NON PUÒ essere annullata. confirm_delete_account=Conferma Eliminazione +delete_account_title=Elimina account utente +delete_account_desc=Sei sicuro di voler rimuovere questo account utente permanentemente? [repo] owner=Proprietario repo_name=Nome Repository +repo_name_helper=Un buon nome per un repository è costituito da parole chiave corte, facili da ricordare e uniche. visibility=Visibilità +visiblity_helper=Rendi il repository privato +visiblity_helper_forced=L'amministratore del sito impone che le nuove repositories siano private. +visiblity_fork_helper=(Questa modifica avrà effetto su tutti i fork) +clone_helper=Hai bisogno di aiuto per la clonazione? Visita Aiuto. fork_repo=Forka Repository fork_from=Forka da +fork_visiblity_helper=La visibilità di un repository forkato non può essere modificata. repo_desc=Descrizione repo_lang=Lingua +repo_gitignore_helper=Seleziona i templates di .gitignore. license=Licenza +license_helper=Seleziona un file di licenza. +readme=LEGGIMI +readme_helper=Seleziona un template per il file LEGGIMI. +auto_init=Inizializza Repository (Aggiungi .gitignore, Licenza e LEGGIMI) create_repo=Crea Repository default_branch=Ramo (Branch) predefinito mirror_prune=Rimuovi +mirror_prune_desc=Rimuovi i riferimenti di puntamento-remoto obsoleti +mirror_interval=Intervallo di aggiornamento dei mirror (le unità di tempo valide sono 'h', 'm', 's') +mirror_interval_invalid=L'intervallo di aggiornamento dei mirror non è valido. +mirror_address=Clona da URL +mirror_address_desc=Includere eventuali credenziali di autorizzazione necessarie nell'URL. +mirror_last_synced=Ultima sincronizzazione watchers=Osservatori stargazers=Fan forks=Fork +pick_reaction=Scegli la tua reazione reactions_more=e %d più form.reach_limit_of_creation=Hai già raggiunto il tuo limite %d repository. +form.name_reserved=Il nome repository '%s' è riservato. +form.name_pattern_not_allowed=Il modello '%s' non è consentito come nome di un repository. +need_auth=Autorizzazione clone migrate_type=Tipo di migrazione migrate_type_helper=Questo repository sarà un mirror migrate_repo=Migra Repository +migrate.clone_address=Migra / Clona da URL +migrate.clone_address_desc=URL HTTP (S) o Git 'clone' di un repository esistente +migrate.clone_local_path=o un percorso del server locale migrate.permission_denied=Non è consentito importare repository locali. +migrate.invalid_local_path=Percorso locale non valido, non esiste o non è una cartella. migrate.failed=Migrazione non riuscita: %v +migrate.lfs_mirror_unsupported=La duplicazione di oggetti LFS non è supportata - usa ' git lfs fetch --all e 'git lfs push --all' invece. mirror_from=mirror da forked_from=forkato da +fork_from_self=Non puoi forkare il tuo stesso repository. copy_link=Copia +copy_link_success=Il link è stato copiato +copy_link_error=Premere ⌘-C o Ctrl-C per copiare copied=OK copiato unwatch=Non seguire più watch=Segui unstar=Togli il voto star=Vota fork=Forka +download_archive=Scarica Repository no_desc=Nessuna descrizione quick_guide=Guida rapida clone_this_repo=Clona questo repository +create_new_repo_command=Creazione di un nuovo repository da riga di comando +push_exist_repo=Push di un repository esistente da riga di comando +bare_message=Questo repository non contiene alcun contenuto. code=Codice +code.desc=Accedi al codice sorgente, file, commits e branches. branch=Ramo (Branch) tree=Albero (Tree) filter_branch_and_tag=Filtra per branch o tag branches=Rami (Branch) tags=Tag issues=Problemi +pulls=Pull Requests labels=Etichette milestones=Traguardi commits=Commit +commit=Commit releases=Rilasci file_raw=Originale file_history=Cronologia file_view_raw=Vedi originale +file_permalink=Permalink +file_too_large=Il file è troppo grande per essere visualizzato. +video_not_supported_in_browser=Il tuo browser non supporta i tag "video" di HTML5. +stored_lfs=Memorizzati con Git LFS +commit_graph=Grafico dei commit +editor.new_file=Nuovo file +editor.upload_file=Carica File +editor.edit_file=Modifica File editor.preview_changes=Anteprima modifiche +editor.cannot_edit_non_text_files=I file binari non possono essere modificati tramite interfaccia web. +editor.edit_this_file=Modifica file +editor.must_be_on_a_branch=È necessario essere in un branch per eseguire o proporre modifiche su questo file. +editor.fork_before_edit=È necessario forkare questo repository per eseguire o proporre modifiche su questo file. +editor.delete_this_file=Elimina file +editor.must_have_write_access=È necessaria l'autorizzazione di scrittura per eseguire o proporre modifiche su questo file. +editor.file_delete_success=Il file '%s' è stato eliminato. +editor.name_your_file=Dai un nome al file… +editor.filename_help=Aggiungi una directory digitando il suo nome nome seguito da il carattere slash ('/'). Rimuovi una directory digitando backspace all'inizio del campo di input. editor.or=o +editor.cancel_lower=Annulla editor.commit_changes=Apporta le modifiche editor.add_tmpl=Aggiungi '%s/' editor.add=Aggiungi '%s' editor.update=Aggiornare '%s' editor.delete=Eliminare '%s' +editor.commit_message_desc=Aggiungi una descrizione estesa facoltativa… editor.commit_directly_to_this_branch=Impegnarsi direttamente con il %s branch. editor.create_new_branch=Creare un nuovo branch per questo commit e inizia una pull request. +editor.new_branch_name_desc=Nome del nuovo branch… editor.cancel=Cancellare +editor.filename_cannot_be_empty=Il nome del file non può essere vuoto. editor.branch_already_exists=Il branch '%s' esiste già in questo repository. +editor.directory_is_a_file=Il nome di directory '%s' è già utilizzato come nome di un file in questo repository. +editor.file_is_a_symlink='%s' è un collegamento simbolico. I collegamenti simbolici non possono essere modificati nell'editor web +editor.filename_is_a_directory=Il nome di file '%s' è già utilizzato come nome di una directory in questo repository. +editor.file_editing_no_longer_exists=Il file in fase di modifica, '%s', non esiste più in questo repository. +editor.file_changed_while_editing=I contenuti di questo file hanno subito dei cambiamento da quando hai iniziato la modifica. Clicca qui per visualizzarli o Committa nuovemente i Cambiamenti per sovrascriverli. +editor.file_already_exists=Un file di nome '%s' esiste già in questo repository. editor.no_changes_to_show=Non ci sono cambiamenti da mostrare. editor.fail_to_update_file=Errore durante l'aggiornamento/ creazione del file '%s' con errore: %v +editor.add_subdir=Aggiungi una directory… editor.unable_to_upload_files=Impossibile caricare i file su '%s' con errore:%v +editor.upload_files_to_dir=Carica file su '%s' +editor.cannot_commit_to_protected_branch=Impossibile eseguire un commit sul branch protetto '%s'. +commits.desc=Sfoglia la cronologia di modifiche del codice rogente. +commits.commits=Commit +commits.search=Ricerca commits… +commits.find=Cerca +commits.search_all=Tutti i branch commits.author=Autore commits.message=Messaggio commits.date=Data commits.older=Più vecchio commits.newer=Più recente +commits.signed_by=Firmato da +commits.gpg_key_id=ID Chiave GPG +ext_issues=Issue esterne +ext_issues.desc=Collegamento al puntatore di una issue esterna. +issues.desc=Organizza le segnalazioni di bug, attività e pietre miliari. issues.new=Nuovo Problema issues.new.labels=Etichette issues.new.no_label=Nessuna etichetta @@ -323,14 +649,39 @@ issues.new.no_milestone=Nessuna milestone issues.new.clear_milestone=Milestone pulita issues.new.open_milestone=Apri Milestone issues.new.closed_milestone=Milestone chiuse +issues.new.assignees=Assegnatari +issues.new.clear_assignees=Cancella assegnatari +issues.new.no_assignees=Nessuno assegnato +issues.no_ref=Nessun Branch/Tag specificato issues.create=Crea Problema issues.new_label=Nuova etichetta +issues.new_label_placeholder=Nome etichetta +issues.new_label_desc_placeholder=Descrizione issues.create_label=Crea Etichetta +issues.label_templates.title=Carica un set predefinito di etichette +issues.label_templates.info=Non esistono etichette. Crea una etichetta con 'Nuova Etichetta' o usa un set predefinito di etichette: +issues.label_templates.helper=Scegli un set di etichette +issues.label_templates.use=Usa Set Etichette +issues.label_templates.fail_to_load_file=Impossibile caricare il file template di etichetta '%s': %v +issues.add_label_at=aggiunta l'etichetta
%s
%s +issues.remove_label_at=rimossa l'etichetta
%s
%s +issues.add_milestone_at=`aggiunta alle pietre miliari %s %s` +issues.change_milestone_at=`pietra miliare modificata da %s a %s %s` +issues.remove_milestone_at=`rimossa dalle pietre miliari %s %s` +issues.deleted_milestone='(rimosso)' +issues.self_assign_at=`%s auto-assegnato` +issues.add_assignee_at=`è stato assegnato da %s %s` +issues.remove_assignee_at=`rimossa la loro assegnazione %s` +issues.change_title_at=' titolo modificato da %s a %s %s ' +issues.delete_branch_at=`branch %s eliminato %s` issues.open_tab=%d Aperti issues.close_tab=%d Chiusi issues.filter_label=Etichetta +issues.filter_label_no_select=Tutte le etichette issues.filter_milestone=Traguardo +issues.filter_milestone_no_select=Tutte le pietre miliari issues.filter_assignee=Assegnatario +issues.filter_assginee_no_select=Tutte le assegnazioni issues.filter_type=Tipo issues.filter_type.all_issues=Tutti i problemi issues.filter_type.assigned_to_you=Assegnati a te @@ -343,6 +694,10 @@ issues.filter_sort.recentupdate=Aggiornati di recente issues.filter_sort.leastupdate=Aggiornati tempo fa issues.filter_sort.mostcomment=I più commentati issues.filter_sort.leastcomment=I meno commentati +issues.filter_sort.moststars=Più favoriti +issues.filter_sort.feweststars=Meno favoriti +issues.filter_sort.mostforks=Maggior numero di fork +issues.filter_sort.fewestforks=Minor numero di fork issues.action_open=Aperto issues.action_close=Chiuso issues.action_label=Etichetta @@ -357,40 +712,108 @@ issues.next=Pagina successiva issues.open_title=Aperto issues.closed_title=Chiuso issues.num_comments=%d commenti +issues.commented_at=`%s ha commentato` +issues.delete_comment_confirm=Sei sicuro/a di voler eliminare questo commento? issues.no_content=Non ci sono ancora contenuti. issues.close_issue=Chiudi +issues.close_comment_issue=Commenta e Chiudi issues.reopen_issue=Riapri +issues.reopen_comment_issue=Commenta e Riapri issues.create_comment=Commento issues.closed_at=`chiuso %[2]s` issues.reopened_at=`riaperto %[2]s` +issues.commit_ref_at=`ha fatto riferimento a questa issue dal commit %[2]s` issues.poster=Autore issues.collaborator=Collaboratori issues.owner=Proprietario +issues.sign_in_require_desc=Effettua l'accesso per partecipare alla conversazione. issues.edit=Modifica issues.cancel=Annulla issues.save=Salva issues.label_title=Nome etichetta +issues.label_description=Descrizione etichetta issues.label_color=Colore etichetta issues.label_count=%d etichette issues.label_open_issues=%d problemi aperti issues.label_edit=Modifica issues.label_delete=Elimina +issues.label_modify=Modifica Etichetta +issues.label_deletion=Elimina Etichetta +issues.label_deletion_desc=Eliminare un'etichetta la rimuove da tutte le issue. Continuare? +issues.label_deletion_success=L'etichetta è stata eliminata. +issues.label.filter_sort.alphabetically=In ordine alfabetico +issues.label.filter_sort.reverse_alphabetically=In ordine alfabetico inverso +issues.label.filter_sort.by_size=Dimensione +issues.label.filter_sort.reverse_by_size=Inverti dimensione issues.num_participants=%d Partecipanti +issues.attachment.open_tab=`Clicca per vedere "%s" in una nuova scheda` +issues.attachment.download=`Clicca qui per scaricare "%s"` +issues.subscribe=Iscriviti +issues.unsubscribe=Annulla iscrizione +issues.tracker=Cronografo +issues.start_tracking_short=Inizio +issues.start_tracking=Avvia cronografo +issues.start_tracking_history='ha iniziato a lavorare %s` +issues.tracking_already_started=`Hai già avviato il cronografo su questa issue!` +issues.stop_tracking=Interrompi +issues.stop_tracking_history=`ha smesso di funzionare %s` +issues.add_time=Aggiungi Tempo manualmente +issues.add_time_short=Aggiungi tempo +issues.add_time_cancel=Annulla +issues.add_time_history=`aggiunto tempo trascorso %s` +issues.add_time_hours=Ore +issues.add_time_minutes=Minuti +issues.add_time_sum_to_small=Non è stato inserito alcun tempo. +issues.cancel_tracking=Annulla +issues.cancel_tracking_history=`ha cancellato il cronografo %s` +issues.time_spent_total=Tempo totale trascorso +issues.time_spent_from_all_authors=`Totale tempo trascorso: %s` +issues.due_date=Data di scadenza +issues.invalid_due_date_format=Il formato della data di scadenza deve essere 'yyyy-mm-dd'. +issues.error_modifying_due_date=Impossibile modificare la data di scadenza. +issues.error_removing_due_date=Impossibile rimuovere la data di scadenza. +issues.due_date_form=yyyy-mm-dd +issues.due_date_form_add=Aggiungi data di scadenza +issues.due_date_form_update=Aggiorna data di scadenza +issues.due_date_form_remove=Rimuovi data di scadenza +issues.due_date_not_writer=E' necessario l'accesso di scrittura del repository per aggiornare la data di una sua issue. +issues.due_date_not_set=Nessuna data di scadenza impostata. +issues.due_date_added=la data di scadenza %s è stata aggiunta %s +issues.due_date_modified=data di scadenza modificata da %s a %s %s +issues.due_date_remove=rimossa la data di scadenza %s %s +issues.due_date_overdue=Scaduto +pulls.desc=Attiva le richieste di merge e le recensioni di codice. pulls.new=Nuova Pull Request +pulls.compare_changes=Nuova Pull Request +pulls.compare_changes_desc=Selezione il branch su cui eseguire il merge e il branch da cui eseguire il pull. +pulls.compare_base=unisci a +pulls.compare_compare=esegui un pull da pulls.filter_branch=Filtra branch pulls.no_results=Nessun risultato trovato. +pulls.nothing_to_compare=Questi rami sono uguali. Non c'è alcuna necessità di creare una pull request. +pulls.has_pull_request=`Una pull request tra questi rami già esiste: %[2]s#%[3]d` pulls.create=Crea Pull Request pulls.title_desc=vorrebbe unire %[1]d commit da %[2]s a %[3]s pulls.merged_title_desc=ha unito %[1]d commit da %[2]s a %[3]s %[4]s pulls.tab_conversation=Conversazione pulls.tab_commits=Commit +pulls.tab_files=File modificati pulls.reopen_to_merge=Riapri questa pull request per effettuare l'unione. pulls.merged=Unito +pulls.has_merged=La pull request è stata unita. +pulls.data_broken=Questa pull request è rovinata a causa di informazioni mancanti del fork. +pulls.is_checking=Verifica dei conflitti di merge in corso. Riprova tra qualche istante. pulls.can_auto_merge_desc=La pull request non può essere mergiata automaticamente. +pulls.cannot_auto_merge_desc=Questa pull request non può essere unita automaticamente a causa di conflitti. +pulls.cannot_auto_merge_helper=Unire manualmente per risolvere i conflitti. +pulls.no_merge_desc=Questa pull request non può essere unita perché tutte le opzioni di merge del repository sono disattivate. +pulls.no_merge_helper=Attiva le opzioni di merge nelle impostazioni del repository o unisci la pull request manualmente. pulls.merge_pull_request=Unisci Pull Request pulls.rebase_merge_pull_request=Fai rebase e unisci pulls.squash_merge_pull_request=Fai squash e unisci +pulls.invalid_merge_option=Non puoi utilizzare questa opzione di merge per questa pull request. +pulls.open_unmerged_pull_exists=`Non è possibile riaprire questa pull request perché ne esiste un'altra (#%d) con proprietà identiche.` milestones.new=Nuova Milestone milestones.open_tab=%d Aperti @@ -399,73 +822,297 @@ milestones.closed=Chiuso %s milestones.no_due_date=Nessuna data di scadenza milestones.open=Apri milestones.close=Chiudi +milestones.new_subheader=Le pietre miliari organizzano le issue e tengono conto del progresso. milestones.create=Crea Milestone milestones.title=Titolo milestones.desc=Descrizione milestones.due_date=Data di scadenza (opzionale) milestones.clear=Pulisci +milestones.invalid_due_date_format=Il formato della data di scadenza deve essere 'yyyy-mm-dd'. +milestones.create_success=La pietra miliare '%s' è stata creata. milestones.edit=Modifica Milestone +milestones.edit_subheader=Le pietre miliari organizzano le issue e tengono conto del progresso. milestones.cancel=Annulla +milestones.modify=Aggiorna pietra miliare +milestones.edit_success=La pietra miliare '%s' è stata aggiornata. +milestones.deletion=Elimina pietra miliare +milestones.deletion_desc=Eliminare una pietra miliare la rimuove da tutte le relative issue. Continuare? +milestones.deletion_success=La pietra miliare è stata eliminata. +milestones.filter_sort.closest_due_date=Data di scadenza più vicina +milestones.filter_sort.furthest_due_date=Data di scadenza più lontana +milestones.filter_sort.least_complete=Meno completato +milestones.filter_sort.most_complete=Più completato +milestones.filter_sort.most_issues=Più problemi +milestones.filter_sort.least_issues=Meno problemi +ext_wiki=Wiki esterna +ext_wiki.desc=Collegamento a una wiki esterna. +wiki=Wiki +wiki.welcome=Benvenuti nella Wiki. +wiki.welcome_desc=La wiki ti permette di scrivere e condividere documentazione con i collaboratori. +wiki.desc=Scrivi e condividi documentazione con i collaboratori. +wiki.create_first_page=Crea la prima pagina wiki.page=Pagina wiki.filter_page=Filtra pagina +wiki.new_page=Pagina +wiki.default_commit_message=Scrivi una nota riguardo l'aggiornamento di questa pagina (opzionale). wiki.save_page=Salva pagina wiki.last_commit_info=%s ha modificato questa pagina %s wiki.edit_page_button=Modifica wiki.new_page_button=Nuova pagina wiki.delete_page_button=Cancella Pagina +wiki.delete_page_notice_1=Eliminare la pagina wiki '%s' è una operazione che non può essere annullata. Continuare? wiki.page_already_exists=Esiste già una pagina Wiki con questo stesso nome. +wiki.reserved_page=Il nome della pagina wiki '%s' è riservato. wiki.pages=Pagine wiki.last_updated=Ultimo aggiornamento: %s +activity=Attività +activity.period.filter_label=Periodo: +activity.period.daily=1 giorno +activity.period.halfweekly=3 giorni +activity.period.weekly=1 settimana +activity.period.monthly=1 mese +activity.overview=Riepilogo +activity.active_prs_count_1=%d Pull Request attiva +activity.active_prs_count_n=%d Pull Request attive activity.merged_prs_count_1=Pull Request Unita activity.merged_prs_count_n=Pull request unite +activity.opened_prs_count_1=Pull Request proposta +activity.opened_prs_count_n=Pull Request proposte +activity.title.user_1=%d utente +activity.title.user_n=%d utenti +activity.title.prs_1=%d Pull request +activity.title.prs_n=%d Pull request activity.title.prs_merged_by=%s unita da %s +activity.title.prs_opened_by=%s proposta da %s activity.merged_prs_label=Unite +activity.opened_prs_label=Proposta +activity.active_issues_count_1=%d Issue attiva +activity.active_issues_count_n=%d Issue attive +activity.closed_issues_count_1=Issue chiusa +activity.closed_issues_count_n=Issue chiuse +activity.title.issues_1=%d Issue +activity.title.issues_n=%d Issue +activity.title.issues_closed_by=%s chiusa da %s +activity.title.issues_created_by=%s creata da %s +activity.closed_issue_label=Chiusa +activity.new_issues_count_1=Nuova issue +activity.new_issues_count_n=Nuove issue +activity.new_issue_label=Aperta +activity.title.unresolved_conv_1=%d Conversazione non risolta +activity.title.unresolved_conv_n=%d Conversazioni non risolte +activity.unresolved_conv_desc=Queste issue e pull request cambiate di recente non sono ancora state risolte. +activity.unresolved_conv_label=Aperta +activity.title.releases_1=%d Release +activity.title.releases_n=%d Release +activity.title.releases_published_by=%s pubblicata da %s +activity.published_release_label=Pubblicata +search=Ricerca +search.search_repo=Ricerca repository +search.results=Risultati della ricerca per "%s" in %s settings=Impostazioni +settings.desc=Impostazioni ti permette di gestire le impostazioni del repository +settings.options=Repository +settings.collaboration=Collaboratori +settings.collaboration.admin=Amministratore +settings.collaboration.write=Scrittura +settings.collaboration.read=Lettura +settings.collaboration.undefined=Non definito +settings.hooks=Webhooks +settings.githooks=Git Hooks settings.basic_settings=Impostazioni di Base +settings.mirror_settings=Impostazioni di mirror +settings.sync_mirror=Sincronizza ora +settings.mirror_sync_in_progress=Sincronizzazione del mirror in corso. Torna tra qualche minuto. +settings.site=Sito web settings.update_settings=Aggiorna Impostazioni settings.advanced_settings=Opzioni avanzate +settings.wiki_desc=Abilita Wiki Repository +settings.use_internal_wiki=Utilizza la wiki incorporata +settings.use_external_wiki=Usa Wiki esterna settings.external_wiki_url=URL Wiki esterno +settings.external_wiki_url_error=L'URL della wiki esterna non è un URL valido. +settings.external_wiki_url_desc=I visitatori verranno reindirizzati all'URL della wiki esterna cliccando sulla scheda di wiki. +settings.issues_desc=Abilità il tracciatore delle issue del repository +settings.use_internal_issue_tracker=Usa il tracciatore di issue incorporato +settings.use_external_issue_tracker=Usa un tracciatore di issue esterno +settings.external_tracker_url=URL del tracciatore di issue esterno +settings.external_tracker_url_error=L'URL del tracciatore di issue esterno non è un URL valido. +settings.external_tracker_url_desc=I visitatori verranno reindirizzati all'URL del tracciatore di issue esterno cliccando sulla scheda delle issue. settings.tracker_url_format=Formato URL Gestore Problemi Esterno +settings.tracker_issue_style=Formato numerico del tracciatore di issue esterno +settings.tracker_issue_style.numeric=Numerico +settings.tracker_issue_style.alphanumeric=Alfanumerico +settings.tracker_url_format_desc=Usa i segnaposto {user}, {repo} e {index} per il nome utente, il nome del repository e l'indice delle issue. +settings.enable_timetracker=Abilita il cronografo +settings.allow_only_contributors_to_track_time=Consenti soltanto ai contributori di utilizzare il cronografo +settings.pulls_desc=Abilita le pull request del repository +settings.pulls.ignore_whitespace=Ignora gli spazi bianchi per evitare conflitti +settings.pulls.allow_merge_commits=Abilita il merging dei commit +settings.pulls.allow_rebase_merge=Abilita l'unione dei commit mediante riassegnazione +settings.pulls.allow_squash_commits=Abilita lo Squashing per unire i commits via merge +settings.admin_settings=Impostazioni amministratore +settings.admin_enable_health_check=Abilita verifica dell'integrità del repository (git fsck) settings.danger_zone=Zona Pericolosa settings.new_owner_has_same_repo=Il nuovo proprietario ha già un repository con lo stesso nome. Per favore scegli un altro nome. +settings.convert=Converti in un repository regolare +settings.convert_desc=È possibile convertire questo mirror in un repository regolare. Questa operazione non può essere annullata. +settings.convert_notices_1=- Questa operazione convertirà questo mirror in una repository regolare e non potrà essere annullata. +settings.convert_confirm=Converti Repository +settings.convert_succeed=Il mirror è stato convertito in un repository regolare. settings.transfer=Trasferisci proprietà +settings.transfer_desc=Trasferisci questo repository a un altro utente o a un'organizzazione nella quale hai diritti d'amministratore. +settings.transfer_notices_1=-Si perderà l'accesso al repository se lo si trasferisce ad un utente singolo. +settings.transfer_notices_2=-Si manterrà l'accesso al repository se si trasferisce in un'organizzazione che possiedi (o condividi con qualcun'altro). +settings.transfer_form_title=Inserisci il nome del repository come conferma: +settings.wiki_delete=Elimina dati Wiki +settings.wiki_delete_desc=L'eliminazione dei dati della wiki del repository è permanente e non può essere annullata. +settings.wiki_delete_notices_1=-Questa operazione eliminerà permanentemente e disabiliterà la wiki repository per %s. +settings.confirm_wiki_delete=Elimina dati Wiki +settings.wiki_deletion_success=I dati della repository wiki sono stati eliminati. settings.delete=Elimina questo repository +settings.delete_desc=L'eliminazione di un repository è un'operazione permanente e non può essere annullata. settings.delete_notices_1=-Questa operazione NON PUÒ essere annullata. +settings.delete_notices_2=-Questa operazione eliminerà definitivamente il repository %s inclusi codice, issue, commenti, dati wiki e impostazioni collaboratore. +settings.delete_notices_fork_1=-I fork di questo repository diventeranno indipendenti dopo la cancellazione. +settings.deletion_success=Il repository è stato eliminato. +settings.update_settings_success=Le impostazioni del repository sono state aggiornate. settings.transfer_owner=Nuovo Proprietario +settings.make_transfer=Esegui trasferimento +settings.transfer_succeed=Il repository è stato trasferito. +settings.confirm_delete=Elimina repository +settings.add_collaborator=Aggiungi collaboratore +settings.add_collaborator_success=Il collaboratore è stato aggiunto. +settings.delete_collaborator=Rimuovi +settings.collaborator_deletion=Rimuovi collaboratore +settings.collaborator_deletion_desc=Rimuovere un collaboratore revocherà l'accesso a questo repository. Continuare? +settings.remove_collaborator_success=Il collaboratore è stato rimosso. +settings.search_user_placeholder=Ricerca utente… +settings.org_not_allowed_to_be_collaborator=Le organizzazioni non possono essere aggiunte come un collaboratore. +settings.user_is_org_member=L'utente è un membro di organizzazione che non può essere aggiunto come un collaboratore. settings.add_webhook=Aggiungi Webhook +settings.hooks_desc=I Webhook effettuano automaticamente richieste HTTP POST ad un server quando si verificano determinati eventi Gitea. Per saperne di più leggi la guida ai webhooks. +settings.webhook_deletion=Rimuovi Webhook +settings.webhook_deletion_desc=Rimuovere un webhook rimuove le sue impostazioni e la sua cronologia di consegna. Continuare? +settings.webhook_deletion_success=Il webhook è stato rimosso. settings.webhook.test_delivery=Test di consegna +settings.webhook.test_delivery_desc=Prova questo webhook con un evento falso. +settings.webhook.test_delivery_success=Un evento falso è stato aggiunto alla coda di consegna. Potrebbe richiedere qualche secondo prima che appaia nella cronologia di consegna. settings.webhook.request=Richiesta settings.webhook.response=Risposta +settings.webhook.headers=Intestazioni +settings.webhook.payload=Contenuto +settings.webhook.body=Corpo +settings.githooks_desc=Gli Hooks di Git sono una funzionalità di Git stesso. Puoi modificare i file degli hooks supportati nell'elenco qui sotto per compiere azioni personalizzate. settings.githook_edit_desc=Se l'hook è inattivo, sarà presentato un contenuto esempio. Lasciando il contenuto vuoto disattiverai questo hook. settings.githook_name=Nome hook settings.githook_content=Contenuto hook settings.update_githook=Aggiorna Hook +settings.add_webhook_desc=Gitea enverra des requêtes POST avec un type de contenu donné à l'URL cible. Apprenez-en plus dans le guide webhooks. +settings.payload_url=URL di destinazione +settings.content_type=Tipo di contenuto POST +settings.secret=Segreto settings.slack_username=Nome utente settings.slack_icon_url=URL icona +settings.discord_username=Nome utente +settings.discord_icon_url=URL icona settings.slack_color=Colore +settings.event_desc=Attivato su: +settings.event_push_only=Pusha eventi +settings.event_send_everything=Tutti gli eventi +settings.event_choose=Eventi personalizzati… settings.event_create=Crea +settings.event_create_desc=Branch o tag creato. +settings.event_delete=Elimina +settings.event_delete_desc=Branch o tag eliminato +settings.event_fork=Fork +settings.event_fork_desc=Repository forkato +settings.event_issues=Issues +settings.event_issues_desc=Issue aperta, chiusa, riaperta, modificata, assegnata, non assegnata, etichetta aggiornata, etichetta cancellata, con pietra miliare o senza pietra miliare. +settings.event_issue_comment=Commento Issue +settings.event_issue_comment_desc=Commento issue creato, modificato o rimosso. +settings.event_release=Release +settings.event_release_desc=Release pubblicata, aggiornata o rimossa in una repository. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull request aperta, chiusa, riaperta, modificata, assegnata, non assegnata, etichetta aggiornata, etichetta cancellata o sincronizzata. +settings.event_push=Push +settings.event_push_desc=Git push in un repository. +settings.event_repository=Repository +settings.event_repository_desc=Repository creato o eliminato. +settings.active=Includi dettagli evento +settings.active_helper=Aggiunge alle richieste informazioni riguardo la causa. +settings.add_hook_success=Il webhook è stato aggiunto. settings.update_webhook=Aggiorna Webhook +settings.update_hook_success=Il webhook è stato aggiornato. +settings.delete_webhook=Rimuovi Webhook settings.recent_deliveries=Recenti Deliveries settings.hook_type=Tipo di Hook +settings.add_slack_hook_desc=Integra Slack nel tuo repository. +settings.slack_token=Gettone settings.slack_domain=Dominio settings.slack_channel=Canale +settings.add_discord_hook_desc=Integra Discord nel tuo repository. +settings.add_dingtalk_hook_desc=Integra Dingtalk nel tuo repository. settings.deploy_keys=Dispiega Chiavi settings.add_deploy_key=Aggiungi Deploy Key +settings.deploy_key_desc=Le deploy key possiedono l'accesso solamente alla lettura di un repository. +settings.is_writable=Abilita accesso scrittura +settings.is_writable_info=Permetti a questa deploy key di pushare nella repository. +settings.no_deploy_keys=Non sono ancora presenti deploy key. settings.title=Titolo settings.deploy_key_content=Contenuto +settings.key_been_used=Una deploy key con contenuto identico è già in uso. +settings.key_name_used=Esiste già una deploy key con questo nome. +settings.add_key_success=La deploy key '%s' è stata aggiunta. +settings.deploy_key_deletion=Rimuovi deploy key +settings.deploy_key_deletion_desc=Rimuovere una chiave di distribuzione ne revocherà l'accesso a questo repository. Continuare? +settings.deploy_key_deletion_success=La chiave di distribuzione è stata rimossa. +settings.branches=Branches +settings.protected_branch=Protezione branch +settings.protected_branch_can_push=Consentire push? +settings.protected_branch_can_push_yes=Puoi pushare +settings.protected_branch_can_push_no=Non puoi pushare +settings.branch_protection=Protezione branch per il branch '%s' +settings.protect_this_branch=Attiva protezione branch +settings.protect_this_branch_desc=Impedisci l'eliminazione e disabilita i push forzati di Git nel branch. +settings.protect_whitelist_committers=Attiva la whitelist per i push +settings.protect_whitelist_committers_desc=Consenti agli utenti o ai team nella whitelist di ignorare le restrizioni di push. +settings.protect_whitelist_users=Utenti nella whitelist per pushare: +settings.protect_whitelist_search_users=Cerca utenti… +settings.protect_whitelist_teams=Team nella whitelist per pushare: +settings.protect_whitelist_search_teams=Ricerca team… +settings.protect_merge_whitelist_committers=Attiva la whitelist per i merge +settings.protect_merge_whitelist_committers_desc=Consentire soltanto agli utenti o ai team in whitelist il permesso di unire le pull request di questo branch. +settings.protect_merge_whitelist_users=Utenti nella whitelist per il merging: +settings.protect_merge_whitelist_teams=Team nella whitelist per il merging: +settings.add_protected_branch=Attiva protezione +settings.delete_protected_branch=Disattiva protezione +settings.update_protect_branch_success=La protezione branch per il branch '%s' è stata aggiornata. +settings.remove_protected_branch_success=La protezione branch per il branch '%s' è stata disattivata. +settings.protected_branch_deletion=Disattiva protezione branch +settings.protected_branch_deletion_desc=Disattivare la protezione branch permette agli utenti con permesso di scrittura di pushare sul branch. Continuare? +settings.default_branch_desc=Seleziona un branch del repository predefinito per le pull request ed i commit di codice: +settings.choose_branch=Scegli un branch… +settings.no_protected_branch=Non ci sono branch protetti. diff.browse_source=Sfoglia il codice sorgente +diff.parent=parent +diff.commit=commit +diff.data_not_available=Dati Diff non disponibili diff.show_diff_stats=Mostra Diff Stats diff.show_split_view=Visualizzazione separata diff.show_unified_view=Visualizzazione unificata diff.stats_desc=%d ha cambiato i file con %d aggiunte e %d eliminazioni +diff.bin=BIN diff.view_file=Vedi File +diff.file_suppressed=File diff soppresso perché troppo grande +diff.too_many_files=Dato che sono stati cambiati molti file in questo diff, alcuni di essi non verranno mostrati +releases.desc=Tenere traccia di versioni e download del progetto. release.releases=Rilasci release.new_release=Nuovo Rilascio release.draft=Bozza @@ -474,42 +1121,102 @@ release.stable=Stabile release.edit=modifica release.ahead=%d commits da %s da questo rilascio release.source_code=Codice Sorgente +release.new_subheader=Le release organizzano le versioni del progetto. +release.edit_subheader=Le release organizzano le versioni del progetto. release.tag_name=Nome tag release.target=Obbiettivo +release.tag_helper=Scegli un tag esistente o crea un nuovo tag. release.title=Titolo release.content=Contenuto release.write=Scrivi release.preview=Anteprima +release.loading=Caricamento… +release.prerelease_desc=Contrassegna come pre-release +release.prerelease_helper=Contrassegna questa release come inadatta per l'uso di produzione. release.cancel=Annulla release.publish=Pubblica Rilascio release.save_draft=Salva Bozza +release.edit_release=Aggiorna release +release.delete_release=Elimina release +release.deletion=Elimina release +release.deletion_desc=Eliminare una release rimuove il suo tag Git dal repository. Il contenuto e la cronologia del repository rimarranno invariati. Continuare? +release.deletion_success=La release è stata eliminata. +release.tag_name_already_exist=Una release con questo nome tag esiste già. +release.tag_name_invalid=Il nome tag non è valido. release.downloads=Download +branch.name=Nome branch +branch.search=Cerca branch +branch.already_exists=Un branch di nome '%s' esiste già. +branch.delete_head=Elimina +branch.delete=Elimina branch '%s' +branch.delete_html=Elimina branch +branch.delete_desc=L'eliminazione di un branch è definitiva. E' un'operazione che NON PUÒ essere annullata. Continuare? +branch.deletion_success=Il branch '%s' è stato eliminato. +branch.deletion_failed=Impossibile eliminare il branch '%s'. +branch.delete_branch_has_new_commits=Il branch '%s' non può essere eliminato perché sono stati aggiunti nuovi commit dopo il merging. +branch.create_branch=Crea branch %s +branch.create_from=da '%s' +branch.create_success=Il branch '%s' è stato creato. +branch.branch_already_exists=Il branch '%s' esiste già in questo repository. +branch.branch_name_conflict=Il nome del branch '%s' è in conflitto con il branch già esistente '%s'. +branch.tag_collision=Il branch '%s' non può essere creato in quanto esiste già un tag con lo stesso nome in questo repository. +branch.deleted_by=Eliminato da %s +branch.restore_success=Il branch '%s' è stato ripristinato. +branch.restore_failed=Impossibile ripristinare il branch '%s '. +branch.protected_deletion_failed=Il branch '%s' è protetto. Non può essere eliminato. +topic.manage_topics=Gestisci argomenti +topic.done=Fatto +topic.count_prompt=Non puoi selezione più di 25 argomenti +topic.format_prompt=Gli argomenti devono iniziare con una lettera o un numero, possono includere il carattere hiphens(-) e non possono essere più lunghi di 35 caratteri [org] org_name_holder=Nome dell'Organizzazione org_full_name_holder=Nome completo dell'organizzazione +org_name_helper=I nomi delle organizzazioni devono essere brevi e semplici da ricordare. create_org=Crea Organizzazione repo_updated=Aggiornato people=Utenti teams=Team lower_members=membri lower_repositories=repository +create_new_team=Nuovo Team +create_team=Crea Team org_desc=Descrizione team_name=Nome Team team_desc=Descrizione +team_name_helper=I nomi dei team devono essere brevi e semplici da ricordare. +team_desc_helper=Descrivi lo scopo o il ruolo del team. +team_permission_desc=Autorizzazione +team_unit_desc=Consentire l'accesso a sezioni di Repository +form.name_reserved=Il nome dell'organizzazione '%s' è riservato. +form.name_pattern_not_allowed=Il modello '%s' non è consentito come nome di una organizzazione. +form.create_org_not_allowed=Non disponi dell'autorizzazione per creare un organizzazione. settings=Impostazioni +settings.options=Organizzazione settings.full_name=Nome Completo settings.website=Sito Web settings.location=Residenza settings.update_settings=Aggiorna Impostazioni +settings.update_setting_success=Le impostazioni dell'organizzazione sono state aggiornate. +settings.change_orgname_prompt=Nota: cambiare il nome dell'organizzazione cambia anche il relativo URL. +settings.update_avatar_success=L'avatar dell'organizzazione è stato aggiornato. settings.delete=Elimina organizzazione settings.delete_account=Elimina questa organizzazione +settings.delete_prompt=L'organizzazione verrà rimossa definitivamente. Questa operazione NON PUÒ essere annullata! settings.confirm_delete_account=Conferma Eliminazione +settings.delete_org_title=Elimina organizzazione +settings.delete_org_desc=Questa organizzazione verrà eliminata definitivamente. Continuare? +settings.hooks_desc=Aggiungi i webhooks che verranno attivati per tutti i repository sotto questa organizzazione. +members.membership_visibility=Visibilità appartenenza: +members.public=Visibile +members.public_helper=nascondi +members.private=Nascosto +members.private_helper=rendi visibile members.member_role=Ruolo del membro: members.owner=Proprietario members.member=Membro @@ -521,21 +1228,36 @@ members.invite_now=Invita ora teams.join=Iscriviti teams.leave=Abbandona teams.read_access=Accesso di Lettura +teams.read_access_helper=I membri possono visualizzare e clonare i repository del team. teams.write_access=Accesso di Scrittura +teams.write_access_helper=I membri possono leggere e pushare sui repository del team. +teams.admin_access=Accesso amministratore +teams.admin_access_helper=I membri possono pullare e pushare sulle repository del team e anche aggiungere collaboratori. teams.no_desc=Questo team non ha alcuna descrizione teams.settings=Impostazioni +teams.owners_permission_desc=I proprietari hanno pieno accesso a tutti i repository e hanno diritti di amministratore nell'organizzazione. teams.members=Membri del Team teams.update_settings=Aggiorna Impostazioni +teams.delete_team=Elimina team teams.add_team_member=Aggiungi un Membro al Team +teams.delete_team_title=Elimina team +teams.delete_team_desc=Eliminare un team revocherà l'accesso al repository da parte dei suoi membri. Continuare? +teams.delete_team_success=Il team è stato eliminato. +teams.read_permission_desc=Questo team concede l'accesso di lettura: i membri possono visualizzare e clonare i repository del team. +teams.write_permission_desc=Questo team concede l'accesso di Scrittura: i membri possono leggere da e pushare sui repository del team. +teams.admin_permission_desc=Questo team concede l'accesso di Amministratore: i membri possono leggere da, pushare su e aggiungere collaboratori ai repository del team. teams.repositories=Repository di Squadra +teams.search_repo_placeholder=Ricerca repository… teams.add_team_repository=Aggiungere Repository di Squadra teams.remove_repo=Rimuovi teams.add_nonexistent_repo=Il repository che stai tentando di aggiungere non esiste, crealo prima. [admin] dashboard=Pannello di Controllo +users=Account utenti organizations=Organizzazioni repositories=Repository +authentication=Fonti di autenticazione config=Configurazione notices=Avvisi di sistema monitor=Monitoraggio @@ -543,16 +1265,41 @@ first_page=Prima last_page=Ultima total=Totale: %d +dashboard.statistic=Riepilogo +dashboard.operations=Operazioni di manutenzione +dashboard.system_status=Stato del sistema +dashboard.statistic_info=Il database di Gitea contiene %d utenti, %d organizzazioni, %d chiavi pubbliche, %d repository, %d visualizzazioni, %d voti, %d azioni, %d accessi, %d issue, %d commenti, %d account social, %d follow, %d mirror, %d release, %d fonti di autenticazione, %d webhook, %d pietre miliari, %d etichette, %d richieste di hook, %d team, %d richieste di aggiornamento, %d allegati. dashboard.operation_name=Nome Operazione dashboard.operation_switch=Cambia dashboard.operation_run=Esegui +dashboard.clean_unbind_oauth=Elimina connessione OAuth slegate +dashboard.clean_unbind_oauth_success=Tutte le connessione OAuth slegate sono state eliminate. dashboard.delete_inactivate_accounts=Elimina tutti gli account inattivi +dashboard.delete_inactivate_accounts_success=Tutti gli account inattivi sono stati eliminati. +dashboard.delete_repo_archives=Elimina tutti gli archivi dei repository +dashboard.delete_repo_archives_success=Tutti gli archivi del repository sono stati eliminati. +dashboard.delete_missing_repos=Elimina tutti i repository mancanti dei loro file Git +dashboard.delete_missing_repos_success=Tutti i repository ai quali mancavano i file Git sono stati eliminati. +dashboard.git_gc_repos=Esegui la garbage collection su tutti i repository +dashboard.git_gc_repos_success=Tutti i repository hanno terminato l'operazione di garbage collection. +dashboard.resync_all_sshkeys=Aggiorna il file '.ssh/authorized_keys' con le chiavi SSH di Gitea. (Non è necessario per il server SSH incorporato) +dashboard.resync_all_sshkeys_success=Le chiavi SSH pubbliche controllate da Gitea sono state aggiornate. +dashboard.resync_all_hooks=Sincronizza nuovamente gli hook di pre-ricezione, di aggiornamento e di post-ricezione di tutti i repository. +dashboard.resync_all_hooks_success=Tutti gli hook di pre-ricezione, di aggiornamento e di post-ricezione sono stati sincronizzati. +dashboard.reinit_missing_repos=Reinizializza tutti i repository Git mancanti per i quali esistono cambiamenti registrati esistenti +dashboard.reinit_missing_repos_success=Tutti i repository Git mancanti per i quali esistono cambiamenti registrati esistenti sono stati reinizializzati. +dashboard.sync_external_users=Sincronizza dati utente esterno +dashboard.sync_external_users_started=La sincronizzazione dei dati utente esterno è iniziata. +dashboard.git_fsck=Esegui controlli di integrità su tutti i repository +dashboard.git_fsck_started=La verifica di integrità dei repository è iniziata. dashboard.server_uptime=Tempo in Attività del Server dashboard.current_goroutine=Goroutine Correnti dashboard.current_memory_usage=Utilizzo di Memoria Corrente dashboard.total_memory_allocated=Memoria Allocata Totale dashboard.memory_obtained=Memoria Ottenuta dashboard.pointer_lookup_times=Ricerche del Puntatore +dashboard.memory_allocate_times=Allocazioni di memoria +dashboard.memory_free_times=Rilasci di memoria dashboard.current_heap_usage=Utilizzo Heap Corrente dashboard.heap_memory_obtained=Memoria Heap Ottenuta dashboard.heap_memory_idle=Memoria Heap Inattiva @@ -575,57 +1322,148 @@ dashboard.total_gc_pause=Pausa Totale della GC dashboard.last_gc_pause=Ultima pausa della GC dashboard.gc_times=Esecuzioni GC +users.user_manage_panel=Gestione account utente +users.new_account=Crea account utente +users.name=Nome utente users.activated=Attivato users.admin=Amministratore users.repos=Repo users.created=Creato +users.last_login=Ultimo accesso +users.never_login=Mai effettuato l'accesso +users.send_register_notify=Invia notifica di registrazione utente +users.new_success=L'account utente '%s' è stato creato. users.edit=Modifica +users.auth_source=Fonte di autenticazione users.local=Locale +users.auth_login_name=Nome utente per l'autenticazione +users.password_helper=Lascia la password vuota per non modificarla. +users.update_profile_success=L'account utente è stato aggiornato. +users.edit_account=Modifica account utente +users.max_repo_creation=Numero massimo di repository +users.max_repo_creation_desc=(Inserire -1 per utilizzare il limite predefinito globale.) +users.is_activated=Account utente attivato +users.prohibit_login=Disattiva login +users.is_admin=È amministratore +users.allow_git_hook=Può creare Git Hook +users.allow_import_local=Può importare repository locali +users.allow_create_organization=Può creare organizzazioni +users.update_profile=Aggiorna account utente +users.delete_account=Elimina account utente +users.still_own_repo=Questo utente possiede ancora una o più repository. Eliminare o trasferire questi repository prima di continuare. +users.still_has_org=Questo utente è membro di un'organizzazione. Rimuovi l'utente da tutte le organizzazioni prima di proseguire. +users.deletion_success=L'account utente è stato eliminato. +orgs.org_manage_panel=Gestione Organizzazione orgs.name=Nome orgs.teams=Team orgs.members=Membri +orgs.new_orga=Nuova Organizzazione +repos.repo_manage_panel=Gestione Repository repos.owner=Proprietario repos.name=Nome repos.private=Privati repos.watches=Segue repos.stars=Voti +repos.forks=Fork repos.issues=Problemi +repos.size=Dimensione +auths.auth_manage_panel=Gestione fonti di autenticazione +auths.new=Aggiungi fonte di autenticazione auths.name=Nome auths.type=Tipo auths.enabled=Attivo +auths.syncenabled=Abilita sincronizzazione utenti auths.updated=Aggiornato auths.auth_type=Tipo di autenticazione auths.auth_name=Nome di autenticazione +auths.security_protocol=Protocollo di sicurezza auths.domain=Dominio +auths.host=Host auths.port=Porta auths.bind_dn=Binda DN auths.bind_password=Binda Password +auths.bind_password_helper=Attenzione: La password è memorizzata in testo normale. Se possibile, utilizzare un account di sola lettura. +auths.user_base=Base ricerca utente auths.user_dn=DN dell'utente +auths.attribute_username=Attributo nome utente +auths.attribute_username_placeholder=Lasciare vuoto per utilizzare il nome utente inserito in Gitea. +auths.attribute_name=Attributo nome +auths.attribute_surname=Attributo cognome +auths.attribute_mail=Attributo email +auths.attribute_ssh_public_key=Attributo chiave SSH pubblica +auths.attributes_in_bind=Estrai Attributi dal Contesto Bind DN +auths.use_paged_search=Utilizza ricerca per pagina +auths.search_page_size=Dimensioni pagina auths.filter=Fitro utente auths.admin_filter=Filtro Amministratore +auths.ms_ad_sa=Attributi di ricerca AD MS auths.smtp_auth=Tipo di autenticazione SMTP auths.smtphost=Host SMTP auths.smtpport=Porta SMTP auths.allowed_domains=Domini consentiti +auths.allowed_domains_helper=Lasciare vuoto per ammettere tutti i domini. Separare più domini con una virgola (','). auths.enable_tls=Abilitare Crittografia TLS auths.skip_tls_verify=Salta verifica TLS auths.pam_service_name=Nome del Servizio PAM +auths.oauth2_provider=OAuth2 Provider +auths.oauth2_clientID=ID Client (Chiave) +auths.oauth2_clientSecret=Segreto del client +auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery URL +auths.oauth2_use_custom_url=Utilizzare URL personalizzati anziché URL predefiniti +auths.oauth2_tokenURL=URL token +auths.oauth2_authURL=Autorizza URL +auths.oauth2_profileURL=URL profilo +auths.oauth2_emailURL=URL email auths.enable_auto_register=Abilitare Registrazione Automatica 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.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.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.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/ +auths.tip.openid_connect=Utilizza l'OpenID Connect Discovery URL (/.well-known/openid-configuration) per specificare gli endpoint +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.edit=Modifica fonte di autenticazione +auths.activated=Questa fonte di autenticazione è attiva +auths.new_success=L'autenticazione '%s' è stata aggiunta. +auths.update_success=La fonte d'autenticazione è stata aggiornata. +auths.update=Aggiorna fonte di autenticazione +auths.delete=Elimina fonte di autenticazione +auths.delete_auth_title=Elimina fonte di autenticazione +auths.delete_auth_desc=L'eliminazione di una fonte di autenticazione impedisce agli utenti di utilizzarla per accedere. Continuare? +auths.still_in_used=La fonte di autenticazione è ancora in uso. Convertire o eliminare gli utenti che utilizzano questa fonte di autenticazione prima di continuare. +auths.deletion_success=La fonte d'autenticazione è stata eliminata. +auths.login_source_exist=La fonte di autenticazione '%s' esiste già. config.server_config=Configurazione Server +config.app_name=Titolo del Sito +config.app_ver=Versione Gitea +config.app_url=URL di base di Gitea +config.custom_conf=Percorso file di configurazione +config.domain=Dominio Server SSH +config.offline_mode=Modalità locale config.disable_router_log=Disattivare Log del Router +config.run_user=Esegui come Nome utente config.run_mode=Modalità Esecuzione +config.git_version=Versione Git config.repo_root_path=Percorso radice del Repository +config.lfs_root_path=Percorso file LFS config.static_file_root_path=Percorso Root del File Statico +config.log_file_root_path=Percorso dei log config.script_type=Tipo di Script config.reverse_auth_user=Autenticazione Utente Inversa config.ssh_config=Configurazione SSH config.ssh_enabled=Attivo +config.ssh_start_builtin_server=Usa il server integrato +config.ssh_domain=Dominio Server config.ssh_port=Porta config.ssh_listen_port=Porta in ascolto config.ssh_root_path=Percorso Root @@ -636,23 +1474,49 @@ config.ssh_minimum_key_sizes=Dimensioni minime della chiave config.db_config=Configurazione Database config.db_type=Tipo +config.db_host=Host config.db_name=Nome +config.db_user=Nome utente +config.db_ssl_mode=SSL config.db_path=Percorso config.service_config=Configurazione Servizio +config.register_email_confirm=Richiedere la conferma Email per registrarsi +config.disable_register=Disattiva Self-Registration +config.allow_only_external_registration=Attiva la registrazione solo tramite servizi esterni +config.enable_openid_signup=Attiva OpenID Self-Registration +config.enable_openid_signin=Attiva l'accesso tramite OpenID config.show_registration_button=Mostra Pulsane Registrazione +config.require_sign_in_view=Richiedi l'accesso per visualizzare le pagine +config.mail_notify=Attila le notifiche Email config.disable_key_size_check=Disabilita controllo sulle dimensioni minime della chiave +config.enable_captcha=Attiva CAPTCHA config.active_code_lives=Attiva Vita del Codice +config.reset_password_code_lives=Resetta il tempo di scadenza del codice password +config.default_keep_email_private=Nascondi Indirizzo Email di Default +config.default_allow_create_organization=Consenti la Creazione di Organizzazioni di Default +config.enable_timetracking=Abilita il cronografo +config.default_enable_timetracking=Attiva il cronografo di Default +config.default_allow_only_contributors_to_track_time=Consenti soltanto ai contributori di utilizzare il cronografo +config.no_reply_address=Dominio email nascosto config.webhook_config=Configurazione Webhook config.queue_length=Lunghezza della coda config.deliver_timeout=Tempo Limite di Consegna +config.skip_tls_verify=Salta autenticazione TLS +config.mailer_config=Configurazione Mailer SMTP config.mailer_enabled=Attivo config.mailer_disable_helo=Disattiva HELO config.mailer_name=Nome config.mailer_host=Host config.mailer_user=Utente +config.mailer_use_sendmail=Utilizza Sendmail +config.mailer_sendmail_path=Percorso Sendmail +config.mailer_sendmail_args=Argomenti aggiuntivi per Sendmail +config.send_test_mail=Invia email di prova +config.test_mail_failed=Impossibile inviare mail di prova a '%s': %v +config.test_mail_sent=Una mail di prova è stata inviata a '%s'. config.oauth_config=Configurazione OAuth config.oauth_enabled=Attivo @@ -672,15 +1536,22 @@ config.session_life_time=Durata Sessione config.https_only=Solo HTTPS config.cookie_life_time=Durata Cookie +config.picture_config=Configurazione Immagine profilo e Avatar config.picture_service=Servizio foto config.disable_gravatar=Disabilita Gravatar +config.enable_federated_avatar=Attiva i Federated Avatar +config.git_config=Configurazione Git +config.git_disable_diff_highlight=Disattiva evidenziatore Diff Syntax config.git_max_diff_lines=Numero massimo di righe di diff (per singolo file) config.git_max_diff_line_characters=Numero massimo di caratteri di diff (per singola riga) config.git_max_diff_files=Numero massimo di file diff mostrati config.git_gc_args=Parametri GC config.git_migrate_timeout=Timeout per la migrazione config.git_mirror_timeout=Timeout per l'aggiornamento del mirror +config.git_clone_timeout=Tempo limite operazione di clone +config.git_pull_timeout=Tempo limite operazione di pull +config.git_gc_timeout=Timeout operazione GC config.log_config=Configurazione Log config.log_mode=Modalità Log @@ -690,12 +1561,14 @@ monitor.name=Nome monitor.schedule=Agenda monitor.next=La Prossima Volta monitor.previous=La Scorsa Volta +monitor.execute_times=Esecuzioni monitor.process=Processi in Esecuzione monitor.desc=Descrizione monitor.start=Orario Avvio monitor.execute_time=Tempo di Esecuzione notices.system_notice_list=Avvisi di Sistema +notices.view_detail_header=Visualizza dettagli dell'avviso notices.actions=Azioni notices.select_all=Seleziona tutto notices.deselect_all=Deseleziona tutto @@ -703,7 +1576,10 @@ notices.inverse_selection=Inverti selezione notices.delete_selected=Elimina selezionati notices.delete_all=Elimina tutti gli avvisi notices.type=Tipo +notices.type_1=Repository notices.desc=Descrizione +notices.op=Op. +notices.delete_success=Gli avvisi di sistema sono stati eliminati. [action] create_repo=ha creato il repository %s @@ -746,17 +1622,31 @@ raw_seconds=secondi raw_minutes=minuti [dropzone] +default_message=Trascina i file o clicca qui per caricare. +invalid_input_type=Non è possibile caricare file di questo tipo. file_too_big=La dimensione del file ({{filesize}} MB) supera la dimensione massima ({{maxFilesize}} MB). remove_file=Rimuovi file [notification] notifications=Notifiche +unread=Non lette +read=Lette +no_unread=Nessuna notifica da leggere. +no_read=Nessuna notifica letta. +pin=Appunta notifica mark_as_read=Segna come letto mark_as_unread=Segna come non letto mark_all_as_read=Segna tutti come letti [gpg] +error.extract_sign=Impossibile ricavare la firma +error.generate_hash=Impossibile generare hash del commit +error.no_committer_account=Nessun account collegato all'indirizzo email del committer error.no_gpg_keys_found=Non sono state trovate chiavi note per questa firma nel database +error.not_signed_commit=Commit non firmato +error.failed_retrieval_gpg_keys=Impossibile recuperare le chiavi associate all'account del committer [units] +error.no_unit_allowed_repo=Non possiedi il permesso di accedere ad alcuna sezione di questo repository. +error.unit_not_allowed=Non possiedi il permesso di accedere a questa sezione di repository. From 3089833167f172da574e3b2fada1fd4244ded704 Mon Sep 17 00:00:00 2001 From: Guilhem Marion Date: Mon, 2 Jul 2018 14:42:28 +0200 Subject: [PATCH 64/86] Update TRANSLATORS (#4349) --- options/locale/TRANSLATORS | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/TRANSLATORS b/options/locale/TRANSLATORS index ed04c22d1..02b9858ad 100644 --- a/options/locale/TRANSLATORS +++ b/options/locale/TRANSLATORS @@ -27,6 +27,7 @@ Enrico Testori hypertesto AT gmail DOT com Ezequiel Gonzalez Rial Gabriel Dugny Gregor Santner +Guilhem Marion Halil Kaya Hamid Feizabadi Hilton Wichwski Silva From 69796ddd64b89de066952ea19b6332f51bbf3f81 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 2 Jul 2018 12:43:33 +0000 Subject: [PATCH 65/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 97 +++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index ca3d703f1..435321648 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -347,6 +347,8 @@ issues.create_label=Skapa Etikett issues.label_templates.title=Ladda en fördefinierad uppsättning etiketter issues.label_templates.helper=Markera en uppsättning etiketter issues.label_templates.fail_to_load_file=Laddning av etikettmallen '%s' misslyckades: %v +issues.add_label_at=lade till etiketten
%s
%s +issues.remove_label_at=tog bort etiketten
%s
%s issues.add_milestone_at=`lade till denna till milstolpe %s %s` issues.change_milestone_at='modifierade milstolpen från %s till %s %s' issues.remove_milestone_at='tog bort denna från milstolpen %s %s' @@ -420,8 +422,15 @@ issues.subscribe=Prenumerera issues.unsubscribe=Avsluta prenumerationen issues.start_tracking_short=Starta issues.start_tracking_history=`började arbeta %s` +issues.tracking_already_started=`Du har redan påbörjat tidredovisning på detta ärende!` +issues.stop_tracking=Stoppa +issues.stop_tracking_history=`slutade arbeta %s` +issues.add_time_cancel=Avbryt +issues.add_time_history=`la till tillbringad tid %s` issues.add_time_hours=Timmar issues.add_time_minutes=Minuter +issues.cancel_tracking=Avfärda +issues.cancel_tracking_history=”avbröt tidredovisning %s' pulls.new=Ny Pull-Förfrågan pulls.filter_branch=Filtrera gren @@ -431,9 +440,12 @@ pulls.title_desc=vill sammanfoga %[1]d incheckningar från s[2]s in pulls.merged_title_desc=sammanfogade %[1]d incheckningar från %[2]s in i %[3]s %[4]s pulls.tab_conversation=Konversation pulls.tab_commits=Incheckningar +pulls.reopen_to_merge=Vänligen återöppna denna Pull-förfrågan igen för att utföra sammanfogningen. pulls.merged=Sammanfogat pulls.can_auto_merge_desc=Denna pull-förfrågan kan sammanfogas automatiskt. pulls.merge_pull_request=Sammanfoga Pull-förfrågan +pulls.rebase_merge_pull_request=Rebase och sammanfogning +pulls.squash_merge_pull_request=Squasha och sammanfogning milestones.new=Ny milstolpe milestones.open_tab=%d Öppna @@ -470,14 +482,27 @@ wiki.page_already_exists=Wiki-sida med samma namn finns redan. wiki.pages=Sidor wiki.last_updated=Senast uppdaterad %s +activity=Aktiviteter activity.period.filter_label=Period: activity.period.daily=1 dag activity.period.halfweekly=3 dagar activity.period.weekly=1 vecka activity.period.monthly=1 månad activity.overview=Översikt +activity.active_prs_count_1=%d Aktiv Pull begäran +activity.active_prs_count_n=%d Aktiva Pull begärelser +activity.merged_prs_count_1=Sammanfogad Pull-förfrågan +activity.merged_prs_count_n=Sammanfogade Pull-förfrågningar +activity.opened_prs_count_1=Föreslagen Pull begäran +activity.opened_prs_count_n=Föreslagna Pull-begärelser activity.title.user_1=%d användare activity.title.user_n=%d användare +activity.title.prs_1=%d Pull-begäran +activity.title.prs_n=%d Pull begärelser +activity.title.prs_merged_by=%s sammanfogad av %s +activity.title.prs_opened_by=%s föreslås av %s +activity.merged_prs_label=Sammanfogad +activity.opened_prs_label=Föreslagen activity.active_issues_count_1=%d Aktivt ärende activity.active_issues_count_n=%d Aktiva ärenden activity.closed_issues_count_1=Stängt ärende @@ -488,9 +513,20 @@ activity.title.issues_closed_by=%s stängd av %s activity.title.issues_created_by=%s skapad av %s activity.closed_issue_label=Stängd activity.new_issues_count_1=Nytt ärende +activity.new_issues_count_n=Nya ärenden +activity.new_issue_label=Öppnad +activity.unresolved_conv_label=Öppna +activity.title.releases_1=%d release +activity.title.releases_n=%d releaser +activity.title.releases_published_by=%s publicerad av %s +activity.published_release_label=Publicerad +search=Sök +search.search_repo=Sök utvecklingskatalog +search.results=Sökresultat för ”%s” i %s settings=Inställningar +settings.desc=Inställningarna är där du kan hantera inställningar för utvecklingskatalogen settings.collaboration.write=Skriva settings.collaboration.read=Läsa settings.collaboration.undefined=Odefinierad @@ -541,10 +577,18 @@ settings.deploy_keys=Driftsättningsnycklar settings.add_deploy_key=Lägg till driftsättningsnyckel settings.title=Titel settings.deploy_key_content=Innehåll +settings.branches=Brancher +settings.protected_branch=Branchskydd +settings.protected_branch_can_push=Tillåt push? +settings.protected_branch_can_push_yes=Du kan pusha +settings.protected_branch_can_push_no=Du kan inte pusha +settings.add_protected_branch=Aktivera skydd +settings.delete_protected_branch=Inaktivera skydd diff.browse_source=Bläddra i källkod diff.parent=förälder diff.commit=incheckning +diff.data_not_available=Diff Content ej tillgänglig diff.show_diff_stats=Visa Diff Statistik diff.show_split_view=Delad Vy diff.show_unified_view=Unifierad Vy @@ -571,8 +615,16 @@ release.preview=Förhandsgranska release.cancel=Avbryt release.publish=Publicera Släpp release.save_draft=Spara Utkast +release.deletion_success=Releasen har blivit raderad. release.downloads=Nedladdningar +branch.search=Sök brancher +branch.delete_head=Radera +branch.delete_html=Radera branch +branch.create_branch=Skapa branchen %s +branch.create_from=från '%s' +branch.branch_already_exists=Branch '%s' existerar redan i denna utvecklingskatalog. +branch.deleted_by=Raderad av %s [org] @@ -598,6 +650,7 @@ settings.update_setting_success=Organisationsinställningarna har uppdaterats. settings.delete=Tag bort organisation settings.delete_account=Tag bort denna organisation settings.confirm_delete_account=Bekräfta borttagning +settings.hooks_desc=Lägg till webbhook som triggas för alla utvecklingskataloger under denna organisationen. members.membership_visibility=Synlighet för medlemskap: members.member_role=Medlemsroll: @@ -617,6 +670,7 @@ teams.settings=Inställningar teams.members=Teammedlemmar teams.update_settings=Uppdatera inställningar teams.add_team_member=Lägg till teammedlem +teams.delete_team_success=Teamet har blivit borttaget. teams.repositories=Teamförråd teams.add_team_repository=Lägg till teamförråd teams.remove_repo=Ta bort @@ -636,7 +690,13 @@ total=Totalt: %d dashboard.operation_name=Operationsnamn dashboard.operation_switch=Byt till dashboard.operation_run=Kör +dashboard.clean_unbind_oauth=Rena obundna OAuth anslutningar +dashboard.clean_unbind_oauth_success=Alla obundna OAuth anslutningar har raderats. dashboard.delete_inactivate_accounts=Ta bort alla inaktiva konton +dashboard.delete_inactivate_accounts_success=Alla inaktiva konton har tagits bort. +dashboard.reinit_missing_repos=Återinitialisera alla saknade utvecklingskataloger som vi känner till +dashboard.reinit_missing_repos_success=Alla utvecklingskataloger som det saknades filer från har blivit återinitaliserade. +dashboard.sync_external_users=Synkronisera extern användardata dashboard.server_uptime=Serverns upptid dashboard.current_goroutine=Aktuella Goroutiner dashboard.current_memory_usage=Nuvarande Minnesanvändning @@ -655,6 +715,7 @@ dashboard.mspan_structures_usage=MSpan strukturanvändning dashboard.mspan_structures_obtained=MSpan strukturer som erhållits dashboard.mcache_structures_usage=MCache strukturanvändning dashboard.mcache_structures_obtained=MCache-strukturer som erhållits +dashboard.profiling_bucket_hash_table_obtained=Profilering av Bucket Hash Table erhållen dashboard.gc_metadata_obtained=Metainformation om Skräpsamlaren Ihopsamlad dashboard.other_system_allocation_obtained=Övriga Systemallokeringar dashboard.next_gc_recycle=Nästa Skräpsamlarrunda @@ -677,6 +738,7 @@ orgs.name=Namn orgs.teams=Team orgs.members=Medlemmar +repos.repo_manage_panel=Utvecklingskatalogshantering repos.owner=Ägare repos.name=Namn repos.private=Privat @@ -694,11 +756,14 @@ auths.auth_name=Autentiseringsnamn auths.security_protocol=Säkerhetsprotokoll auths.domain=Domän auths.host=Värd +auths.port=Port +auths.bind_dn=Bind DN auths.bind_password=Bind Lösenord auths.user_base=Användarsökbas auths.user_dn=Användarnas DN auths.filter=Användarfilter auths.admin_filter=Administratörsfilter +auths.ms_ad_sa=MS AD sökattribut auths.smtp_auth=SMTP Autentiseringstyp auths.smtphost=SMTP-server auths.smtpport=SMTP-port @@ -706,26 +771,41 @@ auths.allowed_domains=Tillåtna Domäner auths.enable_tls=Aktivera TLS-kryptering auths.skip_tls_verify=Skippa verifikation av TLS auths.pam_service_name=PAM Tjänstnamn +auths.oauth2_provider=OAuth2 leverantör +auths.oauth2_clientID=Klient ID (Nyckel) +auths.oauth2_clientSecret=Klienthemlighet +auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery länk +auths.oauth2_tokenURL=Tokenlänk +auths.oauth2_authURL=Auktoriseringslänk auths.oauth2_profileURL=Profil-URL auths.oauth2_emailURL=E-post URL auths.enable_auto_register=Aktivera Automatisk Registrering +auths.tips=Tips +auths.tips.oauth2.general=OAuth2 Autensiering +auths.tips.oauth2.general.tip=När man registrerar en ny OAuth2-autentisering, så skall callback/redirect-länken vara: /user/oauth2//callback +auths.tip.oauth2_provider=OAuth2 leverantör auths.tip.dropbox=Skapa en ny applikation på https://www.dropbox.com/developers/apps auths.tip.facebook=Registrera en ny appliaktion på https://developers.facebook.com/apps och lägg till produkten ”Facebook-inloggning” auths.tip.github=Registrera en ny OAuth applikation på https://github.com/settings/applications/new auths.tip.gitlab=Registrera en ny applikation på https://gitlab.com/profile/applications +auths.tip.openid_connect=Använd OpenID Connect Discovery länken (/.well-known/openid-configuration) för att ange slutpunkterna auths.new_success=Autentisering '%s' har lagts till. +auths.delete_auth_title=Tag bort denna autentisering config.server_config=Server-konfiguration config.custom_conf=Konfigurationsfil config.disable_router_log=Avaktivera Router Loggning config.run_mode=Exekveringsläge +config.git_version=Git version config.repo_root_path=Rotsökväg för utvecklingskatalog config.lfs_root_path=LFS Rotsökväg config.static_file_root_path=Rotsökväg för Statiska Filer config.script_type=Script-typ +config.reverse_auth_user=Motsatt autentiserings användare config.ssh_config=SSH-konfiguration config.ssh_enabled=Aktiverad +config.ssh_port=Port config.ssh_listen_port=Lyssningsport config.ssh_root_path=Rotsökväg config.ssh_key_test_path=Testsökväg för nyckel @@ -743,16 +823,20 @@ config.service_config=Tjänstkonfiguration config.show_registration_button=Visa registreringsknapp config.disable_key_size_check=Avaktivera kontroll av minsta tillåtna nyckelstorlek config.active_code_lives=Aktivera livstid för koder +config.reset_password_code_lives=Återställ giltighetstid för passerkod config.webhook_config=Webbkrokskonfiguration config.queue_length=Kölängd config.deliver_timeout=Tidsfrist för leverans +config.skip_tls_verify=Skippa TLS verifiering config.mailer_enabled=Aktiverad config.mailer_disable_helo=Avaktivera HELO config.mailer_name=Namn config.mailer_host=Server config.mailer_user=Användare +config.mailer_use_sendmail=Använd Sendmail +config.mailer_sendmail_path=Sendmail sökväg config.oauth_config=OAuth-konfiguration config.oauth_enabled=Aktiverad @@ -777,6 +861,7 @@ config.disable_gravatar=Inaktivera Gravatar config.enable_federated_avatar=Aktivera Förenad Uppslaging av Profilbilder config.git_config=Git-konfiguration +config.git_disable_diff_highlight=Inaktivera Diff Syntax Highlight config.git_max_diff_lines=Max Diff-rader (per fil) config.git_max_diff_line_characters=Max Diff-tecken (per rad) config.git_max_diff_files=Max Diff-filer (att visa) @@ -811,6 +896,8 @@ notices.delete_all=Ta Bort Alla Notiser notices.type=Typ notices.type_1=Utvecklingskatalog notices.desc=Beskrivning +notices.op=Op. +notices.delete_success=Systemnotifikationer har blivit raderade. [action] create_repo=skapade utvecklingskatalog %s @@ -826,11 +913,15 @@ comment_issue=`kommenterade på ärende %s#%[2]s` merge_pull_request=`sammanslog pull-request %s#%[2]s` transfer_repo=överförde utvecklingskalatogen %s till %s push_tag=laddade upp taggen %[2]s till %[3]s +delete_tag=tog bort taggen %[2]s från %[3]s +delete_branch=tog bort branchen %[2]s from %[3]s +compare_commits=Jämför %d commits [tool] ago=%s sedan from_now=%s från och med nu now=nu +future=framtiden 1s=1 sekund 1m=1 minut 1h=1 timme @@ -849,17 +940,23 @@ raw_seconds=sekunder raw_minutes=minuter [dropzone] +file_too_big=Filstorleken ({{filesize}} MB) överskrider maxstorleken ({{maxFilesize}} MB). remove_file=Ta bort fil [notification] notifications=Notiser unread=Olästa read=Lästa +pin=Pinna notifiering mark_as_read=Markera som läst mark_as_unread=Markera som oläst +mark_all_as_read=Markera alla som lästa [gpg] error.extract_sign=Det gick inte att extrahera signatur +error.generate_hash=Misslyckades att generera hashsumma av commiten +error.no_gpg_keys_found=Ingen känd nyckel hittad för denna signaturen i databasen +error.not_signed_commit=Inte en signerad commit [units] From cbee921c28b9299a0f4ee751f8fd55a430b571f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20=22BKC=22=20Carlb=C3=A4cker?= Date: Tue, 3 Jul 2018 05:56:32 +0200 Subject: [PATCH 66/86] Limit uploaded avatar image-size to 4096x3072 by default (#4353) --- custom/conf/app.ini.sample | 4 ++++ models/user.go | 11 +++++++++++ modules/setting/setting.go | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index f823f68e4..774a1df59 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -402,6 +402,10 @@ SESSION_LIFE_TIME = 86400 [picture] AVATAR_UPLOAD_PATH = data/avatars +; Max Width and Height of uploaded avatars. This is to limit the amount of RAM +; used when resizing the image. +AVATAR_MAX_WIDTH = 4096 +AVATAR_MAX_HEIGHT = 3072 ; Chinese users can choose "duoshuo" ; or a custom avatar source, like: http://cn.gravatar.com/avatar/ GRAVATAR_SOURCE = gravatar diff --git a/models/user.go b/models/user.go index 653e99426..5ac865879 100644 --- a/models/user.go +++ b/models/user.go @@ -433,6 +433,17 @@ func (u *User) IsPasswordSet() bool { // UploadAvatar saves custom avatar for user. // FIXME: split uploads to different subdirs in case we have massive users. func (u *User) UploadAvatar(data []byte) error { + imgCfg, _, err := image.DecodeConfig(bytes.NewReader(data)) + if err != nil { + return fmt.Errorf("DecodeConfig: %v", err) + } + if imgCfg.Width > setting.AvatarMaxWidth { + return fmt.Errorf("Image width is to large: %d > %d", imgCfg.Width, setting.AvatarMaxWidth) + } + if imgCfg.Height > setting.AvatarMaxHeight { + return fmt.Errorf("Image height is to large: %d > %d", imgCfg.Height, setting.AvatarMaxHeight) + } + img, _, err := image.Decode(bytes.NewReader(data)) if err != nil { return fmt.Errorf("Decode: %v", err) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index cf9f59853..a5f4457f3 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -341,6 +341,8 @@ var ( // Picture settings AvatarUploadPath string + AvatarMaxWidth int + AvatarMaxHeight int GravatarSource string GravatarSourceURL *url.URL DisableGravatar bool @@ -1024,6 +1026,8 @@ func NewContext() { if !filepath.IsAbs(AvatarUploadPath) { AvatarUploadPath = path.Join(AppWorkPath, AvatarUploadPath) } + AvatarMaxWidth = sec.Key("AVATAR_MAX_WIDTH").MustInt(4096) + AvatarMaxHeight = sec.Key("AVATAR_MAX_HEIGHT").MustInt(3072) switch source := sec.Key("GRAVATAR_SOURCE").MustString("gravatar"); source { case "duoshuo": GravatarSource = "http://gravatar.duoshuo.com/avatar/" From bbf9abde4937285c77154129ae9934b22b4ea7a6 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 3 Jul 2018 03:57:42 +0000 Subject: [PATCH 67/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index dae81d2cc..7db2d2481 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -524,7 +524,7 @@ reactions_more=додати %d більше form.reach_limit_of_creation=Ви досягли максимальної кількості %d створених репозиторіїв. form.name_reserved=Назву репозиторію '%s' зарезервовано. -form.name_pattern_not_allowed=Шаблон '%s' не дозволено в назві сховища. +form.name_pattern_not_allowed=Шаблон '%s' не дозволено в назві репозиторія. need_auth=Клонувати з авторизацією migrate_type=Тип міграції @@ -812,7 +812,7 @@ pulls.merge_pull_request=Об'єднати запит на злиття pulls.rebase_merge_pull_request=Зробити Rebase і злити pulls.squash_merge_pull_request=Об'єднати (Squash) і злити pulls.invalid_merge_option=Цей параметр злиття не можна використовувати для цього Pull Request'а. -pulls.open_unmerged_pull_exists=`Ви не можете знову відкрити, оскільки вже існує запит на злиття (%d) з того ж сховища з тією ж інформацією про злиття і в очікуванні.` +pulls.open_unmerged_pull_exists=`Ви не можете знову відкрити, оскільки вже існує запит на злиття (%d) з того ж репозиторія з тією ж інформацією про злиття і в очікуванні.` milestones.new=Новий етап milestones.open_tab=%d відкрито @@ -914,7 +914,7 @@ search.search_repo=Пошук репозиторію search.results=Результати пошуку для "%s" в %s settings=Налаштування -settings.desc=У налаштуваннях ви можете змінювати різні параметри цього сховища +settings.desc=У налаштуваннях ви можете змінювати різні параметри цього репозиторія settings.options=Репозиторій settings.collaboration=Співавтори settings.collaboration.admin=Адміністратор @@ -965,7 +965,7 @@ settings.convert_confirm=Перетворити репозиторій settings.convert_succeed=Репозиторій успішно перетворений в звичайний. settings.transfer=Передати новому власнику settings.transfer_desc=Передати репозиторій користувачеві або організації, де ви маєте права адміністратора. -settings.transfer_notices_1=- Ви втратите доступ до сховища, якщо ви переведете його окремому користувачеві. +settings.transfer_notices_1=- Ви втратите доступ до репозиторія, якщо ви переведете його окремому користувачеві. settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є. settings.transfer_form_title=Введіть ім'я репозиторія як підтвердження: settings.wiki_delete=Видалити вікі-дані @@ -992,7 +992,7 @@ settings.collaborator_deletion_desc=Цей користувач більше н settings.remove_collaborator_success=Співавтор видалений. settings.search_user_placeholder=Пошук користувача… settings.org_not_allowed_to_be_collaborator=Організації не можуть бути додані як співавтори. -settings.user_is_org_member=Користувач є членом організації, члени якої не можуть бути додані в якості співавтора. +settings.user_is_org_member=Користувач є учасником організації, учасники якої не можуть бути додані в якості співавтора. settings.add_webhook=Додати веб-хук settings.hooks_desc=Webhooks автоматично робить HTTP POST-запити на сервер, коли відбуваються певні події Gitea. Дізнайтеся більше в керівництві веб-вузла . settings.webhook_deletion=Видалити веб-хук @@ -1035,7 +1035,7 @@ settings.event_issues_desc=Проблему відкрито, закрито, п settings.event_issue_comment=Коментар проблеми settings.event_issue_comment_desc=Коментар проблеми створено, видалено чи відредаговано. settings.event_release=Реліз -settings.event_release_desc=Випуск опубліковано, оновлено чи видалено в сховища. +settings.event_release_desc=Реліз опублікований, оновлений або видалений з репозиторія. settings.event_pull_request=Запити до злиття settings.event_pull_request_desc=Запит до злиття відкрито, закрито, перевідкрито, змінено, призначено, знято, мітку оновлено, мітку прибрано або синхронізовано. settings.event_push=Push @@ -1068,7 +1068,7 @@ settings.key_been_used=Вміст ключа розгортання вже ви settings.key_name_used=Ключ розгортання з таким заголовком вже існує. settings.add_key_success=Новий ключ розгортання '%s' успішно доданий. settings.deploy_key_deletion=Видалити ключ для розгортування -settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до сховища з його допомогою. Ви впевнені? +settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до репозиторія з його допомогою. Ви впевнені? settings.deploy_key_deletion_success=Ключі розгортання було видалено. settings.branches=Гілки settings.protected_branch=Захист гілки @@ -1082,19 +1082,19 @@ settings.protect_whitelist_committers=Білий список тих, хто м settings.protect_whitelist_committers_desc=Додати користувачів або команди в білий список гілки. На них не будуть поширюватися звичайні обмеження на push. settings.protect_whitelist_users=Користувачі, які можуть робити push в цю гілку: settings.protect_whitelist_search_users=Пошук користувачів… -settings.protect_whitelist_teams=Команди, члени яких можуть робити push в цю гілку: +settings.protect_whitelist_teams=Команди, учасники яких можуть робити push в цю гілку: settings.protect_whitelist_search_teams=Пошук команд… settings.protect_merge_whitelist_committers=Обмежити право на прийняття Pull Request'ів в цю гілку списком -settings.protect_merge_whitelist_committers_desc=Ви можете додавати користувачів або цілі команди в 'білий' список цієї гілки. Тільки присутні в списку зможуть приймати Pull Request'и. В іншому випадку будь-хто з правами запису до головного сховища буде володіти такою можливістю. +settings.protect_merge_whitelist_committers_desc=Ви можете додавати користувачів або цілі команди в 'білий' список цієї гілки. Тільки присутні в списку зможуть приймати запити на злиття. В іншому випадку будь-хто з правами запису до головного репозиторію буде володіти такою можливістю. settings.protect_merge_whitelist_users=Користувачі з правом на прийняття Pull Request'ів в цю гілку: -settings.protect_merge_whitelist_teams=Команди, члени яких мають право на прийняття Pull Request'ів в цю гілку: +settings.protect_merge_whitelist_teams=Команди, яким дозволено злиття: settings.add_protected_branch=Увімкнути захист settings.delete_protected_branch=Вимкнути захист settings.update_protect_branch_success=Налаштування захисту гілки '%s' були успішно змінені. settings.remove_protected_branch_success=Захист гілки '%s' був успішно відключений. settings.protected_branch_deletion=Відключити захист гілки settings.protected_branch_deletion_desc=Будь-який користувач з дозволами на запис зможе виконувати push в цю гілку. Ви впевнені? -settings.default_branch_desc=Головна гілка є 'базовою' для вашого сховища, на яку за замовчуванням спрямовані всі Pull Request'и і яка є обличчям вашого сховища. Перше, що побачить відвідувач - це вміст головною гілки. Виберіть її з уже існуючих: +settings.default_branch_desc=Головна гілка є 'базовою' для вашого репозиторія, на яку за замовчуванням спрямовані всі запити на злиття і яка є обличчям вашого репозиторія. Перше, що побачить відвідувач - це зміст головної гілки. Виберіть її з уже існуючих: settings.choose_branch=Оберіть гілку… settings.no_protected_branch=Немає захищених гілок. @@ -1138,7 +1138,7 @@ release.save_draft=Зберегти чернетку release.edit_release=Оновити реліз release.delete_release=Видалити реліз release.deletion=Видалити реліз -release.deletion_desc=Видалення релізу видаляє Git-тег зі сховищ. Вміст сховища і історія залишаться незмінними. Продовжити? +release.deletion_desc=Видалення релізу видаляє Git-тег з репозиторіїв. Зміст репозиторія і історія залишаться незмінними. Продовжити? release.deletion_success=Реліз, було видалено. release.tag_name_already_exist=Реліз з цим ім'ям мітки вже існує. release.tag_name_invalid=Неприпустиме ім'я тега. @@ -1240,7 +1240,7 @@ teams.update_settings=Оновити налаштування teams.delete_team=Видалити команду teams.add_team_member=Додати учасника команди teams.delete_team_title=Видалити команду -teams.delete_team_desc=Видалення команди скасовує доступ до сховища для її членів. Продовжити? +teams.delete_team_desc=Видалення команди скасовує доступ до репозиторія для її учасників. Продовжити? teams.delete_team_success=Команду було видалено. teams.read_permission_desc=Ця команда має доступ для читання: учасники можуть переглядати та клонувати репозиторії. teams.write_permission_desc=Ця команда надає доступ на запис: учасники можуть отримувати й виконувати push команди до репозитрію. @@ -1350,7 +1350,7 @@ users.allow_create_organization=Може створювати організац users.update_profile=Оновити обліковий запис users.delete_account=Видалити цей обліковий запис users.still_own_repo=Ваш обліковий запис все ще володіє одним або кількома репозиторіями, спочатку вам потрібно видалити або передати їх. -users.still_has_org=Цей обліковий запис все ще є членом однієї або декількох організацій. Для продовження, покиньте або видаліть організації. +users.still_has_org=Цей обліковий запис все ще є учасником однієї або декількох організацій. Для продовження, покиньте або видаліть організації. users.deletion_success=Обліковий запис користувача було видалено. orgs.org_manage_panel=Керування організаціями From 9c6801c8d4f4ef37d32907d51a2ec164dcc42300 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 3 Jul 2018 15:37:07 -0400 Subject: [PATCH 68/86] Add changelog for 1.5.0-RC1 (#4324) --- CHANGELOG.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b31730a09..e6bd82dbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,54 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). +## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-06-27 +* SECURITY + * Limit uploaded avatar image-size to 4096x3072 by default (#4353) + * Do not allow to reuse TOTP passcode (#3878) +* FEATURE + * Add cli commands to regen hooks & keys (#3979) + * Add support for FIDO U2F (#3971) + * Added user language setting (#3875) + * LDAP Public SSH Keys synchronization (#1844) + * Add topic support (#3711) + * Multiple assignees (#3705) + * Add protected branch whitelists for merging (#3689) + * Global code search support (#3664) + * Add label descriptions (#3662) + * Add issue search via API (#3612) + * Add repository setting to enable/disable health checks (#3607) + * Emoji Autocomplete (#3433) + * Implements generator cli for secrets (#3531) +* ENHANCEMENT + * Add more webhooks support and refactor webhook templates directory (#3929) + * Add new option to allow only OAuth2/OpenID user registration (#3910) + * Add option to use paged LDAP search when synchronizing users (#3895) + * Symlink icons (#1416) + * Improve release page UI (#3693) + * Add admin dashboard option to run health checks (#3606) + * Add branch link in branch list (#3576) + * Reduce sql query times in retrieveFeeds (#3547) + * Option to enable or disable swagger endpoints (#3502) + * Add missing licenses (#3497) + * Reduce repo indexer disk usage (#3452) + * Enable caching on assets and avatars (#3376) + * Add repository search ordered by stars/forks. Forks column in admin repo list (#3969) + * Add Environment Variables to Docker template (#4012) + * LFS: make HTTP auth period configurable (#4035) + * Add config path as an optionial flag when changing pass via CLI (#4184) + * Refactor User Settings sections (#3900) + * Allow square brackets in external issue patterns (#3408) + * Add Attachment API (#3478) + * Add EnableTimetracking option to app settings (#3719) + * Add config option to enable or disable log executed SQL (#3726) + * Shows total tracked time in issue and milestone list (#3341) +* TRANSLATION + * Improve English grammar and consistency (#3614) +* DEPLOYMENT + * Allow Gitea to run as different USER in Docker (#3961) + * Provide compressed release binaries (#3991) + * Sign release binaries (#4188) + ## [1.4.3](https://github.com/go-gitea/gitea/releases/tag/v1.4.3) - 2018-06-26 * SECURITY * HTML-escape plain-text READMEs (#4192) (#4214) From 83e72f17f63bfde5b2d7c89d10d82b277dcccf1a Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 3 Jul 2018 19:38:06 +0000 Subject: [PATCH 69/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 66 +++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 435321648..de7f3c835 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -1,11 +1,15 @@ +app_desc=En smidig, självhostad Git-tjänst home=Startsida dashboard=Instrumentpanel explore=Utforska help=Hjälp sign_in=Logga in +sign_in_with=Logga in med sign_out=Logga ut +sign_up=Registrera link_account=Länka konto +link_account_signin_or_signup=Logga in med befintliga inloggningsuppgifter för att länka samman det kontot till detta kontot. Eller registrera ett nytt. register=Registrera dig website=Webbplats version=Version @@ -13,12 +17,32 @@ page=Sida template=Mall language=Språk notifications=Notiser +create_new=Skapa… +user_profile_and_more=Profil och Inställningar… signed_in_as=Inloggad som +enable_javascript=Denna sida fungerar bättre med Javascript igång. username=Användarnamn +email=E-postadress password=Lösenord +re_type=Upprepa lösenordet +captcha=CAPTCHA +twofa=Tvåfaktorsautentisering +twofa_scratch=Tvåfaktorsskrapkod passcode=Kod +u2f_insert_key=Sätt i din säkerhetsnyckel +u2f_sign_in=Tryck på knappen på din säkerhetsnyckel. Om du inte kan hitta en knapp, dra ur och sätt i nyckeln igen. +u2f_press_button=Vänligen tryck på knappen på din säkerhetsnyckel… +u2f_use_twofa=Använd en tvåfaktorskod från din telefon +u2f_error=Vi kan inte läsa din säkerhetsnyckel! +u2f_unsupported_browser=Din webbläsare stödjer inte U2F-nycklar. Vänligen prova en annan webbläsare. +u2f_error_1=Ett okänt fel uppstod. Vänligen försök igen. +u2f_error_2=Kontrollera att du använder en krypterad anslutning (https://) och besöker korrekt länk. +u2f_error_3=Servern kunde inte hantera din förfrågan. +u2f_error_4=Den givna nyckeln är inte behörig för denna förfrågan. Om du försöker registrera den, se till att den inte redan är registrerad. +u2f_error_5=Timeout uppnådd innan nyckeln kunde bli läst. Vänligen ladda om sidan och för att försök igen. +u2f_reload=Ladda om repository=Utvecklingskatalog organization=Organisation @@ -29,8 +53,12 @@ new_mirror=Ny Spegling new_fork=Ny förgrening av utvecklingskatalog new_org=Ny organisation manage_org=Hantera organisationer +admin_panel=Sidadministration account_settings=Kontoinställningar settings=inställningar +your_profile=Profil +your_starred=Stjärnmärkt +your_settings=Inställningar all=Alla sources=Källor @@ -46,14 +74,37 @@ cancel=Avbryt [install] install=Installation +title=Ursprunglig konfiguration +docker_helper=Om du kör Gitea inuti Docker, vänligen läs dokumentationen noggrant innan du ändrar några inställningar. +requite_db_desc=Gitea behöver MySQL, PostgreSQL, MSSQL, SQLite3 eller TiDB. db_title=Databasinställningar db_type=Databastyp host=Server +user=Användarnamn password=Lösenord db_name=Databasens namn +db_helper=Notis för MySQL-användare: Använd InnoDB-lagringsmotorn och teckenuppsättning 'utf8_general_ci'. +ssl_mode=SSL path=Filväg +sqlite_helper=Sökväg för SQLite3 eller TiDB databasen.
Ange en absolut sökväg om du kör Gitea som en systemtjänst. +err_empty_db_path=Sökvägen till SQLite3- eller TiDB-databasen kan inte vara tom. +err_invalid_tidb_name=TiDB-databases namn får inte innehålla '.'- eller '-'-tecken. +no_admin_and_disable_registration=Du kan inte inaktivera självregistrering utan att skapa ett administratörskonto. +err_empty_admin_password=Administratörslösenordet kan inte vara tomt. +general_title=Allmänna inställningar +app_name=Sajtens namn +app_name_helper=Du kan ange ditt företagsnamn här. repo_path=Rotsökväg för utvecklingskatalog +repo_path_helper=Fjärrutvecklingskataloger kommer att sparas i denna katalog. +lfs_path=LFS Rotsökväg +lfs_path_helper=Filer hanterade av Git LFS kommer att sparas i denna mapp. Lämna tom för att avaktivera. +run_user=Kör som användarnamn +run_user_helper=Ange operativsystemets användarnamn som Gitea ska köras under. Denna användare måste ha tillgång till utvecklingskatalogens rotsökväg. +domain=SSH-Serverdomän +domain_helper=Domän- eller hostadress för SSH-kloningslänkar. +ssh_port=SSH-serverport +ssh_port_helper=Portnumret som din SSH-server lyssnar på. Lämna tom för att inaktivera. log_root_path=Loggsökväg optional_title=Övriga inställningar @@ -65,7 +116,14 @@ admin_password=Lösenord confirm_password=Bekräfta lösenord install_btn_confirm=Installera Gitea test_git_failed=Misslyckades att testa 'git' kommando: %v +invalid_repo_path=Utvecklingskatalogens rotsökväg är ogiltig: %v save_config_failed=Misslyckades att spara konfigurationen: %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_allow_create_organization=Tillåt skapandet utav organisationer som standard +default_allow_create_organization_popup=Tillåt nya användarkonton att skapa organisationer som standard. +default_enable_timetracking=Aktivera tidredovisning som Standard +default_enable_timetracking_popup=Aktivera tidsredovisning för nya utvecklingskataloger som standard. [home] password_holder=Lösenord @@ -154,26 +212,34 @@ auth_failed=Autentisering misslyckades: %v target_branch_not_exist=Målgrenen finns inte. [user] +change_avatar=Byt din avatar… join_on=Gick med repositories=Utvecklingskataloger activity=Offentlig Aktivitet followers=Följare +starred=Stjärnmärkta Utvecklingskataloger following=Följer follow=Följ unfollow=Sluta följa form.name_reserved=Användarnamnet '%s' är reserverat. +form.name_pattern_not_allowed=Mönstret '%s' är otillåtet i ett användarnamn. [settings] profile=Profil +account=Konto password=Lösenord security=Säkerhet avatar=Visningsbild ssh_gpg_keys=SSH / GPG-nycklar social=Sociala konton +applications=Applikationer +orgs=Hantera Organisationer repos=Utvecklingskataloger delete=Radera konto twofa=Tvåfaktorsautentisering +account_link=Länkade Konton +organization=Organisationer uid=AnvändarID public_profile=Offentlig profil From 5f52178421fc2344b82b2a977c2aa4ee9f968946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauris=20Buk=C5=A1is-Haberkorns?= Date: Tue, 3 Jul 2018 22:57:59 +0300 Subject: [PATCH 70/86] Change 1.5.0 RC1 release date in changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lauris Bukšis-Haberkorns --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6bd82dbb..a015fbd63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). -## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-06-27 +## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-07-03 * SECURITY * Limit uploaded avatar image-size to 4096x3072 by default (#4353) * Do not allow to reuse TOTP passcode (#3878) From a4dfe4b9b1017e7a491386e44c38cd42b46630aa Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 3 Jul 2018 19:58:30 +0000 Subject: [PATCH 71/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index de7f3c835..f0ce1addb 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -117,21 +117,31 @@ confirm_password=Bekräfta lösenord install_btn_confirm=Installera Gitea test_git_failed=Misslyckades att testa 'git' kommando: %v 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. default_allow_create_organization=Tillåt skapandet utav organisationer som standard default_allow_create_organization_popup=Tillåt nya användarkonton att skapa organisationer som standard. default_enable_timetracking=Aktivera tidredovisning som Standard default_enable_timetracking_popup=Aktivera tidsredovisning för nya utvecklingskataloger som standard. +no_reply_address=Dold mejldomän +no_reply_address_helper=Domännamn för användare med en dold mailadress. Exempelvis kommer användarnamnet 'joe' att loggas i Git som 'joe@noreply.example.org' om dold maildomän är satt till 'noreply.example.org'. [home] +uname_holder=Användarnamn eller Mejladress password_holder=Lösenord switch_dashboard_context=Växla Visad Instrumentpanel +my_repos=Utvecklingskataloger +show_more_repos=Visa flera utvecklingskataloger… collaborative_repos=Kollaborativa Utvecklingskataloger my_orgs=Mina organisationer my_mirrors=Mina speglar view_home=Visa %s +search_repos=Hitta en utvecklingskatalog… issues.in_your_repos=I dina utvecklingskataloger @@ -140,9 +150,18 @@ repos=Utvecklingskataloger users=Användare organizations=Organisationer search=Sök +code=Kod +repo_no_results=Inga matchande utvecklingskataloger hittades. +user_no_results=Inga matchande användare hittades. +org_no_results=Inga matchande organisationer hittades. +code_no_results=Ingen källkod hittades som matchar din sökterm. +code_search_results=Söktresultat för '%s' [auth] +create_new_account=Registrera Konto register_helper_msg=Har du redan ett konto? Logga in nu! +social_register_helper_msg=Har du redan ett konto? Länka det nu! +disable_register_prompt=Registrering inaktiverad. Vänligen kontakta din sidadministratör. remember_me=Kom ihåg mig forgot_password_title=Glömt lösenord forgot_password=Glömt lösenord? @@ -160,6 +179,7 @@ scratch_code=Skrapkod use_scratch_code=Använd en skrapkod twofa_scratch_used=Du har använt din skrapkod. Du har blivit omdirigerad till tvåfaktorsinställningarna så att du kan ta bort din aktiverade enhet eller generera en ny skrapkod. twofa_scratch_token_incorrect=Din skrapkod är ogiltlig. +login_userpass=Logga in login_openid=OpenID openid_connect_submit=Anslut openid_connect_title=Anslut ett existerande konto @@ -204,6 +224,7 @@ url_error=Den givna URL-adressen är inte valid include_error=` måste innehålla texten '%s'.` unknown_error=Okänt fel: +repo_name_been_taken=Namnet för utvecklingskatalogen är upptaget. user_not_exist=Användaren finns inte. auth_failed=Autentisering misslyckades: %v @@ -406,6 +427,7 @@ issues.new.no_milestone=Ingen Milsten issues.new.clear_milestone=Rensa milstenar issues.new.open_milestone=Öppna Milstenar issues.new.closed_milestone=Stängda Milstenar +issues.new.no_assignees=Ingen tilldelad issues.no_ref=Ingen branch/Tag specificerad issues.create=Skapa Ärende issues.new_label=Ny etikett From 1c7f95153402851b4aa293ae822250d6a8df6b21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauris=20Buk=C5=A1is-Haberkorns?= Date: Tue, 3 Jul 2018 23:21:44 +0300 Subject: [PATCH 72/86] Change 1.5.0 RC1 release date in changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lauris Bukšis-Haberkorns --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a015fbd63..add1d4e26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). -## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-07-03 +## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-07-04 * SECURITY * Limit uploaded avatar image-size to 4096x3072 by default (#4353) * Do not allow to reuse TOTP passcode (#3878) From 100a538622695955df460c2a9a82b32cd55f2c32 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 3 Jul 2018 20:23:00 +0000 Subject: [PATCH 73/86] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index f0ce1addb..89103ea48 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -162,6 +162,7 @@ create_new_account=Registrera Konto register_helper_msg=Har du redan ett konto? Logga in nu! social_register_helper_msg=Har du redan ett konto? Länka det nu! disable_register_prompt=Registrering inaktiverad. Vänligen kontakta din sidadministratör. +disable_register_mail=Bekräftelsemejl vid registrering är inaktiverad. remember_me=Kom ihåg mig forgot_password_title=Glömt lösenord forgot_password=Glömt lösenord? @@ -431,6 +432,8 @@ issues.new.no_assignees=Ingen tilldelad issues.no_ref=Ingen branch/Tag specificerad issues.create=Skapa Ärende issues.new_label=Ny etikett +issues.new_label_placeholder=Etikettsnamn +issues.new_label_desc_placeholder=Beskrivning issues.create_label=Skapa Etikett issues.label_templates.title=Ladda en fördefinierad uppsättning etiketter issues.label_templates.helper=Markera en uppsättning etiketter @@ -463,6 +466,10 @@ issues.filter_sort.recentupdate=Nyligen uppdaterade issues.filter_sort.leastupdate=Äldst uppdaterad issues.filter_sort.mostcomment=Mest kommenterade issues.filter_sort.leastcomment=Minst kommenterade +issues.filter_sort.moststars=Flest stjärnor +issues.filter_sort.feweststars=Minst stjärnor +issues.filter_sort.mostforks=Flest forks +issues.filter_sort.fewestforks=Minst forks issues.action_open=Öppna issues.action_close=Stäng issues.action_label=Etikett @@ -481,7 +488,9 @@ issues.commented_at=`kommenterad %s` issues.delete_comment_confirm=Är du säker på att du vill ta bort den här kommentaren? issues.no_content=Det finns inget innehåll än. issues.close_issue=Stäng +issues.close_comment_issue=Kommentera och stäng issues.reopen_issue=Återöppna +issues.reopen_comment_issue=Kommentera och återöppna issues.create_comment=Kommentera issues.closed_at=`stängde %[2]s` issues.reopened_at=`återöppnade %[2]s` @@ -494,11 +503,16 @@ issues.edit=Redigera issues.cancel=Avbryt issues.save=Spara issues.label_title=Etikettsnamn +issues.label_description=Etikettbeskrivning issues.label_color=Etikettsfärg issues.label_count=%d etiketter issues.label_open_issues=%d öppna ärenden issues.label_edit=Redigera issues.label_delete=Radera +issues.label_modify=Redigera etikett +issues.label_deletion=Ta bort etikett +issues.label_deletion_desc=Bottagning av en etikett tar bort den från alla ärenden. Fortsätta? +issues.label_deletion_success=Etiketten har tagits bort. issues.label.filter_sort.alphabetically=Alfabetiskt A-Ö issues.label.filter_sort.reverse_alphabetically=Alfabetiskt Ö-A issues.label.filter_sort.by_size=Storlek @@ -508,11 +522,15 @@ issues.attachment.open_tab=`Klicka för att se "%s" i en ny flik` issues.attachment.download=`Klicka för att hämta "%s"` issues.subscribe=Prenumerera issues.unsubscribe=Avsluta prenumerationen +issues.tracker=Tidsredovisning issues.start_tracking_short=Starta +issues.start_tracking=Starta tidsredovisning issues.start_tracking_history=`började arbeta %s` issues.tracking_already_started=`Du har redan påbörjat tidredovisning på detta ärende!` issues.stop_tracking=Stoppa issues.stop_tracking_history=`slutade arbeta %s` +issues.add_time=Lägg till tid manuellt +issues.add_time_short=Lägg till tid issues.add_time_cancel=Avbryt issues.add_time_history=`la till tillbringad tid %s` issues.add_time_hours=Timmar From 280ebcbf7c761a212fb091634384847a38f25cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauris=20Buk=C5=A1is-Haberkorns?= Date: Tue, 3 Jul 2018 23:24:15 +0300 Subject: [PATCH 74/86] Update changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lauris Bukšis-Haberkorns --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index add1d4e26..03ea5ec2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ been added to each release, please refer to the [blog](https://blog.gitea.io). ## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-07-04 * SECURITY - * Limit uploaded avatar image-size to 4096x3072 by default (#4353) + * Limit uploaded avatar image-size to 4096px x 3072px by default (#4353) * Do not allow to reuse TOTP passcode (#3878) * FEATURE * Add cli commands to regen hooks & keys (#3979) From 9d4c1ddfa14d33ce3b78c02421fb76a93e5ca2d6 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 3 Jul 2018 17:58:31 -0400 Subject: [PATCH 75/86] Dep upgrade mysql lib (#4161) * update gopkg file to add sql dep --- Gopkg.lock | 4 +- Gopkg.toml | 4 + vendor/github.com/go-sql-driver/mysql/AUTHORS | 34 ++ .../go-sql-driver/mysql/appengine.go | 2 +- vendor/github.com/go-sql-driver/mysql/auth.go | 420 +++++++++++++++++ .../github.com/go-sql-driver/mysql/buffer.go | 12 +- .../go-sql-driver/mysql/collations.go | 1 + .../go-sql-driver/mysql/connection.go | 152 ++++-- .../go-sql-driver/mysql/connection_go18.go | 208 +++++++++ .../github.com/go-sql-driver/mysql/const.go | 25 +- .../github.com/go-sql-driver/mysql/driver.go | 81 ++-- vendor/github.com/go-sql-driver/mysql/dsn.go | 159 +++++-- .../github.com/go-sql-driver/mysql/errors.go | 79 +--- .../github.com/go-sql-driver/mysql/fields.go | 194 ++++++++ .../github.com/go-sql-driver/mysql/infile.go | 6 +- .../github.com/go-sql-driver/mysql/packets.go | 441 ++++++++++-------- vendor/github.com/go-sql-driver/mysql/rows.go | 174 +++++-- .../go-sql-driver/mysql/statement.go | 123 +++-- .../go-sql-driver/mysql/transaction.go | 4 +- .../github.com/go-sql-driver/mysql/utils.go | 214 ++++----- .../go-sql-driver/mysql/utils_go17.go | 40 ++ .../go-sql-driver/mysql/utils_go18.go | 50 ++ 22 files changed, 1813 insertions(+), 614 deletions(-) create mode 100644 vendor/github.com/go-sql-driver/mysql/auth.go create mode 100644 vendor/github.com/go-sql-driver/mysql/connection_go18.go create mode 100644 vendor/github.com/go-sql-driver/mysql/fields.go create mode 100644 vendor/github.com/go-sql-driver/mysql/utils_go17.go create mode 100644 vendor/github.com/go-sql-driver/mysql/utils_go18.go diff --git a/Gopkg.lock b/Gopkg.lock index 6551354a0..d5b2408bb 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -294,7 +294,7 @@ [[projects]] name = "github.com/go-sql-driver/mysql" packages = ["."] - revision = "ce924a41eea897745442daaa1739089b0f3f561d" + revision = "d523deb1b23d913de5bdada721a6071e71283618" [[projects]] name = "github.com/go-xorm/builder" @@ -873,6 +873,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "036b8c882671cf8d2c5e2fdbe53b1bdfbd39f7ebd7765bd50276c7c4ecf16687" + inputs-digest = "96c83a3502bd50c5ca8e4d9b4145172267630270e587c79b7253156725eeb9b8" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 1019888c0..42523550f 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -40,6 +40,10 @@ ignored = ["google.golang.org/appengine*"] #version = "0.6.5" revision = "d4149d1eee0c2c488a74a5863fd9caf13d60fd03" +[[override]] + name = "github.com/go-sql-driver/mysql" + revision = "d523deb1b23d913de5bdada721a6071e71283618" + [[override]] name = "github.com/gorilla/mux" revision = "757bef944d0f21880861c2dd9c871ca543023cba" diff --git a/vendor/github.com/go-sql-driver/mysql/AUTHORS b/vendor/github.com/go-sql-driver/mysql/AUTHORS index 148ea93aa..73ff68fbc 100644 --- a/vendor/github.com/go-sql-driver/mysql/AUTHORS +++ b/vendor/github.com/go-sql-driver/mysql/AUTHORS @@ -12,34 +12,63 @@ # Individual Persons Aaron Hopkins +Achille Roussel +Alexey Palazhchenko +Andrew Reid Arne Hormann +Asta Xie +Bulat Gaifullin Carlos Nieto Chris Moos +Craig Wilson +Daniel Montoya Daniel Nichter Daniël van Eeden +Dave Protasowski DisposaBoy +Egor Smolyakov +Evan Shaw Frederick Mayle Gustavo Kristic +Hajime Nakagami Hanno Braun Henri Yandell Hirotaka Yamamoto +ICHINOSE Shogo INADA Naoki +Jacek Szwec James Harr +Jeff Hodges +Jeffrey Charles Jian Zhen Joshua Prunier Julien Lefevre Julien Schmidt +Justin Li +Justin Nuß Kamil Dziedzic Kevin Malachowski +Kieron Woodhouse Lennart Rudolph Leonardo YongUk Kim +Linh Tran Tuan +Lion Yang Luca Looz Lucas Liu Luke Scott +Maciej Zimnoch Michael Woolnough Nicola Peduzzi +Olivier Mengué +oscarzhao Paul Bonser +Peter Schultz +Rebecca Chin +Reed Allman +Richard Wilkes +Robert Russell Runrioter Wung +Shuode Li Soroush Pour Stan Putrya Stanley Gunawan @@ -51,5 +80,10 @@ Zhenye Xie # Organizations Barracuda Networks, Inc. +Counting Ltd. Google Inc. +InfoSum Ltd. +Keybase Inc. +Percona LLC +Pivotal Inc. Stripe Inc. diff --git a/vendor/github.com/go-sql-driver/mysql/appengine.go b/vendor/github.com/go-sql-driver/mysql/appengine.go index 565614eef..be41f2ee6 100644 --- a/vendor/github.com/go-sql-driver/mysql/appengine.go +++ b/vendor/github.com/go-sql-driver/mysql/appengine.go @@ -11,7 +11,7 @@ package mysql import ( - "appengine/cloudsql" + "google.golang.org/appengine/cloudsql" ) func init() { diff --git a/vendor/github.com/go-sql-driver/mysql/auth.go b/vendor/github.com/go-sql-driver/mysql/auth.go new file mode 100644 index 000000000..0b59f52ee --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/auth.go @@ -0,0 +1,420 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2018 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/sha256" + "crypto/x509" + "encoding/pem" + "sync" +) + +// server pub keys registry +var ( + serverPubKeyLock sync.RWMutex + serverPubKeyRegistry map[string]*rsa.PublicKey +) + +// RegisterServerPubKey registers a server RSA public key which can be used to +// send data in a secure manner to the server without receiving the public key +// in a potentially insecure way from the server first. +// Registered keys can afterwards be used adding serverPubKey= to the DSN. +// +// Note: The provided rsa.PublicKey instance is exclusively owned by the driver +// after registering it and may not be modified. +// +// data, err := ioutil.ReadFile("mykey.pem") +// if err != nil { +// log.Fatal(err) +// } +// +// block, _ := pem.Decode(data) +// if block == nil || block.Type != "PUBLIC KEY" { +// log.Fatal("failed to decode PEM block containing public key") +// } +// +// pub, err := x509.ParsePKIXPublicKey(block.Bytes) +// if err != nil { +// log.Fatal(err) +// } +// +// if rsaPubKey, ok := pub.(*rsa.PublicKey); ok { +// mysql.RegisterServerPubKey("mykey", rsaPubKey) +// } else { +// log.Fatal("not a RSA public key") +// } +// +func RegisterServerPubKey(name string, pubKey *rsa.PublicKey) { + serverPubKeyLock.Lock() + if serverPubKeyRegistry == nil { + serverPubKeyRegistry = make(map[string]*rsa.PublicKey) + } + + serverPubKeyRegistry[name] = pubKey + serverPubKeyLock.Unlock() +} + +// DeregisterServerPubKey removes the public key registered with the given name. +func DeregisterServerPubKey(name string) { + serverPubKeyLock.Lock() + if serverPubKeyRegistry != nil { + delete(serverPubKeyRegistry, name) + } + serverPubKeyLock.Unlock() +} + +func getServerPubKey(name string) (pubKey *rsa.PublicKey) { + serverPubKeyLock.RLock() + if v, ok := serverPubKeyRegistry[name]; ok { + pubKey = v + } + serverPubKeyLock.RUnlock() + return +} + +// Hash password using pre 4.1 (old password) method +// https://github.com/atcurtis/mariadb/blob/master/mysys/my_rnd.c +type myRnd struct { + seed1, seed2 uint32 +} + +const myRndMaxVal = 0x3FFFFFFF + +// Pseudo random number generator +func newMyRnd(seed1, seed2 uint32) *myRnd { + return &myRnd{ + seed1: seed1 % myRndMaxVal, + seed2: seed2 % myRndMaxVal, + } +} + +// Tested to be equivalent to MariaDB's floating point variant +// http://play.golang.org/p/QHvhd4qved +// http://play.golang.org/p/RG0q4ElWDx +func (r *myRnd) NextByte() byte { + r.seed1 = (r.seed1*3 + r.seed2) % myRndMaxVal + r.seed2 = (r.seed1 + r.seed2 + 33) % myRndMaxVal + + return byte(uint64(r.seed1) * 31 / myRndMaxVal) +} + +// Generate binary hash from byte string using insecure pre 4.1 method +func pwHash(password []byte) (result [2]uint32) { + var add uint32 = 7 + var tmp uint32 + + result[0] = 1345345333 + result[1] = 0x12345671 + + for _, c := range password { + // skip spaces and tabs in password + if c == ' ' || c == '\t' { + continue + } + + tmp = uint32(c) + result[0] ^= (((result[0] & 63) + add) * tmp) + (result[0] << 8) + result[1] += (result[1] << 8) ^ result[0] + add += tmp + } + + // Remove sign bit (1<<31)-1) + result[0] &= 0x7FFFFFFF + result[1] &= 0x7FFFFFFF + + return +} + +// Hash password using insecure pre 4.1 method +func scrambleOldPassword(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + scramble = scramble[:8] + + hashPw := pwHash([]byte(password)) + hashSc := pwHash(scramble) + + r := newMyRnd(hashPw[0]^hashSc[0], hashPw[1]^hashSc[1]) + + var out [8]byte + for i := range out { + out[i] = r.NextByte() + 64 + } + + mask := r.NextByte() + for i := range out { + out[i] ^= mask + } + + return out[:] +} + +// Hash password using 4.1+ method (SHA1) +func scramblePassword(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + // stage1Hash = SHA1(password) + crypt := sha1.New() + crypt.Write([]byte(password)) + stage1 := crypt.Sum(nil) + + // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) + // inner Hash + crypt.Reset() + crypt.Write(stage1) + hash := crypt.Sum(nil) + + // outer Hash + crypt.Reset() + crypt.Write(scramble) + crypt.Write(hash) + scramble = crypt.Sum(nil) + + // token = scrambleHash XOR stage1Hash + for i := range scramble { + scramble[i] ^= stage1[i] + } + return scramble +} + +// Hash password using MySQL 8+ method (SHA256) +func scrambleSHA256Password(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + // XOR(SHA256(password), SHA256(SHA256(SHA256(password)), scramble)) + + crypt := sha256.New() + crypt.Write([]byte(password)) + message1 := crypt.Sum(nil) + + crypt.Reset() + crypt.Write(message1) + message1Hash := crypt.Sum(nil) + + crypt.Reset() + crypt.Write(message1Hash) + crypt.Write(scramble) + message2 := crypt.Sum(nil) + + for i := range message1 { + message1[i] ^= message2[i] + } + + return message1 +} + +func encryptPassword(password string, seed []byte, pub *rsa.PublicKey) ([]byte, error) { + plain := make([]byte, len(password)+1) + copy(plain, password) + for i := range plain { + j := i % len(seed) + plain[i] ^= seed[j] + } + sha1 := sha1.New() + return rsa.EncryptOAEP(sha1, rand.Reader, pub, plain, nil) +} + +func (mc *mysqlConn) sendEncryptedPassword(seed []byte, pub *rsa.PublicKey) error { + enc, err := encryptPassword(mc.cfg.Passwd, seed, pub) + if err != nil { + return err + } + return mc.writeAuthSwitchPacket(enc, false) +} + +func (mc *mysqlConn) auth(authData []byte, plugin string) ([]byte, bool, error) { + switch plugin { + case "caching_sha2_password": + authResp := scrambleSHA256Password(authData, mc.cfg.Passwd) + return authResp, (authResp == nil), nil + + case "mysql_old_password": + if !mc.cfg.AllowOldPasswords { + return nil, false, ErrOldPassword + } + // Note: there are edge cases where this should work but doesn't; + // this is currently "wontfix": + // https://github.com/go-sql-driver/mysql/issues/184 + authResp := scrambleOldPassword(authData[:8], mc.cfg.Passwd) + return authResp, true, nil + + case "mysql_clear_password": + if !mc.cfg.AllowCleartextPasswords { + return nil, false, ErrCleartextPassword + } + // http://dev.mysql.com/doc/refman/5.7/en/cleartext-authentication-plugin.html + // http://dev.mysql.com/doc/refman/5.7/en/pam-authentication-plugin.html + return []byte(mc.cfg.Passwd), true, nil + + case "mysql_native_password": + if !mc.cfg.AllowNativePasswords { + return nil, false, ErrNativePassword + } + // https://dev.mysql.com/doc/internals/en/secure-password-authentication.html + // Native password authentication only need and will need 20-byte challenge. + authResp := scramblePassword(authData[:20], mc.cfg.Passwd) + return authResp, false, nil + + case "sha256_password": + if len(mc.cfg.Passwd) == 0 { + return nil, true, nil + } + if mc.cfg.tls != nil || mc.cfg.Net == "unix" { + // write cleartext auth packet + return []byte(mc.cfg.Passwd), true, nil + } + + pubKey := mc.cfg.pubKey + if pubKey == nil { + // request public key from server + return []byte{1}, false, nil + } + + // encrypted password + enc, err := encryptPassword(mc.cfg.Passwd, authData, pubKey) + return enc, false, err + + default: + errLog.Print("unknown auth plugin:", plugin) + return nil, false, ErrUnknownPlugin + } +} + +func (mc *mysqlConn) handleAuthResult(oldAuthData []byte, plugin string) error { + // Read Result Packet + authData, newPlugin, err := mc.readAuthResult() + if err != nil { + return err + } + + // handle auth plugin switch, if requested + if newPlugin != "" { + // If CLIENT_PLUGIN_AUTH capability is not supported, no new cipher is + // sent and we have to keep using the cipher sent in the init packet. + if authData == nil { + authData = oldAuthData + } else { + // copy data from read buffer to owned slice + copy(oldAuthData, authData) + } + + plugin = newPlugin + + authResp, addNUL, err := mc.auth(authData, plugin) + if err != nil { + return err + } + if err = mc.writeAuthSwitchPacket(authResp, addNUL); err != nil { + return err + } + + // Read Result Packet + authData, newPlugin, err = mc.readAuthResult() + if err != nil { + return err + } + + // Do not allow to change the auth plugin more than once + if newPlugin != "" { + return ErrMalformPkt + } + } + + switch plugin { + + // https://insidemysql.com/preparing-your-community-connector-for-mysql-8-part-2-sha256/ + case "caching_sha2_password": + switch len(authData) { + case 0: + return nil // auth successful + case 1: + switch authData[0] { + case cachingSha2PasswordFastAuthSuccess: + if err = mc.readResultOK(); err == nil { + return nil // auth successful + } + + case cachingSha2PasswordPerformFullAuthentication: + if mc.cfg.tls != nil || mc.cfg.Net == "unix" { + // write cleartext auth packet + err = mc.writeAuthSwitchPacket([]byte(mc.cfg.Passwd), true) + if err != nil { + return err + } + } else { + pubKey := mc.cfg.pubKey + if pubKey == nil { + // request public key from server + data := mc.buf.takeSmallBuffer(4 + 1) + data[4] = cachingSha2PasswordRequestPublicKey + mc.writePacket(data) + + // parse public key + data, err := mc.readPacket() + if err != nil { + return err + } + + block, _ := pem.Decode(data[1:]) + pkix, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + pubKey = pkix.(*rsa.PublicKey) + } + + // send encrypted password + err = mc.sendEncryptedPassword(oldAuthData, pubKey) + if err != nil { + return err + } + } + return mc.readResultOK() + + default: + return ErrMalformPkt + } + default: + return ErrMalformPkt + } + + case "sha256_password": + switch len(authData) { + case 0: + return nil // auth successful + default: + block, _ := pem.Decode(authData) + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + + // send encrypted password + err = mc.sendEncryptedPassword(oldAuthData, pub.(*rsa.PublicKey)) + if err != nil { + return err + } + return mc.readResultOK() + } + + default: + return nil // auth successful + } + + return err +} diff --git a/vendor/github.com/go-sql-driver/mysql/buffer.go b/vendor/github.com/go-sql-driver/mysql/buffer.go index 2001feacd..eb4748bf4 100644 --- a/vendor/github.com/go-sql-driver/mysql/buffer.go +++ b/vendor/github.com/go-sql-driver/mysql/buffer.go @@ -130,18 +130,18 @@ func (b *buffer) takeBuffer(length int) []byte { // smaller than defaultBufSize // Only one buffer (total) can be used at a time. func (b *buffer) takeSmallBuffer(length int) []byte { - if b.length == 0 { - return b.buf[:length] + if b.length > 0 { + return nil } - return nil + return b.buf[:length] } // takeCompleteBuffer returns the complete existing buffer. // This can be used if the necessary buffer size is unknown. // Only one buffer (total) can be used at a time. func (b *buffer) takeCompleteBuffer() []byte { - if b.length == 0 { - return b.buf + if b.length > 0 { + return nil } - return nil + return b.buf } diff --git a/vendor/github.com/go-sql-driver/mysql/collations.go b/vendor/github.com/go-sql-driver/mysql/collations.go index 82079cfb9..136c9e4d1 100644 --- a/vendor/github.com/go-sql-driver/mysql/collations.go +++ b/vendor/github.com/go-sql-driver/mysql/collations.go @@ -9,6 +9,7 @@ package mysql const defaultCollation = "utf8_general_ci" +const binaryCollation = "binary" // A list of available collations mapped to the internal ID. // To update this map use the following MySQL query: diff --git a/vendor/github.com/go-sql-driver/mysql/connection.go b/vendor/github.com/go-sql-driver/mysql/connection.go index d82c728f3..e57061412 100644 --- a/vendor/github.com/go-sql-driver/mysql/connection.go +++ b/vendor/github.com/go-sql-driver/mysql/connection.go @@ -10,12 +10,23 @@ package mysql import ( "database/sql/driver" + "io" "net" "strconv" "strings" "time" ) +// a copy of context.Context for Go 1.7 and earlier +type mysqlContext interface { + Done() <-chan struct{} + Err() error + + // defined in context.Context, but not used in this driver: + // Deadline() (deadline time.Time, ok bool) + // Value(key interface{}) interface{} +} + type mysqlConn struct { buf buffer netConn net.Conn @@ -29,7 +40,14 @@ type mysqlConn struct { status statusFlag sequence uint8 parseTime bool - strict bool + + // for context support (Go 1.8+) + watching bool + watcher chan<- mysqlContext + closech chan struct{} + finished chan<- struct{} + canceled atomicError // set non-nil if conn is canceled + closed atomicBool // set when conn is closed, before closech is closed } // Handles parameters set in DSN after the connection is established @@ -62,22 +80,41 @@ func (mc *mysqlConn) handleParams() (err error) { return } +func (mc *mysqlConn) markBadConn(err error) error { + if mc == nil { + return err + } + if err != errBadConnNoWrite { + return err + } + return driver.ErrBadConn +} + func (mc *mysqlConn) Begin() (driver.Tx, error) { - if mc.netConn == nil { + return mc.begin(false) +} + +func (mc *mysqlConn) begin(readOnly bool) (driver.Tx, error) { + if mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } - err := mc.exec("START TRANSACTION") + var q string + if readOnly { + q = "START TRANSACTION READ ONLY" + } else { + q = "START TRANSACTION" + } + err := mc.exec(q) if err == nil { return &mysqlTx{mc}, err } - - return nil, err + return nil, mc.markBadConn(err) } func (mc *mysqlConn) Close() (err error) { // Makes Close idempotent - if mc.netConn != nil { + if !mc.closed.IsSet() { err = mc.writeCommandPacket(comQuit) } @@ -91,26 +128,39 @@ func (mc *mysqlConn) Close() (err error) { // is called before auth or on auth failure because MySQL will have already // closed the network connection. func (mc *mysqlConn) cleanup() { - // Makes cleanup idempotent - if mc.netConn != nil { - if err := mc.netConn.Close(); err != nil { - errLog.Print(err) - } - mc.netConn = nil + if !mc.closed.TrySet(true) { + return } - mc.cfg = nil - mc.buf.nc = nil + + // Makes cleanup idempotent + close(mc.closech) + if mc.netConn == nil { + return + } + if err := mc.netConn.Close(); err != nil { + errLog.Print(err) + } +} + +func (mc *mysqlConn) error() error { + if mc.closed.IsSet() { + if err := mc.canceled.Value(); err != nil { + return err + } + return ErrInvalidConn + } + return nil } func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) { - if mc.netConn == nil { + if mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } // Send command err := mc.writeCommandPacketStr(comStmtPrepare, query) if err != nil { - return nil, err + return nil, mc.markBadConn(err) } stmt := &mysqlStmt{ @@ -144,7 +194,7 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin if buf == nil { // can not take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return "", driver.ErrBadConn + return "", ErrInvalidConn } buf = buf[:0] argPos := 0 @@ -257,7 +307,7 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin } func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, error) { - if mc.netConn == nil { + if mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } @@ -271,7 +321,6 @@ func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, err return nil, err } query = prepared - args = nil } mc.affectedRows = 0 mc.insertId = 0 @@ -283,32 +332,43 @@ func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, err insertId: int64(mc.insertId), }, err } - return nil, err + return nil, mc.markBadConn(err) } // Internal function to execute commands func (mc *mysqlConn) exec(query string) error { // Send command - err := mc.writeCommandPacketStr(comQuery, query) - if err != nil { - return err + if err := mc.writeCommandPacketStr(comQuery, query); err != nil { + return mc.markBadConn(err) } // Read Result resLen, err := mc.readResultSetHeaderPacket() - if err == nil && resLen > 0 { - if err = mc.readUntilEOF(); err != nil { + if err != nil { + return err + } + + if resLen > 0 { + // columns + if err := mc.readUntilEOF(); err != nil { return err } - err = mc.readUntilEOF() + // rows + if err := mc.readUntilEOF(); err != nil { + return err + } } - return err + return mc.discardResults() } func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, error) { - if mc.netConn == nil { + return mc.query(query, args) +} + +func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error) { + if mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } @@ -322,7 +382,6 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro return nil, err } query = prepared - args = nil } // Send command err := mc.writeCommandPacketStr(comQuery, query) @@ -335,15 +394,22 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro rows.mc = mc if resLen == 0 { - // no columns, no more data - return emptyRows{}, nil + rows.rs.done = true + + switch err := rows.NextResultSet(); err { + case nil, io.EOF: + return rows, nil + default: + return nil, err + } } + // Columns - rows.columns, err = mc.readColumns(resLen) + rows.rs.columns, err = mc.readColumns(resLen) return rows, err } } - return nil, err + return nil, mc.markBadConn(err) } // Gets the value of the given MySQL System Variable @@ -359,7 +425,7 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) { if err == nil { rows := new(textRows) rows.mc = mc - rows.columns = []mysqlField{{fieldType: fieldTypeVarChar}} + rows.rs.columns = []mysqlField{{fieldType: fieldTypeVarChar}} if resLen > 0 { // Columns @@ -375,3 +441,21 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) { } return nil, err } + +// finish is called when the query has canceled. +func (mc *mysqlConn) cancel(err error) { + mc.canceled.Set(err) + mc.cleanup() +} + +// finish is called when the query has succeeded. +func (mc *mysqlConn) finish() { + if !mc.watching || mc.finished == nil { + return + } + select { + case mc.finished <- struct{}{}: + mc.watching = false + case <-mc.closech: + } +} diff --git a/vendor/github.com/go-sql-driver/mysql/connection_go18.go b/vendor/github.com/go-sql-driver/mysql/connection_go18.go new file mode 100644 index 000000000..62796bfce --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/connection_go18.go @@ -0,0 +1,208 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build go1.8 + +package mysql + +import ( + "context" + "database/sql" + "database/sql/driver" +) + +// Ping implements driver.Pinger interface +func (mc *mysqlConn) Ping(ctx context.Context) (err error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return driver.ErrBadConn + } + + if err = mc.watchCancel(ctx); err != nil { + return + } + defer mc.finish() + + if err = mc.writeCommandPacket(comPing); err != nil { + return + } + + return mc.readResultOK() +} + +// BeginTx implements driver.ConnBeginTx interface +func (mc *mysqlConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + if sql.IsolationLevel(opts.Isolation) != sql.LevelDefault { + level, err := mapIsolationLevel(opts.Isolation) + if err != nil { + return nil, err + } + err = mc.exec("SET TRANSACTION ISOLATION LEVEL " + level) + if err != nil { + return nil, err + } + } + + return mc.begin(opts.ReadOnly) +} + +func (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := mc.query(query, dargs) + if err != nil { + mc.finish() + return nil, err + } + rows.finish = mc.finish + return rows, err +} + +func (mc *mysqlConn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + return mc.Exec(query, dargs) +} + +func (mc *mysqlConn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + stmt, err := mc.Prepare(query) + mc.finish() + if err != nil { + return nil, err + } + + select { + default: + case <-ctx.Done(): + stmt.Close() + return nil, ctx.Err() + } + return stmt, nil +} + +func (stmt *mysqlStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := stmt.query(dargs) + if err != nil { + stmt.mc.finish() + return nil, err + } + rows.finish = stmt.mc.finish + return rows, err +} + +func (stmt *mysqlStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + defer stmt.mc.finish() + + return stmt.Exec(dargs) +} + +func (mc *mysqlConn) watchCancel(ctx context.Context) error { + if mc.watching { + // Reach here if canceled, + // so the connection is already invalid + mc.cleanup() + return nil + } + if ctx.Done() == nil { + return nil + } + + mc.watching = true + select { + default: + case <-ctx.Done(): + return ctx.Err() + } + if mc.watcher == nil { + return nil + } + + mc.watcher <- ctx + + return nil +} + +func (mc *mysqlConn) startWatcher() { + watcher := make(chan mysqlContext, 1) + mc.watcher = watcher + finished := make(chan struct{}) + mc.finished = finished + go func() { + for { + var ctx mysqlContext + select { + case ctx = <-watcher: + case <-mc.closech: + return + } + + select { + case <-ctx.Done(): + mc.cancel(ctx.Err()) + case <-finished: + case <-mc.closech: + return + } + } + }() +} + +func (mc *mysqlConn) CheckNamedValue(nv *driver.NamedValue) (err error) { + nv.Value, err = converter{}.ConvertValue(nv.Value) + return +} + +// ResetSession implements driver.SessionResetter. +// (From Go 1.10) +func (mc *mysqlConn) ResetSession(ctx context.Context) error { + if mc.closed.IsSet() { + return driver.ErrBadConn + } + return nil +} diff --git a/vendor/github.com/go-sql-driver/mysql/const.go b/vendor/github.com/go-sql-driver/mysql/const.go index 88cfff3fd..b1e6b85ef 100644 --- a/vendor/github.com/go-sql-driver/mysql/const.go +++ b/vendor/github.com/go-sql-driver/mysql/const.go @@ -9,7 +9,9 @@ package mysql const ( - minProtocolVersion byte = 10 + defaultAuthPlugin = "mysql_native_password" + defaultMaxAllowedPacket = 4 << 20 // 4 MiB + minProtocolVersion = 10 maxPacketSize = 1<<24 - 1 timeFormat = "2006-01-02 15:04:05.999999" ) @@ -18,10 +20,11 @@ const ( // http://dev.mysql.com/doc/internals/en/client-server-protocol.html const ( - iOK byte = 0x00 - iLocalInFile byte = 0xfb - iEOF byte = 0xfe - iERR byte = 0xff + iOK byte = 0x00 + iAuthMoreData byte = 0x01 + iLocalInFile byte = 0xfb + iEOF byte = 0xfe + iERR byte = 0xff ) // https://dev.mysql.com/doc/internals/en/capability-flags.html#packet-Protocol::CapabilityFlags @@ -87,8 +90,10 @@ const ( ) // https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnType +type fieldType byte + const ( - fieldTypeDecimal byte = iota + fieldTypeDecimal fieldType = iota fieldTypeTiny fieldTypeShort fieldTypeLong @@ -107,7 +112,7 @@ const ( fieldTypeBit ) const ( - fieldTypeJSON byte = iota + 0xf5 + fieldTypeJSON fieldType = iota + 0xf5 fieldTypeNewDecimal fieldTypeEnum fieldTypeSet @@ -161,3 +166,9 @@ const ( statusInTransReadonly statusSessionStateChanged ) + +const ( + cachingSha2PasswordRequestPublicKey = 2 + cachingSha2PasswordFastAuthSuccess = 3 + cachingSha2PasswordPerformFullAuthentication = 4 +) diff --git a/vendor/github.com/go-sql-driver/mysql/driver.go b/vendor/github.com/go-sql-driver/mysql/driver.go index f5ee4728e..1a75a16ec 100644 --- a/vendor/github.com/go-sql-driver/mysql/driver.go +++ b/vendor/github.com/go-sql-driver/mysql/driver.go @@ -4,7 +4,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this file, // You can obtain one at http://mozilla.org/MPL/2.0/. -// Package mysql provides a MySQL driver for Go's database/sql package +// Package mysql provides a MySQL driver for Go's database/sql package. // // The driver should be used via the database/sql package: // @@ -20,8 +20,14 @@ import ( "database/sql" "database/sql/driver" "net" + "sync" ) +// watcher interface is used for context support (From Go 1.8) +type watcher interface { + startWatcher() +} + // MySQLDriver is exported to make the driver directly accessible. // In general the driver is used via the database/sql package. type MySQLDriver struct{} @@ -30,12 +36,17 @@ type MySQLDriver struct{} // Custom dial functions must be registered with RegisterDial type DialFunc func(addr string) (net.Conn, error) -var dials map[string]DialFunc +var ( + dialsLock sync.RWMutex + dials map[string]DialFunc +) // RegisterDial registers a custom dial function. It can then be used by the // network address mynet(addr), where mynet is the registered new network. // addr is passed as a parameter to the dial function. func RegisterDial(net string, dial DialFunc) { + dialsLock.Lock() + defer dialsLock.Unlock() if dials == nil { dials = make(map[string]DialFunc) } @@ -52,16 +63,19 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { mc := &mysqlConn{ maxAllowedPacket: maxPacketSize, maxWriteSize: maxPacketSize - 1, + closech: make(chan struct{}), } mc.cfg, err = ParseDSN(dsn) if err != nil { return nil, err } mc.parseTime = mc.cfg.ParseTime - mc.strict = mc.cfg.Strict // Connect to Server - if dial, ok := dials[mc.cfg.Net]; ok { + dialsLock.RLock() + dial, ok := dials[mc.cfg.Net] + dialsLock.RUnlock() + if ok { mc.netConn, err = dial(mc.cfg.Addr) } else { nd := net.Dialer{Timeout: mc.cfg.Timeout} @@ -81,6 +95,11 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { } } + // Call startWatcher for context support (From Go 1.8) + if s, ok := interface{}(mc).(watcher); ok { + s.startWatcher() + } + mc.buf = newBuffer(mc.netConn) // Set I/O timeouts @@ -88,20 +107,31 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { mc.writeTimeout = mc.cfg.WriteTimeout // Reading Handshake Initialization Packet - cipher, err := mc.readInitPacket() + authData, plugin, err := mc.readHandshakePacket() if err != nil { mc.cleanup() return nil, err } // Send Client Authentication Packet - if err = mc.writeAuthPacket(cipher); err != nil { + authResp, addNUL, err := mc.auth(authData, plugin) + if err != nil { + // try the default auth plugin, if using the requested plugin failed + errLog.Print("could not use requested auth plugin '"+plugin+"': ", err.Error()) + plugin = defaultAuthPlugin + authResp, addNUL, err = mc.auth(authData, plugin) + if err != nil { + mc.cleanup() + return nil, err + } + } + if err = mc.writeHandshakeResponsePacket(authResp, addNUL, plugin); err != nil { mc.cleanup() return nil, err } // Handle response to auth packet, switch methods if possible - if err = handleAuthResult(mc); err != nil { + if err = mc.handleAuthResult(authData, plugin); err != nil { // Authentication failed and MySQL has already closed the connection // (https://dev.mysql.com/doc/internals/en/authentication-fails.html). // Do not send COM_QUIT, just cleanup and return the error. @@ -134,43 +164,6 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { return mc, nil } -func handleAuthResult(mc *mysqlConn) error { - // Read Result Packet - cipher, err := mc.readResultOK() - if err == nil { - return nil // auth successful - } - - if mc.cfg == nil { - return err // auth failed and retry not possible - } - - // Retry auth if configured to do so. - if mc.cfg.AllowOldPasswords && err == ErrOldPassword { - // Retry with old authentication method. Note: there are edge cases - // where this should work but doesn't; this is currently "wontfix": - // https://github.com/go-sql-driver/mysql/issues/184 - if err = mc.writeOldAuthPacket(cipher); err != nil { - return err - } - _, err = mc.readResultOK() - } else if mc.cfg.AllowCleartextPasswords && err == ErrCleartextPassword { - // Retry with clear text password for - // http://dev.mysql.com/doc/refman/5.7/en/cleartext-authentication-plugin.html - // http://dev.mysql.com/doc/refman/5.7/en/pam-authentication-plugin.html - if err = mc.writeClearAuthPacket(); err != nil { - return err - } - _, err = mc.readResultOK() - } else if mc.cfg.AllowNativePasswords && err == ErrNativePassword { - if err = mc.writeNativeAuthPacket(cipher); err != nil { - return err - } - _, err = mc.readResultOK() - } - return err -} - func init() { sql.Register("mysql", &MySQLDriver{}) } diff --git a/vendor/github.com/go-sql-driver/mysql/dsn.go b/vendor/github.com/go-sql-driver/mysql/dsn.go index ac00dcedd..be014babe 100644 --- a/vendor/github.com/go-sql-driver/mysql/dsn.go +++ b/vendor/github.com/go-sql-driver/mysql/dsn.go @@ -10,11 +10,13 @@ package mysql import ( "bytes" + "crypto/rsa" "crypto/tls" "errors" "fmt" "net" "net/url" + "sort" "strconv" "strings" "time" @@ -27,7 +29,9 @@ var ( errInvalidDSNUnsafeCollation = errors.New("invalid DSN: interpolateParams can not be used with unsafe collations") ) -// Config is a configuration parsed from a DSN string +// Config is a configuration parsed from a DSN string. +// If a new Config is created instead of being parsed from a DSN string, +// the NewConfig function should be used, which sets default values. type Config struct { User string // Username Passwd string // Password (requires User) @@ -38,6 +42,8 @@ type Config struct { Collation string // Connection collation Loc *time.Location // Location for time.Time values MaxAllowedPacket int // Max packet size allowed + ServerPubKey string // Server public key name + pubKey *rsa.PublicKey // Server public key TLSConfig string // TLS configuration name tls *tls.Config // TLS configuration Timeout time.Duration // Dial timeout @@ -53,7 +59,54 @@ type Config struct { InterpolateParams bool // Interpolate placeholders into query string MultiStatements bool // Allow multiple statements in one query ParseTime bool // Parse time values to time.Time - Strict bool // Return warnings as errors + RejectReadOnly bool // Reject read-only connections +} + +// NewConfig creates a new Config and sets default values. +func NewConfig() *Config { + return &Config{ + Collation: defaultCollation, + Loc: time.UTC, + MaxAllowedPacket: defaultMaxAllowedPacket, + AllowNativePasswords: true, + } +} + +func (cfg *Config) normalize() error { + if cfg.InterpolateParams && unsafeCollations[cfg.Collation] { + return errInvalidDSNUnsafeCollation + } + + // Set default network if empty + if cfg.Net == "" { + cfg.Net = "tcp" + } + + // Set default address if empty + if cfg.Addr == "" { + switch cfg.Net { + case "tcp": + cfg.Addr = "127.0.0.1:3306" + case "unix": + cfg.Addr = "/tmp/mysql.sock" + default: + return errors.New("default addr for network '" + cfg.Net + "' unknown") + } + + } else if cfg.Net == "tcp" { + cfg.Addr = ensureHavePort(cfg.Addr) + } + + if cfg.tls != nil { + if cfg.tls.ServerName == "" && !cfg.tls.InsecureSkipVerify { + host, _, err := net.SplitHostPort(cfg.Addr) + if err == nil { + cfg.tls.ServerName = host + } + } + } + + return nil } // FormatDSN formats the given Config into a DSN string which can be passed to @@ -102,12 +155,12 @@ func (cfg *Config) FormatDSN() string { } } - if cfg.AllowNativePasswords { + if !cfg.AllowNativePasswords { if hasParam { - buf.WriteString("&allowNativePasswords=true") + buf.WriteString("&allowNativePasswords=false") } else { hasParam = true - buf.WriteString("?allowNativePasswords=true") + buf.WriteString("?allowNativePasswords=false") } } @@ -195,15 +248,25 @@ func (cfg *Config) FormatDSN() string { buf.WriteString(cfg.ReadTimeout.String()) } - if cfg.Strict { + if cfg.RejectReadOnly { if hasParam { - buf.WriteString("&strict=true") + buf.WriteString("&rejectReadOnly=true") } else { hasParam = true - buf.WriteString("?strict=true") + buf.WriteString("?rejectReadOnly=true") } } + if len(cfg.ServerPubKey) > 0 { + if hasParam { + buf.WriteString("&serverPubKey=") + } else { + hasParam = true + buf.WriteString("?serverPubKey=") + } + buf.WriteString(url.QueryEscape(cfg.ServerPubKey)) + } + if cfg.Timeout > 0 { if hasParam { buf.WriteString("&timeout=") @@ -234,7 +297,7 @@ func (cfg *Config) FormatDSN() string { buf.WriteString(cfg.WriteTimeout.String()) } - if cfg.MaxAllowedPacket > 0 { + if cfg.MaxAllowedPacket != defaultMaxAllowedPacket { if hasParam { buf.WriteString("&maxAllowedPacket=") } else { @@ -247,7 +310,12 @@ func (cfg *Config) FormatDSN() string { // other params if cfg.Params != nil { - for param, value := range cfg.Params { + var params []string + for param := range cfg.Params { + params = append(params, param) + } + sort.Strings(params) + for _, param := range params { if hasParam { buf.WriteByte('&') } else { @@ -257,7 +325,7 @@ func (cfg *Config) FormatDSN() string { buf.WriteString(param) buf.WriteByte('=') - buf.WriteString(url.QueryEscape(value)) + buf.WriteString(url.QueryEscape(cfg.Params[param])) } } @@ -267,10 +335,7 @@ func (cfg *Config) FormatDSN() string { // ParseDSN parses the DSN string to a Config func ParseDSN(dsn string) (cfg *Config, err error) { // New config with some default values - cfg = &Config{ - Loc: time.UTC, - Collation: defaultCollation, - } + cfg = NewConfig() // [user[:password]@][net[(addr)]]/dbname[?param1=value1¶mN=valueN] // Find the last '/' (since the password or the net addr might contain a '/') @@ -338,28 +403,9 @@ func ParseDSN(dsn string) (cfg *Config, err error) { return nil, errInvalidDSNNoSlash } - if cfg.InterpolateParams && unsafeCollations[cfg.Collation] { - return nil, errInvalidDSNUnsafeCollation + if err = cfg.normalize(); err != nil { + return nil, err } - - // Set default network if empty - if cfg.Net == "" { - cfg.Net = "tcp" - } - - // Set default address if empty - if cfg.Addr == "" { - switch cfg.Net { - case "tcp": - cfg.Addr = "127.0.0.1:3306" - case "unix": - cfg.Addr = "/tmp/mysql.sock" - default: - return nil, errors.New("default addr for network '" + cfg.Net + "' unknown") - } - - } - return } @@ -374,7 +420,6 @@ func parseDSNParams(cfg *Config, params string) (err error) { // cfg params switch value := param[1]; param[0] { - // Disable INFILE whitelist / enable all files case "allowAllFiles": var isBool bool @@ -472,14 +517,32 @@ func parseDSNParams(cfg *Config, params string) (err error) { return } - // Strict mode - case "strict": + // Reject read-only connections + case "rejectReadOnly": var isBool bool - cfg.Strict, isBool = readBool(value) + cfg.RejectReadOnly, isBool = readBool(value) if !isBool { return errors.New("invalid bool value: " + value) } + // Server public key + case "serverPubKey": + name, err := url.QueryUnescape(value) + if err != nil { + return fmt.Errorf("invalid value for server pub key name: %v", err) + } + + if pubKey := getServerPubKey(name); pubKey != nil { + cfg.ServerPubKey = name + cfg.pubKey = pubKey + } else { + return errors.New("invalid value / unknown server pub key name: " + name) + } + + // Strict mode + case "strict": + panic("strict mode has been removed. See https://github.com/go-sql-driver/mysql/wiki/strict-mode") + // Dial Timeout case "timeout": cfg.Timeout, err = time.ParseDuration(value) @@ -506,14 +569,7 @@ func parseDSNParams(cfg *Config, params string) (err error) { return fmt.Errorf("invalid value for TLS config name: %v", err) } - if tlsConfig, ok := tlsConfigRegister[name]; ok { - if len(tlsConfig.ServerName) == 0 && !tlsConfig.InsecureSkipVerify { - host, _, err := net.SplitHostPort(cfg.Addr) - if err == nil { - tlsConfig.ServerName = host - } - } - + if tlsConfig := getTLSConfigClone(name); tlsConfig != nil { cfg.TLSConfig = name cfg.tls = tlsConfig } else { @@ -546,3 +602,10 @@ func parseDSNParams(cfg *Config, params string) (err error) { return } + +func ensureHavePort(addr string) string { + if _, _, err := net.SplitHostPort(addr); err != nil { + return net.JoinHostPort(addr, "3306") + } + return addr +} diff --git a/vendor/github.com/go-sql-driver/mysql/errors.go b/vendor/github.com/go-sql-driver/mysql/errors.go index 857854e14..760782ff2 100644 --- a/vendor/github.com/go-sql-driver/mysql/errors.go +++ b/vendor/github.com/go-sql-driver/mysql/errors.go @@ -9,10 +9,8 @@ package mysql import ( - "database/sql/driver" "errors" "fmt" - "io" "log" "os" ) @@ -31,6 +29,12 @@ var ( ErrPktSyncMul = errors.New("commands out of sync. Did you run multiple statements at once?") ErrPktTooLarge = errors.New("packet for query is too large. Try adjusting the 'max_allowed_packet' variable on the server") ErrBusyBuffer = errors.New("busy buffer") + + // errBadConnNoWrite is used for connection errors where nothing was sent to the database yet. + // If this happens first in a function starting a database interaction, it should be replaced by driver.ErrBadConn + // to trigger a resend. + // See https://github.com/go-sql-driver/mysql/pull/302 + errBadConnNoWrite = errors.New("bad connection") ) var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile)) @@ -59,74 +63,3 @@ type MySQLError struct { func (me *MySQLError) Error() string { return fmt.Sprintf("Error %d: %s", me.Number, me.Message) } - -// MySQLWarnings is an error type which represents a group of one or more MySQL -// warnings -type MySQLWarnings []MySQLWarning - -func (mws MySQLWarnings) Error() string { - var msg string - for i, warning := range mws { - if i > 0 { - msg += "\r\n" - } - msg += fmt.Sprintf( - "%s %s: %s", - warning.Level, - warning.Code, - warning.Message, - ) - } - return msg -} - -// MySQLWarning is an error type which represents a single MySQL warning. -// Warnings are returned in groups only. See MySQLWarnings -type MySQLWarning struct { - Level string - Code string - Message string -} - -func (mc *mysqlConn) getWarnings() (err error) { - rows, err := mc.Query("SHOW WARNINGS", nil) - if err != nil { - return - } - - var warnings = MySQLWarnings{} - var values = make([]driver.Value, 3) - - for { - err = rows.Next(values) - switch err { - case nil: - warning := MySQLWarning{} - - if raw, ok := values[0].([]byte); ok { - warning.Level = string(raw) - } else { - warning.Level = fmt.Sprintf("%s", values[0]) - } - if raw, ok := values[1].([]byte); ok { - warning.Code = string(raw) - } else { - warning.Code = fmt.Sprintf("%s", values[1]) - } - if raw, ok := values[2].([]byte); ok { - warning.Message = string(raw) - } else { - warning.Message = fmt.Sprintf("%s", values[0]) - } - - warnings = append(warnings, warning) - - case io.EOF: - return warnings - - default: - rows.Close() - return - } - } -} diff --git a/vendor/github.com/go-sql-driver/mysql/fields.go b/vendor/github.com/go-sql-driver/mysql/fields.go new file mode 100644 index 000000000..e1e2ece4b --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/fields.go @@ -0,0 +1,194 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "database/sql" + "reflect" +) + +func (mf *mysqlField) typeDatabaseName() string { + switch mf.fieldType { + case fieldTypeBit: + return "BIT" + case fieldTypeBLOB: + if mf.charSet != collations[binaryCollation] { + return "TEXT" + } + return "BLOB" + case fieldTypeDate: + return "DATE" + case fieldTypeDateTime: + return "DATETIME" + case fieldTypeDecimal: + return "DECIMAL" + case fieldTypeDouble: + return "DOUBLE" + case fieldTypeEnum: + return "ENUM" + case fieldTypeFloat: + return "FLOAT" + case fieldTypeGeometry: + return "GEOMETRY" + case fieldTypeInt24: + return "MEDIUMINT" + case fieldTypeJSON: + return "JSON" + case fieldTypeLong: + return "INT" + case fieldTypeLongBLOB: + if mf.charSet != collations[binaryCollation] { + return "LONGTEXT" + } + return "LONGBLOB" + case fieldTypeLongLong: + return "BIGINT" + case fieldTypeMediumBLOB: + if mf.charSet != collations[binaryCollation] { + return "MEDIUMTEXT" + } + return "MEDIUMBLOB" + case fieldTypeNewDate: + return "DATE" + case fieldTypeNewDecimal: + return "DECIMAL" + case fieldTypeNULL: + return "NULL" + case fieldTypeSet: + return "SET" + case fieldTypeShort: + return "SMALLINT" + case fieldTypeString: + if mf.charSet == collations[binaryCollation] { + return "BINARY" + } + return "CHAR" + case fieldTypeTime: + return "TIME" + case fieldTypeTimestamp: + return "TIMESTAMP" + case fieldTypeTiny: + return "TINYINT" + case fieldTypeTinyBLOB: + if mf.charSet != collations[binaryCollation] { + return "TINYTEXT" + } + return "TINYBLOB" + case fieldTypeVarChar: + if mf.charSet == collations[binaryCollation] { + return "VARBINARY" + } + return "VARCHAR" + case fieldTypeVarString: + if mf.charSet == collations[binaryCollation] { + return "VARBINARY" + } + return "VARCHAR" + case fieldTypeYear: + return "YEAR" + default: + return "" + } +} + +var ( + scanTypeFloat32 = reflect.TypeOf(float32(0)) + scanTypeFloat64 = reflect.TypeOf(float64(0)) + scanTypeInt8 = reflect.TypeOf(int8(0)) + scanTypeInt16 = reflect.TypeOf(int16(0)) + scanTypeInt32 = reflect.TypeOf(int32(0)) + scanTypeInt64 = reflect.TypeOf(int64(0)) + scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{}) + scanTypeNullInt = reflect.TypeOf(sql.NullInt64{}) + scanTypeNullTime = reflect.TypeOf(NullTime{}) + scanTypeUint8 = reflect.TypeOf(uint8(0)) + scanTypeUint16 = reflect.TypeOf(uint16(0)) + scanTypeUint32 = reflect.TypeOf(uint32(0)) + scanTypeUint64 = reflect.TypeOf(uint64(0)) + scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{}) + scanTypeUnknown = reflect.TypeOf(new(interface{})) +) + +type mysqlField struct { + tableName string + name string + length uint32 + flags fieldFlag + fieldType fieldType + decimals byte + charSet uint8 +} + +func (mf *mysqlField) scanType() reflect.Type { + switch mf.fieldType { + case fieldTypeTiny: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint8 + } + return scanTypeInt8 + } + return scanTypeNullInt + + case fieldTypeShort, fieldTypeYear: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint16 + } + return scanTypeInt16 + } + return scanTypeNullInt + + case fieldTypeInt24, fieldTypeLong: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint32 + } + return scanTypeInt32 + } + return scanTypeNullInt + + case fieldTypeLongLong: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint64 + } + return scanTypeInt64 + } + return scanTypeNullInt + + case fieldTypeFloat: + if mf.flags&flagNotNULL != 0 { + return scanTypeFloat32 + } + return scanTypeNullFloat + + case fieldTypeDouble: + if mf.flags&flagNotNULL != 0 { + return scanTypeFloat64 + } + return scanTypeNullFloat + + case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar, + fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB, + fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB, + fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON, + fieldTypeTime: + return scanTypeRawBytes + + case fieldTypeDate, fieldTypeNewDate, + fieldTypeTimestamp, fieldTypeDateTime: + // NullTime is always returned for more consistent behavior as it can + // handle both cases of parseTime regardless if the field is nullable. + return scanTypeNullTime + + default: + return scanTypeUnknown + } +} diff --git a/vendor/github.com/go-sql-driver/mysql/infile.go b/vendor/github.com/go-sql-driver/mysql/infile.go index 547357cfa..273cb0ba5 100644 --- a/vendor/github.com/go-sql-driver/mysql/infile.go +++ b/vendor/github.com/go-sql-driver/mysql/infile.go @@ -147,7 +147,8 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) { } // send content packets - if err == nil { + // if packetSize == 0, the Reader contains no data + if err == nil && packetSize > 0 { data := make([]byte, 4+packetSize) var n int for err == nil { @@ -173,8 +174,7 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) { // read OK packet if err == nil { - _, err = mc.readResultOK() - return err + return mc.readResultOK() } mc.readPacket() diff --git a/vendor/github.com/go-sql-driver/mysql/packets.go b/vendor/github.com/go-sql-driver/mysql/packets.go index 9160beb09..d873a97b2 100644 --- a/vendor/github.com/go-sql-driver/mysql/packets.go +++ b/vendor/github.com/go-sql-driver/mysql/packets.go @@ -25,26 +25,23 @@ import ( // Read packet to buffer 'data' func (mc *mysqlConn) readPacket() ([]byte, error) { - var payload []byte + var prevData []byte for { - // Read packet header + // read packet header data, err := mc.buf.readNext(4) if err != nil { + if cerr := mc.canceled.Value(); cerr != nil { + return nil, cerr + } errLog.Print(err) mc.Close() - return nil, driver.ErrBadConn + return nil, ErrInvalidConn } - // Packet Length [24 bit] + // packet length [24 bit] pktLen := int(uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16) - if pktLen < 1 { - errLog.Print(ErrMalformPkt) - mc.Close() - return nil, driver.ErrBadConn - } - - // Check Packet Sync [8 bit] + // check packet sync [8 bit] if data[3] != mc.sequence { if data[3] > mc.sequence { return nil, ErrPktSyncMul @@ -53,26 +50,41 @@ func (mc *mysqlConn) readPacket() ([]byte, error) { } mc.sequence++ - // Read packet body [pktLen bytes] + // packets with length 0 terminate a previous packet which is a + // multiple of (2^24)−1 bytes long + if pktLen == 0 { + // there was no previous packet + if prevData == nil { + errLog.Print(ErrMalformPkt) + mc.Close() + return nil, ErrInvalidConn + } + + return prevData, nil + } + + // read packet body [pktLen bytes] data, err = mc.buf.readNext(pktLen) if err != nil { + if cerr := mc.canceled.Value(); cerr != nil { + return nil, cerr + } errLog.Print(err) mc.Close() - return nil, driver.ErrBadConn + return nil, ErrInvalidConn } - isLastPacket := (pktLen < maxPacketSize) + // return data if this was the last packet + if pktLen < maxPacketSize { + // zero allocations for non-split packets + if prevData == nil { + return data, nil + } - // Zero allocations for non-splitting packets - if isLastPacket && payload == nil { - return data, nil + return append(prevData, data...), nil } - payload = append(payload, data...) - - if isLastPacket { - return payload, nil - } + prevData = append(prevData, data...) } } @@ -119,33 +131,47 @@ func (mc *mysqlConn) writePacket(data []byte) error { // Handle error if err == nil { // n != len(data) + mc.cleanup() errLog.Print(ErrMalformPkt) } else { + if cerr := mc.canceled.Value(); cerr != nil { + return cerr + } + if n == 0 && pktLen == len(data)-4 { + // only for the first loop iteration when nothing was written yet + return errBadConnNoWrite + } + mc.cleanup() errLog.Print(err) } - return driver.ErrBadConn + return ErrInvalidConn } } /****************************************************************************** -* Initialisation Process * +* Initialization Process * ******************************************************************************/ // Handshake Initialization Packet // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake -func (mc *mysqlConn) readInitPacket() ([]byte, error) { +func (mc *mysqlConn) readHandshakePacket() ([]byte, string, error) { data, err := mc.readPacket() if err != nil { - return nil, err + // for init we can rewrite this to ErrBadConn for sql.Driver to retry, since + // in connection initialization we don't risk retrying non-idempotent actions. + if err == ErrInvalidConn { + return nil, "", driver.ErrBadConn + } + return nil, "", err } if data[0] == iERR { - return nil, mc.handleErrorPacket(data) + return nil, "", mc.handleErrorPacket(data) } // protocol version [1 byte] if data[0] < minProtocolVersion { - return nil, fmt.Errorf( + return nil, "", fmt.Errorf( "unsupported protocol version %d. Version %d or higher is required", data[0], minProtocolVersion, @@ -157,7 +183,7 @@ func (mc *mysqlConn) readInitPacket() ([]byte, error) { pos := 1 + bytes.IndexByte(data[1:], 0x00) + 1 + 4 // first part of the password cipher [8 bytes] - cipher := data[pos : pos+8] + authData := data[pos : pos+8] // (filler) always 0x00 [1 byte] pos += 8 + 1 @@ -165,13 +191,14 @@ func (mc *mysqlConn) readInitPacket() ([]byte, error) { // capability flags (lower 2 bytes) [2 bytes] mc.flags = clientFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) if mc.flags&clientProtocol41 == 0 { - return nil, ErrOldProtocol + return nil, "", ErrOldProtocol } if mc.flags&clientSSL == 0 && mc.cfg.tls != nil { - return nil, ErrNoTLS + return nil, "", ErrNoTLS } pos += 2 + plugin := "" if len(data) > pos { // character set [1 byte] // status flags [2 bytes] @@ -192,32 +219,34 @@ func (mc *mysqlConn) readInitPacket() ([]byte, error) { // // The official Python library uses the fixed length 12 // which seems to work but technically could have a hidden bug. - cipher = append(cipher, data[pos:pos+12]...) + authData = append(authData, data[pos:pos+12]...) + pos += 13 - // TODO: Verify string termination // EOF if version (>= 5.5.7 and < 5.5.10) or (>= 5.6.0 and < 5.6.2) // \NUL otherwise - // - //if data[len(data)-1] == 0 { - // return - //} - //return ErrMalformPkt + if end := bytes.IndexByte(data[pos:], 0x00); end != -1 { + plugin = string(data[pos : pos+end]) + } else { + plugin = string(data[pos:]) + } // make a memory safe copy of the cipher slice var b [20]byte - copy(b[:], cipher) - return b[:], nil + copy(b[:], authData) + return b[:], plugin, nil } + plugin = defaultAuthPlugin + // make a memory safe copy of the cipher slice var b [8]byte - copy(b[:], cipher) - return b[:], nil + copy(b[:], authData) + return b[:], plugin, nil } // Client Authentication Packet // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse -func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { +func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, addNUL bool, plugin string) error { // Adjust client flags based on server support clientFlags := clientProtocol41 | clientSecureConn | @@ -241,10 +270,19 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { clientFlags |= clientMultiStatements } - // User Password - scrambleBuff := scramblePassword(cipher, []byte(mc.cfg.Passwd)) + // encode length of the auth plugin data + var authRespLEIBuf [9]byte + authRespLEI := appendLengthEncodedInteger(authRespLEIBuf[:0], uint64(len(authResp))) + if len(authRespLEI) > 1 { + // if the length can not be written in 1 byte, it must be written as a + // length encoded integer + clientFlags |= clientPluginAuthLenEncClientData + } - pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.User) + 1 + 1 + len(scrambleBuff) + 21 + 1 + pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.User) + 1 + len(authRespLEI) + len(authResp) + 21 + 1 + if addNUL { + pktLen++ + } // To specify a db name if n := len(mc.cfg.DBName); n > 0 { @@ -255,9 +293,9 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { // Calculate packet length and get buffer with that size data := mc.buf.takeSmallBuffer(pktLen + 4) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // ClientFlags [32 bit] @@ -312,9 +350,13 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { data[pos] = 0x00 pos++ - // ScrambleBuffer [length encoded integer] - data[pos] = byte(len(scrambleBuff)) - pos += 1 + copy(data[pos+1:], scrambleBuff) + // Auth Data [length encoded integer] + pos += copy(data[pos:], authRespLEI) + pos += copy(data[pos:], authResp) + if addNUL { + data[pos] = 0x00 + pos++ + } // Databasename [null terminated string] if len(mc.cfg.DBName) > 0 { @@ -323,72 +365,32 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { pos++ } - // Assume native client during response - pos += copy(data[pos:], "mysql_native_password") + pos += copy(data[pos:], plugin) data[pos] = 0x00 // Send Auth packet return mc.writePacket(data) } -// Client old authentication packet // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeOldAuthPacket(cipher []byte) error { - // User password - scrambleBuff := scrambleOldPassword(cipher, []byte(mc.cfg.Passwd)) - - // Calculate the packet length and add a tailing 0 - pktLen := len(scrambleBuff) + 1 - data := mc.buf.takeSmallBuffer(4 + pktLen) +func (mc *mysqlConn) writeAuthSwitchPacket(authData []byte, addNUL bool) error { + pktLen := 4 + len(authData) + if addNUL { + pktLen++ + } + data := mc.buf.takeSmallBuffer(pktLen) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } - // Add the scrambled password [null terminated string] - copy(data[4:], scrambleBuff) - data[4+pktLen-1] = 0x00 - - return mc.writePacket(data) -} - -// Client clear text authentication packet -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeClearAuthPacket() error { - // Calculate the packet length and add a tailing 0 - pktLen := len(mc.cfg.Passwd) + 1 - data := mc.buf.takeSmallBuffer(4 + pktLen) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + // Add the auth data [EOF] + copy(data[4:], authData) + if addNUL { + data[pktLen-1] = 0x00 } - // Add the clear password [null terminated string] - copy(data[4:], mc.cfg.Passwd) - data[4+pktLen-1] = 0x00 - - return mc.writePacket(data) -} - -// Native password authentication method -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeNativeAuthPacket(cipher []byte) error { - scrambleBuff := scramblePassword(cipher, []byte(mc.cfg.Passwd)) - - // Calculate the packet length and add a tailing 0 - pktLen := len(scrambleBuff) - data := mc.buf.takeSmallBuffer(4 + pktLen) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn - } - - // Add the scramble - copy(data[4:], scrambleBuff) - return mc.writePacket(data) } @@ -402,9 +404,9 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error { data := mc.buf.takeSmallBuffer(4 + 1) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // Add command byte @@ -421,9 +423,9 @@ func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error { pktLen := 1 + len(arg) data := mc.buf.takeBuffer(pktLen + 4) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // Add command byte @@ -442,9 +444,9 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { data := mc.buf.takeSmallBuffer(4 + 1 + 4) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // Add command byte @@ -464,43 +466,50 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { * Result Packets * ******************************************************************************/ -// Returns error if Packet is not an 'Result OK'-Packet -func (mc *mysqlConn) readResultOK() ([]byte, error) { +func (mc *mysqlConn) readAuthResult() ([]byte, string, error) { data, err := mc.readPacket() - if err == nil { - // packet indicator - switch data[0] { - - case iOK: - return nil, mc.handleOkPacket(data) - - case iEOF: - if len(data) > 1 { - pluginEndIndex := bytes.IndexByte(data, 0x00) - plugin := string(data[1:pluginEndIndex]) - cipher := data[pluginEndIndex+1 : len(data)-1] - - if plugin == "mysql_old_password" { - // using old_passwords - return cipher, ErrOldPassword - } else if plugin == "mysql_clear_password" { - // using clear text password - return cipher, ErrCleartextPassword - } else if plugin == "mysql_native_password" { - // using mysql default authentication method - return cipher, ErrNativePassword - } else { - return cipher, ErrUnknownPlugin - } - } else { - return nil, ErrOldPassword - } - - default: // Error otherwise - return nil, mc.handleErrorPacket(data) - } + if err != nil { + return nil, "", err } - return nil, err + + // packet indicator + switch data[0] { + + case iOK: + return nil, "", mc.handleOkPacket(data) + + case iAuthMoreData: + return data[1:], "", err + + case iEOF: + if len(data) < 1 { + // https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::OldAuthSwitchRequest + return nil, "mysql_old_password", nil + } + pluginEndIndex := bytes.IndexByte(data, 0x00) + if pluginEndIndex < 0 { + return nil, "", ErrMalformPkt + } + plugin := string(data[1:pluginEndIndex]) + authData := data[pluginEndIndex+1:] + return authData, plugin, nil + + default: // Error otherwise + return nil, "", mc.handleErrorPacket(data) + } +} + +// Returns error if Packet is not an 'Result OK'-Packet +func (mc *mysqlConn) readResultOK() error { + data, err := mc.readPacket() + if err != nil { + return err + } + + if data[0] == iOK { + return mc.handleOkPacket(data) + } + return mc.handleErrorPacket(data) } // Result Set Header Packet @@ -543,6 +552,22 @@ func (mc *mysqlConn) handleErrorPacket(data []byte) error { // Error Number [16 bit uint] errno := binary.LittleEndian.Uint16(data[1:3]) + // 1792: ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION + // 1290: ER_OPTION_PREVENTS_STATEMENT (returned by Aurora during failover) + if (errno == 1792 || errno == 1290) && mc.cfg.RejectReadOnly { + // Oops; we are connected to a read-only connection, and won't be able + // to issue any write statements. Since RejectReadOnly is configured, + // we throw away this connection hoping this one would have write + // permission. This is specifically for a possible race condition + // during failover (e.g. on AWS Aurora). See README.md for more. + // + // We explicitly close the connection before returning + // driver.ErrBadConn to ensure that `database/sql` purges this + // connection and initiates a new one for next statement next time. + mc.Close() + return driver.ErrBadConn + } + pos := 3 // SQL State [optional: # + 5bytes string] @@ -577,19 +602,12 @@ func (mc *mysqlConn) handleOkPacket(data []byte) error { // server_status [2 bytes] mc.status = readStatus(data[1+n+m : 1+n+m+2]) - if err := mc.discardResults(); err != nil { - return err - } - - // warning count [2 bytes] - if !mc.strict { + if mc.status&statusMoreResultsExists != 0 { return nil } - pos := 1 + n + m + 2 - if binary.LittleEndian.Uint16(data[pos:pos+2]) > 0 { - return mc.getWarnings() - } + // warning count [2 bytes] + return nil } @@ -661,14 +679,21 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) { if err != nil { return nil, err } + pos += n // Filler [uint8] + pos++ + // Charset [charset, collation uint8] + columns[i].charSet = data[pos] + pos += 2 + // Length [uint32] - pos += n + 1 + 2 + 4 + columns[i].length = binary.LittleEndian.Uint32(data[pos : pos+4]) + pos += 4 // Field type [uint8] - columns[i].fieldType = data[pos] + columns[i].fieldType = fieldType(data[pos]) pos++ // Flags [uint16] @@ -691,6 +716,10 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) { func (rows *textRows) readRow(dest []driver.Value) error { mc := rows.mc + if rows.rs.done { + return io.EOF + } + data, err := mc.readPacket() if err != nil { return err @@ -700,10 +729,10 @@ func (rows *textRows) readRow(dest []driver.Value) error { if data[0] == iEOF && len(data) == 5 { // server_status [2 bytes] rows.mc.status = readStatus(data[3:]) - if err := rows.mc.discardResults(); err != nil { - return err + rows.rs.done = true + if !rows.HasNextResultSet() { + rows.mc = nil } - rows.mc = nil return io.EOF } if data[0] == iERR { @@ -725,7 +754,7 @@ func (rows *textRows) readRow(dest []driver.Value) error { if !mc.parseTime { continue } else { - switch rows.columns[i].fieldType { + switch rows.rs.columns[i].fieldType { case fieldTypeTimestamp, fieldTypeDateTime, fieldTypeDate, fieldTypeNewDate: dest[i], err = parseDateTime( @@ -797,14 +826,7 @@ func (stmt *mysqlStmt) readPrepareResultPacket() (uint16, error) { // Reserved [8 bit] // Warning count [16 bit uint] - if !stmt.mc.strict { - return columnCount, nil - } - // Check for warnings count > 0, only available in MySQL > 4.1 - if len(data) >= 12 && binary.LittleEndian.Uint16(data[10:12]) > 0 { - return columnCount, stmt.mc.getWarnings() - } return columnCount, nil } return 0, err @@ -821,7 +843,7 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error { // 2 bytes paramID const dataOffset = 1 + 4 + 2 - // Can not use the write buffer since + // Cannot use the write buffer since // a) the buffer is too small // b) it is in use data := make([]byte, 4+1+4+2+len(arg)) @@ -876,6 +898,12 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { const minPktLen = 4 + 1 + 4 + 1 + 4 mc := stmt.mc + // Determine threshould dynamically to avoid packet size shortage. + longDataSize := mc.maxAllowedPacket / (stmt.paramCount + 1) + if longDataSize < 64 { + longDataSize = 64 + } + // Reset packet-sequence mc.sequence = 0 @@ -887,9 +915,9 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { data = mc.buf.takeCompleteBuffer() } if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // command [1 byte] @@ -948,7 +976,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { // build NULL-bitmap if arg == nil { nullMask[i/8] |= 1 << (uint(i) & 7) - paramTypes[i+i] = fieldTypeNULL + paramTypes[i+i] = byte(fieldTypeNULL) paramTypes[i+i+1] = 0x00 continue } @@ -956,7 +984,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { // cache types and values switch v := arg.(type) { case int64: - paramTypes[i+i] = fieldTypeLongLong + paramTypes[i+i] = byte(fieldTypeLongLong) paramTypes[i+i+1] = 0x00 if cap(paramValues)-len(paramValues)-8 >= 0 { @@ -972,7 +1000,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { } case float64: - paramTypes[i+i] = fieldTypeDouble + paramTypes[i+i] = byte(fieldTypeDouble) paramTypes[i+i+1] = 0x00 if cap(paramValues)-len(paramValues)-8 >= 0 { @@ -988,7 +1016,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { } case bool: - paramTypes[i+i] = fieldTypeTiny + paramTypes[i+i] = byte(fieldTypeTiny) paramTypes[i+i+1] = 0x00 if v { @@ -1000,10 +1028,10 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { case []byte: // Common case (non-nil value) first if v != nil { - paramTypes[i+i] = fieldTypeString + paramTypes[i+i] = byte(fieldTypeString) paramTypes[i+i+1] = 0x00 - if len(v) < mc.maxAllowedPacket-pos-len(paramValues)-(len(args)-(i+1))*64 { + if len(v) < longDataSize { paramValues = appendLengthEncodedInteger(paramValues, uint64(len(v)), ) @@ -1018,14 +1046,14 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { // Handle []byte(nil) as a NULL value nullMask[i/8] |= 1 << (uint(i) & 7) - paramTypes[i+i] = fieldTypeNULL + paramTypes[i+i] = byte(fieldTypeNULL) paramTypes[i+i+1] = 0x00 case string: - paramTypes[i+i] = fieldTypeString + paramTypes[i+i] = byte(fieldTypeString) paramTypes[i+i+1] = 0x00 - if len(v) < mc.maxAllowedPacket-pos-len(paramValues)-(len(args)-(i+1))*64 { + if len(v) < longDataSize { paramValues = appendLengthEncodedInteger(paramValues, uint64(len(v)), ) @@ -1037,23 +1065,25 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { } case time.Time: - paramTypes[i+i] = fieldTypeString + paramTypes[i+i] = byte(fieldTypeString) paramTypes[i+i+1] = 0x00 - var val []byte + var a [64]byte + var b = a[:0] + if v.IsZero() { - val = []byte("0000-00-00") + b = append(b, "0000-00-00"...) } else { - val = []byte(v.In(mc.cfg.Loc).Format(timeFormat)) + b = v.In(mc.cfg.Loc).AppendFormat(b, timeFormat) } paramValues = appendLengthEncodedInteger(paramValues, - uint64(len(val)), + uint64(len(b)), ) - paramValues = append(paramValues, val...) + paramValues = append(paramValues, b...) default: - return fmt.Errorf("can not convert type: %T", arg) + return fmt.Errorf("cannot convert type: %T", arg) } } @@ -1086,8 +1116,6 @@ func (mc *mysqlConn) discardResults() error { if err := mc.readUntilEOF(); err != nil { return err } - } else { - mc.status &^= statusMoreResultsExists } } return nil @@ -1105,16 +1133,17 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { // EOF Packet if data[0] == iEOF && len(data) == 5 { rows.mc.status = readStatus(data[3:]) - if err := rows.mc.discardResults(); err != nil { - return err + rows.rs.done = true + if !rows.HasNextResultSet() { + rows.mc = nil } - rows.mc = nil return io.EOF } + mc := rows.mc rows.mc = nil // Error otherwise - return rows.mc.handleErrorPacket(data) + return mc.handleErrorPacket(data) } // NULL-bitmap, [(column-count + 7 + 2) / 8 bytes] @@ -1130,14 +1159,14 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { } // Convert to byte-coded string - switch rows.columns[i].fieldType { + switch rows.rs.columns[i].fieldType { case fieldTypeNULL: dest[i] = nil continue // Numeric Types case fieldTypeTiny: - if rows.columns[i].flags&flagUnsigned != 0 { + if rows.rs.columns[i].flags&flagUnsigned != 0 { dest[i] = int64(data[pos]) } else { dest[i] = int64(int8(data[pos])) @@ -1146,7 +1175,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { continue case fieldTypeShort, fieldTypeYear: - if rows.columns[i].flags&flagUnsigned != 0 { + if rows.rs.columns[i].flags&flagUnsigned != 0 { dest[i] = int64(binary.LittleEndian.Uint16(data[pos : pos+2])) } else { dest[i] = int64(int16(binary.LittleEndian.Uint16(data[pos : pos+2]))) @@ -1155,7 +1184,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { continue case fieldTypeInt24, fieldTypeLong: - if rows.columns[i].flags&flagUnsigned != 0 { + if rows.rs.columns[i].flags&flagUnsigned != 0 { dest[i] = int64(binary.LittleEndian.Uint32(data[pos : pos+4])) } else { dest[i] = int64(int32(binary.LittleEndian.Uint32(data[pos : pos+4]))) @@ -1164,7 +1193,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { continue case fieldTypeLongLong: - if rows.columns[i].flags&flagUnsigned != 0 { + if rows.rs.columns[i].flags&flagUnsigned != 0 { val := binary.LittleEndian.Uint64(data[pos : pos+8]) if val > math.MaxInt64 { dest[i] = uint64ToString(val) @@ -1178,7 +1207,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { continue case fieldTypeFloat: - dest[i] = float32(math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4]))) + dest[i] = math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4])) pos += 4 continue @@ -1218,10 +1247,10 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { case isNull: dest[i] = nil continue - case rows.columns[i].fieldType == fieldTypeTime: + case rows.rs.columns[i].fieldType == fieldTypeTime: // database/sql does not support an equivalent to TIME, return a string var dstlen uint8 - switch decimals := rows.columns[i].decimals; decimals { + switch decimals := rows.rs.columns[i].decimals; decimals { case 0x00, 0x1f: dstlen = 8 case 1, 2, 3, 4, 5, 6: @@ -1229,7 +1258,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { default: return fmt.Errorf( "protocol error, illegal decimals value %d", - rows.columns[i].decimals, + rows.rs.columns[i].decimals, ) } dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen, true) @@ -1237,10 +1266,10 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.Loc) default: var dstlen uint8 - if rows.columns[i].fieldType == fieldTypeDate { + if rows.rs.columns[i].fieldType == fieldTypeDate { dstlen = 10 } else { - switch decimals := rows.columns[i].decimals; decimals { + switch decimals := rows.rs.columns[i].decimals; decimals { case 0x00, 0x1f: dstlen = 19 case 1, 2, 3, 4, 5, 6: @@ -1248,7 +1277,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { default: return fmt.Errorf( "protocol error, illegal decimals value %d", - rows.columns[i].decimals, + rows.rs.columns[i].decimals, ) } } @@ -1264,7 +1293,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { // Please report if this happens! default: - return fmt.Errorf("unknown field type %d", rows.columns[i].fieldType) + return fmt.Errorf("unknown field type %d", rows.rs.columns[i].fieldType) } } diff --git a/vendor/github.com/go-sql-driver/mysql/rows.go b/vendor/github.com/go-sql-driver/mysql/rows.go index c08255eee..d3b1e2822 100644 --- a/vendor/github.com/go-sql-driver/mysql/rows.go +++ b/vendor/github.com/go-sql-driver/mysql/rows.go @@ -11,19 +11,20 @@ package mysql import ( "database/sql/driver" "io" + "math" + "reflect" ) -type mysqlField struct { - tableName string - name string - flags fieldFlag - fieldType byte - decimals byte +type resultSet struct { + columns []mysqlField + columnNames []string + done bool } type mysqlRows struct { - mc *mysqlConn - columns []mysqlField + mc *mysqlConn + rs resultSet + finish func() } type binaryRows struct { @@ -34,37 +35,86 @@ type textRows struct { mysqlRows } -type emptyRows struct{} - func (rows *mysqlRows) Columns() []string { - columns := make([]string, len(rows.columns)) + if rows.rs.columnNames != nil { + return rows.rs.columnNames + } + + columns := make([]string, len(rows.rs.columns)) if rows.mc != nil && rows.mc.cfg.ColumnsWithAlias { for i := range columns { - if tableName := rows.columns[i].tableName; len(tableName) > 0 { - columns[i] = tableName + "." + rows.columns[i].name + if tableName := rows.rs.columns[i].tableName; len(tableName) > 0 { + columns[i] = tableName + "." + rows.rs.columns[i].name } else { - columns[i] = rows.columns[i].name + columns[i] = rows.rs.columns[i].name } } } else { for i := range columns { - columns[i] = rows.columns[i].name + columns[i] = rows.rs.columns[i].name } } + + rows.rs.columnNames = columns return columns } -func (rows *mysqlRows) Close() error { +func (rows *mysqlRows) ColumnTypeDatabaseTypeName(i int) string { + return rows.rs.columns[i].typeDatabaseName() +} + +// func (rows *mysqlRows) ColumnTypeLength(i int) (length int64, ok bool) { +// return int64(rows.rs.columns[i].length), true +// } + +func (rows *mysqlRows) ColumnTypeNullable(i int) (nullable, ok bool) { + return rows.rs.columns[i].flags&flagNotNULL == 0, true +} + +func (rows *mysqlRows) ColumnTypePrecisionScale(i int) (int64, int64, bool) { + column := rows.rs.columns[i] + decimals := int64(column.decimals) + + switch column.fieldType { + case fieldTypeDecimal, fieldTypeNewDecimal: + if decimals > 0 { + return int64(column.length) - 2, decimals, true + } + return int64(column.length) - 1, decimals, true + case fieldTypeTimestamp, fieldTypeDateTime, fieldTypeTime: + return decimals, decimals, true + case fieldTypeFloat, fieldTypeDouble: + if decimals == 0x1f { + return math.MaxInt64, math.MaxInt64, true + } + return math.MaxInt64, decimals, true + } + + return 0, 0, false +} + +func (rows *mysqlRows) ColumnTypeScanType(i int) reflect.Type { + return rows.rs.columns[i].scanType() +} + +func (rows *mysqlRows) Close() (err error) { + if f := rows.finish; f != nil { + f() + rows.finish = nil + } + mc := rows.mc if mc == nil { return nil } - if mc.netConn == nil { - return ErrInvalidConn + if err := mc.error(); err != nil { + return err } // Remove unread packets from stream - err := mc.readUntilEOF() + if !rows.rs.done { + err = mc.readUntilEOF() + } if err == nil { if err = mc.discardResults(); err != nil { return err @@ -75,10 +125,66 @@ func (rows *mysqlRows) Close() error { return err } +func (rows *mysqlRows) HasNextResultSet() (b bool) { + if rows.mc == nil { + return false + } + return rows.mc.status&statusMoreResultsExists != 0 +} + +func (rows *mysqlRows) nextResultSet() (int, error) { + if rows.mc == nil { + return 0, io.EOF + } + if err := rows.mc.error(); err != nil { + return 0, err + } + + // Remove unread packets from stream + if !rows.rs.done { + if err := rows.mc.readUntilEOF(); err != nil { + return 0, err + } + rows.rs.done = true + } + + if !rows.HasNextResultSet() { + rows.mc = nil + return 0, io.EOF + } + rows.rs = resultSet{} + return rows.mc.readResultSetHeaderPacket() +} + +func (rows *mysqlRows) nextNotEmptyResultSet() (int, error) { + for { + resLen, err := rows.nextResultSet() + if err != nil { + return 0, err + } + + if resLen > 0 { + return resLen, nil + } + + rows.rs.done = true + } +} + +func (rows *binaryRows) NextResultSet() error { + resLen, err := rows.nextNotEmptyResultSet() + if err != nil { + return err + } + + rows.rs.columns, err = rows.mc.readColumns(resLen) + return err +} + func (rows *binaryRows) Next(dest []driver.Value) error { if mc := rows.mc; mc != nil { - if mc.netConn == nil { - return ErrInvalidConn + if err := mc.error(); err != nil { + return err } // Fetch next row from stream @@ -87,10 +193,20 @@ func (rows *binaryRows) Next(dest []driver.Value) error { return io.EOF } +func (rows *textRows) NextResultSet() (err error) { + resLen, err := rows.nextNotEmptyResultSet() + if err != nil { + return err + } + + rows.rs.columns, err = rows.mc.readColumns(resLen) + return err +} + func (rows *textRows) Next(dest []driver.Value) error { if mc := rows.mc; mc != nil { - if mc.netConn == nil { - return ErrInvalidConn + if err := mc.error(); err != nil { + return err } // Fetch next row from stream @@ -98,15 +214,3 @@ func (rows *textRows) Next(dest []driver.Value) error { } return io.EOF } - -func (rows emptyRows) Columns() []string { - return nil -} - -func (rows emptyRows) Close() error { - return nil -} - -func (rows emptyRows) Next(dest []driver.Value) error { - return io.EOF -} diff --git a/vendor/github.com/go-sql-driver/mysql/statement.go b/vendor/github.com/go-sql-driver/mysql/statement.go index ead9a6bf4..ce7fe4cd0 100644 --- a/vendor/github.com/go-sql-driver/mysql/statement.go +++ b/vendor/github.com/go-sql-driver/mysql/statement.go @@ -11,6 +11,7 @@ package mysql import ( "database/sql/driver" "fmt" + "io" "reflect" "strconv" ) @@ -19,12 +20,14 @@ type mysqlStmt struct { mc *mysqlConn id uint32 paramCount int - columns []mysqlField // cached from the first query } func (stmt *mysqlStmt) Close() error { - if stmt.mc == nil || stmt.mc.netConn == nil { - errLog.Print(ErrInvalidConn) + if stmt.mc == nil || stmt.mc.closed.IsSet() { + // driver.Stmt.Close can be called more than once, thus this function + // has to be idempotent. + // See also Issue #450 and golang/go#16019. + //errLog.Print(ErrInvalidConn) return driver.ErrBadConn } @@ -42,14 +45,14 @@ func (stmt *mysqlStmt) ColumnConverter(idx int) driver.ValueConverter { } func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) { - if stmt.mc.netConn == nil { + if stmt.mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } // Send command err := stmt.writeExecutePacket(args) if err != nil { - return nil, err + return nil, stmt.mc.markBadConn(err) } mc := stmt.mc @@ -59,37 +62,45 @@ func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) { // Read Result resLen, err := mc.readResultSetHeaderPacket() - if err == nil { - if resLen > 0 { - // Columns - err = mc.readUntilEOF() - if err != nil { - return nil, err - } + if err != nil { + return nil, err + } - // Rows - err = mc.readUntilEOF() + if resLen > 0 { + // Columns + if err = mc.readUntilEOF(); err != nil { + return nil, err } - if err == nil { - return &mysqlResult{ - affectedRows: int64(mc.affectedRows), - insertId: int64(mc.insertId), - }, nil + + // Rows + if err := mc.readUntilEOF(); err != nil { + return nil, err } } - return nil, err + if err := mc.discardResults(); err != nil { + return nil, err + } + + return &mysqlResult{ + affectedRows: int64(mc.affectedRows), + insertId: int64(mc.insertId), + }, nil } func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { - if stmt.mc.netConn == nil { + return stmt.query(args) +} + +func (stmt *mysqlStmt) query(args []driver.Value) (*binaryRows, error) { + if stmt.mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } // Send command err := stmt.writeExecutePacket(args) if err != nil { - return nil, err + return nil, stmt.mc.markBadConn(err) } mc := stmt.mc @@ -104,14 +115,15 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { if resLen > 0 { rows.mc = mc - // Columns - // If not cached, read them and cache them - if stmt.columns == nil { - rows.columns, err = mc.readColumns(resLen) - stmt.columns = rows.columns - } else { - rows.columns = stmt.columns - err = mc.readUntilEOF() + rows.rs.columns, err = mc.readColumns(resLen) + } else { + rows.rs.done = true + + switch err := rows.NextResultSet(); err { + case nil, io.EOF: + return rows, nil + default: + return nil, err } } @@ -120,19 +132,36 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { type converter struct{} +// ConvertValue mirrors the reference/default converter in database/sql/driver +// with _one_ exception. We support uint64 with their high bit and the default +// implementation does not. This function should be kept in sync with +// database/sql/driver defaultConverter.ConvertValue() except for that +// deliberate difference. func (c converter) ConvertValue(v interface{}) (driver.Value, error) { if driver.IsValue(v) { return v, nil } + if vr, ok := v.(driver.Valuer); ok { + sv, err := callValuerValue(vr) + if err != nil { + return nil, err + } + if !driver.IsValue(sv) { + return nil, fmt.Errorf("non-Value type %T returned from Value", sv) + } + return sv, nil + } + rv := reflect.ValueOf(v) switch rv.Kind() { case reflect.Ptr: // indirect pointers if rv.IsNil() { return nil, nil + } else { + return c.ConvertValue(rv.Elem().Interface()) } - return c.ConvertValue(rv.Elem().Interface()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return rv.Int(), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32: @@ -145,6 +174,38 @@ func (c converter) ConvertValue(v interface{}) (driver.Value, error) { return int64(u64), nil case reflect.Float32, reflect.Float64: return rv.Float(), nil + case reflect.Bool: + return rv.Bool(), nil + case reflect.Slice: + ek := rv.Type().Elem().Kind() + if ek == reflect.Uint8 { + return rv.Bytes(), nil + } + return nil, fmt.Errorf("unsupported type %T, a slice of %s", v, ek) + case reflect.String: + return rv.String(), nil } return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind()) } + +var valuerReflectType = reflect.TypeOf((*driver.Valuer)(nil)).Elem() + +// callValuerValue returns vr.Value(), with one exception: +// If vr.Value is an auto-generated method on a pointer type and the +// pointer is nil, it would panic at runtime in the panicwrap +// method. Treat it like nil instead. +// +// This is so people can implement driver.Value on value types and +// still use nil pointers to those types to mean nil/NULL, just like +// string/*string. +// +// This is an exact copy of the same-named unexported function from the +// database/sql package. +func callValuerValue(vr driver.Valuer) (v driver.Value, err error) { + if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Ptr && + rv.IsNil() && + rv.Type().Elem().Implements(valuerReflectType) { + return nil, nil + } + return vr.Value() +} diff --git a/vendor/github.com/go-sql-driver/mysql/transaction.go b/vendor/github.com/go-sql-driver/mysql/transaction.go index 33c749b35..417d72793 100644 --- a/vendor/github.com/go-sql-driver/mysql/transaction.go +++ b/vendor/github.com/go-sql-driver/mysql/transaction.go @@ -13,7 +13,7 @@ type mysqlTx struct { } func (tx *mysqlTx) Commit() (err error) { - if tx.mc == nil || tx.mc.netConn == nil { + if tx.mc == nil || tx.mc.closed.IsSet() { return ErrInvalidConn } err = tx.mc.exec("COMMIT") @@ -22,7 +22,7 @@ func (tx *mysqlTx) Commit() (err error) { } func (tx *mysqlTx) Rollback() (err error) { - if tx.mc == nil || tx.mc.netConn == nil { + if tx.mc == nil || tx.mc.closed.IsSet() { return ErrInvalidConn } err = tx.mc.exec("ROLLBACK") diff --git a/vendor/github.com/go-sql-driver/mysql/utils.go b/vendor/github.com/go-sql-driver/mysql/utils.go index d523b7ffd..84d595b6b 100644 --- a/vendor/github.com/go-sql-driver/mysql/utils.go +++ b/vendor/github.com/go-sql-driver/mysql/utils.go @@ -9,23 +9,29 @@ package mysql import ( - "crypto/sha1" "crypto/tls" "database/sql/driver" "encoding/binary" "fmt" "io" "strings" + "sync" + "sync/atomic" "time" ) +// Registry for custom tls.Configs var ( - tlsConfigRegister map[string]*tls.Config // Register for custom tls.Configs + tlsConfigLock sync.RWMutex + tlsConfigRegistry map[string]*tls.Config ) // RegisterTLSConfig registers a custom tls.Config to be used with sql.Open. // Use the key as a value in the DSN where tls=value. // +// Note: The provided tls.Config is exclusively owned by the driver after +// registering it. +// // rootCertPool := x509.NewCertPool() // pem, err := ioutil.ReadFile("/path/ca-cert.pem") // if err != nil { @@ -51,19 +57,32 @@ func RegisterTLSConfig(key string, config *tls.Config) error { return fmt.Errorf("key '%s' is reserved", key) } - if tlsConfigRegister == nil { - tlsConfigRegister = make(map[string]*tls.Config) + tlsConfigLock.Lock() + if tlsConfigRegistry == nil { + tlsConfigRegistry = make(map[string]*tls.Config) } - tlsConfigRegister[key] = config + tlsConfigRegistry[key] = config + tlsConfigLock.Unlock() return nil } // DeregisterTLSConfig removes the tls.Config associated with key. func DeregisterTLSConfig(key string) { - if tlsConfigRegister != nil { - delete(tlsConfigRegister, key) + tlsConfigLock.Lock() + if tlsConfigRegistry != nil { + delete(tlsConfigRegistry, key) } + tlsConfigLock.Unlock() +} + +func getTLSConfigClone(key string) (config *tls.Config) { + tlsConfigLock.RLock() + if v, ok := tlsConfigRegistry[key]; ok { + config = cloneTLSConfig(v) + } + tlsConfigLock.RUnlock() + return } // Returns the bool value of the input. @@ -80,119 +99,6 @@ func readBool(input string) (value bool, valid bool) { return } -/****************************************************************************** -* Authentication * -******************************************************************************/ - -// Encrypt password using 4.1+ method -func scramblePassword(scramble, password []byte) []byte { - if len(password) == 0 { - return nil - } - - // stage1Hash = SHA1(password) - crypt := sha1.New() - crypt.Write(password) - stage1 := crypt.Sum(nil) - - // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) - // inner Hash - crypt.Reset() - crypt.Write(stage1) - hash := crypt.Sum(nil) - - // outer Hash - crypt.Reset() - crypt.Write(scramble) - crypt.Write(hash) - scramble = crypt.Sum(nil) - - // token = scrambleHash XOR stage1Hash - for i := range scramble { - scramble[i] ^= stage1[i] - } - return scramble -} - -// Encrypt password using pre 4.1 (old password) method -// https://github.com/atcurtis/mariadb/blob/master/mysys/my_rnd.c -type myRnd struct { - seed1, seed2 uint32 -} - -const myRndMaxVal = 0x3FFFFFFF - -// Pseudo random number generator -func newMyRnd(seed1, seed2 uint32) *myRnd { - return &myRnd{ - seed1: seed1 % myRndMaxVal, - seed2: seed2 % myRndMaxVal, - } -} - -// Tested to be equivalent to MariaDB's floating point variant -// http://play.golang.org/p/QHvhd4qved -// http://play.golang.org/p/RG0q4ElWDx -func (r *myRnd) NextByte() byte { - r.seed1 = (r.seed1*3 + r.seed2) % myRndMaxVal - r.seed2 = (r.seed1 + r.seed2 + 33) % myRndMaxVal - - return byte(uint64(r.seed1) * 31 / myRndMaxVal) -} - -// Generate binary hash from byte string using insecure pre 4.1 method -func pwHash(password []byte) (result [2]uint32) { - var add uint32 = 7 - var tmp uint32 - - result[0] = 1345345333 - result[1] = 0x12345671 - - for _, c := range password { - // skip spaces and tabs in password - if c == ' ' || c == '\t' { - continue - } - - tmp = uint32(c) - result[0] ^= (((result[0] & 63) + add) * tmp) + (result[0] << 8) - result[1] += (result[1] << 8) ^ result[0] - add += tmp - } - - // Remove sign bit (1<<31)-1) - result[0] &= 0x7FFFFFFF - result[1] &= 0x7FFFFFFF - - return -} - -// Encrypt password using insecure pre 4.1 method -func scrambleOldPassword(scramble, password []byte) []byte { - if len(password) == 0 { - return nil - } - - scramble = scramble[:8] - - hashPw := pwHash(password) - hashSc := pwHash(scramble) - - r := newMyRnd(hashPw[0]^hashSc[0], hashPw[1]^hashSc[1]) - - var out [8]byte - for i := range out { - out[i] = r.NextByte() + 64 - } - - mask := r.NextByte() - for i := range out { - out[i] ^= mask - } - - return out[:] -} - /****************************************************************************** * Time related utils * ******************************************************************************/ @@ -519,7 +425,7 @@ func readLengthEncodedString(b []byte) ([]byte, bool, int, error) { // Check data length if len(b) >= n { - return b[n-int(num) : n], false, n, nil + return b[n-int(num) : n : n], false, n, nil } return nil, false, n, io.EOF } @@ -548,8 +454,8 @@ func readLengthEncodedInteger(b []byte) (uint64, bool, int) { if len(b) == 0 { return 0, true, 1 } - switch b[0] { + switch b[0] { // 251: NULL case 0xfb: return 0, true, 1 @@ -738,3 +644,67 @@ func escapeStringQuotes(buf []byte, v string) []byte { return buf[:pos] } + +/****************************************************************************** +* Sync utils * +******************************************************************************/ + +// noCopy may be embedded into structs which must not be copied +// after the first use. +// +// See https://github.com/golang/go/issues/8005#issuecomment-190753527 +// for details. +type noCopy struct{} + +// Lock is a no-op used by -copylocks checker from `go vet`. +func (*noCopy) Lock() {} + +// atomicBool is a wrapper around uint32 for usage as a boolean value with +// atomic access. +type atomicBool struct { + _noCopy noCopy + value uint32 +} + +// IsSet returns wether the current boolean value is true +func (ab *atomicBool) IsSet() bool { + return atomic.LoadUint32(&ab.value) > 0 +} + +// Set sets the value of the bool regardless of the previous value +func (ab *atomicBool) Set(value bool) { + if value { + atomic.StoreUint32(&ab.value, 1) + } else { + atomic.StoreUint32(&ab.value, 0) + } +} + +// TrySet sets the value of the bool and returns wether the value changed +func (ab *atomicBool) TrySet(value bool) bool { + if value { + return atomic.SwapUint32(&ab.value, 1) == 0 + } + return atomic.SwapUint32(&ab.value, 0) > 0 +} + +// atomicError is a wrapper for atomically accessed error values +type atomicError struct { + _noCopy noCopy + value atomic.Value +} + +// Set sets the error value regardless of the previous value. +// The value must not be nil +func (ae *atomicError) Set(value error) { + ae.value.Store(value) +} + +// Value returns the current error value +func (ae *atomicError) Value() error { + if v := ae.value.Load(); v != nil { + // this will panic if the value doesn't implement the error interface + return v.(error) + } + return nil +} diff --git a/vendor/github.com/go-sql-driver/mysql/utils_go17.go b/vendor/github.com/go-sql-driver/mysql/utils_go17.go new file mode 100644 index 000000000..f59563456 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/utils_go17.go @@ -0,0 +1,40 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build go1.7 +// +build !go1.8 + +package mysql + +import "crypto/tls" + +func cloneTLSConfig(c *tls.Config) *tls.Config { + return &tls.Config{ + Rand: c.Rand, + Time: c.Time, + Certificates: c.Certificates, + NameToCertificate: c.NameToCertificate, + GetCertificate: c.GetCertificate, + RootCAs: c.RootCAs, + NextProtos: c.NextProtos, + ServerName: c.ServerName, + ClientAuth: c.ClientAuth, + ClientCAs: c.ClientCAs, + InsecureSkipVerify: c.InsecureSkipVerify, + CipherSuites: c.CipherSuites, + PreferServerCipherSuites: c.PreferServerCipherSuites, + SessionTicketsDisabled: c.SessionTicketsDisabled, + SessionTicketKey: c.SessionTicketKey, + ClientSessionCache: c.ClientSessionCache, + MinVersion: c.MinVersion, + MaxVersion: c.MaxVersion, + CurvePreferences: c.CurvePreferences, + DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled, + Renegotiation: c.Renegotiation, + } +} diff --git a/vendor/github.com/go-sql-driver/mysql/utils_go18.go b/vendor/github.com/go-sql-driver/mysql/utils_go18.go new file mode 100644 index 000000000..c35c2a6aa --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/utils_go18.go @@ -0,0 +1,50 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build go1.8 + +package mysql + +import ( + "crypto/tls" + "database/sql" + "database/sql/driver" + "errors" + "fmt" +) + +func cloneTLSConfig(c *tls.Config) *tls.Config { + return c.Clone() +} + +func namedValueToValue(named []driver.NamedValue) ([]driver.Value, error) { + dargs := make([]driver.Value, len(named)) + for n, param := range named { + if len(param.Name) > 0 { + // TODO: support the use of Named Parameters #561 + return nil, errors.New("mysql: driver does not support the use of Named Parameters") + } + dargs[n] = param.Value + } + return dargs, nil +} + +func mapIsolationLevel(level driver.IsolationLevel) (string, error) { + switch sql.IsolationLevel(level) { + case sql.LevelRepeatableRead: + return "REPEATABLE READ", nil + case sql.LevelReadCommitted: + return "READ COMMITTED", nil + case sql.LevelReadUncommitted: + return "READ UNCOMMITTED", nil + case sql.LevelSerializable: + return "SERIALIZABLE", nil + default: + return "", fmt.Errorf("mysql: unsupported isolation level: %v", level) + } +} From c71ee33057436dc2be1f071f379e6341c382e0ec Mon Sep 17 00:00:00 2001 From: Clar Charr Date: Tue, 3 Jul 2018 18:10:35 -0400 Subject: [PATCH 76/86] Increase default TOTP secret size to 320 bits (#4287) --- routers/user/setting/security_twofa.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routers/user/setting/security_twofa.go b/routers/user/setting/security_twofa.go index 55101ed1a..cb61b9e27 100644 --- a/routers/user/setting/security_twofa.go +++ b/routers/user/setting/security_twofa.go @@ -76,6 +76,7 @@ func twofaGenerateSecretAndQr(ctx *context.Context) bool { if otpKey == nil { err = nil // clear the error, in case the URL was invalid otpKey, err = totp.Generate(totp.GenerateOpts{ + SecretSize: 40, Issuer: setting.AppName + " (" + strings.TrimRight(setting.AppURL, "/") + ")", AccountName: ctx.User.Name, }) From 5d1a6382b6898606ac6383bdd3101dfa1b487d9c Mon Sep 17 00:00:00 2001 From: Pofilo Date: Wed, 4 Jul 2018 01:03:31 +0200 Subject: [PATCH 77/86] #4354 Fix translation (#4355) --- options/locale/locale_en-US.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 21ae775e4..be0489680 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1273,8 +1273,8 @@ dashboard.operation_switch = Switch dashboard.operation_run = Run dashboard.clean_unbind_oauth = Clean unbound OAuth connections dashboard.clean_unbind_oauth_success = All unbound OAuth connections have been deleted. -dashboard.delete_inactivate_accounts = Delete all inactive accounts -dashboard.delete_inactivate_accounts_success = All inactive accounts have been deleted. +dashboard.delete_inactivate_accounts = Delete all not activated accounts +dashboard.delete_inactivate_accounts_success = All not activated accounts have been deleted. dashboard.delete_repo_archives = Delete all repository archives dashboard.delete_repo_archives_success = All repository archives have been deleted. dashboard.delete_missing_repos = Delete all repositories missing their Git files From 4b654ad17f50a441049c208e5011d0799522592b Mon Sep 17 00:00:00 2001 From: ucodi <40141083+ucodi@users.noreply.github.com> Date: Tue, 3 Jul 2018 23:16:46 +0000 Subject: [PATCH 78/86] Update notification icon (#4343) --- templates/base/head.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index fb9611cb6..53d3de1e9 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -174,7 +174,7 @@
diff --git a/templates/home.tmpl b/templates/home.tmpl index d115d8298..4e03c0c1a 100644 --- a/templates/home.tmpl +++ b/templates/home.tmpl @@ -20,7 +20,7 @@ Einfach zu installieren

- Starte einfach die Anwendung für deine Plattform. Gitea gibt es auch für Docker, Vagrant oder als Installationspaket. + Starte einfach die Anwendung für deine Plattform. Gitea gibt es auch für Docker, Vagrant oder als Installationspaket.

Link Other Link

@@ -28,7 +28,7 @@ Plattformübergreifend

- Gitea läuft überall. Go kompiliert für: Windows, macOS, Linux, ARM, etc. Wähle dasjenige System, was dir am meisten gefällt! + Gitea läuft überall. Go kompiliert für: Windows, macOS, Linux, ARM, etc. Wähle dasjenige System, was dir am meisten gefällt!

@@ -46,7 +46,7 @@ Quelloffen

- Der komplette Code befindet sich auf GitHub! Unterstütze uns bei der Verbesserung dieses Projekts. Trau dich! + Der komplette Code befindet sich auf GitHub! Unterstütze uns bei der Verbesserung dieses Projekts. Trau dich!

@@ -57,7 +57,7 @@ 易安裝

- 直接用 執行檔安裝,還可以透過 DockerVagrant,以及 套件安装。 + 直接用 執行檔安裝,還可以透過 DockerVagrant,以及 套件安装。

@@ -65,7 +65,7 @@ 跨平台

- Gitea 可以運作在任何 Go 語言能夠編譯的平台: Windows, macOS, Linux, ARM 等等。挑一個您喜歡的就好。 + Gitea 可以運作在任何 Go 語言能夠編譯的平台: Windows, macOS, Linux, ARM 等等。挑一個您喜歡的就好。

@@ -83,7 +83,7 @@ 開源化

- 所有程式碼都在 GitHub 上,加入我們讓 Gitea 更好,別害羞,你可以做到的。 + 所有程式碼都在 GitHub 上,加入我們讓 Gitea 更好,別害羞,你可以做到的。

@@ -94,7 +94,7 @@ 易安装

- 您除了可以根据操作系统平台通过 二进制运行,还可以通过 DockerVagrant,以及 包管理 安装。 + 您除了可以根据操作系统平台通过 二进制运行,还可以通过 DockerVagrant,以及 包管理 安装。

@@ -102,7 +102,7 @@ 跨平台

- 任何 Go 语言 支持的平台都可以运行 Gitea,包括 Windows、Mac、Linux 以及 ARM。挑一个您喜欢的就行! + 任何 Go 语言 支持的平台都可以运行 Gitea,包括 Windows、Mac、Linux 以及 ARM。挑一个您喜欢的就行!

@@ -120,7 +120,7 @@ 开源化

- 所有的代码都开源在 GitHub 上,赶快加入我们来共同发展这个伟大的项目!还等什么?成为贡献者吧! + 所有的代码都开源在 GitHub 上,赶快加入我们来共同发展这个伟大的项目!还等什么?成为贡献者吧!

@@ -131,10 +131,10 @@ Facile à installer

- Il suffit de lancer l'exécutable correspondant à votre système. - Ou d'utiliser Gitea avec Docker ou - Vagrant - ou en l'installant depuis un package. + Il suffit de lancer l'exécutable correspondant à votre système. + Ou d'utiliser Gitea avec Docker ou + Vagrant + ou en l'installant depuis un package.

@@ -142,7 +142,7 @@ Multi-plateforme

- Gitea tourne partout où Go peut être compilé : Windows, macOS, Linux, ARM, etc. Choisissez votre préféré ! + Gitea tourne partout où Go peut être compilé : Windows, macOS, Linux, ARM, etc. Choisissez votre préféré !

@@ -160,7 +160,7 @@ Open Source

- Toutes les sources sont sur GitHub ! Rejoignez-nous et contribuez à rendre ce projet encore meilleur. + Toutes les sources sont sur GitHub ! Rejoignez-nous et contribuez à rendre ce projet encore meilleur.

@@ -171,7 +171,7 @@ Fácil de instalar

- Simplemente arranca el binario para tu plataforma. O usa Gitea con Docker o Vagrant, o utilice el paquete. + Simplemente arranca el binario para tu plataforma. O usa Gitea con Docker o Vagrant, o utilice el paquete.

@@ -179,7 +179,7 @@ Multiplatforma

- Gitea funciona en cualquier parte, Go puede compilarse en: Windows, macOS, Linux, ARM, etc. !Elige tu favorita! + Gitea funciona en cualquier parte, Go puede compilarse en: Windows, macOS, Linux, ARM, etc. !Elige tu favorita!

@@ -197,7 +197,7 @@ Open Source

- ¡Está todo en GitHub! Uniros contribuyendo a hacer este proyecto todavía mejor. ¡No seas tímido y colabora! + ¡Está todo en GitHub! Uniros contribuyendo a hacer este proyecto todavía mejor. ¡No seas tímido y colabora!

@@ -208,7 +208,7 @@ Fácil de instalar

- Simplesmente rode o executável para o seu sistema operacional. Ou obtenha o Gitea com o Docker ou Vagrant, ou baixe o pacote. + Simplesmente rode o executável para o seu sistema operacional. Ou obtenha o Gitea com o Docker ou Vagrant, ou baixe o pacote.

@@ -216,7 +216,7 @@ Multi-plataforma

- Gitea roda em qualquer sistema operacional em que Go consegue compilar: Windows, macOS, Linux, ARM, etc. Escolha qual você gosta mais! + Gitea roda em qualquer sistema operacional em que Go consegue compilar: Windows, macOS, Linux, ARM, etc. Escolha qual você gosta mais!

@@ -234,7 +234,7 @@ Código aberto

- Está tudo no GitHub! Contribua e torne este projeto ainda melhor. Não tenha vergonha de contribuir! + Está tudo no GitHub! Contribua e torne este projeto ainda melhor. Não tenha vergonha de contribuir!

@@ -245,7 +245,7 @@ Простой в установке

- Просто запустите исполняемый файл для вашей платформы. Изпользуйте Gitea с Docker или Vagrant, или загрузите пакет. + Просто запустите исполняемый файл для вашей платформы. Изпользуйте Gitea с Docker или Vagrant, или загрузите пакет.

@@ -253,7 +253,7 @@ Кроссплатформенный

- Gitea работает на любой операционной системе, которая может компилировать Go: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится! + Gitea работает на любой операционной системе, которая может компилировать Go: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится!

@@ -271,7 +271,7 @@ Открытый исходный код

- Всё это на GitHub! Присоединяйтесь к нам, внося вклад, чтобы сделать этот проект еще лучше. Не бойтесь помогать! + Всё это на GitHub! Присоединяйтесь к нам, внося вклад, чтобы сделать этот проект еще лучше. Не бойтесь помогать!

@@ -282,7 +282,7 @@ Makkelijk te installeren

- Je hoeft alleen maar de binary uit te voeren. Of gebruik Gitea met Docker, Vagrant, of download een installatiepakket. + Je hoeft alleen maar de binary uit te voeren. Of gebruik Gitea met Docker, Vagrant, of download een installatiepakket.

@@ -290,7 +290,7 @@ Cross-platform

- Gitea werkt op alles waar Go op kan compileren: Windows, macOS, Linux, ARM, etc. Kies het platform dat bij je past! + Gitea werkt op alles waar Go op kan compileren: Windows, macOS, Linux, ARM, etc. Kies het platform dat bij je past!

@@ -308,7 +308,7 @@ Open Source

- Alles staat op GitHub! Help ons door mee te bouwen aan Gitea, samen maken we dit project nog beter. Aarzel dus niet om een bijdrage te leveren! + Alles staat op GitHub! Help ons door mee te bouwen aan Gitea, samen maken we dit project nog beter. Aarzel dus niet om een bijdrage te leveren!

@@ -319,7 +319,7 @@ Easy to install

- Simply run the binary for your platform. Or ship Gitea with Docker or Vagrant, or get it packaged. + Simply run the binary for your platform. Or ship Gitea with Docker or Vagrant, or get it packaged.

@@ -327,7 +327,7 @@ Cross-platform

- Gitea runs anywhere Go can compile for: Windows, macOS, Linux, ARM, etc. Choose the one you love! + Gitea runs anywhere Go can compile for: Windows, macOS, Linux, ARM, etc. Choose the one you love!

@@ -345,7 +345,7 @@ Open Source

- It's all on GitHub! Join us by contributing to make this project even better. Don't be shy to be a contributor! + It's all on GitHub! Join us by contributing to make this project even better. Don't be shy to be a contributor!

diff --git a/templates/mail/auth/activate.tmpl b/templates/mail/auth/activate.tmpl index ac552ca64..0f6afc196 100644 --- a/templates/mail/auth/activate.tmpl +++ b/templates/mail/auth/activate.tmpl @@ -10,6 +10,6 @@

Please click the following link to activate your account within {{.ActiveCodeLives}}:

{{AppUrl}}user/activate?code={{.Code}}

Not working? Try copying and pasting it to your browser.

-

© {{AppName}}

+

© {{AppName}}

diff --git a/templates/mail/auth/activate_email.tmpl b/templates/mail/auth/activate_email.tmpl index 5111de06c..7c47aaa7b 100644 --- a/templates/mail/auth/activate_email.tmpl +++ b/templates/mail/auth/activate_email.tmpl @@ -10,6 +10,6 @@

Please click the following link to verify your email address within {{.ActiveCodeLives}}:

{{AppUrl}}user/activate_email?code={{.Code}}&email={{.Email}}

Not working? Try copying and pasting it to your browser.

-

© {{AppName}}

+

© {{AppName}}

diff --git a/templates/mail/auth/register_notify.tmpl b/templates/mail/auth/register_notify.tmpl index a896f0e59..4c2a9c43a 100644 --- a/templates/mail/auth/register_notify.tmpl +++ b/templates/mail/auth/register_notify.tmpl @@ -10,6 +10,6 @@

You can now login via username: {{.Username}}.

{{AppUrl}}user/login

If this account has been created for you, please reset your password first.

-

© {{AppName}}

+

© {{AppName}}

diff --git a/templates/mail/auth/reset_passwd.tmpl b/templates/mail/auth/reset_passwd.tmpl index ea233d8f5..0a09c47e8 100644 --- a/templates/mail/auth/reset_passwd.tmpl +++ b/templates/mail/auth/reset_passwd.tmpl @@ -10,6 +10,6 @@

Please click the following link to reset your password within {{.ResetPwdCodeLives}}:

{{AppUrl}}user/reset_password?code={{.Code}}

Not working? Try copying and pasting it to your browser.

-

© {{AppName}}

+

© {{AppName}}

diff --git a/templates/org/home.tmpl b/templates/org/home.tmpl index 0b5ae0fac..13b557bd7 100644 --- a/templates/org/home.tmpl +++ b/templates/org/home.tmpl @@ -12,7 +12,7 @@ {{if .Org.Description}}

{{.Org.Description}}

{{end}}
{{if .Org.Location}}
{{.Org.Location}}
{{end}} - {{if .Org.Website}}{{end}} + {{if .Org.Website}}{{end}}
diff --git a/templates/repo/commit_status.tmpl b/templates/repo/commit_status.tmpl index d5f75c132..f5bbbb02d 100644 --- a/templates/repo/commit_status.tmpl +++ b/templates/repo/commit_status.tmpl @@ -1,15 +1,15 @@ {{if eq .State "pending"}} - + {{end}} {{if eq .State "success"}} - + {{end}} {{if eq .State "error"}} - + {{end}} {{if eq .State "failure"}} - + {{end}} {{if eq .State "warning"}} - -{{end}} \ No newline at end of file + +{{end}} diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 6f54cb9f6..a496b9b91 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -8,7 +8,7 @@ {{.Owner.Name}}
/
{{.Name}} - {{if .IsMirror}}
{{$.i18n.Tr "repo.mirror_from"}} {{$.Mirror.Address}}
{{end}} + {{if .IsMirror}}
{{$.i18n.Tr "repo.mirror_from"}} {{$.Mirror.Address}}
{{end}} {{if .IsFork}}
{{$.i18n.Tr "repo.forked_from"}} {{SubStr .BaseRepo.RelLink 1 -1}}
{{end}} @@ -60,7 +60,7 @@ {{end}} {{if .Repository.UnitEnabled $.UnitTypeExternalTracker}} - + {{.i18n.Tr "repo.issues"}} {{end}} @@ -78,7 +78,7 @@ {{end}} {{if or (.Repository.UnitEnabled $.UnitTypeWiki) (.Repository.UnitEnabled $.UnitTypeExternalWiki)}} - + {{.i18n.Tr "repo.wiki"}} {{end}} diff --git a/templates/repo/issue/labels.tmpl b/templates/repo/issue/labels.tmpl index 3e360cb72..38d914520 100644 --- a/templates/repo/issue/labels.tmpl +++ b/templates/repo/issue/labels.tmpl @@ -63,7 +63,7 @@