diff --git a/ee/app/assets/javascripts/security_orchestration/components/policies/list_header.vue b/ee/app/assets/javascripts/security_orchestration/components/policies/list_header.vue index 8cd025b805f5e816a93216ae929374e85dd7e874..c604a2ddd6d4819a877523e4bdc577299070e32f 100644 --- a/ee/app/assets/javascripts/security_orchestration/components/policies/list_header.vue +++ b/ee/app/assets/javascripts/security_orchestration/components/policies/list_header.vue @@ -11,6 +11,7 @@ import ExceedingActionsBanner from './banners/exceeding_actions_banner.vue'; import DeprecatedCustomScanBanner from './banners/deprecated_custom_scan_banner.vue'; import ExceedingScheduledRulesBanner from './banners/exceeding_scheduled_rules_banner.vue'; import ProjectModal from './project_modal.vue'; +import PoliciesSyncStatus from './policies_sync_status.vue'; export default { BANNER_STORAGE_KEY: 'security_policies_scan_result_name_change', @@ -27,8 +28,10 @@ export default { InvalidPoliciesBanner, PageHeading, ProjectModal, + PoliciesSyncStatus, }, inject: [ + 'assignedPolicyConfiguration', 'assignedPolicyProject', 'designatedAsCsp', 'disableSecurityPolicyProject', @@ -57,6 +60,8 @@ export default { }, i18n: { newPolicyButtonText: NEW_POLICY_BUTTON_TEXT, + editPolicyProjectButtonText: s__('SecurityOrchestration|Edit policy project'), + viewPolicyProjectButtonText: s__('SecurityOrchestration|View policy project'), }, data() { return { @@ -72,7 +77,7 @@ export default { return Boolean(this.assignedPolicyProject?.id); }, securityPolicyProjectPath() { - return joinPaths(gon.relative_url_root || '/', this.assignedPolicyProject?.fullPath); + return joinPaths('/', this.assignedPolicyProject?.fullPath); }, subtitle() { if (this.namespaceType === NAMESPACE_TYPES.PROJECT) { @@ -163,7 +168,7 @@ export default { :loading="projectIsBeingLinked" @click="showNewPolicyModal" > - {{ s__('SecurityOrchestration|Edit policy project') }} + {{ $options.i18n.editPolicyProjectButtonText }} - {{ s__('SecurityOrchestration|View policy project') }} + {{ $options.i18n.viewPolicyProjectButtonText }} + + diff --git a/ee/app/assets/javascripts/security_orchestration/components/policies/policies_sync_status.vue b/ee/app/assets/javascripts/security_orchestration/components/policies/policies_sync_status.vue new file mode 100644 index 0000000000000000000000000000000000000000..3d9863a46eff0d2cc9643b289ba40374a92660fa --- /dev/null +++ b/ee/app/assets/javascripts/security_orchestration/components/policies/policies_sync_status.vue @@ -0,0 +1,224 @@ + + + diff --git a/ee/app/assets/javascripts/security_orchestration/constants.js b/ee/app/assets/javascripts/security_orchestration/constants.js index 53fc408a5055839df39b461c6431832150765677..fb0e56475b610c13065d3839bc319817fae0a254 100644 --- a/ee/app/assets/javascripts/security_orchestration/constants.js +++ b/ee/app/assets/javascripts/security_orchestration/constants.js @@ -1,4 +1,5 @@ export const DEFAULT_ASSIGNED_POLICY_PROJECT = { fullPath: '', branch: '' }; +export const DEFAULT_ASSIGNED_POLICY_CONFIGURATION = {}; export const PAGE_SIZE = 20; diff --git a/ee/app/assets/javascripts/security_orchestration/graphql/queries/security_policies_sync_status.query.graphql b/ee/app/assets/javascripts/security_orchestration/graphql/queries/security_policies_sync_status.query.graphql new file mode 100644 index 0000000000000000000000000000000000000000..3ac1582eb27e60e410aa75dabf57bc72da1326f8 --- /dev/null +++ b/ee/app/assets/javascripts/security_orchestration/graphql/queries/security_policies_sync_status.query.graphql @@ -0,0 +1,12 @@ +query getSecurityPoliciesSyncStatus( + $policyConfigurationId: SecurityOrchestrationPolicyConfigurationID! +) { + securityPoliciesSyncStatus(policyConfigurationId: $policyConfigurationId) { + projects + projectsTotal + failedProjects + mergeRequests + mergeRequestsTotal + inProgress + } +} diff --git a/ee/app/assets/javascripts/security_orchestration/graphql/queries/security_policies_sync_updated.subscription.graphql b/ee/app/assets/javascripts/security_orchestration/graphql/queries/security_policies_sync_updated.subscription.graphql new file mode 100644 index 0000000000000000000000000000000000000000..acc541c6384a41272fbb4a1297e6106f3c9afbad --- /dev/null +++ b/ee/app/assets/javascripts/security_orchestration/graphql/queries/security_policies_sync_updated.subscription.graphql @@ -0,0 +1,11 @@ +subscription getSecurityPolicySyncStatus( + $policyConfigurationId: SecurityOrchestrationPolicyConfigurationID! +) { + securityPoliciesSyncUpdated(policyConfigurationId: $policyConfigurationId) { + projectsProgress + projectsTotal + failedProjects + mergeRequestsProgress + mergeRequestsTotal + } +} diff --git a/ee/app/assets/javascripts/security_orchestration/security_policies_list.js b/ee/app/assets/javascripts/security_orchestration/security_policies_list.js index 3dc61949a6e0f7f1dc07b3ada405b0fbf3443d5d..6a9b8f737a3bca6e0e67522c2589861e019c851e 100644 --- a/ee/app/assets/javascripts/security_orchestration/security_policies_list.js +++ b/ee/app/assets/javascripts/security_orchestration/security_policies_list.js @@ -4,6 +4,7 @@ import createDefaultClient from '~/lib/graphql'; import { convertObjectPropsToCamelCase, parseBoolean } from '~/lib/utils/common_utils'; import SecurityPoliciesListApp from './components/policies/app.vue'; import { + DEFAULT_ASSIGNED_POLICY_CONFIGURATION, DEFAULT_ASSIGNED_POLICY_PROJECT, MAX_SCAN_EXECUTION_ACTION_COUNT, MAX_SCAN_EXECUTION_POLICY_SCHEDULED_RULES_COUNT, @@ -24,7 +25,7 @@ export default (el, namespaceType) => { if (!el) return null; const { - accessTokens, + assignedPolicyConfiguration, assignedPolicyProject, designatedAsCsp, disableSecurityPolicyProject, @@ -40,19 +41,21 @@ export default (el, namespaceType) => { maxScanExecutionPolicySchedules, } = el.dataset; + let parsedAssignedPolicyConfiguration; let parsedAssignedPolicyProject; - let parsedAccessTokens; try { - parsedAssignedPolicyProject = convertObjectPropsToCamelCase(JSON.parse(assignedPolicyProject)); + parsedAssignedPolicyConfiguration = convertObjectPropsToCamelCase( + JSON.parse(assignedPolicyConfiguration), + ); } catch { - parsedAssignedPolicyProject = DEFAULT_ASSIGNED_POLICY_PROJECT; + parsedAssignedPolicyConfiguration = DEFAULT_ASSIGNED_POLICY_CONFIGURATION; } try { - parsedAccessTokens = JSON.parse(accessTokens); + parsedAssignedPolicyProject = convertObjectPropsToCamelCase(JSON.parse(assignedPolicyProject)); } catch { - parsedAccessTokens = []; + parsedAssignedPolicyProject = DEFAULT_ASSIGNED_POLICY_PROJECT; } const count = parseInt(maxScanExecutionPolicyActions, 10); @@ -72,7 +75,7 @@ export default (el, namespaceType) => { el, name: 'PoliciesAppRoot', provide: { - availableAccessTokens: parsedAccessTokens, + assignedPolicyConfiguration: parsedAssignedPolicyConfiguration, assignedPolicyProject: parsedAssignedPolicyProject, designatedAsCsp: parseBoolean(designatedAsCsp), disableSecurityPolicyProject: parseBoolean(disableSecurityPolicyProject), diff --git a/ee/app/helpers/ee/security_orchestration_helper.rb b/ee/app/helpers/ee/security_orchestration_helper.rb index 86091ae939f55fcb14de6a92f25ee9850f0c6102..286109867a55aa75505be19ae228252d2c6f3bfd 100644 --- a/ee/app/helpers/ee/security_orchestration_helper.rb +++ b/ee/app/helpers/ee/security_orchestration_helper.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true module EE::SecurityOrchestrationHelper - GROUP_DELETION_CONFIGURATIONS_LIMIT = 10 - def can_update_security_orchestration_policy_project?(container) can?(current_user, :update_security_orchestration_policy_project, container) && !container.designated_as_csp? end @@ -25,6 +23,14 @@ def assigned_policy_project(container) } end + def assigned_policy_configuration(container) + config = container&.security_orchestration_policy_configuration + + return {} unless config + + { id: config.to_global_id.to_s } + end + def enabled_policy_experiments(container) return [] unless container&.security_orchestration_policy_configuration @@ -185,7 +191,7 @@ def security_configurations_preventing_project_deletion(project) ::Security::OrchestrationPolicyConfiguration.for_management_project(project) end - def policy_configurations_within_group(group) + def security_configurations_preventing_group_deletion(group) unless group.licensed_feature_available?(:security_orchestration_policies) return ::Security::OrchestrationPolicyConfiguration.none end @@ -193,15 +199,6 @@ def policy_configurations_within_group(group) ::Security::OrchestrationPolicyConfiguration.for_management_project(group.all_project_ids) end - def security_configurations_preventing_group_deletion(group) - configurations = policy_configurations_within_group(group) - - { - limited_configurations: configurations.limit(GROUP_DELETION_CONFIGURATIONS_LIMIT), - has_more: configurations.has_more_than_limit?(GROUP_DELETION_CONFIGURATIONS_LIMIT) - } - end - def access_tokens_for_container(container) bot_users = if container.is_a?(::Project) container.bots diff --git a/ee/app/views/groups/security/policies/index.html.haml b/ee/app/views/groups/security/policies/index.html.haml index 18f128b227d0d16195e0b608f6d2f34380e2198d..eea0e611b794d9e1f2266d47bae70a4ef8fbc537 100644 --- a/ee/app/views/groups/security/policies/index.html.haml +++ b/ee/app/views/groups/security/policies/index.html.haml @@ -4,6 +4,7 @@ - disable_scan_policy_update = !can_modify_security_policy?(group) #js-group-security-policies-list{ data: { assigned_policy_project: assigned_policy_project(group).to_json, + assigned_policy_configuration: assigned_policy_configuration(group).to_json, designated_as_csp: group.designated_as_csp?.to_s, disable_security_policy_project: disable_security_policy_project.to_s, disable_scan_policy_update: disable_scan_policy_update.to_s, @@ -15,5 +16,4 @@ new_policy_path: new_group_security_policy_path(group), max_scan_execution_policy_schedules: max_scan_execution_policy_schedules, max_scan_execution_policy_actions: max_scan_execution_policy_actions, - enabled_experiments: enabled_policy_experiments(group), - access_tokens: access_tokens_for_container(group).to_json } } + enabled_experiments: enabled_policy_experiments(group) } } diff --git a/ee/app/views/projects/security/policies/index.html.haml b/ee/app/views/projects/security/policies/index.html.haml index 7ae38b1bcb40f530bad95a7c13a2872614dc4bfd..cb99bebe57c1b25c1f8056a2de88eb3c4615b495 100644 --- a/ee/app/views/projects/security/policies/index.html.haml +++ b/ee/app/views/projects/security/policies/index.html.haml @@ -6,6 +6,7 @@ - disable_scan_policy_update = !can_modify_security_policy?(project) #js-security-policies-list{ data: { assigned_policy_project: assigned_policy_project(project).to_json, + assigned_policy_configuration: assigned_policy_configuration(project).to_json, disable_security_policy_project: disable_security_policy_project.to_s, disable_scan_policy_update: disable_scan_policy_update.to_s, documentation_path: help_page_path('user/application_security/policies/_index.md'), @@ -15,5 +16,4 @@ new_policy_path: new_project_security_policy_path(project), max_scan_execution_policy_actions: max_scan_execution_policy_actions, max_scan_execution_policy_schedules: max_scan_execution_policy_schedules, - enabled_experiments: enabled_policy_experiments(project), - access_tokens: access_tokens_for_container(project).to_json } } + enabled_experiments: enabled_policy_experiments(project) } } diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 80dc4eeeeb8da1a6ac2dd68867fa7e05d1583b82..25b900afc02e98dd78e9e0a6a88c4b43075420e2 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -1189,6 +1189,9 @@ msgstr "" msgid "%{name} is reserved for %{type} report type" msgstr "" +msgid "%{name} is scheduled for %{action}" +msgstr "" + msgid "%{name} not checked" msgstr "" @@ -1611,6 +1614,9 @@ msgstr "" msgid "%{type} was closed by %{name}" msgstr "" +msgid "%{updated} projects updated (%{total} total, %{failed} failed)" +msgstr "" + msgid "%{url} (optional)" msgstr "" @@ -2410,24 +2416,12 @@ msgstr "" msgid "AIAgent|Your agent's system prompt will be applied to the chat input." msgstr "" -msgid "AICatalog| Agent" -msgstr "" - -msgid "AICatalog| Draft node" -msgstr "" - -msgid "AICatalog| Flow nodes (Coming soon)" -msgstr "" - msgid "AICatalog|A public agent can be made private only if it is not used." msgstr "" msgid "AICatalog|AI Catalog" msgstr "" -msgid "AICatalog|AI agents complete specialized tasks. They become active when included in a Flow." -msgstr "" - msgid "AICatalog|Agent created successfully." msgstr "" @@ -2473,9 +2467,6 @@ msgstr "" msgid "AICatalog|Choose who can view and interact with this agent after it is published to the public AI catalog." msgstr "" -msgid "AICatalog|Connect AI agents to automate complicated tasks." -msgstr "" - msgid "AICatalog|Create agent" msgstr "" @@ -2497,9 +2488,6 @@ msgstr "" msgid "AICatalog|Description is required." msgstr "" -msgid "AICatalog|Draft node" -msgstr "" - msgid "AICatalog|Edit" msgstr "" @@ -2593,9 +2581,6 @@ msgstr "" msgid "AICatalog|Select a project for your AI flow to be associated with." msgstr "" -msgid "AICatalog|Select agent" -msgstr "" - msgid "AICatalog|Select tools that this agent will have access to." msgstr "" @@ -2611,16 +2596,13 @@ msgstr "" msgid "AICatalog|Test run agents to see how they respond." msgstr "" -msgid "AICatalog|The agent could not be added. Try again." +msgid "AICatalog|The agent could not be added. Please try again." msgstr "" -msgid "AICatalog|The agent could not be updated. Try again." +msgid "AICatalog|The agent could not be updated. Please try again." msgstr "" -msgid "AICatalog|The flow could not be added. Try again." -msgstr "" - -msgid "AICatalog|The flow could not be updated. Try again." +msgid "AICatalog|The flow could not be added. Please try again." msgstr "" msgid "AICatalog|This agent can be made private if it is not used." @@ -2704,9 +2686,6 @@ msgstr "" msgid "AI|Explain with AI" msgstr "" -msgid "AI|Flow" -msgstr "" - msgid "AI|For example: Organizations should be able to forecast into the future by using value stream analytics charts. This feature would help them understand how their metrics are trending." msgstr "" @@ -6391,7 +6370,7 @@ msgstr "" msgid "AiPowered|Turn on GitLab Duo Agent Platform" msgstr "" -msgid "AiPowered|Turn on Web and IDE features" +msgid "AiPowered|Turn on IDE features" msgstr "" msgid "AiPowered|Turn on experiment and beta GitLab Duo features" @@ -6424,7 +6403,7 @@ msgstr "" msgid "AiPowered|When GitLab Duo is not available, prompt caching cannot be turned on." msgstr "" -msgid "AiPowered|When turned on, all billable users can access GitLab Duo Chat and Code Suggestions in Web and supported IDEs." +msgid "AiPowered|When turned on, all billable users can access GitLab Duo Chat and Code Suggestions in supported IDEs." msgstr "" msgid "AiPowered|When you save, GitLab Duo will be turned off for all groups, subgroups, and projects." @@ -7298,9 +7277,6 @@ msgstr "" msgid "AmazonQ|Within your AWS account, create an IAM role for Amazon Q and the relevant identity provider. %{helpStart}Learn how to create an IAM role%{helpEnd}." msgstr "" -msgid "AmazonQ|Your Amazon Q connection is missing or has been deleted. You'll need to reconnect to use this feature. Please see [Set up GitLab Duo with Amazon Q](https://docs.gitlab.com/user/duo_amazon_q/setup/#setup) for how to reconnect your Amazon Q developer plugin." -msgstr "" - msgid "AmazonQ|dev" msgstr "" @@ -8352,7 +8328,7 @@ msgstr "" msgid "Apply this approval rule to all branches or a specific protected branch." msgstr "" -msgid "Apply to all" +msgid "Apply to all button" msgstr "" msgid "Applying" @@ -9046,12 +9022,6 @@ msgstr "" msgid "Assigned to %{assignee_name}" msgstr "" -msgid "Assigned weight" -msgstr "" - -msgid "Assigned weight does not match total of its child items." -msgstr "" - msgid "Assignee" msgid_plural "%d Assignees" msgstr[0] "" @@ -13307,9 +13277,6 @@ msgstr "" msgid "CiVariables|Add variable" msgstr "" -msgid "CiVariables|All manually-defined CI/CD variables and their values are visible to maintainers, which is a security risk if including credentials or other secrets in variables. Do not enable this feature if variables could contain sensitive data. Developers can only view manually-defined variables in their own manual pipelines." -msgstr "" - msgid "CiVariables|CI/CD Variables" msgstr "" @@ -13328,15 +13295,6 @@ msgstr "" msgid "CiVariables|Disable pipeline variables in projects that don't use them" msgstr "" -msgid "CiVariables|Display all manually-defined variables in the pipeline details page after running a pipeline manually." -msgstr "" - -msgid "CiVariables|Display manually-defined pipeline variables" -msgstr "" - -msgid "CiVariables|Display pipeline variables" -msgstr "" - msgid "CiVariables|Do you want to delete the variable %{key}?" msgstr "" @@ -15480,9 +15438,6 @@ msgstr "" msgid "Commits & branches" msgstr "" -msgid "Commits breadcrumb" -msgstr "" - msgid "Commits feed" msgstr "" @@ -18105,6 +18060,9 @@ msgstr "" msgid "ContainerRegistry|Image repository deletion failed" msgstr "" +msgid "ContainerRegistry|Image repository not found" +msgstr "" + msgid "ContainerRegistry|Image repository temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}" msgstr "" @@ -24054,42 +24012,18 @@ msgstr "" msgid "Duo Agent Platform|Something went wrong saving Duo Agent Platform settings" msgstr "" -msgid "DuoAgentPlatform|%{linkStart}What are flows%{linkEnd}?" -msgstr "" - -msgid "DuoAgentPlatform|Activity" -msgstr "" - -msgid "DuoAgentPlatform|Allow GitLab Duo agents to execute flows in this project." -msgstr "" - -msgid "DuoAgentPlatform|Allow flow execution" -msgstr "" - -msgid "DuoAgentPlatform|Details" -msgstr "" - msgid "DuoAgentPlatform|Error occurred when starting the flow." msgstr "" msgid "DuoAgentPlatform|Executor ID" msgstr "" -msgid "DuoAgentPlatform|Flow" -msgstr "" - msgid "DuoAgentPlatform|Flow started successfully." msgstr "" msgid "DuoAgentPlatform|Flow started successfully. To view progress, see %{linkStart}Session %{id}%{linkEnd}." msgstr "" -msgid "DuoAgentPlatform|Remote GitLab Duo Flows" -msgstr "" - -msgid "DuoAgentPlatform|Session ID" -msgstr "" - msgid "DuoAgenticChat|GitLab Duo Agentic Chat" msgstr "" @@ -24144,9 +24078,6 @@ msgstr "" msgid "DuoAgentsPlatform|Description" msgstr "" -msgid "DuoAgentsPlatform|Do not assign the service account a role in your project with higher permissions than the users of that service account." -msgstr "" - msgid "DuoAgentsPlatform|Edit flow trigger" msgstr "" @@ -24282,9 +24213,6 @@ msgstr "" msgid "DuoAgentsPlatform|Updated" msgstr "" -msgid "DuoAgentsPlatform|⚠️ Create a unique service account for each project." -msgstr "" - msgid "DuoChat|%{linkStart}Learn how%{linkEnd} to set up Code Suggestions and Chat in your IDE. You can also use Chat in GitLab. Ask questions about:" msgstr "" @@ -24977,6 +24905,9 @@ msgstr "" msgid "Edit user: %{user_name}" msgstr "" +msgid "Edit value" +msgstr "" + msgid "Edit video description" msgstr "" @@ -27750,12 +27681,6 @@ msgstr "" msgid "FeaturedUpdate|%{current} / %{total}" msgstr "" -msgid "FeaturedUpdate|%{releaseNumber} Release" -msgstr "" - -msgid "FeaturedUpdate|Close article" -msgstr "" - msgid "FeaturedUpdate|Discover AI-native features including Code Suggestions and Chat in your IDE in GitLab Premium and Ultimate." msgstr "" @@ -27768,9 +27693,6 @@ msgstr "" msgid "FeaturedUpdate|Granular access controls for GitLab Duo Core" msgstr "" -msgid "FeaturedUpdate|Open article" -msgstr "" - msgid "FeaturedUpdate|Set detailed permissions for GitLab Duo Core across projects and groups to fit your workflow." msgstr "" @@ -27870,6 +27792,9 @@ msgstr "" msgid "File tree" msgstr "" +msgid "File tree browser" +msgstr "" + msgid "File upload error." msgstr "" @@ -28565,11 +28490,6 @@ msgstr "" msgid "Geo sites" msgstr "" -msgid "Geo|%d Registry" -msgid_plural "Geo|%d Registries" -msgstr[0] "" -msgstr[1] "" - msgid "Geo|%d group selected" msgid_plural "Geo|%d groups selected" msgstr[0] "" @@ -28610,9 +28530,6 @@ msgstr "" msgid "Geo|%{titlePlural} verified" msgstr "" -msgid "Geo|1000+ Registries" -msgstr "" - msgid "Geo|Add New Site" msgstr "" @@ -28622,6 +28539,9 @@ msgstr "" msgid "Geo|All" msgstr "" +msgid "Geo|All %{replicableType} are being scheduled for %{action}" +msgstr "" + msgid "Geo|All projects" msgstr "" @@ -29024,12 +28944,6 @@ msgstr "" msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site." msgstr "" -msgid "Geo|Scheduled %{name} for %{actionName}." -msgstr "" - -msgid "Geo|Scheduled all %{replicableType} for %{actionName}." -msgstr "" - msgid "Geo|Secondary" msgstr "" @@ -29171,10 +29085,7 @@ msgstr "" msgid "Geo|There was an error saving this Geo Site" msgstr "" -msgid "Geo|There was an error scheduling %{actionName} for all %{replicableType}." -msgstr "" - -msgid "Geo|There was an error scheduling %{name} for %{actionName}." +msgid "Geo|There was an error scheduling action %{action} for %{replicableType}" msgstr "" msgid "Geo|There was an error updating the Geo Settings" @@ -32433,9 +32344,6 @@ msgstr "" msgid "Hide file contents" msgstr "" -msgid "Hide file tree browser" -msgstr "" - msgid "Hide group projects" msgstr "" @@ -32858,9 +32766,6 @@ msgstr "" msgid "IdentityVerification|Email Verification" msgstr "" -msgid "IdentityVerification|Email Verification has been disabled and resending a code is not required. Log in again." -msgstr "" - msgid "IdentityVerification|Enter a code." msgstr "" @@ -33384,6 +33289,9 @@ msgstr "" msgid "ImportProjects|Imported files will be kept. You can import this repository again later." msgstr "" +msgid "ImportProjects|Importing a project into a personal namespace results in all contributions being mapped to the same bot user and they cannot be reassigned. To map contributions to actual users, import the project to a group instead." +msgstr "" + msgid "ImportProjects|Importing the project failed" msgstr "" @@ -33429,12 +33337,6 @@ msgstr "" msgid "ImportProjects|Update of imported projects with realtime changes failed" msgstr "" -msgid "ImportProjects|When you import to a personal namespace, all contributions are assigned to a single non-functional user and they cannot be reassigned. To map contributions to real users, import to a group instead." -msgstr "" - -msgid "ImportProjects|When you import to a personal namespace, all contributions are assigned to the personal namespace owner and they cannot be reassigned. To map contributions to real users, import to a group instead." -msgstr "" - msgid "Imported" msgstr "" @@ -37564,7 +37466,7 @@ msgstr "" msgid "LearnGitLab|Add code owners" msgstr "" -msgid "LearnGitLab|Add code to this project's repository" +msgid "LearnGitLab|Add code to a repository" msgstr "" msgid "LearnGitLab|Analyze your application for vulnerabilities with DAST" @@ -37657,9 +37559,6 @@ msgstr "" msgid "LearnGitLab|Next steps" msgstr "" -msgid "LearnGitLab|Open the WebIDE" -msgstr "" - msgid "LearnGitLab|Plan and execute work together" msgstr "" @@ -37699,10 +37598,10 @@ msgstr "" msgid "LearnGitLab|Try walkthrough" msgstr "" -msgid "LearnGitLab|Upload files" +msgid "LearnGitLab|Use GitLab to deploy your application, monitor its health, and keep it secure:" msgstr "" -msgid "LearnGitLab|Use GitLab to deploy your application, monitor its health, and keep it secure:" +msgid "LearnGitLab|Use the Web IDE or upload code using your preferred method." msgstr "" msgid "LearnGitLab|Use the built-in editor, WebIDE, or upload code using your preferred method." @@ -42614,6 +42513,11 @@ msgstr "" msgid "No work item found." msgstr "" +msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription." +msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription." +msgstr[0] "" +msgstr[1] "" + msgid "No wrap" msgstr "" @@ -43744,9 +43648,6 @@ msgstr "" msgid "Observability|Are you sure you want to delete the observability service settings? This action cannot be undone." msgstr "" -msgid "Observability|Authentication failed" -msgstr "" - msgid "Observability|Beta Release" msgstr "" @@ -43858,18 +43759,12 @@ msgstr "" msgid "Observability|Group is required" msgstr "" -msgid "Observability|Iframe not ready for communication" -msgstr "" - msgid "Observability|Important Information" msgstr "" msgid "Observability|Includes Logs, Traces and Metrics. %{learnMoreLink}" msgstr "" -msgid "Observability|Invalid iframe provided" -msgstr "" - msgid "Observability|Kubernetes Monitoring" msgstr "" @@ -43978,7 +43873,7 @@ msgstr "" msgid "Observability|See It In Action" msgstr "" -msgid "Observability|Service Name" +msgid "Observability|Service URL" msgstr "" msgid "Observability|Single pane of glass for logs, metrics, and traces within GitLab" @@ -44002,7 +43897,7 @@ msgstr "" msgid "Observability|Thank You for Your Request!" msgstr "" -msgid "Observability|The Name of your observability service instance." +msgid "Observability|The URL of your observability service instance." msgstr "" msgid "Observability|To widen your search, change or remove filters above" @@ -44074,9 +43969,6 @@ msgstr "" msgid "Observability|allowedOrigin must be a non-empty string" msgstr "" -msgid "Observability|authTokens must be an object" -msgstr "" - msgid "Observability|documentation" msgstr "" @@ -44086,9 +43978,6 @@ msgstr "" msgid "Observability|for detailed setup instructions and best practices" msgstr "" -msgid "Observability|targetPath must be a non-empty string" -msgstr "" - msgid "Oct" msgstr "" @@ -47921,9 +47810,6 @@ msgstr "" msgid "Please %{link_to_register} or %{link_to_sign_in} to comment" msgstr "" -msgid "Please %{link_to_sign_in} to comment" -msgstr "" - msgid "Please %{registerLinkStart}register%{registerLinkEnd} or %{signInLinkStart}sign in%{signInLinkEnd} to add a comment." msgstr "" @@ -48169,6 +48055,9 @@ msgstr "" msgid "Policy project doesn't exist" msgstr "" +msgid "Policy synchronization" +msgstr "" + msgid "PolicyRuleMultiSelect|%{firstLabel} %{moreLabel}" msgstr "" @@ -48466,9 +48355,6 @@ msgstr "" msgid "Preferences|Render whitespace characters in the Web IDE" msgstr "" -msgid "Preferences|Select a default Duo namespace..." -msgstr "" - msgid "Preferences|Show one file at a time on merge request's Changes tab" msgstr "" @@ -49489,15 +49375,9 @@ msgstr "" msgid "Project & Group can not be assigned at the same time" msgstr "" -msgid "Project '%{project_name}' has been successfully archived." -msgstr "" - msgid "Project '%{project_name}' has been successfully restored." msgstr "" -msgid "Project '%{project_name}' has been successfully unarchived." -msgstr "" - msgid "Project '%{project_name}' is being deleted." msgstr "" @@ -51132,18 +51012,12 @@ msgstr "" msgid "ProjectsNew|my-awesome-project" msgstr "" -msgid "Projects|An error occurred archiving the project. Please refresh the page to try again." -msgstr "" - msgid "Projects|An error occurred deleting the project. Please refresh the page to try again." msgstr "" msgid "Projects|An error occurred restoring the project. Please refresh the page to try again." msgstr "" -msgid "Projects|An error occurred unarchiving the project. Please refresh the page to try again." -msgstr "" - msgid "Projects|Delete %{nameWithNamespace}" msgstr "" @@ -53108,9 +52982,6 @@ msgstr "" msgid "Reopens this %{quick_action_target}." msgstr "" -msgid "Reorder" -msgstr "" - msgid "Replace" msgstr "" @@ -53503,7 +53374,7 @@ msgstr "" msgid "Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / Pipeline Artifacts: %{counter_pipeline_artifacts} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}" msgstr "" -msgid "Repository|Filter files (*.vue, *.rb...)" +msgid "Repository|Filter (e.g. *.vue)" msgstr "" msgid "Repository|New branch" @@ -55210,9 +55081,6 @@ msgstr "" msgid "Runners|Unassign" msgstr "" -msgid "Runners|Unassign runner %{name}?" -msgstr "" - msgid "Runners|Understand how long it takes for runners to pick up a job. %{linkStart}How is this calculated?%{linkEnd}" msgstr "" @@ -55356,15 +55224,9 @@ msgstr "" msgid "Runner|The CSV export contains a list of projects, the number of minutes used by instance runners, and the number of jobs that ran. When the export is completed, it is sent as an attachment to your email." msgstr "" -msgid "Runner|The runner will be unassigned from this project. Depending on your permissions for this runner, you might not be able to assign it again. Are you sure you want to continue?" -msgstr "" - msgid "Runner|Unassign from project" msgstr "" -msgid "Runner|Unassign runner from project" -msgstr "" - msgid "Runner|Your CSV export has started. It will be sent to your email inbox when its ready." msgstr "" @@ -55578,6 +55440,9 @@ msgstr "" msgid "ScanExecutionPolicy|%{labelStart}File path:%{labelEnd} %{filePath}" msgstr "" +msgid "ScanExecutionPolicy|%{period} %{days} around %{time} %{timezoneLabel} %{timezone}" +msgstr "" + msgid "ScanExecutionPolicy|%{rules} actions for %{scopes} %{branches} %{agents} %{branchExceptions} %{namespaces} %{period}" msgstr "" @@ -55749,9 +55614,6 @@ msgstr "" msgid "ScanExecutionPolicy|agent" msgstr "" -msgid "ScanExecutionPolicy|at the following times: %{period} %{days} around %{time} %{timezone}, run for: %{duration}, %{timezoneLabel}" -msgstr "" - msgid "ScanExecutionPolicy|branch" msgstr "" @@ -56765,21 +56627,12 @@ msgstr "" msgid "Secrets|Enable the Secrets Manager to securely store and manage sensitive information for this project." msgstr "" -msgid "Secrets|Enter a new value to update secret" -msgstr "" - msgid "Secrets|Enter a value for the secret" msgstr "" msgid "Secrets|Expires" msgstr "" -msgid "Secrets|Failed to create Secrets manager permission. Please try again." -msgstr "" - -msgid "Secrets|Failed to fetch secrets manager permissions. Please try again later." -msgstr "" - msgid "Secrets|Failed to load secret. Please try again later." msgstr "" @@ -56819,6 +56672,9 @@ msgstr "" msgid "Secrets|Secret Manager permissions were successfully updated." msgstr "" +msgid "Secrets|Secret manager user permissions" +msgstr "" + msgid "Secrets|Secrets" msgstr "" @@ -56831,9 +56687,6 @@ msgstr "" msgid "Secrets|Secrets can be items like API tokens, database credentials, or private keys. Unlike CI/CD variables, secrets must be explicitly requested by a job." msgstr "" -msgid "Secrets|Secrets manager user permissions" -msgstr "" - msgid "Secrets|Secure your sensitive information" msgstr "" @@ -57495,9 +57348,6 @@ msgstr "" msgid "SecurityOrchestration| triggered by %{sources}" msgstr "" -msgid "SecurityOrchestration| with scans distributed over %{humanizedTimeWindowValue}" -msgstr "" - msgid "SecurityOrchestration|%d project which has compliance framework:" msgid_plural "SecurityOrchestration|%d projects which have compliance framework:" msgstr[0] "" @@ -57521,24 +57371,15 @@ msgstr "" msgid "SecurityOrchestration|%{branchName} (in %{codeStart}%{fullPath}%{codeEnd})" msgstr "" -msgid "SecurityOrchestration|%{cadence} on %{branches}%{timeWindowInfo}%{branchExceptionsString}" +msgid "SecurityOrchestration|%{cadence} on %{branches}%{branchExceptionsString}" msgstr "" msgid "SecurityOrchestration|%{frameworkName} has %{projectLength} %{projects}" msgstr "" -msgid "SecurityOrchestration|%{hours}" -msgstr "" - -msgid "SecurityOrchestration|%{hours} and %{minutes}" -msgstr "" - msgid "SecurityOrchestration|%{listType} attempts from %{linkStart}other settings%{linkEnd} to override variables when the policy runs, except the variables defined in the %{list}." msgstr "" -msgid "SecurityOrchestration|%{minutes}" -msgstr "" - msgid "SecurityOrchestration|%{pageSize}+ projects which have compliance framework:" msgstr "" @@ -57553,9 +57394,6 @@ msgid_plural "SecurityOrchestration|%{scanners} of %{severities} severity levels msgstr[0] "" msgstr[1] "" -msgid "SecurityOrchestration|%{seconds}" -msgstr "" - msgid "SecurityOrchestration|%{sources} or %{lastSource}" msgstr "" @@ -57601,9 +57439,6 @@ msgstr "" msgid "SecurityOrchestration|API request" msgstr "" -msgid "SecurityOrchestration|Access tokens (%{count})" -msgstr "" - msgid "SecurityOrchestration|Accounts exceptions (%{count})" msgstr "" @@ -58803,7 +58638,16 @@ msgstr "" msgid "SecurityOrchestration|allowlist" msgstr "" -msgid "SecurityOrchestration|and run for %{timeWindowInfo}" +msgid "SecurityOrchestration|and run for %{hours}" +msgstr "" + +msgid "SecurityOrchestration|and run for %{hours} and %{minutes}" +msgstr "" + +msgid "SecurityOrchestration|and run for %{minutes}" +msgstr "" + +msgid "SecurityOrchestration|and run for %{seconds}" msgstr "" msgid "SecurityOrchestration|any" @@ -58845,7 +58689,7 @@ msgstr "" msgid "SecurityOrchestration|branches" msgstr "" -msgid "SecurityOrchestration|by the agent named %{agents} %{cadence}%{timeWindowInfo}%{branchExceptionsString}" +msgid "SecurityOrchestration|by the agent named %{agents} %{cadence}%{branchExceptionsString}" msgstr "" msgid "SecurityOrchestration|compliance frameworks" @@ -60755,9 +60599,6 @@ msgstr "" msgid "Show file contents" msgstr "" -msgid "Show file tree browser" -msgstr "" - msgid "Show full blame" msgstr "" @@ -61542,9 +61383,6 @@ msgstr "" msgid "Something went wrong while promoting the note to timeline event." msgstr "" -msgid "Something went wrong while removing the license. Please try again." -msgstr "" - msgid "Something went wrong while reopening a requirement." msgstr "" @@ -63146,6 +62984,9 @@ msgstr "" msgid "Synced" msgstr "" +msgid "Synced %{count} merge requests" +msgstr "" + msgid "Synchronization" msgstr "" @@ -63155,6 +62996,9 @@ msgstr "" msgid "Synchronize your subscription." msgstr "" +msgid "Syncing merge requests..." +msgstr "" + msgid "Syncing…" msgstr "" @@ -63642,9 +63486,6 @@ msgstr "" msgid "Terraform|Actions" msgstr "" -msgid "Terraform|Alternatively, use the Terraform or OpenTofu CLI directly. You must use a personal access token with the scope set to api. %{linkStart}How do I create a personal access token?%{linkEnd}." -msgstr "" - msgid "Terraform|An error occurred while changing the state file" msgstr "" @@ -63705,9 +63546,6 @@ msgstr "" msgid "Terraform|Pipeline" msgstr "" -msgid "Terraform|Recommended. Run the following command with glab. You must use glab 1.66 or later:" -msgstr "" - msgid "Terraform|Remove" msgstr "" @@ -63726,7 +63564,7 @@ msgstr "" msgid "Terraform|Support for periods (`.`) in Terraform state names might break existing states. Refer to the %{link_start}troubleshooting%{link_end} to learn more." msgstr "" -msgid "Terraform|Terraform init" +msgid "Terraform|Terraform init command" msgstr "" msgid "Terraform|Terraform states" @@ -63738,7 +63576,7 @@ msgstr "" msgid "Terraform|The job %{strong_start}%{name}%{strong_end} generated a report." msgstr "" -msgid "Terraform|To access this Terraform state from your local computer, use either GitLab CLI (glab) or the REST API." +msgid "Terraform|To get access to this terraform state from your local computer, run the following command at the command line. The first line requires a personal access token with API read and write access. %{linkStart}How do I create a personal access token?%{linkEnd}." msgstr "" msgid "Terraform|To remove the State file and its versions, type %{name} to confirm:" @@ -64959,6 +64797,9 @@ msgstr "" msgid "There was an error summarizing your pending comments." msgstr "" +msgid "There was an error syncing project %{name}" +msgstr "" + msgid "There was an error updating your display preferences." msgstr "" @@ -65582,9 +65423,6 @@ msgstr "" msgid "This project can be restored until %{date}. %{linkStart}Learn more%{linkEnd}." msgstr "" -msgid "This project cannot be %{visibilityLevel} because the visibility of %{openShowLink}%{name}%{closeShowLink} is %{visibility}." -msgstr "" - msgid "This project cannot be %{visibilityLevel} because the visibility of %{openShowLink}%{name}%{closeShowLink} is %{visibility}. To make this project %{visibilityLevel}, you must first %{openEditLink}change the visibility%{closeEditLink} of the parent group." msgstr "" @@ -66947,9 +66785,6 @@ msgstr "" msgid "Total memory (GB)" msgstr "" -msgid "Total of child items" -msgstr "" - msgid "Total test time for all commits/merges" msgstr "" @@ -67721,15 +67556,15 @@ msgstr "" msgid "Unapproved the current merge request." msgstr "" -msgid "Unarchive" -msgstr "" - msgid "Unarchive project" msgstr "" msgid "Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}" msgstr "" +msgid "Unassign" +msgstr "" + msgid "Unassign all" msgstr "" @@ -70169,6 +70004,9 @@ msgid_plural "VirtualRegistry|%{hours} hours cache" msgstr[0] "" msgstr[1] "" +msgid "VirtualRegistry|%{size} KB" +msgstr "" + msgid "VirtualRegistry|%{size} storage used" msgstr "" @@ -70187,12 +70025,6 @@ msgstr "" msgid "VirtualRegistry|Caching period" msgstr "" -msgid "VirtualRegistry|Clear all caches" -msgstr "" - -msgid "VirtualRegistry|Clear all caches?" -msgstr "" - msgid "VirtualRegistry|Clear cache" msgstr "" @@ -70235,10 +70067,7 @@ msgstr "" msgid "VirtualRegistry|Enter password" msgstr "" -msgid "VirtualRegistry|Failed to clear registry cache. Try again." -msgstr "" - -msgid "VirtualRegistry|Failed to clear upstream cache. Try again." +msgid "VirtualRegistry|Failed to clear upstream cache. Please try again." msgstr "" msgid "VirtualRegistry|Failed to delete cache entry." @@ -70253,7 +70082,7 @@ msgstr "" msgid "VirtualRegistry|Failed to search cache entries." msgstr "" -msgid "VirtualRegistry|Failed to update position of the upstream. Try again." +msgid "VirtualRegistry|Failed to update position of the upstream. Please try again." msgstr "" msgid "VirtualRegistry|Get started with virtual registries" @@ -70307,16 +70136,13 @@ msgstr "" msgid "VirtualRegistry|Please provide a valid URL." msgstr "" -msgid "VirtualRegistry|Position of the upstream has been updated successfully." -msgstr "" - -msgid "VirtualRegistry|Registry cache cleared successfully." +msgid "VirtualRegistry|Position of the upstream has been updated successfully" msgstr "" msgid "VirtualRegistry|Registry types" msgstr "" -msgid "VirtualRegistry|Something went wrong while creating the upstream. Try again." +msgid "VirtualRegistry|Something went wrong while creating the upstream. Please try again." msgstr "" msgid "VirtualRegistry|Test upstream" @@ -70328,10 +70154,7 @@ msgstr "" msgid "VirtualRegistry|There is a problem with this cached upstream" msgstr "" -msgid "VirtualRegistry|This will delete all cached packages for exclusive upstream registries in this virtual registry. If any upstream is unavailable or misconfigured after clearing, jobs that rely on those packages might fail. Are you sure you want to continue?" -msgstr "" - -msgid "VirtualRegistry|This will delete all cached packages for this upstream and re-fetch them from the source. If the upstream is unavailable or misconfigured, jobs might fail. Are you sure you want to continue?" +msgid "VirtualRegistry|This will delete all cached packages for this upstream and re-fetch them from the source. If the upstream is unavailable or misconfigured, jobs may fail. Are you sure you want to continue?" msgstr "" msgid "VirtualRegistry|Time in hours" @@ -70343,10 +70166,10 @@ msgstr "" msgid "VirtualRegistry|Upstream URL" msgstr "" -msgid "VirtualRegistry|Upstream cache cleared successfully." +msgid "VirtualRegistry|Upstream cache cleared successfully" msgstr "" -msgid "VirtualRegistry|Upstream created successfully." +msgid "VirtualRegistry|Upstream created successfully" msgstr "" msgid "VirtualRegistry|Upstreams" @@ -71588,9 +71411,6 @@ msgstr "" msgid "Weight - %{maxIssueWeight}" msgstr "" -msgid "Weight conflict warning" -msgstr "" - msgid "Welcome %{name}," msgstr "" @@ -72129,9 +71949,6 @@ msgstr "" msgid "WorkItemStatus|%{status_name} is not a valid status for this item." msgstr "" -msgid "WorkItemStatus|Name" -msgstr "" - msgid "WorkItemStatus|Options could not be loaded for field: %{dropdownLabel}. Please try again." msgstr "" @@ -72431,9 +72248,6 @@ msgstr "" msgid "WorkItem|Copy %{workItemType} email address" msgstr "" -msgid "WorkItem|Copy from existing lifecycle" -msgstr "" - msgid "WorkItem|Create %{workItemType}" msgstr "" @@ -72446,9 +72260,6 @@ msgstr "" msgid "WorkItem|Created %{timeago}" msgstr "" -msgid "WorkItem|Creating a lifecycle will not effect existing items. Change the lifecycle associated with an item type to use this new lifecycle." -msgstr "" - msgid "WorkItem|Creating this %{workItemType} will resolve all threads in" msgstr "" @@ -72467,9 +72278,6 @@ msgstr "" msgid "WorkItem|Dates" msgstr "" -msgid "WorkItem|Default statuses" -msgstr "" - msgid "WorkItem|Delete %{workItemType}" msgstr "" @@ -72545,9 +72353,6 @@ msgstr "" msgid "WorkItem|Failed to load custom fields." msgstr "" -msgid "WorkItem|Failed to load default lifecycle" -msgstr "" - msgid "WorkItem|Failed to load statuses." msgstr "" @@ -72768,9 +72573,6 @@ msgstr "" msgid "WorkItem|No matches found" msgstr "" -msgid "WorkItem|No matching lifecycles." -msgstr "" - msgid "WorkItem|No matching results" msgstr "" @@ -72876,9 +72678,6 @@ msgstr "" msgid "WorkItem|Search existing items or enter an item's URL or reference ID" msgstr "" -msgid "WorkItem|Search lifecycles" -msgstr "" - msgid "WorkItem|Search or enter URL" msgstr "" @@ -72894,9 +72693,6 @@ msgstr "" msgid "WorkItem|Select a project" msgstr "" -msgid "WorkItem|Select a set of statuses to start from. You can edit statuses once the lifecycle created." -msgstr "" - msgid "WorkItem|Select a status" msgstr "" @@ -73044,12 +72840,6 @@ msgstr "" msgid "WorkItem|Start" msgstr "" -msgid "WorkItem|Start from a default configuration" -msgstr "" - -msgid "WorkItem|Starting statuses" -msgstr "" - msgid "WorkItem|Statuses" msgstr "" @@ -73122,6 +72912,9 @@ msgstr "" msgid "WorkItem|Time tracking" msgstr "" +msgid "WorkItem|Title" +msgstr "" + msgid "WorkItem|To do" msgstr "" @@ -73290,9 +73083,6 @@ msgstr "" msgid "WorkItem|ticket" msgstr "" -msgid "WorkItem|weight completed" -msgstr "" - msgid "Workflow" msgstr "" @@ -74515,9 +74305,6 @@ msgstr "" msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}." msgstr "" -msgid "Your %{strong}%{plan_name}%{strong_close} subscription has expired. Please renew your subscription to continue using paid features." -msgstr "" - msgid "Your Activity" msgstr "" @@ -76986,12 +76773,6 @@ msgstr "" msgid "or sign in with" msgstr "" -msgid "organization must match the item consumer's organization" -msgstr "" - -msgid "organization must match the item's organization" -msgstr "" - msgid "organizations can only be added to root groups and groups configured as CRM targets" msgstr ""