diff --git a/.ibm/pipelines/resources/config_map/dynamic-global-header-config.yaml b/.ibm/pipelines/resources/config_map/dynamic-global-header-config.yaml
index 951252503f..77cb5edb48 100644
--- a/.ibm/pipelines/resources/config_map/dynamic-global-header-config.yaml
+++ b/.ibm/pipelines/resources/config_map/dynamic-global-header-config.yaml
@@ -30,7 +30,7 @@ dynamicPlugins:
config:
priority: 90
props:
- title: Create...
+ title: Self-service
icon: add
to: create
- mountPoint: global.header/component
diff --git a/catalog-entities/marketplace/packages/red-hat-developer-hub-backstage-plugin-global-header.yaml b/catalog-entities/marketplace/packages/red-hat-developer-hub-backstage-plugin-global-header.yaml
index 18498aaee0..47d78f87a0 100644
--- a/catalog-entities/marketplace/packages/red-hat-developer-hub-backstage-plugin-global-header.yaml
+++ b/catalog-entities/marketplace/packages/red-hat-developer-hub-backstage-plugin-global-header.yaml
@@ -61,7 +61,7 @@ spec:
config:
priority: 90
props:
- title: Create...
+ title: Self-service
icon: add
to: create
- mountPoint: global.header/component
diff --git a/dynamic-plugins.default.yaml b/dynamic-plugins.default.yaml
index dfbde5284c..be2c592301 100644
--- a/dynamic-plugins.default.yaml
+++ b/dynamic-plugins.default.yaml
@@ -557,7 +557,7 @@ plugins:
config:
priority: 90
props:
- title: Create...
+ title: Self-service
icon: add
to: create
- mountPoint: global.header/component
diff --git a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json
index e5745b90ae..e2fe3576dc 100644
--- a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json
+++ b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json
@@ -29,7 +29,7 @@
},
"dependencies": {
"@mui/material": "5.16.14",
- "@red-hat-developer-hub/backstage-plugin-global-header": "1.0.0"
+ "@red-hat-developer-hub/backstage-plugin-global-header": "1.1.0"
},
"devDependencies": {
"@backstage/cli": "0.29.6",
diff --git a/e2e-tests/playwright/e2e/audit-log/catalog.spec.ts b/e2e-tests/playwright/e2e/audit-log/catalog.spec.ts
index a217e4930c..908a0540fa 100644
--- a/e2e-tests/playwright/e2e/audit-log/catalog.spec.ts
+++ b/e2e-tests/playwright/e2e/audit-log/catalog.spec.ts
@@ -89,7 +89,7 @@ test.describe("Audit Log check for Catalog Plugin", () => {
});
test("Should fetch logs for QueriedCatalogEntityFetch event and validate log structure and values", async () => {
- await uiHelper.clickButton("Create");
+ await uiHelper.clickButton("Self-service");
await validateCatalogLogEvent(
"QueriedCatalogEntityFetch",
"Queried entity fetch attempt",
@@ -101,7 +101,7 @@ test.describe("Audit Log check for Catalog Plugin", () => {
test("Should fetch logs for CatalogLocationCreation event and validate log structure and values", async () => {
const template =
"https://github.com/RoadieHQ/sample-service/blob/main/demo_template.yaml";
- await uiHelper.clickButton("Create");
+ await uiHelper.clickButton("Self-service");
await uiHelper.clickButton("Register Existing Component");
await catalogImport.analyzeComponent(template);
diff --git a/e2e-tests/playwright/e2e/audit-log/scaffold.spec.ts b/e2e-tests/playwright/e2e/audit-log/scaffold.spec.ts
index b5c5f0ad76..9909a29a13 100644
--- a/e2e-tests/playwright/e2e/audit-log/scaffold.spec.ts
+++ b/e2e-tests/playwright/e2e/audit-log/scaffold.spec.ts
@@ -22,7 +22,7 @@ test.describe("Audit Log check for Catalog Plugin", () => {
common = new Common(page);
catalogImport = new CatalogImport(page);
await common.loginAsGuest();
- await uiHelper.clickLink({ ariaLabel: "Create..." });
+ await uiHelper.clickLink({ ariaLabel: "Self-service" });
});
test("Should fetch logs for ScaffolderParameterSchemaFetch event and validate log structure and values", async ({
@@ -32,7 +32,7 @@ test.describe("Audit Log check for Catalog Plugin", () => {
await uiHelper.clickButton("Register Existing Component");
await catalogImport.registerExistingComponent(template, false);
await page.waitForTimeout(1000);
- await uiHelper.clickLink({ ariaLabel: "Create..." });
+ await uiHelper.clickLink({ ariaLabel: "Self-service" });
await common.waitForLoad();
await uiHelper.clickBtnInCard("Hello World 2", "Choose");
await LogUtils.validateLogEvent(
diff --git a/e2e-tests/playwright/e2e/authProviders/github-happy-path.spec.ts b/e2e-tests/playwright/e2e/authProviders/github-happy-path.spec.ts
index 505445e8f4..2686f5bb2e 100644
--- a/e2e-tests/playwright/e2e/authProviders/github-happy-path.spec.ts
+++ b/e2e-tests/playwright/e2e/authProviders/github-happy-path.spec.ts
@@ -130,7 +130,7 @@ test.describe.serial("GitHub Happy path", () => {
test("Register an existing component", async () => {
await uiHelper.openSidebar("Catalog");
await uiHelper.selectMuiBox("Kind", "Component");
- await uiHelper.clickButton("Create");
+ await uiHelper.clickButton("Self-service");
await uiHelper.clickButton("Register Existing Component");
await catalogImport.registerExistingComponent(component);
});
@@ -161,7 +161,7 @@ test.describe.serial("GitHub Happy path", () => {
});
test("Verify all 12 Software Templates appear in the Create page", async () => {
- await uiHelper.clickLink({ ariaLabel: "Create..." });
+ await uiHelper.clickLink({ ariaLabel: "Self-service" });
await uiHelper.verifyHeading("Templates");
for (const template of TEMPLATES) {
diff --git a/e2e-tests/playwright/e2e/catalog-scaffolded-from-link.spec.ts b/e2e-tests/playwright/e2e/catalog-scaffolded-from-link.spec.ts
index 4ea25193cb..240b11555c 100644
--- a/e2e-tests/playwright/e2e/catalog-scaffolded-from-link.spec.ts
+++ b/e2e-tests/playwright/e2e/catalog-scaffolded-from-link.spec.ts
@@ -39,7 +39,7 @@ test.describe.serial("Link Scaffolded Templates to Catalog Items", () => {
test("Register an Template", async () => {
await uiHelper.openSidebar("Catalog");
- await uiHelper.clickButton("Create");
+ await uiHelper.clickButton("Self-service");
await uiHelper.clickButton("Register Existing Component");
await catalogImport.registerExistingComponent(template, false);
});
@@ -47,7 +47,7 @@ test.describe.serial("Link Scaffolded Templates to Catalog Items", () => {
test("Create a React App using the newly registered Template", async () => {
test.setTimeout(130000);
await uiHelper.openSidebar("Catalog");
- await uiHelper.clickButton("Create");
+ await uiHelper.clickButton("Self-service");
await uiHelper.searchInputPlaceholder("Create React App Template");
await uiHelper.verifyText("Create React App Template");
await uiHelper.waitForTextDisappear("Add ArgoCD to an existing project");
diff --git a/e2e-tests/playwright/e2e/catalog-timestamp.spec.ts b/e2e-tests/playwright/e2e/catalog-timestamp.spec.ts
index 0ba48da31c..3dfb0f8702 100644
--- a/e2e-tests/playwright/e2e/catalog-timestamp.spec.ts
+++ b/e2e-tests/playwright/e2e/catalog-timestamp.spec.ts
@@ -31,7 +31,7 @@ test.describe("Test timestamp column on Catalog", () => {
});
test("Register an existing component and verify `Created At` column and value in the Catalog Page", async () => {
- await uiHelper.clickButton("Create");
+ await uiHelper.clickButton("Self-service");
await uiHelper.clickButton("Register Existing Component");
await catalogImport.registerExistingComponent(component);
await uiHelper.openSidebar("Catalog");
diff --git a/e2e-tests/playwright/e2e/default-global-header.spec.ts b/e2e-tests/playwright/e2e/default-global-header.spec.ts
index 03171af041..cf4434d77d 100644
--- a/e2e-tests/playwright/e2e/default-global-header.spec.ts
+++ b/e2e-tests/playwright/e2e/default-global-header.spec.ts
@@ -20,7 +20,7 @@ test.describe("Default Global Header", () => {
page,
}) => {
await expect(page.locator(`input[placeholder="Search..."]`)).toBeVisible();
- await uiHelper.verifyLink({ label: "Create..." });
+ await uiHelper.verifyLink({ label: "Self-service" });
await uiHelper.verifyLink({ label: "Support (external link)" });
await uiHelper.verifyLink({ label: "Notifications" });
expect(await uiHelper.isBtnVisible("rhdh-qe-2")).toBeTruthy();
@@ -31,9 +31,9 @@ test.describe("Default Global Header", () => {
expect(await uiHelper.isBtnVisible("Settings")).toBeFalsy();
});
- test("Verify that clicking on Create button opens the Software Templates page", async () => {
- await uiHelper.clickLink({ ariaLabel: "Create..." });
- await uiHelper.verifyHeading("Software Templates");
+ test("Verify that clicking on Self-service button opens the Templates page", async () => {
+ await uiHelper.clickLink({ ariaLabel: "Self-service" });
+ await uiHelper.verifyHeading("Self-service");
});
test("Verify that clicking on Support button opens a new tab", async ({
diff --git a/e2e-tests/playwright/e2e/plugins/bulk-import.spec.ts b/e2e-tests/playwright/e2e/plugins/bulk-import.spec.ts
index 19cfa5dced..8a183a4a32 100644
--- a/e2e-tests/playwright/e2e/plugins/bulk-import.spec.ts
+++ b/e2e-tests/playwright/e2e/plugins/bulk-import.spec.ts
@@ -272,7 +272,7 @@ test.describe
test('Verify repo from "register existing component" are displayed in bulk import Added repositories', async () => {
// Register Existing Component
await uiHelper.openSidebar("Catalog");
- await uiHelper.clickButton("Create");
+ await uiHelper.clickButton("Self-service");
await uiHelper.clickButton("Register Existing Component");
await catalogImport.registerExistingComponent(
existingComponentDetails.url,
diff --git a/e2e-tests/playwright/e2e/plugins/http-request.spec.ts b/e2e-tests/playwright/e2e/plugins/http-request.spec.ts
index 49cf8e426f..86ed846b5b 100644
--- a/e2e-tests/playwright/e2e/plugins/http-request.spec.ts
+++ b/e2e-tests/playwright/e2e/plugins/http-request.spec.ts
@@ -23,7 +23,7 @@ test.describe("Testing scaffolder-backend-module-http-request to invoke an exter
test("Create a software template using http-request plugin", async () => {
test.setTimeout(130000);
- await uiHelper.clickLink({ ariaLabel: "Create..." });
+ await uiHelper.clickLink({ ariaLabel: "Self-service" });
await uiHelper.verifyHeading("Templates");
await uiHelper.clickButton("Register Existing Component");
await catalogImport.registerExistingComponent(template, false);
@@ -34,7 +34,7 @@ test.describe("Testing scaffolder-backend-module-http-request to invoke an exter
await uiHelper.clickLink("Test HTTP Request");
await uiHelper.verifyHeading("Test HTTP Request");
await uiHelper.clickLink("Launch Template");
- await uiHelper.verifyHeading("Software Templates");
+ await uiHelper.verifyHeading("Self-service");
await uiHelper.clickButton("Create");
//Checking for Http Status 200
await uiHelper.verifyText("200", false);
diff --git a/e2e-tests/playwright/e2e/plugins/kubernetes-actions/kubernetes-actions.spec.ts b/e2e-tests/playwright/e2e/plugins/kubernetes-actions/kubernetes-actions.spec.ts
index 5c21f32633..8a6901e3d2 100644
--- a/e2e-tests/playwright/e2e/plugins/kubernetes-actions/kubernetes-actions.spec.ts
+++ b/e2e-tests/playwright/e2e/plugins/kubernetes-actions/kubernetes-actions.spec.ts
@@ -18,12 +18,12 @@ test.describe("Test Kubernetes Actions plugin", () => {
kubeClient = new KubeClient();
await common.loginAsGuest();
- await uiHelper.clickLink({ ariaLabel: "Create..." });
+ await uiHelper.clickLink({ ariaLabel: "Self-service" });
});
test("Creates kubernetes namespace", async () => {
namespace = `test-kubernetes-actions-${Date.now()}`;
- await uiHelper.verifyHeading("Software Templates");
+ await uiHelper.verifyHeading("Self-service");
await uiHelper.clickBtnInCard("Create a kubernetes namespace", "Choose");
await uiHelper.waitForTitle("Create a kubernetes namespace", 2);
diff --git a/e2e-tests/playwright/e2e/plugins/rbac/rbac.spec.ts b/e2e-tests/playwright/e2e/plugins/rbac/rbac.spec.ts
index f9249a2d05..363435963f 100644
--- a/e2e-tests/playwright/e2e/plugins/rbac/rbac.spec.ts
+++ b/e2e-tests/playwright/e2e/plugins/rbac/rbac.spec.ts
@@ -480,7 +480,7 @@ test.describe.serial("Test RBAC", () => {
await uiHelper.openSidebar("Catalog");
await uiHelper.selectMuiBox("Kind", "Component");
await uiHelper.verifyTableIsEmpty();
- await uiHelper.clickLink({ ariaLabel: "Create..." });
+ await uiHelper.clickLink({ ariaLabel: "Self-service" });
await page.reload();
await uiHelper.verifyText(
"No templates found that match your filter. Learn more about",
@@ -495,7 +495,7 @@ test.describe.serial("Test RBAC", () => {
});
test("Test catalog-entity create is allowed", async () => {
- await uiHelper.clickLink({ ariaLabel: "Create..." });
+ await uiHelper.clickLink({ ariaLabel: "Self-service" });
expect(await uiHelper.isLinkVisible("Register Existing Component"));
await uiHelper.clickButton("Register Existing Component");
const catalogImport = new CatalogImport(page);
diff --git a/e2e-tests/playwright/utils/navbar.ts b/e2e-tests/playwright/utils/navbar.ts
index 8e146bb28e..2513d7f33f 100644
--- a/e2e-tests/playwright/utils/navbar.ts
+++ b/e2e-tests/playwright/utils/navbar.ts
@@ -1,10 +1,9 @@
export type SidebarTabs =
| "Catalog"
- | "Create"
| "Settings"
| "My Group"
| "Home"
- | "Create..."
+ | "Self-service"
| "Learning Paths"
| "Extensions"
| "Bulk import"
diff --git a/packages/app/src/components/AppBase/AppBase.tsx b/packages/app/src/components/AppBase/AppBase.tsx
index a92c861856..b4a3ee637f 100644
--- a/packages/app/src/components/AppBase/AppBase.tsx
+++ b/packages/app/src/components/AppBase/AppBase.tsx
@@ -97,9 +97,7 @@ const AppBase = () => {
+
}
>
diff --git a/packages/app/src/components/DynamicRoot/DynamicRoot.tsx b/packages/app/src/components/DynamicRoot/DynamicRoot.tsx
index 7ccbb588a5..a1ab15fd47 100644
--- a/packages/app/src/components/DynamicRoot/DynamicRoot.tsx
+++ b/packages/app/src/components/DynamicRoot/DynamicRoot.tsx
@@ -20,6 +20,7 @@ import extractDynamicConfig, {
DynamicRoute,
} from '../../utils/dynamicUI/extractDynamicConfig';
import initializeRemotePlugins from '../../utils/dynamicUI/initializeRemotePlugins';
+import { catalogTranslations } from '../catalog/translations/catalog';
import { MenuIcon } from '../Root/MenuIcon';
import CommonIcons from './CommonIcons';
import defaultAppComponents from './defaultAppComponents';
@@ -458,6 +459,10 @@ export const DynamicRoot = ({
api => !remoteApis.some(remoteApi => remoteApi.api.id === api.api.id),
);
app.current = createApp({
+ __experimentalTranslations: {
+ availableLanguages: ['en'],
+ resources: [catalogTranslations],
+ },
apis: [...filteredStaticApis, ...remoteApis],
bindRoutes({ bind }) {
bindAppRoutes(bind, resolvedRouteBindingTargets, routeBindings);
diff --git a/packages/app/src/components/catalog/translations/catalog-en.ts b/packages/app/src/components/catalog/translations/catalog-en.ts
new file mode 100644
index 0000000000..34b80f9598
--- /dev/null
+++ b/packages/app/src/components/catalog/translations/catalog-en.ts
@@ -0,0 +1,12 @@
+import { createTranslationMessages } from '@backstage/core-plugin-api/alpha';
+import { catalogTranslationRef } from '@backstage/plugin-catalog/alpha';
+
+const en = createTranslationMessages({
+ ref: catalogTranslationRef,
+ full: false, // False means that this is a partial translation
+ messages: {
+ 'indexPage.createButtonTitle': 'Self-service',
+ },
+});
+
+export default en;
diff --git a/packages/app/src/components/catalog/translations/catalog.ts b/packages/app/src/components/catalog/translations/catalog.ts
new file mode 100644
index 0000000000..6475233edd
--- /dev/null
+++ b/packages/app/src/components/catalog/translations/catalog.ts
@@ -0,0 +1,9 @@
+import { createTranslationResource } from '@backstage/core-plugin-api/alpha';
+import { catalogTranslationRef } from '@backstage/plugin-catalog/alpha';
+
+export const catalogTranslations = createTranslationResource({
+ ref: catalogTranslationRef,
+ translations: {
+ en: () => import('./catalog-en'),
+ },
+});
diff --git a/packages/app/src/consts.ts b/packages/app/src/consts.ts
index 1cb2215f4c..8594bebaa5 100644
--- a/packages/app/src/consts.ts
+++ b/packages/app/src/consts.ts
@@ -30,7 +30,7 @@ export const DefaultMainMenuItems = {
priority: 60,
},
'default.create': {
- title: 'Create...',
+ title: 'Self-service',
icon: 'add',
to: 'create',
priority: 50,
diff --git a/yarn.lock b/yarn.lock
index 6102382f5f..bc679662f9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -13148,27 +13148,6 @@ __metadata:
languageName: node
linkType: hard
-"@mui/styled-engine@npm:5.16.13":
- version: 5.16.13
- resolution: "@mui/styled-engine@npm:5.16.13"
- dependencies:
- "@babel/runtime": ^7.23.9
- "@emotion/cache": ^11.13.5
- csstype: ^3.1.3
- prop-types: ^15.8.1
- peerDependencies:
- "@emotion/react": ^11.4.1
- "@emotion/styled": ^11.3.0
- react: ^17.0.0 || ^18.0.0 || ^19.0.0
- peerDependenciesMeta:
- "@emotion/react":
- optional: true
- "@emotion/styled":
- optional: true
- checksum: d9459ef4baac056d1a65e351e084b2fe1eb30516907fc48166f570c60e3db3cb30de2d0af2bf22a8caa004bf2c37a1b831ccad1069b1d03cfae202c247967e44
- languageName: node
- linkType: hard
-
"@mui/styled-engine@npm:5.16.14, @mui/styled-engine@npm:^5.16.14":
version: 5.16.14
resolution: "@mui/styled-engine@npm:5.16.14"
@@ -16902,9 +16881,9 @@ __metadata:
languageName: node
linkType: hard
-"@red-hat-developer-hub/backstage-plugin-global-header@npm:1.0.0":
- version: 1.0.0
- resolution: "@red-hat-developer-hub/backstage-plugin-global-header@npm:1.0.0"
+"@red-hat-developer-hub/backstage-plugin-global-header@npm:1.1.0":
+ version: 1.1.0
+ resolution: "@red-hat-developer-hub/backstage-plugin-global-header@npm:1.1.0"
dependencies:
"@backstage/catalog-model": ^1.7.3
"@backstage/core-components": ^0.16.3
@@ -16921,15 +16900,15 @@ __metadata:
"@backstage/plugin-search-react": ^1.8.5
"@backstage/plugin-signals-react": ^0.0.9
"@backstage/theme": ^0.6.3
- "@mui/icons-material": 5.16.13
- "@mui/material": 5.16.13
- "@mui/styled-engine": 5.16.13
+ "@mui/icons-material": 5.16.14
+ "@mui/material": 5.16.14
+ "@mui/styled-engine": 5.16.14
"@scalprum/react-core": 0.9.3
react-use: ^17.5.0
peerDependencies:
react: ^16.13.1 || ^17.0.0 || ^18.0.0
react-router-dom: ^6.0.0
- checksum: 6500dfcac091608b4eb466c1702f28934a276dd7cbf04aaafca167c74c605c6a520dfaa425f8669d21f5365e46b830a6acbb291206fe5b67bf7fde742823a586
+ checksum: 1ea671962219deb0a927d3bc93c54cc5e369824b3cf316f2bb1a6c0d2e0577a058d7449bd6dcd146ef2ad513ecd62b6a48356424a0372605a7e7ce397ab46b43
languageName: node
linkType: hard
@@ -41054,7 +41033,7 @@ __metadata:
"@backstage/cli": 0.29.6
"@janus-idp/cli": 3.3.0
"@mui/material": 5.16.14
- "@red-hat-developer-hub/backstage-plugin-global-header": 1.0.0
+ "@red-hat-developer-hub/backstage-plugin-global-header": 1.1.0
typescript: 5.8.2
languageName: unknown
linkType: soft