~/.composee/config.json
file:
+composer.install = Para i-install ang package gamit ang Composer, patakbuhin ang sumusunod na command:
+empty.repo = Nag-upload ka ba ng package, ngunit hindi pinapakita dito? Pumunta sa mga setting ng package at i-link iyan sa repo na ito.
+keywords = Mga keyword
+versions = Mga bersyon
+title = Mga package
+desc = Ipamahala ang mga package ng repositoryo.
+registry.documentation = Para sa higit pang impormasyon tungkol sa %s registry, tignan ang dokumentasyon.
+published_by = Na-publish ang %[1]s ni/ng %[3]s
+requirements = Mga kinakailangan
+dependencies = Mga dependency
+details.author = Autor
+details.project_site = Website ng proyekto
+details.license = Lisensya
+versions.view_all = Tignan lahat
+dependency.id = ID
+dependency.version = Bersyon
+alpine.registry = I-setup ang registry na ito sa pamamagitan ng pagdagdag ng url sa iyong /etc/apk/repositories
file:
+alpine.registry.info = Pumili ng $branch at $repository mula sa listahan sa ibaba.
+alpine.install = Para i-install ang package, patakbuhin ang sumusunod na command:
+alpine.repository = Info ng Repositoryo
+cargo.registry = I-setup ang registry na ito sa Cargo configuration file (halimbawa ~/.cargo/config.toml
):
+chef.registry = I-setup ang registry na ito sa iyong ~/.chef/config.rb
file:
+composer.dependencies = Mga dependency
+composer.dependencies.development = Mga dependency ng pag-develop
+conan.details.repository = Repositoryo
+conan.registry = I-setup ang registry na ito mula sa command line:
+assets = Mga asset
+empty.documentation = Para sa higit pang impormasyon sa package registry, tignan ang dokumentasyon.
+cargo.install = Para i-install ang package gamit ang Cargo, patakbuhin ang sumusunod na command:
+published_by_in = Na-publish ang %[1]s ni %[3]s sa %[5]s
+alpine.registry.key = I-download ang registry public RSA key sa /etc/apk/keys
folder para i-verify ang index signature:
[actions]
-runners.last_online = Huling oras [online]
-runs.no_workflows.quick_start = Hindi alam kung paano magsimula gamit ang Forgejo Actions? Tingnan ang [quick start guide].
-runs.no_workflows.documentation = Para sa higit pang impormasyon tungkol sa Forgejo Actions, tingnan ang [documentation].
+runners.last_online = Huling oras na online
+runs.no_workflows.quick_start = Hindi alam kung paano magsimula gamit ang Forgejo Actions? Tingnan ang gabay sa mabilis na pagsisimula.
+runs.no_workflows.documentation = Para sa higit pang impormasyon tungkol sa Forgejo Actions, tingnan ang Dokumentasyon.
[action]
commit_repo = itinulak sa %[3]s sa %[4]s
create_issue = `binuksan ang isyu %[3]s#%[2]s`
comment_issue = `nagkomento sa isyu %[3]s#%[2]s`
-reopen_pull_request = `binuksang muli ang [pull request]%[3]s#%[2]s`
-comment_pull = `iniwan ang komento sa [pull request] %[3]s#%[2]s`
+reopen_pull_request = `binuksang muli ang hiling sa paghatak %[3]s#%[2]s`
+comment_pull = `nagiwan ng komento sa hiling sa paghatak %[3]s#%[2]s`
reopen_issue = `binuksang muli ang isyu %[3]s#%[2]s`
create_pull_request = `ginawa ang hiling sa paghatak %[3]s#%[2]s`
create_branch = ginawa ang branch na %[3]s sa %[4]s
create_repo = ginawa ang repositoryo na %s
+starred_repo = na-star ang %[2]s
+watched_repo = ay sinimulang panoorin ang %[2]s
[tool]
1m = 1 minuto
@@ -1642,4 +1787,61 @@ create_repo = ginawa ang repositoryo na %s
1d = 1 araw
1s = 1 segundo
now = ngayon
-future = sa madaling panahon
\ No newline at end of file
+future = sa madaling panahon
+months = %d buwan
+1w = 1 linggo
+1mon = 1 buwan
+1y = 1 taon
+seconds = %d segundo
+minutes = %d minuto
+hours = %d oras
+days = %d araw
+weeks = %d linggo
+years = %d taon
+raw_seconds = segundo
+raw_minutes = minuto
+
+[munits.data]
+mib = MiB
+gib = GiB
+b = B
+kib = KiB
+tib = TiB
+pib = PiB
+eib = EiB
+
+[gpg]
+error.not_signed_commit = Hindi isang naka-sign na commit
+error.probable_bad_signature = BABALA! Bagaman na may key na may ID na ito sa database hindi nito pinapatunayan ang commit na ito! Ang commit na ito ay KAHINA-HINALA.
+error.extract_sign = Nabigong i-extract ang signature
+error.no_committer_account = Walang account na naka-link sa email address ng committer
+error.no_gpg_keys_found = Walang kilalang key na nahanap para sa signature na ito sa database
+default_key = Naka-sign gamit ang default key
+error.generate_hash = Nabigong i-generate ang hash ng commit
+error.failed_retrieval_gpg_keys = Nabigong kumuha ng anumang key na naka-attach sa account ng committer
+error.probable_bad_default_signature = BABALA! Bagaman na ang default key ay may ID na ito hindi nito pinapatunayan ang commit na ito! Ang commit na ito ay KAHINA-HINALA.
+
+[notification]
+unread = Hindi nabasa
+read = Nabasa
+no_unread = Walang mga hindi nabasang notification.
+notifications = Mga abiso
+no_read = Walang mga nabasang notification.
+pin = I-pin ang notification
+mark_as_read = Markahan bilang nabasa
+mark_as_unread = Markahan bilang hindi nabasa
+subscriptions = Mga subscription
+watching = Pinapanood
+no_subscriptions = Walang mga subscription
+mark_all_as_read = Markahan lahat bilang nabasa
+
+[units]
+error.no_unit_allowed_repo = Hindi ka pinapayagang ma-access ang anumang seksyon ng repositoryong ito.
+unit = Yunit
+error.unit_not_allowed = Hindi ka pinapayagang ma-access ang seksyon ng repositoryong ito.
+
+[dropzone]
+default_message = I-drop ang mga file o mag-click dito para mag-upload.
+invalid_input_type = Hindi ka maaring mag-upload ng mga file sa uri na ito.
+file_too_big = Ang laki ng file ({{filesize}}) MB) ay lumalagpas sa pinakamataas na size na ({{maxFilesize}} MB).
+remove_file = Tanggalin ang file
\ No newline at end of file
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index 9b27f6f507..03100f722a 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -667,6 +667,7 @@ follow_blocked_user = Vous ne pouvez pas suivre cet utilisateur parce vous avez
block = Bloquer
unblock = Débloquer
following_one = Suit %d personnes
+followers_one = Suivi par %d
[settings]
profile=Profil
@@ -990,6 +991,9 @@ additional_repo_units_hint_description = Afficher un bouton "Ajouter plus d'unit
additional_repo_units_hint = Encourager l'ajout de nouvelles unités pour le dépôt
update_hints = Mettre à jour les suggestions
update_hints_success = Les suggestions ont été mises à jour.
+pronouns_custom = Sur mesure
+pronouns = Qualités
+pronouns_unspecified = Non spécifié
[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.
@@ -1929,7 +1933,7 @@ milestones.filter_sort.least_issues=Le moins de tickets
signing.will_sign=Cette révision sera signée avec la clé « %s ».
signing.wont_sign.error=Impossible de vérifier la signature de la révision.
-signing.wont_sign.nokey=Aucune clé n’est disponible pour signer cette révision.
+signing.wont_sign.nokey=Aucune clé n’est disponible sur cette instance pour signer cette révision.
signing.wont_sign.never=Les révisions ne sont jamais signées.
signing.wont_sign.always=Les révisions sont toujours signées.
signing.wont_sign.pubkey=La révision ne sera pas signée car vous votre compte ne possède pas de clé publique.
@@ -2311,7 +2315,7 @@ settings.update_webhook=Actualiser le déclencheur
settings.update_hook_success=Déclencheur Web actualisé.
settings.delete_webhook=Retirer le webhook
settings.recent_deliveries=Livraisons récentes
-settings.hook_type=Type de Hook
+settings.hook_type=Type de déclencheur
settings.slack_token=Jeton
settings.slack_domain=Domaine
settings.slack_channel=Canal
@@ -2374,7 +2378,7 @@ settings.protect_merge_whitelist_committers=Activer la liste blanche pour la fus
settings.protect_merge_whitelist_committers_desc=N'autoriser que les utilisateurs et les équipes en liste blanche d'appliquer les demandes de fusion sur cette branche.
settings.protect_merge_whitelist_users=Utilisateurs en liste blanche de fusion :
settings.protect_merge_whitelist_teams=Équipes en liste blanche de fusion :
-settings.protect_check_status_contexts=Activer le Contrôle Qualité
+settings.protect_check_status_contexts=Activer le contrôle qualité
settings.protect_status_check_patterns=Motifs de vérification des statuts :
settings.protect_status_check_patterns_desc=Entrez des motifs pour spécifier quelles vérifications doivent réussir avant que des branches puissent être fusionnées. Un motif par ligne. Un motif ne peut être vide.
settings.protect_check_status_contexts_desc=Exiger le status « succès » avant de fusionner. Quand activée, une branche protégée ne peux accepter que des soumissions ou des fusions ayant le status « succès ». Lorsqu'il n'y a pas de contexte, la dernière révision fait foi.
@@ -2430,10 +2434,10 @@ settings.tags.protection.allowed=Autorisé
settings.tags.protection.allowed.users=Utilisateurs autorisés
settings.tags.protection.allowed.teams=Équipes autorisées
settings.tags.protection.allowed.noone=Personne
-settings.tags.protection.create=Protéger l'étiquette
+settings.tags.protection.create=Ajouter une règle
settings.tags.protection.none=Il n'y a pas d'étiquettes protégées.
settings.tags.protection.pattern.description=Vous pouvez utiliser au choix un nom unique, un motif de glob ou une expression régulière qui correspondra à plusieurs étiquettes. Pour plus d’informations, consultez le guide sur les étiquettes protégées.
-settings.bot_token=Jeton de Bot
+settings.bot_token=Jeton de bot
settings.chat_id=ID de conversation
settings.thread_id=ID du fil
settings.matrix.homeserver_url=URL du serveur d'accueil
@@ -2490,11 +2494,11 @@ diff.browse_source=Parcourir la source
diff.parent=Parent
diff.commit=révision
diff.git-notes=Notes
-diff.data_not_available=Contenu de la comparaison indisponible
-diff.options_button=Option de Diff
-diff.show_diff_stats=Voir les Statistiques
-diff.download_patch=Télécharger le Fichier Patch
-diff.download_diff=Télécharger le Fichier des Différences
+diff.data_not_available=Contenu de la comparaison (diff) indisponible
+diff.options_button=Option de comparaison (diff)
+diff.show_diff_stats=Voir les statistiques
+diff.download_patch=Télécharger le patch en tant que fichier
+diff.download_diff=Télécharger le fichier diff
diff.show_split_view=Vue séparée
diff.show_unified_view=Vue unifiée
diff.whitespace_button=Espace
@@ -2516,7 +2520,7 @@ diff.file_suppressed=Fichier diff supprimé car celui-ci est trop grand
diff.file_suppressed_line_too_long=Diff de fichier supprimé car une ou plusieurs lignes sont trop longues
diff.too_many_files=Certains fichiers ne sont pas affichés car ce diff contient trop de modifications
diff.show_more=Voir plus
-diff.load=Voir la Diff
+diff.load=Voir la diff
diff.generated=générée
diff.vendored=externe
diff.comment.add_line_comment=Commenter cette ligne
@@ -2594,7 +2598,7 @@ release.tags_for=Étiquettes pour %s
branch.name=Nom de la branche
branch.already_exists=Une branche nommée "%s" existe déjà.
branch.delete_head=Supprimer
-branch.delete=`Supprimer la branche "%s"`
+branch.delete=Supprimer la branche "%s"
branch.delete_html=Supprimer la branche
branch.delete_desc=La suppression d’une branche est permanente. Bien qu’une branche supprimée puisse temporairement subsister, elle NE PEUT PAS être facilement restaurée. Continuer ?
branch.deletion_success=La branche "%s" a été supprimée.
@@ -2611,9 +2615,9 @@ branch.restore_success=La branche "%s" a été restaurée.
branch.restore_failed=Impossible de restaurer la branche "%s".
branch.protected_deletion_failed=La branche "%s" est protégé. Elle ne peut pas être supprimée.
branch.default_deletion_failed=La branche "%s" est la branche par défaut. Elle ne peut pas être supprimée.
-branch.restore=`Restaurer la branche "%s"`
-branch.download=`Télécharger la branche "%s"`
-branch.rename=`Renommer la branche "%s"`
+branch.restore=Restaurer la branche "%s"
+branch.download=Télécharger la branche "%s"
+branch.rename=Renommer la branche "%s"
branch.search=Rechercher une branche
branch.included_desc=Cette branche fait partie de la branche par défaut
branch.included=Incluses
@@ -2724,6 +2728,16 @@ settings.sourcehut_builds.secrets_helper = Permettre au job d'accéder aux secre
size_format = %[1]s : %[2]s ; %[3]s : %[4]s
settings.sourcehut_builds.visibility = Visibilité du job
settings.sourcehut_builds.secrets = Secrets
+settings.sourcehut_builds.manifest_path = Construire le chemin du manifeste
+settings.sourcehut_builds.graphql_url = URL GraphQL (e.g. https://builds.sr.ht/query)
+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 contourner cette règle.
+settings.web_hook_name_sourcehut_builds = SourceHut Builds
+settings.enforce_on_admins = Contraindre les administrateurs du dépôt par cette règle
+settings.rename_branch_failed_protected = Impossible de renommer la branche %s car il s'agit d'une branche protégée.
+settings.event_pull_request_enforcement = Amélioration
[graphs]
component_loading=Chargement de %s…
@@ -2752,7 +2766,7 @@ team_name_helper=Le nom d'équipe doit être court et mémorable.
team_desc_helper=Décrire le but ou le rôle de l’équipe.
team_access_desc=Accès au dépôt
team_permission_desc=Autorisation
-team_unit_desc=Permettre l’accès aux Sections du dépôt
+team_unit_desc=Permettre l’accès aux sections du dépôt
team_unit_disabled=(Désactivé)
form.name_reserved=Le nom d'organisation "%s" est réservé.
@@ -2761,7 +2775,7 @@ form.create_org_not_allowed=Vous n'êtes pas autorisé à créer une organisatio
settings=Paramètres
settings.options=Organisation
-settings.full_name=Nom Complet
+settings.full_name=Nom complet
settings.email=Courriel de contact
settings.website=Site Web
settings.location=Localisation
@@ -2771,7 +2785,7 @@ settings.visibility=Visibilité
settings.visibility.public=Public
settings.visibility.limited=Limité (Visible uniquement aux utilisateurs authentifiés)
settings.visibility.limited_shortname=Limité
-settings.visibility.private=Privé (Visible uniquement aux membres de l’organisation)
+settings.visibility.private=Privé (visible uniquement aux membres de l’organisation)
settings.visibility.private_shortname=Privé
settings.update_settings=Appliquer les paramètres
@@ -2817,15 +2831,15 @@ teams.read_access=Lecture
teams.read_access_helper=Les membres peuvent voir et cloner les dépôts de l'équipe.
teams.write_access=Écriture
teams.write_access_helper=Les membres peuvent voir et pousser dans les dépôts de l'équipe.
-teams.admin_access=Accès Administrateur
+teams.admin_access=Accès administrateur
teams.admin_access_helper=Les membres peuvent tirer et pousser des modifications vers les dépôts de l'équipe, et y ajouter des collaborateurs.
teams.no_desc=Aucune description
teams.settings=Paramètres
teams.owners_permission_desc=Les propriétaires ont un accès complet à tous les dépôts et disposent d'un accès administrateur de l'organisation.
-teams.members=Membres de L'Équipe
+teams.members=Membres de L'équipe
teams.update_settings=Appliquer les paramètres
teams.delete_team=Supprimer l'équipe
-teams.add_team_member=Ajouter un Membre
+teams.add_team_member=Ajouter un membre
teams.invite_team_member=Inviter à %s
teams.invite_team_member.list=Invitations en attente
teams.delete_team_title=Supprimer l'équipe
@@ -2835,7 +2849,7 @@ teams.read_permission_desc=Cette équipe permet l'accès en lectureécriture : les membres peuvent participer à ses dépôts.
teams.admin_permission_desc=Cette équipe permet l'accès administrateur : les membres peuvent voir, participer et ajouter des collaborateurs à ses dépôts.
teams.create_repo_permission_desc=De plus, cette équipe accorde la permission Créer un dépôt : les membres peuvent créer de nouveaux dépôts dans l'organisation.
-teams.repositories=Dépôts de l'Équipe
+teams.repositories=Dépôts de l'équipe
teams.search_repo_placeholder=Rechercher dans le dépôt…
teams.remove_all_repos_title=Supprimer tous les dépôts de l'équipe
teams.remove_all_repos_desc=Ceci supprimera tous les dépôts de l'équipe.
@@ -2868,9 +2882,9 @@ repositories=Dépôts
hooks=Déclencheurs web
integrations=Intégrations
authentication=Sources d'authentification
-emails=Emails de l'utilisateur
+emails=Courriels de l'utilisateur
config=Configuration
-notices=Informations
+notices=Informations système
monitor=Surveillance
first_page=Première
last_page=Dernière
@@ -2966,7 +2980,7 @@ dashboard.rebuild_issue_indexer=Reconstruire l’indexeur des tickets
users.user_manage_panel=Gestion du compte utilisateur
users.new_account=Créer un compte
users.name=Nom d'utilisateur
-users.full_name=Nom Complet
+users.full_name=Nom complet
users.activated=Activé
users.admin=Administrateur
users.restricted=Restreint
@@ -2991,9 +3005,9 @@ users.max_repo_creation=Nombre maximal de dépôts
users.max_repo_creation_desc=(Mettre à -1 pour utiliser la limite globale par défaut.)
users.is_activated=Ce compte est activé
users.prohibit_login=Désactiver la connexion
-users.is_admin=Est Administrateur
+users.is_admin=Est administrateur
users.is_restricted=Est restreint
-users.allow_git_hook=Autoriser la création de Git Hooks
+users.allow_git_hook=Autoriser la création de déclencheurs Git
users.allow_git_hook_tooltip=Les Déclencheurs Git sont exécutés par le même utilisateur que Forgejo, qui a des privilèges systèmes élevés. Les utilisateurs ayant ce droit peuvent altérer touts les dépôts, compromettre la base de données applicative, et se promouvoir administrateurs de Forgejo.
users.allow_import_local=Autoriser l'importation de dépôts locaux
users.allow_create_organization=Autoriser la création d'organisations
@@ -3041,7 +3055,7 @@ orgs.members=Membres
orgs.new_orga=Nouvelle organisation
repos.repo_manage_panel=Gestion des dépôts
-repos.unadopted=Dépôts dépossédés
+repos.unadopted=Dépôts non adoptés
repos.unadopted.no_more=Aucun dépôt dépossédé trouvé.
repos.owner=Propriétaire
repos.name=Nom
@@ -3091,8 +3105,8 @@ auths.domain=Domaine
auths.host=Hôte
auths.port=Port
auths.bind_dn=Bind DN
-auths.bind_password=Bind mot de passe
-auths.user_base=Utilisateur Search Base
+auths.bind_password=Mot de passe Bind
+auths.user_base=Utilisateur search base
auths.user_dn=Utilisateur DN
auths.attribute_username=Attribut nom d'utilisateur
auths.attribute_username_placeholder=Laisser vide afin d'utiliser le nom d'utilisateur spécifié dans Forgejo.
@@ -3388,7 +3402,7 @@ notices.desc=Description
notices.op=Opération
notices.delete_success=Les informations systèmes ont été supprimées.
self_check = Auto vérification
-dashboard.sync_repo_tags = Synchorniser les étiquettes depuis git vers la base de donnée
+dashboard.sync_repo_tags = Synchroniser les étiquettes depuis Git vers la base de donnée
dashboard.sync_tag.started = La synchronisation des étiquettes a commencé
self_check.no_problem_found = Aucun problème n'a encore été trouvé.
self_check.database_collation_mismatch = La base de donnée devrait utiliser la collation %s
@@ -3401,6 +3415,8 @@ self_check.database_collation_mismatch=Exige que la base de données utilise la
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.
+config_settings = Paramètres
+config_summary = Résumé
[action]
create_repo=a créé le dépôt %s
diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini
index 35456d1958..2af6019eae 100644
--- a/options/locale/locale_it-IT.ini
+++ b/options/locale/locale_it-IT.ini
@@ -73,7 +73,7 @@ forks=Fork
activities=Attivitá
pull_requests=Pull request
-issues=Problemi
+issues=Segnalazioni
milestones=Milestones
ok=OK
@@ -117,7 +117,7 @@ concept_user_organization=Organizzazione
name=Nome
value=Valore
enable_javascript = Questo sito richiede JavaScript.
-tracked_time_summary = Resoconto del tempo tracciato in base ai filtri dell'elenco dei problemi
+tracked_time_summary = Resoconto del tempo cronometrato in base ai filtri dell'elenco delle segnalazioni
retry = Riprova
rerun = Ri-esegui
rerun_all = Ri-esegui tutti gli incarichi
@@ -199,7 +199,7 @@ missing_csrf=Richiesta errata: nessun token CSRF presente
invalid_csrf=Richiesta errata: token CSRF non valido
not_found=Il bersaglio non è stato trovato.
network_error=Errore di rete
-report_message = Se credi che questo sia un bug di Forgejo, per favore verifica i problemi su Codeberg o pubblica un nuovo problema se necessario.
+report_message = Se credi che questo sia un errore di Forgejo, per favore controlla le segnalazioni su Codeberg o aprine una nuova se necessario.
server_internal = Errore interno del server
[startpage]
@@ -230,7 +230,7 @@ ssl_mode=SSL
path=Percorso
sqlite_helper=Percorso file del database SQLite3.alt
+ click/enter
per escludere le etichette`
issues.filter_label_no_select=Tutte le etichette
@@ -1404,7 +1412,7 @@ issues.filter_assginee_no_assignee=Nessun assegnatario
issues.filter_poster=Autore
issues.filter_poster_no_select=Tutti gli autori
issues.filter_type=Tipo
-issues.filter_type.all_issues=Tutti i problemi
+issues.filter_type.all_issues=Tutte le segnalazioni
issues.filter_type.assigned_to_you=Assegnati a te
issues.filter_type.created_by_you=Creati da te
issues.filter_type.mentioning_you=Che ti riguardano
@@ -1479,7 +1487,7 @@ issues.label_title=Nome etichetta
issues.label_description=Descrizione etichetta
issues.label_color=Colore etichetta
issues.label_count=%d etichette
-issues.label_open_issues=%d problemi aperti
+issues.label_open_issues=%d segnalazioni/richieste aperte
issues.label_edit=Modifica
issues.label_delete=Elimina
issues.label_modify=Modifica etichetta
@@ -1564,10 +1572,10 @@ issues.dependency.remove=Rimuovi
issues.dependency.remove_info=Rimuovi questa dipendenza
issues.dependency.added_dependency=`ha aggiunto una nuova dipendenza %s`
issues.dependency.removed_dependency=`ha rimosso una dipendenza %s`
-issues.dependency.pr_closing_blockedby=La chiusura di questa pull request è bloccata dai seguenti problemi
-issues.dependency.issue_closing_blockedby=La chiusura di questo problema è bloccata dai seguenti problemi
-issues.dependency.issue_close_blocks=Questo problema impedisce la chiusura dei seguenti problemi
-issues.dependency.pr_close_blocks=Questa richiesta di pull impedisce la chiusura dei seguenti problemi
+issues.dependency.pr_closing_blockedby=Questa richiesta di modifica non può essere chiusa per via delle seguenti segnalazioni
+issues.dependency.issue_closing_blockedby=Questa segnalazione non può essere chiusa per via delle seguenti segnalazioni
+issues.dependency.issue_close_blocks=Questa segnalazione impedisce la chiusura delle seguenti segnalazioni
+issues.dependency.pr_close_blocks=Questa richiesta di modifica impedisce la chiusura delle seguenti segnalazioni
issues.dependency.issue_close_blocked=Devi chiudere tutte le anomalie che bloiccano questo problema prima di chiudelo.
issues.dependency.pr_close_blocked=Chiudere tutte le anomalie che bloccano la richiesta di pull prima di effettaure il merge.
issues.dependency.blocks_short=Blocchi
@@ -1580,8 +1588,8 @@ issues.dependency.add_error_same_issue=Non si può fare dipendere un problema da
issues.dependency.add_error_dep_issue_not_exist=Il problema dipendente non esiste.
issues.dependency.add_error_dep_not_exist=La dipendenza non esiste.
issues.dependency.add_error_dep_exists=La dipendenza esiste già.
-issues.dependency.add_error_cannot_create_circular=Non puoi creare una dipendenza con due problemi che si bloccano a vicenda.
-issues.dependency.add_error_dep_not_same_repo=Entrambi i problemi devono essere nello stesso repository.
+issues.dependency.add_error_cannot_create_circular=Non puoi creare una dipendenza con due segnalazioni che si bloccano a vicenda.
+issues.dependency.add_error_dep_not_same_repo=Entrambe le segnalazioni devono essere nello stesso repository.
issues.review.self.approval=Non puoi approvare la tua pull request.
issues.review.self.rejection=Non puoi richiedere modifiche sulla tua pull request.
issues.review.approve=hanno approvato queste modifiche %s
@@ -1624,9 +1632,9 @@ pulls.new=Nuova richiesta di modifica
pulls.view=Visualizza richiesta di modifica
pulls.compare_changes=Nuova richiesta di modifica
pulls.allow_edits_from_maintainers=Consenti modifiche dai manutentori
-pulls.allow_edits_from_maintainers_desc=Gli utenti con accesso in scrittura al ramo base possono anche inviare a questo ramo
+pulls.allow_edits_from_maintainers_desc=Gli utenti con accesso di scrittura al ramo base possono anche immettere in questo ramo
pulls.allow_edits_from_maintainers_err=Aggiornamento non riuscito
-pulls.compare_changes_desc=Selezione il branch su cui eseguire il merge e il branch da cui eseguire il pull.
+pulls.compare_changes_desc=Seleziona il ramo su cui fondere e il ramo da cui prelevare.
pulls.has_viewed_file=Visualizzato
pulls.has_changed_since_last_review=Modificato dalla tua ultima recensione
pulls.viewed_files_label=%[1]d / %[2]d file visti
@@ -1634,20 +1642,20 @@ pulls.compare_base=unisci a
pulls.compare_compare=esegui un pull da
pulls.switch_comparison_type=Cambia tipo di confronto
pulls.switch_head_and_base=Testa e base di commutazione
-pulls.filter_branch=Filtra branch
+pulls.filter_branch=Filtra ramo
pulls.no_results=Nessun risultato trovato.
-pulls.nothing_to_compare=Questi rami sono uguali. Non c'è alcuna necessità di creare una pull request.
-pulls.nothing_to_compare_and_allow_empty_pr=Questi rami sono uguali. Questa PR sarà vuota.
-pulls.has_pull_request=`Una pull request tra questi rami esiste già: %[2]s#%[3]d`
+pulls.nothing_to_compare=Questi rami sono uguali. Non c'è bisogno di creare una richiesta di modifica.
+pulls.nothing_to_compare_and_allow_empty_pr=Questi rami sono uguali. Questa richiesta sarà vuota.
+pulls.has_pull_request=`Una richiesta di modifica fra questi rami esiste già: %[2]s#%[3]d`
pulls.create=Crea richiesta di modifica
-pulls.title_desc_few=vorrebbe unire %[1]d commit da %[2]s
a %[3]s
+pulls.title_desc_few=vuole unire %[1]d commit da %[2]s
a %[3]s
pulls.merged_title_desc_few=ha unito %[1]d commit da %[2]s
a %[3]s
%[4]s
-pulls.change_target_branch_at=`cambiato il branch di destinazione da %s a %s %s`
+pulls.change_target_branch_at=`cambiato il ramo di destinazione da %s a %s %s`
pulls.tab_conversation=Conversazione
pulls.tab_commits=Commit
pulls.tab_files=File modificati
pulls.reopen_to_merge=Riapri questa pull request per effettuare l'unione.
-pulls.cant_reopen_deleted_branch=Questa pull request non può essere riaperta perché il branch è stato eliminato.
+pulls.cant_reopen_deleted_branch=Questa richiesta di modifia non può essere riaperta perché il ramo è stato eliminato.
pulls.merged=Unito
pulls.manually_merged=Unito manualmente
pulls.is_closed=La pull request è stata chiusa.
@@ -1657,7 +1665,7 @@ pulls.still_in_progress=Ancora in corso?
pulls.add_prefix=Aggiungi prefisso %s
pulls.remove_prefix=Rimuovi il prefisso %s
pulls.data_broken=Questa pull request è rovinata a causa di informazioni mancanti del fork.
-pulls.files_conflicted=Questa pull request ha modifiche in conflitto con il branch di destinazione.
+pulls.files_conflicted=Questa richiesta di modifica va in conflitto con il ramo di destinazione.
pulls.is_checking=Verifica dei conflitti di fusione in corso. Riprova tra qualche istante.
pulls.is_ancestor=Questo ramo è già incluso nel ramo di destinazione. Non c'è nulla da fondere.
pulls.is_empty=Le modifiche di questo ramo sono già nel ramo di destinazione. Questo sarà un commit vuoto.
@@ -1675,7 +1683,7 @@ pulls.reject_count_1=%d richiesta di cambiamento
pulls.reject_count_n=%d richieste di cambiamento
pulls.waiting_count_1=%d in attesa di revisione
pulls.waiting_count_n=%d in attesa di revisione
-pulls.wrong_commit_id=l'id del commit deve essere un id del commit nel ramo di destinazione
+pulls.wrong_commit_id=l'ID del commit deve essere un ID del commit nel ramo di destinazione
pulls.no_merge_desc=Questa pull request non può essere unita perché tutte le opzioni di merge del repository sono disattivate.
pulls.no_merge_helper=Attiva le opzioni di merge nelle impostazioni del repository o unisci la pull request manualmente.
@@ -1688,7 +1696,7 @@ pulls.rebase_merge_commit_pull_request=Ricostruisci quindi crea commit unito
pulls.squash_merge_pull_request=Crea commit mescolato
pulls.merge_manually=Unito manualmente
pulls.merge_commit_id=L'ID del commit di merge
-pulls.require_signed_wont_sign=Il branch richiede commit firmati ma questo merge non verrà firmato
+pulls.require_signed_wont_sign=Il ramo richiede commit firmati ma questa fusione non verrà firmata
pulls.invalid_merge_option=Non puoi utilizzare questa opzione di merge per questa pull request.
pulls.merge_conflict=Unione non riuscita: C'è stato un conflitto durante l'operazione. Suggerimento: Prova una strategia diversa
@@ -1709,11 +1717,11 @@ pulls.status_checks_failure=Alcuni controlli sono falliti
pulls.status_checks_error=Alcuni controlli hanno segnalato errori
pulls.status_checks_requested=Richiesto
pulls.status_checks_details=Dettagli
-pulls.update_branch=Aggiorna il ramo tramite merge
+pulls.update_branch=Aggiorna il ramo tramite fusione
pulls.update_branch_rebase=Aggiorna il ramo per cambio base
-pulls.update_branch_success=Brench aggiornato con successo
-pulls.update_not_allowed=Non sei abilitato ad aggiornare il branch
-pulls.outdated_with_base_branch=Questo brench non è aggiornato con il branch di base
+pulls.update_branch_success=Ramo aggiornato con successo
+pulls.update_not_allowed=Non ti è permesso aggiornare il ramo
+pulls.outdated_with_base_branch=Questo ramo non è aggiornato con il ramo di base
pulls.closed_at=`chiusa questa pull request %[2]s`
pulls.reopened_at=`riaperta questa pull request %[2]s`
@@ -1755,8 +1763,8 @@ milestones.deletion_desc=Eliminare una pietra miliare la rimuove da tutte le rel
milestones.deletion_success=La pietra miliare è stata eliminata.
milestones.filter_sort.least_complete=Meno completato
milestones.filter_sort.most_complete=Più completato
-milestones.filter_sort.most_issues=Più problemi
-milestones.filter_sort.least_issues=Meno problemi
+milestones.filter_sort.most_issues=Maggior parte delle segnalazioni
+milestones.filter_sort.least_issues=Meno segnalazioni
ext_wiki=Accesso al Wiki esterno
@@ -1837,7 +1845,7 @@ activity.git_stats_pushed_n=hanno pushato
activity.git_stats_commit_1=%d commit
activity.git_stats_commit_n=%d commit
activity.git_stats_push_to_branch=su %s e
-activity.git_stats_push_to_all_branches=a tutti i brench.
+activity.git_stats_push_to_all_branches=a tutti i rami.
activity.git_stats_on_default_branch=Su %s,
activity.git_stats_file_1=%d file
activity.git_stats_file_n=%d file
@@ -1884,7 +1892,7 @@ settings.mirror_settings.push_mirror.add=Aggiungi specchio di immissione
settings.sync_mirror=Sincronizza ora
settings.site=Sito web
-settings.update_settings=Aggiorna impostazioni
+settings.update_settings=Salva impostazioni
settings.branches.update_default_branch=Aggiorna ramo predefinito
settings.advanced_settings=Opzioni avanzate
settings.wiki_desc=Abilita wiki del progetto
@@ -1900,7 +1908,7 @@ settings.external_tracker_url=URL del tracciatore di segnalazioni esterno
settings.external_tracker_url_error=L'URL del tracciatore di issue esterno non è un URL valido.
settings.external_tracker_url_desc=I visitatori verranno reindirizzati all'URL del tracciatore di issue esterno cliccando sulla scheda delle issue.
settings.tracker_url_format=Formato URL del gestore segnalazioni esterno
-settings.tracker_url_format_error=L'URL del tracker di problemi esterno non è un URL valido.
+settings.tracker_url_format_error=L'URL del tracciatore esterno delle segnalazioni non è un URL valido.
settings.tracker_issue_style=Formato numerico del tracciatore di segnalazioni esterno
settings.tracker_issue_style.numeric=Numerico
settings.tracker_issue_style.alphanumeric=Alfanumerico
@@ -1913,8 +1921,8 @@ settings.allow_only_contributors_to_track_time=Consenti soltanto ai contributori
settings.pulls_desc=Abilita le richieste di modifica del progetto
settings.pulls.ignore_whitespace=Ignora gli spazi bianchi per evitare conflitti
settings.pulls.enable_autodetect_manual_merge=Abilita il rilevamento automatico della fusione manuale (Nota: in alcuni casi speciali possono verificarsi errori)
-settings.pulls.allow_rebase_update=Abilita l'aggiornamento del ramo pull request per rebase
-settings.pulls.default_delete_branch_after_merge=Elimina il ramo pull request dopo la fusione per impostazione predefinita
+settings.pulls.allow_rebase_update=Abilita l'aggiornamento del ramo della richiesta per rebase
+settings.pulls.default_delete_branch_after_merge=Elimina il ramo della richiesta dopo la fusione per impostazione predefinita
settings.packages_desc=Abilita registro dei pacchetti del progetto
settings.projects_desc=Abilita progetti del progetto
settings.admin_settings=Impostazioni amministratore
@@ -1925,7 +1933,7 @@ settings.admin_indexer_commit_sha=Ultimo SHA indicizzato
settings.admin_indexer_unindexed=Non indicizzato
settings.reindex_button=Aggiungi alla coda di re-indicizzazione
settings.reindex_requested=Re-indicizzazione richiesta
-settings.admin_enable_close_issues_via_commit_in_any_branch=Chiudi un issue tramite un commit eseguito in un branch non predefinito
+settings.admin_enable_close_issues_via_commit_in_any_branch=Chiudi una segnalazione tramite un commit eseguito su un ramo non predefinito
settings.danger_zone=Zona pericolosa
settings.new_owner_has_same_repo=Il nuovo proprietario ha già un repository con lo stesso nome. Per favore scegli un altro nome.
settings.convert=Converti in un progetto regolare
@@ -2034,9 +2042,9 @@ settings.event_send_everything=Tutti gli eventi
settings.event_choose=Eventi personalizzati…
settings.event_header_repository=Eventi del progetto
settings.event_create=Crea
-settings.event_create_desc=Branch o tag creato.
+settings.event_create_desc=Ramo o etichetta creati.
settings.event_delete=Elimina
-settings.event_delete_desc=Branch o tag eliminati.
+settings.event_delete_desc=Ramo o etichetta eliminati.
settings.event_fork=Fork
settings.event_fork_desc=Repository forkato.
settings.event_wiki=Wiki
@@ -2052,7 +2060,7 @@ settings.event_issues_desc=Issue aperto, chiuso, riaperto o modificato.
settings.event_issue_assign=Segnalazione assegnata
settings.event_issue_assign_desc=Issue assegnata o non assegnata.
settings.event_issue_label=Segnalazione etichettata
-settings.event_issue_label_desc=Etichette dei Problemi aggiornate o cancellate.
+settings.event_issue_label_desc=Etichette delle segnalazioni aggiornate o cancellate.
settings.event_issue_milestone=Segnalazione risolta
settings.event_issue_milestone_desc=Obiettivo raggiunto o abbandonato.
settings.event_issue_comment=Commento segnalazione
@@ -2074,7 +2082,7 @@ settings.event_pull_request_sync=Richiesta di modifica sincronizzata
settings.event_pull_request_sync_desc=Pull request sincronizzata.
settings.event_package=Pacchetto
settings.event_package_desc=Pacchetto creato o eliminato in un repository.
-settings.branch_filter=Filtro branch
+settings.branch_filter=Filtro rami
settings.branch_filter_desc=Whitelist dei rami per gli eventi di spinta, creazione dei rami e cancellazione dei rami, specificati come modello globo. Se vuoto o *
, gli eventi per tutti i rami sono segnalati. Vedi la documentazione github.com/gobwas/glob per la sintassi. Esempi: master
, {master,release*}
.
settings.active=Attivo
settings.active_helper=Le informazioni sugli eventi innescati saranno inviate a questo URL del webhook.
@@ -2348,8 +2356,8 @@ error.csv.unexpected=Impossibile visualizzare questo file perché contiene un ca
error.csv.invalid_field_count=Impossibile visualizzare questo file perché ha un numero errato di campi alla riga %d.
pulls.cmd_instruction_merge_desc = Unisci le modifiche e aggiornale su Forgejo.
pulls.cmd_instruction_merge_title = Merge
-pulls.cmd_instruction_checkout_desc = Dalla tua repository del progetto, accedi ad un nuovo ramo e prova le modifiche.
-milestones.new_subheader = I traguardi possono aiutarti ad organizzare i problemi e a tracciare i loro progressi.
+pulls.cmd_instruction_checkout_desc = Dalla tua repository del progetto, accedi a un nuovo ramo e prova le modifiche.
+milestones.new_subheader = I traguardi possono aiutarti ad organizzare le segnalazioni e a tracciarne i progressi.
activity.navbar.contributors = Contributori
migrate.cancel_migrating_title = Annulla migrazione
more_operations = Ulteriori operazioni
@@ -2390,7 +2398,7 @@ issues.label_exclusive = Esclusivo
pulls.made_using_agit = AGit
milestones.create_success = Il traguardo "%s" è stato creato.
search.fuzzy.tooltip = Includi risultati di ricerca che combaciano anche approssimativamente al termine di ricerca
-default_branch_label = default
+default_branch_label = predefinito
pulls.cmd_instruction_checkout_title = Checkout
pull.deleted_branch = (eliminato):%s
issues.filter_label_select_no_label = Senza etichette
@@ -2410,7 +2418,7 @@ wiki.reserved_page = La nome della pagina della wiki "%s" è riservato.
wiki.delete_page_notice_1 = La rimozione della pagina della wiki "%s" non può essere annullata. Continuare?
settings.webhook.test_delivery_desc_disabled = Per testare questo richiamo HTTP con un evento finto, attivalo.
settings.protected_branch_duplicate_rule_name = Esiste già una regola per questo insieme di rami
-rss.must_be_on_branch = Devi essere su ramo per avere un feed RSS.
+rss.must_be_on_branch = Devi essere su un ramo per avere un feed RSS.
admin.manage_flags = Gestisci flag
admin.enabled_flags = Flag abilitate per il progetto:
admin.update_flags = Aggiorna flag
@@ -2436,11 +2444,11 @@ ambiguous_runes_description = `Questo file contiene caratteri Unicode che potreb
vendored = Vendored
generated = Generato
commit.contained_in = Questo commit è contenuto in:
-commit.contained_in_default_branch = Questo commit è parte del ramo predefinito
+commit.contained_in_default_branch = Questo commit fa parte del ramo predefinito
commit.load_referencing_branches_and_tags = Carica rami ed etichette che fanno riferimento a questo commit
editor.fail_to_apply_patch = Impossibile applicare toppa "%s"
-editor.new_branch_name = Dai un nome al nuovo ramo per questo commit
-editor.branch_already_exists = Il ramo "%s" esiste già nel progetto.
+editor.new_branch_name = Dài un nome al nuovo ramo per questo commit
+editor.branch_already_exists = Il ramo "%s" esiste già nella repo.
editor.directory_is_a_file = Il nome cartella "%s" è già usato come nome file in questo progetto.
editor.file_is_a_symlink = `"%s" è un collegamento simbolico. I collegamenti simbolici non possono essere modificati nell'editor web`
editor.filename_is_a_directory = Il nome file "%s" è già usato come nome cartella in questo progetto.
@@ -2449,7 +2457,7 @@ editor.file_deleting_no_longer_exists = Il file in eliminazione, "%s", non esist
editor.file_already_exists = Un file chiamato "%s" esiste già in questo progetto.
editor.fail_to_update_file = Impossibile aggiornare/creare il file "%s".
editor.upload_file_is_locked = Il file "%s" è bloccato da %s.
-editor.cannot_commit_to_protected_branch = Non si può fare commit sul ramo protetto "%s".
+editor.cannot_commit_to_protected_branch = Non si possono fare commit sul ramo protetto "%s".
commits.search.tooltip = Puoi prefissare parole chiave con "autore:", "committer:", "dopo:", o "prima:", esempio "ripristino autore:Alice prima:2019-01-13".
issues.filter_project_all = Tutti i progetti
issues.label_exclusive_desc = Dai all'etichetta il nome ambito/oggetto
per renderla mutualmente esclusiva con altre etichette in ambito/
.
@@ -2473,7 +2481,7 @@ pulls.filter_changes_by_commit = Filtra per commit
pulls.nothing_to_compare_have_tag = I rami/etichette selezionati sono uguali.
pulls.merged_success = Richiesta di modifica fusa correttamente e chiusa
pulls.closed = Richiesta di modifica chiusa
-pulls.merged_info_text = Il ramo %s può essere eliminato ora.
+pulls.merged_info_text = Il ramo %s può ora essere eliminato.
pulls.blocked_by_user = Non puoi creare una richiesta di modifica in questo progetto perché sei bloccato dal proprietario.
pulls.status_checks_hide_all = Nascondi tutti i controlli
pulls.status_checks_show_all = Mostra tutti i controlli
@@ -2482,7 +2490,7 @@ pulls.close = Chiudi la richiesta di modifica
pulls.reopen_failed.head_branch = La richiesta di modifica non può essere riaperta perché il ramo genitore non esiste più.
pulls.clear_merge_message = Cancella messaggio di fusione
pulls.reopen_failed.base_branch = La richiesta di modifica non può essere riaperta perché il ramo di base non esiste più.
-pulls.agit_explanation = Creata usando flusso di lavoro AGit. AGit permette ai contributori di proporre modifiche usando "git push" senza creare una derivazione o un nuovo ramo.
+pulls.agit_explanation = Creata usando il flusso di lavoro AGit. AGit permette a chi contribuisce di proporre modifiche usando "git push" senza creare una derivazione o un nuovo ramo.
pulls.recently_pushed_new_branches = Hai immesso sul ramo %[1]s %[2]s
milestones.filter_sort.earliest_due_data = Scadenza più vicina
signing.wont_sign.twofa = Devi avere la verifica a due fattori abilitata per firmare i commit.
@@ -2497,7 +2505,7 @@ activity.navbar.recent_commits = Commit recenti
contributors.contribution_type.filter_label = Tipi di contributo:
search.type.tooltip = Cerca tipo
search.match.tooltip = Includi solo risultati che corrispondono esattamente ai termini di ricerca
-settings.mirror_settings.docs.disabled_push_mirror.instructions = Imposta il tuo progetto in modo che prelevi commit, etichette e rami da un altro progetto.
+settings.mirror_settings.docs.disabled_push_mirror.instructions = Imposta il tuo progetto in modo che prelevi commit, etichette e rami da un'altra repo.
settings.mirror_settings.docs.no_new_mirrors = Il tuo progetto sta specchiando i cambiamenti a/da un altro progetto. Tieni a mente che non puoi creare nuovi specchi al momento.
settings.mirror_settings.docs.can_still_use = Nonostante tu non possa modificare specchi esistenti o crearne di nuovi puoi comunque il tuo specchio esistente.
settings.mirror_settings.docs.pull_mirror_instructions = Per impostare uno specchio di prelievo consulta:
@@ -2507,13 +2515,13 @@ settings.mirror_settings.docs.pulling_remote_title = Prelievo da un progetto rem
settings.transfer_abort_success = Il trasferimento del progetto a %s è stato correttamente cancellato.
settings.enter_repo_name = Inserisci il proprietario e il nome del progetto esattamente come mostrato:
settings.confirmation_string = Stringa di conferma
-settings.wiki_rename_branch_main = Normalizza il nome del ramo della wiki
-settings.wiki_rename_branch_main_desc = Rinomina il ramo usato internamente dalla wiki come "%s". Questo è permanente è non può essere annullato.
+settings.wiki_rename_branch_main = Normalizza il nome del ramo della Wiki
+settings.wiki_rename_branch_main_desc = Rinomina il ramo usato internamente dalla Wiki in "%s". L'operazione è permanente è non può essere annullata.
settings.wiki_rename_branch_main_notices_1 = Questa operazione NON PUÒ essere annullata.
-settings.wiki_branch_rename_success = Il nome del ramo della wiki del progetto è stato normalizzato correttamente.
-settings.wiki_branch_rename_failure = Impossibile normalizzare il nome del ramo della wiki del progetto.
-settings.confirm_wiki_branch_rename = Rinomina ramo della wiki
-settings.wiki_rename_branch_main_notices_2 = Questo rinominerà permanentemente il ramo interno della wiki del progetto di %s. Passaggi esistenti dovranno essere aggiornati.
+settings.wiki_branch_rename_success = Il nome del ramo della wiki della repo è stato normalizzato correttamente.
+settings.wiki_branch_rename_failure = Impossibile normalizzare il nome del ramo della wiki della repo.
+settings.confirm_wiki_branch_rename = Rinomina il ramo della wiki
+settings.wiki_rename_branch_main_notices_2 = Ciò rinominerà permanentemente il ramo interno della wiki della repo di %s. Passaggi esistenti dovranno essere aggiornati.
settings.add_collaborator_blocked_our = Non si può aggiungere il collaboratore perché il proprietario del progetto lo ha bloccato.
settings.webhook.replay.description_disabled = Per riprodurre questo richiamo HTTP, attivalo.
settings.event_wiki_desc = Pagina wiki creata, rinominata, modificata o rimossa.
@@ -2535,9 +2543,9 @@ issues.role.contributor_helper = Questo utente ha precedentemente fatto commit a
pulls.blocked_by_official_review_requests = Questa richiesta di modifica è bloccata perché manca l'approvazione di uno o più revisori ufficiali.
pulls.blocked_by_changed_protected_files_1 = Questa richiesta di modifica è bloccata perché modifica un file protetto:
pulls.blocked_by_changed_protected_files_n = Questa richiesta di modifica è bloccata perché modifica file protetti:
-pulls.has_merged = Respinto: la richiesta di modifica è stata fusa, non puoi fonderla di nuovo o cambiare il ramo di destinazione.
+pulls.has_merged = Errore: la richiesta di modifica è stata fusa, non puoi fonderla di nuovo o cambiare il ramo di destinazione.
milestones.filter_sort.latest_due_date = Scadenza più lontana
-settings.mirror_settings.docs = Imposta il tuo progetto in modo che sincronizzi automaticamente commit, etichette e rami con un altro progetto.
+settings.mirror_settings.docs = Imposta la tua repo in modo che sincronizzi automaticamente commit, etichette e rami con un'altra repo.
settings.mirror_settings.docs.disabled_pull_mirror.instructions = Imposta il tuo progetto in modo che immetta commit, etichette e rami in un altro progetto automaticamente. Gli specchi di prelievo sono stati disabilitati dall'amministratore del sito.
settings.mirror_settings.docs.disabled_push_mirror.info = Gli specchi di immissione sono stati disabilitati dall'amministratore del sito.
settings.mirror_settings.docs.more_information_if_disabled = Puoi scoprire di più riguardo specchi di prelievo e di immissione qui:
@@ -2586,7 +2594,7 @@ issues.role.member_helper = questo utente è un membro dell'organizzazione che p
issues.review.pending.tooltip = Questo commento non è attualmente visibile ad altri utenti. Per inviare il tuo commento in attesa selezione "%s" -> "%s/%s/%s" in cima alla pagina.
pulls.blocked_by_approvals = Questa richiesta di modifica non ha ancora sufficienti approvazioni. %d di %d approvazioni concesse.
pulls.blocked_by_rejection = Questa richiesta di modifica ha modifiche richieste da un revisore ufficiale.
-pulls.blocked_by_outdated_branch = Questa richiesta di modifica è bloccata perché è obsoleta.
+pulls.blocked_by_outdated_branch = Questa richiesta di modifica è bloccata poiché obsoleta.
pulls.fast_forward_only_merge_pull_request = Solo fast-forward
signing.will_sign = Questo commit verrà firmato con la chiave "%s".
signing.wont_sign.error = C'è stato un errore durante il controllo per la firma del commit.
@@ -2605,14 +2613,14 @@ settings.pull_mirror_sync_in_progress = Prelevando cambiamenti dal progetto remo
settings.push_mirror_sync_in_progress = Immettendo cambiamenti al progetto remoto %s.
settings.update_mirror_settings = Aggiorna impostazioni dello specchio
settings.branches.switch_default_branch = Passa al ramo predefinito
-settings.branches.add_new_rule = Aggiungi nuova regola
+settings.branches.add_new_rule = Aggiungi una nuova regola
settings.actions_desc = Abilita azioni del progetto
settings.new_owner_blocked_doer = Il nuovo proprietario ti ha bloccato.
settings.update_settings_no_unit = Ili progetto dovrebbe consentire almeno qualche tipo di interazione.
settings.add_collaborator_owner = Non si può aggiungere un proprietario come collaboratore.
-branch.delete_desc = Eliminare un ramo è permanente. Nonostante il ramo eliminato potrebbe continuare ad esistere per un breve periodo di tempo prima di essere realmente eliminato, l'eliminazione NON PUÒ essere annullata in molti casi. Continuare?
+branch.delete_desc = L'eliminazione di un ramo è definitiva. Nonostante il ramo eliminato potrebbe continuare ad esistere per un breve periodo di tempo prima di essere realmente eliminato, l'eliminazione NON PUÒ essere annullata in molti casi. Continuare?
editor.invalid_commit_mail = Email invalida per creare un commit.
-editor.branch_does_not_exist = Il ramo "%s" non esiste nel progetto.
+editor.branch_does_not_exist = Il ramo "%s" non esiste nella repo.
issues.label_archive = Archivia etichetta
issues.label_archived_filter = Mostra etichette archiviate
issues.dependency.no_permission_n = Non hai il permesso di lettura per leggere %s dipendenze
@@ -2661,7 +2669,7 @@ tag.ahead.target = a %s da questa etichetta
release.tag_helper_new = Nuova etichetta. Questa etichetta sarà creata dalla destinazione.
release.tag_helper_existing = Etichetta esistente.
release.deletion_desc = La rimozione di un rilascio lo rimuove solo da Forgejo. Non influenza l'etichetta Git, i contenuti del tuo progetto o la sua cronologia. Continuare?
-branch.already_exists = Un ramo chiamato "%s" esiste già.
+branch.already_exists = Esiste già un ramo chiamato "%s".
settings.merge_style_desc = Modalità di fusione
settings.remove_protected_branch_failed = Impossibile rimuovere la regola di protezione del ramo "%s".
settings.remove_protected_branch_success = La regola di protezione del ramo "%s" è stata rimossa.
@@ -2715,12 +2723,16 @@ release.download_count_one = %s download
release.download_count_few = %s downloads
release.system_generated = Questo allegato è stato generato automaticamente.
pulls.ready_for_review = Pronto alla revisione?
-editor.commit_id_not_matching = L'ID del commit non combacia con quello che stavi modificando. Conferma le tue modifiche su un nuovo ramo, poi uniscilo al ramo desiderato.
+editor.commit_id_not_matching = L'ID del commit non combacia con quello del commit che stavi modificando. Conferma le tue modifiche su un nuovo ramo, poi fondilo col ramo desiderato.
n_branch_few = %s rami
n_tag_one = %s tag
commits.search_branch = Questo Ramo
settings.rename_branch_failed_protected = Non è possibile rinominare il ramo %s perché è un ramo protetto.
settings.event_pull_request_enforcement = Imposizione
+settings.matrix.room_id_helper = L'ID della Stanza può essere ricavato dal web client Element > Stanza > Impostazioni > Avanzato > ID interno stanza. Esempio: %s.
+settings.graphql_url = URL GraphQL
+settings.sourcehut_builds.access_token_helper = Token di accesso con grant JOBS:RW. Genera un token builds.sr.ht o un token builds.sr.ht con accesso ai segreti su meta.sr.ht.
+settings.matrix.access_token_helper = È consigliata l'impostazione di un account Matrix dedicato per questa funzione. Il token di accesso può essere prelevato dal web client Element (in una pagina privata/incognito) > Menu utente (in alto a sinistra) > Tutte le impostazioni > Aiuto e informazioni > Avanzato > Token di accesso (sotto all'URL del Homeserver). Chiudi la pagina privata/incognito (La disconnessione invaliderebbe il token).
[graphs]
contributors.what = contribuzioni
@@ -2978,7 +2990,7 @@ users.delete_account=Elimina profilo utente
users.cannot_delete_self=Non puoi eliminare te stesso
users.still_own_repo=Questo utente possiede ancora una o più repository. Eliminare o trasferire questi repository prima di continuare.
users.still_has_org=Questo utente è membro di un'organizzazione. Rimuovi l'utente da tutte le organizzazioni prima di proseguire.
-users.purge=Elimina Utente
+users.purge=Elimina utente
users.purge_help=Eliminare forzatamente l'utente e tutti i progetti, le organizzazioni e i pacchetti di proprietà dell'utente. Anche tutti i commenti e le segnalazioni verranno eliminati.
users.deletion_success=L'account utente è stato eliminato.
users.reset_2fa=Resetta 2FA
@@ -2987,13 +2999,13 @@ users.list_status_filter.reset=Ripristina
users.list_status_filter.is_active=Attivo
users.list_status_filter.not_active=Inattivo
users.list_status_filter.is_admin=Amministratore
-users.list_status_filter.not_admin=Non Amministratore
+users.list_status_filter.not_admin=Non amministratore
users.list_status_filter.is_restricted=Limitato
-users.list_status_filter.not_restricted=Non Limitato
-users.list_status_filter.is_prohibit_login=Divieto Di Login
-users.list_status_filter.not_prohibit_login=Consenti Login
-users.list_status_filter.is_2fa_enabled=2FA Abilitato
-users.list_status_filter.not_2fa_enabled=2FA Disabilitato
+users.list_status_filter.not_restricted=Non limitato
+users.list_status_filter.is_prohibit_login=Accesso vietato
+users.list_status_filter.not_prohibit_login=Accesso consentito
+users.list_status_filter.is_2fa_enabled=2FA abilitato
+users.list_status_filter.not_2fa_enabled=2FA disabilitato
emails.email_manage_panel=Gestisci email dell'utente
emails.primary=Primario
@@ -3022,7 +3034,7 @@ repos.private=Privati
repos.watches=Segue
repos.stars=Voti
repos.forks=Fork
-repos.issues=Problemi
+repos.issues=Segnalazioni
repos.size=Dimensione
packages.package_manage_panel=Gestisci pacchetti
@@ -3721,7 +3733,7 @@ runners.new_notice = Come avviare un esecutore
runners.new = Crea un nuovo esecutore
variables.update.success = La variabile è stata modificata.
variables.update.failed = Impossibile modificare la variabile.
-variables.creation.failed = Impossibile aggiungere variabile.
+variables.creation.failed = Errore nell'aggiunta della variabile.
variables.deletion.success = La variabile è stata rimossa.
variables.deletion.failed = Impossibile rimuovere la variabile.
variables.edit = Modifica variabile
@@ -3775,7 +3787,7 @@ package_kind = Ricerca pacchetti...
code_search_unavailable = La ricerca del codice non è attualmente disponibile. Contatta l'amministratore del sito.
code_kind = Cerca codice...
team_kind = Cerca team...
-code_search_by_git_grep = I risultati della ricerca del codice sono forniti da "git grep". Potrebbero esserci risultati migliori se l'amministratore del sito avesse abilitato l'Indicizzatore del Codice.
+code_search_by_git_grep = I risultati della ricerca del codice sono forniti da "git grep". Potrebbero esserci risultati migliori se l'amministratore del sito avesse abilitato l'indicizzatore del codice.
project_kind = Ricerca progetti...
commit_kind = Ricerca commit...
branch_kind = Ricerca rami...
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index ed4231d18c..5e8af1d750 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -19,8 +19,8 @@ language=Idioma
notifications=Notificações
active_stopwatch=Cronômetro ativo
create_new=Criar…
-user_profile_and_more=Perfil e Configurações...
-signed_in_as=Acessado como
+user_profile_and_more=Perfil e configurações…
+signed_in_as=Sessão iniciada como
enable_javascript=Este site requer JavaScript.
toc=Índice
licenses=Licenças
@@ -37,18 +37,18 @@ twofa_scratch=Código de backup da autenticação de dois fatores
passcode=Senha
webauthn_insert_key=Insira sua chave de segurança
-webauthn_sign_in=Pressione o botão na sua chave de segurança. Se a sua chave de segurança não tiver um botão, insira-a novamente.
-webauthn_press_button=Por favor, pressione o botão na sua chave de segurança…
+webauthn_sign_in=Pressione o botão na sua chave de segurança. Caso a sua chave de segurança não possuir um botão, insira-a novamente.
+webauthn_press_button=Pressione o botão na sua chave de segurança…
webauthn_use_twofa=Use um código de duas etapas do seu telefone
webauthn_error=Não foi possível ler sua chave de segurança.
webauthn_unsupported_browser=Seu navegador não oferece suporte ao WebAuthn.
-webauthn_error_unknown=Ocorreu um erro desconhecido. Por favor, tente novamente.
-webauthn_error_insecure=`WebAuthn suporta apenas conexões seguras. Para testar via HTTP, você pode usar a origem "localhost" ou "127.0.0.1"`
+webauthn_error_unknown=Ocorreu um erro desconhecido. Tente novamente.
+webauthn_error_insecure=WebAuthn suporta apenas conexões seguras. Para testar via HTTP, você pode usar a origem "localhost" ou "127.0.0.1"
webauthn_error_unable_to_process=O servidor não pôde processar sua solicitação.
webauthn_error_duplicated=A chave de segurança não é permitida para esta solicitação. Por favor, certifique-se que a chave já não está registrada.
webauthn_error_empty=Você deve definir um nome para esta chave.
-webauthn_error_timeout=Tempo limite atingido antes de sua chave poder ser lida. Por favor, recarregue esta página e tente novamente.
-webauthn_reload=Recarregar
+webauthn_error_timeout=Não foi possível ler a sua chave de segurança antes do tempo limite. Atualize a página e tente novamente.
+webauthn_reload=Atualizar
repository=Repositório
organization=Organização
@@ -79,7 +79,7 @@ pull_requests=Pull requests
issues=Issues
milestones=Marcos
-ok=Ok
+ok=OK
cancel=Cancelar
retry=Tentar novamente
rerun=Reexecutar
@@ -614,6 +614,7 @@ org_still_own_packages=Esta organização ainda possui pacotes, exclua-os primei
target_branch_not_exist=O branch de destino não existe.
username_error_no_dots = ` pode conter apenas caracteres alfanuméricos ("0-9, "a-z", "A-Z"), hífens ("-") e traços inferiores ("_"). Não é permitido conter caracteres não alfanuméricos no início ou fim. Caracteres não alfanuméricos consecutivos também não são permitidos.`
admin_cannot_delete_self = Você não pode excluir a si mesmo quando você é um administrador. Por favor, remova suas permissões de administrador primeiro.
+AccessToken = Token de acesso
[user]
@@ -1057,9 +1058,9 @@ author_search_tooltip=Mostra um máximo de 30 usuários
transfer.accept=Aceitar transferência
-transfer.accept_desc=`Transferir para "%s"`
+transfer.accept_desc=Transferir para "%s"
transfer.reject=Rejeitar transferência
-transfer.reject_desc=`Cancelar a transferência para "%s"`
+transfer.reject_desc=Cancelar a transferência para "%s"
transfer.no_permission_to_accept=Você não tem permissão para aceitar essa transferência.
transfer.no_permission_to_reject=Você não tem permissão para rejeitar essa transferência.
@@ -2870,31 +2871,31 @@ users.list_status_filter.not_restricted=Não restrito
users.list_status_filter.is_prohibit_login=Proibir login
users.list_status_filter.not_prohibit_login=Permitir login
users.list_status_filter.is_2fa_enabled=2FA Ativado
-users.list_status_filter.not_2fa_enabled=2FA Desativado
+users.list_status_filter.not_2fa_enabled=Autenticação em duas etapas desativada
users.details=Detalhes do usuário
-emails.email_manage_panel=Gerenciamento de E-mail de Usuário
+emails.email_manage_panel=Gerenciar e-mails de usuários
emails.primary=Principal
-emails.activated=Ativado
+emails.activated=Em uso
emails.filter_sort.email=E-mail
-emails.filter_sort.email_reverse=E-mail (reverso)
-emails.filter_sort.name=Nome de Usuário
-emails.filter_sort.name_reverse=Nome de Usuário (reverso)
-emails.updated=E-mail atualizado
+emails.filter_sort.email_reverse=E-mail (decrescente)
+emails.filter_sort.name=Usuário
+emails.filter_sort.name_reverse=Usuário (decrescente)
+emails.updated=Endereço de e-mail atualizado
emails.not_updated=Falha ao atualizar o endereço de e-mail solicitado: %v
-emails.duplicate_active=Este endereço de e-mail já está ativo para um usuário diferente.
+emails.duplicate_active=Este endereço de e-mail já está em uso por outro usuário.
emails.change_email_header=Atualizar Propriedades do E-mail
-orgs.org_manage_panel=Gerenciamento da organização
+orgs.org_manage_panel=Gerenciar organizações
orgs.name=Nome
orgs.teams=Equipes
orgs.members=Membros
orgs.new_orga=Nova organização
-repos.repo_manage_panel=Gerenciamento do repositório
+repos.repo_manage_panel=Gerenciar repositórios
repos.unadopted=Repositórios Não Adotados
repos.unadopted.no_more=Não foram encontrados mais repositórios não adotados
-repos.owner=Proprietário
+repos.owner=Proprietário(a)
repos.name=Nome
repos.private=Privado
repos.watches=Observadores
@@ -2904,9 +2905,9 @@ repos.issues=Issues
repos.size=Tamanho
repos.lfs_size=Tamanho do LFS
-packages.package_manage_panel=Gerenciamento de Pacotes
-packages.total_size=Tamanho Total: %s
-packages.unreferenced_size=Tamanho Não Referenciado: %s
+packages.package_manage_panel=Gerenciar pacotes
+packages.total_size=Tamanho total: %s
+packages.unreferenced_size=Tamanho não referenciado: %s
packages.cleanup=Limpar dados expirados
packages.owner=Proprietário
packages.creator=Criador
@@ -2925,13 +2926,13 @@ systemhooks=Webhooks do Sistema
systemhooks.add_webhook=Adicionar Webhook do Sistema
systemhooks.update_webhook=Atualizar Webhook do Sistema
-auths.auth_manage_panel=Gerenciamento de fonte de autenticação
+auths.auth_manage_panel=Gerenciar fontes de autenticação
auths.new=Adicionar fonte de autenticação
auths.name=Nome
auths.type=Tipo
-auths.enabled=Habilitado
+auths.enabled=Habilitada
auths.syncenabled=Habilitar sincronização de usuário
-auths.updated=Atualizado
+auths.updated=Atualizada
auths.auth_type=Tipo de autenticação
auths.auth_name=Nome da autenticação
auths.security_protocol=Protocolo de segurança
@@ -2941,7 +2942,7 @@ auths.port=Porta
auths.bind_dn=Vincular DN
auths.bind_password=Vincular senha
auths.user_base=Base de pesquisa do usuário
-auths.user_dn=Usuário do DN
+auths.user_dn=DN do usuário
auths.attribute_username=Atributo nome de usuário
auths.attribute_username_placeholder=Deixe em branco para usar o nome de usuário inserido no Forgejo.
auths.attribute_name=Atributo primeiro nome
@@ -2951,11 +2952,11 @@ auths.attribute_ssh_public_key=Atributo de chave SSH pública
auths.attribute_avatar=Atributo do avatar
auths.attributes_in_bind=Buscar os atributos no contexto de Bind DN
auths.allow_deactivate_all=Permitir que um resultado de pesquisa vazio para desativar todos os usuários
-auths.use_paged_search=Use a pesquisa paginada
+auths.use_paged_search=Usar pesquisa paginada
auths.search_page_size=Tamanho da página
auths.filter=Filtro de usuário
auths.admin_filter=Filtro de administrador
-auths.restricted_filter=Filtro de restrição
+auths.restricted_filter=Filtro restrito
auths.restricted_filter_helper=Deixe em branco para não definir nenhum usuário como restrito. Use um asterisco ('*') para definir todos os usuários que não correspondem ao Filtro de administrador como restritos.
auths.verify_group_membership=Verificar associação ao grupo no LDAP (deixe o filtro vazio para ignorar)
auths.group_search_base=Grupo de Pesquisa DN Base
@@ -2963,34 +2964,34 @@ auths.group_attribute_list_users=Atributo do Grupo que Contém a Lista de Usuár
auths.user_attribute_in_group=Atributo do Usuário Listado em Grupo
auths.map_group_to_team=Mapear grupos LDAP para Organizações (deixe o campo vazio para pular)
auths.map_group_to_team_removal=Remover usuários de equipes sincronizadas se o usuário não pertence ao grupo LDAP correspondente
-auths.enable_ldap_groups=Habilitar grupos do LDAP
+auths.enable_ldap_groups=Habilitar grupos LDAP
auths.ms_ad_sa=Atributos de pesquisa do MS AD
auths.smtp_auth=Tipo de autenticação SMTP
-auths.smtphost=Host SMTP
-auths.smtpport=Porta SMTP
+auths.smtphost=Servidor
+auths.smtpport=Porta
auths.allowed_domains=Domínios permitidos
-auths.allowed_domains_helper=Deixe em branco para permitir todos os domínios. Separe vários domínios com uma vírgula (',').
-auths.skip_tls_verify=Pular verificação de TLS
+auths.allowed_domains_helper=Deixe em branco para permitir todos os domínios. Separe múltiplos domínios com uma vírgula (",").
+auths.skip_tls_verify=Ignorar validação TLS
auths.force_smtps=Forçar SMTPS
auths.force_smtps_helper=SMTPS é sempre usado no porto 465. Defina isso para forçar o SMTPS em outros portos. (Caso contrário STARTTLS será usado em outros portos se for suportado pelo host.)
-auths.helo_hostname=HELO Hostname
+auths.helo_hostname=Nome de servidor HELO
auths.helo_hostname_helper=Hostname enviado com HELO. Deixe em branco para enviar o hostname atual.
auths.disable_helo=Desativar HELO
-auths.pam_service_name=Nome de Serviço PAM
+auths.pam_service_name=Nome do serviço PAM
auths.pam_email_domain=Domínio de e-mail do PAM (opcional)
auths.oauth2_provider=Provedor OAuth2
-auths.oauth2_icon_url=URL do Ícone
+auths.oauth2_icon_url=URL do ícone
auths.oauth2_clientID=ID do cliente (chave)
-auths.oauth2_clientSecret=Client Secret
-auths.openIdConnectAutoDiscoveryURL=URL do OpenID Connect Auto Discovery
-auths.oauth2_use_custom_url=Usar URLs personalizadas em vez de URLs padrão
-auths.oauth2_tokenURL=URL do Token
-auths.oauth2_authURL=URL de Authorização
+auths.oauth2_clientSecret=Segredo do cliente
+auths.openIdConnectAutoDiscoveryURL=URL de descoberta automática de conexão do OpenID
+auths.oauth2_use_custom_url=Usar URLs personalizados em vez de URLs padrão
+auths.oauth2_tokenURL=URL do código
+auths.oauth2_authURL=URL da autorização
auths.oauth2_profileURL=URL do perfil
-auths.oauth2_emailURL=URL de e-mail
-auths.skip_local_two_fa=Pular 2FA local
+auths.oauth2_emailURL=URL do e-mail
+auths.skip_local_two_fa=Ignorar autenticação em duas etapas local
auths.skip_local_two_fa_helper=Deixar desligado significa que os usuários locais com 2FA ligada ainda terão que fazer login com 2FA
-auths.oauth2_tenant=Tenant
+auths.oauth2_tenant=Locatário
auths.oauth2_scopes=Escopos Adicionais
auths.oauth2_required_claim_name=Nome do Claim Obrigatorio
auths.oauth2_required_claim_name_helper=Defina este nome para permitir o login desta fonte apenas para usuários que tenham um claim com este nome
@@ -3484,7 +3485,7 @@ rpm.repository.multiple_groups = Este pacote está disponível em vários grupos
secrets=Segredos
description=Os segredos serão passados a certas ações e não poderão ser lidos de outra forma.
none=Não há segredos ainda.
-creation=Adicionar Segredo
+creation=Adicionar segredo
creation.name_placeholder=apenas caracteres alfanuméricos ou underline (_), não pode começar com GITEA_ ou GITHUB_
creation.value_placeholder=Insira qualquer conteúdo. Espaços em branco no início e no fim serão omitidos.
creation.success=O segredo "%s" foi adicionado.
@@ -3513,7 +3514,7 @@ runners=Runners
runners.runner_manage_panel=Gerenciamento de Runners
runners.new=Criar novo Runner
runners.new_notice=Como iniciar um runner
-runners.status=Status
+runners.status=Estado
runners.id=ID
runners.name=Nome
runners.owner_type=Tipo
@@ -3524,10 +3525,10 @@ runners.runner_title=Runner
runners.task_list=Tarefas recentes neste runner
runners.task_list.no_tasks=Ainda não há nenhuma tarefa.
runners.task_list.run=Executar
-runners.task_list.status=Status
+runners.task_list.status=Estado
runners.task_list.repository=Repositório
runners.task_list.commit=Commit
-runners.task_list.done_at=Feito em
+runners.task_list.done_at=Realizada em
runners.edit_runner=Editar Runner
runners.update_runner=Atualizar as Alterações
runners.update_runner_success=Runner atualizado com sucesso
@@ -3541,7 +3542,7 @@ runners.none=Nenhum runner disponível
runners.status.unspecified=Desconhecido
runners.status.idle=Inativo
runners.status.active=Ativo
-runners.status.offline=Offiline
+runners.status.offline=Offline
runners.version=Versão
runners.reset_registration_token_success=Token de registro de runner redefinido com sucesso
@@ -3581,7 +3582,7 @@ type-3.display_name=Projeto da organização
[git.filemode]
; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", …
-symbolic_link=Link simbólico
+symbolic_link=Ligação simbólica
changed_filemode = %[1]s → %[2]s
directory = Diretório
normal_file = Arquivo normal
@@ -3611,4 +3612,5 @@ fuzzy = Aproximada
fuzzy_tooltip = Inclui resultados que se aproximam dos termos de busca
match = Correspondente
match_tooltip = Inclui apenas os resultados que correspondem exatamente aos termos de busca
-repo_kind = Buscar repositórios...
\ No newline at end of file
+repo_kind = Buscar repositórios...
+type_tooltip = Tipo de busca
\ No newline at end of file
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index a6d11c4182..d0c5320cdc 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -627,6 +627,12 @@ admin_cannot_delete_self=Não se pode auto-remover quando tem privilégios de ad
username_error_no_dots = ` só pode conter caracteres alfanuméricos ("0-9","a-z","A-Z"), hífen ('-'), sublinhado ('_') e ponto ('.') Não pode começar nem terminar com caracteres não alfanuméricos, e caracteres não alfanuméricos consecutivos também são proibidos.`
unset_password = O utilizador não definiu a senha.
unsupported_login_type = O tipo de início de sessão não é suportado para eliminar a conta.
+Biography = Biografia
+Website = Sítio web
+Location = Localização
+To = Nome do ramo
+required_prefix = A entrada tem de começar com "%s"
+AccessToken = Código de acesso
[user]
change_avatar=Mude o seu avatar…
@@ -652,6 +658,16 @@ settings=Configurações do utilizador
form.name_reserved=O nome de utilizador "%s" está reservado.
form.name_pattern_not_allowed=O padrão "%s" não é permitido no nome de utilizador.
form.name_chars_not_allowed=O nome de utilizador "%s" contém caracteres inválidos.
+block = Bloquear
+unblock = Desbloquear
+followers_one = %d seguidor
+following_one = %d seguindo
+block_user.detail = Note que se bloquear este utilizador, serão executadas outras operações, tais como:
+block_user.detail_1 = Está a deixar de ser seguido por este utilizador.
+block_user.detail_2 = Este utilizador não pode interagir com os seus repositórios, questões criadas e comentários.
+block_user.detail_3 = Este/a utilizador/a não o/a pode adicionar como colaborador/a nem você pode o/a adicionar como colaborador/a.
+follow_blocked_user = Não pode seguir este/a utilizador/a porque você o/a bloqueou ou este/a utilizador/a bloqueou-o/a a si.
+block_user = Bloquear utilizador
[settings]
profile=Perfil
@@ -964,6 +980,20 @@ visibility.limited=Limitada
visibility.limited_tooltip=Visível apenas para utilizadores autenticados
visibility.private=Privada
visibility.private_tooltip=Visível apenas para membros das organizações a que se associou
+additional_repo_units_hint = Encorajar a habilitação de unidades do repositório adicionais
+update_hints = Modificar sugestões
+change_password = Modificar a senha
+pronouns = Pronomes
+pronouns_custom = Personalizado
+pronouns_unspecified = Não especificado
+hints = Sugestões
+blocked_users = Utilizadores bloqueados
+blocked_since = Bloqueado desde %s
+user_block_success = O utilizador foi bloqueado com sucesso.
+additional_repo_units_hint_description = Mostrar um botão "Adicionar mais unidades..." para repositórios que não têm todas as unidades disponíveis habilitadas.
+update_hints_success = As sugestões foram modificadas.
+blocked_users_none = Não há utilizadores bloqueados.
+user_unblock_success = O utilizador foi desbloqueado com sucesso.
[repo]
new_repo_helper=Um repositório contém todos os ficheiros do trabalho, incluindo o histórico das revisões. Já tem um hospedado noutro sítio? Migre o repositório.
@@ -2624,6 +2654,32 @@ find_file.no_matching=Não foi encontrado qualquer ficheiro correspondente
error.csv.too_large=Não é possível apresentar este ficheiro por ser demasiado grande.
error.csv.unexpected=Não é possível apresentar este ficheiro porque contém um caractere inesperado na linha %d e coluna %d.
error.csv.invalid_field_count=Não é possível apresentar este ficheiro porque tem um número errado de campos na linha %d.
+issues.blocked_by_user = Não pode criar uma questão neste repositório porque foi bloqueado/a pelo/a proprietário/a do repositório.
+issues.num_participants_one = %d participante
+stars = Favoritos
+editor.invalid_commit_mail = Email inválido para criar um cometimento.
+editor.push_out_of_date = O envio parece estar fora de prazo.
+admin.enabled_flags = Marcadores habilitados no repositório:
+admin.update_flags = Modificar marcadores
+admin.flags_replaced = Os marcadores do repositório foram substituídos
+commits.browse_further = Explorar mais um pouco
+commits.renamed_from = Renomeado de %s
+size_format = %[1]s: %[2]s, %[3]s: %[4]s
+issues.archived_label_description = (arquivado) %s
+admin.failed_to_replace_flags = Falhou a reposição dos marcadores do repositório
+open_with_editor = Abrir com %s
+admin.manage_flags = Gerir marcadores
+file_follow = Seguir ligação simbólica
+rss.must_be_on_branch = Tem que estar num ramo que tenha uma fonte RSS.
+n_commit_few = %s cometimentos
+n_branch_one = %s ramo
+n_branch_few = %s ramos
+n_tag_one = %s etiqueta
+n_tag_few = %s etiquetas
+migrate.forgejo.description = Migrar dados de codeberg.org ou de outras instâncias Forgejo.
+n_commit_one = %s cometimento
+editor.commit_id_not_matching = O ID de cometimento não corresponde ao que estava a editar. Cometa para um ramo novo e depois integre.
+commits.search_branch = Este ramo
[graphs]
component_loading=A carregar %s...
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 1fe9d0d4d9..6017980183 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -629,6 +629,14 @@ username_error_no_dots = ` может состоять только из лат
unsupported_login_type = Удаление аккаунта невозможно с этим типом авторизации.
unset_password = У пользователя не задан пароль.
required_prefix = Должно начинаться с «%s»
+AccessToken = Токен доступа
+FullName = Полное имя
+Description = Описание
+Pronouns = Местоимения
+Biography = О себе
+Website = Веб-сайт
+Location = Местоположение
+To = Название ветки
[user]
@@ -914,7 +922,7 @@ revoke_oauth2_grant=Отозвать доступ
revoke_oauth2_grant_description=Отзыв доступа у этого стороннего приложения не позволит ему получать доступ к вашим данным. Вы уверены?
revoke_oauth2_grant_success=Доступ был успешно отозван.
-twofa_desc=Двухфакторная аутентификация повышает уровень безопасности вашей учётной записи.
+twofa_desc=Для дополнительной защиты учётной записи вы можете настроить аутентификацию по одноразовым «TOTP» кодам, генерируемым на смартфоне или другом устройстве.
twofa_recovery_tip=При утере устройства вы сможете восстановить доступ к учётной записи, использовав одноразовый ключ восстановления.
twofa_is_enrolled=Ваша учётная запись в настоящее время использует двухфакторную аутентификацию.
twofa_not_enrolled=Ваша учётная запись в настоящее время не использует двухфакторную аутентификацию.
@@ -1306,8 +1314,8 @@ editor.commit_empty_file_text=Файл, который вы собираетес
editor.no_changes_to_show=Нет изменений.
editor.fail_to_update_file=Не удалось обновить/создать файл «%s».
editor.fail_to_update_file_summary=Ошибка:
-editor.push_rejected_no_message=Изменение отклонено сервером без сообщения. Пожалуйста, проверьте хуки Git.
-editor.push_rejected=Изменение отклонено сервером. Пожалуйста, проверьте хуки Git.
+editor.push_rejected_no_message=Изменение отклонено сервером без сообщения. Пожалуйста, проверьте Git-хуки.
+editor.push_rejected=Изменение отклонено сервером. Пожалуйста, проверьте Git-хуки.
editor.push_rejected_summary=Полное сообщение об отклонении:
editor.add_subdir=Добавить каталог…
editor.unable_to_upload_files=Не удалось загрузить файлы в «%s» из-за ошибки: %v
@@ -1435,9 +1443,9 @@ issues.new_label=Новая метка
issues.new_label_placeholder=Имя метки
issues.new_label_desc_placeholder=Описание
issues.create_label=Добавить метку
-issues.label_templates.title=Загрузить набор предопределённых меток
+issues.label_templates.title=Загрузить набор меток
issues.label_templates.info=Меток пока нет. Создайте новую метку или используйте этот набор меток:
-issues.label_templates.helper=Выберите метку
+issues.label_templates.helper=Выберите набор меток
issues.label_templates.use=Использовать набор меток
issues.label_templates.fail_to_load_file=Не удалось загрузить файл шаблона меток «%s»: %v
issues.add_label=добавлена метка %s %s
@@ -1526,7 +1534,7 @@ issues.commented_at=`оставлен комментарий в %
issues.delete_comment_confirm=Вы уверены, что хотите удалить этот комментарий?
issues.context.copy_link=Копировать ссылку
issues.context.quote_reply=Цитировать ответ
-issues.context.reference_issue=Ссылка в новой задаче
+issues.context.reference_issue=Сослаться в новой задаче
issues.context.edit=Редактировать
issues.context.delete=Удалить
issues.no_content=Описание отсутствует.
@@ -2722,6 +2730,11 @@ settings.event_pull_request_enforcement = Форсирование
pulls.cmd_instruction_checkout_desc = В репозитории вашего проекта перейдите на эта ветку и протестируйте изменения.
error.broken_git_hook = Гит-хуки этого репозитория сломаны. Ознакомьтесь с документацией и почините их, затем отправьте какие-нибудь коммиты для обновления статуса.
pulls.cmd_instruction_checkout_title = Перейдите на ветку
+settings.graphql_url = Ссылка GraphQL
+settings.sourcehut_builds.access_token_helper = Токен builds.sr.ht с разрешением JOBS:RW. Создайте обычный токен или токен с доступом к секретам на meta.sr.ht.
+settings.matrix.room_id_helper = ID комнаты можно получить в веб-клиенте Element: Настройки комнаты > Подробности > Внутренний ID комнаты. Пример: %s.
+settings.matrix.access_token_helper = Рекомендуется создать отдельный аккаунт. Токен доступа можно получить в веб-клиенте Element (в приватной вкладке или режиме инкогнито): Пользовательское меню (сверху слева) > Все настройки > Помощь и о программе > Токен доступа (под ссылкой Homeserver). Закройте вкладку/окно, не выходя из Element. Выход аннулирует токен.
+settings.mirror_settings.pushed_repository = Удалённый репозиторий
[graphs]
@@ -2861,7 +2874,7 @@ integrations=Интеграции
authentication=Аутентификация
emails=Адреса эл. почты пользователей
config=Конфигурация
-notices=Системные уведомления
+notices=Системные оповещения
monitor=Мониторинг
first_page=Первая
last_page=Последняя
@@ -2998,7 +3011,7 @@ users.list_status_filter.is_admin=Администраторы
users.list_status_filter.not_admin=Не администраторы
users.list_status_filter.is_restricted=Ограниченные
users.list_status_filter.not_restricted=Не ограниченные
-users.list_status_filter.is_prohibit_login=Запрещён вход
+users.list_status_filter.is_prohibit_login=Вход запрещён
users.list_status_filter.not_prohibit_login=Вход разрешён
users.list_status_filter.is_2fa_enabled=2ФА включена
users.list_status_filter.not_2fa_enabled=2ФА отключена
@@ -3351,7 +3364,7 @@ monitor.queue.settings.changed=Настройки обновлены
monitor.queue.settings.remove_all_items=Удалить все
monitor.queue.settings.remove_all_items_done=Все элементы в очереди были удалены.
-notices.system_notice_list=Уведомления системы
+notices.system_notice_list=Системные оповещения
notices.view_detail_header=Подробности уведомления
notices.operations=Операции
notices.select_all=Выбрать всё
@@ -3389,6 +3402,7 @@ config.open_with_editor_app_help = Приложения для "Открыть
config_settings = Настройки
auths.tips.gmail_settings = Настройки Gmail:
auths.tip.gitlab_new = Создайте новое приложение в https://gitlab.com/-/profile/applications
+monitor.queue.review_add = Подробности / добавить рабочих
[action]
@@ -3750,6 +3764,8 @@ runs.no_workflows.quick_start = Не знаете, как начать испо
runs.no_workflows.documentation = Чтобы узнать больше о Действиях Forgejo, читайте документацию.
runs.workflow = Рабочий поток
runs.status_no_select = Любой статус
+runs.no_matching_online_runner_helper = Нет работающего раннера с меткой: %s
+runs.no_job_without_needs = Рабочий процесс должен содержать хотя бы одну задачу без зависимостей.
[projects]
type-1.display_name=Индивидуальный проект
diff --git a/package-lock.json b/package-lock.json
index ccc16b21fd..62628a8c8d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -34,17 +34,17 @@
"katex": "0.16.10",
"license-checker-webpack-plugin": "0.2.1",
"mermaid": "10.9.0",
- "mini-css-extract-plugin": "2.8.1",
+ "mini-css-extract-plugin": "2.9.0",
"minimatch": "9.0.4",
"monaco-editor": "0.47.0",
"monaco-editor-webpack-plugin": "7.1.0",
"pdfobject": "2.3.0",
"postcss": "8.4.38",
"postcss-loader": "8.1.1",
- "postcss-nesting": "12.1.1",
+ "postcss-nesting": "12.1.2",
"pretty-ms": "9.0.0",
"sortablejs": "1.15.2",
- "swagger-ui-dist": "5.13.0",
+ "swagger-ui-dist": "5.17.0",
"tailwindcss": "3.4.3",
"temporal-polyfill": "0.2.4",
"throttle-debounce": "5.0.0",
@@ -54,7 +54,7 @@
"tributejs": "5.1.3",
"uint8-to-base64": "0.2.0",
"vanilla-colorful": "0.7.2",
- "vue": "3.4.23",
+ "vue": "3.4.24",
"vue-bar-graph": "2.0.0",
"vue-chartjs": "5.3.1",
"vue-loader": "17.4.2",
@@ -95,7 +95,7 @@
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0",
"updates": "16.0.1",
- "vite-string-plugin": "1.1.5",
+ "vite-string-plugin": "1.2.0",
"vitest": "1.4.0"
},
"engines": {
@@ -2668,105 +2668,102 @@
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.23.tgz",
- "integrity": "sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==",
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.24.tgz",
+ "integrity": "sha512-vbW/tgbwJYj62N/Ww99x0zhFTkZDTcGh3uwJEuadZ/nF9/xuFMC4693P9r+3sxGXISABpDKvffY5ApH9pmdd1A==",
"dependencies": {
- "@babel/parser": "^7.24.1",
- "@vue/shared": "3.4.23",
+ "@babel/parser": "^7.24.4",
+ "@vue/shared": "3.4.24",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-dom": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.23.tgz",
- "integrity": "sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==",
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.24.tgz",
+ "integrity": "sha512-4XgABML/4cNndVsQndG6BbGN7+EoisDwi3oXNovqL/4jdNhwvP8/rfRMTb6FxkxIxUUtg6AI1/qZvwfSjxJiWA==",
"dependencies": {
- "@vue/compiler-core": "3.4.23",
- "@vue/shared": "3.4.23"
+ "@vue/compiler-core": "3.4.24",
+ "@vue/shared": "3.4.24"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.23.tgz",
- "integrity": "sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==",
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.24.tgz",
+ "integrity": "sha512-nRAlJUK02FTWfA2nuvNBAqsDZuERGFgxZ8sGH62XgFSvMxO2URblzulExsmj4gFZ8e+VAyDooU9oAoXfEDNxTA==",
"dependencies": {
- "@babel/parser": "^7.24.1",
- "@vue/compiler-core": "3.4.23",
- "@vue/compiler-dom": "3.4.23",
- "@vue/compiler-ssr": "3.4.23",
- "@vue/shared": "3.4.23",
+ "@babel/parser": "^7.24.4",
+ "@vue/compiler-core": "3.4.24",
+ "@vue/compiler-dom": "3.4.24",
+ "@vue/compiler-ssr": "3.4.24",
+ "@vue/shared": "3.4.24",
"estree-walker": "^2.0.2",
- "magic-string": "^0.30.8",
+ "magic-string": "^0.30.10",
"postcss": "^8.4.38",
"source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-sfc/node_modules/magic-string": {
- "version": "0.30.9",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz",
- "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==",
+ "version": "0.30.10",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
+ "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15"
- },
- "engines": {
- "node": ">=12"
}
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.23.tgz",
- "integrity": "sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==",
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.24.tgz",
+ "integrity": "sha512-ZsAtr4fhaUFnVcDqwW3bYCSDwq+9Gk69q2r/7dAHDrOMw41kylaMgOP4zRnn6GIEJkQznKgrMOGPMFnLB52RbQ==",
"dependencies": {
- "@vue/compiler-dom": "3.4.23",
- "@vue/shared": "3.4.23"
+ "@vue/compiler-dom": "3.4.24",
+ "@vue/shared": "3.4.24"
}
},
"node_modules/@vue/reactivity": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.23.tgz",
- "integrity": "sha512-GlXR9PL+23fQ3IqnbSQ8OQKLodjqCyoCrmdLKZk3BP7jN6prWheAfU7a3mrltewTkoBm+N7qMEb372VHIkQRMQ==",
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.24.tgz",
+ "integrity": "sha512-nup3fSYg4i4LtNvu9slF/HF/0dkMQYfepUdORBcMSsankzRPzE7ypAFurpwyRBfU1i7Dn1kcwpYsE1wETSh91g==",
"dependencies": {
- "@vue/shared": "3.4.23"
+ "@vue/shared": "3.4.24"
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.23.tgz",
- "integrity": "sha512-FeQ9MZEXoFzFkFiw9MQQ/FWs3srvrP+SjDKSeRIiQHIhtkzoj0X4rWQlRNHbGuSwLra6pMyjAttwixNMjc/xLw==",
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.24.tgz",
+ "integrity": "sha512-c7iMfj6cJMeAG3s5yOn9Rc5D9e2/wIuaozmGf/ICGCY3KV5H7mbTVdvEkd4ZshTq7RUZqj2k7LMJWVx+EBiY1g==",
"dependencies": {
- "@vue/reactivity": "3.4.23",
- "@vue/shared": "3.4.23"
+ "@vue/reactivity": "3.4.24",
+ "@vue/shared": "3.4.24"
}
},
"node_modules/@vue/runtime-dom": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.23.tgz",
- "integrity": "sha512-RXJFwwykZWBkMiTPSLEWU3kgVLNAfActBfWFlZd0y79FTUxexogd0PLG4HH2LfOktjRxV47Nulygh0JFXe5f9A==",
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.24.tgz",
+ "integrity": "sha512-uXKzuh/Emfad2Y7Qm0ABsLZZV6H3mAJ5ZVqmAOlrNQRf+T5mxpPGZBfec1hkP41t6h6FwF6RSGCs/gd8WbuySQ==",
"dependencies": {
- "@vue/runtime-core": "3.4.23",
- "@vue/shared": "3.4.23",
+ "@vue/runtime-core": "3.4.24",
+ "@vue/shared": "3.4.24",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/server-renderer": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.23.tgz",
- "integrity": "sha512-LDwGHtnIzvKFNS8dPJ1SSU5Gvm36p2ck8wCZc52fc3k/IfjKcwCyrWEf0Yag/2wTFUBXrqizfhK9c/mC367dXQ==",
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.24.tgz",
+ "integrity": "sha512-H+DLK4sQF6sRgzKyofmlEVBIV/9KrQU6HIV7nt6yIwSGGKvSwlV8pqJlebUKLpbXaNHugdSfAbP6YmXF69lxow==",
"dependencies": {
- "@vue/compiler-ssr": "3.4.23",
- "@vue/shared": "3.4.23"
+ "@vue/compiler-ssr": "3.4.24",
+ "@vue/shared": "3.4.24"
},
"peerDependencies": {
- "vue": "3.4.23"
+ "vue": "3.4.24"
}
},
"node_modules/@vue/shared": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.23.tgz",
- "integrity": "sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg=="
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.24.tgz",
+ "integrity": "sha512-BW4tajrJBM9AGAknnyEw5tO2xTmnqgup0VTnDAMcxYmqOX0RG0b9aSUGAbEKolD91tdwpA6oCwbltoJoNzpItw=="
},
"node_modules/@vue/test-utils": {
"version": "2.4.5",
@@ -8813,9 +8810,9 @@
}
},
"node_modules/mini-css-extract-plugin": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz",
- "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==",
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz",
+ "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==",
"dependencies": {
"schema-utils": "^4.0.0",
"tapable": "^2.2.1"
@@ -9768,9 +9765,9 @@
}
},
"node_modules/postcss-nesting": {
- "version": "12.1.1",
- "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.1.tgz",
- "integrity": "sha512-qc74KvIAQNa5ujZKG1UV286dhaDW6basbUy2i9AzNU/T8C9hpvGu9NZzm1SfePe2yP7sPYgpA8d4sPVopn2Hhw==",
+ "version": "12.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.2.tgz",
+ "integrity": "sha512-FUmTHGDNundodutB4PUBxt/EPuhgtpk8FJGRsBhOuy+6FnkR2A8RZWIsyyy6XmhvX2DZQQWIkvu+HB4IbJm+Ew==",
"funding": [
{
"type": "github",
@@ -11398,9 +11395,9 @@
}
},
"node_modules/swagger-ui-dist": {
- "version": "5.13.0",
- "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.13.0.tgz",
- "integrity": "sha512-uaWhh6j18IIs5tOX0arvIBnVINAzpTXaQXkr7qAk8zoupegJVg0UU/5+S/FgsgVCnzVsJ9d7QLjIxkswEeTg0Q=="
+ "version": "5.17.0",
+ "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.0.tgz",
+ "integrity": "sha512-PtEozc87rN6i6rqLYNVTK+1ZAYmCMy6poU6I2MOJXD19BVv6D7U9zwS8geRbtfamCM5yUwWkSNQKWGK58vculg=="
},
"node_modules/sync-fetch": {
"version": "0.4.5",
@@ -12182,9 +12179,9 @@
}
},
"node_modules/vite-string-plugin": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/vite-string-plugin/-/vite-string-plugin-1.1.5.tgz",
- "integrity": "sha512-KRCIFX3PWVUuEjpi9O7EKLT9E27OqOA3RimIvVx6cziLAUxvnk2VvHQfMrP+mKkqyqqSmnnYyTig3OyDnK/zlA==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vite-string-plugin/-/vite-string-plugin-1.2.0.tgz",
+ "integrity": "sha512-IijlLgTxUDUwOpLoBLZCZO2us4fZWPRpj8XWoD9OAYjjUEge8enV4gaDTOs7uEsC8EJ9+NmusdLwmgWajFO45Q==",
"dev": true
},
"node_modules/vite/node_modules/@types/estree": {
@@ -12319,15 +12316,15 @@
}
},
"node_modules/vue": {
- "version": "3.4.23",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.23.tgz",
- "integrity": "sha512-X1y6yyGJ28LMUBJ0k/qIeKHstGd+BlWQEOT40x3auJFTmpIhpbKLgN7EFsqalnJXq1Km5ybDEsp6BhuWKciUDg==",
+ "version": "3.4.24",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.24.tgz",
+ "integrity": "sha512-NPdx7dLGyHmKHGRRU5bMRYVE+rechR+KDU5R2tSTNG36PuMwbfAJ+amEvOAw7BPfZp5sQulNELSLm5YUkau+Sg==",
"dependencies": {
- "@vue/compiler-dom": "3.4.23",
- "@vue/compiler-sfc": "3.4.23",
- "@vue/runtime-dom": "3.4.23",
- "@vue/server-renderer": "3.4.23",
- "@vue/shared": "3.4.23"
+ "@vue/compiler-dom": "3.4.24",
+ "@vue/compiler-sfc": "3.4.24",
+ "@vue/runtime-dom": "3.4.24",
+ "@vue/server-renderer": "3.4.24",
+ "@vue/shared": "3.4.24"
},
"peerDependencies": {
"typescript": "*"
diff --git a/package.json b/package.json
index b56eb1a369..0f1daf3a93 100644
--- a/package.json
+++ b/package.json
@@ -33,17 +33,17 @@
"katex": "0.16.10",
"license-checker-webpack-plugin": "0.2.1",
"mermaid": "10.9.0",
- "mini-css-extract-plugin": "2.8.1",
+ "mini-css-extract-plugin": "2.9.0",
"minimatch": "9.0.4",
"monaco-editor": "0.47.0",
"monaco-editor-webpack-plugin": "7.1.0",
"pdfobject": "2.3.0",
"postcss": "8.4.38",
"postcss-loader": "8.1.1",
- "postcss-nesting": "12.1.1",
+ "postcss-nesting": "12.1.2",
"pretty-ms": "9.0.0",
"sortablejs": "1.15.2",
- "swagger-ui-dist": "5.13.0",
+ "swagger-ui-dist": "5.17.0",
"tailwindcss": "3.4.3",
"temporal-polyfill": "0.2.4",
"throttle-debounce": "5.0.0",
@@ -53,7 +53,7 @@
"tributejs": "5.1.3",
"uint8-to-base64": "0.2.0",
"vanilla-colorful": "0.7.2",
- "vue": "3.4.23",
+ "vue": "3.4.24",
"vue-bar-graph": "2.0.0",
"vue-chartjs": "5.3.1",
"vue-loader": "17.4.2",
@@ -94,7 +94,7 @@
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0",
"updates": "16.0.1",
- "vite-string-plugin": "1.1.5",
+ "vite-string-plugin": "1.2.0",
"vitest": "1.4.0"
},
"browserslist": ["defaults"]
diff --git a/renovate.json b/renovate.json
index e9ce2a69b2..35dbcc3343 100644
--- a/renovate.json
+++ b/renovate.json
@@ -15,6 +15,7 @@
"helpers:pinGitHubActionDigests"
],
"semanticCommits": "disabled",
+ "automergeStrategy": "merge-commit",
"postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths", "npmDedupe"],
"prConcurrentLimit": 5,
"packageRules": [
diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go
index cef2a986e0..9ea210ee4e 100644
--- a/routers/api/v1/admin/user.go
+++ b/routers/api/v1/admin/user.go
@@ -30,7 +30,7 @@ import (
user_service "code.gitea.io/gitea/services/user"
)
-func parseAuthSource(ctx *context.APIContext, u *user_model.User, sourceID int64, loginName string) {
+func parseAuthSource(ctx *context.APIContext, u *user_model.User, sourceID int64) {
if sourceID == 0 {
return
}
@@ -47,7 +47,6 @@ func parseAuthSource(ctx *context.APIContext, u *user_model.User, sourceID int64
u.LoginType = source.Type
u.LoginSource = source.ID
- u.LoginName = loginName
}
// CreateUser create a user
@@ -83,12 +82,13 @@ func CreateUser(ctx *context.APIContext) {
Passwd: form.Password,
MustChangePassword: true,
LoginType: auth.Plain,
+ LoginName: form.LoginName,
}
if form.MustChangePassword != nil {
u.MustChangePassword = *form.MustChangePassword
}
- parseAuthSource(ctx, u, form.SourceID, form.LoginName)
+ parseAuthSource(ctx, u, form.SourceID)
if ctx.Written() {
return
}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 80f2243ef0..a15210ac51 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -983,6 +983,8 @@ func Routes() *web.Route {
m.Post("/migrate", reqToken(), bind(api.MigrateRepoOptions{}), repo.Migrate)
m.Group("/{username}/{reponame}", func() {
+ m.Get("/compare/*", reqRepoReader(unit.TypeCode), repo.CompareDiff)
+
m.Combo("").Get(reqAnyRepoReader(), repo.Get).
Delete(reqToken(), reqOwner(), repo.Delete).
Patch(reqToken(), reqAdmin(), bind(api.EditRepoOption{}), repo.Edit)
diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go
index c33beee0ae..852b7a2ee0 100644
--- a/routers/api/v1/repo/branch.go
+++ b/routers/api/v1/repo/branch.go
@@ -437,7 +437,7 @@ func GetBranchProtection(ctx *context.APIContext) {
return
}
- ctx.JSON(http.StatusOK, convert.ToBranchProtection(ctx, bp))
+ ctx.JSON(http.StatusOK, convert.ToBranchProtection(ctx, bp, repo))
}
// ListBranchProtections list branch protections for a repo
@@ -470,7 +470,7 @@ func ListBranchProtections(ctx *context.APIContext) {
}
apiBps := make([]*api.BranchProtection, len(bps))
for i := range bps {
- apiBps[i] = convert.ToBranchProtection(ctx, bps[i])
+ apiBps[i] = convert.ToBranchProtection(ctx, bps[i], repo)
}
ctx.JSON(http.StatusOK, apiBps)
@@ -682,7 +682,7 @@ func CreateBranchProtection(ctx *context.APIContext) {
return
}
- ctx.JSON(http.StatusCreated, convert.ToBranchProtection(ctx, bp))
+ ctx.JSON(http.StatusCreated, convert.ToBranchProtection(ctx, bp, repo))
}
// EditBranchProtection edits a branch protection for a repo
@@ -964,7 +964,7 @@ func EditBranchProtection(ctx *context.APIContext) {
return
}
- ctx.JSON(http.StatusOK, convert.ToBranchProtection(ctx, bp))
+ ctx.JSON(http.StatusOK, convert.ToBranchProtection(ctx, bp, repo))
}
// DeleteBranchProtection deletes a branch protection for a repo
diff --git a/routers/api/v1/repo/compare.go b/routers/api/v1/repo/compare.go
new file mode 100644
index 0000000000..549b9b7fa9
--- /dev/null
+++ b/routers/api/v1/repo/compare.go
@@ -0,0 +1,99 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package repo
+
+import (
+ "net/http"
+ "strings"
+
+ user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/gitrepo"
+ api "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/services/context"
+ "code.gitea.io/gitea/services/convert"
+)
+
+// CompareDiff compare two branches or commits
+func CompareDiff(ctx *context.APIContext) {
+ // swagger:operation GET /repos/{owner}/{repo}/compare/{basehead} Get commit comparison information
+ // ---
+ // summary: Get commit comparison information
+ // 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: basehead
+ // in: path
+ // description: compare two branches or commits
+ // type: string
+ // required: true
+ // responses:
+ // "200":
+ // "$ref": "#/responses/Compare"
+ // "404":
+ // "$ref": "#/responses/notFound"
+
+ if ctx.Repo.GitRepo == nil {
+ gitRepo, err := gitrepo.OpenRepository(ctx, ctx.Repo.Repository)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "OpenRepository", err)
+ return
+ }
+ ctx.Repo.GitRepo = gitRepo
+ defer gitRepo.Close()
+ }
+
+ infoPath := ctx.Params("*")
+ infos := []string{ctx.Repo.Repository.DefaultBranch, ctx.Repo.Repository.DefaultBranch}
+ if infoPath != "" {
+ infos = strings.SplitN(infoPath, "...", 2)
+ if len(infos) != 2 {
+ if infos = strings.SplitN(infoPath, "..", 2); len(infos) != 2 {
+ infos = []string{ctx.Repo.Repository.DefaultBranch, infoPath}
+ }
+ }
+ }
+
+ _, _, headGitRepo, ci, _, _ := parseCompareInfo(ctx, api.CreatePullRequestOption{
+ Base: infos[0],
+ Head: infos[1],
+ })
+ if ctx.Written() {
+ return
+ }
+ defer headGitRepo.Close()
+
+ verification := ctx.FormString("verification") == "" || ctx.FormBool("verification")
+ files := ctx.FormString("files") == "" || ctx.FormBool("files")
+
+ apiCommits := make([]*api.Commit, 0, len(ci.Commits))
+ userCache := make(map[string]*user_model.User)
+ for i := 0; i < len(ci.Commits); i++ {
+ apiCommit, err := convert.ToCommit(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ci.Commits[i], userCache,
+ convert.ToCommitOptions{
+ Stat: true,
+ Verification: verification,
+ Files: files,
+ })
+ if err != nil {
+ ctx.ServerError("toCommit", err)
+ return
+ }
+ apiCommits = append(apiCommits, apiCommit)
+ }
+
+ ctx.JSON(http.StatusOK, &api.Compare{
+ TotalCommits: len(ci.Commits),
+ Commits: apiCommits,
+ })
+}
diff --git a/routers/api/v1/swagger/repo.go b/routers/api/v1/swagger/repo.go
index c7fa98a697..b55ea1d0a9 100644
--- a/routers/api/v1/swagger/repo.go
+++ b/routers/api/v1/swagger/repo.go
@@ -421,3 +421,9 @@ type swaggerBlockedUserList struct {
// in:body
Body []api.BlockedUser `json:"body"`
}
+
+// swagger:response Compare
+type swaggerCompare struct {
+ // in:body
+ Body api.Compare `json:"body"`
+}
diff --git a/routers/common/compare.go b/routers/common/compare.go
new file mode 100644
index 0000000000..4d1cc2f0d8
--- /dev/null
+++ b/routers/common/compare.go
@@ -0,0 +1,21 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package common
+
+import (
+ repo_model "code.gitea.io/gitea/models/repo"
+ user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/git"
+)
+
+// CompareInfo represents the collected results from ParseCompareInfo
+type CompareInfo struct {
+ HeadUser *user_model.User
+ HeadRepo *repo_model.Repository
+ HeadGitRepo *git.Repository
+ CompareInfo *git.CompareInfo
+ BaseBranch string
+ HeadBranch string
+ DirectComparison bool
+}
diff --git a/routers/init.go b/routers/init.go
index 28e1c49801..821a0ef38c 100644
--- a/routers/init.go
+++ b/routers/init.go
@@ -132,7 +132,7 @@ func InitWebInstalled(ctx context.Context) {
if setting.EnableSQLite3 {
log.Info("SQLite3 support is enabled")
} else if setting.Database.Type.IsSQLite3() {
- log.Fatal("SQLite3 support is disabled, but it is used for database setting. Please get or build a Gitea release with SQLite3 support.")
+ log.Fatal("SQLite3 support is disabled, but it is used for database setting. Please get or build a Forgejo release with SQLite3 support.")
}
mustInitCtx(ctx, common.InitDBEngine)
diff --git a/routers/install/install.go b/routers/install/install.go
index d5503db31f..282ebe9ead 100644
--- a/routers/install/install.go
+++ b/routers/install/install.go
@@ -212,7 +212,7 @@ func checkDatabase(ctx *context.Context, form *forms.InstallForm) bool {
}
if hasPostInstallationUser && dbMigrationVersion > 0 {
- log.Error("The database is likely to have been used by Gitea before, database migration version=%d", dbMigrationVersion)
+ log.Error("The database is likely to have been used by Forgejo before, database migration version=%d", dbMigrationVersion)
confirmed := form.ReinstallConfirmFirst && form.ReinstallConfirmSecond && form.ReinstallConfirmThird
if !confirmed {
ctx.Data["Err_DbInstalledBefore"] = true
@@ -220,11 +220,11 @@ func checkDatabase(ctx *context.Context, form *forms.InstallForm) bool {
return false
}
- log.Info("User confirmed re-installation of Gitea into a pre-existing database")
+ log.Info("User confirmed re-installation of Forgejo into a pre-existing database")
}
if hasPostInstallationUser || dbMigrationVersion > 0 {
- log.Info("Gitea will be installed in a database with: hasPostInstallationUser=%v, dbMigrationVersion=%v", hasPostInstallationUser, dbMigrationVersion)
+ log.Info("Forgejo will be installed in a database with: hasPostInstallationUser=%v, dbMigrationVersion=%v", hasPostInstallationUser, dbMigrationVersion)
}
return true
diff --git a/routers/web/admin/queue.go b/routers/web/admin/queue.go
index d8c50730b1..246ab379b5 100644
--- a/routers/web/admin/queue.go
+++ b/routers/web/admin/queue.go
@@ -69,7 +69,7 @@ func QueueSet(ctx *context.Context) {
}
func QueueRemoveAllItems(ctx *context.Context) {
- // Gitea's queue doesn't have transaction support
+ // Queue in Forgejo doesn't have transaction support
// So in rare cases, the queue could be corrupted/out-of-sync
// Site admin could remove all items from the queue to make it work again
qid := ctx.ParamsInt64("qid")
diff --git a/routers/web/org/projects.go b/routers/web/org/projects.go
index 38f9b85ace..821228b347 100644
--- a/routers/web/org/projects.go
+++ b/routers/web/org/projects.go
@@ -104,7 +104,7 @@ func Projects(ctx *context.Context) {
}
for _, project := range projects {
- project.RenderedContent = templates.SanitizeHTML(project.Description) // FIXME: is it right? why not render?
+ project.RenderedContent = templates.RenderMarkdownToHtml(ctx, project.Description)
}
err = shared_user.LoadHeaderCount(ctx)
@@ -372,7 +372,7 @@ func ViewProject(ctx *context.Context) {
}
}
- project.RenderedContent = templates.SanitizeHTML(project.Description) // FIXME: is it right? why not render?
+ project.RenderedContent = templates.RenderMarkdownToHtml(ctx, project.Description)
ctx.Data["LinkedPRs"] = linkedPrsMap
ctx.Data["PageIsViewProjects"] = true
ctx.Data["CanWriteProjects"] = canWriteProjects(ctx)
diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go
index 93c224b7be..b07209c779 100644
--- a/routers/web/repo/compare.go
+++ b/routers/web/repo/compare.go
@@ -35,6 +35,7 @@ import (
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/typesniffer"
"code.gitea.io/gitea/modules/util"
+ "code.gitea.io/gitea/routers/common"
"code.gitea.io/gitea/services/context"
"code.gitea.io/gitea/services/context/upload"
"code.gitea.io/gitea/services/gitdiff"
@@ -185,21 +186,10 @@ func setCsvCompareContext(ctx *context.Context) {
}
}
-// CompareInfo represents the collected results from ParseCompareInfo
-type CompareInfo struct {
- HeadUser *user_model.User
- HeadRepo *repo_model.Repository
- HeadGitRepo *git.Repository
- CompareInfo *git.CompareInfo
- BaseBranch string
- HeadBranch string
- DirectComparison bool
-}
-
// ParseCompareInfo parse compare info between two commit for preparing comparing references
-func ParseCompareInfo(ctx *context.Context) *CompareInfo {
+func ParseCompareInfo(ctx *context.Context) *common.CompareInfo {
baseRepo := ctx.Repo.Repository
- ci := &CompareInfo{}
+ ci := &common.CompareInfo{}
fileOnly := ctx.FormBool("file-only")
@@ -576,7 +566,7 @@ func ParseCompareInfo(ctx *context.Context) *CompareInfo {
// PrepareCompareDiff renders compare diff page
func PrepareCompareDiff(
ctx *context.Context,
- ci *CompareInfo,
+ ci *common.CompareInfo,
whitespaceBehavior git.TrustedCmdArgs,
) bool {
var (
diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go
index a65a100212..e98cd46c4e 100644
--- a/routers/web/repo/view.go
+++ b/routers/web/repo/view.go
@@ -556,7 +556,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
// The Open Group Base Specification: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html
// empty: 0 lines; "a": 1 incomplete-line; "a\n": 1 line; "a\nb": 1 line, 1 incomplete-line;
- // Gitea uses the definition (like most modern editors):
+ // Forgejo uses the definition (like most modern editors):
// empty: 0 lines; "a": 1 line; "a\n": 2 lines; "a\nb": 2 lines;
// When rendering, the last empty line is not rendered in UI, while the line-number is still counted, to tell users that the file contains a trailing EOL.
// To make the UI more consistent, it could use an icon mark to indicate that there is no trailing EOL, and show line-number as the rendered lines.
diff --git a/routers/web/web.go b/routers/web/web.go
index 71d5efef2c..154e1ce24b 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -258,7 +258,7 @@ func Routes() *web.Route {
routes.Get("/metrics", append(mid, Metrics)...)
}
- routes.Get("/robots.txt", append(mid, misc.RobotsTxt)...)
+ routes.Methods("GET,HEAD", "/robots.txt", append(mid, misc.RobotsTxt)...)
routes.Get("/ssh_info", misc.SSHInfo)
routes.Get("/api/healthz", healthcheck.Check)
diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go
index ef37ff87ee..365212d9c2 100644
--- a/services/actions/notifier_helper.go
+++ b/services/actions/notifier_helper.go
@@ -80,6 +80,11 @@ func newNotifyInput(repo *repo_model.Repository, doer *user_model.User, event we
}
}
+func newNotifyInputForSchedules(repo *repo_model.Repository) *notifyInput {
+ // the doer here will be ignored as we force using action user when handling schedules
+ return newNotifyInput(repo, user_model.NewActionsUser(), webhook_module.HookEventSchedule)
+}
+
func (input *notifyInput) WithDoer(doer *user_model.User) *notifyInput {
input.Doer = doer
return input
@@ -562,7 +567,7 @@ func DetectAndHandleSchedules(ctx context.Context, repo *repo_model.Repository)
// We need a notifyInput to call handleSchedules
// if repo is a mirror, commit author maybe an external user,
// so we use action user as the Doer of the notifyInput
- notifyInput := newNotifyInput(repo, user_model.NewActionsUser(), webhook_module.HookEventSchedule)
+ notifyInput := newNotifyInputForSchedules(repo)
return handleSchedules(ctx, scheduleWorkflows, commit, notifyInput, repo.DefaultBranch)
}
diff --git a/services/convert/convert.go b/services/convert/convert.go
index 5b06b9b1a0..55996d8fe3 100644
--- a/services/convert/convert.go
+++ b/services/convert/convert.go
@@ -21,6 +21,7 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/container"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
api "code.gitea.io/gitea/modules/structs"
@@ -105,33 +106,46 @@ func ToBranch(ctx context.Context, repo *repo_model.Repository, branchName strin
return branch, nil
}
+// getWhitelistEntities returns the names of the entities that are in the whitelist
+func getWhitelistEntities[T *user_model.User | *organization.Team](entities []T, whitelistIDs []int64) []string {
+ whitelistUserIDsSet := container.SetOf(whitelistIDs...)
+ whitelistNames := make([]string, 0)
+ for _, entity := range entities {
+ switch v := any(entity).(type) {
+ case *user_model.User:
+ if whitelistUserIDsSet.Contains(v.ID) {
+ whitelistNames = append(whitelistNames, v.Name)
+ }
+ case *organization.Team:
+ if whitelistUserIDsSet.Contains(v.ID) {
+ whitelistNames = append(whitelistNames, v.Name)
+ }
+ }
+ }
+
+ return whitelistNames
+}
+
// ToBranchProtection convert a ProtectedBranch to api.BranchProtection
-func ToBranchProtection(ctx context.Context, bp *git_model.ProtectedBranch) *api.BranchProtection {
- pushWhitelistUsernames, err := user_model.GetUserNamesByIDs(ctx, bp.WhitelistUserIDs)
+func ToBranchProtection(ctx context.Context, bp *git_model.ProtectedBranch, repo *repo_model.Repository) *api.BranchProtection {
+ readers, err := access_model.GetRepoReaders(ctx, repo)
if err != nil {
- log.Error("GetUserNamesByIDs (WhitelistUserIDs): %v", err)
+ log.Error("GetRepoReaders: %v", err)
}
- mergeWhitelistUsernames, err := user_model.GetUserNamesByIDs(ctx, bp.MergeWhitelistUserIDs)
+
+ pushWhitelistUsernames := getWhitelistEntities(readers, bp.WhitelistUserIDs)
+ mergeWhitelistUsernames := getWhitelistEntities(readers, bp.MergeWhitelistUserIDs)
+ approvalsWhitelistUsernames := getWhitelistEntities(readers, bp.ApprovalsWhitelistUserIDs)
+
+ teamReaders, err := organization.OrgFromUser(repo.Owner).TeamsWithAccessToRepo(ctx, repo.ID, perm.AccessModeRead)
if err != nil {
- log.Error("GetUserNamesByIDs (MergeWhitelistUserIDs): %v", err)
- }
- approvalsWhitelistUsernames, err := user_model.GetUserNamesByIDs(ctx, bp.ApprovalsWhitelistUserIDs)
- if err != nil {
- log.Error("GetUserNamesByIDs (ApprovalsWhitelistUserIDs): %v", err)
- }
- pushWhitelistTeams, err := organization.GetTeamNamesByID(ctx, bp.WhitelistTeamIDs)
- if err != nil {
- log.Error("GetTeamNamesByID (WhitelistTeamIDs): %v", err)
- }
- mergeWhitelistTeams, err := organization.GetTeamNamesByID(ctx, bp.MergeWhitelistTeamIDs)
- if err != nil {
- log.Error("GetTeamNamesByID (MergeWhitelistTeamIDs): %v", err)
- }
- approvalsWhitelistTeams, err := organization.GetTeamNamesByID(ctx, bp.ApprovalsWhitelistTeamIDs)
- if err != nil {
- log.Error("GetTeamNamesByID (ApprovalsWhitelistTeamIDs): %v", err)
+ log.Error("Repo.Owner.TeamsWithAccessToRepo: %v", err)
}
+ pushWhitelistTeams := getWhitelistEntities(teamReaders, bp.WhitelistTeamIDs)
+ mergeWhitelistTeams := getWhitelistEntities(teamReaders, bp.MergeWhitelistTeamIDs)
+ approvalsWhitelistTeams := getWhitelistEntities(teamReaders, bp.ApprovalsWhitelistTeamIDs)
+
branchName := ""
if !git_model.IsRuleNameSpecial(bp.RuleName) {
branchName = bp.RuleName
diff --git a/services/convert/user.go b/services/convert/user.go
index 98db53705b..789bc51097 100644
--- a/services/convert/user.go
+++ b/services/convert/user.go
@@ -76,6 +76,7 @@ func toUser(ctx context.Context, user *user_model.User, signed, authed bool) *ap
if authed {
result.IsAdmin = user.IsAdmin
result.LoginName = user.LoginName
+ result.SourceID = user.LoginSource
result.LastLogin = user.LastLoginUnix.AsTime()
result.Language = user.Language
result.IsActive = user.IsActive
diff --git a/services/mailer/incoming/incoming_handler.go b/services/mailer/incoming/incoming_handler.go
index dc0b539822..325b94ae09 100644
--- a/services/mailer/incoming/incoming_handler.go
+++ b/services/mailer/incoming/incoming_handler.go
@@ -82,31 +82,34 @@ func (h *ReplyHandler) Handle(ctx context.Context, content *MailContent, doer *u
return nil
}
+ log.Trace("incoming mail related to %T", ref)
+
+ attachmentIDs := make([]string, 0, len(content.Attachments))
+ if setting.Attachment.Enabled {
+ for _, attachment := range content.Attachments {
+ a, err := attachment_service.UploadAttachment(ctx, bytes.NewReader(attachment.Content), setting.Attachment.AllowedTypes, int64(len(attachment.Content)), &repo_model.Attachment{
+ Name: attachment.Name,
+ UploaderID: doer.ID,
+ RepoID: issue.Repo.ID,
+ })
+ if err != nil {
+ if upload.IsErrFileTypeForbidden(err) {
+ log.Info("Skipping disallowed attachment type: %s", attachment.Name)
+ continue
+ }
+ return err
+ }
+ attachmentIDs = append(attachmentIDs, a.UUID)
+ }
+ }
+
+ if content.Content == "" && len(attachmentIDs) == 0 {
+ log.Trace("incoming mail has no content and no attachement", ref)
+ return nil
+ }
+
switch r := ref.(type) {
case *issues_model.Issue:
- attachmentIDs := make([]string, 0, len(content.Attachments))
- if setting.Attachment.Enabled {
- for _, attachment := range content.Attachments {
- a, err := attachment_service.UploadAttachment(ctx, bytes.NewReader(attachment.Content), setting.Attachment.AllowedTypes, int64(len(attachment.Content)), &repo_model.Attachment{
- Name: attachment.Name,
- UploaderID: doer.ID,
- RepoID: issue.Repo.ID,
- })
- if err != nil {
- if upload.IsErrFileTypeForbidden(err) {
- log.Info("Skipping disallowed attachment type: %s", attachment.Name)
- continue
- }
- return err
- }
- attachmentIDs = append(attachmentIDs, a.UUID)
- }
- }
-
- if content.Content == "" && len(attachmentIDs) == 0 {
- return nil
- }
-
_, err = issue_service.CreateIssueComment(ctx, doer, issue.Repo, issue, content.Content, attachmentIDs)
if err != nil {
return fmt.Errorf("CreateIssueComment failed: %w", err)
@@ -114,11 +117,13 @@ func (h *ReplyHandler) Handle(ctx context.Context, content *MailContent, doer *u
case *issues_model.Comment:
comment := r
- if content.Content == "" {
- return nil
- }
-
- if comment.Type == issues_model.CommentTypeCode {
+ switch comment.Type {
+ case issues_model.CommentTypeComment, issues_model.CommentTypeReview:
+ _, err = issue_service.CreateIssueComment(ctx, doer, issue.Repo, issue, content.Content, attachmentIDs)
+ if err != nil {
+ return fmt.Errorf("CreateIssueComment failed: %w", err)
+ }
+ case issues_model.CommentTypeCode:
_, err := pull_service.CreateCodeComment(
ctx,
doer,
@@ -130,12 +135,16 @@ func (h *ReplyHandler) Handle(ctx context.Context, content *MailContent, doer *u
false, // not pending review but a single review
comment.ReviewID,
"",
- nil,
+ attachmentIDs,
)
if err != nil {
return fmt.Errorf("CreateCodeComment failed: %w", err)
}
+ default:
+ log.Trace("incoming mail related to comment of type %v is ignored", comment.Type)
}
+ default:
+ log.Trace("incoming mail related to %T is ignored", ref)
}
return nil
}
diff --git a/services/webhook/slack.go b/services/webhook/slack.go
index c835d59984..3af483a90e 100644
--- a/services/webhook/slack.go
+++ b/services/webhook/slack.go
@@ -356,7 +356,7 @@ var slackChannel = regexp.MustCompile(`^#?[a-z0-9_-]{1,80}$`)
// IsValidSlackChannel validates a channel name conforms to what slack expects:
// https://api.slack.com/methods/conversations.rename#naming
// Conversation names can only contain lowercase letters, numbers, hyphens, and underscores, and must be 80 characters or less.
-// Gitea accepts if it starts with a #.
+// Forgejo accepts if it starts with a #.
func IsValidSlackChannel(name string) bool {
return slackChannel.MatchString(name)
}
diff --git a/templates/devtest/label.tmpl b/templates/devtest/label.tmpl
new file mode 100644
index 0000000000..c4b52a3e23
--- /dev/null
+++ b/templates/devtest/label.tmpl
@@ -0,0 +1,27 @@
+{{template "base/head" .}}
+
+