diff --git a/.github/workflows/pull-compliance.yml b/.github/workflows/pull-compliance.yml index f6720bf2f6d9d..e8065ce7caea2 100644 --- a/.github/workflows/pull-compliance.yml +++ b/.github/workflows/pull-compliance.yml @@ -178,6 +178,16 @@ jobs: GOOS: linux GOARCH: 386 + translations: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + check-latest: true + - run: make check-locales + docs: if: needs.files-changed.outputs.docs == 'true' || needs.files-changed.outputs.actions == 'true' needs: files-changed diff --git a/Makefile b/Makefile index bb70b91bb9b0c..b34ef07b25e37 100644 --- a/Makefile +++ b/Makefile @@ -884,6 +884,11 @@ update-translations: mv ./translations/*.ini ./options/locale/ rmdir ./translations +.PHONY: check-locales +check-locales: + @echo "Checking translations..." + $(GO) run build/check-locales.go + .PHONY: generate-gitignore generate-gitignore: ## update gitignore files $(GO) run build/generate-gitignores.go diff --git a/build/check-locales.go b/build/check-locales.go new file mode 100644 index 0000000000000..6ff17a8f6a1cb --- /dev/null +++ b/build/check-locales.go @@ -0,0 +1,124 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +//go:build ignore + +package main + +import ( + "os" + "path/filepath" + "strings" + + "code.gitea.io/gitea/modules/setting" + + "github.com/gobwas/glob" +) + +func searchTranslationKeyInDirs(keys []string) ([]bool, error) { + res := make([]bool, len(keys)) + for _, dir := range []string{ + "cmd", + "models", + "modules", + "routers", + "services", + "templates", + } { + if err := searchTranslationKeyInDir(dir, keys, &res); err != nil { + return nil, err + } + } + return res, nil +} + +func searchTranslationKeyInDir(dir string, keys []string, res *[]bool) error { + return filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() || + (!strings.HasSuffix(d.Name(), ".go") && !strings.HasSuffix(d.Name(), ".tmpl")) || + strings.HasSuffix(d.Name(), "_test.go") { // don't search in test files + return nil + } + + bs, err := os.ReadFile(path) + if err != nil { + return err + } + for i, key := range keys { + if !(*res)[i] && strings.Contains(string(bs), `"`+key+`"`) { + (*res)[i] = true + } + } + return nil + }) +} + +var whitelist = []string{ + "repo.signing.wont_sign.*", + "repo.issues.role.*", + "repo.commitstatus.*", + "admin.dashboard.*", + "admin.dashboard.cron.*", + "admin.dashboard.task.*", + "repo.migrate.*.description", + "actions.runners.status.*", + "projects.*.display_name", + "admin.notices.*", + "form.NewBranchName", // FIXME: used in integration tests only +} + +func isWhitelisted(key string) bool { + for _, w := range whitelist { + if glob.MustCompile(w).Match(key) { + return true + } + } + return false +} + +func main() { + if len(os.Args) != 1 { + println("usage: clean-locales") + os.Exit(1) + } + + iniFile, err := setting.NewConfigProviderForLocale("options/locale/locale_en-US.ini") + if err != nil { + panic(err) + } + + keys := []string{} + for _, section := range iniFile.Sections() { + for _, key := range section.Keys() { + var trKey string + if section.Name() == "" || section.Name() == "DEFAULT" { + trKey = key.Name() + } else { + trKey = section.Name() + "." + key.Name() + } + if isWhitelisted(trKey) { + continue + } + keys = append(keys, trKey) + } + } + + results, err := searchTranslationKeyInDirs(keys) + if err != nil { + panic(err) + } + + var found bool + for i, result := range results { + if !result { + found = true + println("unused locale key:", keys[i]) + } + } + if found { + os.Exit(1) // exit with error if any unused locale key is found + } +} diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 6d8aaef4cd85e..491f48ae5605a 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -49,7 +49,6 @@ webauthn_error_unable_to_process = The server could not process your request. webauthn_error_duplicated = The security key is not permitted for this request. Please make sure that the key is not already registered. webauthn_error_empty = You must set a name for this key. webauthn_error_timeout = Timeout reached before your key could be read. Please reload this page and retry. -webauthn_reload = Reload repository = Repository organization = Organization @@ -57,14 +56,10 @@ mirror = Mirror issue_milestone = Milestone new_repo = New Repository new_migrate = New Migration -new_mirror = New Mirror new_fork = New Repository Fork new_org = New Organization -new_project = New Project new_project_column = New Column -manage_org = Manage Organizations admin_panel = Site Administration -account_settings = Account Settings settings = Settings your_profile = Profile your_starred = Starred @@ -368,13 +363,9 @@ config_write_file_prompt = These configuration options will be written into: %s [home] nav_menu = Navigation Menu uname_holder = Username or Email Address -password_holder = Password switch_dashboard_context = Switch Dashboard Context my_repos = Repositories -show_more_repos = Show more repositories… -collaborative_repos = Collaborative Repositories my_orgs = My Organizations -my_mirrors = My Mirrors view_home = View %s filter = Other Filters filter_by_team_repositories = Filter by team repositories @@ -435,7 +426,6 @@ resent_limit_prompt = You have already requested an activation email recently. P has_unconfirmed_mail = Hi %s, you have an unconfirmed email address (%s). If you haven't received a confirmation email or need to resend a new one, please click on the button below. change_unconfirmed_mail_address = If your registration email address is incorrect, you can change it here and resend a new confirmation email. resend_mail = Click here to resend your activation email -email_not_associate = The email address is not associated with any account. send_reset_mail = Send Account Recovery Email reset_password = Account Recovery invalid_code = Your confirmation code is invalid or has expired. @@ -453,7 +443,6 @@ twofa_passcode_incorrect = Your passcode is incorrect. If you misplaced your dev twofa_scratch_token_incorrect = Your scratch code is incorrect. twofa_required = You must setup Two-Factor Authentication to get access to repositories, or try to login again. login_userpass = Sign In -login_openid = OpenID oauth_signup_tab = Register New Account oauth_signup_title = Complete New Account oauth_signup_submit = Complete Account @@ -481,7 +470,6 @@ authorize_application_with_scopes = With scopes: %s authorize_title = Authorize "%s" to access your account? authorization_failed = Authorization failed authorization_failed_desc = The authorization failed because we detected an invalid request. Please contact the maintainer of the app you have tried to authorize. -sspi_auth_failed = SSPI authentication failed password_pwned = The password you chose is on a list of stolen passwords previously exposed in public data breaches. Please try again with a different password and consider changing this password elsewhere too. password_pwned_err = Could not complete request to HaveIBeenPwned last_admin = You cannot remove the last admin. There must be at least one admin. @@ -513,8 +501,6 @@ reset_password = Recover your account reset_password.title = %s, you have requested to recover your account reset_password.text = Please click the following link to recover your account within %s: -register_success = Registration successful - issue_assigned.pull = @%[1]s assigned you to pull request %[2]s in repository %[3]s. issue_assigned.issue = @%[1]s assigned you to issue %[2]s in repository %[3]s. @@ -559,30 +545,12 @@ yes = Yes no = No confirm = Confirm cancel = Cancel -modify = Update [form] -UserName = Username -RepoName = Repository name -Email = Email address -Password = Password -Retype = Confirm Password -SSHTitle = SSH key name -HttpsUrl = HTTPS URL -PayloadUrl = Payload URL -TeamName = Team name -AuthName = Authorization name -AdminEmail = Admin email NewBranchName = New branch name -CommitSummary = Commit summary -CommitMessage = Commit message -CommitChoice = Commit choice -TreeName = File path -Content = Content SSPISeparatorReplacement = Separator -SSPIDefaultLanguage = Default Language require_error = ` cannot be empty.` alpha_dash_error = ` should contain only alphanumeric, dash ('-') and underscore ('_') characters.` @@ -607,7 +575,6 @@ username_been_taken = The username is already taken. username_change_not_local_user = Non-local users are not allowed to change their username. change_username_disabled = Changing username is disabled. change_full_name_disabled = Changing full name is disabled. -username_has_not_been_changed = Username has not been changed repo_name_been_taken = The repository name is already used. repository_force_private = Force Private is enabled: private repositories cannot be made public. repository_files_already_exist = Files already exist for this repository. Contact the system administrator. @@ -718,15 +685,11 @@ password = Password security = Security avatar = Avatar ssh_gpg_keys = SSH / GPG Keys -social = Social Accounts applications = Applications orgs = Manage Organizations repos = Repositories -delete = Delete Account twofa = Two-Factor Authentication (TOTP) -account_link = Linked Accounts organization = Organizations -uid = UID webauthn = Two-Factor Authentication (Security Keys) public_profile = Public Profile @@ -744,10 +707,8 @@ update_language = Update Language update_language_not_found = Language "%s" is not available. update_language_success = Language has been updated. update_profile_success = Your profile has been updated. -change_username = Your username has been changed. change_username_prompt = Note: Changing your username also changes your account URL. change_username_redirect_prompt = The old username will redirect until someone claims it. -continue = Continue cancel = Cancel language = Language ui = Theme @@ -775,7 +736,6 @@ keep_activity_private = Hide Activity from profile page keep_activity_private_popup = Makes the activity visible only for you and the admins lookup_avatar_by_mail = Look Up Avatar by Email Address -federated_avatar_lookup = Federated Avatar Lookup enable_custom_avatar = Use Custom Avatar choose_new_avatar = Choose new avatar update_avatar = Update Avatar @@ -794,7 +754,6 @@ password_incorrect = The current password is incorrect. change_password_success = Your password has been updated. Sign in using your new password from now on. password_change_disabled = Non-local users cannot update their password through the Gitea web interface. -emails = Email Addresses manage_emails = Manage Email Addresses manage_themes = Select default theme manage_openid = Manage OpenID Addresses @@ -839,8 +798,6 @@ principal_desc = These SSH certificate principals are associated with your accou gpg_desc = These public GPG keys are associated with your account. Keep your private keys safe as they allow commits to be verified. ssh_helper = Need help? Have a look at GitHub's guide to create your own SSH keys or solve common problems you may encounter using SSH. gpg_helper = Need help? Have a look at GitHub's guide about GPG. -add_new_key = Add SSH Key -add_new_gpg_key = Add GPG Key key_content_ssh_placeholder = Begins with 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', or 'sk-ssh-ed25519@openssh.com' key_content_gpg_placeholder = Begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----' add_new_principal = Add Principal @@ -904,10 +861,6 @@ hide_openid = Hide from profile ssh_disabled = SSH Disabled ssh_signonly = SSH is currently disabled so these keys are only used for commit signature verification. ssh_externally_managed = This SSH key is externally managed for this user -manage_social = Manage Associated Social Accounts -social_desc = These social accounts can be used to sign in to your account. Make sure you recognize all of them. -unbind = Unlink -unbind_success = The social account has been removed successfully. manage_access_token = Manage Access Tokens generate_new_token = Generate New Token @@ -918,8 +871,6 @@ generate_token_success = Your new token has been generated. Copy it now as it wi generate_token_name_duplicate = %s has been used as an application name already. Please use a new one. delete_token = Delete access_token_deletion = Delete Access Token -access_token_deletion_cancel_action = Cancel -access_token_deletion_confirm_action = Delete access_token_deletion_desc = Deleting a token will revoke access to your account for applications using it. This cannot be undone. Continue? delete_token_success = The token has been deleted. Applications using it no longer have access to your account. repo_and_org_access = Repository and Organization Access @@ -938,9 +889,7 @@ permissions_list = Permissions: manage_oauth2_applications = Manage OAuth2 Applications edit_oauth2_application = Edit OAuth2 Application -oauth2_applications_desc = OAuth2 applications enables your third-party application to securely authenticate users at this Gitea instance. remove_oauth2_application = Remove OAuth2 Application -remove_oauth2_application_desc = Removing an OAuth2 application will revoke access to all signed access tokens. Continue? remove_oauth2_application_success = The application has been deleted. create_oauth2_application = Create a new OAuth2 Application create_oauth2_application_button = Create Application @@ -955,7 +904,6 @@ oauth2_client_id = Client ID oauth2_client_secret = Client Secret oauth2_regenerate_secret = Regenerate Secret oauth2_regenerate_secret_hint = Lost your secret? -oauth2_client_secret_hint = The secret will not be shown again after you leave or refresh this page. Please ensure that you have saved it. oauth2_application_edit = Edit oauth2_application_create_description = OAuth2 applications gives your third-party application access to user accounts on this instance. oauth2_application_remove_description = Removing an OAuth2 application will prevent it from accessing authorized user accounts on this instance. Continue? @@ -997,7 +945,6 @@ webauthn_alternative_tip = You may want to configure an additional authenticatio manage_account_links = Manage Linked Accounts manage_account_links_desc = These external accounts are linked to your Gitea account. -account_links_not_available = There are currently no external accounts linked to your Gitea account. link_account = Link Account remove_account_link = Remove Linked Account remove_account_link_desc = Removing a linked account will revoke its access to your Gitea account. Continue? @@ -1041,7 +988,6 @@ repo_size = Repository Size template = Template template_select = Select a template. template_helper = Make repository a template -template_description = Template repositories let users generate new repositories with the same directory structure, files, and optional settings. visibility = Visibility visibility_description = Only the owner or the organization members if they have rights, will be able to see it. visibility_helper = Make repository private @@ -1064,8 +1010,6 @@ open_with_editor = Open with %s download_zip = Download ZIP download_tar = Download TAR.GZ download_bundle = Download BUNDLE -generate_repo = Generate Repository -generate_from = Generate From repo_desc = Description repo_desc_helper = Enter short description (optional) repo_no_desc = No description provided @@ -1084,11 +1028,6 @@ readme = README readme_helper = Select a README file template. readme_helper_desc = This is the place where you can write a complete description for your project. auto_init = Initialize Repository (Adds .gitignore, License and README) -trust_model_helper = Select trust model for signature verification. Possible options are: -trust_model_helper_collaborator = Collaborator: Trust signatures by collaborators -trust_model_helper_committer = Committer: Trust signatures that match committers -trust_model_helper_collaborator_committer = Collaborator+Committer: Trust signatures by collaborators which match the committer -trust_model_helper_default = Default: Use the default trust model for this installation create_repo = Create Repository default_branch = Default Branch default_branch_label = default @@ -1107,13 +1046,11 @@ mirror_lfs = Large File Storage (LFS) mirror_lfs_desc = Activate mirroring of LFS data. mirror_lfs_endpoint = LFS Endpoint mirror_lfs_endpoint_desc = Sync will attempt to use the clone url to determine the LFS server. You can also specify a custom endpoint if the repository LFS data is stored somewhere else. -mirror_last_synced = Last Synchronized mirror_password_placeholder = (Unchanged) mirror_password_blank_placeholder = (Unset) mirror_password_help = Change the username to erase a stored password. watchers = Watchers stargazers = Stargazers -stars_remove_warning = This will remove all stars from this repository. forks = Forks stars = Stars reactions_more = and %d more @@ -1143,7 +1080,6 @@ transfer.no_permission_to_accept = You do not have permission to accept this tra transfer.no_permission_to_reject = You do not have permission to reject this transfer. desc.private = Private -desc.public = Public desc.public_access = Public Access desc.template = Template desc.internal = Internal @@ -1173,7 +1109,6 @@ form.name_pattern_not_allowed = The pattern "%s" is not allowed in a repository need_auth = Authorization migrate_options = Migration Options -migrate_service = Migration Service migrate_options_mirror_helper = This repository will be a mirror migrate_options_lfs = Migrate LFS files migrate_options_lfs_endpoint.label = LFS Endpoint @@ -1243,8 +1178,6 @@ unstar = Unstar star = Star fork = Fork action.blocked_user = Cannot perform action because you are blocked by the repository owner. -download_archive = Download Repository -more_operations = More Operations quick_guide = Quick Guide clone_this_repo = Clone this repository @@ -1258,7 +1191,6 @@ no_branch = This repository doesn’t have any branches. code = Code code.desc = Access source code, files, commits and branches. branch = Branch -tree = Tree clear_ref = `Clear current reference` filter_branch_and_tag = Filter branch or tag find_tag = Find tag @@ -1281,7 +1213,6 @@ release = Release releases = Releases tag = Tag released_this = released this -tagged_this = tagged this file.title = %s at %s file_raw = Raw file_history = History @@ -1365,7 +1296,6 @@ editor.propose_file_change = Propose file change editor.new_branch_name = Name the new branch for this commit editor.new_branch_name_desc = New branch name… editor.cancel = Cancel -editor.filename_cannot_be_empty = The filename cannot be empty. editor.filename_is_invalid = The filename is invalid: "%s". editor.commit_email = Commit email editor.invalid_commit_email = The email for the commit is invalid. @@ -1399,7 +1329,6 @@ editor.require_signed_commit = Branch requires a signed commit editor.cherry_pick = Cherry-pick %s onto: editor.revert = Revert %s onto: -commits.desc = Browse source code change history. commits.commits = Commits commits.no_commits = No commits in common. "%s" and "%s" have entirely different histories. commits.nothing_to_compare = These branches are equal. @@ -1409,9 +1338,6 @@ commits.search_all = All Branches commits.author = Author commits.message = Message commits.date = Date -commits.older = Older -commits.newer = Newer -commits.signed_by = Signed by commits.signed_by_untrusted_user = Signed by untrusted user commits.signed_by_untrusted_user_unmatched = Signed by untrusted user who does not match committer commits.gpg_key_id = GPG Key ID @@ -1464,7 +1390,6 @@ projects.column.set_default = "Set Default" projects.column.set_default_desc = "Set this column as default for uncategorized issues and pulls" projects.column.delete = "Delete Column" projects.column.deletion_desc = "Deleting a project column moves all related issues to the default column. Continue?" -projects.column.color = "Color" projects.open = Open projects.close = Close projects.column.assigned_to = Assigned to @@ -1513,8 +1438,6 @@ issues.create = Create Issue issues.new_label = New Label issues.new_label_placeholder = Label name issues.new_label_desc_placeholder = Description -issues.create_label = Create Label -issues.label_templates.title = Load a predefined set of labels issues.label_templates.info = No labels exist yet. Create a label with 'New Label' or use a predefined label set: issues.label_templates.helper = Select a label set issues.label_templates.use = Use Label Set @@ -1626,8 +1549,6 @@ issues.ref_issue_from = `referenced this issue %[4]s referenced this pull request %[4]s %[2]s` issues.ref_closing_from = `referenced a pull request %[4]s that will close this issue %[2]s` issues.ref_reopening_from = `referenced a pull request %[4]s that will reopen this issue %[2]s` -issues.ref_closed_from = `closed this issue %[4]s %[2]s` -issues.ref_reopened_from = `reopened this issue %[4]s %[2]s` issues.ref_from = `from %[1]s` issues.author = Author issues.author_helper = This user is the author. @@ -1677,7 +1598,6 @@ issues.label.filter_sort.by_size = Smallest size issues.label.filter_sort.reverse_by_size = Largest size issues.num_participants = %d Participants issues.attachment.open_tab = `Click to see "%s" in a new tab` -issues.attachment.download = `Click to download "%s"` issues.subscribe = Subscribe issues.unsubscribe = Unsubscribe issues.unpin = Unpin @@ -1731,28 +1651,21 @@ issues.add_time_manually = Manually Add Time issues.add_time_hours = Hours issues.add_time_minutes = Minutes issues.add_time_sum_to_small = No time was entered. -issues.time_spent_total = Total Time Spent issues.time_spent_from_all_authors = `Total Time Spent: %s` issues.due_date = Due Date -issues.invalid_due_date_format = "Due date format must be 'yyyy-mm-dd'." -issues.error_modifying_due_date = "Failed to modify the due date." -issues.error_removing_due_date = "Failed to remove the due date." issues.push_commit_1 = "added %d commit %s" issues.push_commits_n = "added %d commits %s" issues.force_push_codes = `force-pushed %[1]s from %[2]s to %[4]s %[6]s` issues.force_push_compare = Compare issues.due_date_form = "yyyy-mm-dd" -issues.due_date_form_add = "Add due date" issues.due_date_form_edit = "Edit" issues.due_date_form_remove = "Remove" -issues.due_date_not_writer = "You need write access to this repository in order to update the due date of an issue." issues.due_date_not_set = "No due date set." issues.due_date_added = "added the due date %s %s" issues.due_date_modified = "modified the due date from %[2]s to %[1]s %[3]s" issues.due_date_remove = "removed the due date %s %s" issues.due_date_overdue = "Overdue" -issues.due_date_invalid = "The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'." issues.dependency.title = Dependencies issues.dependency.issue_no_dependencies = No dependencies set. issues.dependency.pr_no_dependencies = No dependencies set. @@ -1793,7 +1706,6 @@ issues.review.dismissed_label = Dismissed issues.review.left_comment = left a comment issues.review.content.empty = You need to leave a comment indicating the requested change(s). issues.review.reject = "requested changes %s" -issues.review.wait = "was requested for review %s" issues.review.add_review_request = "requested review from %s %s" issues.review.remove_review_request = "removed review request for %s %s" issues.review.remove_review_request_self = "refused to review %s" @@ -1818,7 +1730,6 @@ issues.review.requested = Review pending issues.review.rejected = Changes requested issues.review.stale = Updated since approval issues.review.unofficial = Uncounted approval -issues.assignee.error = Not all assignees was added due to an unexpected error. issues.reference_issue.body = Body issues.content_history.deleted = deleted issues.content_history.edited = edited @@ -2142,7 +2053,6 @@ contributors.contribution_type.additions = Additions contributors.contribution_type.deletions = Deletions settings = Settings -settings.desc = Settings is where you can manage the settings for the repository settings.options = Repository settings.public_access = Public Access settings.public_access_desc = Configure public visitor's access permissions to override the defaults of this repository. @@ -2171,7 +2081,6 @@ settings.mirror_settings.docs.pull_mirror_instructions = To set up a pull mirror settings.mirror_settings.docs.more_information_if_disabled = You can find out more about push and pull mirrors here: settings.mirror_settings.docs.doc_link_title = How do I mirror repositories? settings.mirror_settings.docs.doc_link_pull_section = the "Pulling from a remote repository" section of the documentation. -settings.mirror_settings.docs.pulling_remote_title = Pulling from a remote repository settings.mirror_settings.mirrored_repository = Mirrored repository settings.mirror_settings.pushed_repository = Pushed repository settings.mirror_settings.direction = Direction @@ -2275,13 +2184,10 @@ settings.signing_settings = Signing Verification Settings settings.trust_model = Signature Trust Model settings.trust_model.default = Default Trust Model settings.trust_model.default.desc= Use the default repository trust model for this installation. -settings.trust_model.collaborator = Collaborator settings.trust_model.collaborator.long = Collaborator: Trust signatures by collaborators settings.trust_model.collaborator.desc = Valid signatures by collaborators of this repository will be marked "trusted" - (whether they match the committer or not). Otherwise, valid signatures will be marked "untrusted" if the signature matches the committer and "unmatched" if not. -settings.trust_model.committer = Committer settings.trust_model.committer.long = Committer: Trust signatures that match committers (This matches GitHub and will force Gitea signed commits to have Gitea as the committer) settings.trust_model.committer.desc = Valid signatures will only be marked "trusted" if they match the committer, otherwise they will be marked "unmatched". This forces Gitea to be the committer on signed commits with the actual committer marked as Co-authored-by: and Co-committed-by: trailer in the commit. The default Gitea key must match a User in the database. -settings.trust_model.collaboratorcommitter = Collaborator+Committer settings.trust_model.collaboratorcommitter.long = Collaborator+Committer: Trust signatures by collaborators which match the committer settings.trust_model.collaboratorcommitter.desc = Valid signatures by collaborators of this repository will be marked "trusted" if they match the committer. Otherwise, valid signatures will be marked "untrusted" if the signature matches the committer and "unmatched" otherwise. This will force Gitea to be marked as the committer on signed commits with the actual committer marked as Co-Authored-By: and Co-Committed-By: trailer in the commit. The default Gitea key must match a User in the database. settings.wiki_delete = Delete Wiki Data @@ -2340,7 +2246,6 @@ settings.githook_edit_desc = If the hook is inactive, sample content will be pre settings.githook_name = Hook Name settings.githook_content = Hook Content settings.update_githook = Update Hook -settings.add_webhook_desc = Gitea will send POST requests with a specified content type to the target URL. Read more in the webhooks guide. settings.payload_url = Target URL settings.http_method = HTTP Method settings.content_type = POST Content Type @@ -2418,9 +2323,6 @@ settings.update_webhook = Update Webhook settings.update_hook_success = The webhook has been updated. settings.delete_webhook = Remove Webhook settings.recent_deliveries = Recent Deliveries -settings.hook_type = Hook Type -settings.slack_token = Token -settings.slack_domain = Domain settings.slack_channel = Channel settings.add_web_hook_desc = Integrate %s into your repository. settings.web_hook_name_gitea = Gitea @@ -2457,12 +2359,7 @@ settings.branches = Branches settings.protected_branch = Branch Protection settings.protected_branch.save_rule = Save Rule settings.protected_branch.delete_rule = Delete Rule -settings.protected_branch_can_push = Allow push? -settings.protected_branch_can_push_yes = You can push -settings.protected_branch_can_push_no = You cannot push settings.branch_protection = Branch Protection Rules for Branch '%s' -settings.protect_this_branch = Enable Branch Protection -settings.protect_this_branch_desc = Prevents deletion and restricts Git pushing and merging to the branch. settings.protect_disable_push = Disable Push settings.protect_disable_push_desc = No pushing will be allowed to this branch. settings.protect_disable_force_push = Disable Force Push @@ -2514,8 +2411,6 @@ settings.protect_protected_file_patterns = "Protected file patterns (separated u settings.protect_protected_file_patterns_desc = "Protected files are not allowed to be changed directly even if user has rights to add, edit, or delete files in this branch. Multiple patterns can be separated using semicolon (';'). See %[2]s documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt." settings.protect_unprotected_file_patterns = "Unprotected file patterns (separated using semicolon ';'):" settings.protect_unprotected_file_patterns_desc = "Unprotected files that are allowed to be changed directly if user has write access, bypassing push restriction. Multiple patterns can be separated using semicolon (';'). See %[2]s documentation for pattern syntax. Examples: .drone.yml, /docs/**/*.txt." -settings.add_protected_branch = Enable protection -settings.delete_protected_branch = Disable protection settings.update_protect_branch_success = Branch protection for rule "%s" has been updated. settings.remove_protected_branch_success = Branch protection for rule "%s" has been removed. settings.remove_protected_branch_failed = Removing branch protection rule "%s" failed. @@ -2532,7 +2427,6 @@ settings.block_admin_merge_override_desc = Administrators must follow branch pro settings.default_branch_desc = Select a default repository branch for pull requests and code commits: settings.merge_style_desc = Merge Styles settings.default_merge_style_desc = Default Merge Style -settings.choose_branch = Choose a branch… settings.no_protected_branch = There are no protected branches. settings.edit_protected_branch = Edit settings.protected_branch_required_rule_name = Required rule name @@ -2609,8 +2503,6 @@ settings.lfs_pointers.associateAccessible=Associate accessible %d OIDs settings.rename_branch_failed_exist=Cannot rename branch because target branch %s exists. settings.rename_branch_failed_not_exist=Cannot rename branch %s because it does not exist. settings.rename_branch_success =Branch %s was successfully renamed to %s. -settings.rename_branch_from=old branch name -settings.rename_branch_to=new branch name settings.rename_branch=Rename branch diff.browse_source = Browse Source @@ -2664,7 +2556,6 @@ diff.protected = Protected diff.image.side_by_side = Side by Side diff.image.swipe = Swipe diff.image.overlay = Overlay -diff.has_escaped = This line has hidden Unicode characters diff.show_file_tree = Show file tree diff.hide_file_tree = Hide file tree diff.submodule_added = Submodule %[1]s added at %[2]s @@ -2684,7 +2575,6 @@ release.compare = Compare release.edit = edit release.ahead.commits = %d commits release.ahead.target = to %s since this release -tag.ahead.target = to %s since this tag release.source_code = Source Code release.new_subheader = Releases organize project versions. release.edit_subheader = Releases organize project versions. @@ -2712,7 +2602,6 @@ release.deletion_tag_success = The tag has been deleted. release.tag_name_already_exist = A release with this tag name already exists. release.tag_name_invalid = The tag name is not valid. release.tag_name_protected = The tag name is protected. -release.tag_already_exist = This tag name already exists. release.downloads = Downloads release.download_count = Downloads: %s release.add_tag_msg = Use the title and content of release as tag message. @@ -2722,7 +2611,6 @@ release.tags_for = Tags for %s branch.name = Branch Name branch.already_exists = A branch named "%s" already exists. -branch.delete_head = Delete branch.delete = Delete Branch "%s" branch.delete_html = Delete Branch branch.delete_desc = Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue? @@ -2750,7 +2638,6 @@ branch.create_new_branch = Create branch from branch: branch.confirm_create_branch = Create branch branch.warning_rename_default_branch = You are renaming the default branch. branch.rename_branch_to = Rename "%s" to: -branch.confirm_rename_branch = Rename branch branch.create_branch_operation = Create branch branch.new_branch = Create new branch branch.new_branch_from = Create new branch from "%s" @@ -2766,7 +2653,6 @@ tag.create_tag_from = Create new tag from "%s" tag.create_success = Tag "%s" has been created. topic.manage_topics = Manage Topics -topic.done = Done topic.count_prompt = You cannot select more than 25 topics topic.format_prompt = Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase. @@ -2816,7 +2702,6 @@ form.create_org_not_allowed = You are not allowed to create an organization. settings = Settings settings.options = Organization -settings.full_name = Full Name settings.email = Contact Email settings.website = Website settings.location = Location @@ -2841,11 +2726,8 @@ settings.confirm_delete_account = Confirm Deletion settings.delete_org_title = Delete Organization settings.delete_org_desc = This organization will be deleted permanently. Continue? settings.hooks_desc = Add webhooks which will be triggered for all repositories under this organization. - settings.labels_desc = Add labels which can be used on issues for all repositories under this organization. -members.membership_visibility = Membership Visibility: -members.public = Visible members.public_helper = make hidden members.private = Hidden members.private_helper = make visible @@ -2856,8 +2738,6 @@ members.remove = Remove members.remove.detail = Remove %[1]s from %[2]s? members.leave = Leave members.leave.detail = Leave %s? -members.invite_desc = Add a new member to %s: -members.invite_now = Invite Now teams.join = Join teams.leave = Leave @@ -2877,7 +2757,6 @@ teams.admin_access_helper = Members can pull and push to team repositories and a teams.no_desc = This team has no description teams.settings = Settings teams.owners_permission_desc = Owners have full access to all repositories and have administrator access to the organization. -teams.members = Team Members teams.update_settings = Update Settings teams.delete_team = Delete Team teams.add_team_member = Add Team Member @@ -2886,14 +2765,9 @@ teams.invite_team_member.list = Pending Invitations teams.delete_team_title = Delete Team teams.delete_team_desc = Deleting a team revokes repository access from its members. Continue? teams.delete_team_success = The team has been deleted. -teams.read_permission_desc = This team grants Read access: members can view and clone team repositories. teams.write_permission_desc = This team grants Write access: members can read from and push to team repositories. teams.admin_permission_desc = This team grants Admin access: members can read from, push to and add collaborators to team repositories. -teams.create_repo_permission_desc = Additionally, this team grants Create repository permission: members can create new repositories in organization. -teams.repositories = Team Repositories -teams.remove_all_repos_title = Remove all team repositories teams.remove_all_repos_desc = This will remove all repositories from the team. -teams.add_all_repos_title = Add all repositories teams.add_all_repos_desc = This will add all the organization's repositories to the team. teams.add_nonexistent_repo = "The repository you're trying to add doesn't exist, please create it first." teams.add_duplicate_users = User is already a team member. @@ -2904,9 +2778,6 @@ teams.specific_repositories = Specific repositories teams.specific_repositories_helper = Members will only have access to repositories explicitly added to the team. Selecting this will not automatically remove repositories already added with All repositories. teams.all_repositories = All repositories teams.all_repositories_helper = Team has access to all repositories. Selecting this will add all existing repositories to the team. -teams.all_repositories_read_permission_desc = This team grants Read access to all repositories: members can view and clone repositories. -teams.all_repositories_write_permission_desc = This team grants Write access to all repositories: members can read from and push to repositories. -teams.all_repositories_admin_permission_desc = This team grants Admin access to all repositories: members can read from, push to and add collaborators to repositories. teams.invite.title = You have been invited to join team %s in organization %s. teams.invite.by = Invited by %s teams.invite.description = Please click the button below to join the team. @@ -3120,7 +2991,6 @@ repos.unadopted = Unadopted Repositories repos.unadopted.no_more = No more unadopted repositories found repos.owner = Owner repos.name = Name -repos.private = Private repos.issues = Issues repos.size = Size repos.lfs_size = LFS Size @@ -3159,7 +3029,6 @@ auths.updated = Updated auths.auth_type = Authentication Type auths.auth_name = Authentication Name auths.security_protocol = Security Protocol -auths.domain = Domain auths.host = Host auths.port = Port auths.bind_dn = Bind DN @@ -3188,7 +3057,6 @@ auths.user_attribute_in_group = User Attribute Listed In Group auths.map_group_to_team = Map LDAP groups to Organization teams (leave the field empty to skip) auths.map_group_to_team_removal = Remove users from synchronized teams if user does not belong to corresponding LDAP group auths.enable_ldap_groups = Enable LDAP groups -auths.ms_ad_sa = MS AD Search Attributes auths.smtp_auth = SMTP Authentication Type auths.smtphost = SMTP Host auths.smtpport = SMTP Port @@ -3225,7 +3093,6 @@ auths.oauth2_admin_group = Group Claim value for administrator users. (Optional auths.oauth2_restricted_group = Group Claim value for restricted users. (Optional - requires claim name above) auths.oauth2_map_group_to_team = Map claimed groups to Organization teams. (Optional - requires claim name above) auths.oauth2_map_group_to_team_removal = Remove users from synchronized teams if user does not belong to corresponding group. -auths.enable_auto_register = Enable Auto Registration auths.sspi_auto_create_users = Automatically create users auths.sspi_auto_create_users_helper = Allow SSPI auth method to automatically create new accounts for users that login for the first time auths.sspi_auto_activate_users = Automatically activate users @@ -3282,7 +3149,6 @@ config.run_mode = Run Mode config.git_version = Git Version config.app_data_path = App Data Path config.repo_root_path = Repository Root Path -config.lfs_root_path = LFS Root Path config.log_file_root_path = Log Path config.script_type = Script Type config.reverse_auth_user = Reverse Authentication User @@ -3357,9 +3223,6 @@ config.send_test_mail_submit = Send config.test_mail_failed = Failed to send a testing email to "%s": %v config.test_mail_sent = A testing email has been sent to "%s". -config.oauth_config = OAuth Configuration -config.oauth_enabled = Enabled - config.cache_config = Cache Configuration config.cache_adapter = Cache Adapter config.cache_interval = Cache Interval @@ -3377,10 +3240,8 @@ config.cookie_name = Cookie Name config.gc_interval_time = GC Interval Time config.session_life_time = Session Life Time config.https_only = HTTPS Only -config.cookie_life_time = Cookie Life Time config.picture_config = Picture and Avatar Configuration -config.picture_service = Picture Service config.disable_gravatar = Disable Gravatar config.enable_federated_avatar = Enable Federated Avatars config.open_with_editor_app_help = The "Open with" editors for the clone menu. If left empty, the default will be used. Expand to see the default. @@ -3400,7 +3261,6 @@ config.git_gc_timeout = GC Operation Timeout config.log_config = Log Configuration config.logger_name_fmt = Logger: %s config.disabled_logger = Disabled -config.access_log_mode = Access Log Mode config.access_log_template = Access Log Template config.xorm_log_sql = Log SQL @@ -3420,13 +3280,9 @@ monitor.trace = Trace monitor.performance_logs = Performance Logs monitor.processes_count = %d Processes monitor.download_diagnosis_report = Download diagnosis report -monitor.desc = Description -monitor.start = Start Time -monitor.execute_time = Execution Time monitor.last_execution_result = Result monitor.process.cancel = Cancel process monitor.process.cancel_desc = Cancelling a process may cause data loss -monitor.process.children = Children monitor.queues = Queues monitor.queue = Queue: %s @@ -3546,7 +3402,6 @@ watching = Watching no_subscriptions = No subscriptions [gpg] -default_key=Signed with default key error.extract_sign = Failed to extract signature error.generate_hash = Failed to generate hash of commit error.no_committer_account = No account linked to committer's email address @@ -3559,7 +3414,6 @@ error.probable_bad_default_signature = "WARNING! Although the default key has th [units] unit = Unit error.no_unit_allowed_repo = You are not allowed to access any section of this repository. -error.unit_not_allowed = You are not allowed to access this repository section. [packages] title = Packages @@ -3614,7 +3468,6 @@ composer.registry = Setup this registry in your ~/.composer/config.json.condarc file: @@ -3705,7 +3558,6 @@ owner.settings.cleanuprules.none = No cleanup rules available. Please consult th owner.settings.cleanuprules.preview = Cleanup Rule Preview owner.settings.cleanuprules.preview.overview = %d packages are scheduled to be removed. owner.settings.cleanuprules.preview.none = Cleanup rule does not match any packages. -owner.settings.cleanuprules.enabled = Enabled owner.settings.cleanuprules.pattern_full_match = Apply pattern to full package name owner.settings.cleanuprules.keep.title = Versions that match these rules are kept, even if they match a removal rule below. owner.settings.cleanuprules.keep.count = Keep the most recent @@ -3841,7 +3693,6 @@ variables.none = There are no variables yet. variables.deletion = Remove variable variables.deletion.description = Removing a variable is permanent and cannot be undone. Continue? variables.description = Variables will be passed to certain actions and cannot be read otherwise. -variables.id_not_exist = Variable with ID %d does not exist. variables.edit = Edit Variable variables.deletion.failed = Failed to remove variable. variables.deletion.success = The variable has been removed. diff --git a/routers/web/repo/migrate.go b/routers/web/repo/migrate.go index ea15e90e5c297..8f4f0a73ab4ef 100644 --- a/routers/web/repo/migrate.go +++ b/routers/web/repo/migrate.go @@ -314,7 +314,7 @@ func MigrateStatus(ctx *context.Context) { var translatableMessage admin_model.TranslatableMessage if err := json.Unmarshal([]byte(message), &translatableMessage); err != nil { translatableMessage = admin_model.TranslatableMessage{ - Format: "migrate.migrating_failed.error", + Format: "repo.migrate.migrating_failed.error", Args: []any{task.Message}, } } diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 98995cd69c435..622c897cc8b6c 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -71,7 +71,7 @@ func ProfilePost(ctx *context.Context) { if form.Name != "" { if user_model.IsFeatureDisabledWithLoginType(ctx.Doer, setting.UserFeatureChangeUsername) { - ctx.Flash.Error(ctx.Tr("user.form.change_username_disabled")) + ctx.Flash.Error(ctx.Tr("form.change_username_disabled")) ctx.Redirect(setting.AppSubURL + "/user/settings") return } @@ -107,7 +107,7 @@ func ProfilePost(ctx *context.Context) { if form.FullName != "" { if user_model.IsFeatureDisabledWithLoginType(ctx.Doer, setting.UserFeatureChangeFullName) { - ctx.Flash.Error(ctx.Tr("user.form.change_full_name_disabled")) + ctx.Flash.Error(ctx.Tr("form.change_full_name_disabled")) ctx.Redirect(setting.AppSubURL + "/user/settings") return }