%[2]s
vers %[3]s
pulls.merged_title_desc_few=a fusionné %[1]d révision(s) à partir de %[2]s
vers %[3]s
%[4]s
-pulls.change_target_branch_at=`a remplacée la branche cible main
, release/**
+settings.protect_branch_name_pattern_desc=Motifs de nom de branche protégé. Consultez la documentation pour la syntaxe du motif. Exemples : main, release/**
settings.protect_patterns=Motifs
settings.protect_protected_file_patterns=Liste des fichiers et motifs protégés (séparés par un point virgule ";") :
-settings.protect_protected_file_patterns_desc=Les fichiers protégés ne peuvent être modifiés, même si l'utilisateur a le droit d'ajouter, éditer ou supprimer des fichiers dans cette branche. Plusieurs motifs peuvent être séparés par un point-virgule (;). Voir la documentation de github.com/gobwas/glob pour la syntaxe des motifs. Exemples: .forgejo/workflows/test.yml
, /docs/**/*.txt
. ; », qui ne pourront pas être modifiés même si les utilisateurs disposent des droits sur la branche. Voir la syntaxe glob. Exemples : .drone.yml ; /docs/**/*.txt
.
+settings.protect_protected_file_patterns_desc=Les fichiers protégés ne peuvent être modifiés, même si l'utilisateur a le droit d'ajouter, éditer ou supprimer des fichiers dans cette branche. Plusieurs motifs peuvent être séparés par un point-virgule ( ;). Voir la documentation de github.com/gobwas/glob pour la syntaxe des motifs. Exemples : .forgejo/workflows/test.yml
, /docs/**/*.txt
.
settings.protect_unprotected_file_patterns=Liste des fichiers et motifs exclus (séparés par un point virgule ";") :
-settings.protect_unprotected_file_patterns_desc=Les fichiers non-protégés qui peuvent être modifiés si l'utilisateur a le droit d'écriture, prenant le pas sur les restrictions de push. Plusieurs motifs peuvent être séparés par un point-virgule (;). Voir la documentation de github.com/gobwas/glob pour la syntaxe des motifs. Exemples: .forgejo/workflows/test.yml
, /docs/**/*.txt
. ; », qui pourront être modifiés malgré la protection de branche, par les utilisateurs autorisés. Voir la syntaxe Glob. Exemples : .drone.yml ; /docs/**/*.txt
.
+settings.protect_unprotected_file_patterns_desc=Les fichiers non-protégés qui peuvent être modifiés si l'utilisateur a le droit d'écriture, prenant le pas sur les restrictions de push. Plusieurs motifs peuvent être séparés par un point-virgule ( ;). Voir la documentation de github.com/gobwas/glob pour la syntaxe des motifs. Exemples : .forgejo/workflows/test.yml
, /docs/**/*.txt
.
settings.add_protected_branch=Activer la protection
settings.delete_protected_branch=Désactiver la protection
settings.update_protect_branch_success=La règle de protection de branche "%s" a été mise à jour.
@@ -2454,7 +2455,7 @@ settings.matrix.room_id=ID de la salle
settings.matrix.message_type=Type de message
settings.archive.button=Archiver ce dépôt
settings.archive.header=Archiver ce dépôt
-settings.archive.text=Archiver un dépôt le place en lecture seule et le cache des tableaux de bord. Personne ne pourra faire de nouvelles révisions, d'ouvrir des tickets ou des demandes d'ajouts (pas même vous!).
+settings.archive.text=Archiver un dépôt le place en lecture seule et le cache des tableaux de bord. Personne ne pourra faire de nouvelles révisions, d'ouvrir des tickets ou des demandes d'ajouts (pas même vous !).
settings.archive.success=Ce dépôt a été archivé avec succès.
settings.archive.error=Une erreur s'est produite lors de l'archivage du dépôt. Voir le journal pour plus de détails.
settings.archive.error_ismirror=Vous ne pouvez pas archiver un dépôt en miroir.
@@ -2516,7 +2517,7 @@ diff.whitespace_ignore_all_whitespace=Ignorer les espaces lors de la comparaison
diff.whitespace_ignore_amount_changes=Ignorer les changements quand ce sont des espaces
diff.whitespace_ignore_at_eol=Ignorer les blancs en fin de ligne
diff.stats_desc= %d fichiers modifiés avec %d ajouts et %d suppressions
-diff.stats_desc_file=%d modifications: %d ajouts et %d suppressions
+diff.stats_desc_file=%d modifications : %d ajouts et %d suppressions
diff.bin=BIN
diff.bin_not_shown=Fichier binaire non affiché.
diff.view_file=Voir le fichier
@@ -2686,7 +2687,7 @@ settings.ignore_stale_approvals_desc = Ne pas prendre en compte les approbations
settings.archive.mirrors_unavailable = Les mirroirs ne sont pas disponibles si le dépôt a été archivé.
pulls.commit_ref_at = `a référencé cette pull request depuis le commit %[2]s`
settings.new_owner_blocked_doer = Le nouveau propriétaire vous a bloqué.
-settings.enter_repo_name = Confirmez en entrant le propriétaire et le nom du dépôt exactement comme affiché :
+settings.enter_repo_name = Confirmez en entrant le propriétaire et le nom du dépôt exactement comme affiché :
settings.wiki_rename_branch_main = Normalise le nom de la branche du Wiki
settings.wiki_rename_branch_main_desc = Renommer la branche utilisée en interne par le Wiki en "%s". Cette modification est permanente et ne peut être annulée.
settings.wiki_rename_branch_main_notices_2 = Cela changera le nom de la branche interne associée au dépôt du wiki %s de façon permanente. Les checkouts existant devront être mis à jour.
@@ -2742,7 +2743,7 @@ settings.sourcehut_builds.graphql_url = URL GraphQL (e.g. https://builds.sr.ht/q
release.download_count_one = %s téléchargement
release.download_count_few = %s téléchargements
release.system_generated = Cet attachement a été généré automatiquement.
-settings.enforce_on_admins_desc = Les administrateurs du dépôt ne peuvent pas passer outre cette règle
+settings.enforce_on_admins_desc = Les administrateurs du dépôt ne peuvent pas passer outre cette règle.
settings.web_hook_name_sourcehut_builds = Builds SourceHut
settings.enforce_on_admins = Appliquer cette règles aux administrateurs du dépôt
settings.rename_branch_failed_protected = Impossible de renommer la branche %s car il s'agit d'une branche protégée.
@@ -2753,6 +2754,8 @@ settings.sourcehut_builds.access_token_helper = Un jeton d'accès ayant des perm
settings.matrix.access_token_helper = Il est recommandé de créer un compte Matrix dédié pour cela. Le jeton d'accès peut être obtenu depuis le client web Element (dans un onglet privé/incognito). Il faut ensuite fermer l'onglet privé/icognito (se déconnecter invaliderait le jeton).
release.hide_archive_links = Masquer les archives générées automatiquement
release.hide_archive_links_helper = Masquer les archives de code source générées automatiquement pour cette publication. Par exemple, si vous téléchargez vos propres archives.
+settings.transfer.button = Changer de propriétaire
+settings.transfer.modal.title = Changer de propriétaire
[graphs]
component_loading=Chargement de %s…
@@ -2766,7 +2769,7 @@ org_name_holder=Nom de l'organisation
org_full_name_holder=Nom complet de l'organisation
org_name_helper=Le nom de l'organisation doit être court et mémorable.
create_org=Créer une organisation
-repo_updated=Actualisé
+repo_updated=Actualisé %s
members=Membres
teams=Équipes
code=Code
@@ -2818,7 +2821,7 @@ settings.hooks_desc=Vous pouvez ajouter des webhooks qui seront activés pour %[1]s
%[1]s
en %[3]s
commit_repo=a soumis sur %[3]s dans %[4]s
create_issue=`a ouvert le ticket %[3]s#%[2]s`
close_issue=`a fermé le ticket %[3]s#%[2]s`
@@ -3459,8 +3462,8 @@ delete_branch=a supprimée la branche %[2]s de %[3]s
compare_branch=Comparer
compare_commits=Comparer %d révisions
compare_commits_general=Comparer les révisions
-mirror_sync_push=a synchronisé les révisions de %[3]s d’un miroir vers %[4]s.
-mirror_sync_create=a synchronisé la nouvelle référence %[3]s d’un miroir vers %[4]s.
+mirror_sync_push=a synchronisé les révisions de %[3]s d’un miroir vers %[4]s
+mirror_sync_create=a synchronisé la nouvelle référence %[3]s d’un miroir vers %[4]s
mirror_sync_delete=a synchronisé puis supprimé la nouvelle référence %[2]s
vers %[3]s depuis le miroir
approve_pull_request=`a approuvé %[3]s#%[2]s`
reject_pull_request=`a suggérés des changements pour %[3]s#%[2]s`
@@ -3532,7 +3535,7 @@ title=Paquets
desc=Gérer les paquets du dépôt.
empty=Il n'y pas de paquet pour le moment.
empty.documentation=Pour plus d'informations sur le registre de paquets, voir la documentation.
-empty.repo=Avez-vous téléchargé un paquet, mais il n'est pas affiché ici? Allez dans les paramètres du paquet et liez le à ce dépôt.
+empty.repo=Avez-vous téléchargé un paquet, mais il n'est pas affiché ici ? Allez dans les paramètres du paquet et liez le à ce dépôt.
registry.documentation=Pour plus d’informations sur le registre %s, voir la documentation.
filter.type=Type
filter.type.all=Tous
@@ -3567,7 +3570,7 @@ alpine.repository.repositories=Dépôts
alpine.repository.architectures=Architectures
cargo.registry=Configurez ce registre dans le fichier de configuration Cargo (par exemple ~/.cargo/config.toml
) :
cargo.install=Pour installer le paquet en utilisant Cargo, exécutez la commande suivante :
-chef.registry=Configurer ce registre dans votre fichier ~/.chef/config.rb
:
+chef.registry=Configurer ce registre dans votre fichier ~/.chef/config.rb
:
chef.install=Pour installer le paquet, exécutez la commande suivante :
composer.registry=Configurez ce registre dans votre fichier ~/.composer/config.json
:
composer.install=Pour installer le paquet en utilisant Composer, exécutez la commande suivante :
@@ -3632,7 +3635,7 @@ rubygems.dependencies.development=Dépendances de développement
rubygems.required.ruby=Nécessite Ruby en version
rubygems.required.rubygems=Nécessite RubyGem en version
swift.registry=Configurez ce registre à partir d'un terminal :
-swift.install=Ajoutez le paquet dans votre fichier Package.swift
:
+swift.install=Ajoutez le paquet dans votre fichier Package.swift
:
swift.install2=et exécutez la commande suivante :
vagrant.install=Pour ajouter une machine Vagrant, exécutez la commande suivante :
settings.link=Lier ce paquet à un dépôt
@@ -3655,7 +3658,7 @@ owner.settings.cargo.rebuild=Reconstruire l'index
owner.settings.cargo.rebuild.description=La reconstruction peut être utile si l'index n'est pas synchronisé avec les paquets Cargo stockés.
owner.settings.cargo.rebuild.error=Impossible de reconstruire l'index Cargo : %v
owner.settings.cargo.rebuild.success=L'index Cargo a été reconstruit avec succès.
-owner.settings.cleanuprules.title=Gérer les règles de nettoyage
+owner.settings.cleanuprules.title=Règles de nettoyage
owner.settings.cleanuprules.add=Ajouter une règle de nettoyage
owner.settings.cleanuprules.edit=Modifier la règle de nettoyage
owner.settings.cleanuprules.none=Aucune règle de nettoyage disponible. Veuillez consulter la documentation.
@@ -3689,7 +3692,7 @@ secrets=Secrets
description=Les secrets seront transmis à certaines actions et ne pourront pas être lus autrement.
none=Il n'y a pas encore de secrets.
creation=Ajouter un secret
-creation.name_placeholder=Caractères alphanumériques ou tirets bas uniquement, insensibles à la casse, ne peut commencer par GITEA_ ou GITHUB_.
+creation.name_placeholder=Caractères alphanumériques ou tirets bas uniquement, insensibles à la casse, ne peut commencer par FORGEJO_, GITEA_ ou GITHUB_
creation.value_placeholder=Entrez n’importe quoi. Les blancs cernant seront taillés.
creation.success=Le secret "%s" a été ajouté.
creation.failed=Impossible d'ajouter le secret.
@@ -3739,7 +3742,7 @@ runners.update_runner_failed=Impossible d'actualiser l'Exécuteur
runners.delete_runner=Supprimer cet exécuteur
runners.delete_runner_success=Exécuteur supprimé avec succès
runners.delete_runner_failed=Impossible de supprimer l'Exécuteur
-runners.delete_runner_header=Êtes-vous sûr de vouloir supprimer cet exécuteur ?
+runners.delete_runner_header=Confirmer la suppression de cet exécuteur
runners.delete_runner_notice=Si une tâche est en cours sur cet exécuteur, elle sera terminée et marquée comme échouée. Cela risque d’interrompre le flux de travail.
runners.none=Aucun exécuteur disponible
runners.status.unspecified=Inconnu
@@ -3754,7 +3757,7 @@ runs.all_workflows=Tous les workflows
runs.commit=Révision
runs.scheduled=Planifié
runs.pushed_by=soumis par
-runs.invalid_workflow_helper=La configuration du flux de travail est invalide. Veuillez vérifier votre fichier %s.
+runs.invalid_workflow_helper=La configuration du flux de travail est invalide. Veuillez vérifier votre fichier %s
runs.no_matching_online_runner_helper=Aucun exécuteur en ligne correspondant au libellé %s
runs.actor=Acteur
runs.status=Statut
@@ -3848,12 +3851,12 @@ commit_kind = Chercher les commits...
[munits.data]
b = o
-mib = Mo
-kib = ko
-gib = Go
-tib = To
-pib = Po
-eib = Eo
+mib = Mio
+kib = Kio
+gib = Gio
+tib = Tio
+pib = Pio
+eib = Eio
[markup]
filepreview.line = Ligne %[1]d dans %[2]s
diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini
index 7c77357e3b..3ccf36a36b 100644
--- a/options/locale/locale_gl.ini
+++ b/options/locale/locale_gl.ini
@@ -26,14 +26,14 @@ signed_in_as = Inicia Sesión como
enable_javascript = Este sitio web require JavaScript.
toc = Táboa de Contidos
licenses = Licenzas
-return_to_gitea = Regreso a Forgejo
+return_to_forgejo = Regreso a Forgejo
username = Nome de Usuario
email = Enderezo Electrónico
password = Contrasinal
-re_type = Confirme o Contrasinal
+re_type = Confirme o contrasinal
captcha = CAPTCHA
twofa = Autenticación de Dous Factores
-passcode = Código
+passcode = Código de Acceso
webauthn_insert_key = Insira a súa Chave de Seguranza
webauthn_press_button = Preme o botón da súa Chave de Seguranza…
webauthn_use_twofa = Use o Código de Dous Factores do seu Teléfono
@@ -41,7 +41,7 @@ webauthn_error = Non se Puido Ler a súa Chave de Seguranza.
webauthn_unsupported_browser = O seu Navegador non Soporta Actualmente WebAuthn.
webauthn_error_unknown = Produciuse un Erro Descoñecido.Téntao de novo.
webauthn_error_unable_to_process = O Servidor non Puido Procesar a súa Solicitude.
-webauthn_error_duplicated = A Chave de Seguranza non está Permitida para esta Solicitude. Asegúrese de que a Chave non Estea Rexistrada.
+webauthn_error_duplicated = A Chave de Seguranza non está Permitida para esta Solicitude. Asegúrese de que a Chave non Estea Rexistrada.
webauthn_error_empty = Debes Definir un Nome para esta Chave.
webauthn_reload = Recarga
repository = Repositorio
@@ -104,7 +104,7 @@ save = Gardar
copy_content = Copiar Contido
language = Linguaxe
copy_hash = Copiar hash
-twofa_scratch = Código Scratch de Dous Facetores
+twofa_scratch = Código Scratch de Dous Factores
webauthn_sign_in = Preme o botón da súa Chave de Seguranza. Se a súa Chave de Seguranza non ten ningún botón, insírela de novo.
issues = Problemas
disabled = Desactivado
@@ -123,6 +123,8 @@ name = Nome
value = Valor
confirm_delete_selected = Confirmar a eliminación de todos os elementos seleccionados?
show_full_screen = Mostrar Pantalla Completa
+more_items = Máis items
+toggle_menu = Alternar Menú
[aria]
navbar = Barra de Navegación
diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini
index 54e46dd89f..c3c32987f6 100644
--- a/options/locale/locale_hu-HU.ini
+++ b/options/locale/locale_hu-HU.ini
@@ -20,7 +20,7 @@ user_profile_and_more=Profil és beállítások...
signed_in_as=Bejelentkezve mint
toc=Tartalomjegyzék
licenses=Licencek
-return_to_gitea=Vissza a Forgejo-hoz
+return_to_forgejo=Vissza a Forgejo-hoz
username=Felhasználónév
email=E-mail cím
@@ -1179,7 +1179,7 @@ org_name_holder=Szervezet neve
org_full_name_holder=Szervezet teljes neve
org_name_helper=A szervezetek nevének rövidnek és megjegyezhetőnek kell lennie.
create_org=Szervezet létrehozása
-repo_updated=Frissítve
+repo_updated=Frissítve %s
members=Tagok
teams=Csoportok
lower_members=tagok
diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini
index 5370a404f0..d85cb78abb 100644
--- a/options/locale/locale_id-ID.ini
+++ b/options/locale/locale_id-ID.ini
@@ -963,7 +963,7 @@ branch.deleted_by=Dihapus oleh %s
org_name_holder=Nama Organisasi
org_full_name_holder=Organisasi Nama Lengkap
create_org=Buat Organisasi
-repo_updated=Diperbarui
+repo_updated=Diperbarui %s
members=Anggota
teams=Tim
lower_members=anggota
diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini
index 9d890773b2..8195e61c42 100644
--- a/options/locale/locale_is-IS.ini
+++ b/options/locale/locale_is-IS.ini
@@ -21,7 +21,7 @@ user_profile_and_more=Notandasíða og Stillingar…
signed_in_as=Skráð(ur) inn sem
toc=Efnisyfirlit
licenses=Hugbúnaðarleyfi
-return_to_gitea=Til baka að Forgejo
+return_to_forgejo=Til baka að Forgejo
username=Notandanafn
email=Netfang
@@ -1120,7 +1120,7 @@ topic.done=Í lagi
[graphs]
[org]
-repo_updated=Uppfært
+repo_updated=Uppfært %s
members=Meðlimar
teams=Lið
lower_members=meðlimar
diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini
index 367b373252..36cee3696a 100644
--- a/options/locale/locale_it-IT.ini
+++ b/options/locale/locale_it-IT.ini
@@ -22,7 +22,7 @@ user_profile_and_more=Profilo ed Impostazioni…
signed_in_as=Accesso effettuato come
toc=Indice dei contenuti
licenses=Licenze
-return_to_gitea=Ritorna a Forgejo
+return_to_forgejo=Ritorna a Forgejo
username=Nome utente
email=Indirizzo email
@@ -2748,7 +2748,7 @@ org_name_holder=Nome dell'organizzazione
org_full_name_holder=Nome completo dell'organizzazione
org_name_helper=I nomi delle organizzazioni devono essere brevi e semplici da ricordare.
create_org=Crea organizzazione
-repo_updated=Aggiornato
+repo_updated=Aggiornato %s
members=Membri
teams=Team
lower_members=membri
diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini
index 4b1ffce9f6..f4e1bcd663 100644
--- a/options/locale/locale_ja-JP.ini
+++ b/options/locale/locale_ja-JP.ini
@@ -25,7 +25,7 @@ signed_in_as=サインイン済み
enable_javascript=このウェブサイトにはJavaScriptが必要です。
toc=目次
licenses=ライセンス
-return_to_gitea=Forgejoに戻る
+return_to_forgejo=Forgejoに戻る
username=ユーザー名
email=メールアドレス
@@ -2745,7 +2745,7 @@ org_name_holder=組織名
org_full_name_holder=組織のフルネーム
org_name_helper=組織名は短く覚えやすいものにしましょう。
create_org=組織を作成
-repo_updated=最終更新
+repo_updated=最終更新 %s
members=メンバー
teams=チーム
code=コード
diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini
index 4e3a24a04b..f8a9a17ba7 100644
--- a/options/locale/locale_ko-KR.ini
+++ b/options/locale/locale_ko-KR.ini
@@ -16,7 +16,7 @@ template=템플릿
language=언어
notifications=알림
create_new=생성하기
-user_profile_and_more=프로파일 및 설정
+user_profile_and_more=프로파일 및 설정…
signed_in_as=다음 사용자로 로그인됨
username=사용자명
@@ -70,7 +70,7 @@ enabled=활성화됨
write=쓰기
preview=미리보기
-loading=불러오는 중...
+loading=불러오는 중…
@@ -91,7 +91,7 @@ tracked_time_summary = 추적된 이슈 목록 필터 기반 시간 요약
enable_javascript = 이 웹사이트는 자바스크립트가 필요합니다.
toc = 목차
licenses = 라이센스
-return_to_gitea = Forgejo로 돌아가기
+return_to_forgejo = Forgejo로 돌아가기
access_token = 액세스 토큰
webauthn_error_unable_to_process = 서버가 귀하의 요청을 처리할 수 없습니다.
webauthn_error_duplicated = 이 요청에는 보안 키가 허용되지 않습니다. 키가 이미 등록되어 있는지 확인하세요.
@@ -157,6 +157,8 @@ artifacts = Artifacts
[aria]
navbar = 네비게이션 바
footer.links = 링크
+footer = 꼬릿말
+footer.software = 소프트웨어에 대하여
[heatmap]
number_of_contributions_in_the_last_12_months = 지난 12달간 %s 명의 기여자
@@ -183,7 +185,7 @@ license=오픈 소스
[install]
install=설치
title=초기 설정
-docker_helper="Forgejo를 Docker에서 실행하려면 설정 전에 이 문서를 읽어보세요."
+docker_helper=Forgejo를 Docker에서 실행하려면 설정 전에 이 문서를 읽어보세요.
db_title=데이터베이스 설정
db_type=데이터베이스 유형
host=호스트
@@ -214,7 +216,7 @@ ssh_port_helper=SSH 서버가 실행되고 있는 포트를 입력하세요. 비
http_port=Forgejo HTTP 수신 포트
http_port_helper=Forgejo 웹서버가 수신할 포트 번호입니다.
app_url=Forgejo 기본 URL
-app_url_helper=HTTP(S) clone URL 및 이메일 알림 기본 주소
+app_url_helper=HTTP(S) clone URL 및 이메일 알림 기본 주소입니다.
log_root_path=로그 경로
log_root_path_helper=로그파일은 이 디렉토리에 저장됩니다.
@@ -234,15 +236,15 @@ offline_mode_popup=타사 콘텐츠 전송 네트워크를 사용하지 않도
disable_gravatar=Gravatar 사용안함
disable_gravatar_popup=Gravatar 및 타사 아바타 소스를 사용하지 않도록 설정합니다. 사용자가 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용됩니다.
federated_avatar_lookup=아바타 연동 사용여부
-federated_avatar_lookup_popup=libravatar 기반 오픈소스 서비스 사용 목적으로 연합 아바타 조회를 허용하기
+federated_avatar_lookup_popup=libravatar 기반 오픈소스 연합 아바타 조회를 허용합니다.
disable_registration=사용자 등록 비활성화
disable_registration_popup=사용자가 직접 등록할 수 없게 합니다. 관리자만이 추가할 수 있습니다.
allow_only_external_registration_popup=외부 서비스를 통한 등록을 허용여부
openid_signin=OpenID 로그인 사용
-openid_signin_popup=OpenID 를 이용한 로그인 가능여부
+openid_signin_popup=OpenID 를 이용한 로그인을 허용합니다.
openid_signup=OpenID 가입 가능여부
-openid_signup_popup=OpenID를 통한 가입 가능여부
-enable_captcha_popup=사용자 등록시 캡차 요구
+openid_signup_popup=OpenID를 통한 가입을 허용합니다.
+enable_captcha_popup=사용자 등록시 캡차를 요구합니다.
require_sign_in_view=페이지를 보기 위해 로그인 하기
admin_setting_desc=관리자 계정을 만드는 것은 선택사항입니다. 첫번째로 등록된 사용자는 자동적으로 관리자로 지정됩니다.
admin_title=관리자 계정 설정
@@ -287,7 +289,7 @@ issues.in_your_repos=당신의 저장소에
[explore]
repos=저장소
-users=유저
+users=사용자
organizations=조직
search=검색
code=코드
@@ -306,7 +308,7 @@ forgot_password_title=비밀번호 찾기
forgot_password=비밀번호를 잊으셨나요?
sign_up_now=계정이 필요하신가요? 지금 가입하세요.
confirmation_mail_sent_prompt=새로운 확인 메일이 %s로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 등록 절차를 완료하십시오.
-must_change_password=비밀번호를 변경하세요.
+must_change_password=비밀번호를 변경하세요
allow_password_change=사용자에게 비밀번호 변경을 요청 (권장됨)
reset_password_mail_sent_prompt=확인 메일이 %s로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오.
active_your_account=계정 활성화
@@ -322,7 +324,7 @@ invalid_code=검증 코드가 유효하지 않거나 만료되었습니다.
reset_password_helper=계정 복구
password_too_short=비밀번호의 길이는 최소 %d 자가 되어야 합니다.
non_local_account=로컬 유저가 아닌 경우 Forgejo 웹 인터페이스를 통해 비밀번호를 변경할 수 없습니다.
-verify=확인
+verify=검증
scratch_code=스크래치 코드
use_scratch_code=스크래치 코드 사용
twofa_scratch_used=스크래치 코드를 사용하셨습니다. 이중인증 설정 페이지로 리다이렉트 되었고 기기 등록을 제거하거나 새로운 스크래치 코드를 생성하십시오.
@@ -504,7 +506,7 @@ email_deletion_desc=계정의 이메일 주소와 관련된 정보가 삭제됩
email_deletion_success=이메일 주소가 삭제되었습니다.
theme_update_success=테마가 갱신되었습니다.
theme_update_error=선택한 테마가 존재하지 않습니다.
-openid_deletion=OpenID 주소가 삭제되었습니다.
+openid_deletion=OpenID 주소 삭제됨
openid_deletion_desc=OpenID 주소를 삭제하면 이것을 이용하여 로그인할 수 없습니다. 계속 진행하시겠습니까?
openid_deletion_success=OpenID가 삭제되었습니다.
add_new_email=새 이메일 주소 추가
@@ -521,8 +523,8 @@ manage_gpg_keys=GPG 키 관리
add_key=키 추가
ssh_desc=이러한 SSH 공용 키는 귀하의 계정과 연결되어 있습니다. 해당 개인 키는 당신의 저장소에 대한 전체 액세스를 가능하게 합니다.
gpg_desc=이러한 GPG 공개키는 당신의 계정과 연결되어있습니다. 커밋이 검증될 수 있도록 당신의 개인 키를 안전하게 유지하십시오.
-ssh_helper="도움이 필요하세요? GitHub의 설명서를 참조하시기 바랍니다: SSH 키 생성하기 또는 SSH를 사용할 때 일반적인 문제"
-gpg_helper="도움이 필요하세요? GitHub의 설명서를 참조하시기 바랍니다: GPG키에 대하여."
+ssh_helper=도움이 필요하세요? SSH 키 생성하기 또는 SSH를 사용할 때의 일반적인 문제에 관한 GitHub의 설명서를 참조하시기 바랍니다.
+gpg_helper=도움이 필요하세요? GPG키에 대한 GitHub 문서를 참조하시기 바랍니다.
add_new_key=SSH 키 추가
add_new_gpg_key=GPG 키 추가
gpg_key_id_used=같은 ID의 GPG 공개키가 이미 존재합니다.
@@ -543,12 +545,12 @@ gpg_key_deletion_desc=GPG 키를 삭제하면 해당 키로 서명 한 커밋은
ssh_key_deletion_success=SSH 키가 삭제되었습니다.
gpg_key_deletion_success=GPG 키가 삭제되었습니다.
valid_forever=영원히 유효
-last_used=마지막 사용 :
+last_used=마지막 사용
no_activity=최근 활동 없음
can_read_info=읽기
can_write_info=쓰기
-key_state_desc=이 키는 최근 1주일 동안 사용된 적이 있습니다.
-token_state_desc=이 토큰은 최근 1주일 동안 사용된 적이 있습니다.
+key_state_desc=최근 1주일 동안 사용된 적 있는 키
+token_state_desc=최근 1주일 동안 사용된 적 있는 토큰
show_openid=프로필에 표시
hide_openid=프로필에서 숨기기
ssh_disabled=SSH 사용불가
@@ -592,7 +594,7 @@ scan_this_image=이 이미지를 당신의 인증 애플리케이션에서 스
or_enter_secret=또는 이 비밀키를 입력하세요: %s
then_enter_passcode=어플리케이션에 표시된 인증코드를 입력하여 주십시오:
passcode_invalid=인증코드가 올바르지 않습니다. 재시도해주십시오.
-twofa_enrolled=당신의 계정에 2단계 인증이 설정되었습니다. 스크래치 토큰 (%s) 은 한 번만 표시되므로 안전한 장소에 보관하십시오!
+twofa_enrolled=당신의 계정에 2단계 인증이 설정되었습니다. 스크래치 토큰 (%s) 은 한 번만 표시되므로 안전한 장소에 보관하십시오.
manage_account_links=연결된 계정 관리
@@ -622,19 +624,19 @@ repo_name=저장소 이름
repo_name_helper=좋은 저장소 이름은 보통 짧고 기억하기 좋은 특별한 키워드로 이루어 집니다.
repo_size=저장소 용량
template=템플릿
-template_select=템플릿 고르기
-template_helper=템플릿으로 저장소 만들기
+template_select=템플릿을 선택합니다.
+template_helper=저장소 템플릿으로 만들기
visibility=가시성
visibility_helper_forced=사이트 관리자가 새 레포지토리에 대해 비공개로만 생성되도록 하였습니다.
visibility_fork_helper=(변경사항을 적용하는 경우 모든 포크가 영향을 받게 됩니다.)
-clone_helper="클론하는데에 도움이 필요하면 Help에 방문하세요."
+clone_helper=클론하는데에 도움이 필요하신가요? Help에 방문하세요.
fork_repo=저장소 포크
-fork_from=원본 프로젝트 :
+fork_from=원본 프로젝트
fork_visibility_helper=포크된 저장소의 가시성은 변경하실 수 없습니다.
use_template=이 템플릿을 사용
repo_desc=설명
repo_lang=언어
-repo_gitignore_helper=.gitignore 템플릿 선택
+repo_gitignore_helper=.gitignore 템플릿을 선택합니다.
license=라이센스
license_helper=라이센스 파일을 선택해주세요.
readme=README
@@ -676,7 +678,7 @@ migrate.permission_denied=로컬 저장소는 가져오기를 할 수 없습니
migrate.failed=마이그레이션 실패: %v
mirror_from=의 미러
-forked_from=원본 프로젝트 :
+forked_from=원본 프로젝트
fork_from_self=자신의 저장소를 포크 할 수 없습니다.
fork_guest_user=로그인하고 Fork 이 창고.
unwatch=보지않기
@@ -694,7 +696,7 @@ push_exist_repo=커맨드라인에서 기존 레포지터리 푸시
empty_message=이 저장소는 아무런 내용을 가지고 있지 않습니다.
code=코드
-code.desc=소스 코드 접근, 파일, 커밋 그리고 브랜치
+code.desc=소스 코드, 파일, 커밋과 브랜치에 접근합니다.
branch=브렌치
tree=트리
filter_branch_and_tag=브랜치나 태그로 필터
@@ -726,20 +728,20 @@ editor.preview_changes=변경내용 미리보기
editor.cannot_edit_non_text_files=바이너리 파일을 웹 인터페이스에서 편집하실 수 없습니다.
editor.edit_this_file=파일 편집
editor.delete_this_file=파일 삭제
-editor.name_your_file=파일명을 입력하세요...
+editor.name_your_file=파일명 입력…
editor.or=혹은
editor.cancel_lower=취소
editor.commit_changes=변경 내용을 커밋
-editor.commit_message_desc=선택적 확장 설명을 추가...
-editor.commit_directly_to_this_branch="%s 브랜치에서 직접 커밋해주세요."
+editor.commit_message_desc=선택적 확장 설명 추가…
+editor.commit_directly_to_this_branch=%s 브랜치에서 직접 커밋해주세요.
editor.create_new_branch=이 커밋에 대한 새로운 브랜치를 만들고 끌어오기 요청을 시작합니다.
-editor.new_branch_name_desc=새로운 브랜치 명...
+editor.new_branch_name_desc=새로운 브랜치 이름…
editor.cancel=취소
editor.filename_cannot_be_empty=파일명이 빈칸입니다.
editor.no_changes_to_show=표시할 변경사항이 없습니다.
-editor.add_subdir=경로 추가...
+editor.add_subdir=경로 추가…
-commits.desc=소스 코드 변경 내역 탐색
+commits.desc=소스 코드 변경 내역을 탐색합니다.
commits.commits=커밋
commits.search=커밋 찾기...
commits.find=검색
@@ -765,7 +767,7 @@ projects.column.edit_title=이름
projects.column.new_title=이름
issues.new=새로운 이슈
-issues.new.title_empty=제목은 비워둘 수 없습니다.
+issues.new.title_empty=제목은 비워둘 수 없음
issues.new.labels=레이블
issues.new.no_label=레이블 없음
issues.new.clear_labels=레이블 초기화
@@ -777,7 +779,7 @@ issues.new.closed_milestone=마일스톤 닫기
issues.new.assignees=담당자
issues.new.clear_assignees=담당자 초기화
issues.new.no_assignees=담당자 없음
-issues.no_ref=Branch/Tag 가 지정되어 있지 않습니다.
+issues.no_ref=Branch/Tag 가 지정되어 있지 않음
issues.create=이슈 생성
issues.new_label=새로운 레이블
issues.new_label_placeholder=레이블 이름
@@ -844,7 +846,7 @@ issues.create_comment=코멘트
issues.commit_ref_at=` 커밋 %[2]s에서 이 이슈 언급`
issues.role.owner=소유자
issues.role.member=멤버
-issues.sign_in_require_desc="로그인하여 이 대화에 참여"
+issues.sign_in_require_desc=로그인하여 이 대화에 참여하세요.
issues.edit=수정
issues.cancel=취소
issues.save=저장
@@ -881,20 +883,20 @@ 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="마감일은 반드시 'yyyy-mm-dd' 형식이어야 합니다."
-issues.error_modifying_due_date="마감일 수정을 실패하였습니다."
-issues.error_removing_due_date="마감일 삭제를 실패하였습니다."
+issues.invalid_due_date_format=마감일은 반드시 "yyyy-mm-dd" 형식이어야 합니다.
+issues.error_modifying_due_date=마감일 수정을 실패하였습니다.
+issues.error_removing_due_date=마감일 삭제를 실패하였습니다.
issues.due_date_form=yyyy-mm-dd
issues.due_date_form_add=마감일 추가
issues.due_date_form_edit=편집
issues.due_date_form_remove=삭제
issues.due_date_not_set=마감일이 설정되지 않았습니다.
issues.due_date_added=마감일 %s 를 추가 %s
-issues.due_date_remove=%s %s 마감일이 삭제되었습니다.
+issues.due_date_remove=%s %s 마감일이 삭제됨
issues.due_date_overdue="기한 초과"
-issues.due_date_invalid="기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오."
+issues.due_date_invalid=기한이 올바르지 않거나 범위를 벗어났습니다. "yyyy-mm-dd"형식을 사용해주십시오.
issues.dependency.title=의존성
-issues.dependency.add=의존성 추가...
+issues.dependency.add=의존성 추가…
issues.dependency.cancel=취소
issues.dependency.remove=제거
issues.dependency.remove_info=이 의존성 제거
@@ -924,9 +926,9 @@ pulls.compare_changes=새 풀 리퀘스트
pulls.compare_base=병합하기
pulls.compare_compare=다음으로부터 풀
pulls.filter_branch=Filter Branch
-pulls.no_results=결과 없음
+pulls.no_results=결과를 찾을 수 없습니다.
pulls.create=풀 리퀘스트 생성
-pulls.title_desc_few="%[2]s
에서 %[3]s
로 %[1]d commits 를 머지하려 합니다"
+pulls.title_desc_few=%[2]s
에서 %[3]s
로 %[1]d개의 커밋들을 머지하려 합니다
pulls.merged_title_desc_few=%[2]s
에서 %[3]s
로 %[1]d commits 를 머지했습니다 %[4]s
pulls.tab_conversation=대화
pulls.tab_commits=커밋
@@ -951,13 +953,13 @@ milestones.closed=닫힘 %s
milestones.no_due_date=기한 없음
milestones.open=열기
milestones.close=닫기
-milestones.completeness=%d%% 완료됨
+milestones.completeness=%d%% 완료됨
milestones.create=마일스톤 생성
milestones.title=타이틀
milestones.desc=설명
milestones.due_date=기한 (선택 사항)
milestones.clear=지우기
-milestones.invalid_due_date_format="마감일은 반드시 'yyyy-mm-dd' 형식이어야 합니다."
+milestones.invalid_due_date_format=마감일은 반드시 "yyyy-mm-dd" 형식이어야 합니다.
milestones.edit=마일스톤 편집
milestones.cancel=취소
milestones.modify=마일스톤 갱신
@@ -973,14 +975,14 @@ milestones.filter_sort.least_issues=이슈 적은 순
ext_wiki.desc=외부 위키에 연결하기.
wiki=위키
-wiki.welcome=위키에 오신것을 환영합니다!
-wiki.welcome_desc=Wiki를 사용하여 공동 작업자들과 문서를 작성 하고 공유 할 수 있습니다.
-wiki.desc=공동 작업자들과 문서 작성 및 공유.
+wiki.welcome=위키에 오신것을 환영합니다.
+wiki.welcome_desc=Wiki를 사용하여 협업자들과 문서를 작성 하고 공유 할 수 있습니다.
+wiki.desc=협업자들과 문서 작성 및 공유.
wiki.create_first_page=첫 페이지 작성
wiki.page=페이지
wiki.filter_page=페이지 필터링
wiki.new_page=페이지
-wiki.default_commit_message=이 페이지에 대한 메모를 작성하세요.(선택사항)
+wiki.default_commit_message=이 페이지 수정에 대한 메모를 작성하세요.(선택사항)
wiki.save_page=페이지 저장하기
wiki.last_commit_info=%s이(가) %s에 이 페이지를 수정함
wiki.edit_page_button=수정하기
@@ -1006,8 +1008,8 @@ activity.title.user_1=%d 사용자
activity.title.user_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.title.prs_merged_by=%s 가 %s 로부터 머지 되었음
+activity.title.prs_opened_by=%s 가 %s 로 부터 제안됨
activity.merged_prs_label=병합됨
activity.opened_prs_label=제안중
activity.active_issues_count_1=%d 개의 활성화된 이슈
@@ -1016,7 +1018,7 @@ activity.closed_issues_count_1=클로즈된 이슈
activity.closed_issues_count_n=클로즈된 이슈
activity.title.issues_1=이슈 %d개
activity.title.issues_n=이슈 %d개
-activity.title.issues_created_by=%s 가 %s 에 의해 생성되었습니다.
+activity.title.issues_created_by=%s 가 %s 에 의해 생성됨
activity.closed_issue_label=닫힘
activity.new_issues_count_1=새로운 이슈
activity.new_issues_count_n=새로운 이슈
@@ -1027,7 +1029,7 @@ activity.unresolved_conv_desc=최근 변경된 이슈나 풀 리퀘스트들이
activity.unresolved_conv_label=열기
activity.title.releases_1=%d 개의 릴리즈
activity.title.releases_n=%d 개의 릴리즈
-activity.title.releases_published_by=%s 가 %s 에 의하여 배포되었습니다.
+activity.title.releases_published_by=%s 가 %s 에 의하여 배포됨
activity.published_release_label=배포됨
contributors.contribution_type.commits=커밋
@@ -1038,9 +1040,9 @@ search.results="%s 에서 \"%s\" 에 대한 검색 결과"
search.code_no_results=검색어와 일치하는 소스코드가 없습니다.
settings=설정
-settings.desc=설정은 저장소 설정을 관리할 수 있습니다.
+settings.desc=설정에서 저장소 설정을 관리할 수 있음
settings.options=저장소
-settings.collaboration=공동작업자
+settings.collaboration=협업자
settings.collaboration.admin=관리자
settings.collaboration.write=쓰기
settings.collaboration.read=읽기
@@ -1088,21 +1090,21 @@ settings.trust_model.collaborator=협업자
settings.wiki_delete=위키 데이터 삭제
settings.confirm_wiki_delete=위키 데이터 삭제
settings.delete=이 저장소 삭제
-settings.delete_notices_1=- 이 작업은 취소할 수 없습니다.
+settings.delete_notices_1=- 이 작업은 취소할 수 없습니다.
settings.deletion_success=저장소가 삭제되었습니다.
settings.update_settings_success=저장소 설정이 갱신되었습니다.
settings.confirm_delete=저장소 삭제
settings.add_collaborator=새 협업자 추가
-settings.add_collaborator_success=공동작업자가 추가 되었습니다.
+settings.add_collaborator_success=협업자가 추가 되었습니다.
settings.delete_collaborator=제거
-settings.collaborator_deletion=공동작업자 삭제
+settings.collaborator_deletion=협업자 삭제
settings.search_user_placeholder=사용자 검색...
settings.teams=팀
settings.add_webhook=Webhook 추가
settings.webhook_deletion=Webhook 삭제
settings.webhook_deletion_success=Webhook을 삭제했습니다.
settings.webhook.test_delivery=전달 시험
-settings.webhook.test_delivery_desc=이 웹훅을 가상 이벤트로 테스트
+settings.webhook.test_delivery_desc=이 웹훅을 가상 이벤트로 테스트합니다.
settings.webhook.request=요청
settings.webhook.response=응답
settings.webhook.headers=제목
@@ -1122,7 +1124,7 @@ settings.discord_icon_url=아이콘 URL
settings.event_desc=트리거:
settings.event_push_only=푸시 이벤트
settings.event_send_everything=모든 이벤트
-settings.event_choose=사용자 정의 이벤트...
+settings.event_choose=사용자 정의 이벤트…
settings.event_create=생성
settings.event_create_desc=브랜치 또는 태그가 생성되었습니다.
settings.event_delete=삭제
@@ -1131,7 +1133,7 @@ settings.event_wiki=위키
settings.event_release=릴리즈
settings.event_release_desc=릴리즈가 저장소에서 배포, 갱신 또는 제거되었습니다.
settings.event_push=푸시
-settings.event_push_desc=저장소로 푸시
+settings.event_push_desc=저장소로 푸시합니다.
settings.event_repository=저장소
settings.event_repository_desc=저장소가 생성되거나 삭제됩니다.
settings.event_issues=이슈
@@ -1267,6 +1269,11 @@ projects.deletion_desc = 프로젝트를 삭제하면 관련된 모든 이슈에
projects.deletion_success = 프로젝트가 삭제되었습니다.
projects.edit = 프로젝트 수정
projects.new_subheader = 한 곳에서 당신의 작업을 조정, 추적, 업데이트해 프로젝트를 일정대로 투명하게 유지하세요.
+pulls.approve_count_n = %명의 승인
+pulls.approve_count_1 = %d명의 승인
+pulls.blocked_by_approvals = 이 풀 리퀘스트는 충분히 승인되지 않았습니다. %d/%d 승인됨.
+settings.event_pull_request_approvals = 풀 리퀘스트 승인
+pulls.blocked_by_official_review_requests = 이 풀 리퀘스트는 공식 검토자에 의한 승인이 부족하여 차단되었습니다.
@@ -1276,7 +1283,7 @@ projects.new_subheader = 한 곳에서 당신의 작업을 조정, 추적, 업
org_name_holder=조직 이름
org_full_name_holder=조직 전체 이름
create_org=새로운 조직
-repo_updated=업데이트됨
+repo_updated=업데이트됨 %s
members=멤버
teams=팀
lower_members=회원
@@ -1639,6 +1646,7 @@ create_repo=저장소를 만들었습니다. %s
rename_repo=%[1]s에서
에서 %[3]s으로 저장소 이름을 바꾸었습니다.
transfer_repo=%s
에서 %s로 저장소가 전송되었습니다.
compare_commits=%d 커밋들 비교
+watched_repo = %[2]s에대한 감시를 시작합니다
[tool]
now=현재
@@ -1675,6 +1683,9 @@ pin=알림 고정
mark_as_read=읽음으로 표시
mark_as_unread=읽지 않음으로 표시
mark_all_as_read=모두 읽음으로 표시
+subscriptions = 구독된 알림
+no_subscriptions = 알림이 없음
+watching = 감시
[gpg]
error.extract_sign=서명 추출에 실패
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index ba1883acdb..fa9a5d0063 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -25,7 +25,7 @@ signed_in_as=Pieteicies kā
enable_javascript=Šai tīmekļvietnei ir nepieciešams JavaScript.
toc=Satura rādītājs
licenses=Licences
-return_to_gitea=Atgriezties Forgejo
+return_to_forgejo=Atgriezties Forgejo
username=Lietotājvārds
email=E-pasta adrese
@@ -2581,7 +2581,7 @@ org_name_holder=Organizācijas nosaukums
org_full_name_holder=Organizācijas pilnais nosaukums
org_name_helper=Organizāciju nosaukumiem vēlams būt īsiem un tādiem, ko viegli atcerēties.
create_org=Izveidot organizāciju
-repo_updated=Atjaunināts
+repo_updated=Atjaunināts %s
members=Dalībnieki
teams=Komandas
code=Kods
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index a710e5d58a..784d53bee5 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -22,7 +22,7 @@ user_profile_and_more=Profiel en instellingen…
signed_in_as=Aangemeld als
toc=Inhoudsopgave
licenses=Licenties
-return_to_gitea=Terug naar Forgejo
+return_to_forgejo=Terug naar Forgejo
username=Gebruikersnaam
email=E-mailadres
@@ -2731,7 +2731,7 @@ org_name_holder=Organisatienaam
org_full_name_holder=Volledige naam organisatie
org_name_helper=Organisatienamen horen kort en memorabel zijn.
create_org=Nieuwe organisatie aanmaken
-repo_updated=Geupdate
+repo_updated=Geupdate %s
members=Leden
teams=Teams
lower_members=leden
diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini
index 99ab350b66..0a03defdfa 100644
--- a/options/locale/locale_pl-PL.ini
+++ b/options/locale/locale_pl-PL.ini
@@ -21,7 +21,7 @@ user_profile_and_more=Profil i ustawienia…
signed_in_as=Zalogowany jako
toc=Spis treści
licenses=Licencje
-return_to_gitea=Wróć do Forgejo
+return_to_forgejo=Wróć do Forgejo
username=Nazwa użytkownika
email=Adres e-mail
@@ -2033,7 +2033,7 @@ org_name_holder=Nazwa organizacji
org_full_name_holder=Pełna nazwa organizacji
org_name_helper=Nazwa organizacji powinna być krótka i łatwa do zapamiętania.
create_org=Utwórz organizację
-repo_updated=Zaktualizowano
+repo_updated=Zaktualizowano %s
members=Członkowie
teams=Zespoły
lower_members=członkowie
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index 705c163853..d8bb0908db 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -24,7 +24,7 @@ signed_in_as=Sessão iniciada como
enable_javascript=Este site requer JavaScript.
toc=Índice
licenses=Licenças
-return_to_gitea=Volte para Forgejo
+return_to_forgejo=Volte para Forgejo
username=Nome de usuário
email=Endereço de e-mail
@@ -2610,7 +2610,7 @@ org_name_holder=Nome da organização
org_full_name_holder=Nome completo da organização
org_name_helper=Nomes de organização devem ser curtos e memoráveis.
create_org=Criar organização
-repo_updated=Atualizado
+repo_updated=Atualizado %s
members=Membros
teams=Equipes
code=Código
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index 4a915122f7..8f781fe85f 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -25,7 +25,7 @@ signed_in_as=Sessão iniciada como
enable_javascript=Este sítio Web requer JavaScript.
toc=Índice
licenses=Licenças
-return_to_gitea=Retornar ao Forgejo
+return_to_forgejo=Retornar ao Forgejo
username=Nome de utilizador
email=Endereço de email
@@ -2750,7 +2750,7 @@ org_name_holder=Nome da organização
org_full_name_holder=Nome completo da organização
org_name_helper=Nomes das organizações devem ser curtos e memoráveis.
create_org=Criar organização
-repo_updated=Modificado
+repo_updated=Modificado %s
members=Membros
teams=Equipas
code=Código
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 65a927c635..7b53e0234d 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -24,7 +24,7 @@ signed_in_as=Вы вошли как
enable_javascript=Для этого сайта требуется поддержка JavaScript.
toc=Содержание
licenses=Лицензии
-return_to_gitea=Вернуться к Forgejo
+return_to_forgejo=Вернуться к Forgejo
username=Имя пользователя
email=Адрес эл. почты
@@ -1000,6 +1000,7 @@ additional_repo_units_hint_description = Показывать кнопку "До
pronouns_custom = Другие
pronouns = Местоимения
pronouns_unspecified = Не указаны
+language.title = Язык по умолчанию
[repo]
owner=Владелец
@@ -1834,22 +1835,22 @@ pulls.unrelated_histories=Слияние не удалось: у источни
pulls.merge_out_of_date=Слияние не удалось: при создании слияния база данных была обновлена. Подсказка: попробуйте ещё раз.
pulls.head_out_of_date=Слияние не удалось: во время слияния головной коммит был обновлён. Попробуйте ещё раз.
pulls.push_rejected=Отправка была отклонена. Проверьте Git-хуки этого репозитория.
-pulls.push_rejected_summary=Полная ошибка отклонения
+pulls.push_rejected_summary=Полная причина отклонения
pulls.push_rejected_no_message=Отправка была отклонена и удалённый сервер не указал причину. Проверьте Git-хуки этого репозитория
-pulls.open_unmerged_pull_exists=`Вы не можете снова открыть, поскольку уже существует запрос на слияние (#%d) из того же репозитория с той же информацией о слиянии и ожидающий слияния.`
-pulls.status_checking=Выполняются некоторые проверки
-pulls.status_checks_success=Все проверки выполнены успешно
-pulls.status_checks_warning=Некоторые проверки сообщили о предупреждениях
-pulls.status_checks_failure=Некоторые проверки не удались
+pulls.open_unmerged_pull_exists=`Нельзя открыть снова, поскольку существует другой открытый запрос на слияние (#%d) с такими же свойствами.`
+pulls.status_checking=Выполняются проверки
+pulls.status_checks_success=Все проверки успешно пройдены
+pulls.status_checks_warning=Некоторые проверки имеют предупреждения
+pulls.status_checks_failure=Некоторые проверки провалились
pulls.status_checks_error=Некоторые проверки сообщили об ошибках
pulls.status_checks_requested=Требуется
pulls.status_checks_details=Информация
pulls.status_checks_hide_all=Скрыть все проверки
pulls.status_checks_show_all=Показать все проверки
-pulls.update_branch=Обновить ветку посредством слияния
-pulls.update_branch_rebase=Обновить ветку через rebase
-pulls.update_branch_success=Обновление ветки выполнено успешно
-pulls.update_not_allowed=У вас недостаточно прав для обновления ветки
+pulls.update_branch=Обновить ветку слиянием
+pulls.update_branch_rebase=Обновить ветку перебазированием
+pulls.update_branch_success=Ветка успешно обновлена
+pulls.update_not_allowed=Недостаточно прав для обновления ветки
pulls.outdated_with_base_branch=Эта ветка отстает от базовой ветки
pulls.close=Закрыть запрос на слияние
pulls.closed_at=`закрыл этот запрос на слияние %[2]s`
@@ -2124,7 +2125,7 @@ settings.convert_fork_desc=Вы можете преобразовать это
settings.convert_fork_notices_1=Эта операция преобразует этот ответвление в обычный репозиторий, и не может быть отменена.
settings.convert_fork_confirm=Преобразовать репозиторий
settings.convert_fork_succeed=Ответвление преобразовано в обычный репозиторий.
-settings.transfer.title=Передать права собственности
+settings.transfer.title=Передать репозиторий
settings.transfer.rejected=Передача репозитория отменена.
settings.transfer.success=Передача репозитория выполнена успешно.
settings.transfer_abort=Отменить передачу
@@ -2529,7 +2530,7 @@ release.title=Название выпуска
release.title_empty=Заголовок не может быть пустым.
release.message=Расскажите про этот выпуск
release.prerelease_desc=Это предварительный выпуск
-release.prerelease_helper=Пометить выпуск как не готовый для массового использования.
+release.prerelease_helper=Пометить выпуск как неготовый для массового использования.
release.cancel=Отменить
release.publish=Опубликовать выпуск
release.save_draft=Сохранить черновик
@@ -2738,6 +2739,8 @@ settings.matrix.access_token_helper = Рекомендуется создать
settings.mirror_settings.pushed_repository = Удалённый репозиторий
release.hide_archive_links = Скрыть автоматически генерируемые архивы
release.hide_archive_links_helper = Скрыть автоматически добавляемые архивы исходного кода для этого релиза. Например, если вы загружаете свои архивы.
+settings.transfer.button = Передать репозиторий
+settings.transfer.modal.title = Передача репозитория
[graphs]
@@ -2746,7 +2749,7 @@ org_name_holder=Название организации
org_full_name_holder=Полное название
org_name_helper=Лучшие названия организаций коротки и запоминаемы.
create_org=Создать организацию
-repo_updated=Обновлено
+repo_updated=Обновлено %s
members=Участники
teams=Команды
code=Код
@@ -2978,7 +2981,7 @@ users.repos=Репозитории
users.created=Создано
users.last_login=Последний вход
users.never_login=Никогда не входил
-users.send_register_notify=Отправить пользователю уведомление о регистрации
+users.send_register_notify=Уведомить о регистрации по эл. почте
users.new_success=Учётная запись «%s» создана.
users.edit=Редактировать
users.auth_source=Источник аутентификации
@@ -2987,12 +2990,12 @@ users.auth_login_name=Имя для входа
users.password_helper=Оставьте пустым, чтобы оставить без изменений.
users.update_profile_success=Профиль учётной записи обновлён успешно.
users.edit_account=Изменение учётной записи
-users.max_repo_creation=Максимальное количество репозиториев
+users.max_repo_creation=Ограничение количества репозиториев
users.max_repo_creation_desc=(Установите -1 для использования стандартного глобального значения предела)
users.is_activated=Эта учётная запись активирована
-users.prohibit_login=Запретить вход в учётную запись
-users.is_admin=У этой учётной записи есть права администратора
-users.is_restricted=Ограничен
+users.prohibit_login=Вход запрещён
+users.is_admin=Является администратором
+users.is_restricted=Ограниченная
users.allow_git_hook=Может создавать Git-хуки
users.allow_git_hook_tooltip=Git hooks выполняются от пользователя ОС, под которым работает Forgejo. Они будут иметь такой же доступ к хосту. Из-за этого пользователи с правами на Git hook будут иметь возможность получать доступ и модифицировать все репозитории в Forgejo, а также базу данных Forgejo. Следовательно, они также могут получить права администратора Forgejo.
users.allow_import_local=Может импортировать локальные репозитории
@@ -3470,7 +3473,7 @@ mib = МиБ
gib = ГиБ
tib = ТиБ
pib = ПиБ
-eib = ЕиБ
+eib = ЭиБ
[dropzone]
default_message=Перетащите файл или кликните сюда для загрузки.
diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini
index 1d133d7570..eae82f6007 100644
--- a/options/locale/locale_si-LK.ini
+++ b/options/locale/locale_si-LK.ini
@@ -21,7 +21,7 @@ user_profile_and_more=පැතිකඩ සහ සැකසුම්…
signed_in_as=ලෙස පිවිසී ඇත
toc=පටුන
licenses=බලපත්ර
-return_to_gitea=ගිටියා වෙත ආපසු
+return_to_forgejo=ගිටියා වෙත ආපසු
username=පරිශීලක නාමය
email=වි-තැපැල් ලිපිනය
@@ -1921,7 +1921,7 @@ org_name_holder=සංවිධානයේ නම
org_full_name_holder=සංවිධානයේ සම්පූර්ණ නම
org_name_helper=සංවිධාන නම් කෙටි හා අමතක නොවන විය යුතුය.
create_org=සංවිධානය සාදන්න
-repo_updated=යාවත්කාල කෙරිණි
+repo_updated=යාවත්කාල කෙරිණි %s
members=සාමාජිකයින්
teams=කණ්ඩායම්
lower_members=සාමාජිකයින්
diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini
index 034d32454f..c5adf6bbc7 100644
--- a/options/locale/locale_sk-SK.ini
+++ b/options/locale/locale_sk-SK.ini
@@ -25,7 +25,7 @@ signed_in_as=Prihlásený ako
enable_javascript=Táto stránka vyžaduje JavaScript.
toc=Obsah
licenses=Licencie
-return_to_gitea=Naspäť do Forgejo
+return_to_forgejo=Naspäť do Forgejo
username=Používateľské meno
email=Emailová adresa
diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini
index ed6153b70f..b4ff39f94f 100644
--- a/options/locale/locale_sl.ini
+++ b/options/locale/locale_sl.ini
@@ -20,7 +20,7 @@ user_profile_and_more = Profil in nastavitve…
view = Ogled
your_settings = Nastavitve
explore = Raziščite
-return_to_gitea = Vrnitev v Forgejo
+return_to_forgejo = Vrnitev v Forgejo
write = Napišite
webauthn_error_unknown = Zgodila se je neznana napaka. Prosimo, poskusite znova.
webauthn_reload = Ponovno polnjenje
diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini
index 0e7529774c..e2c7277987 100644
--- a/options/locale/locale_sv-SE.ini
+++ b/options/locale/locale_sv-SE.ini
@@ -20,7 +20,7 @@ user_profile_and_more=Profil och Inställningar…
signed_in_as=Inloggad som
toc=Innehållsförteckning
licenses=Licenser
-return_to_gitea=Återgå till Forgejo
+return_to_forgejo=Återgå till Forgejo
username=Användarnamn
email=E-postadress
@@ -1546,7 +1546,7 @@ org_name_holder=Organisationsnamn
org_full_name_holder=Organisationens Fullständiga Namn
org_name_helper=Organisationsnamn bör vara korta och enkla att komma ihåg.
create_org=Skapa organisation
-repo_updated=Uppdaterad
+repo_updated=Uppdaterad %s
members=Medlemmar
teams=Grupper
lower_members=medlemmar
diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini
index 02a3a2dc08..b178158bdd 100644
--- a/options/locale/locale_tr-TR.ini
+++ b/options/locale/locale_tr-TR.ini
@@ -25,7 +25,7 @@ signed_in_as=Giriş yapan:
enable_javascript=Bu web sitesinin çalışması için JavaScript gereklidir.
toc=İçindekiler Tablosu
licenses=Lisanslar
-return_to_gitea=Forgejo'ya Dön
+return_to_forgejo=Forgejo'ya Dön
username=Kullanıcı Adı
email=E-posta Adresi
@@ -2591,7 +2591,7 @@ org_name_holder=Organizasyon Adı
org_full_name_holder=Organizasyon Tam Adı
org_name_helper=Organizasyon adları kısa ve hatırlanabilir olmalıdır.
create_org=Organizasyon Oluştur
-repo_updated=Güncellendi
+repo_updated=Güncellendi %s
members=Üyeler
teams=Takımlar
code=Kod
diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini
index 482d27b504..d8ee5c6fa4 100644
--- a/options/locale/locale_uk-UA.ini
+++ b/options/locale/locale_uk-UA.ini
@@ -21,7 +21,7 @@ user_profile_and_more=Профіль і налаштування…
signed_in_as=Увійшов як
toc=Зміст
licenses=Ліцензії
-return_to_gitea=Повернутися до Forgejo
+return_to_forgejo=Повернутися до Forgejo
username=Ім'я кристувача
email=Адреса електронної пошти
@@ -2078,7 +2078,7 @@ org_name_holder=Назва організації
org_full_name_holder=Повна назва організації
org_name_helper=Назва організації має бути простою та зрозумілою.
create_org=Створити організацію
-repo_updated=Оновлено
+repo_updated=Оновлено %s
members=Учасники
teams=Команди
lower_members=учасники
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index af58a3da72..6eecc38674 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -25,7 +25,7 @@ signed_in_as=已登录用户
enable_javascript=此网站需要 JavaScript。
toc=目录
licenses=许可证
-return_to_gitea=返回 Forgejo
+return_to_forgejo=返回 Forgejo
username=用户名
email=电子邮件地址
@@ -1001,6 +1001,7 @@ update_hints_success = 提示更改成功。
pronouns_custom = 自定义
pronouns = 代词
pronouns_unspecified = 不指定
+language.title = 默认语言
[repo]
new_repo_helper=代码仓库包含了所有的项目文件,包括版本历史记录。已经在其他地方托管了?迁移仓库。
@@ -1099,7 +1100,7 @@ blame.ignore_revs.failed=忽略 .git-blame-ignore-revs 版本
author_search_tooltip=最多显示30个用户
tree_path_not_found_commit=路径%[1]s 在提交 %[2]s 中不存在
-tree_path_not_found_branch=路径 %[1]s 不存在于分支 %[2]s 中。
+tree_path_not_found_branch=路径 %[1]s 不存在于分支 %[2]s 中
tree_path_not_found_tag=路径 %[1]s 不存在于标签 %[2]s 中
transfer.accept=接受转移
@@ -2749,6 +2750,8 @@ settings.sourcehut_builds.visibility = 作业可见性
settings.matrix.room_id_helper = 房间 ID 可从 Element Web 客户端 > 房间设置 > 高级 > 内部房间 ID 获得。例如:%s。
release.hide_archive_links_helper = 为此版本发布隐藏自动生成的源代码存档。例如,如果您准备自行上传。
release.hide_archive_links = 隐藏自动生成的存档
+settings.transfer.modal.title = 转移所有权
+settings.transfer.button = 转移所有权
[graphs]
component_loading=正在加载 %s...
@@ -2764,7 +2767,7 @@ org_name_holder=组织名称
org_full_name_holder=组织全名
org_name_helper=组织名字应该简单明了。
create_org=创建组织
-repo_updated=最后更新于
+repo_updated=于 %s 更新
members=成员
teams=团队
code=代码
diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini
index 4e5be41392..5faf719a35 100644
--- a/options/locale/locale_zh-HK.ini
+++ b/options/locale/locale_zh-HK.ini
@@ -71,7 +71,7 @@ user_profile_and_more = 個人資料同埋設定…
signed_in_as = 已經登入
toc = 目錄
licenses = 軟件授權
-return_to_gitea = 返來 Forgejo
+return_to_forgejo = 返來 Forgejo
username = 用戶名
captcha = 驗證碼
toggle_menu = 切換選單
@@ -676,7 +676,7 @@ release.downloads=下載附件
org_name_holder=組織名稱
org_full_name_holder=組織全名
create_org=建立組織
-repo_updated=最後更新於
+repo_updated=最後更新於 %s
members=成員數
teams=組織團隊
lower_members=名成員
diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini
index 0a17b021b1..f52c5e6879 100644
--- a/options/locale/locale_zh-TW.ini
+++ b/options/locale/locale_zh-TW.ini
@@ -8,27 +8,27 @@ sign_in=登入
sign_in_or=或
sign_out=登出
sign_up=註冊
-link_account=連結帳戶
+link_account=連結帳號
register=註冊
version=版本
-powered_by=技術提供: %s
+powered_by=技術由 %s 提供
page=頁面
template=模板
language=語言
notifications=通知
active_stopwatch=進行中的時間追蹤
-create_new=建立...
-user_profile_and_more=個人資料和設定...
-signed_in_as=已登入
+create_new=建立…
+user_profile_and_more=個人資料和設定…
+signed_in_as=已登入為
enable_javascript=本網站需要 JavaScript。
toc=目錄
licenses=授權條款
-return_to_gitea=返回 Forgejo
+return_to_forgejo=返回 Forgejo
username=帳號
email=電子信箱
password=密碼
-access_token=訪問符記
+access_token=存取符記
re_type=確認密碼
captcha=驗證碼
twofa=兩步驟驗證
@@ -43,8 +43,8 @@ webauthn_error=無法讀取您的安全金鑰。
webauthn_unsupported_browser=您的瀏覽器還不支援 WebAuthn。
webauthn_error_unknown=發生未知的錯誤,請再試一次。
webauthn_error_insecure=WebAuthn 只支援安全連線。想在 HTTP 上測試,您可以使用「localhost」或「127.0.0.1」
-webauthn_error_unable_to_process=伺服器無法執行您的請求。
-webauthn_error_duplicated=此請求不允許使用這個安全金鑰。請確保該金鑰尚未註冊。
+webauthn_error_unable_to_process=伺服器無法處理您的請求。
+webauthn_error_duplicated=此安全金鑰無法允許這個請求。請確保該金鑰尚未被註冊。
webauthn_error_empty=您必須命名此金鑰。
webauthn_error_timeout=在成功讀取金鑰之前已逾時,請重新載入此頁面並重試。
webauthn_reload=重新載入
@@ -54,7 +54,7 @@ organization=組織
mirror=鏡像
new_repo=新增儲存庫
new_migrate=遷移外部儲存庫
-new_mirror=建立新的鏡像
+new_mirror=新增鏡像
new_fork=新增儲存庫 Fork
new_org=新增組織
new_project=新增專案
@@ -82,8 +82,8 @@ ok=確認
cancel=取消
retry=重試
save=儲存
-add=增加
-add_all=全部增加
+add=新增
+add_all=全部新增
remove=移除
remove_all=全部移除
remove_label_str=移除項目「%s」
@@ -105,7 +105,7 @@ preview=預覽
loading=載入中…
error=錯誤
-error404=您正嘗試訪問的頁面 不存在 或 您尚未被授權 查看該頁面。
+error404=您嘗試造訪的頁面 不存在 或 您沒有權限 檢視該頁面。
never=從來沒有
unknown=未知
@@ -131,32 +131,32 @@ tracked_time_summary = 基於 issue 清單篩選器的追蹤時間摘要
locked = 已鎖定
rerun = 重新執行
rerun_all = 重新執行所有作業
-copy_hash = 複製哈希值
+copy_hash = 複製雜湊值
toggle_menu = 切換選單
-concept_system_global = 全局
-view = 查看
+concept_system_global = 全域
+view = 檢視
filter = 篩選
-filter.clear = 清除篩選條件
-filter.is_archived = 已歸檔
-filter.not_archived = 未封存
-filter.is_fork = 已分叉
+filter.clear = 清空篩選條件
+filter.is_archived = 已封存
+filter.not_archived = 未被封存
+filter.is_fork = 是分叉
filter.not_fork = 不是分叉
-filter.is_mirror = 鏡像
+filter.is_mirror = 是鏡像
filter.not_mirror = 不是鏡像
-filter.is_template = 範本
+filter.is_template = 是範本
filter.not_template = 不是範本
filter.public = 公開
filter.private = 私有
artifacts = 製品
concept_user_individual = 個人
-show_timestamps = 顯示時間戳
+show_timestamps = 顯示時間戳記
show_log_seconds = 顯示秒數
-show_full_screen = 全屏顯示
+show_full_screen = 全螢幕顯示
download_logs = 下載日誌
-confirm_delete_selected = 確認刪除所有選中專案?
-confirm_delete_artifact = 您確定要刪除製品“%s”嗎?
+confirm_delete_selected = 確認刪除所有選擇的項目?
+confirm_delete_artifact = 您確定要刪除製品「%s」嗎?
more_items = 顯示更多
-invalid_data = 無效數據:%v
+invalid_data = 無效資料:%v
copy_generic = 複製到剪貼簿
[aria]
@@ -185,7 +185,7 @@ buttons.list.unordered.tooltip=新增項目符號清單
buttons.list.ordered.tooltip=新增編號清單
buttons.list.task.tooltip=新增工作項目清單
buttons.mention.tooltip=提及使用者或團隊
-buttons.ref.tooltip=參考問題或合併請求
+buttons.ref.tooltip=引用問題或合併請求
buttons.enable_monospace_font=啟用等寬字型
buttons.disable_monospace_font=停用等寬字型
buttons.switch_to_legacy.tooltip = 使用舊版編輯器
@@ -196,41 +196,42 @@ string.desc=Z - A
[error]
occurred=發生錯誤
-missing_csrf=錯誤的請求:未提供 CSRF token
-invalid_csrf=錯誤的請求:無效的 CSRF token
+missing_csrf=錯誤的請求:未提供 CSRF 符記
+invalid_csrf=錯誤的請求:無效的 CSRF 符記
not_found=找不到目標。
network_error=網路錯誤
-report_message = 如果您確定這是一個 Forgejo bug,請在 Codeberg 上搜索問題,或在必要時建立一個新工單。
+report_message = 如果您確定這是一個 Forgejo 的錯誤,請在 Codeberg 上搜尋相關問題,或在必要時提出一個問題。
server_internal = 伺服器內部錯誤
[startpage]
app_desc=一套極易架設的 Git 服務
install=安裝容易
platform=跨平台
-platform_desc=Forgejo 可以在所有能編譯 Go 語言的平台上執行: Windows, macOS, Linux, ARM 等等。挑一個您喜歡的吧!
+platform_desc=Forgejo 可以在所有能編譯 Go 語言的平台上執行:Windows,macOS,Linux,ARM 等。挑一個您喜歡的吧!
lightweight=輕量級
lightweight_desc=一片便宜的 Raspberry Pi 就可以滿足 Forgejo 的最低需求。節省您的機器資源!
license=開放原始碼
license_desc=取得 Forgejo !成為一名貢獻者和我們一起讓 Forgejo 更好,快點加入我們吧!
+install_desc = 輕鬆使用您平台的可執行檔,使用 Docker 部署,抑或是軟體包。
[install]
install=安裝頁面
-title=初始化設定
+title=最初組態
docker_helper=如果您在 Docker 中執行 Forgejo,請先閱讀安裝指南再來調整設定。
-require_db_desc=Forgejo 需要 MySQL、PostgreSQL、SQLite3、TiDB (MySQL 協定) 等其中一項。
+require_db_desc=Forgejo 需要 MySQL、PostgreSQL、SQLite3 或 TiDB (MySQL 協定)。
db_title=資料庫設定
db_type=資料庫類型
host=主機
-user=帳號
+user=使用者名稱
password=密碼
db_name=資料庫名稱
-db_schema=Schema
-db_schema_helper=留空則使用資料庫預設值("public")。
+db_schema=綱要
+db_schema_helper=留空將使用資料庫預設值("public")。
ssl_mode=SSL
-path=資料庫檔案路徑
-sqlite_helper=SQLite3 或 TiDB 資料庫的檔案路徑。%[1]s
為 %[3]s
-commit_repo=推送了 %[3]s 到 %[4]s
+commit_repo=推送到了 %[4]s 儲存庫的 %[3]s 分支
create_issue=`建立了問題 %[3]s#%[2]s`
close_issue=`關閉了問題 %[3]s#%[2]s`
reopen_issue=`重新開放了問題 %[3]s#%[2]s`
@@ -3431,11 +3433,11 @@ runners.status.idle=閒置
runners.status.active=啟用
runners.status.offline=離線
runners.version=版本
-runners.reset_registration_token_success=成功重設了 Runner 註冊 Token
+runners.reset_registration_token_success=成功重設了 Runner 註冊符記
runs.all_workflows=所有工作流程
runs.commit=提交
-runs.invalid_workflow_helper=工作流程設定檔無效。請檢查您的設定檔: %s
+runs.invalid_workflow_helper=工作流程設定檔無效。請檢查您的設定檔:%s
runs.status=狀態
runs.no_runs=工作流程沒有執行過。
@@ -3444,7 +3446,7 @@ workflow.disable_success=已成功停用工作流程「%s」。
workflow.enable=啟用工作流程
workflow.enable_success=已成功啟用工作流程「%s」。
-need_approval_desc=來自 Frok 儲存庫的合併請求需要核可才能執行工作流程。
+need_approval_desc=來自 Fork 儲存庫的合併請求需要核可才能執行工作流程。
variables.edit = 編輯變數
variables = 變數
variables.management = 變數管理
@@ -3487,7 +3489,7 @@ executable_file = 可執行檔
[search]
-package_kind = 搜尋套件…
+package_kind = 搜尋軟體包…
search = 搜尋…
type_tooltip = 搜尋類型
match_tooltip = 僅包含與搜尋字詞完全相符的結果
@@ -3498,12 +3500,12 @@ match = 相符
user_kind = 搜尋使用者…
org_kind = 搜尋組織…
team_kind = 搜尋團隊…
-code_kind = 搜尋程式碼
-code_search_unavailable = 程式碼搜尋目前無法使用。請連絡網站管理員。
+code_kind = 搜尋程式碼…
+code_search_unavailable = 目前無法使用程式碼搜尋。請連絡網站管理員。
no_results = 沒有找到相符的結果。
keyword_search_unavailable = 關鍵字搜尋目前無法使用。請連絡網站管理員。
runner_kind = 搜尋 Runners …
project_kind = 搜尋專案…
branch_kind = 搜尋分支…
commit_kind = 搜尋提交…
-code_search_by_git_grep = 目前搜尋結果由「git grep」提供。如果網站管理員啟程式碼索引,可能會有更好的結果。
\ No newline at end of file
+code_search_by_git_grep = 目前搜尋結果由「git grep」提供。如果網站管理員啟用程式碼索引,可能會有更好的結果。
\ No newline at end of file
diff --git a/poetry.lock b/poetry.lock
index b07d161a4c..277775e50c 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
[[package]]
name = "click"
@@ -336,13 +336,13 @@ files = [
[[package]]
name = "tqdm"
-version = "4.66.2"
+version = "4.66.4"
description = "Fast, Extensible Progress Meter"
optional = false
python-versions = ">=3.7"
files = [
- {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"},
- {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"},
+ {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"},
+ {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"},
]
[package.dependencies]
diff --git a/release-notes/8.0.0/3572.md b/release-notes/8.0.0/3572.md
deleted file mode 100644
index c79f9e30fc..0000000000
--- a/release-notes/8.0.0/3572.md
+++ /dev/null
@@ -1 +0,0 @@
-Fix gogs migration if gogs is hosted at a subpath
diff --git a/release-notes/8.0.0/3583.md b/release-notes/8.0.0/3583.md
deleted file mode 100644
index 0f5fdc8f60..0000000000
--- a/release-notes/8.0.0/3583.md
+++ /dev/null
@@ -1 +0,0 @@
-Settings: OAuth2 applications: Consistently check input on client side
diff --git a/release-notes/8.0.0/3608.md b/release-notes/8.0.0/3608.md
deleted file mode 100644
index 1c3072422a..0000000000
--- a/release-notes/8.0.0/3608.md
+++ /dev/null
@@ -1 +0,0 @@
-Fix text selection color
diff --git a/release-notes/8.0.0/3671.md b/release-notes/8.0.0/3671.md
deleted file mode 100644
index 4989ba310e..0000000000
--- a/release-notes/8.0.0/3671.md
+++ /dev/null
@@ -1 +0,0 @@
-CVE-2024-24788: a malformed DNS message in response to a query can cause the Lookup functions to get stuck in an infinite loop.
diff --git a/release-notes/8.0.0/3811.md b/release-notes/8.0.0/3811.md
new file mode 100644
index 0000000000..e792ca4ec2
--- /dev/null
+++ b/release-notes/8.0.0/3811.md
@@ -0,0 +1 @@
+Implement a non-caching version of the [RubyGems compact API](https://guides.rubygems.org/rubygems-org-compact-index-api/) for bundler dependency resolution.
diff --git a/release-notes/8.0.0/3830.md b/release-notes/8.0.0/3830.md
new file mode 100644
index 0000000000..5e46a45ec9
--- /dev/null
+++ b/release-notes/8.0.0/3830.md
@@ -0,0 +1 @@
+Neutralize delete runners' UUID to prevent collisions with new records
diff --git a/release-notes/8.0.0/feat/3836.md b/release-notes/8.0.0/feat/3836.md
new file mode 100644
index 0000000000..1052c6d22a
--- /dev/null
+++ b/release-notes/8.0.0/feat/3836.md
@@ -0,0 +1 @@
+Parse prefix parameter from redis URI for queues and use that as prefix to keys
diff --git a/release-notes/8.0.0/feat/3847.md b/release-notes/8.0.0/feat/3847.md
new file mode 100644
index 0000000000..3ff9e872d7
--- /dev/null
+++ b/release-notes/8.0.0/feat/3847.md
@@ -0,0 +1,3 @@
+Basic wiki content search using git-grep
+ - The search results include the first ten matched files
+ - Only the first three matches per file are displayed
diff --git a/release-notes/8.0.0/fix/3464.md b/release-notes/8.0.0/fix/3464.md
deleted file mode 100644
index cc15862863..0000000000
--- a/release-notes/8.0.0/fix/3464.md
+++ /dev/null
@@ -1 +0,0 @@
-Fixed a bug where API endpoints that return a `Repository` did not properly include the repository's object format.
diff --git a/release-notes/8.0.0/fix/3598.md b/release-notes/8.0.0/fix/3598.md
deleted file mode 100644
index 9d6b4ae0a4..0000000000
--- a/release-notes/8.0.0/fix/3598.md
+++ /dev/null
@@ -1 +0,0 @@
-Fixed an issue that resulted in repository activity feeds (including RSS and Atom feeds) containing repeated activities.
diff --git a/release-notes/8.0.0/fix/3675.md b/release-notes/8.0.0/fix/3675.md
deleted file mode 100644
index c6feed07ca..0000000000
--- a/release-notes/8.0.0/fix/3675.md
+++ /dev/null
@@ -1 +0,0 @@
-Fixed an issue that rendered the "Allow edits from maintainers" checkbox disfunctional, preventing people from turning it on.
diff --git a/release-notes/8.0.0/fix/3729.md b/release-notes/8.0.0/fix/3729.md
index 27d83e0e55..9123c4a08f 100644
--- a/release-notes/8.0.0/fix/3729.md
+++ b/release-notes/8.0.0/fix/3729.md
@@ -1,2 +1 @@
-- [PR](https://github.com/go-gitea/gitea/pull/30912): when adopting a repository, the default branch is not taken into account
- [PR](https://github.com/go-gitea/gitea/pull/30715): pull request search shows closed pull requests in the open tab
diff --git a/release-notes/8.0.0/fix/3744.md b/release-notes/8.0.0/fix/3744.md
deleted file mode 100644
index 5d5d3ef9fe..0000000000
--- a/release-notes/8.0.0/fix/3744.md
+++ /dev/null
@@ -1 +0,0 @@
-- mail notifications of pull requests push are empty
diff --git a/release-notes/8.0.0/fix/3776.md b/release-notes/8.0.0/fix/3776.md
deleted file mode 100644
index b3577271e8..0000000000
--- a/release-notes/8.0.0/fix/3776.md
+++ /dev/null
@@ -1 +0,0 @@
-- backticks in [mermaid](https://mermaid.js.org/) block diagram labels [are not sanitized properly](https://github.com/mermaid-js/mermaid/commit/c7fe9a646574597adefe3e6fb2b3707112a151aa)
diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go
index 5e3cbac8f9..79285783b9 100644
--- a/routers/api/packages/api.go
+++ b/routers/api/packages/api.go
@@ -586,6 +586,8 @@ func CommonRoutes() *web.Route {
r.Get("/specs.4.8.gz", rubygems.EnumeratePackages)
r.Get("/latest_specs.4.8.gz", rubygems.EnumeratePackagesLatest)
r.Get("/prerelease_specs.4.8.gz", rubygems.EnumeratePackagesPreRelease)
+ r.Get("/info/{package}", rubygems.ServePackageInfo)
+ r.Get("/versions", rubygems.ServeVersionsFile)
r.Get("/quick/Marshal.4.8/{filename}", rubygems.ServePackageSpecification)
r.Get("/gems/{filename}", rubygems.DownloadPackageFile)
r.Group("/api/v1/gems", func() {
diff --git a/routers/api/packages/rubygems/rubygems.go b/routers/api/packages/rubygems/rubygems.go
index ba5f4de080..dfefe2c4fb 100644
--- a/routers/api/packages/rubygems/rubygems.go
+++ b/routers/api/packages/rubygems/rubygems.go
@@ -6,6 +6,7 @@ package rubygems
import (
"compress/gzip"
"compress/zlib"
+ "crypto/md5"
"errors"
"fmt"
"io"
@@ -22,6 +23,10 @@ import (
packages_service "code.gitea.io/gitea/services/packages"
)
+const (
+ Sep = "---\n"
+)
+
func apiError(ctx *context.Context, status int, obj any) {
helper.LogAndProcessError(ctx, status, obj, func(message string) {
ctx.PlainText(status, message)
@@ -92,6 +97,69 @@ func enumeratePackages(ctx *context.Context, filename string, pvs []*packages_mo
}
}
+// Serves info file for rubygems.org compatible /info/{gem} file.
+// See also https://guides.rubygems.org/rubygems-org-compact-index-api/.
+func ServePackageInfo(ctx *context.Context) {
+ packageName := ctx.Params("package")
+ versions, err := packages_model.GetVersionsByPackageName(
+ ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, packageName)
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ }
+ if len(versions) == 0 {
+ apiError(ctx, http.StatusNotFound, fmt.Sprintf("Could not find package %s", packageName))
+ }
+
+ result, err := buildInfoFileForPackage(ctx, versions)
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+
+ ctx.PlainText(http.StatusOK, *result)
+}
+
+// ServeVersionsFile creates rubygems.org compatible /versions file.
+// See also https://guides.rubygems.org/rubygems-org-compact-index-api/.
+func ServeVersionsFile(ctx *context.Context) {
+ packages, err := packages_model.GetPackagesByType(
+ ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems)
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+ result := new(strings.Builder)
+ result.WriteString(Sep)
+ for _, pack := range packages {
+ versions, err := packages_model.GetVersionsByPackageName(
+ ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, pack.Name)
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ }
+ if len(versions) == 0 {
+ // No versions left for this package, we should continue.
+ continue
+ }
+
+ fmt.Fprintf(result, "%s ", pack.Name)
+ for i, v := range versions {
+ result.WriteString(v.Version)
+ if i != len(versions)-1 {
+ result.WriteString(",")
+ }
+ }
+
+ info, err := buildInfoFileForPackage(ctx, versions)
+ if err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ }
+
+ checksum := md5.Sum([]byte(*info))
+ fmt.Fprintf(result, " %x\n", checksum)
+ }
+ ctx.PlainText(http.StatusOK, result.String())
+}
+
// ServePackageSpecification serves the compressed Gemspec file of a package
func ServePackageSpecification(ctx *context.Context) {
filename := ctx.Params("filename")
@@ -227,12 +295,7 @@ func UploadPackageFile(ctx *context.Context) {
return
}
- var filename string
- if rp.Metadata.Platform == "" || rp.Metadata.Platform == "ruby" {
- filename = strings.ToLower(fmt.Sprintf("%s-%s.gem", rp.Name, rp.Version))
- } else {
- filename = strings.ToLower(fmt.Sprintf("%s-%s-%s.gem", rp.Name, rp.Version, rp.Metadata.Platform))
- }
+ filename := getFullFilename(rp.Name, rp.Version, rp.Metadata.Platform)
_, _, err = packages_service.CreatePackageAndAddFile(
ctx,
@@ -300,6 +363,83 @@ func DeletePackage(ctx *context.Context) {
}
}
+func writeRequirements(reqs []rubygems_module.VersionRequirement, result *strings.Builder) {
+ if len(reqs) == 0 {
+ reqs = []rubygems_module.VersionRequirement{{Restriction: ">=", Version: "0"}}
+ }
+ for i, req := range reqs {
+ if i != 0 {
+ result.WriteString("&")
+ }
+ result.WriteString(req.Restriction)
+ result.WriteString(" ")
+ result.WriteString(req.Version)
+ }
+}
+
+func buildRequirementStringFromVersion(ctx *context.Context, version *packages_model.PackageVersion) (string, error) {
+ pd, err := packages_model.GetPackageDescriptor(ctx, version)
+ if err != nil {
+ return "", err
+ }
+ metadata := pd.Metadata.(*rubygems_module.Metadata)
+ dependencyRequirements := new(strings.Builder)
+ for i, dep := range metadata.RuntimeDependencies {
+ if i != 0 {
+ dependencyRequirements.WriteString(",")
+ }
+
+ dependencyRequirements.WriteString(dep.Name)
+ dependencyRequirements.WriteString(":")
+ reqs := dep.Version
+ writeRequirements(reqs, dependencyRequirements)
+ }
+ fullname := getFullFilename(pd.Package.Name, version.Version, metadata.Platform)
+ file, err := packages_model.GetFileForVersionByName(ctx, version.ID, fullname, "")
+ if err != nil {
+ return "", err
+ }
+ blob, err := packages_model.GetBlobByID(ctx, file.BlobID)
+ if err != nil {
+ return "", err
+ }
+ additionalRequirements := new(strings.Builder)
+ fmt.Fprintf(additionalRequirements, "checksum:%s", blob.HashSHA256)
+ if len(metadata.RequiredRubyVersion) != 0 {
+ additionalRequirements.WriteString(",ruby:")
+ writeRequirements(metadata.RequiredRubyVersion, additionalRequirements)
+ }
+ if len(metadata.RequiredRubygemsVersion) != 0 {
+ additionalRequirements.WriteString(",rubygems:")
+ writeRequirements(metadata.RequiredRubygemsVersion, additionalRequirements)
+ }
+ return fmt.Sprintf("%s %s|%s", version.Version, dependencyRequirements, additionalRequirements), nil
+}
+
+func buildInfoFileForPackage(ctx *context.Context, versions []*packages_model.PackageVersion) (*string, error) {
+ result := "---\n"
+ for _, v := range versions {
+ str, err := buildRequirementStringFromVersion(ctx, v)
+ if err != nil {
+ return nil, err
+ }
+ result += str
+ result += "\n"
+ }
+ return &result, nil
+}
+
+func getFullFilename(gemName, version, platform string) string {
+ return strings.ToLower(getFullName(gemName, version, platform)) + ".gem"
+}
+
+func getFullName(gemName, version, platform string) string {
+ if platform == "" || platform == "ruby" {
+ return fmt.Sprintf("%s-%s", gemName, version)
+ }
+ return fmt.Sprintf("%s-%s-%s", gemName, version, platform)
+}
+
func getVersionsByFilename(ctx *context.Context, filename string) ([]*packages_model.PackageVersion, error) {
pvs, _, err := packages_model.SearchVersions(ctx, &packages_model.PackageSearchOptions{
OwnerID: ctx.Package.Owner.ID,
diff --git a/routers/api/v1/org/avatar.go b/routers/api/v1/org/avatar.go
index e34c68dfc9..f11eb6c1cd 100644
--- a/routers/api/v1/org/avatar.go
+++ b/routers/api/v1/org/avatar.go
@@ -46,6 +46,7 @@ func UpdateAvatar(ctx *context.APIContext) {
err = user_service.UploadAvatar(ctx, ctx.Org.Organization.AsUser(), content)
if err != nil {
ctx.Error(http.StatusInternalServerError, "UploadAvatar", err)
+ return
}
ctx.Status(http.StatusNoContent)
@@ -72,6 +73,7 @@ func DeleteAvatar(ctx *context.APIContext) {
err := user_service.DeleteAvatar(ctx, ctx.Org.Organization.AsUser())
if err != nil {
ctx.Error(http.StatusInternalServerError, "DeleteAvatar", err)
+ return
}
ctx.Status(http.StatusNoContent)
diff --git a/routers/api/v1/repo/issue_label.go b/routers/api/v1/repo/issue_label.go
index fd9625c0fb..ae05544365 100644
--- a/routers/api/v1/repo/issue_label.go
+++ b/routers/api/v1/repo/issue_label.go
@@ -5,7 +5,9 @@
package repo
import (
+ "fmt"
"net/http"
+ "reflect"
issues_model "code.gitea.io/gitea/models/issues"
api "code.gitea.io/gitea/modules/structs"
@@ -337,7 +339,32 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption)
return nil, nil, err
}
- labels, err := issues_model.GetLabelsByIDs(ctx, form.Labels, "id", "repo_id", "org_id", "name", "exclusive")
+ var (
+ labelIDs []int64
+ labelNames []string
+ )
+ for _, label := range form.Labels {
+ rv := reflect.ValueOf(label)
+ switch rv.Kind() {
+ case reflect.Float64:
+ labelIDs = append(labelIDs, int64(rv.Float()))
+ case reflect.String:
+ labelNames = append(labelNames, rv.String())
+ }
+ }
+ if len(labelIDs) > 0 && len(labelNames) > 0 {
+ ctx.Error(http.StatusBadRequest, "InvalidLabels", "labels should be an array of strings or integers")
+ return nil, nil, fmt.Errorf("invalid labels")
+ }
+ if len(labelNames) > 0 {
+ labelIDs, err = issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "GetLabelIDsInRepoByNames", err)
+ return nil, nil, err
+ }
+ }
+
+ labels, err := issues_model.GetLabelsByIDs(ctx, labelIDs, "id", "repo_id", "org_id", "name", "exclusive")
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetLabelsByIDs", err)
return nil, nil, err
diff --git a/routers/api/v1/repo/release.go b/routers/api/v1/repo/release.go
index 057282b210..1544a64273 100644
--- a/routers/api/v1/repo/release.go
+++ b/routers/api/v1/repo/release.go
@@ -215,6 +215,9 @@ func CreateRelease(ctx *context.APIContext) {
// "$ref": "#/responses/notFound"
// "409":
// "$ref": "#/responses/error"
+ // "422":
+ // "$ref": "#/responses/validationError"
+
form := web.GetForm(ctx).(*api.CreateReleaseOption)
if ctx.Repo.Repository.IsEmpty {
ctx.Error(http.StatusUnprocessableEntity, "RepoIsEmpty", fmt.Errorf("repo is empty"))
@@ -247,6 +250,8 @@ func CreateRelease(ctx *context.APIContext) {
if err := release_service.CreateRelease(ctx.Repo.GitRepo, rel, nil, ""); err != nil {
if repo_model.IsErrReleaseAlreadyExist(err) {
ctx.Error(http.StatusConflict, "ReleaseAlreadyExist", err)
+ } else if models.IsErrProtectedTagName(err) {
+ ctx.Error(http.StatusUnprocessableEntity, "ProtectedTagName", err)
} else {
ctx.Error(http.StatusInternalServerError, "CreateRelease", err)
}
@@ -391,8 +396,8 @@ func DeleteRelease(ctx *context.APIContext) {
// "$ref": "#/responses/empty"
// "404":
// "$ref": "#/responses/notFound"
- // "405":
- // "$ref": "#/responses/empty"
+ // "422":
+ // "$ref": "#/responses/validationError"
id := ctx.ParamsInt64(":id")
rel, err := repo_model.GetReleaseForRepoByID(ctx, ctx.Repo.Repository.ID, id)
@@ -406,7 +411,7 @@ func DeleteRelease(ctx *context.APIContext) {
}
if err := release_service.DeleteReleaseByID(ctx, ctx.Repo.Repository, rel, ctx.Doer, false); err != nil {
if models.IsErrProtectedTagName(err) {
- ctx.Error(http.StatusMethodNotAllowed, "delTag", "user not allowed to delete protected tag")
+ ctx.Error(http.StatusUnprocessableEntity, "delTag", "user not allowed to delete protected tag")
return
}
ctx.Error(http.StatusInternalServerError, "DeleteReleaseByID", err)
diff --git a/routers/api/v1/repo/release_tags.go b/routers/api/v1/repo/release_tags.go
index fec91164a2..f845fad53b 100644
--- a/routers/api/v1/repo/release_tags.go
+++ b/routers/api/v1/repo/release_tags.go
@@ -92,8 +92,8 @@ func DeleteReleaseByTag(ctx *context.APIContext) {
// "$ref": "#/responses/empty"
// "404":
// "$ref": "#/responses/notFound"
- // "405":
- // "$ref": "#/responses/empty"
+ // "422":
+ // "$ref": "#/responses/validationError"
tag := ctx.Params(":tag")
@@ -114,7 +114,7 @@ func DeleteReleaseByTag(ctx *context.APIContext) {
if err = releaseservice.DeleteReleaseByID(ctx, ctx.Repo.Repository, release, ctx.Doer, false); err != nil {
if models.IsErrProtectedTagName(err) {
- ctx.Error(http.StatusMethodNotAllowed, "delTag", "user not allowed to delete protected tag")
+ ctx.Error(http.StatusUnprocessableEntity, "delTag", "user not allowed to delete protected tag")
return
}
ctx.Error(http.StatusInternalServerError, "DeleteReleaseByID", err)
diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go
index 4be8c8ee72..08bc86eed8 100644
--- a/routers/api/v1/repo/repo.go
+++ b/routers/api/v1/repo/repo.go
@@ -1072,16 +1072,10 @@ func updateRepoArchivedState(ctx *context.APIContext, opts api.EditRepoOption) e
func updateMirror(ctx *context.APIContext, opts api.EditRepoOption) error {
repo := ctx.Repo.Repository
- // only update mirror if interval or enable prune are provided
- if opts.MirrorInterval == nil && opts.EnablePrune == nil {
- return nil
- }
-
- // these values only make sense if the repo is a mirror
+ // Skip this update if the repo is not a mirror, do not return error.
+ // Because reporting errors only makes the logic more complex&fragile, it doesn't really help end users.
if !repo.IsMirror {
- err := fmt.Errorf("repo is not a mirror, can not change mirror interval")
- ctx.Error(http.StatusUnprocessableEntity, err.Error(), err)
- return err
+ return nil
}
// get the mirror from the repo
diff --git a/routers/api/v1/repo/tag.go b/routers/api/v1/repo/tag.go
index b498f0e792..69dd844298 100644
--- a/routers/api/v1/repo/tag.go
+++ b/routers/api/v1/repo/tag.go
@@ -204,6 +204,8 @@ func CreateTag(ctx *context.APIContext) {
// "$ref": "#/responses/empty"
// "409":
// "$ref": "#/responses/conflict"
+ // "422":
+ // "$ref": "#/responses/validationError"
// "423":
// "$ref": "#/responses/repoArchivedError"
form := web.GetForm(ctx).(*api.CreateTagOption)
@@ -225,7 +227,7 @@ func CreateTag(ctx *context.APIContext) {
return
}
if models.IsErrProtectedTagName(err) {
- ctx.Error(http.StatusMethodNotAllowed, "CreateNewTag", "user not allowed to create protected tag")
+ ctx.Error(http.StatusUnprocessableEntity, "CreateNewTag", "user not allowed to create protected tag")
return
}
@@ -280,6 +282,8 @@ func DeleteTag(ctx *context.APIContext) {
// "$ref": "#/responses/empty"
// "409":
// "$ref": "#/responses/conflict"
+ // "422":
+ // "$ref": "#/responses/validationError"
// "423":
// "$ref": "#/responses/repoArchivedError"
tagName := ctx.Params("*")
@@ -301,7 +305,7 @@ func DeleteTag(ctx *context.APIContext) {
if err = releaseservice.DeleteReleaseByID(ctx, ctx.Repo.Repository, tag, ctx.Doer, true); err != nil {
if models.IsErrProtectedTagName(err) {
- ctx.Error(http.StatusMethodNotAllowed, "delTag", "user not allowed to delete protected tag")
+ ctx.Error(http.StatusUnprocessableEntity, "delTag", "user not allowed to delete protected tag")
return
}
ctx.Error(http.StatusInternalServerError, "DeleteReleaseByID", err)
diff --git a/routers/api/v1/user/avatar.go b/routers/api/v1/user/avatar.go
index f912296228..30ccb63587 100644
--- a/routers/api/v1/user/avatar.go
+++ b/routers/api/v1/user/avatar.go
@@ -39,6 +39,7 @@ func UpdateAvatar(ctx *context.APIContext) {
err = user_service.UploadAvatar(ctx, ctx.Doer, content)
if err != nil {
ctx.Error(http.StatusInternalServerError, "UploadAvatar", err)
+ return
}
ctx.Status(http.StatusNoContent)
@@ -57,6 +58,7 @@ func DeleteAvatar(ctx *context.APIContext) {
err := user_service.DeleteAvatar(ctx, ctx.Doer)
if err != nil {
ctx.Error(http.StatusInternalServerError, "DeleteAvatar", err)
+ return
}
ctx.Status(http.StatusNoContent)
diff --git a/routers/install/install.go b/routers/install/install.go
index 282ebe9ead..b84d77cfc2 100644
--- a/routers/install/install.go
+++ b/routers/install/install.go
@@ -486,6 +486,17 @@ func SubmitInstall(ctx *context.Context) {
cfg.Section("security").Key("INTERNAL_TOKEN").SetValue(internalToken)
}
+ // FIXME: at the moment, no matter oauth2 is enabled or not, it must generate a "oauth2 JWT_SECRET"
+ // see the "loadOAuth2From" in "setting/oauth2.go"
+ if !cfg.Section("oauth2").HasKey("JWT_SECRET") && !cfg.Section("oauth2").HasKey("JWT_SECRET_URI") {
+ _, jwtSecretBase64, err := generate.NewJwtSecret()
+ if err != nil {
+ ctx.RenderWithErr(ctx.Tr("install.secret_key_failed", err), tplInstall, &form)
+ return
+ }
+ cfg.Section("oauth2").Key("JWT_SECRET").SetValue(jwtSecretBase64)
+ }
+
// if there is already a SECRET_KEY, we should not overwrite it, otherwise the encrypted data will not be able to be decrypted
if setting.SecretKey == "" {
var secretKey string
diff --git a/routers/web/repo/badges/badges.go b/routers/web/repo/badges/badges.go
index ed40e982a1..f240d30a31 100644
--- a/routers/web/repo/badges/badges.go
+++ b/routers/web/repo/badges/badges.go
@@ -45,10 +45,9 @@ func errorBadge(ctx *context_module.Context, label, text string) {
func GetWorkflowBadge(ctx *context_module.Context) {
branch := ctx.Req.URL.Query().Get("branch")
- if branch == "" {
- branch = ctx.Repo.Repository.DefaultBranch
+ if branch != "" {
+ branch = fmt.Sprintf("refs/heads/%s", branch)
}
- branch = fmt.Sprintf("refs/heads/%s", branch)
event := ctx.Req.URL.Query().Get("event")
workflowFile := ctx.Params("workflow_name")
diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go
index f0743cc89c..4911fb6452 100644
--- a/routers/web/repo/wiki.go
+++ b/routers/web/repo/wiki.go
@@ -40,6 +40,7 @@ const (
tplWikiRevision base.TplName = "repo/wiki/revision"
tplWikiNew base.TplName = "repo/wiki/new"
tplWikiPages base.TplName = "repo/wiki/pages"
+ tplWikiSearch base.TplName = "repo/wiki/search"
)
// MustEnableWiki check if wiki is enabled, if external then redirect
@@ -795,3 +796,20 @@ func DeleteWikiPagePost(ctx *context.Context) {
ctx.JSONRedirect(ctx.Repo.RepoLink + "/wiki/")
}
+
+func WikiSearchContent(ctx *context.Context) {
+ keyword := ctx.FormTrim("q")
+ if keyword == "" {
+ ctx.HTML(http.StatusOK, tplWikiSearch)
+ return
+ }
+
+ res, err := wiki_service.SearchWikiContents(ctx, ctx.Repo.Repository, keyword)
+ if err != nil {
+ ctx.ServerError("SearchWikiContents", err)
+ return
+ }
+
+ ctx.Data["Results"] = res
+ ctx.HTML(http.StatusOK, tplWikiSearch)
+}
diff --git a/routers/web/web.go b/routers/web/web.go
index 77857d32be..0ab25fd7e3 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -1417,6 +1417,7 @@ func registerRoutes(m *web.Route) {
})
m.Group("/wiki", func() {
+ m.Get("/search", repo.WikiSearchContent)
m.Get("/raw/*", repo.WikiRaw)
}, repo.MustEnableWiki)
diff --git a/services/mailer/mail.go b/services/mailer/mail.go
index 86bd40ff29..b04925881d 100644
--- a/services/mailer/mail.go
+++ b/services/mailer/mail.go
@@ -517,7 +517,7 @@ func actionToTemplate(issue *issues_model.Issue, actionType activities_model.Act
case issues_model.ReviewTypeReject:
name = "reject"
default:
- name = "review"
+ name = "review" // TODO: there is no activities_model.Action* when sending a review comment, this is deadcode and should be removed
}
case issues_model.CommentTypeCode:
name = "code"
diff --git a/services/mailer/mail_admin_new_user.go b/services/mailer/mail_admin_new_user.go
index aa0571e57c..54287b1b7e 100644
--- a/services/mailer/mail_admin_new_user.go
+++ b/services/mailer/mail_admin_new_user.go
@@ -19,14 +19,11 @@ const (
tplNewUserMail base.TplName = "notify/admin_new_user"
)
-var sa = SendAsync
-
// MailNewUser sends notification emails on new user registrations to all admins
func MailNewUser(ctx context.Context, u *user_model.User) {
if !setting.Admin.SendNotificationEmailOnNewUser {
return
}
-
if setting.MailService == nil {
// No mail service configured
return
@@ -77,5 +74,5 @@ func mailNewUser(ctx context.Context, u *user_model.User, lang string, tos []str
msg.Info = subject
msgs = append(msgs, msg)
}
- sa(msgs...)
+ SendAsync(msgs...)
}
diff --git a/services/mailer/mail_admin_new_user_test.go b/services/mailer/mail_admin_new_user_test.go
index b89d888ee1..603a8b95c9 100644
--- a/services/mailer/mail_admin_new_user_test.go
+++ b/services/mailer/mail_admin_new_user_test.go
@@ -11,10 +11,12 @@ import (
"code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/setting"
- "code.gitea.io/gitea/modules/translation"
+ "code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
+
+ _ "github.com/mattn/go-sqlite3"
)
func getTestUsers(t *testing.T) []*user_model.User {
@@ -45,54 +47,35 @@ func cleanUpUsers(ctx context.Context, users []*user_model.User) {
}
func TestAdminNotificationMail_test(t *testing.T) {
- translation.InitLocales(context.Background())
- locale := translation.NewLocale("")
- key := "mail.admin.new_user.user_info"
- translatedKey := locale.Tr(key)
- require.NotEqualValues(t, key, translatedKey)
-
- mailService := setting.Mailer{
- From: "test@example.com",
- Protocol: "dummy",
- }
-
- setting.MailService = &mailService
-
- // test with SEND_NOTIFICATION_EMAIL_ON_NEW_USER enabled
- setting.Admin.SendNotificationEmailOnNewUser = true
-
ctx := context.Background()
- NewContext(ctx)
users := getTestUsers(t)
- oldSendAsync := sa
- defer func() {
- sa = oldSendAsync
- cleanUpUsers(ctx, users)
- }()
- called := false
- sa = func(msgs ...*Message) {
- assert.Equal(t, len(msgs), 1, "Test provides only one admin user, so only one email must be sent")
- assert.Equal(t, msgs[0].To, users[0].Email, "checks if the recipient is the admin of the instance")
- manageUserURL := setting.AppURL + "admin/users/" + strconv.FormatInt(users[1].ID, 10)
- assert.Contains(t, msgs[0].Body, manageUserURL)
- assert.Contains(t, msgs[0].Body, users[1].HTMLURL())
- assert.Contains(t, msgs[0].Body, translatedKey, "the .Locale translates to nothing")
- assert.Contains(t, msgs[0].Body, users[1].Name, "user name of the newly created user")
- for _, untranslated := range []string{"mail.admin", "admin.users"} {
- assert.NotContains(t, msgs[0].Body, untranslated, "this is an untranslated placeholder prefix")
- }
- called = true
- }
- MailNewUser(ctx, users[1])
- assert.True(t, called)
+ t.Run("SendNotificationEmailOnNewUser_true", func(t *testing.T) {
+ defer test.MockVariableValue(&setting.Admin.SendNotificationEmailOnNewUser, true)()
- // test with SEND_NOTIFICATION_EMAIL_ON_NEW_USER disabled; emails shouldn't be sent
- setting.Admin.SendNotificationEmailOnNewUser = false
- sa = func(msgs ...*Message) {
- assert.Equal(t, 1, 0, "this shouldn't execute. MailNewUser must exit early since SEND_NOTIFICATION_EMAIL_ON_NEW_USER is disabled")
- }
+ called := false
+ defer mockMailSettings(func(msgs ...*Message) {
+ assert.Equal(t, len(msgs), 1, "Test provides only one admin user, so only one email must be sent")
+ assert.Equal(t, msgs[0].To, users[0].Email, "checks if the recipient is the admin of the instance")
+ manageUserURL := setting.AppURL + "admin/users/" + strconv.FormatInt(users[1].ID, 10)
+ assert.Contains(t, msgs[0].Body, manageUserURL)
+ assert.Contains(t, msgs[0].Body, users[1].HTMLURL())
+ assert.Contains(t, msgs[0].Body, users[1].Name, "user name of the newly created user")
+ assertTranslatedLocale(t, msgs[0].Body, "mail.admin", "admin.users")
+ called = true
+ })()
+ MailNewUser(ctx, users[1])
+ assert.True(t, called)
+ })
- MailNewUser(ctx, users[1])
+ t.Run("SendNotificationEmailOnNewUser_false", func(t *testing.T) {
+ defer test.MockVariableValue(&setting.Admin.SendNotificationEmailOnNewUser, false)()
+ defer mockMailSettings(func(msgs ...*Message) {
+ assert.Equal(t, 1, 0, "this shouldn't execute. MailNewUser must exit early since SEND_NOTIFICATION_EMAIL_ON_NEW_USER is disabled")
+ })()
+ MailNewUser(ctx, users[1])
+ })
+
+ cleanUpUsers(ctx, users)
}
diff --git a/services/mailer/mail_test.go b/services/mailer/mail_test.go
index d87c57ffe7..ed972dbb99 100644
--- a/services/mailer/mail_test.go
+++ b/services/mailer/mail_test.go
@@ -23,6 +23,7 @@ import (
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
)
@@ -36,7 +37,6 @@ const bodyTpl = `
-