">
-
-
- {{ 'SUMMARY.PROJECT_HELM_CHART' | translate }}
-
-
- -
- {{
- summaryInformation?.chart_count
- ? summaryInformation?.chart_count
- : 0
- }}
-
-
-
{{ 'SUMMARY.PROJECT_MEMBER' | translate }}
diff --git a/src/portal/src/app/services/event-service/event.service.ts b/src/portal/src/app/services/event-service/event.service.ts
index c920edc5937..88d5e28bd14 100644
--- a/src/portal/src/app/services/event-service/event.service.ts
+++ b/src/portal/src/app/services/event-service/event.service.ts
@@ -82,4 +82,6 @@ export enum HarborEvent {
DELETE_ACCESSORY = 'deleteAccessory',
COPY_DIGEST = 'copyDigest',
REFRESH_BANNER_MESSAGE = 'refreshBannerMessage',
+ RETRIEVED_ICON = 'retrievedIcon',
+ THEME_CHANGE = 'themeChange',
}
diff --git a/src/portal/src/app/shared/components/list-repository-ro/list-repository-ro.component.ts b/src/portal/src/app/shared/components/list-repository-ro/list-repository-ro.component.ts
index f4636c80ad7..a73fd9945da 100644
--- a/src/portal/src/app/shared/components/list-repository-ro/list-repository-ro.component.ts
+++ b/src/portal/src/app/shared/components/list-repository-ro/list-repository-ro.component.ts
@@ -17,6 +17,7 @@ import { Repository } from '../../../../../ng-swagger-gen/models/repository';
import { SearchTriggerService } from '../global-search/search-trigger.service';
import { SessionService } from '../../services/session.service';
import { UN_LOGGED_PARAM, YES } from '../../../account/sign-in/sign-in.service';
+import { getRepoLink } from '../../../base/left-side-nav/interrogation-services/vulnerability-database/security-hub.interface';
@Component({
selector: 'list-repository-ro',
@@ -25,20 +26,13 @@ import { UN_LOGGED_PARAM, YES } from '../../../account/sign-in/sign-in.service';
})
export class ListRepositoryROComponent {
@Input() repositories: Repository[];
-
+ readonly getLink = getRepoLink;
constructor(
private router: Router,
private searchTrigger: SearchTriggerService,
private sessionService: SessionService
) {}
- getLink(projectId: number, repoName: string) {
- let projectName = repoName.split('/')[0];
- let repositorieName = projectName
- ? repoName.substr(projectName.length + 1)
- : repoName;
- return ['/harbor/projects', projectId, 'repositories', repositorieName];
- }
getQueryParams() {
if (this.sessionService.getCurrentUser()) {
return null;
diff --git a/src/portal/src/app/shared/directives/scroll/scroll-anchor.directive.spec.ts b/src/portal/src/app/shared/directives/scroll/scroll-anchor.directive.spec.ts
new file mode 100644
index 00000000000..2cb81a4bf62
--- /dev/null
+++ b/src/portal/src/app/shared/directives/scroll/scroll-anchor.directive.spec.ts
@@ -0,0 +1,9 @@
+import { ScrollManagerService } from './scroll-manager.service';
+import { ScrollAnchorDirective } from './scroll-anchor.directive';
+
+describe('ScrollAnchorDirective', () => {
+ it('should create an instance', () => {
+ const directive = new ScrollAnchorDirective(new ScrollManagerService());
+ expect(directive).toBeTruthy();
+ });
+});
diff --git a/src/portal/src/app/shared/directives/scroll/scroll-anchor.directive.ts b/src/portal/src/app/shared/directives/scroll/scroll-anchor.directive.ts
new file mode 100644
index 00000000000..d1a85b18757
--- /dev/null
+++ b/src/portal/src/app/shared/directives/scroll/scroll-anchor.directive.ts
@@ -0,0 +1,16 @@
+import { ScrollManagerService } from './scroll-manager.service';
+import { Directive, HostListener, Input } from '@angular/core';
+
+@Directive({
+ selector: '[appScrollAnchor]',
+})
+export class ScrollAnchorDirective {
+ @Input('appScrollAnchor') id: string | number;
+
+ constructor(private manager: ScrollManagerService) {}
+
+ @HostListener('click')
+ scroll() {
+ this.manager.scroll(this.id);
+ }
+}
diff --git a/src/portal/src/app/shared/directives/scroll/scroll-manager.service.spec.ts b/src/portal/src/app/shared/directives/scroll/scroll-manager.service.spec.ts
new file mode 100644
index 00000000000..88d1ee45ff1
--- /dev/null
+++ b/src/portal/src/app/shared/directives/scroll/scroll-manager.service.spec.ts
@@ -0,0 +1,8 @@
+import { ScrollManagerService } from './scroll-manager.service';
+
+describe('ScrollManagerDirective', () => {
+ it('should create an instance', () => {
+ const directive = new ScrollManagerService();
+ expect(directive).toBeTruthy();
+ });
+});
diff --git a/src/portal/src/app/shared/directives/scroll/scroll-manager.service.ts b/src/portal/src/app/shared/directives/scroll/scroll-manager.service.ts
new file mode 100644
index 00000000000..388a23dba5f
--- /dev/null
+++ b/src/portal/src/app/shared/directives/scroll/scroll-manager.service.ts
@@ -0,0 +1,21 @@
+import { ScrollSectionDirective } from './scroll-section.directive';
+import { Injectable } from '@angular/core';
+
+@Injectable({
+ providedIn: 'root',
+})
+export class ScrollManagerService {
+ private sections = new Map();
+
+ scroll(id: string | number) {
+ this.sections.get(id)!.scroll();
+ }
+
+ register(section: ScrollSectionDirective) {
+ this.sections.set(section.id, section);
+ }
+
+ remove(section: ScrollSectionDirective) {
+ this.sections.delete(section.id);
+ }
+}
diff --git a/src/portal/src/app/shared/directives/scroll/scroll-section.directive.spec.ts b/src/portal/src/app/shared/directives/scroll/scroll-section.directive.spec.ts
new file mode 100644
index 00000000000..107225855f5
--- /dev/null
+++ b/src/portal/src/app/shared/directives/scroll/scroll-section.directive.spec.ts
@@ -0,0 +1,12 @@
+import { ScrollManagerService } from './scroll-manager.service';
+import { ScrollSectionDirective } from './scroll-section.directive';
+
+describe('ScrollSectionDirective', () => {
+ it('should create an instance', () => {
+ const directive = new ScrollSectionDirective(
+ { nativeElement: document.createElement('div') },
+ new ScrollManagerService()
+ );
+ expect(directive).toBeTruthy();
+ });
+});
diff --git a/src/portal/src/app/shared/directives/scroll/scroll-section.directive.ts b/src/portal/src/app/shared/directives/scroll/scroll-section.directive.ts
new file mode 100644
index 00000000000..b6b29678bac
--- /dev/null
+++ b/src/portal/src/app/shared/directives/scroll/scroll-section.directive.ts
@@ -0,0 +1,28 @@
+import { ScrollManagerService } from './scroll-manager.service';
+import { Directive, ElementRef, Input, OnDestroy, OnInit } from '@angular/core';
+
+@Directive({
+ selector: '[appScrollSection]',
+})
+export class ScrollSectionDirective implements OnInit, OnDestroy {
+ @Input('appScrollSection') id: string | number;
+
+ constructor(
+ private host: ElementRef,
+ private manager: ScrollManagerService
+ ) {}
+
+ ngOnInit() {
+ this.manager.register(this);
+ }
+
+ ngOnDestroy() {
+ this.manager.remove(this);
+ }
+
+ scroll() {
+ this.host.nativeElement.scrollIntoView({
+ behavior: 'smooth',
+ });
+ }
+}
diff --git a/src/portal/src/app/shared/shared.module.ts b/src/portal/src/app/shared/shared.module.ts
index d9e90177bad..7211cf184b9 100644
--- a/src/portal/src/app/shared/shared.module.ts
+++ b/src/portal/src/app/shared/shared.module.ts
@@ -75,6 +75,9 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HarborDatetimePipe } from './pipes/harbor-datetime.pipe';
import { RemainingTimeComponent } from './components/remaining-time/remaining-time.component';
import { LabelSelectorComponent } from './components/label-selector/label-selector.component';
+import { ScrollSectionDirective } from './directives/scroll/scroll-section.directive';
+import { ScrollManagerService } from './directives/scroll/scroll-manager.service';
+import { ScrollAnchorDirective } from './directives/scroll/scroll-anchor.directive';
// ClarityIcons is publicly accessible from the browser's window object.
declare const ClarityIcons: ClarityIconsApi;
@@ -115,6 +118,8 @@ ClarityIcons.add({
MaxLengthExtValidatorDirective,
PortValidatorDirective,
DateValidatorDirective,
+ ScrollSectionDirective,
+ ScrollAnchorDirective,
InlineAlertComponent,
NewUserFormComponent,
MessageComponent,
@@ -154,6 +159,8 @@ ClarityIcons.add({
MaxLengthExtValidatorDirective,
PortValidatorDirective,
DateValidatorDirective,
+ ScrollSectionDirective,
+ ScrollAnchorDirective,
InlineAlertComponent,
NewUserFormComponent,
MessageComponent,
diff --git a/src/portal/src/app/shared/units/utils.ts b/src/portal/src/app/shared/units/utils.ts
index 516f8a837b2..ad38954acf0 100644
--- a/src/portal/src/app/shared/units/utils.ts
+++ b/src/portal/src/app/shared/units/utils.ts
@@ -1042,4 +1042,5 @@ export enum PageSizeMapKeys {
WORKER_LIST_COMPONENT_WORKER = 'WorkerListComponentWorker',
SCHEDULE_LIST_COMPONENT = 'ScheduleListComponent',
PENDING_LIST_COMPONENT = 'PendingListComponent',
+ SECURITY_HUB_VUL = 'SecurityHubComponent',
}
diff --git a/src/portal/src/i18n/lang/de-de-lang.json b/src/portal/src/i18n/lang/de-de-lang.json
index a55ee0b90cb..d2d8e792247 100644
--- a/src/portal/src/i18n/lang/de-de-lang.json
+++ b/src/portal/src/i18n/lang/de-de-lang.json
@@ -1593,7 +1593,7 @@
"PREHEAT_EXPLAIN": "Aufwärmen wird das Image dem P2P Netzwerk hinzufügen",
"CRITERIA_EXPLAIN": "Wie unter 'Deployment Sicherheit' im Konfiguration Tab",
"SKIP_CERT_VERIFY": "Aktiviere die Checkbox, falls die Remote-Registry ein selbsigniertes oder nicht-vertrauenswürdiges Zertifikat verwendet.",
- "NAME_TOOLTIP": "Der Name muss mindestens 2 Zeichen lang sein. Mit Kleinbuchstaben, Ziffern und ._-. Er muss mit Buchstaben oder Ziffern beginnen.",
+ "NAME_TOOLTIP": "Policy name consists of one or more groups of uppercase letter, lowercase letter or number; and groups are separated by a dot, underscore, or hyphen.",
"NEED_HELP": "Bitte den Systemadministrator um das Hinzufügen eines Providers"
},
"PAGINATION": {
@@ -1688,7 +1688,7 @@
"ACCESSORIES": "Anhänge",
"SUBJECT_ARTIFACT": "Subjekt Artefakt",
"CO_SIGN": "Cosign",
- "NOTARY": "Notary",
+ "NOTARY": "Notation",
"PLACEHOLDER": "Es konnten keine Anhänge gefunden werden!"
},
"CLEARANCES": {
@@ -1873,5 +1873,26 @@
"WARNING": "Warning",
"DANGER": "Danger",
"ENTER_MESSAGE": "Enter your message here"
+ },
+ "SECURITY_HUB": {
+ "SECURITY_HUB": "Security Hub",
+ "ARTIFACTS": "artifact(s)",
+ "SCANNED": "scanned",
+ "NOT_SCANNED": "not scanned",
+ "TOTAL_VUL": "Total Vulnerabilities",
+ "TOTAL_AND_FIXABLE": "{{totalNum}} total with {{fixableNum}} fixable",
+ "TOP_5_ARTIFACT": "Top 5 Most Dangerous Artifacts",
+ "TOP_5_CVE": "Top 5 Most Dangerous CVEs",
+ "CVE_ID": "CVE ID",
+ "VUL": "Vulnerabilities",
+ "CVE": "CVEs",
+ "FILTER_BY": "Filter by",
+ "OPTION_ALL": "All",
+ "OPTION_PROJECT_ID_NAME": "Project id or name",
+ "SEARCH": "SEARCH",
+ "REPO_NAME": "Repository Name",
+ "TOOLTIP": "All filters except CVSS3 only support exact matches",
+ "NO_VUL": "We could not find any vulnerability",
+ "INVALID_VALUE": "Invalid range"
}
}
diff --git a/src/portal/src/i18n/lang/en-us-lang.json b/src/portal/src/i18n/lang/en-us-lang.json
index 2aa6a5217e2..736c25a9fa4 100644
--- a/src/portal/src/i18n/lang/en-us-lang.json
+++ b/src/portal/src/i18n/lang/en-us-lang.json
@@ -1594,7 +1594,7 @@
"PREHEAT_EXPLAIN": "Preheat will migrate the image to the p2p network",
"CRITERIA_EXPLAIN": "As specified in 'Deployment security' section under Configuration tab",
"SKIP_CERT_VERIFY": "Check this box to skip certificate verification when the remote provider uses a self-signed or untrusted certificate.",
- "NAME_TOOLTIP": "Policy name should be at least 2 characters long with lower case characters, numbers and ._- and must be start with characters or numbers.",
+ "NAME_TOOLTIP": "Policy name consists of one or more groups of uppercase letter, lowercase letter or number; and groups are separated by a dot, underscore, or hyphen.",
"NEED_HELP": "Please ask your system admin to add a provider first"
},
"PAGINATION": {
@@ -1689,7 +1689,7 @@
"ACCESSORIES": "Accessories",
"SUBJECT_ARTIFACT": "Subject Artifact",
"CO_SIGN": "Cosign",
- "NOTARY": "Notary",
+ "NOTARY": "Notation",
"PLACEHOLDER": "We couldn't find any accessories!"
},
"CLEARANCES": {
@@ -1874,5 +1874,26 @@
"WARNING": "Warning",
"DANGER": "Danger",
"ENTER_MESSAGE": "Enter your message here"
+ },
+ "SECURITY_HUB": {
+ "SECURITY_HUB": "Security Hub",
+ "ARTIFACTS": "artifact(s)",
+ "SCANNED": "scanned",
+ "NOT_SCANNED": "not scanned",
+ "TOTAL_VUL": "Total Vulnerabilities",
+ "TOTAL_AND_FIXABLE": "{{totalNum}} total with {{fixableNum}} fixable",
+ "TOP_5_ARTIFACT": "Top 5 Most Dangerous Artifacts",
+ "TOP_5_CVE": "Top 5 Most Dangerous CVEs",
+ "CVE_ID": "CVE ID",
+ "VUL": "Vulnerabilities",
+ "CVE": "CVEs",
+ "FILTER_BY": "Filter by",
+ "OPTION_ALL": "All",
+ "OPTION_PROJECT_ID_NAME": "Project Id or Name",
+ "SEARCH": "SEARCH",
+ "REPO_NAME": "Repository Name",
+ "TOOLTIP": "All filters except CVSS3 only support exact matches",
+ "NO_VUL": "We could not find any vulnerability",
+ "INVALID_VALUE": "Invalid range"
}
}
diff --git a/src/portal/src/i18n/lang/es-es-lang.json b/src/portal/src/i18n/lang/es-es-lang.json
index 22fb70c0f43..0a3ae0576b7 100644
--- a/src/portal/src/i18n/lang/es-es-lang.json
+++ b/src/portal/src/i18n/lang/es-es-lang.json
@@ -1590,7 +1590,7 @@
"PREHEAT_EXPLAIN": "Preheat will migrate the image to the p2p network",
"CRITERIA_EXPLAIN": "As specified in 'Deployment security' section under Configuration tab",
"SKIP_CERT_VERIFY": "Check this box to skip certificate verification when the remote provider uses a self-signed or untrusted certificate.",
- "NAME_TOOLTIP": "Policy name should be at least 2 characters long with lower case characters, numbers and ._- and must be start with characters or numbers.",
+ "NAME_TOOLTIP": "Policy name consists of one or more groups of uppercase letter, lowercase letter or number; and groups are separated by a dot, underscore, or hyphen.",
"NEED_HELP": "Please ask your system admin to add a provider first"
},
"PAGINATION": {
@@ -1685,7 +1685,7 @@
"ACCESSORIES": "Accessories",
"SUBJECT_ARTIFACT": "Subject Artifact",
"CO_SIGN": "Cosign",
- "NOTARY": "Notary",
+ "NOTARY": "Notation",
"PLACEHOLDER": "We couldn't find any accessories!"
},
"CLEARANCES": {
@@ -1870,5 +1870,26 @@
"WARNING": "Warning",
"DANGER": "Danger",
"ENTER_MESSAGE": "Enter your message here"
+ },
+ "SECURITY_HUB": {
+ "SECURITY_HUB": "Security Hub",
+ "ARTIFACTS": "artifact(s)",
+ "SCANNED": "scanned",
+ "NOT_SCANNED": "not scanned",
+ "TOTAL_VUL": "Total Vulnerabilities",
+ "TOTAL_AND_FIXABLE": "{{totalNum}} total with {{fixableNum}} fixable",
+ "TOP_5_ARTIFACT": "Top 5 Most Dangerous Artifacts",
+ "TOP_5_CVE": "Top 5 Most Dangerous CVEs",
+ "CVE_ID": "CVE ID",
+ "VUL": "Vulnerabilities",
+ "CVE": "CVEs",
+ "FILTER_BY": "Filter by",
+ "OPTION_ALL": "All",
+ "OPTION_PROJECT_ID_NAME": "Project id or name",
+ "SEARCH": "SEARCH",
+ "REPO_NAME": "Repository Name",
+ "TOOLTIP": "All filters except CVSS3 only support exact matches",
+ "NO_VUL": "We could not find any vulnerability",
+ "INVALID_VALUE": "Invalid range"
}
}
diff --git a/src/portal/src/i18n/lang/fr-fr-lang.json b/src/portal/src/i18n/lang/fr-fr-lang.json
index 6e02fc0f705..e0a3c0894a0 100644
--- a/src/portal/src/i18n/lang/fr-fr-lang.json
+++ b/src/portal/src/i18n/lang/fr-fr-lang.json
@@ -1560,7 +1560,7 @@
"PREHEAT_EXPLAIN": "Le préchauffage migrera l'image vers le réseau p2p",
"CRITERIA_EXPLAIN": "Comme spécifié dans la section 'Sécurité de déploiement' dans l'onglet Configuration",
"SKIP_CERT_VERIFY": "Cochez cette case pour ignorer la vérification du certificat lorsque le fournisseur distant utilise un certificat auto-signé ou non approuvé.",
- "NAME_TOOLTIP": "Le nom de la stratégie doit comporter au moins 2 caractères avec des caractères minuscules, des chiffres et ._- et doit commencer par des caractères ou des chiffres.",
+ "NAME_TOOLTIP": "Policy name consists of one or more groups of uppercase letter, lowercase letter or number; and groups are separated by a dot, underscore, or hyphen.",
"NEED_HELP": "Veuillez d'abord demander à votre administrateur système d'ajouter un fournisseur"
},
"PAGINATION": {
@@ -1655,7 +1655,7 @@
"ACCESSORIES": "Accessoires",
"SUBJECT_ARTIFACT": "Sujet de l'artefact",
"CO_SIGN": "Cosign",
- "NOTARY": "Notary",
+ "NOTARY": "Notation",
"PLACEHOLDER": "Nous n'avons trouvé aucun accessoire !"
},
"CLEARANCES": {
@@ -1840,5 +1840,26 @@
"WARNING": "Warning",
"DANGER": "Danger",
"ENTER_MESSAGE": "Enter your message here"
+ },
+ "SECURITY_HUB": {
+ "SECURITY_HUB": "Security Hub",
+ "ARTIFACTS": "artifact(s)",
+ "SCANNED": "scanned",
+ "NOT_SCANNED": "not scanned",
+ "TOTAL_VUL": "Total Vulnerabilities",
+ "TOTAL_AND_FIXABLE": "{{totalNum}} total with {{fixableNum}} fixable",
+ "TOP_5_ARTIFACT": "Top 5 Most Dangerous Artifacts",
+ "TOP_5_CVE": "Top 5 Most Dangerous CVEs",
+ "CVE_ID": "CVE ID",
+ "VUL": "Vulnerabilities",
+ "CVE": "CVEs",
+ "FILTER_BY": "Filter by",
+ "OPTION_ALL": "All",
+ "OPTION_PROJECT_ID_NAME": "Project id or name",
+ "SEARCH": "SEARCH",
+ "REPO_NAME": "Repository Name",
+ "TOOLTIP": "All filters except CVSS3 only support exact matches",
+ "NO_VUL": "We could not find any vulnerability",
+ "INVALID_VALUE": "Invalid range"
}
}
diff --git a/src/portal/src/i18n/lang/pt-br-lang.json b/src/portal/src/i18n/lang/pt-br-lang.json
index 997bcaa381a..c168266fc8f 100644
--- a/src/portal/src/i18n/lang/pt-br-lang.json
+++ b/src/portal/src/i18n/lang/pt-br-lang.json
@@ -1590,7 +1590,7 @@
"PREHEAT_EXPLAIN": "Pré-análise torna suas imagens mais confiáveis perante a rede P2P",
"CRITERIA_EXPLAIN": "Conforme especificado na 'Segurança da implantação', na aba Configurações.",
"SKIP_CERT_VERIFY": "Marque para ignorar certificados inválidos ou auto-assinados.",
- "NAME_TOOLTIP": "Nome da política deve ter no mínimo 2 caracteres. Pode conter ser composto de letras, números e dos símbolos ._- e deve começar com uma letra ou número.",
+ "NAME_TOOLTIP": "Policy name consists of one or more groups of uppercase letter, lowercase letter or number; and groups are separated by a dot, underscore, or hyphen.",
"NEED_HELP": "Solicite ao administrador do sistema a inclusão de um fornecedor."
},
"PAGINATION": {
@@ -1685,7 +1685,7 @@
"ACCESSORIES": "Accessories",
"SUBJECT_ARTIFACT": "Subject Artifact",
"CO_SIGN": "Cosign",
- "NOTARY": "Notary",
+ "NOTARY": "Notation",
"PLACEHOLDER": "We couldn't find any accessories!"
},
"CLEARANCES": {
@@ -1870,5 +1870,26 @@
"WARNING": "Warning",
"DANGER": "Danger",
"ENTER_MESSAGE": "Enter your message here"
+ },
+ "SECURITY_HUB": {
+ "SECURITY_HUB": "Security Hub",
+ "ARTIFACTS": "artifact(s)",
+ "SCANNED": "scanned",
+ "NOT_SCANNED": "not scanned",
+ "TOTAL_VUL": "Total Vulnerabilities",
+ "TOTAL_AND_FIXABLE": "{{totalNum}} total with {{fixableNum}} fixable",
+ "TOP_5_ARTIFACT": "Top 5 Most Dangerous Artifacts",
+ "TOP_5_CVE": "Top 5 Most Dangerous CVEs",
+ "CVE_ID": "CVE ID",
+ "VUL": "Vulnerabilities",
+ "CVE": "CVEs",
+ "FILTER_BY": "Filter by",
+ "OPTION_ALL": "All",
+ "OPTION_PROJECT_ID_NAME": "Project id or name",
+ "SEARCH": "SEARCH",
+ "REPO_NAME": "Repository Name",
+ "TOOLTIP": "All filters except CVSS3 only support exact matches",
+ "NO_VUL": "We could not find any vulnerability",
+ "INVALID_VALUE": "Invalid range"
}
}
diff --git a/src/portal/src/i18n/lang/tr-tr-lang.json b/src/portal/src/i18n/lang/tr-tr-lang.json
index cd5f5681388..c3f9da65ba0 100644
--- a/src/portal/src/i18n/lang/tr-tr-lang.json
+++ b/src/portal/src/i18n/lang/tr-tr-lang.json
@@ -1593,7 +1593,7 @@
"PREHEAT_EXPLAIN": "Preheat will migrate the image to the p2p network",
"CRITERIA_EXPLAIN": "As specified in 'Deployment security' section under Configuration tab",
"SKIP_CERT_VERIFY": "Check this box to skip certificate verification when the remote provider uses a self-signed or untrusted certificate.",
- "NAME_TOOLTIP": "Policy name should be at least 2 characters long with lower case characters, numbers and ._- and must be start with characters or numbers.",
+ "NAME_TOOLTIP": "Policy name consists of one or more groups of uppercase letter, lowercase letter or number; and groups are separated by a dot, underscore, or hyphen.",
"NEED_HELP": "Please ask your system admin to add a provider first"
},
"PAGINATION": {
@@ -1688,7 +1688,7 @@
"ACCESSORIES": "Accessories",
"SUBJECT_ARTIFACT": "Subject Artifact",
"CO_SIGN": "Cosign",
- "NOTARY": "Notary",
+ "NOTARY": "Notation",
"PLACEHOLDER": "We couldn't find any accessories!"
},
"CLEARANCES": {
@@ -1873,5 +1873,26 @@
"WARNING": "Warning",
"DANGER": "Danger",
"ENTER_MESSAGE": "Enter your message here"
+ },
+ "SECURITY_HUB": {
+ "SECURITY_HUB": "Security Hub",
+ "ARTIFACTS": "artifact(s)",
+ "SCANNED": "scanned",
+ "NOT_SCANNED": "not scanned",
+ "TOTAL_VUL": "Total Vulnerabilities",
+ "TOTAL_AND_FIXABLE": "{{totalNum}} total with {{fixableNum}} fixable",
+ "TOP_5_ARTIFACT": "Top 5 Most Dangerous Artifacts",
+ "TOP_5_CVE": "Top 5 Most Dangerous CVEs",
+ "CVE_ID": "CVE ID",
+ "VUL": "Vulnerabilities",
+ "CVE": "CVEs",
+ "FILTER_BY": "Filter by",
+ "OPTION_ALL": "All",
+ "OPTION_PROJECT_ID_NAME": "Project id or name",
+ "SEARCH": "SEARCH",
+ "REPO_NAME": "Repository Name",
+ "TOOLTIP": "All filters except CVSS3 only support exact matches",
+ "NO_VUL": "We could not find any vulnerability",
+ "INVALID_VALUE": "Invalid range"
}
}
diff --git a/src/portal/src/i18n/lang/zh-cn-lang.json b/src/portal/src/i18n/lang/zh-cn-lang.json
index 15b97d35a04..38bfcb7e25c 100644
--- a/src/portal/src/i18n/lang/zh-cn-lang.json
+++ b/src/portal/src/i18n/lang/zh-cn-lang.json
@@ -1590,7 +1590,7 @@
"PREHEAT_EXPLAIN": "预热功能可加载镜像至 P2P 网络",
"CRITERIA_EXPLAIN": "由项目设置下的'部署安全'项所指定",
"SKIP_CERT_VERIFY": "当远端服务使用自签或不可信证书时可勾选此项以跳过证书认证。",
- "NAME_TOOLTIP": "策略名称由小写字符、数字和._-/组成且至少2个字符并以字符或者数字开头。",
+ "NAME_TOOLTIP": "策略名称是一组或者多组由大小写字母或数字组成的字符串,多组字符串则由单个英文输入法下的点,下划线或者减号分隔开。",
"NEED_HELP": "请先让您的系统管理员添加提供商"
},
"PAGINATION": {
@@ -1685,7 +1685,7 @@
"ACCESSORIES": "附件",
"SUBJECT_ARTIFACT": "主体 Artifact",
"CO_SIGN": "Cosign",
- "NOTARY": "Notary",
+ "NOTARY": "Notation",
"PLACEHOLDER": "未发现任何附件!"
},
"CLEARANCES": {
@@ -1870,5 +1870,26 @@
"WARNING": "警告",
"DANGER": "危险",
"ENTER_MESSAGE": "请输入消息内容"
+ },
+ "SECURITY_HUB": {
+ "SECURITY_HUB": "安全中心",
+ "ARTIFACTS": "Artifact(s)",
+ "SCANNED": "已扫描",
+ "NOT_SCANNED": "未扫描",
+ "TOTAL_VUL": "漏洞总览",
+ "TOTAL_AND_FIXABLE": "{{totalNum}} 个漏洞中 {{fixableNum}} 可修复",
+ "TOP_5_ARTIFACT": "最危险的5个 Artifacts",
+ "TOP_5_CVE": "最危险的5个 CVEs",
+ "CVE_ID": "CVE ID",
+ "VUL": "漏洞",
+ "CVE": "CVEs",
+ "FILTER_BY": "过滤条件",
+ "OPTION_ALL": "全部",
+ "OPTION_PROJECT_ID_NAME": "项目 ID 或 名称",
+ "SEARCH": "搜索",
+ "REPO_NAME": "仓库名称",
+ "TOOLTIP": "CVSS3 除外的所有过滤项只支持精确匹配",
+ "NO_VUL": "未找到任何漏洞",
+ "INVALID_VALUE": "无效范围"
}
}
diff --git a/src/portal/src/i18n/lang/zh-tw-lang.json b/src/portal/src/i18n/lang/zh-tw-lang.json
index 0a3af0cd62c..a323837405c 100644
--- a/src/portal/src/i18n/lang/zh-tw-lang.json
+++ b/src/portal/src/i18n/lang/zh-tw-lang.json
@@ -1582,7 +1582,7 @@
"PREHEAT_EXPLAIN": "預熱將把映像檔遷移到 P2P 網絡",
"CRITERIA_EXPLAIN": "如配置標籤下 '部署安全性' 部分所指定",
"SKIP_CERT_VERIFY": "遠端提供者使用自簽名或不受信任的憑證時,勾選此框以跳過憑證驗證。",
- "NAME_TOOLTIP": "策略名稱應至少包含2個字元,使用小寫字母、數字和 ._-,並且必須以字母或數字開頭。",
+ "NAME_TOOLTIP": "Policy name consists of one or more groups of uppercase letter, lowercase letter or number; and groups are separated by a dot, underscore, or hyphen.",
"NEED_HELP": "請向您的系統管理員尋求幫助以先新增一個供應商"
},
"PAGINATION": {
@@ -1677,7 +1677,7 @@
"ACCESSORIES": "附件",
"SUBJECT_ARTIFACT": "Subject Artifact",
"CO_SIGN": "Cosign",
- "NOTARY": "Notary",
+ "NOTARY": "Notation",
"PLACEHOLDER": "找不到任何附件!"
},
"CLEARANCES": {
@@ -1862,5 +1862,26 @@
"WARNING": "Warning",
"DANGER": "Danger",
"ENTER_MESSAGE": "Enter your message here"
+ },
+ "SECURITY_HUB": {
+ "SECURITY_HUB": "Security Hub",
+ "ARTIFACTS": "artifact(s)",
+ "SCANNED": "scanned",
+ "NOT_SCANNED": "not scanned",
+ "TOTAL_VUL": "Total Vulnerabilities",
+ "TOTAL_AND_FIXABLE": "{{totalNum}} total with {{fixableNum}} fixable",
+ "TOP_5_ARTIFACT": "Top 5 Most Dangerous Artifacts",
+ "TOP_5_CVE": "Top 5 Most Dangerous CVEs",
+ "CVE_ID": "CVE ID",
+ "VUL": "Vulnerabilities",
+ "CVE": "CVEs",
+ "FILTER_BY": "Filter by",
+ "OPTION_ALL": "All",
+ "OPTION_PROJECT_ID_NAME": "Project id or name",
+ "SEARCH": "SEARCH",
+ "REPO_NAME": "Repository Name",
+ "TOOLTIP": "All filters except CVSS3 only support exact matches",
+ "NO_VUL": "We could not find any vulnerability",
+ "INVALID_VALUE": "Invalid range"
}
}