From df439b6a983865ba559e517e5e93f5f1a53a97a0 Mon Sep 17 00:00:00 2001
From: yp05327 <576951401@qq.com>
Date: Thu, 15 Feb 2024 20:30:11 +0900
Subject: [PATCH 001/807] Fix can not select team reviewers when reviewers is
empty (#29174)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Before:
![image](https://github.com/go-gitea/gitea/assets/18380374/b29e9c0c-f0fc-454f-b82d-ff9688d9e871)
After:
![image](https://github.com/go-gitea/gitea/assets/18380374/a982f7c6-4911-4951-91a5-4bb347e866f9)
Is this a bug? Maybe we don't need to fix this, as it only occurs when
there's only one user in the organization. 🤔
(cherry picked from commit 78c48d8fdde70a2874a7ed42b7762f797f432b03)
---
templates/repo/issue/view_content/sidebar.tmpl | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/templates/repo/issue/view_content/sidebar.tmpl b/templates/repo/issue/view_content/sidebar.tmpl
index 6c13eef023..22f67ade7b 100644
--- a/templates/repo/issue/view_content/sidebar.tmpl
+++ b/templates/repo/issue/view_content/sidebar.tmpl
@@ -2,7 +2,7 @@
{{template "repo/issue/branch_selector_field" .}}
{{if .Issue.IsPull}}
-
+
+
diff --git a/web_src/js/features/contributors.js b/web_src/js/features/contributors.js
new file mode 100644
index 0000000000..66185ac315
--- /dev/null
+++ b/web_src/js/features/contributors.js
@@ -0,0 +1,28 @@
+import {createApp} from 'vue';
+
+export async function initRepoContributors() {
+ const el = document.getElementById('repo-contributors-chart');
+ if (!el) return;
+
+ const {default: RepoContributors} = await import(/* webpackChunkName: "contributors-graph" */'../components/RepoContributors.vue');
+ try {
+ const View = createApp(RepoContributors, {
+ locale: {
+ filterLabel: el.getAttribute('data-locale-filter-label'),
+ contributionType: {
+ commits: el.getAttribute('data-locale-contribution-type-commits'),
+ additions: el.getAttribute('data-locale-contribution-type-additions'),
+ deletions: el.getAttribute('data-locale-contribution-type-deletions'),
+ },
+
+ loadingTitle: el.getAttribute('data-locale-loading-title'),
+ loadingTitleFailed: el.getAttribute('data-locale-loading-title-failed'),
+ loadingInfo: el.getAttribute('data-locale-loading-info'),
+ }
+ });
+ View.mount(el);
+ } catch (err) {
+ console.error('RepoContributors failed to load', err);
+ el.textContent = el.getAttribute('data-locale-component-failed-to-load');
+ }
+}
diff --git a/web_src/js/index.js b/web_src/js/index.js
index 4713618506..078f9fc9df 100644
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -83,6 +83,7 @@ import {initGiteaFomantic} from './modules/fomantic.js';
import {onDomReady} from './utils/dom.js';
import {initRepoIssueList} from './features/repo-issue-list.js';
import {initCommonIssueListQuickGoto} from './features/common-issue-list.js';
+import {initRepoContributors} from './features/contributors.js';
import {initRepoDiffCommitBranchesAndTags} from './features/repo-diff-commit.js';
import {initDirAuto} from './modules/dirauto.js';
@@ -172,6 +173,7 @@ onDomReady(() => {
initRepoWikiForm();
initRepository();
initRepositoryActionView();
+ initRepoContributors();
initCommitStatuses();
initCaptcha();
diff --git a/web_src/js/utils/time.js b/web_src/js/utils/time.js
new file mode 100644
index 0000000000..3284e893e1
--- /dev/null
+++ b/web_src/js/utils/time.js
@@ -0,0 +1,46 @@
+import dayjs from 'dayjs';
+
+// Returns an array of millisecond-timestamps of start-of-week days (Sundays)
+export function startDaysBetween(startDate, endDate) {
+ // Ensure the start date is a Sunday
+ while (startDate.getDay() !== 0) {
+ startDate.setDate(startDate.getDate() + 1);
+ }
+
+ const start = dayjs(startDate);
+ const end = dayjs(endDate);
+ const startDays = [];
+
+ let current = start;
+ while (current.isBefore(end)) {
+ startDays.push(current.valueOf());
+ // we are adding 7 * 24 hours instead of 1 week because we don't want
+ // date library to use local time zone to calculate 1 week from now.
+ // local time zone is problematic because of daylight saving time (dst)
+ // used on some countries
+ current = current.add(7 * 24, 'hour');
+ }
+
+ return startDays;
+}
+
+export function firstStartDateAfterDate(inputDate) {
+ if (!(inputDate instanceof Date)) {
+ throw new Error('Invalid date');
+ }
+ const dayOfWeek = inputDate.getDay();
+ const daysUntilSunday = 7 - dayOfWeek;
+ const resultDate = new Date(inputDate.getTime());
+ resultDate.setDate(resultDate.getDate() + daysUntilSunday);
+ return resultDate.valueOf();
+}
+
+export function fillEmptyStartDaysWithZeroes(startDays, data) {
+ const result = {};
+
+ for (const startDay of startDays) {
+ result[startDay] = data[startDay] || {'week': startDay, 'additions': 0, 'deletions': 0, 'commits': 0};
+ }
+
+ return Object.values(result);
+}
diff --git a/web_src/js/utils/time.test.js b/web_src/js/utils/time.test.js
new file mode 100644
index 0000000000..dd1114ce7f
--- /dev/null
+++ b/web_src/js/utils/time.test.js
@@ -0,0 +1,15 @@
+import {startDaysBetween} from './time.js';
+
+test('startDaysBetween', () => {
+ expect(startDaysBetween(new Date('2024-02-15'), new Date('2024-04-18'))).toEqual([
+ 1708214400000,
+ 1708819200000,
+ 1709424000000,
+ 1710028800000,
+ 1710633600000,
+ 1711238400000,
+ 1711843200000,
+ 1712448000000,
+ 1713052800000,
+ ]);
+});
From b16e26dbeb982f5e2985b9b9d5a1286d798c74b1 Mon Sep 17 00:00:00 2001
From: GiteaBot
Date: Fri, 16 Feb 2024 00:23:19 +0000
Subject: [PATCH 007/807] [skip ci] Updated translations via Crowdin
(cherry picked from commit 6d4dc16c726dd0be8d0f56405ba396d44dfd04ac)
---
options/locale/locale_cs-CZ.ini | 384 ++++++++++++++++++++++++++++++--
1 file changed, 362 insertions(+), 22 deletions(-)
diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini
index 5b0caf67c9..78268104ff 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -5,6 +5,7 @@ explore=Procházet
help=Nápověda
logo=Logo
sign_in=Přihlásit se
+sign_in_with_provider=Přihlásit se pomocí %s
sign_in_or=nebo
sign_out=Odhlásit se
sign_up=Registrovat se
@@ -17,6 +18,7 @@ template=Šablona
language=Jazyk
notifications=Oznámení
active_stopwatch=Aktivní sledování času
+tracked_time_summary=Shrnutí sledovaného času na základě filtrů v seznamu úkolů
create_new=Vytvořit…
user_profile_and_more=Profily a nastavení…
signed_in_as=Přihlášen jako
@@ -80,6 +82,7 @@ milestones=Milníky
ok=OK
cancel=Zrušit
+retry=Znovu
rerun=Znovu spustit
rerun_all=Znovu spustit všechny úlohy
save=Uložit
@@ -87,14 +90,17 @@ add=Přidat
add_all=Přidat vše
remove=Odstranit
remove_all=Odstranit vše
-remove_label_str=`Odstranit položku "%s"`
+remove_label_str=Odstranit položku „%s“
edit=Upravit
+view=Zobrazit
enabled=Povolený
disabled=Zakázané
+locked=Uzamčeno
copy=Kopírovat
copy_url=Kopírovat URL
+copy_hash=Kopírovat hash
copy_content=Kopírovat obsah
copy_branch=Kopírovat jméno větve
copy_success=Zkopírováno!
@@ -107,6 +113,7 @@ loading=Načítá se…
error=Chyba
error404=Stránka, kterou se snažíte zobrazit, buď neexistuje, nebo nemáte oprávnění ji zobrazit.
+go_back=Zpět
never=Nikdy
unknown=Neznámý
@@ -128,7 +135,9 @@ concept_user_organization=Organizace
show_timestamps=Zobrazit časové značky
show_log_seconds=Zobrazit sekundy
show_full_screen=Zobrazit celou obrazovku
+download_logs=Stáhnout logy
+confirm_delete_selected=Potvrdit odstranění všech vybraných položek?
name=Název
value=Hodnota
@@ -155,7 +164,7 @@ buttons.code.tooltip=Přidat kód
buttons.link.tooltip=Přidat odkaz
buttons.list.unordered.tooltip=Přidat seznam odrážek
buttons.list.ordered.tooltip=Přidat číslovaný seznam
-buttons.list.task.tooltip=Přidat seznam úkolů
+buttons.list.task.tooltip=Přidat seznam úloh
buttons.mention.tooltip=Uveďte uživatele nebo tým
buttons.ref.tooltip=Odkaz na issue nebo pull request
buttons.switch_to_legacy.tooltip=Místo toho použít starší editor
@@ -168,6 +177,7 @@ string.desc=Z – A
[error]
occurred=Došlo k chybě
+report_message=Pokud jste si jisti, že se jedná o chybu Gitea, prosím vyhledejte problém na GitHub a v případě potřeby založte nový problém.
missing_csrf=Špatný požadavek: Neexistuje CSRF token
invalid_csrf=Špatný požadavek: Neplatný CSRF token
not_found=Cíl nebyl nalezen.
@@ -176,6 +186,7 @@ network_error=Chyba sítě
[startpage]
app_desc=Snadno přístupný vlastní Git
install=Jednoduchá na instalaci
+install_desc=Jednoduše spusťte jako binární program pro vaši platformu, nasaďte jej pomocí Docker, nebo jej stáhněte jako balíček.
platform=Multiplatformní
platform_desc=Forgejo běží všude, kde Go může kompilovat: Windows, macOS, Linux, ARM, atd. Vyberte si ten, který milujete!
lightweight=Lehká
@@ -220,6 +231,7 @@ repo_path_helper=Všechny vzdálené repozitáře Gitu budou uloženy do tohoto
lfs_path=Kořenový adresář Git LFS
lfs_path_helper=V tomto adresáři budou uloženy soubory, které jsou sledovány Git LFS. Pokud ponecháte prázdné, LFS zakážete.
run_user=Spustit jako uživatel
+run_user_helper=Zadejte uživatelské jméno, pod kterým Gitea běží v operačním systému. Pozor: tento uživatel musí mít přístup ke kořenovému adresáři repozitářů.
domain=Doména serveru
domain_helper=Adresa domény, nebo hostitele serveru.
ssh_port=Port SSH serveru
@@ -269,7 +281,7 @@ install_btn_confirm=Nainstalovat Forgejo
test_git_failed=Chyba při testu příkazu 'git': %v
sqlite3_not_available=Tato verze Forgejo nepodporuje SQLite3. Stáhněte si oficiální binární verzi od %s (nikoli verzi „gobuild“).
invalid_db_setting=Nastavení databáze je neplatné: %v
-invalid_db_table=Databázová tabulka "%s" je neplatná: %v
+invalid_db_table=Databázová tabulka „%s“ je neplatná: %v
invalid_repo_path=Kořenový adresář repozitářů není správný: %v
invalid_app_data_path=Cesta k datům aplikace je neplatná: %v
run_user_not_match=`"Run as" uživatelské jméno není aktuální uživatelské jméno: %s -> %s`
@@ -291,6 +303,8 @@ invalid_password_algorithm=Neplatný algoritmus hash hesla
password_algorithm_helper=Nastavte algoritmus hashování hesla. Algoritmy mají odlišné požadavky a sílu. Algoritmus argon2 je poměrně bezpečný, ale používá spoustu paměti a může být nevhodný pro malé systémy.
enable_update_checker=Povolit kontrolu aktualizací
enable_update_checker_helper=Kontroluje vydání nových verzí pravidelně připojením ke gitea.io.
+env_config_keys=Konfigurace prostředí
+env_config_keys_prompt=Následující proměnné prostředí budou také použity pro váš konfigurační soubor:
[home]
uname_holder=Uživatelské jméno nebo e-mailová adresa
@@ -336,7 +350,7 @@ repo_no_results=Nebyly nalezeny žádné odpovídající repozitáře.
user_no_results=Nebyly nalezeni žádní odpovídající uživatelé.
org_no_results=Nebyly nalezeny žádné odpovídající organizace.
code_no_results=Nebyl nalezen žádný zdrojový kód odpovídající hledanému výrazu.
-code_search_results=`Výsledky hledání pro "%s"`
+code_search_results=Výsledky hledání pro „%s“
code_last_indexed_at=Naposledy indexováno %s
relevant_repositories_tooltip=Repozitáře, které jsou rozštěpení nebo nemají žádné téma, ikonu a žádný popis jsou skryty.
relevant_repositories=Zobrazují se pouze relevantní repositáře, zobrazit nefiltrované výsledky.
@@ -349,9 +363,11 @@ disable_register_prompt=Registrace jsou vypnuty. Prosíme, kontaktujte správce
disable_register_mail=E-mailové potvrzení o registraci je zakázané.
manual_activation_only=Pro dokončení aktivace kontaktujte správce webu.
remember_me=Pamatovat si toto zařízení
+remember_me.compromised=Přihlašovací token již není platný, což může znamenat napadení účtu. Zkontrolujte prosím svůj účet pro neobvyklé aktivity.
forgot_password_title=Zapomenuté heslo
forgot_password=Zapomenuté heslo?
sign_up_now=Potřebujete účet? Zaregistrujte se.
+sign_up_successful=Účet byl úspěšně vytvořen. Vítejte!
confirmation_mail_sent_prompt=Na adresu %s byl zaslán nový potvrzovací e-mail. Zkontrolujte prosím vaši doručenou poštu během následujících %s, abyste dokončili proces registrace.
must_change_password=Aktualizujte své heslo
allow_password_change=Vyžádat od uživatele změnu hesla (doporučeno)
@@ -359,6 +375,7 @@ reset_password_mail_sent_prompt=Na adresu %s byl zaslán potvrzovací e-m
active_your_account=Aktivujte si váš účet
account_activated=Účet byl aktivován
prohibit_login=Přihlášení zakázáno
+prohibit_login_desc=Vašemu účtu je zakázáno se přihlásit, kontaktujte prosím správce webu.
resent_limit_prompt=Omlouváme se, ale před chvílí jste požádal o zaslání aktivačního e-mailu. Počkejte prosím 3 minuty a pak to zkuste znovu.
has_unconfirmed_mail=Zdravím, %s, máte nepotvrzenou e-mailovou adresu (%s). Pokud jste nedostali e-mail pro potvrzení nebo potřebujete zaslat nový, klikněte prosím na tlačítku níže.
resend_mail=Klikněte zde pro odeslání aktivačního e-mailu
@@ -366,8 +383,10 @@ email_not_associate=Tato e-mailová adresa není spojena s žádným účtem.
send_reset_mail=Zaslat e-mail pro obnovení účtu
reset_password=Obnovení účtu
invalid_code=Tento potvrzující kód je neplatný nebo mu vypršela platnost.
+invalid_code_forgot_password=Váš potvrzovací kód je neplatný nebo mu vypršela platnost. Klikněte zde pro vytvoření nového kódu.
invalid_password=Vaše heslo se neshoduje s heslem, které bylo použito k vytvoření účtu.
reset_password_helper=Obnovit účet
+reset_password_wrong_user=Jste přihlášen/a jako %s, ale odkaz pro obnovení účtu je pro %s
password_too_short=Délka hesla musí být minimálně %d znaků.
non_local_account=Externě ověřovaní uživatelé nemohou aktualizovat své heslo prostřednictvím webového rozhraní Forgejo.
verify=Ověřit
@@ -392,6 +411,7 @@ openid_connect_title=Připojení k existujícímu účtu
openid_connect_desc=Zvolené OpenID URI není známé. Přidružte nový účet zde.
openid_register_title=Vytvořit nový účet
openid_register_desc=Zvolené OpenID URI není známé. Přidružte nový účet zde.
+openid_signin_desc=Zadejte vaši OpenID URI. Například: alice.openid.example.org nebo https://openid.example.org/alice.
disable_forgot_password_mail=Obnovení účtu je zakázáno, protože není nastaven žádný e-mail. Obraťte se na správce webu.
disable_forgot_password_mail_admin=Obnovení účtu je dostupné pouze po nastavení e-mailu. Pro povolení obnovy účtu nastavte prosím e-mail.
email_domain_blacklisted=Nemůžete se registrovat s vaší e-mailovou adresou.
@@ -401,7 +421,9 @@ authorize_application_created_by=Tuto aplikaci vytvořil %s.
authorize_application_description=Pokud povolíte přístup, bude moci přistupovat a zapisovat do všech vašich informací o účtu včetně soukromých repozitářů a organizací.
authorize_title=Autorizovat „%s“ pro přístup k vašemu účtu?
authorization_failed=Autorizace selhala
+authorization_failed_desc=Autorizace selhala, protože jsme detekovali neplatný požadavek. Kontaktujte prosím správce aplikace, kterou jste se pokoušeli autorizovat.
sspi_auth_failed=SSPI autentizace selhala
+password_pwned=Heslo, které jste zvolili, je na seznamu odcizených hesel, která byla dříve odhalena při narušení veřejných dat. Zkuste to prosím znovu s jiným heslem.
password_pwned_err=Nelze dokončit požadavek na HaveIBeenPwned
[mail]
@@ -416,6 +438,7 @@ activate_account.text_1=Ahoj %[1]s, děkujeme za registraci na %[2]s!
activate_account.text_2=Pro aktivaci vašeho účtu do %s klikněte na následující odkaz:
activate_email=Ověřte vaši e-mailovou adresu
+activate_email.title=%s, prosím ověřte vaši e-mailovou adresu
activate_email.text=Pro aktivaci vašeho účtu do %s klikněte na následující odkaz:
register_notify=Vítejte v Forgejo
@@ -511,6 +534,7 @@ url_error=`„%s“ není platná adresa URL.`
include_error=` musí obsahovat substring „%s“.`
glob_pattern_error=`zástupný vzor je neplatný: %s.`
regex_pattern_error=` regex vzor je neplatný: %s.`
+username_error=` může obsahovat pouze alfanumerické znaky („0-9“, „a-z“, „A-Z“), pomlčku („-“), podtržítka („_“) a tečka („.“). Nemůže začínat nebo končit nealfanumerickými znaky a po sobě jdoucí nealfanumerické znaky jsou také zakázány.`
invalid_group_team_map_error=` mapování je neplatné: %s`
unknown_error=Neznámá chyba:
captcha_incorrect=CAPTCHA kód není správný.
@@ -555,13 +579,20 @@ invalid_ssh_key=Nelze ověřit váš SSH klíč: %s
invalid_gpg_key=Nelze ověřit váš GPG klíč: %s
invalid_ssh_principal=Neplatný SSH Principal certifikát: %s
must_use_public_key=Zadaný klíč je soukromý klíč. Nenahrávejte svůj soukromý klíč nikde. Místo toho použijte váš veřejný klíč.
+unable_verify_ssh_key=Nelze ověřit váš SSH klíč.
auth_failed=Ověření selhalo: %v
+still_own_repo=Váš účet vlastní jeden nebo více repozitářů. Nejprve je smažte nebo převeďte.
+still_has_org=Váš účet je členem jedné nebo více organizací. Nejdříve je musíte opustit.
+still_own_packages=Váš účet vlastní jeden nebo více balíčků. Nejprve je musíte odstranit.
+org_still_own_repo=Organizace stále vlastní jeden nebo více repozitářů. Nejdříve je smažte nebo převeďte.
+org_still_own_packages=Organizace stále vlastní jeden nebo více balíčků. Nejdříve je smažte.
target_branch_not_exist=Cílová větev neexistuje.
[user]
change_avatar=Změnit váš avatar…
+joined_on=Přidal/a se %s
repositories=Repozitáře
activity=Veřejná aktivita
followers=Sledující
@@ -577,10 +608,12 @@ user_bio=Životopis
disabled_public_activity=Tento uživatel zakázal veřejnou viditelnost aktivity.
email_visibility.limited=Vaše e-mailová adresa je viditelná pro všechny ověřené uživatele
email_visibility.private=Vaše e-mailová adresa je viditelná pouze pro vás a administrátory
+show_on_map=Zobrazit toto místo na mapě
+settings=Uživatelská nastavení
-form.name_reserved=Uživatelské jméno "%s" je rezervováno.
-form.name_pattern_not_allowed=Vzor "%s" není povolen v uživatelském jméně.
-form.name_chars_not_allowed=Uživatelské jméno "%s" obsahuje neplatné znaky.
+form.name_reserved=Uživatelské jméno „%s“ je rezervováno.
+form.name_pattern_not_allowed=Vzor „%s“ není povolen v uživatelském jméně.
+form.name_chars_not_allowed=Uživatelské jméno „%s“ obsahuje neplatné znaky.
[settings]
profile=Profil
@@ -598,9 +631,13 @@ delete=Smazat účet
twofa=Dvoufaktorové ověřování
account_link=Propojené účty
organization=Organizace
+uid=UID
webauthn=Bezpečnostní klíče
public_profile=Veřejný profil
+biography_placeholder=Řekněte nám něco o sobě! (Můžete použít Markdown)
+location_placeholder=Sdílejte svou přibližnou polohu s ostatními
+profile_desc=Nastavte, jak bude váš profil zobrazen ostatním uživatelům. Vaše hlavní e-mailová adresa bude použita pro oznámení, obnovení hesla a operace Git.
password_username_disabled=Externí uživatelé nemohou měnit svoje uživatelské jméno. Kontaktujte prosím svého administrátora pro více detailů.
full_name=Celé jméno
website=Web
@@ -608,15 +645,20 @@ location=Místo
update_theme=Aktualizovat motiv vzhledu
update_profile=Aktualizovat profil
update_language=Aktualizovat jazyk
-update_language_not_found=Jazyk "%s" není k dispozici.
+update_language_not_found=Jazyk „%s“ není k dispozici.
update_language_success=Jazyk byl aktualizován.
update_profile_success=Váš profil byl aktualizován.
change_username=Vaše uživatelské jméno bylo změněno.
+change_username_prompt=Poznámka: Změna uživatelského jména také změní URL vašeho účtu.
+change_username_redirect_prompt=Staré uživatelské jméno bude přesměrováváno, dokud nebude znovu obsazeno.
continue=Pokračovat
cancel=Zrušit
language=Jazyk
ui=Motiv vzhledu
hidden_comment_types=Skryté typy komentářů
+hidden_comment_types_description=Zde zkontrolované typy komentářů nebudou zobrazeny na stránkách problémů. Zaškrtnutí „Štítek“ například odstraní všechny komentáře „ přidal/odstranil
From 2685be9f950ad6079cc03429059173db2b27e634 Mon Sep 17 00:00:00 2001
From: Yarden Shoham
Date: Sat, 17 Feb 2024 17:01:25 +0200
Subject: [PATCH 028/807] Fix labels referencing the wrong ID in the user
profile settings (#29199)
2 instances of `for` with a wrong value and 1 `for` that had a reference
to a `name` instead of `id`.
---------
Signed-off-by: Yarden Shoham
(cherry picked from commit 1d275c1748a75a01c270f5c306c5248808016aba)
---
templates/user/settings/profile.tmpl | 12 ++++++------
tests/integration/auth_ldap_test.go | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/templates/user/settings/profile.tmpl b/templates/user/settings/profile.tmpl
index 1f32aed0e8..d1c68656b6 100644
--- a/templates/user/settings/profile.tmpl
+++ b/templates/user/settings/profile.tmpl
@@ -22,8 +22,8 @@
diff --git a/templates/repo/settings/webhook/settings.tmpl b/templates/repo/settings/webhook/settings.tmpl
index 3dfa094cf5..8e2387067e 100644
--- a/templates/repo/settings/webhook/settings.tmpl
+++ b/templates/repo/settings/webhook/settings.tmpl
@@ -263,7 +263,7 @@
{{ctx.Locale.Tr "repo.settings.authorization_header"}}
{{if ne .HookType "matrix"}}{{/* Matrix doesn't make the authorization optional but it is implied by the help string, should be changed.*/}}
- {{ctx.Locale.Tr "repo.settings.authorization_header_desc" "Bearer token123456, Basic YWxhZGRpbjpvcGVuc2VzYW1l" | Str2html}}
+ {{ctx.Locale.Tr "repo.settings.authorization_header_desc" ("Bearer token123456, Basic YWxhZGRpbjpvcGVuc2VzYW1l" | Safe)}}
{{end}}
{{end}}
From bb911b2d5f709ebdf927771a141c263ff9d10e41 Mon Sep 17 00:00:00 2001
From: GiteaBot
Date: Mon, 19 Feb 2024 00:24:35 +0000
Subject: [PATCH 049/807] [skip ci] Updated licenses and gitignores
(cherry picked from commit f04e71f9bc05d4930e1eff0b69ceb0e890528e30)
---
options/license/Brian-Gladman-2-Clause | 17 ++++++++++
options/license/CMU-Mach-nodoc | 11 +++++++
options/license/GNOME-examples-exception | 1 +
options/license/Gmsh-exception | 16 +++++++++
options/license/HPND-Fenneberg-Livingston | 13 ++++++++
options/license/HPND-INRIA-IMAG | 9 +++++
options/license/Mackerras-3-Clause | 25 ++++++++++++++
.../license/Mackerras-3-Clause-acknowledgment | 25 ++++++++++++++
options/license/OpenVision | 33 +++++++++++++++++++
options/license/Sun-PPP | 13 ++++++++
options/license/UMich-Merit | 19 +++++++++++
options/license/bcrypt-Solar-Designer | 11 +++++++
options/license/gtkbook | 6 ++++
options/license/softSurfer | 6 ++++
14 files changed, 205 insertions(+)
create mode 100644 options/license/Brian-Gladman-2-Clause
create mode 100644 options/license/CMU-Mach-nodoc
create mode 100644 options/license/GNOME-examples-exception
create mode 100644 options/license/Gmsh-exception
create mode 100644 options/license/HPND-Fenneberg-Livingston
create mode 100644 options/license/HPND-INRIA-IMAG
create mode 100644 options/license/Mackerras-3-Clause
create mode 100644 options/license/Mackerras-3-Clause-acknowledgment
create mode 100644 options/license/OpenVision
create mode 100644 options/license/Sun-PPP
create mode 100644 options/license/UMich-Merit
create mode 100644 options/license/bcrypt-Solar-Designer
create mode 100644 options/license/gtkbook
create mode 100644 options/license/softSurfer
diff --git a/options/license/Brian-Gladman-2-Clause b/options/license/Brian-Gladman-2-Clause
new file mode 100644
index 0000000000..7276f63e9e
--- /dev/null
+++ b/options/license/Brian-Gladman-2-Clause
@@ -0,0 +1,17 @@
+Copyright (C) 1998-2013, Brian Gladman, Worcester, UK. All
+ rights reserved.
+
+The redistribution and use of this software (with or without
+changes) is allowed without the payment of fees or royalties
+provided that:
+
+ source code distributions include the above copyright notice,
+ this list of conditions and the following disclaimer;
+
+ binary distributions include the above copyright notice, this
+ list of conditions and the following disclaimer in their
+ documentation.
+
+This software is provided 'as is' with no explicit or implied
+warranties in respect of its operation, including, but not limited
+to, correctness and fitness for purpose.
diff --git a/options/license/CMU-Mach-nodoc b/options/license/CMU-Mach-nodoc
new file mode 100644
index 0000000000..c81d74fee7
--- /dev/null
+++ b/options/license/CMU-Mach-nodoc
@@ -0,0 +1,11 @@
+Copyright (C) 2002 Naval Research Laboratory (NRL/CCS)
+
+Permission to use, copy, modify and distribute this software and
+its documentation is hereby granted, provided that both the
+copyright notice and this permission notice appear in all copies of
+the software, derivative works or modified versions, and any
+portions thereof.
+
+NRL ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
+DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER
+RESULTING FROM THE USE OF THIS SOFTWARE.
diff --git a/options/license/GNOME-examples-exception b/options/license/GNOME-examples-exception
new file mode 100644
index 0000000000..0f0cd53b50
--- /dev/null
+++ b/options/license/GNOME-examples-exception
@@ -0,0 +1 @@
+As a special exception, the copyright holders give you permission to copy, modify, and distribute the example code contained in this document under the terms of your choosing, without restriction.
diff --git a/options/license/Gmsh-exception b/options/license/Gmsh-exception
new file mode 100644
index 0000000000..6d28f704e4
--- /dev/null
+++ b/options/license/Gmsh-exception
@@ -0,0 +1,16 @@
+The copyright holders of Gmsh give you permission to combine Gmsh
+ with code included in the standard release of Netgen (from Joachim
+ Sch"oberl), METIS (from George Karypis at the University of
+ Minnesota), OpenCASCADE (from Open CASCADE S.A.S) and ParaView
+ (from Kitware, Inc.) under their respective licenses. You may copy
+ and distribute such a system following the terms of the GNU GPL for
+ Gmsh and the licenses of the other code concerned, provided that
+ you include the source code of that other code when and as the GNU
+ GPL requires distribution of source code.
+
+ Note that people who make modified versions of Gmsh are not
+ obligated to grant this special exception for their modified
+ versions; it is their choice whether to do so. The GNU General
+ Public License gives permission to release a modified version
+ without this exception; this exception also makes it possible to
+ release a modified version which carries forward this exception.
diff --git a/options/license/HPND-Fenneberg-Livingston b/options/license/HPND-Fenneberg-Livingston
new file mode 100644
index 0000000000..aaf524f3aa
--- /dev/null
+++ b/options/license/HPND-Fenneberg-Livingston
@@ -0,0 +1,13 @@
+Copyright (C) 1995,1996,1997,1998 Lars Fenneberg
+
+Permission to use, copy, modify, and distribute this software for any
+purpose and without fee is hereby granted, provided that this copyright and
+permission notice appear on all copies and supporting documentation, the
+name of Lars Fenneberg not be used in advertising or publicity pertaining to
+distribution of the program without specific prior permission, and notice be
+given in supporting documentation that copying and distribution is by
+permission of Lars Fenneberg.
+
+Lars Fenneberg makes no representations about the suitability of this
+software for any purpose. It is provided "as is" without express or implied
+warranty.
diff --git a/options/license/HPND-INRIA-IMAG b/options/license/HPND-INRIA-IMAG
new file mode 100644
index 0000000000..87d09d92cb
--- /dev/null
+++ b/options/license/HPND-INRIA-IMAG
@@ -0,0 +1,9 @@
+This software is available with usual "research" terms with
+the aim of retain credits of the software. Permission to use,
+copy, modify and distribute this software for any purpose and
+without fee is hereby granted, provided that the above copyright
+notice and this permission notice appear in all copies, and
+the name of INRIA, IMAG, or any contributor not be used in
+advertising or publicity pertaining to this material without
+the prior explicit permission. The software is provided "as
+is" without any warranties, support or liabilities of any kind.
diff --git a/options/license/Mackerras-3-Clause b/options/license/Mackerras-3-Clause
new file mode 100644
index 0000000000..6467f0c98e
--- /dev/null
+++ b/options/license/Mackerras-3-Clause
@@ -0,0 +1,25 @@
+Copyright (c) 1995 Eric Rosenquist. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ 3. The name(s) of the authors of this software must not be used to
+ endorse or promote products derived from this software without
+ prior written permission.
+
+ THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
+ THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/options/license/Mackerras-3-Clause-acknowledgment b/options/license/Mackerras-3-Clause-acknowledgment
new file mode 100644
index 0000000000..5f0187add7
--- /dev/null
+++ b/options/license/Mackerras-3-Clause-acknowledgment
@@ -0,0 +1,25 @@
+Copyright (c) 1993-2002 Paul Mackerras. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. The name(s) of the authors of this software must not be used to
+ endorse or promote products derived from this software without
+ prior written permission.
+
+3. Redistributions of any form whatsoever must retain the following
+ acknowledgment:
+ "This product includes software developed by Paul Mackerras
+ ".
+
+THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/options/license/OpenVision b/options/license/OpenVision
new file mode 100644
index 0000000000..983505389e
--- /dev/null
+++ b/options/license/OpenVision
@@ -0,0 +1,33 @@
+Copyright, OpenVision Technologies, Inc., 1993-1996, All Rights
+Reserved
+
+WARNING: Retrieving the OpenVision Kerberos Administration system
+source code, as described below, indicates your acceptance of the
+following terms. If you do not agree to the following terms, do
+not retrieve the OpenVision Kerberos administration system.
+
+You may freely use and distribute the Source Code and Object Code
+compiled from it, with or without modification, but this Source
+Code is provided to you "AS IS" EXCLUSIVE OF ANY WARRANTY,
+INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY OR
+FITNESS FOR A PARTICULAR PURPOSE, OR ANY OTHER WARRANTY, WHETHER
+EXPRESS OR IMPLIED. IN NO EVENT WILL OPENVISION HAVE ANY LIABILITY
+FOR ANY LOST PROFITS, LOSS OF DATA OR COSTS OF PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES, OR FOR ANY SPECIAL, INDIRECT, OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, INCLUDING,
+WITHOUT LIMITATION, THOSE RESULTING FROM THE USE OF THE SOURCE
+CODE, OR THE FAILURE OF THE SOURCE CODE TO PERFORM, OR FOR ANY
+OTHER REASON.
+
+OpenVision retains all copyrights in the donated Source Code.
+OpenVision also retains copyright to derivative works of the Source
+Code, whether created by OpenVision or by a third party. The
+OpenVision copyright notice must be preserved if derivative works
+are made based on the donated Source Code.
+
+OpenVision Technologies, Inc. has donated this Kerberos
+Administration system to MIT for inclusion in the standard Kerberos
+5 distribution. This donation underscores our commitment to
+continuing Kerberos technology development and our gratitude for
+the valuable work which has been performed by MIT and the Kerberos
+community.
diff --git a/options/license/Sun-PPP b/options/license/Sun-PPP
new file mode 100644
index 0000000000..5f94a13437
--- /dev/null
+++ b/options/license/Sun-PPP
@@ -0,0 +1,13 @@
+Copyright (c) 2001 by Sun Microsystems, Inc.
+All rights reserved.
+
+Non-exclusive rights to redistribute, modify, translate, and use
+this software in source and binary forms, in whole or in part, is
+hereby granted, provided that the above copyright notice is
+duplicated in any source form, and that neither the name of the
+copyright holder nor the author is used to endorse or promote
+products derived from this software.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/options/license/UMich-Merit b/options/license/UMich-Merit
new file mode 100644
index 0000000000..93e304b90e
--- /dev/null
+++ b/options/license/UMich-Merit
@@ -0,0 +1,19 @@
+[C] The Regents of the University of Michigan and Merit Network, Inc. 1992,
+1993, 1994, 1995 All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided
+that the above copyright notice and this permission notice appear in all
+copies of the software and derivative works or modified versions thereof,
+and that both the copyright notice and this permission and disclaimer
+notice appear in supporting documentation.
+
+THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE REGENTS OF THE
+UNIVERSITY OF MICHIGAN AND MERIT NETWORK, INC. DO NOT WARRANT THAT THE
+FUNCTIONS CONTAINED IN THE SOFTWARE WILL MEET LICENSEE'S REQUIREMENTS OR
+THAT OPERATION WILL BE UNINTERRUPTED OR ERROR FREE. The Regents of the
+University of Michigan and Merit Network, Inc. shall not be liable for any
+special, indirect, incidental or consequential damages with respect to any
+claim by Licensee or any third party arising from use of the software.
diff --git a/options/license/bcrypt-Solar-Designer b/options/license/bcrypt-Solar-Designer
new file mode 100644
index 0000000000..8cb05017fc
--- /dev/null
+++ b/options/license/bcrypt-Solar-Designer
@@ -0,0 +1,11 @@
+Written by Solar Designer in 1998-2014.
+No copyright is claimed, and the software is hereby placed in the public
+domain. In case this attempt to disclaim copyright and place the software
+in the public domain is deemed null and void, then the software is
+Copyright (c) 1998-2014 Solar Designer and it is hereby released to the
+general public under the following terms:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted.
+
+There's ABSOLUTELY NO WARRANTY, express or implied.
diff --git a/options/license/gtkbook b/options/license/gtkbook
new file mode 100644
index 0000000000..91215e80d6
--- /dev/null
+++ b/options/license/gtkbook
@@ -0,0 +1,6 @@
+Copyright 2005 Syd Logan, All Rights Reserved
+
+This code is distributed without warranty. You are free to use
+this code for any purpose, however, if this code is republished or
+redistributed in its original form, as hardcopy or electronically,
+then you must include this copyright notice along with the code.
diff --git a/options/license/softSurfer b/options/license/softSurfer
new file mode 100644
index 0000000000..1bbc88c34c
--- /dev/null
+++ b/options/license/softSurfer
@@ -0,0 +1,6 @@
+Copyright 2001, softSurfer (www.softsurfer.com)
+This code may be freely used and modified for any purpose
+providing that this copyright notice is included with it.
+SoftSurfer makes no warranty for this code, and cannot be held
+liable for any real or imagined damage resulting from its use.
+Users of this code must verify correctness for their application.
From b3f2447bc4b6a7220da748cc6eb24bd5568bee7c Mon Sep 17 00:00:00 2001
From: silverwind
Date: Mon, 19 Feb 2024 03:23:06 +0100
Subject: [PATCH 050/807] Downscale pasted PNG images based on metadata
(#29123)
Some images like MacOS screenshots contain
[pHYs](http://www.libpng.org/pub/png/book/chapter11.html#png.ch11.div.8)
data which we can use to downscale uploaded images so they render in the
same dppx ratio in which they were taken.
Before:
After:
(cherry picked from commit 5e72526da4e915791f03af056890e16821bde052)
---
web_src/js/features/comp/ImagePaste.js | 20 +++++++++--
web_src/js/utils/image.js | 47 ++++++++++++++++++++++++++
web_src/js/utils/image.test.js | 29 ++++++++++++++++
3 files changed, 93 insertions(+), 3 deletions(-)
create mode 100644 web_src/js/utils/image.js
create mode 100644 web_src/js/utils/image.test.js
diff --git a/web_src/js/features/comp/ImagePaste.js b/web_src/js/features/comp/ImagePaste.js
index 27abcfe56f..444ab89150 100644
--- a/web_src/js/features/comp/ImagePaste.js
+++ b/web_src/js/features/comp/ImagePaste.js
@@ -1,5 +1,7 @@
import $ from 'jquery';
+import {htmlEscape} from 'escape-goat';
import {POST} from '../../modules/fetch.js';
+import {imageInfo} from '../../utils/image.js';
async function uploadFile(file, uploadUrl) {
const formData = new FormData();
@@ -109,10 +111,22 @@ const uploadClipboardImage = async (editor, dropzone, e) => {
const placeholder = `![${name}](uploading ...)`;
editor.insertPlaceholder(placeholder);
- const data = await uploadFile(img, uploadUrl);
- editor.replacePlaceholder(placeholder, `![${name}](/attachments/${data.uuid})`);
- const $input = $(``).attr('id', data.uuid).val(data.uuid);
+ const {uuid} = await uploadFile(img, uploadUrl);
+ const {width, dppx} = await imageInfo(img);
+
+ const url = `/attachments/${uuid}`;
+ let text;
+ if (width > 0 && dppx > 1) {
+ // Scale down images from HiDPI monitors. This uses the tag because it's the only
+ // method to change image size in Markdown that is supported by all implementations.
+ text = ``;
+ } else {
+ text = `![${name}](${url})`;
+ }
+ editor.replacePlaceholder(placeholder, text);
+
+ const $input = $(``).attr('id', uuid).val(uuid);
$files.append($input);
}
};
diff --git a/web_src/js/utils/image.js b/web_src/js/utils/image.js
new file mode 100644
index 0000000000..ed5d98e35a
--- /dev/null
+++ b/web_src/js/utils/image.js
@@ -0,0 +1,47 @@
+export async function pngChunks(blob) {
+ const uint8arr = new Uint8Array(await blob.arrayBuffer());
+ const chunks = [];
+ if (uint8arr.length < 12) return chunks;
+ const view = new DataView(uint8arr.buffer);
+ if (view.getBigUint64(0) !== 9894494448401390090n) return chunks;
+
+ const decoder = new TextDecoder();
+ let index = 8;
+ while (index < uint8arr.length) {
+ const len = view.getUint32(index);
+ chunks.push({
+ name: decoder.decode(uint8arr.slice(index + 4, index + 8)),
+ data: uint8arr.slice(index + 8, index + 8 + len),
+ });
+ index += len + 12;
+ }
+
+ return chunks;
+}
+
+// decode a image and try to obtain width and dppx. If will never throw but instead
+// return default values.
+export async function imageInfo(blob) {
+ let width = 0; // 0 means no width could be determined
+ let dppx = 1; // 1 dot per pixel for non-HiDPI screens
+
+ if (blob.type === 'image/png') { // only png is supported currently
+ try {
+ for (const {name, data} of await pngChunks(blob)) {
+ const view = new DataView(data.buffer);
+ if (name === 'IHDR' && data?.length) {
+ // extract width from mandatory IHDR chunk
+ width = view.getUint32(0);
+ } else if (name === 'pHYs' && data?.length) {
+ // extract dppx from optional pHYs chunk, assuming pixels are square
+ const unit = view.getUint8(8);
+ if (unit === 1) {
+ dppx = Math.round(view.getUint32(0) / 39.3701) / 72; // meter to inch to dppx
+ }
+ }
+ }
+ } catch {}
+ }
+
+ return {width, dppx};
+}
diff --git a/web_src/js/utils/image.test.js b/web_src/js/utils/image.test.js
new file mode 100644
index 0000000000..ba4758250c
--- /dev/null
+++ b/web_src/js/utils/image.test.js
@@ -0,0 +1,29 @@
+import {pngChunks, imageInfo} from './image.js';
+
+const pngNoPhys = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAADUlEQVQIHQECAP3/AAAAAgABzePRKwAAAABJRU5ErkJggg==';
+const pngPhys = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAEElEQVQI12OQNZcAIgYIBQAL8gGxdzzM0A==';
+const pngEmpty = 'data:image/png;base64,';
+
+async function dataUriToBlob(datauri) {
+ return await (await globalThis.fetch(datauri)).blob();
+}
+
+test('pngChunks', async () => {
+ expect(await pngChunks(await dataUriToBlob(pngNoPhys))).toEqual([
+ {name: 'IHDR', data: new Uint8Array([0, 0, 0, 1, 0, 0, 0, 1, 8, 0, 0, 0, 0])},
+ {name: 'IDAT', data: new Uint8Array([8, 29, 1, 2, 0, 253, 255, 0, 0, 0, 2, 0, 1])},
+ {name: 'IEND', data: new Uint8Array([])},
+ ]);
+ expect(await pngChunks(await dataUriToBlob(pngPhys))).toEqual([
+ {name: 'IHDR', data: new Uint8Array([0, 0, 0, 2, 0, 0, 0, 2, 8, 2, 0, 0, 0])},
+ {name: 'pHYs', data: new Uint8Array([0, 0, 22, 37, 0, 0, 22, 37, 1])},
+ {name: 'IDAT', data: new Uint8Array([8, 215, 99, 144, 53, 151, 0, 34, 6, 8, 5, 0, 11, 242, 1, 177])},
+ ]);
+ expect(await pngChunks(await dataUriToBlob(pngEmpty))).toEqual([]);
+});
+
+test('imageInfo', async () => {
+ expect(await imageInfo(await dataUriToBlob(pngNoPhys))).toEqual({width: 1, dppx: 1});
+ expect(await imageInfo(await dataUriToBlob(pngPhys))).toEqual({width: 2, dppx: 2});
+ expect(await imageInfo(await dataUriToBlob(pngEmpty))).toEqual({width: 0, dppx: 1});
+});
From e96e1bededfc04de60b2f8c730e84ecba538fc2d Mon Sep 17 00:00:00 2001
From: Jason Song
Date: Mon, 19 Feb 2024 17:31:36 +0800
Subject: [PATCH 051/807] Do not use lower tag names to find releases/tags
(#29261)
Fix #26090, see
https://github.com/go-gitea/gitea/issues/26090#issuecomment-1952013206
Since `TagName` stores the original tag name and `LowerTagName` stores
the lower tag name, it doesn't make sense to use lowercase tags as
`TagNames` in `FindReleasesOptions`.
https://github.com/go-gitea/gitea/blob/5e72526da4e915791f03af056890e16821bde052/services/repository/push.go#L396-L397
While the only other usage looks correct:
https://github.com/go-gitea/gitea/blob/5e72526da4e915791f03af056890e16821bde052/routers/web/repo/repo.go#L416
(cherry picked from commit 0ea8de2d0729e1e1d0ea9de1e59fbcb673e87fd2)
---
services/repository/push.go | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/services/repository/push.go b/services/repository/push.go
index 2ef8cac95e..5e2853b27d 100644
--- a/services/repository/push.go
+++ b/services/repository/push.go
@@ -321,14 +321,9 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
return nil
}
- lowerTags := make([]string, 0, len(tags))
- for _, tag := range tags {
- lowerTags = append(lowerTags, strings.ToLower(tag))
- }
-
releases, err := db.Find[repo_model.Release](ctx, repo_model.FindReleasesOptions{
RepoID: repo.ID,
- TagNames: lowerTags,
+ TagNames: tags,
})
if err != nil {
return fmt.Errorf("db.Find[repo_model.Release]: %w", err)
@@ -338,6 +333,11 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo
relMap[rel.LowerTagName] = rel
}
+ lowerTags := make([]string, 0, len(tags))
+ for _, tag := range tags {
+ lowerTags = append(lowerTags, strings.ToLower(tag))
+ }
+
newReleases := make([]*repo_model.Release, 0, len(lowerTags)-len(relMap))
emailToUser := make(map[string]*user_model.User)
From b1d66f50fbd1af1db8aa66b0c6393e57f8d08353 Mon Sep 17 00:00:00 2001
From: Markus Amshove
Date: Mon, 19 Feb 2024 10:57:08 +0100
Subject: [PATCH 052/807] Disallow merge when required checked are missing
(#29143)
fixes #21892
This PR disallows merging a PR when not all commit status contexts
configured in the branch protection are met.
Previously, the PR was happy to merge when one commit status was
successful and the other contexts weren't reported.
Any feedback is welcome, first time Go :-)
I'm also not sure if the changes in the template break something else
Given the following branch protection:
![branch_protection](https://github.com/go-gitea/gitea/assets/2401875/f871b4e4-138b-435a-b496-f9ad432e3dec)
This was shown before the change:
![before](https://github.com/go-gitea/gitea/assets/2401875/60424ff0-ee09-4fa0-856e-64e6e3fb0612)
With the change, it is now shown as this:
![after](https://github.com/go-gitea/gitea/assets/2401875/4e464142-efb1-4889-8166-eb3be26c8f3d)
---------
Co-authored-by: wxiaoguang
(cherry picked from commit a11ccc9fcd61fb25ffb1c37b87a0df4ee9efd84e)
---
routers/web/repo/pull.go | 30 +++++++++++++++++++++
services/pull/commit_status.go | 4 +++
templates/repo/issue/view_content/pull.tmpl | 1 +
templates/repo/pulls/status.tmpl | 10 ++++++-
4 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go
index ca854a35f2..ab821f8884 100644
--- a/routers/web/repo/pull.go
+++ b/routers/web/repo/pull.go
@@ -662,6 +662,24 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C
}
if pb != nil && pb.EnableStatusCheck {
+
+ var missingRequiredChecks []string
+ for _, requiredContext := range pb.StatusCheckContexts {
+ contextFound := false
+ matchesRequiredContext := createRequiredContextMatcher(requiredContext)
+ for _, presentStatus := range commitStatuses {
+ if matchesRequiredContext(presentStatus.Context) {
+ contextFound = true
+ break
+ }
+ }
+
+ if !contextFound {
+ missingRequiredChecks = append(missingRequiredChecks, requiredContext)
+ }
+ }
+ ctx.Data["MissingRequiredChecks"] = missingRequiredChecks
+
ctx.Data["is_context_required"] = func(context string) bool {
for _, c := range pb.StatusCheckContexts {
if c == context {
@@ -730,6 +748,18 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C
return compareInfo
}
+func createRequiredContextMatcher(requiredContext string) func(string) bool {
+ if gp, err := glob.Compile(requiredContext); err == nil {
+ return func(contextToCheck string) bool {
+ return gp.Match(contextToCheck)
+ }
+ }
+
+ return func(contextToCheck string) bool {
+ return requiredContext == contextToCheck
+ }
+}
+
type pullCommitList struct {
Commits []pull_service.CommitInfo `json:"commits"`
LastReviewCommitSha string `json:"last_review_commit_sha"`
diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go
index 06e66fad77..27ee572640 100644
--- a/services/pull/commit_status.go
+++ b/services/pull/commit_status.go
@@ -52,6 +52,10 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus,
}
}
+ if matchedCount != len(requiredContexts) {
+ return structs.CommitStatusPending
+ }
+
if matchedCount == 0 {
status := git_model.CalcCommitStatus(commitStatuses)
if status != nil {
diff --git a/templates/repo/issue/view_content/pull.tmpl b/templates/repo/issue/view_content/pull.tmpl
index a28b849f98..e86deb8915 100644
--- a/templates/repo/issue/view_content/pull.tmpl
+++ b/templates/repo/issue/view_content/pull.tmpl
@@ -24,6 +24,7 @@
{{template "repo/pulls/status" (dict
"CommitStatus" .LatestCommitStatus
"CommitStatuses" .LatestCommitStatuses
+ "MissingRequiredChecks" .MissingRequiredChecks
"ShowHideChecks" true
"is_context_required" .is_context_required
)}}
diff --git a/templates/repo/pulls/status.tmpl b/templates/repo/pulls/status.tmpl
index ae508b8fa4..e8636ba1b8 100644
--- a/templates/repo/pulls/status.tmpl
+++ b/templates/repo/pulls/status.tmpl
@@ -2,6 +2,7 @@
Template Attributes:
* CommitStatus: summary of all commit status state
* CommitStatuses: all commit status elements
+* MissingRequiredChecks: commit check contexts that are required by branch protection but not present
* ShowHideChecks: whether use a button to show/hide the checks
* is_context_required: Used in pull request commit status check table
*/}}
@@ -9,7 +10,7 @@ Template Attributes:
{{if .CommitStatus}}
diff --git a/tests/integration/repo_search_test.go b/tests/integration/repo_search_test.go
index cf199e98c2..e5ee334ce8 100644
--- a/tests/integration/repo_search_test.go
+++ b/tests/integration/repo_search_test.go
@@ -11,14 +11,15 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
code_indexer "code.gitea.io/gitea/modules/indexer/code"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/test"
"code.gitea.io/gitea/tests"
"github.com/PuerkitoBio/goquery"
"github.com/stretchr/testify/assert"
)
-func resultFilenames(t testing.TB, doc *HTMLDoc) []string {
- filenameSelections := doc.doc.Find(".repository.search").Find(".repo-search-result").Find(".header").Find("span.file")
+func resultFilenames(t testing.TB, doc *goquery.Selection) []string {
+ filenameSelections := doc.Find(".header").Find("span.file")
result := make([]string, filenameSelections.Length())
filenameSelections.Each(func(i int, selection *goquery.Selection) {
result[i] = selection.Text()
@@ -26,36 +27,66 @@ func resultFilenames(t testing.TB, doc *HTMLDoc) []string {
return result
}
-func TestSearchRepo(t *testing.T) {
+func checkResultLinks(t *testing.T, substr string, doc *goquery.Selection) {
+ t.Helper()
+ linkSelections := doc.Find("a[href]")
+ linkSelections.Each(func(i int, selection *goquery.Selection) {
+ assert.Contains(t, selection.AttrOr("href", ""), substr)
+ })
+}
+
+func testSearchRepo(t *testing.T, useExternalIndexer bool) {
defer tests.PrepareTestEnv(t)()
+ defer test.MockVariableValue(&setting.Indexer.RepoIndexerEnabled, useExternalIndexer)()
repo, err := repo_model.GetRepositoryByOwnerAndName(db.DefaultContext, "user2", "repo1")
assert.NoError(t, err)
- executeIndexer(t, repo, code_indexer.UpdateRepoIndexer)
+ gitReference := "/branch/" + repo.DefaultBranch
- testSearch(t, "/user2/repo1/search?q=Description&page=1", []string{"README.md"})
+ if useExternalIndexer {
+ gitReference = "/commit/"
+ executeIndexer(t, repo, code_indexer.UpdateRepoIndexer)
+ }
- setting.Indexer.IncludePatterns = setting.IndexerGlobFromString("**.txt")
- setting.Indexer.ExcludePatterns = setting.IndexerGlobFromString("**/y/**")
+ testSearch(t, "/user2/repo1/search?q=Description&page=1", gitReference, []string{"README.md"})
- repo, err = repo_model.GetRepositoryByOwnerAndName(db.DefaultContext, "user2", "glob")
- assert.NoError(t, err)
+ if useExternalIndexer {
+ setting.Indexer.IncludePatterns = setting.IndexerGlobFromString("**.txt")
+ setting.Indexer.ExcludePatterns = setting.IndexerGlobFromString("**/y/**")
- executeIndexer(t, repo, code_indexer.UpdateRepoIndexer)
+ repo, err = repo_model.GetRepositoryByOwnerAndName(db.DefaultContext, "user2", "glob")
+ assert.NoError(t, err)
- testSearch(t, "/user2/glob/search?q=loren&page=1", []string{"a.txt"})
- testSearch(t, "/user2/glob/search?q=file3&page=1", []string{"x/b.txt"})
- testSearch(t, "/user2/glob/search?q=file4&page=1", []string{})
- testSearch(t, "/user2/glob/search?q=file5&page=1", []string{})
+ executeIndexer(t, repo, code_indexer.UpdateRepoIndexer)
+
+ testSearch(t, "/user2/glob/search?q=loren&page=1", gitReference, []string{"a.txt"})
+ testSearch(t, "/user2/glob/search?q=file3&page=1", gitReference, []string{"x/b.txt"})
+ testSearch(t, "/user2/glob/search?q=file4&page=1", gitReference, []string{})
+ testSearch(t, "/user2/glob/search?q=file5&page=1", gitReference, []string{})
+ }
}
-func testSearch(t *testing.T, url string, expected []string) {
+func TestIndexerSearchRepo(t *testing.T) {
+ testSearchRepo(t, true)
+}
+
+func TestNoIndexerSearchRepo(t *testing.T) {
+ testSearchRepo(t, false)
+}
+
+func testSearch(t *testing.T, url, gitRef string, expected []string) {
req := NewRequest(t, "GET", url)
resp := MakeRequest(t, req, http.StatusOK)
- filenames := resultFilenames(t, NewHTMLParser(t, resp.Body))
+ doc := NewHTMLParser(t, resp.Body).doc.
+ Find(".repository.search").
+ Find(".repo-search-result")
+
+ filenames := resultFilenames(t, doc)
assert.EqualValues(t, expected, filenames)
+
+ checkResultLinks(t, gitRef, doc)
}
func executeIndexer(t *testing.T, repo *repo_model.Repository, op func(*repo_model.Repository)) {
From 815abad84c68da1722f87c97a47b0e96a29f3967 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Tue, 20 Feb 2024 19:38:21 +0100
Subject: [PATCH 058/807] [BUG] Initalize Git for hook regeneration
- The hook regeneration code relies on `git.SupportProcReceive` being
set to determine if the `proc-receive` hook should be written, this
variable is set when the git module is initialized.
- Resolves #2414
---
cmd/admin_regenerate.go | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/cmd/admin_regenerate.go b/cmd/admin_regenerate.go
index 0db505ff9c..efdfc8e5e4 100644
--- a/cmd/admin_regenerate.go
+++ b/cmd/admin_regenerate.go
@@ -5,6 +5,7 @@ package cmd
import (
asymkey_model "code.gitea.io/gitea/models/asymkey"
+ "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/graceful"
repo_service "code.gitea.io/gitea/services/repository"
@@ -32,6 +33,12 @@ func runRegenerateHooks(_ *cli.Context) error {
if err := initDB(ctx); err != nil {
return err
}
+
+ // Detection of ProcReceive support relies on Git module being initalized.
+ if err := git.InitFull(ctx); err != nil {
+ return err
+ }
+
return repo_service.SyncRepositoryHooks(graceful.GetManager().ShutdownContext())
}
From c6d366e2832d21ef68ac253885fd6e983f2fb84e Mon Sep 17 00:00:00 2001
From: Gusted
Date: Wed, 21 Feb 2024 12:19:15 +0100
Subject: [PATCH 059/807] [THEMES] Port console colors
- Port 1fd7e3d6bea0453b851afec6c7f74b7cf7b10a06 to the Forgejo themes,
they are a copy paste, but have a bit darker console background color to
have better contrast and match better with the overal Forgejo dark
theme's shade.
---
web_src/css/themes/theme-forgejo-dark.css | 9 +++++++++
web_src/css/themes/theme-forgejo-light.css | 9 +++++++++
2 files changed, 18 insertions(+)
diff --git a/web_src/css/themes/theme-forgejo-dark.css b/web_src/css/themes/theme-forgejo-dark.css
index decd3497d7..d09e9e3a63 100644
--- a/web_src/css/themes/theme-forgejo-dark.css
+++ b/web_src/css/themes/theme-forgejo-dark.css
@@ -75,6 +75,15 @@
--color-secondary-alpha-90: #2B3642e1;
--color-secondary-hover: var(--color-secondary-light-1);
--color-secondary-active: var(--color-secondary-light-2);
+ /* console colors - used for actions console and console files */
+ --color-console-fg: #eeeff2;
+ --color-console-fg-subtle: #959cab;
+ --color-console-bg: #1f212b;
+ --color-console-border: #383c47;
+ --color-console-hover-bg: #ffffff16;
+ --color-console-active-bg: #454a57;
+ --color-console-menu-bg: #383c47;
+ --color-console-menu-border: #5c6374;
/* colors */
--color-red: #b91c1c;
--color-orange: #ea580c;
diff --git a/web_src/css/themes/theme-forgejo-light.css b/web_src/css/themes/theme-forgejo-light.css
index 495b8ce431..4182e9d719 100644
--- a/web_src/css/themes/theme-forgejo-light.css
+++ b/web_src/css/themes/theme-forgejo-light.css
@@ -93,6 +93,15 @@
--color-secondary-alpha-90: #d4d4d8e1;
--color-secondary-hover: var(--color-secondary-dark-2);
--color-secondary-active: var(--color-secondary-dark-4);
+ /* console colors - used for actions console and console files */
+ --color-console-fg: #eeeff2;
+ --color-console-fg-subtle: #959cab;
+ --color-console-bg: #1f212b;
+ --color-console-border: #383c47;
+ --color-console-hover-bg: #ffffff16;
+ --color-console-active-bg: #454a57;
+ --color-console-menu-bg: #383c47;
+ --color-console-menu-border: #5c6374;
/* colors */
--color-red: #dc2626;
--color-orange: #ea580c;
From 6fbfe441decc018a122b0b66185002db92b404a2 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Wed, 21 Feb 2024 12:42:12 +0100
Subject: [PATCH 060/807] [BUG] Load `AllUnitsEnabled` when necessary
- In order to determine if the "Add more..." tab should be shown, the
template has to know if the repository has all units enabled, this is
done in the repository header which can be shown for quite a lot of
pages (code, issues, projects, actions etc.)
- This was previously set in the `RepoRefByType` function, which would
be called by pages such as code, issues and releases, but it was not
being called for all pages such as actions, packages and wiki. Which
would in turn incorrectly show the "Add more..." button when it
shouldn't.
- Now call it from the template itself, so the value is 'always' loaded
when necessary.
---
models/repo/repo.go | 25 +++++++++++++++++++++++++
modules/context/repo.go | 26 --------------------------
templates/repo/header.tmpl | 2 +-
3 files changed, 26 insertions(+), 27 deletions(-)
diff --git a/models/repo/repo.go b/models/repo/repo.go
index a7bc4b3c72..b24e5c1dbf 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -439,6 +439,31 @@ func (repo *Repository) GetUnit(ctx context.Context, tp unit.Type) (*RepoUnit, e
return nil, ErrUnitTypeNotExist{tp}
}
+// AllUnitsEnabled returns true if all units are enabled for the repo.
+func (repo *Repository) AllUnitsEnabled(ctx context.Context) bool {
+ hasAnyUnitEnabled := func(unitGroup []unit.Type) bool {
+ // Loop over the group of units
+ for _, unit := range unitGroup {
+ // If *any* of them is enabled, return true.
+ if repo.UnitEnabled(ctx, unit) {
+ return true
+ }
+ }
+
+ // If none are enabled, return false.
+ return false
+ }
+
+ for _, unitGroup := range unit.AllowedRepoUnitGroups {
+ // If any disabled unit is found, return false immediately.
+ if !hasAnyUnitEnabled(unitGroup) {
+ return false
+ }
+ }
+
+ return true
+}
+
// LoadOwner loads owner user
func (repo *Repository) LoadOwner(ctx context.Context) (err error) {
if repo.Owner != nil {
diff --git a/modules/context/repo.go b/modules/context/repo.go
index 8e8a42b695..9d63f9eec3 100644
--- a/modules/context/repo.go
+++ b/modules/context/repo.go
@@ -82,31 +82,6 @@ func (r *Repository) CanCreateBranch() bool {
return r.Permission.CanWrite(unit_model.TypeCode) && r.Repository.CanCreateBranch()
}
-// AllUnitsEnabled returns true if all units are enabled for the repo.
-func (r *Repository) AllUnitsEnabled(ctx context.Context) bool {
- hasAnyUnitEnabled := func(unitGroup []unit_model.Type) bool {
- // Loop over the group of units
- for _, unit := range unitGroup {
- // If *any* of them is enabled, return true.
- if r.Repository.UnitEnabled(ctx, unit) {
- return true
- }
- }
-
- // If none are enabled, return false.
- return false
- }
-
- for _, unitGroup := range unit_model.AllowedRepoUnitGroups {
- // If any disabled unit is found, return false immediately.
- if !hasAnyUnitEnabled(unitGroup) {
- return false
- }
- }
-
- return true
-}
-
// RepoMustNotBeArchived checks if a repo is archived
func RepoMustNotBeArchived() func(ctx *Context) {
return func(ctx *Context) {
@@ -1079,7 +1054,6 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
ctx.Data["IsViewTag"] = ctx.Repo.IsViewTag
ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit
ctx.Data["CanCreateBranch"] = ctx.Repo.CanCreateBranch()
- ctx.Data["AllUnitsEnabled"] = ctx.Repo.AllUnitsEnabled(ctx)
ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount()
if err != nil {
diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl
index 086ffd85ff..2a3167f982 100644
--- a/templates/repo/header.tmpl
+++ b/templates/repo/header.tmpl
@@ -219,7 +219,7 @@
{{end}}
{{if .Permission.IsAdmin}}
- {{if not .AllUnitsEnabled}}
+ {{if not (.Repository.AllUnitsEnabled ctx)}}
{{svg "octicon-diff-added"}} {{ctx.Locale.Tr "repo.settings.units.add_more"}}
From 849de070644b6b2ce7832ca63794904fa876efe5 Mon Sep 17 00:00:00 2001
From: Michael Kriese
Date: Wed, 21 Feb 2024 12:17:16 +0000
Subject: [PATCH 061/807] feat(xorm): add max idle time setting for db
connections (#2418)
Add a new optional `CONN_MAX_IDLETIME`[^1]
This allows to set the `SetConnMaxIdleTime` on `database/sql`.
It's useful to allow to close more idle connections to reduce database connections, especially on postgresql.
For me i would like to use it to set a higher max idle connections but they will all be closed after being idle.
So also the last idle connection will be closed when there is no load on forgejo.
I also use it with max connection lifetime, because currently `database/sql` doesn't detect a postgresql master change[^2] and i'll get `[E] can't update runner status: pq: cannot execute UPDATE in a read-only transaction`[^3] on forgejo until the connection is closed.
[^1]: https://pkg.go.dev/database/sql#DB.SetConnMaxIdleTime
[^2]: https://stackoverflow.com/questions/51858659/how-to-safely-discard-golang-database-sql-pooled-connections-for-example-when-t
[^3]: https://matrix.to/#/!zpNKWqkiEOyljSMQDK:matrix.org/$_AJft_amsGn5hXGOYw75JoBJQnW3aKJEpb-Iw53L_TU?via=schinas.net&via=matrix.org&via=nitro.chat
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/2418
Reviewed-by: Gusted
Reviewed-by: Earl Warren
Co-authored-by: Michael Kriese
Co-committed-by: Michael Kriese
---
models/db/engine.go | 1 +
modules/setting/database.go | 2 ++
2 files changed, 3 insertions(+)
diff --git a/models/db/engine.go b/models/db/engine.go
index f1162ebd6e..660ea1f5e3 100755
--- a/models/db/engine.go
+++ b/models/db/engine.go
@@ -146,6 +146,7 @@ func InitEngine(ctx context.Context) error {
xormEngine.SetMaxOpenConns(setting.Database.MaxOpenConns)
xormEngine.SetMaxIdleConns(setting.Database.MaxIdleConns)
xormEngine.SetConnMaxLifetime(setting.Database.ConnMaxLifetime)
+ xormEngine.SetConnMaxIdleTime(setting.Database.ConnMaxIdleTime)
xormEngine.SetDefaultContext(ctx)
if setting.Database.SlowQueryThreshold > 0 {
diff --git a/modules/setting/database.go b/modules/setting/database.go
index c7bc92e673..47d79d0de9 100644
--- a/modules/setting/database.go
+++ b/modules/setting/database.go
@@ -42,6 +42,7 @@ var (
DBConnectBackoff time.Duration
MaxIdleConns int
MaxOpenConns int
+ ConnMaxIdleTime time.Duration
ConnMaxLifetime time.Duration
IterateBufferSize int
AutoMigration bool
@@ -81,6 +82,7 @@ func loadDBSetting(rootCfg ConfigProvider) {
} else {
Database.ConnMaxLifetime = sec.Key("CONN_MAX_LIFETIME").MustDuration(0)
}
+ Database.ConnMaxIdleTime = sec.Key("CONN_MAX_IDLETIME").MustDuration(0)
Database.MaxOpenConns = sec.Key("MAX_OPEN_CONNS").MustInt(0)
Database.IterateBufferSize = sec.Key("ITERATE_BUFFER_SIZE").MustInt(50)
From 0081e59243738521595a3000bc54a318b5801d79 Mon Sep 17 00:00:00 2001
From: Codeberg Translate
Date: Wed, 21 Feb 2024 13:36:00 +0000
Subject: [PATCH 062/807] [I18N] Translations update from Weblate (#2384)
Translations update from [Weblate](https://translate.codeberg.org) for [Forgejo/forgejo](https://translate.codeberg.org/projects/forgejo/forgejo/).
Current translation status:
![Weblate translation status](https://translate.codeberg.org/widget/forgejo/forgejo/horizontal-auto.svg)
Co-authored-by: earl-warren
Co-authored-by: Kaede Fujisaki
Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org>
Co-authored-by: Wuzzy
Co-authored-by: meskobalazs
Co-authored-by: Xinayder
Co-authored-by: Anonymous
Co-authored-by: Gusted
Co-authored-by: Salif Mehmed
Co-authored-by: Dirk
Co-authored-by: fnetX
Co-authored-by: Squeljur
Co-authored-by: noureddin
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/2384
Co-authored-by: Codeberg Translate
Co-committed-by: Codeberg Translate
---
options/locale/locale_ar.ini | 65 ++++-
options/locale/locale_bg.ini | 32 ++-
options/locale/locale_de-DE.ini | 451 +++++++++++++++++++-------------
options/locale/locale_fr-FR.ini | 6 +
options/locale/locale_hu-HU.ini | 9 +
options/locale/locale_ja-JP.ini | 8 +
options/locale/locale_nl-NL.ini | 176 +++++++++++--
options/locale/locale_pt-BR.ini | 14 +-
options/locale/locale_ru-RU.ini | 99 ++++---
options/locale/locale_si-LK.ini | 4 +-
10 files changed, 598 insertions(+), 266 deletions(-)
diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini
index a97c642842..1af1951863 100644
--- a/options/locale/locale_ar.ini
+++ b/options/locale/locale_ar.ini
@@ -122,6 +122,9 @@ powered_by = مدعوم بواسطة %s
retry = أعد المحاولة
tracked_time_summary = ملخص للتتبع الزمني وفقًا لنتائج تصفية قائمة المسائل
copy_hash = انسخ البصمة
+remove = أزل
+remove_all = أزل الكل
+remove_label_str = أزل العنصر "%s"
[install]
db_name = اسم قاعدة البيانات
@@ -232,8 +235,8 @@ default_keep_email_private = أخفِ عناوين البريد الإلكترو
admin_name = اسم مستخدم المدير
default_allow_create_organization_popup = اسمح بحسابات المستخدمين الجديدة بإنشاء المنظمات مبدئيا.
password_algorithm = خوارزمية تجزئة كلمة المرور
-invalid_password_algorithm = خوارزمية تجزئة كلمة المرور غير صالحة
-password_algorithm_helper = اختر خوارزمية تجزئة كلمة المرور. الخوارزميات لديهم متطلبات وقوى مختلفة. خوارزمية argon2 هي آمنة ولكن تتطلب الكثير من الذاكرة ولذلك قد تكون غير ملائمة للأنظمة الصغيرة.
+invalid_password_algorithm = خوارزمية بصمة كلمة المرور غير صالحة
+password_algorithm_helper = اختر خوارزمية بصمة كلمة المرور. تختلف الخوارزميات في متطلباتها وقوتها. خوارزمية argon2 آمنة لكن تتطلب الكثير من الذاكرة ولذلك قد تكون غير ملائمة للأنظمة الصغيرة.
[editor]
buttons.list.ordered.tooltip = أضف قائمة مرقمة
@@ -381,7 +384,7 @@ key_state_desc = هذا المفتاح أستُعمل خلال آخر 7 أيام
webauthn_delete_key = أزِل مفتاح الأمان
valid_forever = صالح للأبد
can_read_info = قراءة
-create_oauth2_application_button = أنشئ تطبيق
+create_oauth2_application_button = أنشئ تطبيقا
save_application = احفظ
permissions_access_all = الكل (عام، خاص، ومحدود)
valid_until_date = صالح حتى %s
@@ -405,7 +408,7 @@ comment_type_group_deadline = الموعد النهائي
add_key = أضف مفتاح
gpg_no_key_email_found = هذا المفتاح الـGPG لا يُطابق أي بريد إلكتروني مُفعل ومربوط بحسابك. لا زال يمكن إضافته إن وقعت الرمز المقدم.
keep_activity_private = اخف النشاط من صفحة الملف الشخصي
-profile_desc = تحكم في كيفية ظهور ملفك الشخصي للمستخدمين الآخرين. سيتم استخدام عنوان بريدك الإلكتروني الأساسي للإشعارات واستعادة كلمة المرور وعمليات Git المستندة إلى الويب.
+profile_desc = تحكم في كيفية ظهور ملفك الشخصي للمستخدمين الآخرين. سيتم استخدام عنوان بريدك الإلكتروني الأساسي للإشعارات واستعادة كلمة المرور وعمليات Git المعتمدة على الويب.
can_not_add_email_activations_pending = هناك تفعيل قيد الانتظار، حاول مجدداً خلال بضع دقائق إن أردت أضافه بريد إلكتروني جديد.
gpg_key_id_used = هناك مفتاح GPG عام بنفس المعرف موجود بالفعل.
add_new_gpg_key = أضف مفتاح GPG
@@ -420,7 +423,7 @@ add_new_key = أضف مفتاح SSH
hidden_comment_types_description = أنواع التعليق المُختارة هنا لن تظهر داخل صفحات المسائل. أختيار "تصنيف" مثلاً يمسح كل تعليقات "<مستخدم> أضاف/مسح <تصنيف>".
key_content_gpg_placeholder = يبدأ بـ '-----BEGIN PGP PUBLIC KEY BLOCK-----'
add_email_confirmation_sent = بريد تفعيل جديد تم إرساله إلى "%s". يُرجى التحقق من البريد الوارد خلال %s لتأكيد عنوان البريد الإلكتروني.
-ssh_desc = ترتبط هذه المفاتيح الـSSH العامة بحسابك. تسمح المفاتيح الخاصة المطابقة بالوصول الكامل إلى مستودعاتك.
+ssh_desc = مفاتيح SSH العمومية هذه مرتبطة بحسابك. وتسمح المفاتيح الخصوصية المرافقة بالوصول الكامل إلى مستودعاتك. ويمكن استعمال مفاتيح SSH الموثَّقة لتوثيق إيداعات جت الموقَّعة بمفاتيح SSH.
ssh_gpg_keys = مفاتيح SSH / GPG
authorized_oauth2_applications_description = لقد منحتَ إمكانية الوصول إلى حسابك الشخصي على فورجيو لهذه التطبيقات من تطبيقات خارجية. الرجاء إلغاء وصول التطبيقات التي لم تعد بحاجة إليها.
ssh_key_been_used = هذا المفتاح الـSSH تم إضافته بالفعل إلى هذا الخادم.
@@ -470,6 +473,16 @@ gpg_token = رمز
gpg_key_matched_identities_long = الهويات المدمجة في هذا المفتاح تطابق عناوين البريد الإلكتروني المفعلة التالية لهذا المستخدم. ويمكن التحقق من صحة الإيداعات المطابقة لهذه العناوين البريدية مع هذا المفتاح.
key_content = المحتوى
key_signature_gpg_placeholder = يبدأ بـ'-----BEGIN PGP SIGNATURE-----'
+manage_oauth2_applications = إدارة تطبيقات OAuth2
+edit_oauth2_application = تعديل تطبيق OAuth2
+remove_oauth2_application = إزالة تطبيق OAuth2
+create_oauth2_application = أنشئ تطبيق OAuth2 جديدا
+create_oauth2_application_success = لقد أنشأت بنجاح تطبيق OAuth2 جديدا.
+remove_oauth2_application_success = أُزيل التطبيق.
+update_oauth2_application_success = لقد حدّثت بنجاح تطبيق OAuth2.
+oauth2_redirect_uris = روابط إعادة التوجيه. نرجو وضع كل رابط في سطر وحده.
+remove_account_link = أزل الحساب المربوط
+remove_account_link_success = أُزيل الحساب المربوط.
[org]
follow_blocked_user = لا يمكنك إتباع هذه المنظمة لأن هذه المنظمة حظرتك.
@@ -1003,7 +1016,7 @@ settings.web_hook_name_discord = دسكورد
settings.web_hook_name_telegram = تيليجرام
editor.commit_signed_changes = أودع التعديلات الموقّعة
editor.filename_is_invalid = اسم الملف غير صالح: "%s".
-pulls.no_merge_access = ليس مسموحا لك بدمج هذا الطلب.
+pulls.no_merge_access = ليس مسموحا لك دمج هذا الطلب.
visibility_helper = اجعل المستودع خاصًا
visibility_helper_forced = يفرض مدير موقعك أن تكون المستودعات الجديدة خاصة.
wiki.page_content = محتوى الصفحة
@@ -1280,9 +1293,24 @@ issues.ref_reopened_from = `أعاد فتح هذه المسأل
issues.reference_issue.body = المحتوى
issues.reference_link = للإشارة: %s
settings.actions_desc = فعّل الإجراءات في المستودع
+pulls.push_rejected = تعذر الدمج: تم رفض الدفع. راجع خطاطيف جت لهذا المستودع.
+contributors.contribution_type.additions = الإضافات
+search = بحث
+pulls.require_signed_wont_sign = يطلب الفرع إيداعات موقّعة، لكن لن يكون هذا الدمج موقّعًا
+pulls.update_branch = تحديث الفرع بالدمج
+pulls.update_branch_rebase = تحديث الفرع بإعادة التأسيس
+pulls.update_branch_success = نجح تحديث الفرع
+pulls.update_not_allowed = ليس مسموحا لك تحديث الفرع
+contributors.contribution_type.commits = الإيداعات
+contributors.contribution_type.deletions = الإزالات
+unit_disabled = لقد عطّل مدير الموقع قسم المستودع هذا.
+pulls.fast_forward_only_merge_pull_request = تسريع وحسب
+pulls.merge_conflict = تعذر الدمج: حدث نزاع خلال الدمج. مساعدة: جرب طريقة أخرى
+pulls.rebase_conflict = تعذر الدمج: حدث نزاع خلال إعادة تأسيس الإيداع: %[1]s. مساعدة: جرب طريقة أخرى
+pulls.has_merged = فشل: لقد تم دمج هذا الطلب، فلا يمكنك دمجه مجددا أو تغيير الفرع الهدف.
[mail]
-admin.new_user.text = من فضلك اضغط هنا لإدارة المستخدم من لوحة الإدارة.
+admin.new_user.text = من فضلك اضغط هنا لإدارة هذا المستخدم من لوحة الإدارة.
admin.new_user.subject = مستخدم جديد: %s سجل حالاً
admin.new_user.user_info = معلومات المستخدم
activate_account.text_1 = أهلا يا %[1]s، شكرا لك للتسجيل في %[2]s!
@@ -1461,6 +1489,8 @@ sspi_auth_failed = فشلت عملية استيثاق SSPI
openid_connect_desc = مسار الـOpenID المختار مجهول. اربطه مع حساب جديد هنا.
openid_signin_desc = أدخل مسار الـOpenID الخاص بك. مثلاً: alice.openid.example.org أو https://openid.example.org/alice.
openid_register_desc = مسار الـOpenID المختار مجهول. اربطه مع حساب جديد هنا.
+remember_me = تذكر هذا الجهاز
+remember_me.compromised = رمز الاحتفاظ بتسجيل الدخول لم يعد صالحا، مما قد يعني اختراق الحساب. نرجو مراجعة حسابك لرؤية أي نشاط غير مألوف.
[packages]
rpm.repository.multiple_groups = هذه الحزمة متوفرة في مجموعات متعددة.
@@ -1681,7 +1711,7 @@ username_has_not_been_changed = لم يتم تغيير اسم المستخدم
username_change_not_local_user = المستخدمين غير المحليين غير مسموح لهم بتغيير أسماؤهم.
captcha_incorrect = الكابتشا خاطئة.
AdminEmail = عنوان البريد الإلكتروني للمدير
-team_no_units_error = اسمح الوصول بعلى الأقل قسم مستودع واحد.
+team_no_units_error = اسمح بالوصول إلى قسم واحد على الأقل في المستودعات.
must_use_public_key = المفتاح الذي قدمته هو مفتاح خاص. من فضلك لا ترفع مفتاحك الخاص في أي مكان. استخدم مفتاحك العام بدلاً من ذلك.
unable_verify_ssh_key = "تعذر التحقق من مفتاح الـSSH، تأكد منه مجدداً."
invalid_gpg_key = فشل تحقق مفتاح الـGPG: %s
@@ -1835,6 +1865,7 @@ symbolic_link = رابط رمزي
invalid_input_type = لا يمكنك رفع ملفات من هذا النوع.
default_message = اسحب الملفات أو اضغط هنا لرفعها.
file_too_big = حجم الملف ({{filesize}} مب) يتعدى الحد الأقصى ({{maxFilesize}} مب).
+remove_file = أزل الملف
[notification]
notifications = الإشعارات
@@ -1894,4 +1925,20 @@ reject_pull_request = `اقترح تغييرات في %[3]s#%[2]
publish_release = `أصدر "%[4]s" في %[3]s`
[units]
-unit = وحدة
\ No newline at end of file
+unit = وحدة
+error.no_unit_allowed_repo = ليس مسموحا لك الوصول إلى أي قسم في هذا المستودع.
+error.unit_not_allowed = ليس مسموحا لك الوصول إلى هذا القسم في المستودع.
+
+[gpg]
+default_key = موقّع بالمفتاح المبدئي
+error.extract_sign = تعذّر استخراج التوقيع
+error.generate_hash = تعذّر إنشاء بصمة الإيداع
+error.no_committer_account = لا حساب مرتبط ببريد المودِع
+error.not_signed_commit = "ليس إيداعًا موقّعًا"
+error.failed_retrieval_gpg_keys = "تعذّر جلب مفتاح مرتبط بحساب المودِع"
+
+[graphs]
+component_loading = يحمّل %s...
+component_loading_failed = تعذر تحميل %s
+component_loading_info = قد يحتاج هذا وقتا…
+component_failed_to_load = حدث خطأ غير متوقع.
\ No newline at end of file
diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini
index 24c5ae2dba..c18d2a2f80 100644
--- a/options/locale/locale_bg.ini
+++ b/options/locale/locale_bg.ini
@@ -155,6 +155,7 @@ home = Начало
email = Адрес на ел. поща
issues = Задачи
retry = Повторен опит
+remove = Премахване
[repo]
issues.context.edit = Редактиране
@@ -210,6 +211,17 @@ issues.new_label_desc_placeholder = Описание
watch_guest_user = Влезте, за да наблюдавате това хранилище.
migrate_items_milestones = Етапи
unstar = Премахване на звездата
+owner = Притежател
+issues.num_comments_1 = %d коментар
+issues.context.delete = Изтриване
+issues.label_title = Име
+issues.save = Запазване
+issues.label_edit = Редактиране
+issues.label_delete = Изтриване
+issues.previous = Предишна
+create_repo = Създаване на хранилище
+template_helper = Хранилището да е шаблон
+repo_name = Име на хранилището
[modal]
confirm = Потвърждаване
@@ -257,6 +269,12 @@ settings.full_name = Пълно Име
members.leave = Напускане
members.leave.detail = Напускане на %s?
teams.read_access = Четене
+org_name_holder = Име на организацията
+create_org = Създаване на организация
+settings.visibility.public = Публична
+settings.visibility.limited_shortname = Ограничена
+settings.visibility.private_shortname = Частна
+settings.permission = Разрешения
[install]
admin_password = Парола
@@ -284,6 +302,7 @@ issue.in_tree_path = В %s:
release.note = Бележка:
hi_user_x = Здравейте %s,
admin.new_user.user_info = Информация за потребителя
+register_notify = Добре дошли във Forgejo
[user]
joined_on = Присъединен на %s
@@ -341,6 +360,7 @@ orgs.name = Име
users.edit = Редактиране
config.db_user = Потребителско име
config.db_name = Име
+first_page = Първа
[error]
not_found = Целта не може да бъде намерена.
@@ -352,6 +372,7 @@ occurred = Възникна грешка
UserName = Потребителско име
Email = Адрес на е-поща
Password = Парола
+RepoName = Име на хранилището
[action]
close_issue = `затвори задача %[3]s#%[2]s`
@@ -417,9 +438,18 @@ code_last_indexed_at = Последно индексиран %s
[actions]
runners.version = Версия
+variables = Променливи
[heatmap]
less = По-малко
number_of_contributions_in_the_last_12_months = %s приноса през последните 12 месеца
no_contributions = Няма приноси
-more = Повече
\ No newline at end of file
+more = Повече
+
+[git.filemode]
+directory = Директория
+symbolic_link = Символна връзка
+normal_file = Обикновен файл
+executable_file = Изпълним файл
+changed_filemode = %[1]s → %[2]s
+submodule = Подмодул
\ No newline at end of file
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index 6045e2a8b1..52bc88dfac 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -14,12 +14,12 @@ register=Registrieren
version=Version
powered_by=Powered by %s
page=Seite
-template=Template
+template=Vorlage
language=Sprache
notifications=Benachrichtigungen
active_stopwatch=Aktive Zeiterfassung
-create_new=Erstellen…
-user_profile_and_more=Profil und Einstellungen…
+create_new=Erstellen …
+user_profile_and_more=Profil und Einstellungen …
signed_in_as=Angemeldet als
enable_javascript=Diese Website benötigt JavaScript.
toc=Inhaltsverzeichnis
@@ -38,12 +38,12 @@ passcode=PIN
webauthn_insert_key=Hardware-Sicherheitsschlüssel einstecken
webauthn_sign_in=Drücke den Knopf auf deinem Sicherheitsschlüssel. Wenn dein Sicherheitsschlüssel keinen Knopf hat, stecke ihn erneut ein.
-webauthn_press_button=Drücke den Knopf auf deinem Sicherheitsschlüssel…
+webauthn_press_button=Drücke den Knopf auf deinem Sicherheitsschlüssel …
webauthn_use_twofa=Zwei-Faktor-Authentifizierung via Handy verwenden
webauthn_error=Dein Sicherheitsschlüssel konnte nicht gelesen werden.
webauthn_unsupported_browser=Dein Browser unterstützt derzeit keinen WebAuthn.
webauthn_error_unknown=Ein unbekannter Fehler ist aufgetreten. Bitte versuche es erneut.
-webauthn_error_insecure=WebAuthn unterstützt nur sichere Verbindungen. Zum Testen über HTTP kannst Du "localhost" oder "127.0.0.1" als Host verwenden
+webauthn_error_insecure=WebAuthn unterstützt nur sichere Verbindungen. Zum Testen über HTTP kannst du „localhost“ oder „127.0.0.1“ als Host verwenden
webauthn_error_unable_to_process=Der Server konnte deine Anfrage nicht bearbeiten.
webauthn_error_duplicated=Für diese Anfrage ist der Sicherheitsschlüssel nicht erlaubt. Bitte stell sicher, dass er nicht bereits registriert ist.
webauthn_error_empty=Du musst einen Namen für diesen Schlüssel festlegen.
@@ -107,16 +107,16 @@ copy_type_unsupported=Dieser Dateityp kann nicht kopiert werden
write=Verfassen
preview=Vorschau
-loading=Laden…
+loading=Laden …
error=Fehler
-error404=Die Seite, die Du versuchst aufzurufen, existiert nicht oder Du bist nicht berechtigt, diese anzusehen.
+error404=Die Seite, die du versuchst aufzurufen, existiert nicht oder du bist nicht berechtigt, diese anzusehen.
go_back=Zurück
never=Niemals
unknown=Unbekannt
-rss_feed=RSS Feed
+rss_feed=RSS-Feed
pin=Anheften
unpin=Loslösen
@@ -188,10 +188,10 @@ install=Einfach zu installieren
install_desc=Starte einfach die Anwendung für deine Plattform oder nutze Docker. Es existieren auch paketierte Versionen.
platform=Plattformübergreifend
platform_desc=Forgejo läuft überall, wo Go kompiliert: Windows, macOS, Linux, ARM, etc. Wähle das System, das dir am meisten gefällt!
-lightweight=Leichtgewicht
+lightweight=Leichtgewichtig
lightweight_desc=Forgejo hat minimale Systemanforderungen und kann selbst auf einem günstigen und stromsparenden Raspberry Pi betrieben werden!
license=Quelloffen
-license_desc=Der komplette Code befindet sich auf Forgejo! Unterstütze uns bei der Verbesserung dieses Projekts. Trau dich!
+license_desc=Hole dir Forgejo! Tritt uns bei, indem du uns hilfst, dieses Projekt noch besser zu machen. Scheue dich nicht davor, bei uns mitzuwirken!
[install]
install=Installation
@@ -205,14 +205,14 @@ user=Benutzername
password=Passwort
db_name=Datenbankname
db_schema=Schema
-db_schema_helper=Leer lassen, um das Standard-Schema ("public") zu verwenden.
+db_schema_helper=Leer lassen, um den Datenbank-Standardwert („public“) zu verwenden.
ssl_mode=SSL
path=Pfad
-sqlite_helper=Dateipfad zur SQLite3 Datenbank. Gebe einen absoluten Pfad an, wenn Forgejo als Service gestartet wird.
+sqlite_helper=Dateipfad zur SQLite3-Datenbank. Gib einen absoluten Pfad an, wenn Forgejo als Service gestartet wird.
reinstall_error=Du versuchst, in eine bereits existierende Forgejo Datenbank zu installieren
-reinstall_confirm_message=Eine Neuinstallation mit einer bestehenden Forgejo-Datenbank kann mehrere Probleme verursachen. In den meisten Fällen solltest du deine vorhandene "app.ini" verwenden, um Forgejo auszuführen. Wenn du weist, was du tust, bestätigen die folgenden Angaben:
-reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen & Spiegelungen könnten nicht mehr richtig funktionieren. Durch Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini Datei den korrekten SECRET_KEY enthält.
-reinstall_confirm_check_2=Die Repositories und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst Du, dass Du die Hooks für die Repositories und die authorized_keys Datei manuell neu synchronisierst. Du bestätigst, dass Du sicherstellst, dass die Repository- und Spiegel-Einstellungen korrekt sind.
+reinstall_confirm_message=Eine Neuinstallation mit einer bestehenden Forgejo-Datenbank kann mehrere Probleme verursachen. In den meisten Fällen solltest du deine vorhandene „app.ini“ verwenden, um Forgejo auszuführen. Wenn du weißt, was du tust, bestätige die folgenden Angaben:
+reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Mirrors könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält.
+reinstall_confirm_check_2=Die Repositorys und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst du, dass du die Hooks für die Repositories und die authorized_keys-Datei manuell neu synchronisierst. Du bestätigst, dass du sicherstellst, dass die Repository- und Mirror-Einstellungen korrekt sind.
reinstall_confirm_check_3=Du bestätigst, dass du absolut sicher bist, dass diese Forgejo mit der richtigen app.ini läuft, und du sicher bist, dass du neu installieren musst. Du bestätigst, dass du die oben genannten Risiken anerkennst.
err_empty_db_path=Der SQLite3 Datenbankpfad darf nicht leer sein.
no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen.
@@ -226,7 +226,7 @@ general_title=Allgemeine Einstellungen
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.
+repo_path_helper=Remote-Git-Repositorys werden in diesem Verzeichnis gespeichert.
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
@@ -267,7 +267,7 @@ openid_signin_popup=Benutzeranmeldung via OpenID aktivieren.
openid_signup=OpenID-Selbstregistrierung aktivieren
openid_signup_popup=OpenID-basierte Selbstregistrierung aktivieren.
enable_captcha=Registrierungs-Captcha aktivieren
-enable_captcha_popup=Captcha-Eingabe bei der Registrierung erforderlich.
+enable_captcha_popup=Eine Captcha-Eingabe bei der Benutzerselbstregistrierung verlangen.
require_sign_in_view=Ansehen erfordert Anmeldung
require_sign_in_view_popup=Seitenzugriff auf angemeldete Benutzer beschränken. Besucher sehen nur die Anmelde- und Registrierungsseite.
admin_setting_desc=Das Erstellen eines Administrator-Kontos ist optional. Der erste registrierte Benutzer wird automatisch Administrator.
@@ -280,7 +280,7 @@ install_btn_confirm=Forgejo installieren
test_git_failed=Fehler beim Test des „git“-Befehls: %v
sqlite3_not_available=Diese Forgejo-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_db_table=Die Datenbanktabelle "%s" ist ungültig: %v
+invalid_db_table=Die Datenbanktabelle „%s“ ist ungültig: %v
invalid_repo_path=Repository-Verzeichnis ist ungültig: %v
invalid_app_data_path=Der App-Daten-Pfad ist ungültig: %v
run_user_not_match=Der „Ausführen als“-Benutzername ist nicht der aktuelle Benutzername: %s -> %s
@@ -294,7 +294,7 @@ default_keep_email_private_popup=E-Mail-Adressen von neuen Benutzern standardmä
default_allow_create_organization=Erstellen von Organisationen standardmäßig erlauben
default_allow_create_organization_popup=Neuen Nutzern das Erstellen von Organisationen standardmäßig erlauben.
default_enable_timetracking=Zeiterfassung standardmäßig aktivieren
-default_enable_timetracking_popup=Zeiterfassung standardmäßig für neue Repositories aktivieren.
+default_enable_timetracking_popup=Zeiterfassung standardmäßig für neue Repositorys aktivieren.
no_reply_address=Versteckte E-Mail-Domain
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.
password_algorithm=Passwort Hashing Algorithmus
@@ -311,16 +311,16 @@ enable_update_checker_helper_forgejo = Prüft regelmäßig auf neue Forgejo-Vers
uname_holder=E-Mail-Adresse oder Benutzername
password_holder=Passwort
switch_dashboard_context=Kontext der Übersichtsseite wechseln
-my_repos=Repositories
-show_more_repos=Zeige mehr Repositories…
-collaborative_repos=Gemeinschaftliche Repositories
+my_repos=Repositorys
+show_more_repos=Zeige mehr Repositorys …
+collaborative_repos=Gemeinschaftliche Repositorys
my_orgs=Meine Organisationen
my_mirrors=Meine Mirrors
view_home=%s ansehen
-search_repos=Finde ein Repository…
+search_repos=Finde ein Repository …
filter=Andere Filter
-filter_by_team_repositories=Nach Team-Repositories filtern
-feed_of=`Feed von "%s"`
+filter_by_team_repositories=Nach Team-Repositorys filtern
+feed_of=Feed von „%s“
show_archived=Archiviert
show_both_archived_unarchived=Archivierte und nicht archivierte anzeigen
@@ -332,10 +332,10 @@ show_both_private_public=Öffentliche und private anzeigen
show_only_private=Nur private anzeigen
show_only_public=Nur öffentliche anzeigen
-issues.in_your_repos=Eigene Repositories
+issues.in_your_repos=Eigene Repositorys
[explore]
-repos=Repositories
+repos=Repositorys
users=Benutzer
organizations=Organisationen
search=Suche
@@ -347,14 +347,14 @@ search.fuzzy.tooltip=Zeige auch Ergebnisse, die dem Suchbegriff ähneln
search.match=Genau
search.match.tooltip=Zeige nur Ergebnisse, die exakt mit dem Suchbegriff übereinstimmen
code_search_unavailable=Derzeit ist die Code-Suche nicht verfügbar. Bitte wende dich an den Website-Administrator.
-repo_no_results=Keine passenden Repositories gefunden.
+repo_no_results=Keine passenden Repositorys gefunden.
user_no_results=Keine passenden Benutzer gefunden.
org_no_results=Keine passenden Organisationen 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“
code_last_indexed_at=Zuletzt indexiert %s
-relevant_repositories_tooltip=Repositories, die Forks sind oder die kein Thema, kein Symbol und keine Beschreibung haben, werden ausgeblendet.
-relevant_repositories=Es werden nur relevante Repositories angezeigt, ungefilterte Ergebnisse anzeigen.
+relevant_repositories_tooltip=Repositorys, die Forks sind oder die kein Thema, kein Symbol und keine Beschreibung haben, werden ausgeblendet.
+relevant_repositories=Es werden nur relevante Repositorys angezeigt, ungefilterte Ergebnisse anzeigen.
[auth]
create_new_account=Konto anlegen
@@ -418,8 +418,8 @@ email_domain_blacklisted=Du kannst dich nicht mit deiner E-Mail-Adresse registri
authorize_application=Anwendung autorisieren
authorize_redirect_notice=Du wirst zu %s weitergeleitet, wenn du diese Anwendung autorisierst.
authorize_application_created_by=Diese Anwendung wurde von %s erstellt.
-authorize_application_description=Wenn du diese Anwendung autorisierst, wird sie die Berechtigung erhalten, alle Informationen zu deinem Account zu bearbeiten oder zu lesen. Dies beinhaltet auch private Repositories und Organisationen.
-authorize_title=`"%s" den Zugriff auf deinen Account gestatten?`
+authorize_application_description=Wenn du diese Anwendung autorisierst, wird sie die Berechtigung erhalten, alle Informationen zu deinem Account zu bearbeiten oder zu lesen. Dies beinhaltet auch private Repositorys und Organisationen.
+authorize_title=„%s“ den Zugriff auf deinen Account gestatten?
authorization_failed=Autorisierung fehlgeschlagen
authorization_failed_desc=Die Autorisierung ist fehlgeschlagen, da wir eine ungültige Anfrage erkannt haben. Bitte kontaktiere den Betreuer der App, die du zu autorisieren versucht hast.
sspi_auth_failed=SSPI-Authentifizierung fehlgeschlagen
@@ -427,13 +427,14 @@ password_pwned=Das von dir gewählte Passwort befindet sich auf einer %s,
activate_account=Bitte aktiviere dein Konto
@@ -448,7 +449,7 @@ activate_email.text=Bitte klicke innerhalb von %s auf folgenden Link, um
register_notify=Willkommen bei Forgejo
register_notify.title=%[1]s, willkommen bei %[2]s
register_notify.text_1=dies ist deine Bestätigungs-E-Mail für %s!
-register_notify.text_2=Du kannst dich jetzt mit dem Benutzernamen "%s" anmelden.
+register_notify.text_2=Du kannst dich jetzt mit dem Benutzernamen „%s“ anmelden.
register_notify.text_3=Wenn dieser Account von dir erstellt wurde, musst du zuerst dein Passwort setzen.
reset_password=Stelle dein Konto wieder her
@@ -457,7 +458,7 @@ reset_password.text=Bitte klicke innerhalb von %s auf folgenden Link, um
register_success=Registrierung erfolgreich
-issue_assigned.pull=@%[1]s hat dich im Repository %[3]s dem Pull Request %[2]s zugewiesen.
+issue_assigned.pull=@%[1]s hat dich im Repository %[3]s dem Pull-Request %[2]s zugewiesen.
issue_assigned.issue=@%[1]s hat dich im Repository %[3]s dem Issue %[2]s zugewiesen.
issue.x_mentioned_you=@%s hat dich erwähnt:
@@ -467,11 +468,11 @@ issue.action.push_n=@%[1]s hat %[3]d Commits auf %[2]s gepusht
issue.action.close=@%[1]s hat #%[2]d geschlossen.
issue.action.reopen=@%[1]s hat #%[2]d wieder geöffnet.
issue.action.merge=@%[1]s hat #%[2]d in %[3]s gemergt.
-issue.action.approve=@%[1]s hat diesen Pull-Request approved.
+issue.action.approve=@%[1]s hat diesen Pull-Request genehmigt.
issue.action.reject=@%[1]s hat Änderungen auf diesem Pull-Request angefordert.
issue.action.review=@%[1]s hat diesen Pull-Request kommentiert.
-issue.action.review_dismissed=@%[1]s hat das letzte Review von %[2]s für diesen Pull Request verworfen.
-issue.action.ready_for_review=@%[1]s hat diesen Pull Request zum Review freigegeben.
+issue.action.review_dismissed=@%[1]s hat das letzte Review von %[2]s für diesen Pull-Request verworfen.
+issue.action.ready_for_review=@%[1]s hat diesen Pull-Request zum Review freigegeben.
issue.action.new=@%[1]s hat #%[2]d geöffnet.
issue.in_tree_path=In %s:
@@ -483,8 +484,8 @@ release.downloads=Downloads:
release.download.zip=Quellcode (ZIP Datei)
release.download.targz=Quellcode (TAR.GZ Datei)
-repo.transfer.subject_to=%s möchte "%s" an %s übertragen
-repo.transfer.subject_to_you=%s möchte dir "%s" übertragen
+repo.transfer.subject_to=%s möchte „%s“ an %s übertragen
+repo.transfer.subject_to_you=%s möchte dir „%s“ übertragen
repo.transfer.to_you=dir
repo.transfer.body=Um es anzunehmen oder abzulehnen, öffne %s, oder ignoriere es einfach.
@@ -537,11 +538,11 @@ size_error=` muss die Größe %s haben.`
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=`"%s" ist keine gültige URL.`
-include_error=` muss den Text "%s" enthalten.`
-glob_pattern_error=` Der Glob Pattern ist ungültig: %s.`
+url_error=`„%s“ ist keine gültige URL.`
+include_error=` muss den Text „%s“ enthalten.`
+glob_pattern_error=` Glob-Pattern ist ungültig: %s.`
regex_pattern_error=` regex ist ungültig: %s.`
-username_error=` darf nur alphanumerische Zeichen ('0-9','a-z','A-Z'), Bindestriche ('-'), Unterstriche ('_') und Punkte ('.') enthalten. Es kann nicht mit nicht-alphanumerischen Zeichen beginnen oder enden und aufeinanderfolgende nicht-alphanumerische Zeichen sind ebenfalls verboten.`
+username_error=` darf nur alphanumerische Zeichen („0-9“, „a-z“, „A-Z“), Bindestriche („-“), Unterstriche („_“) und Punkte („.“) enthalten. Es kann nicht mit nicht-alphanumerischen Zeichen beginnen oder enden und aufeinanderfolgende nicht-alphanumerische Zeichen sind ebenfalls verboten.`
invalid_group_team_map_error=` Zuordnung ist ungültig: %s`
unknown_error=Unbekannter Fehler:
captcha_incorrect=Der eingegebene CAPTCHA-Code ist falsch.
@@ -552,7 +553,7 @@ username_been_taken=Der Benutzername ist bereits vergeben.
username_change_not_local_user=Nicht-lokale Benutzer dürfen ihren Nutzernamen nicht ändern.
username_has_not_been_changed=Benutzername wurde nicht geändert
repo_name_been_taken=Der Repository-Name wird schon verwendet.
-repository_force_private=Privat erzwingen ist aktiviert: Private Repositories können nicht veröffentlicht werden.
+repository_force_private=Privat erzwingen ist aktiviert: Private Repositorys können nicht veröffentlicht werden.
repository_files_already_exist=Dateien für dieses Repository sind bereits vorhanden. Kontaktiere den Systemadministrator.
repository_files_already_exist.adopt=Dateien für dieses Repository existieren bereits und können nur übernommen werden.
repository_files_already_exist.delete=Dateien für dieses Repository sind bereits vorhanden. Du must sie löschen.
@@ -564,7 +565,7 @@ 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.
email_invalid=Die E-Mail-Adresse ist ungültig.
-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.
password_complexity=Das Passwort erfüllt nicht die Komplexitätsanforderungen:
password_lowercase_one=Mindestens ein Kleinbuchstabe
@@ -572,12 +573,12 @@ password_uppercase_one=Mindestens ein Großbuchstabe
password_digit_one=Mindestens eine Ziffer
password_special_one=Mindestens ein Sonderzeichen (Satzzeichen, Klammern, Anführungszeichen, etc.)
enterred_invalid_repo_name=Der eingegebenen Repository-Name ist falsch.
-enterred_invalid_org_name=Der eingegebene Organisation-Name ist falsch.
+enterred_invalid_org_name=Der eingegebene Organisationsname ist falsch.
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.
team_not_exist=Dieses Team existiert nicht.
-last_org_owner=Du kannst den letzten Benutzer nicht aus dem 'Besitzer'-Team entfernen. Es muss mindestens einen 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.
duplicate_invite_to_team=Der Benutzer wurde bereits als Teammitglied eingeladen.
organization_leave_success=Du hast die Organisation %s erfolgreich verlassen.
@@ -586,27 +587,27 @@ invalid_ssh_key=Dein SSH-Key kann nicht überprüft werden: %s
invalid_gpg_key=Dein GPG-Key kann nicht überprüft werden: %s
invalid_ssh_principal=Ungültige Identität: %s
must_use_public_key=Der von Dir bereitgestellte Key ist ein privater Key. Bitte lade Deinen privaten Key nirgendwo hoch. Verwende stattdessen Deinen öffentlichen Key.
-unable_verify_ssh_key=Der SSH-Key kann nicht verifiziert werden, überprüfe ihn auf Fehler.
+unable_verify_ssh_key=„Der SSH-Key kann nicht verifiziert werden, überprüfe ihn auf Fehler.“
auth_failed=Authentifizierung fehlgeschlagen: %v
-still_own_repo=Dein Konto besitzt ein oder mehrere Repositories. Diese müssen erst gelöscht oder übertragen werden.
-still_has_org=Dein Konto ist Mitglied einer oder mehrerer Organisationen, verlasse diese zuerst.
-still_own_packages=Dein Konto besitzt ein oder mehrere Pakete, lösche diese zuerst.
-org_still_own_repo=Diese Organisation besitzt noch ein oder mehrere Repositories. Diese müssen zuerst gelöscht oder übertragen werden.
-org_still_own_packages=Diese Organisation besitzt noch ein oder mehrere Pakete, lösche diese zuerst.
+still_own_repo=„Dein Konto besitzt ein oder mehrere Repositorys. Diese müssen erst gelöscht oder übertragen werden.“
+still_has_org=„Dein Konto ist Mitglied einer oder mehrerer Organisationen, verlasse diese zuerst.“
+still_own_packages=„Dein Konto besitzt ein oder mehrere Pakete, lösche diese zuerst.“
+org_still_own_repo=„Diese Organisation besitzt noch ein oder mehrere Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.“
+org_still_own_packages=„Diese Organisation besitzt noch ein oder mehrere Pakete, lösche diese zuerst.“
target_branch_not_exist=Der Ziel-Branch existiert nicht.
-username_error_no_dots = ` darf nur alphanumerische Zeichen ('0-9','a-z','A-Z'), Bindestriche ('-') und Unterstriche ('_') enthalten. Es kann nicht mit nicht-alphanumerischen Zeichen beginnen oder enden und aufeinanderfolgende nicht-alphanumerische Zeichen sind ebenfalls verboten.`
-admin_cannot_delete_self = Sie können sich nicht löschen, wenn Sie ein Admin sind. Bitte entfernen Sie zuerst Ihre Adminrechte.
+username_error_no_dots = ` darf nur alphanumerische Zeichen („0-9“, „a-z“, „A-Z“), Bindestriche („-“), Unterstriche („_“) enthalten. Es kann nicht mit nicht-alphanumerischen Zeichen beginnen oder enden und aufeinanderfolgende nicht-alphanumerische Zeichen sind ebenfalls verboten.`
+admin_cannot_delete_self = Du kannst dich nicht selbst löschen, wenn du ein Admin bist. Bitte entferne zuerst deine Adminrechte.
[user]
-change_avatar=Profilbild ändern…
+change_avatar=Profilbild ändern …
joined_on=Beigetreten am %s
-repositories=Repositories
+repositories=Repositorys
activity=Öffentliche Aktivität
followers=Follower
-starred=Favoriten
-watched=Beobachtete Repositories
+starred=Favorisierte Repositorys
+watched=Beobachtete Repositorys
code=Quelltext
projects=Projekte
overview=Übersicht
@@ -616,17 +617,21 @@ unfollow=Nicht mehr folgen
user_bio=Biografie
disabled_public_activity=Dieser Benutzer hat die öffentliche Sichtbarkeit der Aktivität deaktiviert.
email_visibility.limited=Ihre E-Mail-Adresse ist für alle authentifizierten Benutzer sichtbar
-email_visibility.private=Deine E-Mail-Adresse ist nur für Dich und Administratoren sichtbar
+email_visibility.private=Deine E-Mail-Adresse ist nur für dich und Administratoren sichtbar
show_on_map=Diesen Ort auf einer Karte anzeigen
settings=Benutzereinstellungen
-form.name_reserved=Der Benutzername "%s" ist reserviert.
-form.name_pattern_not_allowed=Das Muster "%s" ist nicht in einem Benutzernamen erlaubt.
-form.name_chars_not_allowed=Benutzername "%s" enthält ungültige Zeichen.
-block_user = Nutzer Blockieren
-block_user.detail = Bitte beachten Sie, dass andere Maßnahmen ergriffen werden, wenn Sie diesen Benutzer blockieren, wie:
-block_user.detail_2 = Dieser Benutzer kann nicht mit ihrem Repository interagieren, Issues erstellen und kommentieren.
-block_user.detail_1 = Dieser Benutzer folgt ihnen nicht mehr.
+form.name_reserved=Der Benutzername „%s“ ist reserviert.
+form.name_pattern_not_allowed=Das Muster „%s“ ist nicht in einem Benutzernamen erlaubt.
+form.name_chars_not_allowed=Benutzername „%s“ enthält ungültige Zeichen.
+block_user = Benutzer blockieren
+block_user.detail = Bitte beachte, dass andere Maßnahmen ergriffen werden, wenn du diesen Benutzer blockierst, wie:
+block_user.detail_2 = Dieser Benutzer kann nicht mit deinem Repository, erstellten Issues und Kommentaren interagieren.
+block_user.detail_1 = Dieser Benutzer folgt dir nicht mehr.
+block = Blockieren
+follow_blocked_user = Du kannst diesen Benutzer nicht folgen, weil du ihn blockiert hast, oder er dich blockiert hat.
+block_user.detail_3 = Dieser Benutzer kann dich nicht als einen Mitarbeiter hinzufügen, und du kannst ihn nicht als Mitarbeiter hinzufügen.
+unblock = Nicht mehr blockieren
[settings]
profile=Profil
@@ -639,7 +644,7 @@ ssh_gpg_keys=SSH- / GPG-Schlüssel
social=Soziale Konten
applications=Anwendungen
orgs=Organisationen verwalten
-repos=Repositories
+repos=Repositorys
delete=Konto löschen
twofa=Zwei-Faktor-Authentifizierung
account_link=Verknüpfte Benutzerkonten
@@ -648,9 +653,9 @@ uid=UID
webauthn=Hardware-Sicherheitsschlüssel
public_profile=Öffentliches Profil
-biography_placeholder=Erzähle uns ein wenig über Dich selbst! (Du kannst Markdown verwenden)
-location_placeholder=Teile Deinen ungefähren Standort mit anderen
-profile_desc=Lege fest, wie dein Profil anderen Benutzern angezeigt wird. Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und webbasierte Git-Operationen verwendet.
+biography_placeholder=Erzähle uns ein wenig über dich selbst! (Du kannst Markdown verwenden)
+location_placeholder=Teile deinen ungefähren Standort mit anderen
+profile_desc=Leg fest, wie dein Profil anderen Benutzern angezeigt wird. Deine primäre E-Mail-Adresse wird für Benachrichtigungen, Passwort-Wiederherstellung und webbasierte Git-Operationen verwendet.
password_username_disabled=Benutzer, die nicht von Forgejo verwaltet werden können ihren Benutzernamen nicht ändern. Bitte kontaktiere deinen Administrator für mehr Details.
full_name=Vollständiger Name
website=Webseite
@@ -658,7 +663,7 @@ location=Standort
update_theme=Theme ändern
update_profile=Profil aktualisieren
update_language=Sprache aktualisieren
-update_language_not_found=Sprache "%s" ist nicht verfügbar.
+update_language_not_found=Sprache „%s“ ist nicht verfügbar.
update_language_success=Sprache wurde aktualisiert.
update_profile_success=Dein Profil wurde aktualisiert.
change_username=Dein Benutzername wurde geändert.
@@ -668,9 +673,9 @@ continue=Weiter
cancel=Abbrechen
language=Sprache
ui=Theme
-hidden_comment_types=Ausgeblendeter Kommentartypen
-hidden_comment_types_description=Die hier markierten Kommentartypen werden nicht innerhalb der Issue-Seiten angezeigt. Das Überprüfen von "Label" entfernt beispielsweise alle " hinzugefügt/entfernt " Kommentare.
-hidden_comment_types.ref_tooltip=Kommentare, in denen dieses Issue von einem anderen Issue/Commit referenziert wurde
+hidden_comment_types=Ausgeblendete Kommentartypen
+hidden_comment_types_description=Die hier markierten Kommentartypen werden nicht innerhalb der Issue-Seiten angezeigt. Die Markierung von „Label“ zum Beispiel entfernt alle Kommentare der Form „ hat hinzugefügt/entfernt“.
+hidden_comment_types.ref_tooltip=Kommentare, in denen dieses Issue von einem anderen Issue/Commit/… referenziert wurde
hidden_comment_types.issue_ref_tooltip=Kommentare, bei denen der Benutzer den Branch/Tag des Issues ändert
comment_type_group_reference=Verweis auf Mitglieder
comment_type_group_label=Label
@@ -736,27 +741,27 @@ 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.
email_preference_set_success=E-Mail-Einstellungen wurden erfolgreich aktualisiert.
add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt.
keep_email_private=E-Mail-Adresse verbergen
-keep_email_private_popup=Dies wird Deine E-Mail-Adresse nicht nur in Deinem Profil ausblenden, sondern auch, wenn Du einen Pull Request erstellst oder eine Datei über das Web-Interface bearbeitest. Gepushte Commits werden nicht geändert.
+keep_email_private_popup=Dies wird deine E-Mail-Adresse nicht nur in deinem Profil ausblenden, sondern auch, wenn du einen Pull Request erstellst oder eine Datei über das Web-Interface bearbeitest. Gepushte Commits werden nicht geändert. Benutze %s in Commits, um sie mit deinem Konto zu assoziieren.
openid_desc=Mit OpenID kannst du dich über einen Drittanbieter authentifizieren.
manage_ssh_keys=SSH-Schlüssel verwalten
manage_ssh_principals=SSH-Zertifikat's Identitäten 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.
+ssh_desc=Diese öffentlichen SSH-Keys sind mit deinem Account verbunden. Der dazugehörigen privaten SSH-Keys geben dir vollen Zugriff auf deine Repositorys. Verifizierte SSH-Key können verwendet werden, um SSH-signierte Git-Commits zu signieren.
principal_desc=Diese SSH-Zertifikat-Identitäten sind mit deinem Konto verknüpft und erlauben den vollen Zugriff auf deine Repositories.
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
-key_content_ssh_placeholder=Startet mit 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', oder 'sk-ssh-ed25519@openssh.com'
-key_content_gpg_placeholder=Beginnt mit '-----BEGIN PGP PUBLIC KEY BLOCK-----'
+key_content_ssh_placeholder=Startet mit „ssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“ oder „sk-ssh-ed25519@openssh.com“
+key_content_gpg_placeholder=Beginnt mit „-----BEGIN PGP PUBLIC KEY BLOCK-----“
add_new_principal=Identität hinzufügen
ssh_key_been_used=Dieser SSH-Key wird auf diesem Server bereits verwendet.
ssh_key_name_used=Ein gleichnamiger SSH-Key existiert bereits in deinem Account.
@@ -774,8 +779,8 @@ gpg_token=Token
gpg_token_help=Du kannst eine Signatur wie folgt generieren:
gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig
gpg_token_signature=GPG Textsignatur (armored signature)
-key_signature_gpg_placeholder=Beginnt mit '-----BEGIN PGP SIGNATURE-----'
-verify_gpg_key_success=GPG-Schlüssel "%s" wurde verifiziert.
+key_signature_gpg_placeholder=Beginnt mit „-----BEGIN PGP SIGNATURE-----“
+verify_gpg_key_success=GPG-Schlüssel „%s“ wurde verifiziert.
ssh_key_verified=Verifizierter Schlüssel
ssh_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen.
ssh_key_verify=Verifizieren
@@ -785,15 +790,15 @@ ssh_token=Token
ssh_token_help=Du kannst eine Signatur wie folgt generieren:
ssh_token_signature=SSH Textsignatur (armored signature)
key_signature_ssh_placeholder=Beginnt mit „-----BEGIN SSH SIGNATURE-----“
-verify_ssh_key_success=SSH-Key "%s" wurde verifiziert.
+verify_ssh_key_success=SSH-Key „%s“ wurde verifiziert.
subkeys=Unterschlüssel
key_id=Schlüssel-ID
key_name=Schlüsselname
key_content=Inhalt
principal_content=Inhalt
-add_key_success=Der SSH-Key "%s" wurde hinzugefügt.
-add_gpg_key_success=Der GPG-Schlüssel "%s" wurde hinzugefügt.
-add_principal_success=Die SSH-Zertifikatsidentität "%s" wurde hinzugefügt.
+add_key_success=Der SSH-Key „%s“ wurde hinzugefügt.
+add_gpg_key_success=Der GPG-Schlüssel „%s“ wurde hinzugefügt.
+add_principal_success=Die SSH-Zertifikatsidentität „%s“ wurde hinzugefügt.
delete_key=Entfernen
ssh_key_deletion=SSH-Schlüssel entfernen
gpg_key_deletion=GPG-Schlüssel entfernen
@@ -842,19 +847,19 @@ permissions_public_only=Nur öffentlich
permissions_access_all=Alle (öffentlich, privat und begrenzt)
select_permissions=Berechtigungen auswählen
permission_no_access=Kein Zugriff
-permission_read=Gelesen
+permission_read=Lesen
permission_write=Lesen und Schreiben
access_token_desc=Ausgewählte Token-Berechtigungen beschränken die Authentifizierung auf die entsprechenden API-Routen. Lies die Dokumentation für mehr Informationen.
at_least_one_permission=Du musst mindestens eine Berechtigung auswählen, um ein Token zu erstellen
permissions_list=Berechtigungen:
-manage_oauth2_applications=OAuth2 Anwendungen verwalten
-edit_oauth2_application=OAuth2 Anwendung bearbeiten
+manage_oauth2_applications=OAuth2-Anwendungen verwalten
+edit_oauth2_application=OAuth2-Anwendung bearbeiten
oauth2_applications_desc=OAuth2-Anwendungen ermöglichen die sichere Authentifizierung von Benutzern dieser Forgejo-Instanz für deine Drittanwendung.
remove_oauth2_application=OAuth2-Anwendung entfernen
remove_oauth2_application_desc=Das Entfernen einer OAuth2-Anwendung wird den Zugriff auf alle signierten Zugriffstokens widerrufen. Möchtest du fortfahren?
remove_oauth2_application_success=Die Anwendung wurde gelöscht.
-create_oauth2_application=Neue OAuth2 Anwendung erstellen
+create_oauth2_application=Neue OAuth2-Anwendung erstellen
create_oauth2_application_button=Anwendung erstellen
create_oauth2_application_success=Du hast erfolgreich eine neue OAuth2-Anwendung erstellt.
update_oauth2_application_success=Du hast die OAuth2-Anwendung erfolgreich aktualisiert.
@@ -868,18 +873,18 @@ oauth2_regenerate_secret=Secret neu generieren
oauth2_regenerate_secret_hint=Secret verloren?
oauth2_client_secret_hint=Das Secret wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast.
oauth2_application_edit=Bearbeiten
-oauth2_application_create_description=OAuth2 Anwendungen geben deiner Drittanwendung Zugriff auf Benutzeraccounts dieser Forgejo-Instanz.
+oauth2_application_create_description=OAuth2-Anwendungen geben deiner Drittanwendung Zugriff auf Benutzeraccounts dieser Forgejo-Instanz.
oauth2_application_remove_description=Das Entfernen einer OAuth2-Anwendung hat zur Folge, dass diese nicht mehr auf autorisierte Benutzeraccounts auf dieser Instanz zugreifen kann. Möchtest Du fortfahren?
oauth2_application_locked=Wenn es in der Konfiguration aktiviert ist, registriert Forgejo einige OAuth2-Anwendungen beim Starten vor. Um unerwartetes Verhalten zu verhindern, können diese weder bearbeitet noch entfernt werden. Weitere Informationen findest Du in der OAuth2-Dokumentation.
authorized_oauth2_applications=Autorisierte OAuth2-Anwendungen
-authorized_oauth2_applications_description=Den folgenden Drittanbieter-Apps hast Du Zugriff auf Deinen persönlichen Forgejo-Account gewährt. Bitte widerrufe die Autorisierung für Apps, die Du nicht mehr nutzt.
+authorized_oauth2_applications_description=Den folgenden Drittanbieter-Apps hast du Zugriff auf deinen persönlichen Forgejo-Account gewährt. Bitte widerrufe die Autorisierung für Apps, die du nicht mehr nutzt.
revoke_key=Widerrufen
revoke_oauth2_grant=Autorisierung widerrufen
revoke_oauth2_grant_description=Wenn du die Autorisierung widerrufst, kann die Anwendung nicht mehr auf deine Daten zugreifen. Bist du dir sicher?
revoke_oauth2_grant_success=Zugriff erfolgreich widerrufen.
-twofa_desc=Zwei-Faktor-Authentifizierung trägt zu einer höheren Accountsicherheit bei.
+twofa_desc=Um dein Konto gegen Passwortdiebstahl zu schützen, kannst du eine Smartphone oder ein anderes Gerät verwenden, um Time-Based One-Time Passwords („TOTP“) zu erhalten.
twofa_is_enrolled=Für dein Konto ist die Zwei-Faktor-Authentifizierung eingeschaltet.
twofa_not_enrolled=Für dein Konto ist die Zwei-Faktor-Authentifizierung momentan nicht eingeschaltet.
twofa_disable=Zwei-Faktor-Authentifizierung deaktivieren
@@ -892,7 +897,7 @@ regenerate_scratch_token_desc=Wenn du dein Einmalpasswort verlegt oder es bereit
twofa_disabled=Zwei-Faktor-Authentifizierung wurde deaktiviert.
scan_this_image=Scanne diese Grafik mit deiner Authentifizierungs-App:
or_enter_secret=Oder gib das Secret ein: %s
-then_enter_passcode=Und gebe dann die angezeigte PIN der Anwendung ein:
+then_enter_passcode=Und gib 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.
twofa_failed_get_secret=Fehler beim Abrufen des Secrets.
@@ -911,57 +916,65 @@ remove_account_link=Verknüpften Account entfernen
remove_account_link_desc=Wenn du den verknüpften Account entfernst, wirst du darüber nicht mehr auf deinen Forgejo-Account zugreifen können. Fortfahren?
remove_account_link_success=Der verknüpfte Account wurde entfernt.
-hooks.desc=Webhooks hinzufügen, die für alle Repositories, die dir gehören, ausgelöst werden.
+hooks.desc=Webhooks hinzufügen, die für alle Repositorys, die dir gehören, ausgelöst werden.
orgs_none=Du bist kein Mitglied in einer Organisation.
-repos_none=Du besitzt keine Repositories.
+repos_none=Du besitzt keine Repositorys.
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_with_all_comments=Dein Account existiert seit weniger als %s Tagen. Um Geisterkommentare zu vermeiden, werden alle deine Issue/PR-Kommentare gelöscht.
+delete_with_all_comments=Dein Account existiert seit weniger als %s. Um Geisterkommentare zu vermeiden, werden alle deine Issue/PR-Kommentare gelöscht.
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?
email_notifications.enable=E-Mail Benachrichtigungen aktivieren
email_notifications.onmention=Nur E-Mail bei Erwähnung
-email_notifications.disable=E-Mail Benachrichtigungen deaktivieren
+email_notifications.disable=E-Mail-Benachrichtigungen deaktivieren
email_notifications.submit=E-Mail-Einstellungen festlegen
-email_notifications.andyourown=Und deine Eigenen Benachrichtigungen
+email_notifications.andyourown=Und deine eigenen Benachrichtigungen
-visibility=Nutzer Sichtbarkeit
+visibility=Benutzersichtbarkeit
visibility.public=Öffentlich
visibility.public_tooltip=Für alle sichtbar
visibility.limited=Begrenzt
visibility.limited_tooltip=Nur für authentifizierte Benutzer sichtbar
visibility.private=Privat
visibility.private_tooltip=Sichtbar nur für Mitglieder von Organisationen, denen du beigetreten bist
+user_block_success = Dieser Benutzer wurde erfolgreich blockiert.
+twofa_recovery_tip = Falls du dein Gerät verlierst, wirst du in der Lage sein, einen einmalig verwendbaren Key zu benutzen, um den auf dein Konto wiederherzustellen.
+webauthn_alternative_tip = Du möchtest vielleicht eine zusätzliche Authentifizierungsmethode einrichten.
+blocked_users_none = Du hast keine Benutzer blockiert.
+webauthn_key_loss_warning = Falls du deine Security-Keys verlierst, wirst du Zugang zu deinem Konto verlieren.
+user_unblock_success = Die Blockierung dieses Benutzers wurde erfolgreich zurückgenommen.
+blocked_users = Blockierte Benutzer
+blocked_since = Blockiert seit %s
[repo]
owner=Besitzer
-owner_helper=Einige Organisationen könnten in der Dropdown-Liste nicht angezeigt werden, da die Anzahl an Repositories begrenzt ist.
+owner_helper=Einige Organisationen könnten in der Dropdown-Liste nicht angezeigt werden, da die Anzahl an Repositorys begrenzt ist.
repo_name=Repository-Name
repo_name_helper=Ein guter Repository-Name besteht normalerweise aus kurzen, unvergesslichen und einzigartigen Schlagwörtern.
repo_size=Repository-Größe
-template=Template
-template_select=Vorlage auswählen
-template_helper=Repository zu einem Template machen
-template_description=Template-Repositories erlauben es Benutzern, neue Repositories mit den gleichen Verzeichnisstrukturen, Dateien und optionalen Einstellungen zu erstellen.
+template=Vorlage
+template_select=Vorlage auswählen.
+template_helper=Repository zu einer Vorlage machen
+template_description=Vorlagenrepositorys erlauben es Benutzern, neue Repositorys mit den gleichen Verzeichnisstrukturen, Dateien und optionalen Einstellungen zu erstellen.
visibility=Sichtbarkeit
-visibility_description=Nur der Besitzer oder Organisationsmitglieder mit entsprechender Berechtigung, werden in der Lage sein, es zu sehen.
+visibility_description=Nur der Besitzer oder Organisationsmitglieder mit entsprechender Berechtigung werden in der Lage sein, es zu sehen.
visibility_helper=In privates Repository umwandeln
-visibility_helper_forced=Auf dieser Forgejo-Instanz können nur private Repositories angelegt werden.
+visibility_helper_forced=Auf dieser Forgejo-Instanz können nur private Repositorys angelegt werden.
visibility_fork_helper=(Eine Änderung dieses Wertes wirkt sich auf alle Forks aus)
clone_helper=Benötigst du Hilfe beim Klonen? Öffne die Hilfe.
fork_repo=Repository forken
fork_from=Fork von
already_forked=Du hast bereits einen Fork von %s erstellt
fork_to_different_account=Fork in ein anderes Konto erstellen
-fork_visibility_helper=Die Sichtbarkeit eines geforkten Repositories kann nicht geändert werden.
+fork_visibility_helper=Die Sichtbarkeit eines geforkten Repositorys kann nicht geändert werden.
fork_branch=Branch, der zum Fork geklont werden soll
all_branches=Alle Branches
fork_no_valid_owners=Dieses Repository kann nicht geforkt werden, da keine gültigen Besitzer vorhanden sind.
-use_template=Dieses Template verwenden
+use_template=Diese Vorlage verwenden
clone_in_vsc=In VS Code klonen
download_zip=ZIP herunterladen
download_tar=TAR.GZ herunterladen
@@ -972,12 +985,12 @@ repo_desc=Beschreibung
repo_desc_helper=Gib eine kurze Beschreibung an (optional)
repo_lang=Sprache
repo_gitignore_helper=Wähle eine .gitignore-Vorlage aus.
-repo_gitignore_helper_desc=Wähle aus einer Liste an Vorlagen für bekannte Sprachen, welche Dateien ignoriert werden sollen. Typische Artefakte, die durch die Build Tools der gewählten Sprache generiert werden, sind standardmäßig Bestandteil der .gitignore.
-issue_labels=Issue Label
-issue_labels_helper=Wähle ein Issue-Label-Set.
+repo_gitignore_helper_desc=Wähle aus einer Liste an Vorlagen für bekannte Sprachen, welche Dateien ignoriert werden sollen. Typische Artefakte, die durch die Build-Tools der gewählten Sprache generiert werden, sind standardmäßig Bestandteil der .gitignore.
+issue_labels=Issue-Labels
+issue_labels_helper=Wähle eine Issue-Label-Sammlung.
license=Lizenz
license_helper=Wähle eine Lizenz aus.
-license_helper_desc=Eine Lizenz regelt, was Andere mit deinem Code (nicht) tun können. Unsicher, welches für dein Projekt die Richtige ist? Siehe eine Lizenz wählen.
+license_helper_desc=Eine Lizenz regelt, was andere mit deinem Code tun (oder nicht tun) können. Unsicher, welches für dein Projekt die Richtige ist? Siehe den Lizenzwahlhelfer.
readme=README
readme_helper=Wähle eine README-Vorlage aus.
readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben.
@@ -990,15 +1003,15 @@ trust_model_helper_default=Standard: Verwende das Standardvertrauensmodell für
create_repo=Repository erstellen
default_branch=Standardbranch
default_branch_label=Standard
-default_branch_helper=Der default Branch ist der Basisbranch für Pull-Requests und Commits.
+default_branch_helper=Der default-Branch ist der Basisbranch für Pull-Requests und Commits.
mirror_prune=Entfernen
-mirror_prune_desc=Entferne veraltete remote-tracking Referenzen
-mirror_interval=Mirror-Intervall (gültige Zeiteinheiten sind 'h', 'm', 's'). 0 deaktiviert die regelmäßige Synchronisation. (Minimales Intervall: %s)
+mirror_prune_desc=Entferne veraltete remote-tracking-Referenzen
+mirror_interval=Mirror-Intervall (gültige Zeiteinheiten sind „h“, „m“, „s“). 0 deaktiviert die regelmäßige Synchronisation. (Minimales Intervall: %s)
mirror_interval_invalid=Das Spiegel-Intervall ist ungültig.
mirror_sync_on_commit=Synchronisieren, wenn Commits gepusht wurden
mirror_address=Klonen via URL
-mirror_address_desc=Gib alle erforderlichen Anmeldedaten im Abschnitt "Authentifizierung" ein.
-mirror_address_url_invalid=Die angegebene URL ist ungültig. Achte darauf, alle URL-Komponenten korrekt zu maskieren.
+mirror_address_desc=Gib alle erforderlichen Anmeldedaten im Abschnitt „Authentifizierung“ ein.
+mirror_address_url_invalid=Die angegebene URL ist ungültig. Achte darauf, alle Komponenten der URL korrekt zu maskieren.
mirror_address_protocol_invalid=Die angegebene URL ist ungültig. Nur URLs beginnend mit http(s):// oder git:// sind möglich.
mirror_lfs=Großdatei-Speicher (LFS)
mirror_lfs_desc=Mirroring von LFS-Dateien aktivieren.
@@ -1015,7 +1028,7 @@ forks=Forks
reactions_more=und %d weitere
unit_disabled=Der Administrator hat diesen Repository-Bereich deaktiviert.
language_other=Andere
-adopt_search=Geben einen Benutzernamen ein, um nach nicht angenommenen Repositories zu suchen... (leer lassen um alle zu finden)
+adopt_search=Gib einen Benutzernamen ein, um nach nicht angenommenen Repositorys zu suchen … (leer lassen, um alle zu finden)
adopt_preexisting_label=Dateien übernehmen
adopt_preexisting=Vorhandene Dateien übernehmen
adopt_preexisting_content=Repository aus %s erstellen
@@ -1034,28 +1047,28 @@ tree_path_not_found_branch=Pfad %[1]s existiert nicht in Branch %[2]s
tree_path_not_found_tag=Pfad %[1]s existiert nicht in Tag %[2]s
transfer.accept=Übertragung Akzeptieren
-transfer.accept_desc=`Übertragung nach "%s"`
+transfer.accept_desc=Übertragung nach „%s“
transfer.reject=Übertragung Ablehnen
-transfer.reject_desc=Übertragung nach "%s " abbrechen
+transfer.reject_desc=Übertragung nach„%s“ abbrechen
transfer.no_permission_to_accept=Du hast keine Berechtigung, diesen Transfer anzunehmen.
transfer.no_permission_to_reject=Du hast keine Berechtigung, diesen Transfer abzulehnen.
desc.private=Privat
desc.public=Öffentlich
-desc.template=Template
+desc.template=Vorlage
desc.internal=Intern
desc.archived=Archiviert
-template.items=Template-Elemente
-template.git_content=Git Inhalt (Standardbranch)
+template.items=Vorlagenelemente
+template.git_content=Git-Inhalt (Standardbranch)
template.git_hooks=Git-Hooks
-template.git_hooks_tooltip=Du kannst gerade Git-Hooks nicht ändern oder entfernen, sobald sie hinzugefügt wurden. Wähle das nur aus, wenn du dem Template Repository vertraust.
+template.git_hooks_tooltip=Du kannst gerade Git-Hooks nicht ändern oder entfernen, sobald sie hinzugefügt wurden. Wähle das nur aus, wenn du dem Vorlagen-Repository vertraust.
template.webhooks=Webhooks
template.topics=Themen
template.avatar=Profilbild
-template.issue_labels=Issue Label
-template.one_item=Es muss mindestens ein Template ausgewählt werden
-template.invalid=Es muss ein Template-Repository ausgewählt werden
+template.issue_labels=Issue-Labels
+template.one_item=Es muss mindestens eine Vorlage ausgewählt werden
+template.invalid=Es muss ein Vorlagen-Repository ausgewählt werden
archive.title=Dieses Repository ist archiviert. Du kannst Dateien ansehen und es klonen, kannst aber nicht pushen oder Issues/Pull-Requests öffnen.
archive.title_date=Dieses Repository wurde am %s archiviert. Du kannst Dateien ansehen und es klonen, aber nicht pushen oder Issues/Pull-Requests öffnen.
@@ -1063,9 +1076,9 @@ archive.issue.nocomment=Dieses Repo ist archiviert. Du kannst Issues nicht komme
archive.pull.nocomment=Dieses Repo ist archiviert. Du kannst Pull-Requests nicht kommentieren.
form.reach_limit_of_creation_1=Du hast bereits dein Limit von %d Repository erreicht.
-form.reach_limit_of_creation_n=Du hast bereits dein Limit von %d Repositories erreicht.
-form.name_reserved=Der Repository-Name "%s" ist reserviert.
-form.name_pattern_not_allowed=Das Muster "%s" ist in Repository-Namen nicht erlaubt.
+form.reach_limit_of_creation_n=Du hast bereits dein Limit von %d Repositorys erreicht.
+form.name_reserved=Der Repository-Name „%s“ ist reserviert.
+form.name_pattern_not_allowed=Das Muster „%s“ ist in Repository-Namen nicht erlaubt.
need_auth=Authentifizierung
migrate_options=Migrationsoptionen
@@ -1086,12 +1099,12 @@ migrate_items_merge_requests=Merge-Requests
migrate_items_releases=Releases
migrate_repo=Repository migrieren
migrate.clone_address=Migrations- / Klon-URL
-migrate.clone_address_desc=Die HTTP(S)- oder „git clone“-URL eines bereits existierenden Repositories
-migrate.github_token_desc=Du kannst hier ein oder mehrere Token durch Komma getrennt eintippen, um die Migration aufgrund der Github API Ratenlimitierung zu beschleunigen. WARNUNG: Der Missbrauch dieser Funktion kann gegen die Richtlinien des Diensteanbieters verstoßen und zur Kontosperrung führen.
+migrate.clone_address_desc=Die HTTP(S)- oder „git clone“-URL eines bereits existierenden Repositorys
+migrate.github_token_desc=Du kannst hier ein oder mehrere Token durch Komma getrennt eintippen, um die Migration aufgrund der GitHub-API-Ratenlimitierung zu beschleunigen. WARNUNG: Der Missbrauch dieser Funktion kann gegen die Richtlinien des Diensteanbieters verstoßen und zur Kontosperrung führen.
migrate.clone_local_path=oder ein lokaler Serverpfad
-migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositories.
+migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositorys.
migrate.permission_denied_blocked=Du kannst von keinen nicht erlaubten Hosts importieren. Bitte fragen deinen Administrator, die Einstellungen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS zu überprüfen.
-migrate.invalid_local_path=Der lokale Pfad ist ungültig. Er existiert nicht oder ist kein Verzeichnis.
+migrate.invalid_local_path=„Der lokale Pfad ist ungültig. Er existiert nicht oder ist kein Verzeichnis.“
migrate.invalid_lfs_endpoint=Ungültiger LFS Endpunkt.
migrate.failed=Fehler bei der Migration: %v
migrate.migrate_items_options=Zugangs-Token wird benötigt, um zusätzliche Elemente zu migrieren
@@ -1102,21 +1115,21 @@ migrate.migrating=Migriere von %s ...
migrate.migrating_failed=Migrieren von %s fehlgeschlagen.
migrate.migrating_failed.error=Migration fehlgeschlagen: %s
migrate.migrating_failed_no_addr=Migration fehlgeschlagen.
-migrate.github.description=Daten von github.com oder anderen GitHub Instanzen migrieren.
+migrate.github.description=Daten von github.com oder anderen GitHub-Instanzen migrieren.
migrate.git.description=Ein Repository von einem beliebigen Git Service klonen.
-migrate.gitlab.description=Daten von gitlab.com oder anderen GitLab Instanzen migrieren.
-migrate.gitea.description=Daten von gitea.com oder anderen Gitea/Forgejo Instanzen migrieren.
-migrate.gogs.description=Daten von notabug.org oder anderen Gogs Instanzen migrieren.
-migrate.onedev.description=Daten von code.onedev.io oder anderen OneDev Instanzen migrieren.
+migrate.gitlab.description=Daten von gitlab.com oder anderen GitLab-Instanzen migrieren.
+migrate.gitea.description=Daten von gitea.com oder anderen Gitea-/Forgejo-Instanzen migrieren.
+migrate.gogs.description=Daten von notabug.org oder anderen Gogs-Instanzen migrieren.
+migrate.onedev.description=Daten von code.onedev.io oder anderen OneDev-Instanzen migrieren.
migrate.codebase.description=Daten von codebasehq.com migrieren.
-migrate.gitbucket.description=Daten von GitBucket Instanzen migrieren.
+migrate.gitbucket.description=Daten von GitBucket-Instanzen migrieren.
migrate.migrating_git=Git-Daten werden migriert
migrate.migrating_topics=Themen werden migriert
migrate.migrating_milestones=Meilensteine werden migriert
migrate.migrating_labels=Labels werden migriert
migrate.migrating_releases=Releases werden migriert
migrate.migrating_issues=Issues werden migriert
-migrate.migrating_pulls=Pull Requests werden migriert
+migrate.migrating_pulls=Pull-Requests werden migriert
migrate.cancel_migrating_title=Migration abbrechen
migrate.cancel_migrating_confirm=Möchtest du diese Migration abbrechen?
@@ -1124,9 +1137,9 @@ mirror_from=Mirror von
forked_from=geforkt von
generated_from=erzeugt von
fork_from_self=Du kannst kein Repository forken, das dir bereits gehört.
-fork_guest_user=Bitte melde dich an, um dieses Repository zu forken.
+fork_guest_user=Melde dich an, um dieses Repository zu forken.
watch_guest_user=Melde dich an, um dieses Repository zu beobachten.
-star_guest_user=Bitte melde dich an, um dieses Repository zu favorisieren.
+star_guest_user=Melde dich an, um dieses Repository zu favorisieren.
unwatch=Beobachten beenden
watch=Beobachten
unstar=Favorit entfernen
@@ -1158,8 +1171,8 @@ pulls=Pull-Requests
project_board=Projekte
packages=Pakete
actions=Actions
-labels=Label
-org_labels_desc=Labels der Organisationsebene, die mit allen Repositories in dieser Organisation verwendet werden können
+labels=Labels
+org_labels_desc=Labels der Organisationsebene, die mit allen Repositorys in dieser Organisation verwendet werden können
org_labels_desc_manage=verwalten
milestones=Meilensteine
@@ -1190,12 +1203,12 @@ escape_control_characters=Escapen
unescape_control_characters=Unescapen
file_copy_permalink=Permalink kopieren
view_git_blame=Git Blame ansehen
-video_not_supported_in_browser=Dein Browser unterstützt das HTML5 'video'-Tag nicht.
-audio_not_supported_in_browser=Dein Browser unterstützt den HTML5 'audio'-Tag nicht.
+video_not_supported_in_browser=Dein Browser unterstützt das HTML5-„video“-Tag nicht.
+audio_not_supported_in_browser=Dein Browser unterstützt das HTML5-„audio“-Tag nicht.
stored_lfs=Gespeichert mit Git LFS
symbolic_link=Softlink
executable_file=Ausführbare Datei
-commit_graph=Commit graph
+commit_graph=Commit-Graph
commit_graph.select=Branches auswählen
commit_graph.hide_pr_refs=Pull-Requests ausblenden
commit_graph.monochrome=Monochrom
@@ -1223,53 +1236,53 @@ editor.must_be_on_a_branch=Du musst dich in einem Branch befinden, um Änderunge
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.
-editor.file_delete_success=Datei "%s" wurde gelöscht.
-editor.name_your_file=Dateinamen eingeben…
-editor.filename_help=Füge einen Ordner hinzu, indem du seinen Namen und anschließend '/' eingibst. Entferne einen Ordner indem du die Zurücktaste am Anfang des Feldes drückst.
+editor.file_delete_success=Datei „%s“ wurde gelöscht.
+editor.name_your_file=Dateinamen eingeben …
+editor.filename_help=Füge einen Ordner hinzu, indem du seinen Namen und anschließend „/“ eingibst. Entferne einen Ordner, indem du die Rücktaste am Anfang des Feldes drückst.
editor.or=oder
editor.cancel_lower=Abbrechen
editor.commit_signed_changes=Committe signierte Änderungen
editor.commit_changes=Änderungen committen
-editor.add_tmpl='' hinzufügen
+editor.add_tmpl=„“ hinzufügen
editor.add=%s hinzugefügt
editor.update=%s aktualisiert
editor.delete=%s gelöscht
editor.patch=Patch anwenden
editor.patching=Patche:
-editor.fail_to_apply_patch=Patch "%s" nicht anwendbar
+editor.fail_to_apply_patch=Patch „%s“ nicht anwendbar
editor.new_patch=Neuer Patch
-editor.commit_message_desc=Eine ausführlichere (optionale) Beschreibung hinzufügen…
+editor.commit_message_desc=Eine ausführlichere (optionale) Beschreibung hinzufügen …
editor.signoff_desc=Am Ende der Commit Nachricht einen Signed-off-by Anhang vom Committer hinzufügen.
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.create_new_branch=Einen neuen Branch für diesen Commit erstellen und einen Pull-Request starten.
editor.create_new_branch_np=Erstelle einen neuen Branch für diesen Commit.
editor.propose_file_change=Dateiänderung vorschlagen
editor.new_branch_name=Benenne den neuen Branch für diesen Commit
-editor.new_branch_name_desc=Neuer Branchname…
+editor.new_branch_name_desc=Neuer Branchname …
editor.cancel=Abbrechen
editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein.
-editor.filename_is_invalid=Ungültiger Dateiname: "%s".
-editor.branch_does_not_exist=Branch "%s" existiert nicht 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 symbolischer 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_deleting_no_longer_exists=Die zu löschende Datei "%s" existiert nicht mehr in diesem Repository.
+editor.filename_is_invalid=Ungültiger Dateiname: „%s“.
+editor.branch_does_not_exist=Branch „%s“ existiert nicht 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 symbolischer 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_deleting_no_longer_exists=Die zu löschende 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' existiert bereits in diesem Repository.
+editor.file_already_exists=Eine Datei mit dem Namen „%s“ existiert bereits in diesem Repository.
editor.commit_empty_file_header=Leere Datei committen
editor.commit_empty_file_text=Die Datei, die du commiten willst, ist leer. Fortfahren?
editor.no_changes_to_show=Keine Änderungen vorhanden.
-editor.fail_to_update_file=Fehler beim Aktualisieren/Erstellen der Datei "%s".
+editor.fail_to_update_file=Fehler beim Aktualisieren/Erstellen der Datei „%s“.
editor.fail_to_update_file_summary=Fehlermeldung:
editor.push_rejected_no_message=Die Änderung wurde vom Server ohne Nachricht abgelehnt. Bitte überprüfe die Git Hooks.
editor.push_rejected=Die Änderung wurde vom Server abgelehnt. Bitte überprüfe die Git Hooks.
editor.push_rejected_summary=Vollständige Ablehnungsmeldung:
-editor.add_subdir=Verzeichnis erstellen…
-editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach "%s". Fehler: %v
-editor.upload_file_is_locked=Datei "%s" ist von %s gesperrt.
-editor.upload_files_to_dir=Dateien nach "%s" hochladen
+editor.add_subdir=Verzeichnis erstellen …
+editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach „%s“. Fehler: %v
+editor.upload_file_is_locked=Datei „%s“ ist von %s gesperrt.
+editor.upload_files_to_dir=Dateien nach „%s“ hochladen
editor.cannot_commit_to_protected_branch=Ein Commit auf den geschützten Branch „%s“ ist nicht möglich.
editor.no_commit_to_branch=Kann nicht direkt zum Branch committen, da:
editor.user_no_push_to_branch=Benutzer kann nicht in die Branch pushen
@@ -1750,7 +1763,7 @@ pulls.required_status_check_missing=Einige erforderliche Prüfungen fehlen.
pulls.required_status_check_administrator=Als Administrator kannst du diesen Pull-Request weiterhin mergen.
pulls.blocked_by_approvals=Dieser Pull-Request hat noch nicht genügend Zustimmungen. %d von %d Zustimmungen erteilt.
pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Reviewer angefragt wurden.
-pulls.blocked_by_official_review_requests=Dieser Pull Request hat offizielle Review-Anfragen.
+pulls.blocked_by_official_review_requests=„Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Reviewern fehlt.“
pulls.blocked_by_outdated_branch=Dieser Pull Request ist blockiert, da er veraltet ist.
pulls.blocked_by_changed_protected_files_1=Dieser Pull Request ist blockiert, weil er eine geschützte Datei ändert:
pulls.blocked_by_changed_protected_files_n=Dieser Pull Request ist blockiert, weil er geschützte Dateien ändert:
@@ -2568,6 +2581,64 @@ find_file.no_matching=Keine passende Datei gefunden
error.csv.too_large=Diese Datei kann nicht gerendert werden, da sie zu groß ist.
error.csv.unexpected=Diese Datei kann nicht gerendert werden, da sie ein unerwartetes Zeichen in Zeile %d und Spalte %d enthält.
error.csv.invalid_field_count=Diese Datei kann nicht gerendert werden, da sie eine falsche Anzahl an Feldern in Zeile %d hat.
+rss.must_be_on_branch = Du musst auf einem Branch sein, um einen RSS-Feed zu haben.
+new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? Repository migrieren.
+issues.comment.blocked_by_user = Du kannst kein Kommentar für dieses Issue erstellen, weil du vom Repository-Besitzer oder dem Autoren des Issues blockiert wurdest.
+clone_in_vscodium = In VSCodium klonen
+settings.units.add_more = Mehr hinzufügen …
+settings.wiki_rename_branch_main_desc = Den Branch, der intern vom Wiki benutzt wird, zu „%s“ umbenennen. Dies ist permanent und kann nicht rückgängig gemacht werden.
+desc.sha256 = SHA256
+object_format_helper = Objektformat des Repositorys. Kann später nicht geändert werden. SHA1 ist am kompatibelsten.
+pulls.reopen_failed.head_branch = Der Pull-Request kann nicht wieder geöffnet werden, weil der Head-Branch nicht mehr existiert.
+pulls.reopen_failed.base_branch = Der Pull-Request kann nicht wieder geöffnet werden, weil der Basis-Branch nicht mehr existiert.
+settings.mirror_settings.pushed_repository = Gepushtes Repository
+settings.add_collaborator_blocked_them = Der Mitarbeiter konnte nicht hinzugefügt werden, weil er den Besitzer des Repositorys blockiert hat.
+settings.wiki_rename_branch_main = Den Wiki-Branch-Namen normalisieren
+settings.enter_repo_name = Gib den Repository-Namen zur Bestätigung ein:
+settings.wiki_branch_rename_success = Der Branch-Name des Repository-Wikis wurde erfolgreich normalisiert.
+settings.archive.mirrors_unavailable = Mirrors sind nicht verfügbar, wenn das Repo archiviert ist.
+pulls.blocked_by_user = Du kannst keinen Pull-Request in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
+settings.add_collaborator_blocked_our = Der Mitarbeiter konnte nicht hinzugefügt werden, weil der Repository-Besitzer ihn blockiert hat.
+issues.blocked_by_user = Du kannst kein Issue in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
+admin.manage_flags = Flags verwalten
+admin.enabled_flags = Vom Repository aktivierte Flags:
+admin.update_flags = Flags aktualisieren
+admin.failed_to_replace_flags = Repository-Flags konnten nicht ersetzt werden
+admin.flags_replaced = Repository-Flags ersetzt
+object_format = Objektformat
+mirror_sync = synchronisiert
+migrate.forgejo.description = Daten von codeberg.org oder anderen Forgejo-Instanzen migrieren.
+settings.new_owner_blocked_doer = Der neue Besitzer hat dich blockiert.
+generated = Erzeugt
+editor.invalid_commit_mail = Ungültige E-Mail für die Erstellung eines Commits.
+commits.renamed_from = Umbenannt von %s
+commits.browse_further = Weiter browsen
+pulls.nothing_to_compare_have_tag = Der gewählte Branch/Tag ist gleich.
+pulls.status_checks_hide_all = Alle Prüfungen verbergen
+pulls.status_checks_show_all = Alle Prüfungen anzeigen
+pulls.cmd_instruction_hint = `Anweisungen für die Kommandozeile betrachten.`
+pulls.cmd_instruction_checkout_title = Auschecken
+wiki.cancel = Abbrechen
+settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten
+settings.protect_branch_name_pattern_desc = „Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/**“
+settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren
+settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Reviews), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Reviews bereits verworfen werden.
+pulls.commit_ref_at = `hat sich auf diesen Pull-Request von einem Commit %[2]s bezogen`
+pulls.fast_forward_only_merge_pull_request = Nur Fast-forward
+pulls.cmd_instruction_checkout_desc = Aus deinem Projekt-Repository, checke einen neuen Branch aus und teste die Änderungen.
+pulls.cmd_instruction_merge_title = Mergen
+pulls.cmd_instruction_merge_desc = Die Änderungen mergen und auf Forgejo aktualisieren.
+settings.units.units = Repository-Einheiten
+settings.units.overview = Übersicht
+settings.wiki_rename_branch_main_notices_1 = Diese Aktion KANN NICHT rückgängig gemacht werden.
+settings.wiki_rename_branch_main_notices_2 = Dies wird den internen Branch des Repository-Wikis von %s permanent umbenennen. Existierende Checkouts müssen aktualisiert werden.
+settings.wiki_branch_rename_failure = Der Branch-Name des Repository-Wiki konnte nicht normalisiert werden.
+settings.confirm_wiki_branch_rename = Den Wiki-Branch umbenenennen
+activity.navbar.contributors = Mitwirkende
+contributors.contribution_type.commits = Commits
+contributors.contribution_type.deletions = Löschungen
+contributors.contribution_type.additions = Einfügungen
+contributors.contribution_type.filter_label = Art des Beitrags:
[org]
org_name_holder=Name der Organisation
@@ -2692,6 +2763,7 @@ teams.all_repositories_admin_permission_desc=Dieses Team gewährt Admini
teams.invite.title=Du wurdest eingeladen, dem Team %s in der Organisation %s beizutreten.
teams.invite.by=Von %s eingeladen
teams.invite.description=Bitte klicke auf die folgende Schaltfläche, um dem Team beizutreten.
+follow_blocked_user = Du kannst dieser Organisation nicht folgen, weil diese Organisation dich blockiert hat.
[admin]
dashboard=Dashboard
@@ -2836,7 +2908,7 @@ users.cannot_delete_self=Du kannst dich nicht selbst löschen
users.still_own_repo=Dieser Benutzer besitzt noch mindestens ein Repository. Bitte lösche oder übertrage diese(s) zuerst.
users.still_has_org=Dieser Nutzer ist Mitglied einer Organisation. Du musst ihn zuerst aus allen Organisationen entfernen.
users.purge=Benutzer löschen
-users.purge_help=Erzwinge das Löschen des Benutzers inklusive aller seiner Repositories, Organisationen, Pakete und Kommentare.
+users.purge_help=Das Löschen des Benutzers inklusive all seiner Repositorys, Organisationen und Pakete erzwingen. Alle Kommentare und Issues, die von diesem Benutzer gepostet wurden, werden ebenso gelöscht.
users.still_own_packages=Dieser Benutzer besitzt noch ein oder mehrere Pakete, lösche diese Pakete zuerst.
users.deletion_success=Der Account wurde gelöscht.
users.reset_2fa=2FA zurücksetzen
@@ -3217,6 +3289,17 @@ notices.type_2=Aufgabe
notices.desc=Beschreibung
notices.op=Aktion
notices.delete_success=Diese Systemmeldung wurde gelöscht.
+self_check.database_fix_mysql = Für MySQL-/MariaDB-Benutzer: Du kannst den Befehl „gitea doctor convert“ benutzen, um die Collation-Probleme zu lösen, oder du kannst das Problem mit „ALTER … COLLATE …“-SQLs manuell lösen.
+dashboard.sync_tag.started = Tags-Synchronisierung gestartet
+self_check.database_collation_case_insensitive = Datenbank benutzt eine Collation %s, welcher der Groß-/Kleinschreibung egal ist. Obwohl Forgejo damit arbeiten könnte, könnte es ein paar seltene Fälle geben, bei denen es nicht wie erwartet funktioniert.
+self_check = Selbstprüfung
+dashboard.sync_repo_tags = Tags aus Git-Daten zu Datenbank synchronisieren
+emails.change_email_text = Bist du dir sicher, dass du diese E-Mail-Addresse aktualisieren möchtest?
+packages.cleanup.success = Abgelaufene Daten erfolgreich gesäubert
+self_check.database_fix_mssql = Für MSSQL-Benutzer: Du kannst das Problem im Moment nur mit „ALTER … COLLATE …“-SQLs beheben.
+self_check.no_problem_found = Noch kein Problem gefunden.
+self_check.database_inconsistent_collation_columns = Datenbank benutzt Collation %s, aber diese Spalten benutzen Collations, die nicht zusammenpassen. Das könnte ein paar unerwartete Probleme verursachen.
+self_check.database_collation_mismatch = Erwarte von Datenbank, folgende Collation zu verwenden: %s
[action]
create_repo=hat das Repository %s erstellt
@@ -3455,6 +3538,9 @@ owner.settings.cleanuprules.success.delete=Bereinigungsregel wurde gelöscht.
owner.settings.chef.title=Chef-Registry
owner.settings.chef.keypair=Schlüsselpaar generieren
owner.settings.chef.keypair.description=Ein Schlüsselpaar ist notwendig, um mit der Chef-Registry zu authentifizieren. Wenn du bereits eins erstellt hast, wird dieses durch eine Neuerstellung verworfen.
+rpm.repository = Repository-Info
+rpm.repository.multiple_groups = Dieses Paket ist in mehreren Gruppen verfügbar.
+rpm.repository.architectures = Architekturen
[secrets]
secrets=Secrets
@@ -3557,6 +3643,11 @@ variables.creation.failed=Fehler beim Hinzufügen der Variable.
variables.creation.success=Die Variable „%s“ wurde hinzugefügt.
variables.update.failed=Fehler beim Bearbeiten der Variable.
variables.update.success=Die Variable wurde bearbeitet.
+runs.no_workflows.quick_start = Weißt du nicht, wie du mit Forgejo Actions anfangen sollst? Sieh dir die Schnellstartanleitung an.
+runs.no_matching_online_runner_helper = Es gibt keinen passenden Online-Runner mit dem Label: %s
+runs.no_workflows = Es gibt noch keine Workflows.
+runs.no_workflows.documentation = Für weitere Informationen über Forgejo Actions, siehe die Dokumentation.
+runs.empty_commit_message = (leere Commit-Nachricht)
[projects]
type-1.display_name=Individuelles Projekt
@@ -3572,3 +3663,11 @@ executable_file=Ausführbare Datei
symbolic_link=Softlink
submodule=Submodul
+
+
+[graphs]
+component_loading_failed = Konnte %s nicht laden
+component_loading_info = Dies könnte einen Moment dauern …
+component_failed_to_load = Ein unerwarteter Fehler ist aufgetreten.
+component_loading = Lade %s …
+contributors.what = Beiträge
\ No newline at end of file
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index 91a6da1e81..dfb0422991 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -2628,6 +2628,12 @@ settings.mirror_settings.pushed_repository = Dépôt poussé
settings.add_collaborator_blocked_our = Il n'est pas possible d'ajouter ce collaborateur parce-que le propriétaire du dépôt l'a bloqué.
settings.wiki_rename_branch_main_notices_1 = Cette operation NE PEUT PAS être annulée.
settings.wiki_branch_rename_failure = Le nom de la branche associée au wiki du dépôt n'a pu être normalisé.
+pulls.reopen_failed.head_branch = La pull request ne peut pas être re-ouverte car la branch d'origine n'existe plus.
+settings.units.units = Fonctionalités des dépôt
+pulls.fast_forward_only_merge_pull_request = Fast-forward uniquement
+pulls.reopen_failed.base_branch = La pull request ne peut pas être re-ouverte car la branche de destination n'existe plus.
+settings.units.overview = Vue générale
+settings.units.add_more = Ajouter en plus...
[org]
org_name_holder=Nom de l'organisation
diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini
index 3174d11a74..05d3682147 100644
--- a/options/locale/locale_hu-HU.ini
+++ b/options/locale/locale_hu-HU.ini
@@ -1572,6 +1572,14 @@ notices.type_2=Feladat
notices.desc=Leírás
notices.op=Op.
notices.delete_success=A rendszer-értesítések törölve lettek.
+auths.skip_local_two_fa = Helyi 2FA kihagyása
+auths.new_success = A(z) „%s” hitelesítés hozzá lett adva.
+config.lfs_http_auth_expiry = LFS HTTP hitelesítési lejárata
+config.send_test_mail_submit = Küldés
+config.logger_name_fmt = Naplózó: %s
+config.domain = Kiszolgálótartomány
+config.cache_item_ttl = Gyorsítótárelem TTL értéke
+config.app_data_path = Alkalmazásadatok elérési útja
[action]
create_repo=létrehozott tárolót: %s
@@ -1657,4 +1665,5 @@ runs.commit=Commit
[git.filemode]
; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", …
symbolic_link=Szimbolikus hivatkozás
+submodule = Almodul
diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini
index 39795fa320..3232e1fca8 100644
--- a/options/locale/locale_ja-JP.ini
+++ b/options/locale/locale_ja-JP.ini
@@ -625,6 +625,8 @@ form.name_pattern_not_allowed=`"%s" の形式はユーザー名に使用でき
form.name_chars_not_allowed=ユーザー名 "%s" には無効な文字が含まれています。
block_user.detail_2 = このユーザーは、リポジトリ、作成された問題、コメントを操作できません。
block_user.detail_1 = このユーザーからのフォローが解除されています。
+follow_blocked_user = あなたはこのユーザーをフォローできません。なぜなら、あなたはこのユーザーをブロックしたか、このユーザーはあなたをブロックしているからです。
+block_user.detail_3 = このユーザーはあなたをコラボレーターとして追加することはできませんし、あなたも彼らをコラボレーターに追加できません。
[settings]
profile=プロフィール
@@ -939,6 +941,9 @@ visibility.private=プライベート
visibility.private_tooltip=あなたが参加した組織のメンバーのみに表示されます
blocked_users_none = あなたはまだ誰もユーザーをブロックしていません。
blocked_users = ブロックしたユーザー
+user_unblock_success = このユーザーをアンブロックするのに成功しました。
+blocked_since = %s からブロック中
+user_block_success = このユーザーをブロックするのに成功しました。
[repo]
new_repo_helper=リポジトリには、プロジェクトのすべてのファイルとリビジョン履歴が入ります。 すでにほかの場所でホストしていますか? リポジトリを移行 もどうぞ。
@@ -2580,6 +2585,9 @@ find_file.no_matching=一致するファイルが見つかりません
error.csv.too_large=このファイルは大きすぎるため表示できません。
error.csv.unexpected=このファイルは %d 行目の %d 文字目に予期しない文字が含まれているため表示できません。
error.csv.invalid_field_count=このファイルは %d 行目のフィールドの数が正しくないため表示できません。
+admin.enabled_flags = このリポジトリで有効になっているフラグたち:
+clone_in_vscodium = VSCodiumでcloneする
+desc.sha256 = SHA256
[org]
org_name_holder=組織名
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index a6577773fd..5649570de1 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -73,7 +73,7 @@ forks=Forks
activities=Activiteiten
pull_requests=Pull requests
-issues=Kwesties
+issues=Issues
milestones=Mijlpalen
ok=OK
@@ -140,6 +140,7 @@ confirm_delete_selected = Bevestigen om alle geselecteerde items te verwijderen?
copy_type_unsupported = Dit bestandstype kan niet worden gekopieerd
pin = Vastpinnen
unpin = Ontpinnen
+remove_label_str = Verwijder punt "%s"
[aria]
navbar = Navigatiebalk
@@ -428,6 +429,7 @@ password_pwned = Het wachtwoord dat je hebt gekozen staat op een genereren van SSH sleutels of voor algemene SSH problemen.
@@ -990,9 +992,9 @@ readme_helper=Selecteer een README-bestandssjabloon.
readme_helper_desc=Dit is de plek waar je een volledige beschrijving van je project kunt schrijven.
auto_init=Initialiseer repository (voegt .gitignore, License en README toe)
trust_model_helper=Selecteer het vertrouwensmodel voor handtekeningverificatie. Mogelijke opties zijn:
-trust_model_helper_collaborator=Medewerker: Vertrouw handtekeningen door medewerkers
+trust_model_helper_collaborator=Samenwerker: Vertrouw handtekeningen door samenwerker
trust_model_helper_committer=Committer: Vertrouw handtekeningen die overeenkomen met de committers
-trust_model_helper_collaborator_committer=Medewerker+Committer: Vertrouw handtekeningen door medewerkers die overeenkomen met de committer
+trust_model_helper_collaborator_committer=Samenwerker+Committer: Vertrouw handtekeningen door samenwerkers die overeenkomen met de committer
trust_model_helper_default=Standaard: Gebruik het standaard vertrouwemsmodel voor deze installatie
create_repo=Nieuwe repository
default_branch=Standaard branch
@@ -1137,7 +1139,7 @@ filter_branch_and_tag=Filter op branch of tag
find_tag=Label zoeken
branches=Branches
tags=Labels
-issues=Kwesties
+issues=Issues
pulls=Pull-aanvragen
project_board=Projecten
packages=Paketten
@@ -1269,10 +1271,10 @@ projects.title=Titel
projects.new=Nieuw project
projects.new_subheader=Coördineer, track en update uw werk op één plek, dus projecten blijven transparant en op schema.
projects.deletion=Project verwijderen
-projects.deletion_desc=Als een project wordt verwijdert, wordt deze van alle gerelateerde kwesties verwijderd. Doorgaan?
+projects.deletion_desc=Als een project wordt verwijdert, wordt deze van alle gerelateerde issues verwijderd. Doorgaan?
projects.deletion_success=Het project is verwijderd.
projects.edit=Projecten bewerken
-projects.edit_subheader=Projecten organiseren kwesties en houden voortgang bij.
+projects.edit_subheader=Projecten organiseren issues en houden voortgang bij.
projects.modify=Project bijwerken
projects.type.none=Geen
projects.type.basic_kanban=Basis Kanban
@@ -1360,7 +1362,7 @@ issues.filter_assginee_no_assignee=Geen verantwoordelijke
issues.filter_poster=Auteur
issues.filter_poster_no_select=Alle auteurs
issues.filter_type=Type
-issues.filter_type.all_issues=Alle kwesties
+issues.filter_type.all_issues=Alle issues
issues.filter_type.assigned_to_you=Aan jou toegewezen
issues.filter_type.created_by_you=Aangemaakt door jou
issues.filter_type.mentioning_you=Vermelden jou
@@ -1455,13 +1457,13 @@ issues.unlock=Gesprek ontgrendelen
issues.lock.unknown_reason=Kan een probleem niet vergrendelen met een onbekende reden.
issues.lock_duplicate=Een issue kan niet twee keer vergrendeld worden.
issues.unlock_error=Kan een niet vergrendeld issue niet ontgrendelen.
-issues.lock_with_reason=vergrendeld als %s en beperkt gesprek tot medewerkers %s
-issues.lock_no_reason=vergrendelde en beperkte conversatie voor medewerkers %s
+issues.lock_with_reason="vergrendeld als %s en beperkt gesprek tot samenwerkers %s"
+issues.lock_no_reason="vergrendelde en beperkte conversatie voor samenwerkers %s"
issues.unlock_comment=ontgrendelde deze conversatie %s
issues.lock_confirm=Vergrendel
issues.unlock_confirm=Ontgrendelen
issues.lock.notice_1=- Andere gebruikers kunnen geen nieuwe reacties toevoegen aan dit probleem.
-issues.lock.notice_2=- U en andere medewerkers die toegang hebben tot deze repository kunnen nog steeds reacties achterlaten die anderen kunnen zien.
+issues.lock.notice_2=- U en andere samenwerkers die toegang hebben tot deze repository kunnen nog steeds reacties achterlaten die anderen kunnen zien.
issues.lock.notice_3=- U kunt dit probleem in de toekomst altijd weer ontgrendelen.
issues.unlock.notice_1=- Iedereen zou nog eens commentaar op dit probleem kunnen geven.
issues.unlock.notice_2=- U kunt dit probleem in de toekomst altijd opnieuw sluiten.
@@ -1521,22 +1523,22 @@ issues.dependency.added_dependency=`voegde een nieuwe afhankelijkheid %s toe `
issues.dependency.removed_dependency=`verwijderde een afhankelijkheid %s`
issues.dependency.pr_closing_blockedby=Het sluiten van deze pull-aanvraag is geblokkeerd door de volgende issues
issues.dependency.issue_closing_blockedby=Het sluiten van dit issue is geblokkeerd door de volgende problemen
-issues.dependency.issue_close_blocks=Deze kwestie blokkeert het sluiten van de volgende kwesties
-issues.dependency.pr_close_blocks=Deze pull-aanvraag blokkeert het sluiten van de volgende kwesties
-issues.dependency.issue_close_blocked=Je moet alle kwesties die deze kwestie blokkeren sluiten voordat je deze kan sluiten.
-issues.dependency.pr_close_blocked=Je moet alle kwesties die deze pull-aanvraag blokkeren sluiten voordat je deze kan sluiten.
+issues.dependency.issue_close_blocks=Deze issue blokkeert het sluiten van de volgende issues
+issues.dependency.pr_close_blocks=Deze pull request blokkeert het sluiten van de volgende issues
+issues.dependency.issue_close_blocked=Je moet alle issues die deze issues blokkeren sluiten voordat je deze kan sluiten.
+issues.dependency.pr_close_blocked=Je moet alle issues die deze pull request blokkeren sluiten voordat je deze kan sluiten.
issues.dependency.blocks_short=Blokkeert
issues.dependency.blocked_by_short=Afhankelijk van
issues.dependency.remove_header=Verwijder afhankelijkheid
issues.dependency.issue_remove_text=Hiermee wordt de afhankelijkheid van deze kwestie verwijderd. Doorgaan?
issues.dependency.pr_remove_text=Hiermee wordt de afhankelijkheid van deze pull-aanvraag verwijderd. Doorgaan?
-issues.dependency.setting=Schakel afhankelijkheden voor kwesties en pull-aanvragen in
+issues.dependency.setting=Schakel afhankelijkheden voor issues en pull requests in
issues.dependency.add_error_same_issue=Je kan een kwestie niet afhankelijk maken van zichzelf.
issues.dependency.add_error_dep_issue_not_exist=De afhankelijke kwestie bestaat niet.
issues.dependency.add_error_dep_not_exist=Afhankelijkheid bestaat niet.
issues.dependency.add_error_dep_exists=Afhankelijkheid bestaat al.
-issues.dependency.add_error_cannot_create_circular=Je kan geen afhankelijkheid maken waarbij twee kwesties elkaar blokkeren.
-issues.dependency.add_error_dep_not_same_repo=Beide kwesties moeten in dezelfde repository zijn.
+issues.dependency.add_error_cannot_create_circular=Je kan geen afhankelijkheid maken waarbij twee issues elkaar blokkeren.
+issues.dependency.add_error_dep_not_same_repo=Beide issues moeten in dezelfde repository zijn.
issues.review.self.approval=Je kan je eigen pull-aanvraag niet goedkeuren.
issues.review.self.rejection=Je kan geen wijzigingen aanvragen op je eigen pull-aanvraag.
issues.review.approve=heeft deze veranderingen %s goedgekeurd
@@ -1700,11 +1702,11 @@ milestones.due_date=Vervaldatum (optioneel)
milestones.clear=Leegmaken
milestones.invalid_due_date_format="Het formaat van de deadline is moet 'jjjj-mm-dd' zijn."
milestones.edit=Bewerk mijlpaal
-milestones.edit_subheader=Gebruik mijlpalen om kwesties te organiseren en om voortgang bij te houden.
+milestones.edit_subheader=Gebruik mijlpalen om issues te organiseren en om voortgang bij te houden.
milestones.cancel=Annuleer
milestones.modify=Mijlpaal bijwerken
milestones.deletion=Mijlpaal verwijderen
-milestones.deletion_desc=Als je een mijlpaal verwijdert, wordt hij van alle gerelateerde kwesties verwijderd. Doorgaan?
+milestones.deletion_desc=Als je een mijlpaal verwijdert, wordt hij van alle gerelateerde issues verwijderd. Doorgaan?
milestones.deletion_success=De mijlpaal is verwijderd.
milestones.filter_sort.least_complete=Minst compleet
milestones.filter_sort.most_complete=Meest compleet
@@ -1717,8 +1719,8 @@ ext_wiki.desc=Koppelen aan een externe wiki.
wiki=Wiki
wiki.welcome=Welkom op de wiki.
-wiki.welcome_desc=Op de wiki kan je documentatie schrijven en met medewerkers delen.
-wiki.desc=Schrijf en deel documentatie met medewerkers.
+wiki.welcome_desc=Op de wiki kan je documentatie schrijven en met samenwerkers delen.
+wiki.desc=Schrijf en deel documentatie met samenwerkers.
wiki.create_first_page=Maak de eerste pagina
wiki.page=Pagina
wiki.filter_page=Filter pagina
@@ -1775,7 +1777,7 @@ activity.new_issues_count_n=Nieuwe problemen
activity.new_issue_label=Geopend
activity.title.unresolved_conv_1=%d open conversatie
activity.title.unresolved_conv_n=%d open conversaties
-activity.unresolved_conv_desc=Deze recentelijk veranderde kwesties en pull-aanvragen zijn nog open.
+activity.unresolved_conv_desc=Deze recentelijk veranderde issues en pull requests zijn nog open.
activity.unresolved_conv_label=Open
activity.title.releases_1=%d Release
activity.title.releases_n=%d Releases
@@ -1945,7 +1947,7 @@ settings.event_push_desc=Git push naar een repository.
settings.event_repository=Repository
settings.event_repository_desc=Repository gemaakt of verwijderd.
settings.event_header_issue=Issue gebeurtenissen
-settings.event_issues=Kwesties
+settings.event_issues=Issues
settings.event_issues_desc=Issue geopend, gesloten, heropend of bewerkt.
settings.event_issue_assign=Probleem toegekend
settings.event_issue_assign_desc=Issue toegewezen of niet-toegewezen.
@@ -2196,7 +2198,7 @@ release.delete_release=Verwijder release
release.deletion=Verwijder release
release.deletion_success=De release is verwijderd.
release.tag_name_already_exist=Een versie met deze naam bestaat al.
-release.tag_name_invalid=Labelnaam is niet geldig.
+release.tag_name_invalid=Tagnaam is niet geldig.
release.downloads=Downloads
release.download_count=Downloads: %s
@@ -2474,6 +2476,60 @@ settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Op dit
settings.admin_stats_indexer = Code statistieken indexer
settings.new_owner_blocked_doer = De nieuwe eigenaar heeft u geblokkeerd.
settings.transfer_notices_2 = - Je behoudt toegang tot de repository als je het overdraagt aan een organisatie waarvan je (mede-)eigenaar bent.
+commits.search.tooltip = U kunt zoektermen voorvoegen met "author:", "committer:", "after:", of "before:", bijvoorbeeld: "revert author:Alice before:2019-01-13".
+projects.column.deletion_desc = "Het verwijderen van een projectkolom verplaatst alle issues naar 'Ongecategoriseerd'. Wilt u doorgaan?"
+projects.column.set_default_desc = "Stel deze kolom in als standaard voor ongecategoriseerde issues and pulls"
+issues.action_check = Aanvinken/uitvinken
+issues.dependency.issue_batch_close_blocked = "Het is niet mogelijk om de issues die u gekozen heeft in bulk te sluiten, omdat issue #%d nog open afhankelijkheden heeft"
+pulls.review_only_possible_for_full_diff = Beoordeling is alleen mogelijk bij het bekijken van de volledige diff
+pulls.commit_ref_at = `heeft naar deze pull request verwezen vanuit een commit %[2]s`
+pulls.cmd_instruction_hint = `Bekijk opdrachtregelinstructies.`
+pulls.cmd_instruction_checkout_desc = Vanuit uw project repository, schakel over naar een nieuwe branch en test de veranderingen.
+pulls.showing_specified_commit_range = Alleen veranderingen weergeven tussen %[1]s..%[2]s
+pulls.reopen_failed.base_branch = De pull request kan niet worden heropend, omdat de base branch niet meer bestaat.
+pulls.reopen_failed.head_branch = De pull request kan niet worden heropend, omdat de head branch niet meer bestaat.
+pulls.auto_merge_newly_scheduled_comment = `deze pull request is gepland om automatisch samen te voegen als alle controles succesvol zijn %[1]s`
+settings.protect_status_check_matched = Overeengekomen
+settings.archive.text = Het archiveren van de repo zal het volledig alleen-lezen maken. Het zal worden verborgen op het dashboard. Niemand (zelfs u niet!) kan nieuwe commits, issues of pull requests maken.
+settings.unarchive.button = Repo uit het archief halen
+branch.deletion_success = Branch "%s" is verwijderd.
+branch.deletion_failed = Het verwijderen van de branch "%s" is mislukt.
+settings.unarchive.success = De repo is met success uit het archief gehaald.
+release.deletion_tag_success = De tag is verwijderd.
+settings.update_protect_branch_success = Branchbescherming voor regel "%s" is bijgewerkt.
+settings.remove_protected_branch_success = Branchbescherming voor regel "%s" is verwijderd.
+settings.remove_protected_branch_failed = Verwijderen van branchbeschermings regel "%s" is mislukt.
+settings.merge_style_desc = Samenvoegstijl
+settings.thread_id = Thread ID
+settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar als de repo is gearchiveerd.
+settings.unarchive.header = Deze repo uit het archief halen
+settings.unarchive.text = Het uit het archief halen van de repo zal het vermogen herstellen om commits en pushes te ontvangen, evenals nieuwe issues en pull requests.
+settings.unarchive.error = Er is een fout opgetreden bij het uit het archief halen van de repo. Bekijk de logs voor meer details.
+diff.comment.add_line_comment = Regelreactie toevoegen
+diff.show_file_tree = Toon bestandsstructuur
+diff.hide_file_tree = Bestandsstructuur verbergen
+release.tag_helper_existing = Bestaande tag.
+release.title = Releasetitel
+release.title_empty = Titel kan niet leeg zijn.
+release.message = Beschrijf deze release
+release.delete_tag = Verwijder Tag
+release.add_tag_msg = Gebruik de titel en inhoud van de release als bericht.
+release.add_tag = Alleen Tag Aanmaken
+release.releases_for = Releases voor %s
+release.tags_for = Tags voor %s
+branch.delete = Branch "%s" verwijderen
+diff.review.self_approve = Auteurs van een pull request kunnen hun eigen pull request niet goedkeuren
+diff.review.self_reject = Auteurs van een pull request kunnen geen wijzigingen aanvragen op hun eigen pull request
+branch.already_exists = Een branch genaamd "%s" bestaat al.
+settings.protected_branch_required_rule_name = Vereiste regelnaam
+settings.protect_unprotected_file_patterns_desc = "Onbeschermde bestanden die direct gewijzigd mogen worden als een gebruiker schrijftoegang heeft, waarbij pushbeperking omzeild zal worden. Meerdere patronen kunnen gescheiden worden d.m.v. een puntkomma (';'). Zie github.com/gobwas/glob documentatie voor patroon syntax. Bijvoorbeeld: .drone.yml, /docs/**/*.txt."
+settings.tags.protection.pattern.description = U kunt een enkele naam, glob patroon of reguliere expressie gebruiken om tags te matchen. Lees meer in de beschermde tags gids.
+settings.protect_unprotected_file_patterns = "Onbeschermde bestandspatronen (gescheiden d.m.v. een puntkomma ';'):"
+branch.delete_desc = Het verwijderen van een branch is permanent. Hoewel de verwijderde branch kan blijven bestaan voor een korte tijd voordat het daadwerkelijk wordt verwijderd, kan het in de meeste gevallen NIET ongedaan gemaakt worden. Wilt u doorgaan?
+release.deletion_desc = Het verwijderen van een release zal het alleen verwijderen van Forgejo. Het zal niet de Git tag, de inhoud van uw repository of de geschiedenis ervan beïnvloeden. Wilt u doorgaan?
+release.deletion_tag_desc = Verwijdert deze tag uit de repository. De inhoud van de repository en de geschiedenis ervan zullen ongewijzigd blijven. Wilt u doorgaan?
+release.tag_name_protected = De tagnaam is beschermd.
+release.tag_already_exist = Deze tagnaam bestaat al.
@@ -2583,6 +2639,24 @@ teams.general_access = Globale Toegang
follow_blocked_user = Je kunt deze organisatie niet volgen omdat deze organisatie je geblokkeerd heeft.
code = Broncode
form.name_reserved = De organisatienaam "%s" is gereserveerd.
+form.name_pattern_not_allowed = Het patroon "%s' is niet toegestaan in een organisatienaam.
+settings.email = Contact E-mail
+settings.change_orgname_redirect_prompt = De oude naam zal worden omgeleid tot het wordt geclaimd.
+members.remove.detail = %[1]s van %[2]s verwijderen?
+members.leave.detail = %s verlaten?
+teams.leave.detail = %s verlaten?
+teams.general_access_helper = De machtigingen van de leden zullen worden vastgesteld door middel van de onderstaande tabel.
+teams.write_access = Schrijf
+teams.invite_team_member = Uitnodigen tot %s
+teams.invite_team_member.list = Openstaande Uitnodigingen
+teams.invite.title = U bent uitgenodigd om lid te worden van team %s in organisatie %s.
+teams.invite.description = Klik op onderstaande knop om u bij het team aan te sluiten.
+teams.invite.by = Uitgenodigd door %s
+teams.all_repositories_admin_permission_desc = Dit team verleent Administrator permissies tot alle repositories: leden kunnen lezen, pushen naar en samenwerkers toevoegen aan repositories.
+settings.change_orgname_prompt = Merk op: Het wijzigen van de organisatienaam zal ook de URL van uw organisatie veranderen en de oude naam vrijgeven.
+settings.visibility.limited = Beperkt (Aleen zichtbaar voor geauthenticeerde gebruikers)
+teams.add_nonexistent_repo = "De repository die u probeert toe te voegen bestaat niet, maak deze eerst aan alstublieft."
+teams.all_repositories_write_permission_desc = Dit team verleent Schrijf permissies tot alle repositories: leden kunnen lezen en pushen naar repositories.
[admin]
dashboard=Overzicht
@@ -2732,7 +2806,7 @@ repos.private=Prive
repos.watches=Volgers
repos.stars=Sterren
repos.forks=Forks
-repos.issues=Kwesties
+repos.issues=Issues
repos.size=Grootte
packages.owner=Eigenaar
@@ -3034,6 +3108,41 @@ defaulthooks.add_webhook = Standaard webhook toevoegen
auths.oauth2_required_claim_value_helper = Stel deze waarde in om het aanmelden vanuit deze bron te beperken tot gebruikers met een claim met deze naam en waarde
users.remote = Externe
users.list_status_filter.not_2fa_enabled = 2FA uitgeschakeld
+users.reserved = Gereserveerd
+defaulthooks.desc = Webhooks doen automatisch HTTP POST verzoeken naar een server wanneer bepaalde Forgejo gebeurtenissen zich voordoen. Webhooks die hier gedefinieerd zijn, zijn standaard en worden gekopieerd naar alle nieuwe repositories.. Lees meer in de webhooks gids.
+auths.verify_group_membership = Controleer het groepslidmaatschap in LDAP (laat het filter leeg om over te slaan)
+dashboard.rebuild_issue_indexer = Herbouw issue indexer
+systemhooks.desc = Webhooks doen automatisch HTTP POST verzoeken naar een server wanneer bepaalde Forgejo gebeurtenissen zich voordoen. Webhooks die hier gedefinieerd zijn, werken op alle repositories op het systeem, dus houd rekening met mogelijke gevolgen voor de prestaties. Lees meer in de webhooks gids.
+hooks = Webhooks
+integrations = Integraties
+dashboard.new_version_hint = Forgejo %s is nu beschikbaar, u gebruikt versie %s. Zie de blog voor meer details.
+dashboard.sync_repo_tags = Tags synchroniseren van git data naar database
+dashboard.cleanup_hook_task_table = Tabel hook_task opschonen
+dashboard.cleanup_packages = Verlopen pakketten opschonen
+dashboard.cleanup_actions = Verlopen logs en artefacten van actions opschonen
+dashboard.delete_old_actions.started = Het verwijderen van alle oude acties uit de database is gestart.
+dashboard.update_checker = Update checker
+dashboard.stop_zombie_tasks = Zombietaken stoppen
+dashboard.stop_endless_tasks = Eindeloze taken stoppen
+dashboard.start_schedule_tasks = Start geplande taken
+dashboard.sync_branch.started = Branches synchroniseren is gestart
+dashboard.sync_tag.started = Tags synchroniseren is gestart
+auths.attribute_avatar = Avatar Attribuut
+auths.enable_ldap_groups = LDAP-groepen inschakelen
+auths.ms_ad_sa = MS AD Zoekattributen
+dashboard.delete_old_actions = Verwijder alle oude acties uit de database
+identity_access = Identiteit & Toegang
+assets = Code Assets
+auths.helo_hostname_helper = Hostnaam verzonden met HELO. Laat leeg om huidige hostnaam te versturen.
+self_check = Zelfcontrole
+dashboard.cron.cancelled = Cron: %[1]s geannuleerd: %[3]s
+dashboard.delete_repo_archives = "Verwijder alle archieven van repository (ZIP, TAR.GZ, enz.) "
+dashboard.cancel_abandoned_jobs = Verlaten jobs annuleren
+auths.helo_hostname = HELO Hostnaam
+settings = Beheerdersinstellingen
+dashboard.task.cancelled = Taak: %[1]s geannuleerd: %[3]s
+auths.force_smtps = SMTPS Forceren
+dashboard.sync_repo_branches = Synchroniseren gemiste branches van git data naar databases
[action]
create_repo=repository aangemaakt in %s
@@ -3213,7 +3322,7 @@ owner.settings.cleanuprules.keep.count.1 = 1 versie per pakket
owner.settings.cleanuprules.keep.count.n = %d versies per pakket
pub.install = Voer het volgende commando uit om het pakket met Dart te installeren:
rubygems.dependencies.runtime = Runtime Dependencies
-settings.delete.error = Mislukt om de pakket te verwijderen
+settings.delete.error = Het verwijderen van het pakket is mislukt.
alpine.registry = Stel dit register in door de url toe te voegen aan je /etc/apk/repositories bestand:
maven.registry = Stel dit register in het pom.xml bestand van je project:
rpm.install = Voer het volgende commando uit om het pakket te installeren:
@@ -3232,6 +3341,7 @@ conda.install = Voer het volgende commando uit om het pakket met Conda te instal
maven.download = Voer de opdrachtregel uit om de dependencies te downloaden:
npm.registry = Stel dit register in het .npmrc bestand van je project:
dependency.id = ID
+nuget.dependency.framework = Target Framework
[secrets]
secrets = Geheimen
@@ -3288,7 +3398,7 @@ runners.update_runner = Wijzigingen bijwerken
runners.update_runner_success = Runner succesvol bijgewerkt
runners.update_runner_failed = Mislukt om runner bij te werken
runners.delete_runner = Verwijder deze runner
-runners.delete_runner_failed = Mislukt om runner te verwijderen
+runners.delete_runner_failed = Het verwijderen van de runner is mislukt
runners.delete_runner_header = Bevestigen om deze runner te verwijderen
runners.none = Geen runners beschikbaar
runners.status.unspecified = Onbekend
@@ -3354,3 +3464,11 @@ directory = Directory
normal_file = Normaal bestaand
executable_file = Uitvoerbaar bestand
+
+
+[graphs]
+component_loading_info = Dit kan even duren…
+component_failed_to_load = Er is een onverwachte fout opgetreden.
+contributors.what = bijdragen
+component_loading_failed = %s kon niet worden geladen
+component_loading = Bezig met laden van %s...
\ No newline at end of file
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index 308f3d79ff..66a637245b 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -2549,19 +2549,19 @@ settings.new_owner_blocked_doer = Você foi bloqueado pelo novo dono do reposit
settings.wiki_rename_branch_main_notices_1 = Esta ação NÃO PODERÁ ser desfeita.
tree_path_not_found_commit = O caminho %[1]s não existe no commit %[2]s
rss.must_be_on_branch = Você precisa estar em uma branch para ter um feed RSS.
-admin.manage_flags = Gerenciar flags
-admin.enabled_flags = Flags habilitadas para o repositório:
-admin.update_flags = Atualizar flags
-admin.flags_replaced = Flags do repositório substituídas
+admin.manage_flags = Gerenciar sinalizadores
+admin.enabled_flags = Sinalizadores habilitados para o repositório:
+admin.update_flags = Atualizar sinalizadores
+admin.flags_replaced = Os sinalizadores do repositório foram substituídos
all_branches = Todas as branches
fork_branch = Branch a ser clonada para o fork
-object_format_helper = Formato de objeto do repositório. Não pode ser mudado depois. SHA1 é o mais compatível.
-object_format = Formato do objeto
+object_format_helper = O formato utilizado para armazenar os objetos do repositório, sendo SHA1 o mais compatível. Esta opção não poderá ser alterada futuramente.
+object_format = Formato de objeto
tree_path_not_found_branch = Caminho %[1]s não existe na branch %[2]s
tree_path_not_found_tag = Caminho %[1]s não existe na etiqueta %[2]s
commits.view_path = Ver neste ponto do histórico
commits.renamed_from = Renomeado de %s
-admin.failed_to_replace_flags = Falha ao substituir flags do repositório
+admin.failed_to_replace_flags = Falha ao substituir os sinalizadores do repositório
editor.invalid_commit_mail = E-mail inválido para criar um commit.
issues.role.contributor_helper = Este usuário fez commits para o repositório anteriormente.
issues.choose.invalid_config = A configuração de issue contém erros:
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index d137767f73..0e1f1cc396 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -477,7 +477,7 @@ issue.action.new=@%[1]s создал(а) #%[2]d.
issue.in_tree_path=В %s:
release.new.subject=%s выпущено в %s
-release.new.text=@%[1]s выпустил(а) релиз %[2]s в %[3]s
+release.new.text=@%[1]s выпустил(а) %[2]s в %[3]s
release.title=Название: %s
release.note=Примечание:
release.downloads=Загрузки:
@@ -655,7 +655,7 @@ webauthn=Ключи безопасности
public_profile=Открытый профиль
biography_placeholder=Расскажите немного о себе! (Можно использовать Markdown)
location_placeholder=Поделитесь своим приблизительным местоположением с другими
-profile_desc=Контролируйте, как ваш профиль будет отображаться другим пользователям. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций Git.
+profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git.
password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта.
full_name=Имя и фамилия
website=Веб-сайт
@@ -752,8 +752,8 @@ manage_ssh_keys=Управление ключами SSH
manage_ssh_principals=Управление принципалами сертификатов SSH
manage_gpg_keys=Управление ключами GPG
add_key=Добавить ключ
-ssh_desc=Эти открытые ключи SSH связаны с вашей учётной записью. Соответствующие закрытые ключи обеспечивают полный доступ к вашим хранилищам.
-principal_desc=Эти принципалы сертификатов SSH привязаны к вашей учётной записи и разрешают полный доступ к вашим хранилищам.
+ssh_desc=Эти открытые ключи SSH связаны с вашей учётной записью. Соответствующие им закрытые ключи обеспечивают полный доступ к вашим репозиториями. Подтверждённые ключи SSH могут быть использованы для подтверждения подписанных с SSH коммитов.
+principal_desc=Эти принципалы сертификатов SSH привязаны к вашей учётной записи и разрешают полный доступ к вашим репозиториям.
gpg_desc=Эти открытые GPG ключи связаны с вашей учётной записью. Храните закрытые ключи в безопасности, так как они позволяют проверять подлинности коммитов.
ssh_helper=Нужна помощь? Ознакомьтесь с руководством GitHub по созданию ключей SSH или решению возникающих проблем при использовании SSH.
gpg_helper=Нужна помощь? Взгляните на руководство GitHub по GPG.
@@ -1060,7 +1060,7 @@ template.topics=Темы
template.avatar=Аватар
template.issue_labels=Метки задач
template.one_item=Необходимо выбрать хотя бы один элемент шаблона
-template.invalid=Необходимо выбрать хранилище шаблонов
+template.invalid=Необходимо выбрать шаблон репозитория
archive.issue.nocomment=Этот репозиторий в архиве. Вы не можете комментировать задачи.
archive.pull.nocomment=Это репозиторий в архиве. Вы не можете комментировать запросы на слияние.
@@ -1085,7 +1085,7 @@ migrate_items_labels=Метки
migrate_items_issues=Задачи
migrate_items_pullrequests=Запросы на слияние
migrate_items_merge_requests=Запросы на слияние
-migrate_items_releases=Релизы
+migrate_items_releases=Выпуски
migrate_repo=Перенос репозитория
migrate.clone_address=Перенос / Клонирование по URL
migrate.clone_address_desc=HTTP/HTTPS или Git адрес существующего репозитория
@@ -1116,7 +1116,7 @@ migrate.migrating_git=Перенос Git данных
migrate.migrating_topics=Миграция тем
migrate.migrating_milestones=Перенос этапов
migrate.migrating_labels=Миграция меток
-migrate.migrating_releases=Миграция релизов
+migrate.migrating_releases=Миграция выпусков
migrate.migrating_issues=Миграция задач
migrate.migrating_pulls=Миграция запросов на слияние
migrate.cancel_migrating_title=Отменить миграцию
@@ -1167,8 +1167,8 @@ org_labels_desc_manage=управлять
milestones=Этапы
commits=коммитов
commit=коммит
-release=Релиз
-releases=Релизы
+release=Выпуск
+releases=Выпуски
tag=тег
released_this=выпустил(-а) это
tagged_this=добавил(а) тег
@@ -1513,7 +1513,7 @@ issues.role.member_helper=Этот пользователь является ч
issues.role.collaborator=Соавтор
issues.role.collaborator_helper=Этот пользователь был приглашен сотрудничать в репозитории.
issues.role.first_time_contributor=Новый участник
-issues.role.first_time_contributor_helper=Это первый вклад пользователя в репозиторий.
+issues.role.first_time_contributor_helper=Это первое участие пользователя в репозитории.
issues.role.contributor=Участник
issues.re_request_review=Повторить запрос на отзыв
issues.is_stale=Со времени этого обзора в этот PR были внесены некоторые изменения
@@ -1742,7 +1742,7 @@ pulls.is_empty="Изменения из этой ветки уже есть в
pulls.required_status_check_failed=Некоторые необходимые проверки не были пройдены.
pulls.required_status_check_missing=Отсутствуют некоторые обязательные проверки.
pulls.required_status_check_administrator=Как администратор, вы все равно можете принять этот запрос на слияние.
-pulls.blocked_by_approvals="Этот запрос на слияние пока не имеет достаточного количества одобрений. Получено %d из %d одобрений."
+pulls.blocked_by_approvals="У этого запроса на слияние пока недостаточного одобрений. Получено %d из %d одобрений."
pulls.blocked_by_rejection="Официальный рецензент запросил изменения к этому запросу на слияние."
pulls.can_auto_merge_desc=Этот запрос на слияние может быть объединён автоматически.
pulls.cannot_auto_merge_desc=Этот запрос на слияние не может быть объединён автоматически.
@@ -1762,9 +1762,9 @@ pulls.no_merge_helper=Включите опции слияния в настро
pulls.no_merge_wip=Данный запрос на слияние не может быть принят, поскольку он помечен как находящийся в разработке.
pulls.no_merge_not_ready=Этот запрос не готов к слиянию, обратите внимания на ревью и проверки.
pulls.no_merge_access=У вас нет права для слияния данного запроса.
-pulls.merge_pull_request=Создать коммит на слияние
-pulls.rebase_merge_pull_request=Выполнить Rebase, а затем fast-forward слияние
-pulls.rebase_merge_commit_pull_request=Выполнить rebase, а затем создать коммит слияния
+pulls.merge_pull_request=Создать коммит слияния
+pulls.rebase_merge_pull_request=Выполнить rebase и fast-forward
+pulls.rebase_merge_commit_pull_request=Выполнить rebase и создать коммит слияния
pulls.squash_merge_pull_request=Создать объединённый коммит
pulls.merge_manually=Слито вручную
pulls.merge_commit_id=ID коммита слияния
@@ -1933,8 +1933,8 @@ 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 релизов
+activity.title.releases_1=%d выпуск
+activity.title.releases_n=%d выпусков
activity.title.releases_published_by=%s опубликованы %s
activity.published_release_label=Опубликовано
activity.no_git_activity=В этот период не было новых коммитов.
@@ -1994,13 +1994,13 @@ settings.mirror_settings.docs.pull_mirror_instructions=Чтобы настрои
settings.mirror_settings.docs.more_information_if_disabled=Вы можете узнать больше о зеркалах push и pull здесь:
settings.mirror_settings.docs.doc_link_title=Как зеркалировать репозитории?
settings.mirror_settings.docs.pulling_remote_title=Получение из удалённого репозитория
-settings.mirror_settings.mirrored_repository=Синхронизированное хранилище
+settings.mirror_settings.mirrored_repository=Зеркалируемый репозиторий
settings.mirror_settings.direction=Направление
settings.mirror_settings.direction.pull=Отправка
settings.mirror_settings.direction.push=Отправка
settings.mirror_settings.last_update=Последнее обновление
settings.mirror_settings.push_mirror.none=Push-зеркало не добавлено
-settings.mirror_settings.push_mirror.remote_url=URL удалённого хранилища
+settings.mirror_settings.push_mirror.remote_url=Ссылка на удалённый git-репозиторий
settings.mirror_settings.push_mirror.add=Добавить Push-зеркало
settings.mirror_settings.push_mirror.edit_sync_time=Изменить интервал синхронизации зеркала
@@ -2042,7 +2042,7 @@ settings.pulls.enable_autodetect_manual_merge=Включить автоопре
settings.pulls.allow_rebase_update=Включить обновление ветки из запроса на слияние путём rebase
settings.pulls.default_delete_branch_after_merge=Удалить ветку запроса после его слияния по умолчанию
settings.pulls.default_allow_edits_from_maintainers=По умолчанию разрешать редактирование сопровождающими
-settings.releases_desc=Включить релизы
+settings.releases_desc=Включить выпуски
settings.packages_desc=Включить реестр пакетов
settings.projects_desc=Включить проекты репозитория
settings.actions_desc=Включить действия репозитория
@@ -2056,7 +2056,7 @@ settings.reindex_button=Добавить в очередь переиндекс
settings.reindex_requested=Переиндексация запрошена
settings.admin_enable_close_issues_via_commit_in_any_branch=Закрыть задачу с помощью коммита, сделанного в ветке не по умолчанию
settings.danger_zone=Опасная зона
-settings.new_owner_has_same_repo=У нового владельца уже есть хранилище с таким названием.
+settings.new_owner_has_same_repo=У нового владельца уже есть репозиторий с таким названием.
settings.convert=Преобразовать в обычный репозиторий
settings.convert_desc=Это зеркало можно преобразовать в обычный репозиторий. Это не может быть отменено.
settings.convert_notices_1=Эта операция преобразует это зеркало в обычный репозиторий, и она не может быть отменена.
@@ -2174,8 +2174,8 @@ settings.event_fork=Форкнуть
settings.event_fork_desc=Репозиторий форкнут.
settings.event_wiki=Вики
settings.event_wiki_desc=Страница вики создана, переименована, изменена или удалена.
-settings.event_release=Релиз
-settings.event_release_desc=Релиз опубликован, обновлён или удалён из репозитория.
+settings.event_release=Выпуск
+settings.event_release_desc=Выпуск опубликован, обновлён или удалён из репозитория.
settings.event_push=Отправка
settings.event_push_desc=Отправка в репозиторий.
settings.event_repository=Репозиторий
@@ -2447,51 +2447,51 @@ diff.has_escaped=В этой строке есть невидимые симво
diff.show_file_tree=Показать дерево файлов
diff.hide_file_tree=Скрыть дерево файлов
-releases.desc=Релизы позволяют организовать хранение готовых сборок проекта в строгом хронологически верном порядке.
-release.releases=Релизы
-release.detail=Детали релиза
+releases.desc=Выпуски используются для публикации и распространения версий проекта.
+release.releases=Выпуски
+release.detail=Подробности о выпуске
release.tags=Теги
-release.new_release=Новый релиз
+release.new_release=Новый выпуск
release.draft=Черновик
-release.prerelease=Пре-релиз
+release.prerelease=Предварительный выпуск
release.stable=Стабильный
release.compare=Сравнить
release.edit=редактировать
release.ahead.commits=%d коммиты
-release.ahead.target=%s с этого релиза
+release.ahead.target=%s с этого выпуска
tag.ahead.target=в %s после этого тега
release.source_code=Исходный код
-release.new_subheader=Публикация релизов поможет хранить чёткую историю развития вашего проекта.
+release.new_subheader=Подробный журнал изменений может помочь пользователям понять, что было изменено в очередной версии.
release.edit_subheader=Подробный журнал изменений может помочь пользователям понять, что было изменено в очередной версии.
release.tag_name=Имя тега
release.target=Цель
release.tag_helper=Выберите существующий тег, или создайте новый.
release.tag_helper_new=Новый тег. Этот тег будет создан из цели.
release.tag_helper_existing=Существующий тег.
-release.title=Название релиза
+release.title=Название выпуска
release.title_empty=Заголовок не может быть пустым.
-release.message=Опишите этот релиз
-release.prerelease_desc=Это предварительный релиз
-release.prerelease_helper=Отметить релиз как не готовый для производственного использования.
+release.message=Расскажите про этот выпуск
+release.prerelease_desc=Это предварительный выпуск
+release.prerelease_helper=Пометить выпуск как не готовый для массового использования.
release.cancel=Отменить
-release.publish=Опубликовать релиз
+release.publish=Опубликовать выпуск
release.save_draft=Сохранить черновик
-release.edit_release=Редактировать релиз
-release.delete_release=Удалить этот релиз
+release.edit_release=Редактировать выпуск
+release.delete_release=Удалить выпуск
release.delete_tag=Удалить тег
-release.deletion=Удаление релиза
-release.deletion_success=Релиз удалён.
+release.deletion=Удаление выпуска
+release.deletion_success=Выпуск удалён.
release.deletion_tag_desc=Этот тег будет удалён из хранилища. Содержимое хранилища и история не изменятся. Продолжить?
release.deletion_tag_success=Тег удалён.
-release.tag_name_already_exist=Релиз с этим именем метки уже существует.
+release.tag_name_already_exist=Выпуск с этим тегом уже существует.
release.tag_name_invalid=Имя тега является не допустимым.
release.tag_name_protected=Имя тега защищено.
release.tag_already_exist=Этот тег уже используется.
release.downloads=Загрузки
release.download_count=Загрузки: %s
-release.add_tag_msg=Использовать заголовок и содержимое релиза в качестве сообщения тега.
+release.add_tag_msg=Использовать заголовок и содержимое выпуска в качестве сообщения тега.
release.add_tag=Создать только тег
-release.releases_for=Релизы %s
+release.releases_for=Выпуски %s
release.tags_for=Теги %s
branch.name=Название ветки
@@ -2616,9 +2616,16 @@ settings.webhook.test_delivery_desc_disabled = Активируйте этот
commits.browse_further = Смотреть далее
vendored = Vendored
settings.units.add_more = Добавить больше...
-pulls.fast_forward_only_merge_pull_request = Только Fast-forward
+pulls.fast_forward_only_merge_pull_request = Только fast-forward
settings.units.overview = Обзор
settings.units.units = Разделы репозитория
+pulls.reopen_failed.head_branch = Этот запрос на слияние не может быть открыт заново, потому что головная ветка больше не существует.
+pulls.reopen_failed.base_branch = Этот запрос на слияние не может быть открыт заново, потому что базовая ветка больше не существует.
+settings.ignore_stale_approvals = Игнорировать устаревшие одобрения
+contributors.contribution_type.commits = Коммиты
+contributors.contribution_type.additions = Добавления
+contributors.contribution_type.deletions = Удаления
+contributors.contribution_type.filter_label = Тип участия:
[org]
org_name_holder=Название организации
@@ -3622,3 +3629,11 @@ executable_file=Исполняемый файл
symbolic_link=Символическая ссылка
submodule=Подмодуль
+
+
+[graphs]
+component_loading_failed = Не удалось загрузить %s
+component_failed_to_load = Случилась непредвиденная ошибка.
+contributors.what = участие
+component_loading = Загрузка %s...
+component_loading_info = Это займёт некоторое время…
\ No newline at end of file
diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini
index dc6e7c336f..8ba8eaedb6 100644
--- a/options/locale/locale_si-LK.ini
+++ b/options/locale/locale_si-LK.ini
@@ -1279,7 +1279,7 @@ pulls.cant_reopen_deleted_branch=ශාඛාව මකා දැමූ නි
pulls.merged=සංයුක්ත කෙරිණි
pulls.manually_merged=අතින් සංයුක්ත කර ඇත
pulls.is_closed=අදින්න ඉල්ලීම වසා දමා ඇත.
-pulls.title_wip_desc=අහම්බෙන් ඒකාබද්ධ කිරීමෙන් අදින්න ඉල්ලීම වැළැක්වීම සඳහා %s සමඟ මාතෘකාව ආරම්භ කරන්න.
+pulls.title_wip_desc=අහම්බෙන් ඒකාබද්ධ කිරීමෙන් අදින්න ඉල්ලීම වැළැක්වීම සඳහා %s සමඟ මාතෘකාව ආරම්භ කරන්න.
pulls.cannot_merge_work_in_progress=මෙම අදින්න ඉල්ලීම ක්රියාත්මක වන කාර්යයක් ලෙස සලකුණු කර ඇත.
pulls.still_in_progress=තවමත් ක්රියාත්මක වෙමින් තිබේද?
pulls.add_prefix=%s උපසර්ගය එකතු කරන්න
@@ -1324,7 +1324,7 @@ pulls.rebase_conflict_summary=දෝෂ පණිවිඩය
pulls.unrelated_histories=ඒකාබද්ධ කිරීම අසමත් විය: ඒකාබද්ධ හිස සහ පාදය පොදු ඉතිහාසයක් බෙදා නොගනී. ඉඟිය: වෙනත් උපාය මාර්ගයක් උත්සාහ කරන්න
pulls.merge_out_of_date=ඒකාබද්ධ කිරීම අසමත් විය: ඒකාබද්ධ කිරීම ජනනය කරන අතර, පදනම යාවත්කාලීන කරන ලදී. ඉඟිය: නැවත උත්සාහ කරන්න.
pulls.push_rejected_summary=පූර්ණ ප්රතික්ෂේප පණිවිඩය
-pulls.open_unmerged_pull_exists=සමාන ගුණාංග සහිත අදින්න ඉල්ලීමක් (#%d) ඇති බැවින් ඔබට නැවත විවෘත කිරීමේ මෙහෙයුමක් කළ නොහැක.
+pulls.open_unmerged_pull_exists=සමාන ගුණාංග සහිත අදින්න ඉල්ලීමක් (#%d) ඇති බැවින් ඔබට නැවත විවෘත කිරීමේ මෙහෙයුමක් කළ නොහැක.
pulls.status_checking=සමහර චෙක්පත් බලා ඇත
pulls.status_checks_success=සියලුම චෙක්පත් සාර්ථක විය
pulls.status_checks_warning=සමහර චෙක්පත් අනතුරු ඇඟවීම් වාර්තා කරයි
From 5c67c34ce84d19d8b8e61b479ae841e95800ccb7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Malte=20J=C3=BCrgens?=
Date: Wed, 21 Feb 2024 18:10:21 +0100
Subject: [PATCH 063/807] Add e2e debug server
This adds the ability to run `make test-e2e-debugserver` to start a
forgejo server pupulated with the test data from `models/fixtures`. This
is particularly useful for debugging the e2e tests with a external tool,
such as the Playwright extension for VSCode [1].
[1] https://open-vsx.org/extension/ms-playwright/playwright
---
Makefile | 13 +++++++++----
tests/e2e/debugserver_test.go | 30 ++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 4 deletions(-)
create mode 100644 tests/e2e/debugserver_test.go
diff --git a/Makefile b/Makefile
index f023608b1e..e12660e4a7 100644
--- a/Makefile
+++ b/Makefile
@@ -639,7 +639,7 @@ test-e2e: test-e2e-sqlite
.PHONY: test-e2e-sqlite
test-e2e-sqlite: playwright e2e.sqlite.test generate-ini-sqlite
- GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./e2e.sqlite.test
+ GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./e2e.sqlite.test -test.run TestE2e
.PHONY: test-e2e-sqlite\#%
test-e2e-sqlite\#%: playwright e2e.sqlite.test generate-ini-sqlite
@@ -647,7 +647,7 @@ test-e2e-sqlite\#%: playwright e2e.sqlite.test generate-ini-sqlite
.PHONY: test-e2e-mysql
test-e2e-mysql: playwright e2e.mysql.test generate-ini-mysql
- GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./e2e.mysql.test
+ GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./e2e.mysql.test -test.run TestE2e
.PHONY: test-e2e-mysql\#%
test-e2e-mysql\#%: playwright e2e.mysql.test generate-ini-mysql
@@ -655,7 +655,7 @@ test-e2e-mysql\#%: playwright e2e.mysql.test generate-ini-mysql
.PHONY: test-e2e-pgsql
test-e2e-pgsql: playwright e2e.pgsql.test generate-ini-pgsql
- GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test
+ GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test -test.run TestE2e
.PHONY: test-e2e-pgsql\#%
test-e2e-pgsql\#%: playwright e2e.pgsql.test generate-ini-pgsql
@@ -663,12 +663,17 @@ test-e2e-pgsql\#%: playwright e2e.pgsql.test generate-ini-pgsql
.PHONY: test-e2e-mssql
test-e2e-mssql: playwright e2e.mssql.test generate-ini-mssql
- GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./e2e.mssql.test
+ GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./e2e.mssql.test -test.run TestE2e
.PHONY: test-e2e-mssql\#%
test-e2e-mssql\#%: playwright e2e.mssql.test generate-ini-mssql
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini ./e2e.mssql.test -test.run TestE2e/$*
+.PHONY: test-e2e-debugserver
+test-e2e-debugserver: e2e.sqlite.test generate-ini-sqlite
+ sed -i s/3003/3000/g tests/sqlite.ini
+ GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./e2e.sqlite.test -test.run TestDebugserver -test.timeout 24h
+
.PHONY: bench-sqlite
bench-sqlite: integrations.sqlite.test generate-ini-sqlite
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./integrations.sqlite.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench .
diff --git a/tests/e2e/debugserver_test.go b/tests/e2e/debugserver_test.go
new file mode 100644
index 0000000000..f0f54665e1
--- /dev/null
+++ b/tests/e2e/debugserver_test.go
@@ -0,0 +1,30 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+// This "test" is meant to be run with `make test-e2e-debugserver` and will just
+// keep open a gitea instance in a test environment (with the data from
+// `models/fixtures`) on port 3000. This is useful for debugging e2e tests, for
+// example with the playwright vscode extension.
+
+//nolint:forbidigo
+package e2e
+
+import (
+ "net/url"
+ "os"
+ "os/signal"
+ "syscall"
+ "testing"
+
+ "code.gitea.io/gitea/modules/setting"
+)
+
+func TestDebugserver(t *testing.T) {
+ done := make(chan os.Signal, 1)
+ signal.Notify(done, syscall.SIGINT, syscall.SIGTERM)
+
+ onGiteaRun(t, func(*testing.T, *url.URL) {
+ println(setting.AppURL)
+ <-done
+ })
+}
From 166890451377c76d8a2a122a12fb27dd15a5e822 Mon Sep 17 00:00:00 2001
From: "Panagiotis \"Ivory\" Vasilopoulos"
Date: Wed, 14 Feb 2024 12:12:45 +0100
Subject: [PATCH 064/807] [UI] Actions: Link to Workflow in View
---
options/locale/locale_en-US.ini | 1 +
routers/web/repo/actions/view.go | 17 ++++++++---
templates/repo/actions/view.tmpl | 2 ++
tests/integration/actions_route_test.go | 36 ++++++++++++++++++------
web_src/js/components/RepoActionView.vue | 13 +++++++--
5 files changed, 54 insertions(+), 15 deletions(-)
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index bdae9a29ac..af046f6a29 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -3627,6 +3627,7 @@ runs.all_workflows = All Workflows
runs.commit = Commit
runs.scheduled = Scheduled
runs.pushed_by = pushed by
+runs.workflow = Workflow
runs.invalid_workflow_helper = Workflow config file is invalid. Please check your config file: %s
runs.no_matching_online_runner_helper = No matching online runner with label: %s
runs.actor = Actor
diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go
index ba2e63c3cc..99ad4356b5 100644
--- a/routers/web/repo/actions/view.go
+++ b/routers/web/repo/actions/view.go
@@ -1,4 +1,5 @@
// Copyright 2022 The Gitea Authors. All rights reserved.
+// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package actions
@@ -35,13 +36,19 @@ func View(ctx *context_module.Context) {
ctx.Data["PageIsActions"] = true
runIndex := ctx.ParamsInt64("run")
jobIndex := ctx.ParamsInt64("job")
+
+ job, _ := getRunJobs(ctx, runIndex, jobIndex)
+ if ctx.Written() {
+ return
+ }
+
+ workflowName := job.Run.WorkflowID
+
ctx.Data["RunIndex"] = runIndex
ctx.Data["JobIndex"] = jobIndex
ctx.Data["ActionsURL"] = ctx.Repo.RepoLink + "/actions"
-
- if getRunJobs(ctx, runIndex, jobIndex); ctx.Written() {
- return
- }
+ ctx.Data["WorkflowName"] = workflowName
+ ctx.Data["WorkflowURL"] = ctx.Repo.RepoLink + "/actions?workflow=" + workflowName
ctx.HTML(http.StatusOK, tplViewActions)
}
@@ -130,6 +137,7 @@ type ViewJob struct {
type ViewCommit struct {
LocaleCommit string `json:"localeCommit"`
LocalePushedBy string `json:"localePushedBy"`
+ LocaleWorkflow string `json:"localeWorkflow"`
ShortSha string `json:"shortSHA"`
Link string `json:"link"`
Pusher ViewUser `json:"pusher"`
@@ -211,6 +219,7 @@ func ViewPost(ctx *context_module.Context) {
resp.State.Run.Commit = ViewCommit{
LocaleCommit: ctx.Locale.TrString("actions.runs.commit"),
LocalePushedBy: ctx.Locale.TrString("actions.runs.pushed_by"),
+ LocaleWorkflow: ctx.Locale.TrString("actions.runs.workflow"),
ShortSha: base.ShortSha(run.CommitSHA),
Link: fmt.Sprintf("%s/commit/%s", run.Repo.Link(), run.CommitSHA),
Pusher: pusher,
diff --git a/templates/repo/actions/view.tmpl b/templates/repo/actions/view.tmpl
index 6b07e7000a..1cade96f01 100644
--- a/templates/repo/actions/view.tmpl
+++ b/templates/repo/actions/view.tmpl
@@ -6,6 +6,8 @@
data-run-index="{{.RunIndex}}"
data-job-index="{{.JobIndex}}"
data-actions-url="{{.ActionsURL}}"
+ data-workflow-name="{{.WorkflowName}}"
+ data-workflow-url="{{.WorkflowURL}}"
data-locale-approve="{{ctx.Locale.Tr "repo.diff.review.approve"}}"
data-locale-cancel="{{ctx.Locale.Tr "cancel"}}"
data-locale-rerun="{{ctx.Locale.Tr "rerun"}}"
diff --git a/tests/integration/actions_route_test.go b/tests/integration/actions_route_test.go
index c941fca2e5..aca67a40c0 100644
--- a/tests/integration/actions_route_test.go
+++ b/tests/integration/actions_route_test.go
@@ -27,7 +27,7 @@ func TestActionsWebRouteLatestWorkflowRun(t *testing.T) {
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
// create the repo
- repo, _, f := CreateDeclarativeRepo(t, user2, "",
+ repo, _, f := CreateDeclarativeRepo(t, user2, "actionsTestRepo",
[]unit_model.Type{unit_model.TypeActions}, nil,
[]*files_service.ChangeRepoFile{
{
@@ -44,17 +44,17 @@ func TestActionsWebRouteLatestWorkflowRun(t *testing.T) {
)
defer f()
+ // helpers
+ getWorkflowRunRedirectURI := func(workflow string) string {
+ req := NewRequest(t, "GET", fmt.Sprintf("%s/actions/workflows/%s/runs/latest", repo.HTMLURL(), workflow))
+ resp := MakeRequest(t, req, http.StatusTemporaryRedirect)
+
+ return resp.Header().Get("Location")
+ }
+
t.Run("valid workflows", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
- // helpers
- getWorkflowRunRedirectURI := func(workflow string) string {
- req := NewRequest(t, "GET", fmt.Sprintf("%s/actions/workflows/%s/runs/latest", repo.HTMLURL(), workflow))
- resp := MakeRequest(t, req, http.StatusTemporaryRedirect)
-
- return resp.Header().Get("Location")
- }
-
// two runs have been created
assert.Equal(t, 2, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID}))
@@ -77,6 +77,24 @@ func TestActionsWebRouteLatestWorkflowRun(t *testing.T) {
assert.Equal(t, workflowTwoURI, workflowTwo.HTMLURL())
})
+ t.Run("check if workflow page shows file name", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ // Get the redirect URI
+ workflow := "workflow-1.yml"
+ workflowOneURI := getWorkflowRunRedirectURI(workflow)
+
+ // Fetch the page that shows information about the run initiated by "workflow-1.yml".
+ // routers/web/repo/actions/view.go: data-workflow-url is constructed using data-workflow-name.
+ req := NewRequest(t, "GET", workflowOneURI)
+ resp := MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+
+ // Verify that URL of the workflow is shown correctly.
+ rightURL := fmt.Sprintf("/user2/actionsTestRepo/actions?workflow=%s", workflow)
+ htmlDoc.AssertElement(t, fmt.Sprintf("#repo-action-view[data-workflow-url=\"%s\"]", rightURL), true)
+ })
+
t.Run("existing workflow, non-existent branch", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
diff --git a/web_src/js/components/RepoActionView.vue b/web_src/js/components/RepoActionView.vue
index 797869b78c..6155fb22bd 100644
--- a/web_src/js/components/RepoActionView.vue
+++ b/web_src/js/components/RepoActionView.vue
@@ -17,6 +17,8 @@ const sfc = {
runIndex: String,
jobIndex: String,
actionsURL: String,
+ workflowName: String,
+ workflowURL: String,
locale: Object,
},
@@ -56,6 +58,7 @@ const sfc = {
commit: {
localeCommit: '',
localePushedBy: '',
+ localeWorkflow: '',
shortSHA: '',
link: '',
pusher: {
@@ -324,6 +327,8 @@ export function initRepositoryActionView() {
runIndex: el.getAttribute('data-run-index'),
jobIndex: el.getAttribute('data-job-index'),
actionsURL: el.getAttribute('data-actions-url'),
+ workflowName: el.getAttribute('data-workflow-name'),
+ workflowURL: el.getAttribute('data-workflow-url'),
locale: {
approve: el.getAttribute('data-locale-approve'),
cancel: el.getAttribute('data-locale-cancel'),
@@ -369,7 +374,7 @@ export function initRepositoryActionView() {
{{ locale.rerun_all }}
-
@@ -500,7 +509,7 @@ export function initRepositoryActionView() {
flex: 1;
}
-.action-commit-summary {
+.action-summary {
display: flex;
gap: 5px;
margin: 0 0 0 28px;
From 704615fa65476f435e296021cc59c73ec00746b1 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Tue, 20 Feb 2024 13:37:10 +0100
Subject: [PATCH 065/807] [RELEASE] v1.21.6-0 release notes
Refs: https://codeberg.org/forgejo/forgejo/issues/2408
---
RELEASE-NOTES.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 65f79e3628..c72c898f67 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -4,6 +4,54 @@ A Forgejo release is published shortly after a Gitea release is published and th
The Forgejo admin should carefully read the required manual actions before upgrading. A point release (e.g. v1.21.1-0 or v1.21.2-0) does not require manual actions but others might (e.g. v1.20, v1.21).
+## 1.21.6-0
+
+The [complete list of commits](https://codeberg.org/forgejo/forgejo/commits/branch/v1.21/forgejo) included in the `Forgejo v1.21.6-0` release can be reviewed from the command line with:
+
+```shell
+$ git clone https://codeberg.org/forgejo/forgejo/
+$ git -C forgejo log --oneline --no-merges v1.21.5-0..v1.21.6-0
+```
+
+This stable release contains bug fixes and a **security fix**, as explained in the [v1.21.6-0 companion blog post](https://forgejo.org/2024-02-release-v1-21-6-0/).
+
+* Recommended Action
+
+ We **strongly recommend** that all Forgejo installations are [upgraded](https://forgejo.org/docs/v1.21/admin/upgrade/) to the latest version as soon as possible.
+
+* [Forgejo Semantic Version](https://forgejo.org/docs/v1.21/user/semver/)
+
+ The semantic version was updated to `6.0.6+0-gitea-1.21.6`
+
+* Security fix
+
+ * [Fix XSS vulnerabilities](https://codeberg.org/forgejo/forgejo/pulls/2434). It enabled attackers to inject client-side scripts into web pages displayed to Forgejo visitors.
+
+* Bug fixes
+
+ The most prominent ones are described here, others can be found in the list of commits included in the release as described above.
+
+ * [Always write proc-receive hook for all git versions](https://codeberg.org/forgejo/forgejo/commit/a1fb6a2346193439dafaee5acf071632246e6dd7).
+ * [Fix debian InRelease Acquire-By-Hash newline](https://codeberg.org/forgejo/forgejo/commit/8a2c4e9ff2743f47a8d1f081b9e35dcc16431115).
+ * [Fix missing link on outgoing new release notifications](https://codeberg.org/forgejo/forgejo/commit/3a061083d65bdfc9acf0cb5839b84f6a9c17a727).
+ * [Workaround to clean up old reviews on creating a new one](https://codeberg.org/forgejo/forgejo/commit/8377ecbfe1f2b72ec7d65c46cbc9022ad0ccd75f).
+ * [Fix push to create with capitalize repo name](https://codeberg.org/forgejo/forgejo/commit/8782275c9c66ad6fc7c44503d7df9dae7196aa65).
+ * In Markdown [don't try to make the link absolute if the link has a schema that's defined in `[markdown].CUSTOM_URL_SCHEMES`](https://codeberg.org/forgejo/forgejo/commit/6c100083c29fb0ccf0cc52e8767e540a260d9468), because they can't be made absolute.
+ * [Fix Ctrl+Enter on submitting review comment](https://codeberg.org/forgejo/forgejo/commit/1c3a31d85112d10fb948d6f0b763191ed6f68e90).
+ * In Git version v2.43.1, the behavior of `GIT_FLUSH` was accidentially flipped. This causes Forgejo to hang on the `check-attr` command, because no output was being flushed. [Workaround this by detecting if Git v2.43.1 is used and set `GIT_FLUSH=0` thus getting the correct behavior](https://codeberg.org/forgejo/forgejo/commit/ff468ab5e426582b068586ce13d5a5348365e783).
+ * [When setting `url.host` on a URL object with no port specified (like is the case of default port), the resulting URL's port will not change. Workaround this quirk in the URL standard by explicitly setting port for the http and https protocols](https://codeberg.org/forgejo/forgejo/commit/628e1036cfbcfae442cb6494249fe11410447056).
+ * [Fix elasticsearch Request Entity Too Large](https://codeberg.org/forgejo/forgejo/commit/e6f59f6e1489d63d53de0da1de406a7a71a82adb).
+ * [Do not send update/delete release notifications when it is in a draft state](https://codeberg.org/forgejo/forgejo/commit/3c54a1dbf62e56d948feb1008512900140033737).
+ * [Do not run Forgejo Actions workflows synchronized events on the same commit as the one used to create a pull request](https://codeberg.org/forgejo/forgejo/commit/ce96379aef6e92cff2e9982031d5248ef8b01947).
+ * [Fix a MySQL performance regression introduced in v1.21.4-0](https://codeberg.org/forgejo/forgejo/commit/af98a0a7c6f4cbb5340974958ebe4389e3bf4e9a).
+ * [Fix Internal Server Error when resolving comments](https://codeberg.org/forgejo/forgejo/commit/ad67d9ef1a219b21309f811c14e7353cbc4982e3).
+ * Packages
+ * Swift: [fix a failure to resolve from package registry](https://codeberg.org/forgejo/forgejo/commit/fab6780fda5d8ded020a98253a793e87ed94f634).
+ * Alpine: [if the APKINFO contains an install if condition, write it in the APKINDEX](https://codeberg.org/forgejo/forgejo/commit/7afbc62057b876fb6711ef58743f664a2509dde4).
+ * org-mode files
+ * [It is possible that the description of an `Regularlink` is `Text` and not another `Regularlink`](https://codeberg.org/forgejo/forgejo/commit/781d2a68ccb276bf13caf0b378b74d9efeab3d39).
+ * [Fix relative links on orgmode](https://codeberg.org/forgejo/forgejo/commit/fa700333ba2649d14f1670dd2745957704a33b40).
+
## 1.21.5-0
The [complete list of commits](https://codeberg.org/forgejo/forgejo/commits/branch/v1.21/forgejo) included in the `Forgejo v1.21.5-0` release can be reviewed from the command line with:
From 565e3312385d533f96c359979a3ae7cc14eba671 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Wed, 17 Jan 2024 16:16:46 +0100
Subject: [PATCH 066/807] [SECURITY] Test XSS in wiki last commit information
On the wiki and revisions page, information is shown about the last
commit that modified that wiki page. This includes the time it was last
edited and by whom. Verify it is sanitized.
---
tests/integration/xss_test.go | 75 +++++++++++++++++++++++++++++++++++
1 file changed, 75 insertions(+)
diff --git a/tests/integration/xss_test.go b/tests/integration/xss_test.go
index e575ed3990..42ce35150c 100644
--- a/tests/integration/xss_test.go
+++ b/tests/integration/xss_test.go
@@ -4,14 +4,24 @@
package integration
import (
+ "context"
+ "fmt"
"net/http"
+ "net/url"
+ "os"
+ "path/filepath"
"testing"
+ "time"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/tests"
+ gogit "github.com/go-git/go-git/v5"
+ "github.com/go-git/go-git/v5/plumbing/object"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestXSSUserFullName(t *testing.T) {
@@ -37,3 +47,68 @@ func TestXSSUserFullName(t *testing.T) {
htmlDoc.doc.Find("div.content").Find(".header.text.center").Text(),
)
}
+
+func TestXSSWikiLastCommitInfo(t *testing.T) {
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ // Prepare the environment.
+ dstPath := t.TempDir()
+ r := fmt.Sprintf("%suser2/repo1.wiki.git", u.String())
+ u, err := url.Parse(r)
+ assert.NoError(t, err)
+ u.User = url.UserPassword("user2", userPassword)
+ assert.NoError(t, git.CloneWithArgs(context.Background(), git.AllowLFSFiltersArgs(), u.String(), dstPath, git.CloneRepoOptions{}))
+
+ // Use go-git here, because using git wouldn't work, it has code to remove
+ // `<`, `>` and `\n` in user names. Even though this is permitted and
+ // wouldn't result in a error by a Git server.
+ gitRepo, err := gogit.PlainOpen(dstPath)
+ require.NoError(t, err)
+
+ w, err := gitRepo.Worktree()
+ require.NoError(t, err)
+
+ filename := filepath.Join(dstPath, "Home.md")
+ err = os.WriteFile(filename, []byte("Oh, a XSS attack?"), 0o644)
+ require.NoError(t, err)
+
+ _, err = w.Add("Home.md")
+ require.NoError(t, err)
+
+ _, err = w.Commit("Yay XSS", &gogit.CommitOptions{
+ Author: &object.Signature{
+ Name: `Gusted`,
+ Email: "valid@example.org",
+ When: time.Date(2024, time.January, 31, 0, 0, 0, 0, time.UTC),
+ },
+ })
+ require.NoError(t, err)
+
+ // Push.
+ _, _, err = git.NewCommand(git.DefaultContext, "push").AddArguments(git.ToTrustedCmdArgs([]string{"origin", "master"})...).RunStdString(&git.RunOpts{Dir: dstPath})
+ require.NoError(t, err)
+
+ // Check on page view.
+ t.Run("Page view", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, http.MethodGet, "/user2/repo1/wiki/Home")
+ resp := MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+
+ htmlDoc.AssertElement(t, "script.evil", false)
+ assert.Contains(t, htmlDoc.Find(".ui.sub.header").Text(), `Gusted edited this page 2024-01-31`)
+ })
+
+ // Check on revisions page.
+ t.Run("Revision page", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, http.MethodGet, "/user2/repo1/wiki/Home?action=_revision")
+ resp := MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+
+ htmlDoc.AssertElement(t, "script.evil", false)
+ assert.Contains(t, htmlDoc.Find(".ui.sub.header").Text(), `Gusted edited this page 2024-01-31`)
+ })
+ })
+}
From ca798e4cc2a8c6e3d1f2cfed01f47d8b3da9361f Mon Sep 17 00:00:00 2001
From: Gusted
Date: Thu, 18 Jan 2024 00:18:39 +0100
Subject: [PATCH 067/807] [SECURITY] Test XSS in dismissed review
It's possible for reviews to not be assiocated with users, when they
were migrated from another forge instance. In the migration code,
there's no sanitization check for author names, so they could contain
HTML tags and thus needs to be properely escaped.
---
templates/repo/issue/view_content/comments.tmpl | 2 +-
.../fixtures/TestXSSReviewDismissed/comment.yml | 9 +++++++++
.../fixtures/TestXSSReviewDismissed/review.yml | 8 ++++++++
tests/integration/xss_test.go | 15 +++++++++++++++
4 files changed, 33 insertions(+), 1 deletion(-)
create mode 100644 tests/integration/fixtures/TestXSSReviewDismissed/comment.yml
create mode 100644 tests/integration/fixtures/TestXSSReviewDismissed/review.yml
diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl
index 9e50ee4d94..a4fd97297f 100644
--- a/templates/repo/issue/view_content/comments.tmpl
+++ b/templates/repo/issue/view_content/comments.tmpl
@@ -619,7 +619,7 @@
{{else}}
{{$reviewerName = .Review.OriginalAuthor}}
{{end}}
- {{ctx.Locale.Tr "repo.issues.review.dismissed" $reviewerName $createdStr | Safe}}
+ {{ctx.Locale.Tr "repo.issues.review.dismissed" $reviewerName $createdStr | Safe}}
{{if .Content}}
diff --git a/tests/integration/fixtures/TestXSSReviewDismissed/comment.yml b/tests/integration/fixtures/TestXSSReviewDismissed/comment.yml
new file mode 100644
index 0000000000..50162a4e7e
--- /dev/null
+++ b/tests/integration/fixtures/TestXSSReviewDismissed/comment.yml
@@ -0,0 +1,9 @@
+-
+ id: 1000
+ type: 32 # dismiss review
+ poster_id: 2
+ issue_id: 2 # in repo_id 1
+ content: "XSS time!"
+ review_id: 1000
+ created_unix: 1700000000
+ updated_unix: 1700000000
diff --git a/tests/integration/fixtures/TestXSSReviewDismissed/review.yml b/tests/integration/fixtures/TestXSSReviewDismissed/review.yml
new file mode 100644
index 0000000000..56bc08d35f
--- /dev/null
+++ b/tests/integration/fixtures/TestXSSReviewDismissed/review.yml
@@ -0,0 +1,8 @@
+-
+ id: 1000
+ type: 1
+ issue_id: 2
+ original_author: "Otto "
+ content: "XSS time!"
+ updated_unix: 1700000000
+ created_unix: 1700000000
diff --git a/tests/integration/xss_test.go b/tests/integration/xss_test.go
index 42ce35150c..acd716c7c7 100644
--- a/tests/integration/xss_test.go
+++ b/tests/integration/xss_test.go
@@ -13,6 +13,7 @@ import (
"testing"
"time"
+ issues_model "code.gitea.io/gitea/models/issues"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
@@ -112,3 +113,17 @@ func TestXSSWikiLastCommitInfo(t *testing.T) {
})
})
}
+
+func TestXSSReviewDismissed(t *testing.T) {
+ defer tests.AddFixtures("tests/integration/fixtures/TestXSSReviewDismissed/")()
+ defer tests.PrepareTestEnv(t)()
+
+ review := unittest.AssertExistsAndLoadBean(t, &issues_model.Review{ID: 1000})
+
+ req := NewRequest(t, http.MethodGet, fmt.Sprintf("/user2/repo1/pulls/%d", +review.IssueID))
+ resp := MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+
+ htmlDoc.AssertElement(t, "script.evil", false)
+ assert.Contains(t, htmlDoc.Find("#issuecomment-1000 .dismissed-message").Text(), `dismissed Otto ’s review`)
+}
From e5b5585ee24610f2d6dc959fccf78b3435452a62 Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Thu, 22 Feb 2024 22:33:22 +0500
Subject: [PATCH 068/807] Fixes & Improvements for English locale
---
options/locale/locale_ar.ini | 4 ++--
options/locale/locale_bg.ini | 4 ++--
options/locale/locale_cs-CZ.ini | 2 +-
options/locale/locale_de-DE.ini | 4 ++--
options/locale/locale_el-GR.ini | 2 +-
options/locale/locale_en-US.ini | 25 ++++++++++----------
options/locale/locale_eo.ini | 4 ++--
options/locale/locale_es-ES.ini | 2 +-
options/locale/locale_fa-IR.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_is-IS.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 | 4 ++--
options/locale/locale_pl-PL.ini | 2 +-
options/locale/locale_pt-BR.ini | 2 +-
options/locale/locale_pt-PT.ini | 2 +-
options/locale/locale_ru-RU.ini | 4 ++--
options/locale/locale_si-LK.ini | 2 +-
options/locale/locale_sk-SK.ini | 2 +-
options/locale/locale_sl.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-TW.ini | 2 +-
templates/user/auth/change_passwd_inner.tmpl | 4 ++--
templates/user/settings/account.tmpl | 4 ++--
33 files changed, 53 insertions(+), 52 deletions(-)
diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini
index 1af1951863..ca1127d624 100644
--- a/options/locale/locale_ar.ini
+++ b/options/locale/locale_ar.ini
@@ -324,7 +324,7 @@ twofa_disable = تعطيل الاستيثاق الثنائي
retype_new_password = تأكيد كلمة المرور الجديدة
manage_emails = أدر عناوين البريد الإلكتروني
then_enter_passcode = وأدخل رمز الدخول الظاهر في التطبيق:
-change_password = حدّث كلمة المرور
+update_password = حدّث كلمة المرور
continue = استمر
emails = عناوين البريد الإلكتروني
confirm_delete_account = أكُد الحذف
@@ -1941,4 +1941,4 @@ error.failed_retrieval_gpg_keys = "تعذّر جلب مفتاح مرتبط بح
component_loading = يحمّل %s...
component_loading_failed = تعذر تحميل %s
component_loading_info = قد يحتاج هذا وقتا…
-component_failed_to_load = حدث خطأ غير متوقع.
\ No newline at end of file
+component_failed_to_load = حدث خطأ غير متوقع.
diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini
index c18d2a2f80..2cd88b4a62 100644
--- a/options/locale/locale_bg.ini
+++ b/options/locale/locale_bg.ini
@@ -47,7 +47,7 @@ ssh_gpg_keys = SSH / GPG Ключове
comment_type_group_milestone = Етап
manage_emails = Управление на адресите на ел. поща
permission_read = Четене
-change_password = Обновяване на паролата
+update_password = Обновяване на паролата
biography_placeholder = Разкажете ни малко за себе си! (Можете да използвате Markdown)
orgs = Управление на организациите
continue = Продължаване
@@ -452,4 +452,4 @@ symbolic_link = Символна връзка
normal_file = Обикновен файл
executable_file = Изпълним файл
changed_filemode = %[1]s → %[2]s
-submodule = Подмодул
\ No newline at end of file
+submodule = Подмодул
diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini
index 78268104ff..88cfc04020 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -689,7 +689,7 @@ uploaded_avatar_is_too_big=Nahraný soubor (%d KiB) přesahuje maximální velik
update_avatar_success=Vaše avatar byl aktualizován.
update_user_avatar_success=Uživatelův avatar byl aktualizován.
-change_password=Aktualizovat heslo
+update_password=Aktualizovat heslo
old_password=Stávající heslo
new_password=Nové heslo
retype_new_password=Potvrdit nové heslo
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index 52bc88dfac..e57bf94277 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -707,7 +707,7 @@ uploaded_avatar_is_too_big=Die hochgeladene Dateigröße (%d KiB) überschreitet
update_avatar_success=Dein Profilbild wurde geändert.
update_user_avatar_success=Der Avatar des Benutzers wurde aktualisiert.
-change_password=Passwort aktualisieren
+update_password=Passwort aktualisieren
old_password=Aktuelles Passwort
new_password=Neues Passwort
retype_new_password=Neues Passwort bestätigen
@@ -3670,4 +3670,4 @@ component_loading_failed = Konnte %s nicht laden
component_loading_info = Dies könnte einen Moment dauern …
component_failed_to_load = Ein unerwarteter Fehler ist aufgetreten.
component_loading = Lade %s …
-contributors.what = Beiträge
\ No newline at end of file
+contributors.what = Beiträge
diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini
index 3065990e8f..212cb3f918 100644
--- a/options/locale/locale_el-GR.ini
+++ b/options/locale/locale_el-GR.ini
@@ -688,7 +688,7 @@ uploaded_avatar_is_too_big=Το μέγεθος αρχείου που ανέβη
update_avatar_success=Η εικόνα σας έχει ενημερωθεί.
update_user_avatar_success=Το avatar του χρήστη ενημερώθηκε.
-change_password=Ενημέρωση Κωδικού Πρόσβασης
+update_password=Ενημέρωση Κωδικού Πρόσβασης
old_password=Τρέχων Κωδικός Πρόσβασης
new_password=Νέος Κωδικός Πρόσβασης
retype_new_password=Επιβεβαίωση Νέου Κωδικού Πρόσβασης
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index bdae9a29ac..a8e7601df4 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -710,16 +710,17 @@ uploaded_avatar_is_too_big = The uploaded file size (%d KiB) exceeds the maximum
update_avatar_success = Your avatar has been updated.
update_user_avatar_success = The user's avatar has been updated.
-change_password = Update Password
-old_password = Current Password
-new_password = New Password
-retype_new_password = Confirm New Password
+change_password = Change password
+update_password = Update Password
+old_password = Current password
+new_password = New password
+retype_new_password = Confirm new password
password_incorrect = The current password is incorrect.
change_password_success = Your password has been updated. Sign in using your new password from now on.
password_change_disabled = Non-local users cannot update their password through the Forgejo web interface.
emails = Email Addresses
-manage_emails = Manage Email Addresses
+manage_emails = Manage email addresses
manage_themes = Select default theme
manage_openid = Manage OpenID Addresses
email_desc = Your primary email address will be used for notifications, password recovery and, provided that it is not hidden, web-based Git operations.
@@ -740,7 +741,7 @@ theme_update_error = The selected theme does not exist.
openid_deletion = Remove OpenID Address
openid_deletion_desc = Removing this OpenID address from your account will prevent you from signing in with it. Continue?
openid_deletion_success = The OpenID address has been removed.
-add_new_email = Add New Email Address
+add_new_email = Add email address
add_new_openid = Add New OpenID URI
add_email = Add Email Address
add_openid = Add OpenID URI
@@ -758,7 +759,7 @@ manage_gpg_keys = Manage GPG Keys
add_key = Add Key
ssh_desc = These public SSH keys are associated with your account. The corresponding private keys allow full access to your repositories. SSH keys that have been verified can be used to verify SSH-signed Git commits.
principal_desc = These SSH certificate principals are associated with your account and allow full access to your repositories.
-gpg_desc = These public GPG keys are associated with your account. Keep your private keys safe as they allow commits to be verified.
+gpg_desc = These public GPG keys are associated with your account and used to verify your commits. Keep your private keys safe as they allow to sign commits with your identity.
ssh_helper = Need help? Have a look at the guide to create your own SSH keys or solve common problems you may encounter using SSH.
gpg_helper = Need help? Have a look at the guide about GPG.
add_new_key = Add SSH Key
@@ -881,7 +882,7 @@ oauth2_application_remove_description = Removing an OAuth2 application will prev
oauth2_application_locked = Forgejo pre-registers some OAuth2 applications on startup if enabled in config. To prevent unexpected behavior, these can neither be edited nor removed. Please refer to the OAuth2 documentation for more information.
authorized_oauth2_applications = Authorized OAuth2 Applications
-authorized_oauth2_applications_description = You have granted access to your personal Forgejo account to these third party applications. Please revoke access for applications you no longer need.
+authorized_oauth2_applications_description = You have granted access to your personal Forgejo account to these third party applications. Please revoke access for applications that are no longer in use.
revoke_key = Revoke
revoke_oauth2_grant = Revoke Access
revoke_oauth2_grant_description = Revoking access for this third party application will prevent this application from accessing your data. Are you sure?
@@ -926,7 +927,7 @@ hooks.desc = Add webhooks which will be triggered for all repositories
orgs_none = You are not a member of any organizations.
repos_none = You do not own any repositories.
-blocked_users_none = You haven't blocked any users.
+blocked_users_none = There are no blocked users.
delete_account = Delete Your Account
delete_prompt = This operation will permanently delete your user account. It CANNOT be undone.
@@ -1671,7 +1672,7 @@ issues.dependency.issue_closing_blockedby = Closing this issue is blocked by the
issues.dependency.issue_close_blocks = This issue blocks closing of the following issues
issues.dependency.pr_close_blocks = This pull request blocks closing of the following issues
issues.dependency.issue_close_blocked = You need to close all issues blocking this issue before you can close it.
-issues.dependency.issue_batch_close_blocked = "Cannot batch close issues that you choose, because issue #%d still has open dependencies"
+issues.dependency.issue_batch_close_blocked = "Cannot batch close chosen issues, because issue #%d still has open dependencies"
issues.dependency.pr_close_blocked = You need to close all issues blocking this pull request before you can merge it.
issues.dependency.blocks_short = Blocks
issues.dependency.blocked_by_short = Depends on
@@ -2842,7 +2843,7 @@ dashboard.reinit_missing_repos = Reinitialize all missing Git repositories for w
dashboard.sync_external_users = Synchronize external user data
dashboard.cleanup_hook_task_table = Cleanup hook_task table
dashboard.cleanup_packages = Cleanup expired packages
-dashboard.cleanup_actions = Cleanup actions expired logs and artifacts
+dashboard.cleanup_actions = Cleanup expired logs and artifacts from actions
dashboard.server_uptime = Server Uptime
dashboard.current_goroutine = Current Goroutines
dashboard.current_memory_usage = Current Memory Usage
@@ -3536,7 +3537,7 @@ owner.settings.cargo.rebuild.success = The Cargo index was successfully rebuild.
owner.settings.cleanuprules.title = Manage Cleanup Rules
owner.settings.cleanuprules.add = Add Cleanup Rule
owner.settings.cleanuprules.edit = Edit Cleanup Rule
-owner.settings.cleanuprules.none = No cleanup rules available. Please consult the documentation.
+owner.settings.cleanuprules.none = There are no cleanup rules yet.
owner.settings.cleanuprules.preview = Cleanup Rule Preview
owner.settings.cleanuprules.preview.overview = %d packages are scheduled to be removed.
owner.settings.cleanuprules.preview.none = Cleanup rule does not match any packages.
diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini
index a2d576b9ea..0f3f2ea010 100644
--- a/options/locale/locale_eo.ini
+++ b/options/locale/locale_eo.ini
@@ -674,7 +674,7 @@ manage_emails = Mastrumi retpoŝtadresojn
generate_token_name_duplicate = %s jam uziĝis kiel programnomo iam. Bonvolu elekti novan.
permission_read = Lega
ssh_helper = Ĉu bezonas helpon? Legetu la gvidon pri kreado de SSH-ŝlosiloj aŭ ripari oftajn problemojn kiujn vi eble trafus uzante SSH.
-change_password = Konservi pasvorton
+update_password = Konservi pasvorton
ssh_key_been_used = Ĉi tiu SSH-ŝlosilo estas jam aldonita al la servilo.
password_change_disabled = Nelokaj uzantoj ne povas ŝanĝi sian pasvorton per la Forgejo retfasado.
emails = Retpoŝadresoj
@@ -714,4 +714,4 @@ follow = Aboni
followers = Abonantoj
block_user.detail_2 = La uzanto ne povos interagi viajn deponejojn, erarojn, kaj komentojn.
block_user = Bloki uzanton
-change_avatar = Ŝanĝi vian profilbildon…
\ No newline at end of file
+change_avatar = Ŝanĝi vian profilbildon…
diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini
index a941799e83..9230b937cd 100644
--- a/options/locale/locale_es-ES.ini
+++ b/options/locale/locale_es-ES.ini
@@ -706,7 +706,7 @@ uploaded_avatar_is_too_big=El tamaño del archivo subido (%d KiB) excede el tama
update_avatar_success=Su avatar ha sido actualizado.
update_user_avatar_success=El avatar del usuario se ha actualizado.
-change_password=Actualizar contraseña
+update_password=Actualizar contraseña
old_password=Contraseña actual
new_password=Nueva contraseña
retype_new_password=Confirme la nueva contraseña
diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini
index fb3da145c6..4b4ecd4a0a 100644
--- a/options/locale/locale_fa-IR.ini
+++ b/options/locale/locale_fa-IR.ini
@@ -526,7 +526,7 @@ uploaded_avatar_not_a_image=فایل بارگذاری شده تصویر نم
update_avatar_success=آواتار شما تغییر کرد.
update_user_avatar_success=آواتار کاربر بروز رسانی شده است.
-change_password=تغییر گذرواژه
+update_password=تغییر گذرواژه
old_password=گذارواژه فعلی
new_password=گذرواژه جدید
password_incorrect=گذرواژه فعلی شما اشتباه است.
diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini
index f038532460..c0710f2cd8 100644
--- a/options/locale/locale_fi-FI.ini
+++ b/options/locale/locale_fi-FI.ini
@@ -500,7 +500,7 @@ delete_current_avatar=Poista nykyinen profiilikuva
uploaded_avatar_not_a_image=Palvelimelle lähetetty tiedosto ei ole kuva.
update_avatar_success=Profiilikuva on päivitetty.
-change_password=Päivitä salasana
+update_password=Päivitä salasana
old_password=Nykyinen salasana
new_password=Uusi salasana
password_incorrect=Nykyinen salasanasi on virheellinen.
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index dfb0422991..7c41c3e4e4 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -706,7 +706,7 @@ uploaded_avatar_is_too_big=La taille du fichier téléversé (%d Kio) dépasse l
update_avatar_success=Votre avatar a été mis à jour.
update_user_avatar_success=L'avatar de l'utilisateur a été mis à jour.
-change_password=Modifier le mot de passe
+update_password=Modifier le mot de passe
old_password=Mot de passe actuel
new_password=Nouveau mot de passe
retype_new_password=Confirmer le nouveau mot de passe
diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini
index 05d3682147..d61c40671c 100644
--- a/options/locale/locale_hu-HU.ini
+++ b/options/locale/locale_hu-HU.ini
@@ -425,7 +425,7 @@ delete_current_avatar=Jelenlegi profilkép törlése
uploaded_avatar_not_a_image=A feltöltött fájl nem kép.
update_avatar_success=A profilképe frissítve lett.
-change_password=Jelszó frissítése
+update_password=Jelszó frissítése
old_password=Jelenlegi jelszó
new_password=Új jelszó
password_incorrect=A megadott jelenlegi jelszó helytelen.
diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini
index 444d13745f..9e1065756d 100644
--- a/options/locale/locale_id-ID.ini
+++ b/options/locale/locale_id-ID.ini
@@ -347,7 +347,7 @@ delete_current_avatar=Hapus Avatar Saat Ini
uploaded_avatar_not_a_image=Berkas yang diunggah bukanlah gambar.
update_avatar_success=Avatar Anda telah diperbarui.
-change_password=Perbarui kata sandi
+update_password=Perbarui kata sandi
old_password=Kata Sandi Saat Ini
new_password=Kata Sandi Baru
password_incorrect=Kata sandi saat ini salah.
diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini
index b68777a1de..a51b8c0a44 100644
--- a/options/locale/locale_is-IS.ini
+++ b/options/locale/locale_is-IS.ini
@@ -472,7 +472,7 @@ uploaded_avatar_not_a_image=Skráin sem hlaðin var upp er ekki mynd.
update_avatar_success=Notandamynd þín hefur verið uppfærð.
update_user_avatar_success=Notandamynd þessara notanda hefur verið uppfærð.
-change_password=Uppfæra Lykilorð
+update_password=Uppfæra Lykilorð
old_password=Núverandi Lykilorð
new_password=Nýtt Lykilorð
password_incorrect=Núverandi lykilorðið er rangt.
diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini
index 82e089111f..191242731c 100644
--- a/options/locale/locale_it-IT.ini
+++ b/options/locale/locale_it-IT.ini
@@ -569,7 +569,7 @@ uploaded_avatar_not_a_image=Il file caricato non è un'immagine.
update_avatar_success=Il tuo avatar è stato aggiornato.
update_user_avatar_success=L'avatar dell'utente è stato aggiornato.
-change_password=Aggiorna Password
+update_password=Aggiorna Password
old_password=Password attuale
new_password=Nuova Password
password_incorrect=La password attuale non è corretta.
diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini
index 3232e1fca8..ba0813ace4 100644
--- a/options/locale/locale_ja-JP.ini
+++ b/options/locale/locale_ja-JP.ini
@@ -702,7 +702,7 @@ uploaded_avatar_is_too_big=アップロードされたファイルサイズ(%d K
update_avatar_success=アバターを更新しました。
update_user_avatar_success=ユーザーのアバターを更新しました。
-change_password=パスワードを更新
+update_password=パスワードを更新
old_password=現在のパスワード
new_password=新しいパスワード
retype_new_password=新しいパスワードの確認
diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini
index a64094e7da..b10f146759 100644
--- a/options/locale/locale_ko-KR.ini
+++ b/options/locale/locale_ko-KR.ini
@@ -403,7 +403,7 @@ delete_current_avatar=현재 아바타 삭제
uploaded_avatar_not_a_image=업로드 된 파일은 이미지가 아닙니다.
update_avatar_success=아바타가 변경되었습니다.
-change_password=비밀번호 변경
+update_password=비밀번호 변경
old_password=현재 비밀번호
new_password=새 비밀번호
password_incorrect=현재 비밀번호가 올바르지 않습니다.
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index 9d2f6484dc..3057b871c7 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -661,7 +661,7 @@ uploaded_avatar_not_a_image=Augšupielādētais fails nav attēls.
update_avatar_success=Profila attēls tika saglabāts.
update_user_avatar_success=Lietotāja profila attēls tika atjaunots.
-change_password=Mainīt paroli
+update_password=Mainīt paroli
old_password=Pašreizējā parole
new_password=Jauna parole
password_incorrect=Ievadīta nepareiza pašreizējā parole.
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index 5649570de1..4d7a5b3024 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -695,7 +695,7 @@ uploaded_avatar_not_a_image=Het geüploade bestand is geen afbeelding.
update_avatar_success=Je avatar is bijgewerkt.
update_user_avatar_success=De avatar van de gebruiker is bijgewerkt.
-change_password=Wachtwoord bijwerken
+update_password=Wachtwoord bijwerken
old_password=Huidige wachtwoord
new_password=Nieuw wachtwoord
password_incorrect=Het wachtwoord is niet correct.
@@ -3471,4 +3471,4 @@ component_loading_info = Dit kan even duren…
component_failed_to_load = Er is een onverwachte fout opgetreden.
contributors.what = bijdragen
component_loading_failed = %s kon niet worden geladen
-component_loading = Bezig met laden van %s...
\ No newline at end of file
+component_loading = Bezig met laden van %s...
diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini
index 0337580928..c26a19d9e3 100644
--- a/options/locale/locale_pl-PL.ini
+++ b/options/locale/locale_pl-PL.ini
@@ -553,7 +553,7 @@ 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
+update_password=Aktualizuj hasło
old_password=Aktualne hasło
new_password=Nowe hasło
password_incorrect=Bieżące hasło nie jest prawidłowe.
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index 66a637245b..0eec655460 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -705,7 +705,7 @@ uploaded_avatar_is_too_big=O tamanho do arquivo enviado (%d KiB) excede o tamanh
update_avatar_success=Seu avatar foi atualizado.
update_user_avatar_success=O avatar do usuário foi atualizado.
-change_password=Atualizar senha
+update_password=Atualizar senha
old_password=Senha atual
new_password=Nova senha
retype_new_password=Confirmar nova senha
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index bf0e624502..0a6eb11365 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -688,7 +688,7 @@ uploaded_avatar_is_too_big=O tamanho do ficheiro carregado (%d KiB) excede o tam
update_avatar_success=O seu avatar foi substituído.
update_user_avatar_success=O avatar do utilizador foi modificado.
-change_password=Substituir a senha
+update_password=Substituir a senha
old_password=Senha corrente
new_password=Nova senha
retype_new_password=Confirme a nova senha
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 0e1f1cc396..a7c5bec349 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -707,7 +707,7 @@ uploaded_avatar_is_too_big=Размер загружаемого файла (%d
update_avatar_success=Ваш аватар был изменен.
update_user_avatar_success=Аватар пользователя обновлён.
-change_password=Обновить пароль
+update_password=Обновить пароль
old_password=Текущий пароль
new_password=Новый пароль
retype_new_password=Подтверждение нового пароля
@@ -3636,4 +3636,4 @@ component_loading_failed = Не удалось загрузить %s
component_failed_to_load = Случилась непредвиденная ошибка.
contributors.what = участие
component_loading = Загрузка %s...
-component_loading_info = Это займёт некоторое время…
\ No newline at end of file
+component_loading_info = Это займёт некоторое время…
diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini
index 8ba8eaedb6..885907df15 100644
--- a/options/locale/locale_si-LK.ini
+++ b/options/locale/locale_si-LK.ini
@@ -513,7 +513,7 @@ uploaded_avatar_not_a_image=උඩුගත කරන ලද ගොනුව ර
update_avatar_success=ඔබගේ අවතාරය යාවත්කාලීන කර ඇත.
update_user_avatar_success=පරිශීලකයාගේ අවතාරය යාවත්කාලීන කර ඇත.
-change_password=මුරපදය යාවත්කාල කරන්න
+update_password=මුරපදය යාවත්කාල කරන්න
old_password=වත්මන් මුරපදය
new_password=නව මුරපදය
password_incorrect=වත්මන් මුරපදය වැරදිය.
diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini
index 85e0b2b93d..c8fe29e56d 100644
--- a/options/locale/locale_sk-SK.ini
+++ b/options/locale/locale_sk-SK.ini
@@ -642,7 +642,7 @@ uploaded_avatar_not_a_image=Nahraný súbor nieje obrázok.
update_avatar_success=Váš avatar sa aktualizoval.
update_user_avatar_success=Užívateľov avatar bol aktualizovaný.
-change_password=Aktualizovať heslo
+update_password=Aktualizovať heslo
old_password=Aktuálne heslo
new_password=Nové heslo
password_incorrect=Aktuálne heslo nie je správne.
diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini
index 4a4aa1377a..5fc59990bb 100644
--- a/options/locale/locale_sl.ini
+++ b/options/locale/locale_sl.ini
@@ -363,4 +363,4 @@ show_only_unarchived = Prikaz samo nearhiviranih
show_private = Zasebno
show_both_private_public = Prikaz javnih in zasebnih
show_only_private = Prikaz samo zasebno
-issues.in_your_repos = V vašem repozitorijev
\ No newline at end of file
+issues.in_your_repos = V vašem repozitorijev
diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini
index 8eb27d2d6b..2e520b3b84 100644
--- a/options/locale/locale_sv-SE.ini
+++ b/options/locale/locale_sv-SE.ini
@@ -448,7 +448,7 @@ delete_current_avatar=Tag bort aktuell avatar
uploaded_avatar_not_a_image=Den uppladdade filen är inte en bild.
update_avatar_success=Din avatar har blivit uppdaterad.
-change_password=Ändra Lösenordet
+update_password=Ändra Lösenordet
old_password=Nuvarande lösenord
new_password=Nytt lösenord
password_incorrect=Det nuvarande lösenordet är felaktigt.
diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini
index 094a970f42..6edc30d1f8 100644
--- a/options/locale/locale_tr-TR.ini
+++ b/options/locale/locale_tr-TR.ini
@@ -688,7 +688,7 @@ uploaded_avatar_is_too_big=Yüklenen dosyanın boyutu (%d KiB), azami boyutu (%d
update_avatar_success=Profil resminiz değiştirildi.
update_user_avatar_success=Kullanıcının avatarı güncellendi.
-change_password=Parolayı Güncelle
+update_password=Parolayı Güncelle
old_password=Mevcut Parola
new_password=Yeni Parola
retype_new_password=Yeni Parolayı Onayla
diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini
index 07bb39324a..376e7efb9e 100644
--- a/options/locale/locale_uk-UA.ini
+++ b/options/locale/locale_uk-UA.ini
@@ -589,7 +589,7 @@ uploaded_avatar_not_a_image=Завантажений файл не є зобра
update_avatar_success=Ваш аватар був змінений.
update_user_avatar_success=Аватар користувача оновлено.
-change_password=Оновити пароль
+update_password=Оновити пароль
old_password=Поточний пароль
new_password=Новий пароль
password_incorrect=Поточний пароль неправильний.
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index ea1a6cf045..47bcf2639a 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -707,7 +707,7 @@ uploaded_avatar_is_too_big=上传的文件大小(%d KiB) 超过最大限制(%d K
update_avatar_success=您的头像已更新。
update_user_avatar_success=用户头像已更新。
-change_password=更新密码
+update_password=更新密码
old_password=当前密码
new_password=新的密码
retype_new_password=确认新密码
diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini
index 604f727292..0cdf8f3ceb 100644
--- a/options/locale/locale_zh-TW.ini
+++ b/options/locale/locale_zh-TW.ini
@@ -641,7 +641,7 @@ uploaded_avatar_not_a_image=上傳的檔案不是圖片
update_avatar_success=您的大頭貼已更新
update_user_avatar_success=已更新使用者的大頭貼。
-change_password=更新密碼
+update_password=更新密碼
old_password=目前的密碼
new_password=新的密碼
retype_new_password=確認新密碼
diff --git a/templates/user/auth/change_passwd_inner.tmpl b/templates/user/auth/change_passwd_inner.tmpl
index cffc798a64..74c2b1a561 100644
--- a/templates/user/auth/change_passwd_inner.tmpl
+++ b/templates/user/auth/change_passwd_inner.tmpl
@@ -2,7 +2,7 @@
{{template "base/alert" .}}
{{end}}
From bf7fb89178f41c712b8a8863667a442ec1e1c5d4 Mon Sep 17 00:00:00 2001
From: "Panagiotis \"Ivory\" Vasilopoulos"
Date: Fri, 23 Feb 2024 01:26:17 +0100
Subject: [PATCH 081/807] [UI] Agit: Add AGit label to AGit-created PRs
Adds a label to Pull Requests that were created using AGit-Flow,
in order to prevent situations where a contributor uses AGit-Flow
to push new changes - only to realize that they did not use AGit-Flow
in the first place, and that they just opened a new PR accidentally
(that was me).
Also intended to raise general awareness about the feature. Some
additional work, such as adding a tooltip, still needs to be
done.
A small typo fix for a comment and (exclusively) formatting fixes
in the copyright header are also included.
Refs: https://codeberg.org/forgejo/forgejo/issues/2433
---
options/locale/locale_en-US.ini | 1 +
routers/web/repo/pull.go | 10 ++++++++--
templates/repo/issue/view_title.tmpl | 10 +++++++++-
tests/integration/git_test.go | 26 +++++++++++++++++++++++++-
4 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index bdae9a29ac..8253c6ced5 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -1505,6 +1505,7 @@ issues.action_check_all = Check/Uncheck all items
issues.opened_by = opened %[1]s by %[3]s
pulls.merged_by = by %[3]s was merged %[1]s
pulls.merged_by_fake = by %[2]s was merged %[1]s
+pulls.made_using_agit = AGit
issues.closed_by = by %[3]s was closed %[1]s
issues.opened_by_fake = opened %[1]s by %[2]s
issues.closed_by_fake = by %[2]s was closed %[1]s
diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go
index ab821f8884..ac244b1551 100644
--- a/routers/web/repo/pull.go
+++ b/routers/web/repo/pull.go
@@ -1,5 +1,6 @@
-// Copyright 2018 The Gitea Authors.
-// Copyright 2014 The Gogs Authors.
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Copyright 2018 The Gitea Authors. All rights reserved.
+// Copyright 2024 The Forgejo Authors. All rights reserved.
// All rights reserved.
// SPDX-License-Identifier: MIT
@@ -381,6 +382,11 @@ func setMergeTarget(ctx *context.Context, pull *issues_model.PullRequest) {
} else {
ctx.Data["HeadTarget"] = pull.MustHeadUserName(ctx) + "/" + pull.HeadRepo.Name + ":" + pull.HeadBranch
}
+
+ if pull.Flow == issues_model.PullRequestFlowAGit {
+ ctx.Data["MadeUsingAGit"] = true
+ }
+
ctx.Data["BaseTarget"] = pull.BaseBranch
ctx.Data["HeadBranchLink"] = pull.GetHeadBranchLink(ctx)
ctx.Data["BaseBranchLink"] = pull.GetBaseBranchLink(ctx)
diff --git a/templates/repo/issue/view_title.tmpl b/templates/repo/issue/view_title.tmpl
index 582e9864fb..8a5954681b 100644
--- a/templates/repo/issue/view_title.tmpl
+++ b/templates/repo/issue/view_title.tmpl
@@ -47,7 +47,9 @@
{{if .HeadBranchLink}}
{{$headHref = printf `%s` (.HeadBranchLink | Escape) $headHref}}
{{end}}
- {{$headHref = printf `%s ` $headHref (ctx.Locale.Tr "copy_branch") (.HeadTarget | Escape) (svg "octicon-copy" 14)}}
+ {{if not .MadeUsingAGit}}
+ {{$headHref = printf `%s ` $headHref (ctx.Locale.Tr "copy_branch") (.HeadTarget | Escape) (svg "octicon-copy" 14)}}
+ {{end}}
{{$baseHref := .BaseTarget|Escape}}
{{if .BaseBranchLink}}
{{$baseHref = printf `%s` (.BaseBranchLink | Escape) $baseHref}}
@@ -70,6 +72,12 @@
{{ctx.Locale.Tr "repo.pulls.title_desc" .NumCommits ($headHref|Safe) ($baseHref|Safe)}}
{{end}}
+ {{if .MadeUsingAGit}}
+ {{/* TODO: Add tooltip and a link to the documentation */}}
+
+ {{ctx.Locale.Tr "repo.pulls.made_using_agit"}}
+
+ {{end}}
diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go
index d02427ffcf..ead649490e 100644
--- a/tests/integration/git_test.go
+++ b/tests/integration/git_test.go
@@ -450,7 +450,7 @@ func doMergeFork(ctx, baseCtx APITestContext, baseBranch, headBranch string) fun
var pr api.PullRequest
var err error
- // Create a test pullrequest
+ // Create a test pull request
t.Run("CreatePullRequest", func(t *testing.T) {
pr, err = doAPICreatePullRequest(ctx, baseCtx.Username, baseCtx.Reponame, baseBranch, headBranch)(t)
assert.NoError(t, err)
@@ -470,6 +470,19 @@ func doMergeFork(ctx, baseCtx APITestContext, baseBranch, headBranch string) fun
}
t.Run("EnsureCanSeePull", doEnsureCanSeePull(headCtx, pr, true))
+ // Confirm that there is no AGit Label
+ // TODO: Refactor and move this check to a function
+ t.Run("AGitLabelIsMissing", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ session := loginUser(t, ctx.Username)
+
+ req := NewRequest(t, "GET", fmt.Sprintf("/%s/%s/pulls/%d", baseCtx.Username, baseCtx.Reponame, pr.Index))
+ resp := session.MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ htmlDoc.AssertElement(t, "#agit-label", false)
+ })
+
// Then get the diff string
var diffHash string
var diffLength int
@@ -813,6 +826,17 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, baseBranch, headB
return
}
+ t.Run("AGitLabelIsPresent", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ session := loginUser(t, ctx.Username)
+
+ req := NewRequest(t, "GET", fmt.Sprintf("/%s/%s/pulls/%d", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame), pr2.Index))
+ resp := session.MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ htmlDoc.AssertElement(t, "#agit-label", true)
+ })
+
t.Run("AddCommit2", func(t *testing.T) {
err := os.WriteFile(path.Join(dstPath, "test_file"), []byte("## test content \n ## test content 2"), 0o666)
if !assert.NoError(t, err) {
From f0ed6de89da27ec4d908a5a807fd5da4fbe62b7f Mon Sep 17 00:00:00 2001
From: Gusted
Date: Fri, 23 Feb 2024 21:42:15 +0100
Subject: [PATCH 082/807] [FEAT] Check if commit is already present in target
branch
- Check if someone is (accidentally) trying to create a pull request via
AGit with changes already in the target branch and fail if that is the
case.
- Added integration test.
---
services/agit/agit.go | 15 +++++++++++++++
tests/integration/git_test.go | 23 +++++++++++++++++++----
2 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/services/agit/agit.go b/services/agit/agit.go
index 35bfb33402..4c970ee78a 100644
--- a/services/agit/agit.go
+++ b/services/agit/agit.go
@@ -101,6 +101,21 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git.
return nil, fmt.Errorf("failed to get unmerged AGit flow pull request in repository %q: %w", repo.FullName(), err)
}
+ // Check if the changes are already in the target branch.
+ stdout, _, gitErr := git.NewCommand(ctx, "branch", "--contains").AddDynamicArguments(opts.NewCommitIDs[i], baseBranchName).RunStdString(&git.RunOpts{Dir: repo.RepoPath()})
+ if gitErr != nil {
+ return nil, fmt.Errorf("failed to check if the target branch already contains the new commit in repository %q: %w", repo.FullName(), err)
+ }
+ if len(stdout) > 0 {
+ results = append(results, private.HookProcReceiveRefResult{
+ OriginalRef: opts.RefFullNames[i],
+ OldOID: opts.OldCommitIDs[i],
+ NewOID: opts.NewCommitIDs[i],
+ Err: "The target branch already contains this commit",
+ })
+ continue
+ }
+
// Automatically fill out the title and the description from the first commit.
shouldGetCommit := len(title) == 0 || len(description) == 0
diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go
index d02427ffcf..125950a3a5 100644
--- a/tests/integration/git_test.go
+++ b/tests/integration/git_test.go
@@ -937,13 +937,13 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, baseBranch, headB
})
})
+ upstreamGitRepo, err := git.OpenRepository(git.DefaultContext, filepath.Join(setting.RepoRootPath, ctx.Username, ctx.Reponame+".git"))
+ require.NoError(t, err)
+ defer upstreamGitRepo.Close()
+
t.Run("Force push", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
- upstreamGitRepo, err := git.OpenRepository(git.DefaultContext, filepath.Join(setting.RepoRootPath, ctx.Username, ctx.Reponame+".git"))
- require.NoError(t, err)
- defer upstreamGitRepo.Close()
-
_, _, gitErr := git.NewCommand(git.DefaultContext, "push", "origin").AddDynamicArguments("HEAD:refs/for/master/" + headBranch + "-force-push").RunStdString(&git.RunOpts{Dir: dstPath})
require.NoError(t, gitErr)
@@ -984,6 +984,21 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, baseBranch, headB
})
})
+ t.Run("Branch already contains commit", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ branchCommit, err := upstreamGitRepo.GetBranchCommit("master")
+ require.NoError(t, err)
+
+ _, _, gitErr := git.NewCommand(git.DefaultContext, "reset", "--hard").AddDynamicArguments(branchCommit.ID.String() + "~1").RunStdString(&git.RunOpts{Dir: dstPath})
+ require.NoError(t, gitErr)
+
+ _, stdErr, gitErr := git.NewCommand(git.DefaultContext, "push", "origin").AddDynamicArguments("HEAD:refs/for/master/" + headBranch + "-already-contains").RunStdString(&git.RunOpts{Dir: dstPath})
+ assert.Error(t, gitErr)
+
+ assert.Contains(t, stdErr, "already contains this commit")
+ })
+
t.Run("Merge", doAPIMergePullRequest(*ctx, ctx.Username, ctx.Reponame, pr1.Index))
t.Run("CheckoutMasterAgain", doGitCheckoutBranch(dstPath, "master"))
}
From a4b0c0edc55dbc3659f4b89fd8e56abad682fbc0 Mon Sep 17 00:00:00 2001
From: Lucas Hinderberger
Date: Sat, 24 Feb 2024 00:06:53 +0100
Subject: [PATCH 083/807] Fixes #2452 - Skipping SHA256 tests if unsupported
The test suite was broken e.g. on Debian 12 due to requiring a very
recent version of Git installed on the system. This commit skips SHA256
tests in the git module, if a Git version older than 2.42 or gogit is used.
---
modules/git/blame_sha256_test.go | 2 ++
modules/git/commit_sha256_test.go | 14 ++++++++++++++
modules/git/utils_test.go | 16 ++++++++++++++++
3 files changed, 32 insertions(+)
create mode 100644 modules/git/utils_test.go
diff --git a/modules/git/blame_sha256_test.go b/modules/git/blame_sha256_test.go
index 01de0454a3..92f8b5b02a 100644
--- a/modules/git/blame_sha256_test.go
+++ b/modules/git/blame_sha256_test.go
@@ -11,6 +11,8 @@ import (
)
func TestReadingBlameOutputSha256(t *testing.T) {
+ skipIfSHA256NotSupported(t)
+
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
diff --git a/modules/git/commit_sha256_test.go b/modules/git/commit_sha256_test.go
index 82112cb409..916169f4e2 100644
--- a/modules/git/commit_sha256_test.go
+++ b/modules/git/commit_sha256_test.go
@@ -14,6 +14,8 @@ import (
)
func TestCommitsCountSha256(t *testing.T) {
+ skipIfSHA256NotSupported(t)
+
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
commitsCount, err := CommitsCount(DefaultContext,
@@ -27,6 +29,8 @@ func TestCommitsCountSha256(t *testing.T) {
}
func TestCommitsCountWithoutBaseSha256(t *testing.T) {
+ skipIfSHA256NotSupported(t)
+
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
commitsCount, err := CommitsCount(DefaultContext,
@@ -41,6 +45,8 @@ func TestCommitsCountWithoutBaseSha256(t *testing.T) {
}
func TestGetFullCommitIDSha256(t *testing.T) {
+ skipIfSHA256NotSupported(t)
+
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
id, err := GetFullCommitID(DefaultContext, bareRepo1Path, "f004f4")
@@ -49,6 +55,8 @@ func TestGetFullCommitIDSha256(t *testing.T) {
}
func TestGetFullCommitIDErrorSha256(t *testing.T) {
+ skipIfSHA256NotSupported(t)
+
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
id, err := GetFullCommitID(DefaultContext, bareRepo1Path, "unknown")
@@ -59,6 +67,8 @@ func TestGetFullCommitIDErrorSha256(t *testing.T) {
}
func TestCommitFromReaderSha256(t *testing.T) {
+ skipIfSHA256NotSupported(t)
+
commitString := `9433b2a62b964c17a4485ae180f45f595d3e69d31b786087775e28c6b6399df0 commit 1114
tree e7f9e96dd79c09b078cac8b303a7d3b9d65ff9b734e86060a4d20409fd379f9e
parent 26e9ccc29fad747e9c5d9f4c9ddeb7eff61cc45ef6a8dc258cbeb181afc055e8
@@ -131,6 +141,8 @@ signed commit`, commitFromReader.Signature.Payload)
}
func TestHasPreviousCommitSha256(t *testing.T) {
+ skipIfSHA256NotSupported(t)
+
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256")
repo, err := openRepositoryWithDefaultContext(bareRepo1Path)
@@ -159,6 +171,8 @@ func TestHasPreviousCommitSha256(t *testing.T) {
}
func TestGetCommitFileStatusMergesSha256(t *testing.T) {
+ skipIfSHA256NotSupported(t)
+
bareRepo1Path := filepath.Join(testReposDir, "repo6_merge_sha256")
commitFileStatus, err := GetCommitFileStatus(DefaultContext, bareRepo1Path, "d2e5609f630dd8db500f5298d05d16def282412e3e66ed68cc7d0833b29129a1")
diff --git a/modules/git/utils_test.go b/modules/git/utils_test.go
new file mode 100644
index 0000000000..3a05b6a291
--- /dev/null
+++ b/modules/git/utils_test.go
@@ -0,0 +1,16 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package git
+
+import "testing"
+
+// This file contains utility functions that are used across multiple tests,
+// but not in production code.
+
+func skipIfSHA256NotSupported(t *testing.T) {
+ if isGogit || CheckGitVersionAtLeast("2.42") != nil {
+ t.Skip("skipping because installed Git version doesn't support SHA256")
+ }
+}
+
From c8ae3498e7648a06d4f2ac3c43d3b16e1e555528 Mon Sep 17 00:00:00 2001
From: Lucas Hinderberger
Date: Sat, 24 Feb 2024 15:53:38 +0100
Subject: [PATCH 084/807] gofmt-ed modules/git/utils_test.go due to linter
---
modules/git/utils_test.go | 1 -
1 file changed, 1 deletion(-)
diff --git a/modules/git/utils_test.go b/modules/git/utils_test.go
index 3a05b6a291..876a22924c 100644
--- a/modules/git/utils_test.go
+++ b/modules/git/utils_test.go
@@ -13,4 +13,3 @@ func skipIfSHA256NotSupported(t *testing.T) {
t.Skip("skipping because installed Git version doesn't support SHA256")
}
}
-
From 8a5a7a88be7a5a4d11d0f482f84b9275534d0837 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Sun, 25 Feb 2024 09:54:25 +0100
Subject: [PATCH 085/807] [REFACTOR] cli: prepareWorkPathAndCustomConf is not
just for actions
Split prepareWorkPathAndCustomConf out of the actions sub-command.
In the CLI prepareWorkPathAndCustomConf is a preparation step that is
needed before running the sub-command actions in the Forgejo CLI. It
is currently specific to this sub-command but it will be useful for
other sub-commands such as F3.
---
cmd/forgejo/actions.go | 28 ++++------------------------
cmd/forgejo/forgejo.go | 22 ++++++++++++++++++++++
2 files changed, 26 insertions(+), 24 deletions(-)
diff --git a/cmd/forgejo/actions.go b/cmd/forgejo/actions.go
index afda831227..fc6b5f70f7 100644
--- a/cmd/forgejo/actions.go
+++ b/cmd/forgejo/actions.go
@@ -35,7 +35,8 @@ func SubcmdActionsGenerateRunnerToken(ctx context.Context) *cli.Command {
return &cli.Command{
Name: "generate-runner-token",
Usage: "Generate a new token for a runner to use to register with the server",
- Action: prepareWorkPathAndCustomConf(ctx, func(cliCtx *cli.Context) error { return RunGenerateActionsRunnerToken(ctx, cliCtx) }),
+ Before: prepareWorkPathAndCustomConf(ctx),
+ Action: func(cliCtx *cli.Context) error { return RunGenerateActionsRunnerToken(ctx, cliCtx) },
Flags: []cli.Flag{
&cli.StringFlag{
Name: "scope",
@@ -59,7 +60,8 @@ func SubcmdActionsRegister(ctx context.Context) *cli.Command {
return &cli.Command{
Name: "register",
Usage: "Idempotent registration of a runner using a shared secret",
- Action: prepareWorkPathAndCustomConf(ctx, func(cliCtx *cli.Context) error { return RunRegister(ctx, cliCtx) }),
+ Before: prepareWorkPathAndCustomConf(ctx),
+ Action: func(cliCtx *cli.Context) error { return RunRegister(ctx, cliCtx) },
Flags: []cli.Flag{
&cli.StringFlag{
Name: "secret",
@@ -219,25 +221,3 @@ func RunGenerateActionsRunnerToken(ctx context.Context, cliCtx *cli.Context) err
}
return nil
}
-
-func prepareWorkPathAndCustomConf(ctx context.Context, action cli.ActionFunc) func(cliCtx *cli.Context) error {
- return func(cliCtx *cli.Context) error {
- if !ContextGetNoInit(ctx) {
- var args setting.ArgWorkPathAndCustomConf
- // from children to parent, check the global flags
- for _, curCtx := range cliCtx.Lineage() {
- if curCtx.IsSet("work-path") && args.WorkPath == "" {
- args.WorkPath = curCtx.String("work-path")
- }
- if curCtx.IsSet("custom-path") && args.CustomPath == "" {
- args.CustomPath = curCtx.String("custom-path")
- }
- if curCtx.IsSet("config") && args.CustomConf == "" {
- args.CustomConf = curCtx.String("config")
- }
- }
- setting.InitWorkPathAndCommonConfig(os.Getenv, args)
- }
- return action(cliCtx)
- }
-}
diff --git a/cmd/forgejo/forgejo.go b/cmd/forgejo/forgejo.go
index affb39157a..710996e1c0 100644
--- a/cmd/forgejo/forgejo.go
+++ b/cmd/forgejo/forgejo.go
@@ -145,3 +145,25 @@ func handleCliResponseExtra(ctx context.Context, extra private.ResponseExtra) er
}
return cli.Exit(extra.Error, 1)
}
+
+func prepareWorkPathAndCustomConf(ctx context.Context) func(c *cli.Context) error {
+ return func(c *cli.Context) error {
+ if !ContextGetNoInit(ctx) {
+ var args setting.ArgWorkPathAndCustomConf
+ // from children to parent, check the global flags
+ for _, curCtx := range c.Lineage() {
+ if curCtx.IsSet("work-path") && args.WorkPath == "" {
+ args.WorkPath = curCtx.String("work-path")
+ }
+ if curCtx.IsSet("custom-path") && args.CustomPath == "" {
+ args.CustomPath = curCtx.String("custom-path")
+ }
+ if curCtx.IsSet("config") && args.CustomConf == "" {
+ args.CustomConf = curCtx.String("config")
+ }
+ }
+ setting.InitWorkPathAndCommonConfig(os.Getenv, args)
+ }
+ return nil
+ }
+}
From 9372bdd4a3ecced0cca58c8da7c1940799525937 Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Sun, 25 Feb 2024 10:52:11 +0100
Subject: [PATCH 086/807] Move permission check from ArtifactsDeleteView to the
route
As suggested by @Gusted in #2431, move the permission checking from
`ArtifactsDeleteView` into the route instead, where it belongs.
Signed-off-by: Gergely Nagy
---
routers/web/repo/actions/view.go | 5 -----
routers/web/web.go | 2 +-
2 files changed, 1 insertion(+), 6 deletions(-)
diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go
index 903ff2632f..abef5325f7 100644
--- a/routers/web/repo/actions/view.go
+++ b/routers/web/repo/actions/view.go
@@ -579,11 +579,6 @@ func ArtifactsView(ctx *context_module.Context) {
}
func ArtifactsDeleteView(ctx *context_module.Context) {
- if !ctx.Repo.CanWrite(unit.TypeActions) {
- ctx.Error(http.StatusForbidden, "no permission")
- return
- }
-
runIndex := ctx.ParamsInt64("run")
artifactName := ctx.Params("artifact_name")
diff --git a/routers/web/web.go b/routers/web/web.go
index 0684b2ac82..f4d657fb78 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -1401,7 +1401,7 @@ func registerRoutes(m *web.Route) {
m.Post("/approve", reqRepoActionsWriter, actions.Approve)
m.Post("/artifacts", actions.ArtifactsView)
m.Get("/artifacts/{artifact_name}", actions.ArtifactsDownloadView)
- m.Delete("/artifacts/{artifact_name}", actions.ArtifactsDeleteView)
+ m.Delete("/artifacts/{artifact_name}", reqRepoActionsWriter, actions.ArtifactsDeleteView)
m.Post("/rerun", reqRepoActionsWriter, actions.Rerun)
})
})
From 186f1f5669843b39f364d05a8953a57c57aac4af Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Sun, 25 Feb 2024 15:59:12 +0500
Subject: [PATCH 087/807] [THEME] refactor display of 404/500 error pages
---
templates/status/404.tmpl | 2 +-
templates/status/500.tmpl | 5 ++++-
web_src/css/base.css | 10 ++++++++++
3 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/templates/status/404.tmpl b/templates/status/404.tmpl
index 695dd78c85..c73ee34774 100644
--- a/templates/status/404.tmpl
+++ b/templates/status/404.tmpl
@@ -2,7 +2,7 @@
+{{end}}
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 0b330a89ee..18ab544415 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -20565,6 +20565,10 @@
"description": "GeneralRepoSettings contains global repository settings exposed by API",
"type": "object",
"properties": {
+ "forks_disabled": {
+ "type": "boolean",
+ "x-go-name": "ForksDisabled"
+ },
"http_git_disabled": {
"type": "boolean",
"x-go-name": "HTTPGitDisabled"
diff --git a/tests/integration/api_fork_test.go b/tests/integration/api_fork_test.go
index 7c231415a3..87d2a10152 100644
--- a/tests/integration/api_fork_test.go
+++ b/tests/integration/api_fork_test.go
@@ -1,13 +1,18 @@
// Copyright 2017 The Gogs Authors. All rights reserved.
+// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"net/http"
+ "net/url"
"testing"
+ "code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/modules/test"
+ "code.gitea.io/gitea/routers"
"code.gitea.io/gitea/tests"
)
@@ -16,3 +21,27 @@ func TestCreateForkNoLogin(t *testing.T) {
req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{})
MakeRequest(t, req, http.StatusUnauthorized)
}
+
+func TestAPIDisabledForkRepo(t *testing.T) {
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ defer test.MockVariableValue(&setting.Repository.DisableForks, true)()
+ defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())()
+
+ t.Run("fork listing", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/forks")
+ MakeRequest(t, req, http.StatusNotFound)
+ })
+
+ t.Run("forking", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ session := loginUser(t, "user5")
+ token := getTokenForLoggedInUser(t, session)
+
+ req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{}).AddTokenAuth(token)
+ session.MakeRequest(t, req, http.StatusNotFound)
+ })
+ })
+}
diff --git a/tests/integration/repo_fork_test.go b/tests/integration/repo_fork_test.go
index c6e3fed7a9..6c0cdc4339 100644
--- a/tests/integration/repo_fork_test.go
+++ b/tests/integration/repo_fork_test.go
@@ -1,4 +1,5 @@
// Copyright 2017 The Gitea Authors. All rights reserved.
+// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
@@ -14,6 +15,9 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/test"
+ "code.gitea.io/gitea/routers"
repo_service "code.gitea.io/gitea/services/repository"
"code.gitea.io/gitea/tests"
@@ -119,6 +123,48 @@ func TestRepoFork(t *testing.T) {
session.MakeRequest(t, req, http.StatusNotFound)
})
})
+
+ t.Run("DISABLE_FORKS", func(t *testing.T) {
+ defer test.MockVariableValue(&setting.Repository.DisableForks, true)()
+ defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())()
+
+ t.Run("fork button not present", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ // The "Fork" button should not appear on the repo home
+ req := NewRequest(t, "GET", "/user2/repo1")
+ resp := MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ htmlDoc.AssertElement(t, "[href=/user2/repo1/fork]", false)
+ })
+
+ t.Run("forking by URL", func(t *testing.T) {
+ t.Run("by name", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ // Forking by URL should be Not Found
+ req := NewRequest(t, "GET", "/user2/repo1/fork")
+ session.MakeRequest(t, req, http.StatusNotFound)
+ })
+
+ t.Run("by legacy URL", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ // Forking by legacy URL should be Not Found
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) // user2/repo1
+ req := NewRequestf(t, "GET", "/repo/fork/%d", repo.ID)
+ session.MakeRequest(t, req, http.StatusNotFound)
+ })
+ })
+
+ t.Run("fork listing", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ // Listing the forks should be Not Found, too
+ req := NewRequest(t, "GET", "/user2/repo1/forks")
+ MakeRequest(t, req, http.StatusNotFound)
+ })
+ })
})
}
From e34ead7a46a4a92bb8d7ff0e4cdeda5668d96077 Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Sun, 25 Feb 2024 17:03:09 +0500
Subject: [PATCH 089/807] [I18N] eliminate wrapping quotes
---
options/locale/locale_en-US.ini | 206 ++++++++++++++++----------------
1 file changed, 103 insertions(+), 103 deletions(-)
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 0931e86941..dc413f7f68 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -590,14 +590,14 @@ invalid_ssh_key = Cannot verify your SSH key: %s
invalid_gpg_key = Cannot verify your GPG key: %s
invalid_ssh_principal = Invalid principal: %s
must_use_public_key = The key you provided is a private key. Please do not upload your private key anywhere. Use your public key instead.
-unable_verify_ssh_key = "Cannot verify the SSH key, double-check it for mistakes."
+unable_verify_ssh_key = Cannot verify the SSH key, double-check it for mistakes.
auth_failed = Authentication failed: %v
-still_own_repo = "Your account owns one or more repositories, delete or transfer them first."
-still_has_org = "Your account is a member of one or more organizations, leave them first."
-still_own_packages = "Your account owns one or more packages, delete them first."
-org_still_own_repo = "This organization still owns one or more repositories, delete or transfer them first."
-org_still_own_packages = "This organization still owns one or more packages, delete them first."
+still_own_repo = Your account owns one or more repositories, delete or transfer them first.
+still_has_org = Your account is a member of one or more organizations, leave them first.
+still_own_packages = Your account owns one or more packages, delete them first.
+org_still_own_repo = This organization still owns one or more repositories, delete or transfer them first.
+org_still_own_packages = This organization still owns one or more packages, delete them first.
target_branch_not_exist = Target branch does not exist.
@@ -1123,7 +1123,7 @@ migrate.github_token_desc = You can put one or more tokens with comma separated
migrate.clone_local_path = or a local server path
migrate.permission_denied = You are not allowed to import local repositories.
migrate.permission_denied_blocked = You cannot import from disallowed hosts, please ask the admin to check ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS settings.
-migrate.invalid_local_path = "The local path is invalid. It doesn't exist or is not a directory."
+migrate.invalid_local_path = The local path is invalid. It doesn't exist or is not a directory.
migrate.invalid_lfs_endpoint = The LFS endpoint is not valid.
migrate.failed = Migration failed: %v
migrate.migrate_items_options = Access Token is required to migrate additional items
@@ -1366,30 +1366,30 @@ projects.edit = Edit Project
projects.edit_subheader = Projects organize issues and track progress.
projects.modify = Edit Project
projects.edit_success = Project "%s" has been updated.
-projects.type.none = "None"
-projects.type.basic_kanban = "Basic Kanban"
-projects.type.bug_triage = "Bug Triage"
-projects.template.desc = "Template"
-projects.template.desc_helper = "Select a project template to get started"
+projects.type.none = None
+projects.type.basic_kanban = Basic Kanban
+projects.type.bug_triage = Bug Triage
+projects.template.desc = Template
+projects.template.desc_helper = Select a project template to get started
projects.type.uncategorized = Uncategorized
-projects.column.edit = "Edit Column"
-projects.column.edit_title = "Name"
-projects.column.new_title = "Name"
-projects.column.new_submit = "Create Column"
-projects.column.new = "New Column"
-projects.column.set_default = "Set Default"
-projects.column.set_default_desc = "Set this column as default for uncategorized issues and pulls"
-projects.column.unset_default = "Unset Default"
-projects.column.unset_default_desc = "Unset this column as default"
-projects.column.delete = "Delete Column"
-projects.column.deletion_desc = "Deleting a project column moves all related issues to 'Uncategorized'. Continue?"
-projects.column.color = "Color"
+projects.column.edit = Edit Column
+projects.column.edit_title = Name
+projects.column.new_title = Name
+projects.column.new_submit = Create Column
+projects.column.new = New Column
+projects.column.set_default = Set Default
+projects.column.set_default_desc = Set this column as default for uncategorized issues and pulls
+projects.column.unset_default = Unset Default
+projects.column.unset_default_desc = Unset this column as default
+projects.column.delete = Delete Column
+projects.column.deletion_desc = Deleting a project column moves all related issues to 'Uncategorized'. Continue?
+projects.column.color = Color
projects.open = Open
projects.close = Close
projects.column.assigned_to = Assigned to
-projects.card_type.desc = "Card Previews"
-projects.card_type.images_and_text = "Images and Text"
-projects.card_type.text_only = "Text Only"
+projects.card_type.desc = Card Previews
+projects.card_type.images_and_text = Images and Text
+projects.card_type.text_only = Text Only
issues.desc = Organize bug reports, tasks and milestones.
issues.filter_assignees = Filter Assignee
@@ -1591,17 +1591,17 @@ issues.attachment.download = `Click to download "%s"`
issues.subscribe = Subscribe
issues.unsubscribe = Unsubscribe
issues.unpin_issue = Unpin Issue
-issues.max_pinned = "You can't pin more issues"
-issues.pin_comment = "pinned this %s"
-issues.unpin_comment = "unpinned this %s"
+issues.max_pinned = You can't pin more issues
+issues.pin_comment = pinned this %s
+issues.unpin_comment = unpinned this %s
issues.lock = Lock conversation
issues.unlock = Unlock conversation
issues.lock.unknown_reason = Cannot lock an issue with an unknown reason.
issues.lock_duplicate = An issue cannot be locked twice.
issues.unlock_error = Cannot unlock an issue that is not locked.
-issues.lock_with_reason = "locked as %s and limited conversation to collaborators %s"
-issues.lock_no_reason = "locked and limited conversation to collaborators %s"
-issues.unlock_comment = "unlocked this conversation %s"
+issues.lock_with_reason = locked as %s and limited conversation to collaborators %s
+issues.lock_no_reason = locked and limited conversation to collaborators %s
+issues.unlock_comment = unlocked this conversation %s
issues.lock_confirm = Lock
issues.unlock_confirm = Unlock
issues.lock.notice_1 = - Other users can’t add new comments to this issue.
@@ -1638,30 +1638,30 @@ issues.add_time_sum_to_small = No time was entered.
issues.time_spent_total = Total Time Spent
issues.time_spent_from_all_authors = `Total Time Spent: %s`
issues.due_date = Due Date
-issues.invalid_due_date_format = "Due date format must be 'yyyy-mm-dd'."
-issues.error_modifying_due_date = "Failed to modify the due date."
-issues.error_removing_due_date = "Failed to remove the due date."
-issues.push_commit_1 = "added %d commit %s"
-issues.push_commits_n = "added %d commits %s"
+issues.invalid_due_date_format = Due date format must be 'yyyy-mm-dd'.
+issues.error_modifying_due_date = Failed to modify the due date.
+issues.error_removing_due_date = Failed to remove the due date.
+issues.push_commit_1 = added %d commit %s
+issues.push_commits_n = added %d commits %s
issues.force_push_codes = `force-pushed %[1]s from %[2]s to %[4]s %[6]s`
issues.force_push_compare = Compare
-issues.due_date_form = "yyyy-mm-dd"
-issues.due_date_form_add = "Add due date"
-issues.due_date_form_edit = "Edit"
-issues.due_date_form_remove = "Remove"
-issues.due_date_not_writer = "You need write access to this repository in order to update the due date of an issue."
-issues.due_date_not_set = "No due date set."
-issues.due_date_added = "added the due date %s %s"
-issues.due_date_modified = "modified the due date from %[2]s to %[1]s %[3]s"
-issues.due_date_remove = "removed the due date %s %s"
-issues.due_date_overdue = "Overdue"
-issues.due_date_invalid = "The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'."
+issues.due_date_form = yyyy-mm-dd
+issues.due_date_form_add = Add due date
+issues.due_date_form_edit = Edit
+issues.due_date_form_remove = Remove
+issues.due_date_not_writer = You need write access to this repository in order to update the due date of an issue.
+issues.due_date_not_set = No due date set.
+issues.due_date_added = added the due date %s %s
+issues.due_date_modified = modified the due date from %[2]s to %[1]s %[3]s
+issues.due_date_remove = removed the due date %s %s
+issues.due_date_overdue = Overdue
+issues.due_date_invalid = The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
issues.dependency.title = Dependencies
issues.dependency.issue_no_dependencies = No dependencies set.
issues.dependency.pr_no_dependencies = No dependencies set.
-issues.dependency.no_permission_1 = "You do not have permission to read %d dependency"
-issues.dependency.no_permission_n = "You do not have permission to read %d dependencies"
-issues.dependency.no_permission.can_remove = "You do not have permission to read this dependency but can remove this dependency"
+issues.dependency.no_permission_1 = You do not have permission to read %d dependency
+issues.dependency.no_permission_n = You do not have permission to read %d dependencies
+issues.dependency.no_permission.can_remove = You do not have permission to read this dependency but can remove this dependency
issues.dependency.add = Add dependency…
issues.dependency.cancel = Cancel
issues.dependency.remove = Remove
@@ -1673,7 +1673,7 @@ issues.dependency.issue_closing_blockedby = Closing this issue is blocked by the
issues.dependency.issue_close_blocks = This issue blocks closing of the following issues
issues.dependency.pr_close_blocks = This pull request blocks closing of the following issues
issues.dependency.issue_close_blocked = You need to close all issues blocking this issue before you can close it.
-issues.dependency.issue_batch_close_blocked = "Cannot batch close chosen issues, because issue #%d still has open dependencies"
+issues.dependency.issue_batch_close_blocked = Cannot batch close chosen issues, because issue #%d still has open dependencies
issues.dependency.pr_close_blocked = You need to close all issues blocking this pull request before you can merge it.
issues.dependency.blocks_short = Blocks
issues.dependency.blocked_by_short = Depends on
@@ -1689,17 +1689,17 @@ issues.dependency.add_error_cannot_create_circular = You cannot create a depende
issues.dependency.add_error_dep_not_same_repo = Both issues must be in the same repository.
issues.review.self.approval = You cannot approve your own pull request.
issues.review.self.rejection = You cannot request changes on your own pull request.
-issues.review.approve = "approved these changes %s"
-issues.review.comment = "reviewed %s"
-issues.review.dismissed = "dismissed %s’s review %s"
+issues.review.approve = approved these changes %s
+issues.review.comment = reviewed %s
+issues.review.dismissed = dismissed %s’s review %s
issues.review.dismissed_label = Dismissed
issues.review.left_comment = left a comment
issues.review.content.empty = You need to leave a comment indicating the requested change(s).
-issues.review.reject = "requested changes %s"
-issues.review.wait = "was requested for review %s"
-issues.review.add_review_request = "requested review from %s %s"
-issues.review.remove_review_request = "removed review request for %s %s"
-issues.review.remove_review_request_self = "refused to review %s"
+issues.review.reject = requested changes %s
+issues.review.wait = was requested for review %s
+issues.review.add_review_request = requested review from %s %s
+issues.review.remove_review_request = removed review request for %s %s
+issues.review.remove_review_request_self = refused to review %s
issues.review.pending = Pending
issues.review.pending.tooltip = This comment is not currently visible to other users. To submit your pending comments, select "%s" -> "%s/%s/%s" at the top of the page.
issues.review.review = Review
@@ -1782,30 +1782,30 @@ pulls.add_prefix = Add %s prefix
pulls.remove_prefix = Remove %s prefix
pulls.data_broken = This pull request is broken due to missing fork information.
pulls.files_conflicted = This pull request has changes conflicting with the target branch.
-pulls.is_checking = "Merge conflict checking is in progress. Try again in few moments."
-pulls.is_ancestor = "This branch is already included in the target branch. There is nothing to merge."
-pulls.is_empty = "The changes on this branch are already on the target branch. This will be an empty commit."
+pulls.is_checking = Merge conflict checking is in progress. Try again in few moments.
+pulls.is_ancestor = This branch is already included in the target branch. There is nothing to merge.
+pulls.is_empty = The changes on this branch are already on the target branch. This will be an empty commit.
pulls.required_status_check_failed = Some required checks were not successful.
pulls.required_status_check_missing = Some required checks are missing.
pulls.required_status_check_administrator = As an administrator, you may still merge this pull request.
-pulls.blocked_by_approvals = "This pull request doesn't have enough approvals yet. %d of %d approvals granted."
-pulls.blocked_by_rejection = "This pull request has changes requested by an official reviewer."
-pulls.blocked_by_official_review_requests = "This pull request is blocked because it is missing approval from one or more official reviewers."
-pulls.blocked_by_outdated_branch = "This pull request is blocked because it's outdated."
-pulls.blocked_by_changed_protected_files_1= "This pull request is blocked because it changes a protected file:"
-pulls.blocked_by_changed_protected_files_n= "This pull request is blocked because it changes protected files:"
+pulls.blocked_by_approvals = This pull request doesn't have enough approvals yet. %d of %d approvals granted.
+pulls.blocked_by_rejection = This pull request has changes requested by an official reviewer.
+pulls.blocked_by_official_review_requests = This pull request is blocked because it is missing approval from one or more official reviewers.
+pulls.blocked_by_outdated_branch = This pull request is blocked because it's outdated.
+pulls.blocked_by_changed_protected_files_1= This pull request is blocked because it changes a protected file:
+pulls.blocked_by_changed_protected_files_n= This pull request is blocked because it changes protected files:
pulls.can_auto_merge_desc = This pull request can be merged automatically.
pulls.cannot_auto_merge_desc = This pull request cannot be merged automatically due to conflicts.
pulls.cannot_auto_merge_helper = Merge manually to resolve the conflicts.
-pulls.num_conflicting_files_1 = "%d conflicting file"
-pulls.num_conflicting_files_n = "%d conflicting files"
-pulls.approve_count_1 = "%d approval"
-pulls.approve_count_n = "%d approvals"
-pulls.reject_count_1 = "%d change request"
-pulls.reject_count_n = "%d change requests"
-pulls.waiting_count_1 = "%d waiting review"
-pulls.waiting_count_n = "%d waiting reviews"
-pulls.wrong_commit_id = "commit id must be a commit id on the target branch"
+pulls.num_conflicting_files_1 = %d conflicting file
+pulls.num_conflicting_files_n = %d conflicting files
+pulls.approve_count_1 = %d approval
+pulls.approve_count_n = %d approvals
+pulls.reject_count_1 = %d change request
+pulls.reject_count_n = %d change requests
+pulls.waiting_count_1 = %d waiting review
+pulls.waiting_count_n = %d waiting reviews
+pulls.wrong_commit_id = commit id must be a commit id on the target branch
pulls.blocked_by_user = You cannot create a pull request on this repository because you are blocked by the repository owner.
pulls.no_merge_desc = This pull request cannot be merged because all repository merge options are disabled.
@@ -1895,7 +1895,7 @@ milestones.title = Title
milestones.desc = Description
milestones.due_date = Due Date (optional)
milestones.clear = Clear
-milestones.invalid_due_date_format = "Due date format must be 'yyyy-mm-dd'."
+milestones.invalid_due_date_format = Due date format must be 'yyyy-mm-dd'.
milestones.create_success = The milestone "%s" has been created.
milestones.edit = Edit Milestone
milestones.edit_subheader = Milestones organize issues and track progress.
@@ -2237,7 +2237,7 @@ settings.webhook.body = Body
settings.webhook.replay.description = Replay this webhook.
settings.webhook.replay.description_disabled = To replay this webhook, activate it.
settings.webhook.delivery.success = An event has been added to the delivery queue. It may take few seconds before it shows up in the delivery history.
-settings.githooks_desc = "Git Hooks are powered by Git itself. You can edit hook files below to set up custom operations."
+settings.githooks_desc = Git Hooks are powered by Git itself. You can edit hook files below to set up custom operations.
settings.githook_edit_desc = If the hook is inactive, sample content will be presented. Leaving content to an empty value will disable this hook.
settings.githook_name = Hook Name
settings.githook_content = Hook Content
@@ -2398,12 +2398,12 @@ settings.ignore_stale_approvals_desc = Do not count approvals that were made on
settings.require_signed_commits = Require Signed Commits
settings.require_signed_commits_desc = Reject pushes to this branch if they are unsigned or unverifiable.
settings.protect_branch_name_pattern = Protected Branch Name Pattern
-settings.protect_branch_name_pattern_desc = "Protected branch name patterns. See the documentation for pattern syntax. Examples: main, release/**"
+settings.protect_branch_name_pattern_desc = Protected branch name patterns. See the documentation for pattern syntax. Examples: main, release/**
settings.protect_patterns = Patterns
-settings.protect_protected_file_patterns = "Protected file patterns (separated using semicolon ';'):"
-settings.protect_protected_file_patterns_desc = "Protected files are not allowed to be changed directly even if user has rights to add, edit, or delete files in this branch. Multiple patterns can be separated using semicolon (';'). See github.com/gobwas/glob documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt."
-settings.protect_unprotected_file_patterns = "Unprotected file patterns (separated using semicolon ';'):"
-settings.protect_unprotected_file_patterns_desc = "Unprotected files that are allowed to be changed directly if user has write access, bypassing push restriction. Multiple patterns can be separated using semicolon (';'). See github.com/gobwas/glob documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt."
+settings.protect_protected_file_patterns = Protected file patterns (separated using semicolon ';'):
+settings.protect_protected_file_patterns_desc = Protected files are not allowed to be changed directly even if user has rights to add, edit, or delete files in this branch. Multiple patterns can be separated using semicolon (';'). See github.com/gobwas/glob documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt.
+settings.protect_unprotected_file_patterns = Unprotected file patterns (separated using semicolon ';'):
+settings.protect_unprotected_file_patterns_desc = Unprotected files that are allowed to be changed directly if user has write access, bypassing push restriction. Multiple patterns can be separated using semicolon (';'). See github.com/gobwas/glob documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt.
settings.add_protected_branch = Enable protection
settings.delete_protected_branch = Disable protection
settings.update_protect_branch_success = Branch protection for rule "%s" has been updated.
@@ -2766,7 +2766,7 @@ teams.remove_all_repos_title = Remove all team repositories
teams.remove_all_repos_desc = This will remove all repositories from the team.
teams.add_all_repos_title = Add all repositories
teams.add_all_repos_desc = This will add all the organization's repositories to the team.
-teams.add_nonexistent_repo = "The repository you're trying to add doesn't exist, please create it first."
+teams.add_nonexistent_repo = The repository you're trying to add doesn't exist, please create it first.
teams.add_duplicate_users = User is already a team member.
teams.repos.none = No repositories could be accessed by this team.
teams.members.none = No members on this team.
@@ -2823,7 +2823,7 @@ dashboard.cron.error=Error in Cron: %s: %[3]s
dashboard.cron.finished=Cron: %[1]s has finished
dashboard.delete_inactive_accounts = Delete all unactivated accounts
dashboard.delete_inactive_accounts.started = Delete all unactivated accounts task started.
-dashboard.delete_repo_archives = "Delete all repositories' archives (ZIP, TAR.GZ, etc..)"
+dashboard.delete_repo_archives = Delete all repositories' archives (ZIP, TAR.GZ, etc..)
dashboard.delete_repo_archives.started = Delete all repository archives task started.
dashboard.delete_missing_repos = Delete all repositories missing their Git files
dashboard.delete_missing_repos.started = Delete all repositories missing their Git files task started.
@@ -2923,7 +2923,7 @@ users.allow_import_local = May Import Local Repositories
users.allow_create_organization = May Create Organizations
users.update_profile = Update User Account
users.delete_account = Delete User Account
-users.cannot_delete_self = "You cannot delete yourself"
+users.cannot_delete_self = You cannot delete yourself
users.still_own_repo = This user still owns one or more repositories. Delete or transfer these repositories first.
users.still_has_org = This user is a member of an organization. Remove the user from any organizations first.
users.purge = Purge User
@@ -3125,7 +3125,7 @@ config.app_name = Site Title
config.app_ver = Forgejo Version
config.app_url = Forgejo Base URL
config.custom_conf = Configuration File Path
-config.custom_file_root_path = "Custom File Root Path"
+config.custom_file_root_path = Custom File Root Path
config.domain = Server Domain
config.offline_mode = Local Mode
config.disable_router_log = Disable Router Log
@@ -3396,11 +3396,11 @@ default_key=Signed with default key
error.extract_sign = Failed to extract signature
error.generate_hash = Failed to generate hash of commit
error.no_committer_account = No account linked to committer's email address
-error.no_gpg_keys_found = "No known key found for this signature in database"
-error.not_signed_commit = "Not a signed commit"
-error.failed_retrieval_gpg_keys = "Failed to retrieve any key attached to the committer's account"
-error.probable_bad_signature = "WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS."
-error.probable_bad_default_signature = "WARNING! Although the default key has this ID it does not verify this commit! This commit is SUSPICIOUS."
+error.no_gpg_keys_found = No known key found for this signature in database
+error.not_signed_commit = Not a signed commit
+error.failed_retrieval_gpg_keys = Failed to retrieve any key attached to the committer's account
+error.probable_bad_signature = WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
+error.probable_bad_default_signature = WARNING! Although the default key has this ID it does not verify this commit! This commit is SUSPICIOUS.
[units]
unit = Unit
@@ -3579,14 +3579,14 @@ actions = Actions
unit.desc = Manage actions
-status.unknown = "Unknown"
-status.waiting = "Waiting"
-status.running = "Running"
-status.success = "Success"
-status.failure = "Failure"
-status.cancelled = "Canceled"
-status.skipped = "Skipped"
-status.blocked = "Blocked"
+status.unknown = Unknown
+status.waiting = Waiting
+status.running = Running
+status.success = Success
+status.failure = Failure
+status.cancelled = Canceled
+status.skipped = Skipped
+status.blocked = Blocked
runners = Runners
runners.runner_manage_panel = Runners Management
From a748ba70a8654f7b4260438182cff6c404557519 Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Sun, 25 Feb 2024 18:13:59 +0500
Subject: [PATCH 090/807] 10-year old images are gone
---
public/assets/img/404.png | Bin 4516 -> 0 bytes
public/assets/img/500.png | Bin 5230 -> 0 bytes
tests/integration/compare_test.go | 2 +-
tests/integration/links_test.go | 2 --
4 files changed, 1 insertion(+), 3 deletions(-)
delete mode 100644 public/assets/img/404.png
delete mode 100644 public/assets/img/500.png
diff --git a/public/assets/img/404.png b/public/assets/img/404.png
deleted file mode 100644
index 8b66c971f462dcc37c6b3f33d4a9c35c68a8979d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 4516
zcmZ`+c{r4B_kYGP$k<25lCcbi5)(*&`hd+9D
z$aWGE61MO^2pjwd@^|>h-|F~x$`<&yv!(ynB3tQyQntdsv)I%YzUBWBY{~xM|B(F&
zx4j;3vjZdW(Huij5U@;d)=`Zf!oYXk^1cfd<
zV!gh;efALL%SMw-zFO8CFNVYEvIK^^-;F`)zoggp0}qK+h28(u@a?7t-(96{^VQ6V
zPxn+-gLCBG+ewz5ntZ>VSncs^N`I_w2@%MPTyOR>l0%C|l%tK#ouTW5Xr~;#L3mo<
z_Uy7{l!BkN-BoLW%EyTbZY%&06t~0}JK;dz>bXD!4FGsDKKrgt^#-kii@ojtXN0LF
z4wk6$>2&c^NA@MYm`Mz|m2rX3#cQfZT4)j)C+m*Z4Rh#t5hzuZxm{uw5P|Py7sz
zE&RCBb8hAr_bk5gyZRs#iq{DnpRKV%PV%j_B)nXi3Ev1?kN-SJO(AJ%y)kDbP)bd8
zg3AjlC&PV7#euyaStr>v!q`F=lg4l4say4uEHk629J%4Mt_2pljy?1eggSVFl{Mje
zTT1{cZ)nQfX3D3bXOaMF`i#&o!o9Hf4$!OO&=<|u06j%(kQ1Qhw`*mUMvn>AX%?U
zTiNZ_N2oENekig{aQ(6CY7g+GU-_#C?Q}SpDA-jfbTvY_7(`q*!$Wm`XnQzNw&kI2
zngs&SoG{hUhq}GP-49HVsoCgcK=H18G^BNCLZ#?UxG2(v7D#}Y05zx%V!XRB~V_bj?s4zg!Qwf~&i`i8noeI~R(Y{7-%6Tx%)YaE8tXs}M&`-#)
z{mBo(RCCdGWsLck4w1s0Ss`n>u#WVqW!t3sJ;bN2pENWzH8Zj*SxeV`ec+{=-|E&=
znNxUu;@AvMZ>puN4t?>#_%(0bw>$IY3ykCX(Qy(U7_O1#Y&fqaEZj}2fGnXXb?Ls$
zn>`*!OF42`#A`tx;b~Iml<>Rm-O18sCLT0~obL%3*l)XSk5L6@tJeO=?uqf++C5+-C7`F0x9{fjm(e|=1bYa_SH<))>07y*qe>Si7eT047GC!gBCzuvItiiqkD
zT&gTs00U#RV-+(B<^V4X@1dISZWhx#<}eqzzN6jjJGlBY4vKOfA=f00tA7W)T4Z|5
zR)%LU?uXeAzBv+oPCs;5tVXquw?t*0j%`{%^zS2n(;XjjS4S%93z)%{G4mIHc1dK1
zUhW|9ecC1l^cU&WMtQZEE|;y$4ZW0w+PfEAiK&l{#0C6%xWXJTp789ea>VMQ{K
z>`yYB91Wrq0=+EM;SQy$8+q31Nkx*L*FxGSLQ@7u>yXtpLKMF@uj>Ln!pq(s&uK%n
z%haG|;W5eNHtou9h+I^|`7hC9UQXWLyJlb`D6uXd4N^`?8%o_Z+D=CVuFczRi!g+fpN=t#^G^tX54
zUKbUKQc-ywV}lp{#>uHQ$z+73$T9d|tJ69Qw>RmJRs`KlyOmba4}HiVf9=-Anel50vkG-lx6{t!F1x@Axa+xXBEA~bx_Mb_=)IXSVO1Iwqmd06L$hR;
z`BygGTx>q-V|>sDcp2eg{?3haIX&>s23By98T&wI4%N0S9JjG&Y)_G^(ldJgl=Jq3
zy~J;$G1SAS@
>{7(%XwW
z-tQ%007IorIWS%%%TZ*H%r%=o?@pUrI{75LGiV>)k`<9^b@%Kxm|tBH-o0{@=zvn7i@;$
zi~J5dhSoGzMM^Wk(HYL@vD+_qH$0$Q;;-%_!XhsFd!JtVz|Ks>?f1C)Y$__i(M3^N
zwuD(QuQmiP>(HmfS7VQZQr4>{daMT&eSqfDh)mO}LYLNf+Q;UIgg=mJ%Vk{n;UEW36zR>WNe
z@XhTcK&>*bL?r}#R=}v0`);3ax)0vk=tmZUV_51
zTtaGR(pY{qYR!efIid-SfCUIaO>hU8nL_xe@Q!=io1Xh)Mll@7m5}=bU}>J=WVAOz
zy3+AH2@6w3)zzUAE!K3Gt!bczVz{Y6AnKT%p
z6UsGfaSt^c!=YA}IaV^E8!m~!&>BRX&q7r=6%wC6J7hn|VnRvEMo05|E5+k@=GSSd
z?9aPc%3!yE&?8t=Z0X@7PT;1EJL7EXbw&AC>1ZTNLb~!GtO(W=QJsDw`sW$lx;q$4
zybx&qJKQvoGe#2qC^xjA*v+Z=2`mKVZIi+
z=kUlS9uvr!cDO^r4E~6J2ewO`SaHREJ9BbEA+{9d5Lgdi6y4z4d3D6E7&XgNI&t>K
z&RdMhf-D-h@G7WQ*sDbWH+6J
z*JO&@b3Ch#)xwF(nhYR_7)^Vay>Mkhlsjx)Yw$5(IM=+E5wAweSxIdmj*!##Lh^vd_W
z$j`&hOs@KR$jh9Hkjf1k;VnT4NrlhbSwbZ;FPk43f;`;urCM<3qo!tKJ*Gq)v{jK%
z1@hz14EF*
zBRxpS+v6a}o&O!j8qG9?&u2vS&Ki#~#0N&}2GnTLdRSh%R*1qa#Hk%~hg4E$!vMl%mFYO(yLR@gK
z+~p43;yRLj>D-|Jw|8MDf_9NVDLG!Na7Pe4T{wvl#gh7)wYO;&f#HQP~YZGFP=Z0b#@#
zNZUC-*B(s4jPPvi4afk5s^KP^sJaXd@~oMGa34AZ@L-{yvTK2K-=Zg=_3MaL4#=If
z-$G-yunNjM-R$_@HS*9StktG8Z&S+q019!RO}`Kk(;CcSs0@Ky&8JxiuPc`rnpj#`Fug^XLH`Y&jj(k6#-MF3SAPJh>U?W
zD@fba*MaR0+JTbHA-|1{r|J8_OXKH{Ed~tMUfSQjnOvpDjJN~sbNOAVO09Cz-yQ1r
z@;6nj#ysL)d!;mQv-wc^;QC$xi1bj~W>$?_rJ^Pk#EsSP^@zR`WHrk>bnR!VA$Uo2
zu}R42kOx>*l%c6%D0c!1y5TP1PpkOEDUr#$ai3cDg8&)SF(t)Tjszv0sT6J{BuBC-
zel``E2YndXK#Kj!W)9pEenm*uZicoB8aocw1cIQ{kZYRYCDV5>mjlA(pdf!Yc6s
z$}UDrKJg{!{HDTvbs*r9*)jHhg|wQUAMbkt>W=LHBm8i?Y@au+IQ-KZdo)CLH|Be(
zcTT}X_MRI%VapG74}rHQG1*#c_LH0X4uMj1-cVwho@bH+b#BTEGug#ykKXbum^3wa4^v5iT_QCXwVXVEA
pyZo-TUKweg-#@s_I_55he7hgeD@zAjLvQ>AeRF
zy-IIVrAbHO4c8^l^}oB;J8Ra=K6`)Po-^M$XZEa#(9u$+B4;KCfk0HMDmV2&AP8WB
zrpQQuv;0G}HQ=Dq(a={^cGd9p^?muf0rtPP-|>IBCM6~PqWnwjw+jILHvjkf=Z$`O
zf5C!+g8mGh*#PFu{$-ryI`f}l&I};*3wCClbL`E%=rua=lRb(
z|My0}qGy=1?wRpts$Vt``m_DY`O9;bAL#zS#9x>*7+{RV{^tl-ABCQJTDL%8@OjL=
zC%H|7D;p;V8`B-7X+F0uLC<4OM7;85+hg?+2%K8R(s2t%i;w8Db@B$t?X?JIqka4j
zsm|>Oq}+_zV>feF6RgQcgadi|vy?V151-8*^SGs(9EBoxd#HMJU>A#(?I{-`{A(?0
z-|Q|(O(Qe5*_=ED8n`r{4$}#iII|UucZfX@AFaA38Qo^0bJhJ3y-H|;`KPH0+xrS+
zDW#f5@chplmFjsxjX}!aU6nx~T1(ZNa{4~t)z6Ax9Eb)aI%alsErfwJCchzW@}C`W
zx(j|c73(8mE|kcJx6WS*ILv3Sima4zEbQF&mtE~A@gT_21W(^^=o%X?a~d5SIjQ$s
zeP_FuqB&qXe@R(eqAw9<;kzD_B)jCP}r!wO@PI4$G6g=MBegV1uR6=V)pYaBeCYQ+9z#)Gp_J-Dk
zPK;k9H>Q6!lwp7V2)}hG>8tShfI%7en(qd@?wnX*OniA?ACEHr7^W3i&3+x|U+a6v
zql_agi1@uc$0{D>`!Ka8*_`(}1o|!VaV&*Xp?Q9tGtG&C3r`IVpT$X;+z&qAu5sf%
z|Z~`b!VP8
zDrDRYjfB$Vq}+aMXB>WvaRC<^J`6TGHzz+?-<+rHo;MUhsh|iUyR6eCFrZ^!WUbnQDlH-k2lY|dH-o{XGBf&a_h$GfE
z&Y*s`f>5!v_aVf9}`R6fbe?#8`G7(4zQEO|xVkub1gvzYJ3il)9~pEf0ZgF@SYh
z4iaqcf5_T4jTD&erS((qaT~Fu<J5hAVlC>=U^5Mm6iH03dFw$C>
zq6ycXOXuG
zqwM8JMvrD|BG2(o6?B=$%o!o*U9Uyfk*7YrnJr)%0;PA2Nv&XQfirn_lUyGpsq9|S
z&g}E>(rb-iC*hsCflZ*G7o8)(-1A`W8AC6;sAo5D`kOkETzD6;yAXr@)oqn0J7yU4
z_ThJ;C2N%`BYcsXTvjJaum$ep_zKW?Z~PoUOt%bklT?h9>;bQ5cwB)OjU(tqtzLy~
zHXn`x+%NH~qSRq3wCWpd{aAUwg)n$H40{CCx0JzC)b6r+F@?2%=t8|u;^0=H*TA?k
zEIQF|1ZSKMD2+7CO$8;se`k8tn4ODw>xU%YxuwtUb?hA><{lruwPyq~6eGIQ&jpVJ
zax6%5Q^es@b5D6GJ@vCfc^v+K3zEgxQt=X^g_)Gx3)qPv<}S|HqZPmcGvvpsKjbO3
zW|gbn7+`tqRsu{HOKl^XC8P1oFWsk!`BUl6p>(dF)DUxir=uJc_FxKI$O;9!jts|l
z(f?5KZaE7{10lH(m>w>+T8$Mw9d-yez#@~nGxg*P#o*MlqH6Z9n>fZsT3*ugB0B*V
z9adj$Q9S2U-FFrhT9K)HvlG&3yUluUo?`K!0`?AF6qTga}E2%
zRy9(EvUX;?iYj-xYaFdxtmDT@s58QnEEvSkQVCzGN3g{kdT&-h&
zN{4kCS?M(27#>Y-nTP)E$W3;V@Jh;7=00bJa(1w}g+!GX`^}XM{u#H6QsfaIxyHtA
zJKkdjo5k=UH3JQjNKzvZ#AH7IbqflyxbJi?r+D2rKr{
z)muAxr{LR)8EL!PqSt&zHDAzUJ~~@5w77z4`mDJbeqzL|b!fJj4y#$|RFQ%UnWV8H
zOJe3i$G8@fYn(nsOjy=4Pun)v>)@SuXV%U{Ez=y=Lb`pS-uWFL74x{x_m%!yw&o13
z=8f5*@aBn(^4{%_RPXUUL4cwn*C_Ysb
zz?v2P9y9JtdxB5uUnt)>q2Nbtf9cJgOSrp1Js@woOzWoFQu|>)ioJYl#V+7kdPj{HRAhJ>$!=GWXMRW2NyIsqWT)5jv-S}e6IBs+h>IDf>!4JL1Qa2Bb)&i}
z!QfDFSI3#S+yl)Lvwn0B&NM0~A*!Yd!^{AFG#ltDcuAcwQHTcrlmz))lC^>
zBH=XT;#U7W4YxOlK;DH6(j~cUdb(r&7K-?1_F`i9aVa?RmD`P?;3IhRBk&J&JbNkr
z^ewV3c3JxhebEQ31xN#P*)17A!BoOjKFpKZ&Y~c#@|D6If)1@D&&G+aIyC>8d4am*=E!j7o
z{TA7UZbq8Lu}I36BYMnXrWlcgwf!xz%m-cnXNYFRv<0GkL{@1|`;lxgu*v0sY2%Ng
z8X1rb^x7Y4rrca?&d&J+Y*hKvO{MI6ZwhKedbf(yyex4o&11xBFz7rT7I^{d0vWU-
zBSxOvDB0N$Z}pQEyln+k7+~PHJV~6t>>AJco=5u2L5b|dd)tJB?gw%B
z0D2ltgZ{>kZDWL#7#D@_c{@n3pA5fOT#b4|1KjBT_Yazq?y`zMmLJGHDP`xuy>e+g
ziDB46XOe0)n3q^FuXiSQNxuf({gZbPba+M9Eu86M?FTLHRRu$ihS*U_O-h626ug*&
zj2cEGJR7K9dxEzBs&tArI=!l#hPNN=A|IJATPX@Q6Fx0PhQ_v2Q0Y=B5oX@01S$2v
z1!DbjSm7y8_#3Gf=A3Z}A1N;(LR4X&cdjV=5jXzI4p4*5QTomRjn|>1fwq1=
zPJ{p@vEHYlIn~aQ>I*BEL+IwJv2u9YYJ8I>7P+vzsXER6HIjo5neNEn`fkBMK5Mp+
zU@d_~+O5bz((&HLhO_N(CiiDIEFsRXb~$!lwC6zSTIQn5ifT7ju9l_@UAPkgY*O~Y<%mN#DERGVu{
zwI8pei3jwexpaI4ma*WOhpH;;NafQNkncOJZW+q}Q_|XqPW5q^f-=OijUYCl{h-s2
zJ>d8c&Em+|jZx)Z)^!XwA5-|gvEB}p_34fgTH^W)A;s$A$yKI`GI_6b<2Af?iqAl;_|
zpEkZ<2;!{0CE)Pzn|%F+^Fa?UKjL=&x`POQqq#Q4!6B`M(-C^5zejypw<=H!Jg{Ib
z6L;ja9lbwLj$af0;jzH-wv*B(UgjVkVMC2Cs8k5IGRvk7%-rc5VqoWy
zn1u7R>RZn-JJdTBL_)z%5Jf`qMrkuiUh`|~syl(U>
z79z+&pRzZP{t#eZJ}bk3A~+^w5#4?Y-G9cT;&uy|Q862SwT6kCaW(}X;rI7CVuDTF
z2}9vN3Yw7frrgGmS7w?G)iQC164&TK+h2<8-evHB5$IUyzbH&KFkVsb>przY^BS;b
zWq;?YH0)@QhdB%spzc~aFZi6M0fb<|3fjPPLcACY1Bm-jNOp`g7*ojR6nX?7
z-iU0ny_+EfH>wcPc&O9@+&CH+C>v0)mQD8hk|!rvb|^Hzp0=2EamT8AhofHXV~GG4
zoyE;mTuKD(;-sQ952g@Iegc^^P>a3%5ZMG}2RcKZNAn`FBP{M=UYeGB_V)x7HS~gNSQkt05vnJ$p~BLMN(IHUFT^Z&
z-Y(cnRALrAqTd4pK>1g*T&oN5dORmsYMDn%j<)Aa;!m{ThHf*{i$53$4X4vN*~$!@
z>oONe!adhkwco~|$|cp-SsIu}mB7RQ
zVp&6lB=Fi5q2+H)qP$Lbt2RE()9}l!O^r-};PGX@`ztrb)ILvb5
s>_QDa{W}6ZFhLZ_!?)Rg|0+4VA{B)=>#4m7qNg5JMXj3!@^=IO2RKy6S^xk5
diff --git a/tests/integration/compare_test.go b/tests/integration/compare_test.go
index cf0bac4c8a..5d5529c36e 100644
--- a/tests/integration/compare_test.go
+++ b/tests/integration/compare_test.go
@@ -33,7 +33,7 @@ func TestCompareTag(t *testing.T) {
req = NewRequest(t, "GET", "/user2/repo1/compare/invalid")
resp = session.MakeRequest(t, req, http.StatusNotFound)
- assert.False(t, strings.Contains(resp.Body.String(), "/assets/img/500.png"), "expect 404 page not 500")
+ assert.False(t, strings.Contains(resp.Body.String(), ">500<"), "expect 404 page not 500")
}
// Compare with inferred default branch (master)
diff --git a/tests/integration/links_test.go b/tests/integration/links_test.go
index 11e6146d07..6edcbbc71b 100644
--- a/tests/integration/links_test.go
+++ b/tests/integration/links_test.go
@@ -36,8 +36,6 @@ func TestLinksNoLogin(t *testing.T) {
"/user2/repo1/",
"/user2/repo1/projects",
"/user2/repo1/projects/1",
- "/assets/img/404.png",
- "/assets/img/500.png",
"/.well-known/security.txt",
}
From 4b8fecd71ee83c96c905866d1ddebd9361aaff79 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Sat, 24 Feb 2024 13:00:16 +0100
Subject: [PATCH 091/807] [RELEASE] switch to semantic versioning
The release number displayed by the API and the CLI becomes:
7.0.0+1.22.0
instead of
1.22.0
It would otherwise be inconsistent to have different version number depending on the interface. With the current implementation `/api/forgejo/v1/version` would return `7.0.0+1.22.0` while `/api/v1/version` would return `1.22.0`. The release would be announced as `7.0.0+1.22.0` but the web API would display `1.22.0`.
It may cause some tools that are Gitea specific to not behave as they should in the future if they expect a Gitea version number and activate some features depending on what it is. They would need to be patched to strip the leading Forgejo version number before asserting the Gitea version.
Refs: https://codeberg.org/forgejo/forgejo/issues/2425
---
Makefile | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/Makefile b/Makefile
index 194da59ef0..0f6c82fd78 100644
--- a/Makefile
+++ b/Makefile
@@ -85,19 +85,18 @@ endif
STORED_VERSION_FILE := VERSION
HUGO_VERSION ?= 0.111.3
+GITEA_COMPATIBILITY ?= 1.22.0
STORED_VERSION=$(shell cat $(STORED_VERSION_FILE) 2>/dev/null)
ifneq ($(STORED_VERSION),)
FORGEJO_VERSION ?= $(STORED_VERSION)
else
- FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/-/+/' | sed 's/^v//')
+ FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//')+${GITEA_COMPATIBILITY}
endif
RELEASE_VERSION ?= ${FORGEJO_VERSION}
VERSION ?= ${RELEASE_VERSION}
-GITEA_VERSION ?= 1.22.0
-
-LDFLAGS := $(LDFLAGS) -X "main.ReleaseVersion=$(RELEASE_VERSION)" -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)" -X "main.ForgejoVersion=$(FORGEJO_VERSION)"
+LDFLAGS := $(LDFLAGS) -X "main.ReleaseVersion=$(RELEASE_VERSION)" -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(FORGEJO_VERSION)" -X "main.Tags=$(TAGS)" -X "main.ForgejoVersion=$(FORGEJO_VERSION)"
LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64
From 1bab4358accee4e4ba455424bd2265dd7f6384e8 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Sun, 25 Feb 2024 19:50:46 +0100
Subject: [PATCH 092/807] [BUG] Don't overwrite protected branch accidentally
- If a user tries to create another protected branching rule that
specifies a set of branches already used by another rule, do not allow
it.
- Update the translation accordingly.
- Adds integration test.
- Resolves #2455
---
options/locale/locale_en-US.ini | 2 +-
routers/web/repo/setting/protected_branch.go | 11 +++--
tests/integration/git_test.go | 7 ++++
tests/integration/repo_settings_test.go | 42 ++++++++++++++++++++
4 files changed, 57 insertions(+), 5 deletions(-)
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 0931e86941..c47a7ba664 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -2424,7 +2424,7 @@ settings.choose_branch = Choose a branch…
settings.no_protected_branch = There are no protected branches.
settings.edit_protected_branch = Edit
settings.protected_branch_required_rule_name = Required rule name
-settings.protected_branch_duplicate_rule_name = Duplicate rule name
+settings.protected_branch_duplicate_rule_name = There is already a rule for this set of branches
settings.protected_branch_required_approvals_min = Required approvals cannot be negative.
settings.tags = Tags
settings.tags.protection = Tag Protection
diff --git a/routers/web/repo/setting/protected_branch.go b/routers/web/repo/setting/protected_branch.go
index 85068f0ab2..827ebea7f8 100644
--- a/routers/web/repo/setting/protected_branch.go
+++ b/routers/web/repo/setting/protected_branch.go
@@ -132,12 +132,15 @@ func SettingsProtectedBranchPost(ctx *context.Context) {
}
}
} else {
- // FIXME: If a new ProtectBranch has a duplicate RuleName, an error should be returned.
- // Currently, if a new ProtectBranch with a duplicate RuleName is created, the existing ProtectBranch will be updated.
- // But we cannot modify this logic now because many unit tests rely on it.
+ // Check if a rule already exists with this rulename, if so redirect to it.
protectBranch, err = git_model.GetProtectedBranchRuleByName(ctx, ctx.Repo.Repository.ID, f.RuleName)
if err != nil {
- ctx.ServerError("GetProtectBranchOfRepoByName", err)
+ ctx.ServerError("GetProtectedBranchRuleByName", err)
+ return
+ }
+ if protectBranch != nil {
+ ctx.Flash.Error(ctx.Tr("repo.settings.protected_branch_duplicate_rule_name"))
+ ctx.Redirect(fmt.Sprintf("%s/settings/branches/edit?rule_name=%s", ctx.Repo.RepoLink, protectBranch.RuleName))
return
}
}
diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go
index d02427ffcf..2163c67cb5 100644
--- a/tests/integration/git_test.go
+++ b/tests/integration/git_test.go
@@ -18,6 +18,7 @@ import (
auth_model "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
+ git_model "code.gitea.io/gitea/models/git"
issues_model "code.gitea.io/gitea/models/issues"
"code.gitea.io/gitea/models/perm"
repo_model "code.gitea.io/gitea/models/repo"
@@ -413,12 +414,17 @@ func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *tes
func doProtectBranch(ctx APITestContext, branch, userToWhitelist, unprotectedFilePatterns string) func(t *testing.T) {
// We are going to just use the owner to set the protection.
return func(t *testing.T) {
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: ctx.Reponame, OwnerName: ctx.Username})
+ rule := &git_model.ProtectedBranch{RuleName: branch, RepoID: repo.ID}
+ unittest.LoadBeanIfExists(rule)
+
csrf := GetCSRF(t, ctx.Session, fmt.Sprintf("/%s/%s/settings/branches", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame)))
if userToWhitelist == "" {
// Change branch to protected
req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings/branches/edit", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame)), map[string]string{
"_csrf": csrf,
+ "rule_id": strconv.FormatInt(rule.ID, 10),
"rule_name": branch,
"unprotected_file_patterns": unprotectedFilePatterns,
})
@@ -430,6 +436,7 @@ func doProtectBranch(ctx APITestContext, branch, userToWhitelist, unprotectedFil
req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings/branches/edit", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame)), map[string]string{
"_csrf": csrf,
"rule_name": branch,
+ "rule_id": strconv.FormatInt(rule.ID, 10),
"enable_push": "whitelist",
"enable_whitelist": "on",
"whitelist_users": strconv.FormatInt(user.ID, 10),
diff --git a/tests/integration/repo_settings_test.go b/tests/integration/repo_settings_test.go
index 16e0bb3d7d..3076148156 100644
--- a/tests/integration/repo_settings_test.go
+++ b/tests/integration/repo_settings_test.go
@@ -9,10 +9,12 @@ import (
"testing"
"code.gitea.io/gitea/models/db"
+ git_model "code.gitea.io/gitea/models/git"
repo_model "code.gitea.io/gitea/models/repo"
unit_model "code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
+ gitea_context "code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/setting"
repo_service "code.gitea.io/gitea/services/repository"
"code.gitea.io/gitea/tests"
@@ -128,3 +130,43 @@ func TestRepoAddMoreUnits(t *testing.T) {
assertAddMore(t, false)
})
}
+
+func TestProtectedBranch(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+ user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, OwnerID: user.ID})
+ session := loginUser(t, user.Name)
+
+ t.Run("Add", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ link := fmt.Sprintf("/%s/settings/branches/edit", repo.FullName())
+
+ req := NewRequestWithValues(t, "POST", link, map[string]string{
+ "_csrf": GetCSRF(t, session, link),
+ "rule_name": "master",
+ "enable_push": "true",
+ })
+ session.MakeRequest(t, req, http.StatusSeeOther)
+
+ // Verify it was added.
+ unittest.AssertExistsIf(t, true, &git_model.ProtectedBranch{RuleName: "master", RepoID: repo.ID})
+ })
+
+ t.Run("Add duplicate", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ link := fmt.Sprintf("/%s/settings/branches/edit", repo.FullName())
+
+ req := NewRequestWithValues(t, "POST", link, map[string]string{
+ "_csrf": GetCSRF(t, session, link),
+ "rule_name": "master",
+ "require_signed_": "true",
+ })
+ session.MakeRequest(t, req, http.StatusSeeOther)
+ flashCookie := session.GetCookie(gitea_context.CookieNameFlash)
+ assert.NotNil(t, flashCookie)
+ assert.EqualValues(t, "error%3DThere%2Bis%2Balready%2Ba%2Brule%2Bfor%2Bthis%2Bset%2Bof%2Bbranches", flashCookie.Value)
+
+ // Verify it wasn't added.
+ unittest.AssertCount(t, &git_model.ProtectedBranch{RuleName: "master", RepoID: repo.ID}, 1)
+ })
+}
From 1272ac4f6925f900be0666c83272f91e4e266d54 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Sun, 25 Feb 2024 21:24:12 +0100
Subject: [PATCH 093/807] [BUG] Use correct logout URL
- If a `logout` event is send the user should be redirected to the
homepage, there are three mechanism that can do this. The response of
`/user/logout` and the event listener of notifications or stopwatch.
It's essentially a race for what's processed first to determine which
mechanism takes care of redirecting the user.
- Fix that the redirection mechanism of the notification and stopwatch
event listener redirects to an absolute URL.
- Ref: #2135
---
web_src/js/features/notification.js | 2 +-
web_src/js/features/stopwatch.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/web_src/js/features/notification.js b/web_src/js/features/notification.js
index 4dcf02d2dc..d325148413 100644
--- a/web_src/js/features/notification.js
+++ b/web_src/js/features/notification.js
@@ -112,7 +112,7 @@ export function initNotificationCount() {
type: 'close',
});
worker.port.close();
- window.location.href = appSubUrl;
+ window.location.href = `${window.location.origin}${appSubUrl}/`;
} else if (event.data.type === 'close') {
worker.port.postMessage({
type: 'close',
diff --git a/web_src/js/features/stopwatch.js b/web_src/js/features/stopwatch.js
index f43014fec5..e20a983e60 100644
--- a/web_src/js/features/stopwatch.js
+++ b/web_src/js/features/stopwatch.js
@@ -74,7 +74,7 @@ export function initStopwatch() {
type: 'close',
});
worker.port.close();
- window.location.href = appSubUrl;
+ window.location.href = `${window.location.origin}${appSubUrl}/`;
} else if (event.data.type === 'close') {
worker.port.postMessage({
type: 'close',
From 5d2c4706d0a5d4690a25605818c6d4edd8f0a0d6 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Sun, 25 Feb 2024 23:08:09 +0100
Subject: [PATCH 094/807] [CI] run frontend checks
---
.forgejo/workflows/testing.yml | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml
index a4b54c4da5..80fd87152e 100644
--- a/.forgejo/workflows/testing.yml
+++ b/.forgejo/workflows/testing.yml
@@ -23,10 +23,22 @@ jobs:
- run: make --always-make -j$(nproc) lint-backend checks-backend # ensure the "go-licenses" make target runs
env:
TAGS: bindata sqlite sqlite_unlock_notify
+ frontend-checks:
+ if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
+ runs-on: docker
+ container:
+ image: 'docker.io/node:20-bookworm'
+ steps:
+ - uses: https://code.forgejo.org/actions/checkout@v3
+ - run: make deps-frontend
+ - run: make lint-frontend
+ - run: make checks-frontend
+ - run: make test-frontend
+ - run: make frontend
test-unit:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
runs-on: docker
- needs: [backend-checks]
+ needs: [backend-checks, frontend-checks]
container:
image: 'docker.io/node:20-bookworm'
services:
@@ -67,7 +79,7 @@ jobs:
test-mysql:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
runs-on: docker
- needs: [backend-checks]
+ needs: [backend-checks, frontend-checks]
container:
image: 'docker.io/node:20-bookworm'
services:
@@ -113,7 +125,7 @@ jobs:
test-pgsql:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
runs-on: docker
- needs: [backend-checks]
+ needs: [backend-checks, frontend-checks]
container:
image: 'docker.io/node:20-bookworm'
services:
@@ -161,7 +173,7 @@ jobs:
test-sqlite:
if: ${{ !startsWith(vars.ROLE, 'forgejo-') }}
runs-on: docker
- needs: [backend-checks]
+ needs: [backend-checks, frontend-checks]
container:
image: 'docker.io/node:20-bookworm'
steps:
From 1424df9b71371f7083f2ec3da7e8ecac8f00c653 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Sun, 25 Feb 2024 23:40:54 +0100
Subject: [PATCH 095/807] [FRONTEND] package-lock.json is named as forgejo
---
package-lock.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package-lock.json b/package-lock.json
index f1f8cc4705..23dcb84da6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "gitea",
+ "name": "forgejo",
"lockfileVersion": 3,
"requires": true,
"packages": {
From 9560492a84ce85acae6de880076196316db3f095 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Sun, 25 Feb 2024 23:41:33 +0100
Subject: [PATCH 096/807] [FRONTEND] move the gitea svg to web_src/svg
and run make svg to update the forgejo svg as well
---
build/generate-svg.js | 1 -
public/assets/img/svg/gitea-forgejo.svg | 10 +---------
public/assets/img/svg/gitea-gitea.svg | 2 +-
web_src/svg/gitea-gitea.svg | 1 +
4 files changed, 3 insertions(+), 11 deletions(-)
create mode 100644 web_src/svg/gitea-gitea.svg
diff --git a/build/generate-svg.js b/build/generate-svg.js
index 2c0a5e37ba..1d92bc0b19 100755
--- a/build/generate-svg.js
+++ b/build/generate-svg.js
@@ -59,7 +59,6 @@ async function main() {
await Promise.all([
...processFiles('node_modules/@primer/octicons/build/svg/*-16.svg', {prefix: 'octicon'}),
...processFiles('web_src/svg/*.svg'),
- ...processFiles('public/assets/img/gitea.svg', {fullName: 'gitea-gitea'}),
]);
}
diff --git a/public/assets/img/svg/gitea-forgejo.svg b/public/assets/img/svg/gitea-forgejo.svg
index ef617c00f3..22ae790357 100644
--- a/public/assets/img/svg/gitea-forgejo.svg
+++ b/public/assets/img/svg/gitea-forgejo.svg
@@ -1,9 +1 @@
-
+
\ No newline at end of file
diff --git a/public/assets/img/svg/gitea-gitea.svg b/public/assets/img/svg/gitea-gitea.svg
index 5d89fa1da9..61ef37074e 100644
--- a/public/assets/img/svg/gitea-gitea.svg
+++ b/public/assets/img/svg/gitea-gitea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/web_src/svg/gitea-gitea.svg b/web_src/svg/gitea-gitea.svg
new file mode 100644
index 0000000000..5d89fa1da9
--- /dev/null
+++ b/web_src/svg/gitea-gitea.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
From c4a92ec9da059fb8cf4a435ff36a7f1df5a08c0a Mon Sep 17 00:00:00 2001
From: Gusted
Date: Sun, 25 Feb 2024 23:39:07 +0100
Subject: [PATCH 097/807] [FRONTEND] fix javascript linting errors
---
web_src/js/features/repo-release.js | 4 ++--
web_src/js/standalone/forgejo-swagger.js | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/web_src/js/features/repo-release.js b/web_src/js/features/repo-release.js
index efa1f1ad40..3784bed2b1 100644
--- a/web_src/js/features/repo-release.js
+++ b/web_src/js/features/repo-release.js
@@ -2,14 +2,14 @@ import {hideElem, showElem} from '../utils/dom.js';
import {initComboMarkdownEditor} from './comp/ComboMarkdownEditor.js';
export function initRepoRelease() {
- [...document.querySelectorAll('.remove-rel-attach')].forEach((el) => {
+ for (const el of document.querySelectorAll('.remove-rel-attach')) {
el.addEventListener('click', (e) => {
const uuid = e.target.getAttribute('data-uuid');
const id = e.target.getAttribute('data-id');
document.querySelector(`input[name='attachment-del-${uuid}']`).value = 'true';
hideElem(`#attachment-${id}`);
});
- });
+ }
}
export function initRepoReleaseNew() {
diff --git a/web_src/js/standalone/forgejo-swagger.js b/web_src/js/standalone/forgejo-swagger.js
index b565827b30..2419bdb3c6 100644
--- a/web_src/js/standalone/forgejo-swagger.js
+++ b/web_src/js/standalone/forgejo-swagger.js
@@ -5,7 +5,7 @@ window.addEventListener('load', async () => {
const url = document.getElementById('swagger-ui').getAttribute('data-source');
const ui = SwaggerUI({
- url: url,
+ url,
dom_id: '#swagger-ui',
deepLinking: true,
docExpansion: 'none',
From dc825acb3358b85f05d4fa1b01fbfea9f9d5bc5d Mon Sep 17 00:00:00 2001
From: Codeberg Translate
Date: Sun, 25 Feb 2024 22:50:12 +0000
Subject: [PATCH 098/807] [I18N] Translations update from Weblate (#2428)
Translations update from [Weblate](https://translate.codeberg.org) for [Forgejo/forgejo](https://translate.codeberg.org/projects/forgejo/forgejo/).
Current translation status:
![Weblate translation status](https://translate.codeberg.org/widget/forgejo/forgejo/horizontal-auto.svg)
Co-authored-by: earl-warren
Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org>
Co-authored-by: mondstern
Co-authored-by: Wuzzy
Co-authored-by: Application-Maker
Co-authored-by: Gusted
Co-authored-by: Dirk
Co-authored-by: Squeljur
Co-authored-by: nebras
Co-authored-by: Salif Mehmed
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/2428
Co-authored-by: Codeberg Translate
Co-committed-by: Codeberg Translate
---
options/locale/locale_ar.ini | 7 +-
options/locale/locale_bg.ini | 24 ++-
options/locale/locale_de-DE.ini | 243 +++++++++++------------
options/locale/locale_fr-FR.ini | 35 +++-
options/locale/locale_nl-NL.ini | 334 +++++++++++++++++++++++++-------
options/locale/locale_ru-RU.ini | 197 ++++++++++---------
options/locale/locale_sl.ini | 67 +++++++
7 files changed, 617 insertions(+), 290 deletions(-)
diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini
index ca1127d624..7f0f9791c7 100644
--- a/options/locale/locale_ar.ini
+++ b/options/locale/locale_ar.ini
@@ -125,6 +125,7 @@ copy_hash = انسخ البصمة
remove = أزل
remove_all = أزل الكل
remove_label_str = أزل العنصر "%s"
+confirm_delete_artifact = هل أنت متأكد أنك تريد حذف العنصر '%s'؟
[install]
db_name = اسم قاعدة البيانات
@@ -573,7 +574,7 @@ settings.add_collaborator_blocked_our = لا يمكن إضافة المشترك
commits.browse_further = تصفح أكثر
settings.ignore_stale_approvals = تجاهل الطلبات الراكدة
rss.must_be_on_branch = يجب أن تكون على فرع لتحصل على موجز RSS.
-clone_in_vscodium = إستنسخ في VS Codium
+clone_in_vscodium = إستنسخ في VSCodium
admin.enabled_flags = العلامات المفعلة لهذا المستودع:
settings.new_owner_blocked_doer = المالك الجديد حظرك.
issues.comment.blocked_by_user = لا يمكنك أن ترسل تعليقاً على هذه المسألة لأنك محظور من قبل مالك المستودع أو مرسل المسألة.
@@ -1728,6 +1729,10 @@ invalid_ssh_key = فشل تحقق مفتاح الـSSH: %s
AuthName = اسم الأذن
SSPISeparatorReplacement = الفاصلة
openid_been_used = عنوان الـOpenID "%s" مُستخدم بالفعل.
+git_ref_name_error = `يجب أن يكون اسمًا مرجعيًا جيدًا لـ Git.`
+include_error = ` يجب أن يحتوي على سلسلة فرعية "%s".`
+size_error = `يجب أن يكون بالحجم %s.'
+glob_pattern_error = `النمط الشامل غير صالح: %s.`
[home]
filter = تصفيات أخرى
diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini
index 2cd88b4a62..08554a5b8d 100644
--- a/options/locale/locale_bg.ini
+++ b/options/locale/locale_bg.ini
@@ -8,7 +8,7 @@ applications = Приложения
visibility = Видимост на потребителя
location = Местоположение
password = Парола
-appearance = Външен вид
+appearance = Облик
new_password = Нова Парола
oauth2_application_edit = Редактиране
repos = Хранилища
@@ -36,7 +36,7 @@ link_account = Свързване на акаунт
add_new_gpg_key = Добавяне на GPG ключ
manage_gpg_keys = Управление на GPG ключовете
manage_ssh_keys = Управление на SSH ключовете
-old_password = Текуща Парола
+old_password = Текуща парола
public_profile = Публичен Профил
full_name = Пълно Име
security = Сигурност
@@ -89,7 +89,7 @@ create_new = Създаване…
preview = Преглеждане
disabled = Изключено
licenses = Лицензи
-sign_in = Влизане
+sign_in = Вход
copy_content = Копиране на съдържанието
user_profile_and_more = Профил и Настройки…
view = Преглед
@@ -111,7 +111,7 @@ forks = Разклонения
concept_user_organization = Организация
link_account = Свързване на акаунт
your_profile = Профил
-sign_out = Излизане
+sign_out = Изход
settings = Настройки
locked = Заключено
error = Грешка
@@ -222,6 +222,12 @@ issues.previous = Предишна
create_repo = Създаване на хранилище
template_helper = Хранилището да е шаблон
repo_name = Име на хранилището
+issues.label.filter_sort.alphabetically = По азбучен ред
+settings.event_repository = Хранилище
+issues.label.filter_sort.reverse_alphabetically = По низходящ азбучен ред
+issues.filter_sort.oldest = Най-стари
+issues.filter_sort = Сортиране
+issues.filter_sort.latest = Най-нови
[modal]
confirm = Потвърждаване
@@ -285,6 +291,11 @@ password = Парола
host = Хост
ssl_mode = SSL
install = Инсталация
+install_btn_confirm = Инсталиране на Forgejo
+app_name = Заглавие на сайта
+admin_name = Потребителско име за администратор
+confirm_password = Потвърждение на паролата
+title = Първоначална Конфигурация
[filter]
string.asc = А - Я
@@ -361,6 +372,9 @@ users.edit = Редактиране
config.db_user = Потребителско име
config.db_name = Име
first_page = Първа
+config.app_name = Заглавие на сайта
+packages.repository = Хранилище
+notices.type_1 = Хранилище
[error]
not_found = Целта не може да бъде намерена.
@@ -399,6 +413,8 @@ create_new_account = Регистриране на акаунт
active_your_account = Активирайте акаунта си
register_helper_msg = Вече имате акаунт? Влезте сега!
reset_password = Възстановяване на акаунта
+disable_register_prompt = Регистрирането е изключено. Моля, свържете се с вашия администратор на сайта.
+remember_me = Запомни ме
[aria]
footer.software = Относно Софтуера
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index e57bf94277..796bd41adf 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -12,7 +12,7 @@ sign_up=Registrieren
link_account=Account verbinden
register=Registrieren
version=Version
-powered_by=Powered by %s
+powered_by=Betrieben mit %s
page=Seite
template=Vorlage
language=Sprache
@@ -52,10 +52,10 @@ webauthn_reload=Neu laden
repository=Repository
organization=Organisation
-mirror=Mirror
+mirror=Spiegel
new_repo=Neues Repository
new_migrate=Neue Migration
-new_mirror=Neuer Mirror
+new_mirror=Neuer Spiegel
new_fork=Neuer Fork
new_org=Neue Organisation
new_project=Neues Projekt
@@ -70,7 +70,7 @@ your_settings=Einstellungen
all=Alle
sources=Quellen
-mirrors=Mirrors
+mirrors=Spiegel
collaborative=Kollaborativ
forks=Forks
@@ -141,6 +141,7 @@ name=Name
value=Wert
view = Ansehen
tracked_time_summary = Zusammenfassung erfasster Zeit, basierend auf Filtern der Issue-Liste
+confirm_delete_artifact = Bist du sicher, das Artefakt '%s' löschen zu wollen?
[aria]
navbar=Navigationsleiste
@@ -211,8 +212,8 @@ path=Pfad
sqlite_helper=Dateipfad zur SQLite3-Datenbank. Gib einen absoluten Pfad an, wenn Forgejo als Service gestartet wird.
reinstall_error=Du versuchst, in eine bereits existierende Forgejo Datenbank zu installieren
reinstall_confirm_message=Eine Neuinstallation mit einer bestehenden Forgejo-Datenbank kann mehrere Probleme verursachen. In den meisten Fällen solltest du deine vorhandene „app.ini“ verwenden, um Forgejo auszuführen. Wenn du weißt, was du tust, bestätige die folgenden Angaben:
-reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Mirrors könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält.
-reinstall_confirm_check_2=Die Repositorys und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst du, dass du die Hooks für die Repositories und die authorized_keys-Datei manuell neu synchronisierst. Du bestätigst, dass du sicherstellst, dass die Repository- und Mirror-Einstellungen korrekt sind.
+reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Spiegel könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält.
+reinstall_confirm_check_2=Die Repositorys und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst du, dass du die Hooks für die Repositories und die authorized_keys-Datei manuell neu synchronisierst. Du bestätigst, dass du sicherstellst, dass die Repository- und Spiegeleinstellungen korrekt sind.
reinstall_confirm_check_3=Du bestätigst, dass du absolut sicher bist, dass diese Forgejo mit der richtigen app.ini läuft, und du sicher bist, dass du neu installieren musst. Du bestätigst, dass du die oben genannten Risiken anerkennst.
err_empty_db_path=Der SQLite3 Datenbankpfad darf nicht leer sein.
no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen.
@@ -315,7 +316,7 @@ my_repos=Repositorys
show_more_repos=Zeige mehr Repositorys …
collaborative_repos=Gemeinschaftliche Repositorys
my_orgs=Meine Organisationen
-my_mirrors=Meine Mirrors
+my_mirrors=Meine Spiegel
view_home=%s ansehen
search_repos=Finde ein Repository …
filter=Andere Filter
@@ -587,14 +588,14 @@ invalid_ssh_key=Dein SSH-Key kann nicht überprüft werden: %s
invalid_gpg_key=Dein GPG-Key kann nicht überprüft werden: %s
invalid_ssh_principal=Ungültige Identität: %s
must_use_public_key=Der von Dir bereitgestellte Key ist ein privater Key. Bitte lade Deinen privaten Key nirgendwo hoch. Verwende stattdessen Deinen öffentlichen Key.
-unable_verify_ssh_key=„Der SSH-Key kann nicht verifiziert werden, überprüfe ihn auf Fehler.“
+unable_verify_ssh_key=Der SSH-Key kann nicht verifiziert werden, überprüfe ihn auf Fehler.
auth_failed=Authentifizierung fehlgeschlagen: %v
-still_own_repo=„Dein Konto besitzt ein oder mehrere Repositorys. Diese müssen erst gelöscht oder übertragen werden.“
-still_has_org=„Dein Konto ist Mitglied einer oder mehrerer Organisationen, verlasse diese zuerst.“
-still_own_packages=„Dein Konto besitzt ein oder mehrere Pakete, lösche diese zuerst.“
-org_still_own_repo=„Diese Organisation besitzt noch ein oder mehrere Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.“
-org_still_own_packages=„Diese Organisation besitzt noch ein oder mehrere Pakete, lösche diese zuerst.“
+still_own_repo=Dein Konto besitzt ein oder mehrere Repositorys. Diese müssen erst gelöscht oder übertragen werden.
+still_has_org=Dein Konto ist Mitglied einer oder mehrerer Organisationen, verlasse diese zuerst.
+still_own_packages=Dein Konto besitzt ein oder mehrere Pakete, lösche diese zuerst.
+org_still_own_repo=Diese Organisation besitzt noch ein oder mehrere Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
+org_still_own_packages=Diese Organisation besitzt noch ein oder mehrere Pakete, lösche diese zuerst.
target_branch_not_exist=Der Ziel-Branch existiert nicht.
username_error_no_dots = ` darf nur alphanumerische Zeichen („0-9“, „a-z“, „A-Z“), Bindestriche („-“), Unterstriche („_“) enthalten. Es kann nicht mit nicht-alphanumerischen Zeichen beginnen oder enden und aufeinanderfolgende nicht-alphanumerische Zeichen sind ebenfalls verboten.`
@@ -755,7 +756,7 @@ 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 Repositorys. Verifizierte SSH-Key können verwendet werden, um SSH-signierte Git-Commits zu signieren.
principal_desc=Diese SSH-Zertifikat-Identitäten sind mit deinem Konto verknüpft und erlauben den vollen Zugriff auf deine Repositories.
-gpg_desc=Diese öffentlichen GPG-Keys sind mit deinem Account verbunden. Halte die dazugehörigen privaten GPG-Keys geheim, da diese deine Commits signieren.
+gpg_desc=Diese öffentlichen GPG-Keys sind mit deinem Account verbunden und werden benutzt um deine Commits zu verifizieren. 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
@@ -878,7 +879,7 @@ oauth2_application_remove_description=Das Entfernen einer OAuth2-Anwendung hat z
oauth2_application_locked=Wenn es in der Konfiguration aktiviert ist, registriert Forgejo einige OAuth2-Anwendungen beim Starten vor. Um unerwartetes Verhalten zu verhindern, können diese weder bearbeitet noch entfernt werden. Weitere Informationen findest Du in der OAuth2-Dokumentation.
authorized_oauth2_applications=Autorisierte OAuth2-Anwendungen
-authorized_oauth2_applications_description=Den folgenden Drittanbieter-Apps hast du Zugriff auf deinen persönlichen Forgejo-Account gewährt. Bitte widerrufe die Autorisierung für Apps, die du nicht mehr nutzt.
+authorized_oauth2_applications_description=Den folgenden Drittanbieter-Apps hast du Zugriff auf deinen persönlichen Forgejo-Account gewährt. Bitte widerrufe die Autorisierung für Apps, die nicht länger verwendet werden.
revoke_key=Widerrufen
revoke_oauth2_grant=Autorisierung widerrufen
revoke_oauth2_grant_description=Wenn du die Autorisierung widerrufst, kann die Anwendung nicht mehr auf deine Daten zugreifen. Bist du dir sicher?
@@ -944,11 +945,12 @@ visibility.private_tooltip=Sichtbar nur für Mitglieder von Organisationen, dene
user_block_success = Dieser Benutzer wurde erfolgreich blockiert.
twofa_recovery_tip = Falls du dein Gerät verlierst, wirst du in der Lage sein, einen einmalig verwendbaren Key zu benutzen, um den auf dein Konto wiederherzustellen.
webauthn_alternative_tip = Du möchtest vielleicht eine zusätzliche Authentifizierungsmethode einrichten.
-blocked_users_none = Du hast keine Benutzer blockiert.
+blocked_users_none = Keine Benutzer blockiert.
webauthn_key_loss_warning = Falls du deine Security-Keys verlierst, wirst du Zugang zu deinem Konto verlieren.
user_unblock_success = Die Blockierung dieses Benutzers wurde erfolgreich zurückgenommen.
blocked_users = Blockierte Benutzer
blocked_since = Blockiert seit %s
+change_password = Passwort ändern
[repo]
owner=Besitzer
@@ -984,7 +986,7 @@ generate_from=Erstelle aus
repo_desc=Beschreibung
repo_desc_helper=Gib eine kurze Beschreibung an (optional)
repo_lang=Sprache
-repo_gitignore_helper=Wähle eine .gitignore-Vorlage aus.
+repo_gitignore_helper=.gitignore-Vorlagen auswählen.
repo_gitignore_helper_desc=Wähle aus einer Liste an Vorlagen für bekannte Sprachen, welche Dateien ignoriert werden sollen. Typische Artefakte, die durch die Build-Tools der gewählten Sprache generiert werden, sind standardmäßig Bestandteil der .gitignore.
issue_labels=Issue-Labels
issue_labels_helper=Wähle eine Issue-Label-Sammlung.
@@ -1005,16 +1007,16 @@ default_branch=Standardbranch
default_branch_label=Standard
default_branch_helper=Der default-Branch ist der Basisbranch für Pull-Requests und Commits.
mirror_prune=Entfernen
-mirror_prune_desc=Entferne veraltete remote-tracking-Referenzen
-mirror_interval=Mirror-Intervall (gültige Zeiteinheiten sind „h“, „m“, „s“). 0 deaktiviert die regelmäßige Synchronisation. (Minimales Intervall: %s)
+mirror_prune_desc=Entferne veraltete Remote-Tracking-Referenzen
+mirror_interval=Spiegelintervall (gültige Zeiteinheiten sind „h“, „m“, „s“). 0 deaktiviert die regelmäßige Synchronisation. (Minimales Intervall: %s)
mirror_interval_invalid=Das Spiegel-Intervall ist ungültig.
mirror_sync_on_commit=Synchronisieren, wenn Commits gepusht wurden
mirror_address=Klonen via URL
mirror_address_desc=Gib alle erforderlichen Anmeldedaten im Abschnitt „Authentifizierung“ ein.
mirror_address_url_invalid=Die angegebene URL ist ungültig. Achte darauf, alle Komponenten der URL korrekt zu maskieren.
-mirror_address_protocol_invalid=Die angegebene URL ist ungültig. Nur URLs beginnend mit http(s):// oder git:// sind möglich.
+mirror_address_protocol_invalid=Die angegebene URL ist ungültig. Nur Orte mit „http(s)://“ oder „git://“ können fürs Spiegeln benutzt werden.
mirror_lfs=Großdatei-Speicher (LFS)
-mirror_lfs_desc=Mirroring von LFS-Dateien aktivieren.
+mirror_lfs_desc=Spiegeln von LFS-Dateien aktivieren.
mirror_lfs_endpoint=LFS-Endpunkt
mirror_lfs_endpoint_desc=Sync wird versuchen, die Klon-URL zu verwenden, um den LFS-Server zu bestimmen. Du kannst auch einen eigenen Endpunkt angeben, wenn die LFS-Dateien woanders gespeichert werden.
mirror_last_synced=Zuletzt synchronisiert
@@ -1104,7 +1106,7 @@ migrate.github_token_desc=Du kannst hier ein oder mehrere Token durch Komma getr
migrate.clone_local_path=oder ein lokaler Serverpfad
migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositorys.
migrate.permission_denied_blocked=Du kannst von keinen nicht erlaubten Hosts importieren. Bitte fragen deinen Administrator, die Einstellungen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS zu überprüfen.
-migrate.invalid_local_path=„Der lokale Pfad ist ungültig. Er existiert nicht oder ist kein Verzeichnis.“
+migrate.invalid_local_path=Der lokale Pfad ist ungültig. Er existiert nicht oder ist kein Verzeichnis.
migrate.invalid_lfs_endpoint=Ungültiger LFS Endpunkt.
migrate.failed=Fehler bei der Migration: %v
migrate.migrate_items_options=Zugangs-Token wird benötigt, um zusätzliche Elemente zu migrieren
@@ -1133,7 +1135,7 @@ migrate.migrating_pulls=Pull-Requests werden migriert
migrate.cancel_migrating_title=Migration abbrechen
migrate.cancel_migrating_confirm=Möchtest du diese Migration abbrechen?
-mirror_from=Mirror von
+mirror_from=Spiegel von
forked_from=geforkt von
generated_from=erzeugt von
fork_from_self=Du kannst kein Repository forken, das dir bereits gehört.
@@ -1292,10 +1294,10 @@ editor.revert=%s zurücksetzen auf:
commits.desc=Durchsuche die Quellcode-Änderungshistorie.
commits.commits=Commits
-commits.no_commits=Keine gemeinsamen Commits. "%s" und "%s" haben vollständig unterschiedliche Historien.
+commits.no_commits=Keine gemeinsamen Commits. „%s“ und „%s“ haben vollständig unterschiedliche Historien.
commits.nothing_to_compare=Diese Branches sind auf demselben Stand.
-commits.search=Commits durchsuchen…
-commits.search.tooltip=Du kannst Suchbegriffen "author:", " committer:", "after:", oder " before:" voranstellen, z.B. "revert author:Alice before:2019-04-01".
+commits.search=Commits durchsuchen …
+commits.search.tooltip=Du kannst Suchbegriffen „author:“, „committer:“, „after:“, oder „before:“ voranstellen, z.B. „revert author:Alice before:2019-01-13“.
commits.find=Suchen
commits.search_all=Alle Branches
commits.author=Autor
@@ -1334,18 +1336,18 @@ projects.create=Projekt erstellen
projects.title=Titel
projects.new=Neues Projekt
projects.new_subheader=Koordiniere, verfolge und aktualisiere deine Arbeit an einem Ort, so dass Projekte transparent und planmäßig bleiben.
-projects.create_success=Das Projekt "%s" wurde erstellt.
+projects.create_success=Das Projekt „%s“ wurde erstellt.
projects.deletion=Projekt löschen
projects.deletion_desc=Das Löschen eines Projekts entfernt es von allen damit zusammenhängenden Issues. Fortfahren?
projects.deletion_success=Das Projekt wurde gelöscht.
projects.edit=Projekte bearbeiten
projects.edit_subheader=Benutze Projekte, um Issues zu organisieren und den Fortschritt darzustellen.
projects.modify=Projekt aktualisieren
-projects.edit_success=Projekt "%s" wurde aktualisiert.
+projects.edit_success=Projekt „%s“ wurde aktualisiert.
projects.type.none=Ohne
projects.type.basic_kanban=Einfaches Kanban
-projects.type.bug_triage=Bug Triage
-projects.template.desc=Projektvorlage
+projects.type.bug_triage=Bug-Triage
+projects.template.desc=Vorlage
projects.template.desc_helper=Wähle eine Projektvorlage aus, um loszulegen
projects.type.uncategorized=Nicht kategorisiert
projects.column.edit=Spalte bearbeiten
@@ -1354,11 +1356,11 @@ projects.column.new_title=Name
projects.column.new_submit=Spalte erstellen
projects.column.new=Neue Spalte
projects.column.set_default=Als Standard verwenden
-projects.column.set_default_desc=Diese Spalte als Standard für unkategorisierte Issues und Pull Requests festlegen
+projects.column.set_default_desc=Diese Spalte als Standard für nicht kategorisierte Issues und Pull Requests festlegen
projects.column.unset_default=Standard entfernen
-projects.column.unset_default_desc=Diese Spalte als Standard entfernen
+projects.column.unset_default_desc=Diese Spalte nicht als Standard verwenden
projects.column.delete=Spalte löschen
-projects.column.deletion_desc=Beim Löschen einer Projektspalte werden alle dazugehörigen Issues nach 'Nicht kategorisiert' verschoben. Fortfahren?
+projects.column.deletion_desc=Beim Löschen einer Projektspalte werden alle dazugehörigen Issues nach ‚Nicht kategorisiert‘ verschoben. Fortfahren?
projects.column.color=Farbe
projects.open=Öffnen
projects.close=Schließen
@@ -1375,9 +1377,9 @@ issues.filter_labels=Label filtern
issues.filter_reviewers=Reviewer filtern
issues.new=Neues Issue
issues.new.title_empty=Der Titel kann nicht leer sein
-issues.new.labels=Label
+issues.new.labels=Labels
issues.new.no_label=Kein Label
-issues.new.clear_labels=Label entfernen
+issues.new.clear_labels=Labels entfernen
issues.new.projects=Projekte
issues.new.clear_projects=Projekte löschen
issues.new.no_projects=Kein Projekt
@@ -1396,7 +1398,7 @@ issues.new.no_reviewers=Keine Reviewer
issues.choose.get_started=Los geht's
issues.choose.open_external_link=Öffnen
issues.choose.blank=Standard
-issues.choose.blank_about=Erstelle einen Issue aus dem Standardtemplate.
+issues.choose.blank_about=Erstelle ein Issue aus der Standardvorlage.
issues.choose.ignore_invalid_templates=Ungültige Vorlagen wurden ignoriert
issues.choose.invalid_templates=%v ungültige Vorlage(n) gefunden
issues.choose.invalid_config=Die Issue-Konfiguration enthält Fehler:
@@ -1406,11 +1408,11 @@ issues.new_label=Neues Label
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 Label. Erstelle ein neues Label („Neues Label“) oder verwende das Standard-Label-Set:
+issues.label_templates.title=Eine vordefinierte Label-Sammung laden
+issues.label_templates.info=Es existieren noch keine Labels. Erstelle ein neues Label („Neues Label“) oder verwende die Standard-Label-Sammlung:
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-Vorlagen-Datei „%s“: %v
issues.add_label=hat das Label %s %s hinzugefügt
issues.add_labels=hat die Labels %s %s hinzugefügt
issues.remove_label=hat das Label %s %s entfernt
@@ -1434,8 +1436,8 @@ issues.remove_ref_at=`hat die Referenz %s entfernt %s`
issues.add_ref_at=`hat die Referenz %s hinzugefügt %s`
issues.delete_branch_at=`löschte die Branch %s %s`
issues.filter_label=Label
-issues.filter_label_exclude=„Alt + Klick/Enter verwenden, um Label auszuschließen”
-issues.filter_label_no_select=Alle Label
+issues.filter_label_exclude=`Alt + Klick/Enter verwenden, um Labels auszuschließen`
+issues.filter_label_no_select=Alle Labels
issues.filter_label_select_no_label=Kein Label
issues.filter_milestone=Meilenstein
issues.filter_milestone_all=Alle Meilensteine
@@ -1512,9 +1514,9 @@ issues.closed_at=`hat diesen Issue %[2]s geschlo
issues.reopened_at=`hat diesen Issue %[2]s wieder geöffnet`
issues.commit_ref_at=`hat dieses Issue %[2]s aus einem Commit referenziert`
issues.ref_issue_from=`hat%[2]sauf dieses Issue verwiesen %[4]s`
-issues.ref_pull_from=`hat%[2]sauf diesen Pull Request verwiesen %[4]s`
-issues.ref_closing_from=`hat%[2]sauf einen Pull Request %[4]s verwiesen, welcher das Issue schließen wird`
-issues.ref_reopening_from=`hat auf einen Pull Request %[4]s verwiesen, welcher das Issue%[2]s erneut öffnen wird`
+issues.ref_pull_from=`hat%[2]sauf diesen Pull-Request verwiesen %[4]s`
+issues.ref_closing_from=`hat%[2]sauf einen Pull-Request %[4]s verwiesen, welcher das Issue schließen wird`
+issues.ref_reopening_from=`hat auf einen Pull-Request %[4]s verwiesen, welcher das Issue%[2]s erneut öffnen wird`
issues.ref_closed_from=`hat dieses Issue %[4]s geschlossen%[2]s`
issues.ref_reopened_from=`hat dieses Issue %[4]s%[2]s wieder geöffnet`
issues.ref_from=`von %[1]s`
@@ -1546,10 +1548,10 @@ issues.label_color=Labelfarbe
issues.label_exclusive=Exklusiv
issues.label_archive=Label archivieren
issues.label_archived_filter=Archivierte Labels anzeigen
-issues.label_archive_tooltip=Archivierte Labels werden bei der Suche nach Label standardmäßig von den Vorschlägen ausgeschlossen.
+issues.label_archive_tooltip=Archivierte Labels werden bei der Suche nach Labels standardmäßig von den Vorschlägen ausgeschlossen.
issues.label_exclusive_desc=Nenne das Label Bereich/Element um es gegenseitig ausschließend mit anderen Bereich/ Labels zu machen.
issues.label_exclusive_warning=Alle im Konflikt stehenden Labels werden beim Bearbeiten der Labels eines Issues oder eines Pull-Requests entfernt.
-issues.label_count=%d Label
+issues.label_count=%d Labels
issues.label_open_issues=%d offene Issues
issues.label_edit=Bearbeiten
issues.label_delete=Löschen
@@ -1595,7 +1597,7 @@ issues.delete.text=Möchtest du dieses Issue wirklich löschen? (Dadurch wird de
issues.tracker=Zeiterfassung
issues.start_tracking_short=Zeiterfassung starten
issues.start_tracking=Zeiterfassung starten
-issues.start_tracking_history=hat die Zeiterfassung %s gestartet
+issues.start_tracking_history=`hat die Zeiterfassung %s gestartet`
issues.tracker_auto_close=Der Timer wird automatisch gestoppt, wenn dieser Issue geschlossen wird
issues.tracking_already_started=`Du hast die Zeiterfassung bereits in diesem Issue gestartet!`
issues.stop_tracking=Zeiterfassung stoppen
@@ -1614,7 +1616,7 @@ issues.add_time_sum_to_small=Es wurde keine Zeit eingegeben.
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.push_commit_1=hat %d Commit %s hinzugefügt
@@ -1638,7 +1640,7 @@ issues.dependency.pr_no_dependencies=Keine Abhängigkeiten gesetzt.
issues.dependency.no_permission_1=Du bist nicht berechtigt %d Abhängigkeit zu lesen
issues.dependency.no_permission_n=Du bist nicht berechtigt %d Abhängigkeiten zu lesen
issues.dependency.no_permission.can_remove=Du hast keine Berechtigung diese Abhängigkeit zu lesen, kannst diese Abhängigkeit aber entfernen
-issues.dependency.add=Abhängigkeit hinzufügen…
+issues.dependency.add=Abhängigkeit hinzufügen …
issues.dependency.cancel=Abbrechen
issues.dependency.remove=Entfernen
issues.dependency.remove_info=Abhängigkeit löschen
@@ -1649,7 +1651,7 @@ issues.dependency.issue_closing_blockedby=Das Schließen dieses Issues wird von
issues.dependency.issue_close_blocks=Dieses Issue blockiert die Schließung der folgenden Issues
issues.dependency.pr_close_blocks=Dieser Pull-Request blockiert die Schließung der folgenden Issues
issues.dependency.issue_close_blocked=Du musst alle Issues, die dieses Issue blockieren, schließen, bevor du es schließen kannst.
-issues.dependency.issue_batch_close_blocked=Das Schließen der ausgewählten Issues ist nicht möglich, da das Issue #%d noch offene Abhängigkeiten hat
+issues.dependency.issue_batch_close_blocked=Das massenweise Schließen der ausgewählten Issues ist nicht möglich, da das Issue #%d noch offene Abhängigkeiten hat
issues.dependency.pr_close_blocked=Du musst alle Issues, die diesen Pull-Request blockieren, schließen, bevor du ihn mergen kannst.
issues.dependency.blocks_short=Blockiert
issues.dependency.blocked_by_short=Abhängig von
@@ -1677,7 +1679,7 @@ issues.review.add_review_request=hat ein Review von %s %s angefragt
issues.review.remove_review_request=hat die Aufforderung zum Review an %s %s entfernt
issues.review.remove_review_request_self=hat das Review verweigert %s
issues.review.pending=Ausstehend
-issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle "%s" -> "%s/%s/%s" oben auf der Seite.
+issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite.
issues.review.review=Review
issues.review.reviewers=Reviewer
issues.review.outdated=Veraltet
@@ -1688,8 +1690,8 @@ issues.review.show_outdated=Veraltete anzeigen
issues.review.hide_outdated=Veraltete ausblenden
issues.review.show_resolved=Gelöste anzeigen
issues.review.hide_resolved=Gelöste ausblenden
-issues.review.resolve_conversation=Diskussion als "erledigt" markieren
-issues.review.un_resolve_conversation=Diskussion als "nicht-erledigt" markieren
+issues.review.resolve_conversation=Diskussion als „erledigt“ markieren
+issues.review.un_resolve_conversation=Diskussion als „nicht erledigt“ markieren
issues.review.resolved_by=markierte diese Unterhaltung als gelöst
issues.assignee.error=Aufgrund eines unerwarteten Fehlers konnten nicht alle Beauftragten hinzugefügt werden.
issues.reference_issue.body=Beschreibung
@@ -1713,7 +1715,7 @@ pulls.allow_edits_from_maintainers_desc=Nutzer mit Schreibzugriff auf den Basisb
pulls.allow_edits_from_maintainers_err=Aktualisieren fehlgeschlagen
pulls.compare_changes_desc=Wähle den Ziel- und Quellbranch aus.
pulls.has_viewed_file=Gesehen
-pulls.has_changed_since_last_review=Inzwischen geändert
+pulls.has_changed_since_last_review=Nach deinem letzten Review geändert
pulls.viewed_files_label=%[1]d / %[2]d Dateien reviewed
pulls.expand_files=Alle Dateien ausklappen
pulls.collapse_files=Alle Dateien einklappen
@@ -1748,25 +1750,25 @@ pulls.closed=Pull-Request geschlossen
pulls.manually_merged=Manuell gemergt
pulls.merged_info_text=Der Branch %s kann jetzt gelöscht werden.
pulls.is_closed=Der Pull-Request wurde geschlossen.
-pulls.title_wip_desc=`Beginne den Titel mit %s um zu verhindern, dass der Pull Request versehentlich gemergt wird.`
-pulls.cannot_merge_work_in_progress=Dieser Pull Request ist als Work in Progress markiert.
+pulls.title_wip_desc=`Beginne den Titel mit %s, um zu verhindern, dass der Pull-Request versehentlich gemergt wird.`
+pulls.cannot_merge_work_in_progress=Dieser Pull Request ist als „Work in Progress“ (in Bearbeitung) markiert.
pulls.still_in_progress=Noch in Bearbeitung?
pulls.add_prefix=%s Präfix hinzufügen
pulls.remove_prefix=%s Präfix entfernen
pulls.data_broken=Dieser Pull-Requests ist kaputt, da Fork-Informationen gelöscht wurden.
pulls.files_conflicted=Dieser Pull-Request hat Änderungen, die im Widerspruch zum Ziel-Branch stehen.
-pulls.is_checking=Die Konfliktprüfung läuft noch. Bitte aktualisiere die Seite in wenigen Augenblicken.
+pulls.is_checking=Die Merge-Konfliktprüfung läuft noch. Bitte aktualisiere die Seite in wenigen Augenblicken.
pulls.is_ancestor=Dieser Branch ist bereits im Zielbranch enthalten. Es gibt nichts zu mergen.
pulls.is_empty=Die Änderungen an diesem Branch sind bereits auf dem Zielbranch. Dies wird ein leerer Commit sein.
pulls.required_status_check_failed=Einige erforderliche Prüfungen waren nicht erfolgreich.
pulls.required_status_check_missing=Einige erforderliche Prüfungen fehlen.
pulls.required_status_check_administrator=Als Administrator kannst du diesen Pull-Request weiterhin mergen.
-pulls.blocked_by_approvals=Dieser Pull-Request hat noch nicht genügend Zustimmungen. %d von %d Zustimmungen erteilt.
+pulls.blocked_by_approvals=Dieser Pull-Request hat noch nicht genügend Genehmigungen. %d von %d Genehmigungen erteilt.
pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Reviewer angefragt wurden.
-pulls.blocked_by_official_review_requests=„Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Reviewern fehlt.“
-pulls.blocked_by_outdated_branch=Dieser Pull Request ist blockiert, da er veraltet ist.
-pulls.blocked_by_changed_protected_files_1=Dieser Pull Request ist blockiert, weil er eine geschützte Datei ändert:
-pulls.blocked_by_changed_protected_files_n=Dieser Pull Request ist blockiert, weil er geschützte Dateien ändert:
+pulls.blocked_by_official_review_requests=Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Reviewern fehlt.
+pulls.blocked_by_outdated_branch=Dieser Pull-Request ist blockiert, da er veraltet ist.
+pulls.blocked_by_changed_protected_files_1=Dieser Pull-Request ist blockiert, weil er eine geschützte Datei ändert:
+pulls.blocked_by_changed_protected_files_n=Dieser Pull-Request ist blockiert, weil er geschützte Dateien ändert:
pulls.can_auto_merge_desc=Dieser Pull-Request kann automatisch gemergt werden.
pulls.cannot_auto_merge_desc=Dieser Pull-Request kann nicht automatisch gemergt werden, da es Konflikte gibt.
pulls.cannot_auto_merge_helper=Bitte manuell mergen, um die Konflikte zu beheben.
@@ -1780,15 +1782,15 @@ pulls.waiting_count_1=%d wartendes Review
pulls.waiting_count_n=%d wartende Reviews
pulls.wrong_commit_id=die Commit ID muss eine Commit ID auf dem Zielbranch sein
-pulls.no_merge_desc=Dieser Pull-Request kann nicht gemerged werden, da keine Mergeoptionen aktiviert sind.
+pulls.no_merge_desc=Dieser Pull-Request kann nicht gemergt werden, da alle Repository-Merge-Optionen deaktiviert sind.
pulls.no_merge_helper=Aktiviere Mergeoptionen in den Repositoryeinstellungen oder merge den Pull-Request manuell.
-pulls.no_merge_wip=Dieser Pull Request kann nicht gemergt werden, da er als Work In Progress gekennzeichnet ist.
+pulls.no_merge_wip=Dieser Pull-Request kann nicht gemergt werden, da er als „Work in Progress“ (in Bearbeitung) markiert ist.
pulls.no_merge_not_ready=Dieser Pull-Request kann nicht gemergt werden, überprüfe den Reviewstatus und die Statusprüfungen.
pulls.no_merge_access=Du bist nicht berechtigt, diesen Pull-Request zu mergen.
-pulls.merge_pull_request=Merge Commit erstellen
+pulls.merge_pull_request=Merge-Commit erstellen
pulls.rebase_merge_pull_request=Rebasen und dann fast-forwarden
pulls.rebase_merge_commit_pull_request=Rebasen und dann mergen
-pulls.squash_merge_pull_request=Squash Commit erstellen
+pulls.squash_merge_pull_request=Squash-Commit erstellen
pulls.merge_manually=Manuell mergen
pulls.merge_commit_id=Der Mergecommit ID
pulls.require_signed_wont_sign=Der Branch erfordert einen signierten Commit, aber dieser Merge wird nicht signiert
@@ -1822,7 +1824,7 @@ pulls.close=Pull-Request schließen
pulls.closed_at=`hat diesen Pull-Request %[2]s geschlossen`
pulls.reopened_at=`hat diesen Pull-Request %[2]s wieder geöffnet`
pulls.clear_merge_message=Merge-Nachricht löschen
-pulls.clear_merge_message_hint=Das Löschen der Merge-Nachricht wird nur den Inhalt der Commit-Nachricht entfernen und generierte Git-Trailer wie "Co-Authored-By …" erhalten.
+pulls.clear_merge_message_hint=Das Löschen der Merge-Nachricht wird nur den Inhalt der Commit-Nachricht entfernen und generierte Git-Trailer wie „Co-Authored-By …“ erhalten.
pulls.auto_merge_button_when_succeed=(Wenn die Checks erfolgreich sind)
pulls.auto_merge_when_succeed=Automergen, sobald alle Checks erfüllt sind
@@ -1830,7 +1832,7 @@ pulls.auto_merge_newly_scheduled=Der Pull-Request wird automatisch gemergt, wenn
pulls.auto_merge_has_pending_schedule=%[1]s hat einen Automerge für diesen Pull-Request %[2]s geplant.
pulls.auto_merge_cancel_schedule=Automerge abbrechen
-pulls.auto_merge_not_scheduled=Dieser Pull Request hat keinen geplanten Automerge.
+pulls.auto_merge_not_scheduled=Dieser Pull-Request hat kein geplantes Auto-Merge.
pulls.auto_merge_canceled_schedule=Der Automerge dieses Pull-Requests wurde abgebrochen.
pulls.auto_merge_newly_scheduled_comment=`hat einen Automerge für diesen Pull-Request %[1]s geplant`
@@ -1839,7 +1841,7 @@ pulls.auto_merge_canceled_schedule_comment=`hat den Automerge für diesen Pull-R
pulls.delete.title=Diesen Pull-Request löschen?
pulls.delete.text=Willst du diesen Pull-Request wirklich löschen? (Dies wird den Inhalt unwiderruflich löschen. Überlege, ob du ihn nicht lieber schließen willst, um ihn zu archivieren)
-pulls.recently_pushed_new_branches=Du hast auf den Branch %[1]s %[2]s gepusht
+pulls.recently_pushed_new_branches=Du hast auf den Branch %[1]s %[2]s gepusht
pull.deleted_branch=(gelöscht):%s
@@ -1850,19 +1852,19 @@ milestones.no_due_date=Kein Fälligkeitsdatum
milestones.open=Öffnen
milestones.close=Schließen
milestones.new_subheader=Benutze Meilensteine, um Issues zu organisieren und den Fortschritt darzustellen.
-milestones.completeness=%d%% abgeschlossen
+milestones.completeness=%d%% abgeschlossen
milestones.create=Meilenstein erstellen
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.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=Meilenstein "%s" wurde aktualisiert.
+milestones.edit_success=Meilenstein „%s“ wurde aktualisiert.
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.
@@ -1873,7 +1875,7 @@ milestones.filter_sort.most_complete=Vollständigste
milestones.filter_sort.most_issues=Meiste Issues
milestones.filter_sort.least_issues=Wenigste Issues
-signing.will_sign=Dieser Commit wird mit dem Key "%s" signiert werden.
+signing.will_sign=Dieser Commit wird mit dem Key „%s“ signiert werden.
signing.wont_sign.error=Es gab einen Fehler bei der Prüfung, ob der Commit signiert werden kann.
signing.wont_sign.nokey=Es ist kein Schlüssel zum Signieren dieses Commits verfügbar.
signing.wont_sign.never=Commits werden nie signiert.
@@ -1884,7 +1886,7 @@ signing.wont_sign.parentsigned=Der Commit wird nicht signiert werden, da der vor
signing.wont_sign.basesigned=Der Merge Commit wird nicht signiert werden, da der Basis-Commit nicht signiert ist.
signing.wont_sign.headsigned=Der Merge Commit wird nicht signiert werden, da der Head-Commit nicht signiert ist.
signing.wont_sign.commitssigned=Der Merge Commit wird nicht signiert werden, da alle zugehörigen Commits nicht signiert sind.
-signing.wont_sign.approved=Der Merge Commit wird nicht signiert werden, da der Pull Request nicht genehmigt wurde.
+signing.wont_sign.approved=Der Merge-Commit wird nicht signiert werden, da der Pull-Request nicht genehmigt wurde.
signing.wont_sign.not_signed_in=Du bist nicht eingeloggt.
ext_wiki=Zugriff auf externes Wiki
@@ -1902,19 +1904,19 @@ wiki.page_title=Seitentitel
wiki.page_content=Seiteninhalt
wiki.default_commit_message=Beschreibe diese Änderung (optional).
wiki.save_page=Seite speichern
-wiki.last_commit_info=%s hat diese Seite bearbeitet %s
+wiki.last_commit_info=%s hat diese Seite %s bearbeitet
wiki.edit_page_button=Bearbeiten
wiki.new_page_button=Neue Seite
wiki.file_revision=Seitenversion
wiki.wiki_page_revisions=Wiki Änderungsverlauf
wiki.back_to_wiki=Zurück zur Wiki-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
-wiki.page_name_desc=Gib einen Namen für diese Wiki-Seite ein. Spezielle Namen sind: 'Home', '_Sidebar' und '_Footer'.
+wiki.page_name_desc=Gib einen Namen für diese Wiki-Seite ein. Einige spezielle Namen lauten: „Home“, „_Sidebar“ und „_Footer“.
wiki.original_git_entry_tooltip=Originale Git-Datei anstatt eines benutzerfreundlichen Links anzeigen.
activity=Aktivität
@@ -1991,11 +1993,11 @@ search.fuzzy.tooltip=Zeige auch Ergebnisse, die dem Suchbegriff ähneln
search.match=Genau
search.match.tooltip=Zeige nur Ergebnisse, die exakt mit dem Suchbegriff übereinstimmen
search.results=Suchergebnisse für „%s“ in %s
-search.code_no_results=Es konnte kein passender Code für deinen Suchbegriff gefunden werden.
+search.code_no_results=Es konnte kein passender Quellcode für deinen Suchbegriff gefunden werden.
search.code_search_unavailable=Derzeit ist die Code-Suche nicht verfügbar. Bitte wende dich an den Website-Administrator.
settings=Einstellungen
-settings.desc=In den Einstellungen kannst du die Einstellungen des Repositories anpassen
+settings.desc=In den Einstellungen kannst du die Einstellungen des Repositorys anpassen
settings.options=Repository
settings.collaboration=Mitarbeiter
settings.collaboration.admin=Administrator
@@ -2006,35 +2008,35 @@ settings.collaboration.undefined=Nicht definiert
settings.hooks=Webhooks
settings.githooks=Git-Hooks
settings.basic_settings=Grundeinstellungen
-settings.mirror_settings=Mirror-Einstellungen
-settings.mirror_settings.docs=Richte Dein Repository so ein, dass es automatisch Commits, Tags und Branches mit einem anderen Repository synchronisieren kann.
-settings.mirror_settings.docs.disabled_pull_mirror.instructions=Richte Dein Projekt so ein, dass es automatisch Commits, Tags und Branches in ein anderes Repository pusht. Pull-Mirrors wurden von Deinem Website-Administrator deaktiviert.
-settings.mirror_settings.docs.disabled_push_mirror.instructions=Richte Dein Repository so ein, dass es automatisch Commits, Tags und Branches aus einem anderen Repository pullen kann.
-settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=Im Moment ist dies nur im Menü "Neue Migration" möglich. Für weitere Informationen konsultiere bitte:
-settings.mirror_settings.docs.disabled_push_mirror.info=Push-Mirrors wurden von Ihrem Administrator deaktiviert.
-settings.mirror_settings.docs.no_new_mirrors=Dein Repository spiegelt Änderungen von oder zu einem anderen Repository. Bitte beachte, dass du gerade keine neuen Mirror anlegen kannst.
-settings.mirror_settings.docs.can_still_use=Obwohl du existierende Mirrors gerade nicht bearbeiten oder neu anlegen kannst, sind bestehende Mirrors weiterhin nutzbar.
-settings.mirror_settings.docs.pull_mirror_instructions=Um einen Pull-Mirror einzurichten, konsultiere bitte:
-settings.mirror_settings.docs.more_information_if_disabled=Hier kannst du mehr über Push- und Pull-Mirrors erfahren:
-settings.mirror_settings.docs.doc_link_title=Wie spiegele ich Repositories?
-settings.mirror_settings.docs.doc_link_pull_section=den Abschnitt "Von einem entfernten Repository pullen" in der Dokumentation.
+settings.mirror_settings=Spiegeleinstellungen
+settings.mirror_settings.docs=Richte dein Repository so ein, dass es automatisch Commits, Tags und Branches mit einem anderen Repository synchronisieren kann.
+settings.mirror_settings.docs.disabled_pull_mirror.instructions=Richte dein Projekt so ein, dass es automatisch Commits, Tags und Branches in ein anderes Repository pusht. Pull-Spiegel wurden von deinem Website-Administrator deaktiviert.
+settings.mirror_settings.docs.disabled_push_mirror.instructions=Richte dein Repository so ein, dass es automatisch Commits, Tags und Branches aus einem anderen Repository pullen kann.
+settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning=Im Moment ist dies nur im Menü „Neue Migration“ möglich. Für weitere Informationen konsultiere bitte:
+settings.mirror_settings.docs.disabled_push_mirror.info=Push-Spiegel wurden von deinem Administrator deaktiviert.
+settings.mirror_settings.docs.no_new_mirrors=Dein Repository spiegelt Änderungen von oder zu einem anderen Repository. Bitte beachte, dass du gerade keine neuen Spiegel anlegen kannst.
+settings.mirror_settings.docs.can_still_use=Obwohl du existierende Spiegel gerade nicht bearbeiten oder neu anlegen kannst, sind bestehende Spiegel weiterhin nutzbar.
+settings.mirror_settings.docs.pull_mirror_instructions=Um einen Pull-Spiegel einzurichten, konsultiere bitte:
+settings.mirror_settings.docs.more_information_if_disabled=Hier kannst du mehr über Push- und Pull-Spiegel erfahren:
+settings.mirror_settings.docs.doc_link_title=Wie spiegele ich Repositorys?
+settings.mirror_settings.docs.doc_link_pull_section=den Abschnitt „Aus einem Remote-Repository pullen“ in der Dokumentation.
settings.mirror_settings.docs.pulling_remote_title=Aus einem Remote-Repository pullen
settings.mirror_settings.mirrored_repository=Gespiegeltes Repository
settings.mirror_settings.direction=Richtung
settings.mirror_settings.direction.pull=Pull
settings.mirror_settings.direction.push=Push
settings.mirror_settings.last_update=Letzte Aktualisierung
-settings.mirror_settings.push_mirror.none=Keine Push-Mirrors konfiguriert
+settings.mirror_settings.push_mirror.none=Keine Push-Spiegel konfiguriert
settings.mirror_settings.push_mirror.remote_url=URL zum Git-Remote-Repository
-settings.mirror_settings.push_mirror.add=Push-Mirror hinzufügen
-settings.mirror_settings.push_mirror.edit_sync_time=Mirror-Sync-Intervall anpassen
+settings.mirror_settings.push_mirror.add=Push-Spiegel hinzufügen
+settings.mirror_settings.push_mirror.edit_sync_time=Spiegel-Sync-Intervall anpassen
settings.sync_mirror=Jetzt synchronisieren
settings.pull_mirror_sync_in_progress=Aktuell werden Änderungen von %s gepullt.
settings.push_mirror_sync_in_progress=Aktuell werden Änderungen auf %s gepusht.
settings.site=Webseite
settings.update_settings=Einstellungen speichern
-settings.update_mirror_settings=Mirror-Einstellungen aktualisieren
+settings.update_mirror_settings=Spiegeleinstellungen aktualisieren
settings.branches.switch_default_branch=Standardbranch wechseln
settings.branches.update_default_branch=Standardbranch aktualisieren
settings.branches.add_new_rule=Neue Regel hinzufügen
@@ -2059,13 +2061,13 @@ settings.tracker_issue_style.alphanumeric=Alphanumerisch
settings.tracker_issue_style.regexp=Regulärer Ausdruck
settings.tracker_issue_style.regexp_pattern=Regulärer Ausdruck
settings.tracker_issue_style.regexp_pattern_desc=Die erste gecapturte Gruppe wird statt {index} verwendet.
-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
settings.pulls.ignore_whitespace=Bei Konflikten Leerzeichen ignorieren
settings.pulls.enable_autodetect_manual_merge=Autoerkennung von manuellen Merges aktivieren (in Ausnahmefällen können Fehleinschätzungen auftreten)
-settings.pulls.allow_rebase_update=Update von Pull Request Branches per Rebase erlauben
+settings.pulls.allow_rebase_update=Update von Pull-Request-Branches per Rebase erlauben
settings.pulls.default_delete_branch_after_merge=Standardmäßig bei Pull-Requests den Branch nach dem Mergen löschen
settings.pulls.default_allow_edits_from_maintainers=Änderungen von Maintainern standardmäßig erlauben
settings.releases_desc=Repository-Releases aktivieren
@@ -2082,12 +2084,12 @@ settings.reindex_button=Zur Warteschlange für erneutes Indexieren hinzufügen
settings.reindex_requested=Erneutes Indexieren angefordert
settings.admin_enable_close_issues_via_commit_in_any_branch=Einen Issue mit einem Commit auf einem nicht-Standard-Branch schließen
settings.danger_zone=Gefahrenzone
-settings.new_owner_has_same_repo=Der neue Eigentümer hat bereits ein Repository mit dem gleichen Namen. Bitte wähle einen anderen Namen.
+settings.new_owner_has_same_repo=Der neue Besitzer hat bereits ein Repository mit dem gleichen Namen. Bitte wähle einen anderen Namen.
settings.convert=In ein normales Repository umwandeln
-settings.convert_desc=Dieser Mirror kann in ein normales Repository umgewandelt werden. Dies kann nicht rückgängig gemacht werden.
-settings.convert_notices_1=Dieser Vorgang wandelt das Mirror-Repository in ein normales Repository um. Dies kann nicht rückgängig gemacht werden.
+settings.convert_desc=Dieser Spiegel kann in ein normales Repository umgewandelt werden. Dies kann nicht rückgängig gemacht werden.
+settings.convert_notices_1=Dieser Vorgang wandelt das Spiegel-Repository in ein normales Repository um. Dies kann nicht rückgängig gemacht werden.
settings.convert_confirm=Repository umwandeln
-settings.convert_succeed=Das Mirror-Repository wurde erfolgreich in ein normales Repository umgewandelt.
+settings.convert_succeed=Das Spiegel-Repository wurde erfolgreich in ein normales Repository umgewandelt.
settings.convert_fork=In ein normales Repository umwandeln
settings.convert_fork_desc=Du kannst diesen Fork in ein normales Repository umwandeln. Dies kann nicht rückgängig gemacht werden.
settings.convert_fork_notices_1=Dieser Vorgang konvertiert den Fork in ein normales Repository und kann nicht rückgängig gemacht werden.
@@ -2107,7 +2109,7 @@ settings.transfer_notices_2=– Du wirst weiterhin Zugriff haben, wenn der neue
settings.transfer_notices_3=- Wenn das Repository privat ist und an einen einzelnen Benutzer übertragen wird, wird sichergestellt, dass der Benutzer mindestens Leserechte hat (und die Berechtigungen werden gegebenenfalls ändert).
settings.transfer_owner=Neuer Besitzer
settings.transfer_perform=Übertragung durchführen
-settings.transfer_started=`Für dieses Repository wurde eine Übertragung eingeleitet und wartet nun auf die Bestätigung von "%s"`
+settings.transfer_started=Für dieses Repository wurde eine Übertragung eingeleitet und wartet nun auf die Bestätigung von „%s“
settings.transfer_succeed=Das Repository wurde transferiert.
settings.signing_settings=Signaturüberprüfungseinstellungen
settings.trust_model=Signaturvertrauensmodell
@@ -2115,13 +2117,13 @@ settings.trust_model.default=Standardvertrauensmodell
settings.trust_model.default.desc=Verwende das Standardvertrauensmodell für diese Installation.
settings.trust_model.collaborator=Mitarbeiter
settings.trust_model.collaborator.long=Mitarbeiter: Vertraue Signaturen von Mitarbeitern
-settings.trust_model.collaborator.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als "vertrauenswürdig" markiert - ( egal ob sie mit dem Committer übereinstimmen oder nicht). Andernfalls werden gültige Signaturen als "nicht vertrauenswürdig" markiert, unabhängig ob die Signatur mit dem Committer übereinstimmt oder nicht.
+settings.trust_model.collaborator.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert (egal, ob sie mit dem Committer übereinstimmen oder nicht). Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, falls die Signatur zum Committer passt, ansonsten werden sie als „nicht übereinstimmend“ markiert.
settings.trust_model.committer=Committer
settings.trust_model.committer.long=Committer: Vertraue Signaturen, die zu Committern passen (Dies stimmt mit GitHub überein und zwingt signierte Commits von Forgejo dazu, Forgejo als Committer zu haben)
-settings.trust_model.committer.desc=Gültige Signaturen von Mitwirkenden werden als "vertrauenswürdig" gekennzeichnet, wenn sie mit ihrem Committer übereinstimmen. Ansonsten werden sie als "nicht übereinstimmend" markiert. Das führt dazu, dass Forgejo auf signierten Commits, bei denen der echte Committer als Co-authored-by: oder Co-committed-by in der Beschreibung eingetragen wurde, als Committer gilt. Der Forgejo Standard-Key muss auf einen User in der Datenbank zeigen.
+settings.trust_model.committer.desc=Gültige Signaturen werden nur dann als „vertrauenswürdig“ gekennzeichnet, wenn sie mit ihrem Committer übereinstimmen. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Das führt dazu, dass Forgejo auf signierten Commits, bei denen der echte Committer als „Co-authored-by:“ oder „Co-committed-by:“ in der Beschreibung eingetragen wurde, als Committer gilt. Der Forgejo-Standard-Key muss zu einem Benutzer in der Datenbank passen.
settings.trust_model.collaboratorcommitter=Mitarbeiter+Committer
settings.trust_model.collaboratorcommitter.long=Mitarbeiter+Committer: Signaturen der Mitarbeiter vertrauen die mit dem Committer übereinstimmen
-settings.trust_model.collaboratorcommitter.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als "vertrauenswürdig" markiert, wenn sie mit dem Committer übereinstimmen. Andernfalls werden gültige Signaturen als "nicht vertrauenswürdig" markiert, wenn die Signatur mit dem Committer übereinstimmt als "nicht übereinstimmend". Dies zwingt Forgejo als Committer bei signierten Commits mit dem tatsächlichen Committer als Co-Authored-By: und Co-Committed-By: Trailer im Commit. Der Standard-Forgejo-Schlüssel muss mit einem Benutzer in der Datenbank übereinstimmen.
+settings.trust_model.collaboratorcommitter.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert, wenn sie mit dem Committer übereinstimmen. Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, wenn die Signatur mit dem Committer übereinstimmt. Ansonsten werden sie als als „nicht übereinstimmend“ margiert. Dies zwingt Forgejo, als Committer bei signierten Commits mit dem echten Committer als „Co-Authored-By:“ und „Co-Committed-By:“ im Commit zu markieren. Der Standard-Forgejo-Schlüssel muss mit einem Benutzer in der Datenbank übereinstimmen.
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.
@@ -2131,7 +2133,7 @@ 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=- Forks dieses Repositories werden nach dem Löschen unabhängig.
+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_no_unit=Das Repository sollte mindestens eine Art der Interaktion erlauben.
@@ -2145,7 +2147,7 @@ settings.delete_collaborator=Entfernen
settings.collaborator_deletion=Mitarbeiter entfernen
settings.collaborator_deletion_desc=Nach dem Löschen wird dieser Mitarbeiter keinen Zugriff mehr auf dieses Repository haben. Fortfahren?
settings.remove_collaborator_success=Der Mitarbeiter wurde entfernt.
-settings.search_user_placeholder=Benutzer suchen…
+settings.search_user_placeholder=Benutzer suchen …
settings.org_not_allowed_to_be_collaborator=Organisationen können nicht als Mitarbeiter hinzugefügt werden.
settings.change_team_access_not_allowed=Nur der Besitzer der Organisation kann die Zugangsrechte des Teams ändern
settings.team_not_in_organization=Das Team ist nicht in der gleichen Organisation wie das Repository
@@ -2153,9 +2155,9 @@ settings.teams=Teams
settings.add_team=Team hinzufügen
settings.add_team_duplicate=Das Team ist dem Repository schon zugeordnet
settings.add_team_success=Das Team hat nun Zugriff auf das Repository.
-settings.search_team=Team suchen…
+settings.search_team=Team suchen …
settings.change_team_permission_tip=Die Team-Berechtigung ist auf der Team-Einstellungsseite festgelegt und kann nicht für ein Repository geändert werden
-settings.delete_team_tip=Dieses Team hat Zugriff auf alle Repositories und kann nicht entfernt werden
+settings.delete_team_tip=Dieses Team hat Zugriff auf alle Repositorys und kann nicht entfernt werden
settings.remove_team_success=Der Zugriff des Teams auf das Repository wurde zurückgezogen.
settings.add_webhook=Webhook hinzufügen
settings.add_webhook.invalid_channel_name=Der Name des Webhook-Kanals darf nicht leer sein und darf nicht nur das Zeichen # enthalten.
@@ -2192,7 +2194,7 @@ settings.discord_icon_url=Icon-URL
settings.event_desc=Auslösen bei:
settings.event_push_only=Push-Events
settings.event_send_everything=Alle Events
-settings.event_choose=Benutzerdefinierte Events…
+settings.event_choose=Benutzerdefinierte Events …
settings.event_header_repository=Repository-Ereignisse
settings.event_create=Erstellen
settings.event_create_desc=Branch oder Tag erstellt.
@@ -2208,7 +2210,7 @@ settings.event_push=Push
settings.event_push_desc=Git push in ein Repository.
settings.event_repository=Repository
settings.event_repository_desc=Repository erstellt oder gelöscht.
-settings.event_header_issue=Issue Ereignisse
+settings.event_header_issue=Issue-Ereignisse
settings.event_issues=Issues
settings.event_issues_desc=Issue geöffnet, geschlossen, wieder geöffnet oder bearbeitet.
settings.event_issue_assign=Issue zugewiesen
@@ -2241,7 +2243,7 @@ settings.event_pull_request_merge=Pull-Request-Merge
settings.event_package=Paket
settings.event_package_desc=Paket wurde in einem Repository erstellt oder gelöscht.
settings.branch_filter=Branch-Filter
-settings.branch_filter_desc=Whitelist für Branches für Push-, Erzeugungs- und Löschevents, als glob Pattern beschrieben. Es werden Events für alle Branches gemeldet, falls das Pattern * ist, oder falls es leer ist. Siehe die github.com/gobwas/glob Dokumentation für die Syntax (Englisch). Beispiele: master, {master,release*}.
+settings.branch_filter_desc=Whitelist für Branches für Push-, Erzeugungs- und Löschevents, als glob-Pattern beschrieben. Es werden Events für alle Branches gemeldet, falls das Pattern * ist, oder falls es leer ist. Siehe die github.com/gobwas/glob-Dokumentation für die Syntax (Englisch). Beispiele: master, {master,release*}.
settings.authorization_header=Authorization-Header
settings.authorization_header_desc=Wird, falls vorhanden, als Authorization-Header mitgesendet. Beispiele: %s.
settings.active=Aktiv
@@ -2273,7 +2275,7 @@ settings.web_hook_name_packagist=Packagist
settings.packagist_username=Benutzername für Packagist
settings.packagist_api_token=API-Token
settings.packagist_package_url=Paket-URL
-settings.deploy_keys=Deploy-Schlüssel
+settings.deploy_keys=Deploy-Keys
settings.add_deploy_key=Deploy-Schlüssel hinzufügen
settings.deploy_key_desc=Deploy-Keys haben nur Lesezugriff auf das Repository.
settings.is_writable=Erlaube Schreibzugriff
@@ -2334,9 +2336,9 @@ settings.require_signed_commits=Signierte Commits erforderlich
settings.require_signed_commits_desc=Pushes auf diesen Branch ablehnen, wenn Commits nicht signiert oder nicht überprüfbar sind.
settings.protect_branch_name_pattern=Muster für geschützte Branchnamen
settings.protect_patterns=Muster
-settings.protect_protected_file_patterns=Geschützte Dateimuster (durch Semikolon ';' getrennt):
+settings.protect_protected_file_patterns=Geschützte Dateimuster (durch Semikolon „;“ getrennt):
settings.protect_protected_file_patterns_desc=Geschützte Dateien dürfen nicht direkt geändert werden, auch wenn der Benutzer Rechte hat, Dateien in diesem Branch hinzuzufügen, zu bearbeiten oder zu löschen. Mehrere Muster können mit Semikolon (';') getrennt werden. Siehe github.com/gobwas/glob Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt.
-settings.protect_unprotected_file_patterns=Ungeschützte Dateimuster (durch Semikolon ';' getrennt):
+settings.protect_unprotected_file_patterns=Ungeschützte Dateimuster (durch Semikolon „;“ getrennt):
settings.protect_unprotected_file_patterns_desc=Ungeschützte Dateien, die direkt geändert werden dürfen, wenn der Benutzer Schreibzugriff hat, können die Push-Beschränkung umgehen. Mehrere Muster können mit Semikolon (';') getrennt werden. Siehe github.com/gobwas/glob Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt.
settings.add_protected_branch=Schutz aktivieren
settings.delete_protected_branch=Schutz deaktivieren
@@ -2620,7 +2622,7 @@ pulls.cmd_instruction_hint = `Anweisungen für die K
pulls.cmd_instruction_checkout_title = Auschecken
wiki.cancel = Abbrechen
settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten
-settings.protect_branch_name_pattern_desc = „Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/**“
+settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/**
settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren
settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Reviews), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Reviews bereits verworfen werden.
pulls.commit_ref_at = `hat sich auf diesen Pull-Request von einem Commit %[2]s bezogen`
@@ -2639,6 +2641,9 @@ contributors.contribution_type.commits = Commits
contributors.contribution_type.deletions = Löschungen
contributors.contribution_type.additions = Einfügungen
contributors.contribution_type.filter_label = Art des Beitrags:
+vendored = Vendored
+activity.navbar.pulse = Puls
+pulls.made_using_agit = AGit
[org]
org_name_holder=Name der Organisation
@@ -3104,7 +3109,7 @@ config.app_name=Seitentitel
config.app_ver=Forgejo-Version
config.app_url=Forgejo-Basis-URL
config.custom_conf=Konfigurations-Datei-Pfad
-config.custom_file_root_path=Benutzerdefinierter Root Pfad
+config.custom_file_root_path=Benutzerdefinierter Root-Pfad
config.domain=Server-Domain
config.offline_mode=Lokaler Modus
config.disable_router_log=Router-Log deaktivieren
@@ -3518,7 +3523,7 @@ owner.settings.cargo.rebuild.success=Der Cargo-Index wurde erfolgreich neu erste
owner.settings.cleanuprules.title=Bereinigungsregeln verwalten
owner.settings.cleanuprules.add=Bereinigungsregel hinzufügen
owner.settings.cleanuprules.edit=Bereinigungsregel bearbeiten
-owner.settings.cleanuprules.none=Keine Bereinigungs-Regeln verfügbar. Bitte konsultiere die Dokumentation.
+owner.settings.cleanuprules.none=Es bestehen derzeit keine Bereinigungsregeln.
owner.settings.cleanuprules.preview=Vorschau der Bereinigungsregel
owner.settings.cleanuprules.preview.overview=%d Pakete sollen entfernt werden.
owner.settings.cleanuprules.preview.none=Bereinigungsregel stimmt mit keinem Paket überein.
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index 7c41c3e4e4..90e1a062a8 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -88,8 +88,8 @@ rerun_all=Relancer toutes les tâches
save=Enregistrer
add=Ajouter
add_all=Tout Ajouter
-remove=Retirer
-remove_all=Tout Retirer
+remove=Supprimer
+remove_all=Tout Supprimer
remove_label_str=Supprimer l’élément « %s »
edit=Éditer
view=Voir
@@ -429,6 +429,7 @@ change_unconfirmed_email_error = Le courriel %v n'a pu être modifié
change_unconfirmed_email = Si vous avez donné un courriel incorrect à l'inscription, vous pouvez le changer ci-dessous. La confirmation sera envoyée à cette nouvelle adresse.
change_unconfirmed_email_summary = Modifier l'adresse à laquelle le courriel d'activation est envoyé.
last_admin = Vous ne pouvez pas supprimer le dernier compte administrateur. Il doit exister au moins un compte administrateur.
+remember_me.compromised = Le jeton de login n'est plus valide ce qui pourrait indiquer une compromission de compte. Veuillez vérifier d'éventuelles activités inhabituelles.
[mail]
view_it_on=Voir sur %s
@@ -752,7 +753,7 @@ manage_ssh_keys=Gérer les clés SSH
manage_ssh_principals=Gérer les certificats principaux 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 repos.
+ssh_desc=Ces clefs SSH publiques sont associées à votre compte. Les clefs privées correspondantes permettent l'accès complet à vos repos. Les clés SSH qui ont été vérifiées peuvent aussi être utilisées pour vérifier des commits Git signés par SSH.
principal_desc=Ces Principaux de certificats SSH sont associés à votre compte et permettent un accès complet à vos dépôts.
gpg_desc=Ces clés GPG sont associées à votre compte. Conservez-les en lieu sûr, car elles permettent de vérifier vos révisions.
ssh_helper=Besoin d'aide ? Consultez le guide de GitHub pour créer vos propres clés SSH ou résoudre les problèmes courants que vous pourriez rencontrer en utilisant SSH.
@@ -899,7 +900,7 @@ scan_this_image=Scannez cette image avec votre application d'authentification :
or_enter_secret=Ou saisissez le code %s
then_enter_passcode=Et entrez le code 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 !
+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.
twofa_failed_get_secret=Impossible d'obtenir le secret.
webauthn_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 WebAuthn Authenticator.
@@ -950,14 +951,14 @@ user_unblock_success = Cet utilisateur a été débloqué avec succès.
user_block_success = Cet utilisateur a été bloqué avec succès.
[repo]
-new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? Migrez-le ici.
+new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? Migrez-le ici.
owner=Propriétaire
owner_helper=Certaines organisations peuvent ne pas apparaître dans la liste déroulante en raison d'une limite maximale du nombre de dépôts.
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.
repo_size=Taille du dépôt
template=Modèle
-template_select=Répliquer un modèle
+template_select=Sélectionner un modèle
template_helper=Faire de ce dépôt un modèle
template_description=Les référentiels de modèles permettent aux utilisateurs de générer de nouveaux référentiels avec la même structure de répertoire, fichiers et paramètres optionnels.
visibility=Visibilité
@@ -984,13 +985,13 @@ generate_from=Générer depuis
repo_desc=Description
repo_desc_helper=Décrire brièvement votre dépôt
repo_lang=Langue
-repo_gitignore_helper=Sélectionner quelques .gitignore prédéfinies
+repo_gitignore_helper=Sélectionner quelques .gitignore prédéfinies.
repo_gitignore_helper_desc=De nombreux outils et compilateurs génèrent des fichiers résiduels qui n'ont pas besoin d'être supervisés par git. Composez un .gitignore à l’aide de cette liste des languages de programmation courants.
issue_labels=Jeu de labels pour les tickets
issue_labels_helper=Sélectionner un jeu de label.
license=Licence
-license_helper=Sélectionner une licence
-license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment choisir une licence.
+license_helper=Sélectionner une licence.
+license_helper_desc=Une licence réglemente ce que les autres peuvent ou ne peuvent pas faire avec votre code. Vous ne savez pas laquelle est la bonne pour votre projet ? Comment choisir une licence.
readme=LISEZMOI
readme_helper=Choisissez un modèle de fichier LISEZMOI.
readme_helper_desc=Le README est l'endroit idéal pour décrire votre projet et accueillir des contributeurs.
@@ -2594,7 +2595,7 @@ admin.failed_to_replace_flags = Échec de remplacement des drapeaux du dépôt
admin.flags_replaced = Drapeaux du dépôt remplacés
rss.must_be_on_branch = Vous devez vous trouver sur une branche pour obtenir un flux RSS.
admin.manage_flags = Gérer les drapeaux
-admin.enabled_flags = Drapeaux actifs pour le dépôt:
+admin.enabled_flags = Drapeaux actifs pour le dépôt :
clone_in_vscodium = Clone dans VSCodium
object_format_helper = Format des objets d'un dépôt. Ne peut pas être changé. SHA1 est le plus compatible.
mirror_sync = synchronisé
@@ -2634,6 +2635,12 @@ pulls.fast_forward_only_merge_pull_request = Fast-forward uniquement
pulls.reopen_failed.base_branch = La pull request ne peut pas être re-ouverte car la branche de destination n'existe plus.
settings.units.overview = Vue générale
settings.units.add_more = Ajouter en plus...
+activity.navbar.pulse = Pouls
+activity.navbar.contributors = Contributeurs
+contributors.contribution_type.commits = Commits
+contributors.contribution_type.additions = Ajouts
+contributors.contribution_type.filter_label = Type de contributeur :
+contributors.contribution_type.deletions = Suppressions
[org]
org_name_holder=Nom de l'organisation
@@ -3658,3 +3665,11 @@ executable_file=Fichier exécutable
symbolic_link=Lien symbolique
submodule=Sous-module
+
+
+[graphs]
+component_loading_info = Cela peut prendre du temps…
+component_failed_to_load = Une erreur inattendue s'est produite.
+contributors.what = contributions
+component_loading = Chargement %s...
+component_loading_failed = Échec de chargement de %s
\ No newline at end of file
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index 4d7a5b3024..27f1273fe8 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -141,6 +141,7 @@ copy_type_unsupported = Dit bestandstype kan niet worden gekopieerd
pin = Vastpinnen
unpin = Ontpinnen
remove_label_str = Verwijder punt "%s"
+confirm_delete_artifact = Weet je zeker dat je het artefact '%s' wilt verwijderen?
[aria]
navbar = Navigatiebalk
@@ -589,16 +590,16 @@ openid_been_used = De OpenID-adres "%s" is al in gebruik.
username_has_not_been_changed = Gebruikersnaam is niet veranderd
duplicate_invite_to_team = De gebruiker heeft al een uitnodiging ontvangen om deel te nemen aan deze team.
organization_leave_success = U heeft de organisatie %s succesvol verlaten.
-still_own_packages = "Uw account is eigenaar van één of meer pakketten, verwijder deze eerst."
-still_has_org = "Uw account is eigenaar van één of meer organisaties, verlaat deze eerst."
+still_own_packages = Uw account is eigenaar van één of meer pakketten, verwijder deze eerst.
+still_has_org = Uw account is eigenaar van één of meer organisaties, verlaat deze eerst.
must_use_public_key = De sleutel die u heeft aangeboden is een privésleutel. Alstublieft, upload nergens uw privésleutel. Gebruik in plaats daarvan uw publieke sleutel.
-unable_verify_ssh_key = "Kan de SSH-sleutel niet verifiëren, controleer deze voor fouten."
-still_own_repo = "Uw account is eigenaar van één of meer repositories, verwijder of draag deze eerst over."
+unable_verify_ssh_key = Kan de SSH-sleutel niet verifiëren, controleer deze voor fouten.
+still_own_repo = Uw account is eigenaar van één of meer repositories, verwijder of draag deze eerst over.
admin_cannot_delete_self = U kan uzelf niet verwijderen als u een beheerder bent. Verwijder eerst uw beheerdersrechten.
username_error_no_dots = ` kan alleen alfanumerieke karakters ('0-9','a-z','A-Z'), streepje ('-') en liggend streepje ('_') bevatten. Niet-alfanumerieke karakters aan het begin of eind zijn verboden en aaneenvolgende niet alfanumerieke karakters zijn ook verboden.`
invalid_group_team_map_error = ` mapping is ongeldig: %s"
-org_still_own_repo = "Deze organisatie is eigenaar van één of meer repositories, verwijder of draag deze eerst over."
-org_still_own_packages = "Deze organisatie is eigenaar van één of meer pakketten, verwijder deze eerst."
+org_still_own_repo = Deze organisatie is eigenaar van één of meer repositories, verwijder of draag deze eerst over.
+org_still_own_packages = Deze organisatie is eigenaar van één of meer pakketten, verwijder deze eerst.
[user]
change_avatar=Wijzig je profielfoto…
@@ -738,7 +739,7 @@ manage_gpg_keys=Beheer GPG sleutels
add_key=Sleutel toevoegen
ssh_desc=Deze publieke SSH sleutels worden geassocieerd met uw account. De bijbehorende private sleutels geven volledige toegang toe tot je repositories. SSH sleutels die geverifieerd zijn kunnen gebruikt worden om SSH-ondertekende Git commits te verifiëren.
principal_desc=Deze SSH-certificaatverantwoordelijken zijn gekoppeld aan uw account en geven volledige toegang tot uw repositories.
-gpg_desc=Deze publieke GPG-sleutels zijn verbonden met je account. Houd je privé-sleutels veilig, omdat hiermee commits kunnen worden ondertekend.
+gpg_desc=Deze publieke GPG-sleutels zijn gekoppeld aan je account en worden gebruikt om je commits te verifiëren. Bewaar je privésleutels veilig, omdat ze het mogelijk maken om commits met jouw identiteit te ondertekenen.
ssh_helper=Weet u niet hoe? Lees dan onze handleiding voor het genereren van SSH sleutels of voor algemene SSH problemen.
gpg_helper=Hulp nodig? Neem een kijkje op de GitHub handleiding over GPG.
add_new_key=SSH sleutel toevoegen
@@ -901,7 +902,7 @@ location_placeholder = Deel uw grove locatie met anderen
hidden_comment_types_description = Reactie-types hieronder aangevinkt zullen niet worden weergegeven in de issue-pagina's. Bijvoorbeeld het aanvinken van "Label" zal alle reacties in de vorm van " voegt toe/verwijderd " niet laten zien.
keep_activity_private = Verberg activiteit van profielpagina
uploaded_avatar_is_too_big = De bestandsgrootte (%d KiB) overschrijdt de maximale bestandsgrootte (%d KiB).
-retype_new_password = Nieuw Wachtwoord Bevestigen
+retype_new_password = Nieuw wachtwoord bevestigen
email_desc = Je primaire e-mailadres zal gebruikt worden voor notificaties, wachtwoord herstel en web-gebaseerde Git-operaties, mits het e-mailadres niet verborgen is.
can_not_add_email_activations_pending = Er is een activering in gang, probeer het over een paar minuten nogmaals als u een nieuwe e-mail wilt toevoegen.
select_permissions = Selecteer machtigingen
@@ -931,7 +932,7 @@ create_oauth2_application_success = U heeft met succes een OAuth2 applicatie gec
permissions_access_all = Alle (publiek, privé en gelimiteerd)
oauth2_application_remove_description = Door een OAuth2-applicatie te verwijderen, krijgt deze geen toegang meer tot geautoriseerde gebruikersaccounts op deze instantie. Doorgaan?
twofa_scratch_token_regenerated = Uw herstelsleutel voor eenmalig gebruik is nu %s. Bewaar deze op een veilige plaats, het zal niet meer worden getoond.
-blocked_users_none = U heeft geen gebruikers geblokkeerd.
+blocked_users_none = Er zijn geen geblokkeerde gebruikers.
webauthn_alternative_tip = U wilt misschien nog een extra authenticatie methode toevoegen.
webauthn_key_loss_warning = Als u uw beveiligingssleutels verliest, zal u toegang verliezen tot uw account.
repos_none = U bezit geen repositories.
@@ -944,11 +945,12 @@ user_block_success = De gebruiker is succesvol geblokkeerd.
blocked_since = Geblokkeerd sinds %s
access_token_desc = Geselecteerde token machtigingen beperken autorisatie alleen tot de bijbehorende API routes. Lees de documentatie voor meer informatie.
oauth2_confidential_client = Vertrouwelijke Client. Selecteer deze optie voor apps die het geheim bewaren, zoals webapps. Niet selecteren voor native apps, waaronder desktop- en mobiele apps.
-authorized_oauth2_applications_description = Je hebt deze applicaties van derden toegang verleend tot je persoonlijke Forgejo-account. Trek de toegang in voor applicaties die je niet langer nodig hebt.
+authorized_oauth2_applications_description = Je hebt deze applicaties van derden toegang verleend tot je persoonlijke Forgejo-account. Trek de toegang in voor applicaties die niet langer in gebruik zijn.
hidden_comment_types.ref_tooltip = Reacties waarbij naar deze issue werd verwezen vanuit een ander issue/commit/…
hidden_comment_types.issue_ref_tooltip = Reacties waarbij de gebruiker de branch/tag wijzigt die aan het issue is gekoppeld
oauth2_redirect_uris = Omleiding URI's. Gebruik een nieuwe regel voor elke URI.
oauth2_application_locked = Forgejo registreert sommige OAuth2 applicaties vooraf bij het opstarten als dit is ingeschakeld in de configuratie. Om onverwacht gedrag te voorkomen, kunnen deze niet bewerkt of verwijderd worden. Raadpleeg de OAuth2 documentatie voor meer informatie.
+change_password = Wachtwoord bijwerken
[repo]
owner=Eigenaar
@@ -1280,7 +1282,7 @@ projects.type.none=Geen
projects.type.basic_kanban=Basis Kanban
projects.type.bug_triage=Bug Triage
projects.template.desc=Project sjabloon
-projects.template.desc_helper=Selecteer een projecttemplate om aan de slag te gaan
+projects.template.desc_helper=Selecteer een projectsjabloon om aan de slag te gaan
projects.type.uncategorized=Ongecategoriseerd
projects.column.edit_title=Naam
projects.column.new_title=Naam
@@ -1457,8 +1459,8 @@ issues.unlock=Gesprek ontgrendelen
issues.lock.unknown_reason=Kan een probleem niet vergrendelen met een onbekende reden.
issues.lock_duplicate=Een issue kan niet twee keer vergrendeld worden.
issues.unlock_error=Kan een niet vergrendeld issue niet ontgrendelen.
-issues.lock_with_reason="vergrendeld als %s en beperkt gesprek tot samenwerkers %s"
-issues.lock_no_reason="vergrendelde en beperkte conversatie voor samenwerkers %s"
+issues.lock_with_reason=vergrendeld als %s en beperkt gesprek tot samenwerkers %s
+issues.lock_no_reason=vergrendelde en beperkte conversatie voor samenwerkers %s
issues.unlock_comment=ontgrendelde deze conversatie %s
issues.lock_confirm=Vergrendel
issues.unlock_confirm=Ontgrendelen
@@ -1495,9 +1497,9 @@ issues.add_time_sum_to_small=Geen tijd opgegeven.
issues.time_spent_total=Totaal besteedde tijd
issues.time_spent_from_all_authors=`Totaal besteedde tijd: %s`
issues.due_date=Vervaldatum
-issues.invalid_due_date_format="Het formaat van de deadline is moet 'jjjj-mm-dd' zijn."
-issues.error_modifying_due_date="Deadline aanpassen mislukt."
-issues.error_removing_due_date="Deadline verwijderen mislukt."
+issues.invalid_due_date_format=Het formaat van de deadline is moet 'jjjj-mm-dd' zijn.
+issues.error_modifying_due_date=Deadline aanpassen mislukt.
+issues.error_removing_due_date=Deadline verwijderen mislukt.
issues.push_commit_1=toegevoegd %d commit %s
issues.push_commits_n=toegevoegd %d commits %s
issues.force_push_codes=`force-push %[1]s van %[2]s naar %[4]s %[6]s`
@@ -1506,12 +1508,12 @@ issues.due_date_form=jjjj-mm-dd
issues.due_date_form_add=Vervaldatum toevoegen
issues.due_date_form_edit=Bewerk
issues.due_date_form_remove=Verwijder
-issues.due_date_not_set="Geen vervaldatum ingesteld."
+issues.due_date_not_set=Geen vervaldatum ingesteld.
issues.due_date_added=heeft %[2]s de deadline %[1]s toegevoegd
issues.due_date_modified=de vervaldatum van %[2]s is gewijzigd naar %[1]s[3]s
issues.due_date_remove=heeft %[2]s de deadline %[1]s verwijderd
issues.due_date_overdue=Over tijd
-issues.due_date_invalid="De deadline is ongeldig of buiten bereik. Gebruik het formaat 'jjjj-mm-dd'."
+issues.due_date_invalid=De deadline is ongeldig of buiten bereik. Gebruik het formaat 'jjjj-mm-dd'.
issues.dependency.title=Afhankelijkheden
issues.dependency.issue_no_dependencies=Geen afhankelijkheden ingesteld.
issues.dependency.pr_no_dependencies=Geen afhankelijkheden ingesteld.
@@ -1615,9 +1617,9 @@ pulls.add_prefix=Voeg %s prefix toe
pulls.remove_prefix=Verwijder %s prefix
pulls.data_broken=Deze pull-aanvraag is ongeldig wegens missende fork-informatie.
pulls.files_conflicted=Dit pull request heeft wijzigingen die strijdig zijn met de doel branch.
-pulls.is_checking="Controle op merge conflicten is nog bezig. Probeer later nog een keer."
-pulls.is_ancestor="Deze branch is al opgenomen in de toegewezen branch. Er is niets om samen te voegen."
-pulls.is_empty="De wijzigingen in deze branch bevinden zich al in de toegewezen branch. Dit zal een lege commit zijn."
+pulls.is_checking=Controle op merge conflicten is nog bezig. Probeer later nog een keer.
+pulls.is_ancestor=Deze branch is al opgenomen in de toegewezen branch. Er is niets om samen te voegen.
+pulls.is_empty=De wijzigingen in deze branch bevinden zich al in de toegewezen branch. Dit zal een lege commit zijn.
pulls.required_status_check_failed=Sommige vereiste controles waren niet succesvol.
pulls.required_status_check_missing=Er ontbreken enkele vereiste controles.
pulls.required_status_check_administrator=Als een beheerder kunt u deze pull-aanvraag nog samenvoegen.
@@ -1700,7 +1702,7 @@ milestones.title=Titel
milestones.desc=Beschrijving
milestones.due_date=Vervaldatum (optioneel)
milestones.clear=Leegmaken
-milestones.invalid_due_date_format="Het formaat van de deadline is moet 'jjjj-mm-dd' zijn."
+milestones.invalid_due_date_format=Het formaat van de deadline is moet 'jjjj-mm-dd' zijn.
milestones.edit=Bewerk mijlpaal
milestones.edit_subheader=Gebruik mijlpalen om issues te organiseren en om voortgang bij te houden.
milestones.cancel=Annuleer
@@ -2222,9 +2224,9 @@ settings.protect_no_valid_status_check_patterns = Geen geldige status controlpat
settings.protect_branch_name_pattern = Beschermd Branch Naam Patroon
settings.ignore_stale_approvals = Negeer verouderde goedkeuringen
settings.ignore_stale_approvals_desc = Tel goedkeuringen gemaakt op oudere commits (verouderde reviews) niet mee voor het aantal goedkeuringen dat het PR heeft. Irrelevant als verouderde reviews al afgekeurd zijn.
-settings.protect_branch_name_pattern_desc = "Beschermd branch naam patronen. Zie de documentatie voor patroon syntax. Bijvoorbeeld: main, release/**"
+settings.protect_branch_name_pattern_desc = Beschermd branch naam patronen. Zie de documentatie voor patroon syntax. Bijvoorbeeld: main, release/**
settings.protect_patterns = Patronen
-settings.protect_protected_file_patterns = "Beschermde bestand patronen (gescheiden door een puntkomma ';'):"
+settings.protect_protected_file_patterns = Beschermde bestand patronen (gescheiden door een puntkomma ';'):
issues.no_content = Geen beschrijving gegeven.
issues.close = Issue sluiten
issues.comment_pull_merged_at = commit %[1]s samengevoegd in %[2]s %[3]s
@@ -2284,14 +2286,14 @@ issues.comment.blocked_by_user = U kunt geen reactie op deze issue plaatsen omda
issues.blocked_by_user = U kunt geen issue op deze repository maken omdat u geblokkeerd bent door de eigenaar van de repository.
issues.label_archived_filter = Gearchiveerde labels bekijken
issues.label_archive_tooltip = Gearchiveerde labels zijn standaard uitgezonderd van de suggesties als men op een label zoekt.
-issues.max_pinned = "U kunt geen issues meer vastpinnen"
+issues.max_pinned = U kunt geen issues meer vastpinnen
issues.unpin_issue = Issue ontpinnen
-issues.pin_comment = "vastgepind %s"
+issues.pin_comment = vastgepind %s
issues.cancel_tracking_history = `tijdregistratie geannuleerd %s`
-issues.due_date_not_writer = "U heeft schrijfrechten tot deze repository nodig om de vervaldatum van een issue bij te werken."
-issues.dependency.no_permission_1 = "U heeft geen machtiging om de afhankelijkheid %d te lezen"
-issues.dependency.no_permission_n = "U heeft geen machtiging om de afhankelijkheden %d te lezen"
-issues.dependency.no_permission.can_remove = "U heeft geen machtiging om de afhankelijkheid te lezen, maar u kunt deze wel verwijderen"
+issues.due_date_not_writer = U heeft schrijfrechten tot deze repository nodig om de vervaldatum van een issue bij te werken.
+issues.dependency.no_permission_1 = U heeft geen machtiging om de afhankelijkheid %d te lezen
+issues.dependency.no_permission_n = U heeft geen machtiging om de afhankelijkheden %d te lezen
+issues.dependency.no_permission.can_remove = U heeft geen machtiging om de afhankelijkheid te lezen, maar u kunt deze wel verwijderen
issues.review.pending.tooltip = Deze reactie is niet zichtbaar voor andere gebruikers. Om de reacties in te dienen, selecteer '%s" -> "%s/%s/%s" aan de bovenkant van de pagina.
issues.review.outdated_description = Inhoud is veranderd sinds deze reactie was gemaakt
issues.review.option.show_outdated_comments = Verouderde reacties tonen
@@ -2317,15 +2319,15 @@ commitstatus.failure = Mislukking
commitstatus.success = Succes
projects.create_success = Het project "%s" is gecreëerd.
projects.edit_success = Project "%s" is bijgewerkt.
-projects.column.edit = "Kolom Bewerken"
-projects.column.new_submit = "Kolom Maken"
-projects.column.new = "Nieuwe Kolom"
-projects.column.set_default = "Standaard Instellen"
-projects.column.unset_default = "Standaardinstelling ongedaan maken"
-projects.column.delete = "Kolom verwijderen"
+projects.column.edit = Kolom Bewerken
+projects.column.new_submit = Kolom Maken
+projects.column.new = Nieuwe Kolom
+projects.column.set_default = Standaard Instellen
+projects.column.unset_default = Standaardinstelling ongedaan maken
+projects.column.delete = Kolom verwijderen
projects.column.assigned_to = Toegewezen aan
-projects.card_type.images_and_text = "Afbeeldingen en Tekst"
-projects.card_type.text_only = "Alleen Tekst"
+projects.card_type.images_and_text = Afbeeldingen en Tekst
+projects.card_type.text_only = Alleen Tekst
issues.choose.ignore_invalid_templates = Ongeldige sjablonen zijn genegeerd
issues.choose.invalid_templates = %v ongeldige sjablon(en) gevonden
issues.choose.invalid_config = Deze issue configuratie bevat fouten:
@@ -2348,13 +2350,13 @@ issues.role.contributor_helper = Deze gebruiker heeft al eerder gecommitteerd in
issues.label_exclusive = Exclusief
issues.label_archive = Label Archiveren
issues.label_exclusive_warning = Eventuele conflicterende scoped labels worden verwijderd bij het bewerken van de labels van een issue of pull request.
-issues.unpin_comment = "ontpind dit %s"
+issues.unpin_comment = ontpind dit %s
pulls.show_changes_since_your_last_review = Wijzigingen weergeven sinds je laatste beoordeling
mirror_address_url_invalid = De opgegeven URL is ongeldig. Je moet alle componenten van de URL correct escapen.
desc.sha256 = SHA256
form.name_reserved = De repository naam "%s" is gereserveerd.
form.name_pattern_not_allowed = Het patroon "%s" is niet toegestaan in een repository naam.
-migrate.invalid_local_path = "Het lokale pad is niet geldig. Het bestaat niet of is geen folder."
+migrate.invalid_local_path = Het lokale pad is niet geldig. Het bestaat niet of is geen folder.
migrate.migrating_failed.error = Fout bij migreren: %s
migrate.forgejo.description = Migreer data van codeberg.org of andere Forgejo instanties.
migrate.cancel_migrating_title = Annuleer Migratie
@@ -2391,15 +2393,15 @@ editor.invalid_commit_mail = Ongeldige mail voor het aanmaken van een commit.
editor.branch_does_not_exist = Branch "%s" bestaat niet in deze repository.
editor.directory_is_a_file = Mapnaam "%s" wordt al gebruikt als bestandsnaam in deze repository.
commits.renamed_from = Hernoemd van %s
-projects.card_type.desc = "Kaart Voorbeeld"
+projects.card_type.desc = Kaart Voorbeeld
pulls.filter_changes_by_commit = Filter op commit
pulls.nothing_to_compare_have_tag = De geselecteerde branch/tag zijn gelijk.
pulls.merged_success = Pull request succesvol samengevoegd en gesloten
pulls.closed = Pull request gesloten
pulls.merged_info_text = De branch %s kan nu verwijderd worden.
-pulls.blocked_by_rejection = "Dit pull request bevat wijzigingen die zijn aangevraagd door een officiële reviewer."
-pulls.blocked_by_official_review_requests = "Dit pull request is geblokkeerd omdat het goedkeuring mist van een of meer officiële reviewers."
-pulls.blocked_by_changed_protected_files_n = "Dit pull request is geblokkeerd omdat het een beveiligd bestanden wijzigt:"
+pulls.blocked_by_rejection = Dit pull request bevat wijzigingen die zijn aangevraagd door een officiële reviewer.
+pulls.blocked_by_official_review_requests = Dit pull request is geblokkeerd omdat het goedkeuring mist van een of meer officiële reviewers.
+pulls.blocked_by_changed_protected_files_n = Dit pull request is geblokkeerd omdat het een beveiligd bestanden wijzigt:
settings.transfer_perform = Overdracht uitvoeren
pulls.status_checks_hide_all = Alle controles verbergen
pulls.status_checks_show_all = Alle controles weergeven
@@ -2441,9 +2443,9 @@ settings.transfer_started = Deze repository is gemarkeerd voor overdracht en wac
settings.trust_model.collaborator = Samenwerker
blame.ignore_revs = Revisies negeren in .git-blame-ignore-revs. Klik hier om de normale blameweergave te omzeilen.
editor.update = %s bijwerken
-projects.column.unset_default_desc = "Maak deze kolom ongedaan als standaard"
+projects.column.unset_default_desc = Maak deze kolom ongedaan als standaard
pulls.showing_only_single_commit = Alleen veranderingen tonen van commit %[1]s
-pulls.blocked_by_changed_protected_files_1 = "Dit pull request is geblokkeerd omdat het een beveiligd bestand wijzigt:"
+pulls.blocked_by_changed_protected_files_1 = Dit pull request is geblokkeerd omdat het een beveiligd bestand wijzigt:
signing.wont_sign.nokey = Er is geen sleutel beschikbaar om deze commit te ondertekenen.
settings.admin_enable_close_issues_via_commit_in_any_branch = Sluit een issue via een commit gedaan in een niet standaard branch
stars_remove_warning = Hiermee worden alle sterren uit deze repository verwijderd.
@@ -2455,7 +2457,7 @@ issues.action_check_all = Alle items aanvinken/uitvinken
pulls.select_commit_hold_shift_for_range = Selecteer commit. Houd shift + klik ingedrukt om een bereik te selecteren
transfer.no_permission_to_accept = Je hebt geen rechten om deze overdracht te accepteren.
editor.fail_to_apply_patch = Kan patch "%s" niet toepassen
-pulls.blocked_by_approvals = "Dit pull request heeft nog niet genoeg goedkeuringen. %d van %d goedkeuringen verleend."
+pulls.blocked_by_approvals = Dit pull request heeft nog niet genoeg goedkeuringen. %d van %d goedkeuringen verleend.
signing.wont_sign.always = Commits worden altijd ondertekend.
settings.packages_desc = Repository pakkettenregister inschakelen
settings.convert_fork_confirm = Repository omzetten
@@ -2463,7 +2465,7 @@ settings.transfer.rejected = Repository overdracht is geweigerd.
settings.transfer_abort_invalid = Je kunt een niet-bestaande repository overdracht niet annuleren.
settings.transfer_desc = Draag deze repository over aan een gebruiker of organisatie waarvoor je beheerdersrechten hebt.
settings.transfer_notices_3 = - Als de repository privé is en wordt overgedragen aan een individuele gebruiker, dan zorgt deze actie ervoor dat de gebruiker op zijn minst leesrechten heeft (en wijzigt rechten als dat nodig is).
-pulls.blocked_by_outdated_branch = "Dit pull request is geblokkeerd omdat het verouderd is."
+pulls.blocked_by_outdated_branch = Dit pull request is geblokkeerd omdat het verouderd is.
pulls.blocked_by_user = Je kunt geen pull request aanmaken in deze repository omdat je geblokkeerd bent door de eigenaar van de repository.
pulls.fast_forward_only_merge_pull_request = Alleen Fast-forward
pulls.has_merged = Mislukt: De pull request is samengevoegd, je kunt niet opnieuw samenvoegen of de doel branch wijzigen.
@@ -2477,10 +2479,10 @@ settings.admin_stats_indexer = Code statistieken indexer
settings.new_owner_blocked_doer = De nieuwe eigenaar heeft u geblokkeerd.
settings.transfer_notices_2 = - Je behoudt toegang tot de repository als je het overdraagt aan een organisatie waarvan je (mede-)eigenaar bent.
commits.search.tooltip = U kunt zoektermen voorvoegen met "author:", "committer:", "after:", of "before:", bijvoorbeeld: "revert author:Alice before:2019-01-13".
-projects.column.deletion_desc = "Het verwijderen van een projectkolom verplaatst alle issues naar 'Ongecategoriseerd'. Wilt u doorgaan?"
-projects.column.set_default_desc = "Stel deze kolom in als standaard voor ongecategoriseerde issues and pulls"
+projects.column.deletion_desc = Het verwijderen van een projectkolom verplaatst alle issues naar 'Ongecategoriseerd'. Wilt u doorgaan?
+projects.column.set_default_desc = Stel deze kolom in als standaard voor ongecategoriseerde issues and pulls
issues.action_check = Aanvinken/uitvinken
-issues.dependency.issue_batch_close_blocked = "Het is niet mogelijk om de issues die u gekozen heeft in bulk te sluiten, omdat issue #%d nog open afhankelijkheden heeft"
+issues.dependency.issue_batch_close_blocked = Het is niet mogelijk om de issues die u gekozen heeft in bulk te sluiten, omdat issue #%d nog open afhankelijkheden heeft
pulls.review_only_possible_for_full_diff = Beoordeling is alleen mogelijk bij het bekijken van de volledige diff
pulls.commit_ref_at = `heeft naar deze pull request verwezen vanuit een commit %[2]s`
pulls.cmd_instruction_hint = `Bekijk opdrachtregelinstructies.`
@@ -2522,14 +2524,122 @@ diff.review.self_approve = Auteurs van een pull request kunnen hun eigen pull re
diff.review.self_reject = Auteurs van een pull request kunnen geen wijzigingen aanvragen op hun eigen pull request
branch.already_exists = Een branch genaamd "%s" bestaat al.
settings.protected_branch_required_rule_name = Vereiste regelnaam
-settings.protect_unprotected_file_patterns_desc = "Onbeschermde bestanden die direct gewijzigd mogen worden als een gebruiker schrijftoegang heeft, waarbij pushbeperking omzeild zal worden. Meerdere patronen kunnen gescheiden worden d.m.v. een puntkomma (';'). Zie github.com/gobwas/glob documentatie voor patroon syntax. Bijvoorbeeld: .drone.yml, /docs/**/*.txt."
+settings.protect_unprotected_file_patterns_desc = Onbeschermde bestanden die direct gewijzigd mogen worden als een gebruiker schrijftoegang heeft, waarbij pushbeperking omzeild zal worden. Meerdere patronen kunnen gescheiden worden d.m.v. een puntkomma (';'). Zie github.com/gobwas/glob documentatie voor patroon syntax. Bijvoorbeeld: .drone.yml, /docs/**/*.txt.
settings.tags.protection.pattern.description = U kunt een enkele naam, glob patroon of reguliere expressie gebruiken om tags te matchen. Lees meer in de beschermde tags gids.
-settings.protect_unprotected_file_patterns = "Onbeschermde bestandspatronen (gescheiden d.m.v. een puntkomma ';'):"
+settings.protect_unprotected_file_patterns = Onbeschermde bestandspatronen (gescheiden d.m.v. een puntkomma ';'):
branch.delete_desc = Het verwijderen van een branch is permanent. Hoewel de verwijderde branch kan blijven bestaan voor een korte tijd voordat het daadwerkelijk wordt verwijderd, kan het in de meeste gevallen NIET ongedaan gemaakt worden. Wilt u doorgaan?
release.deletion_desc = Het verwijderen van een release zal het alleen verwijderen van Forgejo. Het zal niet de Git tag, de inhoud van uw repository of de geschiedenis ervan beïnvloeden. Wilt u doorgaan?
release.deletion_tag_desc = Verwijdert deze tag uit de repository. De inhoud van de repository en de geschiedenis ervan zullen ongewijzigd blijven. Wilt u doorgaan?
release.tag_name_protected = De tagnaam is beschermd.
release.tag_already_exist = Deze tagnaam bestaat al.
+settings.mirror_settings.docs.disabled_pull_mirror.instructions = Stel je project in om automatisch commits, tags en branches naar een andere repository te pushen. Pull mirrors zijn uitgeschakeld door de beheerder van de site.
+settings.protect_status_check_patterns = Patronen voor statuscontrole:
+settings.mirror_settings.docs = Stel je repository in om automatisch commits, tags en branches te synchroniseren met een andere repository.
+settings.mirror_settings.docs.disabled_push_mirror.instructions = Stel je project in om automatisch commits, tags en branches uit een andere repository te halen.
+pulls.made_using_agit = AGit
+issues.label_exclusive_desc = Geef het label scope/item een naam om het wederzijds exclusief te maken met andere scope/labels.
+pulls.clear_merge_message_hint = Het verwijderen van het samenvoeg bericht zal alleen de inhoud van het commit bericht verwijderen en gegenereerde git trailers zoals "Co-Authored-By ..." behouden.
+milestones.update_ago = Bijgewerkt %s
+pulls.auto_merge_canceled_schedule_comment = `heeft het automatisch samenvoegen van dit pull-verzoek geannuleerd als alle controles zijn geslaagd %[1]s`
+pull.deleted_branch = (verwijderd):%s
+settings.mirror_settings.docs.can_still_use = Hoewel u bestaande mirrors niet kunt wijzigen of nieuwe mirrors kunt maken, kunt u uw bestaande mirrors wel gebruiken.
+settings.tracker_issue_style.regexp_pattern_desc = De eerste groep wordt gebruikt in plaats van {index}.
+settings.admin_indexer_unindexed = Niet-geïndexeerd
+settings.admin_enable_health_check = Repository gezondheidscontroles inschakelen (git fsck)
+settings.admin_settings = Beheerdersinstellingen
+settings.actions_desc = Repository Acties inschakelen
+settings.releases_desc = Repository Releases inschakelen
+settings.pulls.default_delete_branch_after_merge = Verwijder standaard pull request branch na samenvoegen
+settings.pulls.allow_rebase_update = Het bijwerken van een pull request branch door rebase inschakelen
+settings.trust_model.default = Standaard vertrouwensmodel
+settings.trust_model = Vertrouwensmodel met handtekening
+settings.trust_model.default.desc = Gebruik de standaard repository vertrouwensmodel van de instantie.
+settings.signing_settings = Instellingen voor verificatie van ondertekening
+settings.wiki_branch_rename_success = De branch naam van de repository wiki is succesvol genormaliseerd.
+settings.wiki_rename_branch_main_notices_1 = Deze bewerking KAN NIET ongedaan worden gemaakt.
+settings.wiki_rename_branch_main_desc = Hernoem de branch die intern door de Wiki wordt gebruikt naar "%s". Dit is permanent en kan niet ongedaan gemaakt worden.
+settings.add_collaborator_owner = Kan geen eigenaar toevoegen als samenwerker.
+settings.update_settings_no_unit = De repository moet op zijn minst enige vorm van interactie toestaan.
+settings.authorization_header = Autorisatie-header
+settings.event_package = Pakket
+settings.event_pull_request_merge = Pull Request Samenvoegen
+settings.event_pull_request_review_request_desc = Pull request review aangevraagd of review request verwijderd.
+settings.protect_enable_merge = Samenvoegen inschakelen
+settings.protected_branch.delete_rule = Regel verwijderen
+settings.protected_branch.save_rule = Regel opslaan
+release.tag_helper_new = Nieuwe tag. Deze tag wordt aangemaakt vanuit het doel.
+release.new_subheader = Releases organiseren projectversies.
+release.edit_subheader = Releases organiseren projectversies.
+tag.ahead.target = naar %s sinds deze tag
+settings.event_package_desc = Aangemaakt of verwijderd pakket in een repository.
+settings.add_collaborator_blocked_our = Kan de samenwerker niet toevoegen, omdat de eigenaar van deze repository deze samenwerker heeft geblokkeerd.
+settings.protect_status_check_patterns_desc = Voer patronen in om aan te geven welke statuscontroles moeten slagen voordat branches kunnen worden samengevoegd in een branch die aan deze regel voldoet. Elke regel specificeert een patroon. Patronen kunnen niet leeg zijn.
+settings.convert = Omzetten naar reguliere repository
+milestones.new_subheader = Mijlpalen kunnen je helpen om problemen te organiseren en de voortgang ervan bij te houden.
+settings.webhook.test_delivery_desc_disabled = Om deze webhook met een nepgebeurtenis te testen, activeer het.
+settings.mirror_settings.docs.no_new_mirrors = Uw repository mirrort wijzigingen van of naar een andere repository. Houd er rekening mee dat u op dit moment geen nieuwe mirrors kunt aanmaken.
+settings.pulls.default_allow_edits_from_maintainers = Standaard bewerkingen van maintainers toestaan
+settings.trust_model.collaboratorcommitter.desc = Geldige handtekeningen van samenwerkers van dit archief zullen "vertrouwd" gemarkeerd worden als ze overeenkomen met de committer. Anders zullen geldige handtekeningen gemarkeerd worden als "niet vertrouwd" als de handtekening overeenkomt met de committer en "niet gematcht" anders. Dit zal Forgejo dwingen om gemarkeerd te worden als de committer op ondertekende commits met de werkelijke committer gemarkeerd als Co-Authored-By: en Co-Committed-By: aanhanger in de commit. De standaard Forgejo sleutel moet overeenkomen met een gebruiker in de database.
+settings.branch_filter_desc = Branch whitelist for push, branch creation and branch deletion events, specified as glob pattern. Indien leeg of *, worden gebeurtenissen voor alle takken gerapporteerd. Zie github.com/gobwas/glob documentatie voor syntax. Voorbeelden: master, {master,release*}.
+contributors.contribution_type.filter_label = Soort bijdrage:
+settings.event_pull_request_review_request = Pull Request Review Aangevraagd
+pulls.recently_pushed_new_branches = Je hebt op branch gepusht %[1]s %[2]s
+settings.protect_enable_merge_desc = Iedereen met schrijftoegang mogen pull requests samenvoegen in deze branch.
+settings.add_web_hook_desc = Integreer %s in uw repository.
+settings.event_wiki_desc = Wiki-pagina gemaakt, hernoemd, bewerkt of verwijderd.
+settings.githooks_desc = Git Hooks worden aangedreven door Git zelf. Je kunt hook bestanden hieronder bewerken om aangepaste operaties in te stellen.
+settings.add_collaborator_blocked_them = Kan de samenwerker niet toevoegen, omdat de samenwerker de eigenaar van de repository heeft geblokkeerd.
+settings.confirm_wiki_branch_rename = Hernoem de wiki branch
+settings.wiki_branch_rename_failure = Mislukt bij het normaliseren van de branch naam van de repository wiki.
+settings.wiki_rename_branch_main_notices_2 = Dit zal de interne branch van %s's repository wiki hernoemen. Bestaande checkouts zullen bijgewerkt moeten worden.
+settings.trust_model.collaborator.desc = Geldige handtekeningen van samenwerkers van deze repository worden als "vertrouwd" gemarkeerd - (of ze nu overeenkomen met de committer of niet). Anders worden geldige handtekeningen gemarkeerd als "niet-vertrouwd" als de handtekening overeenkomt met de committer en "niet-gematcht" als dat niet het geval is.
+settings.trust_model.committer.desc = Geldige handtekeningen zullen alleen "vertrouwd" gemarkeerd worden als ze overeenkomen met de committer, anders zullen ze gemarkeerd worden als "ongeëvenaard". Dit dwingt Forgejo om de committer te zijn op ondertekende commits met de werkelijke committer gemarkeerd als Co-authored-by: en Co-committed-by: aanhanger in de commit. De standaard Forgejo sleutel moet overeenkomen met een gebruiker in de database.
+settings.pulls.enable_autodetect_manual_merge = Handmatig samenvoegen met autodetectie inschakelen (Opmerking: In sommige speciale gevallen kunnen hierdoor verkeerde beoordelingen optreden)
+settings.protect_protected_file_patterns_desc = Beschermde bestanden mogen niet direct gewijzigd worden, zelfs als de gebruiker rechten heeft om bestanden in deze branch toe te voegen, te bewerken of te verwijderen. Meerdere patronen kunnen gescheiden worden met een puntkomma (';'). Zie github.com/gobwas/glob documentatie voor patroon syntax. Voorbeelden: .drone.yml, /docs/**/*.txt.
+wiki.delete_page_notice_1 = Het verwijderen van de wikipagina "%s" kan niet ongedaan worden gemaakt. Doorgaan?
+wiki.reserved_page = De wikipaginanaam "%s" is gereserveerd.
+activity.navbar.pulse = Puls
+wiki.original_git_entry_tooltip = Bekijk het originele Git bestand in plaats van een vriendelijke link te gebruiken.
+activity.navbar.contributors = Samenwerkers
+contributors.contribution_type.additions = Toevoegingen
+contributors.contribution_type.commits = Commits
+contributors.contribution_type.deletions = Verwijderingen
+settings.mirror_settings.docs.doc_link_pull_section = het gedeelte "Pullen uit een externe repository" in de documentatie.
+settings.mirror_settings.docs.doc_link_title = Hoe kan ik repositories spiegelen?
+settings.mirror_settings.docs.pull_mirror_instructions = Raadpleeg voor het instellen van een pull mirror:
+settings.mirror_settings.docs.more_information_if_disabled = Hier vindt u meer informatie over duw- en pull mirrors:
+settings.mirror_settings.docs.pulling_remote_title = Pullen uit een externe repository
+settings.mirror_settings.pushed_repository = Pushed repository
+settings.units.units = Repository-eenheden
+settings.mirror_settings.push_mirror.remote_url = Git Externe Repository URL
+settings.units.overview = Overzicht
+settings.mirror_settings.push_mirror.edit_sync_time = Synchronisatie-interval van mirror bewerken
+settings.push_mirror_sync_in_progress = Wijzigingen worden momenteel naar de externe %s gepusht.
+settings.pull_mirror_sync_in_progress = Haalt momenteel wijzigingen op van de externe %s.
+settings.units.add_more = Meer toevoegen...
+settings.update_mirror_settings = Mirrorinstellingen bijwerken
+settings.branches.switch_default_branch = Wissel Standaard Branch
+settings.branches.add_new_rule = Voeg nieuwe regel toe
+settings.wiki_globally_editable = Iedereen toestaan de Wiki te bewerken
+settings.webhook.replay.description_disabled = Activeer deze webhook om hem opnieuw af te spelen.
+settings.webhook.replay.description = Deze webhook opnieuw afspelen.
+settings.webhook.delivery.success = Er is een gebeurtenis toegevoegd aan de wachtrij. Het kan enkele seconden duren voor het in de leveringsgeschiedenis verschijnt.
+settings.authorization_header_desc = Wordt opgenomen als autorisatieheader voor verzoeken indien aanwezig. Voorbeelden: %s.
+settings.add_key_success = De deploy sleutel "%s" is toegevoegd.
+search.type.tooltip = Type zoekopdracht
+search.fuzzy.tooltip = Neem resultaten op die ook sterk overeenkomen met de zoekterm
+search.match.tooltip = Alleen resultaten opnemen die exact overeenkomen met de zoekterm
+settings.wiki_rename_branch_main = Normaliseer de Wiki branch naam
+settings.event_pull_request_approvals = Pull Request Goedkeuringen
+settings.protected_branch_duplicate_rule_name = Duplicaat regelnaam
+settings.convert_fork_succeed = De fork is omgezet in een reguliere repository.
+settings.convert_fork_notices_1 = Deze bewerking zet de fork om in een reguliere repository en kan niet ongedaan worden gemaakt.
+settings.convert_fork_desc = Je kunt deze fork omzetten in een reguliere repository. Dit kan niet ongedaan worden gemaakt.
+settings.convert_fork = Omzetten naar een reguliere repository
+settings.convert_confirm = Repository Omzetten
+settings.convert_succeed = De mirror is omgezet in een reguliere repository.
+settings.convert_desc = Je kunt deze mirror omzetten in een reguliere repository. Dit kan niet ongedaan worden gemaakt.
+settings.convert_notices_1 = Deze bewerking zet de mirror om in een reguliere repository en kan niet ongedaan worden gemaakt.
@@ -2655,7 +2765,7 @@ teams.invite.by = Uitgenodigd door %s
teams.all_repositories_admin_permission_desc = Dit team verleent Administrator permissies tot alle repositories: leden kunnen lezen, pushen naar en samenwerkers toevoegen aan repositories.
settings.change_orgname_prompt = Merk op: Het wijzigen van de organisatienaam zal ook de URL van uw organisatie veranderen en de oude naam vrijgeven.
settings.visibility.limited = Beperkt (Aleen zichtbaar voor geauthenticeerde gebruikers)
-teams.add_nonexistent_repo = "De repository die u probeert toe te voegen bestaat niet, maak deze eerst aan alstublieft."
+teams.add_nonexistent_repo = De repository die u probeert toe te voegen bestaat niet, maak deze eerst aan alstublieft.
teams.all_repositories_write_permission_desc = Dit team verleent Schrijf permissies tot alle repositories: leden kunnen lezen en pushen naar repositories.
[admin]
@@ -3072,7 +3182,7 @@ notices.operations = Operaties
self_check.no_problem_found = Nog geen probleem gevonden.
self_check.database_collation_mismatch = Verwacht dat de database collatie gebruikt: %s
users.new_success = De gebruikersaccount "%s" is aangemaakt.
-users.cannot_delete_self = "Je kunt jezelf niet verwijderen"
+users.cannot_delete_self = Je kunt jezelf niet verwijderen
users.purge = Gebruiker wissen
users.still_own_packages = Deze gebruiker bezit nog steeds één of meerdere pakketten, verwijder deze pakketten eerst.
users.reset_2fa = 2FA opnieuw instellen
@@ -3136,13 +3246,63 @@ assets = Code Assets
auths.helo_hostname_helper = Hostnaam verzonden met HELO. Laat leeg om huidige hostnaam te versturen.
self_check = Zelfcontrole
dashboard.cron.cancelled = Cron: %[1]s geannuleerd: %[3]s
-dashboard.delete_repo_archives = "Verwijder alle archieven van repository (ZIP, TAR.GZ, enz.) "
+dashboard.delete_repo_archives = Verwijder alle archieven van repository (ZIP, TAR.GZ, enz.)
dashboard.cancel_abandoned_jobs = Verlaten jobs annuleren
auths.helo_hostname = HELO Hostnaam
settings = Beheerdersinstellingen
dashboard.task.cancelled = Taak: %[1]s geannuleerd: %[3]s
auths.force_smtps = SMTPS Forceren
dashboard.sync_repo_branches = Synchroniseren gemiste branches van git data naar databases
+monitor.processes_count = %d Processen
+monitor.process.children = Kinderen
+self_check.database_inconsistent_collation_columns = Database gebruikt collatie %s, maar deze kolommen gebruiken onjuiste collaties. Dit kan onverwachte problemen veroorzaken.
+self_check.database_fix_mssql = Voor MSSQL gebruikers kan je het probleem alleen oplossen door "ALTER ... COLLATE ..." SQL's handmatig op te lossen.
+monitor.stacktrace = Stacktrace
+monitor.download_diagnosis_report = Diagnoserapport downloaden
+self_check.database_collation_case_insensitive = Database gebruikt collatie %s, wat een ongevoelige collatie is. Hoewel Forgejo ermee kan werken, kunnen er enkele zeldzame gevallen zijn die niet werken zoals verwacht.
+self_check.database_fix_mysql = Voor MySQL/MariaDB gebruikers zou je het "gitea doctor convert" commando kunnen gebruiken om de collatieproblemen op te lossen, of je zou het probleem ook kunnen oplossen door "ALTER ... COLLATE ..." SQL's handmatig op te lossen.
+dashboard.gc_lfs = LFS meta-objecten afval opruimen
+auths.map_group_to_team = Breng LDAP-groepen in kaart voor organisatieteams (laat het veld leeg om over te slaan)
+auths.oauth2_required_claim_name = Verplichte claimnaam
+auths.oauth2_scopes = Aanvullende scopes
+auths.skip_local_two_fa_helper = Niet ingesteld betekent dat lokale gebruikers met 2FA nog steeds 2FA moeten passeren om in te loggen
+auths.skip_local_two_fa = Lokale 2FA overslaan
+auths.oauth2_icon_url = Pictogram URL
+auths.pam_email_domain = PAM e-maildomein (optioneel)
+auths.tip.gitea = Registreer een nieuwe OAuth2-toepassing. De handleiding is te vinden op https://docs.gitea.com/development/oauth2-provider
+auths.tip.discord = Registreer een nieuwe toepassing op https://discordapp.com/developers/applications/me
+auths.tip.bitbucket = Registreer een nieuwe OAuth consumer op https://bitbucket.org/account/user//oauth-consumers/new en voeg de rechten 'Account' - 'Read'
+auths.tips.oauth2.general.tip = Bij het registreren van een nieuwe OAuth2-authenticatie moet de callback/redirect URL zijn:
+config.ssh_domain = SSH-server domein
+auths.login_source_of_type_exist = Er bestaat al een authenticatiebron van dit type.
+auths.login_source_exist = De authenticatiebron "%s" bestaat al.
+config.test_mail_sent = Er is een testmail verzonden naar "%s".
+config.test_mail_failed = Er is geen testmail verzonden naar "%s": %v
+config.access_log_template = Sjabloon voor toegangslogboek
+config.logger_name_fmt = Logger: %s
+config.git_max_diff_line_characters = Max Diff tekens (voor een enkele regel)
+auths.sspi_strip_domain_names_helper = Als deze optie is aangevinkt, worden domeinnamen verwijderd uit inlognamen (bijv. "DOMEIN\gebruiker" en "gebruiker@example.org" worden beide gewoon "gebruiker").
+auths.map_group_to_team_removal = Gebruikers verwijderen uit gesynchroniseerde teams als gebruiker niet tot overeenkomstige LDAP-groep behoort
+config.send_test_mail_submit = Stuur
+auths.unable_to_initialize_openid = OpenID Connect Provider kan niet worden geïnitialiseerd: %s
+auths.new_success = De authenticatiebron "%s" is toegevoegd.
+auths.delete_auth_desc = Door een authenticatiebron te verwijderen, kunnen gebruikers deze niet meer gebruiken om zich aan te melden. Doorgaan?
+auths.tip.mastodon = Voer een aangepaste instantie URL in voor de mastodon instantie waarmee je wilt authenticeren (of gebruik de standaard URL)
+auths.tip.twitter = Ga naar https://dev.twitter.com/apps, maak een applicatie en zorg ervoor dat de optie "Sta toe dat deze applicatie wordt gebruikt om u aan te melden bij Twitter" is ingeschakeld
+auths.disable_helo = HELO uitschakelen
+auths.force_smtps_helper = SMTPS wordt altijd gebruikt op poort 465. Stel dit in om SMTPS op andere poorten te forceren. (Anders wordt STARTTLS gebruikt op andere poorten als dit wordt ondersteund door de host)
+auths.invalid_openIdConnectAutoDiscoveryURL = Ongeldige URL voor automatische detectie (dit moet een geldige URL zijn die begint met http:// of https://)
+config.allow_only_internal_registration = Registratie alleen toestaan via Forgejo zelf
+monitor.stats = Statistieken
+config.set_setting_failed = Instelling %s mislukt om te zetten
+auths.oauth2_tenant = Tenant
+config.domain = Serverdomein
+config.app_data_path = Pad voor app-gegevens
+config.mailer_smtp_addr = SMTP-Adres
+config.mailer_protocol = Protocol
+config.mailer_enable_helo = HELO inschakelen
+auths.oauth2_map_group_to_team_removal = Verwijder gebruikers uit gesynchroniseerde teams als de gebruiker niet tot de overeenkomstige groep behoort.
+config.mailer_config = Mailer configuratie
[action]
create_repo=repository aangemaakt in %s
@@ -3165,6 +3325,17 @@ mirror_sync_delete = gesynchroniseerde en verwijderde referentie %[2]s%[3]s#%[2]s`
mirror_sync_push = commits gesynchroniseerd naar %[3]s op %[4]s van spiegel
review_dismissed_reason = Reden:
+commit_repo = gepusht naar %[3]s bij %[4]s
+create_issue = `opent issue %[3]s#%[2]s`
+close_issue = `sloot issue %[3]s#%[2]s`
+reopen_issue = `heropende issue %[3]s#%[2]s`
+create_pull_request = `creëerde pull request %[3]s#%[2]s`
+reject_pull_request = `stelde wijzigingen voor %[3]s#%[2]s`
+review_dismissed = `heeft beoordeling van %[4]s voor %[3]s#%[2]s afgewezen`
+create_branch = heeft de branch %[3]s gemaakt in %[4]s
+watched_repo = begon te kijken naar %[2]s
+publish_release = `released "%[4]s" op %[3]s`
+starred_repo = heeft %[2]s een star gegeven
[tool]
now=nu
@@ -3202,6 +3373,9 @@ pin=Pin melding
mark_as_read=Markeer als gelezen
mark_as_unread=Markeer als ongelezen
mark_all_as_read=Markeer alles als gelezen
+no_subscriptions = Geen abonnementen
+subscriptions = Abonnementen
+watching = Kijken naar
[gpg]
default_key=Ondertekend met standaard sleutel
@@ -3210,11 +3384,14 @@ error.generate_hash=Genereren van commit hash mislukt
error.no_committer_account=Geen account gekoppeld aan het e-mailadres van de committer
error.no_gpg_keys_found=Geen bekende sleutel gevonden voor deze handtekening in de database
error.not_signed_commit=Geen ondertekende commit
-error.probable_bad_default_signature="WAARSCHUWING! Hoewel de standaard sleutel dit ID heeft, is deze commit niet geverifieerd! Deze commit is VERDACHT."
+error.probable_bad_default_signature=WAARSCHUWING! Hoewel de standaard sleutel dit ID heeft, is deze commit niet geverifieerd! Deze commit is VERDACHT.
+error.failed_retrieval_gpg_keys = Kan geen sleutel ophalen die gekoppeld is aan de account van de committer
+error.probable_bad_signature = WAARSCHUWING! Hoewel er een sleutel met dit ID in de database zit, verifieert het deze commit niet! Deze commit is VERDACHT.
[units]
error.no_unit_allowed_repo=U heeft geen toegang tot een enkele sectie van deze repository.
error.unit_not_allowed=U heeft geen toegang tot deze sectie van de repository.
+unit = Eenheid
[packages]
filter.type=Type
@@ -3332,7 +3509,7 @@ debian.install = Voer het volgende commando uit om het pakket te installeren:
owner.settings.cleanuprules.keep.pattern = Behoud versies die overeenkomen met
npm.details.tag = Label
owner.settings.cargo.initialize.description = Een speciale index Git repository is nodig om het Cargo register te gebruiken. Door deze optie te gebruiken wordt de repository (opnieuw) aangemaakt en automatisch geconfigureerd.
-owner.settings.cleanuprules.none = Geen opruimregels beschikbaar. Raadpleeg de documentatie.
+owner.settings.cleanuprules.none = Er zijn nog geen opruimregels.
owner.settings.cleanuprules.keep.title = Versies die overeenkomen met deze regels worden bewaard, zelfs als ze overeenkomen met een verwijderingsregel hieronder.
alpine.registry.key = Download de openbare RSA-sleutel van het register in de map /etc/apk/keys/ om de indexhandtekening te verifiëren:
chef.registry = Stel dit register in je ~/.chef/config.rb bestand:
@@ -3342,6 +3519,31 @@ maven.download = Voer de opdrachtregel uit om de dependencies te downloaden:
npm.registry = Stel dit register in het .npmrc bestand van je project:
dependency.id = ID
nuget.dependency.framework = Target Framework
+title = Pakketten
+desc = Beheer repository pakketten.
+empty = Er zijn nog geen pakketten.
+empty.documentation = Voor meer informatie over het pakketregister, zie de documentatie.
+empty.repo = Did you upload a package, but it's not shown here? Ga naar pakketinstellingen en link het naar deze repo.
+registry.documentation = Zie de documentatie voor meer informatie over de %s register.
+filter.no_result = Je filter heeft geen resultaten opgeleverd.
+filter.container.tagged = Getagd
+filter.container.untagged = Ongetagd
+published_by = Gepubliceerd %[1]s door %[3]s
+published_by_in = Gepubliceerd %[1]s door %[3]s in %[5]s
+installation = Installatie
+about = Over dit pakket
+requirements = Vereisten
+dependencies = Afhankelijkheden
+keywords = Trefwoorden
+details = Details
+details.author = Auteur
+details.project_site = Projectwebsite
+details.repository_site = Repository website
+details.documentation_site = Documentatie website
+details.license = Licentie
+versions = Versies
+versions.view_all = Alles weergeven
+filter.type.all = Alle
[secrets]
secrets = Geheimen
@@ -3372,9 +3574,9 @@ runners.status.active=Actief
runs.commit=Commit
variables.update.failed = Mislukt bij het bewerken van variabele.
-status.cancelled = "Geannuleerd"
-status.skipped = "Overgeslagen"
-status.blocked = "Geblokkeerd"
+status.cancelled = Geannuleerd
+status.skipped = Overgeslagen
+status.blocked = Geblokkeerd
runners.status = Status
runners.task_list.no_tasks = Er is nog geen taak.
runners.labels = Labels
@@ -3384,11 +3586,11 @@ runners.task_list.done_at = Gedaan Op
runners.id = ID
runs.actor = Acteur
actions = Actions
-status.unknown = "Onbekend"
-status.waiting = "Wachten"
-status.running = "Bezig"
-status.success = "Succes"
-status.failure = "Mislukking"
+status.unknown = Onbekend
+status.waiting = Wachten
+status.running = Bezig
+status.success = Succes
+status.failure = Mislukking
runners = Runners
runners.new = Nieuwe Runner aanmaken
runners.new_notice = Hoe moet je een runner starten
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index a7c5bec349..301dfce750 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -102,8 +102,8 @@ copy_hash=Копировать хеш
copy_content=Копировать содержимое
copy_branch=Копировать название ветки
copy_success=Скопировано!
-copy_error=Ошибка при копировании
-copy_type_unsupported=Невозможно скопировать файл этого типа
+copy_error=Не удалось скопировать
+copy_type_unsupported=Невозможно скопировать этот тип файла
write=Редактирование
preview=Предпросмотр
@@ -141,6 +141,7 @@ name=Название
value=Значение
tracked_time_summary = Сводка отслеженного времени на основе фильтров списка задач
view = Просмотр
+confirm_delete_artifact = Вы точно хотите удалить артефакт «%s»?
[aria]
navbar=Панель навигации
@@ -183,21 +184,21 @@ not_found=Цель не найдена.
network_error=Ошибка сети
[startpage]
-app_desc=Удобный сервис собственного хостинга репозиториев Git
+app_desc=Удобный, самостоятельный хостинг Git-репозиториев
install=Простой в установке
install_desc=Просто запустите исполняемый файл для вашей платформы, разверните через Docker, или установите с помощью менеджера пакетов.
platform=Кроссплатформенный
platform_desc=Forgejo работает на любой платформе, поддерживаемой Go: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится!
lightweight=Легковесный
-lightweight_desc=Forgejo имеет низкие системные требования и может работать на недорогом Raspberry Pi. Экономьте энергию вашей машины!
+lightweight_desc=Forgejo имеет низкие системные требования и может работать на недорогом Raspberry Pi. Экономьте ресурсы вашей машины!
license=Открытый исходный код
license_desc=Всё это на Forgejo! Присоединяйтесь к нам, внося вклад, чтобы сделать этот проект ещё лучше. Не бойтесь помогать!
[install]
install=Установка
title=Начальная конфигурация
-docker_helper=Если вы запускаете Forgejo внутри Docker, пожалуйста внимательно прочтите документацию перед тем, как изменить любые настройки.
-require_db_desc=Forgejo требует MySQL, PostgreSQL, MSSQL, SQLite3 или TiDB (через протокол MySQL).
+docker_helper=Если вы запускаете Forgejo под Docker, пожалуйста, ознакомьтесь с документацией, прежде чем изменять любые настройки.
+require_db_desc=Forgejo требует MySQL, PostgreSQL, MSSQL, SQLite3 или TiDB (по протоколу MySQL).
db_title=Настройки базы данных
db_type=Тип базы данных
host=Хост
@@ -208,7 +209,7 @@ db_schema=Схема
db_schema_helper=Оставьте пустым для значения по умолчанию ("public").
ssl_mode=SSL
path=Путь
-sqlite_helper=Путь к файлу базы данных SQLite3. Введите абсолютный путь, если вы запускаете Forgejo как службу.
+sqlite_helper=Путь к файлу базы данных SQLite3. Введите абсолютный путь, если запускаете Forgejo как службу.
reinstall_error=Вы пытаетесь произвести установку в уже существующую базу данных Forgejo
reinstall_confirm_message=Переустановка в уже существующую базу данных Forgejo может вызвать несколько проблем. В большинстве случаев вы должны использовать существующий "app.ini" для запуска Forgejo. Если вы понимаете, что вы делаете, подтвердите:
reinstall_confirm_check_1=Данные, зашифрованные SECRET_KEY в приложении, могут быть потеряны: пользователи не смогут войти в систему с помощью 2FA/OTP & зеркала могут работать неправильно. Отметьте этот флажок, чтобы убедиться, что текущий файл app.ini содержит корректный SECRET_KEY.
@@ -587,14 +588,14 @@ invalid_ssh_key=Не удается проверить ключ SSH: %s
invalid_gpg_key=Не удается проверить ключ GPG: %s
invalid_ssh_principal=Неверный принципал: %s
must_use_public_key=Ключ, который вы предоставили, является закрытым. Пожалуйста, не отправляйте свой закрытый ключ куда бы то ни было. Используйте для этих целей открытый ключ.
-unable_verify_ssh_key="Не удаётся верифицировать ключ SSH, проверьте его на наличие ошибок."
+unable_verify_ssh_key=Не удаётся верифицировать ключ SSH, проверьте его на наличие ошибок.
auth_failed=Ошибка аутентификации: %v
-still_own_repo="Ваша учётная запись владеет одним или несколькими репозиториями, сначала удалите или передайте их."
-still_has_org="Ваша учётная запись является членом одной или нескольких организаций, сначала покиньте их."
-still_own_packages="Ваша учётная запись владеет одним или несколькими пакетами, сначала удалите их."
-org_still_own_repo="Эта организация всё ещё владеет одним или несколькими репозиториями, сначала удалите или передайте их."
-org_still_own_packages="Эта организация всё ещё владеет одним или несколькими пакетами, сначала удалите их."
+still_own_repo=Ваша учётная запись владеет одним или несколькими репозиториями, сначала удалите или передайте их.
+still_has_org=Ваша учётная запись является членом одной или нескольких организаций, сначала покиньте их.
+still_own_packages=Ваша учётная запись владеет одним или несколькими пакетами, сначала удалите их.
+org_still_own_repo=Эта организация всё ещё владеет одним или несколькими репозиториями, сначала удалите или передайте их.
+org_still_own_packages=Эта организация всё ещё владеет одним или несколькими пакетами, сначала удалите их.
target_branch_not_exist=Целевая ветка не существует.
admin_cannot_delete_self = Вы не можете удалить свою учётную запись, будучи администратором. Сперва снимите с себя роль администратора.
@@ -602,7 +603,7 @@ username_error_no_dots = ` может состоять только из лат
[user]
change_avatar=Изменить свой аватар…
-joined_on=Присоединил(ся/ась) %s
+joined_on=Зарегистрирован(а) с %s
repositories=Репозитории
activity=Публичная активность
followers=Подписчики
@@ -737,9 +738,9 @@ theme_update_error=Выбранная тема не существует.
openid_deletion=Удалить OpenID URI
openid_deletion_desc=После удаления адреса OpenID вы не сможете войти в вашу учётную запись с его помощью. Вы уверены?
openid_deletion_success=Адрес OpenID удален.
-add_new_email=Добавить новый адрес эл. почты
+add_new_email=Добавить адрес эл. почты
add_new_openid=Добавить новый OpenID URI
-add_email=Добавить новый адрес эл. почты
+add_email=Добавить новый адрес
add_openid=Добавить адрес OpenID
add_email_confirmation_sent=Письмо для подтверждения отправлено на «%s». Пожалуйста, проверьте ваш почтовый ящик в течение %s, чтобы завершить процесс подтверждения.
add_email_success=Добавлен новый адрес эл. почты.
@@ -754,7 +755,7 @@ manage_gpg_keys=Управление ключами GPG
add_key=Добавить ключ
ssh_desc=Эти открытые ключи SSH связаны с вашей учётной записью. Соответствующие им закрытые ключи обеспечивают полный доступ к вашим репозиториями. Подтверждённые ключи SSH могут быть использованы для подтверждения подписанных с SSH коммитов.
principal_desc=Эти принципалы сертификатов SSH привязаны к вашей учётной записи и разрешают полный доступ к вашим репозиториям.
-gpg_desc=Эти открытые GPG ключи связаны с вашей учётной записью. Храните закрытые ключи в безопасности, так как они позволяют проверять подлинности коммитов.
+gpg_desc=Эти открытые GPG-ключи ассоциируются с вашей учётной записью и используются для проверки подлинности коммитов. Храните закрытые ключи в безопасности, т.к. ими можно подписывать коммиты от вашего лица.
ssh_helper=Нужна помощь? Ознакомьтесь с руководством GitHub по созданию ключей SSH или решению возникающих проблем при использовании SSH.
gpg_helper=Нужна помощь? Взгляните на руководство GitHub по GPG.
add_new_key=Добавить ключ SSH
@@ -865,7 +866,7 @@ update_oauth2_application_success=Изменения настроек прило
oauth2_application_name=Имя приложения
oauth2_redirect_uris=URI для перенаправления. Используйте новую строку для каждого URI.
save_application=Сохранить
-oauth2_client_id=ID клиента
+oauth2_client_id=ИД клиента
oauth2_client_secret=Клиентский ключ
oauth2_regenerate_secret=Сгенерировать новый ключ
oauth2_regenerate_secret_hint=Потеряли свой ключ?
@@ -875,7 +876,7 @@ oauth2_application_create_description=Приложения OAuth2 предост
oauth2_application_remove_description=Удаление приложения OAuth2 приведёт к отмене его доступа к авторизованным учётным записям пользователей в данном экземпляре. Продолжить?
authorized_oauth2_applications=Авторизованные приложения OAuth2
-authorized_oauth2_applications_description=Вы предоставили доступ к вашей персональной учётной записи Forgejo этим сторонним приложениям. Пожалуйста, отзовите доступ у приложений, которые более не используются.
+authorized_oauth2_applications_description=Вы предоставили этим сторонним приложениям доступ к вашей учётной записи Forgejo. Пожалуйста, отзовите доступ у приложений, которые более не используются.
revoke_key=Отозвать
revoke_oauth2_grant=Отозвать доступ
revoke_oauth2_grant_description=Отзыв доступа у этого стороннего приложения не позволит ему получать доступ к вашим данным. Вы уверены?
@@ -938,7 +939,7 @@ visibility.limited=Ограниченный
visibility.limited_tooltip=Виден только выполнившим вход пользователям
visibility.private=Приватный
visibility.private_tooltip=Виден только членам организаций, к которым вы присоединились
-blocked_users_none = У вас нет заблокированных пользователей.
+blocked_users_none = Заблокированных пользователей нет.
user_block_success = Пользователь заблокирован.
oauth2_application_locked = Forgejo предварительно регистрирует некоторые приложения OAuth2 при запуске, если это включено в конфигурации. Для избежания неожиданного поведения их нельзя удалять или редактировать. Ознакомиться с подробностями можно в документации OAuth2.
hooks.desc = Добавьте веб-хуки, которые будут срабатывать во всех ваших репозиториях.
@@ -948,7 +949,8 @@ user_unblock_success = Пользователь разблокирован.
twofa_scratch_token_regenerated = Ваш одноразовый ключ восстановления: %s. Сохраните его в надёжном месте. Больше он показан не будет.
blocked_users = Заблокированные пользователи
keep_email_private_popup = Ваш адрес эл. почты будет скрыт из профиля и не будет использован для запросов на слияние или при редактировании файлов из веб-интерфейса. Уже существующие комиты не будут изменены. Используйте %s в качестве адреса для комитов, чтобы они ассоциировались с вашей учётной записью.
-oauth2_confidential_client = Конфиденциальный клиент. Выберите для приложений, которые хранят секрет в тайне, например веб-приложений. Не выбирайте для нативных приложений, включая приложения для ПК или смартфона.
+oauth2_confidential_client = Конфиденциальный клиент. Выберите для приложений, хранящих секрет в тайне, например, для веб-приложений. Не выбирайте для нативных приложений, включая приложения для ПК или смартфонов.
+change_password = Изменение пароля
[repo]
owner=Владелец
@@ -1093,7 +1095,7 @@ migrate.github_token_desc=Вы можете поместить один или
migrate.clone_local_path=или локальный путь на сервере
migrate.permission_denied=У вас нет прав на импорт локальных репозиториев.
migrate.permission_denied_blocked=Вы не можете импортировать с запрещённых хостов, пожалуйста, попросите администратора проверить настройки ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
-migrate.invalid_local_path="Недопустимый локальный путь. Он не существует или не является каталогом."
+migrate.invalid_local_path=Недопустимый локальный путь. Он не существует или не является каталогом.
migrate.invalid_lfs_endpoint=Конечная точка LFS недействительна.
migrate.failed=Миграция не удалась: %v
migrate.migrate_items_options=Токен доступа необходим для миграции дополнительных элементов
@@ -1310,7 +1312,7 @@ commitstatus.pending=Ожидание
commitstatus.success=Успешно
ext_issues=Доступ к внешним задачам
-ext_issues.desc=Ссылка на внешнюю систему отслеживания ошибок.
+ext_issues.desc=Ссылка на внешнюю систему отслеживания задач.
projects=Проекты
projects.desc=Управление задачами и pull'ами в досках проекта.
@@ -1331,8 +1333,8 @@ projects.edit_success=Проект «%s» обновлён.
projects.type.none=Нет
projects.type.basic_kanban=Обычный Канбан
projects.type.bug_triage=Планирование работы с багами
-projects.template.desc=Шаблон проекта
-projects.template.desc_helper=Выберите шаблон проекта для начала
+projects.template.desc=Шаблон
+projects.template.desc_helper=Для начала выберите шаблон проекта
projects.type.uncategorized=Без категории
projects.column.edit=Изменить столбец
projects.column.edit_title=Название
@@ -1340,11 +1342,11 @@ projects.column.new_title=Название
projects.column.new_submit=Создать столбец
projects.column.new=Новый столбец
projects.column.set_default=Установить по умолчанию
-projects.column.set_default_desc=Назначить этот столбец по умолчанию для неклассифицированных задач и запросов на слияние
+projects.column.set_default_desc=Назначить этот столбец по умолчанию для задач и запросов на слияние без категории
projects.column.unset_default=Снять установку по умолчанию
projects.column.unset_default_desc=Снять установку этого столбца по умолчанию
projects.column.delete=Удалить столбец
-projects.column.deletion_desc="При удалении столбца проекта все связанные задачи перемещаются в 'Без категории'. Продолжить?"
+projects.column.deletion_desc=При удалении столбца проекта все связанные задачи перемещаются в «Без категории». Продолжить?
projects.column.color=Цвет
projects.open=Открыть
projects.close=Закрыть
@@ -1353,7 +1355,7 @@ projects.card_type.desc=Предпросмотр карточек
projects.card_type.images_and_text=Изображения и текст
projects.card_type.text_only=Только текст
-issues.desc=Организация отчетов об ошибках, заданий и этапов.
+issues.desc=Организация отчетов об ошибках, задач и этапов.
issues.filter_assignees=Фильтр назначений
issues.filter_milestones=Фильтр этапов
issues.filter_projects=Фильтровать проекты
@@ -1496,11 +1498,11 @@ issues.reopen_comment_issue=Прокомментировать и открыть
issues.create_comment=Комментировать
issues.closed_at=`закрыл(а) эту задачу %[2]s`
issues.reopened_at=`переоткрыл(а) эту проблему %[2]s`
-issues.commit_ref_at=`упомянул эту задачу в коммите %[2]s`
-issues.ref_issue_from=`ссылка на эту проблему %[4]s%[2]s`
-issues.ref_pull_from=`сослался(ась) на этот запрос на слияние %[4]s%[2]s`
-issues.ref_closing_from=`сослался(ась) на запрос на слияние %[4]s, который закроет эту задачу%[2]s`
-issues.ref_reopening_from=`сослался(ась) на запрос на слияние %[4]s, который повторно откроет эту задачу%[2]s`
+issues.commit_ref_at=`сослался на эту задачу в коммите %[2]s`
+issues.ref_issue_from=`сослался на эту задачу %[4]s%[2]s`
+issues.ref_pull_from=`сослался(ась) на этот запрос слияния %[4]s%[2]s`
+issues.ref_closing_from=`сослался(ась) на запрос слияния %[4]s, который закроет эту задачу%[2]s`
+issues.ref_reopening_from=`сослался(ась) на запрос слияния %[4]s, который повторно откроет эту задачу%[2]s`
issues.ref_closed_from=`закрыл этот запрос %[4]s%[2]s`
issues.ref_reopened_from=`переоткрыл эту задачу %[4]s%[2]s`
issues.ref_from=`из %[1]s`
@@ -1561,8 +1563,8 @@ issues.lock.unknown_reason=Для ограничения обсуждения н
issues.lock_duplicate=Обсуждение задачи уже ограничено.
issues.unlock_error=Невозможно снять несуществующее ограничение обсуждения.
issues.lock_with_reason=заблокировано как %s и ограничено обсуждение для соучастников %s
-issues.lock_no_reason=ограничил(а) обсуждение задачи кругом соавторов %s
-issues.unlock_comment=снял(а) ограничение %s
+issues.lock_no_reason=ограничил(а) обсуждение задачи до соавторов %s
+issues.unlock_comment=снял(а) ограничение обсуждения %s
issues.lock_confirm=Ограничить
issues.unlock_confirm=Снять
issues.lock.notice_1=- Другие пользователи не могут добавлять новые комментарии к этой задаче.
@@ -1599,9 +1601,9 @@ issues.add_time_sum_to_small=Время не было введено.
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.error_removing_due_date="Не удалось убрать срок выполнения."
+issues.invalid_due_date_format=Дата окончания должна быть в формате «гггг-мм-дд».
+issues.error_modifying_due_date=Не удалось изменить срок выполнения.
+issues.error_removing_due_date=Не удалось убрать срок выполнения.
issues.push_commit_1=добавил(а) %d коммит %s
issues.push_commits_n=добавил(а) %d коммитов %s
issues.force_push_codes=`форсировал(а) отправку изменений %[1]s %[4]s вместо %[2]s %[6]s`
@@ -1610,12 +1612,12 @@ issues.due_date_form=гггг-мм-дд
issues.due_date_form_add=Добавить срок выполнения
issues.due_date_form_edit=Редактировать
issues.due_date_form_remove=Удалить
-issues.due_date_not_set="Срок выполнения не установлен."
+issues.due_date_not_set=Срок выполнения не установлен.
issues.due_date_added=добавил(а) срок выполнения %s %s
issues.due_date_modified=изменил(а) срок выполнения с %[2]s на %[1]s %[3]s
-issues.due_date_remove=удалён срок выполнения %s %s
+issues.due_date_remove=убрал(а) срок выполнения %s %s
issues.due_date_overdue=Просроченные
-issues.due_date_invalid="Срок выполнения недействителен или находится за пределами допустимого диапазона. Пожалуйста, используйте формат 'гггг-мм-дд'."
+issues.due_date_invalid=Срок выполнения недействителен или находится за пределами допустимого диапазона. Пожалуйста, используйте формат «гггг-мм-дд».
issues.dependency.title=Зависимости
issues.dependency.issue_no_dependencies=Зависимостей нет.
issues.dependency.pr_no_dependencies=Зависимостей нет.
@@ -1633,7 +1635,7 @@ issues.dependency.issue_closing_blockedby=Закрытие этой задачи
issues.dependency.issue_close_blocks=Эта задача блокирует закрытие следующих задач
issues.dependency.pr_close_blocks=Этот запрос на слияние блокирует закрытие следующих задач
issues.dependency.issue_close_blocked=Вам необходимо закрыть все задачи, блокирующие эту задачу, прежде чем вы сможете её закрыть.
-issues.dependency.issue_batch_close_blocked=Невозможно пакетно закрыть выбранные задачи, потому что у задачи #%d остаются открытые зависимости
+issues.dependency.issue_batch_close_blocked=Групповое закрытие выбранных задач невозможно, поскольку у задачи #%d есть открытые зависимости
issues.dependency.pr_close_blocked=Вам необходимо закрыть все задачи, блокирующие этот запрос на слияние, прежде чем вы сможете принять его.
issues.dependency.blocks_short=Блоки
issues.dependency.blocked_by_short=Зависит от
@@ -1651,15 +1653,15 @@ issues.review.self.approval=Вы не можете одобрить собств
issues.review.self.rejection=Невозможно запрашивать изменения своего запроса на слияние.
issues.review.approve=одобрил(а) эти изменения %s
issues.review.comment=рассмотрел(а) изменения %s
-issues.review.dismissed=отклонен отзыв %s %s
+issues.review.dismissed=отклонил(а) отзыв %s %s
issues.review.dismissed_label=Отклонено
issues.review.left_comment=оставил комментарий
issues.review.content.empty=Запрашивая изменения, вы обязаны оставить комментарий с пояснением своих пожеланий относительно запроса на слияние.
issues.review.reject=запросил(а) изменения %s
issues.review.wait=был запрошен для отзыва %s
-issues.review.add_review_request=запросил отзыв от %s %s
-issues.review.remove_review_request=удалена заявка на отзыв для %s %s
-issues.review.remove_review_request_self=отказано в отзыве %s
+issues.review.add_review_request=запросил(а) отзыв от %s %s
+issues.review.remove_review_request=удалил(а )заявку на отзыв для %s %s
+issues.review.remove_review_request_self=отказался добавлять отзыв %s
issues.review.pending=Ожидание
issues.review.pending.tooltip=Этот комментарий в настоящее время не виден другим пользователям. Чтобы отправить отложенные комментарии, выберите «%s» → «%s/%s/%s» в верхней части страницы.
issues.review.review=Рецензия
@@ -1671,9 +1673,9 @@ issues.review.show_outdated=Показать устаревшие
issues.review.hide_outdated=Скрыть устаревшие
issues.review.show_resolved=Показать разрешенные
issues.review.hide_resolved=Скрыть разрешенные
-issues.review.resolve_conversation=Покинуть диалог
-issues.review.un_resolve_conversation=Незавершённый разговор
-issues.review.resolved_by=пометить этот разговор как разрешённый
+issues.review.resolve_conversation=Пометить как разрешённое
+issues.review.un_resolve_conversation=Пометить как неразрешённое
+issues.review.resolved_by=пометить это обсуждение как разрешённое
issues.assignee.error=Не все назначения были добавлены из-за непредвиденной ошибки.
issues.reference_issue.body=Тело
issues.content_history.deleted=удалено
@@ -1736,14 +1738,14 @@ pulls.add_prefix=Добавить %s префикс
pulls.remove_prefix=Удалить %s префикс
pulls.data_broken=Содержимое этого запроса было нарушено вследствие удаления информации форка.
pulls.files_conflicted=Этот запрос на слияние имеет изменения конфликтующие с целевой веткой.
-pulls.is_checking="Продолжается проверка конфликтов. Повторите попытку позже."
-pulls.is_ancestor="Эта ветка уже включена в целевую ветку. Сливать нечего."
-pulls.is_empty="Изменения из этой ветки уже есть в целевой ветке. Это будет пустой коммит."
+pulls.is_checking=Продолжается проверка конфликтов. Повторите попытку позже.
+pulls.is_ancestor=Эта ветка уже включена в целевую ветку. Объединять нечего.
+pulls.is_empty=Изменения из этой ветки уже есть в целевой ветке. Получится пустой коммит.
pulls.required_status_check_failed=Некоторые необходимые проверки не были пройдены.
pulls.required_status_check_missing=Отсутствуют некоторые обязательные проверки.
pulls.required_status_check_administrator=Как администратор, вы все равно можете принять этот запрос на слияние.
-pulls.blocked_by_approvals="У этого запроса на слияние пока недостаточного одобрений. Получено %d из %d одобрений."
-pulls.blocked_by_rejection="Официальный рецензент запросил изменения к этому запросу на слияние."
+pulls.blocked_by_approvals=У этого запроса на слияние пока недостаточного одобрений. Получено %d из %d одобрений.
+pulls.blocked_by_rejection=Официальный рецензент запросил изменения к этому запросу на слияние.
pulls.can_auto_merge_desc=Этот запрос на слияние может быть объединён автоматически.
pulls.cannot_auto_merge_desc=Этот запрос на слияние не может быть объединён автоматически.
pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов.
@@ -1751,11 +1753,11 @@ pulls.num_conflicting_files_1=%d конфликтующий файл
pulls.num_conflicting_files_n=%d конфликтующих файлов
pulls.approve_count_1=%d одобрение
pulls.approve_count_n=%d одобрений
-pulls.reject_count_1=%d запрос на изменение
-pulls.reject_count_n=%d запросов на изменение
+pulls.reject_count_1=%d запрос изменений
+pulls.reject_count_n=%d запросов изменений
pulls.waiting_count_1=%d ожидает проверки
-pulls.waiting_count_n=%d ожидающих отзывов
-pulls.wrong_commit_id=id фиксации должен быть идентификатором фиксации в целевой ветке
+pulls.waiting_count_n=%d ожидающих проверки
+pulls.wrong_commit_id=id коммита должен быть ид коммита в целевой ветке
pulls.no_merge_desc=Запрос на слияние не может быть принят, так как отключены все настройки слияния.
pulls.no_merge_helper=Включите опции слияния в настройках репозитория или совершите слияние этого запроса вручную.
@@ -1767,7 +1769,7 @@ pulls.rebase_merge_pull_request=Выполнить rebase и fast-forward
pulls.rebase_merge_commit_pull_request=Выполнить rebase и создать коммит слияния
pulls.squash_merge_pull_request=Создать объединённый коммит
pulls.merge_manually=Слито вручную
-pulls.merge_commit_id=ID коммита слияния
+pulls.merge_commit_id=ИД коммита слияния
pulls.require_signed_wont_sign=Данная ветка ожидает подписанные коммиты, однако слияние не будет подписано
pulls.invalid_merge_option=Этот параметр слияния нельзя использовать для этого запроса на слияние.
@@ -1835,7 +1837,7 @@ milestones.title=Заголовок
milestones.desc=Описание
milestones.due_date=Дата окончания (опционально)
milestones.clear=Очистить
-milestones.invalid_due_date_format="Дата выполнения должна быть в формате 'гггг-мм-дд'."
+milestones.invalid_due_date_format=Дата выполнения должна быть в формате «гггг-мм-дд».
milestones.create_success=Этап «%s» создан.
milestones.edit=Редактировать этап
milestones.edit_subheader=Используйте лучшее описание контрольной точки, во избежание непонимания со стороны других людей.
@@ -1929,8 +1931,8 @@ 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.title.unresolved_conv_1=%d незавершённое обсуждение
+activity.title.unresolved_conv_n=%d незавершённых обсуждений
activity.unresolved_conv_desc=Список задач и запросов на слияние с недавней активностью, но ещё не закрытых либо принятых.
activity.unresolved_conv_label=Открытые
activity.title.releases_1=%d выпуск
@@ -2022,10 +2024,10 @@ settings.external_wiki_url_desc=Посетители будут перенапр
settings.issues_desc=Включить систему учёта задач репозитория
settings.use_internal_issue_tracker=Использовать встроенную систему учета задач
settings.use_external_issue_tracker=Использовать внешнюю систему учета задач
-settings.external_tracker_url=URL внешней системы отслеживания ошибок
+settings.external_tracker_url=Ссылка на внешнюю систему отслеживания задач
settings.external_tracker_url_error=URL внешнего баг-трекера не является корректным URL.
settings.external_tracker_url_desc=Посетители будут перенаправлены на URL, когда они кликнут по вкладке.
-settings.tracker_url_format=Формат ссылки внешней системы отслеживания ошибок
+settings.tracker_url_format=Формат ссылки внешней системы отслеживания задач
settings.tracker_url_format_error=Формат URL внешнего баг-трекера некорректен.
settings.tracker_issue_style=Формат нумерации для внешней системы учета задач
settings.tracker_issue_style.numeric=Цифровой
@@ -2146,7 +2148,7 @@ settings.webhook.payload=Содержимое
settings.webhook.body=Тело ответа
settings.webhook.replay.description=Повторить этот веб-хук.
settings.webhook.delivery.success=Событие было добавлено в очередь доставки. Может пройти несколько секунд, прежде чем оно отобразится в истории.
-settings.githooks_desc="Git-хуки предоставляются самим Git. Вы можете изменять файлы хуков из списка ниже, чтобы настроить собственные операции."
+settings.githooks_desc=Git-хуки предоставляются самим Git. Вы можете изменять файлы хуков из списка ниже, чтобы настроить собственные операции.
settings.githook_edit_desc=Если хук не активен, будет подставлен пример содержимого. Пустое значение в этом поле приведёт к отключению хука.
settings.githook_name=Название хукa
settings.githook_content=Содержимое хука
@@ -2289,7 +2291,7 @@ settings.protect_merge_whitelist_teams=Команды, члены которых
settings.protect_check_status_contexts=Включить проверку статуса
settings.protect_status_check_patterns=Шаблоны проверки состояния:
settings.protect_status_check_patterns_desc=Добавьте шаблоны, чтобы указать, какие проверки состояния должны быть пройдены, прежде чем ветви могут быть объединены в ветвь, соответствующую этому правилу. В каждой строке указывается шаблон. Шаблоны не могут быть пустыми.
-settings.protect_check_status_contexts_desc=Требуется пройти проверку состояния перед слиянием. Выберите, какие проверки состояния должны быть пройдены, прежде чем ветви можно будет объединить в ветвь, соответствующую этому правилу. Если этот параметр включен, коммиты сначала должны быть перемещены в другую ветвь, а затем объединены или перемещены непосредственно в ветвь, соответствующую этому правилу, после прохождения проверки состояния. Если контексты не выбраны, то последняя фиксация должна быть успешной независимо от контекста.
+settings.protect_check_status_contexts_desc=Требуется пройти проверку состояния перед слиянием. Выберите, какие проверки состояния должны быть пройдены, прежде чем ветви можно будет объединить в ветвь, соответствующую этому правилу. Если этот параметр включен, коммиты сначала должны быть перемещены в другую ветвь, а затем объединены или перемещены непосредственно в ветвь, соответствующую этому правилу, после прохождения проверки состояния. Если контексты не выбраны, то последний коммит должен быть успешным вне зависимости от контекста.
settings.protect_check_status_contexts_list=Проверки состояния за последнюю неделю для этого репозитория
settings.protect_status_check_matched=Совпало
settings.protect_invalid_status_check_pattern=Неверный шаблон проверки состояния: «%s».
@@ -2307,10 +2309,10 @@ settings.require_signed_commits_desc=Отклонить отправку изм
settings.protect_branch_name_pattern=Шаблон названий защищённых веток
settings.protect_branch_name_pattern_desc=Шаблоны названий защищённых веток. О синтаксисе шаблонов читайте в документации. Примеры: main, release/**
settings.protect_patterns=Шаблоны
-settings.protect_protected_file_patterns="Шаблоны защищённых файлов (разделённые точкой с запятой ';'):"
-settings.protect_protected_file_patterns_desc="Защищенные файлы нельзя изменить напрямую, даже если пользователь имеет право добавлять, редактировать или удалять файлы в этой ветке. Можно указать несколько шаблонов, разделяя их точкой с запятой (';'). О синтаксисе шаблонов читайте в документации github.com/gobwas/glob . Примеры: .drone.yml, /docs/**/*.txt."
-settings.protect_unprotected_file_patterns="Шаблоны незащищённых файлов (разделённые точкой с запятой ';'):"
-settings.protect_unprotected_file_patterns_desc="Незащищенные файлы, которые допускается изменять напрямую, если пользователь имеет право на запись, несмотря на ограничение отправки изменений. Можно указать несколько шаблонов, разделяя их точкой с запятой (';'). О синтаксисе шаблонов читайте в документации github.com/gobwas/glob . Примеры: .drone.yml, /docs/**/*.txt."
+settings.protect_protected_file_patterns=Шаблоны защищённых файлов, разделённые точкой с запятой «;»:
+settings.protect_protected_file_patterns_desc=Защищенные файлы нельзя изменить напрямую, даже если пользователь имеет право добавлять, редактировать или удалять файлы в этой ветке. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации github.com/gobwas/glob . Примеры: .drone.yml, /docs/**/*.txt.
+settings.protect_unprotected_file_patterns=Шаблоны незащищённых файлов, разделённые точкой с запятой «;»:
+settings.protect_unprotected_file_patterns_desc=Незащищенные файлы, которые допускается изменять напрямую, если пользователь имеет право на запись, несмотря на ограничение отправки изменений. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации github.com/gobwas/glob . Примеры: .drone.yml, /docs/**/*.txt.
settings.add_protected_branch=Включить защиту
settings.delete_protected_branch=Отключить защиту
settings.update_protect_branch_success=Защита веток по правилу «%s» изменена.
@@ -2343,9 +2345,9 @@ settings.tags.protection.allowed.noone=Ни один
settings.tags.protection.create=Защитить тег
settings.tags.protection.none=Нет защищенных тегов.
settings.bot_token=Токен для бота
-settings.chat_id=ID чата
+settings.chat_id=ИД чата
settings.matrix.homeserver_url=URL домашнего сервера
-settings.matrix.room_id=ID комнаты
+settings.matrix.room_id=ИД комнаты
settings.matrix.message_type=Тип сообщения
settings.archive.button=Архивировать репозиторий
settings.archive.header=Архивировать этот репозиторий
@@ -2568,10 +2570,10 @@ blame.ignore_revs = Правки в .git-blame-ignore-revs пр
issues.blocked_by_user = Невозможно создать задачу в этом репозитории, т.к. вы заблокированы его владельцем.
settings.new_owner_blocked_doer = Вы заблокированы новым владельцем.
settings.add_collaborator_blocked_them = Невозможно добавить соавтора, т.к. им заблокирован владелец репозитория.
-pulls.blocked_by_changed_protected_files_1 = "Этот запрос на слияние заблокирован, т.к. им изменяется защищённый файл:"
+pulls.blocked_by_changed_protected_files_1 = Этот запрос на слияние заблокирован, т.к. им изменяется защищённый файл:
object_format_helper = Формат объектов в репозитории. Невозможно изменить в дальнейшем. SHA1 даёт наибольшую совместимость.
-pulls.blocked_by_outdated_branch = "Этот запрос на слияние заблокирован, т.к. он устарел."
-pulls.blocked_by_changed_protected_files_n = "Этот запрос на слияние заблокирован, т.к. им изменяются защищённые файлы:"
+pulls.blocked_by_outdated_branch = Этот запрос на слияние заблокирован, т.к. он устарел.
+pulls.blocked_by_changed_protected_files_n = Этот запрос на слияние заблокирован, т.к. им изменяются защищённые файлы:
blame.ignore_revs.failed = Не удалось проигнорировать правки из .git-blame-ignore-revs.
desc.sha256 = SHA256
archive.title = Этот репозиторий архивирован. Вы можете просматривать его содержимое или клонировать, но не добавлять новые комиты, открывать задачи или запросы на слияние.
@@ -2587,11 +2589,11 @@ transfer.no_permission_to_accept = У вас недостаточно прав
transfer.no_permission_to_reject = У вас недостаточно прав для отклонения этого переноса.
commits.view_path = Просмотреть в этом моменте истории
commits.renamed_from = Переименован с %s
-issues.due_date_not_writer = "Для обновления даты выполнения задачи требуются права записи в этом репозитории."
+issues.due_date_not_writer = Для обновления даты выполнения задачи требуются на запись в этом репозитории.
issues.review.outdated_description = С момента добавления этого комментария содержимое изменилось
pulls.nothing_to_compare_have_tag = Выбранные ветки/теги идентичны.
pulls.select_commit_hold_shift_for_range = Выберите коммит. Зажмите Shift, чтобы выбрать диапазон
-pulls.blocked_by_official_review_requests = "Этот запрос на слияние заблокирован, т.к. у него не хватает одобрений от одного или нескольких официальных рецензентов."
+pulls.blocked_by_official_review_requests = Этот запрос на слияние заблокирован, т.к. у него не хватает одобрений от одного или нескольких официальных рецензентов.
pulls.recently_pushed_new_branches = Вы отправили коммиты в ветку %[1]s %[1]s
milestones.new_subheader = Этапы полезны для систематизации задач и отслеживания их выполнения.
wiki.cancel = Отмена
@@ -2626,6 +2628,9 @@ contributors.contribution_type.commits = Коммиты
contributors.contribution_type.additions = Добавления
contributors.contribution_type.deletions = Удаления
contributors.contribution_type.filter_label = Тип участия:
+pulls.commit_ref_at = `сослался(ась) на этот запрос слияния из комммита %[2]s`
+settings.thread_id = ИД обсуждения
+pulls.made_using_agit = AGit
[org]
org_name_holder=Название организации
@@ -2735,7 +2740,7 @@ teams.remove_all_repos_title=Удалить все репозитории ком
teams.remove_all_repos_desc=Удаляет все репозитории из команды.
teams.add_all_repos_title=Добавить все репозитории
teams.add_all_repos_desc=Добавит все репозитории организации в команду.
-teams.add_nonexistent_repo="Репозиторий, который вы пытаетесь добавить, не существует, сначала создайте его."
+teams.add_nonexistent_repo=Репозиторий, который вы пытаетесь добавить, не существует. Сначала создайте его.
teams.add_duplicate_users=Пользователь уже состоит в команде.
teams.repos.none=Для этой команды нет доступных репозиториев.
teams.members.none=В этой команде нет участников.
@@ -2790,7 +2795,7 @@ dashboard.cron.error=Ошибка в запланированном задани
dashboard.cron.finished=Планировщик: %[1]s завершено
dashboard.delete_inactive_accounts=Удалить все неактивированные учётные записи
dashboard.delete_inactive_accounts.started=Удаление всех неактивированных учётных записей началось.
-dashboard.delete_repo_archives=Удалить все архивы репозиториев (ZIP, TAR.GZ, и т.д..)
+dashboard.delete_repo_archives=Удалить все архивы репозиториев (ZIP, TAR.GZ и др...)
dashboard.delete_repo_archives.started=Удаление всех архивов репозитория началось.
dashboard.delete_missing_repos=Удалить все записи о репозиториях с отсутствующими файлами Git
dashboard.delete_missing_repos.started=Начато удаление всех репозиториев без Git-файлов.
@@ -2800,11 +2805,11 @@ dashboard.repo_health_check=Проверка состояния всех реп
dashboard.check_repo_stats=Проверить всю статистику репозитория
dashboard.archive_cleanup=Удалить старые архивы репозитория
dashboard.deleted_branches_cleanup=Очистка удалённых ветвей
-dashboard.update_migration_poster_id=Обновить ID плакатов миграции
+dashboard.update_migration_poster_id=Обновить ИД плакатов миграции
dashboard.git_gc_repos=Выполнить сборку мусора для всех репозиториев
dashboard.resync_all_sshkeys=Обновить файл '.ssh/authorized_keys' с ключами SSH Forgejo.
dashboard.resync_all_sshprincipals=Обновите файл '.ssh/authorized_principals' SSH данными участника Forgejo.
-dashboard.resync_all_hooks=Повторная синхронизация hook'ов pre-receive, update и post-receive во всех репозиториях.
+dashboard.resync_all_hooks=Пересинхронизировать хуки pre-receive, update и post-receive всех репозиториев.
dashboard.reinit_missing_repos=Переинициализировать все отсутствующие Git репозитории, для которых существуют записи
dashboard.sync_external_users=Синхронизировать данные сторонних пользователей
dashboard.cleanup_hook_task_table=Очистить таблицу hook_task
@@ -2883,7 +2888,7 @@ users.allow_import_local=Пользователь имеет право импо
users.allow_create_organization=Эта учётная запись имеет разрешения на создание организаций
users.update_profile=Обновить профиль пользователя
users.delete_account=Удалить эту учётную запись
-users.cannot_delete_self=Вы не можете удалить собственную учётную запись
+users.cannot_delete_self=Вы не можете удалить свою учётную запись
users.still_own_repo=Этот пользователь всё ещё является владельцем одного или более репозиториев. Сначала удалите или передайте эти репозитории.
users.still_has_org=Этот пользователь всё ещё является членом одной или более организаций. Сначала удалите пользователя из всех организаций.
users.purge=Удалить пользователя
@@ -3081,7 +3086,7 @@ config.app_name=Название сайта
config.app_ver=Версия Forgejo
config.app_url=Базовый URL Forgejo
config.custom_conf=Путь к файлу конфигурации
-config.custom_file_root_path="Пользовательский путь до каталога с файлами"
+config.custom_file_root_path=Пользовательский путь до каталога с файлами
config.domain=Домен сервера
config.offline_mode=Локальный режим
config.disable_router_log=Отключение журнала маршрутизатора
@@ -3270,6 +3275,17 @@ auths.tip.gitea = Зарегистрируйте новое приложение
auths.tips.oauth2.general.tip = При регистрации нового приложения OAuth2 ссылка обратного перенаправления должна быть:
self_check.database_fix_mssql = В настоящий момент пользователи MSSQL могут исправить проблемы с сопоставлением только ручным прописыванием "ALTER ... COLLATE ..." в SQL.
self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут исправить проблемы с сопоставлением командой "gitea doctor convert". Также можно вручную вписать "ALTER ... COLLATE ..." в SQL.
+dashboard.cleanup_actions = Очистить устаревшие журналы и артефакты Действий
+dashboard.sync_repo_branches = Синхронизировать ветки из git в базу данных
+assets = Кодовые объекты
+dashboard.sync_tag.started = Начата синхронизация тегов
+settings = Админ. настройки
+self_check.database_collation_case_insensitive = БД использует нечувствительное сопоставление %s. Хоть Forgejo и будет работать, могут возникать случаи с неожиданным поведением.
+self_check.database_inconsistent_collation_columns = БД использует сопоставление %s, но эти столбцы используют перемешанные сопоставления. Это может вызывать неожиданные проблемы.
+dashboard.sync_branch.started = Начата синхронизация веток
+dashboard.sync_repo_tags = Синхронизировать теги из git в базу данных
+self_check.database_collation_mismatch = Ожидается, что БД использует сопоставление: %s
+self_check = Самопроверка
[action]
create_repo=создал(а) репозиторий %s
@@ -3347,13 +3363,13 @@ no_subscriptions=Нет подписок
[gpg]
default_key=Подписано ключом по умолчанию
error.extract_sign=Не удалось извлечь подпись
-error.generate_hash=Не удается создать хэш коммита
+error.generate_hash=Не удалось создать хэш коммита
error.no_committer_account=Учётная запись с эл. почтой этого коммитера не найдена
-error.no_gpg_keys_found="Не найден ключ, соответствующий данной подписи"
-error.not_signed_commit="Неподписанный коммит"
-error.failed_retrieval_gpg_keys="Не удалось получить ни одного ключа GPG автора коммита"
-error.probable_bad_signature="ВНИМАНИЕ! Хоть в базе данных есть ключ с этим идентификатором, он не заверяет этот коммит! Этот коммит ПОДОЗРИТЕЛЬНЫЙ."
-error.probable_bad_default_signature="ВНИМАНИЕ! Хоть ключ по умолчанию имеет этот идентификатор, он не заверяет этот коммит! Этот коммит ПОДОЗРИТЕЛЬНЫЙ."
+error.no_gpg_keys_found=Не найден ключ, соответствующий данной подписи
+error.not_signed_commit=Неподписанный коммит
+error.failed_retrieval_gpg_keys=Не удалось получить ни одного ключа GPG автора коммита
+error.probable_bad_signature=ВНИМАНИЕ! Хоть в базе данных есть ключ с этим идентификатором, он не заверяет этот коммит! Этот коммит ПОДОЗРИТЕЛЬНЫЙ.
+error.probable_bad_default_signature=ВНИМАНИЕ! Хоть ключ по умолчанию имеет этот идентификатор, он не заверяет этот коммит! Этот коммит ПОДОЗРИТЕЛЬНЫЙ.
[units]
unit=Элемент
@@ -3505,10 +3521,11 @@ owner.settings.cleanuprules.success.update=Правило очистки обн
owner.settings.cleanuprules.success.delete=Правило очистки удалено.
owner.settings.chef.title=Реестр Chef
owner.settings.chef.keypair=Создать пару ключей
-owner.settings.cleanuprules.none = Нет доступных правил очистки. Ознакомьтесь с документацией.
+owner.settings.cleanuprules.none = Правил очистки пока нет.
owner.settings.cargo.rebuild.description = Пересборка может быть полезной в случае, если индекс не синхронизирован с сохранёнными пакетами Cargo.
rpm.repository = О репозитории
rpm.repository.architectures = Архитектуры
+rpm.repository.multiple_groups = Этот пакет доступен в нескольких группах.
[secrets]
secrets=Секреты
diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini
index 5fc59990bb..e7df961707 100644
--- a/options/locale/locale_sl.ini
+++ b/options/locale/locale_sl.ini
@@ -114,6 +114,10 @@ milestones = Mejniki
ok = OK
copy_branch = Kopiranje imena veje
artifacts = Artefakti
+signed_in_as = Prijavil se je kot
+remove = Odstrani
+remove_all = Odstrani vse
+remove_label_str = Odstranite element "%s"
[install]
reinstall_confirm_check_3 = Potrjujete, da ste popolnoma prepričani, da se ta program Forgejo izvaja s pravilno lokacijo app.ini, in da ste prepričani, da ga morate znova namestiti. Potrjujete, da se zavedate zgoraj navedenih tveganj.
@@ -340,6 +344,32 @@ use_scratch_code = Uporaba kode za izločanje
invalid_code_forgot_password = Vaša potrditvena koda je neveljavna ali je potekla. Kliknite tukaj za začetek nove seje.
reset_password_wrong_user = Prijavljeni ste kot %s, vendar je povezava za obnovitev računa namenjena %s
twofa_scratch_used = ste uporabili svojo kodo. Preusmerjeni ste bili na stran z nastavitvami dveh dejavnikov, kjer lahko odstranite vpis naprave ali ustvarite novo ničelno kodo.
+oauth_signup_tab = Registracija novega računa
+openid_signin_desc = Vnesite svoj URI OpenID. Na primer: alice.openid.example.org ali https://openid.example.org/alice.
+twofa_scratch_token_incorrect = Vaša koda je napačna.
+login_userpass = Prijavite se
+oauth_signup_title = Dokončanje novega računa
+oauth_signup_submit = Celoten račun
+oauth_signin_title = Prijavite se za avtorizacijo povezanega računa
+oauth_signin_submit = Povezava z računom
+oauth.signin.error.access_denied = Zahtevek za odobritev je bil zavrnjen.
+openid_connect_submit = Povežite
+openid_connect_title = Povezovanje z obstoječim računom
+openid_connect_desc = Izbrani URI OpenID je neznan. Tukaj ga povežite z novim računom.
+openid_register_title = Ustvari nov račun
+openid_register_desc = Izbrani URI OpenID je neznan. Tukaj ga povežite z novim računom.
+authorize_redirect_notice = Če odobrite to aplikacijo, boste preusmerjeni na %s.
+authorize_application_created_by = To aplikacijo je ustvaril %s.
+authorization_failed = Avtorizacija ni uspela
+oauth.signin.error = Pri obdelavi zahteve za avtorizacijo je prišlo do napake. Če se ta napaka nadaljuje, se obrnite na skrbnika spletnega mesta.
+oauth_signin_tab = Povezava z obstoječim računom
+oauth.signin.error.temporarily_unavailable = Avtorizacija ni uspela, ker strežnik za preverjanje pristnosti začasno ni na voljo. Poskusite znova pozneje.
+authorize_title = Pooblaščate "%s" za dostop do svojega računa?
+twofa_passcode_incorrect = Vaše geslo je napačno. Če ste napravo izgubili, se vpišite s kodo, ki jo imate na voljo.
+last_admin = Zadnjega upravitelja ne morete odstraniti. Obstajati mora vsaj en skrbnik.
+authorization_failed_desc = Avtorizacija ni uspela, ker smo zaznali neveljavno zahtevo. Obrnite se na vzdrževalca aplikacije, ki ste jo poskušali avtorizirati.
+sspi_auth_failed = Avtentikacija SSPI ni uspela
+password_pwned_err = Ni bilo mogoče dokončati zahteve za HaveIBeenPwned
[home]
show_both_archived_unarchived = Prikazovanje arhiviranih in nearhiviranih
@@ -364,3 +394,40 @@ show_private = Zasebno
show_both_private_public = Prikaz javnih in zasebnih
show_only_private = Prikaz samo zasebno
issues.in_your_repos = V vašem repozitorijev
+
+
+[mail]
+release.title = Naslov: %s
+release.downloads = Prenosi:
+activate_account.text_2 = Za aktivacijo računa v %s kliknite naslednjo povezavo:
+link_not_working_do_paste = Ne deluje? Poskusite ga kopirati in prilepiti v brskalnik.
+issue.action.reopen = @%[1]s ponovno odprl #%[2]d.
+repo.transfer.body = Če ga želite sprejeti ali zavrniti, obiščite %s ali ga preprosto prezrite.
+team_invite.text_2 = Če se želite pridružiti ekipi, kliknite naslednjo povezavo:
+view_it_on = Oglejte si ga na %s
+hi_user_x = Pozdravljeni %s,
+activate_account = Prosimo, aktivirajte svoj račun
+activate_account.title = %s, aktivirajte svoj račun
+activate_account.text_1 = Pozdravljeni %[1]s, hvala za registracijo na %[2]s!
+admin.new_user.subject = Prijavil se je nov uporabnik %s
+admin.new_user.user_info = Informacije o uporabniku
+admin.new_user.text = Prosimo, da klikni tukaj za upravljanje tega uporabnika iz upraviteljske plošče.
+register_notify = Dobrodošli v Forgejo
+register_notify.title = %[1]s, dobrodošli v %[2]s
+register_notify.text_2 = Zdaj se lahko prijavite z uporabniškim imenom: %s.
+register_notify.text_3 = Če je bil ta račun ustvarjen za vas, prosimo, da najprej nastavite svoje geslo.
+reset_password = Obnovite svoj račun
+reset_password.title = %s, zahtevali ste obnovitev računa
+register_success = Registracija je bila uspešna
+issue.x_mentioned_you = @%s vas je omenil:
+issue.action.close = @%[1]s zaprl #%[2]d.
+reset_password.text = Za obnovitev računa v %s kliknite naslednjo povezavo:
+release.note = Opomba:
+release.download.zip = Izvorna koda (ZIP)
+release.download.targz = Izvorna koda (TAR.GZ)
+repo.transfer.to_you = si
+repo.collaborator.added.subject = %s vas je dodal v %s
+team_invite.subject = %[1]s vas je povabil, da se pridružite organizaciji %[2]s
+issue.action.new = @%[1]s ustvaril #%[2]d.
+team_invite.text_1 = %[1]s vas je povabil, da se pridružite ekipi %[2]s v organizaciji %[3]s.
+team_invite.text_3 = Opomba: To vabilo je bilo namenjeno %[1]. Če tega vabila niste pričakovali, ga lahko ignorirate.
\ No newline at end of file
From c2280a20097b938315b7f00b1aa18a9f5891ef45 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Sun, 25 Feb 2024 23:44:00 +0100
Subject: [PATCH 099/807] Fix CSS linting errors
- Trivial auto-fix applied.
- Removed CSS that was no longer needed (either was removed or upstream
already improved the CSS).
- Used existing variables for colors.
- Fix CSS selectors to match existing ones.
---
web_src/css/base.css | 5 +-
...e-forgejo-dark-deuteranopia-protanopia.css | 14 +--
.../themes/theme-forgejo-dark-tritanopia.css | 14 +--
web_src/css/themes/theme-forgejo-dark.css | 116 +++++++-----------
...-forgejo-light-deuteranopia-protanopia.css | 14 +--
.../themes/theme-forgejo-light-tritanopia.css | 14 +--
web_src/css/themes/theme-forgejo-light.css | 86 +++++++------
7 files changed, 120 insertions(+), 143 deletions(-)
diff --git a/web_src/css/base.css b/web_src/css/base.css
index 2620a41a34..6f51ad57ab 100644
--- a/web_src/css/base.css
+++ b/web_src/css/base.css
@@ -98,11 +98,12 @@ progress::-moz-progress-bar {
h1.error-code {
font-size: 15em;
- font-weight: 800;
+ font-weight: var(--font-weight-bold);
color: transparent;
--error-code-color-1: #a2a2a2;
--error-code-color-2: #797979;
- background: repeating-linear-gradient(45deg, var(--error-code-color-1), var(--error-code-color-1) 10px, var(--error-code-color-2) 10px, var(--error-code-color-2) 20px);
+ --gradient: repeating-linear-gradient(45deg, var(--error-code-color-1), var(--error-code-color-1) 10px, var(--error-code-color-2) 10px, var(--error-code-color-2) 20px);
+ background: var(--gradient);
background-clip: text;
}
diff --git a/web_src/css/themes/theme-forgejo-dark-deuteranopia-protanopia.css b/web_src/css/themes/theme-forgejo-dark-deuteranopia-protanopia.css
index 95601bf12d..b30cfd6b23 100644
--- a/web_src/css/themes/theme-forgejo-dark-deuteranopia-protanopia.css
+++ b/web_src/css/themes/theme-forgejo-dark-deuteranopia-protanopia.css
@@ -1,11 +1,11 @@
@import "./theme-forgejo-dark.css";
:root {
- --color-diff-removed-word-bg: #693F17;
- --color-diff-removed-row-border: #693F17;
- --color-diff-removed-row-bg: #221B17;
- --color-diff-added-word-bg: #214D88;
- --color-diff-added-row-border: #214D88;
- --color-diff-added-row-bg: #13233A;
- --color-code-bg: #0D1117;
+ --color-diff-removed-word-bg: #693f17;
+ --color-diff-removed-row-border: #693f17;
+ --color-diff-removed-row-bg: #221b17;
+ --color-diff-added-word-bg: #214d88;
+ --color-diff-added-row-border: #214d88;
+ --color-diff-added-row-bg: #13233a;
+ --color-code-bg: #0d1117;
}
diff --git a/web_src/css/themes/theme-forgejo-dark-tritanopia.css b/web_src/css/themes/theme-forgejo-dark-tritanopia.css
index adafbee0af..aefdaa1bf7 100644
--- a/web_src/css/themes/theme-forgejo-dark-tritanopia.css
+++ b/web_src/css/themes/theme-forgejo-dark-tritanopia.css
@@ -1,11 +1,11 @@
@import "./theme-forgejo-dark.css";
:root {
- --color-diff-removed-word-bg: #792E2E;
- --color-diff-removed-row-border: #792E2E;
- --color-diff-removed-row-bg: #25171C;
- --color-diff-added-word-bg: #214D88;
- --color-diff-added-row-border: #214D88;
- --color-diff-added-row-bg: #13233A;
- --color-code-bg: #0D1117;
+ --color-diff-removed-word-bg: #792e2e;
+ --color-diff-removed-row-border: #792e2e;
+ --color-diff-removed-row-bg: #25171c;
+ --color-diff-added-word-bg: #214d88;
+ --color-diff-added-row-border: #214d88;
+ --color-diff-added-row-bg: #13233a;
+ --color-code-bg: #0d1117;
}
diff --git a/web_src/css/themes/theme-forgejo-dark.css b/web_src/css/themes/theme-forgejo-dark.css
index d09e9e3a63..f27db7ac3b 100644
--- a/web_src/css/themes/theme-forgejo-dark.css
+++ b/web_src/css/themes/theme-forgejo-dark.css
@@ -1,23 +1,23 @@
@import "../chroma/dark.css";
@import "../codemirror/dark.css";
:root {
- --steel-900: #10161D;
- --steel-850: #131A21;
- --steel-800: #171E26;
- --steel-750: #1D262F;
- --steel-700: #242D38;
- --steel-650: #2B3642;
+ --steel-900: #10161d;
+ --steel-850: #131a21;
+ --steel-800: #171e26;
+ --steel-750: #1d262f;
+ --steel-700: #242d38;
+ --steel-650: #2b3642;
--steel-600: #374351;
--steel-550: #445161;
- --steel-500: #515F70;
- --steel-450: #5F6E80;
- --steel-400: #6D7D8F;
- --steel-350: #7C8C9F;
- --steel-300: #8C9CAF;
- --steel-250: #9DADC0;
- --steel-200: #AEBED0;
- --steel-150: #C0CFE0;
- --steel-100: #D2E0F0;
+ --steel-500: #515f70;
+ --steel-450: #5f6e80;
+ --steel-400: #6d7d8f;
+ --steel-350: #7c8c9f;
+ --steel-300: #8c9caf;
+ --steel-250: #9dadc0;
+ --steel-200: #aebed0;
+ --steel-150: #c0cfe0;
+ --steel-100: #d2e0f0;
--is-dark-theme: true;
--color-primary: #fb923c;
--color-primary-contrast: #000;
@@ -64,18 +64,18 @@
--color-secondary-light-2: var(--steel-700);
--color-secondary-light-3: var(--steel-750);
--color-secondary-light-4: var(--steel-800);
- --color-secondary-alpha-10: #2B364219;
- --color-secondary-alpha-20: #2B364233;
- --color-secondary-alpha-30: #2B36424b;
- --color-secondary-alpha-40: #2B364266;
- --color-secondary-alpha-50: #2B364280;
- --color-secondary-alpha-60: #2B364299;
- --color-secondary-alpha-70: #2B3642b3;
- --color-secondary-alpha-80: #2B3642cc;
- --color-secondary-alpha-90: #2B3642e1;
+ --color-secondary-alpha-10: #2b364219;
+ --color-secondary-alpha-20: #2b364233;
+ --color-secondary-alpha-30: #2b36424b;
+ --color-secondary-alpha-40: #2b364266;
+ --color-secondary-alpha-50: #2b364280;
+ --color-secondary-alpha-60: #2b364299;
+ --color-secondary-alpha-70: #2b3642b3;
+ --color-secondary-alpha-80: #2b3642cc;
+ --color-secondary-alpha-90: #2b3642e1;
--color-secondary-hover: var(--color-secondary-light-1);
--color-secondary-active: var(--color-secondary-light-2);
- /* console colors - used for actions console and console files */
+ /* console colors - used for actions console and console files */
--color-console-fg: #eeeff2;
--color-console-fg-subtle: #959cab;
--color-console-bg: #1f212b;
@@ -125,7 +125,7 @@
--color-pink-dark-1: #c7216b;
--color-brown-dark-1: #94674a;
--color-black-dark-1: #0f1623;
- /* dark 2 variants produced via Sass scale-color(color, $lightness: -20%) */
+ /* dark 2 variants produced via Sass scale-color(color, $lightness: -20%) */
--color-red-dark-2: #941616;
--color-orange-dark-2: #bb460a;
--color-yellow-dark-2: #ca8a04;
@@ -142,31 +142,31 @@
--color-gold: #b1983b;
--color-white: #ffffff;
--color-diff-removed-word-bg: #783030;
- --color-diff-added-word-bg: #255C39;
+ --color-diff-added-word-bg: #255c39;
--color-diff-removed-row-bg: #432121;
--color-diff-moved-row-bg: #825718;
- --color-diff-added-row-bg: #1B3625;
+ --color-diff-added-row-bg: #1b3625;
--color-diff-removed-row-border: #783030;
- --color-diff-moved-row-border: #A67A1D;
- --color-diff-added-row-border: #255C39;
+ --color-diff-moved-row-border: #a67a1d;
+ --color-diff-added-row-border: #255c39;
--color-diff-inactive: var(--steel-650);
--color-error-border: #783030;
- --color-error-bg: #5F2525;
+ --color-error-bg: #5f2525;
--color-error-bg-active: #783030;
--color-error-bg-hover: #783030;
--color-error-text: #fef2f2;
- --color-success-border: #1F6E3C;
- --color-success-bg: #1D462C;
+ --color-success-border: #1f6e3c;
+ --color-success-bg: #1d462c;
--color-success-text: #f0fdf4;
- --color-warning-border: #A67A1D;
+ --color-warning-border: #a67a1d;
--color-warning-bg: #644821;
--color-warning-text: #fefce8;
- --color-info-border: #2E50B0;
- --color-info-bg: #2A396B;
+ --color-info-border: #2e50b0;
+ --color-info-bg: #2a396b;
--color-info-text: var(--steel-100);
- --color-red-badge: #B91C1C;
- --color-red-badge-bg: #B91C1C22;
- --color-red-badge-hover-bg: #B91C1C44;
+ --color-red-badge: #b91c1c;
+ --color-red-badge-bg: #b91c1c22;
+ --color-red-badge-hover-bg: #b91c1c44;
--color-green-badge: #16a34a;
--color-green-badge-bg: #16a34a22;
--color-green-badge-hover-bg: #16a34a44;
@@ -196,7 +196,7 @@
--color-input-border: var(--steel-550);
--color-input-border-hover: var(--steel-450);
--color-header-wrapper: var(--steel-850);
- --color-header-wrapper-transparent: #242D3800;
+ --color-header-wrapper-transparent: #242d3800;
--color-light: #00000028;
--color-light-mimic-enabled: rgba(0, 0, 0, calc(40 / 255 * 222 / 255 / var(--opacity-disabled)));
--color-light-border: #ffffff28;
@@ -259,27 +259,12 @@
.emoji[aria-label="musical notes"] {
filter: invert(100%) hue-rotate(180deg);
}
-.following.bar.light {
- border-bottom-color: #ffffff11 !important;
-}
.text.green.svg {
- color: #16a34a !important;
+ color: var(--color-green-light) !important;
}
i.grey.icon.icon.icon.icon {
color: var(--steel-350) !important;
}
-.ui.red.button,
-.ui.negative.button {
- background-color: #7f1d1d;
-}
-.ui.red.button:hover,
-.ui.negative.button:hover {
- background-color: #991b1b;
-}
-.ui.red.button:active,
-.ui.negative.button:active {
- background-color: #aa1919;
-}
.ui.secondary.vertical.menu {
border-radius: 0.28571429rem !important;
overflow: hidden;
@@ -304,28 +289,21 @@ i.grey.icon.icon.icon.icon {
}
.ui.labeled.icon.buttons > .button > .icon,
.ui.labeled.icon.button > .icon {
- background-color: rgba(0, 0, 0, 0.05) !important;
+ background-color: var(--color-light) !important;
}
#review-box .review-comments-counter {
- background-color: #00000088 !important;
- color: #fff !important;
+ background-color: var(--color-shadow) !important;
+ color: var(--color-white) !important;
margin-left: 0.5em;
}
-.ui.tabs .ui.primary.label,
-.ui.menu .ui.primary.label {
- background-color: rgba(192, 192, 255, 0.2) !important;
+.ui.basic.labels .primary.label,
+.ui.ui.ui.basic.primary.label {
color: var(--color-text-dark) !important;
}
.ui.basic.yellow.label.pending-label {
background: var(--color-light) !important;
}
-.ui.tertiary.button {
- color: #fff9;
-}
-.ui.tertiary.button:hover {
- color: #ccc;
-}
::selection {
background: var(--steel-100) !important;
- color: #000 !important;
+ color: var(--color-white) !important;
}
diff --git a/web_src/css/themes/theme-forgejo-light-deuteranopia-protanopia.css b/web_src/css/themes/theme-forgejo-light-deuteranopia-protanopia.css
index 918a143ad7..eb48b7598d 100644
--- a/web_src/css/themes/theme-forgejo-light-deuteranopia-protanopia.css
+++ b/web_src/css/themes/theme-forgejo-light-deuteranopia-protanopia.css
@@ -1,11 +1,11 @@
@import "./theme-forgejo-light.css";
:root {
- --color-diff-removed-word-bg: #FFDBB0;
- --color-diff-removed-row-border: #FFDBB0;
- --color-diff-removed-row-bg: #FFFAF3;
- --color-diff-added-word-bg: #B1DBFF;
- --color-diff-added-row-border: #B1DBFF;
- --color-diff-added-row-bg: #EEF9FF;
- --color-code-bg: #FFFFFF;
+ --color-diff-removed-word-bg: #ffdbb0;
+ --color-diff-removed-row-border: #ffdbb0;
+ --color-diff-removed-row-bg: #fffaf3;
+ --color-diff-added-word-bg: #b1dbff;
+ --color-diff-added-row-border: #b1dbff;
+ --color-diff-added-row-bg: #eef9ff;
+ --color-code-bg: #ffffff;
}
diff --git a/web_src/css/themes/theme-forgejo-light-tritanopia.css b/web_src/css/themes/theme-forgejo-light-tritanopia.css
index 3bf7694a06..208da5597f 100644
--- a/web_src/css/themes/theme-forgejo-light-tritanopia.css
+++ b/web_src/css/themes/theme-forgejo-light-tritanopia.css
@@ -1,11 +1,11 @@
@import "./theme-forgejo-light.css";
:root {
- --color-diff-removed-word-bg: #FFD0CE;
- --color-diff-removed-row-border: #FFD0CE;
- --color-diff-removed-row-bg: #FFF5F4;
- --color-diff-added-word-bg: #B1DBFF;
- --color-diff-added-row-border: #EEF9FF;
- --color-diff-added-row-bg: #EEF9FF;
- --color-code-bg: #FFFFFF;
+ --color-diff-removed-word-bg: #ffd0ce;
+ --color-diff-removed-row-border: #ffd0ce;
+ --color-diff-removed-row-bg: #fff5f4;
+ --color-diff-added-word-bg: #b1dbff;
+ --color-diff-added-row-border: #eef9ff;
+ --color-diff-added-row-bg: #eef9ff;
+ --color-code-bg: #ffffff;
}
diff --git a/web_src/css/themes/theme-forgejo-light.css b/web_src/css/themes/theme-forgejo-light.css
index 4182e9d719..e26ba2552c 100644
--- a/web_src/css/themes/theme-forgejo-light.css
+++ b/web_src/css/themes/theme-forgejo-light.css
@@ -2,41 +2,41 @@
@import "../codemirror/light.css";
:root {
- --steel-900: #10161D;
- --steel-850: #131A21;
- --steel-800: #171E26;
- --steel-750: #1D262F;
- --steel-700: #242D38;
- --steel-650: #2B3642;
+ --steel-900: #10161d;
+ --steel-850: #131a21;
+ --steel-800: #171e26;
+ --steel-750: #1d262f;
+ --steel-700: #242d38;
+ --steel-650: #2b3642;
--steel-600: #374351;
--steel-550: #445161;
- --steel-500: #515F70;
- --steel-450: #5F6E80;
- --steel-400: #6D7D8F;
- --steel-350: #7C8C9F;
- --steel-300: #8C9CAF;
- --steel-250: #9DADC0;
- --steel-200: #AEBED0;
- --steel-150: #C0CFE0;
- --steel-100: #D2E0F0;
- --zinc-50: #FAFAFA;
- --zinc-100: #F4F4F5;
- --zinc-150: #ECECEE;
- --zinc-200: #E4E4E7;
- --zinc-250: #DCDCE0;
- --zinc-300: #D4D4D8;
- --zinc-350: #BABAC1;
- --zinc-400: #A1A1AA;
+ --steel-500: #515f70;
+ --steel-450: #5f6e80;
+ --steel-400: #6d7d8f;
+ --steel-350: #7c8c9f;
+ --steel-300: #8c9caf;
+ --steel-250: #9dadc0;
+ --steel-200: #aebed0;
+ --steel-150: #c0cfe0;
+ --steel-100: #d2e0f0;
+ --zinc-50: #fafafa;
+ --zinc-100: #f4f4f5;
+ --zinc-150: #ececee;
+ --zinc-200: #e4e4e7;
+ --zinc-250: #dcdce0;
+ --zinc-300: #d4d4d8;
+ --zinc-350: #babac1;
+ --zinc-400: #a1a1aa;
--zinc-450: #898992;
- --zinc-500: #71717A;
- --zinc-550: #61616A;
- --zinc-600: #52525B;
+ --zinc-500: #71717a;
+ --zinc-550: #61616a;
+ --zinc-600: #52525b;
--zinc-650: #484850;
- --zinc-700: #3F3F46;
+ --zinc-700: #3f3f46;
--zinc-750: #333338;
- --zinc-800: #27272A;
- --zinc-850: #1F1F23;
- --zinc-900: #18181B;
+ --zinc-800: #27272a;
+ --zinc-850: #1f1f23;
+ --zinc-900: #18181b;
--color-primary: #c2410c;
--color-primary-contrast: #ffffff;
--color-primary-dark-1: #c2410c;
@@ -93,7 +93,7 @@
--color-secondary-alpha-90: #d4d4d8e1;
--color-secondary-hover: var(--color-secondary-dark-2);
--color-secondary-active: var(--color-secondary-dark-4);
- /* console colors - used for actions console and console files */
+ /* console colors - used for actions console and console files */
--color-console-fg: #eeeff2;
--color-console-fg-subtle: #959cab;
--color-console-bg: #1f212b;
@@ -182,9 +182,9 @@
--color-info-border: #bae6fd;
--color-info-bg: #e0f2fe;
--color-info-text: #0c4a6e;
- --color-red-badge: #B91C1C;
- --color-red-badge-bg: #B91C1C22;
- --color-red-badge-hover-bg: #B91C1C44;
+ --color-red-badge: #b91c1c;
+ --color-red-badge-bg: #b91c1c22;
+ --color-red-badge-hover-bg: #b91c1c44;
--color-green-badge: #16a34a;
--color-green-badge-bg: #16a34a22;
--color-green-badge-hover-bg: #16a34a44;
@@ -214,7 +214,7 @@
--color-input-border: var(--zinc-300);
--color-input-border-hover: var(--zinc-400);
--color-header-wrapper: var(--zinc-50);
- --color-header-wrapper-transparent: #D2E0F000;
+ --color-header-wrapper-transparent: #d2e0f000;
--color-light: #ffffffcc;
--color-light-mimic-enabled: rgba(0, 0, 0, calc(6 / 255 * 222 / 255 / var(--opacity-disabled)));
--color-light-border: #0000001d;
@@ -254,7 +254,7 @@
color-scheme: light;
}
.text.green.svg {
- color: #16a34a !important;
+ color: var(--color-green-light) !important;
}
.ui.secondary.vertical.menu {
border-radius: 0.28571429rem !important;
@@ -279,24 +279,22 @@
}
.ui.labeled.icon.buttons > .button > .icon,
.ui.labeled.icon.button > .icon {
- background-color: rgba(0, 0, 0, 0.05) !important;
+ background-color: var(--color-shadow) !important;
}
#review-box .review-comments-counter {
- background-color: #ffffffaa !important;
- color: #000 !important;
+ background-color: var(--color-label-bg) !important;
margin-left: 0.5em;
}
-.ui.tabs .ui.primary.label,
-.ui.menu .ui.primary.label {
- background-color: rgba(0, 0, 0, 0.15) !important;
+.ui.basic.labels .primary.label,
+.ui.ui.ui.basic.primary.label {
color: var(--color-text-dark) !important;
}
.ui.basic.yellow.label.pending-label {
background: var(--color-warning-bg) !important;
color: var(--color-warning-text) !important;
- border-color: #eab308 !important;
+ border-color: var(--color-yellow-light) !important;
}
::selection {
background: var(--steel-450) !important;
- color: #fff !important;
+ color: var(--color-white) !important;
}
From feb189554e758ed27d1e309e5ec309d663e8f338 Mon Sep 17 00:00:00 2001
From: qwerty287 <80460567+qwerty287@users.noreply.github.com>
Date: Mon, 26 Feb 2024 03:39:01 +0100
Subject: [PATCH 100/807] Add API to get PR by base/head (#29242)
Closes https://github.com/go-gitea/gitea/issues/16289
Add a new API `/repos/{owner}/{repo}/pulls/{base}/{head}` to get a PR by
its base and head branch.
---
models/issues/pull.go | 29 ++++++++++
routers/api/v1/api.go | 1 +
routers/api/v1/repo/pull.go | 85 ++++++++++++++++++++++++++++++
templates/swagger/v1_json.tmpl | 50 ++++++++++++++++++
tests/integration/api_pull_test.go | 21 ++++++++
5 files changed, 186 insertions(+)
diff --git a/models/issues/pull.go b/models/issues/pull.go
index 2cb1e1b971..ce2fd9233d 100644
--- a/models/issues/pull.go
+++ b/models/issues/pull.go
@@ -652,6 +652,35 @@ func GetPullRequestByIssueID(ctx context.Context, issueID int64) (*PullRequest,
return pr, pr.LoadAttributes(ctx)
}
+// GetPullRequestsByBaseHeadInfo returns the pull request by given base and head
+func GetPullRequestByBaseHeadInfo(ctx context.Context, baseID, headID int64, base, head string) (*PullRequest, error) {
+ pr := &PullRequest{}
+ sess := db.GetEngine(ctx).
+ Join("INNER", "issue", "issue.id = pull_request.issue_id").
+ Where("base_repo_id = ? AND base_branch = ? AND head_repo_id = ? AND head_branch = ?", baseID, base, headID, head)
+ has, err := sess.Get(pr)
+ if err != nil {
+ return nil, err
+ }
+ if !has {
+ return nil, ErrPullRequestNotExist{
+ HeadRepoID: headID,
+ BaseRepoID: baseID,
+ HeadBranch: head,
+ BaseBranch: base,
+ }
+ }
+
+ if err = pr.LoadAttributes(ctx); err != nil {
+ return nil, err
+ }
+ if err = pr.LoadIssue(ctx); err != nil {
+ return nil, err
+ }
+
+ return pr, nil
+}
+
// GetAllUnmergedAgitPullRequestByPoster get all unmerged agit flow pull request
// By poster id.
func GetAllUnmergedAgitPullRequestByPoster(ctx context.Context, uid int64) ([]*PullRequest, error) {
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 38c0c01a0a..e75d4cc964 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -1289,6 +1289,7 @@ func Routes() *web.Route {
Delete(bind(api.PullReviewRequestOptions{}), repo.DeleteReviewRequests).
Post(bind(api.PullReviewRequestOptions{}), repo.CreateReviewRequests)
})
+ m.Get("/{base}/*", repo.GetPullRequestByBaseHead)
}, mustAllowPulls, reqRepoReader(unit.TypeCode), context.ReferencesGitRepo())
m.Group("/statuses", func() {
m.Combo("/{sha}").Get(repo.GetCommitStatuses).
diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go
index b1b486e017..ef9b4893fb 100644
--- a/routers/api/v1/repo/pull.go
+++ b/routers/api/v1/repo/pull.go
@@ -187,6 +187,91 @@ func GetPullRequest(ctx *context.APIContext) {
ctx.JSON(http.StatusOK, convert.ToAPIPullRequest(ctx, pr, ctx.Doer))
}
+// GetPullRequest returns a single PR based on index
+func GetPullRequestByBaseHead(ctx *context.APIContext) {
+ // swagger:operation GET /repos/{owner}/{repo}/pulls/{base}/{head} repository repoGetPullRequestByBaseHead
+ // ---
+ // summary: Get a pull request by base and head
+ // produces:
+ // - application/json
+ // parameters:
+ // - name: owner
+ // in: path
+ // description: owner of the repo
+ // type: string
+ // required: true
+ // - name: repo
+ // in: path
+ // description: name of the repo
+ // type: string
+ // required: true
+ // - name: base
+ // in: path
+ // description: base of the pull request to get
+ // type: string
+ // required: true
+ // - name: head
+ // in: path
+ // description: head of the pull request to get
+ // type: string
+ // required: true
+ // responses:
+ // "200":
+ // "$ref": "#/responses/PullRequest"
+ // "404":
+ // "$ref": "#/responses/notFound"
+
+ var headRepoID int64
+ var headBranch string
+ head := ctx.Params("*")
+ if strings.Contains(head, ":") {
+ split := strings.SplitN(head, ":", 2)
+ headBranch = split[1]
+ var owner, name string
+ if strings.Contains(split[0], "/") {
+ split = strings.Split(split[0], "/")
+ owner = split[0]
+ name = split[1]
+ } else {
+ owner = split[0]
+ name = ctx.Repo.Repository.Name
+ }
+ repo, err := repo_model.GetRepositoryByOwnerAndName(ctx, owner, name)
+ if err != nil {
+ if repo_model.IsErrRepoNotExist(err) {
+ ctx.NotFound()
+ } else {
+ ctx.Error(http.StatusInternalServerError, "GetRepositoryByOwnerName", err)
+ }
+ return
+ }
+ headRepoID = repo.ID
+ } else {
+ headRepoID = ctx.Repo.Repository.ID
+ headBranch = head
+ }
+
+ pr, err := issues_model.GetPullRequestByBaseHeadInfo(ctx, ctx.Repo.Repository.ID, headRepoID, ctx.Params(":base"), headBranch)
+ if err != nil {
+ if issues_model.IsErrPullRequestNotExist(err) {
+ ctx.NotFound()
+ } else {
+ ctx.Error(http.StatusInternalServerError, "GetPullRequestByBaseHeadInfo", err)
+ }
+ return
+ }
+
+ if err = pr.LoadBaseRepo(ctx); err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadBaseRepo", err)
+ return
+ }
+ if err = pr.LoadHeadRepo(ctx); err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadHeadRepo", err)
+ return
+ }
+ ctx.JSON(http.StatusOK, convert.ToAPIPullRequest(ctx, pr, ctx.Doer))
+}
+
// DownloadPullDiffOrPatch render a pull's raw diff or patch
func DownloadPullDiffOrPatch(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/pulls/{index}.{diffType} repository repoDownloadPullDiffOrPatch
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 18ab544415..973759604b 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -10769,6 +10769,56 @@
}
}
},
+ "/repos/{owner}/{repo}/pulls/{base}/{head}": {
+ "get": {
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "repository"
+ ],
+ "summary": "Get a pull request by base and head",
+ "operationId": "repoGetPullRequestByBaseHead",
+ "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": "string",
+ "description": "base of the pull request to get",
+ "name": "base",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "string",
+ "description": "head of the pull request to get",
+ "name": "head",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/responses/PullRequest"
+ },
+ "404": {
+ "$ref": "#/responses/notFound"
+ }
+ }
+ }
+ },
"/repos/{owner}/{repo}/pulls/{index}": {
"get": {
"produces": [
diff --git a/tests/integration/api_pull_test.go b/tests/integration/api_pull_test.go
index f4640521ca..d49711c5c3 100644
--- a/tests/integration/api_pull_test.go
+++ b/tests/integration/api_pull_test.go
@@ -61,6 +61,27 @@ func TestAPIViewPulls(t *testing.T) {
}
}
+func TestAPIViewPullsByBaseHead(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+ owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
+
+ ctx := NewAPITestContext(t, "user2", repo.Name, auth_model.AccessTokenScopeReadRepository)
+
+ req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/pulls/master/branch2", owner.Name, repo.Name).
+ AddTokenAuth(ctx.Token)
+ resp := ctx.Session.MakeRequest(t, req, http.StatusOK)
+
+ pull := &api.PullRequest{}
+ DecodeJSON(t, resp, pull)
+ assert.EqualValues(t, 3, pull.Index)
+ assert.EqualValues(t, 2, pull.ID)
+
+ req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/pulls/master/branch-not-exist", owner.Name, repo.Name).
+ AddTokenAuth(ctx.Token)
+ ctx.Session.MakeRequest(t, req, http.StatusNotFound)
+}
+
// TestAPIMergePullWIP ensures that we can't merge a WIP pull request
func TestAPIMergePullWIP(t *testing.T) {
defer tests.PrepareTestEnv(t)()
From 02eab930c9f7b481a62f3232f6e5b154a6a922f8 Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Sun, 25 Feb 2024 22:20:23 +0100
Subject: [PATCH 101/807] routers/web: Drop an unused branch from repo.Action
The "desc" action has not been used since at least 2016, probably much
earlier. It's an ancient Gogs artifact - drop it.
Signed-off-by: Gergely Nagy
---
routers/web/repo/repo.go | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/routers/web/repo/repo.go b/routers/web/repo/repo.go
index bede21be17..c6f4304cce 100644
--- a/routers/web/repo/repo.go
+++ b/routers/web/repo/repo.go
@@ -323,15 +323,6 @@ func Action(ctx *context.Context) {
err = acceptOrRejectRepoTransfer(ctx, true)
case "reject_transfer":
err = acceptOrRejectRepoTransfer(ctx, false)
- case "desc": // FIXME: this is not used
- if !ctx.Repo.IsOwner() {
- ctx.Error(http.StatusNotFound)
- return
- }
-
- ctx.Repo.Repository.Description = ctx.FormString("desc")
- ctx.Repo.Repository.Website = ctx.FormString("site")
- err = repo_service.UpdateRepository(ctx, ctx.Repo.Repository, false)
}
if err != nil {
From 38e30f2a8f047cb11594b393d9fab8644c6735ea Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Sun, 25 Feb 2024 22:45:57 +0100
Subject: [PATCH 102/807] Refactor routers/web/repo.Action
Split up `repo.Action` in `routers/web` into smaller functions.
While some of the functionality was very similar (starring / watching),
they are ultimately separate actions. Rather than collecting all of them
under a single handler (`repo.Action`), split them up into smaller,
independent functions.
This does result in a little bit of code duplication, but the
independent functions should be easier to follow and understand.
Signed-off-by: Gergely Nagy
---
routers/web/repo/repo.go | 85 ++++++++++++++++++++++------------------
routers/web/web.go | 9 ++++-
2 files changed, 55 insertions(+), 39 deletions(-)
diff --git a/routers/web/repo/repo.go b/routers/web/repo/repo.go
index c6f4304cce..88c73f65f0 100644
--- a/routers/web/repo/repo.go
+++ b/routers/web/repo/repo.go
@@ -307,56 +307,65 @@ const (
tplStarUnstar base.TplName = "repo/star_unstar"
)
-// Action response for actions to a repository
-func Action(ctx *context.Context) {
- var err error
- switch ctx.Params(":action") {
- case "watch":
- err = repo_model.WatchRepo(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID, true)
- case "unwatch":
- err = repo_model.WatchRepo(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID, false)
- case "star":
- err = repo_model.StarRepo(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID, true)
- case "unstar":
- err = repo_model.StarRepo(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID, false)
- case "accept_transfer":
- err = acceptOrRejectRepoTransfer(ctx, true)
- case "reject_transfer":
- err = acceptOrRejectRepoTransfer(ctx, false)
- }
+func ActionWatch(watch bool) func(ctx *context.Context) {
+ return func(ctx *context.Context) {
+ err := repo_model.WatchRepo(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID, watch)
+ if err != nil {
+ ctx.ServerError(fmt.Sprintf("Action (watch, %t)", watch), err)
+ return
+ }
- if err != nil {
- ctx.ServerError(fmt.Sprintf("Action (%s)", ctx.Params(":action")), err)
- return
- }
-
- switch ctx.Params(":action") {
- case "watch", "unwatch":
ctx.Data["IsWatchingRepo"] = repo_model.IsWatching(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID)
- case "star", "unstar":
- ctx.Data["IsStaringRepo"] = repo_model.IsStaring(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID)
- }
- switch ctx.Params(":action") {
- case "watch", "unwatch", "star", "unstar":
// we have to reload the repository because NumStars or NumWatching (used in the templates) has just changed
ctx.Data["Repository"], err = repo_model.GetRepositoryByName(ctx, ctx.Repo.Repository.OwnerID, ctx.Repo.Repository.Name)
if err != nil {
- ctx.ServerError(fmt.Sprintf("Action (%s)", ctx.Params(":action")), err)
+ ctx.ServerError(fmt.Sprintf("Action (watch, %t)", watch), err)
return
}
- }
- switch ctx.Params(":action") {
- case "watch", "unwatch":
ctx.HTML(http.StatusOK, tplWatchUnwatch)
- return
- case "star", "unstar":
- ctx.HTML(http.StatusOK, tplStarUnstar)
- return
}
+}
- ctx.RedirectToFirst(ctx.FormString("redirect_to"), ctx.Repo.RepoLink)
+func ActionStar(star bool) func(ctx *context.Context) {
+ return func(ctx *context.Context) {
+ err := repo_model.StarRepo(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID, star)
+ if err != nil {
+ ctx.ServerError(fmt.Sprintf("Action (star, %t)", star), err)
+ return
+ }
+
+ ctx.Data["IsStaringRepo"] = repo_model.IsStaring(ctx, ctx.Doer.ID, ctx.Repo.Repository.ID)
+
+ // we have to reload the repository because NumStars or NumWatching (used in the templates) has just changed
+ ctx.Data["Repository"], err = repo_model.GetRepositoryByName(ctx, ctx.Repo.Repository.OwnerID, ctx.Repo.Repository.Name)
+ if err != nil {
+ ctx.ServerError(fmt.Sprintf("Action (star, %t)", star), err)
+ return
+ }
+
+ ctx.HTML(http.StatusOK, tplStarUnstar)
+ }
+}
+
+func ActionTransfer(accept bool) func(ctx *context.Context) {
+ return func(ctx *context.Context) {
+ var action string
+ if accept {
+ action = "accept_transfer"
+ } else {
+ action = "reject_transfer"
+ }
+
+ err := acceptOrRejectRepoTransfer(ctx, accept)
+ if err != nil {
+ ctx.ServerError(fmt.Sprintf("Action (%s)", action), err)
+ return
+ }
+
+ ctx.RedirectToFirst(ctx.FormString("redirect_to"), ctx.Repo.RepoLink)
+ }
}
func acceptOrRejectRepoTransfer(ctx *context.Context, accept bool) error {
diff --git a/routers/web/web.go b/routers/web/web.go
index 602a233c92..38cf5e92bc 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -1124,7 +1124,14 @@ func registerRoutes(m *web.Route) {
}, ctxDataSet("PageIsRepoSettings", true, "LFSStartServer", setting.LFS.StartServer))
}, reqSignIn, context.RepoAssignment, context.UnitTypes(), reqRepoAdmin, context.RepoRef())
- m.Post("/{username}/{reponame}/action/{action}", reqSignIn, context.RepoAssignment, context.UnitTypes(), repo.Action)
+ m.Group("/{username}/{reponame}/action", func() {
+ m.Post("/watch", repo.ActionWatch(true))
+ m.Post("/unwatch", repo.ActionWatch(false))
+ m.Post("/accept_transfer", repo.ActionTransfer(true))
+ m.Post("/reject_transfer", repo.ActionTransfer(false))
+ m.Post("/star", repo.ActionStar(true))
+ m.Post("/unstar", repo.ActionStar(false))
+ }, reqSignIn, context.RepoAssignment, context.UnitTypes())
// Grouping for those endpoints not requiring authentication (but should respect ignSignIn)
m.Group("/{username}/{reponame}", func() {
From 7e6fe41389cd04a1e4c5688560a9c67ccbdf5d67 Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Mon, 26 Feb 2024 09:14:11 +0100
Subject: [PATCH 103/807] Add tests for the star/unstar & watch/unwatch UI
Signed-off-by: Gergely Nagy
---
tests/integration/repo_starwatch_test.go | 82 ++++++++++++++++++++++++
1 file changed, 82 insertions(+)
create mode 100644 tests/integration/repo_starwatch_test.go
diff --git a/tests/integration/repo_starwatch_test.go b/tests/integration/repo_starwatch_test.go
new file mode 100644
index 0000000000..4b4f967720
--- /dev/null
+++ b/tests/integration/repo_starwatch_test.go
@@ -0,0 +1,82 @@
+// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package integration
+
+import (
+ "fmt"
+ "net/http"
+ "strings"
+ "testing"
+
+ "code.gitea.io/gitea/tests"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func testRepoStarringOrWatching(t *testing.T, action, listURI string) {
+ t.Helper()
+
+ defer tests.PrepareTestEnv(t)()
+
+ oppositeAction := "un" + action
+ session := loginUser(t, "user5")
+
+ // Star/Watch the repo as user5
+ req := NewRequestWithValues(t, "POST", fmt.Sprintf("/user2/repo1/action/%s", action), map[string]string{
+ "_csrf": GetCSRF(t, session, "/user2/repo1"),
+ })
+ session.MakeRequest(t, req, http.StatusOK)
+
+ // Load the repo home as user5
+ req = NewRequest(t, "GET", "/user2/repo1")
+ resp := session.MakeRequest(t, req, http.StatusOK)
+
+ // Verify that the star/watch button is now the opposite
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ actionButton := htmlDoc.Find(fmt.Sprintf("form[action='/user2/repo1/action/%s']", oppositeAction))
+ assert.True(t, actionButton.Length() == 1)
+ text := strings.ToLower(actionButton.Find("button span.text").Text())
+ assert.Equal(t, oppositeAction, text)
+
+ // Load stargazers/watchers as user5
+ req = NewRequestf(t, "GET", "/user2/repo1/%s", listURI)
+ resp = session.MakeRequest(t, req, http.StatusOK)
+
+ // Verify that "user5" is among the stargazers/watchers
+ htmlDoc = NewHTMLParser(t, resp.Body)
+ htmlDoc.AssertElement(t, ".user-cards .list .item.ui.segment > a[href='/user5']", true)
+
+ // Unstar/unwatch the repo as user5
+ req = NewRequestWithValues(t, "POST", fmt.Sprintf("/user2/repo1/action/%s", oppositeAction), map[string]string{
+ "_csrf": GetCSRF(t, session, "/user2/repo1"),
+ })
+ session.MakeRequest(t, req, http.StatusOK)
+
+ // Load the repo home as user5
+ req = NewRequest(t, "GET", "/user2/repo1")
+ resp = session.MakeRequest(t, req, http.StatusOK)
+
+ // Verify that the star/watch button is now back to its default
+ htmlDoc = NewHTMLParser(t, resp.Body)
+ actionButton = htmlDoc.Find(fmt.Sprintf("form[action='/user2/repo1/action/%s']", action))
+ assert.True(t, actionButton.Length() == 1)
+ text = strings.ToLower(actionButton.Find("button span.text").Text())
+ assert.Equal(t, action, text)
+
+ // Load stargazers/watchers as user5
+ req = NewRequestf(t, "GET", "/user2/repo1/%s", listURI)
+ resp = session.MakeRequest(t, req, http.StatusOK)
+
+ // Verify that "user5" is not among the stargazers/watchers
+ htmlDoc = NewHTMLParser(t, resp.Body)
+ htmlDoc.AssertElement(t, ".user-cards .list .item.ui.segment > a[href='/user5']", false)
+}
+
+func TestRepoStarUnstarUI(t *testing.T) {
+ testRepoStarringOrWatching(t, "star", "stars")
+}
+
+func TestRepoWatchUnwatchUI(t *testing.T) {
+ testRepoStarringOrWatching(t, "watch", "watchers")
+}
From ee39c5812028d926c650c9e8fce9c2e6364adb0a Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Mon, 26 Feb 2024 12:52:59 +0100
Subject: [PATCH 104/807] Convert linguist attribute handling to
optional.Option
Based on @KN4CK3R's work in gitea#29267. This drops the custom
`LinguistBoolAttrib` type, and uses `optional.Option` instead. I added
the `isTrue()` and `isFalse()` (function-local) helpers to make the code
easier to follow, because these names convey their goal better than
`v.ValueorDefault(false)` or `!v.ValueOrDefault(true)`.
Signed-off-by: Gergely Nagy
---
modules/git/repo_attribute.go | 21 +++++++++++
modules/git/repo_language_stats.go | 12 -------
modules/git/repo_language_stats_gogit.go | 42 +++++++++++-----------
modules/git/repo_language_stats_nogogit.go | 42 +++++++++++-----------
4 files changed, 63 insertions(+), 54 deletions(-)
diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go
index 3e09828ec5..674ae1dd75 100644
--- a/modules/git/repo_attribute.go
+++ b/modules/git/repo_attribute.go
@@ -11,6 +11,7 @@ import (
"os"
"code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/optional"
)
// CheckAttributeOpts represents the possible options to CheckAttribute
@@ -322,3 +323,23 @@ func (repo *Repository) CheckAttributeReader(commitID string) (*CheckAttributeRe
return checker, deferable
}
+
+// true if "set"/"true", false if "unset"/"false", none otherwise
+func attributeToBool(attr map[string]string, name string) optional.Option[bool] {
+ if value, has := attr[name]; has && value != "unspecified" {
+ switch value {
+ case "set", "true":
+ return optional.Some(true)
+ case "unset", "false":
+ return optional.Some(false)
+ }
+ }
+ return optional.None[bool]()
+}
+
+func attributeToString(attr map[string]string, name string) optional.Option[string] {
+ if value, has := attr[name]; has && value != "unspecified" {
+ return optional.Some(value)
+ }
+ return optional.None[string]()
+}
diff --git a/modules/git/repo_language_stats.go b/modules/git/repo_language_stats.go
index 7ed2dc1587..c40d6937b5 100644
--- a/modules/git/repo_language_stats.go
+++ b/modules/git/repo_language_stats.go
@@ -13,18 +13,6 @@ const (
bigFileSize int64 = 1024 * 1024 // 1 MiB
)
-type LinguistBoolAttrib struct {
- Value string
-}
-
-func (attrib *LinguistBoolAttrib) IsTrue() bool {
- return attrib.Value == "set" || attrib.Value == "true"
-}
-
-func (attrib *LinguistBoolAttrib) IsFalse() bool {
- return attrib.Value == "unset" || attrib.Value == "false"
-}
-
// mergeLanguageStats mergers language names with different cases. The name with most upper case letters is used.
func mergeLanguageStats(stats map[string]int64) map[string]int64 {
names := map[string]struct {
diff --git a/modules/git/repo_language_stats_gogit.go b/modules/git/repo_language_stats_gogit.go
index 558a83af74..da0b209b37 100644
--- a/modules/git/repo_language_stats_gogit.go
+++ b/modules/git/repo_language_stats_gogit.go
@@ -12,6 +12,7 @@ import (
"strings"
"code.gitea.io/gitea/modules/analyze"
+ "code.gitea.io/gitea/modules/optional"
"github.com/go-enry/go-enry/v2"
"github.com/go-git/go-git/v5"
@@ -53,31 +54,30 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
firstExcludedLanguage := ""
firstExcludedLanguageSize := int64(0)
+ isTrue := func(v optional.Option[bool]) bool {
+ return v.ValueOrDefault(false)
+ }
+ isFalse := func(v optional.Option[bool]) bool {
+ return !v.ValueOrDefault(true)
+ }
+
err = tree.Files().ForEach(func(f *object.File) error {
if f.Size == 0 {
return nil
}
- isVendored := LinguistBoolAttrib{}
- isGenerated := LinguistBoolAttrib{}
- isDocumentation := LinguistBoolAttrib{}
- isDetectable := LinguistBoolAttrib{}
+ isVendored := optional.None[bool]()
+ isGenerated := optional.None[bool]()
+ isDocumentation := optional.None[bool]()
+ isDetectable := optional.None[bool]()
if checker != nil {
attrs, err := checker.CheckPath(f.Name)
if err == nil {
- if vendored, has := attrs["linguist-vendored"]; has {
- isVendored = LinguistBoolAttrib{Value: vendored}
- }
- if generated, has := attrs["linguist-generated"]; has {
- isGenerated = LinguistBoolAttrib{Value: generated}
- }
- if documentation, has := attrs["linguist-documentation"]; has {
- isDocumentation = LinguistBoolAttrib{Value: documentation}
- }
- if detectable, has := attrs["linguist-detectable"]; has {
- isDetectable = LinguistBoolAttrib{Value: detectable}
- }
+ isVendored = attributeToBool(attrs, "linguist-vendored")
+ isGenerated = attributeToBool(attrs, "linguist-generated")
+ isDocumentation = attributeToBool(attrs, "linguist-documentation")
+ isDetectable = attributeToBool(attrs, "linguist-detectable")
if language, has := attrs["linguist-language"]; has && language != "unspecified" && language != "" {
// group languages, such as Pug -> HTML; SCSS -> CSS
group := enry.GetLanguageGroup(language)
@@ -108,11 +108,11 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
}
}
- if isDetectable.IsFalse() || isVendored.IsTrue() || isDocumentation.IsTrue() ||
- (!isVendored.IsFalse() && analyze.IsVendor(f.Name)) ||
+ if isFalse(isDetectable) || isTrue(isVendored) || isTrue(isDocumentation) ||
+ (!isFalse(isVendored) && analyze.IsVendor(f.Name)) ||
enry.IsDotFile(f.Name) ||
enry.IsConfiguration(f.Name) ||
- (!isDocumentation.IsFalse() && enry.IsDocumentation(f.Name)) {
+ (!isFalse(isDocumentation) && enry.IsDocumentation(f.Name)) {
return nil
}
@@ -121,7 +121,7 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
if f.Size <= bigFileSize {
content, _ = readFile(f, fileSizeLimit)
}
- if !isGenerated.IsTrue() && enry.IsGenerated(f.Name, content) {
+ if !isTrue(isGenerated) && enry.IsGenerated(f.Name, content) {
return nil
}
@@ -142,7 +142,7 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
langtype := enry.GetLanguageType(language)
included = langtype == enry.Programming || langtype == enry.Markup
if !included {
- if isDetectable.IsTrue() {
+ if isTrue(isDetectable) {
included = true
} else {
return nil
diff --git a/modules/git/repo_language_stats_nogogit.go b/modules/git/repo_language_stats_nogogit.go
index 13876094cc..44235c0a49 100644
--- a/modules/git/repo_language_stats_nogogit.go
+++ b/modules/git/repo_language_stats_nogogit.go
@@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/modules/analyze"
"code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/optional"
"github.com/go-enry/go-enry/v2"
)
@@ -77,6 +78,13 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
firstExcludedLanguage := ""
firstExcludedLanguageSize := int64(0)
+ isTrue := func(v optional.Option[bool]) bool {
+ return v.ValueOrDefault(false)
+ }
+ isFalse := func(v optional.Option[bool]) bool {
+ return !v.ValueOrDefault(true)
+ }
+
for _, f := range entries {
select {
case <-repo.Ctx.Done():
@@ -91,26 +99,18 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
continue
}
- isVendored := LinguistBoolAttrib{}
- isGenerated := LinguistBoolAttrib{}
- isDocumentation := LinguistBoolAttrib{}
- isDetectable := LinguistBoolAttrib{}
+ isVendored := optional.None[bool]()
+ isGenerated := optional.None[bool]()
+ isDocumentation := optional.None[bool]()
+ isDetectable := optional.None[bool]()
if checker != nil {
attrs, err := checker.CheckPath(f.Name())
if err == nil {
- if vendored, has := attrs["linguist-vendored"]; has {
- isVendored = LinguistBoolAttrib{Value: vendored}
- }
- if generated, has := attrs["linguist-generated"]; has {
- isGenerated = LinguistBoolAttrib{Value: generated}
- }
- if documentation, has := attrs["linguist-documentation"]; has {
- isDocumentation = LinguistBoolAttrib{Value: documentation}
- }
- if detectable, has := attrs["linguist-detectable"]; has {
- isDetectable = LinguistBoolAttrib{Value: detectable}
- }
+ isVendored = attributeToBool(attrs, "linguist-vendored")
+ isGenerated = attributeToBool(attrs, "linguist-generated")
+ isDocumentation = attributeToBool(attrs, "linguist-documentation")
+ isDetectable = attributeToBool(attrs, "linguist-detectable")
if language, has := attrs["linguist-language"]; has && language != "unspecified" && language != "" {
// group languages, such as Pug -> HTML; SCSS -> CSS
group := enry.GetLanguageGroup(language)
@@ -142,11 +142,11 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
}
}
- if isDetectable.IsFalse() || isVendored.IsTrue() || isDocumentation.IsTrue() ||
- (!isVendored.IsFalse() && analyze.IsVendor(f.Name())) ||
+ if isFalse(isDetectable) || isTrue(isVendored) || isTrue(isDocumentation) ||
+ (!isFalse(isVendored) && analyze.IsVendor(f.Name())) ||
enry.IsDotFile(f.Name()) ||
enry.IsConfiguration(f.Name()) ||
- (!isDocumentation.IsFalse() && enry.IsDocumentation(f.Name())) {
+ (!isFalse(isDocumentation) && enry.IsDocumentation(f.Name())) {
continue
}
@@ -179,7 +179,7 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
return nil, err
}
}
- if !isGenerated.IsTrue() && enry.IsGenerated(f.Name(), content) {
+ if !isTrue(isGenerated) && enry.IsGenerated(f.Name(), content) {
continue
}
@@ -201,7 +201,7 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
langType := enry.GetLanguageType(language)
included = langType == enry.Programming || langType == enry.Markup
if !included {
- if isDetectable.IsTrue() {
+ if isTrue(isDetectable) {
included = true
} else {
continue
From ae0635fd61b10184e5075d563050d175adf750dd Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Mon, 26 Feb 2024 14:04:09 +0100
Subject: [PATCH 105/807] Correctly support linguist-documentation=false
If a documentation file is marked with a `linguist-documentation=false`
attribute, include it in language stats.
However, make sure that we do *not* include documentation languages as
fallback.
Added a new test case to exercise the formerly buggy behaviour.
Problem discovered while reviewing @KN4CK3R's tests from gitea#29267.
Signed-off-by: Gergely Nagy
---
modules/git/repo_attribute.go | 7 -------
modules/git/repo_language_stats_gogit.go | 17 +++++++++--------
modules/git/repo_language_stats_nogogit.go | 15 +++++++--------
tests/integration/linguist_test.go | 13 +++++++++++++
4 files changed, 29 insertions(+), 23 deletions(-)
diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go
index 674ae1dd75..197d626a4d 100644
--- a/modules/git/repo_attribute.go
+++ b/modules/git/repo_attribute.go
@@ -336,10 +336,3 @@ func attributeToBool(attr map[string]string, name string) optional.Option[bool]
}
return optional.None[bool]()
}
-
-func attributeToString(attr map[string]string, name string) optional.Option[string] {
- if value, has := attr[name]; has && value != "unspecified" {
- return optional.Some(value)
- }
- return optional.None[string]()
-}
diff --git a/modules/git/repo_language_stats_gogit.go b/modules/git/repo_language_stats_gogit.go
index da0b209b37..1276ce1a44 100644
--- a/modules/git/repo_language_stats_gogit.go
+++ b/modules/git/repo_language_stats_gogit.go
@@ -138,21 +138,22 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
}
included, checked := includedLanguage[language]
+ langType := enry.GetLanguageType(language)
if !checked {
- langtype := enry.GetLanguageType(language)
- included = langtype == enry.Programming || langtype == enry.Markup
- if !included {
- if isTrue(isDetectable) {
- included = true
- } else {
- return nil
- }
+ included = langType == enry.Programming || langType == enry.Markup
+ if !included && (isTrue(isDetectable) || (langType == enry.Prose && isFalse(isDocumentation))) {
+ included = true
}
includedLanguage[language] = included
}
if included {
sizes[language] += f.Size
} else if len(sizes) == 0 && (firstExcludedLanguage == "" || firstExcludedLanguage == language) {
+ // Only consider Programming or Markup languages as fallback
+ if !(langType == enry.Programming || langType == enry.Markup) {
+ return nil
+ }
+
firstExcludedLanguage = language
firstExcludedLanguageSize += f.Size
}
diff --git a/modules/git/repo_language_stats_nogogit.go b/modules/git/repo_language_stats_nogogit.go
index 44235c0a49..b313e2298f 100644
--- a/modules/git/repo_language_stats_nogogit.go
+++ b/modules/git/repo_language_stats_nogogit.go
@@ -197,25 +197,24 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
}
included, checked := includedLanguage[language]
+ langType := enry.GetLanguageType(language)
if !checked {
- langType := enry.GetLanguageType(language)
included = langType == enry.Programming || langType == enry.Markup
- if !included {
- if isTrue(isDetectable) {
- included = true
- } else {
- continue
- }
+ if !included && (isTrue(isDetectable) || (langType == enry.Prose && isFalse(isDocumentation))) {
+ included = true
}
includedLanguage[language] = included
}
if included {
sizes[language] += f.Size()
} else if len(sizes) == 0 && (firstExcludedLanguage == "" || firstExcludedLanguage == language) {
+ // Only consider Programming or Markup languages as fallback
+ if !(langType == enry.Programming || langType == enry.Markup) {
+ continue
+ }
firstExcludedLanguage = language
firstExcludedLanguageSize += f.Size()
}
- continue
}
// If there are no included languages add the first excluded language
diff --git a/tests/integration/linguist_test.go b/tests/integration/linguist_test.go
index 12f12f5cb0..4c8ae4bdb3 100644
--- a/tests/integration/linguist_test.go
+++ b/tests/integration/linguist_test.go
@@ -251,5 +251,18 @@ func TestLinguistSupport(t *testing.T) {
assertFileLanguage(t, "/blame/branch/main/foo.c", "Bash")
})
})
+
+ // 10. Marking a file as non-documentation
+ t.Run("linguist-documentation=false", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ repo, sha, f := prep(t, "README.md linguist-documentation=false\n")
+ defer f()
+
+ langs := getFreshLanguageStats(t, repo, sha)
+ assert.Len(t, langs, 2)
+ assert.Equal(t, "Markdown", langs[0].Language)
+ assert.Equal(t, "C", langs[1].Language)
+ })
})
}
From 8018c2c7611dfe58bc3026049b6a5df5e6638ef8 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Mon, 26 Feb 2024 15:41:15 +0100
Subject: [PATCH 106/807] [TRANSLATION] Clarify description in deletion modal
- The value is now in the form `owner/repo` since #1473, so update the
label to reflect this.
- Ref: #2412
---
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 eec8782016..2b8224d7d8 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -2155,7 +2155,7 @@ settings.transfer_abort = Cancel transfer
settings.transfer_abort_invalid = You cannot cancel a non existent repository transfer.
settings.transfer_abort_success = The repository transfer to %s was successfully canceled.
settings.transfer_desc = Transfer this repository to a user or to an organization for which you have administrator rights.
-settings.enter_repo_name = Enter the repository name as confirmation:
+settings.enter_repo_name = Enter the owner and repository name exactly as shown:
settings.transfer_in_progress = There is currently an ongoing transfer. Please cancel it if you will like to transfer this repository to another user.
settings.transfer_notices_1 = - You will lose access to the repository if you transfer it to an individual user.
settings.transfer_notices_2 = - You will keep access to the repository if you transfer it to an organization that you (co-)own.
From b4360d504cfc00dff8f80c774e70e5facc0aed37 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Mon, 26 Feb 2024 16:17:11 +0100
Subject: [PATCH 107/807] [BUG] Remember topic only in repo search
- If the user is searching repositories with an specific topic, adding
any other filter option, such as showing unrelevant repositories or
using another sort Forgejo should remember that 'topic only' was set.
- Adds integration test.
- Resolves #2461
---
templates/explore/repo_search.tmpl | 1 +
tests/integration/explore_repos_test.go | 13 +++++++++++++
2 files changed, 14 insertions(+)
diff --git a/templates/explore/repo_search.tmpl b/templates/explore/repo_search.tmpl
index 573163d554..e2cf0bec39 100644
--- a/templates/explore/repo_search.tmpl
+++ b/templates/explore/repo_search.tmpl
@@ -2,6 +2,7 @@
+
{{template "shared/searchinput" dict "Value" .Keyword}}
{{if .PageIsExploreRepositories}}
diff --git a/tests/integration/explore_repos_test.go b/tests/integration/explore_repos_test.go
index 26fd1dde64..fda376b96f 100644
--- a/tests/integration/explore_repos_test.go
+++ b/tests/integration/explore_repos_test.go
@@ -8,6 +8,7 @@ import (
"testing"
"code.gitea.io/gitea/tests"
+ "github.com/stretchr/testify/assert"
)
func TestExploreRepos(t *testing.T) {
@@ -15,4 +16,16 @@ func TestExploreRepos(t *testing.T) {
req := NewRequest(t, "GET", "/explore/repos")
MakeRequest(t, req, http.StatusOK)
+
+ t.Run("Persistent parameters", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, "GET", "/explore/repos?topic=1&language=Go&sort=moststars")
+ resp := MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+
+ assert.EqualValues(t, "moststars", htmlDoc.Find("input[type='hidden'][name='sort']").AttrOr("value", "not found"))
+ assert.EqualValues(t, "Go", htmlDoc.Find("input[type='hidden'][name='language']").AttrOr("value", "not found"))
+ assert.EqualValues(t, "true", htmlDoc.Find("input[type='hidden'][name='topic']").AttrOr("value", "not found"))
+ })
}
From 0b4a9c4ec261583aac747502ae424bb0f492e840 Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Mon, 26 Feb 2024 09:22:51 +0100
Subject: [PATCH 108/807] Disabling Stars should disable the routes too
Similarly to how `[repository].DISABLE_FORKS` works, lets make
`[repository].DISABLE_STARS` disable the routes too, not just hide the
functionality from the UI.
Signed-off-by: Gergely Nagy
---
modules/setting/repository.go | 2 +-
routers/api/v1/api.go | 26 ++++++++++++-------
routers/web/web.go | 14 +++++++---
tests/integration/api_user_star_test.go | 33 ++++++++++++++++++++++++
tests/integration/repo_badges_test.go | 10 +++++++
tests/integration/repo_starwatch_test.go | 26 +++++++++++++++++++
6 files changed, 96 insertions(+), 15 deletions(-)
diff --git a/modules/setting/repository.go b/modules/setting/repository.go
index 34eff196b8..7a07fec85c 100644
--- a/modules/setting/repository.go
+++ b/modules/setting/repository.go
@@ -49,7 +49,7 @@ var (
DownloadOrCloneMethods []string
PrefixArchiveFiles bool
DisableMigrations bool
- DisableStars bool `ini:"DISABLE_STARS"`
+ DisableStars bool
DisableForks bool
DefaultBranch string
AllowAdoptionOfUnadoptedRepositories bool
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index e75d4cc964..c72f888dc2 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -964,7 +964,9 @@ func Routes() *web.Route {
m.Get("/{target}", user.CheckFollowing)
})
- m.Get("/starred", user.GetStarredRepos)
+ if !setting.Repository.DisableStars {
+ m.Get("/starred", user.GetStarredRepos)
+ }
m.Get("/subscriptions", user.GetWatchedRepos)
}, context_service.UserAssignmentAPI())
@@ -1039,14 +1041,16 @@ func Routes() *web.Route {
Post(bind(api.CreateRepoOption{}), repo.Create)
// (repo scope)
- m.Group("/starred", func() {
- m.Get("", user.GetMyStarredRepos)
- m.Group("/{username}/{reponame}", func() {
- m.Get("", user.IsStarring)
- m.Put("", user.Star)
- m.Delete("", user.Unstar)
- }, repoAssignment())
- }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository))
+ if !setting.Repository.DisableStars {
+ m.Group("/starred", func() {
+ m.Get("", user.GetMyStarredRepos)
+ m.Group("/{username}/{reponame}", func() {
+ m.Get("", user.IsStarring)
+ m.Put("", user.Star)
+ m.Delete("", user.Unstar)
+ }, repoAssignment())
+ }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository))
+ }
m.Get("/times", repo.ListMyTrackedTimes)
m.Get("/stopwatches", repo.GetStopwatches)
m.Get("/subscriptions", user.GetMyWatchedRepos)
@@ -1208,7 +1212,9 @@ func Routes() *web.Route {
m.Post("/markup", reqToken(), bind(api.MarkupOption{}), misc.Markup)
m.Post("/markdown", reqToken(), bind(api.MarkdownOption{}), misc.Markdown)
m.Post("/markdown/raw", reqToken(), misc.MarkdownRaw)
- m.Get("/stargazers", repo.ListStargazers)
+ if !setting.Repository.DisableStars {
+ m.Get("/stargazers", repo.ListStargazers)
+ }
m.Get("/subscribers", repo.ListSubscribers)
m.Group("/subscription", func() {
m.Get("", user.IsWatching)
diff --git a/routers/web/web.go b/routers/web/web.go
index 38cf5e92bc..a53116be16 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -1129,8 +1129,10 @@ func registerRoutes(m *web.Route) {
m.Post("/unwatch", repo.ActionWatch(false))
m.Post("/accept_transfer", repo.ActionTransfer(true))
m.Post("/reject_transfer", repo.ActionTransfer(false))
- m.Post("/star", repo.ActionStar(true))
- m.Post("/unstar", repo.ActionStar(false))
+ if !setting.Repository.DisableStars {
+ m.Post("/star", repo.ActionStar(true))
+ m.Post("/unstar", repo.ActionStar(false))
+ }
}, reqSignIn, context.RepoAssignment, context.UnitTypes())
// Grouping for those endpoints not requiring authentication (but should respect ignSignIn)
@@ -1359,7 +1361,9 @@ func registerRoutes(m *web.Route) {
m.Get("/open.svg", badges.GetOpenPullsBadge)
m.Get("/closed.svg", badges.GetClosedPullsBadge)
})
- m.Get("/stars.svg", badges.GetStarsBadge)
+ if !setting.Repository.DisableStars {
+ m.Get("/stars.svg", badges.GetStarsBadge)
+ }
m.Get("/release.svg", badges.GetLatestReleaseBadge)
})
}
@@ -1582,7 +1586,9 @@ func registerRoutes(m *web.Route) {
m.Post("/{username}/{reponame}/lastcommit/*", ignSignInAndCsrf, context.RepoAssignment, context.UnitTypes(), context.RepoRefByType(context.RepoRefCommit), reqRepoCodeReader, repo.LastCommit)
m.Group("/{username}/{reponame}", func() {
- m.Get("/stars", repo.Stars)
+ if !setting.Repository.DisableStars {
+ m.Get("/stars", repo.Stars)
+ }
m.Get("/watchers", repo.Watchers)
m.Get("/search", reqRepoCodeReader, repo.Search)
}, ignSignIn, context.RepoAssignment, context.RepoRef(), context.UnitTypes())
diff --git a/tests/integration/api_user_star_test.go b/tests/integration/api_user_star_test.go
index 50423c80e7..aafe9cfb8b 100644
--- a/tests/integration/api_user_star_test.go
+++ b/tests/integration/api_user_star_test.go
@@ -9,7 +9,10 @@ import (
"testing"
auth_model "code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/modules/test"
+ "code.gitea.io/gitea/routers"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert"
@@ -25,12 +28,26 @@ func TestAPIStar(t *testing.T) {
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser)
tokenWithUserScope := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser, auth_model.AccessTokenScopeWriteRepository)
+ assertDisabledStarsNotFound := func(t *testing.T, req *RequestWrapper) {
+ t.Helper()
+
+ defer tests.PrintCurrentTest(t)()
+ defer test.MockVariableValue(&setting.Repository.DisableStars, true)()
+ defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())()
+
+ MakeRequest(t, req, http.StatusNotFound)
+ }
+
t.Run("Star", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
req := NewRequest(t, "PUT", fmt.Sprintf("/api/v1/user/starred/%s", repo)).
AddTokenAuth(tokenWithUserScope)
MakeRequest(t, req, http.StatusNoContent)
+
+ t.Run("disabled stars", func(t *testing.T) {
+ assertDisabledStarsNotFound(t, req)
+ })
})
t.Run("GetStarredRepos", func(t *testing.T) {
@@ -46,6 +63,10 @@ func TestAPIStar(t *testing.T) {
DecodeJSON(t, resp, &repos)
assert.Len(t, repos, 1)
assert.Equal(t, repo, repos[0].FullName)
+
+ t.Run("disabled stars", func(t *testing.T) {
+ assertDisabledStarsNotFound(t, req)
+ })
})
t.Run("GetMyStarredRepos", func(t *testing.T) {
@@ -61,6 +82,10 @@ func TestAPIStar(t *testing.T) {
DecodeJSON(t, resp, &repos)
assert.Len(t, repos, 1)
assert.Equal(t, repo, repos[0].FullName)
+
+ t.Run("disabled stars", func(t *testing.T) {
+ assertDisabledStarsNotFound(t, req)
+ })
})
t.Run("IsStarring", func(t *testing.T) {
@@ -73,6 +98,10 @@ func TestAPIStar(t *testing.T) {
req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/user/starred/%s", repo+"notexisting")).
AddTokenAuth(tokenWithUserScope)
MakeRequest(t, req, http.StatusNotFound)
+
+ t.Run("disabled stars", func(t *testing.T) {
+ assertDisabledStarsNotFound(t, req)
+ })
})
t.Run("Unstar", func(t *testing.T) {
@@ -81,5 +110,9 @@ func TestAPIStar(t *testing.T) {
req := NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/user/starred/%s", repo)).
AddTokenAuth(tokenWithUserScope)
MakeRequest(t, req, http.StatusNoContent)
+
+ t.Run("disabled stars", func(t *testing.T) {
+ assertDisabledStarsNotFound(t, req)
+ })
})
}
diff --git a/tests/integration/repo_badges_test.go b/tests/integration/repo_badges_test.go
index 18d04930f9..b7020bbadd 100644
--- a/tests/integration/repo_badges_test.go
+++ b/tests/integration/repo_badges_test.go
@@ -16,7 +16,9 @@ import (
unit_model "code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/test"
+ "code.gitea.io/gitea/routers"
files_service "code.gitea.io/gitea/services/repository/files"
"code.gitea.io/gitea/tests"
@@ -107,6 +109,14 @@ func TestBadges(t *testing.T) {
resp := MakeRequest(t, req, http.StatusSeeOther)
assertBadge(t, resp, "stars-0-blue")
+
+ t.Run("disabled stars", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ defer test.MockVariableValue(&setting.Repository.DisableStars, true)()
+ defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())()
+
+ MakeRequest(t, req, http.StatusNotFound)
+ })
})
t.Run("Issues", func(t *testing.T) {
diff --git a/tests/integration/repo_starwatch_test.go b/tests/integration/repo_starwatch_test.go
index 4b4f967720..d1ba2dbf0a 100644
--- a/tests/integration/repo_starwatch_test.go
+++ b/tests/integration/repo_starwatch_test.go
@@ -9,6 +9,9 @@ import (
"strings"
"testing"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/test"
+ "code.gitea.io/gitea/routers"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert"
@@ -80,3 +83,26 @@ func TestRepoStarUnstarUI(t *testing.T) {
func TestRepoWatchUnwatchUI(t *testing.T) {
testRepoStarringOrWatching(t, "watch", "watchers")
}
+
+func TestDisabledStars(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+ defer test.MockVariableValue(&setting.Repository.DisableStars, true)()
+ defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())()
+
+ t.Run("repo star, unstar", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, "POST", "/user2/repo1/action/star")
+ MakeRequest(t, req, http.StatusNotFound)
+
+ req = NewRequest(t, "POST", "/user2/repo1/action/unstar")
+ MakeRequest(t, req, http.StatusNotFound)
+ })
+
+ t.Run("repo stargazers", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, "GET", "/user2/repo1/stars")
+ MakeRequest(t, req, http.StatusNotFound)
+ })
+}
From f796548225c4fbfb2066ff013b5d77a1eb46c15b Mon Sep 17 00:00:00 2001
From: 6543
Date: Mon, 19 Feb 2024 14:42:18 +0100
Subject: [PATCH 109/807] Workaround to clean up old reviews on creating a new
one (#28554)
close #28542
blocks #28544
---
*Sponsored by Kithara Software GmbH*
(cherry picked from commit 217d71c48a10265e08b95cc961656b921f61f9ff)
Conflicts:
tests/integration/api_pull_review_test.go
context
---
models/issues/review.go | 40 ++++++-
models/unittest/unit_tests.go | 8 +-
tests/integration/api_pull_review_test.go | 126 ++++++++++++++++++++++
3 files changed, 165 insertions(+), 9 deletions(-)
diff --git a/models/issues/review.go b/models/issues/review.go
index 3aa9d3e2a8..fc110630e0 100644
--- a/models/issues/review.go
+++ b/models/issues/review.go
@@ -292,8 +292,14 @@ func IsOfficialReviewerTeam(ctx context.Context, issue *Issue, team *organizatio
// CreateReview creates a new review based on opts
func CreateReview(ctx context.Context, opts CreateReviewOptions) (*Review, error) {
+ ctx, committer, err := db.TxContext(ctx)
+ if err != nil {
+ return nil, err
+ }
+ defer committer.Close()
+ sess := db.GetEngine(ctx)
+
review := &Review{
- Type: opts.Type,
Issue: opts.Issue,
IssueID: opts.Issue.ID,
Reviewer: opts.Reviewer,
@@ -303,15 +309,39 @@ func CreateReview(ctx context.Context, opts CreateReviewOptions) (*Review, error
CommitID: opts.CommitID,
Stale: opts.Stale,
}
+
if opts.Reviewer != nil {
+ review.Type = opts.Type
review.ReviewerID = opts.Reviewer.ID
- } else {
- if review.Type != ReviewTypeRequest {
- review.Type = ReviewTypeRequest
+
+ reviewCond := builder.Eq{"reviewer_id": opts.Reviewer.ID, "issue_id": opts.Issue.ID}
+ // make sure user review requests are cleared
+ if opts.Type != ReviewTypePending {
+ if _, err := sess.Where(reviewCond.And(builder.Eq{"type": ReviewTypeRequest})).Delete(new(Review)); err != nil {
+ return nil, err
+ }
}
+ // make sure if the created review gets dismissed no old review surface
+ // other types can be ignored, as they don't affect branch protection
+ if opts.Type == ReviewTypeApprove || opts.Type == ReviewTypeReject {
+ if _, err := sess.Where(reviewCond.And(builder.In("type", ReviewTypeApprove, ReviewTypeReject))).
+ Cols("dismissed").Update(&Review{Dismissed: true}); err != nil {
+ return nil, err
+ }
+ }
+
+ } else if opts.ReviewerTeam != nil {
+ review.Type = ReviewTypeRequest
review.ReviewerTeamID = opts.ReviewerTeam.ID
+
+ } else {
+ return nil, fmt.Errorf("provide either reviewer or reviewer team")
}
- return review, db.Insert(ctx, review)
+
+ if _, err := sess.Insert(review); err != nil {
+ return nil, err
+ }
+ return review, committer.Commit()
}
// GetCurrentReview returns the current pending review of reviewer for given issue
diff --git a/models/unittest/unit_tests.go b/models/unittest/unit_tests.go
index d47bceea1e..75898436fc 100644
--- a/models/unittest/unit_tests.go
+++ b/models/unittest/unit_tests.go
@@ -131,8 +131,8 @@ func AssertSuccessfulInsert(t assert.TestingT, beans ...any) {
}
// AssertCount assert the count of a bean
-func AssertCount(t assert.TestingT, bean, expected any) {
- assert.EqualValues(t, expected, GetCount(t, bean))
+func AssertCount(t assert.TestingT, bean, expected any) bool {
+ return assert.EqualValues(t, expected, GetCount(t, bean))
}
// AssertInt64InRange assert value is in range [low, high]
@@ -150,7 +150,7 @@ func GetCountByCond(t assert.TestingT, tableName string, cond builder.Cond) int6
}
// AssertCountByCond test the count of database entries matching bean
-func AssertCountByCond(t assert.TestingT, tableName string, cond builder.Cond, expected int) {
- assert.EqualValues(t, expected, GetCountByCond(t, tableName, cond),
+func AssertCountByCond(t assert.TestingT, tableName string, cond builder.Cond, expected int) bool {
+ return assert.EqualValues(t, expected, GetCountByCond(t, tableName, cond),
"Failed consistency test, the counted bean (of table %s) was %+v", tableName, cond)
}
diff --git a/tests/integration/api_pull_review_test.go b/tests/integration/api_pull_review_test.go
index c66c7d752d..cb02baa083 100644
--- a/tests/integration/api_pull_review_test.go
+++ b/tests/integration/api_pull_review_test.go
@@ -13,12 +13,15 @@ import (
issues_model "code.gitea.io/gitea/models/issues"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
+ user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/json"
api "code.gitea.io/gitea/modules/structs"
+ issue_service "code.gitea.io/gitea/services/issue"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
+ "xorm.io/builder"
)
func TestAPIPullReviewCreateDeleteComment(t *testing.T) {
@@ -436,3 +439,126 @@ func TestAPIPullReviewRequest(t *testing.T) {
AddTokenAuth(token)
MakeRequest(t, req, http.StatusNoContent)
}
+
+func TestAPIPullReviewStayDismissed(t *testing.T) {
+ // This test against issue https://github.com/go-gitea/gitea/issues/28542
+ // where old reviews surface after a review request got dismissed.
+ defer tests.PrepareTestEnv(t)()
+ pullIssue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 3})
+ assert.NoError(t, pullIssue.LoadAttributes(db.DefaultContext))
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: pullIssue.RepoID})
+ user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
+ session2 := loginUser(t, user2.LoginName)
+ token2 := getTokenForLoggedInUser(t, session2, auth_model.AccessTokenScopeWriteRepository)
+ user8 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 8})
+ session8 := loginUser(t, user8.LoginName)
+ token8 := getTokenForLoggedInUser(t, session8, auth_model.AccessTokenScopeWriteRepository)
+
+ // user2 request user8
+ req := NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", repo.OwnerName, repo.Name, pullIssue.Index), &api.PullReviewRequestOptions{
+ Reviewers: []string{user8.LoginName},
+ }).AddTokenAuth(token2)
+ MakeRequest(t, req, http.StatusCreated)
+
+ reviewsCountCheck(t,
+ "check we have only one review request",
+ pullIssue.ID, user8.ID, 0, 1, 1, false)
+
+ // user2 request user8 again, it is expected to be ignored
+ req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", repo.OwnerName, repo.Name, pullIssue.Index), &api.PullReviewRequestOptions{
+ Reviewers: []string{user8.LoginName},
+ }).AddTokenAuth(token2)
+ MakeRequest(t, req, http.StatusCreated)
+
+ reviewsCountCheck(t,
+ "check we have only one review request, even after re-request it again",
+ pullIssue.ID, user8.ID, 0, 1, 1, false)
+
+ // user8 reviews it as accept
+ req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews", repo.OwnerName, repo.Name, pullIssue.Index), &api.CreatePullReviewOptions{
+ Event: "APPROVED",
+ Body: "lgtm",
+ }).AddTokenAuth(token8)
+ MakeRequest(t, req, http.StatusOK)
+
+ reviewsCountCheck(t,
+ "check we have one valid approval",
+ pullIssue.ID, user8.ID, 0, 0, 1, true)
+
+ // emulate of auto-dismiss lgtm on a protected branch that where a pull just got an update
+ _, err := db.GetEngine(db.DefaultContext).Where("issue_id = ? AND reviewer_id = ?", pullIssue.ID, user8.ID).
+ Cols("dismissed").Update(&issues_model.Review{Dismissed: true})
+ assert.NoError(t, err)
+
+ // user2 request user8 again
+ req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", repo.OwnerName, repo.Name, pullIssue.Index), &api.PullReviewRequestOptions{
+ Reviewers: []string{user8.LoginName},
+ }).AddTokenAuth(token2)
+ MakeRequest(t, req, http.StatusCreated)
+
+ reviewsCountCheck(t,
+ "check we have no valid approval and one review request",
+ pullIssue.ID, user8.ID, 1, 1, 2, false)
+
+ // user8 dismiss review
+ _, err = issue_service.ReviewRequest(db.DefaultContext, pullIssue, user8, user8, false)
+ assert.NoError(t, err)
+
+ reviewsCountCheck(t,
+ "check new review request is now dismissed",
+ pullIssue.ID, user8.ID, 1, 0, 1, false)
+
+ // add a new valid approval
+ req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews", repo.OwnerName, repo.Name, pullIssue.Index), &api.CreatePullReviewOptions{
+ Event: "APPROVED",
+ Body: "lgtm",
+ }).AddTokenAuth(token8)
+ MakeRequest(t, req, http.StatusOK)
+
+ reviewsCountCheck(t,
+ "check that old reviews requests are deleted",
+ pullIssue.ID, user8.ID, 1, 0, 2, true)
+
+ // now add a change request witch should dismiss the approval
+ req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews", repo.OwnerName, repo.Name, pullIssue.Index), &api.CreatePullReviewOptions{
+ Event: "REQUEST_CHANGES",
+ Body: "please change XYZ",
+ }).AddTokenAuth(token8)
+ MakeRequest(t, req, http.StatusOK)
+
+ reviewsCountCheck(t,
+ "check that old reviews are dismissed",
+ pullIssue.ID, user8.ID, 2, 0, 3, false)
+}
+
+func reviewsCountCheck(t *testing.T, name string, issueID, reviewerID int64, expectedDismissed, expectedRequested, expectedTotal int, expectApproval bool) {
+ t.Run(name, func(t *testing.T) {
+ unittest.AssertCountByCond(t, "review", builder.Eq{
+ "issue_id": issueID,
+ "reviewer_id": reviewerID,
+ "dismissed": true,
+ }, expectedDismissed)
+
+ unittest.AssertCountByCond(t, "review", builder.Eq{
+ "issue_id": issueID,
+ "reviewer_id": reviewerID,
+ }, expectedTotal)
+
+ unittest.AssertCountByCond(t, "review", builder.Eq{
+ "issue_id": issueID,
+ "reviewer_id": reviewerID,
+ "type": issues_model.ReviewTypeRequest,
+ }, expectedRequested)
+
+ approvalCount := 0
+ if expectApproval {
+ approvalCount = 1
+ }
+ unittest.AssertCountByCond(t, "review", builder.Eq{
+ "issue_id": issueID,
+ "reviewer_id": reviewerID,
+ "type": issues_model.ReviewTypeApprove,
+ "dismissed": false,
+ }, approvalCount)
+ })
+}
From fb137d1e49c0436f1db093e2dc0a2350d63e1e29 Mon Sep 17 00:00:00 2001
From: vincent
Date: Mon, 19 Feb 2024 22:50:03 +0800
Subject: [PATCH 110/807] Fix content size does not match error when uploading
lfs file (#29259)
![image](https://github.com/go-gitea/gitea/assets/38434877/cd726b4d-4771-4547-8aee-ae4e4b56b1d1)
When we update an lfs file by API
`api/v1/repos/{owner}/{repo}/contents/{filepath}`, there will show an
error
```json
{
"message": "Put \"http://localhost:9000/gitea/lfs/38/92/05904d6c7bb83fc676513911226f2be25bf1465616bb9b29587100ab1414\": readfrom tcp [::1]:57300->[::1]:9000: content size does not match",
"url": "http://localhost:3000/api/swagger"
}
```
The reason of this error is
https://github.com/go-gitea/gitea/blob/main/services/repository/files/update.go,
in this file, the `file.ContentReader` been used twice. So when use
`file.ContentReader` in the second time, the `i` of this Reader has been
updated to the length of the content. it will return 0 and an `io.EOF`
error when we try to read cotent from this Reader.
(cherry picked from commit 35d5e4aea4bb02a0b4c7b38ecb2acf612151e891)
---
routers/api/v1/repo/file.go | 2 +-
services/repository/files/update.go | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go
index 49d85bf914..94a6381e25 100644
--- a/routers/api/v1/repo/file.go
+++ b/routers/api/v1/repo/file.go
@@ -425,7 +425,7 @@ func canReadFiles(r *context.Repository) bool {
return r.Permission.CanRead(unit.TypeCode)
}
-func base64Reader(s string) (io.Reader, error) {
+func base64Reader(s string) (io.ReadSeeker, error) {
b, err := base64.StdEncoding.DecodeString(s)
if err != nil {
return nil, err
diff --git a/services/repository/files/update.go b/services/repository/files/update.go
index f223daf3a9..4f7178184b 100644
--- a/services/repository/files/update.go
+++ b/services/repository/files/update.go
@@ -40,7 +40,7 @@ type ChangeRepoFile struct {
Operation string
TreePath string
FromTreePath string
- ContentReader io.Reader
+ ContentReader io.ReadSeeker
SHA string
Options *RepoFileOptions
}
@@ -448,6 +448,10 @@ func CreateOrUpdateFile(ctx context.Context, t *TemporaryUploadRepository, file
return err
}
if !exist {
+ _, err := file.ContentReader.Seek(0, io.SeekStart)
+ if err != nil {
+ return err
+ }
if err := contentStore.Put(lfsMetaObject.Pointer, file.ContentReader); err != nil {
if _, err2 := git_model.RemoveLFSMetaObjectByOid(ctx, repoID, lfsMetaObject.Oid); err2 != nil {
return fmt.Errorf("unable to remove failed inserted LFS object %s: %v (Prev Error: %w)", lfsMetaObject.Oid, err2, err)
From 58699d21e77ce233466f6e21ca9c0411c3f3894a Mon Sep 17 00:00:00 2001
From: Yarden Shoham
Date: Tue, 20 Feb 2024 00:34:35 +0200
Subject: [PATCH 111/807] Remove jQuery from the repo migration form (#29229)
- Switched to plain JavaScript
- Tested the repo migration form functionality and it works as before
# Demo using JavaScript without jQuery
![action](https://github.com/go-gitea/gitea/assets/20454870/3496ec05-48a7-449e-8cdd-f8372ba0d589)
---------
Signed-off-by: Yarden Shoham
Co-authored-by: silverwind
(cherry picked from commit 100031f5f143a15c79ebbe1b77c86091e3b6d489)
---
web_src/js/features/repo-migration.js | 72 +++++++++++++++------------
1 file changed, 39 insertions(+), 33 deletions(-)
diff --git a/web_src/js/features/repo-migration.js b/web_src/js/features/repo-migration.js
index 3bd0e6d72c..59e282e4e7 100644
--- a/web_src/js/features/repo-migration.js
+++ b/web_src/js/features/repo-migration.js
@@ -1,38 +1,42 @@
-import $ from 'jquery';
import {hideElem, showElem, toggleElem} from '../utils/dom.js';
-const $service = $('#service_type');
-const $user = $('#auth_username');
-const $pass = $('#auth_password');
-const $token = $('#auth_token');
-const $mirror = $('#mirror');
-const $lfs = $('#lfs');
-const $lfsSettings = $('#lfs_settings');
-const $lfsEndpoint = $('#lfs_endpoint');
-const $items = $('#migrate_items').find('input[type=checkbox]');
+const service = document.getElementById('service_type');
+const user = document.getElementById('auth_username');
+const pass = document.getElementById('auth_password');
+const token = document.getElementById('auth_token');
+const mirror = document.getElementById('mirror');
+const lfs = document.getElementById('lfs');
+const lfsSettings = document.getElementById('lfs_settings');
+const lfsEndpoint = document.getElementById('lfs_endpoint');
+const items = document.querySelectorAll('#migrate_items input[type=checkbox]');
export function initRepoMigration() {
checkAuth();
setLFSSettingsVisibility();
- $user.on('input', () => {checkItems(false)});
- $pass.on('input', () => {checkItems(false)});
- $token.on('input', () => {checkItems(true)});
- $mirror.on('change', () => {checkItems(true)});
- $('#lfs_settings_show').on('click', () => { showElem($lfsEndpoint); return false });
- $lfs.on('change', setLFSSettingsVisibility);
+ user?.addEventListener('input', () => {checkItems(false)});
+ pass?.addEventListener('input', () => {checkItems(false)});
+ token?.addEventListener('input', () => {checkItems(true)});
+ mirror?.addEventListener('change', () => {checkItems(true)});
+ document.getElementById('lfs_settings_show')?.addEventListener('click', (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ showElem(lfsEndpoint);
+ });
+ lfs?.addEventListener('change', setLFSSettingsVisibility);
- const $cloneAddr = $('#clone_addr');
- $cloneAddr.on('change', () => {
- const $repoName = $('#repo_name');
- if ($cloneAddr.val().length > 0 && $repoName.val().length === 0) { // Only modify if repo_name input is blank
- $repoName.val($cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]);
+ const cloneAddr = document.getElementById('clone_addr');
+ cloneAddr?.addEventListener('change', () => {
+ const repoName = document.getElementById('repo_name');
+ if (cloneAddr.value && !repoName?.value) { // Only modify if repo_name input is blank
+ repoName.value = cloneAddr.value.match(/^(.*\/)?((.+?)(\.git)?)$/)[3];
}
});
}
function checkAuth() {
- const serviceType = $service.val();
+ if (!service) return;
+ const serviceType = Number(service.value);
checkItems(serviceType !== 1);
}
@@ -40,24 +44,26 @@ function checkAuth() {
function checkItems(tokenAuth) {
let enableItems;
if (tokenAuth) {
- enableItems = $token.val() !== '';
+ enableItems = token?.value !== '';
} else {
- enableItems = $user.val() !== '' || $pass.val() !== '';
+ enableItems = user?.value !== '' || pass?.value !== '';
}
- if (enableItems && $service.val() > 1) {
- if ($mirror.is(':checked')) {
- $items.not('[name="wiki"]').attr('disabled', true);
- $items.filter('[name="wiki"]').attr('disabled', false);
+ if (enableItems && Number(service?.value) > 1) {
+ if (mirror?.checked) {
+ for (const item of items) {
+ item.disabled = item.name !== 'wiki';
+ }
return;
}
- $items.attr('disabled', false);
+ for (const item of items) item.disabled = false;
} else {
- $items.attr('disabled', true);
+ for (const item of items) item.disabled = true;
}
}
function setLFSSettingsVisibility() {
- const visible = $lfs.is(':checked');
- toggleElem($lfsSettings, visible);
- hideElem($lfsEndpoint);
+ if (!lfs) return;
+ const visible = lfs.checked;
+ toggleElem(lfsSettings, visible);
+ hideElem(lfsEndpoint);
}
From 445c78e09fba5f96c3f1194922b5e7d2a748b3d1 Mon Sep 17 00:00:00 2001
From: GiteaBot
Date: Tue, 20 Feb 2024 00:23:17 +0000
Subject: [PATCH 112/807] [skip ci] Updated translations via Crowdin
(cherry picked from commit d9268369473965fce1464325d9f4b15ed9d38046)
---
options/locale/locale_lv-LV.ini | 46 ++++++++++++++++++++++++++++++---
1 file changed, 43 insertions(+), 3 deletions(-)
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index 3057b871c7..b69199e953 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -110,6 +110,7 @@ loading=Notiek ielāde…
error=Kļūda
error404=Lapa, ko vēlaties atvērt, neeksistē vai arī Jums nav tiesības to aplūkot.
+go_back=Atgriezties
never=Nekad
unknown=Nezināms
@@ -590,6 +591,8 @@ user_bio=Biogrāfija
disabled_public_activity=Šis lietotājs ir atslēdzies iespēju aplūkot tā aktivitāti.
email_visibility.limited=E-pasta adrese ir redzama visiem autentificētajiem lietotājiem
email_visibility.private=E-pasta adrese ir redzama tikai administratoriem
+show_on_map=Rādīt šo vietu kartē
+settings=Lietotāja iestatījumi
form.name_reserved=Lietotājvārdu "%s" nedrīkst izmantot.
form.name_pattern_not_allowed=Lietotājvārds "%s" nav atļauts.
@@ -611,9 +614,12 @@ delete=Dzēst kontu
twofa=Divfaktoru autentifikācija
account_link=Saistītie konti
organization=Organizācijas
+uid=UID
webauthn=Drošības atslēgas
public_profile=Publiskais profils
+biography_placeholder=Pastāsti mums mazliet par sevi! (Var izmantot Markdown)
+location_placeholder=Kopīgot savu aptuveno atrašanās vietu ar citiem
password_username_disabled=Ne-lokāliem 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
@@ -697,6 +703,7 @@ add_email_success=Jūsu jaunā e-pasta adrese tika veiksmīgi pievienota.
email_preference_set_success=E-pasta izvēle tika veiksmīgi saglabāta.
add_openid_success=Jūsu jaunā OpenID adrese tika veiksmīgi pievienota.
keep_email_private=Paslēpt e-pasta adresi
+keep_email_private_popup=Šis profilā paslēps e-pasta adresi, kā arī tad, kad tiks veikts izmaiņu pieprasījums vai tīmekļa saskarnē labota datne. Aizgādātie iesūtījumi netiks pārveidoti. Revīzijās jāizmanto %s, lai sasaistītu tos ar kontu.
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
@@ -823,6 +830,7 @@ authorized_oauth2_applications=Autorizētās OAuth2 lietotnes
revoke_key=Atsaukt
revoke_oauth2_grant=Atsaukt piekļuvi
revoke_oauth2_grant_description=Atsaucot piekļuvi šai trešas puses lietotnei tiks liegta piekļuve Jūsu datiem. Vai turpināt?
+revoke_oauth2_grant_success=Piekļuve veiksmīgi atsaukta.
twofa_desc=Divfaktoru autentifikācija uzlabo konta drošību.
twofa_is_enrolled=Kontam ir ieslēgta divfaktoru autentifikācija.
@@ -875,6 +883,7 @@ visibility=Lietotāja redzamība
visibility.public=Publisks
visibility.public_tooltip=Redzams ikvienam
visibility.limited=Ierobežota
+visibility.limited_tooltip=Redzams tikai autentificētiem lietotājiem
visibility.private=Privāts
[repo]
@@ -889,6 +898,7 @@ template_helper=Padarīt repozitoriju par sagatavi
template_description=Sagatavju repozitoriji tiek izmantoti, lai balstoties uz tiem veidotu jaunus repozitorijus saglabājot direktoriju un failu struktūru.
visibility=Redzamība
visibility_description=Tikai organizācijas īpašnieks vai tās biedri, kam ir tiesības, varēs piekļūt šim repozitorijam.
+visibility_helper=Padarīt repozitoriju privātu
visibility_helper_forced=Jūsu sistēmas administrators ir noteicis, ka visiem no jauna izveidotajiem repozitorijiem ir jābūt privātiem.
visibility_fork_helper=(Šīs vērtības maiņa ietekmēs arī visus atdalītos repozitorijus.)
clone_helper=Nepieciešama palīdzība klonēšanā? Apmeklē palīdzības sadaļu.
@@ -897,6 +907,7 @@ fork_from=Atdalīt no
already_forked=Repozitorijs %s jau ir atdalīts
fork_to_different_account=Atdalīt uz citu kontu
fork_visibility_helper=Atdalītam repozitorijam nav iespējams mainīt tā redzamību.
+all_branches=Visi atzari
use_template=Izmantot šo sagatavi
clone_in_vsc=Atvērt VS Code
download_zip=Lejupielādēt ZIP
@@ -924,7 +935,8 @@ trust_model_helper_committer=Revīzijas iesūtītāja: Uzticēties parakstiem, k
trust_model_helper_collaborator_committer=Līdzstrādnieka un revīzijas iesūtītāja: Uzticēties līdzstrādnieku parakstiem, kas atbilst revīzijas iesūtītājam
trust_model_helper_default=Noklusētais: Izmantojiet šī servera noklusēto uzticamības modeli
create_repo=Izveidot repozitoriju
-default_branch=Noklusējuma atzars
+default_branch=Noklusētais atzars
+default_branch_label=noklusējuma
default_branch_helper=Noklusētais atzars nosaka pamata atzaru uz kuru tiks veidoti izmaiņu pieprasījumi un koda revīziju iesūtīšana.
mirror_prune=Izmest
mirror_prune_desc=Izdzēst visas ārējās atsauces, kas ārējā repozitorijā vairs neeksistē
@@ -960,6 +972,7 @@ delete_preexisting_success=Dzēst nepārņemtos failus direktorijā %s
blame_prior=Aplūkot vainīgo par izmaiņām pirms šīs revīzijas
author_search_tooltip=Tiks attēloti ne vairāk kā 30 lietotāji
+tree_path_not_found_commit=Revīzijā %[2]s neeksistē ceļš %[1]s
transfer.accept=Apstiprināt īpašnieka maiņu
transfer.accept_desc=`Mainīt īpašnieku uz "%s"`
@@ -1118,6 +1131,9 @@ commit_graph.select=Izvēlieties atzarus
commit_graph.hide_pr_refs=Paslēpt izmaiņu pieprasījumus
commit_graph.monochrome=Melnbalts
commit_graph.color=Krāsa
+commit.contained_in=Šī revīzija ir iekļauta:
+commit.contained_in_default_branch=Šī revīzija ir daļa no noklusētā atzara
+commit.load_referencing_branches_and_tags=Ielādēt atzarus un tagus, kas atsaucas uz šo revīziju
blame=Vainot
download_file=Lejupielādēt failu
normal_view=Parastais skats
@@ -1210,6 +1226,7 @@ commits.signed_by_untrusted_user=Parakstījis neuzticams lietotājs
commits.signed_by_untrusted_user_unmatched=Parakstījis neuzticams lietotājs, kas neatbilst izmaiņu autoram
commits.gpg_key_id=GPG atslēgas ID
commits.ssh_key_fingerprint=SSH atslēgas identificējošā zīmju virkne
+commits.view_path=Skatīt šajā vēstures punktā
commit.operations=Darbības
commit.revert=Atgriezt
@@ -1220,7 +1237,7 @@ commit.cherry-pick-header=Izlasīt: %s
commit.cherry-pick-content=Norādiet atzaru uz kuru izlasīt:
commitstatus.error=Kļūda
-commitstatus.failure=Neveiksmīgs
+commitstatus.failure=Kļūme
commitstatus.pending=Nav iesūtīts
commitstatus.success=Pabeigts
@@ -1418,6 +1435,7 @@ issues.ref_from=`no %[1]s`
issues.author=Autors
issues.role.owner=Īpašnieks
issues.role.member=Biedri
+issues.role.contributor_helper=Šis lietotājs repozitorijā ir iepriekš veicis labojumus.
issues.re_request_review=Pieprasīt atkārtotu recenziju
issues.is_stale=Šajā izmaiņu pieprasījumā ir notikušas izmaiņās, kopš veicāt tā recenziju
issues.remove_request_review=Noņemt recenzijas pieprasījumu
@@ -1603,6 +1621,11 @@ pulls.switch_comparison_type=Mainīt salīdzināšanas tipu
pulls.switch_head_and_base=Mainīt galvas un pamata atzarus
pulls.filter_branch=Filtrēt atzarus
pulls.no_results=Nekas netika atrasts.
+pulls.show_all_commits=Rādīt visas revīzijas
+pulls.showing_only_single_commit=Rāda tikai revīzijas %[1]s izmaiņas
+pulls.showing_specified_commit_range=Rāda tikai izmaiņas starp %[1]s..%[2]s
+pulls.select_commit_hold_shift_for_range=Atlasīt revīziju. Jātur Shift + klikšķis, lai atlasītu vairākas
+pulls.filter_changes_by_commit=Atlasīt pēc revīzijas
pulls.nothing_to_compare=Nav ko salīdzināt, jo bāzes un salīdzināmie atzari ir vienādi.
pulls.nothing_to_compare_and_allow_empty_pr=Šie atzari ir vienādi. Izveidotais izmaiņu pieprasījums būs tukšs.
pulls.has_pull_request=`Izmaiņu pieprasījums starp šiem atzariem jau eksistē: %[2]s#%[3]d`
@@ -1706,6 +1729,7 @@ pulls.delete.title=Dzēst šo izmaiņu pieprasījumu?
pulls.delete.text=Vai patiešām vēlaties dzēst šo izmaiņu pieprasījumu? (Neatgriezeniski tiks izdzēsts viss saturs. Apsveriet iespēju to aizvērt, ja vēlaties informāciju saglabāt vēsturei)
+pull.deleted_branch=(izdzēsts):%s
milestones.new=Jauns atskaites punkts
milestones.closed=Aizvērts %s
@@ -1734,7 +1758,17 @@ 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
+signing.will_sign=Šī revīzija tiks parakstīta ar atslēgu "%s".
signing.wont_sign.error=Notika kļūda pārbaudot vai revīzija var tikt parakstīta.
+signing.wont_sign.nokey=Nav pieejamas atslēgas, ar ko parakstīt šo revīziju.
+signing.wont_sign.never=Revīzijas nekad netiek parakstītas.
+signing.wont_sign.always=Revīzijas vienmēr tiek parakstītas.
+signing.wont_sign.pubkey=Revīzija netiks parakstīta, jo kontam nav piesaistīta publiskā atslēga.
+signing.wont_sign.twofa=Jābūt iespējotai divfaktoru autentifikācijai, lai parakstītu revīzijas.
+signing.wont_sign.parentsigned=Revīzija netiks parakstīta, jo nav parakstīta vecāka revīzija.
+signing.wont_sign.basesigned=Sapludināšanas revīzija netiks parakstīta, jo pamata revīzija nav parakstīta.
+signing.wont_sign.headsigned=Sapludināšanas revīzija netiks parakstīta, jo galvenā revīzija nav parakstīta.
+signing.wont_sign.commitssigned=Sapludināšana netiks parakstīta, jo visas saistītās revīzijas nav parakstītas.
signing.wont_sign.not_signed_in=Jūs neesat pieteicies.
ext_wiki=Piekļuve ārējai vikivietnei
@@ -2176,6 +2210,7 @@ settings.dismiss_stale_approvals_desc=Kad tiek iesūtītas jaunas revīzijas, ka
settings.require_signed_commits=Pieprasīt parakstītas revīzijas
settings.require_signed_commits_desc=Noraidīt iesūtītās izmaiņas šim atzaram, ja tās nav parakstītas vai nav iespējams pārbaudīt.
settings.protect_branch_name_pattern=Aizsargātā zara šablons
+settings.protect_branch_name_pattern_desc=Aizsargāto atzaru nosaukumu šabloni. Šablonu pierakstu skatīt dokumentācijā. Piemēri: main, release/**
settings.protect_patterns=Šabloni
settings.protect_protected_file_patterns=Aizsargāto failu šablons (vairākus var norādīt atdalot ar semikolu ';'):
settings.protect_protected_file_patterns_desc=Aizsargātie faili, ko nevar mainīt, pat ja lietotājam ir tiesības veidot jaunus, labot vai dzēst failus šajā atzarā. Vairākus šablons ir iespējams norādīt atdalot tos ar semikolu (';'). Sīkāka informācija par šabloniem pieejama github.com/gobwas/glob dokumentācijā. Piemēram, .drone.yml, /docs/**/*.txt.
@@ -2212,6 +2247,7 @@ settings.tags.protection.allowed.teams=Atļauts komandām
settings.tags.protection.allowed.noone=Nevienam
settings.tags.protection.create=Aizsargāt tagus
settings.tags.protection.none=Nav uzstādīta tagu aizsargāšana.
+settings.tags.protection.pattern.description=Var izmantot vienkāršu nosaukumu vai glob šablonu, vai regulāro izteiksmi, lai atbilstu vairākiem tagiem. Vairāk ir lasāms aizsargāto tagu šablonu dokumentācijā.
settings.bot_token=Bota pilnvara
settings.chat_id=Tērzēšanas ID
settings.matrix.homeserver_url=Mājas servera URL
@@ -2382,13 +2418,14 @@ branch.default_deletion_failed=Atzars "%s" ir noklusētais atzars un to nevar dz
branch.restore=`Atjaunot atzaru "%s"`
branch.download=`Lejupielādēt atzaru "%s"`
branch.rename=`Pārsaukt atzaru "%s"`
+branch.search=Meklēt atzarā
branch.included_desc=Šis atzars ir daļa no noklusēta atzara
branch.included=Iekļauts
branch.create_new_branch=Izveidot jaunu atzaru no atzara:
branch.confirm_create_branch=Izveidot atzaru
branch.warning_rename_default_branch=Tiks pārsaukts noklusētais atzars.
branch.rename_branch_to=Pārsaukt "%s" uz:
-branch.confirm_rename_branch=Pārsaukt atzaru
+branch.confirm_rename_branch=Pārdēvēt atzaru
branch.create_branch_operation=Izveidot atzaru
branch.new_branch=Izveidot jaunu atzaru
branch.new_branch_from=`Izveidot jaunu atzaru no "%s"`
@@ -2624,6 +2661,7 @@ dashboard.gc_lfs=Veikt atkritumu uzkopšanas darbus LFS meta objektiem
dashboard.stop_zombie_tasks=Apturēt zombija uzdevumus
dashboard.stop_endless_tasks=Apturēt nepārtrauktus uzdevumus
dashboard.cancel_abandoned_jobs=Atcelt pamestus darbus
+dashboard.sync_branch.started=Sākta atzaru sinhronizācija
users.user_manage_panel=Lietotāju kontu pārvaldība
users.new_account=Izveidot lietotāja kontu
@@ -3332,10 +3370,12 @@ runs.all_workflows=Visas darbaplūsmas
runs.commit=Revīzija
runs.invalid_workflow_helper=Darbaplūsmas konfigurācijas fails ir kļūdains. Pārbaudiet konfiugrācijas failu: %s
runs.status=Statuss
+runs.empty_commit_message=(tukšs revīzijas ziņojums)
need_approval_desc=Nepieciešams apstiprinājums, lai izpildītu izmaiņu pieprasījumu darbaplūsmas no atdalītiem repozitorijiem.
+variables.id_not_exist=Mainīgais ar identifikatoru %d neeksistē.
[projects]
type-1.display_name=Individuālais projekts
From 89eca88643042952716a46285fe9818293dbd2d6 Mon Sep 17 00:00:00 2001
From: Rafael Heard
Date: Mon, 19 Feb 2024 20:01:48 -0500
Subject: [PATCH 113/807] Left align the input labels for the link account page
(#29255)
In a previous [PR](https://github.com/go-gitea/gitea/pull/28753) we
moved the labels to be above the inputs. The PR ensures that the
alignment is also on both tabs of the link account page
(`/user/link_account`).
Before
After
---------
Co-authored-by: rafh
(cherry picked from commit e4e5d76932e9d5ba1f8c63213aefae1493012a81)
---
web_src/css/form.css | 2 --
1 file changed, 2 deletions(-)
diff --git a/web_src/css/form.css b/web_src/css/form.css
index c0de4978dd..a5288c9309 100644
--- a/web_src/css/form.css
+++ b/web_src/css/form.css
@@ -242,7 +242,6 @@ textarea:focus,
.user.activate form,
.user.forgot.password form,
.user.reset.password form,
-.user.link-account form,
.user.signup form {
margin: auto;
width: 700px !important;
@@ -277,7 +276,6 @@ textarea:focus,
.user.activate form .inline.field > label,
.user.forgot.password form .inline.field > label,
.user.reset.password form .inline.field > label,
- .user.link-account form .inline.field > label,
.user.signup form .inline.field > label {
text-align: right;
width: 250px !important;
From eefc4bf6f00b99c7813d8441ddb82fb5acedbadd Mon Sep 17 00:00:00 2001
From: Zettat123
Date: Tue, 20 Feb 2024 09:39:44 +0800
Subject: [PATCH 114/807] Do not show delete button when time tracker is
disabled (#29257)
Fix #29233
The delete button of time logs won't be shown when the time tracker is disabled.
![image](https://github.com/go-gitea/gitea/assets/15528715/5cc4e0c9-d2f9-4b8f-a2f5-fe202b94c191)
(cherry picked from commit 8c21bc0d51ab22c0d05d8ce2ea8bc80d6f893800)
---
templates/repo/issue/view_content/comments_delete_time.tmpl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/templates/repo/issue/view_content/comments_delete_time.tmpl b/templates/repo/issue/view_content/comments_delete_time.tmpl
index 7c01bb4228..95121b0dc7 100644
--- a/templates/repo/issue/view_content/comments_delete_time.tmpl
+++ b/templates/repo/issue/view_content/comments_delete_time.tmpl
@@ -1,4 +1,4 @@
-{{if .comment.Time}} {{/* compatibility with time comments made before v1.14 */}}
+{{if and .comment.Time (.ctxData.Repository.IsTimetrackerEnabled ctx)}} {{/* compatibility with time comments made before v1.14 */}}
{{if (not .comment.Time.Deleted)}}
{{if (or .ctxData.IsAdmin (and .ctxData.IsSigned (eq .ctxData.SignedUserID .comment.PosterID)))}}
From 0d61f3decc3683155e1a237820401df6f49cc88a Mon Sep 17 00:00:00 2001
From: Yarden Shoham
Date: Tue, 20 Feb 2024 12:37:37 +0200
Subject: [PATCH 115/807] Remove jQuery from repo wiki creation page (#29271)
- Switched to plain JavaScript
- Tested the wiki creation form functionality and it works as before
# Demo using JavaScript without jQuery
![action](https://github.com/go-gitea/gitea/assets/20454870/2dfc95fd-40cc-4ffb-9ae6-50f798fddd67)
---------
Signed-off-by: Yarden Shoham
Co-authored-by: silverwind
(cherry picked from commit ade1110e8b7d94dc142a259854e2b73845eab8b9)
---
.../js/features/comp/ComboMarkdownEditor.js | 16 +++---
web_src/js/features/repo-diff.js | 4 +-
web_src/js/features/repo-wiki.js | 56 ++++++++++---------
web_src/js/utils/dom.js | 12 ++++
4 files changed, 51 insertions(+), 37 deletions(-)
diff --git a/web_src/js/features/comp/ComboMarkdownEditor.js b/web_src/js/features/comp/ComboMarkdownEditor.js
index d486c5830a..d209f11ab2 100644
--- a/web_src/js/features/comp/ComboMarkdownEditor.js
+++ b/web_src/js/features/comp/ComboMarkdownEditor.js
@@ -2,7 +2,7 @@ import '@github/markdown-toolbar-element';
import '@github/text-expander-element';
import $ from 'jquery';
import {attachTribute} from '../tribute.js';
-import {hideElem, showElem, autosize} from '../../utils/dom.js';
+import {hideElem, showElem, autosize, isElemVisible} from '../../utils/dom.js';
import {initEasyMDEImagePaste, initTextareaImagePaste} from './ImagePaste.js';
import {handleGlobalEnterQuickSubmit} from './QuickSubmit.js';
import {renderPreviewPanelContent} from '../repo-editor.js';
@@ -14,17 +14,17 @@ let elementIdCounter = 0;
/**
* validate if the given textarea is non-empty.
- * @param {jQuery} $textarea
+ * @param {HTMLElement} textarea - The textarea element to be validated.
* @returns {boolean} returns true if validation succeeded.
*/
-export function validateTextareaNonEmpty($textarea) {
+export function validateTextareaNonEmpty(textarea) {
// When using EasyMDE, the original edit area HTML element is hidden, breaking HTML5 input validation.
// The workaround (https://github.com/sparksuite/simplemde-markdown-editor/issues/324) doesn't work with contenteditable, so we just show an alert.
- if (!$textarea.val()) {
- if ($textarea.is(':visible')) {
- $textarea.prop('required', true);
- const $form = $textarea.parents('form');
- $form[0]?.reportValidity();
+ if (!textarea.value) {
+ if (isElemVisible(textarea)) {
+ textarea.required = true;
+ const form = textarea.closest('form');
+ form?.reportValidity();
} else {
// The alert won't hurt users too much, because we are dropping the EasyMDE and the check only occurs in a few places.
showErrorToast('Require non-empty content');
diff --git a/web_src/js/features/repo-diff.js b/web_src/js/features/repo-diff.js
index 04dd153df2..85cb66c728 100644
--- a/web_src/js/features/repo-diff.js
+++ b/web_src/js/features/repo-diff.js
@@ -47,8 +47,8 @@ function initRepoDiffConversationForm() {
e.preventDefault();
const $form = $(e.target);
- const $textArea = $form.find('textarea');
- if (!validateTextareaNonEmpty($textArea)) {
+ const textArea = e.target.querySelector('textarea');
+ if (!validateTextareaNonEmpty(textArea)) {
return;
}
diff --git a/web_src/js/features/repo-wiki.js b/web_src/js/features/repo-wiki.js
index 58036fde37..d51bf35c81 100644
--- a/web_src/js/features/repo-wiki.js
+++ b/web_src/js/features/repo-wiki.js
@@ -1,50 +1,51 @@
-import $ from 'jquery';
import {initMarkupContent} from '../markup/content.js';
import {validateTextareaNonEmpty, initComboMarkdownEditor} from './comp/ComboMarkdownEditor.js';
import {fomanticMobileScreen} from '../modules/fomantic.js';
-
-const {csrfToken} = window.config;
+import {POST} from '../modules/fetch.js';
async function initRepoWikiFormEditor() {
- const $editArea = $('.repository.wiki .combo-markdown-editor textarea');
- if (!$editArea.length) return;
+ const editArea = document.querySelector('.repository.wiki .combo-markdown-editor textarea');
+ if (!editArea) return;
- const $form = $('.repository.wiki.new .ui.form');
- const $editorContainer = $form.find('.combo-markdown-editor');
+ const form = document.querySelector('.repository.wiki.new .ui.form');
+ const editorContainer = form.querySelector('.combo-markdown-editor');
let editor;
let renderRequesting = false;
let lastContent;
- const renderEasyMDEPreview = function () {
+ const renderEasyMDEPreview = async function () {
if (renderRequesting) return;
- const $previewFull = $editorContainer.find('.EasyMDEContainer .editor-preview-active');
- const $previewSide = $editorContainer.find('.EasyMDEContainer .editor-preview-active-side');
- const $previewTarget = $previewSide.length ? $previewSide : $previewFull;
- const newContent = $editArea.val();
- if (editor && $previewTarget.length && lastContent !== newContent) {
+ const previewFull = editorContainer.querySelector('.EasyMDEContainer .editor-preview-active');
+ const previewSide = editorContainer.querySelector('.EasyMDEContainer .editor-preview-active-side');
+ const previewTarget = previewSide || previewFull;
+ const newContent = editArea.value;
+ if (editor && previewTarget && lastContent !== newContent) {
renderRequesting = true;
- $.post(editor.previewUrl, {
- _csrf: csrfToken,
- mode: editor.previewMode,
- context: editor.previewContext,
- text: newContent,
- wiki: editor.previewWiki,
- }).done((data) => {
+ const formData = new FormData();
+ formData.append('mode', editor.previewMode);
+ formData.append('context', editor.previewContext);
+ formData.append('text', newContent);
+ formData.append('wiki', editor.previewWiki);
+ try {
+ const response = await POST(editor.previewUrl, {data: formData});
+ const data = await response.text();
lastContent = newContent;
- $previewTarget.html(`
${data}
`);
+ previewTarget.innerHTML = `
${data}
`;
initMarkupContent();
- }).always(() => {
+ } catch (error) {
+ console.error('Error rendering preview:', error);
+ } finally {
renderRequesting = false;
setTimeout(renderEasyMDEPreview, 1000);
- });
+ }
} else {
setTimeout(renderEasyMDEPreview, 1000);
}
};
renderEasyMDEPreview();
- editor = await initComboMarkdownEditor($editorContainer, {
+ editor = await initComboMarkdownEditor(editorContainer, {
useScene: 'wiki',
// EasyMDE has some problems of height definition, it has inline style height 300px by default, so we also use inline styles to override it.
// And another benefit is that we only need to write the style once for both editors.
@@ -64,9 +65,10 @@ async function initRepoWikiFormEditor() {
},
});
- $form.on('submit', () => {
- if (!validateTextareaNonEmpty($editArea)) {
- return false;
+ form.addEventListener('submit', (e) => {
+ if (!validateTextareaNonEmpty(editArea)) {
+ e.preventDefault();
+ e.stopPropagation();
}
});
}
diff --git a/web_src/js/utils/dom.js b/web_src/js/utils/dom.js
index 4dc55a518a..1f6066acab 100644
--- a/web_src/js/utils/dom.js
+++ b/web_src/js/utils/dom.js
@@ -226,3 +226,15 @@ export function initSubmitEventPolyfill() {
document.body.addEventListener('click', submitEventPolyfillListener);
document.body.addEventListener('focus', submitEventPolyfillListener);
}
+
+/**
+ * Check if an element is visible, equivalent to jQuery's `:visible` pseudo.
+ * Note: This function doesn't account for all possible visibility scenarios.
+ * @param {HTMLElement} element The element to check.
+ * @returns {boolean} True if the element is visible.
+ */
+export function isElemVisible(element) {
+ if (!element) return false;
+
+ return Boolean(element.offsetWidth || element.offsetHeight || element.getClientRects().length);
+}
From 6068537f8acc9cb410cd72b2c5b109292c2082ec Mon Sep 17 00:00:00 2001
From: silverwind
Date: Wed, 21 Feb 2024 01:05:17 +0100
Subject: [PATCH 116/807] Remove jQuery .map() and enable eslint rules for it
(#29272)
- Use case in `repo-commit` was tested until the point where the POST
request was sent with the same payload.
- Use case in `repo-legacy` was tested completely with comment editing.
- `jquery/no-fade` was disabled as well to stay in sync with
`no-jquery/no-fade`, had no violations.
(cherry picked from commit a5c570c1e02302212a5d8f7cf7d91f24ab0578d5)
---
.eslintrc.yaml | 6 +++---
web_src/js/features/repo-commit.js | 18 ++++++++----------
web_src/js/features/repo-legacy.js | 9 +++------
3 files changed, 14 insertions(+), 19 deletions(-)
diff --git a/.eslintrc.yaml b/.eslintrc.yaml
index ab9c218849..e9991c02ba 100644
--- a/.eslintrc.yaml
+++ b/.eslintrc.yaml
@@ -296,7 +296,7 @@ rules:
jquery/no-delegate: [2]
jquery/no-each: [0]
jquery/no-extend: [2]
- jquery/no-fade: [0]
+ jquery/no-fade: [2]
jquery/no-filter: [0]
jquery/no-find: [0]
jquery/no-global-eval: [2]
@@ -309,7 +309,7 @@ rules:
jquery/no-is-function: [2]
jquery/no-is: [0]
jquery/no-load: [2]
- jquery/no-map: [0]
+ jquery/no-map: [2]
jquery/no-merge: [2]
jquery/no-param: [2]
jquery/no-parent: [0]
@@ -451,7 +451,7 @@ rules:
no-jquery/no-load: [2]
no-jquery/no-map-collection: [0]
no-jquery/no-map-util: [2]
- no-jquery/no-map: [0]
+ no-jquery/no-map: [2]
no-jquery/no-merge: [2]
no-jquery/no-node-name: [2]
no-jquery/no-noop: [2]
diff --git a/web_src/js/features/repo-commit.js b/web_src/js/features/repo-commit.js
index 76b34d2077..fc70ba41e4 100644
--- a/web_src/js/features/repo-commit.js
+++ b/web_src/js/features/repo-commit.js
@@ -14,17 +14,15 @@ export function initRepoEllipsisButton() {
}
export function initRepoCommitLastCommitLoader() {
+ const notReadyEls = document.querySelectorAll('table#repo-files-table tr.notready');
+ if (!notReadyEls.length) return;
+
const entryMap = {};
-
- const entries = $('table#repo-files-table tr.notready')
- .map((_, v) => {
- entryMap[$(v).attr('data-entryname')] = $(v);
- return $(v).attr('data-entryname');
- })
- .get();
-
- if (entries.length === 0) {
- return;
+ const entries = [];
+ for (const el of notReadyEls) {
+ const entryname = el.getAttribute('data-entryname');
+ entryMap[entryname] = $(el);
+ entries.push(entryname);
}
const lastCommitLoaderURL = $('table#repo-files-table').data('lastCommitLoaderUrl');
diff --git a/web_src/js/features/repo-legacy.js b/web_src/js/features/repo-legacy.js
index ce1bff11a2..10ad836797 100644
--- a/web_src/js/features/repo-legacy.js
+++ b/web_src/js/features/repo-legacy.js
@@ -398,17 +398,14 @@ async function onEditContent(event) {
}
};
- const saveAndRefresh = (dz, $dropzone) => {
+ const saveAndRefresh = (dz) => {
showElem($renderContent);
hideElem($editContentZone);
- const $attachments = $dropzone.find('.files').find('[name=files]').map(function () {
- return $(this).val();
- }).get();
$.post($editContentZone.attr('data-update-url'), {
_csrf: csrfToken,
content: comboMarkdownEditor.value(),
context: $editContentZone.attr('data-context'),
- files: $attachments,
+ files: dz.files.map((file) => file.uuid),
}, (data) => {
if (!data.content) {
$renderContent.html($('#no-content').html());
@@ -452,7 +449,7 @@ async function onEditContent(event) {
});
$editContentZone.find('.save.button').on('click', (e) => {
e.preventDefault();
- saveAndRefresh(dz, $dropzone);
+ saveAndRefresh(dz);
});
} else {
comboMarkdownEditor = getComboMarkdownEditor($editContentZone.find('.combo-markdown-editor'));
From 1410079b98e8eedd7fae8a7ba33d5547e2a32ac8 Mon Sep 17 00:00:00 2001
From: GiteaBot
Date: Wed, 21 Feb 2024 00:23:41 +0000
Subject: [PATCH 117/807] [skip ci] Updated translations via Crowdin
(cherry picked from commit 69dbfbe4e52845a807302a15e8d79d183acf683b)
---
options/locale/locale_lv-LV.ini | 233 +++++++++++++++++++++++++++++---
1 file changed, 212 insertions(+), 21 deletions(-)
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index b69199e953..7dd7220b7a 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -18,10 +18,11 @@ template=Sagatave
language=Valoda
notifications=Paziņojumi
active_stopwatch=Aktīvā laika uzskaite
+tracked_time_summary=Izsekojamā laika apkopojums, kas ir balstīts uz pieteikumu saraksta atlasi
create_new=Izveidot…
user_profile_and_more=Profils un iestatījumi…
signed_in_as=Pieteicies kā
-enable_javascript=Šai lapas darbībai ir nepieciešams JavaScript.
+enable_javascript=Šai tīmekļvietnei ir nepieciešams JavaScript.
toc=Satura rādītājs
licenses=Licences
return_to_gitea=Atgriezties Forgejo
@@ -41,12 +42,12 @@ webauthn_sign_in=Nospiediet pogu uz drošības atslēgas. Ja tai nav pogas, izņ
webauthn_press_button=Nospiediet drošības atslēgas pogu…
webauthn_use_twofa=Izmantot divfaktoru kodu no tālruņa
webauthn_error=Nevar nolasīt drošības atslēgu.
-webauthn_unsupported_browser=Jūsu pārlūkprogramma neatbalsta WebAuthn standartu.
+webauthn_unsupported_browser=Jūsu pārlūks neatbalsta WebAuthn standartu.
webauthn_error_unknown=Notikusi nezināma kļūda. Atkārtojiet darbību vēlreiz.
-webauthn_error_insecure=WebAuthn atbalsta tikai drošus savienojumus ar serveri
-webauthn_error_unable_to_process=Serveris nevar apstrādāt Jūsu pieprasījumu.
+webauthn_error_insecure=`WebAuthn atbalsta tikai drošus savienojumus. Pārbaudīšanai ar HTTP var izmantot izcelsmi "localhost" vai "127.0.0.1"`
+webauthn_error_unable_to_process=Serveris nevarēja apstrādāt pieprasījumu.
webauthn_error_duplicated=Drošības atslēga nav atļauta šim pieprasījumam. Pārliecinieties, ka šī atslēga jau nav reģistrēta.
-webauthn_error_empty=Norādiet atslēgas nosaukumu.
+webauthn_error_empty=Jānorāda šīs atslēgas nosaukums.
webauthn_error_timeout=Iestājusies noildze, mēģinot, nolasīt atslēgu. Pārlādējiet lapu un mēģiniet vēlreiz.
webauthn_reload=Pārlādēt
@@ -61,11 +62,11 @@ new_org=Jauna organizācija
new_project=Jauns projekts
new_project_column=Jauna kolonna
manage_org=Pārvaldīt organizācijas
-admin_panel=Lapas administrēšana
+admin_panel=Vietnes administrēšana
account_settings=Konta iestatījumi
settings=Iestatījumi
your_profile=Profils
-your_starred=Atzīmēts ar zvaigznīti
+your_starred=Pievienots izlasē
your_settings=Iestatījumi
all=Visi
@@ -91,9 +92,11 @@ remove=Noņemt
remove_all=Noņemt visus
remove_label_str=`Noņemt ierakstu "%s"`
edit=Labot
+view=Skatīt
enabled=Iespējots
disabled=Atspējots
+locked=Slēgts
copy=Kopēt
copy_url=Kopēt saiti
@@ -132,6 +135,7 @@ concept_user_organization=Organizācija
show_timestamps=Rādīt laika zīmogus
show_log_seconds=Rādīt sekundes
show_full_screen=Atvērt pilnā logā
+download_logs=Lejupielādēt žurnālus
confirm_delete_selected=Apstiprināt, lai izdzēstu visus atlasītos vienumus?
@@ -172,6 +176,7 @@ string.desc=Z - A
[error]
occurred=Radusies kļūda
+report_message=Ja ir pārliecība, ka šī ir Gitea nepilnība, lūgums pārbaudīt GitHub, vai tā jau nav zināma, vai izveidot jaunu pieteikumu, ja nepieciešams.
missing_csrf=Kļūdains pieprasījums: netika iesūtīta drošības pilnvara
invalid_csrf=Kļūdains pieprasījums: iesūtīta kļūdaina drošības pilnvara
not_found=Pieprasītie dati netika atrasti.
@@ -180,6 +185,7 @@ network_error=Tīkla kļūda
[startpage]
app_desc=Viegli uzstādāms Git serviss
install=Vienkārši instalējams
+install_desc=Vienkārši jāpalaiž izpildāmais fails vajadzīgajai platformai, jāizmanto Docker, vai jāiegūst pakotne.
platform=Pieejama dažādām platformām
platform_desc=Forgejo iespējams uzstādīt jebkur, kam Go var nokompilēt: Windows, macOS, Linux, ARM utt. Izvēlies to, kas tev patīk!
lightweight=Viegla
@@ -224,6 +230,7 @@ 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=Operētājsistēms lietotājs, ar kuru tiks palaists Gitea. Jāņem vērā, ka šim lietotājam ir jābūt piekļuvei repozitorija atrašanās vietai.
domain=Servera domēns
domain_helper=Domēns vai servera adrese.
ssh_port=SSH servera ports
@@ -295,6 +302,8 @@ invalid_password_algorithm=Kļūdaina paroles jaucējfunkcija
password_algorithm_helper=Norādiet paroles jaucējalgoritmu. Algoritmi atšķirās pēc prasībām pret resursiem un stipruma. Argon2 algoritms ir drošs, bet tam nepieciešams daudz operatīvās atmiņas, līdz ar ko tas var nebūt piemērots sistēmām ar maz pieejamajiem resursiem.
enable_update_checker=Iespējot jaunu versiju paziņojumus
enable_update_checker_helper=Periodiski pārbaudīt jaunu version pieejamību, izgūstot datus no gitea.io.
+env_config_keys=Vides konfigurācija
+env_config_keys_prompt=Šie vides mainīgie tiks pielietoti arī konfigurācijas failā:
[home]
uname_holder=Lietotājvārds vai e-pasts
@@ -353,9 +362,11 @@ disable_register_prompt=Reģistrācija ir atspējota. Lūdzu, sazinieties ar vie
disable_register_mail=Reģistrācijas e-pasta apstiprināšana ir atspējota.
manual_activation_only=Sazinieties ar lapas administratoru, lai pabeigtu konta aktivizāciju.
remember_me=Atcerēties šo ierīci
+remember_me.compromised=Pieteikšanās pilnvara vairs nav derīga, kas var norādīt uz ļaunprātīgām darbībām kontā. Lūgums pārbaudīt, vai kontā nav neparastu darbību.
forgot_password_title=Aizmirsu paroli
forgot_password=Aizmirsi paroli?
sign_up_now=Nepieciešams konts? Reģistrējies tagad.
+sign_up_successful=Konts tika veiksmīgi izveidots. Laipni lūdzam!
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.
must_change_password=Mainīt paroli
allow_password_change=Pieprasīt lietotājam mainīt paroli (ieteicams)
@@ -371,6 +382,7 @@ email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu.
send_reset_mail=Nosūtīt paroles atjaunošanas e-pastu
reset_password=Paroles atjaunošana
invalid_code=Jūsu apstiprināšanas kodam ir beidzies derīguma termiņš vai arī tas ir nepareizs.
+invalid_code_forgot_password=Apliecinājuma kods ir nederīgs vai tā derīgums ir beidzies. Nospiediet šeit, lai uzsāktu jaunu sesiju.
invalid_password=Jūsu parole neatbilst parolei, kas tika ievadīta veidojot so kontu.
reset_password_helper=Atjaunot paroli
reset_password_wrong_user=Jūs esat pieteicies kā %s, bet konta atkopšanas saite ir paredzēta lietotājam %s
@@ -398,6 +410,7 @@ 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=Jāievada OpenID URI. Piemēram, anna.openid.example.org vai https://openid.example.org/anna.
disable_forgot_password_mail=Konta atjaunošana ir atspējota, jo nav uzstādīti e-pasta servera iestatījumi. Sazinieties ar lapas administratoru.
disable_forgot_password_mail_admin=Kontu atjaunošana ir pieejama tikai, ja ir veikta e-pasta servera iestatījumu konfigurēšana. Norādiet e-pasta servera iestatījumus, lai iespējotu kontu atjaunošanu.
email_domain_blacklisted=Nav atļauts reģistrēties ar šādu e-pasta adresi.
@@ -407,7 +420,9 @@ authorize_application_created_by=Šo lietotni izveidoja %s.
authorize_application_description=Ja piešķirsiet tiesības, tā varēs piekļūt un mainīt Jūsu konta informāciju, ieskaitot privātos repozitorijus un organizācijas.
authorize_title=Autorizēt "%s" piekļuvi jūsu kontam?
authorization_failed=Autorizācija neizdevās
+authorization_failed_desc=Autentifikācija neizdevās, jo tika veikts kļūdains pieprasījums. Sazinieties ar lietojumprogrammas, ar kuru mēģinājāt autentificēties, uzturētāju.
sspi_auth_failed=SSPI autentifikācija neizdevās
+password_pwned=Izvēlētā parole ir nozagto paroļu sarakstā, kas iepriekš ir atklāts publiskās datu noplūdēs. Lūgums mēģināt vēlreiz ar citu paroli un apsvērt to nomainīt arī citur.
password_pwned_err=Neizdevās pabeigt pieprasījumu uz HaveIBeenPwned
[mail]
@@ -422,6 +437,7 @@ activate_account.text_1=Sveiki %[1]s, esat reģistrējies %[2]s!
activate_account.text_2=Nospiediet uz saites, lai aktivizētu savu kontu lapā %s:
activate_email=Apstipriniet savu e-pasta adresi
+activate_email.title=%s, apstipriniet savu e-pasta adresi
activate_email.text=Nospiediet uz saites, lai apstiprinātu savu e-pasta adresi lapā %s:
register_notify=Laipni lūdzam Forgejo
@@ -620,6 +636,7 @@ webauthn=Drošības atslēgas
public_profile=Publiskais profils
biography_placeholder=Pastāsti mums mazliet par sevi! (Var izmantot Markdown)
location_placeholder=Kopīgot savu aptuveno atrašanās vietu ar citiem
+profile_desc=Norādīt, kā profils tiek attēlots citiem lietotājiem. Primārā e-pasta adrese tiks izmantota paziņojumiem, paroles atjaunošanai un Git tīmekļa darbībām.
password_username_disabled=Ne-lokāliem 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
@@ -631,6 +648,8 @@ update_language_not_found=Valoda "%s" nav pieejama.
update_language_success=Valoda tika nomainīta.
update_profile_success=Jūsu profila informācija tika saglabāta.
change_username=Lietotājvārds mainīts.
+change_username_prompt=Piezīme: lietotājvārda mainīšana maina arī konta URL.
+change_username_redirect_prompt=Iepriekšējais lietotājvārds tiks pārvirzīts, kamēr neviens cits to neizmanto.
continue=Turpināt
cancel=Atcelt
language=Valoda
@@ -655,6 +674,7 @@ comment_type_group_project=Projektus
comment_type_group_issue_ref=Problēmu atsauces
saved_successfully=Iestatījumi tika veiksmīgi saglabati.
privacy=Privātums
+keep_activity_private=Profila lapā paslēpt notikumus
keep_activity_private_popup=Savu aktivitāti redzēsiet tikai Jūs un administratori
lookup_avatar_by_mail=Meklēt profila bildes pēc e-pasta
@@ -664,12 +684,14 @@ 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.
+uploaded_avatar_is_too_big=Augšupielādētā faila izmērs (%d KiB) pārsniedz pieļaujamo izmēru (%d KiB).
update_avatar_success=Profila attēls tika saglabāts.
update_user_avatar_success=Lietotāja profila attēls tika atjaunots.
update_password=Mainīt paroli
old_password=Pašreizējā parole
new_password=Jauna parole
+retype_new_password=Apstiprināt jauno paroli
password_incorrect=Ievadīta nepareiza pašreizējā parole.
change_password_success=Parole tika veiksmīgi nomainīta. Tagad varat pieteikties ar jauno paroli.
password_change_disabled=Ārējie konti nevar mainīt paroli, izmantojot, Forgejo saskarni.
@@ -678,6 +700,7 @@ emails=E-pasta adreses
manage_emails=Pārvaldīt e-pasta adreses
manage_themes=Izvēlieties noklusējuma motīvu
manage_openid=Pārvaldīt OpenID adreses
+email_desc=Primārā e-pasta adrese tiks izmantota paziņojumiem, paroļu atjaunošanai un, ja tā nav paslēpta, Git tīmekļa darbībām.
theme_desc=Šis būs noklusējuma motīvs visiem lietotājiem.
primary=Primārā
activated=Aktivizēts
@@ -685,6 +708,7 @@ requires_activation=Nepieciešams aktivizēt
primary_email=Uzstādīt kā primāro
activate_email=Nosūtīt aktivizācijas e-pastu
activations_pending=Gaida aktivizāciju
+can_not_add_email_activations_pending=Ir nepabeigta aktivizācija. Pēc dažām minūtēm mēģiniet vēlreiz, ja ir vēlme pievienot jaunu e-pasta adresi.
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?
@@ -784,6 +808,7 @@ ssh_externally_managed=Šim lietotājam SSH atslēga tiek pāvaldīta attālinā
manage_social=Pārvaldīt piesaistītos sociālos kontus
social_desc=Šie sociālo tīklu konti var tikt izmantoti, lai pieteiktos. Pārliecinieties, ka visi ir atpazīstami.
unbind=Atsaistīt
+unbind_success=Sociālā tīkla konts tika veiksmīgi noņemts.
manage_access_token=Pārvaldīt piekļuves pilnvaras
generate_new_token=Izveidot jaunu pilnvaru
@@ -803,7 +828,9 @@ permissions_public_only=Tikai publiskie
permissions_access_all=Visi (publiskie, privātie un ierobežotie)
select_permissions=Norādiet tiesības
permission_no_access=Nav piekļuves
-permission_read=Izlasītie
+permission_read=Skatīšanās
+permission_write=Skatīšanās un raksīšanas
+access_token_desc=Atzīmētie pilnvaras apgabali ierobežo autentifikāciju tikai atbilstošiem API izsaukumiem. Sīkāka informācija pieejama dokumentācijā.
at_least_one_permission=Nepieciešams norādīt vismaz vienu tiesību, lai izveidotu pilnvaru
permissions_list=Tiesības:
@@ -815,6 +842,8 @@ remove_oauth2_application_desc=Noņemot OAuth2 lietotni, tiks noņemta piekļuve
remove_oauth2_application_success=Lietotne tika dzēsta.
create_oauth2_application=Izveidot jaunu OAuth2 lietotni
create_oauth2_application_button=Izveidot lietotni
+create_oauth2_application_success=Ir veiksmīgi izveidota jauna OAuth2 lietotne.
+update_oauth2_application_success=Ir veiksmīgi atjaunota OAuth2 lietotne.
oauth2_application_name=Lietotnes nosaukums
oauth2_confidential_client=Konfidenciāls klients. Norādiet lietotēm, kas glabā noslēpumu slepenībā, piemēram, tīmekļa lietotnēm. Nenorādiet instalējamām lietotnēm, tai skaitā darbavirsmas vai mobilajām lietotnēm.
oauth2_redirect_uris=Pārsūtīšanas URI. Norādiet katru URI savā rindā.
@@ -823,20 +852,26 @@ oauth2_client_id=Klienta ID
oauth2_client_secret=Klienta noslēpums
oauth2_regenerate_secret=Pārģenerēt noslēpumus
oauth2_regenerate_secret_hint=Pazaudēts noslēpums?
+oauth2_client_secret_hint=Pēc šīs lapas pamešanas vai atsvaidzināšanas noslēpums vairs netiks parādīts. Lūgums pārliecināties, ka tas ir saglabāts.
oauth2_application_edit=Labot
oauth2_application_create_description=OAuth2 lietotnes ļauj trešas puses lietotnēm piekļūt lietotāja kontiem šajā instancē.
+oauth2_application_remove_description=OAuth2 lietotnes noņemšana liegs tai piekļūt pilnvarotiem lietotāju kontiem šajā instancē. Vai turpināt?
+oauth2_application_locked=Gitea sāknēšanas brīdī reģistrē dažas OAuth2 lietotnes, ja tas ir iespējots konfigurācijā. Lai novērstu negaidītu uzvedību, tās nevar ne labot, ne noņemt. Lūgums vērsties OAuth2 dokumentācijā pēc vairāk informācijas.
authorized_oauth2_applications=Autorizētās OAuth2 lietotnes
+authorized_oauth2_applications_description=Ir ļauta piekļuve savam Gitea kontam šīm trešo pušu lietotnēm. Lūgums atsaukt piekļuvi lietotnēm, kas vairs nav nepieciešamas.
revoke_key=Atsaukt
revoke_oauth2_grant=Atsaukt piekļuvi
revoke_oauth2_grant_description=Atsaucot piekļuvi šai trešas puses lietotnei tiks liegta piekļuve Jūsu datiem. Vai turpināt?
revoke_oauth2_grant_success=Piekļuve veiksmīgi atsaukta.
twofa_desc=Divfaktoru autentifikācija uzlabo konta drošību.
+twofa_recovery_tip=Ja ierīce tiek pazaudēta, iespējams izmantot vienreiz izmantojamo atkopšanas atslēgu, lai atgūtu piekļuvi savam kontam.
twofa_is_enrolled=Kontam ir ieslēgta divfaktoru autentifikācija.
twofa_not_enrolled=Kontam šobrīd nav ieslēgta divfaktoru autentifikācija.
twofa_disable=Atslēgt divfaktoru autentifikāciju
twofa_scratch_token_regenerate=Ģenerēt jaunu vienreizējo kodu
+twofa_scratch_token_regenerated=Vienreizējā pilnvara tagad ir %s. Tā ir jāglabā drošā vietā, tā vairs nekad netiks rādīta.
twofa_enroll=Ieslēgt divfaktoru autentifikāciju
twofa_disable_note=Nepieciešamības gadījumā divfaktoru autentifikāciju ir iespējams atslēgt.
twofa_disable_desc=Atslēdzot divfaktoru autentifikāciju, konts vairs nebūs tik drošs. Vai turpināt?
@@ -854,6 +889,8 @@ webauthn_register_key=Pievienot drošības atslēgu
webauthn_nickname=Segvārds
webauthn_delete_key=Noņemt drošības atslēgu
webauthn_delete_key_desc=Noņemot drošības atslēgu ar to vairs nebūs iespējams pieteikties. Vai turpināt?
+webauthn_key_loss_warning=Ja tiek pazaudētas drošības atslēgas, tiks zaudēta piekļuve kontam.
+webauthn_alternative_tip=Ir vēlams uzstādīt papildu autentifikācijas veidu.
manage_account_links=Pārvaldīt saistītos kontus
manage_account_links_desc=Šādi ārējie konti ir piesaistīti Jūsu Forgejo kontam.
@@ -863,8 +900,10 @@ remove_account_link=Noņemt saistīto kontu
remove_account_link_desc=Noņemot saistīto kontu, tam tiks liegta piekļuve Jūsu Forgejo kontam. Vai turpināt?
remove_account_link_success=Saistītais konts tika noņemts.
+hooks.desc=Pievienot tīmekļa āķus, kas izpildīsies visos repozitorijos, kas jums pieder.
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.
@@ -885,8 +924,10 @@ visibility.public_tooltip=Redzams ikvienam
visibility.limited=Ierobežota
visibility.limited_tooltip=Redzams tikai autentificētiem lietotājiem
visibility.private=Privāts
+visibility.private_tooltip=Redzams tikai organizāciju, kurām esi pievienojies, dalībniekiem
[repo]
+new_repo_helper=Repozitorijs satur visus projekta failus, tajā skaitā izmaiņu vēsturi. Jau tiek glabāts kaut kur citur? Pārnest repozitoriju.
owner=Īpašnieks
owner_helper=Ņemot vērā maksimālā repozitoriju skaita ierobežojumu, ne visas organizācijas var tikt parādītas sarakstā.
repo_name=Repozitorija nosaukums
@@ -907,7 +948,9 @@ fork_from=Atdalīt no
already_forked=Repozitorijs %s jau ir atdalīts
fork_to_different_account=Atdalīt uz citu kontu
fork_visibility_helper=Atdalītam repozitorijam nav iespējams mainīt tā redzamību.
+fork_branch=Atzars, ko klonēt atdalītajā repozitorijā
all_branches=Visi atzari
+fork_no_valid_owners=Šim repozitorijam nevar izveidot atdalītu repozitoriju, jo tam nav spēkā esošu īpašnieku.
use_template=Izmantot šo sagatavi
clone_in_vsc=Atvērt VS Code
download_zip=Lejupielādēt ZIP
@@ -945,6 +988,8 @@ mirror_interval_invalid=Nekorekts spoguļošanas intervāls.
mirror_sync_on_commit=Sinhronizēt, kad revīzijas tiek iesūtītas
mirror_address=Spoguļa adrese
mirror_address_desc=Pieslēgšanās rekvizītus norādiet autorizācijas sadaļā.
+mirror_address_url_invalid=Norādītais URL ir nederīgs. Visas URL daļas ir jānorāda pareizi.
+mirror_address_protocol_invalid=Norādītais URL ir nederīgs. Var spoguļot tikai no http(s):// vai git:// adresēm.
mirror_lfs=Lielu failu glabātuve (LFS)
mirror_lfs_desc=Aktivizēt LFS datu spoguļošanu.
mirror_lfs_endpoint=LFS galapunkts
@@ -955,7 +1000,7 @@ mirror_password_blank_placeholder=(nav uzstādīts)
mirror_password_help=Nomainiet lietotāju, lai izdzēstu saglabāto paroli.
watchers=Novērotāji
stargazers=Zvaigžņdevēji
-stars_remove_warning=Tiks noņemtas visas atzīmētās zvaigznes šim repozitorijam.
+stars_remove_warning=Šis repozitorijs tiks noņemts no visām izlasēm.
forks=Atdalītie repozitoriji
reactions_more=un vēl %d
unit_disabled=Administrators ir atspējojies šo repozitorija sadaļu.
@@ -970,14 +1015,20 @@ delete_preexisting=Dzēst jau eksistējošos failus
delete_preexisting_content=Dzēst failus direktorijā %s
delete_preexisting_success=Dzēst nepārņemtos failus direktorijā %s
blame_prior=Aplūkot vainīgo par izmaiņām pirms šīs revīzijas
+blame.ignore_revs=Neņem vērā izmaiņas no .git-blame-ignore-revs. Nospiediet šeit, lai to apietu un redzētu visu izmaiņu skatu.
+blame.ignore_revs.failed=Neizdevās neņemt vērā izmaiņas no .git-blam-ignore-revs.
author_search_tooltip=Tiks attēloti ne vairāk kā 30 lietotāji
tree_path_not_found_commit=Revīzijā %[2]s neeksistē ceļš %[1]s
+tree_path_not_found_branch=Atzarā %[2]s nepastāv ceļš %[1]s
+tree_path_not_found_tag=Tagā %[2]s nepastāv ceļš %[1]s
transfer.accept=Apstiprināt īpašnieka maiņu
transfer.accept_desc=`Mainīt īpašnieku uz "%s"`
transfer.reject=Noraidīt īpašnieka maiņu
transfer.reject_desc=`Atcelt īpašnieka maiņu uz "%s"`
+transfer.no_permission_to_accept=Nav atļaujas pieņemt šo pārsūtīšanu.
+transfer.no_permission_to_reject=Nav atļaujas noraidīt šo pārsūtīšanu.
desc.private=Privāts
desc.public=Publisks
@@ -996,6 +1047,8 @@ template.issue_labels=Problēmu etiķetes
template.one_item=Norādiet vismaz vienu sagataves vienību
template.invalid=Norādiet sagataves repozitoriju
+archive.title=Šis repozitorijs ir arhivēts. Ir iespējams aplūkot tā failus un to konēt, bet nav iespējams iesūtīt izmaiņas, kā arī izveidot jaunas problēmas vai izmaiņu pieprasījumus.
+archive.title_date=Šis repozitorijs tika arhivēts %s. Ir iespējams aplūkot tā failus un to konēt, bet nav iespējams iesūtīt izmaiņas, kā arī izveidot jaunas problēmas vai izmaiņu pieprasījumus.
archive.issue.nocomment=Repozitorijs ir arhivēts. Problēmām nevar pievienot jaunus komentārus.
archive.pull.nocomment=Repozitorijs ir arhivēts. Izmaiņu pieprasījumiem nevar pievienot jaunus komentārus.
@@ -1012,6 +1065,7 @@ migrate_options_lfs=Migrēt LFS failus
migrate_options_lfs_endpoint.label=LFS galapunkts
migrate_options_lfs_endpoint.description=Migrācija mēģinās izmantot attālināto URL, lai noteiktu LFS serveri. Var norādīt arī citu galapunktu, ja repozitorija LFS dati ir izvietoti citā vietā.
migrate_options_lfs_endpoint.description.local=Iespējams norādīt arī servera ceļu.
+migrate_options_lfs_endpoint.placeholder=Ja nav norādīts, galamērķis tiks atvasināts no klonēšanas URL
migrate_items=Vienības, ko pārņemt
migrate_items_wiki=Vikivietni
migrate_items_milestones=Atskaites punktus
@@ -1062,11 +1116,11 @@ generated_from=ģenerēts no
fork_from_self=Nav iespējams atdalīt repozitoriju, kuram esat īpašnieks.
fork_guest_user=Piesakieties, lai atdalītu repozitoriju.
watch_guest_user=Piesakieties, lai sekotu šim repozitorijam.
-star_guest_user=Piesakieties, lai atzīmētu šo repozitoriju ar zvaigznīti.
+star_guest_user=Piesakieties, lai pievienotu šo repozitoriju izlasei.
unwatch=Nevērot
watch=Vērot
unstar=Noņemt zvaigznīti
-star=Pievienot zvaigznīti
+star=Pievienot izlasei
fork=Atdalīts
download_archive=Lejupielādēt repozitoriju
more_operations=Vairāk darbību
@@ -1114,6 +1168,10 @@ file_view_rendered=Skatīt rezultātu
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.
+invisible_runes_header=`Šīs fails satur neredzamus unikoda simbolus`
+invisible_runes_description=`Šis fails satur neredzamus unikoda simbolus, kas ir neatšķirami cilvēkiem, bet dators tās var atstrādāt atšķirīgi. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
+ambiguous_runes_header=`Šis fails satur neviennozīmīgus unikoda simbolus`
+ambiguous_runes_description=`Šis fails satur unikoda simbolus, kas var tikt sajauktas ar citām rakstzīmēm. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
invisible_runes_line=`Šī līnija satur neredzamus unikoda simbolus`
ambiguous_runes_line=`Šī līnija satur neviennozīmīgus unikoda simbolus`
ambiguous_character=`%[1]c [U+%04[1]X] var tikt sajaukts ar %[2]c [U+%04[2]X]`
@@ -1126,6 +1184,7 @@ video_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 video.
audio_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 audio.
stored_lfs=Saglabāts Git LFS
symbolic_link=Simboliska saite
+executable_file=Izpildāmais fails
commit_graph=Revīziju grafs
commit_graph.select=Izvēlieties atzarus
commit_graph.hide_pr_refs=Paslēpt izmaiņu pieprasījumus
@@ -1354,14 +1413,15 @@ issues.delete_branch_at=`izdzēsa atzaru %s %s`
issues.filter_label=Etiķete
issues.filter_label_exclude=`Izmantojiet alt + peles klikšķis vai enter, lai neiekļautu etiķeti`
issues.filter_label_no_select=Visas etiķetes
+issues.filter_label_select_no_label=Nav etiķetes
issues.filter_milestone=Atskaites punkts
issues.filter_milestone_all=Visi atskaites punkti
issues.filter_milestone_none=Nav atskaites punkta
issues.filter_milestone_open=Atvērtie atskaites punkti
issues.filter_milestone_closed=Aizvērtie atskaites punkti
-issues.filter_project=Projektus
+issues.filter_project=Projekts
issues.filter_project_all=Visi projekti
-issues.filter_project_none=Nav projektu
+issues.filter_project_none=Nav projekta
issues.filter_assignee=Atbildīgais
issues.filter_assginee_no_select=Visi atbildīgie
issues.filter_assginee_no_assignee=Nav atbildīgā
@@ -1387,6 +1447,7 @@ 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.keyword_search_unavailable=Meklēšana pēc atslēgvārda pašreiz nav pieejama. Lūgums sazināties ar vietnes administratoru.
issues.action_open=Atvērt
issues.action_close=Aizvērt
issues.action_label=Etiķete
@@ -1407,6 +1468,7 @@ issues.next=Nākamā
issues.open_title=Atvērta
issues.closed_title=Slēgta
issues.draft_title=Melnraksts
+issues.num_comments_1=%d komentārs
issues.num_comments=%d komentāri
issues.commented_at=`komentēja %s`
issues.delete_comment_confirm=Vai patiešām vēlaties dzēst šo komentāru?
@@ -1415,6 +1477,7 @@ issues.context.quote_reply=Atbildēt citējot
issues.context.reference_issue=Atsaukties uz šo jaunā problēmā
issues.context.edit=Labot
issues.context.delete=Dzēst
+issues.no_content=Nav sniegts apraksts.
issues.close=Slēgt problēmu
issues.comment_pull_merged_at=saplidināta revīzija %[1]s atzarā %[2]s %[3]s
issues.comment_manually_pull_merged_at=manuāli saplidināta revīzija %[1]s atzarā %[2]s %[3]s
@@ -1433,8 +1496,16 @@ issues.ref_closed_from=`aizvēra problēmu %[4]satkārtoti atvēra problēmu %[4]s%[2]s`
issues.ref_from=`no %[1]s`
issues.author=Autors
+issues.author_helper=Šis lietotājs ir autors.
issues.role.owner=Īpašnieks
-issues.role.member=Biedri
+issues.role.owner_helper=Šis lietotājs ir šī repozitorija īpašnieks.
+issues.role.member=Dalībnieks
+issues.role.member_helper=Šis lietotājs ir organizācijas, kurai pieder šis repozitorijs, dalībnieks.
+issues.role.collaborator=Līdzstrādnieks
+issues.role.collaborator_helper=Šis lietotājs ir uzaicināts līdzdarboties repozitorijā.
+issues.role.first_time_contributor=Pirmreizējs līdzradītājs
+issues.role.first_time_contributor_helper=Šis ir pirmais šī lietotāja ieguldījums šājā repozitorijā.
+issues.role.contributor=Līdzradītājs
issues.role.contributor_helper=Šis lietotājs repozitorijā ir iepriekš veicis labojumus.
issues.re_request_review=Pieprasīt atkārtotu recenziju
issues.is_stale=Šajā izmaiņu pieprasījumā ir notikušas izmaiņās, kopš veicāt tā recenziju
@@ -1450,6 +1521,9 @@ issues.label_title=Etiķetes nosaukums
issues.label_description=Etiķetes apraksts
issues.label_color=Etiķetes krāsa
issues.label_exclusive=Ekskluzīvs
+issues.label_archive=Arhīvēt etiķeti
+issues.label_archived_filter=Rādīt arhivētās etiķetes
+issues.label_archive_tooltip=Arhivētās etiķetes pēc noklusējuma netiek iekļautas ieteikumos, kad meklē pēc nosaukuma.
issues.label_exclusive_desc=Nosauciet etiķeti grupa/nosaukums, lai grupētu etiķētes un varētu norādīt tās kā ekskluzīvas ar citām grupa/ etiķetēm.
issues.label_exclusive_warning=Jebkura konfliktējoša ekskluzīvas grupas etiķete tiks noņemta, labojot pieteikumu vai izmaiņu pietikumu etiķetes.
issues.label_count=%d etiķetes
@@ -1504,6 +1578,7 @@ issues.tracking_already_started=`Jau ir uzsākta laika uzskaite par Pārbaudiet git āķus šim repozitorijam
@@ -1702,6 +1790,8 @@ pulls.status_checks_failure=Dažas pārbaudes neizdevās izpildīt
pulls.status_checks_error=Dažu pārbaužu izpildes laikā, radās kļūdas
pulls.status_checks_requested=Obligāts
pulls.status_checks_details=Papildu informācija
+pulls.status_checks_hide_all=Paslēpt visas pārbaudes
+pulls.status_checks_show_all=Parādīt visas pārbaudes
pulls.update_branch=Atjaunot atzaru, izmantojot, sapludināšanu
pulls.update_branch_rebase=Atjaunot atzaru, izmantojot, pārbāzēšanu
pulls.update_branch_success=Atzara atjaunināšana veiksmīgi pabeigta
@@ -1710,6 +1800,11 @@ pulls.outdated_with_base_branch=Atzars ir novecojis salīdzinot ar bāzes atzaru
pulls.close=Aizvērt izmaiņu pieprasījumu
pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu %[2]s`
pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu %[2]s`
+pulls.cmd_instruction_hint=`Apskatīt komandrindas izmantošanas norādes.`
+pulls.cmd_instruction_checkout_title=Paņemt
+pulls.cmd_instruction_checkout_desc=Projekta repozitorijā jāizveido jauns atzars un jāpārbauda izmaiņas.
+pulls.cmd_instruction_merge_title=Sapludināt
+pulls.cmd_instruction_merge_desc=Sapludināt izmaiņas un atjaunot tās Gitea.
pulls.clear_merge_message=Notīrīt sapludināšanas ziņojumu
pulls.clear_merge_message_hint=Notīrot sapludināšanas ziņojumu tiks noņemts tikai pats ziņojums, bet tiks paturēti ģenerētie git ziņojumu, kā "Co-Authored-By …".
@@ -1728,6 +1823,7 @@ pulls.auto_merge_canceled_schedule_comment=`atcēla automātisko sapludināšanu
pulls.delete.title=Dzēst šo izmaiņu pieprasījumu?
pulls.delete.text=Vai patiešām vēlaties dzēst šo izmaiņu pieprasījumu? (Neatgriezeniski tiks izdzēsts viss saturs. Apsveriet iespēju to aizvērt, ja vēlaties informāciju saglabāt vēsturei)
+pulls.recently_pushed_new_branches=Tu iesūtīji izmaiņas atzarā %[1]s %[2]s
pull.deleted_branch=(izdzēsts):%s
@@ -1737,6 +1833,7 @@ milestones.update_ago=Atjaunots %s
milestones.no_due_date=Bez termiņa
milestones.open=Atvērta
milestones.close=Aizvērt
+milestones.new_subheader=Atskaites punkti var palīdzēt pārvaldīt problēmas un sekot to virzībai.
milestones.completeness=%d%% pabeigti
milestones.create=Izveidot atskaites punktu
milestones.title=Virsraksts
@@ -1753,6 +1850,8 @@ milestones.edit_success=Izmaiņas atskaites punktā "%s" tika veiksmīgi saglab
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.earliest_due_data=Agrākais izpildes laiks
+milestones.filter_sort.latest_due_date=Vēlākais izpildes laiks
milestones.filter_sort.least_complete=Vismazāk pabeigtais
milestones.filter_sort.most_complete=Visvairāk pabeigtais
milestones.filter_sort.most_issues=Visvairāk problēmu
@@ -1769,6 +1868,7 @@ signing.wont_sign.parentsigned=Revīzija netiks parakstīta, jo nav parakstīta
signing.wont_sign.basesigned=Sapludināšanas revīzija netiks parakstīta, jo pamata revīzija nav parakstīta.
signing.wont_sign.headsigned=Sapludināšanas revīzija netiks parakstīta, jo galvenā revīzija nav parakstīta.
signing.wont_sign.commitssigned=Sapludināšana netiks parakstīta, jo visas saistītās revīzijas nav parakstītas.
+signing.wont_sign.approved=Sapludināšana netiks parakstīta, jo izmaiņu pieprasījums nav apstiprināts.
signing.wont_sign.not_signed_in=Jūs neesat pieteicies.
ext_wiki=Piekļuve ārējai vikivietnei
@@ -1899,6 +1999,7 @@ settings.mirror_settings.docs.disabled_push_mirror.info=Iesūtīšanas spoguļus
settings.mirror_settings.docs.no_new_mirrors=Šis repozitorijs spoguļo izmaiņas uz vai no cita repozitorija. Pašlaik vairāk nav iespējams izveidot jaunus spoguļa repozitorijus.
settings.mirror_settings.docs.can_still_use=Lai arī nav iespējams mainīt esošos vai izveidot jaunus spoguļa repozitorijus, esošie turpinās strādāt.
settings.mirror_settings.docs.pull_mirror_instructions=Lai ietatītu atvilkšanas spoguli, sekojiet instrukcijām:
+settings.mirror_settings.docs.more_information_if_disabled=Vairāk par piegādāšanas un saņemšanas spoguļiem var uzzināt šeit:
settings.mirror_settings.docs.doc_link_title=Kā spoguļot repozitorijus?
settings.mirror_settings.docs.doc_link_pull_section=dokumentācijas nodaļā "Pulling from a remote repository".
settings.mirror_settings.docs.pulling_remote_title=Atvilkt no attāla repozitorija
@@ -1910,8 +2011,11 @@ settings.mirror_settings.last_update=Pēdējās izmaiņas
settings.mirror_settings.push_mirror.none=Nav konfigurēts iesūtīšanas spogulis
settings.mirror_settings.push_mirror.remote_url=Git attālinātā repozitorija URL
settings.mirror_settings.push_mirror.add=Pievienot iesūtīšanas spoguli
+settings.mirror_settings.push_mirror.edit_sync_time=Labot spoguļa sinhronizācijas intervālu
settings.sync_mirror=Sinhronizēt tagad
+settings.pull_mirror_sync_in_progress=Pašlaik tiek saņemtas izmaiņas no attālā %s.
+settings.push_mirror_sync_in_progress=Pašlaik tiek piegādātas izmaiņas uz attālo %s.
settings.site=Mājas lapa
settings.update_settings=Mainīt iestatījumus
settings.update_mirror_settings=Atjaunot spoguļa iestatījumus
@@ -1978,6 +2082,7 @@ settings.transfer.rejected=Repozitorija īpašnieka maiņas pieprasījums tika n
settings.transfer.success=Repozitorija īpašnieka maiņa veiksmīga.
settings.transfer_abort=Atcelt īpašnieka maiņu
settings.transfer_abort_invalid=Nevar atcelt neeksistējoša repozitorija īpašnieka maiņu.
+settings.transfer_abort_success=Repozitorija īpašnieka maiņa uz %s tika veiksmīgi atcelta.
settings.transfer_desc=Mainīt šī repozitorija īpašnieku uz citu lietotāju vai organizāciju, kurai Jums ir administratora tiesības.
settings.transfer_form_title=Ievadiet repozitorija nosaukumu, lai apstiprinātu:
settings.transfer_in_progress=Pašlaik jau tiek veikta repozitorija īpašnieka maiņa. Atceliet iepriekšējo īpašnieka maiņu, ja vēlaties mainīt uz citu.
@@ -2002,12 +2107,12 @@ settings.trust_model.collaboratorcommitter=Līdzstrādnieka un revīzijas iesūt
settings.trust_model.collaboratorcommitter.long=Līdzstrādnieka un revīzijas iesūtītāja: Uzticēties līdzstrādnieku parakstiem, kas atbilst revīzijas iesūtītājam
settings.trust_model.collaboratorcommitter.desc=Derīgi līdzstrādnieku paraksti tiks atzīmēti kā "uzticami", ja tie atbilst revīzijas iesūtītājam, citos gadījumos tie tiks atzīmēti kā "neuzticami", ja paraksts atbilst revīzijas iesūtītajam, vai "nesakrītoši", ja neatbilst. Šis nozīmē, ka Forgejo būs kā revīzijas iesūtītājs parakstītām revīzijām, kur īstais revīzijas iesūtītājs tiks atīzmēts revīzijas komentāra beigās ar tekstu Co-Authored-By: un Co-Committed-By:. Noklusētajai Forgejo atslēgai ir jāatbilst lietotājam datubāzē.
settings.wiki_delete=Dzēst vikivietnes datus
-settings.wiki_delete_desc=Vikivietnes repozitorija dzēšana ir NEATGRIEZENISKA. Vai turpināt?
+settings.wiki_delete_desc=Vikivietnes repozitorija dzēšana ir neatgriezeniska un nav atsaucama.
settings.wiki_delete_notices_1=- Šī darbība dzēsīs un atspējos repozitorija %s vikivietni.
settings.confirm_wiki_delete=Dzēst vikivietnes datus
settings.wiki_deletion_success=Repozitorija vikivietnes dati tika izdzēsti.
settings.delete=Dzēst šo repozitoriju
-settings.delete_desc=Repozitorija dzēšana ir NEATGRIEZENISKA. Vai turpināt?
+settings.delete_desc=Repozitorija dzēšana ir neatgriezeniska un nav atsaucama.
settings.delete_notices_1=- Šī darbība ir NEATGRIEZENISKA.
settings.delete_notices_2=- Šī darbība neatgriezeniski izdzēsīs visu repozitorijā %s, tai skaitā problēmas, komentārus, vikivietni un līdzstrādnieku piesaisti.
settings.delete_notices_fork_1=- Visi atdalītie repozitoriju pēc dzēšanas kļūs neatkarīgi.
@@ -2044,12 +2149,14 @@ settings.webhook_deletion_desc=Noņemot tīmekļa āķi, tiks dzēsti visi tā i
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_desc_disabled=Lai pārbaudītu šo tīmekļa āķi ar neīstu notikumu, tas ir jāiespējo.
settings.webhook.request=Pieprasījums
settings.webhook.response=Atbilde
settings.webhook.headers=Galvenes
settings.webhook.payload=Saturs
settings.webhook.body=Saturs
settings.webhook.replay.description=Izpildīt atkārtoti šo tīmekļa āķi.
+settings.webhook.replay.description_disabled=Lai atkārtoti izpildītu šo tīmekļa āķi, tas ir jāiespējo.
settings.webhook.delivery.success=Notikums tika veiksmīgi pievienots piegādes rindai. Var paiet vairākas sekundes līdz tas parādās piegādes vēsturē.
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.
@@ -2250,16 +2357,23 @@ settings.tags.protection.none=Nav uzstādīta tagu aizsargāšana.
settings.tags.protection.pattern.description=Var izmantot vienkāršu nosaukumu vai glob šablonu, vai regulāro izteiksmi, lai atbilstu vairākiem tagiem. Vairāk ir lasāms aizsargāto tagu šablonu dokumentācijā.
settings.bot_token=Bota pilnvara
settings.chat_id=Tērzēšanas ID
+settings.thread_id=Pavediena ID
settings.matrix.homeserver_url=Mājas servera URL
settings.matrix.room_id=Istabas ID
settings.matrix.message_type=Ziņas veids
settings.archive.button=Arhivēt
settings.archive.header=Arhivēt repozitoriju
+settings.archive.text=Repozitorija arhivēšana padarīs to tikai lasāmu. Tas nebūs redzams infopanelī. Neviens nevarēs izveidot jaunas revīzijas vai atvērt jaunus problēmu pieteikumus vai izmaiņu pieprasījumus.
settings.archive.success=Repozitorijs veiksmīgi arhivēts.
settings.archive.error=Arhivējot repozitoriju radās neparedzēta kļūda. Pārbaudiet kļūdu žurnālu, lai uzzinātu sīkāk.
settings.archive.error_ismirror=Nav iespējams arhivēt spoguļotus repozitorijus.
settings.archive.branchsettings_unavailable=Atzaru iestatījumi nav pieejami, ja repozitorijs ir arhivēts.
settings.archive.tagsettings_unavailable=Tagu iestatījumi nav pieejami, ja repozitorijs ir arhivēts.
+settings.unarchive.button=Atcelt repozitorija arhivēšanu
+settings.unarchive.header=Atcelt šī repozitorija arhivēšanu
+settings.unarchive.text=Repozitorija arhivēšanas atcelšana atjaunos tā spēju saņemt izmaiņas, kā arī jaunus problēmu pieteikumus un izmaiņu pieprasījumus.
+settings.unarchive.success=Repozitorijam veiksmīgi atcelta arhivācija.
+settings.unarchive.error=Repozitorija arhivēšanas atcelšanas laikā atgadījās kļūda. Vairāk ir redzams žurnālā.
settings.update_avatar_success=Repozitorija attēls tika atjaunināts.
settings.lfs=LFS
settings.lfs_filelist=LFS faili, kas saglabāti šajā repozitorijā
@@ -2326,6 +2440,7 @@ diff.show_more=Rādīt vairāk
diff.load=Ielādēt izmaiņas
diff.generated=ģenerēts
diff.vendored=ārējs
+diff.comment.add_line_comment=Pievienot rindas komentāru
diff.comment.placeholder=Ievadiet komentāru
diff.comment.markdown_info=Tiek atbalstīta formatēšana ar Markdown.
diff.comment.add_single_comment=Pievienot vienu komentāru
@@ -2382,6 +2497,7 @@ release.edit_release=Labot laidienu
release.delete_release=Dzēst laidienu
release.delete_tag=Dzēst tagu
release.deletion=Dzēst laidienu
+release.deletion_desc=Laidiena izdzēšana tikai noņem to no Gitea. Tā neietekmēs Git tagu, repozitorija saturu vai vēsturi. Vai turpināt?
release.deletion_success=Laidiens tika izdzēsts.
release.deletion_tag_desc=Tiks izdzēsts tags no repozitorija. Repozitorija saturs un vēsture netiks mainīta. Vai turpināt?
release.deletion_tag_success=Tags tika izdzēsts.
@@ -2401,6 +2517,7 @@ 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. Kaut arī izdzēstais zars neilgu laiku var turpināt pastāvēt, pirms tas tiešām tiek noņemts, to vairumā gadījumu NEVAR atsaukt. 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.
@@ -2441,6 +2558,7 @@ tag.create_success=Tags "%s" tika izveidots.
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ēmai jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un punktus ('.') un var būt līdz 35 rakstzīmēm gara. Burtiem jābūt mazajiem.
find_file.go_to_file=Iet uz failu
find_file.no_matching=Atbilstošs fails netika atrasts
@@ -2479,6 +2597,7 @@ 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.email=E-pasta adrese saziņai
settings.website=Mājas lapa
settings.location=Atrašanās vieta
settings.permission=Tiesības
@@ -2492,6 +2611,7 @@ settings.visibility.private_shortname=Privāta
settings.update_settings=Mainīt iestatījumus
settings.update_setting_success=Organizācijas iestatījumi tika saglabāti.
+settings.change_orgname_prompt=Piezīme: organizācijas nosaukuma maiņa izmainīs arī organizācijas URL un atbrīvos veco nosaukumu.
settings.change_orgname_redirect_prompt=Vecais vārds pārsūtīs uz jauno, kamēr vien tas nebūs izmantots.
settings.update_avatar_success=Organizācijas attēls tika saglabāts.
settings.delete=Dzēst organizāciju
@@ -2511,7 +2631,7 @@ members.private=Slēpts
members.private_helper=padarīt redzemu
members.member_role=Dalībnieka loma:
members.owner=Īpašnieks
-members.member=Biedri
+members.member=Dalībnieks
members.remove=Noņemt
members.remove.detail=Noņemt lietotāju %[1]s no organizācijas %[2]s?
members.leave=Atstāt
@@ -2567,15 +2687,19 @@ teams.all_repositories_helper=Šai komandai ir piekļuve visiem repozitorijiem.
teams.all_repositories_read_permission_desc=Šī komanda piešķirt skatīšanās tiesības visiem repozitorijiem: komandas biedri var skatīties un klonēt visus organizācijas repozitorijus.
teams.all_repositories_write_permission_desc=Šī komanda piešķirt labošanas tiesības visiem repozitorijiem: komandas biedri var skatīties un nosūtīt izmaiņas visiem organizācijas repozitorijiem.
teams.all_repositories_admin_permission_desc=Šī komanda piešķirt administratora tiesības visiem repozitorijiem: komandas biedri var skatīties, nosūtīt izmaiņas un mainīt iestatījumus visiem organizācijas repozitorijiem.
+teams.invite.title=Tu esi uzaicināts pievienoties organizācijas %[2]s komandai %[1]s.
teams.invite.by=Uzaicināja %s
teams.invite.description=Nospiediet pogu zemāk, lai pievienotos komandai.
[admin]
dashboard=Infopanelis
+identity_access=Identitāte un piekļuve
users=Lietotāju konti
organizations=Organizācijas
+assets=Koda aktīvi
repositories=Repozitoriji
hooks=Tīmekļa āķi
+integrations=Integrācijas
authentication=Autentificēšanas avoti
emails=Lietotāja e-pasts
config=Konfigurācija
@@ -2584,6 +2708,7 @@ monitor=Uzraudzība
first_page=Pirmā
last_page=Pēdējā
total=Kopā: %d
+settings=Administratora iestatījumi
dashboard.new_version_hint=Ir pieejama Forgejo versija %s, pašreizējā versija %s. Papildus informācija par jauno versiju ir pieejama mājas lapā.
dashboard.statistic=Kopsavilkums
@@ -2596,11 +2721,13 @@ 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.task.started=Uzsākts uzdevums: %[1]s
dashboard.task.process=Uzdevums: %[1]s
+dashboard.task.cancelled=Uzdevums: %[1]s atcelts: %[3]s
dashboard.task.error=Kļūda uzdevuma izpildē: %[1]s: %[3]s
dashboard.task.finished=Uzdevums: %[1]s, ko iniciēja %[2]s ir izpildīts
dashboard.task.unknown=Nezināms uzdevums: %[1]s
dashboard.cron.started=Uzsākts Cron: %[1]s
dashboard.cron.process=Cron: %[1]s
+dashboard.cron.cancelled=Cron: %[1]s atcelts: %[3]s
dashboard.cron.error=Kļūda Cron: %s: %[3]s
dashboard.cron.finished=Cron: %[1]s pabeigts
dashboard.delete_inactive_accounts=Dzēst visus neaktivizētos kontus
@@ -2610,6 +2737,7 @@ dashboard.delete_repo_archives.started=Uzdevums visu repozitoriju arhīvu dzēš
dashboard.delete_missing_repos=Dzēst visus repozitorijus, kam trūkst Git failu
dashboard.delete_missing_repos.started=Uzdevums visu repozitoriju dzēšanai, kam trūkst git failu, uzsākts.
dashboard.delete_generated_repository_avatars=Dzēst ģenerētos repozitoriju attēlus
+dashboard.sync_repo_branches=Sinhronizācija ar dabubāzi izlaida atzarus no git datiem
dashboard.update_mirrors=Atjaunot spoguļus
dashboard.repo_health_check=Pārbaudīt visu repozitoriju veselību
dashboard.check_repo_stats=Pārbaudīt visu repozitoriju statistiku
@@ -2624,6 +2752,7 @@ dashboard.reinit_missing_repos=Atkārtoti inicializēt visus pazaudētos Git rep
dashboard.sync_external_users=Sinhronizēt ārējo lietotāju datus
dashboard.cleanup_hook_task_table=Iztīrīt tīmekļa āķu vēsturi
dashboard.cleanup_packages=Notīrīt novecojušās pakotnes
+dashboard.cleanup_actions=Notīrīt darbību izbeigušos žurnālus un artefaktus
dashboard.server_uptime=Servera darbības laiks
dashboard.current_goroutine=Izmantotās Gorutīnas
dashboard.current_memory_usage=Pašreiz izmantotā atmiņa
@@ -2661,7 +2790,9 @@ dashboard.gc_lfs=Veikt atkritumu uzkopšanas darbus LFS meta objektiem
dashboard.stop_zombie_tasks=Apturēt zombija uzdevumus
dashboard.stop_endless_tasks=Apturēt nepārtrauktus uzdevumus
dashboard.cancel_abandoned_jobs=Atcelt pamestus darbus
+dashboard.start_schedule_tasks=Sākt plānotos uzdevumus
dashboard.sync_branch.started=Sākta atzaru sinhronizācija
+dashboard.rebuild_issue_indexer=Pārbūvēt problēmu indeksu
users.user_manage_panel=Lietotāju kontu pārvaldība
users.new_account=Izveidot lietotāja kontu
@@ -2670,6 +2801,9 @@ users.full_name=Vārds, uzvārds
users.activated=Aktivizēts
users.admin=Administrators
users.restricted=Ierobežots
+users.reserved=Aizņemts
+users.bot=Bots
+users.remote=Attāls
users.2fa=2FA
users.repos=Repozitoriji
users.created=Izveidots
@@ -2716,6 +2850,7 @@ users.list_status_filter.is_prohibit_login=Nav atļauta autorizēšanās
users.list_status_filter.not_prohibit_login=Atļaut autorizāciju
users.list_status_filter.is_2fa_enabled=2FA iespējots
users.list_status_filter.not_2fa_enabled=2FA nav iespējots
+users.details=Lietotāja informācija
emails.email_manage_panel=Lietotāju e-pastu pārvaldība
emails.primary=Primārais
@@ -2728,6 +2863,7 @@ emails.updated=E-pasts atjaunots
emails.not_updated=Neizdevās atjaunot pieprasīto e-pasta adresi: %v
emails.duplicate_active=E-pasta adrese jau ir aktīva citam lietotājam.
emails.change_email_header=Atjaunot e-pasta rekvizītus
+emails.change_email_text=Vai patiešām vēlaties atjaunot šo e-pasta adresi?
orgs.org_manage_panel=Organizāciju pārvaldība
orgs.name=Nosaukums
@@ -2742,14 +2878,17 @@ repos.owner=Īpašnieks
repos.name=Nosaukums
repos.private=Privāts
repos.watches=Vērošana
-repos.stars=Atzīmētās zvaigznītes
+repos.stars=Zvaigznes
repos.forks=Atdalītie
repos.issues=Problēmas
repos.size=Izmērs
+repos.lfs_size=LFS izmērs
packages.package_manage_panel=Pakotņu pārvaldība
packages.total_size=Kopējais izmērs: %s
packages.unreferenced_size=Izmērs bez atsauces: %s
+packages.cleanup=Notīrīt novecojušos datus
+packages.cleanup.success=Novecojuši dati veiksmīgi notīrīti
packages.owner=Īpašnieks
packages.creator=Izveidotājs
packages.name=Nosaukums
@@ -2760,10 +2899,12 @@ packages.size=Izmērs
packages.published=Publicēts
defaulthooks=Noklusētie tīmekļa āķi
+defaulthooks.desc=Tīmekļa āķi automātiski nosūta HTTP POST pieprasījumus serverim, kad iestājas noteikti Gitea notikumi. Šeit pievienotie tīmekļa āķi ir noklusējuma, un tie tiks pievienoti visiem jaunajiem repozitorijiem. Vairāk ir lasāms tīmekļa āķu dokumentācijā.
defaulthooks.add_webhook=Pievienot noklusēto tīmekļa āķi
defaulthooks.update_webhook=Mainīt noklusēto tīmekļa āķi
systemhooks=Sistēmas tīmekļa āķi
+systemhooks.desc=Tīmekļa āķi automātiski nosūta HTTP POST pieprasījumus serverim, kad iestājas noteikti Gitea notikumi. Šeit pievienotie tīmekļa āķi tiks izsaukti visiem sistēmas repozitorijiem, tādēļ lūgums apsvērt to iespējamo ietekmi uz veiktspēju. Vairāk ir lasāms tīmekļa āķu dokumentācijā.
systemhooks.add_webhook=Pievienot sistēmas tīmekļa āķi
systemhooks.update_webhook=Mainīt sistēmas tīmekļa āķi
@@ -2856,6 +2997,7 @@ auths.sspi_default_language=Noklusētā lietotāja valoda
auths.sspi_default_language_helper=Noklusētā valoda, ko uzstādīt automātiski izveidotajiem lietotājiem, kas izmanto SSPI autentifikācijas veidu. Atstājiet tukšu, ja vēlaties, lai valoda tiktu noteikta automātiski.
auths.tips=Padomi
auths.tips.oauth2.general=OAuth2 autentifikācija
+auths.tips.oauth2.general.tip=Kad tiek reģistrēta jauna OAuth2 autentifikācija, atzvanīšanas/pārvirzīšanas URL vajadzētu būt:
auths.tip.oauth2_provider=OAuth2 pakalpojuma sniedzējs
auths.tip.bitbucket=Reģistrējiet jaunu OAuth klientu adresē https://bitbucket.org/account/user//oauth-consumers/new un piešķiriet tam "Account" - "Read" tiesības
auths.tip.nextcloud=`Reģistrējiet jaunu OAuth klientu jūsu instances sadāļā "Settings -> Security -> OAuth 2.0 client"`
@@ -2867,6 +3009,7 @@ auths.tip.google_plus=Iegūstiet OAuth2 klienta pilnvaru no Google API konsoles
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 lietotni un pārliecinieties, ka ir atzīmēts “Allow this application to be used to Sign in with Twitter”
auths.tip.discord=Reģistrējiet jaunu aplikāciju adresē https://discordapp.com/developers/applications/me
+auths.tip.gitea=Pievienot jaunu OAuth2 lietojumprogrammu. Dokumentācija ir pieejama https://docs.gitea.com/development/oauth2-provider
auths.tip.yandex=`Izveidojiet jaunu lietotni adresē https://oauth.yandex.com/client/new. Izvēlieties sekojošas tiesības "Yandex.Passport API" sadaļā: "Access to email address", "Access to user avatar" un "Access to username, first name and surname, gender"`
auths.tip.mastodon=Norādiet pielāgotu mastodon instances URL, ar kuru vēlaties autorizēties (vai izmantojiet noklusēto)
auths.edit=Labot autentifikācijas avotu
@@ -2896,6 +3039,7 @@ 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.app_data_path=Lietotnes datu ceļš
config.repo_root_path=Repozitoriju glabāšanas vieta
config.lfs_root_path=LFS saknes ceļš
config.log_file_root_path=Žurnalizēšanas ceļš
@@ -3045,8 +3189,10 @@ monitor.queue.name=Nosaukums
monitor.queue.type=Veids
monitor.queue.exemplar=Eksemplāra veids
monitor.queue.numberworkers=Strādņu skaits
+monitor.queue.activeworkers=Darbojošies strādņi
monitor.queue.maxnumberworkers=Maksimālais strādņu skaits
monitor.queue.numberinqueue=Skaits rindā
+monitor.queue.review_add=Pārskatīt/pievienot strādņus
monitor.queue.settings.title=Pūla iestatījumi
monitor.queue.settings.desc=Pūls dinamiski tiek palielināts atkarībā no bloķētiem darbiem rindā.
monitor.queue.settings.maxnumberworkers=Maksimālais strādņu skaits
@@ -3102,7 +3248,7 @@ publish_release=`izveidoja versiju "%[4]s" repozitorijā <
review_dismissed=`noraidīja lietotāja %[4]s recenziju izmaiņu pieprasījumam %[3]s#%[2]s`
review_dismissed_reason=Iemesls:
create_branch=izveidoja atzaru %[3]s repozitorijā %[4]s
-starred_repo=atzīmēja ar zvaigznīti %[2]s
+starred_repo=pievienoja izlasē %[2]s
watched_repo=sāka sekot %[2]s
[tool]
@@ -3167,6 +3313,7 @@ desc=Pārvaldīt repozitorija pakotnes.
empty=Pašlaik šeit nav nevienas pakotnes.
empty.documentation=Papildus informācija par pakotņu reģistru pieejama dokumentācijā.
empty.repo=Neparādās augšupielādēta pakotne? Apmeklējiet pakotņu iestatījumus, lai sasaistītu ar repozitoriju.
+registry.documentation=Vairāk informācija par %s reģistru ir pieejama dokumentācijā.
filter.type=Veids
filter.type.all=Visas
filter.no_result=Pēc norādītajiem kritērijiem nekas netika atrasts.
@@ -3252,6 +3399,8 @@ pub.install=Lai instalētu Dart pakotni, izpildiet sekojošu komandu:
pypi.requires=Nepieciešams Python
pypi.install=Lai instalētu pip pakotni, izpildiet sekojošu komandu:
rpm.registry=Konfigurējiet šo reģistru no komandrindas:
+rpm.distros.redhat=uz RedHat balstītās operētājsistēmās
+rpm.distros.suse=uz SUSE balstītās operētājsistēmās
rpm.install=Lai uzstādītu pakotni, ir jāizpilda šī komanda:
rubygems.install=Lai instalētu gem pakotni, izpildiet sekojošu komandu:
rubygems.install2=vai pievienojiet Gemfile:
@@ -3276,14 +3425,17 @@ settings.delete.success=Pakotne tika izdzēsta.
settings.delete.error=Neizdevās izdzēst pakotni.
owner.settings.cargo.title=Cargo reģistra inkdess
owner.settings.cargo.initialize=Inicializēt indeksu
+owner.settings.cargo.initialize.description=Ir nepieciešams īpašs indeksa Git repozitorijs, lai izmantotu Cargo reģistru. Šīs iespējas izmantošana (atkārtoti) izveidos repozitoriju un automātiski to iestatīs.
owner.settings.cargo.initialize.error=Neizdevās inicializēt Cargo indeksu: %v
owner.settings.cargo.initialize.success=Cargo indekss tika veiksmīgi inicializēts.
owner.settings.cargo.rebuild=Pārbūvēt indeksu
+owner.settings.cargo.rebuild.description=Pārbūvēšana var būt noderīga, ja indekss nav sinhronizēts ar saglabātajām Cargo pakotnēm.
owner.settings.cargo.rebuild.error=Neizdevās pārbūvēt Cargo indeksu: %v
owner.settings.cargo.rebuild.success=Cargo indekss tika veiksmīgi pārbūvēts.
owner.settings.cleanuprules.title=Pārvaldīt notīrīšanas noteikumus
owner.settings.cleanuprules.add=Pievienot notīrīšanas noteikumu
owner.settings.cleanuprules.edit=Labot notīrīšanas noteikumu
+owner.settings.cleanuprules.none=Nav pievienoti tīrīšanas noteikumi. Sīkāku informāciju iespējams iegūt dokumentācijā.
owner.settings.cleanuprules.preview=Notīrīšānas noteikuma priekšskatījums
owner.settings.cleanuprules.preview.overview=Ir ieplānota %d paku dzēšana.
owner.settings.cleanuprules.preview.none=Notīrīšanas noteikumam neatbilst neviena pakotne.
@@ -3302,6 +3454,7 @@ owner.settings.cleanuprules.success.update=Notīrīšanas noteikumi tika atjauno
owner.settings.cleanuprules.success.delete=Notīrīšanas noteikumi tika izdzēsti.
owner.settings.chef.title=Chef reģistrs
owner.settings.chef.keypair=Ģenerēt atslēgu pāri
+owner.settings.chef.keypair.description=Atslēgu pāris ir nepieciešams, lai autentificētos Chef reģistrā. Ja iepriekš ir izveidots atslēgu pāris, jauna pāra izveidošana veco atslēgu pāri padarīs nederīgu.
[secrets]
secrets=Noslēpumi
@@ -3328,6 +3481,7 @@ status.waiting=Gaida
status.running=Izpildās
status.success=Pabeigts
status.failure=Neveiksmīgs
+status.cancelled=Atcelts
status.skipped=Izlaists
status.blocked=Bloķēts
@@ -3340,11 +3494,12 @@ runners.id=ID
runners.name=Nosaukums
runners.owner_type=Veids
runners.description=Apraksts
-runners.labels=Etiķetes
+runners.labels=Iezīmes
runners.last_online=Pēdējo reizi tiešsaistē
runners.runner_title=Izpildītājs
runners.task_list=Pēdējās darbības, kas izpildītas
-runners.task_list.run=Palaist
+runners.task_list.no_tasks=Vēl nav uzdevumu.
+runners.task_list.run=Izpildīt
runners.task_list.status=Statuss
runners.task_list.repository=Repozitorijs
runners.task_list.commit=Revīzija
@@ -3364,18 +3519,49 @@ runners.status.idle=Dīkstāvē
runners.status.active=Aktīvs
runners.status.offline=Bezsaistē
runners.version=Versija
+runners.reset_registration_token=Atiestatīt reģistrācijas pilnvaru
runners.reset_registration_token_success=Izpildītāja reģistrācijas pilnvara tika veiksmīgi atiestatīta
runs.all_workflows=Visas darbaplūsmas
runs.commit=Revīzija
+runs.scheduled=Ieplānots
+runs.pushed_by=iesūtīja
runs.invalid_workflow_helper=Darbaplūsmas konfigurācijas fails ir kļūdains. Pārbaudiet konfiugrācijas failu: %s
+runs.no_matching_online_runner_helper=Nav pieejami izpildītāji, kas atbilstu šai iezīmei: %s
+runs.actor=Aktors
runs.status=Statuss
+runs.actors_no_select=Visi aktori
+runs.status_no_select=Visi stāvokļi
+runs.no_results=Netika atrasts nekas atbilstošs.
+runs.no_workflows=Vēl nav nevienas darbplūsmas.
+runs.no_workflows.quick_start=Nav skaidrs, kā sākt izmantot Gitea darbības? Skatīt ātrās sākšanas norādes.
+runs.no_workflows.documentation=Vairāk informācijas par Gitea darbībām ir skatāma dokumentācijā.
+runs.no_runs=Darbplūsmai vēl nav nevienas izpildes.
runs.empty_commit_message=(tukšs revīzijas ziņojums)
+workflow.disable=Atspējot darbplūsmu
+workflow.disable_success=Darbplūsma '%s' ir veiksmīgi atspējota.
+workflow.enable=Iespējot darbplūsmu
+workflow.enable_success=Darbplūsma '%s' ir veiksmīgi iespējota.
+workflow.disabled=Darbplūsma ir atspējota.
need_approval_desc=Nepieciešams apstiprinājums, lai izpildītu izmaiņu pieprasījumu darbaplūsmas no atdalītiem repozitorijiem.
+variables=Mainīgie
+variables.management=Mainīgo pārvaldība
+variables.creation=Pievienot mainīgo
+variables.none=Vēl nav neviena mainīgā.
+variables.deletion=Noņemt mainīgo
+variables.deletion.description=Mainīgā noņemšana ir neatgriezeniska un nav atsaucama. Vai turpināt?
+variables.description=Mainīgie tiks padoti noteiktām darbībām, un citādāk tos nevar nolasīt.
variables.id_not_exist=Mainīgais ar identifikatoru %d neeksistē.
+variables.edit=Labot mainīgo
+variables.deletion.failed=Neizdevās noņemt mainīgo.
+variables.deletion.success=Mainīgais tika noņemts.
+variables.creation.failed=Neizdevās pievienot mainīgo.
+variables.creation.success=Mainīgais "%s" tika pievienots.
+variables.update.failed=Neizdevās labot mainīgo.
+variables.update.success=Mainīgais tika labots.
[projects]
type-1.display_name=Individuālais projekts
@@ -3383,6 +3569,11 @@ type-2.display_name=Repozitorija projekts
type-3.display_name=Organizācijas projekts
[git.filemode]
+changed_filemode=%[1]s → %[2]s
; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", …
+directory=Direktorija
+normal_file=Parasts fails
+executable_file=Izpildāmais fails
symbolic_link=Simboliska saite
+submodule=Apakšmodulis
From f803c5c0f41d74bd30c1543c31a4b144adb8f1ae Mon Sep 17 00:00:00 2001
From: DC <106393991+DanielMatiasCarvalho@users.noreply.github.com>
Date: Wed, 21 Feb 2024 01:55:26 +0000
Subject: [PATCH 118/807] Update Discord logo (#29285)
Fixes #27057 by changing the discord .svg file and running `make svg`.
Before:
After:
(cherry picked from commit 3d3c3d9ee5e934c515370d98f1c552ca8ef10f8a)
---
public/assets/img/svg/gitea-discord.svg | 2 +-
web_src/svg/gitea-discord.svg | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/public/assets/img/svg/gitea-discord.svg b/public/assets/img/svg/gitea-discord.svg
index 6ebbdcdcc3..2edcb4fed7 100644
--- a/public/assets/img/svg/gitea-discord.svg
+++ b/public/assets/img/svg/gitea-discord.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/web_src/svg/gitea-discord.svg b/web_src/svg/gitea-discord.svg
index ea64a39f6e..4cadbc7f7e 100644
--- a/web_src/svg/gitea-discord.svg
+++ b/web_src/svg/gitea-discord.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
From 52bf6bf60c863f425aa951b52fbca6dfd0c5646d Mon Sep 17 00:00:00 2001
From: Jason Song
Date: Wed, 21 Feb 2024 12:57:22 +0800
Subject: [PATCH 119/807] Do not use `ctx.Doer` when reset password (#29289)
Fix #29278.
Caused by a small typo in #28733
(cherry picked from commit 22b8de85ddda50725480b21c5bf6ef9c0202b5e9)
---
routers/web/auth/password.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/routers/web/auth/password.go b/routers/web/auth/password.go
index c23379b87a..1f2d133282 100644
--- a/routers/web/auth/password.go
+++ b/routers/web/auth/password.go
@@ -204,7 +204,7 @@ func ResetPasswdPost(ctx *context.Context) {
Password: optional.Some(ctx.FormString("password")),
MustChangePassword: optional.Some(false),
}
- if err := user_service.UpdateAuth(ctx, ctx.Doer, opts); err != nil {
+ if err := user_service.UpdateAuth(ctx, u, opts); err != nil {
ctx.Data["IsResetForm"] = true
ctx.Data["Err_Password"] = true
switch {
From d3a642a7e03650521644a18ba6986c75d2872b9e Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Mon, 26 Feb 2024 21:39:12 +0100
Subject: [PATCH 120/807] Revert "[BUG] Initalize Git for hook regeneration"
This reverts commit 815abad84c68da1722f87c97a47b0e96a29f3967.
Redundant with:
Always write proc-receive hook for all git versions (#29287)
---
cmd/admin_regenerate.go | 7 -------
1 file changed, 7 deletions(-)
diff --git a/cmd/admin_regenerate.go b/cmd/admin_regenerate.go
index efdfc8e5e4..0db505ff9c 100644
--- a/cmd/admin_regenerate.go
+++ b/cmd/admin_regenerate.go
@@ -5,7 +5,6 @@ package cmd
import (
asymkey_model "code.gitea.io/gitea/models/asymkey"
- "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/graceful"
repo_service "code.gitea.io/gitea/services/repository"
@@ -33,12 +32,6 @@ func runRegenerateHooks(_ *cli.Context) error {
if err := initDB(ctx); err != nil {
return err
}
-
- // Detection of ProcReceive support relies on Git module being initalized.
- if err := git.InitFull(ctx); err != nil {
- return err
- }
-
return repo_service.SyncRepositoryHooks(graceful.GetManager().ShutdownContext())
}
From 2c8f112c1c2268d48c7c28aa91e7b0c631e272b4 Mon Sep 17 00:00:00 2001
From: wxiaoguang
Date: Wed, 21 Feb 2024 15:01:48 +0800
Subject: [PATCH 121/807] Always write proc-receive hook for all git versions
(#29287)
(cherry picked from commit 7f45dfb030f30a3ada58e636e3b8bfde391224bd)
---
modules/repository/hooks.go | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/modules/repository/hooks.go b/modules/repository/hooks.go
index daab7c3091..95849789ab 100644
--- a/modules/repository/hooks.go
+++ b/modules/repository/hooks.go
@@ -9,7 +9,6 @@ import (
"path/filepath"
"runtime"
- "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
)
@@ -94,15 +93,14 @@ done
`, setting.ScriptType, util.ShellEscape(setting.AppPath), util.ShellEscape(setting.CustomConf)),
}
- if git.SupportProcReceive {
- hookNames = append(hookNames, "proc-receive")
- hookTpls = append(hookTpls,
- fmt.Sprintf(`#!/usr/bin/env %s
+ // although only new git (>=2.29) supports proc-receive, it's still good to create its hook, in case the user upgrades git
+ hookNames = append(hookNames, "proc-receive")
+ hookTpls = append(hookTpls,
+ fmt.Sprintf(`#!/usr/bin/env %s
# AUTO GENERATED BY GITEA, DO NOT MODIFY
%s hook --config=%s proc-receive
`, setting.ScriptType, util.ShellEscape(setting.AppPath), util.ShellEscape(setting.CustomConf)))
- giteaHookTpls = append(giteaHookTpls, "")
- }
+ giteaHookTpls = append(giteaHookTpls, "")
return hookNames, hookTpls, giteaHookTpls
}
From 769db26c5a5545d082b90baa558d9455f5371b7e Mon Sep 17 00:00:00 2001
From: Yarden Shoham
Date: Wed, 21 Feb 2024 10:13:48 +0200
Subject: [PATCH 122/807] Remove jQuery from the installation page (#29284)
- Switched to plain JavaScript
- Tested the installation page functionality and it works as before
# Demo using JavaScript without jQuery
![action](https://github.com/go-gitea/gitea/assets/20454870/286475b3-1919-4d99-b790-def10fa36e66)
Signed-off-by: Yarden Shoham
(cherry picked from commit 4e536edaead97d61a64508db0e93cf781a889472)
---
web_src/js/features/install.js | 101 ++++++++++++++++-----------------
1 file changed, 49 insertions(+), 52 deletions(-)
diff --git a/web_src/js/features/install.js b/web_src/js/features/install.js
index bb83dd1ff4..1826ff7cde 100644
--- a/web_src/js/features/install.js
+++ b/web_src/js/features/install.js
@@ -1,19 +1,17 @@
-import $ from 'jquery';
import {hideElem, showElem} from '../utils/dom.js';
import {GET} from '../modules/fetch.js';
export function initInstall() {
- const $page = $('.page-content.install');
- if ($page.length === 0) {
+ const page = document.querySelector('.page-content.install');
+ if (!page) {
return;
}
- if ($page.is('.post-install')) {
+ if (page.classList.contains('post-install')) {
initPostInstall();
} else {
initPreInstall();
}
}
-
function initPreInstall() {
const defaultDbUser = 'forgejo';
const defaultDbName = 'forgejo';
@@ -24,83 +22,82 @@ function initPreInstall() {
mssql: '127.0.0.1:1433'
};
- const $dbHost = $('#db_host');
- const $dbUser = $('#db_user');
- const $dbName = $('#db_name');
+ const dbHost = document.getElementById('db_host');
+ const dbUser = document.getElementById('db_user');
+ const dbName = document.getElementById('db_name');
// Database type change detection.
- $('#db_type').on('change', function () {
- const dbType = $(this).val();
- hideElem($('div[data-db-setting-for]'));
- showElem($(`div[data-db-setting-for=${dbType}]`));
+ document.getElementById('db_type').addEventListener('change', function () {
+ const dbType = this.value;
+ hideElem('div[data-db-setting-for]');
+ showElem(`div[data-db-setting-for=${dbType}]`);
if (dbType !== 'sqlite3') {
// for most remote database servers
- showElem($(`div[data-db-setting-for=common-host]`));
- const lastDbHost = $dbHost.val();
+ showElem('div[data-db-setting-for=common-host]');
+ const lastDbHost = dbHost.value;
const isDbHostDefault = !lastDbHost || Object.values(defaultDbHosts).includes(lastDbHost);
if (isDbHostDefault) {
- $dbHost.val(defaultDbHosts[dbType] ?? '');
+ dbHost.value = defaultDbHosts[dbType] ?? '';
}
- if (!$dbUser.val() && !$dbName.val()) {
- $dbUser.val(defaultDbUser);
- $dbName.val(defaultDbName);
+ if (!dbUser.value && !dbName.value) {
+ dbUser.value = defaultDbUser;
+ dbName.value = defaultDbName;
}
} // else: for SQLite3, the default path is always prepared by backend code (setting)
- }).trigger('change');
+ });
+ document.getElementById('db_type').dispatchEvent(new Event('change'));
- const $appUrl = $('#app_url');
- const configAppUrl = $appUrl.val();
- if (configAppUrl.includes('://localhost')) {
- $appUrl.val(window.location.href);
+ const appUrl = document.getElementById('app_url');
+ if (appUrl.value.includes('://localhost')) {
+ appUrl.value = window.location.href;
}
- const $domain = $('#domain');
- const configDomain = $domain.val().trim();
- if (configDomain === 'localhost') {
- $domain.val(window.location.hostname);
+ const domain = document.getElementById('domain');
+ if (domain.value.trim() === 'localhost') {
+ domain.value = window.location.hostname;
}
// TODO: better handling of exclusive relations.
- $('#offline-mode input').on('change', function () {
- if ($(this).is(':checked')) {
- $('#disable-gravatar').checkbox('check');
- $('#federated-avatar-lookup').checkbox('uncheck');
+ document.querySelector('#offline-mode input').addEventListener('change', function () {
+ if (this.checked) {
+ document.querySelector('#disable-gravatar input').checked = true;
+ document.querySelector('#federated-avatar-lookup input').checked = false;
}
});
- $('#disable-gravatar input').on('change', function () {
- if ($(this).is(':checked')) {
- $('#federated-avatar-lookup').checkbox('uncheck');
+ document.querySelector('#disable-gravatar input').addEventListener('change', function () {
+ if (this.checked) {
+ document.querySelector('#federated-avatar-lookup input').checked = false;
} else {
- $('#offline-mode').checkbox('uncheck');
+ document.querySelector('#offline-mode input').checked = false;
}
});
- $('#federated-avatar-lookup input').on('change', function () {
- if ($(this).is(':checked')) {
- $('#disable-gravatar').checkbox('uncheck');
- $('#offline-mode').checkbox('uncheck');
+ document.querySelector('#federated-avatar-lookup input').addEventListener('change', function () {
+ if (this.checked) {
+ document.querySelector('#disable-gravatar input').checked = false;
+ document.querySelector('#offline-mode input').checked = false;
}
});
- $('#enable-openid-signin input').on('change', function () {
- if ($(this).is(':checked')) {
- if (!$('#disable-registration input').is(':checked')) {
- $('#enable-openid-signup').checkbox('check');
+ document.querySelector('#enable-openid-signin input').addEventListener('change', function () {
+ if (this.checked) {
+ if (!document.querySelector('#disable-registration input').checked) {
+ document.querySelector('#enable-openid-signup input').checked = true;
}
} else {
- $('#enable-openid-signup').checkbox('uncheck');
+ document.querySelector('#enable-openid-signup input').checked = false;
}
});
- $('#disable-registration input').on('change', function () {
- if ($(this).is(':checked')) {
- $('#enable-captcha').checkbox('uncheck');
- $('#enable-openid-signup').checkbox('uncheck');
+ document.querySelector('#disable-registration input').addEventListener('change', function () {
+ if (this.checked) {
+ document.querySelector('#enable-captcha input').checked = false;
+ document.querySelector('#enable-openid-signup input').checked = false;
} else {
- $('#enable-openid-signup').checkbox('check');
+ document.querySelector('#enable-openid-signup input').checked = true;
}
});
- $('#enable-captcha input').on('change', function () {
- if ($(this).is(':checked')) {
- $('#disable-registration').checkbox('uncheck');
+ document.querySelector('#enable-captcha input').addEventListener('change', function () {
+ if (this.checked) {
+ document.querySelector('#disable-registration input').checked = false;
}
});
}
From 321aaedc4ee16e925d56eedf357ad53c2f40de26 Mon Sep 17 00:00:00 2001
From: Zettat123
Date: Wed, 21 Feb 2024 19:40:46 +0800
Subject: [PATCH 123/807] Fix error display when merging PRs (#29288)
Partially fix #29071, regression of Modernize merge button #28140
Fix some missing `Redirect` -> `JSONRedirect`.
Thanks @yp05327 for the help in
https://github.com/go-gitea/gitea/issues/29071#issuecomment-1931261075
(cherry picked from commit 79217ea63c1f77de7ca79813ae45950724e63d02)
---
routers/web/repo/pull.go | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go
index ac244b1551..fd7e902225 100644
--- a/routers/web/repo/pull.go
+++ b/routers/web/repo/pull.go
@@ -1311,19 +1311,19 @@ func MergePullRequest(ctx *context.Context) {
return
}
ctx.Flash.Error(flashError)
- ctx.Redirect(issue.Link())
+ ctx.JSONRedirect(issue.Link())
} else if models.IsErrMergeUnrelatedHistories(err) {
log.Debug("MergeUnrelatedHistories error: %v", err)
ctx.Flash.Error(ctx.Tr("repo.pulls.unrelated_histories"))
- ctx.Redirect(issue.Link())
+ ctx.JSONRedirect(issue.Link())
} else if git.IsErrPushOutOfDate(err) {
log.Debug("MergePushOutOfDate error: %v", err)
ctx.Flash.Error(ctx.Tr("repo.pulls.merge_out_of_date"))
- ctx.Redirect(issue.Link())
+ ctx.JSONRedirect(issue.Link())
} else if models.IsErrSHADoesNotMatch(err) {
log.Debug("MergeHeadOutOfDate error: %v", err)
ctx.Flash.Error(ctx.Tr("repo.pulls.head_out_of_date"))
- ctx.Redirect(issue.Link())
+ ctx.JSONRedirect(issue.Link())
} else if git.IsErrPushRejected(err) {
log.Debug("MergePushRejected error: %v", err)
pushrejErr := err.(*git.ErrPushRejected)
From c88ae2e38254b4ee17be2b055065d5d0b0110bc7 Mon Sep 17 00:00:00 2001
From: Lunny Xiao
Date: Wed, 21 Feb 2024 22:14:37 +0800
Subject: [PATCH 124/807] Revert #28753 because UI broken. (#29293)
Revert #29255
Revert #28753
(cherry picked from commit e6e50696b83164805bec83a1b20c95a85a4dd7e5)
---
templates/user/auth/signin_inner.tmpl | 11 +++++++----
templates/user/auth/signin_openid.tmpl | 6 ++++--
templates/user/auth/signup_inner.tmpl | 14 ++++++++------
web_src/css/form.css | 4 ++++
web_src/css/helpers.css | 1 -
5 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/templates/user/auth/signin_inner.tmpl b/templates/user/auth/signin_inner.tmpl
index a0aea5cb9b..40e54ec8fa 100644
--- a/templates/user/auth/signin_inner.tmpl
+++ b/templates/user/auth/signin_inner.tmpl
@@ -9,20 +9,21 @@
{{end}}
+ {{ isLoading ? locale.loadingTitle : errorText ? locale.loadingTitleFailed: `Code frequency over the history of ${repoLink.slice(1)}` }}
+
+
+
+
+
+ {{ locale.loadingInfo }}
+
+
+
+ {{ errorText }}
+
+
+
+
+
+
+
diff --git a/web_src/js/components/RepoContributors.vue b/web_src/js/components/RepoContributors.vue
index fa1545b3df..84fdcae1f6 100644
--- a/web_src/js/components/RepoContributors.vue
+++ b/web_src/js/components/RepoContributors.vue
@@ -3,10 +3,7 @@ import {SvgIcon} from '../svg.js';
import {
Chart,
Title,
- Tooltip,
- Legend,
BarElement,
- CategoryScale,
LinearScale,
TimeScale,
PointElement,
@@ -21,27 +18,13 @@ import {
firstStartDateAfterDate,
fillEmptyStartDaysWithZeroes,
} from '../utils/time.js';
+import {chartJsColors} from '../utils/color.js';
+import {sleep} from '../utils.js';
import 'chartjs-adapter-dayjs-4/dist/chartjs-adapter-dayjs-4.esm';
import $ from 'jquery';
const {pageData} = window.config;
-const colors = {
- text: '--color-text',
- border: '--color-secondary-alpha-60',
- commits: '--color-primary-alpha-60',
- additions: '--color-green',
- deletions: '--color-red',
- title: '--color-secondary-dark-4',
-};
-
-const styles = window.getComputedStyle(document.documentElement);
-const getColor = (name) => styles.getPropertyValue(name).trim();
-
-for (const [key, value] of Object.entries(colors)) {
- colors[key] = getColor(value);
-}
-
const customEventListener = {
id: 'customEventListener',
afterEvent: (chart, args, opts) => {
@@ -54,17 +37,14 @@ const customEventListener = {
}
};
-Chart.defaults.color = colors.text;
-Chart.defaults.borderColor = colors.border;
+Chart.defaults.color = chartJsColors.text;
+Chart.defaults.borderColor = chartJsColors.border;
Chart.register(
TimeScale,
- CategoryScale,
LinearScale,
BarElement,
Title,
- Tooltip,
- Legend,
PointElement,
LineElement,
Filler,
@@ -122,7 +102,7 @@ export default {
do {
response = await GET(`${this.repoLink}/activity/contributors/data`);
if (response.status === 202) {
- await new Promise((resolve) => setTimeout(resolve, 1000)); // wait for 1 second before retrying
+ await sleep(1000); // wait for 1 second before retrying
}
} while (response.status === 202);
if (response.ok) {
@@ -222,7 +202,7 @@ export default {
pointRadius: 0,
pointHitRadius: 0,
fill: 'start',
- backgroundColor: colors[this.type],
+ backgroundColor: chartJsColors[this.type],
borderWidth: 0,
tension: 0.3,
},
@@ -254,7 +234,6 @@ export default {
title: {
display: type === 'main',
text: 'drag: zoom, shift+drag: pan, double click: reset zoom',
- color: colors.title,
position: 'top',
align: 'center',
},
@@ -262,9 +241,6 @@ export default {
chartType: type,
instance: this,
},
- legend: {
- display: false,
- },
zoom: {
pan: {
enabled: true,
diff --git a/web_src/js/features/code-frequency.js b/web_src/js/features/code-frequency.js
new file mode 100644
index 0000000000..103d82f6e3
--- /dev/null
+++ b/web_src/js/features/code-frequency.js
@@ -0,0 +1,21 @@
+import {createApp} from 'vue';
+
+export async function initRepoCodeFrequency() {
+ const el = document.getElementById('repo-code-frequency-chart');
+ if (!el) return;
+
+ const {default: RepoCodeFrequency} = await import(/* webpackChunkName: "code-frequency-graph" */'../components/RepoCodeFrequency.vue');
+ try {
+ const View = createApp(RepoCodeFrequency, {
+ locale: {
+ loadingTitle: el.getAttribute('data-locale-loading-title'),
+ loadingTitleFailed: el.getAttribute('data-locale-loading-title-failed'),
+ loadingInfo: el.getAttribute('data-locale-loading-info'),
+ }
+ });
+ View.mount(el);
+ } catch (err) {
+ console.error('RepoCodeFrequency failed to load', err);
+ el.textContent = el.getAttribute('data-locale-component-failed-to-load');
+ }
+}
diff --git a/web_src/js/index.js b/web_src/js/index.js
index 117279c3c4..d9cfff4084 100644
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -84,6 +84,7 @@ import {onDomReady} from './utils/dom.js';
import {initRepoIssueList} from './features/repo-issue-list.js';
import {initCommonIssueListQuickGoto} from './features/common-issue-list.js';
import {initRepoContributors} from './features/contributors.js';
+import {initRepoCodeFrequency} from './features/code-frequency.js';
import {initRepoDiffCommitBranchesAndTags} from './features/repo-diff-commit.js';
import {initDirAuto} from './modules/dirauto.js';
@@ -174,6 +175,7 @@ onDomReady(() => {
initRepository();
initRepositoryActionView();
initRepoContributors();
+ initRepoCodeFrequency();
initCommitStatuses();
initCaptcha();
diff --git a/web_src/js/utils.js b/web_src/js/utils.js
index c82e42d349..3a2694335f 100644
--- a/web_src/js/utils.js
+++ b/web_src/js/utils.js
@@ -139,3 +139,5 @@ export function parseDom(text, contentType) {
export function serializeXml(node) {
return xmlSerializer.serializeToString(node);
}
+
+export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
diff --git a/web_src/js/utils/color.js b/web_src/js/utils/color.js
index 5d9c4ca45d..0ba6af49ee 100644
--- a/web_src/js/utils/color.js
+++ b/web_src/js/utils/color.js
@@ -19,3 +19,17 @@ function getLuminance(r, g, b) {
export function useLightTextOnBackground(r, g, b) {
return getLuminance(r, g, b) < 0.453;
}
+
+function resolveColors(obj) {
+ const styles = window.getComputedStyle(document.documentElement);
+ const getColor = (name) => styles.getPropertyValue(name).trim();
+ return Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, getColor(value)]));
+}
+
+export const chartJsColors = resolveColors({
+ text: '--color-text',
+ border: '--color-secondary-alpha-60',
+ commits: '--color-primary-alpha-60',
+ additions: '--color-green',
+ deletions: '--color-red',
+});
From 69055400881777148d5e5d3f531c563ebfdb9287 Mon Sep 17 00:00:00 2001
From: Lunny Xiao
Date: Sat, 24 Feb 2024 14:55:19 +0800
Subject: [PATCH 147/807] Use the database object format name but not read from
git repoisitory everytime and fix possible migration wrong objectformat when
migrating a sha256 repository (#29294)
Now we can get object format name from git command line or from the
database repository table. Assume the column is right, we don't need to
read from git command line every time.
This also fixed a possible bug that the object format is wrong when
migrating a sha256 repository from external.
(cherry picked from commit b79c30435f439af8243ee281310258cdf141e27b)
Conflicts:
routers/web/repo/blame.go
services/agit/agit.go
context
---
modules/context/api.go | 9 ++-------
modules/context/repo.go | 20 ++++++++------------
routers/api/v1/utils/git.go | 2 +-
routers/private/hook_pre_receive.go | 2 +-
routers/web/repo/blame.go | 5 +----
routers/web/repo/compare.go | 4 ++--
routers/web/repo/setting/lfs.go | 2 +-
services/agit/agit.go | 5 +----
services/migrations/gitea_uploader.go | 16 +++++++++++++---
services/pull/check.go | 5 +----
services/pull/merge.go | 2 +-
services/release/release.go | 2 +-
services/repository/branch.go | 7 ++-----
services/repository/files/commit.go | 6 ++----
services/repository/files/tree.go | 2 +-
services/repository/lfs.go | 2 +-
services/repository/push.go | 6 +-----
17 files changed, 40 insertions(+), 57 deletions(-)
diff --git a/modules/context/api.go b/modules/context/api.go
index 7557a5f435..fafd49fd42 100644
--- a/modules/context/api.go
+++ b/modules/context/api.go
@@ -309,12 +309,6 @@ func RepoRefForAPI(next http.Handler) http.Handler {
return
}
- objectFormat, err := ctx.Repo.GitRepo.GetObjectFormat()
- if err != nil {
- ctx.Error(http.StatusInternalServerError, "GetCommit", err)
- return
- }
-
if ref := ctx.FormTrim("ref"); len(ref) > 0 {
commit, err := ctx.Repo.GitRepo.GetCommit(ref)
if err != nil {
@@ -333,6 +327,7 @@ func RepoRefForAPI(next http.Handler) http.Handler {
}
refName := getRefName(ctx.Base, ctx.Repo, RepoRefAny)
+ var err error
if ctx.Repo.GitRepo.IsBranchExist(refName) {
ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName)
@@ -348,7 +343,7 @@ func RepoRefForAPI(next http.Handler) http.Handler {
return
}
ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
- } else if len(refName) == objectFormat.FullLength() {
+ } else if len(refName) == ctx.Repo.GetObjectFormat().FullLength() {
ctx.Repo.CommitID = refName
ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName)
if err != nil {
diff --git a/modules/context/repo.go b/modules/context/repo.go
index 490d798d50..e8ed1134fe 100644
--- a/modules/context/repo.go
+++ b/modules/context/repo.go
@@ -83,6 +83,10 @@ func (r *Repository) CanCreateBranch() bool {
return r.Permission.CanWrite(unit_model.TypeCode) && r.Repository.CanCreateBranch()
}
+func (r *Repository) GetObjectFormat() git.ObjectFormat {
+ return git.ObjectFormatFromName(r.Repository.ObjectFormatName)
+}
+
// RepoMustNotBeArchived checks if a repo is archived
func RepoMustNotBeArchived() func(ctx *Context) {
return func(ctx *Context) {
@@ -831,9 +835,8 @@ func getRefName(ctx *Base, repo *Repository, pathType RepoRefType) string {
}
// For legacy and API support only full commit sha
parts := strings.Split(path, "/")
- objectFormat, _ := repo.GitRepo.GetObjectFormat()
- if len(parts) > 0 && len(parts[0]) == objectFormat.FullLength() {
+ if len(parts) > 0 && len(parts[0]) == git.ObjectFormatFromName(repo.Repository.ObjectFormatName).FullLength() {
repo.TreePath = strings.Join(parts[1:], "/")
return parts[0]
}
@@ -877,9 +880,8 @@ func getRefName(ctx *Base, repo *Repository, pathType RepoRefType) string {
return getRefNameFromPath(ctx, repo, path, repo.GitRepo.IsTagExist)
case RepoRefCommit:
parts := strings.Split(path, "/")
- objectFormat, _ := repo.GitRepo.GetObjectFormat()
- if len(parts) > 0 && len(parts[0]) >= 7 && len(parts[0]) <= objectFormat.FullLength() {
+ if len(parts) > 0 && len(parts[0]) >= 7 && len(parts[0]) <= repo.GetObjectFormat().FullLength() {
repo.TreePath = strings.Join(parts[1:], "/")
return parts[0]
}
@@ -938,12 +940,6 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
}
}
- objectFormat, err := ctx.Repo.GitRepo.GetObjectFormat()
- if err != nil {
- log.Error("Cannot determine objectFormat for repository: %w", err)
- ctx.Repo.Repository.MarkAsBrokenEmpty()
- }
-
// Get default branch.
if len(ctx.Params("*")) == 0 {
refName = ctx.Repo.Repository.DefaultBranch
@@ -1010,7 +1006,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
return cancel
}
ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
- } else if len(refName) >= 7 && len(refName) <= objectFormat.FullLength() {
+ } else if len(refName) >= 7 && len(refName) <= ctx.Repo.GetObjectFormat().FullLength() {
ctx.Repo.IsViewCommit = true
ctx.Repo.CommitID = refName
@@ -1020,7 +1016,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
return cancel
}
// If short commit ID add canonical link header
- if len(refName) < objectFormat.FullLength() {
+ if len(refName) < ctx.Repo.GetObjectFormat().FullLength() {
ctx.RespHeader().Set("Link", fmt.Sprintf("<%s>; rel=\"canonical\"",
util.URLJoin(setting.AppURL, strings.Replace(ctx.Req.URL.RequestURI(), util.PathEscapeSegments(refName), url.PathEscape(ctx.Repo.Commit.ID.String()), 1))))
}
diff --git a/routers/api/v1/utils/git.go b/routers/api/v1/utils/git.go
index 2299cdc247..5e80190017 100644
--- a/routers/api/v1/utils/git.go
+++ b/routers/api/v1/utils/git.go
@@ -72,7 +72,7 @@ func searchRefCommitByType(ctx *context.APIContext, refType, filter string) (str
// ConvertToObjectID returns a full-length SHA1 from a potential ID string
func ConvertToObjectID(ctx gocontext.Context, repo *context.Repository, commitID string) (git.ObjectID, error) {
- objectFormat, _ := repo.GitRepo.GetObjectFormat()
+ objectFormat := repo.GetObjectFormat()
if len(commitID) == objectFormat.FullLength() && objectFormat.IsValid(commitID) {
sha, err := git.NewIDFromString(commitID)
if err == nil {
diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go
index 90d8287f06..f28ae4c0eb 100644
--- a/routers/private/hook_pre_receive.go
+++ b/routers/private/hook_pre_receive.go
@@ -145,7 +145,7 @@ func preReceiveBranch(ctx *preReceiveContext, oldCommitID, newCommitID string, r
repo := ctx.Repo.Repository
gitRepo := ctx.Repo.GitRepo
- objectFormat, _ := gitRepo.GetObjectFormat()
+ objectFormat := ctx.Repo.GetObjectFormat()
if branchName == repo.DefaultBranch && newCommitID == objectFormat.EmptyObjectID().String() {
log.Warn("Forbidden: Branch: %s is the default branch in %-v and cannot be deleted", branchName, repo)
diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go
index 49443162e4..2c938dc966 100644
--- a/routers/web/repo/blame.go
+++ b/routers/web/repo/blame.go
@@ -112,10 +112,7 @@ type blameResult struct {
func performBlame(ctx *context.Context, commit *git.Commit, file string, bypassBlameIgnore bool) (*blameResult, error) {
repoPath := ctx.Repo.Repository.RepoPath()
- objectFormat, err := ctx.Repo.GitRepo.GetObjectFormat()
- if err != nil {
- return nil, err
- }
+ objectFormat := ctx.Repo.GetObjectFormat()
blameReader, err := git.CreateBlameReader(ctx, objectFormat, repoPath, commit, file, bypassBlameIgnore)
if err != nil {
diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go
index df41c750de..535487d5fd 100644
--- a/routers/web/repo/compare.go
+++ b/routers/web/repo/compare.go
@@ -312,14 +312,14 @@ func ParseCompareInfo(ctx *context.Context) *CompareInfo {
baseIsCommit := ctx.Repo.GitRepo.IsCommitExist(ci.BaseBranch)
baseIsBranch := ctx.Repo.GitRepo.IsBranchExist(ci.BaseBranch)
baseIsTag := ctx.Repo.GitRepo.IsTagExist(ci.BaseBranch)
- objectFormat, _ := ctx.Repo.GitRepo.GetObjectFormat()
+
if !baseIsCommit && !baseIsBranch && !baseIsTag {
// Check if baseBranch is short sha commit hash
if baseCommit, _ := ctx.Repo.GitRepo.GetCommit(ci.BaseBranch); baseCommit != nil {
ci.BaseBranch = baseCommit.ID.String()
ctx.Data["BaseBranch"] = ci.BaseBranch
baseIsCommit = true
- } else if ci.BaseBranch == objectFormat.EmptyObjectID().String() {
+ } else if ci.BaseBranch == ctx.Repo.GetObjectFormat().EmptyObjectID().String() {
if isSameRepo {
ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ci.HeadBranch))
} else {
diff --git a/routers/web/repo/setting/lfs.go b/routers/web/repo/setting/lfs.go
index e360ae2b8c..53e7b22d1b 100644
--- a/routers/web/repo/setting/lfs.go
+++ b/routers/web/repo/setting/lfs.go
@@ -388,7 +388,7 @@ func LFSFileFind(ctx *context.Context) {
sha := ctx.FormString("sha")
ctx.Data["Title"] = oid
ctx.Data["PageIsSettingsLFS"] = true
- objectFormat, _ := ctx.Repo.GitRepo.GetObjectFormat()
+ objectFormat := ctx.Repo.GetObjectFormat()
var objectID git.ObjectID
if len(sha) == 0 {
pointer := lfs.Pointer{Oid: oid, Size: size}
diff --git a/services/agit/agit.go b/services/agit/agit.go
index 4c970ee78a..e46a5771e1 100644
--- a/services/agit/agit.go
+++ b/services/agit/agit.go
@@ -28,10 +28,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git.
title, hasTitle := opts.GitPushOptions["title"]
description, hasDesc := opts.GitPushOptions["description"]
- objectFormat, err := gitRepo.GetObjectFormat()
- if err != nil {
- return nil, fmt.Errorf("couldn't get object format of the repository: %w", err)
- }
+ objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName)
pusher, err := user_model.GetUserByID(ctx, opts.UserID)
if err != nil {
diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go
index ebb1313c2b..7920c07056 100644
--- a/services/migrations/gitea_uploader.go
+++ b/services/migrations/gitea_uploader.go
@@ -140,8 +140,18 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate
if err != nil {
return err
}
- g.gitRepo, err = gitrepo.OpenRepository(g.ctx, r)
- return err
+ g.gitRepo, err = gitrepo.OpenRepository(g.ctx, g.repo)
+ if err != nil {
+ return err
+ }
+
+ // detect object format from git repository and update to database
+ objectFormat, err := g.gitRepo.GetObjectFormat()
+ if err != nil {
+ return err
+ }
+ g.repo.ObjectFormatName = objectFormat.Name()
+ return repo_model.UpdateRepositoryCols(g.ctx, g.repo, "object_format_name")
}
// Close closes this uploader
@@ -901,7 +911,7 @@ func (g *GiteaLocalUploader) CreateReviews(reviews ...*base.Review) error {
comment.UpdatedAt = comment.CreatedAt
}
- objectFormat, _ := g.gitRepo.GetObjectFormat()
+ objectFormat := git.ObjectFormatFromName(g.repo.ObjectFormatName)
if !objectFormat.IsValid(comment.CommitID) {
log.Warn("Invalid comment CommitID[%s] on comment[%d] in PR #%d of %s/%s replaced with %s", comment.CommitID, pr.Index, g.repoOwner, g.repoName, headCommitID)
comment.CommitID = headCommitID
diff --git a/services/pull/check.go b/services/pull/check.go
index dd6c3ed230..f4dd332b14 100644
--- a/services/pull/check.go
+++ b/services/pull/check.go
@@ -222,10 +222,7 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com
}
defer gitRepo.Close()
- objectFormat, err := gitRepo.GetObjectFormat()
- if err != nil {
- return nil, fmt.Errorf("%-v GetObjectFormat: %w", pr.BaseRepo, err)
- }
+ objectFormat := git.ObjectFormatFromName(pr.BaseRepo.ObjectFormatName)
// Get the commit from BaseBranch where the pull request got merged
mergeCommit, _, err := git.NewCommand(ctx, "rev-list", "--ancestry-path", "--merges", "--reverse").
diff --git a/services/pull/merge.go b/services/pull/merge.go
index f09067996c..2112108d45 100644
--- a/services/pull/merge.go
+++ b/services/pull/merge.go
@@ -503,7 +503,7 @@ func MergedManually(ctx context.Context, pr *issues_model.PullRequest, doer *use
return models.ErrInvalidMergeStyle{ID: pr.BaseRepo.ID, Style: repo_model.MergeStyleManuallyMerged}
}
- objectFormat, _ := baseGitRepo.GetObjectFormat()
+ objectFormat := git.ObjectFormatFromName(pr.BaseRepo.ObjectFormatName)
if len(commitID) != objectFormat.FullLength() {
return fmt.Errorf("Wrong commit ID")
}
diff --git a/services/release/release.go b/services/release/release.go
index 4c522c18be..a359e5078e 100644
--- a/services/release/release.go
+++ b/services/release/release.go
@@ -88,7 +88,7 @@ func createTag(ctx context.Context, gitRepo *git.Repository, rel *repo_model.Rel
created = true
rel.LowerTagName = strings.ToLower(rel.TagName)
- objectFormat, _ := gitRepo.GetObjectFormat()
+ objectFormat := git.ObjectFormatFromName(rel.Repo.ObjectFormatName)
commits := repository.NewPushCommits()
commits.HeadCommit = repository.CommitToPushCommit(commit)
commits.CompareURL = rel.Repo.ComposeCompareURL(objectFormat.EmptyObjectID().String(), commit.ID.String())
diff --git a/services/repository/branch.go b/services/repository/branch.go
index 6add9422f4..39be3984ae 100644
--- a/services/repository/branch.go
+++ b/services/repository/branch.go
@@ -369,11 +369,6 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R
return fmt.Errorf("GetBranch: %v", err)
}
- objectFormat, err := gitRepo.GetObjectFormat()
- if err != nil {
- return err
- }
-
if rawBranch.IsDeleted {
return nil
}
@@ -395,6 +390,8 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R
return err
}
+ objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName)
+
// Don't return error below this
if err := PushUpdate(
&repo_module.PushUpdateOptions{
diff --git a/services/repository/files/commit.go b/services/repository/files/commit.go
index 16a15e06a7..512aec7c81 100644
--- a/services/repository/files/commit.go
+++ b/services/repository/files/commit.go
@@ -30,10 +30,8 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato
}
defer closer.Close()
- objectFormat, err := gitRepo.GetObjectFormat()
- if err != nil {
- return fmt.Errorf("GetObjectFormat[%s]: %w", repoPath, err)
- }
+ objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName)
+
commit, err := gitRepo.GetCommit(sha)
if err != nil {
gitRepo.Close()
diff --git a/services/repository/files/tree.go b/services/repository/files/tree.go
index 9d3185c3fc..e3a7f3b8b0 100644
--- a/services/repository/files/tree.go
+++ b/services/repository/files/tree.go
@@ -37,7 +37,7 @@ func GetTreeBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git
}
apiURL := repo.APIURL()
apiURLLen := len(apiURL)
- objectFormat, _ := gitRepo.GetObjectFormat()
+ objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName)
hashLen := objectFormat.FullLength()
const gitBlobsPath = "/git/blobs/"
diff --git a/services/repository/lfs.go b/services/repository/lfs.go
index 4504f796bd..4d48881b87 100644
--- a/services/repository/lfs.go
+++ b/services/repository/lfs.go
@@ -79,7 +79,7 @@ func GarbageCollectLFSMetaObjectsForRepo(ctx context.Context, repo *repo_model.R
store := lfs.NewContentStore()
errStop := errors.New("STOPERR")
- objectFormat, _ := gitRepo.GetObjectFormat()
+ objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName)
err = git_model.IterateLFSMetaObjectsForRepo(ctx, repo.ID, func(ctx context.Context, metaObject *git_model.LFSMetaObject, count int64) error {
if opts.NumberToCheckPerRepo > 0 && total > opts.NumberToCheckPerRepo {
diff --git a/services/repository/push.go b/services/repository/push.go
index 5e2853b27d..bb080e30cc 100644
--- a/services/repository/push.go
+++ b/services/repository/push.go
@@ -93,11 +93,6 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
}
defer gitRepo.Close()
- objectFormat, err := gitRepo.GetObjectFormat()
- if err != nil {
- return fmt.Errorf("unknown repository ObjectFormat [%s]: %w", repo.FullName(), err)
- }
-
if err = repo_module.UpdateRepoSize(ctx, repo); err != nil {
return fmt.Errorf("Failed to update size for repository: %v", err)
}
@@ -105,6 +100,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error {
addTags := make([]string, 0, len(optsList))
delTags := make([]string, 0, len(optsList))
var pusher *user_model.User
+ objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName)
for _, opts := range optsList {
log.Trace("pushUpdates: %-v %s %s %s", repo, opts.OldCommitID, opts.NewCommitID, opts.RefFullName)
From f0acc71ba13713f07602294b4a33028125343d47 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20Br=C3=BCckner?=
Date: Sat, 24 Feb 2024 07:49:16 +0000
Subject: [PATCH 148/807] Properly migrate target branch change GitLab comment
(#29340)
GitLab generates "system notes" whenever an event happens within the
platform. Unlike Gitea, those events are stored and retrieved as text
comments with no semantic details. The only way to tell whether a
comment was generated in this manner is the `system` flag on the note
type.
This PR adds detection for a new specific kind of event: Changing the
target branch of a PR. When detected, it is downloaded using Gitea's
type for this event, and eventually uploaded into Gitea in the expected
format, i.e. with no text content in the comment.
This PR also updates the template used to render comments to add support
for migrated comments of this type.
ref:
https://gitlab.com/gitlab-org/gitlab/-/blob/11bd6dc826e0bea2832324a1d7356949a9398884/app/services/system_notes/merge_requests_service.rb#L102
(cherry picked from commit 6e5966597c2d498d1a8540dad965461d44ff8e57)
---
services/migrations/gitea_uploader.go | 10 ++++++++--
services/migrations/gitlab.go | 10 +++++++++-
services/migrations/gitlab_test.go | 19 ++++++++++++++++++-
.../repo/issue/view_content/comments.tmpl | 19 +++++++++++++++----
4 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go
index 7920c07056..99a44dff0f 100644
--- a/services/migrations/gitea_uploader.go
+++ b/services/migrations/gitea_uploader.go
@@ -492,10 +492,16 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
}
case issues_model.CommentTypeChangeTitle:
if comment.Meta["OldTitle"] != nil {
- cm.OldTitle = fmt.Sprintf("%s", comment.Meta["OldTitle"])
+ cm.OldTitle = fmt.Sprint(comment.Meta["OldTitle"])
}
if comment.Meta["NewTitle"] != nil {
- cm.NewTitle = fmt.Sprintf("%s", comment.Meta["NewTitle"])
+ cm.NewTitle = fmt.Sprint(comment.Meta["NewTitle"])
+ }
+ case issues_model.CommentTypeChangeTargetBranch:
+ if comment.Meta["OldRef"] != nil && comment.Meta["NewRef"] != nil {
+ cm.OldRef = fmt.Sprint(comment.Meta["OldRef"])
+ cm.NewRef = fmt.Sprint(comment.Meta["NewRef"])
+ cm.Content = ""
}
case issues_model.CommentTypePRScheduledToAutoMerge, issues_model.CommentTypePRUnScheduledToAutoMerge:
cm.Content = ""
diff --git a/services/migrations/gitlab.go b/services/migrations/gitlab.go
index d08eaf0f84..5e49ae6d57 100644
--- a/services/migrations/gitlab.go
+++ b/services/migrations/gitlab.go
@@ -11,6 +11,7 @@ import (
"net/http"
"net/url"
"path"
+ "regexp"
"strings"
"time"
@@ -519,6 +520,8 @@ func (g *GitlabDownloader) GetComments(commentable base.Commentable) ([]*base.Co
return allComments, true, nil
}
+var targetBranchChangeRegexp = regexp.MustCompile("^changed target branch from `(.*?)` to `(.*?)`$")
+
func (g *GitlabDownloader) convertNoteToComment(localIndex int64, note *gitlab.Note) *base.Comment {
comment := &base.Comment{
IssueIndex: localIndex,
@@ -528,11 +531,16 @@ func (g *GitlabDownloader) convertNoteToComment(localIndex int64, note *gitlab.N
PosterEmail: note.Author.Email,
Content: note.Body,
Created: *note.CreatedAt,
+ Meta: map[string]any{},
}
// Try to find the underlying event of system notes.
if note.System {
- if strings.HasPrefix(note.Body, "enabled an automatic merge") {
+ if match := targetBranchChangeRegexp.FindStringSubmatch(note.Body); match != nil {
+ comment.CommentType = issues_model.CommentTypeChangeTargetBranch.String()
+ comment.Meta["OldRef"] = match[1]
+ comment.Meta["NewRef"] = match[2]
+ } else if strings.HasPrefix(note.Body, "enabled an automatic merge") {
comment.CommentType = issues_model.CommentTypePRScheduledToAutoMerge.String()
} else if note.Body == "canceled the automatic merge" {
comment.CommentType = issues_model.CommentTypePRUnScheduledToAutoMerge.String()
diff --git a/services/migrations/gitlab_test.go b/services/migrations/gitlab_test.go
index d941cebd2c..6e5ab86720 100644
--- a/services/migrations/gitlab_test.go
+++ b/services/migrations/gitlab_test.go
@@ -586,7 +586,8 @@ func TestNoteToComment(t *testing.T) {
notes := []gitlab.Note{
makeTestNote(1, "This is a regular comment", false),
makeTestNote(2, "enabled an automatic merge for abcd1234", true),
- makeTestNote(3, "canceled the automatic merge", true),
+ makeTestNote(3, "changed target branch from `master` to `main`", true),
+ makeTestNote(4, "canceled the automatic merge", true),
}
comments := []base.Comment{{
IssueIndex: 17,
@@ -597,6 +598,7 @@ func TestNoteToComment(t *testing.T) {
CommentType: "",
Content: "This is a regular comment",
Created: now,
+ Meta: map[string]any{},
}, {
IssueIndex: 17,
Index: 2,
@@ -606,15 +608,30 @@ func TestNoteToComment(t *testing.T) {
CommentType: "pull_scheduled_merge",
Content: "enabled an automatic merge for abcd1234",
Created: now,
+ Meta: map[string]any{},
}, {
IssueIndex: 17,
Index: 3,
PosterID: 72,
PosterName: "test",
PosterEmail: "test@example.com",
+ CommentType: "change_target_branch",
+ Content: "changed target branch from `master` to `main`",
+ Created: now,
+ Meta: map[string]any{
+ "OldRef": "master",
+ "NewRef": "main",
+ },
+ }, {
+ IssueIndex: 17,
+ Index: 4,
+ PosterID: 72,
+ PosterName: "test",
+ PosterEmail: "test@example.com",
CommentType: "pull_cancel_scheduled_merge",
Content: "canceled the automatic merge",
Created: now,
+ Meta: map[string]any{},
}}
for i, note := range notes {
diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl
index cf9df4dbda..20dbbdc6e4 100644
--- a/templates/repo/issue/view_content/comments.tmpl
+++ b/templates/repo/issue/view_content/comments.tmpl
@@ -369,8 +369,7 @@
{{else if eq .Type 22}}
- {{if .OriginalAuthor}}
- {{else}}
+ {{if not .OriginalAuthor}}
{{/* Some timeline avatars need a offset to correctly align with their speech
bubble. The condition depends on review type and for positive reviews whether
there is a comment element or not */}}
@@ -499,9 +498,21 @@
{{else if eq .Type 25}}
diff --git a/tests/integration/repo_tag_test.go b/tests/integration/repo_tag_test.go
index d2c4160602..60c73ae63e 100644
--- a/tests/integration/repo_tag_test.go
+++ b/tests/integration/repo_tag_test.go
@@ -47,7 +47,15 @@ func TestTagViewWithoutRelease(t *testing.T) {
// Test that the page loads
req := NewRequestf(t, "GET", "/%s/releases/tag/no-release", repo.FullName())
- MakeRequest(t, req, http.StatusOK)
+ resp := MakeRequest(t, req, http.StatusOK)
+
+ // Test that the tags sub-menu is active
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ htmlDoc.AssertElement(t, ".small-menu-items .active.item[href*='/tags']", true)
+
+ // Test that the release sub-menu isn't active
+ releaseLink := htmlDoc.Find(".small-menu-items .item[href*='/releases']")
+ assert.False(t, releaseLink.HasClass("active"))
}
func TestCreateNewTagProtected(t *testing.T) {
From 2e76e4fb339f72a0530663e8a8cbec58ef85d312 Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Tue, 27 Feb 2024 18:39:59 +0500
Subject: [PATCH 175/807] [I18N] Improve English strings & consistency
---
options/locale/locale_en-US.ini | 147 +++++++++++++-------------
templates/repo/migrate/migrating.tmpl | 2 +-
templates/repo/settings/options.tmpl | 12 +--
templates/status/500.tmpl | 4 +-
tests/integration/xss_test.go | 2 +-
5 files changed, 84 insertions(+), 83 deletions(-)
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 3e4872420f..96c5942486 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -28,10 +28,10 @@ licenses = Licenses
return_to_gitea = Return to Forgejo
username = Username
-email = Email Address
+email = Email address
password = Password
-access_token = Access Token
-re_type = Confirm Password
+access_token = Access token
+re_type = Confirm password
captcha = CAPTCHA
twofa = Two-Factor Authentication
twofa_scratch = Two-Factor Scratch Code
@@ -61,7 +61,6 @@ new_fork = New Repository Fork
new_org = New Organization
new_project = New Project
new_project_column = New Column
-manage_org = Manage Organizations
admin_panel = Site Administration
account_settings = Account Settings
settings = Settings
@@ -124,7 +123,7 @@ pin = Pin
unpin = Unpin
artifacts = Artifacts
-confirm_delete_artifact = Are you sure you want to delete the artifact '%s' ?
+confirm_delete_artifact = Are you sure you want to delete the artifact "%s" ?
archived = Archived
@@ -182,6 +181,7 @@ missing_csrf = Bad Request: no CSRF token present
invalid_csrf = Bad Request: invalid CSRF token
not_found = The target couldn't be found.
network_error = Network error
+server_internal = Internal Server Error
[startpage]
app_desc = A painless, self-hosted Git service
@@ -279,13 +279,13 @@ admin_password = Password
confirm_password = Confirm Password
admin_email = Email Address
install_btn_confirm = Install Forgejo
-test_git_failed = Could not test 'git' command: %v
-sqlite3_not_available = This Forgejo version does not support SQLite3. Please download the official binary version from %s (not the 'gobuild' version).
+test_git_failed = Could not test "git" command: %v
+sqlite3_not_available = This Forgejo version does not support SQLite3. Please download the official binary version from %s (not the "gobuild" version).
invalid_db_setting = The database settings are invalid: %v
invalid_db_table = The database table "%s" is invalid: %v
invalid_repo_path = The repository root path is invalid: %v
invalid_app_data_path = The app data path is invalid: %v
-run_user_not_match = The 'run as' username is not the current username: %s -> %s
+run_user_not_match = The "run as" username is not the current username: %s -> %s
internal_token_failed = Failed to generate internal token: %v
secret_key_failed = Failed to generate secret key: %v
save_config_failed = Failed to save configuration: %v
@@ -300,7 +300,7 @@ default_enable_timetracking = Enable Time Tracking by Default
default_enable_timetracking_popup = Enable time tracking for new repositories by default.
allow_dots_in_usernames = Allow users to use dots in their usernames. Doesn't affect existing accounts.
no_reply_address = Hidden Email Domain
-no_reply_address_helper = Domain name for users with a hidden email address. For example, the username 'joe' will be logged in Git as 'joe@noreply.example.org' if the hidden email domain is set to 'noreply.example.org'.
+no_reply_address_helper = Domain name for users with a hidden email address. For example, the username "joe" will be logged in Git as "joe@noreply.example.org" if the hidden email domain is set to "noreply.example.org".
password_algorithm = Password Hash Algorithm
invalid_password_algorithm = Invalid password hash algorithm
password_algorithm_helper = Set the password hashing algorithm. Algorithms have differing requirements and strength. The argon2 algorithm is rather secure but uses a lot of memory and may be inappropriate for small systems.
@@ -310,7 +310,7 @@ env_config_keys = Environment Configuration
env_config_keys_prompt = The following environment variables will also be applied to your configuration file:
[home]
-uname_holder = Username or Email Address
+uname_holder = Username or Email address
password_holder = Password
switch_dashboard_context = Switch Dashboard Context
my_repos = Repositories
@@ -365,7 +365,7 @@ social_register_helper_msg = Already have an account? Link it now!
disable_register_prompt = Registration is disabled. Please contact your site administrator.
disable_register_mail = Email confirmation for registration is disabled.
manual_activation_only = Contact your site administrator to complete activation.
-remember_me = Remember This Device
+remember_me = Remember this device
remember_me.compromised = The login token is not valid anymore which may indicate a compromised account. Please check your account for unusual activities.
forgot_password_title= Forgot Password
forgot_password = Forgot password?
@@ -534,8 +534,8 @@ SSPISeparatorReplacement = Separator
SSPIDefaultLanguage = Default Language
require_error = ` cannot be empty.`
-alpha_dash_error = ` should contain only alphanumeric, dash ('-') and underscore ('_') characters.`
-alpha_dash_dot_error = ` should contain only alphanumeric, dash ('-'), underscore ('_') and dot ('.') characters.`
+alpha_dash_error = ` should contain only alphanumeric, dash ("-") and underscore ("_") characters.`
+alpha_dash_dot_error = ` should contain only alphanumeric, dash ("-"), underscore ("_") and dot (".") characters.`
git_ref_name_error = ` must be a well-formed Git reference name.`
size_error = ` must be size %s.`
min_size_error = ` must contain at least %s characters.`
@@ -545,8 +545,8 @@ url_error = `"%s" is not a valid URL.`
include_error = ` must contain substring "%s".`
glob_pattern_error = ` glob pattern is invalid: %s.`
regex_pattern_error = ` regex pattern is invalid: %s.`
-username_error = ` can only contain alphanumeric chars ('0-9','a-z','A-Z'), dash ('-'), underscore ('_') and dot ('.'). It cannot begin or end with non-alphanumeric chars, and consecutive non-alphanumeric chars are also forbidden.`
-username_error_no_dots = ` can only contain alphanumeric chars ('0-9','a-z','A-Z'), dash ('-') and underscore ('_'). It cannot begin or end with non-alphanumeric chars, and consecutive non-alphanumeric chars are also forbidden.`
+username_error = ` can only contain alphanumeric chars ("0-9","a-z","A-Z"), dash ("-"), underscore ("_") and dot ("."). It cannot begin or end with non-alphanumeric chars, and consecutive non-alphanumeric chars are also forbidden.`
+username_error_no_dots = ` can only contain alphanumeric chars ("0-9","a-z","A-Z"), dash ("-") and underscore ("_"). It cannot begin or end with non-alphanumeric chars, and consecutive non-alphanumeric chars are also forbidden.`
invalid_group_team_map_error = ` mapping is invalid: %s`
unknown_error = Unknown error:
captcha_incorrect = The CAPTCHA code is incorrect.
@@ -582,7 +582,7 @@ enterred_invalid_owner_name = The new owner name is not valid.
enterred_invalid_password = The password you entered is incorrect.
user_not_exist = The user does not exist.
team_not_exist = The team does not exist.
-last_org_owner = You cannot remove the last user from the 'owners' team. There must be at least one owner for an organization.
+last_org_owner = You cannot remove the last user from the "owners" team. There must be at least one owner for an organization.
cannot_add_org_to_team = An organization cannot be added as a team member.
duplicate_invite_to_team = The user was already invited as a team member.
organization_leave_success = You have successfully left the organization %s.
@@ -647,7 +647,7 @@ avatar = Avatar
ssh_gpg_keys = SSH / GPG Keys
social = Social Accounts
applications = Applications
-orgs = Manage Organizations
+orgs = Manage organizations
repos = Repositories
delete = Delete Account
twofa = Two-Factor Authentication (TOTP)
@@ -657,7 +657,7 @@ uid = UID
webauthn = Two-Factor Authentication (Security Keys)
blocked_users = Blocked Users
-public_profile = Public Profile
+public_profile = Public profile
biography_placeholder = Tell us a little bit about yourself! (You can use Markdown)
location_placeholder = Share your approximate location with others
profile_desc = Control how your profile is shown to other users. Your primary email address will be used for notifications, password recovery and web-based Git operations.
@@ -703,7 +703,7 @@ keep_activity_private_popup = Makes the activity visible only for you and the ad
lookup_avatar_by_mail = Look Up Avatar by Email Address
federated_avatar_lookup = Federated Avatar Lookup
-enable_custom_avatar = Use Custom Avatar
+enable_custom_avatar = Use custom avatar
choose_new_avatar = Choose new avatar
update_avatar = Update Avatar
delete_current_avatar = Delete Current Avatar
@@ -751,13 +751,13 @@ add_email_confirmation_sent = A confirmation email has been sent to "%s". Please
add_email_success = The new email address has been added.
email_preference_set_success = Email preference has been set successfully.
add_openid_success = The new OpenID address has been added.
-keep_email_private = Hide Email Address
+keep_email_private = Hide email address
keep_email_private_popup = This will hide your email address from your profile, as well as when you make a pull request or edit a file using the web interface. Pushed commits will not be modified. Use %s in commits to associate them with your account.
openid_desc = OpenID lets you delegate authentication to an external provider.
-manage_ssh_keys = Manage SSH Keys
+manage_ssh_keys = Manage SSH keys
manage_ssh_principals = Manage SSH Certificate Principals
-manage_gpg_keys = Manage GPG Keys
+manage_gpg_keys = Manage GPG keys
add_key = Add Key
ssh_desc = These public SSH keys are associated with your account. The corresponding private keys allow full access to your repositories. SSH keys that have been verified can be used to verify SSH-signed Git commits.
principal_desc = These SSH certificate principals are associated with your account and allow full access to your repositories.
@@ -766,8 +766,8 @@ ssh_helper = Need help? Have a look at the guide to about GPG.
add_new_key = Add SSH Key
add_new_gpg_key = Add GPG Key
-key_content_ssh_placeholder = Begins with 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', or 'sk-ssh-ed25519@openssh.com'
-key_content_gpg_placeholder = Begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'
+key_content_ssh_placeholder = Begins with "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", or "sk-ssh-ed25519@openssh.com"
+key_content_gpg_placeholder = Begins with "-----BEGIN PGP PUBLIC KEY BLOCK-----"
add_new_principal = Add Principal
ssh_key_been_used = This SSH key has already been added to the server.
ssh_key_name_used = An SSH key with same name already exists on your account.
@@ -785,7 +785,7 @@ gpg_token = Token
gpg_token_help = You can generate a signature using:
gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig
gpg_token_signature = Armored GPG signature
-key_signature_gpg_placeholder = Begins with '-----BEGIN PGP SIGNATURE-----'
+key_signature_gpg_placeholder = Begins with "-----BEGIN PGP SIGNATURE-----"
verify_gpg_key_success = GPG key "%s" has been verified.
ssh_key_verified=Verified Key
ssh_key_verified_long=Key has been verified with a token and can be used to verify commits matching any activated email addresses for this user.
@@ -795,11 +795,11 @@ ssh_token_required = You must provide a signature for the below token
ssh_token = Token
ssh_token_help = You can generate a signature using:
ssh_token_signature = Armored SSH signature
-key_signature_ssh_placeholder = Begins with '-----BEGIN SSH SIGNATURE-----'
+key_signature_ssh_placeholder = Begins with "-----BEGIN SSH SIGNATURE-----"
verify_ssh_key_success = SSH key "%s" has been verified.
subkeys = Subkeys
key_id = Key ID
-key_name = Key Name
+key_name = Key name
key_content = Content
principal_content = Content
add_key_success = The SSH key "%s" has been added.
@@ -835,10 +835,10 @@ social_desc = These social accounts can be used to sign in to your account. Make
unbind = Unlink
unbind_success = The social account has been removed successfully.
-manage_access_token = Manage Access Tokens
-generate_new_token = Generate New Token
+manage_access_token = Manage access tokens
+generate_new_token = Generate new token
tokens_desc = These tokens grant access to your account using the Forgejo API.
-token_name = Token Name
+token_name = Token name
generate_token = Generate Token
generate_token_success = Your new token has been generated. Copy it now as it will not be shown again.
generate_token_name_duplicate = %s has been used as an application name already. Please use a new one.
@@ -859,17 +859,17 @@ access_token_desc = Selected token permissions limit authorization only to the c
at_least_one_permission = You must select at least one permission to create a token
permissions_list = Permissions:
-manage_oauth2_applications = Manage OAuth2 Applications
+manage_oauth2_applications = Manage OAuth2 applications
edit_oauth2_application = Edit OAuth2 Application
oauth2_applications_desc = OAuth2 applications enables your third-party application to securely authenticate users at this Forgejo instance.
remove_oauth2_application = Remove OAuth2 Application
remove_oauth2_application_desc = Removing an OAuth2 application will revoke access to all signed access tokens. Continue?
remove_oauth2_application_success = The application has been deleted.
-create_oauth2_application = Create a new OAuth2 Application
+create_oauth2_application = Create a new OAuth2 application
create_oauth2_application_button = Create Application
create_oauth2_application_success = You have successfully created a new OAuth2 application.
update_oauth2_application_success = You have successfully updated the OAuth2 application.
-oauth2_application_name = Application Name
+oauth2_application_name = Application name
oauth2_confidential_client = Confidential Client. Select for apps that keep the secret confidential, such as web apps. Do not select for native apps including desktop and mobile apps.
oauth2_redirect_uris = Redirect URIs. Please use a new line for every URI.
save_application = Save
@@ -883,7 +883,7 @@ oauth2_application_create_description = OAuth2 applications gives your third-par
oauth2_application_remove_description = Removing an OAuth2 application will prevent it from accessing authorized user accounts on this instance. Continue?
oauth2_application_locked = Forgejo pre-registers some OAuth2 applications on startup if enabled in config. To prevent unexpected behavior, these can neither be edited nor removed. Please refer to the OAuth2 documentation for more information.
-authorized_oauth2_applications = Authorized OAuth2 Applications
+authorized_oauth2_applications = Authorized OAuth2 applications
authorized_oauth2_applications_description = You have granted access to your personal Forgejo account to these third party applications. Please revoke access for applications that are no longer in use.
revoke_key = Revoke
revoke_oauth2_grant = Revoke Access
@@ -968,7 +968,7 @@ admin.flags_replaced = Repository flags replaced
new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? Migrate repository.
owner = Owner
owner_helper = Some organizations may not show up in the dropdown due to a maximum repository count limit.
-repo_name = Repository Name
+repo_name = Repository name
repo_name_helper = Good repository names use short, memorable and unique keywords.
repo_size = Repository Size
template = Template
@@ -1024,7 +1024,7 @@ default_branch_label = default
default_branch_helper = The default branch is the base branch for pull requests and code commits.
mirror_prune = Prune
mirror_prune_desc = Remove obsolete remote-tracking references
-mirror_interval = Mirror Interval (valid time units are 'h', 'm', 's'). 0 to disable periodic sync. (Minimum interval: %s)
+mirror_interval = Mirror Interval (valid time units are "h", "m", "s"). 0 to disable periodic sync. (Minimum interval: %s)
mirror_interval_invalid = The mirror interval is not valid.
mirror_sync = synced
mirror_sync_on_commit = Sync when commits are pushed
@@ -1101,7 +1101,7 @@ form.name_reserved = The repository name "%s" is reserved.
form.name_pattern_not_allowed = The pattern "%s" is not allowed in a repository name.
need_auth = Authorization
-migrate_options = Migration Options
+migrate_options = Migration options
migrate_service = Migration Service
migrate_options_mirror_helper = This repository will be a mirror
migrate_options_lfs = Migrate LFS files
@@ -1109,7 +1109,7 @@ migrate_options_lfs_endpoint.label = LFS Endpoint
migrate_options_lfs_endpoint.description = Migration will attempt to use your Git remote to determine the LFS server. You can also specify a custom endpoint if the repository LFS data is stored somewhere else.
migrate_options_lfs_endpoint.description.local = A local server path is supported too.
migrate_options_lfs_endpoint.placeholder = If left blank, the endpoint will be derived from the clone URL
-migrate_items = Migration Items
+migrate_items = Migration items
migrate_items_wiki = Wiki
migrate_items_milestones = Milestones
migrate_items_labels = Labels
@@ -1118,8 +1118,8 @@ migrate_items_pullrequests = Pull Requests
migrate_items_merge_requests = Merge Requests
migrate_items_releases = Releases
migrate_repo = Migrate Repository
-migrate.clone_address = Migrate / Clone From URL
-migrate.clone_address_desc = The HTTP(S) or Git 'clone' URL of an existing repository
+migrate.clone_address = Migrate / Clone from URL
+migrate.clone_address_desc = The HTTP(S) or Git "clone" URL of an existing repository
migrate.github_token_desc = You can put one or more tokens with comma separated here to make migrating faster because of GitHub API rate limit. WARN: Abusing this feature may violate the service provider's policy and lead to account blocking.
migrate.clone_local_path = or a local server path
migrate.permission_denied = You are not allowed to import local repositories.
@@ -1223,8 +1223,8 @@ escape_control_characters = Escape
unescape_control_characters = Unescape
file_copy_permalink = Copy Permalink
view_git_blame = View Git Blame
-video_not_supported_in_browser = Your browser does not support the HTML5 'video' tag.
-audio_not_supported_in_browser = Your browser does not support the HTML5 'audio' tag.
+video_not_supported_in_browser = Your browser does not support the HTML5 "video" tag.
+audio_not_supported_in_browser = Your browser does not support the HTML5 "audio" tag.
stored_lfs = Stored with Git LFS
symbolic_link = Symbolic link
executable_file = Executable File
@@ -1260,12 +1260,12 @@ editor.delete_this_file = Delete File
editor.must_have_write_access = You must have write access to make or propose changes to this file.
editor.file_delete_success = File "%s" has been deleted.
editor.name_your_file = Name your file…
-editor.filename_help = Add a directory by typing its name followed by a slash ('/'). Remove a directory by typing backspace at the beginning of the input field.
+editor.filename_help = Add a directory by typing its name followed by a slash ("/"). Remove a directory by typing backspace at the beginning of the input field.
editor.or = or
editor.cancel_lower = Cancel
editor.commit_signed_changes = Commit Signed Changes
editor.commit_changes = Commit Changes
-editor.add_tmpl = Add ''
+editor.add_tmpl = Add ""
editor.add = Add %s
editor.update = Update %s
editor.delete = Delete %s
@@ -1383,7 +1383,7 @@ projects.column.set_default_desc = Set this column as default for uncategorized
projects.column.unset_default = Unset Default
projects.column.unset_default_desc = Unset this column as default
projects.column.delete = Delete Column
-projects.column.deletion_desc = Deleting a project column moves all related issues to 'Uncategorized'. Continue?
+projects.column.deletion_desc = Deleting a project column moves all related issues to "Uncategorized". Continue?
projects.column.color = Color
projects.open = Open
projects.close = Close
@@ -1432,7 +1432,7 @@ issues.new_label_placeholder = Label name
issues.new_label_desc_placeholder = Description
issues.create_label = Create Label
issues.label_templates.title = Load a predefined set of labels
-issues.label_templates.info = No labels exist yet. Create a label with 'New Label' or use a predefined label set:
+issues.label_templates.info = No labels exist yet. Create a label with "New Label" or use a predefined label set:
issues.label_templates.helper = Select a label set
issues.label_templates.use = Use Label Set
issues.label_templates.fail_to_load_file = Failed to load label template file "%s": %v
@@ -1606,7 +1606,7 @@ issues.lock_no_reason = locked and limited conversation to collaborators %s
issues.unlock_comment = unlocked this conversation %s
issues.lock_confirm = Lock
issues.unlock_confirm = Unlock
-issues.lock.notice_1 = - Other users can’t add new comments to this issue.
+issues.lock.notice_1 = - Other users can't add new comments to this issue.
issues.lock.notice_2 = - You and other collaborators with access to this repository can still leave comments that others can see.
issues.lock.notice_3 = - You can always unlock this issue again in the future.
issues.unlock.notice_1 = - Everyone would be able to comment on this issue once more.
@@ -1640,7 +1640,7 @@ issues.add_time_sum_to_small = No time was entered.
issues.time_spent_total = Total Time Spent
issues.time_spent_from_all_authors = `Total Time Spent: %s`
issues.due_date = Due Date
-issues.invalid_due_date_format = Due date format must be 'yyyy-mm-dd'.
+issues.invalid_due_date_format = Due date format must be "yyyy-mm-dd".
issues.error_modifying_due_date = Failed to modify the due date.
issues.error_removing_due_date = Failed to remove the due date.
issues.push_commit_1 = added %d commit %s
@@ -1657,7 +1657,7 @@ issues.due_date_added = added the due date %s %s
issues.due_date_modified = modified the due date from %[2]s to %[1]s %[3]s
issues.due_date_remove = removed the due date %s %s
issues.due_date_overdue = Overdue
-issues.due_date_invalid = The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
+issues.due_date_invalid = The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
issues.dependency.title = Dependencies
issues.dependency.issue_no_dependencies = No dependencies set.
issues.dependency.pr_no_dependencies = No dependencies set.
@@ -1693,7 +1693,7 @@ issues.review.self.approval = You cannot approve your own pull request.
issues.review.self.rejection = You cannot request changes on your own pull request.
issues.review.approve = approved these changes %s
issues.review.comment = reviewed %s
-issues.review.dismissed = dismissed %s’s review %s
+issues.review.dismissed = dismissed %s's review %s
issues.review.dismissed_label = Dismissed
issues.review.left_comment = left a comment
issues.review.content.empty = You need to leave a comment indicating the requested change(s).
@@ -1897,7 +1897,7 @@ milestones.title = Title
milestones.desc = Description
milestones.due_date = Due Date (optional)
milestones.clear = Clear
-milestones.invalid_due_date_format = Due date format must be 'yyyy-mm-dd'.
+milestones.invalid_due_date_format = Due date format must be "yyyy-mm-dd".
milestones.create_success = The milestone "%s" has been created.
milestones.edit = Edit Milestone
milestones.edit_subheader = Milestones organize issues and track progress.
@@ -1956,7 +1956,7 @@ wiki.page_already_exists = A wiki page with the same name already exists.
wiki.reserved_page = The wiki page name "%s" is reserved.
wiki.pages = Pages
wiki.last_updated = Last updated %s
-wiki.page_name_desc = Enter a name for this Wiki page. Some special names are: 'Home', '_Sidebar' and '_Footer'.
+wiki.page_name_desc = Enter a name for this Wiki page. Some special names are: "Home", "_Sidebar" and "_Footer".
wiki.original_git_entry_tooltip = View original Git file instead of using friendly link.
activity = Activity
@@ -2132,7 +2132,7 @@ settings.actions_desc = Enable Repository Actions
settings.admin_settings = Administrator Settings
settings.admin_enable_health_check = Enable Repository Health Checks (git fsck)
settings.admin_code_indexer = Code Indexer
-settings.admin_stats_indexer = Code Statistics Indexer
+settings.admin_stats_indexer = Code statistics indexer
settings.admin_indexer_commit_sha = Last Indexed SHA
settings.admin_indexer_unindexed = Unindexed
settings.reindex_button = Add to Reindex Queue
@@ -2159,6 +2159,7 @@ settings.transfer_abort_invalid = You cannot cancel a non existent repository tr
settings.transfer_abort_success = The repository transfer to %s was successfully canceled.
settings.transfer_desc = Transfer this repository to a user or to an organization for which you have administrator rights.
settings.enter_repo_name = Enter the owner and repository name exactly as shown:
+settings.confirmation_string = Confirmation string
settings.transfer_in_progress = There is currently an ongoing transfer. Please cancel it if you will like to transfer this repository to another user.
settings.transfer_notices_1 = - You will lose access to the repository if you transfer it to an individual user.
settings.transfer_notices_2 = - You will keep access to the repository if you transfer it to an organization that you (co-)own.
@@ -2361,7 +2362,7 @@ settings.protected_branch.delete_rule = Delete Rule
settings.protected_branch_can_push = Allow push?
settings.protected_branch_can_push_yes = You can push
settings.protected_branch_can_push_no = You cannot push
-settings.branch_protection = Branch Protection Rules for Branch '%s'
+settings.branch_protection = Branch Protection Rules for Branch "%s"
settings.protect_this_branch = Enable Branch Protection
settings.protect_this_branch_desc = Prevents deletion and restricts Git pushing and merging to the branch.
settings.protect_disable_push = Disable Push
@@ -2404,10 +2405,10 @@ settings.require_signed_commits_desc = Reject pushes to this branch if they are
settings.protect_branch_name_pattern = Protected Branch Name Pattern
settings.protect_branch_name_pattern_desc = Protected branch name patterns. See the documentation for pattern syntax. Examples: main, release/**
settings.protect_patterns = Patterns
-settings.protect_protected_file_patterns = Protected file patterns (separated using semicolon ';'):
-settings.protect_protected_file_patterns_desc = Protected files are not allowed to be changed directly even if user has rights to add, edit, or delete files in this branch. Multiple patterns can be separated using semicolon (';'). See github.com/gobwas/glob documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt.
-settings.protect_unprotected_file_patterns = Unprotected file patterns (separated using semicolon ';'):
-settings.protect_unprotected_file_patterns_desc = Unprotected files that are allowed to be changed directly if user has write access, bypassing push restriction. Multiple patterns can be separated using semicolon (';'). See github.com/gobwas/glob documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt.
+settings.protect_protected_file_patterns = Protected file patterns (separated using semicolon ";"):
+settings.protect_protected_file_patterns_desc = Protected files are not allowed to be changed directly even if user has rights to add, edit, or delete files in this branch. Multiple patterns can be separated using semicolon (";"). See github.com/gobwas/glob documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt.
+settings.protect_unprotected_file_patterns = Unprotected file patterns (separated using semicolon ";"):
+settings.protect_unprotected_file_patterns_desc = Unprotected files that are allowed to be changed directly if user has write access, bypassing push restriction. Multiple patterns can be separated using semicolon (";"). See github.com/gobwas/glob documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt.
settings.add_protected_branch = Enable protection
settings.delete_protected_branch = Disable protection
settings.update_protect_branch_success = Branch protection for rule "%s" has been updated.
@@ -2468,7 +2469,7 @@ settings.lfs_findcommits=Find commits
settings.lfs_lfs_file_no_commits=No Commits found for this LFS file
settings.lfs_noattribute=This path does not have the lockable attribute in the default branch
settings.lfs_delete=Delete LFS file with OID %s
-settings.lfs_delete_warning=Deleting an LFS file may cause 'object does not exist' errors on checkout. Are you sure?
+settings.lfs_delete_warning=Deleting an LFS file may cause "object does not exist" errors on checkout. Are you sure?
settings.lfs_findpointerfiles=Find pointer files
settings.lfs_locks=Locks
settings.lfs_invalid_locking_path=Invalid path: %s
@@ -2644,7 +2645,7 @@ tag.create_success = Tag "%s" has been created.
topic.manage_topics = Manage Topics
topic.done = Done
topic.count_prompt = You cannot select more than 25 topics
-topic.format_prompt = Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
+topic.format_prompt = Topics must start with a letter or number, can include dashes ("-") and dots ("."), can be up to 35 characters long. Letters must be lowercase.
find_file.go_to_file = Go to file
find_file.no_matching = No matching file found
@@ -2834,7 +2835,7 @@ dashboard.delete_repo_archives.started = Delete all repository archives task sta
dashboard.delete_missing_repos = Delete all repositories missing their Git files
dashboard.delete_missing_repos.started = Delete all repositories missing their Git files task started.
dashboard.delete_generated_repository_avatars = Delete generated repository avatars
-dashboard.sync_repo_branches = Sync missed branches from git data to databases
+dashboard.sync_repo_branches = Sync missed branches from git data to database
dashboard.sync_repo_tags = Sync tags from git data to database
dashboard.update_mirrors = Update Mirrors
dashboard.repo_health_check = Health check all repositories
@@ -2843,9 +2844,9 @@ dashboard.archive_cleanup = Delete old repository archives
dashboard.deleted_branches_cleanup = Clean-up deleted branches
dashboard.update_migration_poster_id = Update migration poster IDs
dashboard.git_gc_repos = Garbage collect all repositories
-dashboard.resync_all_sshkeys = Update the '.ssh/authorized_keys' file with Forgejo SSH keys.
-dashboard.resync_all_sshprincipals = Update the '.ssh/authorized_principals' file with Forgejo SSH principals.
-dashboard.resync_all_hooks = Resynchronize pre-receive, update and post-receive hooks of all repositories.
+dashboard.resync_all_sshkeys = Update the ".ssh/authorized_keys" file with Forgejo SSH keys.
+dashboard.resync_all_sshprincipals = Update the ".ssh/authorized_principals" file with Forgejo SSH principals.
+dashboard.resync_all_hooks = Resynchronize pre-receive, update and post-receive hooks of all repositories
dashboard.reinit_missing_repos = Reinitialize all missing Git repositories for which records exist
dashboard.sync_external_users = Synchronize external user data
dashboard.cleanup_hook_task_table = Cleanup hook_task table
@@ -3038,7 +3039,7 @@ auths.search_page_size = Page Size
auths.filter = User Filter
auths.admin_filter = Admin Filter
auths.restricted_filter = Restricted Filter
-auths.restricted_filter_helper = Leave empty to not set any users as restricted. Use an asterisk ('*') to set all users that do not match Admin Filter as restricted.
+auths.restricted_filter_helper = Leave empty to not set any users as restricted. Use an asterisk ("*") to set all users that do not match Admin Filter as restricted.
auths.verify_group_membership = Verify group membership in LDAP (leave the filter empty to skip)
auths.group_search_base = Group Search Base DN
auths.group_attribute_list_users = Group Attribute Containing List Of Users
@@ -3051,7 +3052,7 @@ auths.smtp_auth = SMTP Authentication Type
auths.smtphost = SMTP Host
auths.smtpport = SMTP Port
auths.allowed_domains = Allowed Domains
-auths.allowed_domains_helper = Leave empty to allow all domains. Separate multiple domains with a comma (',').
+auths.allowed_domains_helper = Leave empty to allow all domains. Separate multiple domains with a comma (",").
auths.skip_tls_verify = Skip TLS Verify
auths.force_smtps = Force SMTPS
auths.force_smtps_helper = SMTPS is always used on port 465. Set this to force SMTPS on other ports. (Otherwise STARTTLS will be used on other ports if it is supported by the host.)
@@ -3098,7 +3099,7 @@ auths.tips = Tips
auths.tips.oauth2.general = OAuth2 Authentication
auths.tips.oauth2.general.tip = When registering a new OAuth2 authentication, the callback/redirect URL should be:
auths.tip.oauth2_provider = OAuth2 Provider
-auths.tip.bitbucket = Register a new OAuth consumer on https://bitbucket.org/account/user//oauth-consumers/new and add the permission 'Account' - 'Read'
+auths.tip.bitbucket = Register a new OAuth consumer on https://bitbucket.org/account/user//oauth-consumers/new and add the permission "Account" - "Read"
auths.tip.nextcloud = Register a new OAuth consumer on your instance using the following menu "Settings -> Security -> OAuth 2.0 client"
auths.tip.dropbox = Create a new application at https://www.dropbox.com/developers/apps
auths.tip.facebook = Register a new application at https://developers.facebook.com/apps and add the product "Facebook Login"
@@ -3153,7 +3154,7 @@ config.ssh_port = Port
config.ssh_listen_port = Listen Port
config.ssh_root_path = Root Path
config.ssh_key_test_path = Key Test Path
-config.ssh_keygen_path = Keygen ('ssh-keygen') Path
+config.ssh_keygen_path = Keygen ("ssh-keygen") Path
config.ssh_minimum_key_size_check = Minimum Key Size Check
config.ssh_minimum_key_sizes = Minimum Key Sizes
@@ -3532,7 +3533,7 @@ settings.delete.description = Deleting a package is permanent and cannot be undo
settings.delete.notice = You are about to delete %s (%s). This operation is irreversible, are you sure?
settings.delete.success = The package has been deleted.
settings.delete.error = Failed to delete the package.
-owner.settings.cargo.title = Cargo Registry Index
+owner.settings.cargo.title = Cargo registry index
owner.settings.cargo.initialize = Initialize Index
owner.settings.cargo.initialize.description = A special index Git repository is needed to use the Cargo registry. Using this option will (re-)create the repository and configure it automatically.
owner.settings.cargo.initialize.error = Failed to initialize Cargo index: %v
@@ -3541,7 +3542,7 @@ owner.settings.cargo.rebuild = Rebuild Index
owner.settings.cargo.rebuild.description = Rebuilding can be useful if the index is not synchronized with the stored Cargo packages.
owner.settings.cargo.rebuild.error = Failed to rebuild Cargo index: %v
owner.settings.cargo.rebuild.success = The Cargo index was successfully rebuild.
-owner.settings.cleanuprules.title = Manage Cleanup Rules
+owner.settings.cleanuprules.title = Manage cleanup rules
owner.settings.cleanuprules.add = Add Cleanup Rule
owner.settings.cleanuprules.edit = Edit Cleanup Rule
owner.settings.cleanuprules.none = There are no cleanup rules yet.
@@ -3561,7 +3562,7 @@ owner.settings.cleanuprules.remove.days = Remove versions older than
owner.settings.cleanuprules.remove.pattern = Remove versions matching
owner.settings.cleanuprules.success.update = Cleanup rule has been updated.
owner.settings.cleanuprules.success.delete = Cleanup rule has been deleted.
-owner.settings.chef.title = Chef Registry
+owner.settings.chef.title = Chef registry
owner.settings.chef.keypair = Generate key pair
owner.settings.chef.keypair.description = A key pair is necessary to authenticate to the Chef registry. If you have generated a key pair before, generating a new key pair will discard the old key pair.
@@ -3649,9 +3650,9 @@ runs.no_runs = The workflow has no runs yet.
runs.empty_commit_message = (empty commit message)
workflow.disable = Disable Workflow
-workflow.disable_success = Workflow '%s' disabled successfully.
+workflow.disable_success = Workflow "%s" disabled successfully.
workflow.enable = Enable Workflow
-workflow.enable_success = Workflow '%s' enabled successfully.
+workflow.enable_success = Workflow "%s" enabled successfully.
workflow.disabled = Workflow is disabled.
need_approval_desc = Need approval to run workflows for fork pull request.
diff --git a/templates/repo/migrate/migrating.tmpl b/templates/repo/migrate/migrating.tmpl
index bf8ea0ef7a..4d7e45f2e0 100644
--- a/templates/repo/migrate/migrating.tmpl
+++ b/templates/repo/migrate/migrating.tmpl
@@ -73,7 +73,7 @@
diff --git a/tests/integration/xss_test.go b/tests/integration/xss_test.go
index acd716c7c7..6fe394acda 100644
--- a/tests/integration/xss_test.go
+++ b/tests/integration/xss_test.go
@@ -125,5 +125,5 @@ func TestXSSReviewDismissed(t *testing.T) {
htmlDoc := NewHTMLParser(t, resp.Body)
htmlDoc.AssertElement(t, "script.evil", false)
- assert.Contains(t, htmlDoc.Find("#issuecomment-1000 .dismissed-message").Text(), `dismissed Otto ’s review`)
+ assert.Contains(t, htmlDoc.Find("#issuecomment-1000 .dismissed-message").Text(), `dismissed Otto 's review`)
}
From 5bc7b8baf8dd1269be708e82911168884b3c0b0b Mon Sep 17 00:00:00 2001
From: "Panagiotis \"Ivory\" Vasilopoulos"
Date: Tue, 27 Feb 2024 13:35:21 +0100
Subject: [PATCH 176/807] [UI] Agit: Add link to docs and tooltip to label
Continuation of #2444, which introduced the commit
bf7fb89178f41c712b8a8863667a442ec1e1c5d4 but only added
the label and the tests.
The tooltip explaining what AGit is and its advantages is not
meant to advertise AGit - it is meant to inform the reader that
is presumably not familiar with the workflow that they will not
be able to find a fork or a branch associated with the Pull Request
as a direct consequence of this workflow.
Issue #2474 mentions that we should show instructions on how to
fetch an AGit-created Pull Request, and this is the plan. However,
this may take time, so I might as well make the label a bit more
"complete" and less out-of-place for now if we do not manage to
improve these instructions until the next release (Forgejo v1.22).
Refs: https://codeberg.org/forgejo/forgejo/issues/2474
---
options/locale/locale_en-US.ini | 4 +++-
templates/repo/issue/view_title.tmpl | 11 +++++++----
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 96c5942486..b41d818399 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -1508,7 +1508,6 @@ issues.action_check_all = Check/Uncheck all items
issues.opened_by = opened %[1]s by %[3]s
pulls.merged_by = by %[3]s was merged %[1]s
pulls.merged_by_fake = by %[2]s was merged %[1]s
-pulls.made_using_agit = AGit
issues.closed_by = by %[3]s was closed %[1]s
issues.opened_by_fake = opened %[1]s by %[2]s
issues.closed_by_fake = by %[2]s was closed %[1]s
@@ -1865,6 +1864,9 @@ pulls.clear_merge_message_hint = Clearing the merge message will only remove the
pulls.reopen_failed.head_branch = The pull request cannot be reopened, because the head branch doesn't exist anymore.
pulls.reopen_failed.base_branch = The pull request cannot be reopened, because the base branch doesn't exist anymore.
+pulls.made_using_agit = AGit
+pulls.agit_explanation = Created using the AGit workflow. AGit lets contributors propose changes using "git push" without creating a fork or a new branch.
+
pulls.auto_merge_button_when_succeed = (When checks succeed)
pulls.auto_merge_when_succeed = Auto merge when all checks succeed
pulls.auto_merge_newly_scheduled = The pull request was scheduled to merge when all checks succeed.
diff --git a/templates/repo/issue/view_title.tmpl b/templates/repo/issue/view_title.tmpl
index 3f93f3ba35..339def894c 100644
--- a/templates/repo/issue/view_title.tmpl
+++ b/templates/repo/issue/view_title.tmpl
@@ -73,10 +73,13 @@
{{end}}
{{if .MadeUsingAGit}}
- {{/* TODO: Add tooltip and a link to the documentation */}}
-
- {{ctx.Locale.Tr "repo.pulls.made_using_agit"}}
-
+ {{/* TODO: Move documentation link to the instructions at the bottom of the PR, show instructions when clicking label */}}
+ {{/* Note: #agit-label is necessary for testing whether the label appears when it should in tests/integration/git_test.go */}}
+
+
+ {{ctx.Locale.Tr "repo.pulls.made_using_agit"}}
+
+
{{end}}
From 00b24d2d9adab83322e3d508b06c974c7fb75665 Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Tue, 27 Feb 2024 11:04:12 +0100
Subject: [PATCH 177/807] Allow `'s` in mentions
When mentioning a user in a comment, or a similar place, sometimes one
would wish to use a possessive: `As per @user's suggestion` or somesuch.
This patch modifies the `mentionPattern` used to find mentions, to allow
- and then ignore - apostrophes and whatever comes after them.
Signed-off-by: Gergely Nagy
---
modules/references/references.go | 2 +-
modules/references/references_test.go | 3 +++
modules/templates/util_render_test.go | 5 +++++
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/modules/references/references.go b/modules/references/references.go
index 7758312564..fce893cf5b 100644
--- a/modules/references/references.go
+++ b/modules/references/references.go
@@ -29,7 +29,7 @@ var (
// TODO: fix invalid linking issue
// mentionPattern matches all mentions in the form of "@user" or "@org/team"
- mentionPattern = regexp.MustCompile(`(?:\s|^|\(|\[)(@[0-9a-zA-Z-_]+|@[0-9a-zA-Z-_]+\/?[0-9a-zA-Z-_]+|@[0-9a-zA-Z-_][0-9a-zA-Z-_.]+\/?[0-9a-zA-Z-_.]+[0-9a-zA-Z-_])(?:\s|[:,;.?!]\s|[:,;.?!]?$|\)|\])`)
+ mentionPattern = regexp.MustCompile(`(?:\s|^|\(|\[)(@[0-9a-zA-Z-_]+|@[0-9a-zA-Z-_]+\/?[0-9a-zA-Z-_]+|@[0-9a-zA-Z-_][0-9a-zA-Z-_.]+\/?[0-9a-zA-Z-_.]+[0-9a-zA-Z-_])(?:'|\s|[:,;.?!]\s|[:,;.?!]?$|\)|\])`)
// issueNumericPattern matches string that references to a numeric issue, e.g. #1287
issueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[|\')([#!][0-9]+)(?:\s|$|\)|\]|[:;,.?!]\s|[:;,.?!]$)`)
// issueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234
diff --git a/modules/references/references_test.go b/modules/references/references_test.go
index ba7dda80cc..3f1f52401a 100644
--- a/modules/references/references_test.go
+++ b/modules/references/references_test.go
@@ -392,6 +392,9 @@ func TestRegExp_mentionPattern(t *testing.T) {
{"@gitea,", "@gitea"},
{"@gitea;", "@gitea"},
{"@gitea/team1;", "@gitea/team1"},
+ {"@jess'", "@jess"},
+ {"@forgejo's", "@forgejo"},
+ {"Оно сломалось из-за коммитов от @jopik'а", "@jopik"},
}
falseTestCases := []string{
"@ 0",
diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go
index 8648967d38..465640e08d 100644
--- a/modules/templates/util_render_test.go
+++ b/modules/templates/util_render_test.go
@@ -59,6 +59,11 @@ func TestMain(m *testing.M) {
os.Exit(m.Run())
}
+func TestApostrophesInMentions(t *testing.T) {
+ rendered := RenderMarkdownToHtml(context.Background(), "@mention-user's comment")
+ assert.EqualValues(t, "
diff --git a/web_src/css/modules/navbar.css b/web_src/css/modules/navbar.css
index b6fd2ff20a..11020df359 100644
--- a/web_src/css/modules/navbar.css
+++ b/web_src/css/modules/navbar.css
@@ -41,8 +41,8 @@
justify-content: stretch;
}
-#navbar a.item:hover,
-#navbar button.item:hover {
+#navbar a.item:hover, #navbar a.item:focus,
+#navbar button.item:hover, #navbar button.item:focus {
background: var(--color-nav-hover-bg);
}
From 4d2c019b5abc920737ca857b433b799b679fec1d Mon Sep 17 00:00:00 2001
From: Otto Richter
Date: Sun, 18 Feb 2024 17:28:35 +0100
Subject: [PATCH 196/807] Add focus styling to most button types
While it might be favourable to have distinct focus and hover styling,
having no focus styling at all makes keyboard navigation very difficult.
Some people consider :focus to be equal to a keyboard-driven :hover, so
I'm moving the focus pseudo-classes from being a no-op to adding the
hover styling.
---
web_src/css/base.css | 6 ++--
web_src/css/modules/button.css | 64 ++++++++++++++++++----------------
2 files changed, 37 insertions(+), 33 deletions(-)
diff --git a/web_src/css/base.css b/web_src/css/base.css
index 9cad9c5d23..bb45c8d325 100644
--- a/web_src/css/base.css
+++ b/web_src/css/base.css
@@ -1935,9 +1935,9 @@ table th[data-sortt-desc] .svg {
}
.ui.secondary.pointing.menu .active.item,
-.ui.secondary.pointing.menu .active.item:hover,
-.ui.secondary.pointing.menu .dropdown.item:hover,
-.ui.secondary.pointing.menu a.item:hover {
+.ui.secondary.pointing.menu .active.item:hover, .ui.secondary.pointing.menu .active.item:focus,
+.ui.secondary.pointing.menu .dropdown.item:hover, .ui.secondary.pointing.menu .dropdown.item:focus,
+.ui.secondary.pointing.menu a.item:hover, .ui.secondary.pointing.menu a.item:focus {
color: var(--color-text-dark);
}
diff --git a/web_src/css/modules/button.css b/web_src/css/modules/button.css
index 36cb499aeb..b772a4c14e 100644
--- a/web_src/css/modules/button.css
+++ b/web_src/css/modules/button.css
@@ -1,14 +1,14 @@
/* this contains override styles for buttons and related elements */
/* these styles changed the Fomantic UI's rules, Fomantic UI expects only "basic" buttons have borders */
-.ui.button,
-.ui.button:focus {
+.ui.button {
background: var(--color-button);
border: 1px solid var(--color-light-border);
color: var(--color-text);
}
-.ui.button:hover {
+.ui.button:hover,
+.ui.button:focus {
background: var(--color-hover);
color: var(--color-text);
}
@@ -20,13 +20,15 @@
.ui.active.button,
.ui.button:active,
.ui.active.button:active,
-.ui.active.button:hover {
+.ui.active.button:hover,
+.ui.active.button:focus {
background: var(--color-active);
color: var(--color-text);
}
.delete-button,
-.delete-button:hover {
+.delete-button:hover,
+.delete-button:focus {
color: var(--color-red);
}
@@ -87,15 +89,15 @@ It needs some tricks to tweak the left/right borders with active state */
.ui.labeled.button.disabled > .button,
.ui.basic.buttons .button,
-.ui.basic.button,
-.ui.basic.buttons .button:focus,
-.ui.basic.button:focus {
+.ui.basic.button {
color: var(--color-text-light);
background: var(--color-button);
}
.ui.basic.buttons .button:hover,
-.ui.basic.button:hover {
+.ui.basic.button:hover,
+.ui.basic.buttons .button:focus,
+.ui.basic.button:focus {
color: var(--color-text);
background: var(--color-hover);
}
@@ -105,7 +107,9 @@ It needs some tricks to tweak the left/right borders with active state */
.ui.basic.buttons .active.button,
.ui.basic.active.button,
.ui.basic.buttons .active.button:hover,
-.ui.basic.active.button:hover {
+.ui.basic.active.button:hover,
+.ui.basic.buttons .active.button:focus,
+.ui.basic.active.button:focus {
color: var(--color-text);
background: var(--color-active);
}
@@ -124,15 +128,15 @@ It needs some tricks to tweak the left/right borders with active state */
.ui.primary.labels .label,
.ui.ui.ui.primary.label,
.ui.primary.button,
-.ui.primary.buttons .button,
-.ui.primary.button:focus,
-.ui.primary.buttons .button:focus {
+.ui.primary.buttons .button {
background: var(--color-primary);
color: var(--color-primary-contrast);
}
.ui.primary.button:hover,
-.ui.primary.buttons .button:hover {
+.ui.primary.buttons .button:hover,
+.ui.primary.button:focus,
+.ui.primary.buttons .button:focus {
background: var(--color-primary-hover);
color: var(--color-primary-contrast);
}
@@ -143,15 +147,15 @@ It needs some tricks to tweak the left/right borders with active state */
}
.ui.basic.primary.buttons .button,
-.ui.basic.primary.button,
-.ui.basic.primary.buttons .button:focus,
-.ui.basic.primary.button:focus {
+.ui.basic.primary.button{
color: var(--color-primary);
border-color: var(--color-primary);
}
.ui.basic.primary.buttons .button:hover,
-.ui.basic.primary.button:hover {
+.ui.basic.primary.button:hover,
+.ui.basic.primary.buttons .button:focus,
+.ui.basic.primary.button:focus {
color: var(--color-primary-hover);
border-color: var(--color-primary-hover);
}
@@ -184,15 +188,15 @@ It needs some tricks to tweak the left/right borders with active state */
}
.ui.basic.secondary.buttons .button,
-.ui.basic.secondary.button,
-.ui.basic.secondary.button:focus,
-.ui.basic.secondary.buttons .button:focus {
+.ui.basic.secondary.button {
color: var(--color-secondary-button);
border-color: var(--color-secondary-button);
}
.ui.basic.secondary.buttons .button:hover,
-.ui.basic.secondary.button:hover {
+.ui.basic.secondary.button:hover,
+.ui.basic.secondary.button:focus,
+.ui.basic.secondary.buttons .button:focus {
color: var(--color-secondary-hover);
border-color: var(--color-secondary-hover);
}
@@ -208,14 +212,14 @@ It needs some tricks to tweak the left/right borders with active state */
.ui.red.labels .label,
.ui.ui.ui.red.label,
.ui.red.button,
-.ui.red.buttons .button,
-.ui.red.button:focus,
-.ui.red.buttons .button:focus {
+.ui.red.buttons .button {
background: var(--color-red);
}
.ui.red.button:hover,
-.ui.red.buttons .button:hover {
+.ui.red.buttons .button:hover,
+.ui.red.button:focus,
+.ui.red.buttons .button:focus {
background: var(--color-red-dark-1);
}
@@ -225,15 +229,15 @@ It needs some tricks to tweak the left/right borders with active state */
}
.ui.basic.red.buttons .button,
-.ui.basic.red.button,
-.ui.basic.red.buttons .button:focus,
-.ui.basic.red.button:focus {
+.ui.basic.red.button {
color: var(--color-red);
border-color: var(--color-red);
}
.ui.basic.red.buttons .button:hover,
-.ui.basic.red.button:hover {
+.ui.basic.red.button:hover,
+.ui.basic.red.buttons .button:focus,
+.ui.basic.red.button:focus {
color: var(--color-red-dark-1);
border-color: var(--color-red-dark-1);
}
From 88f68850b59b6ae801df8af5d677e88e4dd16133 Mon Sep 17 00:00:00 2001
From: Otto Richter
Date: Sun, 18 Feb 2024 17:54:53 +0100
Subject: [PATCH 197/807] Accessibility: Watch & Star on small screens
The elements were hidden on small screens to preserve space and the
icons still conveyed the meaning for users with intact eye vision.
However, the names were no longer exposed to screen readers, and their
users usually cannot obtain the meaning from the icons.
Adding aria-labels to the affected templates results in certain
complexity due to the DOM, so instead I decided to use some accessible
CSS tricks to move the content off the screen instead of hiding it. It
should remain accessible for most screen readers.
---
web_src/css/repo/header.css | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/web_src/css/repo/header.css b/web_src/css/repo/header.css
index d5c7d212e8..3400284e4b 100644
--- a/web_src/css/repo/header.css
+++ b/web_src/css/repo/header.css
@@ -89,11 +89,17 @@
.repo-header .flex-item {
flex-grow: 1;
}
- .repo-buttons .ui.labeled.button .text {
- display: none;
- }
+ .repo-buttons .ui.labeled.button .text,
.repo-header .flex-item-trailing .label {
- display: none;
+ /* the elements are hidden from users with intact eye vision,
+ * because SVG icons convey the meaning.
+ * However, they should remain accessible to screen readers */
+ position: absolute;
+ left: -1000vw;
+ top: auto;
+ width: 1px;
+ height: 1px;
+ overflow: hidden;
}
.repo-header .flex-item-trailing .repo-icon {
display: initial;
From c63b52c1267b87b5888f77c7c98bff83b41839db Mon Sep 17 00:00:00 2001
From: Gusted
Date: Thu, 29 Feb 2024 20:51:02 +0100
Subject: [PATCH 198/807] [FEAT] Show follow symlink button
- When a user goes opens a symlink file in Forgejo, the file would be
rendered with the path of the symlink as content.
- Add a button that is shown when the user opens a *valid* symlink file,
which means that the symlink must have an valid path to an existent
file and after 999 follows isn't a symlink anymore.
- Return the relative path from the `FollowLink` functions, because Git
really doesn't want to tell where an file is located based on the blob ID.
- Adds integration tests.
---
modules/base/tool.go | 2 +-
modules/git/tree_entry.go | 32 +++++++++++----------
options/locale/locale_en-US.ini | 1 +
routers/web/repo/view.go | 13 +++++++--
templates/repo/view_file.tmpl | 3 ++
tests/integration/repo_test.go | 51 +++++++++++++++++++++++++++++++++
6 files changed, 84 insertions(+), 18 deletions(-)
diff --git a/modules/base/tool.go b/modules/base/tool.go
index 168a2220b2..231507546d 100644
--- a/modules/base/tool.go
+++ b/modules/base/tool.go
@@ -174,7 +174,7 @@ func Int64sToStrings(ints []int64) []string {
func EntryIcon(entry *git.TreeEntry) string {
switch {
case entry.IsLink():
- te, err := entry.FollowLink()
+ te, _, err := entry.FollowLink()
if err != nil {
log.Debug(err.Error())
return "file-symlink-file"
diff --git a/modules/git/tree_entry.go b/modules/git/tree_entry.go
index 9513121487..2c47c8858c 100644
--- a/modules/git/tree_entry.go
+++ b/modules/git/tree_entry.go
@@ -23,15 +23,15 @@ func (te *TreeEntry) Type() string {
}
// FollowLink returns the entry pointed to by a symlink
-func (te *TreeEntry) FollowLink() (*TreeEntry, error) {
+func (te *TreeEntry) FollowLink() (*TreeEntry, string, error) {
if !te.IsLink() {
- return nil, ErrBadLink{te.Name(), "not a symlink"}
+ return nil, "", ErrBadLink{te.Name(), "not a symlink"}
}
// read the link
r, err := te.Blob().DataAsync()
if err != nil {
- return nil, err
+ return nil, "", err
}
closed := false
defer func() {
@@ -42,7 +42,7 @@ func (te *TreeEntry) FollowLink() (*TreeEntry, error) {
buf := make([]byte, te.Size())
_, err = io.ReadFull(r, buf)
if err != nil {
- return nil, err
+ return nil, "", err
}
_ = r.Close()
closed = true
@@ -56,33 +56,35 @@ func (te *TreeEntry) FollowLink() (*TreeEntry, error) {
}
if t == nil {
- return nil, ErrBadLink{te.Name(), "points outside of repo"}
+ return nil, "", ErrBadLink{te.Name(), "points outside of repo"}
}
target, err := t.GetTreeEntryByPath(lnk)
if err != nil {
if IsErrNotExist(err) {
- return nil, ErrBadLink{te.Name(), "broken link"}
+ return nil, "", ErrBadLink{te.Name(), "broken link"}
}
- return nil, err
+ return nil, "", err
}
- return target, nil
+ return target, lnk, nil
}
// FollowLinks returns the entry ultimately pointed to by a symlink
-func (te *TreeEntry) FollowLinks() (*TreeEntry, error) {
+func (te *TreeEntry) FollowLinks() (*TreeEntry, string, error) {
if !te.IsLink() {
- return nil, ErrBadLink{te.Name(), "not a symlink"}
+ return nil, "", ErrBadLink{te.Name(), "not a symlink"}
}
entry := te
+ entryLink := ""
for i := 0; i < 999; i++ {
if entry.IsLink() {
- next, err := entry.FollowLink()
+ next, link, err := entry.FollowLink()
+ entryLink = link
if err != nil {
- return nil, err
+ return nil, "", err
}
if next.ID == entry.ID {
- return nil, ErrBadLink{
+ return nil, "", ErrBadLink{
entry.Name(),
"recursive link",
}
@@ -93,12 +95,12 @@ func (te *TreeEntry) FollowLinks() (*TreeEntry, error) {
}
}
if entry.IsLink() {
- return nil, ErrBadLink{
+ return nil, "", ErrBadLink{
te.Name(),
"too many levels of symbolic links",
}
}
- return entry, nil
+ return entry, entryLink, nil
}
// returns the Tree pointed to by this TreeEntry, or nil if this is not a tree
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 0a6b1e0d82..424b063796 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -1205,6 +1205,7 @@ tag = Tag
released_this = released this
file.title = %s at %s
file_raw = Raw
+file_follow = Follow Symlink
file_history = History
file_view_source = View Source
file_view_rendered = View Rendered
diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go
index 86977062cb..32c09bb5f2 100644
--- a/routers/web/repo/view.go
+++ b/routers/web/repo/view.go
@@ -114,7 +114,7 @@ func findReadmeFileInEntries(ctx *context.Context, entries []*git.TreeEntry, try
log.Debug("Potential readme file: %s", entry.Name())
if readmeFiles[i] == nil || base.NaturalSortLess(readmeFiles[i].Name(), entry.Blob().Name()) {
if entry.IsLink() {
- target, err := entry.FollowLinks()
+ target, _, err := entry.FollowLinks()
if err != nil && !git.IsErrBadLink(err) {
return "", nil, err
} else if target != nil && (target.IsExecutable() || target.IsRegular()) {
@@ -267,7 +267,7 @@ func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) ([]byte,
func renderReadmeFile(ctx *context.Context, subfolder string, readmeFile *git.TreeEntry) {
target := readmeFile
if readmeFile != nil && readmeFile.IsLink() {
- target, _ = readmeFile.FollowLinks()
+ target, _, _ = readmeFile.FollowLinks()
}
if target == nil {
// if findReadmeFile() failed and/or gave us a broken symlink (which it shouldn't)
@@ -391,6 +391,15 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
ctx.Data["FileName"] = blob.Name()
ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/raw/" + ctx.Repo.BranchNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath)
+ if entry.IsLink() {
+ _, link, err := entry.FollowLinks()
+ // Errors should be allowed, because this shouldn't
+ // block rendering invalid symlink files.
+ if err == nil {
+ ctx.Data["SymlinkURL"] = ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchNameSubURL() + "/" + util.PathEscapeSegments(link)
+ }
+ }
+
commit, err := ctx.Repo.Commit.GetCommitByPath(ctx.Repo.TreePath)
if err != nil {
ctx.ServerError("GetCommitByPath", err)
diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl
index b8eb2393fe..91b10f744a 100644
--- a/templates/repo/view_file.tmpl
+++ b/templates/repo/view_file.tmpl
@@ -43,6 +43,9 @@
{{end}}
{{if not .ReadmeInList}}
+ {{if .SymlinkURL}}
+ {{ctx.Locale.Tr "repo.file_follow"}}
+ {{end}}
{{ctx.Locale.Tr "repo.file_raw"}}
{{if not .IsViewCommit}}
{{ctx.Locale.Tr "repo.file_permalink"}}
diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go
index 03124ecaf8..cb79a2fa9b 100644
--- a/tests/integration/repo_test.go
+++ b/tests/integration/repo_test.go
@@ -961,3 +961,54 @@ func TestRepoFilesList(t *testing.T) {
assert.EqualValues(t, []string{"Charlie", "alpha", "Beta", "delta", "licensa", "LICENSE", "licensz", "README.md", "zEta"}, filesList)
})
}
+
+func TestRepoFollowSymlink(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+ session := loginUser(t, "user2")
+
+ assertCase := func(t *testing.T, url, expectedSymlinkURL string, shouldExist bool) {
+ t.Helper()
+
+ req := NewRequest(t, "GET", url)
+ resp := session.MakeRequest(t, req, http.StatusOK)
+
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ symlinkURL, ok := htmlDoc.Find(".file-actions .button[data-kind='follow-symlink']").Attr("href")
+ if shouldExist {
+ assert.True(t, ok)
+ assert.EqualValues(t, expectedSymlinkURL, symlinkURL)
+ } else {
+ assert.False(t, ok)
+ }
+ }
+
+ t.Run("Normal", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ assertCase(t, "/user2/readme-test/src/branch/symlink/README.md?display=source", "/user2/readme-test/src/branch/symlink/some/other/path/awefulcake.txt", true)
+ })
+
+ t.Run("Normal", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ assertCase(t, "/user2/readme-test/src/branch/symlink/some/README.txt", "/user2/readme-test/src/branch/symlink/some/other/path/awefulcake.txt", true)
+ })
+
+ t.Run("Normal", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ assertCase(t, "/user2/readme-test/src/branch/symlink/up/back/down/down/README.md", "/user2/readme-test/src/branch/symlink/down/side/../left/right/../reelmein", true)
+ })
+
+ t.Run("Broken symlink", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ assertCase(t, "/user2/readme-test/src/branch/fallbacks-broken-symlinks/docs/README", "", false)
+ })
+
+ t.Run("Loop symlink", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ assertCase(t, "/user2/readme-test/src/branch/symlink-loop/README.md", "", false)
+ })
+
+ t.Run("Not a symlink", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ assertCase(t, "/user2/readme-test/src/branch/master/README.md", "", false)
+ })
+}
From ad547edf3b291aca5dce1773bf1b6bb3601774e0 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Sun, 3 Mar 2024 11:11:26 +0800
Subject: [PATCH 199/807] [TESTS] enable AddFixtures in unit tests
Use setting.AppWorkPath instead of filepath.Dir(setting.AppPath). It
is the common denominator between:
* models/unittest/testdb.go:MainTest
* tests/test_utils.go:InitTest
which makes it usable in unit tests as well as integration tests.
---
tests/test_utils.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tests/test_utils.go b/tests/test_utils.go
index 8e456783cf..85d7462d73 100644
--- a/tests/test_utils.go
+++ b/tests/test_utils.go
@@ -271,8 +271,8 @@ func Printf(format string, args ...any) {
func AddFixtures(dirs ...string) func() {
return unittest.OverrideFixtures(
unittest.FixturesOptions{
- Dir: filepath.Join(filepath.Dir(setting.AppPath), "models/fixtures/"),
- Base: filepath.Dir(setting.AppPath),
+ Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"),
+ Base: setting.AppWorkPath,
Dirs: dirs,
},
)
From 41b4884085347a24b0f9e3993b2e75a37c29e3ef Mon Sep 17 00:00:00 2001
From: Codeberg Translate
Date: Mon, 4 Mar 2024 01:58:49 +0000
Subject: [PATCH 200/807] [I18N] Translations update from Weblate (#2521)
Translations update from [Weblate](https://translate.codeberg.org) for [Forgejo/forgejo](https://translate.codeberg.org/projects/forgejo/forgejo/).
Current translation status:
![Weblate translation status](https://translate.codeberg.org/widget/forgejo/forgejo/horizontal-auto.svg)
Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org>
Co-authored-by: TheAwiteb
Co-authored-by: mondstern
Co-authored-by: flactwin
Co-authored-by: Gusted
Co-authored-by: Salif Mehmed
Co-authored-by: Fjuro
Co-authored-by: Wuzzy
Co-authored-by: fnetX
Co-authored-by: zenobit
Co-authored-by: Dirk
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/2521
Co-authored-by: Codeberg Translate
Co-committed-by: Codeberg Translate
---
options/locale/locale_ar.ini | 17 +-
options/locale/locale_be.ini | 19 ++
options/locale/locale_bg.ini | 320 +++++++++++++++++++++++++++---
options/locale/locale_cs-CZ.ini | 337 +++++++++++++++++++++++---------
options/locale/locale_de-DE.ini | 286 ++++++++++++++-------------
options/locale/locale_nl-NL.ini | 13 +-
options/locale/locale_ru-RU.ini | 102 +++++-----
options/locale/locale_sl.ini | 129 +++++++++++-
8 files changed, 897 insertions(+), 326 deletions(-)
create mode 100644 options/locale/locale_be.ini
diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini
index 7f0f9791c7..c60ed5c42c 100644
--- a/options/locale/locale_ar.ini
+++ b/options/locale/locale_ar.ini
@@ -64,7 +64,7 @@ copy_url = انسخ الرابط
admin_panel = إدارة الموقع
copy_error = فشل النسخ
new_mirror = مرآة جديدة
-re_type = أكّد كلمة المرور الجديدة
+re_type = تأكيد كلمة المرور
webauthn_unsupported_browser = متصفحك لا يدعم ويب آوثن حالياً.
copy = انسخ
enabled = مُفَعَّل
@@ -210,8 +210,8 @@ admin_email = عنوان البريد الإلكتروني
install_btn_confirm = تثبت فورجيو
secret_key_failed = لم يتم توليد مفتاح سري: %v
save_config_failed = فشل في حفظ الإعداد: %s
-sqlite3_not_available = هذا الأصدار من فورجيو لا يدعم SQLite3. من فضلك قم بتحميل الاصدار الملفي الرسمي من %s (ليس اصدار 'gobuild').
-test_git_failed = لم يتمكن من أختبار أمر جِت: %v
+sqlite3_not_available = هذا الإصدار من فورجيو لا يدعم SQLite3. من فضلك قم بتنزيل الإصدار الرسمي من %s (ليس إصدار 'gobuild').
+test_git_failed = يتعذر اختبار أمر جِت: %v
confirm_password = أكّد كلمة المرور
invalid_admin_setting = إعداد حساب المدير غير صالح: %v
invalid_log_root_path = مسار السجل غير صالح: %v
@@ -1375,6 +1375,7 @@ network_error = خطأ في الشبكة
invalid_csrf = طلب سيئ: رمز CSRF غير صالح
occurred = حدث خطأ
missing_csrf = طلب سيئ: لا يوجد رمز CSRF
+server_internal = خطأ داخلي في الخادم
[startpage]
install = سهلة التثبيت
@@ -1492,6 +1493,7 @@ openid_signin_desc = أدخل مسار الـOpenID الخاص بك. مثلاً:
openid_register_desc = مسار الـOpenID المختار مجهول. اربطه مع حساب جديد هنا.
remember_me = تذكر هذا الجهاز
remember_me.compromised = رمز الاحتفاظ بتسجيل الدخول لم يعد صالحا، مما قد يعني اختراق الحساب. نرجو مراجعة حسابك لرؤية أي نشاط غير مألوف.
+authorization_failed_desc = فشل التفويض لأننا اكتشفنا طلبًا غير صالح. يرجى الاتصال بمشرف التطبيق الذي حاولت ترخيصه.
[packages]
rpm.repository.multiple_groups = هذه الحزمة متوفرة في مجموعات متعددة.
@@ -1656,7 +1658,7 @@ config.default_enable_timetracking = فعّل تتبع الوقت مبدئيا
config.default_allow_only_contributors_to_track_time = اسمح للمشتركين في المستودع موحدهم بتتبع الوقت
[form]
-username_error_no_dots = ` يُمكن أن يحتوي فقط على أرقام "0-9 "، أبجدية "A-Z" ،"a-z"، شرطة "-"، وخط أسفل "_" ولا يمكن أن تبدأ أو تنتهي بغير الأبجدية الرقمية، كما يحظر تتالي رموز غير أبجدية رقمية.`
+username_error_no_dots = ` يُمكنه أن يحتوي على حروف إنجليزية وأرقام وشرطة ("-") وشرطة سفلية ("_") فقط. ويمكنه ان يبدأ وينتهي بحرف او برقم.`
Password = كلمة المرور
admin_cannot_delete_self = لا يمكنك أن تحذف نفسك عندما تكون مدير من فضلك ازيل امتيازاتك الإدارية اولا.
enterred_invalid_repo_name = اسم المستودع الذي أدخلته خطأ.
@@ -1684,8 +1686,8 @@ username_password_incorrect = اسم المستخدم أو كلمة المرور
org_still_own_repo = "لدى هذه المنظمة مستودع واحد أو أكثر؛ احذفهم أو انقل ملكيتهم أولا."
enterred_invalid_org_name = اسم المنظمة التي أدخلته خطأ.
lang_select_error = اختر لغة من القائمة.
-alpha_dash_error = ` لا يجب أن يحتوي إلا على الحروف الإنجليزية والأرقام والشرطة ('-') والشرطة السفلية ('_').`
-alpha_dash_dot_error = ` لا يجب أن يحتوي إلا على الحروف الإنجليزية والأرقام والشرطة ('-') والشرطة السفلية ('_') والنقطة ('.').`
+alpha_dash_error = ` لا يجب أن يحتوي إلا على الحروف الإنجليزية والأرقام والشرطة ("-") والشرطة السفلية ("_").`
+alpha_dash_dot_error = ` لا يجب أن يحتوي إلا على الحروف الإنجليزية والأرقام والشرطة ("-") والشرطة السفلية ("_") والنقطة (".").`
repo_name_been_taken = اسم المستودع مستعمل بالفعل.
Email = البريد الإلكتروني
auth_failed = فشل الاستيثاق: %v
@@ -1733,6 +1735,9 @@ git_ref_name_error = `يجب أن يكون اسمًا مرجعيًا جيدًا
include_error = ` يجب أن يحتوي على سلسلة فرعية "%s".`
size_error = `يجب أن يكون بالحجم %s.'
glob_pattern_error = `النمط الشامل غير صالح: %s.`
+CommitChoice = إختيار الإداع
+regex_pattern_error = ` نمط التعبير النمطي غير صالح: %s.`
+username_error = ` يُمكنه أن يحتوي على حروف إنجليزية وأرقام وشرطة ("-") وشرطة سفلية ("_") و نقطة (".") فقط. ويمكنه ان يبدأ وينتهي بحرف او برقم.`
[home]
filter = تصفيات أخرى
diff --git a/options/locale/locale_be.ini b/options/locale/locale_be.ini
new file mode 100644
index 0000000000..f9d8e738c3
--- /dev/null
+++ b/options/locale/locale_be.ini
@@ -0,0 +1,19 @@
+
+
+
+[common]
+dashboard = Панэль кіравання
+explore = Агляд
+help = Дапамога
+logo = Лагатып
+sign_in = Увайсці
+sign_in_or = або
+sign_out = Выйсці
+sign_up = Зарэгістравацца
+link_account = Звязаць Уліковы запіс
+register = Рэгістрацыя
+version = Версія
+powered_by = Працуе на ℅s
+page = Старонка
+home = Галоўная Старонка
+sign_in_with_provider = Увайсці з %s
\ No newline at end of file
diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini
index de2c40c174..3eca60f551 100644
--- a/options/locale/locale_bg.ini
+++ b/options/locale/locale_bg.ini
@@ -128,6 +128,7 @@ profile_desc = Контролирайте как вашият профил се
permission_write = Четене и Писане
twofa_disable = Изключване на двуфакторното удостоверяване
twofa_enroll = Включване на двуфакторно удостоверяване
+ssh_key_name_used = Вече съществува SSH ключ със същото име във вашия акаунт.
[packages]
container.labels.value = Стойност
@@ -147,6 +148,9 @@ keywords = Ключови думи
details.author = Автор
about = Относно този пакет
settings.delete.success = Пакетът бе изтрит.
+settings.delete = Изтриване на пакета
+container.details.platform = Платформа
+settings.delete.error = Неуспешно изтриване на пакет.
[tool]
hours = %d часа
@@ -243,7 +247,7 @@ email = Адрес на ел. поща
issues = Задачи
retry = Повторен опит
remove = Премахване
-admin_panel = Администриране на сайта
+admin_panel = Управление на сайта
account_settings = Настройки на акаунта
powered_by = Осъществено от %s
pull_requests = Заявки за сливане
@@ -451,15 +455,15 @@ activity.period.quarterly = 3 месеца
activity.period.semiyearly = 6 месеца
activity.title.user_1 = %d потребител
activity.title.user_n = %d потребители
-activity.title.prs_n = %d Заявки за сливане
+activity.title.prs_n = %d заявки за сливане
activity.merged_prs_count_1 = Слята заявка за сливане
activity.merged_prs_count_n = Слети заявки за сливане
-activity.active_issues_count_1 = %d Активна задача
-activity.active_issues_count_n = %d Активни задачи
+activity.active_issues_count_1 = %d активна задача
+activity.active_issues_count_n = %d активни задачи
activity.closed_issues_count_1 = Затворена задача
activity.closed_issues_count_n = Затворени задачи
-activity.title.issues_1 = %d Задача
-activity.title.issues_n = %d Задачи
+activity.title.issues_1 = %d задача
+activity.title.issues_n = %d задачи
wiki.pages = Страници
activity.git_stats_author_1 = %d автор
activity.git_stats_and_deletions = и
@@ -467,14 +471,14 @@ project_board = Проекти
wiki.save_page = Запазване на страницата
activity.git_stats_author_n = %d автори
wiki.delete_page_button = Изтриване на страницата
-activity.title.prs_1 = %d Заявка за сливане
-activity.active_prs_count_n = %d Активни заявки за сливане
+activity.title.prs_1 = %d заявка за сливане
+activity.active_prs_count_n = %d активни заявки за сливане
activity.period.filter_label = Период:
activity.period.daily = 1 ден
activity.period.halfweekly = 3 дни
activity.period.weekly = 1 седмица
activity.period.yearly = 1 година
-activity.active_prs_count_1 = %d Активна заявка за сливане
+activity.active_prs_count_1 = %d активна заявка за сливане
wiki.page_title = Заглавие на страницата
wiki.page_content = Съдържание на страницата
wiki.filter_page = Филтриране на страница
@@ -613,7 +617,7 @@ issues.filter_milestone_all = Всички етапи
issues.filter_milestone_open = Отворени етапи
issues.filter_milestone_none = Без етапи
issues.filter_project = Проект
-issues.num_participants = %d Участващи
+issues.num_participants = %d участващи
issues.filter_assignee = Изпълнител
issues.filter_milestone_closed = Затворени етапи
issues.filter_assginee_no_select = Всички изпълнители
@@ -626,8 +630,8 @@ activity.opened_prs_label = Предложена
activity.title.issues_closed_from = %s затворена от %s
activity.closed_issue_label = Затворена
activity.new_issue_label = Отворена
-activity.title.releases_1 = %d Издание
-activity.title.releases_n = %d Издания
+activity.title.releases_1 = %d издание
+activity.title.releases_n = %d издания
milestones.completeness = %d%% Завършен
activity.title.prs_opened_by = %s предложена от %s
issues.action_milestone_no_select = Без етап
@@ -686,18 +690,18 @@ more_operations = Още операции
download_archive = Изтегляне на хранилището
branch = Клон
tree = Дърво
-branches = Клонове
-tags = Тагове
-tag = Таг
-filter_branch_and_tag = Филтриране на клон или таг
+branches = Клони
+tags = Маркери
+tag = Маркер
+filter_branch_and_tag = Филтриране на клон или маркер
symbolic_link = Символна връзка
executable_file = Изпълним файл
blame = Авторство
editor.patch = Прилагане на кръпка
editor.new_patch = Нова кръпка
signing.wont_sign.not_signed_in = Не сте влезли.
-settings.tags = Тагове
-release.tags = Тагове
+settings.tags = Маркери
+release.tags = Маркери
star_guest_user = Влезте, за отбелязване на това хранилище със звезда.
download_bundle = Изтегляне на BUNDLE
desc.private = Частно
@@ -746,17 +750,196 @@ issues.label_modify = Редактиране на етикета
issues.due_date_added = добави крайния срок %s %s
issues.due_date_remove = премахна крайния срок %s %s
release.new_release = Ново издание
-release.tag_helper_existing = Съществуващ таг.
-release.tag_name = Име на тага
-issues.no_ref = Няма указан Клон/Таг
+release.tag_helper_existing = Съществуващ маркер.
+release.tag_name = Име на маркера
+issues.no_ref = Няма указан клон/маркер
issues.lock.reason = Причина за заключването
pulls.create = Създаване на заявка за сливане
issues.label.filter_sort.reverse_by_size = Най-голям размер
issues.unlock = Отключване на обсъждането
issues.due_date_form_add = Добавяне на краен срок
-release.save_draft = Запазване като чернова
-release.add_tag = Създаване само на таг
+release.save_draft = Запазване на чернова
+release.add_tag = Създаване само на маркер
release.publish = Публикуване на издание
+file_view_source = Преглед на изходния код
+diff.parent = родител
+issues.unlock_comment = отключи това обсъждане %s
+release.edit_subheader = Изданията ви позволяват да управлявате версиите на проекта.
+branch.already_exists = Вече съществува клон на име "%s".
+contributors.contribution_type.deletions = Изтривания
+contributors.contribution_type.additions = Добавяния
+diff.browse_source = Разглеждане на изходния код
+file_view_rendered = Преглед на визуализация
+issues.lock_with_reason = заключи като %s и ограничи обсъждането до сътрудници %s
+milestones.new_subheader = Етапите ви помагат да управлявате задачите и да проследявате напредъка им.
+release.edit = редактиране
+activity.published_release_label = Публикувано
+activity.navbar.contributors = Допринесли
+pulls.recently_pushed_new_branches = Изтласкахте в клона %[1]s %[2]s
+branch.branch_name_conflict = Името на клон "%s" е в конфликт с вече съществуващия клон "%s".
+all_branches = Всички клонове
+file_raw = Директно
+file_history = История
+file_permalink = Постоянна връзка
+projects.edit_subheader = Проектите ви позволяват да управлявате задачите и да проследявате напредъка.
+release.compare = Сравняване
+released_this = публикува това
+file_too_large = Файлът е твърде голям, за да бъде показан.
+commits = Подавания
+commit = Подаване
+editor.commit_changes = Подаване на промените
+editor.add_tmpl = Добавяне на "<име на файла>"
+editor.add = Добавяне на %s
+editor.delete = Изтриване на %s
+editor.update = Обновяване на %s
+editor.commit_message_desc = Добавете опционално разширено описание…
+commit_graph.monochrome = Моно
+commit.contained_in = Това подаване се съдържа в:
+editor.new_branch_name_desc = Име на новия клон…
+editor.propose_file_change = Предлагане на промяна на файла
+editor.create_new_branch = Създаване на нов клон за това подаване и започване на заявка за сливане.
+editor.create_new_branch_np = Създаване на нов клон за това подаване.
+editor.filename_is_invalid = Името на файла е невалидно: "%s".
+editor.commit_directly_to_this_branch = Подаване директно към клона %s.
+editor.branch_already_exists = Клонът "%s" вече съществува в това хранилище.
+editor.file_already_exists = Файл с име "%s" вече съществува в това хранилище.
+editor.commit_empty_file_header = Подаване на празен файл
+editor.commit_empty_file_text = Файлът, който сте на път да подадете, е празен. Продължаване?
+editor.fail_to_update_file_summary = Съобщение за грешка:
+editor.fail_to_update_file = Неуспешно обновяване/създаване на файл "%s".
+editor.add_subdir = Добавяне на директория…
+commits.commits = Подавания
+commits.find = Търсене
+commits.search_all = Всички клони
+commits.search = Потърсете подавания…
+commit.operations = Операции
+issues.deleted_milestone = `(изтрит)`
+issues.deleted_project = `(изтрит)`
+milestones.edit_subheader = Етапите ви позволяват да управлявате задачите и да проследявате напредъка.
+activity.navbar.recent_commits = Скорошни подавания
+activity.git_stats_deletion_n = %d изтривания
+activity.git_stats_addition_n = %d добавяния
+release.draft = Чернова
+release.detail = Подробности за изданието
+releases.desc = Проследявайте версиите на проекта и изтеглянията.
+release.ahead.target = в %s след това издание
+release.prerelease = Предварително издание
+release.target = Цел
+release.new_subheader = Изданията ви позволяват да управлявате версиите на проекта.
+release.tag_helper = Изберете съществуващ маркер или създайте нов маркер.
+release.tag_helper_new = Нов маркер. Този маркер ще бъде създаден от целта.
+release.message = Опишете това издание
+release.prerelease_desc = Отбелязване като предварително издание
+release.delete_release = Изтриване на изданието
+release.delete_tag = Изтриване на маркера
+release.edit_release = Обновяване на изданието
+diff.committed_by = подадено от
+release.downloads = Изтегляния
+issues.sign_in_require_desc = Влезте за да се присъедините към това обсъждане.
+activity.git_stats_push_to_all_branches = към всички клони.
+release.deletion_tag_success = Маркерът е изтрит.
+release.cancel = Отказ
+release.deletion = Изтриване на изданието
+release.download_count = Изтегляния: %s
+release.tag_name_invalid = Името на маркера не е валидно.
+diff.stats_desc = %d променени файла с %d добавяния и %d изтривания
+release.tag_name_already_exist = Вече съществува издание с това име на маркер.
+branch.branch_already_exists = Клонът "%s" вече съществува в това хранилище.
+diff.download_patch = Изтегляне на файл-кръпка
+diff.show_diff_stats = Показване на статистика
+diff.commit = подаване
+diff.download_diff = Изтегляне на файл-разлики
+diff.whitespace_show_everything = Показване на всички промени
+diff.show_split_view = Разделен изглед
+diff.show_unified_view = Обединен изглед
+issues.review.self.approval = Не можете да одобрите собствената си заявка за сливане.
+fork_repo = Разклоняване на хранилището
+pulls.merged = Слети
+issues.push_commits_n = добави %d подавания %s
+pulls.num_conflicting_files_n = %d конфликтни файла
+issues.push_commit_1 = добави %d подаване %s
+fork_visibility_helper = Видимостта на разклонено хранилище не може да бъде променена.
+language_other = Други
+stars_remove_warning = Това ще премахне всички звезди от това хранилище.
+tree_path_not_found_tag = Пътят %[1]s не съществува в маркер %[2]s
+tree_path_not_found_commit = Пътят %[1]s не съществува в подаване %[2]s
+tree_path_not_found_branch = Пътят %[1]s не съществува в клон %[2]s
+transfer.accept = Приемане на прехвърлянето
+transfer.reject = Отхвърляне на прехвърлянето
+archive.issue.nocomment = Това хранилище е архивирано. Не можете да коментирате в задачите.
+forked_from = разклонено от
+issues.delete_branch_at = `изтри клон %s %s`
+pulls.has_viewed_file = Прегледано
+pulls.viewed_files_label = %[1]d / %[2]d прегледани файла
+pulls.approve_count_n = %d одобрения
+activity.git_stats_commit_1 = %d подаване
+activity.git_stats_deletion_1 = %d изтриване
+diff.review.approve = Одобряване
+diff.review.comment = Коментиране
+issues.stop_tracking = Спиране на таймера
+issues.stop_tracking_history = `спря работа %s`
+issues.cancel_tracking = Отхвърляне
+issues.add_time = Ръчно добавяне на време
+issues.start_tracking_history = `започна работа %s`
+issues.start_tracking_short = Пускане на таймера
+issues.review.approve = одобри тези промени %s
+pulls.tab_conversation = Обсъждане
+pulls.close = Затваряне на заявката за сливане
+issues.add_time_short = Добавяне на време
+issues.add_time_hours = Часове
+issues.add_time_minutes = Минути
+issues.add_time_cancel = Отказ
+pulls.tab_commits = Подавания
+pulls.tab_files = Променени файлове
+pulls.approve_count_1 = %d одобрение
+pulls.can_auto_merge_desc = Тази заявка за сливане може да бъде слята автоматично.
+pulls.num_conflicting_files_1 = %d конфликтен файл
+activity.git_stats_commit_n = %d подавания
+settings.event_issues = Задачи
+branch.delete_head = Изтриване
+branch.delete = Изтриване на клона "%s"
+branch.delete_html = Изтриване на клона
+tag.create_success = Маркерът "%s" е създаден.
+branch.new_branch_from = Създаване на нов клон от "%s"
+branch.new_branch = Създаване на нов клон
+branch.confirm_rename_branch = Преименуване на клона
+branch.create_from = от "%s"
+settings.add_team_duplicate = Екипът вече разполага с това хранилище
+settings.slack_domain = Домейн
+editor.directory_is_a_file = Името на директорията "%s" вече се използва като име на файл в това хранилище.
+editor.filename_is_a_directory = Името на файла "%s" вече се използва като име на директория в това хранилище.
+editor.file_editing_no_longer_exists = Файлът, който се редактира, "%s", вече не съществува в това хранилище.
+editor.file_deleting_no_longer_exists = Файлът, който се изтрива, "%s", вече не съществува в това хранилище.
+editor.unable_to_upload_files = Неуспешно качване на файлове в "%s" с грешка: %v
+settings.web_hook_name_slack = Slack
+settings.web_hook_name_discord = Discord
+settings.web_hook_name_telegram = Telegram
+settings.web_hook_name_matrix = Matrix
+settings.web_hook_name_gogs = Gogs
+settings.web_hook_name_feishu_or_larksuite = Feishu / Lark Suite
+settings.web_hook_name_feishu = Feishu
+settings.web_hook_name_larksuite = Lark Suite
+settings.web_hook_name_wechatwork = WeCom (Wechat Work)
+settings.web_hook_name_packagist = Packagist
+diff.file_byte_size = Размер
+branch.create_success = Клонът "%s" е създаден.
+branch.deletion_success = Клонът "%s" е изтрит.
+branch.deletion_failed = Неуспешно изтриване на клон "%s".
+branch.rename_branch_to = Преименуване от "%s" на:
+settings.web_hook_name_msteams = Microsoft Teams
+settings.web_hook_name_dingtalk = DingTalk
+issues.error_removing_due_date = Неуспешно премахване на крайния срок.
+branch.renamed = Клонът %s е преименуван на %s.
+settings.teams = Екипи
+settings.add_team = Добавяне на екип
+settings.web_hook_name_gitea = Gitea
+settings.web_hook_name_forgejo = Forgejo
+release.tag_already_exist = Вече съществува маркер с това име.
+branch.name = Име на клона
+settings.rename_branch = Преименуване на клона
+branch.restore_failed = Неуспешно възстановяване на клон "%s".
+branch.download = Изтегляне на клона "%s"
+branch.rename = Преименуване на клона "%s"
[modal]
confirm = Потвърждаване
@@ -834,10 +1017,23 @@ follow_blocked_user = Не можете да следвате тази орга
settings.delete_prompt = Организацията ще бъде премахната завинаги. Това НЕ МОЖЕ да бъде отменено!
settings.labels_desc = Добавете етикети, които могат да се използват за задачи за всички хранилища в тази организация.
teams.none_access = Без достъп
-teams.members.none = Няма участници в този екип.
+teams.members.none = Няма членове в този екип.
repo_updated = Обновено
teams.delete_team_success = Екипът е изтрит.
teams.search_repo_placeholder = Потърсете хранилище…
+teams.delete_team_title = Изтриване на екипа
+teams.add_team_member = Добавяне на член на екипа
+teams.read_access_helper = Членовете могат да преглеждат и клонират хранилищата на екипа.
+teams.invite.description = Моля, щракнете върху бутона по-долу, за да се присъедините към екипа.
+teams.invite.title = Поканени сте да се присъедините към екип %s в организация %s.
+team_permission_desc = Разрешение
+members.public_helper = да е скрит
+teams.members = Членове на екипа
+teams.delete_team = Изтриване на екипа
+members.owner = Притежател
+members.member_role = Роля на участника:
+members.member = Участник
+members.private_helper = да е видим
[install]
admin_password = Парола
@@ -896,9 +1092,10 @@ register_notify = Добре дошли във Forgejo
issue.action.new = @%[1]s създаде #%[2]d.
issue.action.review = @%[1]s коментира в тази заявка за сливане.
issue.action.reopen = @%[1]s отвори наново #%[2]d.
+issue.action.approve = @%[1]s одобри тази заявка за сливане.
[user]
-joined_on = Присъединен на %s
+joined_on = Присъединени на %s
user_bio = Биография
repositories = Хранилища
activity = Публична дейност
@@ -977,6 +1174,42 @@ users.deletion_success = Потребителският акаунт бе изт
last_page = Последна
config.test_email_placeholder = Ел. поща (напр. test@example.com)
users.cannot_delete_self = Не можете да изтриете себе си
+repos.owner = Притежател
+auths.domain = Домейн
+auths.host = Хост
+auths.port = Порт
+auths.type = Тип
+config.ssh_config = SSH Конфигурация
+monitor.stats = Статистика
+monitor.queue = Опашка: %s
+config = Конфигурация
+config.mailer_user = Потребител
+config.enable_captcha = Включване на CAPTCHA
+repos.size = Размер
+auths.enabled = Включено
+config.git_config = Git Конфигурация
+config.mailer_protocol = Протокол
+users.bot = Бот
+config.db_path = Път
+monitor.queues = Опашки
+config.server_config = Сървърна конфигурация
+packages.size = Размер
+settings = Админ. настройки
+users = Потребителски акаунти
+emails.duplicate_active = Този адрес на ел. поща вече е активен за друг потребител.
+config.app_ver = Версия на Forgejo
+config.custom_conf = Път на конфигурационния файл
+config.git_version = Версия на Git
+config.lfs_config = LFS Конфигурация
+config.db_ssl_mode = SSL
+users.admin = Админ
+auths.name = Име
+repos.issues = Задачи
+packages.owner = Притежател
+packages.creator = Създател
+packages.type = Тип
+orgs.teams = Екипи
+orgs.members = Участници
[error]
not_found = Целта не може да бъде намерена.
@@ -1006,6 +1239,10 @@ team_not_exist = Екипът не съществува.
TeamName = Име на екипа
email_error = ` не е валиден адрес на ел. поща.`
email_invalid = Адресът на ел. поща е невалиден.
+SSHTitle = Име на SSH ключ
+repo_name_been_taken = Името на хранилището вече е използвано.
+team_name_been_taken = Името на екипа вече е заето.
+org_name_been_taken = Името на организацията вече е заето.
[action]
close_issue = `затвори задача %[3]s#%[2]s`
@@ -1024,9 +1261,13 @@ comment_pull = `коментира в заявка за сливане %[3]s#%[2]s`
auto_merge_pull_request = `сля автоматично заявка за сливане %[3]s#%[2]s`
watched_repo = започна да наблюдава %[2]s
-delete_tag = изтри таг %[2]s от %[3]s
+delete_tag = изтри маркер %[2]s от %[3]s
delete_branch = изтри клон %[2]s от %[3]s
create_branch = създаде клон %[3]s на %[4]s
+publish_release = `публикува издание "%[4]s" на %[3]s`
+push_tag = изтласка маркер %[3]s към %[4]s
+approve_pull_request = `одобри %[3]s#%[2]s`
+reject_pull_request = `предложи промени за %[3]s#%[2]s`
[auth]
login_openid = OpenID
@@ -1080,6 +1321,7 @@ read = Прочетени
watching = Наблюдавани
no_unread = Няма непрочетени известия.
mark_all_as_read = Отбелязване на всички като прочетени
+pin = Закачване на известието
[explore]
code_search_results = Резултати от търсенето на "%s"
@@ -1099,6 +1341,18 @@ runners.version = Версия
variables = Променливи
runners.labels = Етикети
actions = Действия
+variables.none = Все още няма променливи.
+variables.creation.failed = Неуспешно добавяне на променлива.
+variables.update.failed = Неуспешно редактиране на променлива.
+variables.creation.success = Променливата "%s" е добавена.
+variables.deletion.success = Променливата е премахната.
+variables.edit = Редактиране на променливата
+variables.deletion = Премахване на променливата
+variables.update.success = Променливата е редактирана.
+variables.creation = Добавяне на променлива
+variables.deletion.failed = Неуспешно премахване на променлива.
+runners.task_list.repository = Хранилище
+runners.description = Описание
[heatmap]
less = По-малко
@@ -1116,4 +1370,16 @@ submodule = Подмодул
[dropzone]
-default_message = Пуснете файлове тук или щракнете, за качване.
\ No newline at end of file
+default_message = Пуснете файлове тук или щракнете, за качване.
+remove_file = Премахване на файла
+file_too_big = Размерът на файла ({{filesize}} MB) надвишава максималния размер от ({{maxFilesize}} MB).
+invalid_input_type = Не можете да качвате файлове от този тип.
+
+[graphs]
+component_loading_failed = Неуспешно зареждане на %s
+contributors.what = приноси
+recent_commits.what = скорошни подавания
+component_loading = Зареждане на %s...
+
+[projects]
+type-1.display_name = Индивидуален проект
\ No newline at end of file
diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini
index fdb91f987f..be798000f5 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -18,7 +18,7 @@ template=Šablona
language=Jazyk
notifications=Oznámení
active_stopwatch=Aktivní sledování času
-tracked_time_summary=Shrnutí sledovaného času na základě filtrů v seznamu úkolů
+tracked_time_summary=Shrnutí sledovaného času na základě filtrů v seznamu problémů
create_new=Vytvořit…
user_profile_and_more=Profily a nastavení…
signed_in_as=Přihlášen jako
@@ -31,7 +31,7 @@ username=Uživatelské jméno
email=E-mailová adresa
password=Heslo
access_token=Přístupový token
-re_type=Potvrdit heslo
+re_type=Potvrzení hesla
captcha=CAPTCHA
twofa=Dvoufaktorové ověřování
twofa_scratch=Dvoufaktorový pomocný kód
@@ -142,6 +142,8 @@ confirm_delete_selected=Potvrdit odstranění všech vybraných položek?
name=Název
value=Hodnota
sign_in_with_provider = Přihlásit se přes %s
+confirm_delete_artifact = Opravdu chcete odstranit artefakt „%s“?
+toggle_menu = Přepnout nabídku
[aria]
navbar=Navigační lišta
@@ -182,13 +184,14 @@ missing_csrf=Špatný požadavek: Neexistuje CSRF token
invalid_csrf=Špatný požadavek: Neplatný CSRF token
not_found=Cíl nebyl nalezen.
network_error=Chyba sítě
+server_internal = Interní chyba serveru
[startpage]
app_desc=Snadno přístupný vlastní Git
install=Jednoduchá na instalaci
install_desc=Jednoduše spusťte jako binární program pro vaši platformu, nasaďte jej pomocí Docker, nebo jej stáhněte jako balíček.
platform=Multiplatformní
-platform_desc=Forgejo běží všude, kde Go může kompilovat: Windows, macOS, Linux, ARM, atd. Vyberte si ten, který milujete!
+platform_desc=Forgejo běží na všech platformách, na které může kompilovat jazyk Go: Windows, macOS, Linux, ARM, atd. Výběr je opravdu velký!
lightweight=Lehká
lightweight_desc=Forgejo má minimální požadavky a může běžet na Raspberry Pi. Šetřete energii vašeho stroje!
license=Open Source
@@ -278,13 +281,13 @@ admin_password=Heslo
confirm_password=Potvrdit heslo
admin_email=E-mailová adresa
install_btn_confirm=Nainstalovat Forgejo
-test_git_failed=Chyba při testu příkazu 'git': %v
-sqlite3_not_available=Tato verze Forgejo nepodporuje SQLite3. Stáhněte si oficiální binární verzi od %s (nikoli verzi „gobuild“).
+test_git_failed=Chyba při testu příkazu „git“: %v
+sqlite3_not_available=Tato verze Forgejo nepodporuje SQLite3. Stáhněte si oficiální binární verzi z %s (nikoli verzi „gobuild“).
invalid_db_setting=Nastavení databáze je neplatné: %v
invalid_db_table=Databázová tabulka „%s“ je neplatná: %v
invalid_repo_path=Kořenový adresář repozitářů není správný: %v
invalid_app_data_path=Cesta k datům aplikace je neplatná: %v
-run_user_not_match=`"Run as" uživatelské jméno není aktuální uživatelské jméno: %s -> %s`
+run_user_not_match=Uživatelské jméno v poli „Spustit jako“ není aktuální uživatelské jméno: %s -> %s
internal_token_failed=Nepodařilo se vytvořit interní token: %v
secret_key_failed=Nepodařilo se vytvořit tajný klíč: %v
save_config_failed=Uložení konfigurace se nezdařilo: %v
@@ -297,7 +300,7 @@ default_allow_create_organization_popup=Povolit novým uživatelským účtům v
default_enable_timetracking=Povolit sledování času ve výchozím nastavení
default_enable_timetracking_popup=Povolí sledování času pro nové repozitáře.
no_reply_address=Skrytá e-mailová doména
-no_reply_address_helper=Název domény pro uživatele se skrytou e-mailovou adresou. Příklad: Pokud je název skryté e-mailové domény nastaven na „noreply.example.org“, uživatelské jméno „joe“ bude zaznamenáno v Gitu jako „joe@noreply.example.org“.
+no_reply_address_helper=Název domény pro uživatele se skrytou e-mailovou adresou. Příklad: pokud je název skryté e-mailové domény nastaven na „noreply.example.org“, uživatelské jméno „joe“ bude zaznamenáno v Gitu jako „joe@noreply.example.org“.
password_algorithm=Hash algoritmus hesla
invalid_password_algorithm=Neplatný algoritmus hash hesla
password_algorithm_helper=Nastavte algoritmus hashování hesla. Algoritmy mají odlišné požadavky a sílu. Algoritmus argon2 je poměrně bezpečný, ale používá spoustu paměti a může být nevhodný pro malé systémy.
@@ -305,6 +308,9 @@ enable_update_checker=Povolit kontrolu aktualizací
enable_update_checker_helper=Kontroluje vydání nových verzí pravidelně připojením ke gitea.io.
env_config_keys=Konfigurace prostředí
env_config_keys_prompt=Následující proměnné prostředí budou také použity pro váš konfigurační soubor:
+enable_update_checker_helper_forgejo = Pravidelně kontroluje nové verze Forgejo kontrolou DNS TXT záznamu na adrese release.forgejo.org.
+allow_dots_in_usernames = Povolit uživatelům používat tečky ve svých uživatelských jménech. Neovlivní stávající účty.
+smtp_from_invalid = Adresa v poli „Poslat e-mail jako“ je neplatná
[home]
uname_holder=Uživatelské jméno nebo e-mailová adresa
@@ -425,11 +431,15 @@ authorization_failed_desc=Autorizace selhala, protože jsme detekovali neplatný
sspi_auth_failed=SSPI autentizace selhala
password_pwned=Heslo, které jste zvolili, je na seznamu odcizených hesel, která byla dříve odhalena při narušení veřejných dat. Zkuste to prosím znovu s jiným heslem.
password_pwned_err=Nelze dokončit požadavek na HaveIBeenPwned
+change_unconfirmed_email = Pokud jste při registraci zadali nesprávnou e-mailovou adresu, můžete ji změnit níže. Potvrzovací e-mail bude místo toho odeslán na novou adresu.
+change_unconfirmed_email_error = Nepodařilo se změnit e-mailovou adresu: %v
+change_unconfirmed_email_summary = Změna e-mailové adresy, na kterou bude odeslán aktivační e-mail.
+last_admin = Nemůžete odebrat posledního administrátora. Vždy musí existovat alespoň jeden administrátor.
[mail]
view_it_on=Zobrazit na %s
reply=nebo přímo odpovědět na tento e-mail
-link_not_working_do_paste=Nefunguje? Zkuste jej zkopírovat a vložit do svého prohlížeče.
+link_not_working_do_paste=Odkaz nefunguje? Zkuste jej zkopírovat a vložit do adresního řádku svého prohlížeče.
hi_user_x=Ahoj %s,
activate_account=Prosíme, aktivujte si váš účet
@@ -444,12 +454,12 @@ activate_email.text=Pro aktivaci vašeho účtu do %s klikněte na násle
register_notify=Vítejte v Forgejo
register_notify.title=%[1]s vítejte v %[2]s
register_notify.text_1=toto je váš potvrzovací e-mail pro %s!
-register_notify.text_2=Nyní se můžete přihlásit přes uživatelské jméno: %s.
-register_notify.text_3=Pokud pro vás byl vytvořen tento účet, nejprve nastavte své heslo.
+register_notify.text_2=Do svého účtu se můžete přihlásit svým uživatelským jménem: %s
+register_notify.text_3=Pokud vám tento účet vytvořil někdo jiný, musíte si nejprve nastavit své heslo.
reset_password=Obnovit váš účet
-reset_password.title=%s, požádal jste o obnovení vašeho účtu
-reset_password.text=Klikněte prosím na následující odkaz pro obnovení vašeho účtu v rámci %s:
+reset_password.title=Uživateli %s, obdrželi jsme žádost o obnovu vašeho účtu
+reset_password.text=Pokud jste to byli vy, klikněte na následující odkaz pro obnovení vašeho účtu do %s:
register_success=Registrace byla úspěšná
@@ -491,6 +501,9 @@ team_invite.subject=%[1]s vás pozval/a, abyste se připojili k organizaci %[2]s
team_invite.text_1=%[1]s vás pozval/a do týmu %[2]s v organizaci %[3]s.
team_invite.text_2=Pro připojení k týmu klikněte na následující odkaz:
team_invite.text_3=Poznámka: Tato pozvánka byla určena pro %[1]s. Pokud jste neočekávali tuto pozvánku, můžete tento e-mail ignorovat.
+admin.new_user.user_info = Informace o uživateli
+admin.new_user.text = Klikněte sem pro správu tohoto uživatele z administrátorského panelu.
+admin.new_user.subject = Právě se zaregistroval nový uživatel %s
[modal]
yes=Ano
@@ -523,8 +536,8 @@ SSPISeparatorReplacement=Oddělovač
SSPIDefaultLanguage=Výchozí jazyk
require_error=` nemůže být prázdný.`
-alpha_dash_error=` by měl obsahovat pouze alfanumerické znaky, pomlčku („-“) a podtržítka („_“). `
-alpha_dash_dot_error=` by měl obsahovat pouze alfanumerické znaky, pomlčku („-“), podtržítka („_“) nebo tečku („.“). `
+alpha_dash_error=` by měl obsahovat pouze alfanumerické znaky, pomlčky („-“) a podtržítka („_“). `
+alpha_dash_dot_error=` by měl obsahovat pouze alfanumerické znaky, pomlčky („-“), podtržítka („_“) nebo tečky („.“). `
git_ref_name_error=` musí být správný název odkazu Git.`
size_error=` musí být minimálně velikosti %s.`
min_size_error=` musí obsahovat nejméně %s znaků.`
@@ -534,7 +547,7 @@ url_error=`„%s“ není platná adresa URL.`
include_error=` musí obsahovat substring „%s“.`
glob_pattern_error=`zástupný vzor je neplatný: %s.`
regex_pattern_error=` regex vzor je neplatný: %s.`
-username_error=` může obsahovat pouze alfanumerické znaky („0-9“, „a-z“, „A-Z“), pomlčku („-“), podtržítka („_“) a tečka („.“). Nemůže začínat nebo končit nealfanumerickými znaky a po sobě jdoucí nealfanumerické znaky jsou také zakázány.`
+username_error=` může obsahovat pouze alfanumerické znaky („0-9“, „a-z“, „A-Z“), pomlčky („-“), podtržítka („_“) a tečky („.“). Nemůže začínat nebo končit nealfanumerickými znaky. Jsou také zakázány po sobě jdoucí nealfanumerické znaky.`
invalid_group_team_map_error=` mapování je neplatné: %s`
unknown_error=Neznámá chyba:
captcha_incorrect=CAPTCHA kód není správný.
@@ -570,7 +583,7 @@ enterred_invalid_owner_name=Nové jméno vlastníka není správné.
enterred_invalid_password=Zadané heslo není správné.
user_not_exist=Tento uživatel neexistuje.
team_not_exist=Tento tým neexistuje.
-last_org_owner=Nemůžete odstranit posledního uživatele z týmu „vlastníci“. Musí existovat alespoň jeden vlastník pro organizaci.
+last_org_owner=Nemůžete odebrat posledního uživatele z týmu „vlastníci“. Organizace musí obsahovat alespoň jednoho vlastníka.
cannot_add_org_to_team=Organizace nemůže být přidána jako člen týmu.
duplicate_invite_to_team=Uživatel byl již pozván jako člen týmu.
organization_leave_success=Úspěšně jste opustili organizaci %s.
@@ -579,16 +592,18 @@ invalid_ssh_key=Nelze ověřit váš SSH klíč: %s
invalid_gpg_key=Nelze ověřit váš GPG klíč: %s
invalid_ssh_principal=Neplatný SSH Principal certifikát: %s
must_use_public_key=Zadaný klíč je soukromý klíč. Nenahrávejte svůj soukromý klíč nikde. Místo toho použijte váš veřejný klíč.
-unable_verify_ssh_key=Nelze ověřit váš SSH klíč.
+unable_verify_ssh_key=Nepodařilo se ověřit klíč SSH, zkontrolujte, zda neobsahuje chyby.
auth_failed=Ověření selhalo: %v
-still_own_repo=Váš účet vlastní jeden nebo více repozitářů. Nejprve je smažte nebo převeďte.
+still_own_repo=Váš účet vlastní jeden nebo více repozitářů. Nejprve je odstraňte nebo přesuňte.
still_has_org=Váš účet je členem jedné nebo více organizací. Nejdříve je musíte opustit.
still_own_packages=Váš účet vlastní jeden nebo více balíčků. Nejprve je musíte odstranit.
-org_still_own_repo=Organizace stále vlastní jeden nebo více repozitářů. Nejdříve je smažte nebo převeďte.
-org_still_own_packages=Organizace stále vlastní jeden nebo více balíčků. Nejdříve je smažte.
+org_still_own_repo=Organizace stále vlastní jeden nebo více repozitářů. Nejdříve je odstraňte nebo přesuňte.
+org_still_own_packages=Organizace stále vlastní jeden nebo více balíčků. Nejdříve je odstraňte.
target_branch_not_exist=Cílová větev neexistuje.
+admin_cannot_delete_self = Nemůžete odstranit sami sebe, když jste administrátorem. Nejprve prosím odeberte svá práva administrátora.
+username_error_no_dots = ` může obsahovat pouze alfanumerické znaky („0-9“, „a-z“, „A-Z“), pomlčky („-“) a podtržítka („_“). Nemůže začínat nebo končit nealfanumerickými znaky. Jsou také zakázány po sobě jdoucí nealfanumerické znaky.`
[user]
@@ -615,6 +630,14 @@ settings=Uživatelská nastavení
form.name_reserved=Uživatelské jméno „%s“ je rezervováno.
form.name_pattern_not_allowed=Vzor „%s“ není povolen v uživatelském jméně.
form.name_chars_not_allowed=Uživatelské jméno „%s“ obsahuje neplatné znaky.
+block_user = Zablokovat uživatele
+block_user.detail = Pokud zablokujete tohoto uživatele, budou provedeny i další akce. Například:
+block_user.detail_1 = Tento uživatel vás nebude moci sledovat.
+block_user.detail_2 = Tento uživatel nebude moci interagovat s vašimi repozitáři, vytvářet problémy a komentáře.
+block_user.detail_3 = Tento uživatel vás nebude moci přidat jako spolupracovníka a naopak.
+follow_blocked_user = Tohoto uživatele nemůžete sledovat, protože jste si jej zablokovali nebo si on zablokoval vás.
+block = Zablokovat
+unblock = Odblokovat
[settings]
profile=Profil
@@ -658,7 +681,7 @@ language=Jazyk
ui=Motiv vzhledu
hidden_comment_types=Skryté typy komentářů
hidden_comment_types_description=Zde zkontrolované typy komentářů nebudou zobrazeny na stránkách problémů. Zaškrtnutí „Štítek“ například odstraní všechny komentáře „ přidal/odstranil “.
-hidden_comment_types.ref_tooltip=Komentáře, na které se odkazovalo z jiného úkolu/commitu/…
+hidden_comment_types.ref_tooltip=Komentáře, kde byl tento problém odkázán u jiného problému/commitu/…
hidden_comment_types.issue_ref_tooltip=Komentáře, kde uživatel změní větev/značku spojenou s problémem
comment_type_group_reference=Reference
comment_type_group_label=Štítek
@@ -693,7 +716,7 @@ update_user_avatar_success=Uživatelův avatar byl aktualizován.
update_password=Aktualizovat heslo
old_password=Stávající heslo
new_password=Nové heslo
-retype_new_password=Potvrdit nové heslo
+retype_new_password=Potvrzení nového hesla
password_incorrect=Zadané heslo není správné.
change_password_success=Vaše heslo bylo aktualizováno. Od teď se přihlašujte novým heslem.
password_change_disabled=Externě ověřovaní uživatelé nemohou aktualizovat své heslo prostřednictvím webového rozhraní Forgejo.
@@ -720,7 +743,7 @@ theme_update_error=Vybraný motiv vzhledu neexistuje.
openid_deletion=Odstranit OpenID adresu
openid_deletion_desc=Pokud odstraníte OpenID adresu, nebudete ji moci použít k přihlašování. Pokračovat?
openid_deletion_success=OpenID adresa byla odstraněna.
-add_new_email=Přidat novou e-mailovou adresu
+add_new_email=Přidat e-mailovou adresu
add_new_openid=Přidat novou OpenID URI
add_email=Přidat e-mailovou adresu
add_openid=Přidat OpenID URI
@@ -728,22 +751,22 @@ add_email_confirmation_sent=Potvrzovací e-mail byl odeslán na „%s“. Prosí
add_email_success=Nová e-mailová adresa byla přidána.
email_preference_set_success=Nastavení e-mailu bylo úspěšně nastaveno.
add_openid_success=Nová OpenID adresa byla přidána.
-keep_email_private=Schovat e-mailovou adresu
+keep_email_private=Skrýt e-mailovou adresu
keep_email_private_popup=Toto skryje vaši e-mailovou adresu z vašeho profilu, stejně jako při vytvoření pull requestu nebo úpravě souboru pomocí webového rozhraní. Odeslané commity nebudou změněny. Použijte %s v commitech pro jejich přiřazení k vašemu účtu.
openid_desc=OpenID vám umožní delegovat ověřování na externího poskytovatele.
manage_ssh_keys=Správa klíčů SSH
manage_ssh_principals=Spravovat SSH Principal certifikáty
-manage_gpg_keys=Správa GPG klíčů
+manage_gpg_keys=Správa klíčů GPG
add_key=Přidat klíč
-ssh_desc=Tyto veřejné SSH klíče jsou propojeny s vaším účtem. Odpovídající soukromé klíče umožní plný přístup k vašim repozitářům.
+ssh_desc=Tyto veřejné klíče SSH jsou propojeny s vaším účtem. Odpovídající soukromé klíče umožní plný přístup k vašim repozitářům. Klíče SSH, které byly ověřeny, mohou být použity pro ověření Git commitů podepsaných přes SSH.
principal_desc=Tyto SSH Principal certifikáty jsou přidruženy k vašemu účtu a umožňují plný přístup do vašich repozitářů.
-gpg_desc=Tyto veřejné GPG klíče jsou propojeny s vaším účtem. Uchovejte vaše soukromé klíče, protože umožňují ověření commitů.
+gpg_desc=Tyto veřejné klíče GPG jsou propojeny s vaším účtem a používají se k ověření vašich commitů. Uložte je na bezpečné místo, jelikož umožňují podepsat commity vaší identitou.
ssh_helper=Potřebujete pomoct? Podívejte se do příručky GitHubu na to vytvoření vlastních klíčů SSH nebo vyřešte běžné problémy, se kterými se můžete potkat při použití SSH.
gpg_helper=Potřebujete pomoct? Podívejte se do příručky GitHubu o GPG.
add_new_key=Přidat klíč SSH
add_new_gpg_key=Přidat GPG klíč
-key_content_ssh_placeholder=Začíná s „ssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“, nebo „sk-ssh-ed25519@openssh.com“
+key_content_ssh_placeholder=Začíná s „ssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“ nebo „sk-ssh-ed25519@openssh.com“
key_content_gpg_placeholder=Začíná s „-----BEGIN PGP PUBLIC KEY BLOCK-----“
add_new_principal=Přidat SSH Principal certifikát
ssh_key_been_used=Tento SSH klíč byl na server již přidán.
@@ -835,13 +858,13 @@ permission_write=čtení i zápis
at_least_one_permission=Musíte vybrat alespoň jedno oprávnění pro vytvoření tokenu
permissions_list=Oprávnění:
-manage_oauth2_applications=Spravovat OAuth2 aplikace
+manage_oauth2_applications=Spravovat aplikace OAuth2
edit_oauth2_application=Upravit OAuth2 aplikaci
oauth2_applications_desc=OAuth2 aplikace umožní aplikacím třetích stran bezpečně ověřit uživatele v této instanci Forgejo.
remove_oauth2_application=Odstranit OAuth2 aplikaci
remove_oauth2_application_desc=Odstraněním OAuth2 aplikace odeberete přístup všem podepsaným přístupovým tokenům. Pokračovat?
remove_oauth2_application_success=Aplikace byla odstraněna.
-create_oauth2_application=Vytvořit novou OAuth2 aplikaci
+create_oauth2_application=Vytvořit novou aplikaci OAuth2
create_oauth2_application_button=Vytvořit aplikaci
create_oauth2_application_success=Úspěšně jste vytvořili novou OAuth2 aplikaci.
update_oauth2_application_success=Úspěšně jste aktualizovali OAuth2 aplikaci.
@@ -859,8 +882,8 @@ oauth2_application_create_description=OAuth2 aplikace poskytuje přístup aplika
oauth2_application_remove_description=Odebráním OAuth2 aplikace zabrání přístupu ověřeným uživatelům na této instanci. Pokračovat?
oauth2_application_locked=Gitea předregistruje některé OAuth2 aplikace při spuštění, pokud je to povoleno v konfiguraci. Aby se zabránilo neočekávanému chování, nelze je upravovat ani odstranit. Více informací naleznete v dokumentaci OAuth2.
-authorized_oauth2_applications=Autorizovat OAuth2 aplikaci
-authorized_oauth2_applications_description=Úspěšně jste povolili přístup k vašemu osobnímu účtu této aplikaci třetí strany. Zrušte prosím přístup aplikacím, které již nadále nepotřebujete.
+authorized_oauth2_applications=Autorizovat aplikaci OAuth2
+authorized_oauth2_applications_description=Úspěšně jste povolili přístup k vašemu osobnímu účtu této aplikaci třetí strany. Zrušte prosím přístup aplikacím, které již nejsou používány.
revoke_key=Zrušit
revoke_oauth2_grant=Zrušit přístup
revoke_oauth2_grant_description=Zrušením přístupu této aplikaci třetí strany ji zabráníte v přístupu k vašim datům. Jste si jisti?
@@ -926,6 +949,13 @@ visibility.limited=Omezený
visibility.limited_tooltip=Viditelné pouze pro ověřené uživatele
visibility.private=Soukromý
visibility.private_tooltip=Viditelné pouze pro členy organizací, ke kterým jste se připojili
+blocked_users = Zablokovaní uživatelé
+change_password = Změnit heslo
+user_block_success = Uživatel byl úspěšně zablokován.
+user_unblock_success = Uživatel byl úspěšně odblokován.
+access_token_desc = Oprávnění vybraného tokenu omezují autorizaci pouze na příslušné cesty API. Pro více informací si přečtěte dokumentaci.
+blocked_users_none = Nemáte žádné zablokované uživatele.
+blocked_since = Zablokován od %s
[repo]
new_repo_helper=Repozitář obsahuje všechny projektové soubory, včetně historie revizí. Už jej hostujete jinde? Migrovat repozitář.
@@ -1047,7 +1077,7 @@ template.issue_labels=Štítky úkolů
template.one_item=Musíte vybrat alespoň jednu položku šablony
template.invalid=Musíte vybrat repositář šablony
-archive.title=Tento repozitář je archivovaný. Můžete prohlížet soubory, klonovat, ale nemůžete nahrávat a vytvářet nové úkoly nebo požadavky na natažení.
+archive.title=Tento repozitář je archivovaný. Můžete prohlížet soubory, klonovat, ale nemůžete nahrávat a vytvářet nové problémy nebo žádosti o sloučení.
archive.title_date=Tento repositář byl archivován %s. Můžete zobrazit soubory a klonovat je, ale nemůžete nahrávat ani otevírat problémy nebo požadavky na natažení.
archive.issue.nocomment=Tento repozitář je archivovaný. Nemůžete komentovat úkoly.
archive.pull.nocomment=Tento repozitář je archivovaný. Nemůžete komentovat požadavky na natažení.
@@ -1076,7 +1106,7 @@ migrate_items_merge_requests=Sloučit požadavky
migrate_items_releases=Vydání
migrate_repo=Migrovat repozitář
migrate.clone_address=Migrovat / klonovat z URL
-migrate.clone_address_desc=HTTP(S) nebo URL pro klonování existujícího repozitáře
+migrate.clone_address_desc=HTTP(S) nebo URL Git „clone“ existujícího repozitáře
migrate.github_token_desc=Můžete sem vložit jeden nebo více tokenů oddělených čárkou, abyste urychlili migraci kvůli omezení rychlosti rozhraní GitHub API. VAROVÁNÍ: Zneužití této funkce může vést k porušení zásad poskytovatele služeb a zablokování účtu.
migrate.clone_local_path=nebo místní cesta serveru
migrate.permission_denied=Není dovoleno importovat místní repozitáře.
@@ -1180,8 +1210,8 @@ escape_control_characters=Escape sekvence
unescape_control_characters=Bez escape sekvencí
file_copy_permalink=Kopírovat trvalý odkaz
view_git_blame=Zobrazit Git Blame
-video_not_supported_in_browser=Váš prohlížeč nepodporuje značku pro HTML5 video.
-audio_not_supported_in_browser=Váš prohlížeč nepodporuje značku pro HTML5 audio.
+video_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „video“.
+audio_not_supported_in_browser=Váš prohlížeč nepodporuje značku HTML5 „audio“.
stored_lfs=Uloženo pomocí Git LFS
symbolic_link=Symbolický odkaz
executable_file=Spustitelný soubor
@@ -1215,12 +1245,12 @@ editor.delete_this_file=Smazat soubor
editor.must_have_write_access=Musíte mít přístup pro zápis pro dělání či navrhování změn tohoto souboru.
editor.file_delete_success=Soubor „%s“ byl odstraněn.
editor.name_your_file=Pojmenujte váš soubor…
-editor.filename_help=Přidejte adresář pomocí zapsání jeho jména následovaného lomítkem („/“). Smažte adresář pomocí stisku backspace na začátku vstupního pole.
+editor.filename_help=Přidejte adresář zapsáním jeho jména následovaného lomítkem („/“). Adresář odeberete stiskem backspace na začátku vstupního pole.
editor.or=nebo
editor.cancel_lower=Zrušit
editor.commit_signed_changes=Odevzdat podepsané změny
editor.commit_changes=Odevzdat změny
-editor.add_tmpl=Přidán „“
+editor.add_tmpl=Přidat „“
editor.add=Přidat %s
editor.update=Aktualizovat %s
editor.delete=Odstranit %s
@@ -1322,8 +1352,8 @@ projects.edit_success=Projekt „%s“ byl aktualizován.
projects.type.none=Žádný
projects.type.basic_kanban=Základní Kanban
projects.type.bug_triage=Třídění chyb
-projects.template.desc=Šablona projektu
-projects.template.desc_helper=Vyberte šablonu projektu pro začátek
+projects.template.desc=Šablona
+projects.template.desc_helper=Začněte vybráním šablony projektu
projects.type.uncategorized=Nezařazené
projects.column.edit=Upravit sloupec
projects.column.edit_title=Název
@@ -1331,11 +1361,11 @@ projects.column.new_title=Název
projects.column.new_submit=Vytvořit sloupec
projects.column.new=Nový sloupec
projects.column.set_default=Nastavit jako výchozí
-projects.column.set_default_desc=Nastavit tento sloupec jako výchozí pro nekategorizované úkoly a požadavky na natažení
+projects.column.set_default_desc=Nastavit tento sloupec jako výchozí pro nekategorizované problémy a požadavky na sloučení
projects.column.unset_default=Zrušit nastavení jako výchozí
projects.column.unset_default_desc=Zrušit nastavení tohoto sloupce jako výchozí
-projects.column.delete=Smazat sloupec
-projects.column.deletion_desc=Smazání projektového sloupce přesune všechny související problémy do kategorie „Nezařazené“. Pokračovat?
+projects.column.delete=Odstranit sloupec
+projects.column.deletion_desc=Odstranění projektového sloupce přesune všechny související problémy do kategorie „Nezařazené“. Pokračovat?
projects.column.color=Barva
projects.open=Otevřít
projects.close=Zavřít
@@ -1384,7 +1414,7 @@ issues.new_label_placeholder=Název štítku
issues.new_label_desc_placeholder=Popis
issues.create_label=Vytvořit štítek
issues.label_templates.title=Nahrát předdefinovanou sadu značek
-issues.label_templates.info=Neexistují žádné štítky. Vytvořte štítek pomocí „Nový štítek“ nebo použijte přednastavenou sadu štítků:
+issues.label_templates.info=Zatím nebyly vytvořeny žádné štítky. Vytvořte štítek kliknutím na „Nový štítek“ nebo použijte přednastavenou sadu štítků:
issues.label_templates.helper=Vyberte sadu značek
issues.label_templates.use=Použít sadu štítků
issues.label_templates.fail_to_load_file=Nepodařilo se načíst soubor šablony popisku „%s“: %v
@@ -1539,8 +1569,8 @@ issues.attachment.download=`Klikněte pro stažení „%s“`
issues.subscribe=Odebírat
issues.unsubscribe=Zrušit odběr
issues.unpin_issue=Odepnout problém
-issues.max_pinned=Nemůžete připnout další úkoly
-issues.pin_comment=připnuto %s
+issues.max_pinned=Nemůžete připnout další problémy
+issues.pin_comment=připnul/a tento %s
issues.unpin_comment=odepnul/a tento %s
issues.lock=Uzamknout konverzaci
issues.unlock=Odemknout konverzaci
@@ -1552,7 +1582,7 @@ issues.lock_no_reason=uzamkl/a a omezil/a konverzaci na spolupracovníky %s
issues.unlock_comment=odemkl/a tuto konverzaci %s
issues.lock_confirm=Uzamknout
issues.unlock_confirm=Odemknout
-issues.lock.notice_1=- Další uživatelé nemohou komentovat tento úkol.
+issues.lock.notice_1=- Další uživatelé nemohou komentovat tento problém.
issues.lock.notice_2=- Vy a ostatní spolupracovníci s přístupem k tomuto repozitáři můžete stále přidávat komentáře, které ostatní uvidí.
issues.lock.notice_3=- V budoucnu budete moci vždy znovu tento úkol odemknout.
issues.unlock.notice_1=- Všichni budou moci znovu komentovat tento úkol.
@@ -1586,7 +1616,7 @@ issues.add_time_sum_to_small=Čas nebyl zadán.
issues.time_spent_total=Celkový strávený čas
issues.time_spent_from_all_authors=`Celkový strávený čas: %s`
issues.due_date=Termín dokončení
-issues.invalid_due_date_format=Termín dokončení musí být ve formátu 'rrrr-mm-dd'.
+issues.invalid_due_date_format=Termín dokončení musí být ve formátu „rrrr-mm-dd“.
issues.error_modifying_due_date=Změna termínu dokončení selhala.
issues.error_removing_due_date=Odstranění termínu dokončení selhalo.
issues.push_commit_1=přidal/a %d commit %s
@@ -1597,18 +1627,18 @@ issues.due_date_form=rrrr-mm-dd
issues.due_date_form_add=Přidat termín dokončení
issues.due_date_form_edit=Upravit
issues.due_date_form_remove=Odstranit
-issues.due_date_not_writer=Potřebujete přístup k zápisu do tohoto repozitáře, abyste mohli aktualizovat datum dokončení problému.
+issues.due_date_not_writer=Pro aktualizaci data dokončení problému potřebujete přístup k zápisu do tohoto repozitáře.
issues.due_date_not_set=Žádný termín dokončení.
issues.due_date_added=přidal/a termín dokončení %s %s
-issues.due_date_modified=upravil/a termín termínu z %[2]s na %[1]s %[3]s
+issues.due_date_modified=změnil/a datum termínu z %[2]s na %[1]s %[3]s
issues.due_date_remove=odstranil/a termín dokončení %s %s
issues.due_date_overdue=Zpožděné
issues.due_date_invalid=Termín dokončení není platný nebo je mimo rozsah. Použijte prosím formát „rrrr-mm-dd“.
issues.dependency.title=Závislosti
issues.dependency.issue_no_dependencies=Nejsou nastaveny žádné závislosti.
issues.dependency.pr_no_dependencies=Nejsou nastaveny žádné závislosti.
-issues.dependency.no_permission_1=Nemáte oprávnění ke čtení závislosti %d
-issues.dependency.no_permission_n=Nemáte oprávnění ke čtení závislostí %d
+issues.dependency.no_permission_1=Nemáte oprávnění ke čtení %d závislosti
+issues.dependency.no_permission_n=Nemáte oprávnění ke čtení %d závislostí
issues.dependency.no_permission.can_remove=Nemáte oprávnění ke čtení této závislosti, ale můžete ji odstranit
issues.dependency.add=Přidat závislost…
issues.dependency.cancel=Zrušit
@@ -1636,17 +1666,17 @@ issues.dependency.add_error_cannot_create_circular=Nemůžete vytvořit závislo
issues.dependency.add_error_dep_not_same_repo=Oba úkoly musí být ve stejném repozitáři.
issues.review.self.approval=Nemůžete schválit svůj požadavek na natažení.
issues.review.self.rejection=Nemůžete požadovat změny ve svém vlastním požadavku na natažení.
-issues.review.approve=schválil tyto změny %s
-issues.review.comment=posoudil %s
-issues.review.dismissed=zamítl/a posouzení od %s %s
+issues.review.approve=schválil/a tyto změny %s
+issues.review.comment=posoudil/a %s
+issues.review.dismissed=zamítl/a posouzení uživatele %s %s
issues.review.dismissed_label=Zamítnuto
issues.review.left_comment=zanechal komentář
issues.review.content.empty=Je potřeba zanechat poznámku s uvedením požadované změny (požadovaných změn).
-issues.review.reject=požadované změny %s
-issues.review.wait=byl požádán o posouzení %s
-issues.review.add_review_request=vyžádal posouzení od %s %s
-issues.review.remove_review_request=odstranil žádost o posouzení na %s %s
-issues.review.remove_review_request_self=odmítl posoudit %s
+issues.review.reject=požádal/a o změny %s
+issues.review.wait=byl/a požádán/a o posouzení %s
+issues.review.add_review_request=požádal/a o posouzení od %s %s
+issues.review.remove_review_request=odstranil/a žádost o posouzení na %s %s
+issues.review.remove_review_request_self=odmítl/a posoudit %s
issues.review.pending=Čekající
issues.review.pending.tooltip=Tento komentář není momentálně viditelný pro ostatní uživatele. Chcete-li odeslat Vaše čekající komentáře, vyberte „%s“ → „%s/%s/%s“ v horní části stránky.
issues.review.review=Posouzení
@@ -1732,12 +1762,12 @@ pulls.is_empty=Změny na této větvi jsou již na cílové větvi. Toto bude pr
pulls.required_status_check_failed=Některé požadované kontroly nebyly úspěšné.
pulls.required_status_check_missing=Některé požadované kontroly chybí.
pulls.required_status_check_administrator=Jako administrátor stále můžete sloučit tento požadavek na natažení.
-pulls.blocked_by_approvals=Tento požadavek na natažení ještě nemá dostatek schválení. Uděleno %d z %d schválení.
-pulls.blocked_by_rejection=Tento požadavek na natažení obsahuje změny požadované oficiálním posuzovatelem.
-pulls.blocked_by_official_review_requests=Tento požadavek na natažení obsahuje oficiální žádosti o posouzení.
-pulls.blocked_by_outdated_branch=Tento požadavek na natažení je zablokován, protože je zastaralý.
-pulls.blocked_by_changed_protected_files_1=Tento požadavek na natažení je zablokován, protože mění chráněný soubor:
-pulls.blocked_by_changed_protected_files_n=Tento požadavek na natažení je zablokován, protože mění chráněné soubory:
+pulls.blocked_by_approvals=Tato žádost o sloučení ještě nemá dostatek schválení. Uděleno %d z %d schválení.
+pulls.blocked_by_rejection=Tato žádost o sloučení obsahuje změny požadované oficiálním posuzovatelem.
+pulls.blocked_by_official_review_requests=Tato žádost o sloučení je zablokována, protože jí chybí schválení oficiálních posuzovatelů.
+pulls.blocked_by_outdated_branch=Tato žádost o sloučení je zablokována, protože je zastaralá.
+pulls.blocked_by_changed_protected_files_1=Tato žádost o sloučení je zablokována, protože mění chráněný soubor:
+pulls.blocked_by_changed_protected_files_n=Tato žádost o sloučení je zablokována, protože mění chráněné soubory:
pulls.can_auto_merge_desc=Tento požadavek na natažení může být automaticky sloučen.
pulls.cannot_auto_merge_desc=Tento požadavek na natažení nemůže být automaticky sloučen, neboť se v něm nachází konflikty.
pulls.cannot_auto_merge_helper=Pro vyřešení konfliktů proveďte ruční sloučení.
@@ -1746,10 +1776,10 @@ pulls.num_conflicting_files_n=%d konfliktních souborů
pulls.approve_count_1=%d schválení
pulls.approve_count_n=%d schválení
pulls.reject_count_1=%d žádost o změnu
-pulls.reject_count_n=%d žádosti o změnu
+pulls.reject_count_n=%d žádostí o změnu
pulls.waiting_count_1=%d čekající posouzení
-pulls.waiting_count_n=%d čekající posouzení
-pulls.wrong_commit_id=ID commitu musí být ID commitu v cílové větvi
+pulls.waiting_count_n=%d čekajících posouzení
+pulls.wrong_commit_id=id commitu musí být id commitu v cílové větvi
pulls.no_merge_desc=Tento požadavek na natažení nemůže být sloučen, protože všechny možnosti repozitáře na sloučení jsou zakázány.
pulls.no_merge_helper=Povolte možnosti sloučení v nastavení repozitáře nebo proveďte sloučení požadavku na natažení ručně.
@@ -1830,7 +1860,7 @@ milestones.title=Název
milestones.desc=Popis
milestones.due_date=Termín (volitelný)
milestones.clear=Zrušit
-milestones.invalid_due_date_format=Termín dokončení musí být ve formátu 'rrrr-mm-dd'.
+milestones.invalid_due_date_format=Termín dokončení musí být ve formátu „rrrr-mm-dd“.
milestones.create_success=Milník „%s“ byl vytvořen.
milestones.edit=Upravit milník
milestones.edit_subheader=Milník organizuje úkoly a sledují pokrok.
@@ -2144,7 +2174,7 @@ settings.webhook.body=Tělo zprávy
settings.webhook.replay.description=Zopakovat tento webový háček.
settings.webhook.replay.description_disabled=Chcete-li znovu spustit tento webový háček, aktivujte jej.
settings.webhook.delivery.success=Událost byla přidána do fronty doručení. Může to trvat několik sekund, než se zobrazí v historii doručení.
-settings.githooks_desc=Jelikož háčky Gitu jsou spravovány Gitem samotným, můžete upravit soubory háčků k provádění uživatelských operací.
+settings.githooks_desc=Jelikož Git háčky jsou spravovány Gitem samotným, můžete upravit soubory háčků níže, k provádění libovolných operací.
settings.githook_edit_desc=Je-li háček neaktivní, bude zobrazen vzorový obsah. Nebude-li zadán žádný obsah, háček bude vypnut.
settings.githook_name=Název háčku
settings.githook_content=Obsah háčku
@@ -2261,7 +2291,7 @@ settings.protected_branch.delete_rule=Odstranit pravidlo
settings.protected_branch_can_push=Povolit nahrání?
settings.protected_branch_can_push_yes=Můžete nahrávat
settings.protected_branch_can_push_no=Nemůžete nahrávat
-settings.branch_protection=Ochrana větví pro větev „%s“
+settings.branch_protection=Pravidla ochrany větví pro větev „%s“
settings.protect_this_branch=Povolit ochranu větví
settings.protect_this_branch_desc=Zabraňuje smazání a omezuje gitu nahrávání a slučování do větve.
settings.protect_disable_push=Zakázat nahrávání
@@ -2298,12 +2328,12 @@ settings.dismiss_stale_approvals_desc=Pokud budou do větve nahrány nové reviz
settings.require_signed_commits=Vyžadovat podepsané revize
settings.require_signed_commits_desc=Odmítnout nahrání do této větve pokud nejsou podepsaná nebo jsou neověřitelná.
settings.protect_branch_name_pattern=Vzor jména chráněných větví
-settings.protect_branch_name_pattern_desc=Vzory jmen chráněných větví. Pro vzorovou syntaxi viz dokumentace. Příklady: main, release/**
+settings.protect_branch_name_pattern_desc=Vzory názvů chráněných větví. Pro vzorovou syntaxi viz dokumentace. Příklady: main, release/**
settings.protect_patterns=Vzory
settings.protect_protected_file_patterns=Vzory chráněných souborů (oddělené středníkem „;“):
-settings.protect_protected_file_patterns_desc=Chráněné soubory, které nemají povoleno být měněny přímo, i když uživatel má právo přidávat, upravovat nebo mazat soubory v této větvi. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na github.com/gobwas/glob dokumentaci pro syntaxi vzoru. Příklady: .drone.yml, /docs/**/*.txt.
+settings.protect_protected_file_patterns_desc=Chráněné soubory, které nemají povoleno být měněny přímo, i když uživatel má právo přidávat, upravovat nebo mazat soubory v této větvi. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na github.com/gobwas/glob dokumentaci pro syntaxi vzoru. Příklady: .drone.yml, /docs/**/*.txt.
settings.protect_unprotected_file_patterns=Vzory nechráněných souborů (oddělené středníkem „;“):
-settings.protect_unprotected_file_patterns_desc=Nechráněné soubory, které je možné měnit přímo, pokud má uživatel právo zápisu, čímž se obejde omezení push. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na github.com/gobwas/glob dokumentaci pro syntaxi vzoru. Příklady: .drone.yml, /docs/**/*.txt.
+settings.protect_unprotected_file_patterns_desc=Nechráněné soubory, které je možné měnit přímo, pokud má uživatel právo zápisu, čímž se obejde omezení push. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na github.com/gobwas/glob dokumentaci pro syntaxi vzoru. Příklady: .drone.yml, /docs/**/*.txt.
settings.add_protected_branch=Zapnout ochranu
settings.delete_protected_branch=Vypnout ochranu
settings.update_protect_branch_success=Ochrana větví pro větev „%s“ byla aktualizována.
@@ -2324,7 +2354,7 @@ settings.choose_branch=Vyberte větev…
settings.no_protected_branch=Nejsou tu žádné chráněné větve.
settings.edit_protected_branch=Upravit
settings.protected_branch_required_rule_name=Požadovaný název pravidla
-settings.protected_branch_duplicate_rule_name=Duplikovat název pravidla
+settings.protected_branch_duplicate_rule_name=Již existuje pravidlo pro tuto sadu větví
settings.protected_branch_required_approvals_min=Požadovaná schválení nesmí být záporné číslo.
settings.tags=Značky
settings.tags.protection=Ochrana značek
@@ -2362,7 +2392,7 @@ settings.lfs_findcommits=Najít revize
settings.lfs_lfs_file_no_commits=Pro tento LFS soubor nebyly nalezeny žádné revize
settings.lfs_noattribute=Tato cesta nemá uzamykatelný atribut ve výchozí větvi
settings.lfs_delete=Odstranit LFS soubor s OID %s
-settings.lfs_delete_warning=Smazání LFS souboru může při checkout způsobit „objekt neexistuje“. Jste si jisti?
+settings.lfs_delete_warning=Odstranění souboru LFS může při kontrole způsobit chybu „objekt neexistuje“. Jste si jisti?
settings.lfs_findpointerfiles=Najít soubory ukazatelů
settings.lfs_locks=Zámky
settings.lfs_invalid_locking_path=Neplatná cesta: %s
@@ -2546,8 +2576,94 @@ find_file.no_matching=Nebyl nalezen žádný odpovídající soubor
error.csv.too_large=Tento soubor nelze vykreslit, protože je příliš velký.
error.csv.unexpected=Tento soubor nelze vykreslit, protože obsahuje neočekávaný znak na řádku %d ve sloupci %d.
error.csv.invalid_field_count=Soubor nelze vykreslit, protože má nesprávný počet polí na řádku %d.
+pulls.made_using_agit = AGit
+settings.confirm_wiki_branch_rename = Přejmenovat větev Wiki
+issues.comment.blocked_by_user = U tohoto problému nemůžete vytvořit komentář, protože jste byl/a zablokován/a majitelem repozitáře nebo autorem problému.
+contributors.contribution_type.filter_label = Typ přispění:
+contributors.contribution_type.additions = Přidání
+admin.manage_flags = Spravovat vlajky
+admin.enabled_flags = Vlajky povolené v repozitáři:
+admin.update_flags = Upravit vlajky
+admin.failed_to_replace_flags = Nepodařilo se nahradit vlajky repozitáře
+admin.flags_replaced = Vlajky repozitáře nahrazeny
+desc.sha256 = SHA256
+issues.label_exclusive_warning = Při úpravě štítků problému nebo žádosti o sloučení budou odstraněny všechny konfliktní štítky.
+pulls.cmd_instruction_checkout_title = Kontrola
+settings.mirror_settings.docs.disabled_push_mirror.info = Push zrcadla byla zakázána administrátorem vašeho webu.
+generated = Generováno
+clone_in_vscodium = Klonovat do VSCodium
+settings.wiki_rename_branch_main_notices_1 = Tato operace je NEVRATNÁ.
+settings.wiki_branch_rename_success = Název větve Wiki repozitáře byl úspěšně normalizován.
+object_format = Objektový formát
+rss.must_be_on_branch = Abyste mohli mít zdroj RSS, musíte se nacházet ve větvi.
+object_format_helper = Objektový formát repozitáře. Později jej nelze změnit. Nejkompatibilnější je SHA1.
+issues.blocked_by_user = V tomto repozitáři nemůžete vytvořit problém, protože jste byl/a jeho majitelem zablokován/a.
+migrate.forgejo.description = Migrovat data z codeberg.org nebo jiných instancí Forgejo.
+mirror_sync = synchronizováno
+blame.ignore_revs = Ignorování revizí v souboru .git-blame-ignore-revs. Klikněte sem pro udělení výjimky a zobrazení normálního přehledu blame.
+commits.browse_further = Procházet dále
+issues.role.first_time_contributor = První přispěvatel
+vendored = Vendorováno
+editor.invalid_commit_mail = Neplatný e-mail pro vytvoření commitu.
+commits.renamed_from = Přejmenováno z %s
+issues.label_exclusive_desc = Pojmenujte štítek scope/item, aby se vzájemně vylučoval s ostatními štítky scope/.
+issues.label_archive_tooltip = Štítek Archivováno jsou ve výchozím nastavení vyloučeny z návrhů při vyhledávání podle štítků.
+issues.label_archive = Štítek archivu
+milestones.new_subheader = Milníky vám pomohou zorganizovat problémy a sledovat jejich pokrok.
+pulls.nothing_to_compare_have_tag = Vybraná větev a značka jsou shodné.
+activity.navbar.recent_commits = Nedávné commity
+settings.units.units = Jednotky repozitáře
+pulls.blocked_by_user = V tomto repozitáři nemůžete vytvořit žádost o sloučení, protože jste byli zablokováni jeho majitelem.
+pulls.clear_merge_message_hint = Vymazáním zprávy o sloučení pouze odstraníte obsah zprávy commitu a ponecháte vygenerované git trailery, jako „Co-Authored-By …“.
+pulls.agit_explanation = Vytvořeno pomocí workflow AGit. AGit umožňuje přispěvatelům navrhovat změny pomocí „git push“ bez vytváření forku nebo nové větve.
+contributors.contribution_type.deletions = Odstranění
+settings.pull_mirror_sync_in_progress = Probíhá načítání změn ze vzdáleného %s.
+settings.enter_repo_name = Zadejte majitele a repozitář přesně tak, jak je vidíte níže:
+settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Tuto akci lze v současné chvíli provést pouze v nabídce „Nová migrace“. Pro více informací viz:
+settings.new_owner_blocked_doer = Nový majitel vás zablokoval.
+settings.mirror_settings.pushed_repository = Pushnutý repozitář
+settings.add_collaborator_blocked_our = Nepodařilo se přidat spolupracovníka, jelikož byl zablokován majitelem repozitáře.
+pulls.commit_ref_at = `se odkázal na tuto žádost o sloučení z commitu %[2]s`
+settings.wiki_rename_branch_main = Normalizovat název větve Wiki
+settings.wiki_rename_branch_main_desc = Přejmenovat větev interně používanou pro Wiki na „%s“. Tato změna je trvalá a nelze ji vrátit.
+pulls.fast_forward_only_merge_pull_request = Pouze zrychlené
+pulls.reopen_failed.head_branch = Tuto žádost o sloučení nelze znovu otevřít, protože hlavní větev již neexistuje.
+pulls.reopen_failed.base_branch = Tuto žádost o sloučení nelze znovu otevřít, protože základní větev již neexistuje.
+issues.dependency.issue_batch_close_blocked = Nepodařilo se hromadně zavřít vybrané problémy, protože problém #%d má stále otevřené závislosti
+pulls.recently_pushed_new_branches = Pushnuli jste do větve %[1]s %[2]s
+wiki.cancel = Zrušit
+activity.navbar.pulse = Pulz
+activity.navbar.code_frequency = Frekvence kódu
+activity.navbar.contributors = Přispěvatelé
+settings.mirror_settings.docs.pull_mirror_instructions = Pro nastavení pull zrcadla viz:
+settings.mirror_settings.docs.doc_link_pull_section = sekci „Pulling from a remote repository“ v dokumentaci.
+settings.units.overview = Přehled
+settings.units.add_more = Přidat další...
+settings.push_mirror_sync_in_progress = Probíhá odesílání změn na vzdálený %s.
+settings.wiki_globally_editable = Umožnit komukoli editovat Wiki
+settings.confirmation_string = Potvrzovací řetězec
+settings.wiki_rename_branch_main_notices_2 = Touto akcí trvale přejmenujete interní větev Wiki repozitáře %s. Existující kontroly budou muset být aktualizovány.
+settings.wiki_branch_rename_failure = Nepodařilo se normalizovat název větve Wiki repozitáře.
+settings.add_collaborator_blocked_them = Nepodařilo se přidat spolupracovníka, jelikož má zablokovaného majitele repozitáře.
+settings.ignore_stale_approvals = Ignorovat zastaralá schválení
+settings.event_pull_request_merge = Sloučení žádosti o sloučení
+settings.event_pull_request_approvals = Schválení žádostí o sloučení
+settings.ignore_stale_approvals_desc = Nepočítat schválení udělená u starších commitů (zastaralá schválení) do celkového počtu schválení u ŽS. Není relevantní, pokud byla zastaralá schválení již zrušena.
+file_follow = Následovat symbolický odkaz
+settings.protect_status_check_patterns_desc = Zadejte vzorce pro upřesnění kontrol, které musí projít před sloučením větví do větve, která se shoduje s tímto pravidlem. Na každý řádek zadejte jeden vzorec. Vzorce nesmí být prázdné.
+settings.archive.mirrors_unavailable = Zrcadla nejsou dostupná, když je repozitář archivován.
+settings.protect_enable_merge_desc = Kdokoli s přístupem k zápisu bude moci slučovat žádosti o sloučení do této větve.
+settings.archive.text = Archivováním repozitáře jej celý převedete do stavu pouze pro čtení. Bude skryt z nástěnky. Nikdo (ani vy!) nebude moci vytvářet nové commity ani otevírat problémy a žádosti o sloučení.
+settings.event_pull_request_review_request_desc = Bylo požádáno o posouzení žádosti o sloučení nebo bylo toto požádání odstraněno.
[graphs]
+component_loading_info = Tohle může chvíli trvat…
+component_failed_to_load = Došlo k neočekávané chybě.
+code_frequency.what = frekvence kódu
+contributors.what = příspěvky
+recent_commits.what = nedávné commity
+component_loading = Načítání %s...
+component_loading_failed = Nepodařilo se načíst %s
[org]
org_name_holder=Název organizace
@@ -2658,7 +2774,7 @@ teams.remove_all_repos_title=Odstranit všechny repozitáře týmu
teams.remove_all_repos_desc=Tímto odeberete všechny repozitáře z týmu.
teams.add_all_repos_title=Přidat všechny repozitáře
teams.add_all_repos_desc=Tímto přidáte do týmu všechny repozitáře organizace.
-teams.add_nonexistent_repo=Repositář, který se snažíte přidat, neexistuje. Nejdříve jej vytvořte, prosím.
+teams.add_nonexistent_repo=Repositář, který se snažíte přidat, neexistuje. Nejdříve jej prosím vytvořte.
teams.add_duplicate_users=Uživatel je již členem týmu.
teams.repos.none=Tento tým nemůže přistoupit k žádným repozitářům.
teams.members.none=Žádní členové v tomto týmu.
@@ -2672,6 +2788,7 @@ teams.all_repositories_admin_permission_desc=Tomuto týmu je udělen Adm
teams.invite.title=Byli jste pozváni do týmu %s v organizaci %s.
teams.invite.by=Pozvání od %s
teams.invite.description=Pro připojení k týmu klikněte na tlačítko níže.
+follow_blocked_user = Tuto organizaci nemůžete sledovat, protože jste v ní zablokovaní.
[admin]
dashboard=Přehled
@@ -2713,7 +2830,7 @@ dashboard.cron.error=Chyba v naplánované úloze: %s: %[3]s
dashboard.cron.finished=Naplánovaná úloha: %[1]s skončila
dashboard.delete_inactive_accounts=Smazat všechny neaktivované účty
dashboard.delete_inactive_accounts.started=Spuštěna úloha mazání všech neaktivovaných účtů.
-dashboard.delete_repo_archives=Odstranit všechny archivy repozitáře (ZIP, TAR.GZ, atd.)
+dashboard.delete_repo_archives=Odstranit všechny archivy repozitářů (ZIP, TAR.GZ, atd.)
dashboard.delete_repo_archives.started=Spuštěna úloha smazání všech archivovaných repozitářů.
dashboard.delete_missing_repos=Smazat všechny repozitáře, které nemají Git soubory
dashboard.delete_missing_repos.started=Spuštěna úloha mazání všech repozitářů, které nemají Git soubory.
@@ -2726,8 +2843,8 @@ dashboard.deleted_branches_cleanup=Vyčistit odstraněné větve
dashboard.update_migration_poster_id=Aktualizovat ID autora migrace
dashboard.git_gc_repos=Provést úklid všech repozitářů
dashboard.resync_all_sshkeys=Aktualizovat soubor „.ssh/authorized_keys“ pomocí SSH klíčů Forgejo.
-dashboard.resync_all_sshprincipals=Aktualizovat soubor '.ssh/authorized_principals' pomocí Forgejo SSH Principal certifikátů.
-dashboard.resync_all_hooks=Znovu synchronizovat háčky před přijetím, aktualizace a po přijetí všech repozitářů.
+dashboard.resync_all_sshprincipals=Aktualizovat soubor „.ssh/authorized_principals“ pomocí Forgejo SSH Principal certifikátů.
+dashboard.resync_all_hooks=Znovu synchronizovat hooky „před přijetím“, „aktualizace“ a „po přijetí“ u všech repozitářů
dashboard.reinit_missing_repos=Znovu inicializovat všechny chybějící repozitáře, pro které existují záznamy
dashboard.sync_external_users=Synchronizovat externí uživatelská data
dashboard.cleanup_hook_task_table=Vyčistit tabulku hook_task
@@ -2807,11 +2924,11 @@ users.allow_import_local=Může importovat lokální repozitáře
users.allow_create_organization=Může vytvářet organizace
users.update_profile=Aktualizovat uživatelský účet
users.delete_account=Smazat uživatelský účet
-users.cannot_delete_self=Nemůžete smazat sami sebe
+users.cannot_delete_self=Nemůžete odstranit sami sebe
users.still_own_repo=Tento uživatel stále vlastní jeden nebo více repozitářů. Tyto repozitáře nejprve smažte nebo je převeďte.
users.still_has_org=Uživatel je člen organizace. Nejprve odstraňte uživatele ze všech organizací.
users.purge=Vymazat uživatele
-users.purge_help=Vynuceně smazat uživatele a všechny repositáře, organizace a balíčky vlastněné uživatelem. Všechny komentáře budou také smazány.
+users.purge_help=Vynuceně odstranit uživatele a všechny repositáře, organizace a balíčky vlastněné uživatelem. Budou také smazány všechny komentáře a problémy uživatele.
users.still_own_packages=Tento uživatel stále vlastní jeden nebo více balíčků, nejprve odstraňte tyto balíčky.
users.deletion_success=Uživatelský účet byl smazán.
users.reset_2fa=Resetovat 2FA
@@ -2926,7 +3043,7 @@ auths.smtp_auth=Typ ověření SMTP
auths.smtphost=Server SMTP
auths.smtpport=Port SMTP
auths.allowed_domains=Povolené domény
-auths.allowed_domains_helper=Nechte prázdné k povolení všech domén. Oddělte více domén pomocí čárky („,“).
+auths.allowed_domains_helper=Nechte prázdné k povolení všech domén. Více domén oddělte čárkou („,“).
auths.skip_tls_verify=Přeskočit ověření TLS
auths.force_smtps=Vynutit SMTPS
auths.force_smtps_helper=SMTPS se vždy používá na portu 465. Nastavením této hodnoty vynutíte použití SMTPS na jiných portech. (V opačném případě se na ostatních portech použije STARTTLS, pokud je podporován hostiteslkým serverem.)
@@ -2972,7 +3089,7 @@ auths.tips=Tipy
auths.tips.oauth2.general=Ověřování OAuth2
auths.tips.oauth2.general.tip=Při registraci nové OAuth2 autentizace by URL callbacku/přesměrování měla být:
auths.tip.oauth2_provider=Poskytovatel OAuth2
-auths.tip.bitbucket=Vytvořte nového OAuth konzumenta na https://bitbucket.org/account/user//oauth-consumers/new a přidejte oprávnění „Account“ - „Read“
+auths.tip.bitbucket=Vytvořte nového OAuth uživatele na stránce https://bitbucket.org/account/user//oauth-consumers/new a přidejte oprávnění „Account“ - „Read“
auths.tip.nextcloud=Zaregistrujte nového OAuth konzumenta na vaší instanci pomocí následujícího menu „Nastavení -> Zabezpečení -> OAuth 2.0 klient“
auths.tip.dropbox=Vytvořte novou aplikaci na https://www.dropbox.com/developers/apps
auths.tip.facebook=Registrujte novou aplikaci na https://developers.facebook.com/apps a přidejte produkt „Facebook Login“
@@ -3005,7 +3122,7 @@ config.app_name=Název stránky
config.app_ver=Verze Forgejo
config.app_url=Základní URL Forgejo
config.custom_conf=Cesta ke konfiguračnímu souboru
-config.custom_file_root_path=Kořenový adresář vlastních souborů
+config.custom_file_root_path=Vlastní kořenový adresář souborů
config.domain=Doména serveru
config.offline_mode=Lokální režim
config.disable_router_log=Vypnout log směrovače
@@ -3027,7 +3144,7 @@ config.ssh_port=Port
config.ssh_listen_port=Port pro naslouchání
config.ssh_root_path=Kořenová cesta
config.ssh_key_test_path=Cesta testu klíčů
-config.ssh_keygen_path=Cesta ke generátoru klíčů ('ssh-keygen')
+config.ssh_keygen_path=Cesta ke generátoru klíčů („ssh-keygen“)
config.ssh_minimum_key_size_check=Kontrola minimální velikosti klíčů
config.ssh_minimum_key_sizes=Minimální velikost klíčů
@@ -3186,6 +3303,28 @@ notices.type_2=Úloha
notices.desc=Popis
notices.op=Akce
notices.delete_success=Systémové upozornění bylo smazáno.
+dashboard.sync_repo_branches = Synchronizovat zmeškané větve z dat gitu do databáze
+dashboard.sync_repo_tags = Synchronizovat značky z dat gitu do databáze
+dashboard.gc_lfs = Sbírat garbage z LFS meta objektů
+monitor.queue.activeworkers = Aktivní workery
+defaulthooks.desc = Webhooky automaticky vytvářejí žádosti HTTP POST na server, kde se spustí určité události Forgejo. Webhooky zde definované jsou výchozí a budou zkopírovány do všech nových repozitářů. Více informací zjistíte v návodu webhooků.
+systemhooks.desc = Webhooky automaticky vytvářejí žádosti HTTP POST na server, kde se spustí určité události Forgejo. Webhooky zde definované budou aktivní u všech repozitářů v systému, zvažte tedy prosím všechny vlivy na výkon, které může tato funkce způsobit. Více informací zjistíte v návodu webhooků.
+assets = Assety kódu
+dashboard.cleanup_actions = Vymazat prošlé protokoly a artefakty z akcí
+packages.cleanup.success = Prošlá data úspěšně vymazána
+config.logger_name_fmt = Logger: %S
+monitor.download_diagnosis_report = Stáhnout hlášení o diagnóze
+self_check.no_problem_found = Zatím nenalezen žádný problém.
+self_check.database_collation_mismatch = Očekává se, že databáze použije collation: %s
+self_check.database_inconsistent_collation_columns = Databáze používá collation %s, tyto sloupce nicméně používají rozdílné collationy. Toto může způsobit neočekávané problémy.
+self_check.database_fix_mysql = Uživatelé MySQL/MariaDB mohou použít příkaz „gitea doctor convert“ pro automatické opravení problémů s collation. Problém také můžete vyřešit ručně SQL příkazy „ALTER ... COLLATE ...“.
+self_check = Vlastní kontrola
+dashboard.sync_tag.started = Synchronizace značek spuštěna
+dashboard.rebuild_issue_indexer = Přestavit indexer vydání
+self_check.database_collation_case_insensitive = Databáze používá collation %s. Jedná se o intenzivní collation. Ačkoli s ní Forgejo nejspíše bude pracovat, mohou nastat určité vzácné případy, kdy nebude pracovat tak, jak má.
+self_check.database_fix_mssql = Uživatelé MSSQL mohou tento problém vyřešit pouze ručními SQL příkazy „ALTER ... COLLATE ...“.
+auths.oauth2_map_group_to_team = Zmapovat zabrané skupiny u týmů organizací (volitelné - vyžaduje název zabrání výše)
+monitor.queue.settings.desc = Pooly dynamicky rostou podle blokování fronty jejich workerů.
[action]
@@ -3267,10 +3406,10 @@ error.extract_sign=Selhalo získání podpisu
error.generate_hash=Selhalo vygenerování hash revize
error.no_committer_account=Žádný účet není propojen s e-mailovou adresou přispěvatele
error.no_gpg_keys_found=V databázi nebyl nalezen žádný známý klíč pro tento podpis
-error.not_signed_commit=Nepodepsaná revize
-error.failed_retrieval_gpg_keys=Nelze získat žádný klíč propojený s účtem přispěvatele
-error.probable_bad_signature=VAROVÁNÍ! Přestože v databázi existuje klíč s tímto ID, tuto revizi neověřuje! Tato revize je PODEZŘELÁ.
-error.probable_bad_default_signature=VAROVÁNÍ! Ačkoli výchozí klíč má toto ID, neověřuje tuto revizi! Tato revize je PODEZŘELÁ.
+error.not_signed_commit=Nepodepsaný commit
+error.failed_retrieval_gpg_keys=Nepodařilo se získat žádný klíč propojený s účtem přispěvatele
+error.probable_bad_signature=VAROVÁNÍ! Přestože v databázi existuje klíč s tímto ID, tento commit neověřuje! Tento commit je PODEZŘELÝ.
+error.probable_bad_default_signature=VAROVÁNÍ! Ačkoli výchozí klíč má toto ID, neověřuje tento commit! Tento commit je PODEZŘELÝ.
[units]
unit=Jednotka
@@ -3403,10 +3542,10 @@ owner.settings.cargo.initialize.success=Index Cargo byl úspěšně vytvořen.
owner.settings.cargo.rebuild=Znovu vytvořit Index
owner.settings.cargo.rebuild.error=Obnovení Cargo indexu se nezdařilo: %v
owner.settings.cargo.rebuild.success=Cargo Index byl úspěšně obnoven.
-owner.settings.cleanuprules.title=Spravovat pravidla pro čištění
+owner.settings.cleanuprules.title=Správa pravidel čištění
owner.settings.cleanuprules.add=Přidat pravidlo pro čištění
owner.settings.cleanuprules.edit=Upravit pravidlo pro čištění
-owner.settings.cleanuprules.none=Nejsou k dispozici žádná pravidla čištění. Prohlédněte si prosím dokumentaci.
+owner.settings.cleanuprules.none=Zatím nejsou k dispozici žádná pravidla čištění.
owner.settings.cleanuprules.preview=Náhled pravidla pro čištění
owner.settings.cleanuprules.preview.overview=%d balíčků má být odstraněno.
owner.settings.cleanuprules.preview.none=Pravidlo čištění neodpovídá žádným balíčkům.
@@ -3426,6 +3565,8 @@ owner.settings.cleanuprules.success.delete=Pravidlo pro čištění bylo odstran
owner.settings.chef.title=Registr Chef
owner.settings.chef.keypair=Generovat pár klíčů
owner.settings.chef.keypair.description=Pro autentizaci do registru Chef je zapotřebí pár klíčů. Pokud jste předtím vytvořili pár klíčů, nově vygenerovaný pár klíčů vyřadí starý pár klíčů.
+rpm.repository.multiple_groups = Tento balíček je dostupný v několika skupinách.
+owner.settings.cargo.rebuild.description = Opětovné sestavení může být užitečné, pokud není index synchronizován s uloženými balíčky Cargo.
[secrets]
secrets=Tajné klíče
@@ -3505,9 +3646,9 @@ runs.no_runs=Pracovní postup zatím nebyl spuštěn.
runs.empty_commit_message=(prázdná zpráva commitu)
workflow.disable=Zakázat pracovní postup
-workflow.disable_success=Pracovní postup „%s“ byl úspěšně deaktivován.
+workflow.disable_success=Workflow „%s“ byl úspěšně deaktivován.
workflow.enable=Povolit pracovní postup
-workflow.enable_success=Pracovní postup „%s“ byl úspěšně aktivován.
+workflow.enable_success=Workflow „%s“ byl úspěšně aktivován.
workflow.disabled=Pracovní postup je zakázán.
@@ -3528,6 +3669,12 @@ variables.update.success=Proměnná byla upravena.
runs.no_workflows.quick_start = Nevíte jak začít s Gitea Action? Podívejte se na průvodce rychlým startem.
variables.id_not_exist = Proměnná s id %d neexistuje.
runs.no_workflows.documentation = Další informace o Gitea Action, viz dokumentace.
+runners.none = Nejsou dostupné žádné runnery
+runs.workflow = Workflow
+runners = Runnery
+runs.pushed_by = pushnuto uživatelem
+need_approval_desc = Potřebovat schválení pro spouštění workflowů pro žádosti o sloučení forků.
+runners.runner_manage_panel = Správa runnerů
[projects]
type-1.display_name=Samostatný projekt
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index 5b288c0090..7a91ee9a57 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -141,7 +141,7 @@ name=Name
value=Wert
view = Ansehen
tracked_time_summary = Zusammenfassung erfasster Zeit, basierend auf Filtern der Issue-Liste
-confirm_delete_artifact = Bist du sicher, das Artefakt '%s' löschen zu wollen?
+confirm_delete_artifact = Bist du sicher, das Artefakt „%s“ löschen zu wollen?
[aria]
navbar=Navigationsleiste
@@ -182,6 +182,7 @@ missing_csrf=Fehlerhafte Anfrage: Kein CSRF Token verfügbar
invalid_csrf=Fehlerhafte Anfrage: Ungültiger CSRF Token
not_found=Das Ziel konnte nicht gefunden werden.
network_error=Netzwerkfehler
+server_internal = Interner Serverfehler
[startpage]
app_desc=Ein einfacher, selbst gehosteter Git-Service
@@ -307,6 +308,7 @@ env_config_keys=Umgebungskonfiguration
env_config_keys_prompt=Die folgenden Umgebungsvariablen werden auch auf Ihre Konfigurationsdatei angewendet:
allow_dots_in_usernames = Erlaubt Benutzern die Verwendung von Punkten in ihren Benutzernamen. Hat keine Auswirkungen auf bestehende Konten.
enable_update_checker_helper_forgejo = Prüft regelmäßig auf neue Forgejo-Versionen, indem ein DNS-TXT-Eintrag unter release.forgejo.org überprüft wird.
+smtp_from_invalid = Die „Sende E-Mail Als“-Adresse ist ungültig
[home]
uname_holder=E-Mail-Adresse oder Benutzername
@@ -450,12 +452,12 @@ activate_email.text=Bitte klicke innerhalb von %s auf folgenden Link, um
register_notify=Willkommen bei Forgejo
register_notify.title=%[1]s, willkommen bei %[2]s
register_notify.text_1=dies ist deine Bestätigungs-E-Mail für %s!
-register_notify.text_2=Du kannst dich jetzt mit dem Benutzernamen „%s“ anmelden.
-register_notify.text_3=Wenn dieser Account von dir erstellt wurde, musst du zuerst dein Passwort setzen.
+register_notify.text_2=Du kannst dich mit dem Benutzernamen „%s“ anmelden.
+register_notify.text_3=Wenn jemand anderes diesen Account für dich erstellt hat, musst du zuerst dein Passwort setzen.
reset_password=Stelle dein Konto wieder her
-reset_password.title=%s, du hast um Wiederherstellung deines Kontos gebeten
-reset_password.text=Bitte klicke innerhalb von %s auf folgenden Link, um dein Konto wiederherzustellen:
+reset_password.title=%s, wir haben eine Anfrage zur Wiederherstellung deines Kontos erhalten
+reset_password.text=Falls du das warst, klicke bitte innerhalb von %s auf folgenden Link, um dein Konto wiederherzustellen:
register_success=Registrierung erfolgreich
@@ -752,11 +754,11 @@ keep_email_private_popup=Dies wird deine E-Mail-Adresse nicht nur in deinem Prof
openid_desc=Mit OpenID kannst du dich über einen Drittanbieter authentifizieren.
manage_ssh_keys=SSH-Schlüssel verwalten
-manage_ssh_principals=SSH-Zertifikat's Identitäten verwalten
+manage_ssh_principals=SSH-Zertifikats-Principals 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 Repositorys. Verifizierte SSH-Key können verwendet werden, um SSH-signierte Git-Commits zu signieren.
-principal_desc=Diese SSH-Zertifikat-Identitäten sind mit deinem Konto verknüpft und erlauben den vollen Zugriff auf deine Repositories.
+principal_desc=Diese SSH-Zertifikat-Principals sind mit deinem Konto verknüpft und erlauben den vollen Zugriff auf deine Repositorys.
gpg_desc=Diese öffentlichen GPG-Keys sind mit deinem Account verbunden und werden benutzt um deine Commits zu verifizieren. 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.
@@ -1361,7 +1363,7 @@ projects.column.set_default_desc=Diese Spalte als Standard für nicht kategorisi
projects.column.unset_default=Standard entfernen
projects.column.unset_default_desc=Diese Spalte nicht als Standard verwenden
projects.column.delete=Spalte löschen
-projects.column.deletion_desc=Beim Löschen einer Projektspalte werden alle dazugehörigen Issues nach ‚Nicht kategorisiert‘ verschoben. Fortfahren?
+projects.column.deletion_desc=Beim Löschen einer Projektspalte werden alle dazugehörigen Issues nach „Nicht kategorisiert“ verschoben. Fortfahren?
projects.column.color=Farbe
projects.open=Öffnen
projects.close=Schließen
@@ -1435,7 +1437,7 @@ issues.change_title_at=`hat den Titel von %s zu %s%s zu %s %s geändert`
issues.remove_ref_at=`hat die Referenz %s entfernt %s`
issues.add_ref_at=`hat die Referenz %s hinzugefügt %s`
-issues.delete_branch_at=`löschte die Branch %s %s`
+issues.delete_branch_at=`löschte den Branch %s %s`
issues.filter_label=Label
issues.filter_label_exclude=`Alt + Klick/Enter verwenden, um Labels auszuschließen`
issues.filter_label_no_select=Alle Labels
@@ -1497,7 +1499,7 @@ issues.draft_title=Entwurf
issues.num_comments_1=%d Kommentar
issues.num_comments=%d Kommentare
issues.commented_at=`hat %s kommentiert`
-issues.delete_comment_confirm=Bist du sicher dass du diesen Kommentar löschen möchtest?
+issues.delete_comment_confirm=Bist du sicher, dass du diesen Kommentar löschen möchtest?
issues.context.copy_link=Link kopieren
issues.context.quote_reply=Antwort zitieren
issues.context.reference_issue=In neuem Issue referenzieren
@@ -1617,7 +1619,7 @@ issues.add_time_sum_to_small=Es wurde keine Zeit eingegeben.
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.push_commit_1=hat %d Commit %s hinzugefügt
@@ -1744,7 +1746,7 @@ pulls.tab_conversation=Diskussion
pulls.tab_commits=Commits
pulls.tab_files=Geänderte Dateien
pulls.reopen_to_merge=Bitte diesen Pull-Request wieder öffnen, um zu mergen.
-pulls.cant_reopen_deleted_branch=Dieser Pull-Request kann nicht wieder geöffnet werden, da die Branch bereits gelöscht wurde.
+pulls.cant_reopen_deleted_branch=Dieser Pull-Request kann nicht wieder geöffnet werden, da der Branch bereits gelöscht wurde.
pulls.merged=Zusammengeführt
pulls.merged_success=Pull-Request erfolgreich gemerged und geschlossen
pulls.closed=Pull-Request geschlossen
@@ -1754,8 +1756,8 @@ pulls.is_closed=Der Pull-Request wurde geschlossen.
pulls.title_wip_desc=`Beginne den Titel mit %s, um zu verhindern, dass der Pull-Request versehentlich gemergt wird.`
pulls.cannot_merge_work_in_progress=Dieser Pull Request ist als „Work in Progress“ (in Bearbeitung) markiert.
pulls.still_in_progress=Noch in Bearbeitung?
-pulls.add_prefix=%s Präfix hinzufügen
-pulls.remove_prefix=%s Präfix entfernen
+pulls.add_prefix=Präfix „%s“ hinzufügen
+pulls.remove_prefix=Präfix „%s” entfernen
pulls.data_broken=Dieser Pull-Requests ist kaputt, da Fork-Informationen gelöscht wurden.
pulls.files_conflicted=Dieser Pull-Request hat Änderungen, die im Widerspruch zum Ziel-Branch stehen.
pulls.is_checking=Die Merge-Konfliktprüfung läuft noch. Bitte aktualisiere die Seite in wenigen Augenblicken.
@@ -1781,7 +1783,7 @@ pulls.reject_count_1=%d Änderungsanfrage
pulls.reject_count_n=%d Änderungsanfragen
pulls.waiting_count_1=%d wartendes Review
pulls.waiting_count_n=%d wartende Reviews
-pulls.wrong_commit_id=die Commit ID muss eine Commit ID auf dem Zielbranch sein
+pulls.wrong_commit_id=die Commit-ID muss eine Commit-ID auf dem Zielbranch sein
pulls.no_merge_desc=Dieser Pull-Request kann nicht gemergt werden, da alle Repository-Merge-Optionen deaktiviert sind.
pulls.no_merge_helper=Aktiviere Mergeoptionen in den Repositoryeinstellungen oder merge den Pull-Request manuell.
@@ -1819,8 +1821,8 @@ pulls.status_checks_details=Details
pulls.update_branch=Branch durch Mergen aktualisieren
pulls.update_branch_rebase=Branch durch Rebase aktualisieren
pulls.update_branch_success=Branch-Aktualisierung erfolgreich
-pulls.update_not_allowed=Du hast keine Berechtigung, die Branch zu Updaten
-pulls.outdated_with_base_branch=Dieser Branch enthält nicht die neusten Commits der Basis-Branch
+pulls.update_not_allowed=Du hast keine Berechtigung, den Branch zu updaten
+pulls.outdated_with_base_branch=Dieser Branch enthält nicht die neusten Commits des Basis-Branches
pulls.close=Pull-Request schließen
pulls.closed_at=`hat diesen Pull-Request %[2]s geschlossen`
pulls.reopened_at=`hat diesen Pull-Request %[2]s wieder geöffnet`
@@ -1964,7 +1966,7 @@ activity.title.releases_1=%d Release
activity.title.releases_n=%d Releases
activity.title.releases_published_by=%s von %s veröffentlicht
activity.published_release_label=Veröffentlicht
-activity.no_git_activity=In diesem Zeitraum sind keine Commit-Aktivität vorhanden.
+activity.no_git_activity=In diesem Zeitraum hat es keine Commit-Aktivität gegeben.
activity.git_stats_exclude_merges=Merges ausgenommen,
activity.git_stats_author_1=%d Autor
activity.git_stats_author_n=%d Autoren
@@ -2288,7 +2290,7 @@ 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.
@@ -2305,18 +2307,18 @@ settings.protect_this_branch_desc=Verhindert das Löschen und schränkt Git auf
settings.protect_disable_push=Push deaktivieren
settings.protect_disable_push_desc=Kein Push auf diesen Branch erlauben.
settings.protect_enable_push=Push aktivieren
-settings.protect_enable_push_desc=Jeder, der Schreibzugriff hat, darf in diesen Branch Pushen (aber kein Force-Push).
+settings.protect_enable_push_desc=Jeder, der Schreibzugriff hat, darf in diesen Branch pushen (aber kein Force-Push).
settings.protect_enable_merge=Merge aktivieren
settings.protect_enable_merge_desc=Jeder mit Schreibzugriff darf die Pull-Requests in diesen Branch mergen.
settings.protect_whitelist_committers=Schütze gewhitelistete Commiter
settings.protect_whitelist_committers_desc=Jeder, der auf der Whitelist steht, darf in diesen Branch pushen (aber kein Force-Push).
settings.protect_whitelist_deploy_keys=Deploy-Schlüssel mit Schreibzugriff zum Pushen whitelisten.
settings.protect_whitelist_users=Nutzer, die pushen dürfen:
-settings.protect_whitelist_search_users=Benutzer suchen…
+settings.protect_whitelist_search_users=Benutzer suchen …
settings.protect_whitelist_teams=Teams, die pushen dürfen:
-settings.protect_whitelist_search_teams=Teams suchen…
+settings.protect_whitelist_search_teams=Teams suchen …
settings.protect_merge_whitelist_committers=Merge-Whitelist aktivieren
-settings.protect_merge_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Pull-Requests in diesen 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.protect_check_status_contexts=Statusprüfungen aktivieren
@@ -2340,14 +2342,14 @@ settings.require_signed_commits_desc=Pushes auf diesen Branch ablehnen, wenn Com
settings.protect_branch_name_pattern=Muster für geschützte Branchnamen
settings.protect_patterns=Muster
settings.protect_protected_file_patterns=Geschützte Dateimuster (durch Semikolon „;“ getrennt):
-settings.protect_protected_file_patterns_desc=Geschützte Dateien dürfen nicht direkt geändert werden, auch wenn der Benutzer Rechte hat, Dateien in diesem Branch hinzuzufügen, zu bearbeiten oder zu löschen. Mehrere Muster können mit Semikolon (';') getrennt werden. Siehe github.com/gobwas/glob Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt.
+settings.protect_protected_file_patterns_desc=Geschützte Dateien dürfen nicht direkt geändert werden, auch wenn der Benutzer Rechte hat, Dateien in diesem Branch hinzuzufügen, zu bearbeiten oder zu löschen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe github.com/gobwas/glob Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt.
settings.protect_unprotected_file_patterns=Ungeschützte Dateimuster (durch Semikolon „;“ getrennt):
-settings.protect_unprotected_file_patterns_desc=Ungeschützte Dateien, die direkt geändert werden dürfen, wenn der Benutzer Schreibzugriff hat, können die Push-Beschränkung umgehen. Mehrere Muster können mit Semikolon (';') getrennt werden. Siehe github.com/gobwas/glob Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt.
+settings.protect_unprotected_file_patterns_desc=Ungeschützte Dateien, die direkt geändert werden dürfen, wenn der Benutzer Schreibzugriff hat, können die Push-Beschränkung umgehen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe github.com/gobwas/glob Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt.
settings.add_protected_branch=Schutz aktivieren
settings.delete_protected_branch=Schutz deaktivieren
-settings.update_protect_branch_success=Branchschutzregel "%s" wurde geändert.
-settings.remove_protected_branch_success=Branchschutzregel "%s" wurde deaktiviert.
-settings.remove_protected_branch_failed=Entfernen der Branchschutzregel "%s" fehlgeschlagen.
+settings.update_protect_branch_success=Branchschutzregel „%s“ wurde aktualisiert.
+settings.remove_protected_branch_success=Branchschutzregel „%s“ wurde entfernt.
+settings.remove_protected_branch_failed=Entfernen der Branchschutzregel „%s“ fehlgeschlagen.
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.block_rejected_reviews=Merge bei abgelehnten Reviews blockieren
@@ -2358,16 +2360,16 @@ settings.block_outdated_branch=Merge blockieren, wenn der Pull-Request veraltet
settings.block_outdated_branch_desc=Mergen ist nicht möglich, wenn der Head-Branch hinter dem Basis-Branch ist.
settings.default_branch_desc=Wähle einen Standardbranch für Pull-Requests und Code-Commits:
settings.merge_style_desc=Merge-Styles
-settings.default_merge_style_desc=Standard Mergeverhalten für Pull Requests:
-settings.choose_branch=Branch wählen…
+settings.default_merge_style_desc=Standard-Mergeverhalten
+settings.choose_branch=Branch wählen …
settings.no_protected_branch=Es gibt keine geschützten Branches.
settings.edit_protected_branch=Bearbeiten
settings.protected_branch_required_rule_name=Regelname erforderlich
-settings.protected_branch_duplicate_rule_name=Regelname existiert bereits
+settings.protected_branch_duplicate_rule_name=Es existiert bereits eine Regel für dieses Branch-Set
settings.protected_branch_required_approvals_min=Die Anzahl der erforderlichen Zustimmungen darf nicht negativ sein.
settings.tags=Tags
settings.tags.protection=Tag-Schutz
-settings.tags.protection.pattern=Tag Muster
+settings.tags.protection.pattern=Tag-Muster
settings.tags.protection.allowed=Erlaubt
settings.tags.protection.allowed.users=Erlaubte Benutzer
settings.tags.protection.allowed.teams=Erlaubte Teams
@@ -2386,11 +2388,11 @@ settings.archive.header=Dieses Repo archivieren
settings.archive.text=Durch das Archivieren wird ein Repo vollständig schreibgeschützt. Es wird vom Dashboard versteckt. Niemand (nicht einmal du!) wird in der Lage sein, neue Commits zu erstellen oder Issues oder Pull-Requests zu öffnen.
settings.archive.success=Das Repo wurde erfolgreich archiviert.
settings.archive.error=Beim Versuch, das Repository zu archivieren, ist ein Fehler aufgetreten. Weitere Details finden sich im Log.
-settings.archive.error_ismirror=Du kannst keinen Repo-Mirror archivieren.
+settings.archive.error_ismirror=Du kannst kein gespiegeltes Repo archivieren.
settings.archive.branchsettings_unavailable=Branch-Einstellungen sind nicht verfügbar wenn das Repo archiviert ist.
settings.archive.tagsettings_unavailable=Tag Einstellungen sind nicht verfügbar, wenn das Repo archiviert wurde.
settings.unarchive.button=Archivieren rückgängig machen
-settings.unarchive.header=Archivieren dieses Repositories rückgängig machen
+settings.unarchive.header=Archivieren dieses Repositorys rückgängig machen
settings.unarchive.text=Durch das Aufheben der Archivierung kann das Repo wieder Commits und Pushes sowie neue Issues und Pull-Requests empfangen.
settings.unarchive.success=Die Archivierung des Repos wurde erfolgreich wieder rückgängig gemacht.
settings.unarchive.error=Beim Versuch, die Archivierung des Repos aufzuheben, ist ein Fehler aufgetreten. Weitere Details finden sich im Log.
@@ -2402,7 +2404,7 @@ settings.lfs_findcommits=Commits finden
settings.lfs_lfs_file_no_commits=Keine Commits für diese LFS-Datei gefunden
settings.lfs_noattribute=Dieser Pfad hat nicht das sperrbare Attribut im Standard-Branch
settings.lfs_delete=LFS-Datei mit OID %s löschen
-settings.lfs_delete_warning=Das Löschen einer LFS-Datei kann dazu führen, dass 'Objekt existiert nicht'-Fehler beim Checkout auftreten. Bist du sicher?
+settings.lfs_delete_warning=Das Löschen einer LFS-Datei kann dazu führen, dass „Objekt existiert nicht“-Fehler beim Checkout auftreten. Bist du sicher?
settings.lfs_findpointerfiles=Pointer-Dateien finden
settings.lfs_locks=Sperren
settings.lfs_invalid_locking_path=Ungültiger Pfad: %s
@@ -2413,8 +2415,8 @@ settings.lfs_lock_path=Zu sperrender Dateipfad...
settings.lfs_locks_no_locks=Keine Sperren
settings.lfs_lock_file_no_exist=Gesperrte Datei existiert nicht im Standard-Branch
settings.lfs_force_unlock=Freigabe erzwingen
-settings.lfs_pointers.found=%d Blob-Zeiger gefunden - %d assoziiert, %d nicht assoziiert (%d fehlend im Speicher)
-settings.lfs_pointers.sha=Blob SHA
+settings.lfs_pointers.found=%d Blob-Zeiger gefunden – %d assoziiert, %d nicht assoziiert (%d fehlend im Speicher)
+settings.lfs_pointers.sha=Blob-SHA
settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=Im Repo
settings.lfs_pointers.exists=Existiert im Speicher
@@ -2461,7 +2463,7 @@ diff.load=Diff laden
diff.generated=generiert
diff.vendored=vendored
diff.comment.add_line_comment=Einzelnen Kommentar hinzufügen
-diff.comment.placeholder=Kommentieren...
+diff.comment.placeholder=Kommentieren
diff.comment.markdown_info=Styling mit Markdown wird unterstützt.
diff.comment.add_single_comment=Einzelnen Kommentar hinzufügen
diff.comment.add_review_comment=Kommentar hinzufügen
@@ -2533,28 +2535,28 @@ release.releases_for=Releases für %s
release.tags_for=Tags für %s
branch.name=Branchname
-branch.already_exists=Ein 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 eines Branches ist permanent. Obwohl der Branch für eine kurze Zeit weiter existieren könnte, kann diese Aktion in den meisten Fällen 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 werden, da seit dem letzten Merge neue Commits hinzugefügt wurden.
+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 werden, 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.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.create_from=`von „%s“`
+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 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 vom Branch "%s" gescheitert.
-branch.protected_deletion_failed=Branch "%s" ist geschützt und kann nicht gelöscht werden.
-branch.default_deletion_failed=Branch "%s" kann nicht gelöscht werden, da dieser Branch der Standard-Branch ist.
-branch.restore=Branch "%s" wiederherstellen
-branch.download=Branch "%s" herunterladen
-branch.rename=Branch "%s" umbenennen
+branch.restore_success=Branch „%s“ wurde wiederhergestellt.
+branch.restore_failed=Wiederherstellung vom Branch „%s“ gescheitert.
+branch.protected_deletion_failed=Branch „%s“ ist geschützt und kann nicht gelöscht werden.
+branch.default_deletion_failed=Branch „%s“ kann nicht gelöscht werden, da dieser Branch der Standard-Branch ist.
+branch.restore=Branch „%s“ wiederherstellen
+branch.download=Branch „%s“ herunterladen
+branch.rename=Branch „%s“ umbenennen
branch.search=Branch suchen
branch.included_desc=Dieser Branch ist im Standard-Branch enthalten
branch.included=Enthalten
@@ -2565,20 +2567,20 @@ branch.rename_branch_to=„%s“ umbenennen in:
branch.confirm_rename_branch=Branch umbenennen
branch.create_branch_operation=Branch erstellen
branch.new_branch=Neue Branch erstellen
-branch.new_branch_from=Neuen Branch von "%s" erstellen
+branch.new_branch_from=Neuen Branch von „%s“ erstellen
branch.renamed=Branch %s wurde in %s umbenannt.
tag.create_tag=Tag %s erstellen
tag.create_tag_operation=Tag erstellen
tag.confirm_create_tag=Tag erstellen
-tag.create_tag_from=Neuen Tag von "%s" erstellen
+tag.create_tag_from=Neuen Tag von „%s“ erstellen
-tag.create_success=Tag "%s" wurde erstellt.
+tag.create_success=Tag „%s“ wurde erstellt.
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 entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) und Punkte ('.') enthalten und bis zu 35 Zeichen lang sein. Nur Kleinbuchstaben sind zulässig.
+topic.format_prompt=Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) und Punkte („.“) enthalten und bis zu 35 Zeichen lang sein. Nur Kleinbuchstaben sind zulässig.
find_file.go_to_file=Datei suchen
find_file.no_matching=Keine passende Datei gefunden
@@ -2599,9 +2601,9 @@ pulls.reopen_failed.base_branch = Der Pull-Request kann nicht wieder geöffnet w
settings.mirror_settings.pushed_repository = Gepushtes Repository
settings.add_collaborator_blocked_them = Der Mitarbeiter konnte nicht hinzugefügt werden, weil er den Besitzer des Repositorys blockiert hat.
settings.wiki_rename_branch_main = Den Wiki-Branch-Namen normalisieren
-settings.enter_repo_name = Gib den Repository-Namen zur Bestätigung ein:
+settings.enter_repo_name = Gib den Besitzer- und den Repository-Namen genau wie angezeigt ein:
settings.wiki_branch_rename_success = Der Branch-Name des Repository-Wikis wurde erfolgreich normalisiert.
-settings.archive.mirrors_unavailable = Mirrors sind nicht verfügbar, wenn das Repo archiviert ist.
+settings.archive.mirrors_unavailable = Spiegel sind nicht verfügbar, wenn das Repo archiviert ist.
pulls.blocked_by_user = Du kannst keinen Pull-Request in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
settings.add_collaborator_blocked_our = Der Mitarbeiter konnte nicht hinzugefügt werden, weil der Repository-Besitzer ihn blockiert hat.
issues.blocked_by_user = Du kannst kein Issue in diesem Repository erstellen, weil du vom Repository-Besitzer blockiert wurdest.
@@ -2647,6 +2649,10 @@ contributors.contribution_type.filter_label = Art des Beitrags:
vendored = Vendored
activity.navbar.pulse = Puls
pulls.made_using_agit = AGit
+settings.confirmation_string = Bestätigungsstring
+pulls.agit_explanation = Mittels AGit-Workflow erstellt. AGit erlaubt Mitwirkenden, Änderungen mittels „git push“ vorzuschlagen, ohne einen Fork oder neuen Branch zu erstellen.
+activity.navbar.recent_commits = Neueste Commits
+activity.navbar.code_frequency = Code-Frequenz
[graphs]
@@ -2660,7 +2666,7 @@ members=Mitglieder
teams=Teams
code=Quelltext
lower_members=Mitglieder
-lower_repositories=Repositories
+lower_repositories=Repositorys
create_new_team=Neues Team
create_team=Team erstellen
org_desc=Beschreibung
@@ -2673,8 +2679,8 @@ team_permission_desc=Berechtigungen
team_unit_desc=Zugriff auf Repositorybereiche erlauben
team_unit_disabled=(Deaktiviert)
-form.name_reserved=Der Organisationsname "%s" ist reserviert.
-form.name_pattern_not_allowed=Das Muster "%s" ist in Organisationsnamen nicht erlaubt.
+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
@@ -2703,9 +2709,9 @@ settings.delete_prompt=Die Organisation wird dauerhaft gelöscht. Dies K
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.
+settings.hooks_desc=Webhooks hinzufügen, die für alle Repositorys dieser Organisation ausgelöst werden.
-settings.labels_desc=Labels hinzufügen, die für alle Repositories dieser Organisation genutzt werden können.
+settings.labels_desc=Labels hinzufügen, die für alle Repositorys dieser Organisation genutzt werden können.
members.membership_visibility=Sichtbarkeit der Mitgliedschaft:
members.public=Sichtbar
@@ -2725,8 +2731,8 @@ members.invite_now=Jetzt einladen
teams.join=Beitreten
teams.leave=Verlassen
teams.leave.detail=%s verlassen?
-teams.can_create_org_repo=Repositories erstellen
-teams.can_create_org_repo_helper=Mitglieder können neue Repositories in der Organisation erstellen. Der Ersteller erhält Administrator-Zugriff auf das neue Repository.
+teams.can_create_org_repo=Repositorys erstellen
+teams.can_create_org_repo_helper=Mitglieder können neue Repositorys in der Organisation erstellen. Der Ersteller erhält Administrator-Zugriff auf das neue Repository.
teams.none_access=Kein Zugriff
teams.none_access_helper=Teammitglieder haben keinen Zugriff auf diese Einheit.
teams.general_access=Allgemeiner Zugriff
@@ -2739,7 +2745,7 @@ teams.admin_access=Administratorzugang
teams.admin_access_helper=Mitglieder können auf Team-Repositories pushen, von ihnen pullen und Mitwirkende 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.
+teams.owners_permission_desc=Besitzer haben vollen Zugriff auf alle Repositorys und Admin-Rechte für diese Organisation.
teams.members=Teammitglieder
teams.update_settings=Einstellungen aktualisieren
teams.delete_team=Team löschen
@@ -2749,27 +2755,27 @@ teams.invite_team_member.list=Ausstehende Einladungen
teams.delete_team_title=Team löschen
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.
-teams.admin_permission_desc=Dieses Team hat Adminzugriff: Mitglieder dieses Teams können Team-Repositories ansehen, auf sie pushen und Mitarbeiter hinzufügen.
-teams.create_repo_permission_desc=Zusätzlich erteilt dieses Team die Berechtigung Repository erstellen: Mitglieder können neue Repositories in der Organisation erstellen.
-teams.repositories=Team-Repositories
-teams.search_repo_placeholder=Repository durchsuchen…
-teams.remove_all_repos_title=Alle Team-Repositories entfernen
-teams.remove_all_repos_desc=Dies entfernt alle Repositories von dem Team.
-teams.add_all_repos_title=Alle Repositories hinzufügen
-teams.add_all_repos_desc=Dadurch werden alle Repositories der Organisation dem Team hinzugefügt.
+teams.read_permission_desc=Dieses Team hat Lesezugriff: Mitglieder können Team-Repositorys einsehen und klonen.
+teams.write_permission_desc=Dieses Team hat Schreibzugriff: Mitglieder können Team-Repositorys einsehen und darauf pushen.
+teams.admin_permission_desc=Dieses Team hat Adminzugriff: Mitglieder dieses Teams können Team-Repositorys ansehen, auf sie pushen und Mitarbeiter hinzufügen.
+teams.create_repo_permission_desc=Zusätzlich erteilt dieses Team die Berechtigung Repository erstellen: Mitglieder können neue Repositorys in der Organisation erstellen.
+teams.repositories=Team-Repositorys
+teams.search_repo_placeholder=Repository durchsuchen …
+teams.remove_all_repos_title=Alle Team-Repositorys entfernen
+teams.remove_all_repos_desc=Dies entfernt alle Repositorys von dem Team.
+teams.add_all_repos_title=Alle Repositorys hinzufügen
+teams.add_all_repos_desc=Dadurch werden alle Repositorys der Organisation dem Team hinzugefügt.
teams.add_nonexistent_repo=Das Repository, das du hinzufügen möchtest, existiert nicht. Bitte erstelle es zuerst.
teams.add_duplicate_users=Dieser Benutzer ist bereits ein Teammitglied.
teams.repos.none=Dieses Team hat Zugang zu keinem Repository.
teams.members.none=Keine Mitglieder in diesem Team.
-teams.specific_repositories=Bestimmte Repositories
-teams.specific_repositories_helper=Mitglieder haben nur Zugriff auf Repositories, die explizit dem Team hinzugefügt wurden. Wenn Du diese Option wählst, werden Repositories, die bereits mit Alle Repositories hinzugefügt wurden, nicht automatisch entfernt.
-teams.all_repositories=Alle Repositories
-teams.all_repositories_helper=Team hat Zugriff auf alle Repositories. Wenn dies ausgewählt wird, werden alle vorhandenen Repositories zum Team hinzugefügt.
-teams.all_repositories_read_permission_desc=Dieses Team gewährt Lese-Zugriff auf Repositories: Mitglieder können Repositories ansehen und klonen.
-teams.all_repositories_write_permission_desc=Dieses Team gewährt Schreib-Zugriff auf alle Repositories: Mitglieder können Repositories lesen und auf sie pushen.
-teams.all_repositories_admin_permission_desc=Dieses Team gewährt Administrator-Zugriff auf alle Repositories: Mitglieder können Repositories lesen, auf sie pushen und Mitwirkende zu Repositorys hinzufügen.
+teams.specific_repositories=Bestimmte Repositorys
+teams.specific_repositories_helper=Mitglieder haben nur Zugriff auf Repositorys, die explizit dem Team hinzugefügt wurden. Wenn Du diese Option wählst, werden Repositorys, die bereits mit Alle Repositorys hinzugefügt wurden, nicht automatisch entfernt.
+teams.all_repositories=Alle Repositorys
+teams.all_repositories_helper=Team hat Zugriff auf alle Repositorys. Wenn dies ausgewählt wird, werden alle vorhandenen Repositorys zum Team hinzugefügt.
+teams.all_repositories_read_permission_desc=Dieses Team gewährt Lese-Zugriff auf Repositorys: Mitglieder können Repositorys ansehen und klonen.
+teams.all_repositories_write_permission_desc=Dieses Team gewährt Schreib-Zugriff auf alle Repositorys: Mitglieder können Repositorys lesen und auf sie pushen.
+teams.all_repositories_admin_permission_desc=Dieses Team gewährt Administrator-Zugriff auf alle Repositorys: Mitglieder können Repositorys lesen, auf sie pushen und Mitwirkende zu Repositorys hinzufügen.
teams.invite.title=Du wurdest eingeladen, dem Team %s in der Organisation %s beizutreten.
teams.invite.by=Von %s eingeladen
teams.invite.description=Bitte klicke auf die folgende Schaltfläche, um dem Team beizutreten.
@@ -2781,7 +2787,7 @@ identity_access=Identität & Zugriff
users=Benutzerkonten
organizations=Organisationen
assets=Code-Assets
-repositories=Repositories
+repositories=Repositorys
hooks=Webhooks
integrations=Integrationen
authentication=Authentifizierungsquellen
@@ -2819,20 +2825,20 @@ dashboard.delete_inactive_accounts.started=Löschen aller nicht aktivierten Acco
dashboard.delete_repo_archives=Lösche alle Repository-Archive (ZIP, TAR.GZ, …)
dashboard.delete_repo_archives.started=Löschen aller Repository-Archive gestartet.
dashboard.delete_missing_repos=Alle Repository-Datensätze mit verloren gegangenen Git-Dateien löschen
-dashboard.delete_missing_repos.started=Alle Repositories löschen, die den Git-File-Task nicht gestartet haben.
+dashboard.delete_missing_repos.started=Alle Repositorys löschen, die den Git-File-Task nicht gestartet haben.
dashboard.delete_generated_repository_avatars=Generierte Repository-Avatare löschen
dashboard.sync_repo_branches=Fehlende Branches aus den Git-Daten in die Datenbank synchronisieren
-dashboard.update_mirrors=Mirrors aktualisieren
-dashboard.repo_health_check=Healthchecks für alle Repositories ausführen
+dashboard.update_mirrors=Spiegel aktualisieren
+dashboard.repo_health_check=Healthchecks für alle Repositorys ausführen
dashboard.check_repo_stats=Überprüfe alle Repository-Statistiken
dashboard.archive_cleanup=Alte Repository-Archive löschen
dashboard.deleted_branches_cleanup=Gelöschte Branches bereinigen
dashboard.update_migration_poster_id=Migration Poster-IDs updaten
-dashboard.git_gc_repos=Garbage-Collection für alle Repositories ausführen
-dashboard.resync_all_sshkeys=Die Datei '.ssh/authorized_keys' mit Forgejo SSH-Schlüsseln aktualisieren.
-dashboard.resync_all_sshprincipals=Aktualisiere die Datei '.ssh/authorized_principals' mit Forgejo SSH Identitäten.
-dashboard.resync_all_hooks=Die „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositories erneut synchronisieren.
-dashboard.reinit_missing_repos=Alle Git-Repositories neu einlesen, für die Einträge existieren
+dashboard.git_gc_repos=Garbage-Collection für alle Repositorys ausführen
+dashboard.resync_all_sshkeys=Die Datei „.ssh/authorized_keys“ mit Forgejo-SSH-Schlüsseln aktualisieren.
+dashboard.resync_all_sshprincipals=Aktualisiere die Datei „.ssh/authorized_principals“ mit Forgejo-SSH-Principals.
+dashboard.resync_all_hooks=Die „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositorys erneut synchronisieren.
+dashboard.reinit_missing_repos=Alle Git-Repositorys neu einlesen, für die Einträge existieren
dashboard.sync_external_users=Externe Benutzerdaten synchronisieren
dashboard.cleanup_hook_task_table=Hook-Task-Tabelle bereinigen
dashboard.cleanup_packages=Veraltete Pakete löschen
@@ -2894,7 +2900,7 @@ 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
@@ -2902,15 +2908,15 @@ users.auth_login_name=Anmeldename zur Authentifizierung
users.password_helper=Passwort leer lassen, um es nicht zu verändern.
users.update_profile_success=Das Benutzerkonto wurde aktualisiert.
users.edit_account=Benutzerkonto bearbeiten
-users.max_repo_creation=Maximale Anzahl an Repositories
+users.max_repo_creation=Maximale Anzahl an Repositorys
users.max_repo_creation_desc=(Gib -1 ein, um das globale Standardlimit zu verwenden.)
users.is_activated=Account ist aktiviert
users.prohibit_login=Anmelden deaktivieren
users.is_admin=Ist Administrator
users.is_restricted=Ist eingeschränkt
users.allow_git_hook=Darf „Git Hooks“ erstellen
-users.allow_git_hook_tooltip=Git-Hooks werden mit denselben Benutzer-Rechten ausgeführt, mit denen Forgejo läuft, und haben die gleiche Ebene von Host-Zugriff. Dadurch können Benutzer mit diesen speziellen Git-Hook-Rechten auf alle Forgejo-Repositories sowie auf die von Forgejo verwendete Datenbank zugreifen und diese ändern. Auch das Erhalten von Administratorrechten für Forgejo ist möglich.
-users.allow_import_local=Darf lokale Repositories importieren
+users.allow_git_hook_tooltip=Git-Hooks werden mit denselben Benutzer-Rechten ausgeführt, mit denen Forgejo läuft, und haben die gleiche Ebene von Host-Zugriff. Dadurch können Benutzer mit diesen speziellen Git-Hook-Rechten auf alle Forgejo-Repositorys sowie auf die von Forgejo verwendete Datenbank zugreifen und diese ändern. Auch das Erhalten von Administratorrechten für Forgejo ist möglich.
+users.allow_import_local=Darf lokale Repositorys importieren
users.allow_create_organization=Darf Organisationen erstellen
users.update_profile=Benutzerkonto aktualisieren
users.delete_account=Benutzerkonto löschen
@@ -2955,8 +2961,8 @@ orgs.members=Mitglieder
orgs.new_orga=Neue Organisation
repos.repo_manage_panel=Repositoryverwaltung
-repos.unadopted=Nicht übernommene Repositories
-repos.unadopted.no_more=Keine weiteren nicht übernommenen Repositories gefunden
+repos.unadopted=Nicht übernommene Repositorys
+repos.unadopted.no_more=Keine weiteren nicht übernommenen Repositorys gefunden
repos.owner=Besitzer
repos.name=Name
repos.private=Privat
@@ -2981,12 +2987,12 @@ packages.size=Größe
packages.published=Veröffentlicht
defaulthooks=Standard-Webhooks
-defaulthooks.desc=Webhooks senden automatisch eine HTTP-POST-Anfrage an einen Server, wenn bestimmte Forgejo-Events ausgelöst werden. Hier definierte Webhooks sind die Standardwerte, die in alle neuen Repositories kopiert werden. Mehr Infos findest du in der Webhooks-Anleitung (auf Englisch).
+defaulthooks.desc=Webhooks senden automatisch eine HTTP-POST-Anfrage an einen Server, wenn bestimmte Forgejo-Events ausgelöst werden. Hier definierte Webhooks sind die Standardwerte, die in alle neuen Repositorys kopiert werden. Mehr Infos findest du in der Webhooks-Anleitung (auf Englisch).
defaulthooks.add_webhook=Standard-Webhook hinzufügen
defaulthooks.update_webhook=Standard-Webhook aktualisieren
systemhooks=System-Webhooks
-systemhooks.desc=Webhooks senden automatisch HTTP-POST-Anfragen an einen Server, wenn bestimmte Forgejo-Events ausgelöst werden. Hier definierte Webhooks werden auf alle Repositories des Systems übertragen, beachte daher mögliche Performance-Einbrüche. Mehr Infos findest du in der Webhooks-Anleitung (auf Englisch).
+systemhooks.desc=Webhooks senden automatisch HTTP-POST-Anfragen an einen Server, wenn bestimmte Forgejo-Events ausgelöst werden. Hier definierte Webhooks werden auf alle Repositorys des Systems übertragen, beachte daher mögliche Performance-Einbrüche. Mehr Infos findest du in der Webhooks-Anleitung (auf Englisch).
systemhooks.add_webhook=System-Webhook hinzufügen
systemhooks.update_webhook=System-Webhook aktualisieren
@@ -3021,10 +3027,10 @@ auths.search_page_size=Seitengröße
auths.filter=Benutzerfilter
auths.admin_filter=Admin-Filter
auths.restricted_filter=Eingeschränkte Filter
-auths.restricted_filter_helper=Leer lassen, um keine Benutzer als eingeschränkt festzulegen. Verwende einen Stern ('*'), um alle Benutzer, die nicht dem Admin-Filter entsprechen, als eingeschränkt zu setzen.
+auths.restricted_filter_helper=Leer lassen, um keine Benutzer als eingeschränkt festzulegen. Verwende einen Asterisk („*“), um alle Benutzer, die nicht dem Admin-Filter entsprechen, als eingeschränkt zu setzen.
auths.verify_group_membership=Gruppenmitgliedschaft in LDAP verifizieren (zum Überspringen leer lassen)
auths.group_search_base=Gruppensuche Basisdomainname
-auths.group_attribute_list_users=Gruppenattribut, welches die die Benutzerliste enthält
+auths.group_attribute_list_users=Gruppenattribut, welches die Benutzerliste enthält
auths.user_attribute_in_group=Benutzerattribut in der Gruppenliste
auths.map_group_to_team=Ordne LDAP-Gruppen Organisationsteams zu (zum Überspringen leer lassen)
auths.map_group_to_team_removal=Benutzer aus synchronisierten Teams entfernen, wenn der Benutzer nicht zur entsprechenden LDAP-Gruppe gehört
@@ -3038,7 +3044,7 @@ auths.allowed_domains_helper=Leer lassen, um alle Domains zuzulassen. Trenne meh
auths.skip_tls_verify=TLS-Verifikation überspringen
auths.force_smtps=SMTPS erzwingen
auths.force_smtps_helper=SMTPS wird immer auf Port 465 verwendet. Setze dies, um SMTPS auf anderen Ports zu erzwingen. (Sonst wird STARTTLS auf anderen Ports verwendet, wenn es vom Host unterstützt wird.)
-auths.helo_hostname=HELO Hostname
+auths.helo_hostname=HELO-Hostname
auths.helo_hostname_helper=Mit HELO gesendeter Hostname. Leer lassen, um den aktuellen Hostnamen zu senden.
auths.disable_helo=HELO deaktivieren
auths.pam_service_name=PAM-Dienstname
@@ -3062,9 +3068,9 @@ auths.oauth2_required_claim_name_helper=Setze diesen Namen, damit Nutzer aus die
auths.oauth2_required_claim_value=Benötigter Claim-Wert
auths.oauth2_required_claim_value_helper=Setze diesen Wert, damit Nutzer aus dieser Quelle sich nur anmelden dürfen, wenn sie einen Claim mit diesem Namen und Wert besitzen
auths.oauth2_group_claim_name=Claim-Name, der Gruppennamen für diese Quelle angibt. (Optional)
-auths.oauth2_admin_group=Gruppen-Claim-Wert für Administratoren. (Optional - erfordert Claim-Namen oben)
-auths.oauth2_restricted_group=Gruppen-Claim-Wert für eingeschränkte User. (Optional - erfordert Claim-Namen oben)
-auths.oauth2_map_group_to_team=Gruppen aus OAuth-Claims den Organisationsteams zuordnen. (Optional - oben muss der Name des Claims angegeben werden)
+auths.oauth2_admin_group=Gruppen-Claim-Wert für Administratoren. (Optional – erfordert Claim-Namen oben)
+auths.oauth2_restricted_group=Gruppen-Claim-Wert für eingeschränkte User. (Optional – erfordert Claim-Namen oben)
+auths.oauth2_map_group_to_team=Gruppen aus OAuth-Claims den Organisationsteams zuordnen. (Optional – oben muss der Name des Claims angegeben werden)
auths.oauth2_map_group_to_team_removal=Benutzer aus synchronisierten Teams entfernen, wenn der Benutzer nicht zur entsprechenden Gruppe gehört.
auths.enable_auto_register=Automatische Registrierung aktivieren
auths.sspi_auto_create_users=Benutzer automatisch anlegen
@@ -3072,19 +3078,19 @@ auths.sspi_auto_create_users_helper=Erlaube der SSPI Authentifikationsmethode, a
auths.sspi_auto_activate_users=Benutzer automatisch aktivieren
auths.sspi_auto_activate_users_helper=Erlaube der SSPI Authentifikationsmethode, automatisch neue Benutzerkonten zu aktivieren
auths.sspi_strip_domain_names=Domain vom Nutzernamen entfernen
-auths.sspi_strip_domain_names_helper=Falls aktiviert werden Domainnamen bei Loginnamen entfernt (z.B. "DOMAIN\nutzer" und "nutzer@example.ort" werden beide nur "nutzer").
+auths.sspi_strip_domain_names_helper=Falls aktiviert, werden Domainnamen von Loginnamen entfernt (z.B. „DOMAIN\nutzer“ und „nutzer@example.org“ werden beide nur „nutzer“).
auths.sspi_separator_replacement=Trennzeichen als Ersatz für \, / und @
-auths.sspi_separator_replacement_helper=Das zu verwendende Trennzeichen um Logon-Namen (zB. \ in "DOMAIN\user") und die Hauptnamen von Benutzern (z. B. das @ in "user@example.org") zu separieren.
+auths.sspi_separator_replacement_helper=Das zu verwendende Trennzeichen, um Logon-Namen (z.B. das „\“ in „DOMAIN\nutzer“) und die Hauptnamen von Benutzern (z.B. das „@“ in „nutzer@example.org“) zu trennen.
auths.sspi_default_language=Standardsprache für Benutzer
-auths.sspi_default_language_helper=Standardsprache für Benutzer, die automatisch mit der SSPI Authentifizierungsmethode erstellt wurden. Leer lassen, wenn du es bevorzugst, dass eine Sprache automatisch erkannt wird.
+auths.sspi_default_language_helper=Standardsprache für Benutzer, die automatisch mit der SSPI-Authentifizierungsmethode erstellt wurden. Leer lassen, wenn du es bevorzugst, dass eine Sprache automatisch erkannt wird.
auths.tips=Tipps
auths.tips.oauth2.general=OAuth2-Authentifizierung
auths.tips.oauth2.general.tip=Beim Registrieren einer OAuth2-Anwendung sollte die Callback-URL folgendermaßen lauten:
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.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.nextcloud=Registriere über das "Settings -> Security -> OAuth 2.0 client"-Menü einen neuen "OAuth consumer" auf der Nextcloud-Instanz
-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.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.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/
@@ -3092,11 +3098,11 @@ auths.tip.openid_connect=Benutze die OpenID-Connect-Discovery-URL (/.wel
auths.tip.twitter=Gehe auf https://dev.twitter.com/apps, erstelle eine Anwendung und stelle sicher, dass die Option „Allow this application to be used to Sign in with Twitter“ aktiviert ist
auths.tip.discord=Erstelle unter https://discordapp.com/developers/applications/me eine neue Anwendung.
auths.tip.gitea=Registriere eine neue OAuth2-Anwendung. Eine Anleitung findest du unter https://docs.gitea.com/development/oauth2-provider/
-auths.tip.yandex=`Erstelle eine neue Anwendung auf https://oauth.yandex.com/client/new. Wähle folgende Berechtigungen aus dem "Yandex.Passport API" Bereich: "Zugriff auf E-Mail-Adresse", "Zugriff auf Benutzeravatar" und "Zugriff auf Benutzername, Vor- und Nachname, Geschlecht"`
-auths.tip.mastodon=Gebe eine benutzerdefinierte URL für die Mastodon-Instanz ein, mit der du dich authentifizieren möchtest (oder benutze die standardmäßige)
+auths.tip.yandex=`Erstelle eine neue Anwendung auf https://oauth.yandex.com/client/new. Wähle folgende Berechtigungen aus dem Abschnitt „Yandex.Passport API“: „Zugriff auf E-Mail-Adresse“, „Zugriff auf Benutzeravatar“ und „Zugriff auf Benutzername, Vor- und Nachname, Geschlecht“`
+auths.tip.mastodon=Gib eine benutzerdefinierte URL für die Mastodon-Instanz ein, mit der du dich authentifizieren möchtest (oder benutze die standardmäßige)
auths.edit=Authentifikationsquelle bearbeiten
auths.activated=Diese Authentifikationsquelle ist aktiviert
-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
@@ -3104,7 +3110,7 @@ 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.login_source_exist=Die Authentifizierungsquelle „%s“ existiert bereits.
auths.login_source_of_type_exist=Eine Authentifizierungart dieses Typs existiert bereits.
auths.unable_to_initialize_openid=OpenID Connect Provider konnte nicht initialisiert werden: %s
auths.invalid_openIdConnectAutoDiscoveryURL=Ungültige Auto-Discovery-URL (dies muss eine gültige URL sein, die mit http:// oder https:// beginnt)
@@ -3192,13 +3198,13 @@ config.mailer_user=Benutzer
config.mailer_use_sendmail=Sendmail benutzen
config.mailer_sendmail_path=Sendmail-Pfad
config.mailer_sendmail_args=Zusätzliche Argumente für Sendmail
-config.mailer_sendmail_timeout=Sendmail Timeout
+config.mailer_sendmail_timeout=Sendmail-Timeout
config.mailer_use_dummy=Dummy
config.test_email_placeholder=E-Mail (z.B. test@example.com)
config.send_test_mail=Test-E-Mail senden
config.send_test_mail_submit=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
@@ -3230,7 +3236,7 @@ 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
+config.git_mirror_timeout=Zeitlimit für Spiegel-Aktualisierung
config.git_clone_timeout=Zeitlimit für Clone
config.git_pull_timeout=Zeitlimit für Pull
config.git_gc_timeout=Zeitlimit für GC
@@ -3326,7 +3332,7 @@ comment_issue=`hat das Issue %[3]s#%[2]s kommentiert`
comment_pull=`Pull-Request %[3]s#%[2]s wurde kommentiert`
merge_pull_request=`Pull-Request %[3]s#%[2]s wurde zusammengeführt`
auto_merge_pull_request=`Pull-Request %[3]s#%[2]s wurde automatisch zusammengeführt`
-transfer_repo=hat Repository %s transferiert an %s
+transfer_repo=hat Repository %s übertragen zu %s
push_tag=Tag %[3]s nach %[4]s wurde gepusht
delete_tag=hat Tag %[2]s in %[3]s gelöscht
delete_branch=hat Branch %[2]s in %[3]s gelöscht
@@ -3335,15 +3341,15 @@ compare_commits=Vergleiche %d Commits
compare_commits_general=Commits vergleichen
mirror_sync_push=Commits zu %[3]s bei %[4]s wurden von einem Spiegel synchronisiert
mirror_sync_create=neue Referenz %[3]s bei %[4]s wurde von einem Spiegel synchronisiert
-mirror_sync_delete=hat die Referenz des Mirrors %[2]s in %[3]s synchronisiert und gelöscht
-approve_pull_request=`hat %[3]s#%[2]s approved`
+mirror_sync_delete=hat die Referenz des Spiegels %[2]s in %[3]s synchronisiert und gelöscht
+approve_pull_request=`hat %[3]s#%[2]s genehmigt`
reject_pull_request=`schlug Änderungen für %[3]s#%[2]s vor`
-publish_release=`veröffentlichte Release "%[4]s" in %[3]s`
+publish_release=`veröffentlichte Release „%[4]s“ in %[3]s`
review_dismissed=`verwarf das Review von %[4]s in %[3]s#%[2]s`
review_dismissed_reason=Grund:
create_branch=legte den Branch %[3]s in %[4]s an
-starred_repo=markiert %[2]s
-watched_repo=beobachtet %[2]s
+starred_repo=favorisierte %[2]s
+watched_repo=beobachtet ab jetzt %[2]s
[tool]
now=jetzt
@@ -3405,7 +3411,7 @@ error.unit_not_allowed=Du hast keine Berechtigung, um auf diesen Repository-Bere
title=Pakete
desc=Repository-Pakete verwalten.
empty=Noch keine Pakete vorhanden.
-empty.documentation=Weitere Informationen zur Paket-Registry findest Du in der Dokumentation.
+empty.documentation=Weitere Informationen zur Paket-Registry findest du in der Dokumentation.
empty.repo=Hast du ein Paket hochgeladen, das hier nicht angezeigt wird? Gehe zu den Paketeinstellungen und verlinke es mit diesem Repo.
registry.documentation=Für weitere Informationen zur %s-Registry, schaue in der Dokumentation nach.
filter.type=Typ
@@ -3437,20 +3443,20 @@ alpine.registry.info=Wähle $branch und $repository aus der Liste unten.
alpine.install=Nutze folgenden Befehl, um das Paket zu installieren:
alpine.repository=Repository-Informationen
alpine.repository.branches=Branches
-alpine.repository.repositories=Repositories
+alpine.repository.repositories=Repositorys
alpine.repository.architectures=Architekturen
cargo.registry=Richte diese Registry in der Cargo-Konfigurationsdatei ein (z.B. ~/.cargo/config.toml):
cargo.install=Um das Paket mit Cargo zu installieren, führe den folgenden Befehl aus:
-chef.registry=Richte diese Registry in deiner ~/.chef/config.rb Datei ein:
+chef.registry=Richte diese Registry in deiner ~/.chef/config.rb-Datei ein:
chef.install=Nutze folgenden Befehl, um das Paket zu installieren:
-composer.registry=Setze diese Paketverwaltung in deiner ~/.composer/config.json Datei auf:
+composer.registry=Setze diese Paketverwaltung in deiner ~/.composer/config.json-Datei auf:
composer.install=Nutze folgenden Befehl, um das Paket mit Composer zu installieren:
composer.dependencies=Abhängigkeiten
composer.dependencies.development=Entwicklungsabhängigkeiten
conan.details.repository=Repository
conan.registry=Diese Registry über die Kommandozeile einrichten:
conan.install=Um das Paket mit Conan zu installieren, führe den folgenden Befehl aus:
-conda.registry=Richte diese Registry als Conda-Repository in deiner .condarc Datei ein:
+conda.registry=Richte diese Registry als Conda-Repository in deiner .condarc-Datei ein:
conda.install=Um das Paket mit Conda zu installieren, führe den folgenden Befehl aus:
container.details.type=Container-Image Typ
container.details.platform=Plattform
@@ -3461,7 +3467,7 @@ container.layers=Container-Image Ebenen
container.labels=Labels
container.labels.key=Schlüssel
container.labels.value=Wert
-cran.registry=Richte diese Registry in deiner Rprofile.site Datei ein:
+cran.registry=Richte diese Registry in deiner Rprofile.site-Datei ein:
cran.install=Nutze folgenden Befehl, um das Paket zu installieren:
debian.registry=Diese Registry über die Kommandozeile einrichten:
debian.registry.info=Wähle $distribution und $component aus der Liste unten.
@@ -3562,7 +3568,7 @@ none=Noch keine Secrets vorhanden.
creation=Secret hinzufügen
creation.name_placeholder=Groß-/Kleinschreibung wird ignoriert, nur alphanumerische Zeichen oder Unterstriche, darf nicht mit GITEA_ oder GITHUB_ beginnen
creation.value_placeholder=Beliebigen Inhalt eingeben. Leerzeichen am Anfang und Ende werden weggelassen.
-creation.success=Das Secret "%s" wurde hinzugefügt.
+creation.success=Das Secret „%s“ wurde hinzugefügt.
creation.failed=Secret konnte nicht hinzugefügt werden.
deletion=Secret entfernen
deletion.description=Das Entfernen eines Secrets kann nicht rückgängig gemacht werden. Fortfahren?
@@ -3625,7 +3631,7 @@ runs.all_workflows=Alle Workflows
runs.commit=Commit
runs.scheduled=Geplant
runs.pushed_by=gepusht von
-runs.invalid_workflow_helper=Die Workflow-Konfigurationsdatei ist ungültig. Bitte überprüfe Deine Konfigurationsdatei: %s
+runs.invalid_workflow_helper=Die Workflow-Konfigurationsdatei ist ungültig. Bitte überprüfe deine Konfigurationsdatei: %s
runs.actor=Initiator
runs.status=Status
runs.actors_no_select=Alle Initiatoren
@@ -3634,9 +3640,9 @@ runs.no_results=Keine passenden Ergebnisse gefunden.
runs.no_runs=Der Workflow hat noch keine Ausführungen.
workflow.disable=Workflow deaktivieren
-workflow.disable_success=Workflow '%s' erfolgreich deaktiviert.
+workflow.disable_success=Workflow „%s“ erfolgreich deaktiviert.
workflow.enable=Workflow aktivieren
-workflow.enable_success=Workflow '%s' erfolgreich aktiviert.
+workflow.enable_success=Workflow „%s“ erfolgreich aktiviert.
workflow.disabled=Workflow ist deaktiviert.
need_approval_desc=Um Workflows für den Pull-Request eines Forks auszuführen, ist eine Genehmigung erforderlich.
@@ -3661,6 +3667,7 @@ runs.no_workflows = Es gibt noch keine Workflows.
runs.no_workflows.documentation = Für weitere Informationen über Forgejo Actions, siehe die Dokumentation.
runs.empty_commit_message = (leere Commit-Nachricht)
variables.id_not_exist = Variable mit ID %d existiert nicht.
+runs.workflow = Workflow
[projects]
type-1.display_name=Individuelles Projekt
@@ -3684,3 +3691,4 @@ component_loading_info = Dies könnte einen Moment dauern …
component_failed_to_load = Ein unerwarteter Fehler ist aufgetreten.
component_loading = Lade %s …
contributors.what = Beiträge
+recent_commits.what = neueste Commits
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index 919edc0150..4d494a6d8b 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -142,6 +142,7 @@ pin = Vastpinnen
unpin = Ontpinnen
remove_label_str = Verwijder punt "%s"
confirm_delete_artifact = Weet u zeker dat u het artefact "%s" wilt verwijderen?
+toggle_menu = Menu schakelen
[aria]
navbar = Navigatiebalk
@@ -436,7 +437,7 @@ remember_me.compromised = De login-sleutel is niet meer geldig, dit kan wijzen o
[mail]
view_it_on=Bekijk het op %s
-link_not_working_do_paste=Werkt dit niet? Probeer het te kopiëren en te plakken naar uw browser.
+link_not_working_do_paste=Werkt de link niet? Kopieer en plak de link dan in de URL-balk van je browser.
hi_user_x=Hoi %s,
activate_account=Activeer uw account
@@ -450,12 +451,12 @@ activate_email.text=Klik op de volgende link om je e-mailadres te bevestigen in
register_notify=Welkom bij Forgejo
register_notify.title=%[1]s, welkom bij %[2]s
register_notify.text_1=dit is uw registratie bevestigingsemail voor %s!
-register_notify.text_2=U kunt nu inloggen via de gebruikersnaam: %s.
-register_notify.text_3=Als dit account voor u is aangemaakt, kunt u eerst uw wachtwoord instellen.
+register_notify.text_2=U kunt zich aanmelden bij uw account met uw gebruikersnaam: %s
+register_notify.text_3=Als iemand anders dit account voor u heeft gemaakt, moet u eerst uw wachtwoord instellen.
reset_password=Account herstellen
-reset_password.title=%s, u heeft verzocht om uw account te herstellen
-reset_password.text=Klik op de volgende link om je account te herstellen binnen %s:
+reset_password.title=%s, we hebben een verzoek ontvangen om uw account te herstellen
+reset_password.text=Als u dit was, klik dan op de volgende link om uw account te herstellen binnen %s:
register_success=Registratie succesvol
@@ -2649,6 +2650,7 @@ pulls.agit_explanation = Gemaakt met behulp van de AGit workflow. AGit laat bijd
settings.confirmation_string = Confirmatie string
activity.navbar.code_frequency = Code Frequentie
activity.navbar.recent_commits = Recente commits
+file_follow = Volg Symlink
@@ -3660,6 +3662,7 @@ runs.no_workflows.quick_start = Weet je niet hoe je moet beginnen met Forgejo Ac
variables.description = Variabelen worden doorgegeven aan bepaalde acties en kunnen anders niet worden gelezen.
runners.delete_runner_success = Runner succesvol verwijderd
runs.no_matching_online_runner_helper = Geen overeenkomende online runner met label: %s
+runs.workflow = Workflow
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 31b7b5d605..df8ba3ccb8 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -5,7 +5,7 @@ explore=Обзор
help=Помощь
logo=Логотип
sign_in=Вход
-sign_in_with_provider=Войти с помощью %s
+sign_in_with_provider=Войти через %s
sign_in_or=или
sign_out=Выход
sign_up=Регистрация
@@ -166,7 +166,7 @@ buttons.list.unordered.tooltip=Добавить маркированный сп
buttons.list.ordered.tooltip=Добавить нумерованный список
buttons.list.task.tooltip=Добавить список заданий
buttons.mention.tooltip=Упомянуть пользователя или команду
-buttons.ref.tooltip=Сослаться на задачу или запрос на слияние
+buttons.ref.tooltip=Сослаться на задачу или запрос слияния
buttons.switch_to_legacy.tooltip=Использовать старый редактор
buttons.enable_monospace_font=Включить моноширинный шрифт
buttons.disable_monospace_font=Выключить моноширинный шрифт
@@ -256,7 +256,7 @@ register_confirm=Требовать подтверждение по эл. поч
mail_notify=Разрешить почтовые уведомления
server_service_title=Сервер и настройки внешних служб
offline_mode=Включить локальный режим
-offline_mode_popup=Отключить сторонние сети доставки контента и отдавать все ресурсы из их локальных копий.
+offline_mode_popup=Отключить сторонние сети доставки контента и передавать все ресурсы из их локальных копий.
disable_gravatar=Отключить Gravatar
disable_gravatar_popup=Отключить Gravatar и сторонние источники аватаров. Если пользователь не загрузит аватар локально, то по умолчанию будет использоваться стандартный аватар.
federated_avatar_lookup=Включить федерированные аватары
@@ -436,7 +436,7 @@ change_unconfirmed_email = Если при регистрации был вве
[mail]
view_it_on=Посмотреть на %s
reply=или ответьте на это письмо
-link_not_working_do_paste=Не сработало? Попробуйте скопировать ссылку и вставить адресную строку.
+link_not_working_do_paste=Ссылка не работает? Попробуйте скопировать и вставить адресную строку.
hi_user_x=Привет %s,
activate_account=Активация учётной записи
@@ -451,16 +451,16 @@ activate_email.text=Для подтверждения эл. почты пере
register_notify=Добро пожаловать в Forgejo
register_notify.title=%[1]s, добро пожаловать в %[2]s
register_notify.text_1=это письмо с вашим подтверждением регистрации в %s!
-register_notify.text_2=Теперь вы можете войти, используя логин: %s.
-register_notify.text_3=Если эта учётная запись была создана для вас, пожалуйста, сначала установите пароль.
+register_notify.text_2=Теперь вы можете войти в учётную запись, используя логин: %s.
+register_notify.text_3=Если эта учётная запись создана кем-то для вас, сперва будет необходимо задать пароль.
reset_password=Восстановление учётной записи
-reset_password.title=%s, вы запросили восстановление вашей учётной записи
-reset_password.text=Для восстановления учётной записи перейдите по следующей ссылке в течение %s:
+reset_password.title=%s, был получен запрос на восстановление вашей учётной записи
+reset_password.text=Если этот запрос ваш, для восстановления учётной записи используйте следующую ссылку в течение %s:
register_success=Регистрация прошла успешно
-issue_assigned.pull=@%[1]s назначил(а) вам запрос на слияние %[2]s в репозитории %[3]s.
+issue_assigned.pull=@%[1]s вы назначены на запрос слияния %[2]s в репозитории %[3]s.
issue_assigned.issue=@%[1]s назначил(а) вам задачу %[2]s в репозитории %[3]s.
issue.x_mentioned_you=@%s упомянул(а) вас:
@@ -470,11 +470,11 @@ issue.action.push_n=@%[1]s отправил(а) %[3]d изменений
issue.action.close=@%[1]s закрыл(а) #%[2]d.
issue.action.reopen=@%[1]s переоткрыл(а) #%[2]d.
issue.action.merge=@%[1]s слил(а) #%[2]d в %[3]s.
-issue.action.approve=@%[1]s одобрил(а) этот запрос на слияние.
-issue.action.reject=@%[1]s запросил(а) изменения в этом запросе на слияние.
-issue.action.review=@%[1]s прокомментировал(а) этот запрос на слияние.
-issue.action.review_dismissed=@%[1]s отклонил(а) последний отзыв с %[2]s для этого запроса на слияние.
-issue.action.ready_for_review=@%[1]s отметил(а) этот запрос на слияние как готовый к рассмотрению.
+issue.action.approve=@%[1]s одобрение этого слияния.
+issue.action.reject=@%[1]s запрос изменений в этом запросе на слияние.
+issue.action.review=@%[1]s комментарий для этого запроса на слияние.
+issue.action.review_dismissed=@%[1]s отклонён последний отзыв от %[2]s для этого запроса на слияние.
+issue.action.ready_for_review=@%[1]s запрос на слияние отмечен как готовый к рецензии.
issue.action.new=@%[1]s создал(а) #%[2]d.
issue.in_tree_path=В %s:
@@ -491,7 +491,7 @@ repo.transfer.subject_to_you=%s хочет передать вам «%s»
repo.transfer.to_you=вам
repo.transfer.body=Чтобы принять или отклонить передачу, перейдите по ссылке %s или просто проигнорируйте этот запрос.
-repo.collaborator.added.subject=%s добавил(а) вас в %s
+repo.collaborator.added.subject=%s вы добавлены в %s
repo.collaborator.added.text=Вы были добавлены в качестве соучастника репозитория:
team_invite.subject=%[1]s приглашает вас присоединиться к организации %[2]s
@@ -605,7 +605,7 @@ username_error_no_dots = ` может состоять только из лат
[user]
change_avatar=Изменить свой аватар…
-joined_on=Зарегистрирован(а) с %s
+joined_on=Регистрация %s
repositories=Репозитории
activity=Публичная активность
followers=Подписчики
@@ -835,7 +835,7 @@ manage_access_token=Управление токенами
generate_new_token=Создать новый токен
tokens_desc=Эти токены предоставляют доступ к вашей учётной записи с помощью Forgejo API.
token_name=Имя токена
-generate_token=Генерировать токен
+generate_token=Создать токен
generate_token_success=Новый токен создан. Скопируйте и сохраните его сейчас, так как он не будет показан снова.
generate_token_name_duplicate=%s уже использовалось в качестве имени приложения. Пожалуйста, используйте другое имя.
delete_token=Удалить
@@ -1133,9 +1133,9 @@ fork_from_self=Вы не можете форкнуть ваш собственн
fork_guest_user=Войдите, чтобы форкнуть репозиторий.
watch_guest_user=Войдите, чтобы отслеживать этот репозиторий.
star_guest_user=Войдите, чтобы добавить в избранное этот репозиторий.
-unwatch=Прекратить отслеживание
+unwatch=Не отслеживать
watch=Отслеживать
-unstar=Убрать из избранного
+unstar=Убр. из избранного
star=В избранное
fork=Форкнуть
download_archive=Скачать репозиторий
@@ -1169,7 +1169,7 @@ org_labels_desc=Метки уровня организации, которые
org_labels_desc_manage=управлять
milestones=Этапы
-commits=коммитов
+commits=коммиты
commit=коммит
release=Выпуск
releases=Выпуски
@@ -1282,7 +1282,7 @@ editor.cherry_pick=Перенести изменения %s в:
editor.revert=Откатить %s к:
commits.desc=Просмотр истории изменений исходного кода.
-commits.commits=Коммитов
+commits.commits=коммиты
commits.no_commits=Нет общих коммитов. «%s» и «%s» имеют совершенно разные истории.
commits.nothing_to_compare=Эти ветки одинаковы.
commits.search=Поиск коммитов…
@@ -1401,13 +1401,13 @@ issues.label_templates.info=Меток пока нет. Создайте нов
issues.label_templates.helper=Выберите метку
issues.label_templates.use=Использовать набор меток
issues.label_templates.fail_to_load_file=Не удалось загрузить файл шаблона меток «%s»: %v
-issues.add_label=добавил(а) метку %s %s
-issues.add_labels=добавил(а) метки %s %s
+issues.add_label=добавлена метка %s %s
+issues.add_labels=добавлены метки %s %s
issues.remove_label=удалил(а) метку %s %s
issues.remove_labels=удалил(а) метки %s %s
-issues.add_remove_labels=добавил(а) метки %s и удалил(а) %s %s
-issues.add_milestone_at=`добавил(а) к этапу %s %s`
-issues.add_project_at=`добавил(а) в %s проект %s`
+issues.add_remove_labels=добавлены метки %s и убраны метки %s %s
+issues.add_milestone_at=`добавлено в этап %s %s`
+issues.add_project_at=`добавлено в проект %s %s`
issues.change_milestone_at=`изменил(а) целевой этап с %s на %s %s`
issues.change_project_at=`изменил(а) проект с %s на %s %s`
issues.remove_milestone_at=`удалил(а) это из этапа %s %s`
@@ -1421,7 +1421,7 @@ issues.remove_self_assignment=`убрал(а) их назначение %s`
issues.change_title_at=`изменил(а) заголовок с %s на %s %s`
issues.change_ref_at=`изменил(а) ссылку с %s на %s %s`
issues.remove_ref_at=`убрал(а) ссылку %s %s`
-issues.add_ref_at=`добавил(а) ссылку %s %s`
+issues.add_ref_at=`добавлена ссылка %s %s`
issues.delete_branch_at=`удалил(а) ветку %s %s`
issues.filter_label=Метка
issues.filter_label_exclude=`Используйте alt + click/enter, чтобы исключить метки`
@@ -1500,11 +1500,11 @@ issues.reopen_comment_issue=Прокомментировать и открыть
issues.create_comment=Комментировать
issues.closed_at=`закрыл(а) эту задачу %[2]s`
issues.reopened_at=`переоткрыл(а) эту проблему %[2]s`
-issues.commit_ref_at=`сослался на эту задачу в коммите %[2]s`
-issues.ref_issue_from=`сослался на эту задачу %[4]s%[2]s`
-issues.ref_pull_from=`сослался(ась) на этот запрос слияния %[4]s%[2]s`
-issues.ref_closing_from=`сослался(ась) на запрос слияния %[4]s, который закроет эту задачу%[2]s`
-issues.ref_reopening_from=`сослался(ась) на запрос слияния %[4]s, который повторно откроет эту задачу%[2]s`
+issues.commit_ref_at=`упоминание этой задачи в коммите %[2]s`
+issues.ref_issue_from=`упоминание этой задачи %[4]s%[2]s`
+issues.ref_pull_from=`упоминание этого запроса слияния %[4]s%[2]s`
+issues.ref_closing_from=`упоминание запроса слияния %[4]s, закрывающего эту задачу%[2]s`
+issues.ref_reopening_from=`упоминание запроса слияния %[4]s, повторно открывающего эту задачу%[2]s`
issues.ref_closed_from=`закрыл этот запрос %[4]s%[2]s`
issues.ref_reopened_from=`переоткрыл эту задачу %[4]s%[2]s`
issues.ref_from=`из %[1]s`
@@ -1595,7 +1595,7 @@ issues.add_time=Вручную добавить время
issues.del_time=Удалить этот журнал времени
issues.add_time_short=Добавить время
issues.add_time_cancel=Отмена
-issues.add_time_history=`добавил(а) к затраченному времени %s`
+issues.add_time_history=`добавлено затраченное время %s`
issues.del_time_history=`удалил(а) потраченное время %s`
issues.add_time_hours=Часы
issues.add_time_minutes=Минуты
@@ -1606,8 +1606,8 @@ issues.due_date=Срок выполнения
issues.invalid_due_date_format=Дата окончания должна быть в формате «гггг-мм-дд».
issues.error_modifying_due_date=Не удалось изменить срок выполнения.
issues.error_removing_due_date=Не удалось убрать срок выполнения.
-issues.push_commit_1=добавил(а) %d коммит %s
-issues.push_commits_n=добавил(а) %d коммитов %s
+issues.push_commit_1=добавлен %d коммит %s
+issues.push_commits_n=добавлены %d коммита(ов) %s
issues.force_push_codes=`форсировал(а) отправку изменений %[1]s %[4]s вместо %[2]s %[6]s`
issues.force_push_compare=Сравнить
issues.due_date_form=гггг-мм-дд
@@ -1615,7 +1615,7 @@ issues.due_date_form_add=Добавить срок выполнения
issues.due_date_form_edit=Редактировать
issues.due_date_form_remove=Удалить
issues.due_date_not_set=Срок выполнения не установлен.
-issues.due_date_added=добавил(а) срок выполнения %s %s
+issues.due_date_added=добавлен срок выполнения %s %s
issues.due_date_modified=изменил(а) срок выполнения с %[2]s на %[1]s %[3]s
issues.due_date_remove=убрал(а) срок выполнения %s %s
issues.due_date_overdue=Просроченные
@@ -1630,7 +1630,7 @@ issues.dependency.add=Добавить зависимость…
issues.dependency.cancel=Отменить
issues.dependency.remove=Удалить
issues.dependency.remove_info=Удалить эту зависимость
-issues.dependency.added_dependency=`добавил(а) новую зависимость %s`
+issues.dependency.added_dependency=`добавлена новая зависимость %s`
issues.dependency.removed_dependency=`убрал(а) зависимость %s`
issues.dependency.pr_closing_blockedby=Закрытие этого запроса на слияние блокируется следующими задачами
issues.dependency.issue_closing_blockedby=Закрытие этой задачи блокируется следующими задачами
@@ -1915,8 +1915,8 @@ activity.opened_prs_count_1=Новый запрос на слияние
activity.opened_prs_count_n=Новых запросов на слияние
activity.title.user_1=%d пользователем
activity.title.user_n=%d пользователями
-activity.title.prs_1=%d запрос на слияние
-activity.title.prs_n=%d запросов на слияние
+activity.title.prs_1=%d запрос слияния
+activity.title.prs_n=%d запросы слияний
activity.title.prs_merged_by=%s приняты %s
activity.title.prs_opened_by=%s предложены %s
activity.merged_prs_label=Принято
@@ -2150,7 +2150,7 @@ settings.webhook.response=Ответ
settings.webhook.headers=Заголовки
settings.webhook.payload=Содержимое
settings.webhook.body=Тело ответа
-settings.webhook.replay.description=Повторить этот веб-хук.
+settings.webhook.replay.description=Повторить отправку.
settings.webhook.delivery.success=Событие было добавлено в очередь доставки. Может пройти несколько секунд, прежде чем оно отобразится в истории.
settings.githooks_desc=Git-хуки предоставляются самим Git. Вы можете изменять файлы хуков из списка ниже, чтобы настроить собственные операции.
settings.githook_edit_desc=Если хук не активен, будет подставлен пример содержимого. Пустое значение в этом поле приведёт к отключению хука.
@@ -2372,7 +2372,7 @@ settings.lfs_findcommits=Найти коммиты
settings.lfs_lfs_file_no_commits=Для этого LFS файла не найдено коммитов
settings.lfs_noattribute=Этот путь не имеет блокируемого атрибута в ветке по умолчанию
settings.lfs_delete=Удалить файл LFS с OID %s
-settings.lfs_delete_warning=Удаление файла LFS может привести к ошибкам 'объект не существует' при проверке. Вы уверены?
+settings.lfs_delete_warning=Удаление файла LFS может привести к ошибкам «объект не существует» при проверке. Вы уверены?
settings.lfs_findpointerfiles=Найти файлы указателя
settings.lfs_locks=Заблокировать
settings.lfs_invalid_locking_path=Недопустимый путь: %s
@@ -2621,24 +2621,28 @@ settings.wiki_globally_editable = Разрешить редактировани
settings.webhook.test_delivery_desc_disabled = Активируйте этот веб-хук для проверки тестовым событием.
commits.browse_further = Смотреть далее
vendored = Vendored
-settings.units.add_more = Добавить больше...
+settings.units.add_more = Доб. больше...
pulls.fast_forward_only_merge_pull_request = Только fast-forward
settings.units.overview = Обзор
settings.units.units = Разделы репозитория
pulls.reopen_failed.head_branch = Этот запрос на слияние не может быть открыт заново, потому что головная ветка больше не существует.
pulls.reopen_failed.base_branch = Этот запрос на слияние не может быть открыт заново, потому что базовая ветка больше не существует.
settings.ignore_stale_approvals = Игнорировать устаревшие одобрения
-contributors.contribution_type.commits = Коммиты
+contributors.contribution_type.commits = коммиты
contributors.contribution_type.additions = Добавления
contributors.contribution_type.deletions = Удаления
contributors.contribution_type.filter_label = Тип участия:
-pulls.commit_ref_at = `сослался(ась) на этот запрос слияния из комммита %[2]s`
+pulls.commit_ref_at = `упоминание этого запроса слияния в коммите %[2]s`
settings.thread_id = ИД обсуждения
pulls.made_using_agit = AGit
activity.navbar.contributors = Соавторы
-activity.navbar.code_frequency = Частота кода
+activity.navbar.code_frequency = Частота изменений
activity.navbar.recent_commits = Недавние коммиты
settings.confirmation_string = Подтверждение
+settings.archive.text = Архивация репозитория сделает всё его содержимое доступным только для чтения. Он будет скрыт с домашнего экрана. Никто (включая вас!) не сможет добавлять коммиты, открывать задачи и запросы слияний.
+release.deletion_desc = Удаление выпуска удаляет его только в Forgejo. Это действие не затронет тег в git, содержимое репозитория и его историю. Продолжить?
+pulls.agit_explanation = Создано через рабочий поток AGit. С ним можно предлагать изменения, используя команду «git push», без необходимости в создании форка или новой ветки.
+settings.webhook.replay.description_disabled = Активируйте веб-хук для повторения отправки.
[graphs]
@@ -3296,6 +3300,7 @@ dashboard.sync_branch.started = Начата синхронизация вето
dashboard.sync_repo_tags = Синхронизировать теги из git в базу данных
self_check.database_collation_mismatch = Ожидается, что БД использует сопоставление: %s
self_check = Самопроверка
+dashboard.rebuild_issue_indexer = Пересобрать индексатор задач
[action]
@@ -3328,7 +3333,7 @@ publish_release=`выпустил(а) "%[4]s" в %[3]s#%[2]s`
review_dismissed_reason=Причина:
create_branch=создал(а) ветку %[3]s в %[4]s
-starred_repo=добавил(а) %[2]s в избранное
+starred_repo=добавлено %[2]s в избранное
watched_repo=начала(а) наблюдение за %[2]s
[tool]
@@ -3615,7 +3620,7 @@ runs.actor=Актор
runs.status=Статус
runs.actors_no_select=Все акторы
runs.no_results=Ничего не найдено.
-runs.no_workflows=Пока нет рабочих процессов.
+runs.no_workflows=Пока нет рабочих потоков.
runs.no_runs=Рабочий поток ещё не запускался.
runs.empty_commit_message=(пустое сообщение коммита)
@@ -3644,6 +3649,7 @@ variables.update.success=Переменная изменена.
variables.id_not_exist = Переменная с идентификатором %d не существует.
runs.no_workflows.quick_start = Не знаете, как начать использовать Действия Forgejo? Читайте руководство по быстрому старту.
runs.no_workflows.documentation = Чтобы узнать больше о Действиях Forgejo, читайте документацию.
+runs.workflow = Рабочий поток
[projects]
type-1.display_name=Индивидуальный проект
@@ -3667,3 +3673,5 @@ component_failed_to_load = Случилась непредвиденная ош
contributors.what = соучастие
component_loading = Загрузка %s...
component_loading_info = Это займёт некоторое время…
+code_frequency.what = частота изменений
+recent_commits.what = недавние коммиты
diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini
index a64954c2cb..d6047eae3c 100644
--- a/options/locale/locale_sl.ini
+++ b/options/locale/locale_sl.ini
@@ -119,6 +119,8 @@ remove = Odstrani
remove_all = Odstrani vse
remove_label_str = Odstranite element "%s"
confirm_delete_artifact = Ste prepričani, da želite izbrisati artefakt "%s"?
+concept_code_repository = Repozitorij
+error404 = Stran, ki jo poskušate doseči, ne obstaja ali niste pooblaščeni za njen ogled.
[install]
reinstall_confirm_check_3 = Potrjujete, da ste popolnoma prepričani, da se ta program Forgejo izvaja s pravilno lokacijo app.ini, in da ste prepričani, da ga morate znova namestiti. Potrjujete, da se zavedate zgoraj navedenih tveganj.
@@ -230,11 +232,23 @@ env_config_keys_prompt = V konfiguracijski datoteki bodo uporabljene tudi nasled
[admin]
users.allow_git_hook_tooltip = Kljuke Git se izvajajo kot uporabnik operacijskega sistema, v katerem je nameščen program Forgejo, in imajo enako raven dostopa do gostitelja. Uporabniki s tem posebnim privilegijem Git Hook lahko dostopajo do vseh skladišč Forgejo in spreminjajo vse zbirke Forgejo ter podatkovno bazo, ki jo uporablja Forgejo. Posledično lahko pridobijo tudi skrbniške privilegije Forgejo.
+auths.force_smtps_helper = SMTPS se vedno uporablja na vratih 465. Če želite, da se SMTPS uporablja tudi na drugih vratih, to nastavite. (V nasprotnem primeru se bo STARTTLS uporabljal na drugih vratih, če ga gostitelj podpira.)
+self_check.database_fix_mysql = Uporabniki MySQL/MariaDB lahko za odpravo težav s kollacijo uporabite ukaz "gitea doctor convert", lahko pa težavo odpravite tudi z ukazom "ALTER ... COLLATE ..." SQL ročno.
+users.purge_help = Prisilno izbrišite uporabnika in vsa skladišča, organizacije in pakete, ki so v njegovi lasti. Izbrisani bodo tudi vsi komentarji in vprašanja, ki jih je objavil ta uporabnik.
+auths.sspi_default_language_helper = Privzet jezik za uporabnike, samodejno ustvarjene z metodo avtentikacije SSPI. Pustite prazno, če želite, da se jezik zazna samodejno.
+auths.restricted_filter_helper = Pustite prazno, če ne želite nastaviti nobenega uporabnika kot omejenega. Uporabite zvezdico ("*"), če želite vse uporabnike, ki se ne ujemajo z administratorskim filtrom, nastaviti kot omejene.
+auths.tip.twitter = Pojdite na https://dev.twitter.com/apps, ustvarite aplikacijo in preverite, ali je omogočena možnost "Allow this application to be used to Sign in with Twitter"
[repo]
migrate.github_token_desc = Tu lahko vstavite enega ali več žetonov, ločenih z vejico, da bo selitev hitrejša zaradi omejitve hitrosti GitHub API. OPOZORILO: Zloraba te funkcije lahko krši pravila ponudnika storitev in povzroči blokado računa.
ambiguous_runes_description = `Ta datoteka vsebuje znake Unicode, ki bi jih lahko zamenjali z drugimi znaki. Če menite, da je to namerno, lahko to opozorilo mirno prezrete. Za njihovo razkritje uporabite gumb Escape.`
invisible_runes_description = `Ta datoteka vsebuje nevidne znake Unicode, ki jih ljudje ne razlikujejo, vendar jih lahko računalnik obdela drugače. Če menite, da je to namerno, lahko to opozorilo mirno prezrete. Za njihovo razkritje uporabite gumb Escape.`
+branch.delete_desc = Brisanje veje je trajno. Čeprav lahko izbrisana veja še nekaj časa obstaja, preden je dejansko odstranjena, je v večini primerov NI mogoče preklicati. Nadaljujte?
+issues.delete.text = Ali res želite izbrisati to vprašanje? (S tem bo trajno odstranjena vsa vsebina. Če jo nameravate ohraniti v arhivu, jo raje zaprite.)
+settings.githook_edit_desc = Če kavelj ni aktiven, se prikaže vzorčna vsebina. Če pustite vsebino prazno, bo ta kavelj onemogočen.
+editor.file_changed_while_editing = Vsebina datoteke se je od začetka urejanja spremenila. Klikni tukaj, da si jih ogledaš, ali Sprejemi spremembe znova, da jih prepišeš.
+settings.webhook.delivery.success = Dogodek je bil dodan v čakalno vrsto za dostavo. Lahko traja nekaj sekund, preden se prikaže v zgodovini dostave.
+editor.filename_help = Dodajte imenik tako, da vnesete njegovo ime, ki mu sledi poševnica ("/"). Imenik odstranite tako, da na začetku vnosnega polja vtipkate backspace.
[editor]
buttons.list.ordered.tooltip = Dodajte oštevilčen seznam
@@ -259,6 +273,20 @@ footer = Stopka
[settings]
oauth2_application_locked = Forgejo ob zagonu predhodno registrira nekatere aplikacije OAuth2, če je to omogočeno v konfiguraciji. Da bi preprečili nepričakovano obnašanje, jih ni mogoče niti urejati niti odstraniti. Za več informacij glejte dokumentacijo OAuth2.
+profile = Profil
+account = Račun
+appearance = Videz
+password = Geslo
+authorized_oauth2_applications_description = Tem aplikacijam tretjih oseb ste odobrili dostop do svojega osebnega računa Forgejo. Prosimo, da prekličete dostop do aplikacij, ki jih ne uporabljate več.
+social_desc = S temi družabnimi računi se lahko prijavite v svoj račun. Prepričajte se, da jih vse prepoznate.
+access_token_desc = Izbrana dovoljenja žetona omejujejo avtorizacijo samo na ustrezne poti API. Za več informacij preberite dokumentacijo.
+oauth2_client_secret_hint = Skrivnost se ne bo več prikazala, ko zapustite ali osvežite to stran. Prepričajte se, da ste jo shranili.
+twofa_desc = Za zaščito računa pred krajo gesla lahko uporabite pametni telefon ali drugo napravo za prejemanje časovno omejenih enkratnih gesel ("TOTP").
+twofa_recovery_tip = Če napravo izgubite, boste lahko z obnovitvenim ključem za enkratno uporabo ponovno pridobili dostop do računa.
+twofa_scratch_token_regenerated = Vaš obnovitveni ključ za enkratno uporabo je zdaj %s. Shranite ga na varnem mestu, saj ga ne boste več videli.
+regenerate_scratch_token_desc = Če ste izgubili obnovitveni ključ ali ste ga že uporabili za prijavo, ga lahko ponastavite tukaj.
+twofa_enrolled = Vaš račun je bil uspešno vpisan. Ključ za obnovitev za enkratno uporabo (%s) shranite na varno, saj ga ne boste več videli.
+can_not_add_email_activations_pending = Aktivacija je v teku, poskusite znova čez nekaj minut, če želite dodati nov e-poštni naslov.
[heatmap]
less = Manj
@@ -408,7 +436,7 @@ issues.in_your_repos = V vašem repozitorijev
release.title = Naslov: %s
release.downloads = Prenosi:
activate_account.text_2 = Za aktivacijo računa v %s kliknite naslednjo povezavo:
-link_not_working_do_paste = Ne deluje? Poskusite ga kopirati in prilepiti v brskalnik.
+link_not_working_do_paste = Ali povezava ne deluje? Poskusite jo kopirati in prilepiti v vrstico URL brskalnika.
issue.action.reopen = @%[1]s ponovno odprl #%[2]d.
repo.transfer.body = Če ga želite sprejeti ali zavrniti, obiščite %s ali ga preprosto prezrite.
team_invite.text_2 = Če se želite pridružiti ekipi, kliknite naslednjo povezavo:
@@ -422,14 +450,14 @@ admin.new_user.user_info = Informacije o uporabniku
admin.new_user.text = Prosimo, da klikni tukaj za upravljanje tega uporabnika iz upraviteljske plošče.
register_notify = Dobrodošli v Forgejo
register_notify.title = %[1]s, dobrodošli v %[2]s
-register_notify.text_2 = Zdaj se lahko prijavite z uporabniškim imenom: %s.
-register_notify.text_3 = Če je bil ta račun ustvarjen za vas, prosimo, da najprej nastavite svoje geslo.
+register_notify.text_2 = V svoj račun se lahko prijavite z uporabniškim imenom: %s
+register_notify.text_3 = Če je ta račun namesto vas ustvaril nekdo drug, boste morali najprej nastaviti svoje geslo.
reset_password = Obnovite svoj račun
-reset_password.title = %s, zahtevali ste obnovitev računa
+reset_password.title = %s, prejeli smo zahtevo za izterjavo vašega računa
register_success = Registracija je bila uspešna
issue.x_mentioned_you = @%s vas je omenil:
issue.action.close = @%[1]s zaprl #%[2]d.
-reset_password.text = Za obnovitev računa v %s kliknite naslednjo povezavo:
+reset_password.text = Če se je to zgodilo vam, kliknite naslednjo povezavo in obnovite račun v %s:
release.note = Opomba:
release.download.zip = Izvorna koda (ZIP)
release.download.targz = Izvorna koda (TAR.GZ)
@@ -446,15 +474,102 @@ activate_email.text = Kliknite naslednjo povezavo, da preverite svoj e-poštni n
register_notify.text_1 = to je vaše e-poštno sporočilo s potrditvijo registracije za %s!
issue_assigned.pull = @%[1]s vam je dodelil zahtevo za poteg %[2]s v skladišču %[3]s.
issue_assigned.issue = @%[1]s vam je dodelil izdajo %[2]s v skladišču %[3]s.
-issue.action.force_push = %[1]s sila-potisnila%[2]s < /b > iz %[3]s v %[4]s.
+issue.action.force_push = %[1]s orce je potisnil %[2]s od%[3]s to %[4]s.
+release.new.subject = %s v %s sproščeno
+release.new.text = @%[1]s izdal %[2]s v %[3]s
+repo.transfer.subject_to = %s želi prenesti "%s" na %s
+repo.transfer.subject_to_you = %s želi prenesti "%s" na vas
+repo.collaborator.added.text = Dodani ste kot sodelavec repozitorija:
[modal]
confirm = Potrdite
no = Ne
cancel = Prekliči
modify = Posodobitev
+yes = Da
[form]
UserName = Uporabniško ime
Password = Geslo
-Retype = Potrditev gesla
\ No newline at end of file
+Retype = Potrditev gesla
+team_name_been_taken = The name of the organisation is already taken.
+password_complexity = Geslo ne izpolnjuje zahtev glede kompleksnosti:
+enterred_invalid_org_name = Ime organizacije, ki ste ga vnesli, je napačno.
+organization_leave_success = Uspešno ste zapustili organizacijo %s.
+admin_cannot_delete_self = Ko ste administrator, se ne morete izbrisati. Najprej odstranite svoje pravice upravitelja.
+RepoName = Ime repozitorija
+Email = E-poštni naslov
+SSHTitle = Ime ključa SSH
+PayloadUrl = URL koristnega tovora
+TeamName = Ime ekipe
+AuthName = Ime avtorizacije
+Content = Vsebina
+SSPISeparatorReplacement = Ločevalnik
+SSPIDefaultLanguage = Privzet jezik
+captcha_incorrect = Koda CAPTCHA je napačna.
+password_not_match = Gesla se ne ujemajo.
+lang_select_error = S seznama izberite jezik.
+username_been_taken = Uporabniško ime je že zasedeno.
+username_change_not_local_user = Nedomovnim uporabnikom ni dovoljeno spreminjati uporabniškega imena.
+username_has_not_been_changed = Uporabniško ime ni bilo spremenjeno
+visit_rate_limit = Obisk na daljavo je obravnaval omejitev hitrosti.
+2fa_auth_required = Obisk na daljavo je zahteval preverjanje pristnosti z dvema dejavnikoma.
+org_name_been_taken = Ime organizacije je že zasedeno.
+unknown_error = Neznana napaka:
+repo_name_been_taken = Ime skladišča je že uporabljeno.
+repository_force_private = Omogočena je možnost Force Private: zasebnih skladišč ni mogoče objaviti.
+repository_files_already_exist = Datoteke za to skladišče že obstajajo. Obrnite se na skrbnika sistema.
+repository_files_already_exist.adopt = Datoteke za ta repozitorij že obstajajo in jih je mogoče samo sprejeti.
+repository_files_already_exist.delete = Datoteke za to skladišče že obstajajo. Morate jih izbrisati.
+repository_files_already_exist.adopt_or_delete = Datoteke za to skladišče že obstajajo. Sprejmite jih ali pa jih izbrišite.
+openid_been_used = Naslov OpenID "%s" je že uporabljen.
+username_password_incorrect = Uporabniško ime ali geslo je napačno.
+password_lowercase_one = Vsaj en mali črkovni znak
+password_uppercase_one = Vsaj en veliki tiskani znak
+password_digit_one = Vsaj ena številka
+password_special_one = vsaj en poseben znak (ločila, oklepaji, narekovaji itd.)
+enterred_invalid_repo_name = Ime skladišča, ki ste ga vnesli, je napačno.
+team_no_units_error = Dovolite dostop do vsaj enega oddelka repozitorija.
+email_been_used = E-poštni naslov je že uporabljen.
+email_invalid = E-poštni naslov je neveljaven.
+enterred_invalid_owner_name = Ime novega lastnika ni veljavno.
+invalid_ssh_principal = Nepravilen principal: %s
+must_use_public_key = Ključ, ki ste ga navedli, je zasebni ključ. Zasebnega ključa ne nalagajte nikamor. Namesto tega uporabite svoj javni ključ.
+auth_failed = Preverjanje pristnosti ni uspelo: %v
+enterred_invalid_password = Vneseno geslo je napačno.
+user_not_exist = Uporabnik ne obstaja.
+team_not_exist = Ekipa ne obstaja.
+duplicate_invite_to_team = Uporabnik je bil že povabljen kot član ekipe.
+username_error = ` lahko vsebuje samo alfanumerične znake ("0-9", "a-z", "A-Z"), pomišljaj ("-"), podčrtaj ("_") in piko ("."). Ne sme se začeti ali končati z nealfanumeričnimi znaki, zaporedni nealfanumerični znaki pa so prav tako prepovedani.`
+still_has_org = Vaš račun je član ene ali več organizacij, najprej zapustite te organizacije.
+git_ref_name_error = ` mora biti dobro oblikovano referenčno ime Git.`
+size_error = ` mora biti velikosti %s.`
+min_size_error = ` mora vsebovati vsaj %s znakov.`
+max_size_error = ` mora vsebovati največ %s znakov.`
+email_error = ` ni veljaven e-poštni naslov.`
+alpha_dash_error = ` mora vsebovati samo alfanumerične znake, pomišljaje ("-") in podčrtanke ("_").`
+alpha_dash_dot_error = ` mora vsebovati samo alfanumerične znake, pomišljaj ("-"), podčrtaj ("_") in piko (".").`
+
+[user]
+form.name_chars_not_allowed = Uporabniško ime "%s" vsebuje neveljavne znake.
+disabled_public_activity = Ta uporabnik je onemogočil javno vidnost dejavnosti.
+change_avatar = Spremeni svoj avatar…
+joined_on = Pridružil se je na %s
+activity = Javna dejavnost
+followers = Sledilci
+block_user = Blokiranje uporabnika
+overview = Pregled
+following = Sledenje
+follow = Sledite
+unfollow = Neupoštevanje
+block = Blok
+unblock = Odblokiranje
+user_bio = Biografija
+projects = Projekti
+show_on_map = Prikaži to mesto na zemljevidu
+settings = Uporabniške nastavitve
+form.name_reserved = Uporabniško ime "%s" je rezervirano.
+form.name_pattern_not_allowed = Vzorec "%s" v uporabniškem imenu ni dovoljen.
+
+[packages]
+owner.settings.chef.keypair.description = Za preverjanje pristnosti v registru Chef je potreben par ključev. Če ste par ključev ustvarili že prej, se pri ustvarjanju novega para ključev stari par ključev zavrže.
\ No newline at end of file
From ff8cb299d1061f090f605dc1aa7a842642b50b44 Mon Sep 17 00:00:00 2001
From: Lunny Xiao
Date: Fri, 1 Mar 2024 10:23:00 +0800
Subject: [PATCH 201/807] Move migration functions to services layer (#29497)
---
modules/repository/repo.go | 266 ------------------------
routers/web/repo/setting/setting.go | 3 +-
services/migrations/gitea_uploader.go | 2 +-
services/repository/migrate.go | 287 ++++++++++++++++++++++++++
tests/integration/mirror_pull_test.go | 3 +-
5 files changed, 290 insertions(+), 271 deletions(-)
create mode 100644 services/repository/migrate.go
diff --git a/modules/repository/repo.go b/modules/repository/repo.go
index 2f076c5286..a863bec996 100644
--- a/modules/repository/repo.go
+++ b/modules/repository/repo.go
@@ -6,16 +6,13 @@ package repository
import (
"context"
- "errors"
"fmt"
"io"
- "net/http"
"strings"
"time"
"code.gitea.io/gitea/models/db"
git_model "code.gitea.io/gitea/models/git"
- "code.gitea.io/gitea/models/organization"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/container"
@@ -23,10 +20,8 @@ import (
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/lfs"
"code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/migration"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/timeutil"
- "code.gitea.io/gitea/modules/util"
)
/*
@@ -48,267 +43,6 @@ func WikiRemoteURL(ctx context.Context, remote string) string {
return ""
}
-// MigrateRepositoryGitData starts migrating git related data after created migrating repository
-func MigrateRepositoryGitData(ctx context.Context, u *user_model.User,
- repo *repo_model.Repository, opts migration.MigrateOptions,
- httpTransport *http.Transport,
-) (*repo_model.Repository, error) {
- repoPath := repo_model.RepoPath(u.Name, opts.RepoName)
-
- if u.IsOrganization() {
- t, err := organization.OrgFromUser(u).GetOwnerTeam(ctx)
- if err != nil {
- return nil, err
- }
- repo.NumWatches = t.NumMembers
- } else {
- repo.NumWatches = 1
- }
-
- migrateTimeout := time.Duration(setting.Git.Timeout.Migrate) * time.Second
-
- var err error
- if err = util.RemoveAll(repoPath); err != nil {
- return repo, fmt.Errorf("Failed to remove %s: %w", repoPath, err)
- }
-
- if err = git.Clone(ctx, opts.CloneAddr, repoPath, git.CloneRepoOptions{
- Mirror: true,
- Quiet: true,
- Timeout: migrateTimeout,
- SkipTLSVerify: setting.Migrations.SkipTLSVerify,
- }); err != nil {
- if errors.Is(err, context.DeadlineExceeded) {
- return repo, fmt.Errorf("Clone timed out. Consider increasing [git.timeout] MIGRATE in app.ini. Underlying Error: %w", err)
- }
- return repo, fmt.Errorf("Clone: %w", err)
- }
-
- if err := git.WriteCommitGraph(ctx, repoPath); err != nil {
- return repo, err
- }
-
- if opts.Wiki {
- wikiPath := repo_model.WikiPath(u.Name, opts.RepoName)
- wikiRemotePath := WikiRemoteURL(ctx, opts.CloneAddr)
- if len(wikiRemotePath) > 0 {
- if err := util.RemoveAll(wikiPath); err != nil {
- return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err)
- }
-
- if err := git.Clone(ctx, wikiRemotePath, wikiPath, git.CloneRepoOptions{
- Mirror: true,
- Quiet: true,
- Timeout: migrateTimeout,
- SkipTLSVerify: setting.Migrations.SkipTLSVerify,
- }); err != nil {
- log.Warn("Clone wiki: %v", err)
- if err := util.RemoveAll(wikiPath); err != nil {
- return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err)
- }
- } else {
- // Figure out the branch of the wiki we just cloned. We assume
- // that the default branch is to be used, and we'll use the same
- // name as the source.
- gitRepo, err := git.OpenRepository(ctx, wikiPath)
- if err != nil {
- log.Warn("Failed to open wiki repository during migration: %v", err)
- if err := util.RemoveAll(wikiPath); err != nil {
- return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err)
- }
- return repo, err
- }
- defer gitRepo.Close()
-
- branch, err := gitRepo.GetDefaultBranch()
- if err != nil {
- log.Warn("Failed to get the default branch of a migrated wiki repo: %v", err)
- if err := util.RemoveAll(wikiPath); err != nil {
- return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err)
- }
-
- return repo, err
- }
- repo.WikiBranch = branch
-
- if err := git.WriteCommitGraph(ctx, wikiPath); err != nil {
- return repo, err
- }
- }
- }
- }
-
- if repo.OwnerID == u.ID {
- repo.Owner = u
- }
-
- if err = CheckDaemonExportOK(ctx, repo); err != nil {
- return repo, fmt.Errorf("checkDaemonExportOK: %w", err)
- }
-
- if stdout, _, err := git.NewCommand(ctx, "update-server-info").
- SetDescription(fmt.Sprintf("MigrateRepositoryGitData(git update-server-info): %s", repoPath)).
- RunStdString(&git.RunOpts{Dir: repoPath}); err != nil {
- log.Error("MigrateRepositoryGitData(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
- return repo, fmt.Errorf("error in MigrateRepositoryGitData(git update-server-info): %w", err)
- }
-
- gitRepo, err := git.OpenRepository(ctx, repoPath)
- if err != nil {
- return repo, fmt.Errorf("OpenRepository: %w", err)
- }
- defer gitRepo.Close()
-
- repo.IsEmpty, err = gitRepo.IsEmpty()
- if err != nil {
- return repo, fmt.Errorf("git.IsEmpty: %w", err)
- }
-
- if !repo.IsEmpty {
- if len(repo.DefaultBranch) == 0 {
- // Try to get HEAD branch and set it as default branch.
- headBranch, err := gitRepo.GetHEADBranch()
- if err != nil {
- return repo, fmt.Errorf("GetHEADBranch: %w", err)
- }
- if headBranch != nil {
- repo.DefaultBranch = headBranch.Name
- }
- }
-
- if _, err := SyncRepoBranchesWithRepo(ctx, repo, gitRepo, u.ID); err != nil {
- return repo, fmt.Errorf("SyncRepoBranchesWithRepo: %v", err)
- }
-
- if !opts.Releases {
- // note: this will greatly improve release (tag) sync
- // for pull-mirrors with many tags
- repo.IsMirror = opts.Mirror
- if err = SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
- log.Error("Failed to synchronize tags to releases for repository: %v", err)
- }
- }
-
- if opts.LFS {
- endpoint := lfs.DetermineEndpoint(opts.CloneAddr, opts.LFSEndpoint)
- lfsClient := lfs.NewClient(endpoint, httpTransport)
- if err = StoreMissingLfsObjectsInRepository(ctx, repo, gitRepo, lfsClient); err != nil {
- log.Error("Failed to store missing LFS objects for repository: %v", err)
- }
- }
- }
-
- ctx, committer, err := db.TxContext(ctx)
- if err != nil {
- return nil, err
- }
- defer committer.Close()
-
- if opts.Mirror {
- remoteAddress, err := util.SanitizeURL(opts.CloneAddr)
- if err != nil {
- return repo, err
- }
- mirrorModel := repo_model.Mirror{
- RepoID: repo.ID,
- Interval: setting.Mirror.DefaultInterval,
- EnablePrune: true,
- NextUpdateUnix: timeutil.TimeStampNow().AddDuration(setting.Mirror.DefaultInterval),
- LFS: opts.LFS,
- RemoteAddress: remoteAddress,
- }
- if opts.LFS {
- mirrorModel.LFSEndpoint = opts.LFSEndpoint
- }
-
- if opts.MirrorInterval != "" {
- parsedInterval, err := time.ParseDuration(opts.MirrorInterval)
- if err != nil {
- log.Error("Failed to set Interval: %v", err)
- return repo, err
- }
- if parsedInterval == 0 {
- mirrorModel.Interval = 0
- mirrorModel.NextUpdateUnix = 0
- } else if parsedInterval < setting.Mirror.MinInterval {
- err := fmt.Errorf("interval %s is set below Minimum Interval of %s", parsedInterval, setting.Mirror.MinInterval)
- log.Error("Interval: %s is too frequent", opts.MirrorInterval)
- return repo, err
- } else {
- mirrorModel.Interval = parsedInterval
- mirrorModel.NextUpdateUnix = timeutil.TimeStampNow().AddDuration(parsedInterval)
- }
- }
-
- if err = repo_model.InsertMirror(ctx, &mirrorModel); err != nil {
- return repo, fmt.Errorf("InsertOne: %w", err)
- }
-
- repo.IsMirror = true
- if err = UpdateRepository(ctx, repo, false); err != nil {
- return nil, err
- }
-
- // this is necessary for sync local tags from remote
- configName := fmt.Sprintf("remote.%s.fetch", mirrorModel.GetRemoteName())
- if stdout, _, err := git.NewCommand(ctx, "config").
- AddOptionValues("--add", configName, `+refs/tags/*:refs/tags/*`).
- RunStdString(&git.RunOpts{Dir: repoPath}); err != nil {
- log.Error("MigrateRepositoryGitData(git config --add +refs/tags/*:refs/tags/*) in %v: Stdout: %s\nError: %v", repo, stdout, err)
- return repo, fmt.Errorf("error in MigrateRepositoryGitData(git config --add +refs/tags/*:refs/tags/*): %w", err)
- }
- } else {
- if err = UpdateRepoSize(ctx, repo); err != nil {
- log.Error("Failed to update size for repository: %v", err)
- }
- if repo, err = CleanUpMigrateInfo(ctx, repo); err != nil {
- return nil, err
- }
- }
-
- return repo, committer.Commit()
-}
-
-// cleanUpMigrateGitConfig removes mirror info which prevents "push --all".
-// This also removes possible user credentials.
-func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error {
- cmd := git.NewCommand(ctx, "remote", "rm", "origin")
- // if the origin does not exist
- _, stderr, err := cmd.RunStdString(&git.RunOpts{
- Dir: repoPath,
- })
- if err != nil && !strings.HasPrefix(stderr, "fatal: No such remote") {
- return err
- }
- return nil
-}
-
-// CleanUpMigrateInfo finishes migrating repository and/or wiki with things that don't need to be done for mirrors.
-func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo_model.Repository, error) {
- repoPath := repo.RepoPath()
- if err := CreateDelegateHooks(repoPath); err != nil {
- return repo, fmt.Errorf("createDelegateHooks: %w", err)
- }
- if repo.HasWiki() {
- if err := CreateDelegateHooks(repo.WikiPath()); err != nil {
- return repo, fmt.Errorf("createDelegateHooks.(wiki): %w", err)
- }
- }
-
- _, _, err := git.NewCommand(ctx, "remote", "rm", "origin").RunStdString(&git.RunOpts{Dir: repoPath})
- if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
- return repo, fmt.Errorf("CleanUpMigrateInfo: %w", err)
- }
-
- if repo.HasWiki() {
- if err := cleanUpMigrateGitConfig(ctx, repo.WikiPath()); err != nil {
- return repo, fmt.Errorf("cleanUpMigrateGitConfig (wiki): %w", err)
- }
- }
-
- return repo, UpdateRepository(ctx, repo, false)
-}
-
// SyncRepoTags synchronizes releases table with repository tags
func SyncRepoTags(ctx context.Context, repoID int64) error {
repo, err := repo_model.GetRepositoryByID(ctx, repoID)
diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go
index dcb4be7ef8..0fdae7ec56 100644
--- a/routers/web/repo/setting/setting.go
+++ b/routers/web/repo/setting/setting.go
@@ -25,7 +25,6 @@ import (
"code.gitea.io/gitea/modules/indexer/stats"
"code.gitea.io/gitea/modules/lfs"
"code.gitea.io/gitea/modules/log"
- repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
@@ -715,7 +714,7 @@ func SettingsPost(ctx *context.Context) {
}
repo.IsMirror = false
- if _, err := repo_module.CleanUpMigrateInfo(ctx, repo); err != nil {
+ if _, err := repo_service.CleanUpMigrateInfo(ctx, repo); err != nil {
ctx.ServerError("CleanUpMigrateInfo", err)
return
} else if err = repo_model.DeleteMirrorByRepoID(ctx, ctx.Repo.Repository.ID); err != nil {
diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go
index 99a44dff0f..717be7b7f3 100644
--- a/services/migrations/gitea_uploader.go
+++ b/services/migrations/gitea_uploader.go
@@ -120,7 +120,7 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate
r.DefaultBranch = repo.DefaultBranch
r.Description = repo.Description
- r, err = repo_module.MigrateRepositoryGitData(g.ctx, owner, r, base.MigrateOptions{
+ r, err = repo_service.MigrateRepositoryGitData(g.ctx, owner, r, base.MigrateOptions{
RepoName: g.repoName,
Description: repo.Description,
OriginalURL: repo.OriginalURL,
diff --git a/services/repository/migrate.go b/services/repository/migrate.go
new file mode 100644
index 0000000000..b218a2ef46
--- /dev/null
+++ b/services/repository/migrate.go
@@ -0,0 +1,287 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package repository
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "net/http"
+ "strings"
+ "time"
+
+ "code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/models/organization"
+ repo_model "code.gitea.io/gitea/models/repo"
+ user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/lfs"
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/migration"
+ repo_module "code.gitea.io/gitea/modules/repository"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/timeutil"
+ "code.gitea.io/gitea/modules/util"
+)
+
+// MigrateRepositoryGitData starts migrating git related data after created migrating repository
+func MigrateRepositoryGitData(ctx context.Context, u *user_model.User,
+ repo *repo_model.Repository, opts migration.MigrateOptions,
+ httpTransport *http.Transport,
+) (*repo_model.Repository, error) {
+ repoPath := repo_model.RepoPath(u.Name, opts.RepoName)
+
+ if u.IsOrganization() {
+ t, err := organization.OrgFromUser(u).GetOwnerTeam(ctx)
+ if err != nil {
+ return nil, err
+ }
+ repo.NumWatches = t.NumMembers
+ } else {
+ repo.NumWatches = 1
+ }
+
+ migrateTimeout := time.Duration(setting.Git.Timeout.Migrate) * time.Second
+
+ var err error
+ if err = util.RemoveAll(repoPath); err != nil {
+ return repo, fmt.Errorf("Failed to remove %s: %w", repoPath, err)
+ }
+
+ if err = git.Clone(ctx, opts.CloneAddr, repoPath, git.CloneRepoOptions{
+ Mirror: true,
+ Quiet: true,
+ Timeout: migrateTimeout,
+ SkipTLSVerify: setting.Migrations.SkipTLSVerify,
+ }); err != nil {
+ if errors.Is(err, context.DeadlineExceeded) {
+ return repo, fmt.Errorf("Clone timed out. Consider increasing [git.timeout] MIGRATE in app.ini. Underlying Error: %w", err)
+ }
+ return repo, fmt.Errorf("Clone: %w", err)
+ }
+
+ if err := git.WriteCommitGraph(ctx, repoPath); err != nil {
+ return repo, err
+ }
+
+ if opts.Wiki {
+ wikiPath := repo_model.WikiPath(u.Name, opts.RepoName)
+ wikiRemotePath := repo_module.WikiRemoteURL(ctx, opts.CloneAddr)
+ if len(wikiRemotePath) > 0 {
+ if err := util.RemoveAll(wikiPath); err != nil {
+ return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err)
+ }
+
+ if err := git.Clone(ctx, wikiRemotePath, wikiPath, git.CloneRepoOptions{
+ Mirror: true,
+ Quiet: true,
+ Timeout: migrateTimeout,
+ SkipTLSVerify: setting.Migrations.SkipTLSVerify,
+ }); err != nil {
+ log.Warn("Clone wiki: %v", err)
+ if err := util.RemoveAll(wikiPath); err != nil {
+ return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err)
+ }
+ } else {
+ // Figure out the branch of the wiki we just cloned. We assume
+ // that the default branch is to be used, and we'll use the same
+ // name as the source.
+ gitRepo, err := git.OpenRepository(ctx, wikiPath)
+ if err != nil {
+ log.Warn("Failed to open wiki repository during migration: %v", err)
+ if err := util.RemoveAll(wikiPath); err != nil {
+ return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err)
+ }
+ return repo, err
+ }
+ defer gitRepo.Close()
+
+ branch, err := gitRepo.GetDefaultBranch()
+ if err != nil {
+ log.Warn("Failed to get the default branch of a migrated wiki repo: %v", err)
+ if err := util.RemoveAll(wikiPath); err != nil {
+ return repo, fmt.Errorf("Failed to remove %s: %w", wikiPath, err)
+ }
+
+ return repo, err
+ }
+ repo.WikiBranch = branch
+
+ if err := git.WriteCommitGraph(ctx, wikiPath); err != nil {
+ return repo, err
+ }
+ }
+ }
+ }
+
+ if repo.OwnerID == u.ID {
+ repo.Owner = u
+ }
+
+ if err = repo_module.CheckDaemonExportOK(ctx, repo); err != nil {
+ return repo, fmt.Errorf("checkDaemonExportOK: %w", err)
+ }
+
+ if stdout, _, err := git.NewCommand(ctx, "update-server-info").
+ SetDescription(fmt.Sprintf("MigrateRepositoryGitData(git update-server-info): %s", repoPath)).
+ RunStdString(&git.RunOpts{Dir: repoPath}); err != nil {
+ log.Error("MigrateRepositoryGitData(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
+ return repo, fmt.Errorf("error in MigrateRepositoryGitData(git update-server-info): %w", err)
+ }
+
+ gitRepo, err := git.OpenRepository(ctx, repoPath)
+ if err != nil {
+ return repo, fmt.Errorf("OpenRepository: %w", err)
+ }
+ defer gitRepo.Close()
+
+ repo.IsEmpty, err = gitRepo.IsEmpty()
+ if err != nil {
+ return repo, fmt.Errorf("git.IsEmpty: %w", err)
+ }
+
+ if !repo.IsEmpty {
+ if len(repo.DefaultBranch) == 0 {
+ // Try to get HEAD branch and set it as default branch.
+ headBranch, err := gitRepo.GetHEADBranch()
+ if err != nil {
+ return repo, fmt.Errorf("GetHEADBranch: %w", err)
+ }
+ if headBranch != nil {
+ repo.DefaultBranch = headBranch.Name
+ }
+ }
+
+ if _, err := repo_module.SyncRepoBranchesWithRepo(ctx, repo, gitRepo, u.ID); err != nil {
+ return repo, fmt.Errorf("SyncRepoBranchesWithRepo: %v", err)
+ }
+
+ if !opts.Releases {
+ // note: this will greatly improve release (tag) sync
+ // for pull-mirrors with many tags
+ repo.IsMirror = opts.Mirror
+ if err = repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
+ log.Error("Failed to synchronize tags to releases for repository: %v", err)
+ }
+ }
+
+ if opts.LFS {
+ endpoint := lfs.DetermineEndpoint(opts.CloneAddr, opts.LFSEndpoint)
+ lfsClient := lfs.NewClient(endpoint, httpTransport)
+ if err = repo_module.StoreMissingLfsObjectsInRepository(ctx, repo, gitRepo, lfsClient); err != nil {
+ log.Error("Failed to store missing LFS objects for repository: %v", err)
+ }
+ }
+ }
+
+ ctx, committer, err := db.TxContext(ctx)
+ if err != nil {
+ return nil, err
+ }
+ defer committer.Close()
+
+ if opts.Mirror {
+ remoteAddress, err := util.SanitizeURL(opts.CloneAddr)
+ if err != nil {
+ return repo, err
+ }
+ mirrorModel := repo_model.Mirror{
+ RepoID: repo.ID,
+ Interval: setting.Mirror.DefaultInterval,
+ EnablePrune: true,
+ NextUpdateUnix: timeutil.TimeStampNow().AddDuration(setting.Mirror.DefaultInterval),
+ LFS: opts.LFS,
+ RemoteAddress: remoteAddress,
+ }
+ if opts.LFS {
+ mirrorModel.LFSEndpoint = opts.LFSEndpoint
+ }
+
+ if opts.MirrorInterval != "" {
+ parsedInterval, err := time.ParseDuration(opts.MirrorInterval)
+ if err != nil {
+ log.Error("Failed to set Interval: %v", err)
+ return repo, err
+ }
+ if parsedInterval == 0 {
+ mirrorModel.Interval = 0
+ mirrorModel.NextUpdateUnix = 0
+ } else if parsedInterval < setting.Mirror.MinInterval {
+ err := fmt.Errorf("interval %s is set below Minimum Interval of %s", parsedInterval, setting.Mirror.MinInterval)
+ log.Error("Interval: %s is too frequent", opts.MirrorInterval)
+ return repo, err
+ } else {
+ mirrorModel.Interval = parsedInterval
+ mirrorModel.NextUpdateUnix = timeutil.TimeStampNow().AddDuration(parsedInterval)
+ }
+ }
+
+ if err = repo_model.InsertMirror(ctx, &mirrorModel); err != nil {
+ return repo, fmt.Errorf("InsertOne: %w", err)
+ }
+
+ repo.IsMirror = true
+ if err = UpdateRepository(ctx, repo, false); err != nil {
+ return nil, err
+ }
+
+ // this is necessary for sync local tags from remote
+ configName := fmt.Sprintf("remote.%s.fetch", mirrorModel.GetRemoteName())
+ if stdout, _, err := git.NewCommand(ctx, "config").
+ AddOptionValues("--add", configName, `+refs/tags/*:refs/tags/*`).
+ RunStdString(&git.RunOpts{Dir: repoPath}); err != nil {
+ log.Error("MigrateRepositoryGitData(git config --add +refs/tags/*:refs/tags/*) in %v: Stdout: %s\nError: %v", repo, stdout, err)
+ return repo, fmt.Errorf("error in MigrateRepositoryGitData(git config --add +refs/tags/*:refs/tags/*): %w", err)
+ }
+ } else {
+ if err = repo_module.UpdateRepoSize(ctx, repo); err != nil {
+ log.Error("Failed to update size for repository: %v", err)
+ }
+ if repo, err = CleanUpMigrateInfo(ctx, repo); err != nil {
+ return nil, err
+ }
+ }
+
+ return repo, committer.Commit()
+}
+
+// cleanUpMigrateGitConfig removes mirror info which prevents "push --all".
+// This also removes possible user credentials.
+func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error {
+ cmd := git.NewCommand(ctx, "remote", "rm", "origin")
+ // if the origin does not exist
+ _, stderr, err := cmd.RunStdString(&git.RunOpts{
+ Dir: repoPath,
+ })
+ if err != nil && !strings.HasPrefix(stderr, "fatal: No such remote") {
+ return err
+ }
+ return nil
+}
+
+// CleanUpMigrateInfo finishes migrating repository and/or wiki with things that don't need to be done for mirrors.
+func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo_model.Repository, error) {
+ repoPath := repo.RepoPath()
+ if err := repo_module.CreateDelegateHooks(repoPath); err != nil {
+ return repo, fmt.Errorf("createDelegateHooks: %w", err)
+ }
+ if repo.HasWiki() {
+ if err := repo_module.CreateDelegateHooks(repo.WikiPath()); err != nil {
+ return repo, fmt.Errorf("createDelegateHooks.(wiki): %w", err)
+ }
+ }
+
+ _, _, err := git.NewCommand(ctx, "remote", "rm", "origin").RunStdString(&git.RunOpts{Dir: repoPath})
+ if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
+ return repo, fmt.Errorf("CleanUpMigrateInfo: %w", err)
+ }
+
+ if repo.HasWiki() {
+ if err := cleanUpMigrateGitConfig(ctx, repo.WikiPath()); err != nil {
+ return repo, fmt.Errorf("cleanUpMigrateGitConfig (wiki): %w", err)
+ }
+ }
+
+ return repo, UpdateRepository(ctx, repo, false)
+}
diff --git a/tests/integration/mirror_pull_test.go b/tests/integration/mirror_pull_test.go
index 2e71b80fbb..77050c4bbc 100644
--- a/tests/integration/mirror_pull_test.go
+++ b/tests/integration/mirror_pull_test.go
@@ -14,7 +14,6 @@ import (
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/migration"
- "code.gitea.io/gitea/modules/repository"
mirror_service "code.gitea.io/gitea/services/mirror"
release_service "code.gitea.io/gitea/services/release"
repo_service "code.gitea.io/gitea/services/repository"
@@ -52,7 +51,7 @@ func TestMirrorPull(t *testing.T) {
ctx := context.Background()
- mirror, err := repository.MigrateRepositoryGitData(ctx, user, mirrorRepo, opts, nil)
+ mirror, err := repo_service.MigrateRepositoryGitData(ctx, user, mirrorRepo, opts, nil)
assert.NoError(t, err)
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
From c41b2c73ef21d5c54c7f2658ceffaa163b135131 Mon Sep 17 00:00:00 2001
From: Lunny Xiao
Date: Sat, 2 Mar 2024 20:07:23 +0800
Subject: [PATCH 202/807] Display tag name as title for a tag with no release
---
routers/web/repo/release.go | 8 ++++++++
templates/repo/release/list.tmpl | 4 ++--
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go
index 1998bd8ccd..79f3181ba0 100644
--- a/routers/web/repo/release.go
+++ b/routers/web/repo/release.go
@@ -184,6 +184,11 @@ func Releases(ctx *context.Context) {
ctx.ServerError("getReleaseInfos", err)
return
}
+ for _, rel := range releases {
+ if rel.Release.IsTag && rel.Release.Title == "" {
+ rel.Release.Title = rel.Release.TagName
+ }
+ }
ctx.Data["Releases"] = releases
@@ -295,6 +300,9 @@ func SingleRelease(ctx *context.Context) {
}
release := releases[0].Release
+ if release.IsTag && release.Title == "" {
+ release.Title = release.TagName
+ }
ctx.Data["PageIsSingleTag"] = release.IsTag
if release.IsTag {
diff --git a/templates/repo/release/list.tmpl b/templates/repo/release/list.tmpl
index 6dbeb741db..826480e3fb 100644
--- a/templates/repo/release/list.tmpl
+++ b/templates/repo/release/list.tmpl
@@ -18,13 +18,13 @@
From 19ff532d4234e2063c1fc15547422b0b5337829b Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Mon, 4 Mar 2024 08:16:04 +0100
Subject: [PATCH 203/807] Test that tags without a release display properly
Update the `TestTagViewWithoutRelease` test case with another assert:
one that checks that the release title is properly displayed.
Signed-off-by: Gergely Nagy
---
tests/integration/repo_tag_test.go | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/tests/integration/repo_tag_test.go b/tests/integration/repo_tag_test.go
index 60c73ae63e..5a99453659 100644
--- a/tests/integration/repo_tag_test.go
+++ b/tests/integration/repo_tag_test.go
@@ -7,6 +7,7 @@ package integration
import (
"net/http"
"net/url"
+ "strings"
"testing"
"code.gitea.io/gitea/models"
@@ -56,6 +57,13 @@ func TestTagViewWithoutRelease(t *testing.T) {
// Test that the release sub-menu isn't active
releaseLink := htmlDoc.Find(".small-menu-items .item[href*='/releases']")
assert.False(t, releaseLink.HasClass("active"))
+
+ // Test that the title is displayed
+ releaseTitle := strings.TrimSpace(htmlDoc.Find("h4.release-list-title").Text())
+ assert.Equal(t, "no-release", releaseTitle)
+
+ // Test that there is no "Stable" link
+ htmlDoc.AssertElement(t, "h4.release-list-title > span.ui.green.label", false)
}
func TestCreateNewTagProtected(t *testing.T) {
From f9894f4c5147447fa2f38a1835a575fd38f54e75 Mon Sep 17 00:00:00 2001
From: Gergely Nagy
Date: Mon, 4 Mar 2024 08:25:07 +0100
Subject: [PATCH 204/807] A release title should always be a link
This partially reverts c41b2c73ef21d5c54c7f2658ceffaa163b135131: for the
sake of consistency, the title of a release should always be a link,
whether it's a tag-only release or not.
Signed-off-by: Gergely Nagy
---
templates/repo/release/list.tmpl | 2 +-
tests/integration/repo_tag_test.go | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/templates/repo/release/list.tmpl b/templates/repo/release/list.tmpl
index 826480e3fb..d533cf6757 100644
--- a/templates/repo/release/list.tmpl
+++ b/templates/repo/release/list.tmpl
@@ -18,7 +18,7 @@
- {{if $.PageIsSingleTag}}{{$release.Title}}{{else}}{{$release.Title}}{{end}}
+ {{$release.Title}}
{{template "repo/commit_statuses" dict "Status" $info.CommitStatus "Statuses" $info.CommitStatuses "AdditionalClasses" "gt-df"}}
{{if $release.IsDraft}}
{{ctx.Locale.Tr "repo.release.draft"}}
diff --git a/tests/integration/repo_tag_test.go b/tests/integration/repo_tag_test.go
index 5a99453659..3fa3454343 100644
--- a/tests/integration/repo_tag_test.go
+++ b/tests/integration/repo_tag_test.go
@@ -59,7 +59,7 @@ func TestTagViewWithoutRelease(t *testing.T) {
assert.False(t, releaseLink.HasClass("active"))
// Test that the title is displayed
- releaseTitle := strings.TrimSpace(htmlDoc.Find("h4.release-list-title").Text())
+ releaseTitle := strings.TrimSpace(htmlDoc.Find("h4.release-list-title > a").Text())
assert.Equal(t, "no-release", releaseTitle)
// Test that there is no "Stable" link
From 209060139dc8934f7385427d95b0f9fe15cb6839 Mon Sep 17 00:00:00 2001
From: "Iztok Fister Jr."
Date: Mon, 4 Mar 2024 15:13:10 +0100
Subject: [PATCH 205/807] Add gitignore template for Janet projects
---
options/gitignore/Janet | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 options/gitignore/Janet
diff --git a/options/gitignore/Janet b/options/gitignore/Janet
new file mode 100644
index 0000000000..9c181fe604
--- /dev/null
+++ b/options/gitignore/Janet
@@ -0,0 +1,4 @@
+# Binaries
+build/
+# Janet Project Manager dependency directory
+jpm_tree/
From d257fa179b45aba5e319c14c02d959f9e66459df Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Wed, 6 Mar 2024 00:44:26 +0800
Subject: [PATCH 206/807] [CI] do not hardcode the Forgejo release in
end-to-end testing
Now that Forgejo has its own release number, use the Makefile as a
reference.
Also document and improve support for debugging this
pull_request_target workflow by using a branch in the repository.
---
.forgejo/cascading-pr-end-to-end | 27 ++++++++----
.../workflows/cascade-setup-end-to-end.yml | 43 +++++++++++++++++--
Makefile | 20 +++++++--
3 files changed, 75 insertions(+), 15 deletions(-)
diff --git a/.forgejo/cascading-pr-end-to-end b/.forgejo/cascading-pr-end-to-end
index 975888b245..2350394f2c 100755
--- a/.forgejo/cascading-pr-end-to-end
+++ b/.forgejo/cascading-pr-end-to-end
@@ -5,17 +5,26 @@ set -ex
end_to_end=$1
end_to_end_pr=$2
forgejo=$3
-forgejo_pr=$4
+forgejo_pr_or_ref=$4
+
+cd $forgejo
+full_version=$(make show-version-full)
+major_version=$(make show-version-major)
-head_url=$(jq --raw-output .head.repo.html_url < $forgejo_pr)
-test "$head_url" != null
-branch=$(jq --raw-output .head.ref < $forgejo_pr)
-test "$branch" != null
cd $end_to_end
-echo $head_url $branch 7.0.0+0-gitea-1.22.0 > forgejo/sources/1.22
date > last-upgrade
-base_url=$(jq --raw-output .base.repo.html_url < $forgejo_pr)
-test "$base_url" != null
+if test -f "$forgejo_pr_or_ref" ; then
+ forgejo_pr=$forgejo_pr_or_ref
+ head_url=$(jq --raw-output .head.repo.html_url < $forgejo_pr)
+ test "$head_url" != null
+ branch=$(jq --raw-output .head.ref < $forgejo_pr)
+ test "$branch" != null
+ echo $head_url $branch $full_version > forgejo/sources/$major_version
+else
+ forgejo_ref=$forgejo_pr_or_ref
+ echo $GITHUB_SERVER_URL/$GITHUB_REPOSITORY ${forgejo_ref#refs/heads/} $full_version > forgejo/sources/$major_version
+fi
+
test "$GITHUB_RUN_NUMBER"
-echo $base_url/actions/runs/$GITHUB_RUN_NUMBER/artifacts/forgejo > forgejo/binary-url
+echo $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_NUMBER/artifacts/forgejo > forgejo/binary-url
diff --git a/.forgejo/workflows/cascade-setup-end-to-end.yml b/.forgejo/workflows/cascade-setup-end-to-end.yml
index 235211f18a..e3b43d968b 100644
--- a/.forgejo/workflows/cascade-setup-end-to-end.yml
+++ b/.forgejo/workflows/cascade-setup-end-to-end.yml
@@ -1,5 +1,23 @@
+# Copyright 2024 The Forgejo Authors
# SPDX-License-Identifier: MIT
+#
+# To modify this workflow:
+#
+# - push it to the wip-ci-end-to-end branch on the forgejo repository
+# otherwise it will not have access to the secrets required to push
+# the cascading PR
+#
+# - once it works, open a pull request for the sake of keeping track
+# of the change even if the PR won't run it because it will use
+# whatever is in the default branch instead
+#
+# - after it is merged, double check it works by setting the
+# run-end-to-end-test on a pull request (any pull request will doe
+#
on:
+ push:
+ branches:
+ - 'wip-ci-end-to-end'
pull_request_target:
types:
- labeled
@@ -20,9 +38,18 @@ jobs:
cat <<'EOF'
${{ toJSON(github.event.pull_request.labels.*.name) }}
EOF
+ cat <<'EOF'
+ ${{ toJSON(github.event) }}
+ EOF
build:
- if: ${{ !startsWith(vars.ROLE, 'forgejo-') && github.event.action == 'label_updated' && contains(github.event.pull_request.labels.*.name, 'run-end-to-end-tests') }}
+ if: >
+ !startsWith(vars.ROLE, 'forgejo-') && (
+ github.event_name == 'push' ||
+ (
+ github.event.action == 'label_updated' && contains(github.event.pull_request.labels.*.name, 'run-end-to-end-tests')
+ )
+ )
runs-on: docker
container:
image: 'docker.io/node:20-bookworm'
@@ -55,19 +82,29 @@ jobs:
path: forgejo
cascade:
- if: ${{ !startsWith(vars.ROLE, 'forgejo-') && github.event.action == 'label_updated' && contains(github.event.pull_request.labels.*.name, 'run-end-to-end-tests') }}
+ if: >
+ !startsWith(vars.ROLE, 'forgejo-') && (
+ github.event_name == 'push' ||
+ (
+ github.event.action == 'label_updated' && contains(github.event.pull_request.labels.*.name, 'run-end-to-end-tests')
+ )
+ )
needs: [build]
runs-on: docker
container:
image: node:20-bookworm
steps:
- uses: actions/checkout@v4
- - uses: actions/cascading-pr@v1
+ with:
+ fetch-depth: '0'
+ show-progress: 'false'
+ - uses: actions/cascading-pr@v2
with:
origin-url: ${{ env.GITHUB_SERVER_URL }}
origin-repo: ${{ github.repository }}
origin-token: ${{ secrets.END_TO_END_CASCADING_PR_ORIGIN }}
origin-pr: ${{ github.event.pull_request.number }}
+ origin-ref: ${{ github.event_name == 'push' && github.event.ref }}
destination-url: https://code.forgejo.org
destination-fork-repo: cascading-pr/end-to-end
destination-repo: forgejo/end-to-end
diff --git a/Makefile b/Makefile
index 9d0a92bdfb..bc3837f065 100644
--- a/Makefile
+++ b/Makefile
@@ -93,6 +93,14 @@ ifneq ($(STORED_VERSION),)
else
FORGEJO_VERSION ?= $(shell git describe --exclude '*-test' --tags --always | sed 's/^v//')+${GITEA_COMPATIBILITY}
endif
+FORGEJO_VERSION_MAJOR=$(shell echo $(FORGEJO_VERSION) | sed -e 's/\..*//')
+
+show-version-full:
+ @echo ${FORGEJO_VERSION}
+
+show-version-major:
+ @echo ${FORGEJO_VERSION_MAJOR}
+
RELEASE_VERSION ?= ${FORGEJO_VERSION}
VERSION ?= ${RELEASE_VERSION}
@@ -100,8 +108,10 @@ LDFLAGS := $(LDFLAGS) -X "main.ReleaseVersion=$(RELEASE_VERSION)" -X "main.MakeV
LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64
-GO_PACKAGES ?= $(filter-out code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/))
-GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list code.gitea.io/gitea/models/migrations/...) $(shell $(GO) list code.gitea.io/gitea/models/forgejo_migrations/...) code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/))
+ifeq ($(HAS_GO), yes)
+ GO_PACKAGES ?= $(filter-out code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/))
+ GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list code.gitea.io/gitea/models/migrations/...) $(shell $(GO) list code.gitea.io/gitea/models/forgejo_migrations/...) code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/))
+endif
FOMANTIC_WORK_DIR := web_src/fomantic
@@ -140,7 +150,9 @@ GO_SOURCES += $(shell find $(GO_DIRS) -type f -name "*.go" ! -path modules/optio
GO_SOURCES += $(GENERATED_GO_DEST)
GO_SOURCES_NO_BINDATA := $(GO_SOURCES)
-MIGRATION_PACKAGES := $(shell $(GO) list code.gitea.io/gitea/models/migrations/... code.gitea.io/gitea/models/forgejo_migrations/...)
+ifeq ($(HAS_GO), yes)
+ MIGRATION_PACKAGES := $(shell $(GO) list code.gitea.io/gitea/models/migrations/... code.gitea.io/gitea/models/forgejo_migrations/...)
+endif
ifeq ($(filter $(TAGS_SPLIT),bindata),bindata)
GO_SOURCES += $(BINDATA_DEST)
@@ -219,6 +231,8 @@ help:
@echo " - checks-frontend check frontend files"
@echo " - checks-backend check backend files"
@echo " - test test everything"
+ @echo " - show-version-full show the same version as the API endpoint"
+ @echo " - show-version-major show major release number only"
@echo " - test-frontend test frontend files"
@echo " - test-backend test backend files"
@echo " - test-e2e[\#TestSpecificName] test end to end using playwright"
From 96f9673640e0a77646dbac6bdeeb3aae4f51be98 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Wed, 6 Mar 2024 09:09:19 +0800
Subject: [PATCH 207/807] [CI] do not hardcode the Forgejo release in
end-to-end testing (part 2)
The absence of origin-ref must be the empty string '', not 'false'
---
.forgejo/workflows/cascade-setup-end-to-end.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.forgejo/workflows/cascade-setup-end-to-end.yml b/.forgejo/workflows/cascade-setup-end-to-end.yml
index e3b43d968b..85871ec31d 100644
--- a/.forgejo/workflows/cascade-setup-end-to-end.yml
+++ b/.forgejo/workflows/cascade-setup-end-to-end.yml
@@ -104,7 +104,7 @@ jobs:
origin-repo: ${{ github.repository }}
origin-token: ${{ secrets.END_TO_END_CASCADING_PR_ORIGIN }}
origin-pr: ${{ github.event.pull_request.number }}
- origin-ref: ${{ github.event_name == 'push' && github.event.ref }}
+ origin-ref: ${{ github.event_name == 'push' && github.event.ref || '' }}
destination-url: https://code.forgejo.org
destination-fork-repo: cascading-pr/end-to-end
destination-repo: forgejo/end-to-end
From ac0f58035f2f4ad060ec3efcb4f2c7dd8558be13 Mon Sep 17 00:00:00 2001
From: Earl Warren
Date: Wed, 6 Mar 2024 11:21:31 +0800
Subject: [PATCH 208/807] [CI] pin go v1.21.8 version
Because setup-go fails to pick it up.
Refs: https://github.com/actions/setup-go/issues/462
---
.forgejo/workflows/build-release.yml | 3 +--
.forgejo/workflows/cascade-setup-end-to-end.yml | 2 +-
.forgejo/workflows/e2e.yml | 3 +--
.forgejo/workflows/publish-release.yml | 2 +-
.forgejo/workflows/testing.yml | 10 +++++-----
5 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml
index c012991b3a..ef5c68d191 100644
--- a/.forgejo/workflows/build-release.yml
+++ b/.forgejo/workflows/build-release.yml
@@ -43,8 +43,7 @@ jobs:
- uses: https://code.forgejo.org/actions/setup-go@v4
with:
- go-version: "1.21"
- check-latest: true
+ go-version: "1.21.8"
- name: version from ref
id: release-info
diff --git a/.forgejo/workflows/cascade-setup-end-to-end.yml b/.forgejo/workflows/cascade-setup-end-to-end.yml
index 85871ec31d..b8269e1d35 100644
--- a/.forgejo/workflows/cascade-setup-end-to-end.yml
+++ b/.forgejo/workflows/cascade-setup-end-to-end.yml
@@ -67,7 +67,7 @@ jobs:
chown -R forgejo:forgejo .
- uses: https://code.forgejo.org/actions/setup-go@v4
with:
- go-version: "1.21"
+ go-version: "1.21.8"
- name: make deps-backend
run: |
su forgejo -c 'make deps-backend'
diff --git a/.forgejo/workflows/e2e.yml b/.forgejo/workflows/e2e.yml
index 2104f6a067..7ace817bc1 100644
--- a/.forgejo/workflows/e2e.yml
+++ b/.forgejo/workflows/e2e.yml
@@ -17,8 +17,7 @@ jobs:
- uses: https://code.forgejo.org/actions/checkout@v4
- uses: https://code.forgejo.org/actions/setup-go@v4
with:
- go-version: "~1.21"
- check-latest: true
+ go-version: "1.21.8"
- run: |
apt-get -qq update
apt-get -qq install -q sudo
diff --git a/.forgejo/workflows/publish-release.yml b/.forgejo/workflows/publish-release.yml
index eaa14c3693..68fb68eb75 100644
--- a/.forgejo/workflows/publish-release.yml
+++ b/.forgejo/workflows/publish-release.yml
@@ -64,7 +64,7 @@ jobs:
if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != ''
uses: https://code.forgejo.org/actions/setup-go@v4
with:
- go-version: "1.21"
+ go-version: "1.21.8"
check-latest: true
- name: update the _release.experimental DNS record
if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != ''
diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml
index 80fd87152e..1bc23e16b0 100644
--- a/.forgejo/workflows/testing.yml
+++ b/.forgejo/workflows/testing.yml
@@ -17,7 +17,7 @@ jobs:
- uses: https://code.forgejo.org/actions/checkout@v3
- uses: https://code.forgejo.org/actions/setup-go@v4
with:
- go-version: "1.21"
+ go-version: "1.21.8"
check-latest: true
- run: make deps-backend deps-tools
- run: make --always-make -j$(nproc) lint-backend checks-backend # ensure the "go-licenses" make target runs
@@ -51,7 +51,7 @@ jobs:
- uses: https://code.forgejo.org/actions/checkout@v3
- uses: https://code.forgejo.org/actions/setup-go@v4
with:
- go-version: "1.21"
+ go-version: "1.21.8"
- run: |
git config --add safe.directory '*'
adduser --quiet --comment forgejo --disabled-password forgejo
@@ -96,7 +96,7 @@ jobs:
- uses: https://code.forgejo.org/actions/checkout@v3
- uses: https://code.forgejo.org/actions/setup-go@v4
with:
- go-version: "1.21"
+ go-version: "1.21.8"
- name: install dependencies & git >= 2.42
run: |
export DEBIAN_FRONTEND=noninteractive
@@ -143,7 +143,7 @@ jobs:
- uses: https://code.forgejo.org/actions/checkout@v3
- uses: https://code.forgejo.org/actions/setup-go@v4
with:
- go-version: "1.21"
+ go-version: "1.21.8"
- name: install dependencies & git >= 2.42
run: |
export DEBIAN_FRONTEND=noninteractive
@@ -180,7 +180,7 @@ jobs:
- uses: https://code.forgejo.org/actions/checkout@v3
- uses: https://code.forgejo.org/actions/setup-go@v4
with:
- go-version: "1.21"
+ go-version: "1.21.8"
- name: install dependencies & git >= 2.42
run: |
export DEBIAN_FRONTEND=noninteractive
From 2c26b187eaa01b3e953c7745c6b0be5db211590e Mon Sep 17 00:00:00 2001
From: techknowlogick
Date: Tue, 5 Mar 2024 20:35:29 -0500
Subject: [PATCH 209/807] bump protobuf module (#29617)
(cherry picked from commit 06039bf0b7ec4dffe74ae323b8bbbbedec69d0c8)
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 0924b9fdc0..788bb9f392 100644
--- a/go.mod
+++ b/go.mod
@@ -109,7 +109,7 @@ require (
golang.org/x/text v0.14.0
golang.org/x/tools v0.17.0
google.golang.org/grpc v1.60.1
- google.golang.org/protobuf v1.32.0
+ google.golang.org/protobuf v1.33.0
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.67.0
gopkg.in/yaml.v3 v3.0.1
diff --git a/go.sum b/go.sum
index f8bf0567de..18e0aadd87 100644
--- a/go.sum
+++ b/go.sum
@@ -1239,8 +1239,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
-google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
+google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
From a98d786f125c79197beb24c7f900f1ae414910c4 Mon Sep 17 00:00:00 2001
From: GiteaBot
Date: Mon, 26 Feb 2024 00:24:51 +0000
Subject: [PATCH 210/807] [skip ci] Updated translations via Crowdin
(cherry picked from commit f38888bc7834899777bda1a271e166d3836524cf)
---
options/locale/locale_fr-FR.ini | 37 +++++++++++++++++++++++++++++++--
options/locale/locale_lv-LV.ini | 8 +++++++
2 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index 98c524ac80..4cfde206af 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -124,6 +124,7 @@ pin=Épingler
unpin=Désépingler
artifacts=Artefacts
+confirm_delete_artifact=Êtes-vous sûr de vouloir supprimer l‘artefact « %s » ?
archived=Archivé
@@ -366,6 +367,7 @@ disable_register_prompt=Les inscriptions sont désactivées. Veuillez contacter
disable_register_mail=La confirmation par courriel à l’inscription est désactivée.
manual_activation_only=Contactez l'administrateur de votre site pour terminer l'activation.
remember_me=Mémoriser cet appareil
+remember_me.compromised=Le jeton de connexion n’est plus valide, ce qui peut indiquer un compte compromis. Veuillez inspecter les activités inhabituelles de votre compte.
forgot_password_title=Mot de passe oublié
forgot_password=Mot de passe oublié ?
sign_up_now=Pas de compte ? Inscrivez-vous maintenant.
@@ -602,6 +604,7 @@ target_branch_not_exist=La branche cible n'existe pas.
username_error_no_dots = ` peut uniquement contenir des caractères alphanumériques ('0-9','a-z','A-Z'), tiret ('-') et souligné ('_'). Ne peut commencer ou terminer avec un caractère non-alphanumérique, et l'utilisation de caractères non-alphanumériques consécutifs n'est pas permise.`
admin_cannot_delete_self = Vous ne pouvez supprimer votre compte lorsque vous disposez de droits d'administration. Veuillez d'abord renoncer à vos droits d'administration.
+admin_cannot_delete_self=Vous ne pouvez pas vous supprimer vous-même lorsque vous êtes admin. Veuillez d’abord supprimer vos privilèges d’administrateur.
[user]
change_avatar=Changer votre avatar…
@@ -817,7 +820,7 @@ valid_until_date=Valable jusqu'au %s
valid_forever=Valide pour toujours
last_used=Dernière utilisation le
no_activity=Aucune activité récente
-can_read_info=Lue(s)
+can_read_info=Lecture
can_write_info=Écriture
key_state_desc=Cette clé a été utilisée au cours des 7 derniers jours
token_state_desc=Ce jeton a été utilisé au cours des 7 derniers jours
@@ -850,7 +853,7 @@ permissions_public_only=Publique uniquement
permissions_access_all=Tout (public, privé et limité)
select_permissions=Sélectionner les autorisations
permission_no_access=Aucun accès
-permission_read=Lue(s)
+permission_read=Lecture
permission_write=Lecture et écriture
access_token_desc=Les autorisations des jetons sélectionnées se limitent aux routes API correspondantes. Lisez la documentation pour plus d’informations.
at_least_one_permission=Vous devez sélectionner au moins une permission pour créer un jeton
@@ -1013,6 +1016,7 @@ 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'). 0 pour désactiver la synchronisation automatique. (Intervalle minimum : %s)
mirror_interval_invalid=L'intervalle de synchronisation est invalide.
+mirror_sync=synchronisé
mirror_sync_on_commit=Synchroniser quand les révisions sont soumis
mirror_address=Cloner depuis une URL
mirror_address_desc=Insérez tous les identifiants requis dans la section Autorisation.
@@ -1063,6 +1067,7 @@ desc.public=Publique
desc.template=Modèle
desc.internal=Interne
desc.archived=Archivé
+desc.sha256=SHA256
template.items=Élément du modèle
template.git_content=Contenu Git (branche par défaut)
@@ -1213,6 +1218,8 @@ audio_not_supported_in_browser=Votre navigateur ne supporte pas la balise « au
stored_lfs=Stocké avec Git LFS
symbolic_link=Lien symbolique
executable_file=Fichiers exécutables
+vendored=Externe
+generated=Générée
commit_graph=Graphe des révisions
commit_graph.select=Sélectionner les branches
commit_graph.hide_pr_refs=Masquer les demandes d'ajout
@@ -1794,6 +1801,7 @@ pulls.merge_pull_request=Créer une révision de fusion
pulls.rebase_merge_pull_request=Rebaser puis avancer rapidement
pulls.rebase_merge_commit_pull_request=Rebaser puis créer une révision de fusion
pulls.squash_merge_pull_request=Créer une révision de concaténation
+pulls.fast_forward_only_merge_pull_request=Avance rapide uniquement
pulls.merge_manually=Fusionner manuellement
pulls.merge_commit_id=L'ID de la révision de fusion
pulls.require_signed_wont_sign=La branche nécessite des révisions signées mais cette fusion ne sera pas signée
@@ -1930,6 +1938,7 @@ wiki.page_name_desc=Entrez un nom pour cette page Wiki. Certains noms spéciaux
wiki.original_git_entry_tooltip=Voir le fichier Git original au lieu d'utiliser un lien convivial.
activity=Activité
+activity.navbar.contributors=Contributeurs
activity.period.filter_label=Période :
activity.period.daily=1 jour
activity.period.halfweekly=3 jours
@@ -1995,7 +2004,10 @@ activity.git_stats_and_deletions=et
activity.git_stats_deletion_1=%d suppression
activity.git_stats_deletion_n=%d suppressions
+contributors.contribution_type.filter_label=Type de contribution :
contributors.contribution_type.commits=Révisions
+contributors.contribution_type.additions=Ajouts
+contributors.contribution_type.deletions=Suppressions
search=Chercher
search.search_repo=Rechercher dans le dépôt
@@ -2344,6 +2356,8 @@ settings.protect_approvals_whitelist_users=Évaluateurs autorisés :
settings.protect_approvals_whitelist_teams=Équipes d’évaluateurs autorisés :
settings.dismiss_stale_approvals=Révoquer automatiquement les approbations périmées
settings.dismiss_stale_approvals_desc=Lorsque des nouvelles révisions changent le contenu de la demande d’ajout, les approbations existantes sont révoquées.
+settings.ignore_stale_approvals=Ignorer les approbations obsolètes
+settings.ignore_stale_approvals_desc=Ignorer les approbations d’anciennes révisions (évaluations obsolètes) du décompte des approbations de la demande d’ajout. Non pertinent quand les évaluations obsolètes sont déjà révoquées.
settings.require_signed_commits=Exiger des révisions signées
settings.require_signed_commits_desc=Rejeter les soumissions sur cette branche lorsqu'ils ne sont pas signés ou vérifiables.
settings.protect_branch_name_pattern=Motif de nom de branche protégé
@@ -2399,6 +2413,7 @@ settings.archive.error=Une erreur s'est produite lors de l'archivage du dépôt.
settings.archive.error_ismirror=Vous ne pouvez pas archiver un dépôt en miroir.
settings.archive.branchsettings_unavailable=Le paramétrage des branches n'est pas disponible quand le dépôt est archivé.
settings.archive.tagsettings_unavailable=Le paramétrage des étiquettes n'est pas disponible si le dépôt est archivé.
+settings.archive.mirrors_unavailable=Les miroirs ne sont pas disponibles lorsque le dépôt est archivé.
settings.unarchive.button=Réhabiliter
settings.unarchive.header=Réhabiliter ce dépôt
settings.unarchive.text=Réhabiliter un dépôt dégèle les actions de révisions et de soumissions, la gestion des tickets et des demandes d'ajouts.
@@ -2652,6 +2667,11 @@ activity.navbar.code_frequency = Fréquence de code
activity.navbar.recent_commits = Commits récents
[graphs]
+component_loading=Chargement de %s…
+component_loading_failed=Impossible de charger %s.
+component_loading_info=Ça prend son temps…
+component_failed_to_load=Une erreur inattendue s’est produite.
+contributors.what=contributions
[org]
org_name_holder=Nom de l'organisation
@@ -2780,6 +2800,7 @@ follow_blocked_user = Vous ne pouvez pas suivre cette organisation car elle vous
[admin]
dashboard=Tableau de bord
+self_check=Autodiagnostique
identity_access=Identité et accès
users=Comptes utilisateurs
organizations=Organisations
@@ -2825,6 +2846,7 @@ dashboard.delete_missing_repos=Supprimer tous les dépôts dont les fichiers Git
dashboard.delete_missing_repos.started=Tâche de suppression de tous les dépôts sans fichiers Git démarrée.
dashboard.delete_generated_repository_avatars=Supprimer les avatars de dépôt générés
dashboard.sync_repo_branches=Synchroniser les branches manquantes depuis Git vers la base de donnée.
+dashboard.sync_repo_tags=Synchroniser les étiquettes git depuis les dépôts vers la base de données
dashboard.update_mirrors=Actualiser les miroirs
dashboard.repo_health_check=Vérifier l'état de santé de tous les dépôts
dashboard.check_repo_stats=Voir les statistiques de tous les dépôts
@@ -2879,6 +2901,7 @@ dashboard.stop_endless_tasks=Arrêter les tâches sans fin
dashboard.cancel_abandoned_jobs=Annuler les jobs abandonnés
dashboard.start_schedule_tasks=Démarrer les tâches planifiées
dashboard.sync_branch.started=Début de la synchronisation des branches
+dashboard.sync_tag.started=Synchronisation des étiquettes
dashboard.rebuild_issue_indexer=Reconstruire l’indexeur des tickets
users.user_manage_panel=Gestion du compte utilisateur
@@ -3314,6 +3337,12 @@ self_check.database_inconsistent_collation_columns = La base de donnée utilise
self_check.database_fix_mysql = Les utilisateurs de MySQL/MariaDB peuvent utiliser la commande "forgejo doctor convert" pour corriger les problèmes de collation, ou bien manuellement avec la commande SQL "ALTER ... COLLATE ...".
self_check.database_fix_mssql = Les utilisateurs de MSSQL sont pour l'instant contraint d'utiliser la commande SQL "ALTER ... COLLATE ..." pour corriger ce problème.
+self_check.no_problem_found=Aucun problème trouvé pour l’instant.
+self_check.database_collation_mismatch=Exige que la base de données utilise la collation %s.
+self_check.database_collation_case_insensitive=La base de données utilise la collation %s, insensible à la casse. Bien que Gitea soit compatible, il peut y avoir quelques rares cas qui ne fonctionnent pas comme prévu.
+self_check.database_inconsistent_collation_columns=La base de données utilise la collation %s, mais ces colonnes utilisent des collations différentes. Cela peut causer des problèmes imprévus.
+self_check.database_fix_mysql=Pour les utilisateurs de MySQL ou MariaDB, vous pouvez utiliser la commande « gitea doctor convert » dans un terminal ou exécuter une requête du type « ALTER … COLLATE ... » pour résoudre les problèmes de collation.
+self_check.database_fix_mssql=Pour les utilisateurs de MSSQL, vous ne pouvez résoudre le problème qu’en exécutant une requête SQL du type « ALTER … COLLATE … ».
[action]
create_repo=a créé le dépôt %s
@@ -3501,6 +3530,7 @@ rpm.distros.suse=sur les distributions basées sur SUSE
rpm.install=Pour installer le paquet, exécutez la commande suivante :
rpm.repository=Informations sur le Dépôt
rpm.repository.architectures=Architectures
+rpm.repository.multiple_groups=Ce paquet est disponible en plusieurs groupes.
rubygems.install=Pour installer le paquet en utilisant gem, exécutez la commande suivante :
rubygems.install2=ou ajoutez-le au Gemfile :
rubygems.dependencies.runtime=Dépendances d'exécution
@@ -3636,6 +3666,8 @@ runs.actors_no_select=Tous les acteurs
runs.status_no_select=Touts les statuts
runs.no_results=Aucun résultat correspondant.
runs.no_workflows=Il n'y a pas encore de workflows.
+runs.no_workflows.quick_start=Vous découvrez les Actions Gitea ? Consultez le didacticiel.
+runs.no_workflows.documentation=Pour plus d’informations sur les actions Gitea, voir la documentation.
runs.no_runs=Le flux de travail n'a pas encore d'exécution.
runs.empty_commit_message=(message de révision vide)
@@ -3654,6 +3686,7 @@ variables.none=Il n'y a pas encore de variables.
variables.deletion=Retirer la variable
variables.deletion.description=La suppression d’une variable est permanente et ne peut être défaite. Continuer ?
variables.description=Les variables sont passées aux actions et ne peuvent être lues autrement.
+variables.id_not_exist=La variable avec l’ID %d n’existe pas.
variables.edit=Modifier la variable
variables.deletion.failed=Impossible de retirer la variable.
variables.deletion.success=La variable a bien été retirée.
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index 15d24558df..718f3dc9a4 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -1036,6 +1036,7 @@ desc.public=Publisks
desc.template=Sagatave
desc.internal=Iekšējs
desc.archived=Arhivēts
+desc.sha256=SHA256
template.items=Sagataves ieraksti
template.git_content=Git saturs (noklusētais atzars)
@@ -2571,6 +2572,10 @@ error.csv.unexpected=Nevar attēlot šo failu, jo tas satur neparedzētu simbolu
error.csv.invalid_field_count=Nevar attēlot šo failu, jo tas satur nepareizu skaitu ar laukiem %d. līnijā.
[graphs]
+component_loading=Ielādē %s...
+component_loading_failed=Nevarēja ielādēt %s
+component_loading_info=Šis var aizņemt kādu brīdi…
+component_failed_to_load=Atgadījās neparedzēta kļūda.
[org]
org_name_holder=Organizācijas nosaukums
@@ -2698,6 +2703,7 @@ teams.invite.description=Nospiediet pogu zemāk, lai pievienotos komandai.
[admin]
dashboard=Infopanelis
+self_check=Pašpārbaude
identity_access=Identitāte un piekļuve
users=Lietotāju konti
organizations=Organizācijas
@@ -3223,6 +3229,7 @@ notices.desc=Apraksts
notices.op=Op.
notices.delete_success=Sistēmas paziņojumi ir dzēsti.
+self_check.no_problem_found=Pašlaik nav atrasta neviena problēma.
[action]
create_repo=izveidoja repozitoriju %s
@@ -3560,6 +3567,7 @@ variables.none=Vēl nav neviena mainīgā.
variables.deletion=Noņemt mainīgo
variables.deletion.description=Mainīgā noņemšana ir neatgriezeniska un nav atsaucama. Vai turpināt?
variables.description=Mainīgie tiks padoti noteiktām darbībām, un citādāk tos nevar nolasīt.
+variables.id_not_exist=Mainīgais ar identifikatoru %d nepastāv.
variables.edit=Labot mainīgo
variables.deletion.failed=Neizdevās noņemt mainīgo.
variables.deletion.success=Mainīgais tika noņemts.
From bc7a247b9ea68643e3c59d4b4376dea097ffcc68 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20Br=C3=BCckner?=
Date: Mon, 26 Feb 2024 04:08:21 +0000
Subject: [PATCH 211/807] Include resource state events in Gitlab downloads
(#29382)
Some specific events on Gitlab issues and merge requests are stored
separately from comments as "resource state events". With this change,
all relevant resource state events are downloaded during issue and merge
request migration, and converted to comments.
This PR also updates the template used to render comments to add support
for migrated comments of these types.
ref: https://docs.gitlab.com/ee/api/resource_state_events.html
(cherry picked from commit 17f170ee3724d8bdf2ddaad4211b12433f78ff0e)
---
services/migrations/gitea_uploader.go | 6 ++
services/migrations/gitlab.go | 54 ++++++++++++++++++
.../repo/issue/view_content/comments.tmpl | 55 +++++--------------
.../view_content/comments_authorlink.tmpl | 11 ++++
4 files changed, 86 insertions(+), 40 deletions(-)
create mode 100644 templates/repo/issue/view_content/comments_authorlink.tmpl
diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go
index 717be7b7f3..9baae6d31d 100644
--- a/services/migrations/gitea_uploader.go
+++ b/services/migrations/gitea_uploader.go
@@ -483,6 +483,10 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
}
switch cm.Type {
+ case issues_model.CommentTypeReopen:
+ cm.Content = ""
+ case issues_model.CommentTypeClose:
+ cm.Content = ""
case issues_model.CommentTypeAssignees:
if assigneeID, ok := comment.Meta["AssigneeID"].(int); ok {
cm.AssigneeID = int64(assigneeID)
@@ -503,6 +507,8 @@ func (g *GiteaLocalUploader) CreateComments(comments ...*base.Comment) error {
cm.NewRef = fmt.Sprint(comment.Meta["NewRef"])
cm.Content = ""
}
+ case issues_model.CommentTypeMergePull:
+ cm.Content = ""
case issues_model.CommentTypePRScheduledToAutoMerge, issues_model.CommentTypePRUnScheduledToAutoMerge:
cm.Content = ""
default:
diff --git a/services/migrations/gitlab.go b/services/migrations/gitlab.go
index 5e49ae6d57..bbc44e958a 100644
--- a/services/migrations/gitlab.go
+++ b/services/migrations/gitlab.go
@@ -517,6 +517,60 @@ func (g *GitlabDownloader) GetComments(commentable base.Commentable) ([]*base.Co
}
page = resp.NextPage
}
+
+ page = 1
+ for {
+ var stateEvents []*gitlab.StateEvent
+ var resp *gitlab.Response
+ var err error
+ if context.IsMergeRequest {
+ stateEvents, resp, err = g.client.ResourceStateEvents.ListMergeStateEvents(g.repoID, int(commentable.GetForeignIndex()), &gitlab.ListStateEventsOptions{
+ ListOptions: gitlab.ListOptions{
+ Page: page,
+ PerPage: g.maxPerPage,
+ },
+ }, nil, gitlab.WithContext(g.ctx))
+ } else {
+ stateEvents, resp, err = g.client.ResourceStateEvents.ListIssueStateEvents(g.repoID, int(commentable.GetForeignIndex()), &gitlab.ListStateEventsOptions{
+ ListOptions: gitlab.ListOptions{
+ Page: page,
+ PerPage: g.maxPerPage,
+ },
+ }, nil, gitlab.WithContext(g.ctx))
+ }
+ if err != nil {
+ return nil, false, fmt.Errorf("error while listing state events: %v %w", g.repoID, err)
+ }
+
+ for _, stateEvent := range stateEvents {
+ comment := &base.Comment{
+ IssueIndex: commentable.GetLocalIndex(),
+ Index: int64(stateEvent.ID),
+ PosterID: int64(stateEvent.User.ID),
+ PosterName: stateEvent.User.Username,
+ Content: "",
+ Created: *stateEvent.CreatedAt,
+ }
+ switch stateEvent.State {
+ case gitlab.ClosedEventType:
+ comment.CommentType = issues_model.CommentTypeClose.String()
+ case gitlab.MergedEventType:
+ comment.CommentType = issues_model.CommentTypeMergePull.String()
+ case gitlab.ReopenedEventType:
+ comment.CommentType = issues_model.CommentTypeReopen.String()
+ default:
+ // Ignore other event types
+ continue
+ }
+ allComments = append(allComments, comment)
+ }
+
+ if resp.NextPage == 0 {
+ break
+ }
+ page = resp.NextPage
+ }
+
return allComments, true, nil
}
diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl
index b37d1e069f..79875d8176 100644
--- a/templates/repo/issue/view_content/comments.tmpl
+++ b/templates/repo/issue/view_content/comments.tmpl
@@ -81,9 +81,11 @@
{{else if eq .Type 1}}
{{template "base/modal_actions_confirm" (dict "ModalButtonTypes" "confirm")}}
diff --git a/templates/repo/diff/box.tmpl b/templates/repo/diff/box.tmpl
index 9dcc59cea7..1a78c4e8b7 100644
--- a/templates/repo/diff/box.tmpl
+++ b/templates/repo/diff/box.tmpl
@@ -206,7 +206,7 @@
{{if $showFileViewToggle}}
{{/* for image or CSV, it can have a horizontal scroll bar, there won't be review comment context menu (position absolute) which would be clipped by "overflow" */}}
`;
- toggleElem($repoFindFileNoResult, filterResult.length === 0);
+ toggleElem(repoFindFileNoResult, filterResult.length === 0);
for (const r of filterResult) {
- const $row = $(tmplRow);
- const $a = $row.find('a');
- $a.attr('href', `${treeLink}/${pathEscapeSegments(r.matchResult.join(''))}`);
- const $octiconFile = $(svg('octicon-file')).addClass('gt-mr-3');
- $a.append($octiconFile);
- // if the target file path is "abc/xyz", to search "bx", then the matchResult is ['a', 'b', 'c/', 'x', 'yz']
- // the matchResult[odd] is matched and highlighted to red.
- for (let j = 0; j < r.matchResult.length; j++) {
- if (!r.matchResult[j]) continue;
- const $span = $('').text(r.matchResult[j]);
- if (j % 2 === 1) $span.addClass('ui text red');
- $a.append($span);
+ const row = document.createElement('tr');
+ const cell = document.createElement('td');
+ const a = document.createElement('a');
+ a.setAttribute('href', `${treeLink}/${pathEscapeSegments(r.matchResult.join(''))}`);
+ a.innerHTML = svg('octicon-file', 16, 'gt-mr-3');
+ row.append(cell);
+ cell.append(a);
+ for (const [index, part] of r.matchResult.entries()) {
+ const span = document.createElement('span');
+ // safely escape by using textContent
+ span.textContent = part;
+ // if the target file path is "abc/xyz", to search "bx", then the matchResult is ['a', 'b', 'c/', 'x', 'yz']
+ // the matchResult[odd] is matched and highlighted to red.
+ if (index % 2 === 1) span.classList.add('ui', 'text', 'red');
+ a.append(span);
}
- $repoFindFileTableBody.append($row);
+ repoFindFileTableBody.append(row);
}
}
async function loadRepoFiles() {
- files = await $.ajax({
- url: $repoFindFileInput.attr('data-url-data-link'),
- headers: {'X-Csrf-Token': csrf}
- });
- filterRepoFiles($repoFindFileInput.val());
+ const response = await GET(repoFindFileInput.getAttribute('data-url-data-link'));
+ files = await response.json();
+ filterRepoFiles(repoFindFileInput.value);
}
export function initFindFileInRepo() {
- $repoFindFileInput = $('#repo-file-find-input');
- if (!$repoFindFileInput.length) return;
+ repoFindFileInput = document.getElementById('repo-file-find-input');
+ if (!repoFindFileInput) return;
- $repoFindFileTableBody = $('#repo-find-file-table tbody');
- $repoFindFileNoResult = $('#repo-find-file-no-result');
- $repoFindFileInput.on('input', () => filterRepoFiles($repoFindFileInput.val()));
+ repoFindFileTableBody = document.querySelector('#repo-find-file-table tbody');
+ repoFindFileNoResult = document.getElementById('repo-find-file-no-result');
+ repoFindFileInput.addEventListener('input', () => filterRepoFiles(repoFindFileInput.value));
loadRepoFiles();
}
From 6e89eff490956040e43c43e825a77b042ce7e863 Mon Sep 17 00:00:00 2001
From: silverwind
Date: Wed, 28 Feb 2024 16:04:04 +0100
Subject: [PATCH 228/807] Fix URL calculation in clone input box (#29470)
Ported the function as-is and added comments so we don't forget about
this in the future.
Fixes: https://github.com/go-gitea/gitea/issues/29462
(cherry picked from commit 82405f808d7b50c3580f26e5ca645e2ed6d284ab)
---
templates/repo/clone_script.tmpl | 22 +++++++++++++++-------
web_src/js/webcomponents/GiteaOriginUrl.js | 5 +++--
2 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/templates/repo/clone_script.tmpl b/templates/repo/clone_script.tmpl
index 9ff826bc93..46e49e7f85 100644
--- a/templates/repo/clone_script.tmpl
+++ b/templates/repo/clone_script.tmpl
@@ -24,14 +24,22 @@
const btn = isSSH ? sshBtn : httpsBtn;
if (!btn) return;
- let link = btn.getAttribute('data-link');
- if (link.startsWith('http://') || link.startsWith('https://')) {
- // use current protocol/host as the clone link
- const url = new URL(link);
- url.protocol = window.location.protocol;
- url.host = window.location.host;
- link = url.toString();
+ // NOTE: Keep this function in sync with the one in the js folder
+ function toOriginUrl(urlStr) {
+ try {
+ if (urlStr.startsWith('http://') || urlStr.startsWith('https://') || urlStr.startsWith('/')) {
+ const {origin, protocol, hostname, port} = window.location;
+ const url = new URL(urlStr, origin);
+ url.protocol = protocol;
+ url.hostname = hostname;
+ url.port = port || (protocol === 'https:' ? '443' : '80');
+ return url.toString();
+ }
+ } catch {}
+ return urlStr;
}
+ const link = toOriginUrl(btn.getAttribute('data-link'));
+
for (const el of document.getElementsByClassName('js-clone-url')) {
el[el.nodeName === 'INPUT' ? 'value' : 'textContent'] = link;
}
diff --git a/web_src/js/webcomponents/GiteaOriginUrl.js b/web_src/js/webcomponents/GiteaOriginUrl.js
index 5d71d95c60..6e6f84d739 100644
--- a/web_src/js/webcomponents/GiteaOriginUrl.js
+++ b/web_src/js/webcomponents/GiteaOriginUrl.js
@@ -1,7 +1,8 @@
-// Convert an absolute or relative URL to an absolute URL with the current origin
+// Convert an absolute or relative URL to an absolute URL with the current origin. It only
+// processes absolute HTTP/HTTPS URLs or relative URLs like '/xxx' or '//host/xxx'.
+// NOTE: Keep this function in sync with clone_script.tmpl
export function toOriginUrl(urlStr) {
try {
- // only process absolute HTTP/HTTPS URL or relative URLs ('/xxx' or '//host/xxx')
if (urlStr.startsWith('http://') || urlStr.startsWith('https://') || urlStr.startsWith('/')) {
const {origin, protocol, hostname, port} = window.location;
const url = new URL(urlStr, origin);
From 2b23f4bdee553d718c5397d9b7e3dae0a5a41dd2 Mon Sep 17 00:00:00 2001
From: Zettat123
Date: Wed, 28 Feb 2024 23:35:04 +0800
Subject: [PATCH 229/807] Fix workflow trigger event bugs (#29467)
1. Fix incorrect `HookEventType` for issue-related events in
`IssueChangeAssignee`
2. Add `case "types"` in the `switch` block in `matchPullRequestEvent`
to avoid warning logs
(cherry picked from commit 1ad4bb9eb7641a552c5b88a43eb91d59ec5c0edf)
---
modules/actions/workflows.go | 3 +++
services/actions/notifier.go | 8 +++++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go
index 81ab26bc27..8317f16dbd 100644
--- a/modules/actions/workflows.go
+++ b/modules/actions/workflows.go
@@ -406,6 +406,9 @@ func matchPullRequestEvent(gitRepo *git.Repository, commit *git.Commit, prPayloa
// all acts conditions should be satisfied
for cond, vals := range acts {
switch cond {
+ case "types":
+ // types have been checked
+ continue
case "branches":
refName := git.RefName(prPayload.PullRequest.Base.Ref)
patterns, err := workflowpattern.CompilePatterns(vals...)
diff --git a/services/actions/notifier.go b/services/actions/notifier.go
index e144484dab..1e99c51a8b 100644
--- a/services/actions/notifier.go
+++ b/services/actions/notifier.go
@@ -152,7 +152,13 @@ func (n *actionsNotifier) IssueChangeAssignee(ctx context.Context, doer *user_mo
} else {
action = api.HookIssueAssigned
}
- notifyIssueChange(ctx, doer, issue, webhook_module.HookEventPullRequestAssign, action)
+
+ hookEvent := webhook_module.HookEventIssueAssign
+ if issue.IsPull {
+ hookEvent = webhook_module.HookEventPullRequestAssign
+ }
+
+ notifyIssueChange(ctx, doer, issue, hookEvent, action)
}
// IssueChangeMilestone notifies assignee to notifiers
From 9c5afa0b8fbbc95548dde8e044bb7d4ae8dcc2c3 Mon Sep 17 00:00:00 2001
From: wxiaoguang
Date: Thu, 29 Feb 2024 00:03:06 +0800
Subject: [PATCH 230/807] Fix incorrect user location link on profile page
(#29474)
Fix #29472. Regression of #29236, a "if" check was missing.
(cherry picked from commit 10cfa0879a538a470598281d7093de3555c018be)
---
routers/web/shared/user/header.go | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/routers/web/shared/user/header.go b/routers/web/shared/user/header.go
index c257af46c0..fc448fcb49 100644
--- a/routers/web/shared/user/header.go
+++ b/routers/web/shared/user/header.go
@@ -36,8 +36,9 @@ func PrepareContextForProfileBigAvatar(ctx *context.Context) {
ctx.Data["IsBlocked"] = ctx.Doer != nil && user_model.IsBlocked(ctx, ctx.Doer.ID, ctx.ContextUser.ID)
ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail && ctx.ContextUser.Email != "" && ctx.IsSigned && !ctx.ContextUser.KeepEmailPrivate
- ctx.Data["ContextUserLocationMapURL"] = setting.Service.UserLocationMapURL + url.QueryEscape(ctx.ContextUser.Location)
-
+ if setting.Service.UserLocationMapURL != "" {
+ ctx.Data["ContextUserLocationMapURL"] = setting.Service.UserLocationMapURL + url.QueryEscape(ctx.ContextUser.Location)
+ }
// Show OpenID URIs
openIDs, err := user_model.GetUserOpenIDs(ctx, ctx.ContextUser.ID)
if err != nil {
From afc21e6aa769897b790e3c1705f1907ab2925e86 Mon Sep 17 00:00:00 2001
From: charles <30816317+charles7668@users.noreply.github.com>
Date: Thu, 29 Feb 2024 04:23:49 +0800
Subject: [PATCH 231/807] Fix counter display number incorrectly displayed on
the page (#29448)
issue : #28239
The counter number script uses the 'checkbox' attribute to determine
whether an item is selected or not.
However, the input event only increments the counter value, and when
more items are displayed, it does not update all previously loaded
items.
As a result, the display becomes incorrect because it triggers the
update counter script, but checkboxes that are selected without the
'checked' attribute are not counted
(cherry picked from commit 252047ed2e09e3f1f1ab394cd62995cf4cabe506)
---
web_src/js/features/pull-view-file.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/web_src/js/features/pull-view-file.js b/web_src/js/features/pull-view-file.js
index 90881ee989..2472e5a0bd 100644
--- a/web_src/js/features/pull-view-file.js
+++ b/web_src/js/features/pull-view-file.js
@@ -43,9 +43,11 @@ export function initViewedCheckboxListenerFor() {
// Mark the file as viewed visually - will especially change the background
if (this.checked) {
form.classList.add(viewedStyleClass);
+ checkbox.setAttribute('checked', '');
prReview.numberOfViewedFiles++;
} else {
form.classList.remove(viewedStyleClass);
+ checkbox.removeAttribute('checked');
prReview.numberOfViewedFiles--;
}
From 9511485142cda4456c7814ec9ed2e5ff438753e6 Mon Sep 17 00:00:00 2001
From: silverwind
Date: Wed, 28 Feb 2024 21:26:12 +0100
Subject: [PATCH 232/807] Apply compact padding to small buttons with svg icons
(#29471)
The buttons on the repo release tab were larger in height than on other
tabs because one of them contained the RSS icon which stretched the
button height by 3px. Workaround this problem by applying the "compact"
padding to any such button. They are within 0.4px in height now to
non-icon buttons.
Before:
After:
For comparison, button on issue tab:
(cherry picked from commit 850fc2516e67049ec195c72d861896b275bd09d1)
---
templates/repo/release_tag_header.tmpl | 2 +-
web_src/css/modules/button.css | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/templates/repo/release_tag_header.tmpl b/templates/repo/release_tag_header.tmpl
index 6f3d28e7ad..fe978a9680 100644
--- a/templates/repo/release_tag_header.tmpl
+++ b/templates/repo/release_tag_header.tmpl
@@ -13,7 +13,7 @@
{{if .EnableFeed}}
- {{svg "octicon-rss" 18}} {{ctx.Locale.Tr "rss_feed"}}
+ {{svg "octicon-rss" 16}} {{ctx.Locale.Tr "rss_feed"}}
{{end}}
{{if and (not .PageIsTagList) .CanCreateRelease}}
diff --git a/web_src/css/modules/button.css b/web_src/css/modules/button.css
index b772a4c14e..3c80eb99c0 100644
--- a/web_src/css/modules/button.css
+++ b/web_src/css/modules/button.css
@@ -87,6 +87,13 @@ It needs some tricks to tweak the left/right borders with active state */
box-shadow: none;
}
+/* apply the vertical padding of .compact to non-compact buttons when they contain a svg as they
+ would otherwise appear too large. Seen on "RSS Feed" button on repo releases tab. */
+.ui.small.button:not(.compact):has(.svg) {
+ padding-top: 0.58928571em;
+ padding-bottom: 0.58928571em;
+}
+
.ui.labeled.button.disabled > .button,
.ui.basic.buttons .button,
.ui.basic.button {
From b295d0691f0eabe15c94b0ae7f21d0924986113e Mon Sep 17 00:00:00 2001
From: silverwind
Date: Wed, 28 Feb 2024 23:20:53 +0100
Subject: [PATCH 233/807] Fix/Improve `processWindowErrorEvent` (#29407)
- `e.error` can be undefined in some cases which would raise an error
inside this error handler, fixed that.
- The displayed message mentions looking into the console, but in my
case of error from `ResizeObserver` there was nothing there, so add this
logging. I think this logging was once there but got lost during
refactoring.
(cherry picked from commit 6d9b7253a2de00b5dfc27550cf7e015e819d6fd2)
---
web_src/js/bootstrap.js | 57 ++++++++++++++++++++++++++---------------
1 file changed, 36 insertions(+), 21 deletions(-)
diff --git a/web_src/js/bootstrap.js b/web_src/js/bootstrap.js
index e46c91e5e6..c0047b0ac2 100644
--- a/web_src/js/bootstrap.js
+++ b/web_src/js/bootstrap.js
@@ -1,5 +1,6 @@
// DO NOT IMPORT window.config HERE!
-// to make sure the error handler always works, we should never import `window.config`, because some user's custom template breaks it.
+// to make sure the error handler always works, we should never import `window.config`, because
+// some user's custom template breaks it.
// This sets up the URL prefix used in webpack's chunk loading.
// This file must be imported before any lazy-loading is being attempted.
@@ -26,29 +27,42 @@ export function showGlobalErrorMessage(msg) {
}
/**
- * @param {ErrorEvent} e
+ * @param {ErrorEvent|PromiseRejectionEvent} event - Event
+ * @param {string} event.message - Only present on ErrorEvent
+ * @param {string} event.error - Only present on ErrorEvent
+ * @param {string} event.type - Only present on ErrorEvent
+ * @param {string} event.filename - Only present on ErrorEvent
+ * @param {number} event.lineno - Only present on ErrorEvent
+ * @param {number} event.colno - Only present on ErrorEvent
+ * @param {string} event.reason - Only present on PromiseRejectionEvent
+ * @param {number} event.promise - Only present on PromiseRejectionEvent
*/
-function processWindowErrorEvent(e) {
- const err = e.error ?? e.reason;
+function processWindowErrorEvent({error, reason, message, type, filename, lineno, colno}) {
+ const err = error ?? reason;
const assetBaseUrl = String(new URL(__webpack_public_path__, window.location.origin));
+ const {runModeIsProd} = window.config ?? {};
- // error is likely from browser extension or inline script. Do not show these in production builds.
- if (!err.stack?.includes(assetBaseUrl) && window.config?.runModeIsProd) return;
-
- let message;
- if (e.type === 'unhandledrejection') {
- message = `JavaScript promise rejection: ${err.message}.`;
- } else {
- message = `JavaScript error: ${e.message} (${e.filename} @ ${e.lineno}:${e.colno}).`;
+ // `error` and `reason` are not guaranteed to be errors. If the value is falsy, it is likly a
+ // non-critical event from the browser. We log them but don't show them to users. Examples:
+ // - https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver#observation_errors
+ // - https://github.com/mozilla-mobile/firefox-ios/issues/10817
+ // - https://github.com/go-gitea/gitea/issues/20240
+ if (!err) {
+ if (message) console.error(new Error(message));
+ if (runModeIsProd) return;
}
- if (!e.error && e.lineno === 0 && e.colno === 0 && e.filename === '' && window.navigator.userAgent.includes('FxiOS/')) {
- // At the moment, Firefox (iOS) (10x) has an engine bug. See https://github.com/go-gitea/gitea/issues/20240
- // If a script inserts a newly created (and content changed) element into DOM, there will be a nonsense error event reporting: Script error: line 0, col 0.
- return; // ignore such nonsense error event
+ // If the error stack trace does not include the base URL of our script assets, it likely came
+ // from a browser extension or inline script. Do not show such errors in production.
+ if (err instanceof Error && !err.stack?.includes(assetBaseUrl) && runModeIsProd) {
+ return;
}
- showGlobalErrorMessage(`${message} Open browser console to see more details.`);
+ let msg = err?.message ?? message;
+ if (lineno) msg += ` (${filename} @ ${lineno}:${colno})`;
+ const dot = msg.endsWith('.') ? '' : '.';
+ const renderedType = type === 'unhandledrejection' ? 'promise rejection' : type;
+ showGlobalErrorMessage(`JavaScript ${renderedType}: ${msg}${dot} Open browser console to see more details.`);
}
function initGlobalErrorHandler() {
@@ -59,13 +73,14 @@ function initGlobalErrorHandler() {
if (!window.config) {
showGlobalErrorMessage(`Gitea JavaScript code couldn't run correctly, please check your custom templates`);
}
- // we added an event handler for window error at the very beginning of
+ {{if and (not .OpenProjects) (not .ClosedProjects)}}
+
+ {{ctx.Locale.Tr "repo.issues.new.no_items"}}
+
+ {{end}}
{{if .OpenProjects}}
From 097eb0802a38c370ef7594d7c99aa50148bfefb4 Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Mon, 4 Mar 2024 15:32:31 +0500
Subject: [PATCH 289/807] Fix repo unarchivation button
---
options/locale/locale_en-US.ini | 4 ++--
templates/repo/settings/options.tmpl | 8 +++++++-
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 8216a70cbe..070ab1cc05 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -2465,7 +2465,7 @@ settings.matrix.homeserver_url = Homeserver URL
settings.matrix.room_id = Room ID
settings.matrix.message_type = Message Type
settings.archive.button = Archive Repo
-settings.archive.header = Archive This Repo
+settings.archive.header = Archive this repo
settings.archive.text = Archiving the repo will make it entirely read-only. It will be hidden from the dashboard. Nobody (not even you!) will be able to make new commits, or open any issues or pull requests.
settings.archive.success = The repo was successfully archived.
settings.archive.error = An error occurred while trying to archive the repo. See the log for more details.
@@ -2473,7 +2473,7 @@ settings.archive.error_ismirror = You cannot archive a mirrored repo.
settings.archive.branchsettings_unavailable = Branch settings are not available if the repo is archived.
settings.archive.tagsettings_unavailable = Tag settings are not available if the repo is archived.
settings.archive.mirrors_unavailable = Mirrors are not available if the repo is archived.
-settings.unarchive.button = Unarchive repo
+settings.unarchive.button = Unarchive Repo
settings.unarchive.header = Unarchive this repo
settings.unarchive.text = Unarchiving the repo will restore its ability to receive commits and pushes, as well as new issues and pull-requests.
settings.unarchive.success = The repo was successfully unarchived.
diff --git a/templates/repo/settings/options.tmpl b/templates/repo/settings/options.tmpl
index fe2764aa83..2c4a924ba7 100644
--- a/templates/repo/settings/options.tmpl
+++ b/templates/repo/settings/options.tmpl
@@ -742,7 +742,13 @@
From 8f8b608fd70192a8e33b4632a69af1cdc619e9fd Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Sat, 9 Mar 2024 18:28:42 +0500
Subject: [PATCH 290/807] Add test to UI of archive/unarchive related actions
---
tests/integration/repo_archive_text_test.go | 76 +++++++++++++++++++++
1 file changed, 76 insertions(+)
create mode 100644 tests/integration/repo_archive_text_test.go
diff --git a/tests/integration/repo_archive_text_test.go b/tests/integration/repo_archive_text_test.go
new file mode 100644
index 0000000000..a14fdbf84f
--- /dev/null
+++ b/tests/integration/repo_archive_text_test.go
@@ -0,0 +1,76 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package integration
+
+import (
+ "net/http"
+ "net/url"
+ "path"
+ "strings"
+ "testing"
+
+ "code.gitea.io/gitea/models/unittest"
+ user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/translation"
+ "github.com/PuerkitoBio/goquery"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestArchiveText(t *testing.T) {
+ onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
+ testUser := "user2"
+ user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: testUser})
+ session := loginUser(t, testUser)
+ testRepoName := "archived_repo"
+ tr := translation.NewLocale("en-US")
+ link := path.Join(testUser, testRepoName, "settings")
+
+ // Create test repo
+ _, _, f := CreateDeclarativeRepo(t, user2, testRepoName, nil, nil, nil)
+ defer f()
+
+ // Test settings page
+ req := NewRequest(t, "GET", link)
+ resp := session.MakeRequest(t, req, http.StatusOK)
+ archivation := NewHTMLParser(t, resp.Body)
+ testRepoArchiveElements(t, tr, archivation, "archive")
+
+ // Archive repo
+ req = NewRequestWithValues(t, "POST", link, map[string]string{
+ "action": "archive",
+ "_csrf": GetCSRF(t, session, link),
+ })
+ _ = session.MakeRequest(t, req, http.StatusSeeOther)
+
+ // Test settings page again
+ req = NewRequest(t, "GET", link)
+ resp = session.MakeRequest(t, req, http.StatusOK)
+ unarchivation := NewHTMLParser(t, resp.Body)
+ testRepoArchiveElements(t, tr, unarchivation, "unarchive")
+ })
+}
+
+func testRepoArchiveElements(t *testing.T, tr translation.Locale, doc *HTMLDoc, opType string) {
+ t.Helper()
+
+ // Test danger section
+ section := doc.Find(".danger.segment .flex-list .flex-item:has(.button[data-modal='#archive-repo-modal'])")
+ testRepoArchiveElement(t, tr, section, ".flex-item-title", opType+".header")
+ testRepoArchiveElement(t, tr, section, ".flex-item-body", opType+".text")
+ testRepoArchiveElement(t, tr, section, ".button", opType+".button")
+
+ // Test modal
+ modal := doc.Find("#archive-repo-modal")
+ testRepoArchiveElement(t, tr, modal, ".header", opType+".header")
+ testRepoArchiveElement(t, tr, modal, ".message", opType+".text")
+ testRepoArchiveElement(t, tr, modal, ".button.red", opType+".button")
+}
+
+func testRepoArchiveElement(t *testing.T, tr translation.Locale, doc *goquery.Selection, selector, op string) {
+ t.Helper()
+
+ element := doc.Find(selector).Text()
+ element = strings.TrimSpace(element)
+ assert.Equal(t, tr.TrString("repo.settings."+op), element)
+}
From b2bc2335177a4f2b79711beb4e3cf3bc84684c24 Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Sun, 10 Mar 2024 17:15:59 +0500
Subject: [PATCH 291/807] Test pagination of repo stars, watchers and forks
based on code suggested in https://codeberg.org/forgejo/forgejo/pulls/2584#issuecomment-1647897 and https://codeberg.org/forgejo/forgejo/pulls/2584#issuecomment-1655289
Co-authored-by: Gusted
---
modules/setting/repository.go | 4 +-
tests/integration/repo_pagination_test.go | 83 +++++++++++++++++++++++
2 files changed, 85 insertions(+), 2 deletions(-)
create mode 100644 tests/integration/repo_pagination_test.go
diff --git a/modules/setting/repository.go b/modules/setting/repository.go
index 8f8c82b004..65f8d11b8d 100644
--- a/modules/setting/repository.go
+++ b/modules/setting/repository.go
@@ -24,10 +24,10 @@ var RecognisedRepositoryDownloadOrCloneMethods = []string{"download-zip", "downl
// MaxUserCardsPerPage sets maximum amount of watchers and stargazers shown per page
// those pages use 2 or 3 column layout, so the value should be divisible by 2 and 3
-const MaxUserCardsPerPage = 36
+var MaxUserCardsPerPage = 36
// MaxForksPerPage sets maximum amount of forks shown per page
-const MaxForksPerPage = 40
+var MaxForksPerPage = 40
// Repository settings
var (
diff --git a/tests/integration/repo_pagination_test.go b/tests/integration/repo_pagination_test.go
new file mode 100644
index 0000000000..81cc191dce
--- /dev/null
+++ b/tests/integration/repo_pagination_test.go
@@ -0,0 +1,83 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package integration
+
+import (
+ "net/http"
+ "path"
+ "testing"
+
+ repo_model "code.gitea.io/gitea/models/repo"
+ "code.gitea.io/gitea/models/unittest"
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/test"
+ "code.gitea.io/gitea/tests"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestRepoPaginations(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+
+ t.Run("Fork", func(t *testing.T) {
+ // Make forks of user2/repo1
+ session := loginUser(t, "user2")
+ testRepoFork(t, session, "user2", "repo1", "org3", "repo1")
+ session = loginUser(t, "user5")
+ testRepoFork(t, session, "user2", "repo1", "org6", "repo1")
+
+ unittest.AssertCount(t, &repo_model.Repository{ForkID: 1}, 2)
+
+ testRepoPagination(t, session, "user2/repo1", "forks", &setting.MaxForksPerPage)
+ })
+ t.Run("Stars", func(t *testing.T) {
+ // Add stars to user2/repo1.
+ session := loginUser(t, "user2")
+ req := NewRequestWithValues(t, "POST", "/user2/repo1/action/star", map[string]string{
+ "_csrf": GetCSRF(t, session, "/user2/repo1"),
+ })
+ session.MakeRequest(t, req, http.StatusOK)
+
+ session = loginUser(t, "user1")
+ req = NewRequestWithValues(t, "POST", "/user2/repo1/action/star", map[string]string{
+ "_csrf": GetCSRF(t, session, "/user2/repo1"),
+ })
+ session.MakeRequest(t, req, http.StatusOK)
+
+ testRepoPagination(t, session, "user2/repo1", "stars", &setting.MaxUserCardsPerPage)
+ })
+ t.Run("Watcher", func(t *testing.T) {
+ // user2/repo2 is watched by its creator user2. Watch it by user1 to make it watched by 2 users.
+ session := loginUser(t, "user1")
+ req := NewRequestWithValues(t, "POST", "/user2/repo2/action/watch", map[string]string{
+ "_csrf": GetCSRF(t, session, "/user2/repo2"),
+ })
+ session.MakeRequest(t, req, http.StatusOK)
+
+ testRepoPagination(t, session, "user2/repo2", "watchers", &setting.MaxUserCardsPerPage)
+ })
+}
+
+func testRepoPagination(t *testing.T, session *TestSession, repo, kind string, mockableVar *int) {
+ t.Run("Should paginate", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ defer test.MockVariableValue(mockableVar, 1)()
+ req := NewRequest(t, "GET", "/"+path.Join(repo, kind))
+ resp := session.MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+
+ paginationButton := htmlDoc.Find(".item.navigation[href='/" + path.Join(repo, kind) + "?page=2']")
+ // Next and Last button.
+ assert.Equal(t, 2, paginationButton.Length())
+ })
+
+ t.Run("Shouldn't paginate", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ defer test.MockVariableValue(mockableVar, 2)()
+ req := NewRequest(t, "GET", "/"+path.Join(repo, kind))
+ resp := session.MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+
+ htmlDoc.AssertElement(t, ".item.navigation[href='/"+path.Join(repo, kind)+"?page=2']", false)
+ })
+}
From 578f0b3335018c2b024c88935570b9c5cae99769 Mon Sep 17 00:00:00 2001
From: Gusted
Date: Sun, 10 Mar 2024 14:50:56 +0100
Subject: [PATCH 292/807] [DEPS] Bump mysql driver
- Bump the SQL driver for MySQL to
[v1.8.0](https://github.com/go-sql-driver/mysql/releases/tag/v1.8.0),
which notably includes support for ed25519 authentication scheme (by
yours truly).
- Resolves #1868
---
assets/go-licenses.json | 5 +++++
go.mod | 3 ++-
go.sum | 6 ++++--
3 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/assets/go-licenses.json b/assets/go-licenses.json
index 2aab21595b..ad3ab6c4c1 100644
--- a/assets/go-licenses.json
+++ b/assets/go-licenses.json
@@ -34,6 +34,11 @@
"path": "dario.cat/mergo/LICENSE",
"licenseText": "Copyright (c) 2013 Dario Castañé. All rights reserved.\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
+ {
+ "name": "filippo.io/edwards25519",
+ "path": "filippo.io/edwards25519/LICENSE",
+ "licenseText": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
+ },
{
"name": "git.sr.ht/~mariusor/go-xsd-duration",
"path": "git.sr.ht/~mariusor/go-xsd-duration/LICENSE",
diff --git a/go.mod b/go.mod
index 788bb9f392..a2bbb1dfd9 100644
--- a/go.mod
+++ b/go.mod
@@ -45,7 +45,7 @@ require (
github.com/go-git/go-billy/v5 v5.5.0
github.com/go-git/go-git/v5 v5.11.0
github.com/go-ldap/ldap/v3 v3.4.6
- github.com/go-sql-driver/mysql v1.7.1
+ github.com/go-sql-driver/mysql v1.8.0
github.com/go-swagger/go-swagger v0.30.5
github.com/go-testfixtures/testfixtures/v3 v3.9.0
github.com/go-webauthn/webauthn v0.10.0
@@ -123,6 +123,7 @@ require (
cloud.google.com/go/compute v1.23.3 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
dario.cat/mergo v1.0.0 // indirect
+ filippo.io/edwards25519 v1.1.0 // indirect
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
github.com/ClickHouse/ch-go v0.61.1 // indirect
github.com/ClickHouse/clickhouse-go/v2 v2.17.1 // indirect
diff --git a/go.sum b/go.sum
index 18e0aadd87..ceb999d230 100644
--- a/go.sum
+++ b/go.sum
@@ -48,6 +48,8 @@ connectrpc.com/connect v1.15.0/go.mod h1:bQmjpDY8xItMnttnurVgOkHUBMRT9cpsNi2O4Aj
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:cliQ4HHsCo6xi2oWZYKWW4bly/Ory9FuTpFPRxj/mAg=
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078/go.mod h1:g/V2Hjas6Z1UHUp4yIx6bATpNzJ7DYtD0FG3+xARWxs=
gitea.com/gitea/act v0.2.51 h1:gXc/B4OlTciTTzAx9cmNyw04n2SDO7exPjAsR5Idu+c=
@@ -342,8 +344,8 @@ github.com/go-openapi/validate v0.22.6/go.mod h1:eaddXSqKeTg5XpSmj1dYyFTK/95n/XH
github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-redis/redis/v8 v8.4.0/go.mod h1:A1tbYoHSa1fXwN+//ljcCYYJeLmVrwL9hbQN45Jdy0M=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
-github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/go-sql-driver/mysql v1.8.0 h1:UtktXaU2Nb64z/pLiGIxY4431SJ4/dR5cjMmlVHgnT4=
+github.com/go-sql-driver/mysql v1.8.0/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-swagger/go-swagger v0.30.5 h1:SQ2+xSonWjjoEMOV5tcOnZJVlfyUfCBhGQGArS1b9+U=
github.com/go-swagger/go-swagger v0.30.5/go.mod h1:cWUhSyCNqV7J1wkkxfr5QmbcnCewetCdvEXqgPvbc/Q=
github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0=
From 671a4ff40210d1ca01d3d5024bcc53a178cf66b9 Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Sun, 10 Mar 2024 19:10:29 +0500
Subject: [PATCH 293/807] [I18N] Improve English names & consistency
---
options/locale/locale_en-US.ini | 167 ++++++++++++++++----------------
templates/install.tmpl | 2 +-
2 files changed, 85 insertions(+), 84 deletions(-)
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 8216a70cbe..4c5d9f1b8d 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -210,15 +210,15 @@ license_desc = Go get documentation before changing any settings.
require_db_desc = Forgejo requires MySQL, PostgreSQL, MSSQL, SQLite3 or TiDB (MySQL protocol).
-db_title = Database Settings
-db_type = Database Type
+db_title = Database settings
+db_type = Database type
host = Host
user = Username
password = Password
-db_name = Database Name
+db_name = Database name
db_schema = Schema
db_schema_helper = Leave blank for database default ("public").
ssl_mode = SSL
@@ -237,61 +237,62 @@ err_admin_name_is_reserved = Administrator Username is invalid, username is rese
err_admin_name_pattern_not_allowed = Administrator username is invalid, the username matches a reserved pattern
err_admin_name_is_invalid = Administrator Username is invalid
-general_title = General Settings
-app_name = Site Title
+general_title = General settings
+app_name = Instance name
app_name_helper = You can enter your company name here.
-repo_path = Repository Root Path
+repo_path = Repository root path
repo_path_helper = Remote Git repositories will be saved to this directory.
-lfs_path = Git LFS Root Path
+lfs_path = Git LFS root path
lfs_path_helper = Files tracked by Git LFS will be stored in this directory. Leave empty to disable.
-run_user = Run As Username
+run_user = User to run as
run_user_helper = The operating system username that Forgejo runs as. Note that this user must have access to the repository root path.
-domain = Server Domain
+domain = Server domain
domain_helper = Domain or host address for the server.
-ssh_port = SSH Server Port
-ssh_port_helper = Port number your SSH server listens on. Leave empty to disable.
-http_port = Forgejo HTTP Listen Port
-http_port_helper = Port number the Forgejos web server will listen on.
-app_url = Forgejo Base URL
+ssh_port = SSH server port
+ssh_port_helper = Port number that will be used by the SSH server. Leave empty to disable SSH server.
+http_port = HTTP listen port
+http_port_helper = Port number that will be used by the Forgejo web server.
+app_url = Base URL
app_url_helper = Base address for HTTP(S) clone URLs and email notifications.
-log_root_path = Log Path
+log_root_path = Log path
log_root_path_helper = Log files will be written to this directory.
-optional_title = Optional Settings
-email_title = Email Settings
-smtp_addr = SMTP Host
-smtp_port = SMTP Port
-smtp_from = Send Email As
+optional_title = Optional settings
+email_title = Email settings
+smtp_addr = SMTP host
+smtp_port = SMTP port
+smtp_from = Send email as
smtp_from_invalid = The "Send Email As" address is invalid
smtp_from_helper = Email address Forgejo will use. Enter a plain email address or use the "Name" format.
-mailer_user = SMTP Username
-mailer_password = SMTP Password
-register_confirm = Require Email Confirmation to Register
-mail_notify = Enable Email Notifications
-server_service_title = Server and Third-Party Service Settings
-offline_mode = Enable Local Mode
+mailer_user = SMTP username
+mailer_password = SMTP password
+register_confirm = Require email confirmation to register
+mail_notify = Enable email notifications
+server_service_title = Server and third-party service settings
+offline_mode = Enable local mode
offline_mode_popup = Disable third-party content delivery networks and serve all resources locally.
disable_gravatar = Disable Gravatar
disable_gravatar_popup = Disable Gravatar and third-party avatar sources. A default avatar will be used unless a user locally uploads an avatar.
-federated_avatar_lookup = Enable Federated Avatars
+federated_avatar_lookup = Enable federated avatars
federated_avatar_lookup_popup = Enable federated avatar lookup using Libravatar.
-disable_registration = Disable Self-Registration
+disable_registration = Disable self-registration
disable_registration_popup = Disable user self-registration. Only administrators will be able to create new user accounts.
-allow_only_external_registration_popup = Allow Registration Only Through External Services
-openid_signin = Enable OpenID Sign-In
+allow_only_external_registration_popup = Allow registration only through external services
+openid_signin = Enable OpenID sign-in
openid_signin_popup = Enable user sign-in via OpenID.
-openid_signup = Enable OpenID Self-Registration
+openid_signup = Enable OpenID self-registration
openid_signup_popup = Enable OpenID-based user self-registration.
enable_captcha = Enable registration CAPTCHA
enable_captcha_popup = Require a CAPTCHA for user self-registration.
-require_sign_in_view = Require Sign-In to View Pages
+require_sign_in_view = Require to sign-in to view instance content
require_sign_in_view_popup = Limit page access to signed-in users. Visitors will only see the sign-in and registration pages.
admin_setting_desc = Creating an administrator account is optional. The first registered user will automatically become an administrator.
-admin_title = Administrator Account Settings
-admin_name = Administrator Username
+admin_title = Administrator account settings
+admin_name = Administrator username
admin_password = Password
-confirm_password = Confirm Password
-admin_email = Email Address
+confirm_password = Confirm password
+admin_email = Email address
+config_location_hint = These configuration options will be saved in:
install_btn_confirm = Install Forgejo
test_git_failed = Could not test "git" command: %v
sqlite3_not_available = This Forgejo version does not support SQLite3. Please download the official binary version from %s (not the "gobuild" version).
@@ -303,22 +304,22 @@ run_user_not_match = The "run as" username is not the current username: %s -> %s
internal_token_failed = Failed to generate internal token: %v
secret_key_failed = Failed to generate secret key: %v
save_config_failed = Failed to save configuration: %v
-enable_update_checker_helper_forgejo = Periodically checks for new Forgejo versions by checking a DNS TXT record at release.forgejo.org.
+enable_update_checker_helper_forgejo = It will periodically check for new Forgejo versions by checking a TXT DNS record at release.forgejo.org.
invalid_admin_setting = Administrator account setting is invalid: %v
invalid_log_root_path = The log path is invalid: %v
-default_keep_email_private = Hide Email Addresses by Default
+default_keep_email_private = Hide email addresses by default
default_keep_email_private_popup = Hide email addresses of new user accounts by default.
-default_allow_create_organization = Allow Creation of Organizations by Default
+default_allow_create_organization = Allow creation of organizations by default
default_allow_create_organization_popup = Allow new user accounts to create organizations by default.
-default_enable_timetracking = Enable Time Tracking by Default
+default_enable_timetracking = Enable time tracking by default
default_enable_timetracking_popup = Enable time tracking for new repositories by default.
allow_dots_in_usernames = Allow users to use dots in their usernames. Doesn't affect existing accounts.
-no_reply_address = Hidden Email Domain
+no_reply_address = Hidden email domain
no_reply_address_helper = Domain name for users with a hidden email address. For example, the username "joe" will be logged in Git as "joe@noreply.example.org" if the hidden email domain is set to "noreply.example.org".
-password_algorithm = Password Hash Algorithm
+password_algorithm = Password hash algorithm
invalid_password_algorithm = Invalid password hash algorithm
password_algorithm_helper = Set the password hashing algorithm. Algorithms have differing requirements and strength. The argon2 algorithm is rather secure but uses a lot of memory and may be inappropriate for small systems.
-enable_update_checker = Enable Update Checker
+enable_update_checker = Enable update checker
enable_update_checker_helper = Checks for new version releases periodically by connecting to gitea.io.
env_config_keys = Environment Configuration
env_config_keys_prompt = The following environment variables will also be applied to your configuration file:
@@ -504,13 +505,13 @@ release.downloads = Downloads:
release.download.zip = Source Code (ZIP)
release.download.targz = Source Code (TAR.GZ)
-repo.transfer.subject_to = %s would like to transfer "%s" to %s
-repo.transfer.subject_to_you = %s would like to transfer "%s" to you
+repo.transfer.subject_to = %s wants to transfer repository "%s" to %s
+repo.transfer.subject_to_you = %s wants to transfer repository "%s" to you
repo.transfer.to_you = you
repo.transfer.body = To accept or reject it visit %s or just ignore it.
-repo.collaborator.added.subject = %s added you to %s
-repo.collaborator.added.text = You have been added as a collaborator of repository:
+repo.collaborator.added.subject = %s added you to %s as collaborator
+repo.collaborator.added.text = You have been added as a collaborator to repository:
team_invite.subject = %[1]s has invited you to join the %[2]s organization
team_invite.text_1 = %[1]s has invited you to join team %[2]s in organization %[3]s.
@@ -1924,8 +1925,8 @@ milestones.edit_success = Milestone "%s" has been updated.
milestones.deletion = Delete Milestone
milestones.deletion_desc = Deleting a milestone removes it from all related issues. Continue?
milestones.deletion_success = The milestone has been deleted.
-milestones.filter_sort.earliest_due_data = Earliest due date
-milestones.filter_sort.latest_due_date = Latest due date
+milestones.filter_sort.earliest_due_data = Nearest due date
+milestones.filter_sort.latest_due_date = Farthest due date
milestones.filter_sort.least_complete = Least complete
milestones.filter_sort.most_complete = Most complete
milestones.filter_sort.most_issues = Most issues
@@ -2134,8 +2135,8 @@ settings.tracker_issue_style.regexp = Regular Expression
settings.tracker_issue_style.regexp_pattern = Regular Expression Pattern
settings.tracker_issue_style.regexp_pattern_desc = The first captured group will be used in place of {index}.
settings.tracker_url_format_desc = Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index.
-settings.enable_timetracker = Enable Time Tracking
-settings.allow_only_contributors_to_track_time = Let Only Contributors Track Time
+settings.enable_timetracker = Enable time tracking
+settings.allow_only_contributors_to_track_time = Let only contributors track time
settings.pulls_desc = Enable Repository Pull Requests
settings.pulls.ignore_whitespace = Ignore Whitespace for Conflicts
settings.pulls.enable_autodetect_manual_merge = Enable autodetect manual merge (Note: In some special cases, misjudgments can occur)
@@ -2937,7 +2938,7 @@ users.edit_account = Edit User Account
users.max_repo_creation = Maximum Number of Repositories
users.max_repo_creation_desc = (Enter -1 to use the global default limit.)
users.is_activated = User Account Is Activated
-users.prohibit_login = Disable Sign-In
+users.prohibit_login = Disable sign-in
users.is_admin = Is Administrator
users.is_restricted = Is Restricted
users.allow_git_hook = May Create Git Hooks
@@ -3064,12 +3065,12 @@ auths.map_group_to_team = Map LDAP groups to Organization teams (leave the field
auths.map_group_to_team_removal = Remove users from synchronized teams if user does not belong to corresponding LDAP group
auths.enable_ldap_groups = Enable LDAP groups
auths.ms_ad_sa = MS AD Search Attributes
-auths.smtp_auth = SMTP Authentication Type
-auths.smtphost = SMTP Host
-auths.smtpport = SMTP Port
+auths.smtp_auth = SMTP authentication type
+auths.smtphost = SMTP host
+auths.smtpport = SMTP port
auths.allowed_domains = Allowed Domains
auths.allowed_domains_helper = Leave empty to allow all domains. Separate multiple domains with a comma (",").
-auths.skip_tls_verify = Skip TLS Verify
+auths.skip_tls_verify = Skip TLS verification
auths.force_smtps = Force SMTPS
auths.force_smtps_helper = SMTPS is always used on port 465. Set this to force SMTPS on other ports. (Otherwise STARTTLS will be used on other ports if it is supported by the host.)
auths.helo_hostname = HELO Hostname
@@ -3144,40 +3145,40 @@ auths.unable_to_initialize_openid = Unable to initialize OpenID Connect Provider
auths.invalid_openIdConnectAutoDiscoveryURL = Invalid Auto Discovery URL (this must be a valid URL starting with http:// or https://)
config.server_config = Server configuration
-config.app_name = Site Title
-config.app_ver = Forgejo Version
-config.app_url = Forgejo Base URL
-config.custom_conf = Configuration File Path
-config.custom_file_root_path = Custom File Root Path
-config.domain = Server Domain
-config.offline_mode = Local Mode
-config.disable_router_log = Disable Router Log
-config.run_user = Run As Username
-config.run_mode = Run Mode
-config.git_version = Git Version
-config.app_data_path = App Data Path
-config.repo_root_path = Repository Root Path
-config.lfs_root_path = LFS Root Path
-config.log_file_root_path = Log Path
-config.script_type = Script Type
-config.reverse_auth_user = Reverse Authentication User
+config.app_name = Instance title
+config.app_ver = Forgejo version
+config.app_url = Base URL
+config.custom_conf = Configuration file path
+config.custom_file_root_path = Custom file root path
+config.domain = Server domain
+config.offline_mode = Local mode
+config.disable_router_log = Disable router log
+config.run_user = User to run as
+config.run_mode = Run mode
+config.git_version = Git version
+config.app_data_path = App data path
+config.repo_root_path = Repository root path
+config.lfs_root_path = LFS root path
+config.log_file_root_path = Log path
+config.script_type = Script type
+config.reverse_auth_user = Reverse authentication user
config.ssh_config = SSH configuration
config.ssh_enabled = Enabled
-config.ssh_start_builtin_server = Use Built-In Server
-config.ssh_domain = SSH Server Domain
+config.ssh_start_builtin_server = Use built-in server
+config.ssh_domain = SSH server domain
config.ssh_port = Port
-config.ssh_listen_port = Listen Port
-config.ssh_root_path = Root Path
-config.ssh_key_test_path = Key Test Path
-config.ssh_keygen_path = Keygen ("ssh-keygen") Path
-config.ssh_minimum_key_size_check = Minimum Key Size Check
-config.ssh_minimum_key_sizes = Minimum Key Sizes
+config.ssh_listen_port = Listen port
+config.ssh_root_path = Root path
+config.ssh_key_test_path = Key test path
+config.ssh_keygen_path = Keygen ("ssh-keygen") path
+config.ssh_minimum_key_size_check = Minimum key size check
+config.ssh_minimum_key_sizes = Minimum key sizes
config.lfs_config = LFS configuration
config.lfs_enabled = Enabled
config.lfs_content_path = LFS content path
-config.lfs_http_auth_expiry = LFS HTTP auth expiry
+config.lfs_http_auth_expiry = LFS HTTP auth expiration time
config.db_config = Database configuration
config.db_type = Type
diff --git a/templates/install.tmpl b/templates/install.tmpl
index c18f25f79c..b3aea39ee5 100644
--- a/templates/install.tmpl
+++ b/templates/install.tmpl
@@ -336,7 +336,7 @@
- These configuration options will be written into: {{.CustomConfFile}}
+ {{ctx.Locale.Tr "install.config_location_hint"}} {{.CustomConfFile}}
{{ctx.Locale.Tr "install.install_btn_confirm"}}
From faa6cb62f723472ae26c91f23ff2d3783ebd6356 Mon Sep 17 00:00:00 2001
From: 0ko <0ko@noreply.codeberg.org>
Date: Sun, 10 Mar 2024 19:32:58 +0500
Subject: [PATCH 294/807] Fix gaps for org homepage tabs
---
web_src/css/dashboard.css | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/web_src/css/dashboard.css b/web_src/css/dashboard.css
index 51ddd45e31..57ddb80bc6 100644
--- a/web_src/css/dashboard.css
+++ b/web_src/css/dashboard.css
@@ -82,6 +82,14 @@
padding-right: 0.5rem;
}
+.dashboard .dashboard-navbar .right.menu {
+ gap: .35714286em;
+}
+
+.dashboard .dashboard-navbar .right.menu div.item {
+ padding-left: 0.5rem;
+}
+
.dashboard .dashboard-navbar .org-visibility .label {
margin-left: 5px;
}
From 3b2f28ff1cc20f74e6c2274007bf89289e32030c Mon Sep 17 00:00:00 2001
From: Shiny Nematoda
Date: Sun, 10 Mar 2024 15:35:30 +0000
Subject: [PATCH 295/807] [PORT] Fix wrong line number in code search result
(gitea#29260) (#2619)
Port [Fix wrong line number in code search result (gitea#29260)](https://github.com/go-gitea/gitea/pull/29260)
PS: also added [`-e`](https://git-scm.com/docs/git-grep#Documentation/git-grep.txt--e) before passing the keyword (my bad)
Co-authored-by: yp05327 <576951401@qq.com>
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/2619
Reviewed-by: Earl Warren
Co-authored-by: Shiny Nematoda
Co-committed-by: Shiny Nematoda
---
modules/indexer/code/search.go | 50 +++++++++++++++---------
services/repository/files/search.go | 45 +++++++++++++++------
services/repository/files/search_test.go | 18 +++++----
templates/code/searchresults.tmpl | 15 +------
templates/repo/search.tmpl | 15 +------
templates/shared/searchfile.tmpl | 14 +++++++
6 files changed, 90 insertions(+), 67 deletions(-)
create mode 100644 templates/shared/searchfile.tmpl
diff --git a/modules/indexer/code/search.go b/modules/indexer/code/search.go
index e19e22eea0..2ddc2397fa 100644
--- a/modules/indexer/code/search.go
+++ b/modules/indexer/code/search.go
@@ -16,14 +16,18 @@ import (
// Result a search result to display
type Result struct {
- RepoID int64
- Filename string
- CommitID string
- UpdatedUnix timeutil.TimeStamp
- Language string
- Color string
- LineNumbers []int
- FormattedLines template.HTML
+ RepoID int64
+ Filename string
+ CommitID string
+ UpdatedUnix timeutil.TimeStamp
+ Language string
+ Color string
+ Lines []ResultLine
+}
+
+type ResultLine struct {
+ Num int
+ FormattedContent template.HTML
}
type SearchResultLanguages = internal.SearchResultLanguages
@@ -70,7 +74,7 @@ func searchResult(result *internal.SearchResult, startIndex, endIndex int) (*Res
var formattedLinesBuffer bytes.Buffer
contentLines := strings.SplitAfter(result.Content[startIndex:endIndex], "\n")
- lineNumbers := make([]int, len(contentLines))
+ lines := make([]ResultLine, 0, len(contentLines))
index := startIndex
for i, line := range contentLines {
var err error
@@ -93,21 +97,29 @@ func searchResult(result *internal.SearchResult, startIndex, endIndex int) (*Res
return nil, err
}
- lineNumbers[i] = startLineNum + i
+ lines = append(lines, ResultLine{Num: startLineNum + i})
index += len(line)
}
- highlighted, _ := highlight.Code(result.Filename, "", formattedLinesBuffer.String())
+ // we should highlight the whole code block first, otherwise it doesn't work well with multiple line highlighting
+ hl, _ := highlight.Code(result.Filename, "", formattedLinesBuffer.String())
+ highlightedLines := strings.Split(string(hl), "\n")
+
+ // The lines outputted by highlight.Code might not match the original lines, because "highlight" removes the last `\n`
+ lines = lines[:min(len(highlightedLines), len(lines))]
+ highlightedLines = highlightedLines[:len(lines)]
+ for i := 0; i < len(lines); i++ {
+ lines[i].FormattedContent = template.HTML(highlightedLines[i])
+ }
return &Result{
- RepoID: result.RepoID,
- Filename: result.Filename,
- CommitID: result.CommitID,
- UpdatedUnix: result.UpdatedUnix,
- Language: result.Language,
- Color: result.Color,
- LineNumbers: lineNumbers,
- FormattedLines: highlighted,
+ RepoID: result.RepoID,
+ Filename: result.Filename,
+ CommitID: result.CommitID,
+ UpdatedUnix: result.UpdatedUnix,
+ Language: result.Language,
+ Color: result.Color,
+ Lines: lines,
}, nil
}
diff --git a/services/repository/files/search.go b/services/repository/files/search.go
index f8317c4892..09c3ab5bf3 100644
--- a/services/repository/files/search.go
+++ b/services/repository/files/search.go
@@ -16,14 +16,18 @@ import (
)
type Result struct {
- RepoID int64 // ignored
- Filename string
- CommitID string // branch
- UpdatedUnix timeutil.TimeStamp // ignored
- Language string
- Color string
- LineNumbers []int64
- FormattedLines template.HTML
+ RepoID int64 // ignored
+ Filename string
+ CommitID string // branch
+ UpdatedUnix timeutil.TimeStamp // ignored
+ Language string
+ Color string
+ Lines []ResultLine
+}
+
+type ResultLine struct {
+ Num int64
+ FormattedContent template.HTML
}
const pHEAD = "HEAD:"
@@ -46,7 +50,8 @@ func NewRepoGrep(ctx context.Context, repo *repo_model.Repository, keyword strin
"-n", // line nums
"-i", // ignore case
"--full-name", // full file path, rel to repo
- //"--column", // for adding better highlighting support
+ //"--column", // for adding better highlighting support
+ "-e", // for queries starting with "-"
).
AddDynamicArguments(keyword).
AddArguments("HEAD").
@@ -57,6 +62,8 @@ func NewRepoGrep(ctx context.Context, repo *repo_model.Repository, keyword strin
for _, block := range strings.Split(stdout, "\n\n") {
res := Result{CommitID: repo.DefaultBranch}
+
+ linenum := []int64{}
code := []string{}
for _, line := range strings.Split(block, "\n") {
@@ -71,18 +78,32 @@ func NewRepoGrep(ctx context.Context, repo *repo_model.Repository, keyword strin
continue
}
- res.LineNumbers = append(res.LineNumbers, i)
+ linenum = append(linenum, i)
code = append(code, after)
}
}
- if res.Filename == "" || len(code) == 0 || len(res.LineNumbers) == 0 {
+ if res.Filename == "" || len(code) == 0 || len(linenum) == 0 {
continue
}
- res.FormattedLines, res.Language = highlight.Code(res.Filename, "", strings.Join(code, "\n"))
+ var hl template.HTML
+
+ hl, res.Language = highlight.Code(res.Filename, "", strings.Join(code, "\n"))
res.Color = enry.GetColor(res.Language)
+ hlCode := strings.Split(string(hl), "\n")
+ n := min(len(hlCode), len(linenum))
+
+ res.Lines = make([]ResultLine, n)
+
+ for i := 0; i < n; i++ {
+ res.Lines[i] = ResultLine{
+ Num: linenum[i],
+ FormattedContent: template.HTML(hlCode[i]),
+ }
+ }
+
data = append(data, &res)
}
diff --git a/services/repository/files/search_test.go b/services/repository/files/search_test.go
index 959ddaa9f9..2f2f87368d 100644
--- a/services/repository/files/search_test.go
+++ b/services/repository/files/search_test.go
@@ -25,14 +25,16 @@ func TestNewRepoGrep(t *testing.T) {
expected := []*Result{
{
- RepoID: 0,
- Filename: "README.md",
- CommitID: "master",
- UpdatedUnix: 0,
- Language: "Markdown",
- Color: "#083fa1",
- LineNumbers: []int64{2, 3},
- FormattedLines: "\nDescription for repo1",
+ RepoID: 0,
+ Filename: "README.md",
+ CommitID: "master",
+ UpdatedUnix: 0,
+ Language: "Markdown",
+ Color: "#083fa1",
+ Lines: []ResultLine{
+ {Num: 2, FormattedContent: ""},
+ {Num: 3, FormattedContent: "Description for repo1"},
+ },
},
}
diff --git a/templates/code/searchresults.tmpl b/templates/code/searchresults.tmpl
index bb21a5e0dc..dca7dea7da 100644
--- a/templates/code/searchresults.tmpl
+++ b/templates/code/searchresults.tmpl
@@ -22,20 +22,7 @@
{{ctx.Locale.Tr "repo.diff.view_file"}}
{{if $showFileViewToggle}}
{{/* for image or CSV, it can have a horizontal scroll bar, there won't be review comment context menu (position absolute) which would be clipped by "overflow" */}}
-