From 13cb1311d069b2acbab40fcf8b110281a4623e78 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Mon, 2 Feb 2026 20:57:44 -0500 Subject: [PATCH 1/8] fix(i18n): fix translation override issue Signed-off-by: Yi Cai --- .../app/src/components/AppBase/AppBase.tsx | 7 +- packages/app/src/translations/rhdh/de.ts | 1 - packages/app/src/translations/rhdh/es.ts | 1 - packages/app/src/translations/rhdh/fr.ts | 1 - packages/app/src/translations/rhdh/it.ts | 1 - packages/app/src/translations/rhdh/ja.ts | 1 - packages/app/src/translations/rhdh/ref.ts | 3 - .../app/src/translations/scaffolder/fr.ts | 247 +----------------- .../app/src/translations/scaffolder/it.ts | 1 + .../app/src/translations/scaffolder/ja.ts | 1 + .../translations/scaffolder/scaffolder-en.ts | 1 + 11 files changed, 5 insertions(+), 260 deletions(-) diff --git a/packages/app/src/components/AppBase/AppBase.tsx b/packages/app/src/components/AppBase/AppBase.tsx index cf92ec7781..af74c2b3db 100755 --- a/packages/app/src/components/AppBase/AppBase.tsx +++ b/packages/app/src/components/AppBase/AppBase.tsx @@ -105,12 +105,7 @@ const AppBase = () => { > {entityPage(entityTabOverrides)} - - } - > + }> {scaffolderFieldExtensions.map( ({ scope, module, importName, Component }) => ( diff --git a/packages/app/src/translations/rhdh/de.ts b/packages/app/src/translations/rhdh/de.ts index dc6e6f83bc..ec326bf41d 100644 --- a/packages/app/src/translations/rhdh/de.ts +++ b/packages/app/src/translations/rhdh/de.ts @@ -93,7 +93,6 @@ export default createTranslationMessages({ 'signIn.providers.saml.message': 'Mit SAML anmelden', // App translations - 'app.scaffolder.title': 'Self-Service', 'app.search.title': 'Suchen', 'app.search.resultType': 'Ergebnistyp', 'app.search.softwareCatalog': 'Software-Katalog', diff --git a/packages/app/src/translations/rhdh/es.ts b/packages/app/src/translations/rhdh/es.ts index 5189f32d11..cacc7a1012 100644 --- a/packages/app/src/translations/rhdh/es.ts +++ b/packages/app/src/translations/rhdh/es.ts @@ -94,7 +94,6 @@ export default createTranslationMessages({ 'signIn.providers.saml.message': 'Iniciar sesión con SAML', // App translations - 'app.scaffolder.title': 'Autoservicio', 'app.search.title': 'Buscar', 'app.search.resultType': 'Tipo de resultado', 'app.search.softwareCatalog': 'Catálogo de software', diff --git a/packages/app/src/translations/rhdh/fr.ts b/packages/app/src/translations/rhdh/fr.ts index 6e4388b6ab..36511bdbd9 100644 --- a/packages/app/src/translations/rhdh/fr.ts +++ b/packages/app/src/translations/rhdh/fr.ts @@ -85,7 +85,6 @@ export default createTranslationMessages({ 'catalog.entityPage.definition.title': 'Définition', 'catalog.entityPage.diagram.title': 'Diagramme du système', 'catalog.entityPage.workflows.title': 'Flux de travail', - 'app.scaffolder.title': 'Self-service', 'app.search.title': 'Recherche', 'app.search.resultType': 'Type de résultat', 'app.search.softwareCatalog': 'Catalogue de logiciels', diff --git a/packages/app/src/translations/rhdh/it.ts b/packages/app/src/translations/rhdh/it.ts index 1ba578e100..15c50ce532 100644 --- a/packages/app/src/translations/rhdh/it.ts +++ b/packages/app/src/translations/rhdh/it.ts @@ -85,7 +85,6 @@ export default createTranslationMessages({ 'catalog.entityPage.definition.title': 'Definizione', 'catalog.entityPage.diagram.title': 'Diagramma di sistema', 'catalog.entityPage.workflows.title': 'Flussi di lavoro', - 'app.scaffolder.title': 'Self-service', 'app.search.title': 'Ricerca', 'app.search.resultType': 'Tipo di risultato', 'app.search.softwareCatalog': 'Catalogo software', diff --git a/packages/app/src/translations/rhdh/ja.ts b/packages/app/src/translations/rhdh/ja.ts index 6216f104ec..1b7519f897 100644 --- a/packages/app/src/translations/rhdh/ja.ts +++ b/packages/app/src/translations/rhdh/ja.ts @@ -85,7 +85,6 @@ export default createTranslationMessages({ 'catalog.entityPage.definition.title': '定義', 'catalog.entityPage.diagram.title': 'システム図', 'catalog.entityPage.workflows.title': 'ワークフロー', - 'app.scaffolder.title': 'セルフサービス', 'app.search.title': '検索', 'app.search.resultType': '結果タイプ', 'app.search.softwareCatalog': 'ソフトウェアカタログ', diff --git a/packages/app/src/translations/rhdh/ref.ts b/packages/app/src/translations/rhdh/ref.ts index 8eebe36364..ae3267c652 100644 --- a/packages/app/src/translations/rhdh/ref.ts +++ b/packages/app/src/translations/rhdh/ref.ts @@ -157,9 +157,6 @@ export const rhdhMessages = { }, }, app: { - scaffolder: { - title: 'Self-service', - }, search: { title: 'Search', resultType: 'Result Type', diff --git a/packages/app/src/translations/scaffolder/fr.ts b/packages/app/src/translations/scaffolder/fr.ts index dc6240805a..b467e0df37 100644 --- a/packages/app/src/translations/scaffolder/fr.ts +++ b/packages/app/src/translations/scaffolder/fr.ts @@ -21,253 +21,8 @@ export default createTranslationMessages({ ref: scaffolderTranslationRef, full: false, messages: { + 'templateListPage.title': 'Self-service', 'templateListPage.contentHeader.registerExistingButtonTitle': 'Importer un dépôt Git existant', - 'aboutCard.launchTemplate': 'Modèle de lancement', - 'actionsPage.title': 'Actions installées', - 'actionsPage.pageTitle': 'Créer un nouveau composant', - 'actionsPage.subtitle': - "Il s'agit de la collection de toutes les actions installées", - 'actionsPage.content.emptyState.title': 'Aucune information à afficher', - 'actionsPage.content.emptyState.description': - "Aucune action n'est installée ou il y a eu un problème de communication avec le backend.", - 'actionsPage.content.searchFieldPlaceholder': 'Rechercher une action', - 'actionsPage.action.input': 'Saisir', - 'actionsPage.action.output': 'Sortir', - 'actionsPage.action.examples': 'Exemples', - 'fields.entityNamePicker.title': 'Nom', - 'fields.entityNamePicker.description': 'Nom unique du composant', - 'fields.entityPicker.title': 'Entité', - 'fields.entityPicker.description': 'Une entité du catalogue', - 'fields.entityTagsPicker.title': 'Mots-clés', - 'fields.entityTagsPicker.description': - 'Ajoutez toutes les balises pertinentes, appuyez sur « Entrée » pour ajouter de nouvelles balises. Format valide : [a-z0-9+#] séparés par [-], au maximum 63 caractères', - 'fields.multiEntityPicker.title': 'Entité', - 'fields.multiEntityPicker.description': 'Une entité du catalogue', - 'fields.myGroupsPicker.title': 'Entité', - 'fields.myGroupsPicker.description': 'Une entité du catalogue', - 'fields.ownedEntityPicker.title': 'Entité', - 'fields.ownedEntityPicker.description': 'Une entité du catalogue', - 'fields.ownerPicker.title': 'Propriétaire', - 'fields.ownerPicker.description': 'Le propriétaire du composant', - 'fields.azureRepoPicker.organization.title': 'Organisation', - 'fields.azureRepoPicker.organization.description': - "L'organisation à laquelle appartiendra ce dépôt", - 'fields.azureRepoPicker.project.title': 'Projet', - 'fields.azureRepoPicker.project.description': - 'Le projet auquel ce dépôt appartiendra', - 'fields.bitbucketRepoPicker.workspaces.title': - 'Espaces de travail autorisés', - 'fields.bitbucketRepoPicker.workspaces.inputTitle': 'Espaces de travail', - 'fields.bitbucketRepoPicker.workspaces.description': - "L'espace de travail auquel ce dépôt appartiendra", - 'fields.bitbucketRepoPicker.project.title': 'Projets autorisés', - 'fields.bitbucketRepoPicker.project.inputTitle': 'Projets', - 'fields.bitbucketRepoPicker.project.description': - 'Le projet auquel ce dépôt appartiendra', - 'fields.gerritRepoPicker.owner.title': 'Propriétaire', - 'fields.gerritRepoPicker.owner.description': - 'Le propriétaire du projet (facultatif)', - 'fields.gerritRepoPicker.parent.title': 'Mère', - 'fields.gerritRepoPicker.parent.description': - 'Le parent du projet auquel appartiendra le dépôt', - 'fields.giteaRepoPicker.owner.title': 'Propriétaire disponible', - 'fields.giteaRepoPicker.owner.inputTitle': 'Propriétaire', - 'fields.giteaRepoPicker.owner.description': - 'Espace de noms Gitea auquel appartiendra ce dépôt. Il peut s’agir du nom d’une organisation, d’un groupe, d’un sous-groupe, d’un utilisateur ou du projet.', - 'fields.githubRepoPicker.owner.title': 'Propriétaire disponible', - 'fields.githubRepoPicker.owner.inputTitle': 'Propriétaire', - 'fields.githubRepoPicker.owner.description': - "L'organisation, l'utilisateur ou le projet auquel ce dépôt appartiendra", - 'fields.gitlabRepoPicker.owner.title': 'Propriétaire disponible', - 'fields.gitlabRepoPicker.owner.inputTitle': 'Propriétaire', - 'fields.gitlabRepoPicker.owner.description': - 'Espace de noms GitLab auquel appartiendra ce référentiel. Il peut s’agir du nom d’une organisation, d’un groupe, d’un sous-groupe, d’un utilisateur ou du projet.', - 'fields.repoUrlPicker.host.title': 'Hôte', - 'fields.repoUrlPicker.host.description': - "L'hôte où le référentiel sera créé", - 'fields.repoUrlPicker.repository.title': 'Dépôts disponibles', - 'fields.repoUrlPicker.repository.inputTitle': 'Dépôt', - 'fields.repoUrlPicker.repository.description': 'Le nom du référentiel', - 'listTaskPage.title': 'Liste des tâches du modèle', - 'listTaskPage.pageTitle': 'Modèles de tâches', - 'listTaskPage.subtitle': 'Toutes les tâches qui ont été commencées', - 'listTaskPage.content.emptyState.title': 'Aucune information à afficher', - 'listTaskPage.content.emptyState.description': - "Il n'y a aucune tâche ou il y a eu un problème de communication avec le backend.", - 'listTaskPage.content.tableTitle': 'Tâches', - 'listTaskPage.content.tableCell.taskID': 'ID de tâche', - 'listTaskPage.content.tableCell.template': 'Modèle', - 'listTaskPage.content.tableCell.created': 'Créé', - 'listTaskPage.content.tableCell.owner': 'Propriétaire', - 'listTaskPage.content.tableCell.status': 'Statut', - 'ownerListPicker.title': 'Propriétaire de la tâche', - 'ownerListPicker.options.owned': 'Possédé', - 'ownerListPicker.options.all': 'Tous', - 'ongoingTask.title': 'Course de', - 'ongoingTask.pageTitle.hasTemplateName': 'Série de {{templateName}}', - 'ongoingTask.pageTitle.noTemplateName': "Course d'échafaudeurs", - 'ongoingTask.subtitle': 'Tâche {{taskId}}', - 'ongoingTask.cancelButtonTitle': 'Annuler', - 'ongoingTask.retryButtonTitle': 'Réessayer', - 'ongoingTask.startOverButtonTitle': 'Recommencer', - 'ongoingTask.hideLogsButtonTitle': 'Masquer les journaux', - 'ongoingTask.showLogsButtonTitle': 'Afficher les journaux', - 'ongoingTask.contextMenu.hideLogs': 'Masquer les journaux', - 'ongoingTask.contextMenu.showLogs': 'Afficher les journaux', - 'ongoingTask.contextMenu.hideButtonBar': 'Masquer la barre de boutons', - 'ongoingTask.contextMenu.retry': 'Réessayer', - 'ongoingTask.contextMenu.showButtonBar': 'Afficher la barre de boutons', - 'ongoingTask.contextMenu.startOver': 'Recommencer', - 'ongoingTask.contextMenu.cancel': 'Annuler', - 'templateEditorForm.stepper.emptyText': - "Il n'y a aucun paramètre de spécification dans le modèle à prévisualiser.", - 'renderSchema.tableCell.name': 'Nom', - 'renderSchema.tableCell.title': 'Titre', - 'renderSchema.tableCell.description': 'Description', - 'renderSchema.tableCell.type': 'Taper', - 'renderSchema.undefined': 'Aucun schéma défini', - 'templatingExtensions.title': 'Extensions de modèles', - 'templatingExtensions.pageTitle': 'Extensions de modèles', - 'templatingExtensions.subtitle': - "Il s'agit de la collection d'extensions de modèles disponibles", - 'templatingExtensions.content.emptyState.title': - 'Aucune information à afficher', - 'templatingExtensions.content.emptyState.description': - "Aucune extension de modèle n'est disponible ou il y a eu un problème de communication avec le backend.", - 'templatingExtensions.content.searchFieldPlaceholder': - 'Rechercher une extension', - 'templatingExtensions.content.filters.title': 'Filtres', - 'templatingExtensions.content.filters.notAvailable': - "Aucun filtre de modèle n'est défini.", - 'templatingExtensions.content.filters.metadataAbsent': - 'Les métadonnées du filtre ne sont pas disponibles', - 'templatingExtensions.content.filters.schema.input': 'Saisir', - 'templatingExtensions.content.filters.schema.arguments': 'Arguments', - 'templatingExtensions.content.filters.schema.output': 'Sortir', - 'templatingExtensions.content.filters.examples': 'Exemples', - 'templatingExtensions.content.functions.title': 'Fonctions', - 'templatingExtensions.content.functions.notAvailable': - "Aucune fonction de modèle globale n'est définie.", - 'templatingExtensions.content.functions.metadataAbsent': - 'Métadonnées de fonction indisponibles', - 'templatingExtensions.content.functions.schema.arguments': 'Arguments', - 'templatingExtensions.content.functions.schema.output': 'Sortir', - 'templatingExtensions.content.functions.examples': 'Exemples', - 'templatingExtensions.content.values.title': 'Valeurs', - 'templatingExtensions.content.values.notAvailable': - "Aucune valeur de modèle globale n'est définie.", - 'templateTypePicker.title': 'Catégories', - 'templateIntroPage.title': 'Gérer les modèles', - 'templateIntroPage.subtitle': - 'Modifiez, prévisualisez et essayez des modèles, des formulaires et des champs personnalisés', - 'templateFormPage.title': 'Éditeur de modèles', - 'templateFormPage.subtitle': - 'Modifier, prévisualiser et tester des modèles de formulaires', - 'templateCustomFieldPage.title': 'Explorateur de champs personnalisés', - 'templateCustomFieldPage.subtitle': - 'Modifier, prévisualiser et tester les champs personnalisés', - 'templateEditorPage.title': 'Éditeur de modèles', - 'templateEditorPage.subtitle': - 'Modifier, prévisualiser et tester des modèles et des formulaires de modèles', - 'templateEditorPage.dryRunResults.title': "Résultats de l'essai à blanc", - 'templateEditorPage.dryRunResultsList.title': 'Résultat {{resultId}}', - 'templateEditorPage.dryRunResultsList.downloadButtonTitle': - 'Télécharger au format .zip', - 'templateEditorPage.dryRunResultsList.deleteButtonTitle': - 'Supprimer le résultat', - 'templateEditorPage.dryRunResultsView.tab.files': 'Fichiers', - 'templateEditorPage.dryRunResultsView.tab.log': 'Enregistrer', - 'templateEditorPage.dryRunResultsView.tab.output': 'Sortir', - 'templateEditorPage.taskStatusStepper.skippedStepTitle': 'Ignoré', - 'templateEditorPage.customFieldExplorer.selectFieldLabel': - 'Choisissez une extension de champ personnalisée', - 'templateEditorPage.customFieldExplorer.fieldForm.title': - 'Options de champ', - 'templateEditorPage.customFieldExplorer.fieldForm.applyButtonTitle': - 'Appliquer', - 'templateEditorPage.customFieldExplorer.fieldPreview.title': - 'Aperçu du terrain', - 'templateEditorPage.customFieldExplorer.preview.title': - 'Spécifications du modèle', - 'templateEditorPage.templateEditorBrowser.closeConfirmMessage': - 'Es-tu sûr? Les modifications non enregistrées seront perdues', - 'templateEditorPage.templateEditorBrowser.saveIconTooltip': - 'Enregistrer tous les fichiers', - 'templateEditorPage.templateEditorBrowser.reloadIconTooltip': - 'Recharger le répertoire', - 'templateEditorPage.templateEditorBrowser.closeIconTooltip': - 'Fermer le répertoire', - 'templateEditorPage.templateEditorIntro.title': - "Commencez par choisir l'une des options ci-dessous", - 'templateEditorPage.templateEditorIntro.loadLocal.title': - 'Charger le répertoire des modèles', - 'templateEditorPage.templateEditorIntro.loadLocal.description': - "Chargez un répertoire de modèles local, vous permettant à la fois de modifier et d'essayer d'exécuter votre propre modèle.", - 'templateEditorPage.templateEditorIntro.loadLocal.unsupportedTooltip': - 'Uniquement pris en charge dans certains navigateurs basés sur Chromium avec la page chargée via HTTPS', - 'templateEditorPage.templateEditorIntro.createLocal.title': - 'Créer un nouveau modèle', - 'templateEditorPage.templateEditorIntro.createLocal.description': - "Créez un répertoire de modèles local, vous permettant à la fois de modifier et d'essayer d'exécuter votre propre modèle.", - 'templateEditorPage.templateEditorIntro.createLocal.unsupportedTooltip': - 'Uniquement pris en charge dans certains navigateurs basés sur Chromium avec la page chargée via HTTPS', - 'templateEditorPage.templateEditorIntro.formEditor.title': - 'Modèle de formulaire de terrain de jeu', - 'templateEditorPage.templateEditorIntro.formEditor.description': - 'Prévisualisez et modifiez un modèle de formulaire, soit en utilisant un exemple de modèle, soit en chargeant un modèle à partir du catalogue.', - 'templateEditorPage.templateEditorIntro.fieldExplorer.title': - 'Explorateur de champs personnalisés', - 'templateEditorPage.templateEditorIntro.fieldExplorer.description': - 'Affichez et jouez avec les extensions de champs personnalisés installées disponibles.', - 'templateEditorPage.templateEditorTextArea.saveIconTooltip': - 'Enregistrer le fichier', - 'templateEditorPage.templateEditorTextArea.refreshIconTooltip': - 'Recharger le fichier', - 'templateEditorPage.templateEditorTextArea.emptyStateParagraph': - 'Veuillez sélectionner une action dans le menu fichier.', - 'templateEditorPage.templateFormPreviewer.title': - 'Charger le modèle existant', - 'templateListPage.title': 'Créer un nouveau composant', - 'templateListPage.subtitle': - "Créez de nouveaux composants logiciels à l'aide de modèles standard dans votre organisation", - 'templateListPage.pageTitle': 'Créer un nouveau composant', - 'templateListPage.templateGroups.defaultTitle': 'Modèles', - 'templateListPage.templateGroups.otherTitle': 'Autres modèles', - 'templateListPage.contentHeader.supportButtonTitle': - 'Créez de nouveaux composants logiciels à l’aide de modèles standard. Différents modèles créent différents types de composants (services, sites Web, documentation, ...).', - 'templateListPage.additionalLinksForEntity.viewTechDocsTitle': - 'Voir TechDocs', - 'templateWizardPage.title': 'Créer un nouveau composant', - 'templateWizardPage.subtitle': - "Créez de nouveaux composants logiciels à l'aide de modèles standard dans votre organisation", - 'templateWizardPage.pageTitle': 'Créer un nouveau composant', - 'templateWizardPage.pageContextMenu.editConfigurationTitle': - 'Modifier la configuration', - 'templateEditorToolbar.customFieldExplorerTooltip': - 'Explorateur de champs personnalisés', - 'templateEditorToolbar.installedActionsDocumentationTooltip': - 'Documentation des actions installées', - 'templateEditorToolbar.templatingExtensionsDocumentationTooltip': - 'Documentation des extensions de modèles', - 'templateEditorToolbar.addToCatalogButton': 'Publier', - 'templateEditorToolbar.addToCatalogDialogTitle': - 'Publier les modifications', - 'templateEditorToolbar.addToCatalogDialogContent.stepsIntroduction': - 'Suivez les instructions ci-dessous pour créer ou mettre à jour un modèle :', - 'templateEditorToolbar.addToCatalogDialogContent.stepsListItems': - "Enregistrez les fichiers de modèle dans un répertoire local Créez une demande d'extraction vers un dépôt git nouveau ou existant Si le modèle existe déjà, les modifications seront reflétées dans le catalogue de logiciels une fois la demande d'extraction fusionnée Mais si vous créez un nouveau modèle, suivez la documentation liée ci-dessous pour enregistrer le nouveau dépôt de modèles dans le catalogue de logiciels", - 'templateEditorToolbar.addToCatalogDialogActions.documentationButton': - 'Accéder à la documentation', - 'templateEditorToolbar.addToCatalogDialogActions.documentationUrl': - 'https://backstage.io/docs/features/software-templates/adding-templates/', - 'templateEditorToolbarFileMenu.button': 'Déposer', - 'templateEditorToolbarFileMenu.options.openDirectory': - 'Ouvrir le répertoire des modèles', - 'templateEditorToolbarFileMenu.options.createDirectory': - 'Créer un répertoire de modèles', - 'templateEditorToolbarFileMenu.options.closeEditor': - "Fermer l'éditeur de modèles", - 'templateEditorToolbarTemplatesMenu.button': 'Modèles', }, }); diff --git a/packages/app/src/translations/scaffolder/it.ts b/packages/app/src/translations/scaffolder/it.ts index 09923f0e09..09f589137a 100644 --- a/packages/app/src/translations/scaffolder/it.ts +++ b/packages/app/src/translations/scaffolder/it.ts @@ -21,6 +21,7 @@ export default createTranslationMessages({ ref: scaffolderTranslationRef, full: false, messages: { + 'templateListPage.title': 'Self-service', 'templateListPage.contentHeader.registerExistingButtonTitle': 'Importa un repository Git esistente', }, diff --git a/packages/app/src/translations/scaffolder/ja.ts b/packages/app/src/translations/scaffolder/ja.ts index a222db7ac0..90f38fd484 100644 --- a/packages/app/src/translations/scaffolder/ja.ts +++ b/packages/app/src/translations/scaffolder/ja.ts @@ -21,6 +21,7 @@ export default createTranslationMessages({ ref: scaffolderTranslationRef, full: false, messages: { + 'templateListPage.title': 'セルフサービス', 'templateListPage.contentHeader.registerExistingButtonTitle': '既存の Git リポジトリーのインポート', }, diff --git a/packages/app/src/translations/scaffolder/scaffolder-en.ts b/packages/app/src/translations/scaffolder/scaffolder-en.ts index 259e05d5a8..7765a8e976 100644 --- a/packages/app/src/translations/scaffolder/scaffolder-en.ts +++ b/packages/app/src/translations/scaffolder/scaffolder-en.ts @@ -5,6 +5,7 @@ const en = createTranslationMessages({ ref: scaffolderTranslationRef, full: false, // False means that this is a partial translation messages: { + 'templateListPage.title': 'Self-service', 'templateListPage.contentHeader.registerExistingButtonTitle': 'Import an existing Git repository', }, From fa038a06c9346acd938402ff9a46747ac6e7caaa Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Tue, 3 Feb 2026 09:19:03 -0500 Subject: [PATCH 2/8] follow up changes Signed-off-by: Yi Cai --- .../translations/staticTranslationConfigs.ts | 4 +-- .../translationResourceGenerator.ts | 25 +++++++++++++++---- .../translationResourceProcessor.ts | 1 + 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/app/src/utils/translations/staticTranslationConfigs.ts b/packages/app/src/utils/translations/staticTranslationConfigs.ts index 2a993ebe64..35a2ae45c8 100644 --- a/packages/app/src/utils/translations/staticTranslationConfigs.ts +++ b/packages/app/src/utils/translations/staticTranslationConfigs.ts @@ -66,17 +66,15 @@ export const staticTranslationConfigs: StaticTranslationConfig[] = [ resource: rhdhTranslations, ref: rhdhTranslationRef, }, + // Refs that already have static resources above must not get an empty resource (would overwrite) ...[ catalogReactTranslationRef, - scaffolderTranslationRef, - userSettingsTranslationRef, searchTranslationRef, searchReactTranslationRef, scaffolderReactTranslationRef, apiDocsTranslationRef, catalogGraphTranslationRef, orgTranslationRef, - userSettingsTranslationRef, ].map((ref: TranslationRef) => ({ resource: createTranslationResource({ ref, diff --git a/packages/app/src/utils/translations/translationResourceGenerator.ts b/packages/app/src/utils/translations/translationResourceGenerator.ts index 82e38a5bdb..aa23589f01 100644 --- a/packages/app/src/utils/translations/translationResourceGenerator.ts +++ b/packages/app/src/utils/translations/translationResourceGenerator.ts @@ -25,6 +25,7 @@ const mergeTranslations = ( resource: InternalTranslationResource, jsonTranslations: { [key: string]: any }, ref: TranslationRef, + baseMessagesWinOverOverrides: boolean, ) => { const resourceWithNewTranslations: Record = {}; for (const res of resource.resources) { @@ -35,10 +36,11 @@ const mergeTranslations = ( jsonTranslations[res.language]; const baseMessages = await res.loader(); - const mergedMessages = { - ...baseMessages.messages, - ...overrides, - } as { [key: string]: string }; + const mergedMessages = ( + baseMessagesWinOverOverrides + ? { ...overrides, ...baseMessages.messages } + : { ...baseMessages.messages, ...overrides } + ) as { [key: string]: string }; return createTranslationMessagesWrapper(ref, mergedMessages, false); }; @@ -74,13 +76,26 @@ const mergeTranslations = ( return resourceWithNewTranslations; }; +export interface TranslationResourceGeneratorOptions { + /** When true, base (app/plugin) messages win over JSON overrides for the same key. Use for static app translations. */ + baseMessagesWinOverOverrides?: boolean; +} + export const translationResourceGenerator = ( ref: TranslationRef, resource: InternalTranslationResource, jsonTranslations: { [key: string]: any }, + options: TranslationResourceGeneratorOptions = {}, ): TranslationResource => { + const baseMessagesWinOverOverrides = + options.baseMessagesWinOverOverrides ?? false; return createTranslationResource({ ref, - translations: mergeTranslations(resource, jsonTranslations, ref), + translations: mergeTranslations( + resource, + jsonTranslations, + ref, + baseMessagesWinOverOverrides, + ), }); }; diff --git a/packages/app/src/utils/translations/translationResourceProcessor.ts b/packages/app/src/utils/translations/translationResourceProcessor.ts index 1c14cfbe1d..467062bffb 100644 --- a/packages/app/src/utils/translations/translationResourceProcessor.ts +++ b/packages/app/src/utils/translations/translationResourceProcessor.ts @@ -82,6 +82,7 @@ export function processStaticTranslationResource( ref, resource as any as InternalTranslationResource, overrideTranslations[resource.id], + { baseMessagesWinOverOverrides: true }, ); } From 2537c124114b4fbe165135c96d3565ac155b5158 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Tue, 3 Feb 2026 11:49:30 -0500 Subject: [PATCH 3/8] Revert "follow up changes" This reverts commit fa038a06c9346acd938402ff9a46747ac6e7caaa. --- .../translations/staticTranslationConfigs.ts | 4 ++- .../translationResourceGenerator.ts | 25 ++++--------------- .../translationResourceProcessor.ts | 1 - 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/packages/app/src/utils/translations/staticTranslationConfigs.ts b/packages/app/src/utils/translations/staticTranslationConfigs.ts index 35a2ae45c8..2a993ebe64 100644 --- a/packages/app/src/utils/translations/staticTranslationConfigs.ts +++ b/packages/app/src/utils/translations/staticTranslationConfigs.ts @@ -66,15 +66,17 @@ export const staticTranslationConfigs: StaticTranslationConfig[] = [ resource: rhdhTranslations, ref: rhdhTranslationRef, }, - // Refs that already have static resources above must not get an empty resource (would overwrite) ...[ catalogReactTranslationRef, + scaffolderTranslationRef, + userSettingsTranslationRef, searchTranslationRef, searchReactTranslationRef, scaffolderReactTranslationRef, apiDocsTranslationRef, catalogGraphTranslationRef, orgTranslationRef, + userSettingsTranslationRef, ].map((ref: TranslationRef) => ({ resource: createTranslationResource({ ref, diff --git a/packages/app/src/utils/translations/translationResourceGenerator.ts b/packages/app/src/utils/translations/translationResourceGenerator.ts index aa23589f01..82e38a5bdb 100644 --- a/packages/app/src/utils/translations/translationResourceGenerator.ts +++ b/packages/app/src/utils/translations/translationResourceGenerator.ts @@ -25,7 +25,6 @@ const mergeTranslations = ( resource: InternalTranslationResource, jsonTranslations: { [key: string]: any }, ref: TranslationRef, - baseMessagesWinOverOverrides: boolean, ) => { const resourceWithNewTranslations: Record = {}; for (const res of resource.resources) { @@ -36,11 +35,10 @@ const mergeTranslations = ( jsonTranslations[res.language]; const baseMessages = await res.loader(); - const mergedMessages = ( - baseMessagesWinOverOverrides - ? { ...overrides, ...baseMessages.messages } - : { ...baseMessages.messages, ...overrides } - ) as { [key: string]: string }; + const mergedMessages = { + ...baseMessages.messages, + ...overrides, + } as { [key: string]: string }; return createTranslationMessagesWrapper(ref, mergedMessages, false); }; @@ -76,26 +74,13 @@ const mergeTranslations = ( return resourceWithNewTranslations; }; -export interface TranslationResourceGeneratorOptions { - /** When true, base (app/plugin) messages win over JSON overrides for the same key. Use for static app translations. */ - baseMessagesWinOverOverrides?: boolean; -} - export const translationResourceGenerator = ( ref: TranslationRef, resource: InternalTranslationResource, jsonTranslations: { [key: string]: any }, - options: TranslationResourceGeneratorOptions = {}, ): TranslationResource => { - const baseMessagesWinOverOverrides = - options.baseMessagesWinOverOverrides ?? false; return createTranslationResource({ ref, - translations: mergeTranslations( - resource, - jsonTranslations, - ref, - baseMessagesWinOverOverrides, - ), + translations: mergeTranslations(resource, jsonTranslations, ref), }); }; diff --git a/packages/app/src/utils/translations/translationResourceProcessor.ts b/packages/app/src/utils/translations/translationResourceProcessor.ts index 467062bffb..1c14cfbe1d 100644 --- a/packages/app/src/utils/translations/translationResourceProcessor.ts +++ b/packages/app/src/utils/translations/translationResourceProcessor.ts @@ -82,7 +82,6 @@ export function processStaticTranslationResource( ref, resource as any as InternalTranslationResource, overrideTranslations[resource.id], - { baseMessagesWinOverOverrides: true }, ); } From 6f41ba4279ec49f2dc9f6a8d67e65babfccc01c4 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Tue, 3 Feb 2026 16:41:48 -0500 Subject: [PATCH 4/8] resolved review comments Signed-off-by: Yi Cai --- docs/customization.md | 11 ++ packages/app/src/components/Root/Root.tsx | 2 +- .../utils/dynamicUI/extractDynamicConfig.ts | 1 + .../dynamicUI/extractDynamicConfigFrontend.ts | 18 +-- translations/rhdh-fr.json | 107 ++++++++++++++++++ translations/rhdh-it.json | 107 ++++++++++++++++++ translations/rhdh-ja.json | 107 ++++++++++++++++++ 7 files changed, 344 insertions(+), 9 deletions(-) create mode 100644 translations/rhdh-fr.json create mode 100644 translations/rhdh-it.json create mode 100644 translations/rhdh-ja.json diff --git a/docs/customization.md b/docs/customization.md index 7248af9655..a9d90507a2 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -264,6 +264,17 @@ Example of JSON translation file, where the top-level key is the plugin translat } ``` +### Translation priority order + +Translations are resolved in this order (highest priority first): + +1. **app-config overrides** — Paths listed in `i18n.overrides` in `app-config.yaml`. This is the only level users should change for custom labels. +2. **`/translations` JSON files** — Files under `translations/` (e.g. in the repo or mounted at `/src/translations/`). **RHDH override files (`rhdh-.json`) must win over Backstage defaults (`backstage-.json`)** when the same key exists in both. For 1.9 this is ensured by processing files in order: `backstage-*.json`, then `community-plugins-*.json`, then `rhdh-*.json`. Going forward, the i18n CLI or build pipeline should enforce this order. +3. **Locale TS files** — App sources under `app/src/.../.ts` (e.g. `packages/app/src/translations/scaffolder/ja.ts`). Left as-is for 1.9. +4. **Fallback English** — Default messages in `app/src/.../ref.ts` (e.g. `rhdhMessages` in `packages/app/src/translations/rhdh/ref.ts`). + +Levels 2–4 are for internal management only; only level 1 is user-configurable. + ### Customizing Translations In a translation override JSON file, you can: diff --git a/packages/app/src/components/Root/Root.tsx b/packages/app/src/components/Root/Root.tsx index 2592d4cc34..4f8a08ba5d 100755 --- a/packages/app/src/components/Root/Root.tsx +++ b/packages/app/src/components/Root/Root.tsx @@ -594,7 +594,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => { {showAdministration && ( <> - + {renderMenuItems(true, true)} diff --git a/packages/app/src/utils/dynamicUI/extractDynamicConfig.ts b/packages/app/src/utils/dynamicUI/extractDynamicConfig.ts index df807c0497..1dad969341 100644 --- a/packages/app/src/utils/dynamicUI/extractDynamicConfig.ts +++ b/packages/app/src/utils/dynamicUI/extractDynamicConfig.ts @@ -32,6 +32,7 @@ export type DynamicRouteMenuItem = export type MenuItemConfig = { icon?: string; title?: string; + textKey?: string; priority?: number; parent?: string; }; diff --git a/packages/app/src/utils/dynamicUI/extractDynamicConfigFrontend.ts b/packages/app/src/utils/dynamicUI/extractDynamicConfigFrontend.ts index cd090b387c..2b48d2790d 100644 --- a/packages/app/src/utils/dynamicUI/extractDynamicConfigFrontend.ts +++ b/packages/app/src/utils/dynamicUI/extractDynamicConfigFrontend.ts @@ -28,14 +28,16 @@ export function compareMenuItems(a: MenuItem, b: MenuItem) { function convertMenuItemsRecordToArray( menuItemsRecord: Record, ): MenuItem[] { - return Object.keys(menuItemsRecord).map( - key => - ({ - ...menuItemsRecord[key], - children: [], - name: key, - }) as MenuItem, - ); + return Object.keys(menuItemsRecord).map(key => { + const config = menuItemsRecord[key]; + const { textKey, ...rest } = config; + return { + ...rest, + name: key, + children: [], + titleKey: textKey, + } as MenuItem; + }); } export function buildTree(menuItemsArray: MenuItem[]): MenuItem[] { diff --git a/translations/rhdh-fr.json b/translations/rhdh-fr.json new file mode 100644 index 0000000000..4f44813ab2 --- /dev/null +++ b/translations/rhdh-fr.json @@ -0,0 +1,107 @@ +{ + "catalog": { + "fr": { + "indexPage.createButtonTitle": "Self-service" + } + }, + "catalog-import": { + "fr": { + "defaultImportPage.headerTitle": "Importer un dépôt Git existant", + "importInfoCard.title": "Importer un dépôt Git existant" + } + }, + "scaffolder": { + "fr": { + "templateListPage.title": "Self-service", + "templateListPage.contentHeader.registerExistingButtonTitle": "Importer un dépôt Git existant" + } + }, + "rhdh": { + "fr": { + "menuItem.home": "Home", + "menuItem.myGroup_one": "Mon groupe", + "menuItem.myGroup_other": "Mes groupes", + "menuItem.catalog": "Catalogue", + "menuItem.apis": "APIs", + "menuItem.learningPaths": "Learning Paths", + "menuItem.selfService": "Self-service", + "menuItem.userSettings": "Paramètres utilisateur", + "menuItem.administration": "Administration", + "menuItem.extensions": "Extensions", + "menuItem.clusters": "Groupes", + "menuItem.rbac": "RBAC", + "menuItem.bulkImport": "Importation en masse", + "menuItem.docs": "Docs", + "menuItem.lighthouse": "Lighthouse", + "menuItem.techRadar": "Tech Radar", + "menuItem.orchestrator": "Orchestrateur", + "menuItem.adoptionInsights": "Adoption Insights", + "sidebar.menu": "Menu", + "sidebar.home": "Home", + "sidebar.homeLogo": "Logo de la maison", + "signIn.page.title": "Sélectionnez une méthode de connexion", + "signIn.providers.auth0.title": "Auth0", + "signIn.providers.auth0.message": "Connectez-vous avec Auth0", + "signIn.providers.atlassian.title": "Atlassian", + "signIn.providers.atlassian.message": "Connectez-vous avec Atlassian", + "signIn.providers.microsoft.title": "Microsoft", + "signIn.providers.microsoft.message": "Connectez-vous avec Microsoft", + "signIn.providers.bitbucket.title": "Bitbucket", + "signIn.providers.bitbucket.message": "Connectez-vous avec Bitbucket", + "signIn.providers.bitbucketServer.title": "Serveur Bitbucket", + "signIn.providers.bitbucketServer.message": "Connectez-vous à l'aide de Bitbucket Server", + "signIn.providers.github.title": "GitHub", + "signIn.providers.github.message": "Connectez-vous avec GitHub", + "signIn.providers.gitlab.title": "GitLab", + "signIn.providers.gitlab.message": "Connectez-vous avec GitLab", + "signIn.providers.google.title": "Google", + "signIn.providers.google.message": "Connectez-vous avec Google", + "signIn.providers.oidc.title": "OIDC", + "signIn.providers.oidc.message": "Connectez-vous avec OIDC", + "signIn.providers.okta.title": "Okta", + "signIn.providers.okta.message": "Connectez-vous avec Okta", + "signIn.providers.onelogin.title": "OneLogin", + "signIn.providers.onelogin.message": "Connectez-vous avec OneLogin", + "signIn.providers.saml.title": "SAML", + "signIn.providers.saml.message": "Connectez-vous en utilisant SAML", + "catalog.entityPage.overview.title": "Vue d'ensemble", + "catalog.entityPage.topology.title": "Topologie", + "catalog.entityPage.issues.title": "Problèmes", + "catalog.entityPage.pullRequests.title": "Extraire/Merger les Demandes", + "catalog.entityPage.ci.title": "CI", + "catalog.entityPage.cd.title": "CD", + "catalog.entityPage.kubernetes.title": "Kubernetes", + "catalog.entityPage.imageRegistry.title": "Registre d'images", + "catalog.entityPage.monitoring.title": "Surveillance", + "catalog.entityPage.lighthouse.title": "Lighthouse", + "catalog.entityPage.api.title": "API", + "catalog.entityPage.dependencies.title": "Dépendances", + "catalog.entityPage.docs.title": "Docs", + "catalog.entityPage.definition.title": "Définition", + "catalog.entityPage.diagram.title": "Diagramme du système", + "catalog.entityPage.workflows.title": "Flux de travail", + "app.search.title": "Recherche", + "app.search.resultType": "Type de résultat", + "app.search.softwareCatalog": "Catalogue de logiciels", + "app.search.filters.kind": "Type", + "app.search.filters.lifecycle": "Cycle de vie", + "app.search.filters.component": "Composant", + "app.search.filters.template": "Modèle", + "app.search.filters.experimental": "expérimental", + "app.search.filters.production": "production", + "app.learningPaths.title": "Learning Paths", + "app.learningPaths.error.title": "Impossible de récupérer les données.", + "app.learningPaths.error.unknownError": "Erreur inconnue", + "app.userSettings.infoCard.title": "Métadonnées RHDH", + "app.userSettings.infoCard.metadataCopied": "Métadonnées copiées dans le presse-papiers", + "app.userSettings.infoCard.copyMetadata": "Copier les métadonnées dans votre presse-papiers", + "app.userSettings.infoCard.showLess": "Afficher moins", + "app.userSettings.infoCard.showMore": "Afficher plus", + "app.errors.contactSupport": "Contacter le support", + "app.errors.goBack": "Retour", + "app.errors.notFound.message": "Nous n'avons pas pu trouver cette page", + "app.errors.notFound.additionalInfo": "La page que vous recherchez a peut-être été supprimée, son nom a peut-être été modifié ou elle est temporairement indisponible.", + "app.table.createdAt": "Créé à" + } + } +} diff --git a/translations/rhdh-it.json b/translations/rhdh-it.json new file mode 100644 index 0000000000..4549c8d881 --- /dev/null +++ b/translations/rhdh-it.json @@ -0,0 +1,107 @@ +{ + "catalog": { + "it": { + "indexPage.createButtonTitle": "Self-service" + } + }, + "catalog-import": { + "it": { + "defaultImportPage.headerTitle": "Importa un repository Git esistente", + "importInfoCard.title": "Importa un repository Git esistente" + } + }, + "scaffolder": { + "it": { + "templateListPage.title": "Self-service", + "templateListPage.contentHeader.registerExistingButtonTitle": "Importa un repository Git esistente" + } + }, + "rhdh": { + "it": { + "menuItem.home": "Home", + "menuItem.myGroup_one": "Il mio gruppo", + "menuItem.myGroup_other": "I miei gruppi", + "menuItem.catalog": "Catalogo", + "menuItem.apis": "API", + "menuItem.learningPaths": "Percorsi di apprendimento", + "menuItem.selfService": "Self-service", + "menuItem.userSettings": "Impostazioni utente", + "menuItem.administration": "Amministrazione", + "menuItem.extensions": "Estensioni", + "menuItem.clusters": "Cluster", + "menuItem.rbac": "RBAC", + "menuItem.bulkImport": "Importazione in blocco", + "menuItem.docs": "Documenti", + "menuItem.lighthouse": "Lighthouse", + "menuItem.techRadar": "Tech Radar", + "menuItem.orchestrator": "Orchestrator", + "menuItem.adoptionInsights": "Adoption Insights", + "sidebar.menu": "Menu", + "sidebar.home": "Home", + "sidebar.homeLogo": "Logo Home", + "signIn.page.title": "Selezionare un metodo di accesso", + "signIn.providers.auth0.title": "Auth0", + "signIn.providers.auth0.message": "Accesso tramite Auth0", + "signIn.providers.atlassian.title": "Atlassian", + "signIn.providers.atlassian.message": "Accesso tramite Atlassian", + "signIn.providers.microsoft.title": "Microsoft", + "signIn.providers.microsoft.message": "Accesso tramite Microsoft", + "signIn.providers.bitbucket.title": "Bitbucket", + "signIn.providers.bitbucket.message": "Accesso tramite Bitbucket", + "signIn.providers.bitbucketServer.title": "Bitbucket Server", + "signIn.providers.bitbucketServer.message": "Accesso tramite Bitbucket Server", + "signIn.providers.github.title": "GitHub", + "signIn.providers.github.message": "Accesso tramite GitHub", + "signIn.providers.gitlab.title": "GitLab", + "signIn.providers.gitlab.message": "Accesso tramite GitLab", + "signIn.providers.google.title": "Google", + "signIn.providers.google.message": "Accesso tramite Google", + "signIn.providers.oidc.title": "OIDC", + "signIn.providers.oidc.message": "Accesso tramite OIDC", + "signIn.providers.okta.title": "Okta", + "signIn.providers.okta.message": "Accesso tramite Okta", + "signIn.providers.onelogin.title": "OneLogin", + "signIn.providers.onelogin.message": "Accesso tramite OneLogin", + "signIn.providers.saml.title": "SAML", + "signIn.providers.saml.message": "Accesso tramite SAML", + "catalog.entityPage.overview.title": "Panoramica", + "catalog.entityPage.topology.title": "Topologia", + "catalog.entityPage.issues.title": "Problemi", + "catalog.entityPage.pullRequests.title": "Richieste di pull/merge", + "catalog.entityPage.ci.title": "CI", + "catalog.entityPage.cd.title": "CD", + "catalog.entityPage.kubernetes.title": "Kubernetes", + "catalog.entityPage.imageRegistry.title": "Registro delle immagini", + "catalog.entityPage.monitoring.title": "Monitoraggio", + "catalog.entityPage.lighthouse.title": "Lighthouse", + "catalog.entityPage.api.title": "API", + "catalog.entityPage.dependencies.title": "Dipendenze", + "catalog.entityPage.docs.title": "Documenti", + "catalog.entityPage.definition.title": "Definizione", + "catalog.entityPage.diagram.title": "Diagramma di sistema", + "catalog.entityPage.workflows.title": "Flussi di lavoro", + "app.search.title": "Ricerca", + "app.search.resultType": "Tipo di risultato", + "app.search.softwareCatalog": "Catalogo software", + "app.search.filters.kind": "Tipo", + "app.search.filters.lifecycle": "Ciclo di vita", + "app.search.filters.component": "Componente", + "app.search.filters.template": "Modello", + "app.search.filters.experimental": "sperimentale", + "app.search.filters.production": "produzione", + "app.learningPaths.title": "Percorsi di apprendimento", + "app.learningPaths.error.title": "Impossibile recuperare i dati.", + "app.learningPaths.error.unknownError": "Errore sconosciuto", + "app.userSettings.infoCard.title": "Metadati RHDH", + "app.userSettings.infoCard.metadataCopied": "Metadati copiati negli appunti", + "app.userSettings.infoCard.copyMetadata": "Copia i metadati negli appunti", + "app.userSettings.infoCard.showLess": "Mostra meno", + "app.userSettings.infoCard.showMore": "Mostra altro", + "app.errors.contactSupport": "Contattare l'assistenza", + "app.errors.goBack": "Indietro", + "app.errors.notFound.message": "Non è stato possibile trovare la pagina", + "app.errors.notFound.additionalInfo": "La pagina potrebbe essere stata rimossa, potrebbe aver cambiato nome o potrebbe non essere temporaneamente disponibile.", + "app.table.createdAt": "Creato alle" + } + } +} diff --git a/translations/rhdh-ja.json b/translations/rhdh-ja.json new file mode 100644 index 0000000000..4f22d1cd95 --- /dev/null +++ b/translations/rhdh-ja.json @@ -0,0 +1,107 @@ +{ + "catalog": { + "ja": { + "indexPage.createButtonTitle": "セルフサービス" + } + }, + "catalog-import": { + "ja": { + "defaultImportPage.headerTitle": "既存の Git リポジトリーのインポート", + "importInfoCard.title": "既存の Git リポジトリーのインポート" + } + }, + "scaffolder": { + "ja": { + "templateListPage.title": "セルフサービス", + "templateListPage.contentHeader.registerExistingButtonTitle": "既存の Git リポジトリーのインポート" + } + }, + "rhdh": { + "ja": { + "menuItem.home": "ホーム", + "menuItem.myGroup_one": "マイグループ", + "menuItem.myGroup_other": "マイグループ", + "menuItem.catalog": "カタログ", + "menuItem.apis": "API", + "menuItem.learningPaths": "ラーニングパス", + "menuItem.selfService": "セルフサービス", + "menuItem.userSettings": "ユーザー設定", + "menuItem.administration": "管理", + "menuItem.extensions": "拡張機能", + "menuItem.clusters": "クラスター", + "menuItem.rbac": "RBAC", + "menuItem.bulkImport": "一括インポート", + "menuItem.docs": "ドキュメント", + "menuItem.lighthouse": "Lighthouse", + "menuItem.techRadar": "Tech Radar", + "menuItem.orchestrator": "オーケストレーター", + "menuItem.adoptionInsights": "Adoption Insights", + "sidebar.menu": "メニュー", + "sidebar.home": "ホーム", + "sidebar.homeLogo": "ホームロゴ", + "signIn.page.title": "サインイン方法の選択", + "signIn.providers.auth0.title": "Auth0", + "signIn.providers.auth0.message": "Auth0 を使用してサインイン", + "signIn.providers.atlassian.title": "Atlassian", + "signIn.providers.atlassian.message": "Atlassian を使用してサインイン", + "signIn.providers.microsoft.title": "Microsoft", + "signIn.providers.microsoft.message": "Microsoft を使用してサインイン", + "signIn.providers.bitbucket.title": "Bitbucket", + "signIn.providers.bitbucket.message": "Bitbucket を使用してサインイン", + "signIn.providers.bitbucketServer.title": "Bitbucket Server", + "signIn.providers.bitbucketServer.message": "Bitbucket Server を使用してサインイン", + "signIn.providers.github.title": "GitHub", + "signIn.providers.github.message": "GitHub を使用してサインイン", + "signIn.providers.gitlab.title": "GitLab", + "signIn.providers.gitlab.message": "GitLab を使用してサインイン", + "signIn.providers.google.title": "Google", + "signIn.providers.google.message": "Google を使用してサインイン", + "signIn.providers.oidc.title": "OIDC", + "signIn.providers.oidc.message": "OIDC を使用してサインイン", + "signIn.providers.okta.title": "Okta", + "signIn.providers.okta.message": "Okta を使用してサインイン", + "signIn.providers.onelogin.title": "OneLogin", + "signIn.providers.onelogin.message": "OneLogin を使用してサインイン", + "signIn.providers.saml.title": "SAML", + "signIn.providers.saml.message": "SAML を使用してサインイン", + "catalog.entityPage.overview.title": "概要", + "catalog.entityPage.topology.title": "トポロジー", + "catalog.entityPage.issues.title": "イシュー", + "catalog.entityPage.pullRequests.title": "プル/マージリクエスト", + "catalog.entityPage.ci.title": "CI", + "catalog.entityPage.cd.title": "CD", + "catalog.entityPage.kubernetes.title": "Kubernetes", + "catalog.entityPage.imageRegistry.title": "イメージレジストリー", + "catalog.entityPage.monitoring.title": "モニタリング", + "catalog.entityPage.lighthouse.title": "Lighthouse", + "catalog.entityPage.api.title": "API", + "catalog.entityPage.dependencies.title": "依存関係", + "catalog.entityPage.docs.title": "ドキュメント", + "catalog.entityPage.definition.title": "定義", + "catalog.entityPage.diagram.title": "システム図", + "catalog.entityPage.workflows.title": "ワークフロー", + "app.search.title": "検索", + "app.search.resultType": "結果タイプ", + "app.search.softwareCatalog": "ソフトウェアカタログ", + "app.search.filters.kind": "種類", + "app.search.filters.lifecycle": "ライフサイクル", + "app.search.filters.component": "コンポーネント", + "app.search.filters.template": "テンプレート", + "app.search.filters.experimental": "実験的", + "app.search.filters.production": "実稼働", + "app.learningPaths.title": "ラーニングパス", + "app.learningPaths.error.title": "データを取得できませんでした。", + "app.learningPaths.error.unknownError": "不明なエラー", + "app.userSettings.infoCard.title": "RHDH メタデータ", + "app.userSettings.infoCard.metadataCopied": "メタデータがクリップボードにコピーされました", + "app.userSettings.infoCard.copyMetadata": "メタデータをクリップボードにコピーする", + "app.userSettings.infoCard.showLess": "簡易表示", + "app.userSettings.infoCard.showMore": "詳細表示", + "app.errors.contactSupport": "サポートにお問い合わせください", + "app.errors.goBack": "戻る", + "app.errors.notFound.message": "該当するページが見つかりませんでした", + "app.errors.notFound.additionalInfo": "お探しのページは削除されたか、名前が変更されたか、一時的に利用できない可能性があります。", + "app.table.createdAt": "作成日時" + } + } +} From 73a863625ad08c7f760a8ce5277e2db67c3636f3 Mon Sep 17 00:00:00 2001 From: Yi Cai Date: Tue, 3 Feb 2026 20:38:26 -0500 Subject: [PATCH 5/8] take default const titleKey Signed-off-by: Yi Cai --- packages/app/src/utils/dynamicUI/extractDynamicConfig.ts | 1 + .../app/src/utils/dynamicUI/extractDynamicConfigFrontend.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/app/src/utils/dynamicUI/extractDynamicConfig.ts b/packages/app/src/utils/dynamicUI/extractDynamicConfig.ts index 1dad969341..af8dd42e19 100644 --- a/packages/app/src/utils/dynamicUI/extractDynamicConfig.ts +++ b/packages/app/src/utils/dynamicUI/extractDynamicConfig.ts @@ -32,6 +32,7 @@ export type DynamicRouteMenuItem = export type MenuItemConfig = { icon?: string; title?: string; + titleKey?: string; textKey?: string; priority?: number; parent?: string; diff --git a/packages/app/src/utils/dynamicUI/extractDynamicConfigFrontend.ts b/packages/app/src/utils/dynamicUI/extractDynamicConfigFrontend.ts index 2b48d2790d..dfe0ec4234 100644 --- a/packages/app/src/utils/dynamicUI/extractDynamicConfigFrontend.ts +++ b/packages/app/src/utils/dynamicUI/extractDynamicConfigFrontend.ts @@ -30,12 +30,12 @@ function convertMenuItemsRecordToArray( ): MenuItem[] { return Object.keys(menuItemsRecord).map(key => { const config = menuItemsRecord[key]; - const { textKey, ...rest } = config; + const { textKey, titleKey: configTitleKey, ...rest } = config; return { ...rest, name: key, children: [], - titleKey: textKey, + titleKey: textKey ?? configTitleKey, } as MenuItem; }); } From eaa5e93f5c5c47df1faef1742687217c944d29e3 Mon Sep 17 00:00:00 2001 From: Karthik Date: Wed, 4 Feb 2026 10:42:17 +0530 Subject: [PATCH 6/8] update saffolder page title and fix the test values --- packages/app/src/translations/scaffolder/scaffolder-en.ts | 1 + translations/test/all-v1.8_s3281-en.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/app/src/translations/scaffolder/scaffolder-en.ts b/packages/app/src/translations/scaffolder/scaffolder-en.ts index 7765a8e976..7e8b1ad03b 100644 --- a/packages/app/src/translations/scaffolder/scaffolder-en.ts +++ b/packages/app/src/translations/scaffolder/scaffolder-en.ts @@ -6,6 +6,7 @@ const en = createTranslationMessages({ full: false, // False means that this is a partial translation messages: { 'templateListPage.title': 'Self-service', + 'templateListPage.pageTitle': 'Self-service', 'templateListPage.contentHeader.registerExistingButtonTitle': 'Import an existing Git repository', }, diff --git a/translations/test/all-v1.8_s3281-en.json b/translations/test/all-v1.8_s3281-en.json index 26499b530e..d75e22e5b9 100644 --- a/translations/test/all-v1.8_s3281-en.json +++ b/translations/test/all-v1.8_s3281-en.json @@ -966,9 +966,9 @@ "templateEditorPage.templateEditorTextArea.refreshIconTooltip": "Reload file", "templateEditorPage.templateEditorTextArea.emptyStateParagraph": "Please select an action on the file menu.", "templateEditorPage.templateFormPreviewer.title": "Load Existing Template", - "templateListPage.title": "Create a new component", + "templateListPage.title": "Self-service", "templateListPage.subtitle": "Create new software components using standard templates in your organization", - "templateListPage.pageTitle": "Create a new component", + "templateListPage.pageTitle": "Self-service", "templateListPage.templateGroups.defaultTitle": "Templates", "templateListPage.templateGroups.otherTitle": "Other Templates", "templateListPage.contentHeader.registerExistingButtonTitle": "Register Existing Component", From 20badbe090c6a73f52bec239fe4815a0b80cfb22 Mon Sep 17 00:00:00 2001 From: Karthik Date: Wed, 4 Feb 2026 12:24:29 +0530 Subject: [PATCH 7/8] add missing templateWizardPage title and pageTitle values --- packages/app/src/translations/scaffolder/fr.ts | 3 +++ packages/app/src/translations/scaffolder/it.ts | 3 +++ packages/app/src/translations/scaffolder/ja.ts | 3 +++ packages/app/src/translations/scaffolder/scaffolder-en.ts | 2 ++ translations/rhdh-fr.json | 3 +++ translations/rhdh-it.json | 3 +++ translations/rhdh-ja.json | 3 +++ 7 files changed, 20 insertions(+) diff --git a/packages/app/src/translations/scaffolder/fr.ts b/packages/app/src/translations/scaffolder/fr.ts index b467e0df37..c77005871a 100644 --- a/packages/app/src/translations/scaffolder/fr.ts +++ b/packages/app/src/translations/scaffolder/fr.ts @@ -22,6 +22,9 @@ export default createTranslationMessages({ full: false, messages: { 'templateListPage.title': 'Self-service', + 'templateListPage.pageTitle': 'Self-service', + 'templateWizardPage.title': 'Self-service', + 'templateWizardPage.pageTitle': 'Self-service', 'templateListPage.contentHeader.registerExistingButtonTitle': 'Importer un dépôt Git existant', }, diff --git a/packages/app/src/translations/scaffolder/it.ts b/packages/app/src/translations/scaffolder/it.ts index 09f589137a..d8a7b22688 100644 --- a/packages/app/src/translations/scaffolder/it.ts +++ b/packages/app/src/translations/scaffolder/it.ts @@ -22,6 +22,9 @@ export default createTranslationMessages({ full: false, messages: { 'templateListPage.title': 'Self-service', + 'templateListPage.pageTitle': 'Self-service', + 'templateWizardPage.title': 'Self-service', + 'templateWizardPage.pageTitle': 'Self-service', 'templateListPage.contentHeader.registerExistingButtonTitle': 'Importa un repository Git esistente', }, diff --git a/packages/app/src/translations/scaffolder/ja.ts b/packages/app/src/translations/scaffolder/ja.ts index 90f38fd484..c3debcc12e 100644 --- a/packages/app/src/translations/scaffolder/ja.ts +++ b/packages/app/src/translations/scaffolder/ja.ts @@ -22,6 +22,9 @@ export default createTranslationMessages({ full: false, messages: { 'templateListPage.title': 'セルフサービス', + 'templateListPage.pageTitle': 'セルフサービス', + 'templateWizardPage.title': 'セルフサービス', + 'templateWizardPage.pageTitle': 'セルフサービス', 'templateListPage.contentHeader.registerExistingButtonTitle': '既存の Git リポジトリーのインポート', }, diff --git a/packages/app/src/translations/scaffolder/scaffolder-en.ts b/packages/app/src/translations/scaffolder/scaffolder-en.ts index 7e8b1ad03b..1a5a74c729 100644 --- a/packages/app/src/translations/scaffolder/scaffolder-en.ts +++ b/packages/app/src/translations/scaffolder/scaffolder-en.ts @@ -7,6 +7,8 @@ const en = createTranslationMessages({ messages: { 'templateListPage.title': 'Self-service', 'templateListPage.pageTitle': 'Self-service', + 'templateWizardPage.title': 'Self-service', + 'templateWizardPage.pageTitle': 'Self-service', 'templateListPage.contentHeader.registerExistingButtonTitle': 'Import an existing Git repository', }, diff --git a/translations/rhdh-fr.json b/translations/rhdh-fr.json index 4f44813ab2..a883676972 100644 --- a/translations/rhdh-fr.json +++ b/translations/rhdh-fr.json @@ -13,6 +13,9 @@ "scaffolder": { "fr": { "templateListPage.title": "Self-service", + "templateListPage.pageTitle": "Self-service", + "templateWizardPage.title": "Self-service", + "templateWizardPage.pageTitle": "Self-service", "templateListPage.contentHeader.registerExistingButtonTitle": "Importer un dépôt Git existant" } }, diff --git a/translations/rhdh-it.json b/translations/rhdh-it.json index 4549c8d881..7a5dba7684 100644 --- a/translations/rhdh-it.json +++ b/translations/rhdh-it.json @@ -13,6 +13,9 @@ "scaffolder": { "it": { "templateListPage.title": "Self-service", + "templateListPage.pageTitle": "Self-service", + "templateWizardPage.title": "Self-service", + "templateWizardPage.pageTitle": "Self-service", "templateListPage.contentHeader.registerExistingButtonTitle": "Importa un repository Git esistente" } }, diff --git a/translations/rhdh-ja.json b/translations/rhdh-ja.json index 4f22d1cd95..e88a812c52 100644 --- a/translations/rhdh-ja.json +++ b/translations/rhdh-ja.json @@ -13,6 +13,9 @@ "scaffolder": { "ja": { "templateListPage.title": "セルフサービス", + "templateListPage.pageTitle": "セルフサービス", + "templateWizardPage.title": "セルフサービス", + "templateWizardPage.pageTitle": "セルフサービス", "templateListPage.contentHeader.registerExistingButtonTitle": "既存の Git リポジトリーのインポート" } }, From 5e52444a06e3aeff5a4e07d7f7cfdbfc5d27ebbf Mon Sep 17 00:00:00 2001 From: Karthik Date: Wed, 4 Feb 2026 13:35:42 +0530 Subject: [PATCH 8/8] apply backstage overrides to backstage..json --- translations/backstage-fr.json | 16 ++++++++-------- translations/backstage-it.json | 16 ++++++++-------- translations/backstage-ja.json | 16 ++++++++-------- translations/rhdh-fr.json | 20 -------------------- translations/rhdh-it.json | 20 -------------------- translations/rhdh-ja.json | 20 -------------------- 6 files changed, 24 insertions(+), 84 deletions(-) diff --git a/translations/backstage-fr.json b/translations/backstage-fr.json index f3153a65b8..3ab3b5cabf 100644 --- a/translations/backstage-fr.json +++ b/translations/backstage-fr.json @@ -60,10 +60,10 @@ "catalog-import": { "fr": { "buttons.back": "Retour", - "defaultImportPage.headerTitle": "Enregistrer un composant existant", + "defaultImportPage.headerTitle": "Importer un dépôt Git existant", "defaultImportPage.contentHeaderTitle": "Commencez à suivre votre composant dans {{appTitle}}", "defaultImportPage.supportTitle": "Commencez à suivre votre composant dans {{appTitle}} en l'ajoutant au catalogue de logiciels.", - "importInfoCard.title": "Enregistrer un composant existant", + "importInfoCard.title": "Importer un dépôt Git existant", "importInfoCard.deepLinkTitle": "En savoir plus sur le catalogue de logiciels", "importInfoCard.linkDescription": "Saisissez l'URL de votre référentiel de code source pour l'ajouter à {{appTitle}}.", "importInfoCard.fileLinkTitle": "Lien vers un fichier d'entité existant", @@ -469,17 +469,17 @@ "templateEditorPage.templateEditorTextArea.refreshIconTooltip": "Recharger le fichier", "templateEditorPage.templateEditorTextArea.emptyStateParagraph": "Veuillez sélectionner une action dans le menu fichier.", "templateEditorPage.templateFormPreviewer.title": "Charger le modèle existant", - "templateListPage.title": "Créer un nouveau composant", + "templateListPage.title": "Self-service", "templateListPage.subtitle": "Créer de nouveaux composants logiciels à l'aide de modèles standard dans votre organisation", - "templateListPage.pageTitle": "Créer un nouveau composant", + "templateListPage.pageTitle": "Self-service", "templateListPage.templateGroups.defaultTitle": "Modèles", "templateListPage.templateGroups.otherTitle": "Autres modèles", - "templateListPage.contentHeader.registerExistingButtonTitle": "Enregistrer un composant existant", + "templateListPage.contentHeader.registerExistingButtonTitle": "Importer un dépôt Git existant", "templateListPage.contentHeader.supportButtonTitle": "Créer de nouveaux composants logiciels à l'aide de modèles standard. Différents modèles créent différents types de composants (services, sites Web, documentation, ...).", "templateListPage.additionalLinksForEntity.viewTechDocsTitle": "Voir TechDocs", - "templateWizardPage.title": "Créer un nouveau composant", + "templateWizardPage.title": "Self-service", "templateWizardPage.subtitle": "Créer de nouveaux composants logiciels à l'aide de modèles standard dans votre organisation", - "templateWizardPage.pageTitle": "Créer un nouveau composant", + "templateWizardPage.pageTitle": "Self-service", "templateWizardPage.pageContextMenu.editConfigurationTitle": "Modifier la configuration", "templateEditorToolbar.customFieldExplorerTooltip": "Explorateur de champs personnalisés", "templateEditorToolbar.installedActionsDocumentationTooltip": "Documentation des actions installées", @@ -585,7 +585,7 @@ "catalog": { "fr": { "indexPage.title": "Catalogue {{orgName}}", - "indexPage.createButtonTitle": "Créer", + "indexPage.createButtonTitle": "Self-service", "indexPage.supportButtonContent": "Toutes les entités de votre catalogue de logiciels", "aboutCard.title": "À propos", "aboutCard.refreshButtonTitle": "Actualisation de l'entité de planification", diff --git a/translations/backstage-it.json b/translations/backstage-it.json index 5c5ef9763f..8836376cef 100644 --- a/translations/backstage-it.json +++ b/translations/backstage-it.json @@ -60,10 +60,10 @@ "catalog-import": { "it": { "buttons.back": "Indietro", - "defaultImportPage.headerTitle": "Registra un componente esistente", + "defaultImportPage.headerTitle": "Importa un repository Git esistente", "defaultImportPage.contentHeaderTitle": "Inizia a monitorare il tuo componente in {{appTitle}}", "defaultImportPage.supportTitle": "Inizia a monitorare il tuo componente in {{appTitle}} aggiungendolo al catalogo software.", - "importInfoCard.title": "Registra un componente esistente", + "importInfoCard.title": "Importa un repository Git esistente", "importInfoCard.deepLinkTitle": "Scopri di più sul catalogo software", "importInfoCard.linkDescription": "Inserisci l'URL del tuo repository del codice sorgente per aggiungerlo a {{appTitle}}.", "importInfoCard.fileLinkTitle": "Collegamento a un file di entità esistente", @@ -469,17 +469,17 @@ "templateEditorPage.templateEditorTextArea.refreshIconTooltip": "Ricarica file", "templateEditorPage.templateEditorTextArea.emptyStateParagraph": "Seleziona un'azione nel menu file.", "templateEditorPage.templateFormPreviewer.title": "Carica modello esistente", - "templateListPage.title": "Crea un nuovo componente", + "templateListPage.title": "Self-service", "templateListPage.subtitle": "Crea nuovi componenti software utilizzando modelli standard nella tua organizzazione", - "templateListPage.pageTitle": "Crea un nuovo componente", + "templateListPage.pageTitle": "Self-service", "templateListPage.templateGroups.defaultTitle": "Modelli", "templateListPage.templateGroups.otherTitle": "Altri modelli", - "templateListPage.contentHeader.registerExistingButtonTitle": "Registra componente esistente", + "templateListPage.contentHeader.registerExistingButtonTitle": "Importa un repository Git esistente", "templateListPage.contentHeader.supportButtonTitle": "Crea nuovi componenti software utilizzando modelli standard. Modelli diversi creano tipi diversi di componenti (servizi, siti web, documentazione, ...).", "templateListPage.additionalLinksForEntity.viewTechDocsTitle": "Visualizza TechDocs", - "templateWizardPage.title": "Crea un nuovo componente", + "templateWizardPage.title": "Self-service", "templateWizardPage.subtitle": "Crea nuovi componenti software utilizzando modelli standard nella tua organizzazione", - "templateWizardPage.pageTitle": "Crea un nuovo componente", + "templateWizardPage.pageTitle": "Self-service", "templateWizardPage.pageContextMenu.editConfigurationTitle": "Modifica configurazione", "templateEditorToolbar.customFieldExplorerTooltip": "Esplora campi personalizzati", "templateEditorToolbar.installedActionsDocumentationTooltip": "Documentazione delle azioni installate", @@ -585,7 +585,7 @@ "catalog": { "it": { "indexPage.title": "Catalogo {{orgName}}", - "indexPage.createButtonTitle": "Crea", + "indexPage.createButtonTitle": "Self-service", "indexPage.supportButtonContent": "Tutte le entità del catalogo software", "aboutCard.title": "Informazioni", "aboutCard.refreshButtonTitle": "Pianifica aggiornamento entità", diff --git a/translations/backstage-ja.json b/translations/backstage-ja.json index a6c4e15f6d..eac04ae8e7 100644 --- a/translations/backstage-ja.json +++ b/translations/backstage-ja.json @@ -60,10 +60,10 @@ "catalog-import": { "ja": { "buttons.back": "戻る", - "defaultImportPage.headerTitle": "既存のコンポーネントの登録", + "defaultImportPage.headerTitle": "既存の Git リポジトリーのインポート", "defaultImportPage.contentHeaderTitle": "{{appTitle}} でのコンポーネントの追跡開始", "defaultImportPage.supportTitle": "{{appTitle}} でコンポーネントの追跡を開始するには、コンポーネントをソフトウェアカタログに追加してください。", - "importInfoCard.title": "既存のコンポーネントの登録", + "importInfoCard.title": "既存の Git リポジトリーのインポート", "importInfoCard.deepLinkTitle": "ソフトウェアカタログの詳細", "importInfoCard.linkDescription": "{{appTitle}} に追加するソースコードリポジトリーの URL を入力してください。", "importInfoCard.fileLinkTitle": "既存のエンティティーファイルへのリンク", @@ -469,17 +469,17 @@ "templateEditorPage.templateEditorTextArea.refreshIconTooltip": "ファイルを再読み込みする", "templateEditorPage.templateEditorTextArea.emptyStateParagraph": "ファイルメニューでアクションを選択してください。", "templateEditorPage.templateFormPreviewer.title": "既存のテンプレートの読み込み", - "templateListPage.title": "新しいコンポーネントの作成", + "templateListPage.title": "セルフサービス", "templateListPage.subtitle": "組織内の標準テンプレートを使用して新しいソフトウェアコンポーネントを作成する", - "templateListPage.pageTitle": "新しいコンポーネントの作成", + "templateListPage.pageTitle": "セルフサービス", "templateListPage.templateGroups.defaultTitle": "テンプレート", "templateListPage.templateGroups.otherTitle": "その他のテンプレート", - "templateListPage.contentHeader.registerExistingButtonTitle": "既存のコンポーネントの登録", + "templateListPage.contentHeader.registerExistingButtonTitle": "既存の Git リポジトリーのインポート", "templateListPage.contentHeader.supportButtonTitle": "標準テンプレートを使用して新しいソフトウェアコンポーネントを作成します。テンプレートごとに異なる種類のコンポーネント (サービス、Web サイト、ドキュメント...) が作成されます。", "templateListPage.additionalLinksForEntity.viewTechDocsTitle": "TechDocs の表示", - "templateWizardPage.title": "新しいコンポーネントの作成", + "templateWizardPage.title": "セルフサービス", "templateWizardPage.subtitle": "組織内の標準テンプレートを使用して新しいソフトウェアコンポーネントを作成する", - "templateWizardPage.pageTitle": "新しいコンポーネントの作成", + "templateWizardPage.pageTitle": "セルフサービス", "templateWizardPage.pageContextMenu.editConfigurationTitle": "設定の編集", "templateEditorToolbar.customFieldExplorerTooltip": "カスタムフィールドエクスプローラー", "templateEditorToolbar.installedActionsDocumentationTooltip": "インストール済みアクションのドキュメント", @@ -585,7 +585,7 @@ "catalog": { "ja": { "indexPage.title": "{{orgName}} のカタログ", - "indexPage.createButtonTitle": "作成", + "indexPage.createButtonTitle": "セルフサービス", "indexPage.supportButtonContent": "すべてのソフトウェアカタログエンティティー", "aboutCard.title": "概要", "aboutCard.refreshButtonTitle": "エンティティー更新のスケジューリング", diff --git a/translations/rhdh-fr.json b/translations/rhdh-fr.json index a883676972..56022b94b3 100644 --- a/translations/rhdh-fr.json +++ b/translations/rhdh-fr.json @@ -1,24 +1,4 @@ { - "catalog": { - "fr": { - "indexPage.createButtonTitle": "Self-service" - } - }, - "catalog-import": { - "fr": { - "defaultImportPage.headerTitle": "Importer un dépôt Git existant", - "importInfoCard.title": "Importer un dépôt Git existant" - } - }, - "scaffolder": { - "fr": { - "templateListPage.title": "Self-service", - "templateListPage.pageTitle": "Self-service", - "templateWizardPage.title": "Self-service", - "templateWizardPage.pageTitle": "Self-service", - "templateListPage.contentHeader.registerExistingButtonTitle": "Importer un dépôt Git existant" - } - }, "rhdh": { "fr": { "menuItem.home": "Home", diff --git a/translations/rhdh-it.json b/translations/rhdh-it.json index 7a5dba7684..7086dd5b38 100644 --- a/translations/rhdh-it.json +++ b/translations/rhdh-it.json @@ -1,24 +1,4 @@ { - "catalog": { - "it": { - "indexPage.createButtonTitle": "Self-service" - } - }, - "catalog-import": { - "it": { - "defaultImportPage.headerTitle": "Importa un repository Git esistente", - "importInfoCard.title": "Importa un repository Git esistente" - } - }, - "scaffolder": { - "it": { - "templateListPage.title": "Self-service", - "templateListPage.pageTitle": "Self-service", - "templateWizardPage.title": "Self-service", - "templateWizardPage.pageTitle": "Self-service", - "templateListPage.contentHeader.registerExistingButtonTitle": "Importa un repository Git esistente" - } - }, "rhdh": { "it": { "menuItem.home": "Home", diff --git a/translations/rhdh-ja.json b/translations/rhdh-ja.json index e88a812c52..5c0a6797ba 100644 --- a/translations/rhdh-ja.json +++ b/translations/rhdh-ja.json @@ -1,24 +1,4 @@ { - "catalog": { - "ja": { - "indexPage.createButtonTitle": "セルフサービス" - } - }, - "catalog-import": { - "ja": { - "defaultImportPage.headerTitle": "既存の Git リポジトリーのインポート", - "importInfoCard.title": "既存の Git リポジトリーのインポート" - } - }, - "scaffolder": { - "ja": { - "templateListPage.title": "セルフサービス", - "templateListPage.pageTitle": "セルフサービス", - "templateWizardPage.title": "セルフサービス", - "templateWizardPage.pageTitle": "セルフサービス", - "templateListPage.contentHeader.registerExistingButtonTitle": "既存の Git リポジトリーのインポート" - } - }, "rhdh": { "ja": { "menuItem.home": "ホーム",