From 01c59622b84ca5e4f1c201f15d44d3bbc6ea9084 Mon Sep 17 00:00:00 2001 From: Iukou Siarhei <45054016+BlazarQSO@users.noreply.github.com> Date: Tue, 9 Jul 2024 10:48:55 +0300 Subject: [PATCH] Feature/epmrpp 92303 merge develop (#3906) * EPMRPP-91329 || Launch merge functionality is not working as the start/end time values are incorrect (#3873) * EPMRPP-91775 & EPMRPP-91774 || Notification modal bugfixes (#3879) * EPMRPP-91774 || Modal windows should have notification type in the title * EPMRPP-91775 || Incorrect error text on trying to create a rule * EPMRPP-91775 || Translations * EPMRPP-91775 || code review fix -1 * EPMRPP-91264 || Extra request for 'locations' is sent in debug mode (#3880) * EPMRPP-91774 || Added plugin type in delete modal (#3881) * EPMRPP-91774 || Added plugin type in delete modal * EPMRPP-91774 || moved util from editNotificationModal to modal * feat: Add Spanish translations (#3882) * Add spanish translations (202/2220) * Add missing files * Add ES translations (346/2220) * Add ES translations (1593/2220) * Add new ES keys * Add missing translations * Add missing import * Update .md file --------- Co-authored-by: Diego Martinez Gilabert * EPMRPP-91201 || Update the Documentation link (#3885) * EPMRPP-91235 || Use Checkbox & Button components from UI-kit (#3886) * EPMRPP-91235 || button topaz variant fix (#3887) * EPMRPP-90835 || Add GA4 events for Notifications (#3894) * EPMRPP-90835 || Add GA4 events for Notifications * EPMRPP-90835 || code review fix -1 * EPMRPP-91264 || Extra llocation request is sent for error log messages (#3892) * EPMRPP-91264 || Add Condition for Fetching Error Log Location in Detailed Log View Mode (#3897) * EPMRPP-91264 || Add Condition for Fetching Error Log Location in Detailed Log View Mode * EPMRPP-91264 || Removed console.log Statement * EPMRPP-92500 || GA4. Issues with events for Notifications (#3899) * EPMRPP-92500 || GA4. Issues with events for Notifications * EPMRPP-92500 | renaming * EPMRPP-92200 || Disable ability to delete the account of default user (#3900) * EPMRPP-92500 || There is no 'condition' when clicking on the "Configure integration" link (#3902) * Update release.yml * EPMRPP-87464 || Update confirmation messages for Posting issue (#3903) --------- Co-authored-by: maria-hambardzumian <164881199+maria-hambardzumian@users.noreply.github.com> Co-authored-by: mg-diego <39908763+mg-diego@users.noreply.github.com> Co-authored-by: Diego Martinez Gilabert Co-authored-by: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Co-authored-by: Reingold Shekhtel <13565058+raikbitters@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- app/localization/config.js | 2 +- app/localization/translated/be.json | 16 +- app/localization/translated/es.json | 2223 +++++++++++++++++ app/localization/translated/ru.json | 16 +- app/localization/translated/uk.json | 16 +- app/localization/translated/whitelist_es.json | 2 + app/localization/translated/zh.json | 16 +- .../common/constants/supportedLanguages.js | 1 + app/src/common/polyfills.js | 6 +- app/src/common/utils/referenceDictionary.js | 2 +- .../attributeList/attributeList.jsx | 9 +- .../autocompleteOption/autocompleteOption.jsx | 7 +- app/src/componentLibrary/button/README.md | 29 - app/src/componentLibrary/button/button.jsx | 97 - app/src/componentLibrary/button/button.scss | 221 -- app/src/componentLibrary/button/index.js | 21 - app/src/componentLibrary/checkbox/README.md | 20 - .../componentLibrary/checkbox/checkbox.jsx | 117 - .../componentLibrary/checkbox/checkbox.scss | 134 - app/src/componentLibrary/checkbox/index.js | 17 - .../modalLayout/modalFooter/modalFooter.jsx | 8 +- .../attributeListFormField.jsx | 4 +- .../localizationContainer.jsx | 2 + .../fields/fieldErrorHint/fieldErrorHint.jsx | 2 +- .../integrationForm/integrationForm.jsx | 8 +- .../emailFormFields/emailFormFields.jsx | 2 +- .../ga4Events/projectSettingsPageEvents.js | 70 +- app/src/controllers/log/sagas.js | 28 +- .../plugins/uiExtensions/createImportProps.js | 4 +- app/src/controllers/project/actionCreators.js | 4 +- app/src/controllers/project/sagas.js | 3 +- .../modal/requestSupportModal.jsx | 2 +- .../inside/launchesPage/launchesPage.jsx | 7 +- .../deleteAccountBlock/deleteAccountBlock.jsx | 30 +- .../localizationBlock/img/es-flag-inline.svg | 84 + .../localizationBlock/localizationBlock.jsx | 12 + .../autoAnalysis/autoAnalysis.jsx | 10 +- .../indexSettings/indexSettings.jsx | 8 +- .../similarItems/similarItems.jsx | 9 +- .../uniqueErrors/uniqueErrors.jsx | 10 +- .../content/defectTypes/defectTypes.jsx | 4 +- .../generateDemoDataBlock.jsx | 2 +- .../content/emptyStatePage/emptyStatePage.jsx | 6 +- .../integrationHeader/integrationHeader.jsx | 6 +- .../LinkComponent/LinkComponent.jsx | 17 +- .../emptyRuleState/emptyRuleState.jsx | 9 +- .../content/notifications/footer/footer.jsx | 3 + .../notifications/helpPanel/helpPanel.jsx | 4 +- .../addEditNotificationModal.jsx | 14 +- .../deleteNotificationCaseModal.jsx | 7 +- .../content/notifications/modals/util.js | 1 + .../content/notifications/notifications.jsx | 8 +- .../notifications/ruleGroup/ruleGroup.jsx | 71 +- .../patternAnalysisContent.jsx | 5 +- .../generalTab/generalTab.jsx | 5 +- .../modals/postIssueModal/postIssueModal.jsx | 8 +- .../emptyPageState/emptyPageState.jsx | 2 +- .../projectsPageHeader/projectsPageHeader.jsx | 2 +- .../projectTeamPageHeader.jsx | 2 +- docs/9-localization.md | 2 +- 61 files changed, 2619 insertions(+), 840 deletions(-) create mode 100644 app/localization/translated/es.json create mode 100644 app/localization/translated/whitelist_es.json delete mode 100644 app/src/componentLibrary/button/README.md delete mode 100644 app/src/componentLibrary/button/button.jsx delete mode 100644 app/src/componentLibrary/button/button.scss delete mode 100644 app/src/componentLibrary/button/index.js delete mode 100644 app/src/componentLibrary/checkbox/README.md delete mode 100644 app/src/componentLibrary/checkbox/checkbox.jsx delete mode 100644 app/src/componentLibrary/checkbox/checkbox.scss delete mode 100644 app/src/componentLibrary/checkbox/index.js create mode 100644 app/src/pages/inside/profilePage/localizationBlock/img/es-flag-inline.svg create mode 100644 app/src/pages/inside/projectSettingsPageContainer/content/notifications/modals/util.js diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index de6dd342fa..482c53dfd5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -58,7 +58,7 @@ jobs: - name: Tag release id: tagRelease run: | - git tag -a v${{ github.event.inputs.version }} -m 'Release ${{ github.event.inputs.version }}' + git tag -a ${{ github.event.inputs.version }} -m 'Release ${{ github.event.inputs.version }}' git push --tags - name: Create Release diff --git a/app/localization/config.js b/app/localization/config.js index f83f9bf2f6..e39bd4969a 100644 --- a/app/localization/config.js +++ b/app/localization/config.js @@ -17,5 +17,5 @@ export const config = { messagesDirectory: 'localization/messages', translationsDirectory: 'localization/translated/', - languages: ['uk', 'ru', 'be', 'zh'], + languages: ['uk', 'ru', 'be', 'zh', 'es'], }; diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 72e4500a35..432a409bb9 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -543,7 +543,8 @@ "DefectTypesTab.warningMessage": "Вы дасягнулі максімальнага ліміту тыпаў дэфектаў, даступных для праекта", "DefectTypesTab.warningSubMessage": "Колькасць тыпаў дэфектаў у вашым праекце зараз складае {maxLength} з {maxLength}. Вы зможаце стварыць новы пасля выдалення хаця б аднаго, створанага раней", "DeleteAccountBlock.deleteAccount": "Выдаліць уліковы запіс", - "DeleteAccountBlock.tooltipText": "Выдаліць свой уліковы запіс могуць толькі карыстальнікі, якія не з'яўляюцца адміністратарамі.\nАкрамя таго, гэта можа зрабіць іншы адміністратар.", + "DeleteAccountBlock.tooltipAdminDisabledText": "Выдаліць свой уліковы запіс могуць толькі карыстальнікі, якія не з'яўляюцца адміністратарамі.\nАкрамя таго, гэта можа зрабіць іншы адміністратар.", + "DeleteAccountBlock.tooltipDefaultUserDisabledText": "Забараняецца выдаляць уліковы запіс карыстальніка па змаўчанні ў дэма-версіі.", "DeleteAccountFeedbackModal.alternative": "Знайшоў лепшую альтэрнатыву", "DeleteAccountFeedbackModal.continue": "Працягнуць", "DeleteAccountFeedbackModal.deleteAccountReasonSizeHint": "Памер поля павінен быць не больш за 128 сімвалаў.", @@ -564,16 +565,12 @@ "DeleteFilterDialog.deleteFilterOwnerWarning": "Вы збіраецеся выдаліць не свой фільтр. Гэта можа паўплываць на інфармацыю іншых карыстальнікаў праекта.", "DeleteImageModal.header": "Выдаліць фота", "DeleteImageModal.text": "Вы ўпэўненыя, што жадаеце выдаліць фота профілю?", - "DeleteLaunchModal.deleteImportantLaunch": "Выдаліць важны запуск", "DeleteLaunchModal.deleteImportantLaunchMessage": "”{name}” пазначан як важны.
Вы ўпэўнены, што хочаце выдаліць гэты важны запуск?", - "DeleteLaunchModal.deleteImportantLaunches": "Выдаліць важныя запускі", "DeleteLaunchModal.deleteImportantLaunchesMessage": "Ёсць {importantCount} запускаў, пазначаных як важныя.
Вы ўпэўнены, што хочаце выдаліць гэтыя важныя запускі?", "DeleteLaunchModal.deleteModalContent": "Вы ўпэўненыя, што хочаце выдаліць запуск '{name}'? Вы страціце доступ да яго.", "DeleteLaunchModal.deleteModalHeader": "Выдаліць запуск", "DeleteLaunchModal.deleteModalMultipleContent": "Вы ўпэўненыя, што хочаце выдаліць запускі? Вы страціце доступ да іх.", "DeleteLaunchModal.deleteModalMultipleHeader": "Выдаліць запускі", - "DeleteLaunchModal.deleteOnlyRegular": "Выдаляць толькі звычайныя", - "DeleteLaunchModal.deleteWithImportantLaunch": "Выдаліць з важнымі запускамі", "DeleteLaunchModal.deleteWithImportantLaunchMessage": "Запуск \"{name}\" пазначаны як важны.
Вы ўпэўнены, што хочаце таксама выдаліць гэтыя важныя запускі?", "DeleteLaunchModal.deleteWithImportantLaunchesMessage": "Ёсць {importantCount} запускаў, пазначаных як важныя сярод {totalCount} запускаў, якія вы спрабуеце выдаліць. Вы ўпэўнены, што хочаце таксама выдаліць гэтыя важныя запускі?", "DeleteLaunchModal.warning": "Вы збіраецеся выдаліць не свой запуск. Гэта можа паўплываць на інфармацыю іншых карыстальнікаў праекта.", @@ -852,6 +849,10 @@ "Footer.build": "Зборка", "Footer.contact": "Звяжыцеся з намі", "Footer.copyright": "Усе правы абаронены.", + "Footer.deleteImportantLaunch": "Выдаліць важны запуск", + "Footer.deleteImportantLaunches": "Выдаліць важныя запускі", + "Footer.deleteOnlyRegular": "Выдаляць толькі звычайныя", + "Footer.deleteWithImportantLaunch": "Выдаліць з важнымі запускамі", "Footer.documentation": "Дакументацыя", "Footer.git": "Мы на GitHub", "Footer.privacy": "Палітыка прыватнасці", @@ -1214,6 +1215,7 @@ "LocalizationBlock.label": "Мова", "LocalizationBlock.note": "Да ведама", "LocalizationBlock.russian": "Рускі", + "LocalizationBlock.spanish": "Iспанська", "LocalizationBlock.ukrainian": "Ukrainian", "LogItemActivity.changedByAnalyzer": "АА змяніў тып дэфекту", "LogItemActivity.issueLoadByAnalyzer": "AA прывязаў памылку", @@ -1500,7 +1502,7 @@ "NotificationRule.launchNameLabel": "Імя запуску", "NotificationRule.launchOwner": "Уласнік запуску", "Notifications.notifications": "Апавяшчэнні па электроннай пошце", - "Notifications.ruleNameDuplicateHint": "Правіла з такой жа назвай ужо існуе ў праекце", + "Notifications.ruleNameDuplicateHint": "Для гэтага канала сувязі ўжо існуе правіла з такім жа імем", "Notifications.updateEmail": "абноўлены", "NotificationsEnableForm.allNotifications": "Усе апавяшчэнні", "NotificationsEnableForm.attributes": "Атрыбуты", @@ -1652,7 +1654,7 @@ "PostIssueModal.postIssue": "Паведаміць аб праблеме", "PostIssueModal.postIssueFailed": "Не атрымалася адправіць праблему", "PostIssueModal.postIssueForTheTest": "Паведаміць аб праблеме для тэсту {launchNumber}", - "PostIssueModal.postIssueSuccess": "Картка была створана", + "PostIssueModal.postIssueSuccess": "Картка была паспяхова створана", "PostIssueModal.systemUrlInfo": "Праблема будзе адправлена на {systemUrl}", "ProductStatus.filterNameColumn": "Імя фільтра", "ProductStatus.nameColumn": "Імя", diff --git a/app/localization/translated/es.json b/app/localization/translated/es.json new file mode 100644 index 0000000000..f8c8b7b04e --- /dev/null +++ b/app/localization/translated/es.json @@ -0,0 +1,2223 @@ +{ + "AALabel.investigatedByAA": "Analizado por Auto-Análisis", + "AccountRemovedPage.description": "Su cuenta y datos personales han sido eliminados de la base de datos de ReportPortal.\nLamentamos que se vaya. Se ha enviado una notificación por correo electrónico a la dirección de correo electrónico asociada con su cuenta.", + "AccountRemovedPage.header": "la cuenta ha sido eliminada", + "AccountRemovedPage.login": "Iniciar sesión", + "AccountRemovedPage.message": "Gracias por usar ReportPortal", + "AccountRemovedPage.signup": "Registrarse", + "AccuracyFormBlock.minShouldMatchHint": "El parámetro acepta valores de '50' a '100'", + "AccuracyFormBlock.searchLogsMinShouldMatch": "El parámetro acepta valores de '0' a '100'", + "ActionPanel.actionsBtnTooltip": "Seleccione varios elementos para procesar", + "ActionPanel.addUserNotification": "Nuevo registro de usuario creado con éxito", + "ActionPanel.btsIntegrationIsNotConfigured": "La integración BTS no está configurada. Contacte al administrador", + "ActionPanel.editDefects": "Editar defectos", + "ActionPanel.ignoreInAA": "Ignorar en Auto-Análisis", + "ActionPanel.includeInAA": "Incluir en Auto-Análisis", + "ActionPanel.issueActionUnavailable": "Esta operación solo puede realizarse simultáneamente para 300 elementos", + "ActionPanel.linkIssue": "Vincular incidencia", + "ActionPanel.noAvailableBtsPlugin": "El plugin BTS está deshabilitado. Contacte al administrador", + "ActionPanel.noBtsIntegration": "No hay integración BTS. Contacte al administrador", + "ActionPanel.noBtsPlugin": "No hay plugin BTS. Contacte al administrador", + "ActionPanel.postIssue": "Enviar problema", + "ActionPanel.proceedButton": "Procesar elementos válidos", + "ActionPanel.unlinkIssue": "Desvincular problema", + "ActiveDirectoryFormFields.baseDnLabel": "DN base", + "ActiveDirectoryFormFields.domainLabel": "Dominio", + "ActiveDirectoryFormFields.emailAttributeLabel": "Atributo de correo electrónico", + "ActiveDirectoryFormFields.fullNameAttributeLabel": "Atributo de nombre completo", + "ActiveDirectoryFormFields.photoAttributeLabel": "Atributo de fotografía", + "ActiveDirectoryFormFields.searchFilter": "Filtro de búsqueda", + "ActiveDirectoryFormFields.urlLabel": "URL", + "AddEditDashboard.dashboardNameExistsHint": "Este nombre ya está en uso.", + "AddEditDashboard.dashboardNameHint": "El nombre del panel debe tener entre 3 y 128 caracteres.", + "AddEditDefectTypeModal.abbreviation": "Abreviatura", + "AddEditDefectTypeModal.abbreviationHint": "La abreviatura puede contener hasta 4 caracteres", + "AddEditDefectTypeModal.automationBug": "Grupo de errores de automatización", + "AddEditDefectTypeModal.color": "Color del tipo de defecto", + "AddEditDefectTypeModal.description": "Cree su tipo de defecto completando el formulario a continuación", + "AddEditDefectTypeModal.editRuleMessage": "Editar", + "AddEditDefectTypeModal.group": "Grupo de tipos de defectos", + "AddEditDefectTypeModal.name": "Nombre del tipo de defecto", + "AddEditDefectTypeModal.newRuleMessage": "Crear", + "AddEditDefectTypeModal.noDefect": "Grupo Sin defecto", + "AddEditDefectTypeModal.productBug": "Grupo de defectos del producto", + "AddEditDefectTypeModal.systemIssue": "Grupo de problemas del sistema", + "AddEditDefectTypeModal.title": "{actionType} Tipo de defecto", + "AddEditDefectTypeModal.toInvestigate": "Grupo Para investigar", + "AddEditNotificationCaseModal.active": "Regla activa", + "AddEditNotificationCaseModal.addAttribute": "Agregar atributo", + "AddEditNotificationCaseModal.attributesLabel": "Atributos", + "AddEditNotificationCaseModal.attributesLabelAll": "(Todos los atributos deben coincidir)", + "AddEditNotificationCaseModal.attributesLabelAny": "(Cualquier atributo debe coincidir)", + "AddEditNotificationCaseModal.attributesNotActive": "Los atributos no están activos. Para activar, marque la casilla 'Atributos'", + "AddEditNotificationCaseModal.attributesNote": "Notificar si la ejecución tiene todos/al menos uno de los atributos indicados", + "AddEditNotificationCaseModal.attributesOperatorAnd": "Todos los atributos deben coincidir", + "AddEditNotificationCaseModal.attributesOperatorOr": "Cualquier atributo debe coincidir", + "AddEditNotificationCaseModal.controlPanelName": "Regla", + "AddEditNotificationCaseModal.copyRuleMessage": "Duplicar", + "AddEditNotificationCaseModal.description": "Seleccione las condiciones para crear una regla de notificación", + "AddEditNotificationCaseModal.dropdownValueAlways": "Siempre", + "AddEditNotificationCaseModal.dropdownValueFailed": "La ejecución tuvo problemas", + "AddEditNotificationCaseModal.dropdownValueMore10": "> 10% de los elementos tienen problemas", + "AddEditNotificationCaseModal.dropdownValueMore20": "> 20% de los elementos tienen problemas", + "AddEditNotificationCaseModal.dropdownValueMore50": "> 50% de los elementos tienen problemas", + "AddEditNotificationCaseModal.dropdownValueToInvestigate": "En la ejecución 'Para Investigar' elementos", + "AddEditNotificationCaseModal.editRuleMessage": "Editar", + "AddEditNotificationCaseModal.inCaseLabel": "En caso de", + "AddEditNotificationCaseModal.launchNamesHint": "El nombre de la ejecución debe tener entre 1 y 256 caracteres", + "AddEditNotificationCaseModal.launchNamesLabel": "Nombres de ejecución", + "AddEditNotificationCaseModal.launchNamesMessageCaption": "La notificación no funcionará para la ejecución seleccionada hasta que lo agregue en ReportPortal", + "AddEditNotificationCaseModal.launchNamesMessageText": "La ejecución que desea analizar aún no está en la base de datos", + "AddEditNotificationCaseModal.launchNamesNote": "Enviar notificaciones sobre la finalización de las ejecuciones seleccionadas", + "AddEditNotificationCaseModal.launchNamesPlaceholder": "Nombre de la ejecución", + "AddEditNotificationCaseModal.launchOwnerLabel": "Propietario de la ejecución (quien la lanzó, la recibe)", + "AddEditNotificationCaseModal.launchesHint": "El nombre de la ejecución debe tener entre 3 y 256 caracteres.", + "AddEditNotificationCaseModal.newRuleMessage": "Agregar", + "AddEditNotificationCaseModal.recipientsHint": "Por favor, ingrese un nombre de usuario existente en su proyecto o una dirección de correo electrónico válida", + "AddEditNotificationCaseModal.recipientsLabel": "Destinatarios", + "AddEditNotificationCaseModal.title": "{actionType} Regla de notificación", + "AddEditNotificationModal.nameLabel": "Nombre de la regla", + "AddEditNotificationModal.namePlaceholder": "Nombre de la regla", + "AddEditNotificationModal.recipientsPlaceholder": "Nombre de usuario/correo electrónico", + "AddEditNotificationModal.ruleNameHint": "Campo obligatorio. El nombre de la regla debe tener entre 1 y 55 caracteres", + "AddFilter.filterName": "Nombre del filtro", + "AddFilter.placeholderFilterName": "Introduzca el nombre del filtro", + "AddIntegrationModal.createGlobalTitle": "Crear integración global", + "AddIntegrationModal.createProjectTitle": "Crear integración de proyecto", + "AddIntegrationModal.editGlobalIntegrationTitle": "Editar integración global", + "AddIntegrationModal.editProjectIntegrationTitle": "Editar integración de proyecto", + "AddNewCaseButton.addNewRuleButton": "Agregar nueva regla", + "AddNewCaseButton.addRule": "Agregar regla", + "AddUserForm.addUserTitle": "Agregar usuario", + "AddUserForm.generatePassword": "Generar contraseña", + "AddUserForm.projectNamePlaceholder": "Ingrese el nombre del proyecto", + "AddUserForm.userAccountRoleLabel": "Rol de la cuenta", + "AddUserForm.userEmailLabel": "Dirección de correo electrónico", + "AddUserForm.userFullNameLabel": "Nombre completo", + "AddUserForm.userLoginLabel": "Inicio de sesión", + "AddUserForm.userPasswordLabel": "Contraseña", + "AddUserForm.userProjectRoleLabel": "Rol del proyecto", + "AddUserForm.userSelectAProjectLabel": "Seleccionar proyecto", + "AddUserModal.contentTitle": "Agregar nuevo usuario al proyecto", + "AdminHeader.header": "Administración", + "AdminSidebar.allProjects": "Proyectos", + "AdminSidebar.allUsers": "Todos los usuarios", + "AdminSidebar.btnProfile": "Perfil", + "AdminSidebar.btnToProject": "Volver a proyectos", + "AdminSidebar.plugins": "Plugins", + "AdminSidebar.settings": "Configuración del servidor", + "AllLatestDropdown.allLaunches": "Todas las ejecuciones", + "AllLatestDropdown.allLaunchesShort": "Todas", + "AllLatestDropdown.latestLaunches": "Últimas ejecuciones", + "AllLatestDropdown.latestLaunchesShort": "Últimas", + "AllUsersGrid.emailCol": "Correo electrónico", + "AllUsersGrid.lastLoginCol": "Último acceso", + "AllUsersGrid.loginCol": "Inicio de sesión", + "AllUsersGrid.nameCol": "Nombre", + "AllUsersGrid.projectsAndRolesCol": "Proyectos y roles", + "AllUsersGrid.typeCol": "Tipo", + "AllUsersPage.AddUser": "Agregar usuario", + "AllUsersPage.export": "Exportar", + "AllUsersPage.inviteUser": "Invitar usuario", + "AnalysisConfigurations.analysisConfigurations": "configuración de análisis automático", + "AnalysisConfigurations.generateIndex": "generar el índice", + "AnalysisConfigurations.removeIndex": "eliminar el índice", + "AnalysisConfigurations.update": "actualizado", + "AnalysisProperties.all": "Todas", + "AnalysisProperties.from": "desde", + "AnalysisProperties.off": "Desactivado", + "AnalysisProperties.on": "Activado", + "AnalysisProperties.to": "hasta", + "AnalyticsTab.analyticsEnabled": "Ayúdanos a mejorar ReportPortal mediante el envío automático de análisis", + "AnalyticsTab.analyticsInfo": "Puedes ayudarnos a mejorar ReportPortal.
Mientras usas la aplicación, recopilamos análisis que pueden ayudarnos a mejorar el rendimiento y la usabilidad de ReportPortal, rastreando la frecuencia de uso de funciones específicas.
Consulta a continuación los detalles sobre qué información se envía.", + "AnalyticsTab.analyticsList": "Lista de análisis enviados", + "AnalyticsTab.analyticsListMessage": "El análisis de uso generalmente no incluye información personal, pero puede incluir:", + "AnalyticsTab.analyticsListPoint1": "Información del dispositivo: modelo de tu equipo, versión del sistema operativo, resolución de pantalla, versión del navegador;", + "AnalyticsTab.analyticsListPoint2": "Información sobre el comportamiento: detalles sobre cómo usas ReportPortal, en qué haces clic y qué acciones realizas, cuánto tiempo mantienes la aplicación abierta.", + "AnalyticsTab.updateAnalyticsEnabledSuccess": "Configuración del servidor actualizada exitosamente", + "Analyzer.autoAnalysis": "Análisis automático", + "Analyzer.indexSettings": "Configuración del índice", + "Analyzer.similarItems": "Elementos similares", + "Analyzer.uniqueErrors": "Errores únicos", + "Analyzer.updateErrorNotification": "Algo salió mal", + "Analyzer.updateSuccessNotification": "Configuraciones del proyecto actualizadas correctamente", + "ApiKeyGeneratedModal.description": "Copia la clave API y guárdala en un lugar seguro.", + "ApiKeyGeneratedModal.descriptionNote": "No podrás ver tu clave después de cerrar esta ventana.", + "ApiKeyGeneratedModal.header": "Clave API generada", + "ApiKeyGeneratedModal.loaderText": "GENERANDO", + "ApiKeyGeneratedModal.successNotification": "Clave API copiada exitosamente", + "ApiKeys.ApiKeysBlock.description": "Para asegurar tu propia contraseña de dominio, puedes usar una clave de usuario para verificar tu cuenta y tener la capacidad de iniciar sesión usando un agente. Para obtener más información sobre las claves API, consulta la documentación.", + "ApiKeys.ApiKeysBlock.generateButton": "Generar clave API", + "ApiKeys.ApiKeysBlock.headerDateCol": "creado", + "ApiKeys.ApiKeysBlock.headerNameCol": "Nombre de la clave API", + "ApiKeys.ApiKeysBlock.revoke": "Revocar", + "ApiKeys.noApiKeys.description": "Para asegurar tu propia contraseña de dominio, puedes usar una clave de usuario para verificar tu cuenta y tener la capacidad de enviar resultados usando un agente.", + "ApiKeys.noApiKeys.documentation": "Documentación", + "ApiKeys.noApiKeys.generateButton": "Generar clave API", + "ApiKeys.noApiKeys.header": "No hay claves API", + "ApiPage.title": "Documentación de la API", + "AssignUser.auto": "fue asignado al proyecto", + "AssignUser.by": "fue asignado al proyecto por", + "AssignedProjectsBlock.headerNameCol": "Proyectos", + "AssignedProjectsBlock.headerRoleCol": "Rol del proyecto", + "AsyncAutocomplete.dynamicSearchPromptText": "Por favor ingresa {length} o más caracteres", + "AsyncAutocomplete.loading": "Cargando ...", + "AsyncAutocomplete.notFound": "No se encontraron resultados", + "AttachmentModal.errorFileStructure": "Estructura de archivo incorrecta", + "AttachmentModal.rotate": "Rotar", + "AttachmentModal.title": "Adjunto", + "Attachments.noAttachmentsMessage": "No hay archivos adjuntos para mostrar", + "AttributeEditor.attributeKeyLengthHint": "La clave debe tener entre 1 y 512 caracteres de longitud", + "AttributeEditor.attributeValueLengthHint": "El valor debe tener hasta 512 caracteres de longitud", + "AttributeEditor.keyLabel": "Clave", + "AttributeEditor.uniqueAttributeKeyHint": "La clave del atributo debe ser única", + "AttributeEditor.valueLabel": "Valor", + "AttributeList.addNew": "Agregar", + "AttributesBlock.attributesTitle": "Atributos", + "AttributesContainer.addAttribute": "Agregar atributo", + "AttributesContainer.attributes": "Atributos", + "AttributesContainer.attributesNotActive": "Los atributos no están activos. Para activarlos, marca la casilla 'Atributos'", + "AttributesFieldArrayControl.addOneMoreLevel": "Agregar otro nivel", + "AttributesFieldArrayControl.attributeKeyFieldLabel": "Nivel {number} {view}", + "AttributesFieldArrayControl.attributeKeyFieldPlaceholder": "Ingrese la clave del atributo", + "AttributesFieldArrayControl.levelCanBeAddedMessage": "Se puede agregar 1 nivel", + "AttributesFieldArrayControl.levelsCanBeAddedMessage": "Se pueden agregar {amount} niveles", + "AutoAnalysis.AutoAnalysisMode": "Modo de análisis automático", + "AutoAnalysis.AutoAnalysisModeDescription": "Puedes especificar las ejecuciones que se utilizarán como base para el análisis automático. Consulta la documentación.", + "AutoAnalysis.allLaunchesCaption": "Todas las ejecuciones anteriores", + "AutoAnalysis.allMessagesShouldMatch": "Todos los registros con 3 o más líneas deben coincidir", + "AutoAnalysis.allMessagesShouldMatchDescription": "Cuando el elemento analizado del test contiene registros con 3 o más líneas", + "AutoAnalysis.autoAnalysis": "Análisis automático", + "AutoAnalysis.autoAnalysisDescription": "El análisis automático activo comenzará inmediatamente después de que se complete cualquier ejecución", + "AutoAnalysis.current": "Solo la ejecución actual", + "AutoAnalysis.currentAndWithSameName": "La ejecución actual y todas los anteriores con el mismo nombre", + "AutoAnalysis.minShouldMatch": "Mínimo de coincidencias para el análisis automático", + "AutoAnalysis.minShouldMatchDescription": "Porcentaje de coincidencia de palabras entre el registro analizado y un registro específico del motor de búsqueda. Si el registro del motor de búsqueda tiene un valor menor al establecido, se ignorará este registro para AA", + "AutoAnalysis.numberOfLogLines": "Número de líneas de registro para considerar en el motor de búsqueda", + "AutoAnalysis.numberOfLogLinesAllOption": "Todos", + "AutoAnalysis.numberOfLogLinesDescription": "Número de primeras líneas del registro para considerar en el motor de búsqueda", + "AutoAnalysis.previousLaunch": "Solo la ejecución anterior con el mismo nombre", + "AutoAnalysis.sameNameLaunchesCaption": "Todas las ejecuciones anteriores con el mismo nombre", + "AutoAnalysis.tabDescription": "El análisis automático permite reducir el tiempo dedicado a investigar la ejecución de las pruebas mediante el análisis automático de los fallos de las pruebas. El proceso de análisis automático se basa en resultados previos obtenidos por el usuario mediante aprendizaje automático. Las configuraciones se aplican cuando se inicia automáticamente el análisis al completar una ejecución y también al completar un elemento de prueba. Puedes obtener más información sobre el análisis automático en la documentación.", + "BetaBadge.beta": "beta", + "Breadcrumbs.lostLaunch": "La ejecución original se ha perdido", + "Breadcrumbs.restorePath": "Restaurar ruta", + "BtsCommonMessages.authTypeLabel": "Tipo de autorización", + "BtsCommonMessages.btsBoardIdHint": "El identificador del tablero debe tener entre 1 y 55 caracteres", + "BtsCommonMessages.btsIntegrationNameHint": "El nombre de la integración debe tener entre 1 y 55 caracteres", + "BtsCommonMessages.btsPasswordHint": "La contraseña debe tener entre 1 y 55 caracteres", + "BtsCommonMessages.btsProjectIdHint": "El ID del proyecto debe tener entre 1 y 55 caracteres", + "BtsCommonMessages.btsProjectKeyHint": "La clave del proyecto debe tener entre 1 y 55 caracteres", + "BtsCommonMessages.btsUrlHint": "Por favor, proporciona un enlace válido al sistema de gestión de incidencias", + "BtsCommonMessages.btsUserNameHint": "El nombre debe tener entre 1 y 55 caracteres", + "BtsCommonMessages.integrationNameLabel": "Nombre de la integración", + "BtsCommonMessages.linkToBtsLabel": "Enlace al sistema de gestión de incidencias", + "BtsCommonMessages.projectKeyLabel": "Clave del proyecto en el sistema de gestión de incidencias", + "BtsIntegrationSelector.btsTitle": "Sistema de gestión de incidencias", + "BtsIntegrationSelector.integrationNameTitle": "Nombre de la integración", + "ButtonTooltip.notConfiguredNotificationTooltip": "El servidor de correo no está configurado. Contacta al administrador de la instancia.", + "CategoriesList.addOrganizationButtonTitle": "Agregar organización de GitHub", + "CategoriesList.organizationNameLabel": "Nombre de la organización", + "ChangePasswordBlock.changePass": "Cambio de contraseña", + "ChangePasswordBlock.enterEmail": "Introduce la nueva contraseña y confírmala", + "ChangePasswordForm.changePassword": "Cambiar contraseña", + "ChangePasswordForm.failedChange": "No se pudo actualizar la contraseña", + "ChangePasswordForm.newPasswordConfirmPlaceholder": "Confirma la nueva contraseña", + "ChangePasswordForm.newPasswordPlaceholder": "Nueva contraseña", + "ChangePasswordForm.passwordConstraints": "4-256 caracteres", + "ChangePasswordForm.successChange": "Tu contraseña ha sido cambiada exitosamente", + "ChangePasswordModal.confirmLabel": "Confirmar", + "ChangePasswordModal.confirmPlaceholder": "Confirma la nueva contraseña", + "ChangePasswordModal.header": "Cambiar contraseña", + "ChangePasswordModal.newPasswordLabel": "Nueva contraseña", + "ChangePasswordModal.newPasswordPlaceholder": "Introduce la nueva contraseña", + "ChangePasswordModal.oldPasswordLabel": "Contraseña anterior", + "ChangePasswordModal.oldPasswordPlaceholder": "Introduce la contraseña anterior", + "ChangePasswordModal.profileConfirmPassword": "Las contraseñas no coinciden", + "ChangePasswordModal.profileEmail": "Correo electrónico incorrecto", + "ChangePasswordModal.profilePassword": "La contraseña debe tener entre 4 y 25 caracteres", + "ChangePasswordModal.profileUserName": "El nombre completo debe tener entre 3 y 256 caracteres, incluyendo letras latinas y rusas, números, guion, guion bajo, punto y espacio.", + "ChangePasswordModal.showPassword": "Mostrar contraseña", + "ChangeProjectRoleModal.cancelText": "Cancelar", + "ChangeProjectRoleModal.changeAccountRoleText": "¿Estás seguro de que deseas cambiar el rol del proyecto para ''{name}''?", + "ChangeProjectRoleModal.changeAccountRoleTitle": "cambiar rol", + "ChangeProjectRoleModal.submitText": "Cambiar", + "ChangeRole": "cambió el rol en el proyecto", + "Chart.label.automationBug": "Error de automatización", + "Chart.label.investigated": "Investigados", + "Chart.label.launchesQuantity": "Ejecuciones", + "Chart.label.productBug": "Defecto del producto", + "Chart.label.systemIssue": "Problema del sistema", + "Chart.label.toInvestigate": "Error sin investigar", + "Chart.xAxisDaysTitle": "t, días", + "Chart.xAxisWeeksTitle": "t, semanas", + "Chart.yAxisTitle": "% investigados", + "Charts.cases": "escenarios", + "Charts.failed": "Fallido", + "Charts.failedSkippedTotal": "% (Fallidos+Omitidos)/Total", + "Charts.filterLabel": "Filtro:", + "Charts.launchInterrupted": "La ejecución fue interrumpida", + "Charts.launchName": "Nombre de la ejecución:", + "Charts.minutes": "minutos", + "Charts.notPassed": "No pasados", + "Charts.passed": "Pasado", + "Charts.passingRate": "Tasa de éxito", + "Charts.seconds": "segundos", + "Charts.skipped": "Omitido", + "Charts.testCasesCaption": "Casos de prueba", + "Charts.total": "Total {type}", + "ClusterItemsGridRow.loadLabel": "Cargar más", + "CommandItem.commandTitle": "Comando", + "CommandItem.parametersTitle": "Parámetros", + "CommandItem.responseTitle": "Respuesta", + "Common.actions": "Acciones", + "Common.add": "Agregar", + "Common.analyzerDisabled": "El servicio del analizador no está disponible", + "Common.april": "Abril", + "Common.august": "Agosto", + "Common.back": "Atrás", + "Common.cancel": "Cancelar", + "Common.changesWarning": "El campo no es válido o los cambios no se han guardado", + "Common.clone": "Clonar", + "Common.close": "Cerrar", + "Common.closeModalWarning": "Debes guardar o cancelar los cambios antes de cerrar la ventana", + "Common.compare": "Comparar", + "Common.confirm": "Confirmar", + "Common.copyToClipboard": "Copiar al portapapeles", + "Common.create": "Crear", + "Common.december": "Diciembre", + "Common.delete": "Eliminar", + "Common.disable": "Desactivar", + "Common.discard": "Descartar", + "Common.documentation": "Documentación", + "Common.download": "Descargar", + "Common.edit": "Editar", + "Common.editItems": "Editar elementos", + "Common.enable": "Activar", + "Common.error": "Error", + "Common.february": "Febrero", + "Common.finish": "Finalizar", + "Common.forceFinish": "Forzar finalización", + "Common.friday": "Viernes", + "Common.generate": "Generar", + "Common.invite": "Invitar", + "Common.january": "Enero", + "Common.july": "Julio", + "Common.june": "Junio", + "Common.key": "Clave", + "Common.login": "Iniciar sesión", + "Common.march": "Marzo", + "Common.may": "Mayo", + "Common.merge": "Unir", + "Common.monday": "Lunes", + "Common.move": "Mover", + "Common.moveToAllLaunches": "Ir a todas las ejecuciones", + "Common.moveToDebug": "Mover a depuración", + "Common.noResults": "No se encontraron resultados", + "Common.november": "Noviembre", + "Common.october": "Octubre", + "Common.of": "de", + "Common.off": "Apagar", + "Common.ok": "Ok", + "Common.on": "Encender", + "Common.openInNewTab": "Abrir en una nueva pestaña", + "Common.proceedValidItems": "Procesar elementos válidos", + "Common.processData": "Espera, estamos procesando tus datos", + "Common.refresh": "Actualizar", + "Common.requiredFieldHint": "Este campo es obligatorio", + "Common.reset": "Restablecer", + "Common.saturday": "Sábado", + "Common.save": "Guardar", + "Common.search": "Buscar", + "Common.send": "Enviar", + "Common.september": "Septiembre", + "Common.shortRequiredFieldHint": "Campo obligatorio", + "Common.submit": "Enviar", + "Common.sunday": "Domingo", + "Common.thursday": "Jueves", + "Common.today": "Hoy", + "Common.tuesday": "Martes", + "Common.uninstall": "Desinstalar", + "Common.update": "Actualizar", + "Common.validation.email": "Correo electrónico incorrecto. Ingresa una dirección de correo electrónico válida", + "Common.value": "Valor", + "Common.warning": "Advertencia", + "Common.wednesday": "Miércoles", + "Common.yesterday": "Ayer", + "CommonEntityChanges.create": "creó el panel de control", + "CommonEntityChanges.createFilter": "creó un filtro", + "CommonEntityChanges.createPattern": "creó un patrón", + "CommonEntityChanges.createWidget": "creó un widget", + "CommonEntityChanges.deleteDashboard": "eliminó el panel de control", + "CommonEntityChanges.deleteFilter": "eliminó el filtro", + "CommonEntityChanges.deletePattern": "eliminó el patrón", + "CommonEntityChanges.deleteWidget": "eliminó el widget", + "CommonEntityChanges.matchedPattern": "el patrón fue encontrado", + "CommonEntityChanges.updateDashboard": "actualizó el panel de control", + "CommonEntityChanges.updateFilter": "actualizó el filtro", + "CommonEntityChanges.updatePattern": "actualizó el patrón", + "CommonEntityChanges.updateWidget": "actualizó el widget", + "CommonWidgetControls.descriptionLabel": "Descripción", + "CommonWidgetControls.descriptionPlaceholder": "Introduzca la descripción del widget", + "CommonWidgetControls.nameLabel": "Nombre del widget", + "CommonWidgetControls.namePlaceholder": "Introduzca el nombre del widget", + "CommonWidgetControls.widgetNameExistsHint": "Este nombre ya está en uso", + "CommonWidgetControls.widgetNameHint": "El nombre del widget debe tener entre 3 y 128 caracteres", + "CompareLaunchDialog.compareLaunchHeader": "Comparar ejecuciones", + "CompareWithFilterControl.compareTitle": "Añade una columna adicional con los resultados de las últimas ejecuciones de pruebas en el filtro seleccionado", + "ComponentHealthCheck.failedGroupsTitle": "Pruebas fallidas", + "ComponentHealthCheck.passedGroupsTitle": "Pruebas pasadas", + "ComponentHealthCheckChartColorScheme.maxPassingRateValueMessage": "{value} - 100%", + "ComponentHealthCheckChartColorScheme.minPassingRateValueMessage": "menos del {value}%", + "ComponentHealthCheckControls.ComponentTitle": "Componente", + "ComponentHealthCheckControls.PassingRateFieldLabel": "Porcentaje mínimo de pruebas pasadas para el componente", + "ComponentHealthCheckControls.PassingRateValidationError": "Debe ser un valor entre 50 y 100", + "ComponentHealthCheckControls.attributesArrayValidationError": "Introduzca las claves de atributo cuyos valores únicos se utilizarán para agrupar las pruebas", + "ComponentHealthCheckControls.excludeSkipped": "Excluir pruebas omitidas de la estadística", + "ComponentHealthCheckTable.automationBugColumnTitle": "Error de automatización", + "ComponentHealthCheckTable.customColumnHint": "Columna personalizada:", + "ComponentHealthCheckTable.nameColumn": "Nombre", + "ComponentHealthCheckTable.nameTotal": "Total", + "ComponentHealthCheckTable.passRateColumn": "Tasa de pasados", + "ComponentHealthCheckTable.passingRateHint": "Tasa de pasados:", + "ComponentHealthCheckTable.productBugColumnTitle": "Defectos del producto", + "ComponentHealthCheckTable.statusColumn": "Estado", + "ComponentHealthCheckTable.statusHint": "Estado", + "ComponentHealthCheckTable.systemIssueColumnTitle": "Problemas del sistema", + "ComponentHealthCheckTable.toInvestigateColumnTitle": "Problema sin analizar", + "ComponentHealthCheckTableViewControls.attributesArrayValidationError": "Introduzca las claves de atributo cuyos valores únicos se utilizarán para agrupar las pruebas", + "ComponentHealthCheckTableViewControls.componentTitle": "Componente", + "ComponentHealthCheckTableViewControls.customColumnPlaceholder": "Introduce una clave de atributo", + "ComponentHealthCheckTableViewControls.customColumnTitle": "Columna personalizada", + "ComponentHealthCheckTableViewControls.excludeSkipped": "Excluir pruebas omitidas de la estadística", + "ComponentHealthCheckTableViewControls.passingRateFieldLabel": "Porcentaje mínimo de pruebas aprobadas para el componente", + "ComponentHealthCheckTableViewControls.passingRateValidationError": "Debe ser un valor entre 50 y 100", + "ComponentHealthCheckTableViewControls.sortingTitle": "Ordenación", + "Conditions.all": "Todos", + "Conditions.allShort": "Todos", + "Conditions.any": "Cualquiera", + "Conditions.anyShort": "Cual", + "Conditions.cnt": "Contiene", + "Conditions.cntShort": "cont", + "Conditions.eq": "Igual a", + "Conditions.eqShort": "igual", + "Conditions.gte": "Mayor o igual que", + "Conditions.gteShort": "≥", + "Conditions.lte": "Menor o igual que", + "Conditions.lteShort": "≤", + "Conditions.notCnt": "No contiene", + "Conditions.notCntShort": "!cont", + "Conditions.notEq": "No igual a", + "Conditions.notEqShort": "!igual", + "Conditions.withoutAll": "Sin todos", + "Conditions.withoutAllShort": "!todos", + "Conditions.withoutAny": "Sin ninguno", + "Conditions.withoutAnyShort": "!cualquiera", + "ConnectionSection.connectedMessage": "Conectado", + "ConnectionSection.connectionFailedCapture": "Por favor, compruebe la configuración de la integración o intente conectarse más tarde.", + "ConnectionSection.connectionFailedDescription": "No se pudo conectar con {pluginName}", + "ConnectionSection.connectionFailedHeader": "Error de conexión", + "ConnectionSection.connectionFailedMessage": "Error de conexión", + "ConnectionSection.deleteIntegrationDescription": "¿Está seguro de que desea eliminar la integración?", + "ConnectionSection.removeIntegrationSuccess": "Integración eliminada con éxito", + "ConnectionSection.warningMessage": "Advertencia", + "ConnectionSection.warningMessageDescription": "Las integraciones globales están inactivas porque ha configurado la integración del proyecto.", + "CopySendDefectModal.buttonCopyTitle": "Obtener", + "CopySendDefectModal.buttonSendTitle": "Enviar", + "CopySendDefectModal.contentCopyTitle": "¿Está seguro de que desea obtener los datos del defecto de la ejecución fallida anterior?", + "CopySendDefectModal.contentSendTitle": "¿Está seguro de que desea enviar los datos del defecto a la última ejecución?", + "CopySendDefectModal.headerCopyTitle": "Obtener resultados de la ejecución anterior", + "CopySendDefectModal.headerSendTitle": "Enviar resultados a la última ejecución", + "CopySendDefectModal.successMessage": "Defectos actualizados", + "CreatePatternAnalysisModal.createPatternModalCondition": "Condición del patrón", + "CreatePatternAnalysisModal.createPatternModalDescription": "Cree un patrón especificando la condición para la causa común del fallo", + "CreatePatternAnalysisModal.createPatternModalHeader": "Crear regla de patrón", + "CreatePatternAnalysisModal.createPatternModalPatternName": "Nombre del patrón", + "CreatePatternAnalysisModal.createPatternModalToggle": "Activo", + "CreatePatternAnalysisModal.createPatternModalType": "Tipo", + "CreatePatternAnalysisModal.patternConditionPlaceholder": "Descripción del texto", + "CreateProject": "creado", + "CumulativeTrendControls.CriteriaFieldLabel": "Criterios para el widget", + "CumulativeTrendControls.LaunchesLimitFieldLabel": "Número de ejecuciones", + "CumulativeTrendControls.LaunchesLimitValidationError": "El número de elementos debe ser entre 1 y 20000", + "CumulativeTrendControls.attributeKeyFieldLabelDetailedView": "(vista detallada)", + "CumulativeTrendControls.attributeKeyFieldLabelOverview": "(vista general)", + "CumulativeTrendControls.attributesArrayValidationError": "Introduzca una clave de atributo cuyos valores únicos se utilizarán para agrupar ejecuciones en grupos", + "CumulativeTrendControls.attributesTitle": "Agregar atributos", + "CustomColumnItem.attributeKeyPlaceholder": "Clave del atributo", + "CustomColumnItem.label": "Columna personalizada", + "CustomColumnItem.namePlaceholder": "Nombre de la columna", + "CustomColumnsControl.addColumn": "+ Añadir columna personalizada", + "CustomColumnsControl.tip": "Puede añadir una columna personalizada para ver los atributos con la clave seleccionada", + "DashboardEmptyResults.currentUserDashboardsActionText": "Agregar nuevo panel de control", + "DashboardEmptyResults.currentUserDashboardsHeadline": "No tienes paneles de control", + "DashboardEmptyResults.currentUserDashboardsText": "Añade tu primer panel de control para analizar las estadísticas", + "DashboardEmptyResults.noDashboardFound": "No se encontraron paneles de control para \"{filter}\"", + "DashboardForm.addModalSubmitButtonText": "Añadir", + "DashboardForm.addModalTitle": "Añadir nuevo panel de control", + "DashboardForm.dashboardDescriptionLabel": "Descripción", + "DashboardForm.dashboardDescriptionPlaceholder": "Introduzca la descripción del panel de control", + "DashboardForm.dashboardNameLabel": "Nombre", + "DashboardForm.dashboardNamePlaceholder": "Introduzca el nombre del panel de control", + "DashboardForm.editModalSubmitButtonText": "Actualizar", + "DashboardForm.editModalTitle": "editar panel de control", + "DashboardForm.modalCancelButtonText": "Cancelar", + "DashboardHeaderButton.buttonTooltip": "Se alcanzó el límite de 300 paneles de control. Para crear uno nuevo, debe eliminar al menos uno de los creados anteriormente", + "DashboardItemPage.addNewWidget": "Añadir nuevo widget", + "DashboardItemPage.addWidgetSuccess": "Widget añadido", + "DashboardItemPage.dashboardEmptyText": "Añade el primer widget para analizar las estadísticas", + "DashboardItemPage.delete": "Eliminar", + "DashboardItemPage.editDashboard": "Editar", + "DashboardItemPage.fullscreen": "Modo pantalla completa", + "DashboardItemPage.notMyDashboardEmptyHeader": "No hay widgets en este panel de control", + "DashboardPage.addDashboardSuccess": "El panel de control fue añadido", + "DashboardPage.deleteDashboardSuccess": "El panel de control fue eliminado", + "DashboardPage.modal.deleteModalConfirmationText": "¿Está seguro de que desea eliminar el panel de control '{name}'? Perderá acceso a él. Esta acción no se puede deshacer.", + "DashboardPage.modal.deleteModalSubmitButtonText": "Eliminar", + "DashboardPage.modal.deleteModalTitle": "eliminación del panel de control", + "DashboardPage.modal.deleteModalWarningMessage": "Está a punto de eliminar un panel de control que no es suyo. Esto puede afectar a la información de otros usuarios del proyecto.", + "DashboardPage.modal.modalCancelButtonText": "Cancelar", + "DashboardPage.noResults": "No se encontraron resultados", + "DashboardPage.print": "Imprimir", + "DashboardPage.title": "Todos los paneles de control", + "DashboardPageHeader.allDashboardsTitle": "Todos los paneles de control", + "DashboardPageToolbar.searchPlaceholder": "Buscar por nombre", + "DashboardPrintPage.dashboardTitle": "Panel de control:", + "DashboardPrintPage.print": "Imprimir", + "DashboardPrintPage.projectTitle": "Proyecto:", + "DashboardTable.dashboardName": "Nombre del Panel de control", + "DashboardTable.deleteDashboard": "Eliminar", + "DashboardTable.description": "Descripción", + "DashboardTable.edit": "Editar", + "DashboardTable.owner": "Propietario", + "DefaultProjectSettings.from": "desde", + "DefaultProjectSettings.keepAttachments": "Mantener adjuntos", + "DefaultProjectSettings.keepLaunches": "Mantener ejecuciones", + "DefaultProjectSettings.keepLogs": "Mantener registros", + "DefaultProjectSettings.launchInactivity": "Tiempo de inactividad de la ejecución", + "DefaultProjectSettings.to": "a", + "DefaultPropertiesForIssueForm.availableIssueTypesHeader": "Tipos de problema disponibles en el servidor", + "DefaultPropertiesForIssueForm.defaultIssueFormPropsHeader": "Propiedades predeterminadas para el formulario de error", + "DefaultPropertiesForIssueForm.defaultValueHeader": "Valor predeterminado", + "DefaultPropertiesForIssueForm.showFieldsHeader": "Mostrar", + "DefaultPropertiesForIssueForm.tooltip": "Campos para publicar errores en el BTS", + "DefectTypeChanges.create": "tipo de defecto creado", + "DefectTypeChanges.defectTypes": "tipos de defectos", + "DefectTypeChanges.delete": "tipo de defecto eliminado", + "DefectTypeChanges.update": "tipo de defecto actualizado", + "DefectTypeTooltip.ab-total": "Total de Errores de Automatización", + "DefectTypeTooltip.nd-total": "Total de Sin Defecto", + "DefectTypeTooltip.pb-total": "Total de Errores de Producto", + "DefectTypeTooltip.si-total": "Total de Problemas del Sistema", + "DefectTypeTooltip.ti-total": "Total de Problemas a Investigar", + "DefectTypes.AUTOMATION_BUG": "Error de automatización", + "DefectTypes.AUTOMATION_BUG_TOTAL": "Grupo de Errores de Automatización", + "DefectTypes.NO_DEFECT": "Sin problema", + "DefectTypes.NO_DEFECT_TOTAL": "Grupo Sin Defectos", + "DefectTypes.PRODUCT_BUG": "Defecto del producto", + "DefectTypes.PRODUCT_BUG_TOTAL": "Grupo de Defectos del Producto", + "DefectTypes.SYSTEM_ISSUE": "Error del sistema", + "DefectTypes.SYSTEM_ISSUE_TOTAL": "Grupo de Errores del Sistema", + "DefectTypes.TO_INVESTIGATE": "Requiere análisis", + "DefectTypes.TO_INVESTIGATE_TOTAL": "Grupo Requiere Análisis", + "DefectTypesTab.abbreviationCol": "Abreviatura", + "DefectTypesTab.automationBugsGroup": "Grupo de errores de automatización", + "DefectTypesTab.copyToClipboardLocator": "La herramienta de identificación del tipo de defecto se copió correctamente", + "DefectTypesTab.createDefectHeader": "Crear Tipo de Defecto", + "DefectTypesTab.createDefectIcon": "Crear nuevo Tipo de Defecto", + "DefectTypesTab.defectLongNameHint": "El nombre del Tipo de Defecto debe tener entre '3' y '55' caracteres", + "DefectTypesTab.defectNameCol": "Nombre del Tipo de Defecto", + "DefectTypesTab.defectShortNameHint": "La abreviatura del Tipo de Defecto debe tener entre '1' y '4' caracteres", + "DefectTypesTab.deleteModalHeader": "Eliminar tipo de defecto", + "DefectTypesTab.description": "Los Tipos de Defectos son un conjunto de defectos que probablemente aparezcan durante la ejecución de las pruebas. Puedes usar los Tipos de Defectos predeterminados para marcar elementos de prueba o crear tus propios Tipos de Defectos para facilitar el análisis de las ejecuciones. Puedes encontrar más información sobre los Tipos de Defectos en la Documentación.", + "DefectTypesTab.informationMessage": "Solo te quedan {length} {slot} para crear tipos de defectos", + "DefectTypesTab.informationMessageMultiply": "ranuras", + "DefectTypesTab.informationMessageSingle": "ranura", + "DefectTypesTab.informationSubMessage": "Has usado {currentLength} tipos de defectos de los {maxLength} disponibles. Una vez alcanzado el límite, no podrás crear un nuevo tipo de defecto hasta que elimines al menos uno previamente creado", + "DefectTypesTab.informationTitle": "Información", + "DefectTypesTab.noDefectBugsGroup": "Grupo sin defectos", + "DefectTypesTab.productBugsGroup": "Grupo de defectos del producto", + "DefectTypesTab.systemIssuesGroup": "Grupo de errores del sistema", + "DefectTypesTab.toInvestigateBugsGroup": "Grupo requiere análisis", + "DefectTypesTab.warningMessage": "Has alcanzado el límite máximo de tipos de defectos disponibles para cada proyecto", + "DefectTypesTab.warningSubMessage": "La cantidad de tipos de defectos en tu proyecto es actualmente de {maxLength} de {maxLength}. Podrás crear uno nuevo después de eliminar al menos uno previamente creado", + "DeleteAccountBlock.deleteAccount": "Eliminar cuenta", + "DeleteAccountBlock.tooltipAdminDisabledText": "Solo los usuarios con un rol distinto al de administrador pueden eliminar su cuenta.\nAdemás, otro administrador también puede hacerlo.", + "DeleteAccountBlock.tooltipDefaultUserDisabledText": "It's forbidden to delete account of default user on Demo instance.", + "DeleteAccountFeedbackModal.alternative": "Encontré una mejor alternativa", + "DeleteAccountFeedbackModal.continue": "Continuar", + "DeleteAccountFeedbackModal.deleteAccountReasonSizeHint": "El campo debe tener un tamaño máximo de 128 caracteres.", + "DeleteAccountFeedbackModal.description": "¿Por qué estás eliminando tu cuenta?", + "DeleteAccountFeedbackModal.dissatisfied": "Insatisfecho con el servicio", + "DeleteAccountFeedbackModal.header": "Eliminar cuenta", + "DeleteAccountFeedbackModal.noNeeded": "La cuenta ya no es necesaria", + "DeleteAccountFeedbackModal.other": "Otro", + "DeleteAccountModal.deleteAccountNote": "El proceso es irreversible. Al hacer clic en el botón \"Eliminar\" aceptas eliminar toda tu información personal, incluidos el nombre de tu cuenta, la dirección de correo electrónico y la foto de nuestra base de datos.", + "DeleteAccountModal.deletePersonalDataNote": "Todos los datos que creaste o transferiste a ReportPortal permanecerán en la aplicación, pero ya no estarán disponibles para ti. Esto incluye cualquier ejecución, filtro, widget, panel de control, etc.", + "DeleteAccountModal.header": "Eliminar cuenta", + "DeleteAccountModal.label": "Introduce \"DELETE\" para confirmar", + "DeleteAccountModal.question": "¿Estás seguro de que quieres eliminar tu cuenta?", + "DeleteDefectTypeModal.message": "¿Estás seguro de que quieres eliminar {name}?", + "DeleteDefectTypeModal.title": "Eliminar {name}", + "DeleteFilterDialog.deleteFilter": "¿Estás seguro de que quieres eliminar el filtro '{name}'?", + "DeleteFilterDialog.deleteFilterHeader": "Eliminar filtro", + "DeleteFilterDialog.deleteFilterOwnerWarning": "Estás a punto de eliminar un filtro que no es tuyo. Esto puede afectar la información de otros usuarios del proyecto.", + "DeleteImageModal.header": "Eliminar foto", + "DeleteImageModal.text": "¿Estás seguro de que quieres eliminar la foto de perfil?", + "DeleteLaunchModal.deleteImportantLaunchMessage": "”{name}” está marcado como importante.
¿Estás seguro de que deseas eliminar esta ejecución importante?", + "DeleteLaunchModal.deleteImportantLaunchesMessage": "{importantCount} ejecuciones están marcadas como importantes.
¿Estás seguro de que deseas eliminar estas ejecuciones importantes?", + "DeleteLaunchModal.deleteModalContent": "¿Estás seguro de que deseas eliminar la ejecución '{name}'? Perderás el acceso a ella.", + "DeleteLaunchModal.deleteModalHeader": "Eliminar ejecución", + "DeleteLaunchModal.deleteModalMultipleContent": "¿Estás seguro de que deseas eliminar las ejecuciones? Perderás el acceso a ellas.", + "DeleteLaunchModal.deleteModalMultipleHeader": "Eliminar ejecuciones", + "DeleteLaunchModal.deleteWithImportantLaunchMessage": "\"{name}\" está marcado como importante.
¿Estás seguro de que deseas eliminar también estas ejecuciones importantes?", + "DeleteLaunchModal.deleteWithImportantLaunchesMessage": "{importantCount} ejecuciones están marcadas como importantes entre {totalCount} ejecuciones que estás intentando eliminar. ¿Estás seguro de que deseas eliminar también estas ejecuciones importantes?", + "DeleteLaunchModal.warning": "Estás a punto de eliminar una ejecución que no es tuya. Esto puede afectar la información de otros usuarios del proyecto.", + "DeleteLaunchModal.warningMultiple": "Estás a punto de eliminar ejecuciones que no son tuyas. Esto puede afectar la información de otros usuarios del proyecto.", + "DeleteNotificationCaseModal.title": "Eliminar regla de notificación", + "DeleteNotificationModal.message": "¿Estás seguro de que deseas eliminar esta regla de notificaciones?", + "DeleteWidgetModal.deleteNotOwnWidgetWarning": "Estás a punto de eliminar un widget que no es tuyo. Esto puede afectar la información de otros usuarios del proyecto.", + "DeleteWidgetModal.deleteOwnWidgetWarning": "Estás a punto de eliminar tu propio widget. Esto puede afectar la información en tus paneles de control.", + "DeleteWidgetModal.deleteWidgetHeader": "Eliminar widget", + "DeleteWidgetModal.deleteWidgetText": "¿Estás seguro de que deseas eliminar el widget '{name}'? Perderás el acceso a ella. Esta acción no se puede deshacer.", + "DemoBanner.descriptionDefault": "Has iniciado sesión con una cuenta \"Demo\". Para trabajar con datos de forma segura, usa ", + "DemoBanner.descriptionGithub": "Estás utilizando un proyecto personal de Github.", + "DemoBanner.githubAuthNotFound": "La autorización de GitHub no está configurada. Contacta al administrador.", + "DemoBanner.githubAuthTitle": "autorización de GitHub", + "DemoBanner.timerCaption": "Los datos serán eliminados en", + "DemoDataTab.descriptionDetails": "Los datos de demostración te ayudarán a familiarizarte con las funcionalidades de ReportPortal. Al crear datos de demostración, se generarán varios objetos que te servirán como ejemplo. El panel de demostración y el filtro solo se generarán si aún no los tienes.", + "DemoDataTab.descriptionHeader": "El sistema generará los siguientes datos de demostración:", + "DemoDataTab.descriptionListFirstItem": "5 ejecuciones", + "DemoDataTab.descriptionListSecItem": "1 panel de control con 9 widgets", + "DemoDataTab.descriptionListThirdItem": "1 filtro", + "DemoDataTab.descriptionWarningMessageContent": "Si creas datos de demostración, tendrás que eliminarlos manualmente", + "DemoDataTabForm.demoDataPostfixHint": "El sufijo debe tener entre 1 y 90 caracteres", + "DisplayFilter.display": "Mostrar en ejecuciones:", + "DisplayFilter.showOnLaunchesSwitcherOff": "Desactivado", + "DisplayFilter.showOnLaunchesSwitcherOn": "Activado", + "DurationBlock.finishedDuration": "Duración: {durationTime}.", + "DurationBlock.finishedTime": "Hora de finalización: {endTime}", + "DurationBlock.inProgress": "En proceso", + "DurationBlock.inProgressWithEnd": "Estado incorrecto: 'En proceso' con hora de finalización", + "DurationBlock.interruptedDuration": "Ejecución INTERRUMPIDA después de: {durationTime}.", + "DurationBlock.left": "queda", + "DurationBlock.notInProgressWithoutEnd": "Estado incorrecto: el elemento no está 'En proceso', pero no tiene hora de finalización", + "DurationBlock.overApproximate": "Tiempo promedio de ejecución - {end}, retraso actual - {over}", + "DurationBlock.skipped": "OMITIDO. Duración: {durationTime}", + "DurationBlock.stoppedDuration": "Ejecución DETENIDA después de: {durationTime}.", + "DurationBlock.stoppedTime": "Detenido en: {endTime}", + "DurationTooltip.message": "La duración es el intervalo entre el inicio del primer subejecución y la finalización del último subejecución. Pero si los subejecuciones ocurren en paralelo, la hora de finalización es la del subejecución más largo, en este caso la duración no será igual a la suma de las duraciones de los subejecuciones.", + "EditItemModal.attributesLabel": "Atributos", + "EditItemModal.contentTitle": "Detalles de {type}", + "EditItemModal.descriptionAdviceHint": "Has usado {length} de 2048 caracteres", + "EditItemModal.descriptionHint": "La descripción debe tener entre '0' y '2048' caracteres", + "EditItemModal.descriptionPlaceholder": "Introduce la descripción de {type}", + "EditItemModal.detailsTabTitle": "Detalles", + "EditItemModal.item": "elemento", + "EditItemModal.itemUpdateSuccess": "Completado con éxito", + "EditItemModal.launch": "ejecución", + "EditItemModal.launchUpdateSuccess": "Ejecución actualizada con éxito", + "EditItemModal.launchWarning": "Cambiar la descripción y los atributos puede afectar los resultados de los filtros, widgets, tendencias", + "EditItemModal.modalHeader": "Editar {type}", + "EditItemModal.stackTraceTabTitle": "Trazado de pila", + "EditItemModal.uuidLabel": "UUID:", + "EditItemsModal.commonAttributesLabel": "Atributos comunes", + "EditItemsModal.descriptionAddLabel": "Agregar a los existentes", + "EditItemsModal.descriptionLabel": "Descripción", + "EditItemsModal.descriptionLeaveLabel": "No cambiar", + "EditItemsModal.descriptionPlaceholder": "Introduce la descripción", + "EditItemsModal.descriptionReplaceLabel": "Reemplazar para todos los elementos", + "EditItemsModal.itemUpdateError": "Completado con error", + "EditItemsModal.itemUpdateSuccess": "Completado con éxito", + "EditItemsModal.items": "elementos", + "EditItemsModal.launches": "ejecuciones", + "EditItemsModal.modalHeader": "Editar {type}", + "EditItemsModal.uniqueAttributesLabel": "Atributos únicos", + "EditItemsModal.warningMessage": "El atributo será eliminado para todas las ejecuciones después de aplicar los cambios", + "EditPersonalInformationModal.emailLabel": "Correo electrónico", + "EditPersonalInformationModal.emailPlaceholder": "Introduce el correo electrónico", + "EditPersonalInformationModal.header": "Editar información personal", + "EditPersonalInformationModal.nameLabel": "Nombre de usuario", + "EditPersonalInformationModal.namePlaceholder": "Introduce el nombre de usuario", + "EditWidgetModal.editWidgetSuccess": "¡Widget actualizado!", + "EditWidgetModal.headerText": "Editar widget", + "EmailFormFields.authLabel": "Autorización", + "EmailFormFields.fromLabel": "Nombre del remitente predeterminado", + "EmailFormFields.hostLabel": "Host", + "EmailFormFields.passwordLabel": "Contraseña", + "EmailFormFields.portFieldHint": "Solo se permiten números del '1' al '65535'", + "EmailFormFields.portLabel": "Puerto", + "EmailFormFields.protocolLabel": "Protocolo", + "EmailFormFields.usernameLabel": "Correo del remitente", + "EmptyHistoryItem.emptyItemCaption": "El elemento está vacío", + "EmptyHistoryItem.emptyItemTooltip": "El escenario de prueba no se ha ejecutado", + "EmptyUniqueErr.button": "Iniciar análisis de errores únicos", + "EmptyUniqueErr.disableButtonTooltip": "Esta operación no se puede realizar para ejecuciones en proceso", + "EmptyUniqueErr.inProgressAnalysisText": "Análisis de errores únicos en curso. Para ver los errores únicos de esta ejecución, actualiza la página", + "EmptyUniqueErr.inProgressUniqueErrBtn": "En proceso...", + "EmptyUniqueErr.noUniqueErrHeadline": "No hay errores únicos", + "EmptyUniqueErr.noUniqueErrRunHeadline": "No se ha realizado el análisis de errores únicos", + "EmptyUniqueErr.rerunAnalysisText": "No se encontraron registros de errores en la ejecución. Pero si la ejecución ha cambiado, puedes volver a ejecutar el análisis", + "EmptyUniqueErr.text": "Aún no se ha realizado el análisis de errores únicos. Para ver el error único de esta ejecución, inicia el análisis manualmente", + "EmptyUniqueErrsAnalyzeModal.excludeNumbers": "Excluir números del registro", + "EmptyUniqueErrsAnalyzeModal.fieldName": "Números en el registro de errores:", + "EmptyUniqueErrsAnalyzeModal.includeNumbers": "Incluir números en el registro", + "EmptyUniqueErrsAnalyzeModal.okBtn": "Analizar", + "EmptyUniqueErrsAnalyzeModal.text": "Selecciona la base sobre la que se realizará el análisis de errores únicos:", + "EmptyUniqueErrsAnalyzeModal.title": "Analizar ejecución", + "EntitiesSelector.more": "Más", + "EntityItemStartTime.last2days": "Últimos 2 días", + "EntityItemStartTime.last30days": "Últimos 30 días", + "EntityItemStartTime.last7days": "Últimos 7 días", + "EntityItemStartTime.today": "Hoy", + "ErrorLogsBlock.errorLogs": "{count, plural, =0 {No hay registros de errores} one {{currentItem} registro de error} other {{currentItem} de {totalItems} registros de error}}", + "ErrorLogsBlock.errorLogsInitial": "{count, plural, =0 {No hay registros de errores} one {{totalItems} registro de error} other {{totalItems} registros de error}}", + "ErrorLogsBlock.nextErrorLog": "Mostrar el siguiente registro de error", + "ErrorLogsBlock.previousErrorLog": "Mostrar el registro de error anterior", + "ErrorLogsBlock.showErrorLog": "Mostrar", + "EventActions.analyzeItem": "AA cambió el tipo de defecto", + "EventActions.assignUser": "Asignar usuario", + "EventActions.changeRole": "Cambiar rol", + "EventActions.createDashboard": "Crear panel de control", + "EventActions.createDefect": "Crear defecto personalizado", + "EventActions.createFilter": "Crear filtro", + "EventActions.createIntegration": "Crear integración", + "EventActions.createInvitationLink": "Crear enlace de invitación", + "EventActions.createPattern": "Crear patrón", + "EventActions.createProject": "Crear proyecto", + "EventActions.createWidget": "Crear widget", + "EventActions.deleteDashboard": "Eliminar panel de control", + "EventActions.deleteDefect": "Eliminar defecto", + "EventActions.deleteFilter": "Eliminar filtro", + "EventActions.deleteIndex": "Eliminar índice", + "EventActions.deleteIntegration": "Eliminar integración", + "EventActions.deleteLaunch": "Eliminar ejecución", + "EventActions.deletePattern": "Eliminar patrón", + "EventActions.deleteWidget": "Eliminar widget", + "EventActions.finishImport": "Finalizar importación", + "EventActions.finishLaunch": "Finalizar ejecución", + "EventActions.generateIndex": "Generar índice", + "EventActions.import": "Importar", + "EventActions.linkIssue": "Vincular error", + "EventActions.linkIssueAA": "Vincular problema por autoanálisis", + "EventActions.markLaunchAsImportant": "Marcar la ejecución como importante", + "EventActions.matchedPattern": "El análisis de patrones encontró una coincidencia", + "EventActions.postIssue": "Crear error", + "EventActions.startImport": "Iniciar importación", + "EventActions.startLaunch": "Iniciar ejecución", + "EventActions.unassignUser": "Desasignar usuario", + "EventActions.unlinkIssue": "Desvincular error", + "EventActions.unmarkLaunchAsImportant": "Desmarcar ejecución como importante", + "EventActions.updateAnalyzer": "Actualizar autoanálisis", + "EventActions.updateAutoPatternAnalysisSettings": "Actualizar configuración del análisis de patrones", + "EventActions.updateDashboard": "Actualizar panel de control", + "EventActions.updateDefect": "Actualizar defecto", + "EventActions.updateFilter": "Actualizar filtro", + "EventActions.updateIntegration": "Actualizar integración", + "EventActions.updateItem": "Actualizar elemento", + "EventActions.updatePattern": "Actualizar patrón", + "EventActions.updateProject": "Actualizar proyecto", + "EventActions.updateWidget": "Actualizar widget", + "EventObjectTypes.dashboard": "Panel de control", + "EventObjectTypes.defectType": "Tipo de defecto", + "EventObjectTypes.emailConfig": "Configuración de correo electrónico", + "EventObjectTypes.filter": "Filtro", + "EventObjectTypes.import": "Importación", + "EventObjectTypes.index": "Índice", + "EventObjectTypes.integration": "Integración", + "EventObjectTypes.invitationLink": "Enlace de invitación", + "EventObjectTypes.itemIssue": "Elemento de prueba", + "EventObjectTypes.launch": "Ejecución", + "EventObjectTypes.patternRule": "Patrón", + "EventObjectTypes.project": "Proyecto", + "EventObjectTypes.user": "Usuario", + "EventObjectTypes.widget": "Widget", + "EventsGrid.actionCol": "Acción", + "EventsGrid.contains": "Contiene", + "EventsGrid.newValueCol": "Nuevo valor", + "EventsGrid.objectNameCol": "Nombre del objeto", + "EventsGrid.objectTypeCol": "Tipo de objeto", + "EventsGrid.oldValueCol": "Valor antiguo", + "EventsGrid.timeCol": "Hora", + "EventsGrid.userCol": "Usuario", + "EventsGrid.userSearchPlaceholder": "Introduce el nombre de usuario", + "ExpandToggler.hideCriteria": "Ocultar criterios", + "ExpandToggler.showCriteria": "Mostrar criterios", + "ExtensionError.message": "Ha ocurrido un error en el plugin.
Espera a que se restablezca la conexión
o contacta con el administrador.", + "ExternalSystems.createIntegration": "configuró", + "ExternalSystems.deleteIntegration": "eliminó", + "ExternalSystems.emailDefaultName": "Servidor de correo", + "ExternalSystems.fromProject": "del proyecto", + "ExternalSystems.properties": "propiedades", + "ExternalSystems.updateIntegration": "actualizó ", + "ExternalUserInvitationModal.copyLink": "Copiar enlace", + "ExternalUserInvitationModal.description": "Invitar usuario al proyecto", + "ExternalUserInvitationModal.email": "La invitación fue enviada a", + "ExternalUserInvitationModal.header": "Invitar usuario", + "ExternalUserInvitationModal.link": "Enlace de invitación", + "FailedCasesTrendChart.failedCases": "escenarios fallidos", + "FailedCasesTrendControls.ItemsFieldLabel": "Elementos", + "FailedCasesTrendControls.ItemsValidationError": "El número de elementos debe estar entre '1' y '600'", + "Filter.add": "Agregar filtro", + "Filter.descriptionPlaceholder": "Introduce la descripción del filtro", + "Filter.edit": "Editar filtro", + "Filter.name": "Nombre", + "Filter.namePlaceholder": "Introduce el nombre del filtro", + "FilterAdd.addTitle": "Agregar nuevo filtro", + "FilterEdit.editTitle": "Editar filtro", + "FilterNameById.statistics$defects$automation_bug": "Error de automatización", + "FilterNameById.statistics$defects$no_defect": "Sin defecto", + "FilterNameById.statistics$defects$product_bug": "Defecto de producto", + "FilterNameById.statistics$defects$system_issue": "Error del sistema", + "FilterNameById.statistics$defects$to_investigate": "Para investigar", + "FilterNameById.statistics$executions$failed": "Fallado", + "FilterNameById.statistics$executions$passed": "Pasado", + "FilterNameById.statistics$executions$skipped": "Omitido", + "FilterNameById.statistics$executions$total": "Total", + "FilterOptions.and": "Y", + "FilterOptions.any": "cualquiera de", + "FilterOptions.attributeKey": "Claves de atributos", + "FilterOptions.attributeValue": "Valores de atributos", + "FilterOptions.cnt": "contiene", + "FilterOptions.compositeAttribute": "Atributo", + "FilterOptions.description": "Descripción", + "FilterOptions.dynamic": "(dinámico)", + "FilterOptions.failed": "Fallado", + "FilterOptions.from": "desde", + "FilterOptions.has": "contiene", + "FilterOptions.in": "cualquiera de", + "FilterOptions.name": "Nombre de la ejecución", + "FilterOptions.not_any": "sin ninguno de", + "FilterOptions.not_cnt": "no contiene", + "FilterOptions.not_has": "no tiene", + "FilterOptions.not_in": "sin", + "FilterOptions.number": "Número de ejecución", + "FilterOptions.passed": "Pasado", + "FilterOptions.skipped": "Omitido", + "FilterOptions.sort": "ordenado por", + "FilterOptions.startTime": "Hora de inicio", + "FilterOptions.tags": "Etiquetas", + "FilterOptions.to": "hasta", + "FilterOptions.total": "Total", + "FilterOptions.user": "Propietario", + "FilterSort.autoBug": "Error de automatización", + "FilterSort.failed": "Fallado", + "FilterSort.launchName": "Nombre de la ejecución", + "FilterSort.passed": "Pasado", + "FilterSort.productBug": "Defecto de producto", + "FilterSort.skipped": "Omitido", + "FilterSort.sortBy": "Ordenar por", + "FilterSort.startTime": "Hora de inicio", + "FilterSort.systemIssue": "Problema del sistema", + "FilterSort.toInvestigate": "Problema sin investigar", + "FilterSort.total": "Total", + "Filters.refine": "Refinar:", + "FiltersActionBar.unsavedFilter": "Filtro no guardado", + "FiltersActionPanel.addFilterButton": "Agregar filtro", + "FiltersActionPanel.searchInputPlaceholder": "Buscar por Nombre", + "FiltersBlock.hasScreenshot": "Tiene capturas de pantalla", + "FiltersControl.insertFilterError": "Error al crear el filtro", + "FiltersControl.insertFilterSuccess": "Filtro creado", + "FiltersControl.notFound": "No se encontraron filtros para \"{filter}\".", + "FiltersControl.notFoundAdditionalInfo": "Agregue el primer filtro", + "FiltersControl.notFoundOnProject": "No hay filtros para el proyecto", + "FiltersControl.updateFilterError": "Error al actualizar el filtro", + "FiltersControl.updateFilterSuccess": "¡Filtro actualizado!", + "FiltersPage.addFilter": "Agregar filtro", + "FiltersPage.filterDeleted": "Filtro eliminado", + "FiltersPage.filterNameDuplicateHint": "Ya existe un filtro con este nombre en el proyecto.", + "FiltersPage.filterNameLength": "El nombre del filtro debe tener entre 3 y 128 caracteres.", + "FiltersPage.filterUpdated": "Filtro actualizado", + "FiltersPage.msgFavoriteFilters": "Los filtros son consultas de búsqueda que se han guardado para reutilizar.", + "FiltersPage.notFound": "No se encontraron filtros para \"{filter}\"", + "FiltersPage.searchByName": "Buscar por nombre", + "FiltersPage.title": "Filtros", + "FiltersWrapper.chooseFilter": "Elija un filtro de la lista a continuación", + "FlakyTestCasesTableControls.IncludeMethodsControlText": "Incluyendo métodos Before y After", + "FlakyTestCasesTableControls.ItemsFieldLabel": "Total de ejecuciones", + "FlakyTestCasesTableControls.ItemsValidationError": "El número de elementos debe estar entre '2' y '100'", + "FlakyTestCasesTableControls.LaunchNameFieldLabel": "Nombre de la ejecución", + "FlakyTestCasesTableControls.LaunchNamePlaceholder": "Ingrese el nombre de la ejecución", + "FlakyTestCasesTableControls.LaunchNamesValidationError": "Debe seleccionar al menos un elemento", + "FlakyTests.table.header.lastSwitch": "Último cambio", + "FlakyTests.table.header.ofSwitches": "% de cambios", + "FlakyTests.table.header.ofSwitchesShort": "% de cambio", + "FlakyTests.table.header.switches": "Cambios", + "FlakyTests.table.header.switchesShort": "Cambio", + "FlakyTests.table.header.testCase": "Caso de prueba", + "Footer.build": "Build", + "Footer.contact": "Contáctenos", + "Footer.copyright": "Todos los derechos reservados", + "Footer.deleteImportantLaunch": "Eliminar ejecución importante", + "Footer.deleteImportantLaunches": "Eliminar ejecuciones importante", + "Footer.deleteOnlyRegular": "Eliminar solo regulares", + "Footer.deleteWithImportantLaunch": "Eliminar con Ejecuciones Importantes", + "Footer.documentation": "Documentación", + "Footer.git": "Estamos en GitHub", + "Footer.privacy": "Política de privacidad", + "Footer.slack": "Charla con nosotros en Slack", + "ForceUpdateModal.additionalText": "Por favor, vuelva a iniciar sesión para aplicar los cambios.", + "ForceUpdateModal.header": "¡Atención!", + "ForceUpdateModal.relogin": "Volver a iniciar sesión", + "ForceUpdateModal.text": "Actualización de datos desde {account}: información para el usuario ''{user}'' sincronizada correctamente.", + "ForgotPasswordBlock.enterEmail": "Ingrese su dirección de correo electrónico para recuperarla", + "ForgotPasswordBlock.forgotPass": "¿Olvidó su contraseña?", + "ForgotPasswordForm.cancel": "Cancelar", + "ForgotPasswordForm.emailPlaceholder": "Ingrese correo electrónico", + "ForgotPasswordForm.sendEmail": "Enviar correo electrónico", + "ForgotPasswordForm.successSendEmail": "Las instrucciones para restablecer la contraseña se han enviado a la dirección de correo electrónico {email}", + "Fullscreen.exitNote": "Presione Esc para salir del modo de pantalla completa", + "GeneralInfo.launchesPerWeek": "promedio de ejecuciones por semana", + "GeneralInfo.launchesQuantity": "ejecución(es)", + "GeneralInfo.uniqueTickets": "error único reportado", + "GeneralInfo.usersQuantity": "participante(s)", + "GeneralTab.day1": "1 día", + "GeneralTab.forever": "Siempre", + "GeneralTab.hour1": "1 hora", + "GeneralTab.hour12": "12 horas", + "GeneralTab.hour3": "3 horas", + "GeneralTab.hour6": "6 horas", + "GeneralTab.interruptedJob": "Tiempo de inactividad de la ejecución", + "GeneralTab.interruptedJobDescription": "Asigne un tiempo de trabajo para interrumpir ejecuciones inactivas", + "GeneralTab.keepLaunches": "Mantener ejecuciones", + "GeneralTab.keepLaunchesDescription": "Cuánto tiempo mantener las ejecuciones antiguas. La ejecución y todos sus descendientes (paquetes, pruebas, pasos, registros) serán eliminados. La ejecución será eliminada de los filtros y widgets", + "GeneralTab.keepLaunchesTooltip": "No se puede seleccionar un valor menor que el de 'Mantener registros en el registro' o 'Mantener capturas de pantalla'", + "GeneralTab.keepLogs": "Mantener registros en el registro", + "GeneralTab.keepLogsDescription": "Cuánto tiempo mantener los registros antiguos en las ejecuciones. Las ejecuciones correspondientes se mantendrán para no perder estadísticas", + "GeneralTab.keepLogsTooltip": "No se puede seleccionar un valor menor que el de 'Mantener capturas de pantalla'", + "GeneralTab.keepScreenshots": "Mantener capturas de pantalla", + "GeneralTab.keepScreenshotsDescription": "Cuánto tiempo mantener las capturas de pantalla en el sistema", + "GeneralTab.month1": "30 días", + "GeneralTab.month3": "90 días", + "GeneralTab.month6": "180 días", + "GeneralTab.projectNameLabel": "Nombre", + "GeneralTab.updateErrorNotification": "No se pudo actualizar la configuración del proyecto", + "GeneralTab.updateSuccessNotification": "Configuración del proyecto actualizada correctamente", + "GeneralTab.week1": "7 días", + "GeneralTab.week2": "14 días", + "GeneralTab.week3": "21 días", + "GenerateApiKeyModal.apiKeyNameUniqueHint": "Ya existe una clave API con este nombre", + "GenerateApiKeyModal.apiKeyNameWrongSizeHint": "El nombre de la clave API debe tener entre 1 y 40 caracteres.", + "GenerateApiKeyModal.counterText": "Número de caracteres restantes: ", + "GenerateApiKeyModal.description": "Se generará una nueva clave API. Guarde esta clave. No recomendamos hacer pública esta clave.", + "GenerateApiKeyModal.exceededCounterText": "Ha ingresado {used} de {allowed} caracteres", + "GenerateApiKeyModal.header": "Generar clave API", + "GenerateApiKeyModal.loaderText": "GENERÁNDOSE", + "GenerateApiKeyModal.nameLabel": "Nombre de la clave API", + "GenerateApiKeyModal.notificationFail": "No se pudo generar la clave API", + "GenerateApiKeyModal.successNotification": "Clave API generada correctamente", + "GenerateDemoDataBlock.generateButtonTitle": "Generar datos de demostración", + "GenerateDemoDataBlock.generateDemoDataSuccess": "Se han generado datos de demostración", + "GenerateDemoDataBlock.mobileHint": "Solo puede generar datos en la versión de escritorio de la aplicación.", + "GenerateDemoDataBlock.preloaderInfoNewText": "Espere, la generación de datos está en curso y puede tardar varios minutos.", + "GenerateIndexModal.contentHeaderMessage": "¿Está seguro de que desea volver a generar el índice en el motor de búsqueda?", + "GenerateIndexModal.generateButtonText": "Generar", + "GenerateIndexModal.generateSuccessNotification": "Se ha iniciado la generación del índice", + "GenerateIndexModal.headerGenerateIndexModal": "Generar índice", + "GenerateIndexModal.noteBlockText": "Al finalizar el proceso, recibirá un correo electrónico.", + "GenerateIndexModal.noteBlockTitle": "Nota:", + "GithubAuthForm.formHeader": "GitHub", + "GithubAuthForm.switcherLabel": "Autenticación en GitHub", + "GithubAuthFormFields.clientIdLabel": "ID del cliente", + "GithubAuthFormFields.clientSecretLabel": "Secreto del cliente", + "Hamburger.analysis": "Análisis", + "Hamburger.export": "Exportar:", + "Hamburger.launchFinished": "La ejecución ya ha finalizado", + "Hamburger.launchInProgress": "¡La ejecución no debe estar en estado EN CURSO!", + "Hamburger.markAsImportant": "Marcar como importante", + "Hamburger.noPatternsEnabled": "Patrones no habilitados", + "Hamburger.noPermissions": "No eres el propietario de la ejecución", + "Hamburger.notYourLaunch": "La ejecución no fue creada por usted", + "Hamburger.patternAnalysis": "Análisis de patrones", + "Hamburger.serviceAnalyzerDisabledTooltip": "El servicio de análisis no está activo", + "Hamburger.uniqueErrorAnalysis": "Análisis de errores únicos", + "Hamburger.uniqueErrorAnalysisIsInProgress": "El análisis de errores únicos está en progreso", + "Hamburger.uniqueErrorAnalysisLaunchesInProgressError": "Análisis de errores únicos está en progreso", + "Hamburger.unmarkAsImportant": "Desmarcar como importante", + "HistoryControls.depthTitle": "Profundidad de historial", + "HistoryControls.historyBaseAll": "Todas las ejecuciones", + "HistoryControls.historyBaseSameName": "Ejecuciones con nombres iguales", + "HistoryControls.historyBaseTitle": "Base", + "HistoryLine.loadMore": "+{number} Más", + "HistoryLineItemTooltip.bts": "Enlaces BTS incluidos", + "HistoryLineItemTooltip.comment": "Comentario incluidos", + "HistoryLineItemTooltip.defectType": "Tipo de defecto:", + "HistoryLineItemTooltip.duration": "Duración:", + "HistoryLineItemTooltip.launch": "Ejecución", + "HistoryLineItemTooltip.launchAttributes": "Atributos de la ejecución:", + "HistoryLineItemTooltip.launchName": "Nombre de la ejecución", + "HistoryTable.itemNamesHeaderTitle": "Nombre", + "HistoryTable.launchNumberTitle": "Ejecución n.º", + "HistoryTable.loadMoreHistoryItemsTitle": "Haga clic aquí para cargar más elementos", + "HistoryTable.noHistoryItems": "No hay elementos de historial", + "IgnoreInAAModal.ignoreButton": "Ignorar", + "IgnoreInAAModal.successMessage": "Elemento ignorado con éxito en el Análisis Automático", + "IgnoreInAAModal.successMessageMultiple": "Elementos ignorados con éxito en el Análisis Automático", + "IgnoreInAAModal.text": "¿Seguro que desea ignorar '{name}' en el Análisis Automático?", + "IgnoreInAAModal.textMultiple": "¿Seguro que desea ignorar los elementos en el Análisis Automático?", + "IgnoreInAAModal.title": "Ignorar elemento en el Análisis Automático", + "IgnoreInAAModal.titleMultiple": "Ignorar elementos en el Análisis Automático", + "ImportLaunchModal.importButton": "Importar", + "ImportLaunchModal.importConfirmationWarning": "¿Está seguro de que desea interrumpir el proceso de importación de ejecuciones?", + "ImportLaunchModal.incorrectFileSize": "Archivo mayor de 32Mb", + "ImportLaunchModal.modalTitle": "Importar ejecución", + "ImportLaunchModal.note": "Nota:", + "ImportLaunchModal.noteMessage": "Si su runner no registra la hora de inicio de su prueba en el archivo, se utilizará la hora actual del servidor.", + "ImportLaunchModal.tip": "Cargue archivos zip de menos de 32 Mb", + "ImportModal.incorrectFileFormat": "Formato de archivo incorrecto", + "ImportPluginSelector.ReportType": "Tipo de informe:", + "IncludeInAAModal.includeButton": "Incluir", + "IncludeInAAModal.successMessage": "Elemento añadido con éxito al Análisis Automático", + "IncludeInAAModal.successMessageMultiple": "Elementos añadidos con éxito al Análisis Automático", + "IncludeInAAModal.text": "¿Está seguro de que desea incluir '{name}' en el Análisis Automático?", + "IncludeInAAModal.textMultiple": "¿Está seguro de que desea incluir los elementos en el Análisis Automático?", + "IncludeInAAModal.title": "Incluir elemento en el Análisis Automático", + "IncludeInAAModal.titleMultiple": "Incluir elementos en el Análisis Automático", + "IndexSettings.generateIndexButtonCaption": "Generar índice", + "IndexSettings.generateIndexDescription": "todos los datos se eliminan del motor de búsqueda y se crean nuevos basados en todas las investigaciones previas del proyecto. Puede comenzar a utilizar el análisis automático después de recibir un correo electrónico que confirme la finalización del proceso de generación.", + "IndexSettings.inCaseOf": "En caso de", + "IndexSettings.regenerateIndexDescription": "Ha cambiado el parámetro 'Cantidad de líneas de registro'. Esta acción puede afectar los resultados del análisis automático. Para que el analizador funcione correctamente, por favor regenere el índice en el motor de búsqueda. ¿Quiere regenerar el índice ahora?", + "IndexSettings.regenerateIndexProgress": "Por favor espere, estamos generando un nuevo índice", + "IndexSettings.regenerateIndexTitle": "Regenerar índice", + "IndexSettings.removeIndexButtonCaption": "Eliminar índice", + "IndexSettings.removeIndexDescription": "todos los datos de sus investigaciones serán eliminados del motor de búsqueda. Para agregar nuevos datos, puede generar un índice o investigar manualmente los resultados del test.", + "IndexSettings.tabDescription": "Cada registro de log junto con el tipo de defecto se guarda automáticamente en el motor de búsqueda como un documento separado. Todos los documentos creados forman el Índice. Cuantos más documentos estén en el índice de resultados de prueba, más precisos serán los resultados al final del proceso de análisis. Para obtener más información sobre la configuración del índice, consulte la Documentación", + "IndexSettings.title": "Acciones con el índice", + "InfoLine.passed": "Pasado {value}%", + "InfoLine.total": "Total:", + "InfoLineListView.filter": "Filtro:", + "InfoLineListView.filteredBy": "Filtrado por:", + "InfoSection.showMore": "Mostrar más", + "InfoSection.version": "versión", + "InputConditionalTags.tagsHint": "Por favor, ingrese 1 o más caracteres", + "InputFilterToolbar.apply": "Aplicar", + "InputFilterToolbar.clearAllfilters": "Limpiar todos los filtros", + "InputTimeDateRange.anyTime": "Cualquier momento", + "InputTimeDateRange.customRange": "Para el período seleccionado", + "InputTimeDateRange.dynamicUpdate": "Actualización dinámica", + "InputTimeDateRange.dynamicUpdateHint": "Su rango de tiempo se actualizará diariamente", + "InputTimeDateRange.from": "Desde", + "InputTimeDateRange.time": "Tiempo", + "InputTimeDateRange.to": "Hasta", + "InputUserSearch.inviteNewUser": "Invitar a {userEmail}", + "InputUserSearch.inviteNewUserInfo": "Enviar invitación a esta dirección", + "InputUserSearch.isAssigned": "Usuario ya asignado al proyecto", + "InputWithEye.hideTooltip": "Ocultar", + "InputWithEye.showTooltip": "Mostrar", + "InstalledPluginsTab.installedPluginsBreadcrumbTitle": "Plugins instalados", + "InstancesSection.addIntegrationButtonTitle": "Agregar integración", + "InstancesSection.addIntegrationSuccess": "Integración añadida exitosamente", + "InstancesSection.allGlobalIntegrations": "Todas las integraciones globales", + "InstancesSection.globalIntegration": "Integración global", + "InstancesSection.globalIntegrations": "Integraciones globales", + "InstancesSection.globalIntegrationsDisabledHint": "Configuraciones globales desactivadas debido a la configuración manual del proyecto.", + "InstancesSection.noGlobalIntegrationMessage": "No hay integraciones globales", + "InstancesSection.projectIntegration": "Integración del proyecto", + "InstancesSection.projectIntegrations": "Integraciones del proyecto", + "InstancesSection.removePluginSuccess": "Plugin eliminado exitosamente", + "InstancesSection.resetToGlobalSettingsDescription": "Activa las configuraciones globales. Todas las integraciones personalizadas serán eliminadas.", + "InstancesSection.resetToGlobalSettingsTitle": "Restablecer a configuraciones globales", + "InstancesSection.resetToGlobalSuccess": "Integraciones globales aplicadas exitosamente", + "InstancesSection.uninstallPluginConfirmation": "¿Realmente desea desinstalar el plugin {pluginName}?", + "InstancesSection.uninstallPluginNote": "Elimine este plugin de ReportPortal y cancele todos los permisos de acceso y autorización", + "InstancesSection.uninstallPluginTitle": "Desinstalar plugin", + "InstancesSection.unlinkAndSetupManuallyDescription": "Desvincula el proyecto actual de las configuraciones globales y configura tu propia integración. Siempre puedes volver a las configuraciones globales.", + "InstancesSection.unlinkAndSetupManuallyTitle": "Desvincular y configurar manualmente", + "IntegrationForm.configurationNotSpecifiedInfo": "Configuración no especificada", + "IntegrationForm.configurationTitle": "Configuración", + "IntegrationForm.configureTitle": "Configurar", + "IntegrationSettingsContainer.updateIntegrationSuccess": "Integración actualizada exitosamente", + "Integrations.ActiveDirectory.description": "Integración con Active Directory, puede ayudar a acelerar el proceso de creación de usuarios e inicio de sesión en ReportPortal. La integración permite el intercambio de información entre ReportPortal y Active Directory, como la posibilidad de iniciar sesión en ReportPortal con credenciales de Active Directory.", + "Integrations.Email.description": "Agrega integración con servidor de correo electrónico a tu ReportPortal. Recibe información sobre los resultados de las pruebas en tiempo real y configura fácilmente la lista de destinatarios.", + "Integrations.Jira.description": "La integración permite el intercambio de información entre ReportPortal y JIRA Server, como la creación y vinculación de problemas, así como recibir actualizaciones de su estado.", + "Integrations.Ldap.description": "Integración con LDAP, puede ayudar a acelerar el proceso de creación de usuarios e inicio de sesión en ReportPortal. La integración permite el intercambio de información entre ReportPortal y LDAP, como la posibilidad de iniciar sesión en ReportPortal con credenciales de LDAP.", + "Integrations.Rally.description": "La integración permite el intercambio de información entre ReportPortal y Rally, como la creación y vinculación de problemas, así como recibir actualizaciones de su estado.", + "Integrations.Saml.description": "Integración con SAML, puede ayudar a acelerar el proceso de creación de usuarios e inicio de sesión en ReportPortal. La integración permite el intercambio de información entre ReportPortal y SAML, como la posibilidad de iniciar sesión en ReportPortal con credenciales de SAML.", + "Integrations.SauceLabs.description": "Configura la integración con Sauce Labs y visualiza videos de ejecución de pruebas directamente en la aplicación ReportPortal. Sigue estos tres sencillos pasos: 1. Configura la integración con Sauce Labs 2. Agrega los atributos para los elementos de prueba SLID: N (donde N es la cantidad de trabajos en Sauce Labs) y SLDC: M (donde M es US o EU) 3. Visualiza los videos en el registro de nivel.", + "IntegrationsCase.noIntegrationsDescription": "Aún no hay integraciones en tu proyecto", + "IntegrationsCase.noIntegrationsMessage": "No hay integraciones", + "IntegrationsDescription.ConnectionErrorMessage": "Error de conexión", + "IntegrationsDescription.GlobalIntegrationsSystemMessage": "Atención", + "IntegrationsDescription.GlobalIntegrationsSystemMessageModalCaption": "Las integraciones globales y del proyecto no pueden funcionar simultáneamente.", + "IntegrationsDescription.GlobalIntegrationsSystemMessageModalText": "Ten en cuenta que las integraciones globales se desactivarán si configuras una integración de proyecto.", + "IntegrationsDescription.GlobalIntegrationsSystemMessageText": "Las integraciones globales están desactivadas porque has configurado una integración de proyecto.", + "IntegrationsDescription.backToIntegrations": "Volver a integraciones", + "IntegrationsDescription.globalIntegrationText": "Las integraciones globales se crean a nivel de instancia y se aplican a todos los proyectos.", + "IntegrationsDescription.globalIntegrationTitle": "Integraciones globales", + "IntegrationsDescription.integrationList": "Lista de integraciones", + "IntegrationsDescription.linkToDocumentation": "Enlace a Documentación", + "IntegrationsDescription.noGlobalIntegrationsButtonAdd": "Agregar integración de proyecto", + "IntegrationsDescription.noGlobalIntegrationsDescription": "Las integraciones no están configuradas. Puedes configurar manualmente una integración para este proyecto.", + "IntegrationsDescription.noGlobalIntegrationsMessage": "No hay integraciones", + "IntegrationsDescription.projectIntegrationReset": "Restablecer a integraciones globales", + "IntegrationsDescription.projectIntegrationResetDescription": "¿Estás seguro de que deseas restablecer la configuración a las Integraciones Globales? Todas tus integraciones de proyecto se eliminarán sin posibilidad de recuperación.", + "IntegrationsDescription.projectIntegrationText": "Las integraciones de proyecto se crean específicamente para cada proyecto.", + "IntegrationsDescription.projectIntegrationTitle": "Integración de proyecto", + "IntegrationsDescription.settings": "Configuraciones", + "IntegrationsList.authorization": "Autorización", + "IntegrationsList.bts": "Sistemas de seguimiento de errores", + "IntegrationsList.notification": "Notificaciones", + "IntegrationsList.other": "Otros", + "InvestigatedPercentageOfLaunchesControls.ItemsFieldLabel": "Elementos", + "InvestigatedPercentageOfLaunchesControls.ItemsValidationError": "El número de elementos debe estar entre '1' y '600'", + "InviteUserModal.description": "Invitar usuario al proyecto", + "InviteUserModal.emailLabel": "Correo electrónico", + "InviteUserModal.headerInviteUserModal": "Invitar usuario", + "InviteUserModal.inputPlaceholder": "Ingrese nombre de usuario o correo electrónico", + "InviteUserModal.inviteExternalMember": "La invitación del miembro se ha registrado correctamente. La información de confirmación será enviada a la dirección de correo electrónico proporcionada. Validez: 1 día.", + "InviteUserModal.loginOrEmailLabel": "Nombre de usuario o correo electrónico", + "InviteUserModal.memberWasInvited": "El miembro '{name}' ha sido asignado al proyecto", + "InviteUserModal.role": "Rol del proyecto", + "IssueInfoTooltip.issueNotFoundDescription": "No se encontró el error o no hay conexión con la integración de BTS.", + "IssueInfoTooltip.issueNotFoundTitle": "Error no encontrado", + "IssueInfoTooltip.issueStatusTitle": "Estado", + "IssueInfoTooltip.issueSummaryTitle": "Resumen", + "IssuesChartWrapper.noDataMessage": "No hay ejecuciones", + "ItemInfo.RetryTooltip": "La ejecución tiene elementos de prueba con reintentos", + "JiraConnectionFormFields.authorizedByTitle": "Autorizado por nombre de usuario", + "JiraConnectionFormFields.passwordLabel": "Contraseña en BTS", + "JiraConnectionFormFields.usernameLabel": "Nombre de usuario en BTS", + "JobInfoSection.commands": "Comandos", + "JobInfoSection.logs": "Ver registro", + "JobInfoSection.metadata": "Metadatos", + "LastLaunch.noDataMessage": "No hay ejecuciones", + "LastLaunchColumn.noLaunches": "0 días atrás", + "LastLogin.mobileTitle": "Último inicio de sesión:", + "LaunchChanges.delete": "eliminó", + "LaunchChanges.finish": "finalizó", + "LaunchChanges.finishImport": "fin de la importación", + "LaunchChanges.launch": "ejecución", + "LaunchChanges.markLaunchAsImportant": " marcado como importante por el usuario ", + "LaunchChanges.start": "comenzó", + "LaunchChanges.startImport": "inicio de la importación", + "LaunchChanges.unmarkLaunchAsImportant": " desmarcado como importante por el usuario ", + "LaunchDurationControls.ItemsFieldLabel": "Elementos", + "LaunchDurationControls.ItemsValidationError": "La cantidad de elementos debe ser entre '1' y '600'", + "LaunchExecutionAndIssueStatistics.launchNameText": "Nombre de la ejecución:", + "LaunchFiltersToolbar.addFilter": "Agregar filtro", + "LaunchFiltersToolbar.saveFilterSuccess": "Filtro guardado", + "LaunchFiltersToolbar.updateFilterSuccess": "Filtro actualizado", + "LaunchFinishForceDialog.finishForceLaunchText": "¿Estás seguro de que deseas finalizar la ejecución? Se perderán todos los datos.", + "LaunchFinishForceDialog.finishForceLaunchWarning": "Estás a punto de detener una ejecución que no es tuya. Esto puede afectar la información de otros usuarios del proyecto.", + "LaunchFinishForceDialog.finishForceMultipleText": "¿Estás seguro de que deseas finalizar las ejecuciones seleccionadas? Se perderán todos los datos.", + "LaunchFinishForceDialog.forceFinishFailedMessage": "No se pudo finalizar la ejecución forzada: {message}", + "LaunchFinishForceDialog.forceFinishFailedMultipleMessage": "No se pudieron finalizar forzadamente las ejecuciones: {message}", + "LaunchFinishForceDialog.forceFinishSuccessMessage": "La ejecución se finalizó forzadamente", + "LaunchFinishForceDialog.forceFinishSuccessMultipleMessage": "Las ejecuciones se finalizaron forzadamente", + "LaunchLevelEntities.AUTOMATION_BUG_title": "Error de automatización", + "LaunchLevelEntities.AUTOMATION_BUG_totalTitle": "Total de errores de automatización", + "LaunchLevelEntities.AttributeTitle": "Atributo", + "LaunchLevelEntities.DescriptionTitle": "Descripción", + "LaunchLevelEntities.FailedTitle": "Fallido", + "LaunchLevelEntities.NO_DEFECT_title": "Sin error", + "LaunchLevelEntities.NO_DEFECT_totalTitle": "Total de sin error", + "LaunchLevelEntities.NameTitle": "Nombre", + "LaunchLevelEntities.NumberTitle": "Número", + "LaunchLevelEntities.OwnerTitle": "Propietario", + "LaunchLevelEntities.PRODUCT_BUG_title": "Defecto del sistema", + "LaunchLevelEntities.PRODUCT_BUG_totalTitle": "Total de defectos del sistema", + "LaunchLevelEntities.PassedTitle": "Pasado", + "LaunchLevelEntities.SYSTEM_ISSUE_title": "Error", + "LaunchLevelEntities.SYSTEM_ISSUE_totalTitle": "Total de errores", + "LaunchLevelEntities.SkippedTitle": "Saltado", + "LaunchLevelEntities.StartTimeTitle": "Hora de inicio", + "LaunchLevelEntities.TO_INVESTIGATE_title": "Investigar", + "LaunchLevelEntities.TO_INVESTIGATE_totalTitle": "Total de investigar", + "LaunchLevelEntities.TotalTitle": "Total", + "LaunchLevelEntities.descriptionEntityHint": "La descripción debe tener entre 3 y 18 caracteres", + "LaunchLevelEntities.descriptionPlaceholder": "Ingrese la descripción", + "LaunchLevelEntities.descriptionStepLevelEntityHint": "La descripción debe tener entre 1 y 256 caracteres", + "LaunchLevelEntities.entityItemStatistics.placeholder": "Ingrese cantidad", + "LaunchLevelEntities.itemNameEntityHint": "Debe tener al menos 3 caracteres", + "LaunchLevelEntities.launchName.placeholder": "Ingrese el nombre", + "LaunchLevelEntities.launchNumberEntityHint": "Este filtro solo acepta números", + "LaunchLevelEntities.launchNumberPlaceholder": "Ingrese el número", + "LaunchLevelEntities.ownerName.placeholder": "Ingrese el nombre de usuario", + "LaunchMergeModal.launchDescriptionHint": "La descripción debe tener como máximo 1024 símbolos.", + "LaunchMergeModal.launchNameHint": "El nombre de la ejecución debe tener entre 1 y 256 caracteres.", + "LaunchStatistics.noDataMessage": "No hay ejecuciones", + "LaunchStatisticsControls.ContentFieldsValidationError": "Debe seleccionar al menos un elemento", + "LaunchStatisticsControls.CriteriaFieldLabel": "Criterios para el widget", + "LaunchStatisticsControls.ItemsFieldLabel": "Elementos", + "LaunchStatisticsControls.ItemsValidationError": "La cantidad de elementos debe ser entre '1' y '600'", + "LaunchStatisticsControls.ZoomControlText": "Zoom del widget", + "LaunchesDurationChart.hours": "horas", + "LaunchesFilter.all": "Todos", + "LaunchesFilter.latest": "Últimos", + "LaunchesPage.addNewWidget": "Agregar nuevo widget", + "LaunchesPage.addWidgetSuccess": "Widget agregado", + "LaunchesPage.alreadyIgnored": "El elemento ya está ignorado por el Auto-Análisis", + "LaunchesPage.alreadyIncluded": "El elemento ya está incluido en el Auto-Análisis", + "LaunchesPage.analyseStartSuccess": "El autoanalizador ha comenzado.", + "LaunchesPage.checkQuery": "No se pudieron cargar los datos para la tabla de ejecuciones", + "LaunchesPage.error": "Error al eliminar la ejecución", + "LaunchesPage.errorMultiple": "Error al eliminar las ejecuciones", + "LaunchesPage.import": "Importar", + "LaunchesPage.itemNotFound": "Elemento no encontrado", + "LaunchesPage.launchFinished": "Ejecución finalizada", + "LaunchesPage.launchIsProcessing": "¡La ejecución no debe estar en proceso de Autoanálisis!", + "LaunchesPage.launchNotFound": "Ejecución no encontrada", + "LaunchesPage.launchNotInProgress": "¡La ejecución no debe estar en curso!", + "LaunchesPage.multiSelectError": "No puedes realizar esta operación con elementos no válidos", + "LaunchesPage.multipleSelectHeader": "Elementos seleccionados:", + "LaunchesPage.noDefectType": "El elemento no tiene defecto", + "LaunchesPage.noDefectTypeToLinkIssue": "No puedes vincular un error si el elemento no tiene defecto", + "LaunchesPage.noDefectTypeToPostIssue": "No puedes publicar un error si el elemento no tiene defecto", + "LaunchesPage.noIssue": "El elemento no tiene un error para editar", + "LaunchesPage.noLinkedIssue": "El elemento no tiene un error vinculado", + "LaunchesPage.notYourOwnLaunch": "La ejecución fue creada por otro usuario", + "LaunchesPage.patternAnalyseStartSuccess": "El análisis de patrones ha comenzado.", + "LaunchesPage.refresh": "Actualizar", + "LaunchesPage.selectMoreItems": "Debe seleccionar más de un elemento", + "LaunchesPage.success": "La ejecución fue eliminada", + "LaunchesPage.successMultiple": "Las ejecuciones fueron eliminadas", + "LaunchesQuantity.noDataMessage": "No hay ejecuciones", + "LaunchesTable.endTimeColumnFull": "Hora de finalización", + "LaunchesTable.endTimeColumnShort": "Finalización", + "LaunchesTable.endTimeHint": "Hora de finalización:", + "LaunchesTable.nameColumn": "Nombre", + "LaunchesTable.startTimeColumnFull": "Hora de inicio", + "LaunchesTable.startTimeColumnShort": "Inicio", + "LaunchesTable.startTimeHint": "Hora de inicio:", + "LaunchesTable.statusColumn": "Estado", + "LaunchesTable.statusHint": "Estado:", + "LaunchesTableControls.ContentFieldsValidationError": "Debe seleccionar al menos un elemento", + "LaunchesTableControls.CriteriaFieldLabel": "Criterios para el widget", + "LaunchesTableControls.ItemsFieldLabel": "Elementos", + "LaunchesTableControls.ItemsValidationError": "La cantidad de elementos debe ser entre '1' y '600'", + "LdapFormFields.baseDnLabel": "DN Base", + "LdapFormFields.emailAttributeLabel": "Atributo de Correo Electrónico", + "LdapFormFields.fullNameAttributeLabel": "Atributo de Nombre Completo", + "LdapFormFields.groupSearchBaseLabel": "Base de Búsqueda de Grupo", + "LdapFormFields.groupSearchFilterLabel": "Filtro de Búsqueda de Grupo", + "LdapFormFields.managerDnLabel": "DN del Manager", + "LdapFormFields.managerPasswordLabel": "Contraseña del Manager", + "LdapFormFields.passwordAttributeLabel": "Atributo de Contraseña", + "LdapFormFields.passwordEncoderTypeLabel": "Tipo de Codificador de Contraseña", + "LdapFormFields.photoAttributeLabel": "Atributo de Foto", + "LdapFormFields.urlLabel": "URL", + "LdapFormFields.userDnPatternLabel": "Patrón DN de Usuario", + "LdapFormFields.userSearchFilterLabel": "Filtro de Búsqueda de Usuario", + "LinkIssueModal.addIssueButtonTitle": "Agregar nuevo error", + "LinkIssueModal.issueIdHint": "El ID del error debe tener entre 1 y 128 caracteres", + "LinkIssueModal.issueIdLabel": "ID del error", + "LinkIssueModal.issueLinkLabel": "Enlace al error", + "LinkIssueModal.issueLinkPlaceholder": "Ingrese el enlace al error", + "LinkIssueModal.linkIssue": "Vincular error", + "LinkIssueModal.linkIssueFailed": "No se pudo vincular el error", + "LinkIssueModal.linkIssueSuccess": "Enlace al error agregado exitosamente", + "LinkIssueModal.urlHint": "El enlace debe ser una dirección web válida", + "LocalizationBlock.belarusian": "Bielorruso", + "LocalizationBlock.chinese": "Chino simplificado", + "LocalizationBlock.contribute": "El idioma ruso está en versión beta. Por favor, ayúdanos con la traducción, envía tu PR al archivo.", + "LocalizationBlock.english": "Inglés (Estados Unidos)", + "LocalizationBlock.label": "Idioma", + "LocalizationBlock.note": "Nota", + "LocalizationBlock.russian": "Ruso", + "LocalizationBlock.spanish": "Español", + "LocalizationBlock.ukrainian": "Ucraniano", + "LogItemActivity.changedByAnalyzer": "AA cambió el tipo de error", + "LogItemActivity.issueLoadByAnalyzer": "AA cargó el error", + "LogItemActivity.linkIssue": "vinculó el error", + "LogItemActivity.noActivities": "No hay actividades para mostrar", + "LogItemActivity.postIssue": "envió el error", + "LogItemActivity.unlinkIssue": "desvinculó el error", + "LogItemActivity.updateItem": "actualizó el elemento", + "LogItemActivity.updateItemIssue": "actualizó los datos del elemento", + "LogItemInfo.basedOn": "Basado en", + "LogItemInfo.btsLink": "Enlace BTS", + "LogItemInfo.comment": "Comentario", + "LogItemInfo.ignoreAA": "Ignorar en Auto-Análisis", + "LogItemInfo.item": "elemento", + "LogItemInfo.linkIssue": "Vincular error", + "LogItemInfo.makeDecision": "Tomar decisión", + "LogItemInfo.makeDecisionTooltip": "Acción no disponible para elementos sin error", + "LogItemInfo.more": "Más", + "LogItemInfo.postIssue": "Enviar error", + "LogItemInfo.retries": "Reintentos", + "LogItemInfo.showLess": "Mostrar menos", + "LogItemInfoTabs.attachmentsTab": "Archivos adjuntos", + "LogItemInfoTabs.detailsTab": "Detalles del elemento", + "LogItemInfoTabs.historyTab": "Historial de acciones", + "LogItemInfoTabs.logsTab": "Todos los logs", + "LogItemInfoTabs.stackTab": "Stack Trace", + "LogMessageSearch.searchHint": "Se requieren al menos 3 caracteres.", + "LogMessageSearch.searchTitle": "Contenido del log", + "LogStatusBlock.statusAllLabel": "Todos", + "LogStatusBlock.statusFailed": "Fallidos", + "LogStatusBlock.statusLabel": "Todos los estados", + "LogStatusBlock.statusPassed": "Pasados", + "LogStatusBlock.statusSkipped": "Saltados", + "LogToolbar.historyAcrossAllLaunches": "Historia de todas las ejecuciones", + "LogToolbar.historyShortAcrossAllLaunches": "Todas las ejecuciones", + "LoginBlock.login": "inicia sesión en tu cuenta", + "LoginBlock.welcome": "Bienvenido,", + "LoginForm.badCredentials": "Credenciales incorrectas", + "LoginForm.errorMessage": "Error", + "LoginForm.forgotPass": "¿Olvidaste tu contraseña?", + "LoginForm.loginAttemptsExceededMessage": "Has introducido un nombre de usuario o contraseña incorrectos varias veces.
El formulario de inicio de sesión está bloqueado durante", + "LoginForm.loginAttemptsExceededTime": "{time} segundos", + "LoginForm.loginPlaceholder": "Nombre de usuario", + "LoginForm.or": "o", + "LoginForm.passwordPlaceholder": "Contraseña", + "LogsGrid.noResults": "No se encontraron resultados", + "LogsGrid.statusColumnTitle": "Estado", + "LogsGrid.timeColumnTitle": "Tiempo", + "LogsGridToolbar.consoleView": "Vista de consola", + "LogsGridToolbar.errorLogs": "{count, plural, =0 {No hay logs de error} one {{currentItem} log de error} other {{currentItem} de {totalItems} logs de error}}", + "LogsGridToolbar.hideEmptySteps": "Ocultar pasos vacíos", + "LogsGridToolbar.hidePassedLogs": "Ocultar logs pasados", + "LogsGridToolbar.markdownMode": "Modo markdown", + "LogsGridToolbar.showErrorLog": "Mostrar", + "LogsGridToolbar.withAttachments": "Logs con archivos adjuntos", + "MakeDecisionModal.addForAll": "se agregarán para todos los elementos seleccionados", + "MakeDecisionModal.allLoadedTIFromHistoryLine": "elementos ”Para Investigar” de la línea de historial y elemento actual", + "MakeDecisionModal.analyzerSuggestion": "Sugerencia del analizador", + "MakeDecisionModal.analyzerUnavailable": "El servicio Analyzer no está disponible", + "MakeDecisionModal.analyzerUnavailableLink": "cómo solucionarlo", + "MakeDecisionModal.analyzingSuggestions": "Analizando sugerencias", + "MakeDecisionModal.and": "y", + "MakeDecisionModal.apply": "Aplicar", + "MakeDecisionModal.applyAndContinue": "Aplicar y continuar", + "MakeDecisionModal.applyFor": "Aplicar para:", + "MakeDecisionModal.applyToItem": "Los resultados se aplicarán al elemento", + "MakeDecisionModal.applyToItems": "Aplicar a {itemsCount} elementos", + "MakeDecisionModal.clearForAll": "se eliminarán para todos los elementos seleccionados", + "MakeDecisionModal.comment": "Comentario", + "MakeDecisionModal.commentReplaceWith": "El comentario será reemplazado por:", + "MakeDecisionModal.commentWill": "Los comentarios", + "MakeDecisionModal.commentWillRemoved": "El comentario será eliminado", + "MakeDecisionModal.copyFromHistoryLine": "Ejecuciones analizadas desde el historial de pruebas", + "MakeDecisionModal.currentExecutionOnly": "Solo el elemento actual", + "MakeDecisionModal.currentLaunch": "Elementos ”Para Investigar” similares en la ejecución y elemento actual", + "MakeDecisionModal.currentLaunchTooltip": "Pruebas con tipo de defecto Para Investigar con registros de errores que coinciden con el elemento seleccionado en un 98% o más", + "MakeDecisionModal.defectIgnoreInAa": "el defecto será ignorado en el Auto-Análisis", + "MakeDecisionModal.defectIncludeInAa": "el defecto será incluido en el Auto-Análisis", + "MakeDecisionModal.defectReplaceWith": "El tipo de defecto se cambiará a", + "MakeDecisionModal.executionToChange": "Ejecución para cambiar", + "MakeDecisionModal.filter": "Elementos ”Para Investigar” similares en el filtro {filterName} y elemento actual", + "MakeDecisionModal.followingResult": "Los siguientes resultados se aplicarán a {items}", + "MakeDecisionModal.history": "Historial", + "MakeDecisionModal.ignoreAa": "Ignorar en el Auto-Análisis", + "MakeDecisionModal.ignoreAaShort": "Ignorar en el AA", + "MakeDecisionModal.item": "elemento", + "MakeDecisionModal.itemsCount": "{count} elementos", + "MakeDecisionModal.lastTenLaunchesTooltip": "Pruebas con tipo de defecto Para Investigar de las últimas 10 ejecuciones con registros de errores que coinciden con el elemento seleccionado en un 98% o más", + "MakeDecisionModal.launchName": "Elementos ”Para Investigar” similares en 10 ejecuciones y elemento actual", + "MakeDecisionModal.linkAddedOnNextStep": "El enlace al sistema de seguimiento de defectos se agregará en el siguiente paso", + "MakeDecisionModal.linkIssueNote": "Después de enviar el tipo de defecto, podrá seleccionar parámetros para vincular un nuevo error", + "MakeDecisionModal.linkRemovedOnNextStep": "El enlace al sistema de seguimiento de defectos se eliminará en el siguiente paso", + "MakeDecisionModal.linkReplacedWith": "El enlace al sistema de seguimiento de errores se reemplazará con", + "MakeDecisionModal.machineLearningSuggestions": "Ejecución con {value}% de similitud de defecto", + "MakeDecisionModal.manual": "Manualmente", + "MakeDecisionModal.modalNote": "Debe guardar o cancelar los cambios antes de cerrar la ventana", + "MakeDecisionModal.noItems": "No hay elementos", + "MakeDecisionModal.noLogs": "No se encontraron registros x_x", + "MakeDecisionModal.noSuggestions": "No hay sugerencias de análisis", + "MakeDecisionModal.notChangedForAll": "no cambiarán para todos los elementos seleccionados", + "MakeDecisionModal.ofTheTest": "de la prueba", + "MakeDecisionModal.pleaseCheck": "por favor, compruebe", + "MakeDecisionModal.postIssueNote": "Después de enviar el tipo de defecto, podrá seleccionar parámetros para publicar un nuevo error", + "MakeDecisionModal.replaceForAll": "se reemplazarán para todos los elementos seleccionados por", + "MakeDecisionModal.selectDefect": "Seleccione un defecto", + "MakeDecisionModal.selectDefectTypeManually": "Seleccionar tipo de defecto manualmente", + "MakeDecisionModal.selectedItemCount": "{selected}/{total} elementos seleccionados", + "MakeDecisionModal.selection": "selección", + "MakeDecisionModal.showErrorLogs": "Mostrar registros de error", + "MakeDecisionModal.similarLog": "Registro similar", + "MakeDecisionModal.suggestedChoiceFailed": "La elección sugerida por el usuario no se envió para el procesamiento en ML", + "MakeDecisionModal.suggestedChoiceSuccess": "La elección sugerida por el usuario se envió para el procesamiento en ML", + "MakeDecisionModal.unlinkIssueNote": "Después de enviar el tipo de defecto, los enlaces actuales serán eliminados", + "MakeDecisionModal.updateDefectsFailed": "No se pudieron actualizar los defectos", + "MakeDecisionModal.updateDefectsSuccess": "Se actualizaron los defectos", + "MakeDecisionModal.withFilterTooltip": "Pruebas con tipo de defecto Para Investigar de las últimas 10 ejecuciones del filtro {filterName} con registros de errores que coinciden con el elemento seleccionado en un 98% o más", + "MarkAsImportantModal.description": "Si todo el espacio de tu memoria está ocupado por ejecuciones importantes y se crea una nueva, se eliminarán en orden cronológico inverso, comenzando por las más antiguas.", + "MarkAsImportantModal.descriptionNote": "Esta ejecución se guardará permanentemente y solo se podrá eliminar manualmente.", + "MarkAsImportantModal.markAsImportant": "Marcar como importante", + "MarkAsImportantModal.note": "Por favor, vigila la cantidad de ejecuciones importantes para evitar quedarte sin espacio para las ejecuciones regulares.", + "MarkdownEditor.bold": "Negrita", + "MarkdownEditor.cleanBlock": "Limpiar bloque", + "MarkdownEditor.code": "Agregar código", + "MarkdownEditor.heading1": "Encabezado grande", + "MarkdownEditor.heading2": "Encabezado mediano", + "MarkdownEditor.heading3": "Encabezado pequeño", + "MarkdownEditor.image": "Agregar imagen", + "MarkdownEditor.italic": "Cursiva", + "MarkdownEditor.link": "Crear enlace", + "MarkdownEditor.orderedList": "Lista ordenada", + "MarkdownEditor.preview": "Vista previa", + "MarkdownEditor.quote": "Cita", + "MarkdownEditor.strikethrough": "Tachado", + "MarkdownEditor.unorderedList": "Lista desordenada", + "MembersGrid.actionCol": "Acción", + "MembersGrid.deleteCol": "Eliminar", + "MembersGrid.displayCol": "Mostrar en ejecuciones", + "MembersGrid.lastLoginCol": "Último inicio de sesión", + "MembersGrid.nameCol": "Nombre / Usuario", + "MembersGrid.optionsCol": "Opciones", + "MembersGrid.ownerCol": "Propietario", + "MembersGrid.roleCol": "Rol de proyecto", + "MembersPage.notFound": "No se encontraron miembros para ''{filter}''", + "MembersPage.title": "Miembros del proyecto", + "MembersPageToolbar.inviteUser": "Invitar Usuario", + "MembersPageToolbar.membersSearchHint": "El nombre de usuario no debe estar vacío", + "MembersPageToolbar.permissionMap": "Mapa de permisos", + "MembersPageToolbar.searchByName": "Buscar por nombre", + "MergeLaunchDialog.MergeLaunchHeader": "Combinar ejecuciones", + "MergeLaunchDialog.extendSuitesDescriptionText": "Completar la descripción de las suites secundarias con el nombre de la ejecución original (por ejemplo, @ejecución 'Ejecución №1')", + "MergeLaunchDialog.launchAttributesLabel": "Atributos", + "MergeLaunchDialog.launchDescriptionLabel": "Descripción", + "MergeLaunchDialog.launchInfoHeading": "Todos las ejecuciones seleccionados se combinarán en uno solo", + "MergeLaunchDialog.launchNameLabel": "Nombre de la ejecución", + "MergeLaunchDialog.launchNamePlaceholder": "Introduzca el nombre de la ejecución", + "MergeLaunchDialog.launchOwnerLabel": "Propietario", + "MergeLaunchDialog.launchTimeLabel": "Tiempo de inicio/fin", + "MergeLaunchDialog.mergeTypeDeep": "Combinación completa", + "MergeLaunchDialog.mergeTypeHeading": "Seleccione el tipo de combinación", + "MergeLaunchDialog.mergeTypeLinear": "Combinación lineal", + "MethodTypes.afterClass": "Después de clase", + "MethodTypes.afterGroups": "Después de grupos", + "MethodTypes.afterMethod": "Después de método", + "MethodTypes.afterSuite": "Después de suite", + "MethodTypes.afterTest": "Después de prueba", + "MethodTypes.beforeClass": "Antes de clase", + "MethodTypes.beforeGroups": "Antes de grupos", + "MethodTypes.beforeMethod": "Antes de método", + "MethodTypes.beforeSuite": "Antes de suite", + "MethodTypes.beforeTest": "Antes de prueba", + "MethodTypes.step": "Paso", + "MethodTypes.test": "Clase de prueba", + "MostConsuming.table.header.duration": "Duración", + "MostConsuming.table.header.startTime": "Hora de inicio", + "MostConsuming.table.header.status": "Estado", + "MostConsuming.table.header.testCase": "Caso de prueba", + "MostFailedTestCasesTableControls.CriteriaFieldLabel": "Criterios para el widget", + "MostFailedTestCasesTableControls.IncludeMethodsControlText": "Incluir métodos Antes y Después", + "MostFailedTestCasesTableControls.ItemsFieldLabel": "Total de ejecuciones", + "MostFailedTestCasesTableControls.ItemsValidationError": "La cantidad de elementos debe estar entre '2' y '100'", + "MostFailedTestCasesTableControls.LaunchNameFieldLabel": "Nombre de la ejecución", + "MostFailedTestCasesTableControls.LaunchNamePlaceholder": "Introduzca el nombre de la ejecución", + "MostFailedTestCasesTableControls.LaunchNamesValidationError": "Seleccione al menos un elemento", + "MostFailedTests.header.issueType.automation_bug": "Error de automatización", + "MostFailedTests.header.issueType.failed": "Fallido", + "MostFailedTests.header.issueType.no_defect": "Sin defecto", + "MostFailedTests.header.issueType.product_bug": "Defecto del sistema", + "MostFailedTests.header.issueType.skipped": "Omitido", + "MostFailedTests.header.issueType.system_issue": "Problemas del sistema", + "MostFailedTests.table.header.issuesInExec": "Errores en ejecución", + "MostFailedTests.table.header.issuesInExecShort": "Errores", + "MostFailedTests.table.header.lastIssue": "Último error", + "MostFailedTests.table.header.ofIssues": "% de errores", + "MostFailedTests.table.header.ofIssuesShort": "% errores", + "MostFailedTests.table.header.testCase": "Caso de prueba", + "MostPopularPatterns.launchName": "Ejecución", + "MostPopularPatterns.patternName": "Patrón", + "MostPopularPatterns.testCases": "Casos de prueba", + "MostPopularPatternsControls.CriteriaFieldLabel": "Criterios para el widget", + "MostPopularPatternsControls.attributeKeyFieldLabel": "Clave del atributo", + "MostPopularPatternsControls.attributeKeyFieldPlaceholder": "Introduzca la clave del atributo", + "MostPopularPatternsControls.attributeKeyValidationError": "El valor de la clave del atributo debe estar entre 1 y 512", + "MostPopularPatternsControls.numberOfLaunchesLabel": "Número de ejecuciones", + "MostPopularPatternsControls.numberOfLaunchesValidationError": "El número de ejecuciones debe estar entre 1 y 600", + "MostTimeConsumingTestCasesControls.ContentFieldsValidationError": "Seleccione al menos un elemento", + "MostTimeConsumingTestCasesControls.CriteriaFieldLabel": "Criterios para el widget", + "MostTimeConsumingTestCasesControls.IncludeMethodsControlText": "Incluir métodos Before y After", + "MostTimeConsumingTestCasesControls.ItemsFieldLabel": "Total de ejecuciones", + "MostTimeConsumingTestCasesControls.LaunchNameFieldLabel": "Nombre de la ejecución", + "MostTimeConsumingTestCasesControls.LaunchNamePlaceholder": "Introduzca el nombre de la ejecución", + "MostTimeConsumingTestCasesControls.LaunchNamesValidationError": "Seleccione al menos un elemento", + "MoveToDebugModal.moveToAllFailedMessage": "No se puede mover la ejecución a Todas las ejecuciones: {message}", + "MoveToDebugModal.moveToAllHeader": "Mover a todas las ejecuciones", + "MoveToDebugModal.moveToAllMultipleFailedMessage": "No se pueden mover las ejecuciones a Todas las ejecuciones: {message}", + "MoveToDebugModal.moveToAllMultipleSuccessMessage": "Las ejecuciones se han movido correctamente a Todas las ejecuciones", + "MoveToDebugModal.moveToAllMultipleText": "¿Desea mover las ejecuciones seleccionadas a Todas las ejecuciones?", + "MoveToDebugModal.moveToAllSuccessMessage": "La ejecución se ha movido correctamente a Todas las ejecuciones", + "MoveToDebugModal.moveToAllText": "¿Desea mover la ejecución a Todas las ejecuciones?", + "MoveToDebugModal.moveToDebug": "¿Desea mover la ejecución a Depuración?", + "MoveToDebugModal.moveToDebugFailedMessage": "No se puede mover la ejecución a Depuración: {message}", + "MoveToDebugModal.moveToDebugHeader": "Mover a depuración", + "MoveToDebugModal.moveToDebugMultiple": "¿Desea mover las ejecuciones seleccionadas a Depuración?", + "MoveToDebugModal.moveToDebugMultipleFailedMessage": "No se pueden mover las ejecuciones a Depuración: {message}", + "MoveToDebugModal.moveToDebugMultipleSuccessMessage": "Las ejecuciones se han movido correctamente a Depuración", + "MoveToDebugModal.moveToDebugSuccessMessage": "La ejecución se ha movido correctamente a Depuración", + "MultipleAuthBlock.chooseAuth": "Por favor, elija el proveedor de autenticación adecuado", + "MultipleAuthBlock.externalLogin": "Inicio de sesión externo", + "MultipleAuthBlock.loginWith": "Puede iniciar sesión utilizando el tipo de autenticación '{providerName}'", + "MultipleAuthBlock.wrongAuthType": "No se puede encontrar el tipo de autenticación ''{authType}''", + "NameColumn.adminLabel": "administrador", + "NameColumn.changeAccountRoleNotification": "Rol de cuenta cambiado para ''{name}''", + "NameColumn.makeAdminLabel": "hacer administrador", + "NameColumn.youLabel": "tú", + "NestedGridRow.loadCurrentStep": "Cargar paso actual", + "NestedGridRow.loadLabel": "Cargar siguientes 300", + "NestedGridRow.loadPreviousLabel": "Cargar anteriores 300", + "NewsBlock.twitterTitle": "Consulte nuestros últimos tweets", + "NoCasesBlock.noItemsMessage": "No hay reglas de notificación por correo electrónico", + "NoCasesBlock.notificationsInfo": "Después de la finalización de la ejecución, el sistema notificará por correo electrónico a las personas seleccionadas", + "NoDataAvailable.noDataMessage": "No hay datos disponibles.", + "NoDataAvailableMaterializedView.renderingInfo": "Por favor, espere, esto puede tomar varios minutos.", + "NoDataAvailableMaterializedView.renderingTitle": "Actualización de datos", + "NoFiltersBlock.Button": "Agregar filtro", + "NoFiltersBlock.link": "Página de ejecuciones", + "NoFiltersBlock.message": "Puede crear su primer filtro en ", + "NoFiltersBlock.or": "o", + "NoFiltersBlock.title": "No tienes filtros", + "NoItemsDemo.generateDemoDataDescription": "Para comenzar, configure su integración personalizada o genere datos de demostración", + "NoItemsDemo.noDataTitle": "No tienes datos", + "NoPatternAnalysis.description": "El sistema puede analizar automáticamente los resultados de las pruebas comparando la traza de la pila de resultados de las pruebas con los patrones almacenados en el sistema.", + "NoPatternAnalysis.title": "No hay patrones", + "NoResultsForFilter.checkQuery": "Verifique su consulta e inténtelo nuevamente", + "NonPassedTestCasesTrendChart.nonPassedCases": "escenarios no aprobados", + "NotPassedTestCasesTrendControls.ItemsFieldLabel": "Elementos", + "NotPassedTestCasesTrendControls.ItemsValidationError": "La cantidad de elementos debe estar entre '1' y '600'", + "NotificationCase.attributesLabel": "Atributos", + "NotificationCase.controlPanelName": "Regla", + "NotificationCase.dropdownValueAlways": "Siempre", + "NotificationCase.dropdownValueFailed": "La ejecución contiene errores", + "NotificationCase.dropdownValueMore10": "> 10% de elementos contienen errores", + "NotificationCase.dropdownValueMore20": "> 20% de elementos contienen errores", + "NotificationCase.dropdownValueMore50": "> 50% de elementos contienen errores", + "NotificationCase.dropdownValueToInvestigate": "La ejecución contiene elementos que requieren análisis", + "NotificationCase.inCaseLabel": "En caso de", + "NotificationCase.launchNamesHint": "El nombre de la ejecución debe tener entre 3 y 256 caracteres", + "NotificationCase.launchNamesLabel": "Nombres de ejecuciones", + "NotificationCase.launchNamesNote": "Enviar notificaciones por correo electrónico al finalizar las ejecuciones seleccionadas", + "NotificationCase.launchNamesPlaceholder": "Seleccionar nombres de ejecución", + "NotificationCase.launchOwnerLabel": "Propietario de la ejecución (quien lo inició, lo recibe)", + "NotificationCase.recipientsHint": "Ingrese una dirección de correo electrónico válida", + "NotificationCase.recipientsLabel": "Destinatarios", + "NotificationCase.recipientsPlaceholder": "Seleccionar miembros del equipo", + "NotificationItem.failureDefault": "Se produjo un error al conectar con el servidor: {error}", + "NotificationItem.infoLogout": "Ha cerrado sesión", + "NotificationItem.successLogin": "Inicio de sesión exitoso", + "NotificationRule.launchNameLabel": "Nombre de la ejecución", + "NotificationRule.launchOwner": "Propietario de la ejecución", + "Notifications.notifications": "Notificaciones por correo electrónico", + "Notifications.ruleNameDuplicateHint": "Ya existe una regla con este nombre en el proyecto", + "Notifications.updateEmail": "actualizado", + "NotificationsEnableForm.allNotifications": "Todas las notificaciones", + "NotificationsEnableForm.attributes": "Atributos", + "NotificationsEnableForm.configureIntegration": "Configurar integración", + "NotificationsEnableForm.disabledContactInfo": "Consulte al administrador de su instancia para obtener ayuda con la configuración.", + "NotificationsEnableForm.disabledPlugin": "servidor desactivado", + "NotificationsEnableForm.discoverPlugins": "Descubrir plugins", + "NotificationsEnableForm.discoverPluginsDescription": "Aprenda sobre los plugins disponibles para ampliar las funcionalidades de notificación.", + "NotificationsEnableForm.integrationSettings": "Configuraciones de integración", + "NotificationsEnableForm.integrationSettingsDescription": "Configure la conexión de los plugins con los servidores", + "NotificationsEnableForm.notConfiguredIntegration": "La integración aún no está configurada", + "NotificationsEnableForm.tabDescription": "Administre las notificaciones relacionadas con la ejecución para varios canales de comunicación: correo electrónico, Slack, etc.", + "NotificationsEnableForm.title": "Sin integración con el servidor de correo electrónico", + "NotificationsEnableForm.toggleNotificationsLabel": "Notificaciones automáticas por correo electrónico", + "NotificationsEnableForm.toggleNotificationsNote": "Enviar notificaciones por correo electrónico al finalizar las ejecuciones", + "NotificationsEnableForm.typeDescription": "Seleccione una lista de destinatarios {type} para cada regla para enviar notificaciones relacionadas con la ejecución.", + "NotificationsTab.updateProjectNotificationsConfigurationSuccess": "¡La configuración de notificaciones se ha actualizado correctamente!", + "OverallStatisticsControls.ContentFieldsValidationError": "Seleccione al menos un elemento", + "OverallStatisticsControls.CriteriaFieldLabel": "Criterios para el widget", + "OverallStatisticsControls.ItemsFieldLabel": "Elementos", + "OverallStatisticsControls.ItemsValidationError": "La cantidad de elementos debe estar entre '1' y '600'", + "OwnerBlock.ownerTitle": "Propietario", + "OwnerColumn.owner": "Propietario:", + "OwnersInfo.noDataMessage": "No se ejecutó ninguna ejecución durante el período seleccionado", + "PageSizeControl.perPage": "por página", + "PassingRatePerLaunchControls.LaunchNameFieldLabel": "Nombre de la ejecución", + "PassingRatePerLaunchControls.LaunchNamePlaceholder": "Introduzca el nombre de la ejecución", + "PassingRatePerLaunchControls.LaunchNamesValidationError": "Seleccione al menos un elemento", + "PassingRatePerLaunchControls.excludeSkipped": "Excluir pruebas omitidas de las estadísticas", + "PassingRateSummaryControls.ItemsFieldLabel": "Elementos", + "PassingRateSummaryControls.ItemsValidationError": "La cantidad de elementos debe estar entre '1' y '600'", + "PassingRateSummaryControls.excludeSkipped": "Excluir pruebas omitidas de las estadísticas", + "PatternAnalysis.addPatternSuccess": "Patrón creado", + "PatternAnalysis.autoPatternAnalysis": "Análisis automático de patrones", + "PatternAnalysis.autoPatternAnalysisDescription": "El análisis comienza inmediatamente después de que finalice cualquier ejecución", + "PatternAnalysis.createPattern": "Crear patrón", + "PatternAnalysis.deletePattern": "Eliminar patrón", + "PatternAnalysis.deletePatternMsg": "¿Está seguro de que desea eliminar este patrón?", + "PatternAnalysis.deletePatternSuccess": "Patrón eliminado correctamente", + "PatternAnalysis.duplicatePattern": "Duplicar regla de patrón", + "PatternAnalysis.headerTitle": "Editar regla de patrón", + "PatternAnalysis.patternName": "Nombre del patrón", + "PatternAnalysis.patternNameDuplicateHint": "Ya existe un patrón con este nombre en el proyecto.", + "PatternAnalysis.patternNameLengthHint": "El nombre del patrón debe tener entre 1 y 55 caracteres.", + "PatternAnalysis.tabDescription": "El análisis de patrones ayuda a encontrar patrones comunes en los registros de errores, etiquetándolos como 'PA'. Las reglas de patrón se aplican cuando se inicia el análisis de patrones después de la finalización de una ejecución, así como después de la finalización de un elemento de prueba. Para obtener más información sobre el análisis de patrones, consulte la Documentación", + "PatternAnalysis.updatePAStateSuccess": "¡La configuración de análisis de patrones se ha actualizado correctamente!", + "PatternAnalysis.updatePatternSuccess": "Patrón actualizado correctamente", + "PatternAnalyzedTooltip.patternAnalysisRecommendation": "Recomendación de análisis de patrones", + "PermissionMap.actionsWithItem": "Acciones con el elemento (editar, eliminar)", + "PermissionMap.actionsWithLaunch": "Acciones con ejecuciones (editar, finalizar forzadamente, combinar, eliminar)", + "PermissionMap.actionsWithMembers": "Acciones con miembros (invitar, asignar/quitar roles, actualizar roles)", + "PermissionMap.admin": "Administrador", + "PermissionMap.attention": "Un usuario con el rol de administrador puede realizar todas las operaciones.", + "PermissionMap.changeStatus": "Cambiar estado", + "PermissionMap.createItem": "Crear elemento", + "PermissionMap.customer": "Cliente", + "PermissionMap.editDeleteItem": "Editar, eliminar elemento", + "PermissionMap.editProjectSettings": "Editar configuraciones del proyecto", + "PermissionMap.investigationActions": "Acciones de investigación (tipos de defectos y problemas en el sistema de seguimiento de errores)", + "PermissionMap.launches": "Ejecuciones", + "PermissionMap.manager": "Gerente", + "PermissionMap.manualAnalysisExportCompareImport": "Análisis manual, exportación, comparación, importación de funciones", + "PermissionMap.member": "Miembro", + "PermissionMap.moveLaunchToDebugDefault": "Mover ejecuciones a/de depuración", + "PermissionMap.notOwnLegend": "El elemento no es propio y fue creado por otro usuario", + "PermissionMap.notOwnTitle": "Elemento no propio", + "PermissionMap.operator": "Operador", + "PermissionMap.ownLegend": "El elemento es propio y fue creado por usted mismo", + "PermissionMap.ownTitle": "Elemento propio", + "PermissionMap.projectManagement": "Gestión de proyecto", + "PermissionMap.projectMembers": "Miembros del proyecto", + "PermissionMap.reportLaunch": "Ejecutar pruebas", + "PermissionMap.rerunLaunches": "Volver a ejecutar ejecuciones", + "PermissionMap.role": "Acción / Rol de proyecto", + "PermissionMap.suiteTestTestItem": "Suite / prueba / elemento de prueba", + "PermissionMap.viewInfoAboutMembers": "Ver información sobre los miembros del proyecto", + "PermissionMap.viewLaunchInDebugMode": "Ver información de ejecuciones en modo de depuración", + "PermissionMap.widgetFilterDashboard": "Widgets / filtros / paneles de control", + "PermissionMapModal.headerPermissionMapModal": "Mapa de permisos", + "PersonalInfo.memberAdmin": "Administrador", + "PersonalInfo.memberYou": "Usted", + "PersonalInfoBlock.changePassword": "Cambiar contraseña", + "PersonalInfoBlock.disabledChangePassword": "No se puede cambiar la contraseña del usuario predeterminado en la instancia de demostración.", + "PersonalInfoBlock.errorChangePassword": "¡Error! No se puede cambiar la contraseña", + "PersonalInfoBlock.forceUpdate": "Actualizar forzadamente", + "PersonalInfoBlock.inProgress": "En progreso", + "PersonalInfoBlock.passwordChanged": "Su contraseña se ha cambiado correctamente", + "PersonalInfoBlock.synchronize": "Sincronización de información de usuario exitosa", + "PersonalInfoBlock.synchronizeError": "¡No se puede sincronizar el perfil!", + "PersonalInfoBlock.synchronizeInProgress": "Sincronización forzada en curso", + "PhotoControls.deleteError": "No se pudo eliminar la foto correctamente", + "PhotoControls.invalidImage": "Puede cargar archivos jpeg, png, gif, de hasta 1 megabyte y 300x500 píxeles", + "PhotoControls.removePhoto": "Eliminar foto", + "PhotoControls.savePhoto": "Guardar foto", + "PhotoControls.submitUpload": "La foto se ha cargado correctamente", + "PhotoControls.uploadError": "No se pudo actualizar la foto", + "PhotoControls.uploadPhoto": "Cargar foto", + "PhotoControls.wasDeleted": "La foto se eliminó correctamente", + "PluginItem.disablePluginMessage": "¿Realmente desea deshabilitar el plugin {pluginName}? Si deshabilita el plugin, la información sobre él se ocultará en {pluginLocation}, y los usuarios no podrán interactuar con él", + "PluginItem.disablePluginTitle": "Deshabilitar plugin", + "PluginItem.disabledPluginMessage": "El plugin ha sido deshabilitado", + "PluginItem.enablePluginMessage": "¿Realmente desea habilitar el plugin {pluginName}?", + "PluginItem.enablePluginTitle": "Habilitar plugin", + "PluginItem.enabledPluginMessage": "El plugin ha sido habilitado", + "PluginItem.titleVersion": "versión {version}", + "Plugins.disabled.bts": "no se mostrará en la configuración del proyecto. Los usuarios no podrán crear un defecto o adjuntar un error a un defecto existente en el sistema", + "Plugins.disabled.import": "Actualmente no hay ningún plugin {name} habilitado/cargado en la instancia. Documentación", + "Plugins.disabled.notification": "no se mostrará en la configuración del proyecto. Los usuarios no podrán recibir notificaciones sobre las ejecuciones completadas ni enviar invitaciones", + "Plugins.disabled.other": "no se mostrará en la configuración del proyecto", + "PluginsFilter.all": "Todos", + "PluginsFilter.analyzer": "Analizador", + "PluginsFilter.auth": "Autorización", + "PluginsFilter.bts": "Sistema de seguimiento de defectos", + "PluginsFilter.import": "Importar Ejecuciones", + "PluginsFilter.notifications": "Notificaciones", + "PluginsFilter.other": "Otros", + "PluginsList.all": "Plugins instalados", + "PluginsList.analyzer": "Analizador", + "PluginsList.authorization": "Autorización", + "PluginsList.bts": "Sistema de seguimiento de defectos", + "PluginsList.import": "Importar Ejecuciones", + "PluginsList.notification": "Notificaciones", + "PluginsList.other": "Otros", + "PluginsPage.search": "Buscar", + "PluginsPage.title": "Plugins", + "PluginsPage.upload": "Cargar", + "PluginsTabs.installed": "Instalados", + "PluginsTabs.store": "Tienda", + "PolicyBlock.privacyPolicy": "Política de privacidad", + "PostIssueModal.attachmentsHeader": "Adjuntos", + "PostIssueModal.booleanFieldHint": "Este campo puede contener valores: true/false", + "PostIssueModal.commentsHeader": "Comentarios", + "PostIssueModal.doubleFieldHint": "Este campo debe ser de tipo doble", + "PostIssueModal.includeDataHeader": "Incluir datos", + "PostIssueModal.logsHeader": "Registros", + "PostIssueModal.noDefaultPropertiesMessage": "Configure las propiedades predeterminadas para el sistema de seguimiento de errores para enviar un error", + "PostIssueModal.postIssue": "Enviar error", + "PostIssueModal.postIssueFailed": "No se pudo enviar el error", + "PostIssueModal.postIssueForTheTest": "Enviar error para el test {launchNumber}", + "PostIssueModal.postIssueSuccess": "La tarjeta ha sido creada", + "PostIssueModal.systemUrlInfo": "El error se enviará a {systemUrl}", + "ProductStatus.filterNameColumn": "Nombre del filtro", + "ProductStatus.nameColumn": "Nombre", + "ProductStatus.passingRateColumnFull": "Porcentaje de aprobados", + "ProductStatus.passingRateColumnShort": "Porcentaje", + "ProductStatus.startTimeColumnFull": "Hora de inicio", + "ProductStatus.startTimeColumnShort": "Inicio", + "ProductStatus.startTimeHint": "Hora de inicio:", + "ProductStatus.statusColumn": "Estado", + "ProductStatus.statusHint": "Estado:", + "ProductStatusControls.BasicColumnsFieldLabel": "Columnas estándar", + "ProductStatusControls.FiltersFieldLabel": "Filtros", + "ProductStatusControls.FiltersPlaceholder": "Ingrese nombres de filtros", + "ProductStatusControls.FiltersValidationError": "Seleccione al menos un elemento", + "ProductStatusControls.GroupControlText": "Agrupar ejecuciones por filtros", + "ProductStatusControls.StartTimeCriteria": "Inicio", + "ProductStatusControls.StatusCriteria": "Estado", + "ProductStatusControls.customColumnsDuplicationHint": "Nombres de columnas duplicados no permitidos", + "ProfilePage.apiKeys": "Claves API", + "ProfilePage.apiKeys.fetchApiKeysError": "Ocurrió un error al obtener las claves API", + "ProfilePage.configurationExamples": "Ejemplos de configuración", + "ProfilePage.projectAssignmentTab": "Proyectos asignados", + "ProfilePage.title": "Perfil del usuario", + "Project.addDefectTypeSuccess": "Tipo de defecto creado exitosamente", + "Project.deleteDefectTypeSuccess": "Tipo de defecto eliminado exitosamente", + "Project.updateDefectTypeSuccess": "Tipo de defecto actualizado exitosamente", + "ProjectActivity.projectProps": "propiedades del proyecto:", + "ProjectActivity.updateProject": "actualizado", + "ProjectActivityControls.ActionTypesValidationError": "Seleccione al menos un elemento", + "ProjectActivityControls.CriteriaFieldLabel": "Criterios para el widget", + "ProjectActivityControls.ItemsFieldLabel": "Elementos", + "ProjectActivityControls.ItemsValidationError": "El número de elementos debe estar entre '1' y '600'", + "ProjectActivityControls.UsernameControlText": "Nombre del usuario", + "ProjectActivityControls.UsersPlaceholder": "Ingrese el nombre del usuario", + "ProjectDetailsPageEvents.headerButton": "Monitoreo del proyecto", + "ProjectDetailsPageMembers.headerButton": "Miembros del proyecto", + "ProjectPanel.assign": "Asignar", + "ProjectPanel.delete": "Eliminar", + "ProjectPanel.internal": "Interno", + "ProjectPanel.internalTooltip": "Proyecto interno", + "ProjectPanel.lastLaunch": "Ejecutado {date}", + "ProjectPanel.launchesQuantity": "Ejecuciones", + "ProjectPanel.linkedTooltip": "Sincronizado con UPSA", + "ProjectPanel.members": "Miembros", + "ProjectPanel.membersQuantity": "Miembros", + "ProjectPanel.monitoring": "Monitoreo", + "ProjectPanel.noLaunches": "No hay ejecuciones", + "ProjectPanel.noMembers": "No hay miembros", + "ProjectPanel.personal": "Personal", + "ProjectPanel.personalTooltip": "Proyecto personal", + "ProjectPanel.settings": "Configuraciones", + "ProjectPanel.unassign": "Desasignar", + "ProjectPanel.unassignFromPersonal": "No se puede remover al usuario del proyecto personal", + "ProjectRole.allPermissions": "El administrador tiene todos los privilegios según el mapa de permisos", + "ProjectRole.mobileTitle": "Rol del proyecto", + "ProjectRole.updateMember": "Miembro '{name}' actualizado", + "ProjectStatisticButton.buttonTooltip": "Ver información detallada", + "ProjectStatusPage.oneMonth": "1 mes", + "ProjectStatusPage.sixMonths": "6 meses", + "ProjectStatusPage.threeMonths": "3 meses", + "ProjectsAndRolesColumn.more": "más", + "ProjectsGrid.lastLaunchCol": "Fecha de la última ejecución", + "ProjectsGrid.lastLaunchColShort": "Fecha ejc", + "ProjectsGrid.launchesCol": "Ejecuciones", + "ProjectsGrid.launchesColShort": "Ejc", + "ProjectsGrid.membersCol": "Miembros", + "ProjectsGrid.membersColShort": "Miembros", + "ProjectsGrid.nameCol": "Nombre", + "ProjectsGrid.organizationCol": "Organización", + "ProjectsGrid.projectTypeCol": "Tipo de proyecto", + "ProjectsPage.addProject": "Agregar Proyecto", + "ProjectsPage.addProjectSuccess": "El proyecto ''{name}'' ha sido creado exitosamente", + "ProjectsPage.addProjectTitle": "Agregar Proyecto", + "ProjectsPage.assignError": "Ocurrió un error al asignar al proyecto", + "ProjectsPage.assignSuccess": "Ha sido asignado al proyecto", + "ProjectsPage.dateCol": "Fecha", + "ProjectsPage.deleteError": "Ocurrió un error al eliminar el proyecto", + "ProjectsPage.deleteErrorMultiple": "Ocurrieron errores al eliminar los proyectos", + "ProjectsPage.deleteModalContent": "¿Realmente desea eliminar el proyecto {name}?", + "ProjectsPage.deleteModalHeader": "Eliminar proyecto", + "ProjectsPage.deleteModalMultipleContent": "¿Realmente desea eliminar los proyectos {names}?", + "ProjectsPage.deleteModalMultipleHeader": "Eliminar proyectos", + "ProjectsPage.deleteProjectsCount": "{count} elementos seleccionados", + "ProjectsPage.deleteSuccess": "El proyecto ha sido eliminado exitosamente", + "ProjectsPage.deleteSuccessMultiple": "Los proyectos han sido eliminados exitosamente", + "ProjectsPage.projectDuplicateHint": "Ya existe un proyecto con este nombre en el sistema", + "ProjectsPage.projectExists": "El proyecto ''{name}'' ya existe", + "ProjectsPage.projectLengthHint": "Nombre del proyecto", + "ProjectsPage.projectNameLabel": "Nombre del proyecto", + "ProjectsPage.projectNameLengthHint": "El nombre del proyecto puede contener solo letras latinas, números, guiones, guiones bajos, puntos (de 3 a 256 caracteres)", + "ProjectsPage.searchPlaceholder": "Buscar por nombre", + "ProjectsPage.sortBy": "Ordenar por", + "ProjectsPage.title": "Todos los Proyectos", + "ProjectsPage.unassignError": "Ocurrió un error al desasignar del proyecto", + "ProjectsPage.unassignSuccess": "Ha sido desasignado del proyecto", + "ProjectsToolbar.export": "Exportar", + "RallyConnectionFormFields.accessKeyLabel": "Clave de acceso", + "RallyConnectionFormFields.projectIdLabel": "ID del proyecto en el BTS", + "RegistrationForm.confirmPasswordHint": "Las contraseñas no coinciden", + "RegistrationForm.emailDuplicateHint": "El correo electrónico ingresado ya existe en el sistema.", + "RegistrationForm.loginConstraints": "El nombre de usuario se usará para ingresar al sistema ReportPortal", + "RegistrationForm.loginDuplicateHint": "El nombre de usuario ingresado ya existe en el sistema.", + "RegistrationForm.loginHint": "El nombre de usuario solo puede contener letras latinas, números, guion, guion bajo, punto (de 1 a 128 caracteres)", + "RegistrationForm.loginPlaceholder": "Nombre de usuario", + "RegistrationForm.nameConstraints": "El nombre completo se usará para identificar a la persona en el equipo", + "RegistrationForm.nameHint": "El nombre completo solo puede contener letras latinas, cirílicas, números, símbolos: guion, guion bajo, punto. Se permite el espacio (de 3 a 256 caracteres)", + "RegistrationForm.namePlaceholder": "Nombre completo", + "RegistrationForm.passwordConfirmPlaceholder": "Confirmar contraseña", + "RegistrationForm.passwordHint": "La contraseña debe contener al menos 4 caracteres; símbolo especial; mayúsculas (A - Z); minúsculas", + "RegistrationForm.passwordPlaceholder": "Crear contraseña", + "RegistrationForm.register": "Registrarse", + "RegistrationPage.again": " otra vez", + "RegistrationPage.coupleMinutes": "El inicio tomará solo un par de minutos", + "RegistrationPage.login": "Iniciar sesión", + "RegistrationPage.oops": "Ups,", + "RegistrationPage.or": "o ", + "RegistrationPage.registration": "Bienvenido, cree su perfil", + "RegistrationPage.tokenExpired": "esta invitación ha expirado o ya está en uso", + "RegistrationPage.tokenNotProvided": "la clave de invitación no se encontró en los parámetros de la URL", + "RegistrationPage.visit": "Visite ", + "RegistrationPage.welcome": " ", + "RemoveIndexModal.contentHeaderMessage": "¿Está seguro de que desea eliminar toda la información del motor de búsqueda?", + "RemoveIndexModal.headerRemoveIndexModal": "Eliminar índice", + "RemoveIndexModal.removeButtonText": "Eliminar", + "RemoveIndexModal.removeSuccessNotification": "El índice se ha eliminado con éxito", + "RemoveOrganizationModal.contentHeaderMessage": "¿Está seguro de que desea eliminar la organización seleccionada? Todos los usuarios asignados no podrán iniciar sesión en Report Portal.", + "RemoveOrganizationModal.removeOrganizationHeader": "Eliminar organización de GitHub", + "RemoveOrganizationModal.removeSuccessNotification": "La organización en GitHub ha sido eliminada", + "RetentionPolicy.successNotification": "La ejecución se ha actualizado con éxito", + "RetriesCounter.label": "{count} intentos", + "RetriesStackTrace.emptyMessage": "No hay rastreo de pila para mostrar", + "RevokeApiKeyModal.description": "¿Está seguro de que desea revocar la clave API \"{name}\"?", + "RevokeApiKeyModal.header": "Revocar clave API", + "RevokeApiKeyModal.loaderText": "REVOCAR", + "RevokeApiKeyModal.notificationFail": "Error al revocar la clave API", + "RevokeApiKeyModal.revoke": "Revocar", + "RevokeApiKeyModal.successNotification": "La clave API se ha revocado con éxito", + "SamlFormFields.emailAttribute": "Dirección de correo", + "SamlFormFields.firstNameAttribute": "Nombre", + "SamlFormFields.fullNameAttribute": "Nombre y apellido", + "SamlFormFields.identityProviderNameId": "Nombre del proveedor de identidad ID", + "SamlFormFields.lastNameAttribute": "Apellido", + "SamlFormFields.metadataUrl": "Enlace a los metadatos", + "SamlFormFields.nameAttributesMode": "Modo de nombre de atributos", + "SamlFormFields.providerName": "Nombre del proveedor", + "SauceLabsFormFields.accessTokenTitle": "Token de acceso", + "SauceLabsFormFields.dataCenter": "Centro de datos", + "SauceLabsFormFields.userNameTitle": "Nombre de usuario", + "ScrollWrapper.backToTop": "Arriba", + "SearchDashboardForm.dashboardNameSearchHint": "El nombre del panel de control debe tener entre 3 y 128 caracteres.", + "ServerSettingsPage.title": "Configuración del servidor", + "ServerSettingsTabs.analytics": "Analítica", + "ServerSettingsTabs.authConfiguration": "Configuración de autorización", + "ServerSettingsTabs.updateAuthSuccess": "La configuración de integración de OAuth se ha actualizado", + "ServiceVersionItem.newVersion": "Nueva versión disponible: {newVersion}", + "ServiceVersionsBlock.currentVersion": "Versión actual", + "ServiceVersionsBlock.deprecatedVersion": "Nueva versión disponible", + "SettingsLayout.footer.build": "Versión: {buildVersion}", + "SettingsLayout.footer.contactUs": "Contáctenos", + "SettingsLayout.footer.documentation": "Documentación", + "SettingsLayout.footer.epam": "EPAM", + "SettingsLayout.footer.github": "Estamos en GitHub", + "SettingsLayout.footer.privacyPolicy": "Política de privacidad", + "SettingsLayout.footer.rights": "© Report Portal {currentYear} Todos los derechos reservados", + "SettingsLayout.footer.slack": "Chatea con nosotros en Slack", + "SettingsPage.analyzer": "Analizador", + "SettingsPage.defect": "Tipos de defectos", + "SettingsPage.demoData": "Datos de demostración", + "SettingsPage.general": "General", + "SettingsPage.integrations": "Integraciones", + "SettingsPage.notifications": "Notificaciones", + "SettingsPage.patternAnalysis": "Análisis de patrones", + "SettingsPage.title": "Configuración del Proyecto", + "Sidebar.administrateBtn": "Administrar", + "Sidebar.dashboardsBtn": "Paneles de control", + "Sidebar.debugBtn": "Depuración", + "Sidebar.filtersBtn": "Filtros", + "Sidebar.launchesBtn": "Ejecuciones", + "Sidebar.logoutBtn": "Cerrar sesión", + "Sidebar.membersBnt": "Miembros del proyecto", + "Sidebar.profileBtn": "Perfil", + "Sidebar.settingsBnt": "Configuración del proyecto", + "SimilarItems.searchLogsMinShouldMatch": "El mínimo debe coincidir con elementos similares de To Investigate", + "SimilarItems.searchLogsMinShouldMatchDescription": "Porcentaje de coincidencia de palabras entre el registro del elemento de prueba en cuestión y el registro del elemento To Investigate en el motor de búsqueda. Si el registro del motor de búsqueda tiene un valor inferior al establecido, este registro no se mostrará en la sección de elementos similares de To Investigate", + "SimilarItems.tabDescription": "Además de los problemas conocidos con los tipos de defectos seleccionados, puede haber problemas con una causa similar, marcada como tipos de defectos \"To investigate\". Todos estos elementos se muestran en la sección \"Similar a To investigate\" en el editor de defectos modal. Puede leer más información sobre elementos similares en la Documentación", + "SortingControl.sortBy": "Ordenar por", + "SortingControl.sortByCustomColumn": "Columna personalizada (A-Z 1-N)", + "SortingControl.sortByFailedItems": "Elementos fallidos", + "SortingControl.sortByPassingRate": "Porcentaje de aprobados", + "SortingControl.sortByTotal": "Cantidad total", + "StackTrace.jumpTo": "Ir a", + "StackTrace.linkText": "Abrir registros", + "StackTrace.loadLabel": "Cargar más", + "StackTrace.messageRefCaption": "Vaya al rastreo de pila en el registro", + "StackTrace.noStackTrace": "No hay rastreo de pila para mostrar", + "StatusPageContent.activities": "Panel de actividades del proyecto", + "StatusPageContent.autoBugs": "Porcentaje de errores de automatización", + "StatusPageContent.general": "Información general", + "StatusPageContent.investigated": "Porcentaje de investigados", + "StatusPageContent.issuesChart": "Porcentaje de defectos del sistema", + "StatusPageContent.lastLaunch": "Estadísticas de la última ejecución", + "StatusPageContent.launchStatistics": "Estadísticas de ejecuciones", + "StatusPageContent.launchesQuantity": "Cantidad de ejecuciones", + "StatusPageContent.owners": "Propietarios de ejecuciones", + "StatusPageContent.systemIssues": "Porcentaje de errores del sistema", + "StepGrid.hidePreconditionMethods": "Expandir métodos y pruebas pasadas", + "StepGrid.ignoreAAShort": "Ignorar AA", + "StepGrid.ignoreAutoanalyzerTooltip": "Ignorar elemento en el Auto-Análisis", + "StepGrid.showPreconditionMethods": "Contraer métodos y pruebas pasadas", + "StepLevelEntities.AUTOMATION_BUG_ALL": "Total de errores de automatización", + "StepLevelEntities.AnalyseOption1": "Con etiqueta \"AA\"", + "StepLevelEntities.AnalyseOption2": "Sin etiqueta \"AA\"", + "StepLevelEntities.AnalyseTitle": "Analizado por RP (AA)", + "StepLevelEntities.BtsIssueOption1": "Con errores adjuntos", + "StepLevelEntities.BtsIssueOption2": "Sin errores adjuntos", + "StepLevelEntities.BtsIssueTitle": "Errores en el BTS", + "StepLevelEntities.DefectCommentPlaceholder": "Ingrese un comentario", + "StepLevelEntities.DefectCommentTitle": "Comentario del defecto", + "StepLevelEntities.DefectTypeTitle": "Tipo de defecto", + "StepLevelEntities.Defect_Type_AB001": "Error de automatización", + "StepLevelEntities.Defect_Type_ND001": "Sin defecto", + "StepLevelEntities.Defect_Type_PB001": "Defecto del producto", + "StepLevelEntities.Defect_Type_SI001": "Problemas del sistema", + "StepLevelEntities.Defect_Type_TI001": "Problema no analizado", + "StepLevelEntities.DescriptionPlaceholder": "Ingrese una descripción", + "StepLevelEntities.DescriptionTitle": "Descripción", + "StepLevelEntities.IgnoreAAOption1": "Con etiqueta \"Ignorar AA\"", + "StepLevelEntities.IgnoreAAOption2": "Sin etiqueta \"Ignorar AA\"", + "StepLevelEntities.IgnoreAATitle": "Ignorar en AA", + "StepLevelEntities.LaunchStatusFailed": "Fallido", + "StepLevelEntities.LaunchStatusInProgress": "En progreso", + "StepLevelEntities.LaunchStatusInterrupted": "Interrumpido", + "StepLevelEntities.LaunchStatusPassed": "Pasado", + "StepLevelEntities.LaunchStatusSkipped": "Omitido", + "StepLevelEntities.MethodTypeTitle": "Tipo de método", + "StepLevelEntities.NO_DEFECT_ALL": "Total de Sin Defecto", + "StepLevelEntities.NameTitle": "Nombre de la prueba", + "StepLevelEntities.NewFailureOption1": "Nuevos fallos", + "StepLevelEntities.NewFailureOption2": "Todas las pruebas", + "StepLevelEntities.NewFailureTitle": "Nuevo fallo", + "StepLevelEntities.PRODUCT_BUG_ALL": "Total de defectos de producto", + "StepLevelEntities.PatternNameTitle": "Nombre del patrón", + "StepLevelEntities.RetryOption1": "Hubo intentos", + "StepLevelEntities.RetryOption2": "Sin intentos", + "StepLevelEntities.RetryTitle": "Intento", + "StepLevelEntities.SYSTEM_ISSUE_ALL": "Total de errores del sistema", + "StepLevelEntities.StartTimeTitle": "Hora de inicio", + "StepLevelEntities.StatusTitle": "Estado", + "StepLevelEntities.TO_INVESTIGATE_ALL": "Total de Para Investigar", + "StepLevelEntities.TypeAfterClass": "Post-clase", + "StepLevelEntities.TypeAfterGroups": "Post-grupo", + "StepLevelEntities.TypeAfterMethod": "Post-método", + "StepLevelEntities.TypeAfterSuite": "Post-suite", + "StepLevelEntities.TypeAfterTest": "Post-prueba", + "StepLevelEntities.TypeBeforeClass": "Pre-clase", + "StepLevelEntities.TypeBeforeGroups": "Pre-grupo", + "StepLevelEntities.TypeBeforeMethod": "Pre-método", + "StepLevelEntities.TypeBeforeSuite": "Pre-suite", + "StepLevelEntities.TypeBeforeTest": "Pre-prueba", + "StepLevelEntities.TypeStep": "Prueba", + "StepLevelEntities.TypeTest": "Tipo de prueba", + "StepLevelEntities.entityItemBTSIssue.placeholder": "Ingrese defecto en BTS", + "SuiteLevelEntities.AUTOMATION_BUG_title": "Error de automatización", + "SuiteLevelEntities.AUTOMATION_BUG_totalTitle": "Total de errores de automatización", + "SuiteLevelEntities.DescriptionTitle": "Descripción", + "SuiteLevelEntities.FailedTitle": "Fallido", + "SuiteLevelEntities.NO_DEFECT_title": "Sin defecto", + "SuiteLevelEntities.NO_DEFECT_totalTitle": "Total de sin defecto", + "SuiteLevelEntities.NameTitle": "Nombre del conjunto", + "SuiteLevelEntities.PRODUCT_BUG_title": "Defecto del sistema", + "SuiteLevelEntities.PRODUCT_BUG_totalTitle": "Total de defectos del sistema", + "SuiteLevelEntities.PassedTitle": "Pasado", + "SuiteLevelEntities.SYSTEM_ISSUE_title": "Error del sistema", + "SuiteLevelEntities.SYSTEM_ISSUE_totalTitle": "Total de errores del sistema", + "SuiteLevelEntities.SkippedTitle": "Omitido", + "SuiteLevelEntities.StartTimeTitle": "Hora de inicio", + "SuiteLevelEntities.TO_INVESTIGATE_title": "Para investigar", + "SuiteLevelEntities.TO_INVESTIGATE_totalTitle": "Total de para investigar", + "SuiteLevelEntities.TotalTitle": "Total", + "SuiteLevelEntities.descriptionPlaceholder": "Ingrese una descripción", + "SuiteLevelEntities.entityItemStatistics.placeholder": "Ingrese la cantidad", + "SuiteLevelEntities.launchNumberPlaceholder": "Ingrese el número", + "SuiteLevelEntities.suiteName.placeholder": "Ingrese el nombre", + "SupportBlock.askQuestion": "Hacer una pregunta", + "SupportBlock.companyNamePlaceholder": "Nombre de la empresa", + "SupportBlock.emailPlaceholder": "Correo electrónico", + "SupportBlock.firstNamePlaceholder": "Nombre", + "SupportBlock.helpAndSupport": "Ayuda & soporte", + "SupportBlock.instruction": "Instrucción", + "SupportBlock.lastNamePlaceholder": "Apellido", + "SupportBlock.modalText": "ReportPortal es un producto gratuito de código abierto bajo la licencia Apache 2.0, sin tarifas ni pagos ocultos.
Pero si busca soporte profesional especializado para la instalación, integración o configuración, ofrecemos planes de soporte para empresas de cualquier tamaño. ¿Quiere saber más? Envíe una solicitud y nos pondremos en contacto con usted.", + "SupportBlock.note": "Si tiene un problema específico, comuníquese con {ourSupportTeam} o haga una pregunta en nuestro {slackChannel}", + "SupportBlock.ourSupportTeam": "nuestro equipo de soporte", + "SupportBlock.requestSent": "La solicitud ha sido enviada", + "SupportBlock.requestSentFail": "La solicitud no ha sido enviada", + "SupportBlock.requestSupport": "Solicitar soporte", + "SupportBlock.slackChannel": "canal de Slack", + "SupportBlock.tryFindSolution": "Puede intentar encontrar el problema y la solución a continuación", + "TableWidgets.failedColumnFull": "Fallido", + "TableWidgets.failedColumnShort": "fall", + "TableWidgets.passedColumnFull": "Pasado", + "TableWidgets.passedColumnShort": "pas", + "TableWidgets.skippedColumnFull": "Omitido", + "TableWidgets.skippedColumnShort": "omit", + "TableWidgets.totalColumnFull": "Total", + "TableWidgets.totalColumnShort": "Tot", + "TestCasesGrowthTrendControls.ItemsFieldLabel": "Elementos", + "TestCasesGrowthTrendControls.ItemsValidationError": "La cantidad de elementos acepta valores de '1' a '600'", + "TestItemChanges.fromItem": "del elemento de prueba", + "TestItemChanges.linkIssue": "añadió error", + "TestItemChanges.postIssue": "publicó error", + "TestItemChanges.toItem": "al elemento de prueba", + "TestItemChanges.unlinkIssue": "desvinculó error", + "TestItemDetailsModal.codeRef": "Ubicación:", + "TestItemDetailsModal.description": "Descripción:", + "TestItemDetailsModal.duration": "Duración:", + "TestItemDetailsModal.noParameters": "Sin parámetros", + "TestItemDetailsModal.parameterKey": "Clave", + "TestItemDetailsModal.parameterValue": "Valor", + "TestItemDetailsModal.parametersLabel": "Parámetros:", + "TestItemDetailsModal.stacktrace": "Trazado de pila:", + "TestItemDetailsModal.testCaseId": "ID del elemento:", + "TestItemDetailsModal.testCaseUId": "UID del elemento:", + "TestItemDetailsModal.title": "Detalles del elemento de prueba", + "TestItemsPage.deleteModalContent": "¿Está seguro de que desea eliminar el elemento '{name}'? Perderá acceso a él.", + "TestItemsPage.deleteModalHeader": "Eliminar elemento", + "TestItemsPage.deleteModalMultipleContent": "¿Está seguro de que desea eliminar los elementos? Perderá acceso a ellos.", + "TestItemsPage.deleteModalMultipleHeader": "Eliminar elementos", + "TestItemsPage.error": "Error al eliminar el elemento", + "TestItemsPage.errorMultiple": "Error al eliminar los elementos", + "TestItemsPage.success": "El elemento ha sido eliminado", + "TestItemsPage.successMultiple": "Los elementos han sido eliminados", + "TestItemsPage.warning": "Está a punto de eliminar un elemento que no es suyo. Esto puede afectar la información de otros usuarios del proyecto.", + "TestItemsPage.warningMultiple": "Está a punto de eliminar elementos que no son suyos. Esto puede afectar la información de otros usuarios del proyecto.", + "TestStatuses.cancelled": "Cancelado", + "TestStatuses.failed": "fallido", + "TestStatuses.inProgress": "en progreso", + "TestStatuses.info": "Info", + "TestStatuses.interrupted": "interrumpido", + "TestStatuses.notFound": "No hay elementos en la ejecución", + "TestStatuses.passed": "pasado", + "TestStatuses.reseted": "Reiniciado", + "TestStatuses.skipped": "omitido", + "TestStatuses.stopped": "detenido", + "TestStatuses.warn": "Advertencia", + "TestsTableWidget.header.basedOn": "Basado en", + "TestsTableWidget.header.launchName": "Nombre de la ejecución", + "TimeConsuming.launchNameText": "Nombre de la ejecución", + "Timer.hours": "h", + "Timer.minutes": "m", + "Timer.seconds": "s", + "UnassignButton.anassignBtn": "Desasignar", + "UnassignButton.anassignUser": "¡El usuario ha sido desasignado del proyecto!", + "UnassignButton.unAssignTitle": "Desasignar usuario del proyecto", + "UnassignButton.unAssignTitleExternal": "No se puede desasignar un usuario de UPSA del proyecto de UPSA", + "UnassignButton.unAssignTitleNoPermission": "No tienes permisos suficientes", + "UnassignButton.unAssignTitlePersonal": "No se puede desasignar un usuario de un proyecto personal", + "UnassignButton.unAssignTitleYou": "No se puede desasignar tu propia cuenta del proyecto", + "UnassignModal.modalHeader": "Desasignar usuario", + "UnassignModal.modalText": "¿Está seguro de que quiere desasignar al usuario '{user}' del proyecto '{project}'?", + "UnassignModal.unassign": "Desasignar", + "UnassignUser.by": "fue desasignado del proyecto por el usuario", + "UniqueBugsTable.bugIDColumn": "ID del error", + "UniqueBugsTable.foundInColumn": "Encontrado en", + "UniqueBugsTable.submitDateColumn": "Fecha de creación", + "UniqueBugsTable.submitDateHint": "Fecha de creación:", + "UniqueBugsTable.submitterColumn": "Remitente", + "UniqueBugsTableControls.ItemsFieldLabel": "Máximo de ejecuciones en la muestra", + "UniqueBugsTableControls.ItemsValidationError": "La cantidad de elementos acepta valores de '1' a '600'", + "UniqueErrors.analyzedErrorLogs": "Registros de errores analizados", + "UniqueErrors.analyzedErrorLogsDescription": "Los registros se pueden analizar con o sin cifras", + "UniqueErrors.tabDescription": "El análisis de errores únicos detecta todos los registros de errores únicos durante la ejecución y los agrupa en clústeres con los elementos de prueba fallidos correspondientes. Los clústeres de errores únicos se pueden encontrar en la pestaña «Errores únicos» en los niveles de elementos de prueba. Puede leer más información sobre los Errores Únicos en la Documentación.", + "UniqueErrors.uniqueErrAnalyzeModalExcludeNumbers": "Excluir cifras de los registros analizados", + "UniqueErrors.uniqueErrAnalyzeModalIncludeNumbers": "Incluir cifras en los registros analizados", + "UniqueErrors.uniqueError": "Error único automático", + "UniqueErrors.uniqueErrorDescription": "Si el Error Único Automático está activo, el análisis comienza inmediatamente después de finalizar cualquier ejecución", + "UnlinkIssueModal.unlinkIssue": "Desvincular error", + "UnlinkIssueModal.unlinkModalConfirmationText": "¿Está seguro de que quiere desvincular los errores en el DOA?", + "UnlinkIssueModal.unlinkSuccessMessage": "¡Completado exitosamente!", + "UnmarkAsImportantModal.descriptionNote": "¿Está seguro de que quiere desmarcar el atributo importante de esta ejecución?", + "UnmarkAsImportantModal.note": "En el futuro, esta ejecución se gestionará con la política de retención básica.", + "UnmarkAsImportantModal.unmark": "Desmarcar", + "UnmarkAsImportantModal.unmarkAsImportant": "Desmarcar como importante", + "UpdateAnalysisSettings.allMessagesShouldMatch": "conmutador 'Todos los registros con 3 o más líneas deben coincidir'", + "UpdateAnalysisSettings.analysisProps": "parámetros de Auto-Análisis:", + "UpdateAnalysisSettings.analyzeMode": "Estrategia de Auto-Análisis", + "UpdateAnalysisSettings.autoAnalyze": "conmutador de Auto-Analizador", + "UpdateAnalysisSettings.minDocFreq": "Frecuencia mínima de registros guardados", + "UpdateAnalysisSettings.minShouldMatch": "Debe coincidir al menos", + "UpdateAnalysisSettings.minTermFreq": "Frecuencia mínima del término", + "UpdateAnalysisSettings.numberOfLogLines": "Cantidad de líneas del registro", + "UpdateAnalysisSettings.numbersInErrorLog": "eliminar cifras en el registro de errores", + "UpdateAnalysisSettings.uniqueError": "conmutador de errores únicos", + "UpdateAnalysisSettings.updated": "actualizó", + "UpdateAutoPatternAnalysisSettings.description": "cambiando el valor de {oldValue} a {newValue}.", + "UpdateAutoPatternAnalysisSettings.linkText": "parámetros de Análisis-Patrón:", + "UpdateAutoPatternAnalysisSettings.updated": "actualizó", + "UploadModalLayout.importConfirmation": "Confirmar cancelación", + "UploadPluginModal.importConfirmationWarning": "¿Está seguro de que quiere interrumpir el proceso de carga del complemento?", + "UploadPluginModal.incorrectFileSize": "El tamaño excede 128 Mb", + "UploadPluginModal.modalTitle": "Cargar complemento", + "UploadPluginModal.tip": "Cargue archivos jar de menos de 128 Mb", + "UploadPluginModal.uploadButton": "Cargar", + "UserBlock.adminBadge": "Administrador", + "UserBlock.administrate": "Administrar", + "UserBlock.logout": "Cerrar sesión", + "UserBlock.profile": "Perfil", + "UserInfo.submitError": "¡Error! No se pueden guardar los cambios", + "UserInfo.submitSuccess": "Cambios guardados con éxito", + "ViewTabs.disabledAnalyzer": "El servicio de ANALIZADOR no está iniciado", + "ViewTabs.historyView": "Historial", + "ViewTabs.listView": "Lista", + "ViewTabs.logView": "Registros", + "ViewTabs.uniqueErrorsView": "Errores únicos", + "Widget.forceUpdateWidgetMessage": "¿Está seguro de que quiere actualizar los datos en este widget? Esto puede tardar hasta 15 minutos dependiendo del tamaño de la base de datos del proyecto.", + "Widget.forceUpdateWidgetTitle": "Actualizar datos del widget", + "WidgetCriteriaOption.CriteriaFailed": "Fallido", + "WidgetCriteriaOption.CriteriaPassed": "Pasado", + "WidgetCriteriaOption.CriteriaSkipped": "Omitido", + "WidgetCriteriaOption.CriteriaTotal": "Total", + "WidgetCriteriaOption.aa_settings_actions": "Actualizar Auto-Análisis", + "WidgetCriteriaOption.assign_user": "Asignar, invitar usuario", + "WidgetCriteriaOption.attributes": "Atributos", + "WidgetCriteriaOption.change_role": "Cambiar rol", + "WidgetCriteriaOption.create_pattern": "Crear patrón", + "WidgetCriteriaOption.create_project": "Crear proyecto", + "WidgetCriteriaOption.dashboards_actions": "Actualizar panel", + "WidgetCriteriaOption.defects_actions": "Actualizar tipos de defectos", + "WidgetCriteriaOption.delete_launch": "Eliminar ejecución", + "WidgetCriteriaOption.delete_pattern": "Eliminar complemento", + "WidgetCriteriaOption.description": "Descripción", + "WidgetCriteriaOption.endTime": "Hora de finalización", + "WidgetCriteriaOption.filters_actions": "Actualizar filtro", + "WidgetCriteriaOption.finish_launch": "Terminar ejecución", + "WidgetCriteriaOption.import_actions": "Importar", + "WidgetCriteriaOption.integration_actions": "Actualizar integración", + "WidgetCriteriaOption.issues_actions": "Acciones con errores", + "WidgetCriteriaOption.markLaunchAsImportant": "Marcar la ejecución como importante", + "WidgetCriteriaOption.matched_pattern": "Patrón encontrado", + "WidgetCriteriaOption.startTime": "Inicio", + "WidgetCriteriaOption.start_launch": "Iniciar ejecución", + "WidgetCriteriaOption.unassign_user": "Desasignar usuario", + "WidgetCriteriaOption.unmarkLaunchAsImportant": "Desmarcar como importante", + "WidgetCriteriaOption.updateAutoPatternAnalysisSettings": "Actualizar configuraciones de Pattern-Analysis", + "WidgetCriteriaOption.update_pattern": "Actualizar patrón", + "WidgetCriteriaOption.update_project": "Actualizar configuraciones del proyecto", + "WidgetCriteriaOption.user": "Usuario", + "WidgetCriteriaOption.widgets_actions": "Actualizar widget", + "WidgetHeader.forceUpdate": "Actualizar", + "WidgetHeader.lastRefresh": "Actualizado:", + "WidgetModes.allLaunches": "Todas las ejecuciones", + "WidgetModes.areaViewMode": "Diagrama", + "WidgetModes.barViewMode": "Histograma", + "WidgetModes.donutView": "Circular", + "WidgetModes.latestLaunches": "Últimas ejecuciones", + "WidgetModes.launchMode": "Modo de ejecución", + "WidgetModes.panelView": "Vista en grupos", + "WidgetModes.pieView": "Circular", + "WidgetModes.tableView": "Tabla", + "WidgetModes.timelineMode": "Modo de gráfico", + "WidgetTypeSelector.heading": "Seleccione el tipo de widget de la lista", + "WidgetWizardModal.headerText": "Añadir nuevo widget", + "Widgets.Description.activityStream": "Muestra todas las actividades realizadas en el proyecto.", + "Widgets.Description.bugTrend": "Muestra la tendencia del aumento de casos de prueba fallidos de una ejecución a otra.", + "Widgets.Description.casesTrend": "- en el \"Modo de ejecución\" muestra el crecimiento del número de casos de prueba de una ejecución a otra,
- en el \"Modo de gráfico\" muestra el crecimiento del número de casos de prueba con distribución por fechas (en ejecuciones con el mayor número de casos de prueba por día).", + "Widgets.Description.componentHealthCheck": "Mostrar el porcentaje de pruebas pasadas por componente", + "Widgets.Description.componentHealthCheckTable": "Muestra estadísticas detalladas de los componentes de la aplicación, que están marcados con los atributos especificados, con la posibilidad de excluir las pruebas omitidas de las estadísticas. Dado que el widget contiene consultas complejas, puede tardar un tiempo en renderizarse (~ 10 minutos).", + "Widgets.Description.cumulative": "Muestra la tendencia del crecimiento de estadísticas acumuladas de ejecuciones con la misma clave de atributo.", + "Widgets.Description.flakyTestCases": "Muestra el TOP-50 de los casos de prueba más inestables en las ejecuciones designadas.", + "Widgets.Description.investigatedTrend": "- en el \"Modo de ejecución\" muestra si las ejecuciones están siendo investigadas (porcentaje \"Investigado\"/\"Por investigar\") de una ejecución a otra,
- en el \"Modo de gráfico\" muestra el porcentaje de pruebas en estado \"Investigado\"/\"Por investigar\" en todas las ejecuciones diarias con distribución por fechas.", + "Widgets.Description.launchStatistics": "Muestra estadísticas de la última ejecución, dividida en 2 partes:
- Omitido, Pasado, Fallido
- Defecto del sistema, Error del sistema, Investigar, Error de automatización.", + "Widgets.Description.launchesComparisonChart": "Permite comparar estadísticas de las 2 últimas ejecuciones.", + "Widgets.Description.launchesDurationChart": "Muestra la duración de las ejecuciones seleccionadas.", + "Widgets.Description.launchesTable": "Muestra una tabla configurable de ejecuciones.", + "Widgets.Description.mostFailedTestCases": "Muestra el top-50 de los casos de prueba más fallidos en las ejecuciones designadas.", + "Widgets.Description.mostPopularPatterns": "Muestra el top-20 de los patrones más populares en las ejecuciones designadas.", + "Widgets.Description.mostTimeConsuming": "Muestra los TOP 20 de los casos de prueba que más tiempo consumen en la última ejecución de la ejecución especificada.", + "Widgets.Description.notPassed": "Muestra la proporción porcentual de casos no pasados (Fallido + Omitido) con respecto al número total de casos de una ejecución a otra.", + "Widgets.Description.overallStatistics": "Muestra un resumen de casos de prueba con cada estado en las ejecuciones seleccionadas.", + "Widgets.Description.passingRatePerLaunch": "Muestra la proporción porcentual de conjuntos de prueba pasados con respecto al número total de conjuntos de prueba, incluyendo o excluyendo conjuntos omitidos para la ejecución seleccionada.", + "Widgets.Description.passingRateSummary": "Muestra la proporción porcentual entre pruebas pasadas y su número total para las ejecuciones seleccionadas.", + "Widgets.Description.statisticTrend": "- en el \"Modo de ejecución\" muestra la tendencia del crecimiento del número de casos de prueba con cada estado seleccionado de una ejecución a otra,
- en el \"Modo de gráfico\" muestra la suma con distribución por fechas.", + "Widgets.Description.uniqueBugTable": "Muestra errores reales reconocidos, publicados en el sistema de seguimiento de errores, y existentes en los errores de SOD cargados en el proyecto.", + "Widgets.Name.activityStream": "Panel de actividades del proyecto", + "Widgets.Name.bugTrend": "Diagrama de tendencias de escenarios fallidos", + "Widgets.Name.casesTrend": "Diagrama de tendencia del crecimiento del número de casos de prueba", + "Widgets.Name.componentHealthCheck": "Verificación del estado de los componentes del producto", + "Widgets.Name.componentHealthCheckTable": "Verificación del estado de los componentes del producto (vista de tabla)", + "Widgets.Name.cumulative": "Diagrama de tendencias acumulativas", + "Widgets.Name.flakyTestCases": "Tabla de los casos de prueba más inestables (TOP-50)", + "Widgets.Name.investigatedTrend": "Porcentaje de ejecuciones investigadas", + "Widgets.Name.launchStatistics": "Estadísticas de ejecución y errores", + "Widgets.Name.launchesComparisonChart": "Diagrama de comparación de diferentes ejecuciones", + "Widgets.Name.launchesDurationChart": "Diagrama de duración de ejecuciones", + "Widgets.Name.launchesTable": "Tabla de ejecuciones", + "Widgets.Name.mostFailedTestCases": "Tabla de los casos de prueba más fallidos (TOP-50)", + "Widgets.Name.mostPopularPatterns": "Tabla de los patrones más populares (TOP-20)", + "Widgets.Name.mostTimeConsuming": "Widget de casos de prueba que más tiempo consumen (TOP-20)", + "Widgets.Name.notPassed": "Diagrama de tendencias de casos de prueba no pasados", + "Widgets.Name.overallStatistics": "Estadísticas generales", + "Widgets.Name.passingRatePerLaunch": "Porcentaje de pruebas pasadas para una ejecución", + "Widgets.Name.passingRateSummary": "Porcentaje de pruebas pasadas para ejecuciones seleccionadas", + "Widgets.Name.statisticTrend": "Diagrama de estadísticas de ejecuciones", + "Widgets.Name.uniqueBugTable": "Tabla de errores únicos", + "Widgets.growtestCases": "Crecimiento de casos de prueba", + "Widgets.ofTestCases": "casos de prueba", + "Widgets.totalTestCases": "Número total de casos de prueba", + "WidgetsGrid.notification.deleteWidgetSuccess": "Widget eliminado con éxito", + "WizardInfoSection.WidgetConfiguringStepLabel": "Configurar widget", + "WizardInfoSection.WidgetSavingStepLabel": "Guardar", + "WizardInfoSection.WidgetSelectionStepLabel": "Seleccionar tipo de widget", + "WizardInfoSection.addWidgetButton": "Añadir", + "WizardInfoSection.nextStepButton": "Siguiente paso", + "WizardInfoSection.prevStepButton": "Paso anterior", + "administrateEventsPageToolbar.searchPlaceholder": "Buscar por usuario, acción, tipo de objeto, nombre de objeto", + "administrateUsersPage.allUsers": "Todos los usuarios", + "administrateUsersPage.deleteModalContent": "¿Está seguro de que quiere eliminar al usuario {name}?", + "administrateUsersPage.deleteModalHeader": "Eliminación de usuario", + "administrateUsersPage.deleteModalMultipleContent": "¿Está seguro de que quiere eliminar a los usuarios {names}?", + "administrateUsersPage.deleteModalMultipleHeader": "Eliminación de usuarios", + "administrateUsersPage.error": "Ocurrió un error al eliminar el usuario", + "administrateUsersPage.errorMultiple": "Ocurrió un error al eliminar a los usuarios", + "administrateUsersPage.success": "Usuario eliminado", + "administrateUsersPage.successMultiple": "Usuarios eliminados", + "administrateUsersPageToolbar.allUsers": "{count} usuarios seleccionados", + "administrateUsersPageToolbar.searchPlaceholder": "Buscar por nombre, usuario, correo electrónico", + "dashboardControl.dashboardName": "Mi primer panel de control", + "dashboardControl.title": "Guardar widget en el panel de control", + "entityInputConditional.defaultPlaceholder": "Ingrese nombre", + "flakyTests.flakyTestsMatrixTooltip": "{statusNumber} {statusChange} de {possibleNumber} {possibleTimes}", + "flakyTests.flakyTestsMatrixTooltipChange": "cambio de estado", + "flakyTests.flakyTestsMatrixTooltipChanges": "cambios de estado", + "flakyTests.flakyTestsMatrixTooltipPossible": "posible", + "flakyTests.flakyTestsMatrixTooltipPossibleTimes": "posibles", + "launchAnalysisModal.analyze": "Analizar", + "launchAnalysisModal.baseOptions.allLaunches": "Todas las ejecuciones anteriores", + "launchAnalysisModal.baseOptions.current": "Solo la ejecución actual", + "launchAnalysisModal.baseOptions.currentAndWithSameName": "La ejecución actual y todas las anteriores con el mismo nombre", + "launchAnalysisModal.baseOptions.previousLaunch": "Solo la ejecución anterior con el mismo nombre", + "launchAnalysisModal.baseOptions.withSameName": "Todas las ejecuciones anteriores con el mismo nombre", + "launchAnalysisModal.itemOptions.byAA": "Elementos analizados automáticamente (AA)", + "launchAnalysisModal.itemOptions.investigate": "Elementos investigados", + "launchAnalysisModal.itemOptions.manually": "Elementos analizados manualmente", + "launchAnalysisModal.modTitle": "Seleccione la estrategia de Auto-Análisis:", + "launchAnalysisModal.optionsTitle": "Seleccione los elementos de prueba que deben ser analizados:", + "launchAnalysisModal.successMessage": "El autoanalizador se ha iniciado.", + "launchAnalysisModal.title": "Analizar ejecuciones", + "launchAnalysisModal.validation.chooseOption": "No puede realizar esta operación si no se selecciona al menos un elemento", + "launchAnalysisModal.validation.currentLaunch": "No puede realizar esta operación para elementos con Auto-Análisis y análisis manual simultáneamente. Por favor, elija uno de ellos", + "launchPatternAnalysisModal.title": "Análisis de patrones de ejecuciones", + "notFoundPage.oops": "Ups. Página no encontrada.", + "notFoundPage.pageNotExist": "La página que busca no existe.", + "notFoundPage.toHome": "Llévame de aquí", + "projectsAndRolesColumn.addProject": "+ Añadir Proyecto", + "projectsAndRolesColumn.anassignBtn": "Desasignar", + "projectsAndRolesColumn.anassignUser": "¡El usuario ha sido desasignado del proyecto!", + "projectsAndRolesColumn.assignToProject": "Asignar al proyecto", + "projectsAndRolesColumn.unAssignTitle": "Desasignar usuario del proyecto", + "projectsAndRolesColumn.updateUserRole": "Usuario ''{user}'' actualizado", + "projectsGrid.contains": "Contiene", + "projectsGrid.lastRun": "Última ejecución", + "projectsGrid.numberOfLaunches": "Ejecuciones", + "projectsGrid.numberOfMembers": "Miembros", + "projectsGrid.organizationName": "Organización", + "projectsGrid.projectName": "Proyectos", + "projectsGrid.projectTypeInternal": "Interno", + "projectsGrid.projectTypePersonal": "Personal", + "projectsGrid.projectTypeUpsa": "UPSA", + "projectsGrid.type": "Tipo", + "rolesRow.projectSearchPlaceholder": "Proyecto", + "rolesRow.unAssignFromPersonalProject": "No se puede desasignar al usuario de un proyecto personal", + "usersGrid.accountTypeGithub": "Github", + "usersGrid.accountTypeInternal": "Interno", + "usersGrid.accountTypeLdap": "Ldap", + "usersGrid.accountTypeSaml": "Saml", + "usersGrid.accountTypeUpsa": "UPSA", + "usersGrid.contains": "Contiene", + "usersGrid.email": "Correo electrónico", + "usersGrid.lastLogin": "Último acceso", + "usersGrid.name": "Nombre", + "usersGrid.project": "Proyecto", + "usersGrid.role": "Rol", + "usersGrid.roleAdmin": "Admin", + "usersGrid.roleNonAdmin": "No Admin", + "usersGrid.type": "Tipo", + "usersGrid.user": "Usuario" +} \ No newline at end of file diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index 9d441e1761..552a48a5f1 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -543,7 +543,8 @@ "DefectTypesTab.warningMessage": "Вы достигли максимального предела типов дефектов, доступных для каждого проекта", "DefectTypesTab.warningSubMessage": "Количество типов дефектов в вашем проекте в настоящее время составляет {maxLength} из {maxLength}. Вы сможете создать новый после удаления хотя бы одного созданного ранее", "DeleteAccountBlock.deleteAccount": "Удалить аккаунт", - "DeleteAccountBlock.tooltipText": "Только пользователи с ролью, отличной от администратора, могут удалить свою учетную запись.\nКроме того, это может сделать другой администратор.", + "DeleteAccountBlock.tooltipAdminDisabledText": "Только пользователи с ролью, отличной от администратора, могут удалить свою учетную запись.\nКроме того, это может сделать другой администратор.", + "DeleteAccountBlock.tooltipDefaultUserDisabledText": "Запрещено удалять учетную запись пользователя по умолчанию на демо инстансе.", "DeleteAccountFeedbackModal.alternative": "Нашел лучшую альтернативу", "DeleteAccountFeedbackModal.continue": "Продолжить", "DeleteAccountFeedbackModal.deleteAccountReasonSizeHint": "Поле должно иметь размер не более 128 символов.", @@ -564,16 +565,12 @@ "DeleteFilterDialog.deleteFilterOwnerWarning": "Вы собираетесь удалить не свой фильтр. Это может повлиять на информацию других пользователей проекта.", "DeleteImageModal.header": "Удалить фото", "DeleteImageModal.text": "Вы уверены, что хотите удалить фото профиля?", - "DeleteLaunchModal.deleteImportantLaunch": "Удалить важный запуск", "DeleteLaunchModal.deleteImportantLaunchMessage": "”{name}” отмечен как важный.
Вы уверены, что хотите удалить этот важный запуск?", - "DeleteLaunchModal.deleteImportantLaunches": "Удалить важные запуски", "DeleteLaunchModal.deleteImportantLaunchesMessage": "{importantCount} запусков, отмеченных как важные.
Вы уверены, что хотите удалить эти важные запуски?", "DeleteLaunchModal.deleteModalContent": "Вы уверены, что хотите удалить запуск '{name}'? Вы потеряете доступ к нему.", "DeleteLaunchModal.deleteModalHeader": "Удалить запуск", "DeleteLaunchModal.deleteModalMultipleContent": "Вы уверены, что хотите удалить запуски? Вы потеряете доступ к ним.", "DeleteLaunchModal.deleteModalMultipleHeader": "Удалить запуски", - "DeleteLaunchModal.deleteOnlyRegular": "Удалить только обычные", - "DeleteLaunchModal.deleteWithImportantLaunch": "Удалить с важными запусками", "DeleteLaunchModal.deleteWithImportantLaunchMessage": "\"{name}\" запуск отмечен как важный.
Вы уверены, что хотите удалить и эти важные запуски?", "DeleteLaunchModal.deleteWithImportantLaunchesMessage": "{importantCount} запусков отмечены как важные среди {totalCount} запусков, которые вы пытаетесь удалить. Вы уверены, что хотите удалить эти важные запуски тоже?", "DeleteLaunchModal.warning": "Вы собираетесь удалить не свой запуск. Это может повлиять на информацию других пользователей проекта.", @@ -852,6 +849,10 @@ "Footer.build": "Сборка", "Footer.contact": "Свяжитесь с нами", "Footer.copyright": "Все права защищены", + "Footer.deleteImportantLaunch": "Удалить важный запуск", + "Footer.deleteImportantLaunches": "Удалить важные запуски", + "Footer.deleteOnlyRegular": "Удалить только обычные", + "Footer.deleteWithImportantLaunch": "Удалить с важными запусками", "Footer.documentation": "Документация", "Footer.git": "Мы на GitHub", "Footer.privacy": "Политика конфиденциальности", @@ -1214,6 +1215,7 @@ "LocalizationBlock.label": "Язык", "LocalizationBlock.note": "К сведению", "LocalizationBlock.russian": "Русский", + "LocalizationBlock.spanish": "Испанский", "LocalizationBlock.ukrainian": "Ukrainian", "LogItemActivity.changedByAnalyzer": "АА изменил тип дефекта", "LogItemActivity.issueLoadByAnalyzer": "AA привязал ошибку", @@ -1500,7 +1502,7 @@ "NotificationRule.launchNameLabel": "Название запуска", "NotificationRule.launchOwner": "Владелец запуска", "Notifications.notifications": "Уведомления по электронной почте", - "Notifications.ruleNameDuplicateHint": "Правило с таким названием уже существует в проекте", + "Notifications.ruleNameDuplicateHint": "Правило с таким названием уже существует для этого канала связи", "Notifications.updateEmail": "обновлено", "NotificationsEnableForm.allNotifications": "Все уведомления", "NotificationsEnableForm.attributes": "Атрибуты", @@ -1652,7 +1654,7 @@ "PostIssueModal.postIssue": "Отправить проблему", "PostIssueModal.postIssueFailed": "Неудалось отправить ошибку", "PostIssueModal.postIssueForTheTest": "Отправить проблему для теста {launchNumber}", - "PostIssueModal.postIssueSuccess": "Карточка была создана", + "PostIssueModal.postIssueSuccess": "Карточка была успешно создана", "PostIssueModal.systemUrlInfo": "Проблема будет отправлена на {systemUrl}", "ProductStatus.filterNameColumn": "Имя фильтра", "ProductStatus.nameColumn": "Имя", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index 97d9cb78ee..6139884b5b 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -543,7 +543,8 @@ "DefectTypesTab.warningMessage": "Ви досягли максимальної кількості типів дефектів, доступних для проекту", "DefectTypesTab.warningSubMessage": "Кількість типів дефектів у вашому проекті наразі становить {maxLength} із {maxLength}. Ви зможете створити новий, видаливши принаймні один створений раніше", "DeleteAccountBlock.deleteAccount": "Видалити аккаунт", - "DeleteAccountBlock.tooltipText": "Лише користувачі з роллю не адміністратора можуть видалити свій обліковий запис.\nКрім того, це може зробити інший адміністратор.", + "DeleteAccountBlock.tooltipAdminDisabledText": "Лише користувачі з роллю не адміністратора можуть видалити свій обліковий запис.\nКрім того, це може зробити інший адміністратор.", + "DeleteAccountBlock.tooltipDefaultUserDisabledText": "Заборонено видаляти обліковий запис користувача за замовчуванням у демонстраційному екземплярі.", "DeleteAccountFeedbackModal.alternative": "Знайшов кращу альтернативу", "DeleteAccountFeedbackModal.continue": "Продовжити", "DeleteAccountFeedbackModal.deleteAccountReasonSizeHint": "Поле має бути розміром не більше 128 символів.", @@ -564,16 +565,12 @@ "DeleteFilterDialog.deleteFilterOwnerWarning": "Ви збираєтеся видалити свій фільтр. Це може вплинути на інформацію інших користувачів проекту.", "DeleteImageModal.header": "Фото Видалити", "DeleteImageModal.text": "Ви впевнені, що хочете видалити фото профілю?", - "DeleteLaunchModal.deleteImportantLaunch": "Видалити важливий запуск", "DeleteLaunchModal.deleteImportantLaunchMessage": "”{name}” позначений як важливий.
Ви впевнені, що хочете видалити цей важливий запуск?", - "DeleteLaunchModal.deleteImportantLaunches": "Видалення важливих запусків", "DeleteLaunchModal.deleteImportantLaunchesMessage": "{importantCount} запусків, позначених як важливі.
Ви впевнені, що хочете видалити ці важливі запуски?", "DeleteLaunchModal.deleteModalContent": "Вы уверены, что хотите удалить запуск '{name}'? Вы потеряете доступ к нему.", "DeleteLaunchModal.deleteModalHeader": "Видалити запуск", "DeleteLaunchModal.deleteModalMultipleContent": "Ви впевнені, що хочете видалити запуски? Ви втратите доступ до них.", "DeleteLaunchModal.deleteModalMultipleHeader": "Видалити запуски", - "DeleteLaunchModal.deleteOnlyRegular": "Видаляти тільки звичайні", - "DeleteLaunchModal.deleteWithImportantLaunch": "Видалити з важливими запусками", "DeleteLaunchModal.deleteWithImportantLaunchMessage": "\"{name}\" запуск позначений як важливий..
Ви впевнені, що хочете також видалити ці важливі запуски?", "DeleteLaunchModal.deleteWithImportantLaunchesMessage": "{importantCount} запусків позначено як важливі серед {totalCount} запусків, які ви намагаєтеся видалити. Ви впевнені, що хочете також видалити ці важливі запуски?", "DeleteLaunchModal.warning": "Ви збираєтеся видалити свій запуск. Це може вплинути на інформацію інших користувачів проекту.", @@ -852,6 +849,10 @@ "Footer.build": "Збірка", "Footer.contact": "Зв’яжіться з нами", "Footer.copyright": "Всі права захищені", + "Footer.deleteImportantLaunch": "Видалити важливий запуск", + "Footer.deleteImportantLaunches": "Видалити важливі запуску", + "Footer.deleteOnlyRegular": "Видаляти тільки звичайні", + "Footer.deleteWithImportantLaunch": "Видалити з важливими запусками", "Footer.documentation": "Документація", "Footer.git": "Ми на Гітхабі", "Footer.privacy": "Політика конфіденційності", @@ -1214,6 +1215,7 @@ "LocalizationBlock.label": "Мова", "LocalizationBlock.note": "До відома", "LocalizationBlock.russian": "Російська", + "LocalizationBlock.spanish": "Iспанська", "LocalizationBlock.ukrainian": "Українська", "LogItemActivity.changedByAnalyzer": "АА змінив тип дефекту", "LogItemActivity.issueLoadByAnalyzer": "АА прив’язав помилку", @@ -1500,7 +1502,7 @@ "NotificationRule.launchNameLabel": "Назва запуску", "NotificationRule.launchOwner": "Власник запуску", "Notifications.notifications": "Повідомлення електронною поштою", - "Notifications.ruleNameDuplicateHint": "Правило з такою ж назвою вже існує в проекті", + "Notifications.ruleNameDuplicateHint": "Правило з такою назвою вже існує для цього каналу зв’язку", "Notifications.updateEmail": "оновлено", "NotificationsEnableForm.allNotifications": "Усі сповіщення", "NotificationsEnableForm.attributes": "Атрибути", @@ -1652,7 +1654,7 @@ "PostIssueModal.postIssue": "Відправити проблему", "PostIssueModal.postIssueFailed": "Не вдалося надіслати помилку", "PostIssueModal.postIssueForTheTest": "Відправити проблему для тесту {launchNumber}", - "PostIssueModal.postIssueSuccess": "Картка була створена", + "PostIssueModal.postIssueSuccess": "Картка була успішно створена", "PostIssueModal.systemUrlInfo": "Проблема будет отправлена на {systemUrl}", "ProductStatus.filterNameColumn": "Ім’я фільтра", "ProductStatus.nameColumn": "Ім’я", diff --git a/app/localization/translated/whitelist_es.json b/app/localization/translated/whitelist_es.json new file mode 100644 index 0000000000..32960f8ced --- /dev/null +++ b/app/localization/translated/whitelist_es.json @@ -0,0 +1,2 @@ +[ +] \ No newline at end of file diff --git a/app/localization/translated/zh.json b/app/localization/translated/zh.json index 936e02f484..4f5eabfc5a 100644 --- a/app/localization/translated/zh.json +++ b/app/localization/translated/zh.json @@ -543,7 +543,8 @@ "DefectTypesTab.warningMessage": "您已达到每个项目可用的缺陷类型的最大限制", "DefectTypesTab.warningSubMessage": "您项目中的缺陷类型数量目前是{maxLength}个,超出了最多所允许的{maxLength}个。删除至少一个之前创建的缺陷类型后,您才能够创建一个新的", "DeleteAccountBlock.deleteAccount": "删除账户", - "DeleteAccountBlock.tooltipText": "只有非管理员角色的用户才能删除他们的帐户。\n或者,其他管理员也可以执行此操作。", + "DeleteAccountBlock.tooltipAdminDisabledText": "只有非管理员角色的用户才能删除他们的帐户。\n或者,其他管理员也可以执行此操作。", + "DeleteAccountBlock.tooltipDefaultUserDisabledText": "It's forbidden to delete account of default user on Demo instance.", "DeleteAccountFeedbackModal.alternative": "找到了更好的替代方案。", "DeleteAccountFeedbackModal.continue": "继续", "DeleteAccountFeedbackModal.deleteAccountReasonSizeHint": "该字段的大小不应超过128个符号。", @@ -564,16 +565,12 @@ "DeleteFilterDialog.deleteFilterOwnerWarning": "您要删除的过滤器不属于您。这可能会影响项目上的其他用户信息。", "DeleteImageModal.header": "删除图片", "DeleteImageModal.text": "您确定要删除简介照片吗?", - "DeleteLaunchModal.deleteImportantLaunch": "Delete Important Launch", "DeleteLaunchModal.deleteImportantLaunchMessage": "”{name}” is marked as important.
Are you sure you want to delete this important launch?", - "DeleteLaunchModal.deleteImportantLaunches": "Delete Important Launches", "DeleteLaunchModal.deleteImportantLaunchesMessage": "There are {importantCount} launches marked as important.
Are you sure you want to delete these important launches?", "DeleteLaunchModal.deleteModalContent": "您确定要删除测试任务“{name}”吗?它将被永久删除。", "DeleteLaunchModal.deleteModalHeader": "删除测试任务", "DeleteLaunchModal.deleteModalMultipleContent": "您确定要删除这些测试任务吗?它们将被永久删除。", "DeleteLaunchModal.deleteModalMultipleHeader": "删除测试任务", - "DeleteLaunchModal.deleteOnlyRegular": "Delete only regular", - "DeleteLaunchModal.deleteWithImportantLaunch": "Delete with Important Launches", "DeleteLaunchModal.deleteWithImportantLaunchMessage": "There is \"{name}\" launch marked as important.
Are you sure you want to delete these important launches also?", "DeleteLaunchModal.deleteWithImportantLaunchesMessage": "There are {importantCount} launches marked as important among the {totalCount} launches you are trying to delete. Are you sure you want to delete these important launches also?", "DeleteLaunchModal.warning": "您要删除的测试任务不属于您。这可能会影响项目上的其他用户信息。", @@ -852,6 +849,10 @@ "Footer.build": "构建", "Footer.contact": "联系我们", "Footer.copyright": "版权所有", + "Footer.deleteImportantLaunch": "删除重要发布", + "Footer.deleteImportantLaunches": "删除重要发布", + "Footer.deleteOnlyRegular": "仅删除常规发布", + "Footer.deleteWithImportantLaunch": "删除重要发布", "Footer.documentation": "文档", "Footer.git": "在GitHub上基于我们的代码创建分叉(Fork)", "Footer.privacy": "隐私政策", @@ -1214,6 +1215,7 @@ "LocalizationBlock.label": "语言", "LocalizationBlock.note": "注释", "LocalizationBlock.russian": "俄语", + "LocalizationBlock.spanish": "英语", "LocalizationBlock.ukrainian": "乌克兰运", "LogItemActivity.changedByAnalyzer": "自动分析服务已更改缺陷类型", "LogItemActivity.issueLoadByAnalyzer": "自动分析服务已关联问题", @@ -1500,7 +1502,7 @@ "NotificationRule.launchNameLabel": "测试任务名称", "NotificationRule.launchOwner": "测试任务负责人", "Notifications.notifications": "电子邮件通知", - "Notifications.ruleNameDuplicateHint": "项目中已存在同名规则", + "Notifications.ruleNameDuplicateHint": "此通信渠道已存在同名规则", "Notifications.updateEmail": "更新成功", "NotificationsEnableForm.allNotifications": "所有通知", "NotificationsEnableForm.attributes": "属性", @@ -2255,4 +2257,4 @@ "usersGrid.roleNonAdmin": "非管理", "usersGrid.type": "类型", "usersGrid.user": "登录" -} +} \ No newline at end of file diff --git a/app/src/common/constants/supportedLanguages.js b/app/src/common/constants/supportedLanguages.js index 76ae57cdb6..48f3629f1f 100644 --- a/app/src/common/constants/supportedLanguages.js +++ b/app/src/common/constants/supportedLanguages.js @@ -19,5 +19,6 @@ export const UKRAINIAN = 'uk'; export const RUSSIAN = 'ru'; export const BELARUSIAN = 'be'; export const SIMPLIFIED_CHINESE = 'zh'; +export const SPANISH = 'es'; export const DEFAULT_LANGUAGE = ENGLISH; diff --git a/app/src/common/polyfills.js b/app/src/common/polyfills.js index 3239690b67..ca2cd8c3c3 100644 --- a/app/src/common/polyfills.js +++ b/app/src/common/polyfills.js @@ -22,7 +22,7 @@ export const polyfillLocales = () => if ( window.Intl.PluralRules && window.Intl.RelativeTimeFormat && - areIntlLocalesSupported(['en', 'uk', 'ru', 'be']) + areIntlLocalesSupported(['en', 'uk', 'ru', 'be', 'es']) ) { resolve(); return; @@ -35,12 +35,14 @@ export const polyfillLocales = () => '@formatjs/intl-pluralrules/dist/locale-data/ru.js', '@formatjs/intl-pluralrules/dist/locale-data/be.js', '@formatjs/intl-pluralrules/dist/locale-data/zh.js', + '@formatjs/intl-pluralrules/dist/locale-data/es.js', '@formatjs/intl-relativetimeformat/dist/core', '@formatjs/intl-relativetimeformat/dist/locale-data/en.js', '@formatjs/intl-relativetimeformat/dist/locale-data/uk.js', '@formatjs/intl-relativetimeformat/dist/locale-data/ru.js', '@formatjs/intl-relativetimeformat/dist/locale-data/be.js', '@formatjs/intl-relativetimeformat/dist/locale-data/zh.js', + '@formatjs/intl-relativetimeformat/dist/locale-data/es.js', ], (require) => { const { PluralRules } = require('@formatjs/intl-pluralrules/dist/core'); @@ -50,6 +52,7 @@ export const polyfillLocales = () => require('@formatjs/intl-pluralrules/dist/locale-data/ru.js'); require('@formatjs/intl-pluralrules/dist/locale-data/be.js'); require('@formatjs/intl-pluralrules/dist/locale-data/zh.js'); + require('@formatjs/intl-pluralrules/dist/locale-data/es.js'); const { default: RelativeTimeFormat, @@ -60,6 +63,7 @@ export const polyfillLocales = () => require('@formatjs/intl-relativetimeformat/dist/locale-data/ru.js'); require('@formatjs/intl-relativetimeformat/dist/locale-data/be.js'); require('@formatjs/intl-relativetimeformat/dist/locale-data/zh.js'); + require('@formatjs/intl-relativetimeformat/dist/locale-data/es.js'); resolve(); }, ); diff --git a/app/src/common/utils/referenceDictionary.js b/app/src/common/utils/referenceDictionary.js index 5680d25788..f63aa4b822 100644 --- a/app/src/common/utils/referenceDictionary.js +++ b/app/src/common/utils/referenceDictionary.js @@ -50,7 +50,7 @@ export const docsReferences = { authorizationWithUsersApiKeyForAgents: 'https://reportportal.io/docs/reportportal-configuration/HowToGetAnAccessTokenInReportPortal/#2-authorization-with-users-api-key-for-agents', workWithReports: 'https://reportportal.io/docs/work-with-reports/InvestigationOfFailure', - pluginsDocs: 'https://reportportal.io/docs/category/plugins', + pluginsDocs: 'https://reportportal.io/docs/plugins/', }; export const faqDictionary = { diff --git a/app/src/componentLibrary/attributeList/attributeList.jsx b/app/src/componentLibrary/attributeList/attributeList.jsx index 4541a2d218..e2f1e2002a 100644 --- a/app/src/componentLibrary/attributeList/attributeList.jsx +++ b/app/src/componentLibrary/attributeList/attributeList.jsx @@ -18,9 +18,10 @@ import React, { useMemo, useRef } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames/bind'; import { FormattedMessage } from 'react-intl'; +import Parser from 'html-react-parser'; import { notSystemAttributePredicate } from 'common/utils/attributeUtils'; import { AttributeEditor } from 'componentLibrary/attributeEditor'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import PlusIcon from 'common/img/plus-button-inline.svg'; import { ENTER_KEY_CODE, TAB_KEY_CODE } from 'common/constants/keyCodes'; import { EditableAttribute } from './editableAttribute'; @@ -321,11 +322,11 @@ export const AttributeList = ({ {!hasEditedAttribute && !disabled && showButton && attributes.length < maxLength && ( - ); -}; - -Button.propTypes = { - variant: PropTypes.string, - startIcon: PropTypes.string, - endIcon: PropTypes.string, - wide: PropTypes.bool, - children: PropTypes.node, - disabled: PropTypes.bool, - type: PropTypes.string, - onClick: PropTypes.func, - refCallback: PropTypes.func, - form: PropTypes.string, - title: PropTypes.string, - customClassName: PropTypes.string, - dataAutomationId: PropTypes.string, -}; - -Button.defaultProps = { - variant: 'topaz', - startIcon: '', - endIcon: '', - wide: false, - children: '', - disabled: false, - type: 'button', - onClick: () => {}, - refCallback: (node) => node, - form: null, - title: '', - customClassName: '', - dataAutomationId: '', -}; diff --git a/app/src/componentLibrary/button/button.scss b/app/src/componentLibrary/button/button.scss deleted file mode 100644 index a830e7a160..0000000000 --- a/app/src/componentLibrary/button/button.scss +++ /dev/null @@ -1,221 +0,0 @@ -/*! - * Copyright 2022 EPAM Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@mixin draw-button-border($color) { - &::after { - content: ''; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 100%; - height: 100%; - border: 2px solid $color; - border-radius: 3px; - } -} - -.button { - display: inline-flex; - justify-content: center; - align-items: center; - min-width: 120px; - height: 36px; - padding: 9px 16px 7px; - margin: 0; - outline: none; - border-radius: 3px; - font-family: $FONT-ROBOTO-MEDIUM; - font-size: 13px; - line-height: 20px; - cursor: pointer; - box-sizing: border-box; - position: relative; -} - -.topaz { - border: 1px solid $COLOR--topaz-2; - background-color: $COLOR--topaz-2; - color: $COLOR--bg-000; - &:hover:not(.disabled) { - border: 1px solid $COLOR--topaz-hover-2; - background-color: $COLOR--topaz-hover-2; - } - &:active:not(.disabled) { - border: 1px solid $COLOR--topaz-pressed; - background-color: $COLOR--topaz-pressed; - } - &:focus:not(.disabled, :active) { - @include draw-button-border($COLOR--topaz-focused); - } -} - -.ghost { - border: 1px solid $COLOR--topaz-2; - background-color: transparent; - color: $COLOR--topaz-2; - &:hover:not(.disabled) { - border: 1px solid $COLOR--topaz-hover-2; - color: $COLOR--topaz-hover-2; - } - &:active:not(.disabled) { - border: 1px solid $COLOR--topaz-pressed; - color: $COLOR--topaz-pressed; - } - &:focus:not(.disabled, :active) { - @include draw-button-border($COLOR--topaz-focused); - color: $COLOR--topaz-focused; - } -} - -.danger { - border: 1px solid $COLOR--red-failed-2; - background-color: $COLOR--red-failed-2; - color: $COLOR--bg-000; - &:hover:not(.disabled) { - opacity: 0.9; - } - &:active:not(.disabled) { - border: 1px solid $COLOR--red-pressed; - background-color: $COLOR--red-pressed; - } - &:focus:not(.disabled, :active) { - @include draw-button-border($COLOR--red-focused); - } -} - -.text { - min-width: auto; - height: auto; - border: 0; - padding: 0; - background: none; - color: $COLOR--topaz-2; - line-height: 22px; - &:hover:not(.disabled) { - color: $COLOR--topaz-hover-2; - svg * { - fill: $COLOR--topaz-hover-2; - } - } - &:active:not(.disabled) { - color: $COLOR--topaz-pressed; - svg * { - fill: $COLOR--topaz-pressed; - } - } - &:focus:not(.disabled, :active) { - color: $COLOR--topaz-focused; - svg * { - fill: $COLOR--topaz-focused; - } - } - svg * { - fill: $COLOR--topaz-2; - } -} - -.dark-topaz { - border: 1px solid $COLOR--darkmode-topaz-main; - background-color: $COLOR--darkmode-topaz-main; - color: $COLOR--bg-000; - &:hover:not(.disabled) { - border: 1px solid $COLOR--darkmode-topaz-hover; - background-color: $COLOR--darkmode-topaz-hover; - } - &:active:not(.disabled) { - border: 1px solid $COLOR--topaz-pressed; - background-color: $COLOR--topaz-pressed; - } - &:focus:not(.disabled, :active) { - @include draw-button-border($COLOR--darkmode-topaz-focused); - } -} - -.dark-ghost { - border: 1px solid $COLOR--darkmode-topaz-main; - background-color: transparent; - color: $COLOR--darkmode-gray-50; - &:hover:not(.disabled) { - border: 1px solid $COLOR--darkmode-topaz-hover; - } - &:active:not(.disabled) { - border: 1px solid $COLOR--topaz-pressed; - } - &:focus:not(.disabled, :active) { - @include draw-button-border($COLOR--darkmode-topaz-focused); - } -} - -.dark-text { - min-width: auto; - height: auto; - border: 0; - padding: 0; - background: none; - line-height: 22px; - color: $COLOR--darkmode-topaz-text; - &:hover:not(.disabled) { - color: $COLOR--darkmode-topaz-hover; - svg * { - fill: $COLOR--darkmode-topaz-hover; - } - } - &:active:not(.disabled) { - color: $COLOR--darkmode-topaz-pressed; - svg * { - fill: $COLOR--darkmode-topaz-pressed; - } - } - &:focus:not(.disabled, :active) { - color: $COLOR--darkmode-topaz-focused; - svg * { - fill: $COLOR--darkmode-topaz-focused; - } - } - svg * { - fill: $COLOR--darkmode-topaz-text; - } -} - -.wide { - padding: 9px 47px 7px; - margin: 0; -} - -.icon { - display: inline-block; - width: 16px; - height: 16px; -} - -.start-icon { - margin: auto 8px auto 0; -} -.end-icon { - margin: auto 0 auto 8px; - order: 1; -} - -.disabled:not(.dark-topaz, .dark-ghost, .dark-text) { - opacity: 0.3; - cursor: default; -} - -.disabled:not(.topaz, .ghost, .text) { - opacity: 0.5; - cursor: default; -} diff --git a/app/src/componentLibrary/button/index.js b/app/src/componentLibrary/button/index.js deleted file mode 100644 index 174cb5a4dc..0000000000 --- a/app/src/componentLibrary/button/index.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2022 EPAM Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Button } from './button'; - -export { Button }; - -export default Button; diff --git a/app/src/componentLibrary/checkbox/README.md b/app/src/componentLibrary/checkbox/README.md deleted file mode 100644 index 31e92577b6..0000000000 --- a/app/src/componentLibrary/checkbox/README.md +++ /dev/null @@ -1,20 +0,0 @@ -## **Checkbox with optional text** - -### Props: - -- **children**: _node_, optional, default "" -- **value**: _bool_, optional, default = false -- **disabled**: _bool_, optional, default = false -- **variant**: _sting_, optional, default = "light" -- **className**: _string_, optional, default = "" -- **dataAutomationId**: _string_, optional, default = '' - -### Events: - -- **onFocus** -- **onBlur** -- **onChange** - -### Variants: - -Checkbox can be used in two variants: **light** for light background and **dark** for dark background. diff --git a/app/src/componentLibrary/checkbox/checkbox.jsx b/app/src/componentLibrary/checkbox/checkbox.jsx deleted file mode 100644 index 62a7c9d091..0000000000 --- a/app/src/componentLibrary/checkbox/checkbox.jsx +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2023 EPAM Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import PropTypes from 'prop-types'; -import classNames from 'classnames/bind'; -import { useRef } from 'react'; -import { ENTER_KEY_CODE, SPACE_KEY_CODE } from 'common/constants/keyCodes'; -import styles from './checkbox.scss'; - -const cx = classNames.bind(styles); - -const LIGHT_VARIANT = 'light'; -const DARK_VARIANT = 'dark'; - -export const Checkbox = ({ - children, - title, - disabled, - onChange, - onFocus, - onBlur, - className, - name, - value, - variant, - dataAutomationId, -}) => { - const inputRef = useRef(null); - - const handleKeyDown = (event) => { - const { keyCode } = event; - - if (keyCode === SPACE_KEY_CODE) { - event.preventDefault(); - return; - } - - if (keyCode === ENTER_KEY_CODE) { - event.preventDefault(); - inputRef.current.click(); - } - }; - - return ( - // eslint-disable-next-line - - ); -}; -Checkbox.propTypes = { - variant: PropTypes.oneOf([LIGHT_VARIANT, DARK_VARIANT]), - title: PropTypes.string, - children: PropTypes.node, - name: PropTypes.string, - value: PropTypes.bool, - disabled: PropTypes.bool, - onChange: PropTypes.func, - onFocus: PropTypes.func, - onBlur: PropTypes.func, - className: PropTypes.string, - dataAutomationId: PropTypes.string, -}; -Checkbox.defaultProps = { - variant: LIGHT_VARIANT, - children: '', - title: '', - name: '', - value: false, - disabled: false, - onChange: () => {}, - onFocus: () => {}, - onBlur: () => {}, - className: '', - dataAutomationId: '', -}; diff --git a/app/src/componentLibrary/checkbox/checkbox.scss b/app/src/componentLibrary/checkbox/checkbox.scss deleted file mode 100644 index 44a78657af..0000000000 --- a/app/src/componentLibrary/checkbox/checkbox.scss +++ /dev/null @@ -1,134 +0,0 @@ -/*! - * Copyright 2022 EPAM Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@mixin checkboxContainer($color, $opacity) { - display: inline-flex; - align-items: center; - padding-left: 24px; - color: $color; - border-color: $color; - font-family: $FONT-ROBOTO-REGULAR; - font-size: 13px; - line-height: 20px; - .disabled { - @include disabled-state($opacity); - } -} - -@mixin checked-state($borderColor, $backgroundColor) { - border-color: $borderColor; - background-color: $backgroundColor; - background-repeat: no-repeat; - background-position: center; - background-image: url("data:image/svg+xml,%3Csvg width='12' height='9' viewBox='0 0 12 9' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1.5 4.25L4.5 7.25L10.5 0.75' stroke='white' stroke-width='2'/%3E%3C/svg%3E"); -} - -@mixin disabled-state($opacity) { - opacity: $opacity; - pointer-events: none; -} - -.input { - opacity: 0; - width: 0; - margin: 0; -} - -.checkbox { - position: absolute; - width: 16px; - height: 16px; - border: 1px solid $COLOR--e-300; - border-radius: 3px; - margin-left: -24px; - box-sizing: border-box; - cursor: pointer; -} - -.children-container { - cursor: pointer; - - & a { - text-decoration: none; - color: $COLOR--topaz-2; - } - - & a:focus, - & a:focus-visible { - outline: none; - color: $COLOR--topaz-focused; - text-decoration: underline; - } -} - -.light { - @include checkboxContainer($COLOR--almost-black, 0.3); - .input { - &:checked + .checkbox { - @include checked-state($COLOR--topaz-2, $COLOR--topaz-2); - } - &:hover + .checkbox { - border-color: $COLOR--e-400; - } - &:active:not(:disabled) + .checkbox { - border: 2px solid $COLOR--topaz-focused; - } - &:checked:hover + .checkbox { - @include checked-state($COLOR--topaz-hover-2, $COLOR--topaz-hover-2); - } - &:checked:active:not(:disabled) + .checkbox { - @include checked-state($COLOR--topaz-focused, $COLOR--topaz-focused); - } - &:disabled + .checkbox { - border-color: $COLOR--e-300; - } - &:checked:disabled + .checkbox { - @include checked-state($COLOR--topaz-2, $COLOR--topaz-2); - @include disabled-state(0.3); - } - &:focus + .checkbox { - border: 2px solid $COLOR--topaz-focused; - } - } -} - -.dark { - @include checkboxContainer($COLOR--darkmode-gray-100, 0.5); - .input { - &:checked + .checkbox { - @include checked-state($COLOR--darkmode-topaz-main, $COLOR--darkmode-topaz-main); - } - &:hover + .checkbox { - border-color: $COLOR--darkmode-gray-50; - } - &:active:not(:disabled) + .checkbox { - border: 2px solid $COLOR--darkmode-topaz-focused; - } - &:checked:hover + .checkbox { - @include checked-state($COLOR--darkmode-topaz-hover, $COLOR--darkmode-topaz-hover); - } - &:checked:active:not(:disabled) + .checkbox { - @include checked-state($COLOR--darkmode-topaz-focused, $COLOR--darkmode-topaz-focused); - } - &:disabled + .checkbox { - border-color: $COLOR--darkmode-gray-100; - } - &:checked:disabled + .checkbox { - @include checked-state($COLOR--darkmode-topaz-main, $COLOR--darkmode-topaz-main); - @include disabled-state(0.5); - } - } -} diff --git a/app/src/componentLibrary/checkbox/index.js b/app/src/componentLibrary/checkbox/index.js deleted file mode 100644 index 9129b30319..0000000000 --- a/app/src/componentLibrary/checkbox/index.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2022 EPAM Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export { Checkbox } from './checkbox'; diff --git a/app/src/componentLibrary/modal/modalLayout/modalFooter/modalFooter.jsx b/app/src/componentLibrary/modal/modalLayout/modalFooter/modalFooter.jsx index b1567bd1b6..b6c9777de6 100644 --- a/app/src/componentLibrary/modal/modalLayout/modalFooter/modalFooter.jsx +++ b/app/src/componentLibrary/modal/modalLayout/modalFooter/modalFooter.jsx @@ -17,7 +17,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames/bind'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import styles from './modalFooter.scss'; const cx = classNames.bind(styles); @@ -33,7 +33,7 @@ export const ModalFooter = ({ okButton, cancelButton, closeHandler, footerNode } variant="ghost" onClick={closeHandler} disabled={cancelButton.disabled} - dataAutomationId={'cancelButton'} + data-automation-id={'cancelButton'} > {cancelButton.text} @@ -42,12 +42,12 @@ export const ModalFooter = ({ okButton, cancelButton, closeHandler, footerNode } {okButton && (
diff --git a/app/src/components/containers/AttributeListFormField/attributeListFormField.jsx b/app/src/components/containers/AttributeListFormField/attributeListFormField.jsx index b8cfef72a5..b606546a9f 100644 --- a/app/src/components/containers/AttributeListFormField/attributeListFormField.jsx +++ b/app/src/components/containers/AttributeListFormField/attributeListFormField.jsx @@ -18,7 +18,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import className from 'classnames/bind'; import { defineMessages, useIntl } from 'react-intl'; -import { Checkbox } from 'componentLibrary/checkbox'; +import { Checkbox } from '@reportportal/ui-kit'; import { AttributeListContainer } from 'components/containers/attributeListContainer'; import styles from './attributeListFormField.scss'; @@ -69,7 +69,7 @@ export const AttributeListFormField = ({ {formatMessage(messages.attributes)} diff --git a/app/src/components/containers/localizationContainer/localizationContainer.jsx b/app/src/components/containers/localizationContainer/localizationContainer.jsx index 92ed97dbb0..cd90ee68b7 100644 --- a/app/src/components/containers/localizationContainer/localizationContainer.jsx +++ b/app/src/components/containers/localizationContainer/localizationContainer.jsx @@ -25,6 +25,7 @@ import localeUK from '../../../../localization/translated/uk.json'; import localeRU from '../../../../localization/translated/ru.json'; import localeBE from '../../../../localization/translated/be.json'; import localeZH from '../../../../localization/translated/zh.json'; +import localeES from '../../../../localization/translated/es.json'; const localesReadyPromise = polyfillLocales(); @@ -49,6 +50,7 @@ export class LocalizationContainer extends React.Component { be: localeBE, uk: localeUK, zh: localeZH, + es: localeES, }; } diff --git a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx index 2ff1907696..0a9a5f3d67 100644 --- a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx +++ b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx @@ -226,7 +226,7 @@ const messages = defineMessages({ }, ruleNameDuplicateHint: { id: 'Notifications.ruleNameDuplicateHint', - defaultMessage: 'Rule with the same name already exist on the project', + defaultMessage: 'Rule with the same name already exists for this communication channel', }, customColumnsDuplicationHint: { id: 'ProductStatusControls.customColumnsDuplicationHint', diff --git a/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx b/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx index 478ec4350a..f838d795f8 100644 --- a/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx +++ b/app/src/components/integrations/elements/integrationSettings/integrationForm/integrationForm.jsx @@ -21,7 +21,7 @@ import { reduxForm } from 'redux-form'; import track from 'react-tracking'; import classNames from 'classnames/bind'; import { COMMON_LOCALE_KEYS } from 'common/constants/localization'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import { isIntegrationSupportsMultipleInstances } from 'components/integrations/utils'; import { PLUGINS_PAGE_EVENTS, SETTINGS_PAGE_EVENTS } from 'components/main/analytics/events'; import styles from './integrationForm.scss'; @@ -170,7 +170,7 @@ export class IntegrationForm extends Component { @@ -180,7 +180,7 @@ export class IntegrationForm extends Component { @@ -192,7 +192,7 @@ export class IntegrationForm extends Component { variant="ghost" onClick={this.toggleDisabled} disabled={shouldFieldsBeHidden} - dataAutomationId="cancelConfigurationButton" + data-automation-id="cancelConfigurationButton" > {formatMessage(COMMON_LOCALE_KEYS.CANCEL)} diff --git a/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx b/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx index ecac8c096f..58a46c8a4f 100644 --- a/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx +++ b/app/src/components/integrations/integrationProviders/emailIntegration/emailFormFields/emailFormFields.jsx @@ -28,7 +28,7 @@ import { } from 'common/utils/validation'; import { FieldProvider } from 'components/fields/fieldProvider'; import { FieldErrorHint } from 'components/fields/fieldErrorHint'; -import { Checkbox } from 'componentLibrary/checkbox'; +import { Checkbox } from '@reportportal/ui-kit'; import { INTEGRATION_FORM } from 'components/integrations/elements'; import { FieldElement } from 'pages/inside/projectSettingsPageContainer/content/elements'; import { FieldText } from 'componentLibrary/fieldText'; diff --git a/app/src/components/main/analytics/events/ga4Events/projectSettingsPageEvents.js b/app/src/components/main/analytics/events/ga4Events/projectSettingsPageEvents.js index 63bceabb81..3707ec2c9f 100644 --- a/app/src/components/main/analytics/events/ga4Events/projectSettingsPageEvents.js +++ b/app/src/components/main/analytics/events/ga4Events/projectSettingsPageEvents.js @@ -103,58 +103,92 @@ export const PROJECT_SETTINGS_DEMO_DATA_EVENTS = { }; export const PROJECT_SETTINGS_NOTIFICATIONS_EVENTS = { - CLICK_SAVE_BUTTON_IN_MODAL: ({ modalName, status, number, type, switcher }) => ({ + CLICK_SAVE_BUTTON_IN_MODAL: ({ + modalName, + status, + number, + type, + switcher, + ruleId, + communicationChanelName, + }) => ({ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, element_name: 'button_save', modal: normalizeEventString(modalName), status: getStatus(status), type: normalizeEventString(type), switcher: getSwitcher(switcher), + icon_name: ruleId, + condition: communicationChanelName, ...(number !== undefined && { number }), }), - CLICK_CHECKBOX_AUTO_NOTIFICATIONS: (status) => ({ + SWITCH_NOTIFICATION_RULE: (communicationChanelName, ruleId, switcher) => ({ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, - element_name: 'checkbox_auto_email_notifications', - status: getStatus(status), + switcher: getSwitcher(switcher), + condition: communicationChanelName, + element_name: 'rule', + icon_name: ruleId, }), - SWITCH_NOTIFICATION_RULE: (switcher) => ({ + SWITCH_PLUGIN_NOTIFICATIONS: (communicationChanelName, switcher) => ({ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, switcher: getSwitcher(switcher), + element_name: `${communicationChanelName}_notifications`, }), - clickDocumentationLink: (place) => ({ + SWITCH_ALL_NOTIFICATIONS: (switcher) => ({ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, - ...(place && { place }), - link_name: 'documentation', + switcher: getSwitcher(switcher), + element_name: 'all_notifications', }), - CLICK_CREATE_RULE_BUTTON: { + CLICK_DISCOVER_PLUGINS_LINK: { ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, - element_name: 'button_create_rule', + link_name: 'discover_plugins', + }, + + CLICK_INTEGRATION_SETTINGS_LINK: { + ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, + element_name: 'integration_settings', + }, + + CLICK_CONFIGURE_INTEGRATION_LINK: { + ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, + element_name: 'configure_integration', + condition: 'email', }, - CLICK_TO_EXPAND_NOTIFICATIONS_DETAILS: { + CLICK_CREATE_RULE_BUTTON: (communicationChanelName) => ({ + ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, + element_name: 'button_create_rule', + condition: communicationChanelName, + }), + + CLICK_TO_EXPAND_NOTIFICATIONS_DETAILS: (communicationChanelName) => ({ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, element_name: 'notifications_name', status: 'open', - }, + condition: communicationChanelName, + }), - CLICK_ICON_EDIT_NOTIFICATIONS: { + CLICK_ICON_EDIT_NOTIFICATIONS: (communicationChanelName) => ({ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, icon_name: 'icon_edit', - }, + condition: communicationChanelName, + }), - CLICK_ICON_DUPLICATE_NOTIFICATIONS: { + CLICK_ICON_DUPLICATE_NOTIFICATIONS: (communicationChanelName) => ({ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, icon_name: 'icon_duplicate', - }, + condition: communicationChanelName, + }), - CLICK_ICON_DELETE_NOTIFICATIONS: { + CLICK_ICON_DELETE_NOTIFICATIONS: (communicationChanelName) => ({ ...BASIC_EVENT_PARAMETERS_NOTIFICATIONS, icon_name: 'icon_delete', - }, + condition: communicationChanelName, + }), }; export const PROJECT_SETTINGS_DEFECT_TYPES_EVENTS = { diff --git a/app/src/controllers/log/sagas.js b/app/src/controllers/log/sagas.js index 0a75551103..eef4a45b83 100644 --- a/app/src/controllers/log/sagas.js +++ b/app/src/controllers/log/sagas.js @@ -44,7 +44,7 @@ import { } from 'controllers/log/nestedSteps/actionCreators'; import { createNamespacedQuery } from 'common/utils/routingUtils'; import { FAILED } from 'common/constants/testStatuses'; -import { ERROR } from 'common/constants/logLevels'; +import { ERROR, FATAL } from 'common/constants/logLevels'; import { fetchErrorLogs, clearLogPageStackTrace, @@ -128,6 +128,9 @@ function* fetchAllErrorLogs({ excludeLogContent = true, level, }) { + const logMessages = yield select(logItemsSelector); + const requiresErrorLogLocation = logMessages.some((log) => [ERROR, FATAL].includes(log.level)); + const { id } = logItem; const { projectKey, query, filterLevel } = yield call(collectLogPayload); let retryId = null; @@ -137,15 +140,20 @@ function* fetchAllErrorLogs({ } let cancelRequest = () => {}; try { - yield put( - fetchDataAction(namespace)(URLS.errorLogs(projectKey, retryId || id, level || filterLevel), { - params: { ...query, excludeLogContent }, - abort: (cancelFunc) => { - cancelRequest = cancelFunc; - }, - }), - ); - yield take(createFetchPredicate(namespace)); + if (logViewMode === DETAILED_LOG_VIEW && requiresErrorLogLocation) { + yield put( + fetchDataAction(namespace)( + URLS.errorLogs(projectKey, retryId || id, level || filterLevel), + { + params: { ...query, excludeLogContent }, + abort: (cancelFunc) => { + cancelRequest = cancelFunc; + }, + }, + ), + ); + yield take(createFetchPredicate(namespace)); + } } catch (err) { yield handleError(err); } finally { diff --git a/app/src/controllers/plugins/uiExtensions/createImportProps.js b/app/src/controllers/plugins/uiExtensions/createImportProps.js index 514cde17ce..de50c52f86 100644 --- a/app/src/controllers/plugins/uiExtensions/createImportProps.js +++ b/app/src/controllers/plugins/uiExtensions/createImportProps.js @@ -30,7 +30,7 @@ import { import Link from 'redux-first-router-link'; import { useTracking } from 'react-tracking'; import classNames from 'classnames/bind'; -import { BubblesLoader } from '@reportportal/ui-kit'; +import { BubblesLoader, Button, Checkbox } from '@reportportal/ui-kit'; import { GhostButton } from 'components/buttons/ghostButton'; import { BigButton } from 'components/buttons/bigButton'; import { NavigationTabs } from 'components/main/navigationTabs'; @@ -183,9 +183,7 @@ import { RuleList as RuleListComponent, DraggableRuleList, } from 'pages/inside/projectSettingsPageContainer/content/elements'; -import { Checkbox } from 'componentLibrary/checkbox'; import { FieldTextFlex } from 'componentLibrary/fieldTextFlex'; -import { Button } from 'componentLibrary/button'; import { Toggle } from 'componentLibrary/toggle'; import { EmptyStatePage } from 'pages/inside/projectSettingsPageContainer/content/emptyStatePage'; import { Dropdown } from 'componentLibrary/dropdown'; diff --git a/app/src/controllers/project/actionCreators.js b/app/src/controllers/project/actionCreators.js index f69d28c724..12f757c2e4 100644 --- a/app/src/controllers/project/actionCreators.js +++ b/app/src/controllers/project/actionCreators.js @@ -169,9 +169,9 @@ export const fetchProjectNotificationsSuccessAction = (notifications) => ({ payload: notifications, }); -export const addProjectNotificationAction = (notification) => ({ +export const addProjectNotificationAction = (notification, triggerAddingEvent = () => {}) => ({ type: ADD_PROJECT_NOTIFICATION, - payload: notification, + payload: { notification, triggerAddingEvent }, }); export const addProjectNotificationSuccessAction = (notification) => ({ diff --git a/app/src/controllers/project/sagas.js b/app/src/controllers/project/sagas.js index c17e2ba703..79ac39627f 100644 --- a/app/src/controllers/project/sagas.js +++ b/app/src/controllers/project/sagas.js @@ -198,7 +198,7 @@ function* updateNotificationState({ yield put(updateConfigurationAttributesAction(updatedConfig)); } -function* addProjectNotification({ payload: notification }) { +function* addProjectNotification({ payload: { notification, triggerAddingEvent = () => {} } }) { try { const projectKey = yield select(projectKeySelector); @@ -214,6 +214,7 @@ function* addProjectNotification({ payload: notification }) { type: NOTIFICATION_TYPES.SUCCESS, }), ); + triggerAddingEvent(response.id); yield put(hideModalAction()); } catch (error) { yield put(showDefaultErrorNotification(error)); diff --git a/app/src/layouts/common/appSidebar/helpAndService/modal/requestSupportModal.jsx b/app/src/layouts/common/appSidebar/helpAndService/modal/requestSupportModal.jsx index 2bb011b182..f8022dbdf7 100644 --- a/app/src/layouts/common/appSidebar/helpAndService/modal/requestSupportModal.jsx +++ b/app/src/layouts/common/appSidebar/helpAndService/modal/requestSupportModal.jsx @@ -20,6 +20,7 @@ import { reduxForm } from 'redux-form'; import { useDispatch, useSelector } from 'react-redux'; import { useIntl } from 'react-intl'; import classNames from 'classnames/bind'; +import { Checkbox } from '@reportportal/ui-kit'; import { commonValidators } from 'common/utils/validation'; import { userEmailSelector } from 'controllers/user'; import { FieldProvider } from 'components/fields/fieldProvider'; @@ -29,7 +30,6 @@ import { NOTIFICATION_TYPES, showNotification } from 'controllers/notification'; import { HELP_AND_SUPPORT_EVENTS } from 'analyticsEvents/helpAndSupportEvents'; import { FieldText } from 'componentLibrary/fieldText'; import { ModalLayout } from 'componentLibrary/modal'; -import { Checkbox } from 'componentLibrary/checkbox'; import { hideModalAction, withModal } from 'controllers/modal'; import OpenIcon from 'common/img/open-in-new-tab-inline.svg'; import { referenceDictionary } from 'common/utils'; diff --git a/app/src/pages/inside/launchesPage/launchesPage.jsx b/app/src/pages/inside/launchesPage/launchesPage.jsx index 13f2c161f0..bf306b8f31 100644 --- a/app/src/pages/inside/launchesPage/launchesPage.jsx +++ b/app/src/pages/inside/launchesPage/launchesPage.jsx @@ -623,7 +623,12 @@ export class LaunchesPage extends Component { }; mergeLaunches = () => { - this.props.mergeLaunchesAction(this.props.selectedLaunches, { + const launches = this.props.selectedLaunches.map((launch) => ({ + ...launch, + startTime: new Date(launch.startTime).getTime(), + endTime: new Date(launch.endTime).getTime(), + })); + this.props.mergeLaunchesAction(launches, { fetchFunc: this.unselectAndResetPage, }); }; diff --git a/app/src/pages/inside/profilePage/deleteAccountBlock/deleteAccountBlock.jsx b/app/src/pages/inside/profilePage/deleteAccountBlock/deleteAccountBlock.jsx index 8e22a629b4..a2e4f5daba 100644 --- a/app/src/pages/inside/profilePage/deleteAccountBlock/deleteAccountBlock.jsx +++ b/app/src/pages/inside/profilePage/deleteAccountBlock/deleteAccountBlock.jsx @@ -24,9 +24,11 @@ import { GhostButton } from 'components/buttons/ghostButton'; import { withTooltip } from 'components/main/tooltips/tooltip'; import { PROFILE_PAGE_EVENTS } from 'components/main/analytics/events'; import { showModalAction } from 'controllers/modal'; -import { isAdminSelector } from 'controllers/user'; +import { isAdminSelector, userIdSelector } from 'controllers/user'; +import { isDemoInstanceSelector } from 'controllers/appInfo'; import { instanceTypeSelector } from 'controllers/appInfo/selectors'; import { EPAM } from 'controllers/appInfo/constants'; +import { DEFAULT_USER_ID } from 'common/constants/accountRoles'; import styles from './deleteAccountBlock.scss'; const cx = classNames.bind(styles); @@ -35,11 +37,15 @@ const messages = defineMessages({ id: 'DeleteAccountBlock.deleteAccount', defaultMessage: 'Delete account', }, - tooltipText: { - id: 'DeleteAccountBlock.tooltipText', + tooltipAdminDisabledText: { + id: 'DeleteAccountBlock.tooltipAdminDisabledText', defaultMessage: 'Only users with non-admin role can delete their account.\nAlternatively, other admin can do it.', }, + tooltipDefaultUserDisabledText: { + id: 'DeleteAccountBlock.tooltipDefaultUserDisabledText', + defaultMessage: "It's forbidden to delete account of default user on Demo instance.", + }, }); const Button = ({ onClick, formatMessage, disabled }) => ( @@ -57,17 +63,23 @@ const Button = ({ onClick, formatMessage, disabled }) => ( ); Button.propTypes = { formatMessage: PropTypes.func.isRequired, - disabled: PropTypes.bool.isRequired, + disabled: PropTypes.bool, onClick: PropTypes.func, }; Button.propTypes = { + disabled: false, onClick: () => {}, }; -const TooltipContent = ({ formatMessage }) => ( -
{formatMessage(messages.tooltipText)}
+const TooltipContent = ({ formatMessage, isAdmin }) => ( +
+ {formatMessage( + isAdmin ? messages.tooltipAdminDisabledText : messages.tooltipDefaultUserDisabledText, + )} +
); TooltipContent.propTypes = { formatMessage: PropTypes.func.isRequired, + isAdmin: PropTypes.bool.isRequired, }; const ButtonWithTooltip = withTooltip({ @@ -83,7 +95,9 @@ export const DeleteAccountBlock = () => { const { formatMessage } = useIntl(); const { trackEvent } = useTracking(); const isAdmin = useSelector(isAdminSelector); + const isDefaultUser = useSelector(userIdSelector) === DEFAULT_USER_ID; const instanceType = useSelector(instanceTypeSelector); + const isDemoInstance = useSelector(isDemoInstanceSelector); const onDeleteAccountClick = () => { trackEvent(PROFILE_PAGE_EVENTS.CLICK_DELETE_ACCOUNT); @@ -97,8 +111,8 @@ export const DeleteAccountBlock = () => { return (
- {isAdmin ? ( - + {isAdmin || (isDefaultUser && isDemoInstance) ? ( + ) : ( {isPending && } diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/indexSettings/indexSettings.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/indexSettings/indexSettings.jsx index dd4806fe51..a0a5ebd346 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/indexSettings/indexSettings.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/indexSettings/indexSettings.jsx @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import classNames from 'classnames/bind'; import { reduxForm } from 'redux-form'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import { SETTINGS_PAGE_EVENTS } from 'components/main/analytics/events'; import { useTracking } from 'react-tracking'; import { showModalAction } from 'controllers/modal'; @@ -87,9 +87,8 @@ const IndexSettings = ({ indexingRunning, analyzerUnavailableTitle, hasPermissio disabled={indexingRunning || isFieldDisabled} onClick={generateIndex} title={analyzerUnavailableTitle} - mobileDisabled variant="ghost" - dataAutomationId="generateIndexButton" + data-automation-id="generateIndexButton" > {formatMessage(messages.generateIndexButtonCaption)} @@ -97,9 +96,8 @@ const IndexSettings = ({ indexingRunning, analyzerUnavailableTitle, hasPermissio disabled={indexingRunning || isFieldDisabled} onClick={removeIndex} title={analyzerUnavailableTitle} - mobileDisabled variant="ghost" - dataAutomationId="removeIndexButton" + data-automation-id="removeIndexButton" > {formatMessage(messages.removeIndexButtonCaption)} diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/similarItems/similarItems.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/similarItems/similarItems.jsx index 11b0271016..1d36877e69 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/similarItems/similarItems.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/similarItems/similarItems.jsx @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import { reduxForm } from 'redux-form'; import { COMMON_LOCALE_KEYS } from 'common/constants/localization'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import { FieldNumber } from 'componentLibrary/fieldNumber'; import { FieldErrorHint } from 'components/fields/fieldErrorHint'; import { bindMessageToValidator, validate } from 'common/utils/validation'; @@ -88,12 +88,7 @@ const SimilarItems = ({ - {isPending && } diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/uniqueErrors/uniqueErrors.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/uniqueErrors/uniqueErrors.jsx index f503bddab4..915ec6e9cc 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/uniqueErrors/uniqueErrors.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/analyzerContainer/uniqueErrors/uniqueErrors.jsx @@ -19,9 +19,8 @@ import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import { reduxForm } from 'redux-form'; import { COMMON_LOCALE_KEYS } from 'common/constants/localization'; -import { Button } from 'componentLibrary/button'; +import { Button, Checkbox } from '@reportportal/ui-kit'; import { Dropdown } from 'componentLibrary/dropdown'; -import { Checkbox } from 'componentLibrary/checkbox'; import { useTracking } from 'react-tracking'; import { PROJECT_SETTINGS_ANALYZER_EVENTS } from 'analyticsEvents/projectSettingsPageEvents'; import { docsReferences, createExternalLink } from 'common/utils'; @@ -115,12 +114,7 @@ const UniqueErrors = ({ > - {isPending && } diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypes.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypes.jsx index af41e2fe97..d4c4f4ed7e 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypes.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/defectTypes/defectTypes.jsx @@ -25,7 +25,7 @@ import { addDefectTypeAction, defectTypesSelector } from 'controllers/project'; import { userRolesSelector } from 'controllers/user'; import { canUpdateSettings } from 'common/utils/permissions'; import { DEFECT_TYPES_SEQUENCE } from 'common/constants/defectTypes'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import CreateDefectIcon from 'common/img/newIcons/create-subtype-inline.svg'; import DefectGroupIcon from 'common/img/newIcons/defect-group-inline.svg'; import { withTooltip } from 'componentLibrary/tooltip'; @@ -130,7 +130,7 @@ export const DefectTypes = ({ setHeaderTitleNode }) => { trackEvent(PROJECT_SETTINGS_DEFECT_TYPES_EVENTS.CLICK_CREATE_BUTTON), ) } - dataAutomationId={'createDefectTypeButton'} + data-automation-id={'createDefectTypeButton'} > {formatMessage(messages.createDefectHeader)} diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/demoDataContent/generateDemoDataBlock/generateDemoDataBlock.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/demoDataContent/generateDemoDataBlock/generateDemoDataBlock.jsx index a762537b13..f57561ac42 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/demoDataContent/generateDemoDataBlock/generateDemoDataBlock.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/demoDataContent/generateDemoDataBlock/generateDemoDataBlock.jsx @@ -21,7 +21,7 @@ import classNames from 'classnames/bind'; import { useDispatch, useSelector } from 'react-redux'; import { fetch } from 'common/utils'; import { URLS } from 'common/urls'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import { NOTIFICATION_TYPES, showDefaultErrorNotification, diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/emptyStatePage/emptyStatePage.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/emptyStatePage/emptyStatePage.jsx index 711e3d78c5..893982ca30 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/emptyStatePage/emptyStatePage.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/emptyStatePage/emptyStatePage.jsx @@ -16,7 +16,7 @@ import React from 'react'; import classNames from 'classnames/bind'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import { withTooltip } from 'componentLibrary/tooltip'; import Parser from 'html-react-parser'; import ExternalLinkIcon from 'common/img/open-in-rounded-inline.svg'; @@ -78,9 +78,9 @@ export const EmptyStatePage = ({ ) : ( diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationHeader/integrationHeader.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationHeader/integrationHeader.jsx index 1b237d5d36..e245f67074 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationHeader/integrationHeader.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/integrations/integrationsList/integrationInfo/integrationHeader/integrationHeader.jsx @@ -19,7 +19,7 @@ import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import classNames from 'classnames/bind'; import Parser from 'html-react-parser'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import { PLUGIN_NAME_TITLES } from 'components/integrations'; import { PLUGIN_DESCRIPTIONS_MAP } from 'components/integrations/messages'; import { PluginIcon } from 'components/integrations/elements/pluginIcon'; @@ -102,7 +102,7 @@ export const IntegrationHeader = (props) => { @@ -110,7 +110,7 @@ export const IntegrationHeader = (props) => { diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/LinkComponent/LinkComponent.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/LinkComponent/LinkComponent.jsx index 3ce9000a3c..d09e1b68f1 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/LinkComponent/LinkComponent.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/LinkComponent/LinkComponent.jsx @@ -19,19 +19,31 @@ import PropTypes from 'prop-types'; import Parser from 'html-react-parser'; import classNames from 'classnames/bind'; import Link from 'redux-first-router-link'; +import { useTracking } from 'react-tracking'; import styles from './LinkComponent.scss'; import { isInternalLink } from '../utils'; const cx = classNames.bind(styles); -export const LinkComponent = ({ to, children, icon, className, automationId }) => { +export const LinkComponent = ({ to, children, icon, className, event, automationId }) => { + const { trackEvent } = useTracking(); + const handleLinkTracking = () => { + trackEvent(event); + }; return isInternalLink(to) ? ( - + {children} {icon && {Parser(icon)}} ) : ( { diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/footer/footer.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/footer/footer.jsx index 061b4d44ba..742809bce6 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/footer/footer.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/footer/footer.jsx @@ -28,6 +28,7 @@ import { INTEGRATIONS } from 'common/constants/settingsTabs'; import { useSelector } from 'react-redux'; import { activeProjectSelector } from 'controllers/user'; import { docsReferences } from 'common/utils'; +import { PROJECT_SETTINGS_NOTIFICATIONS_EVENTS } from 'components/main/analytics/events/ga4Events/projectSettingsPageEvents'; import { messages } from '../messages'; import styles from './footer.scss'; import { HelpPanel } from '../helpPanel'; @@ -45,6 +46,7 @@ export const NotificationsFooter = () => { link: docsReferences.pluginsDocs, description: formatMessage(messages.discoverPluginsDescription), openIcon: openInNewTabIcon, + event: PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_DISCOVER_PLUGINS_LINK, automationId: 'documentationLink', }, { @@ -59,6 +61,7 @@ export const NotificationsFooter = () => { }, description: formatMessage(messages.integrationSettingsDescription), openIcon: arrowRightIcon, + event: PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_INTEGRATION_SETTINGS_LINK, automationId: 'integrationSettingsLink', }, ]; diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/helpPanel/helpPanel.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/helpPanel/helpPanel.jsx index fccbf239a7..912fcbea59 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/helpPanel/helpPanel.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/helpPanel/helpPanel.jsx @@ -26,13 +26,13 @@ const cx = classNames.bind(styles); export const HelpPanel = ({ items }) => { return (
- {items.map(({ title, mainIcon, link, openIcon, automationId, description }) => ( + {items.map(({ title, mainIcon, link, openIcon, automationId, description, event }) => (
{Parser(mainIcon)}
- + {title}

{description}

diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/modals/addEditNotificationModal/addEditNotificationModal.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/modals/addEditNotificationModal/addEditNotificationModal.jsx index fa23b8cab9..6f9d106b7f 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/modals/addEditNotificationModal/addEditNotificationModal.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/modals/addEditNotificationModal/addEditNotificationModal.jsx @@ -17,7 +17,6 @@ import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import { formValueSelector, reduxForm } from 'redux-form'; -import { useTracking } from 'react-tracking'; import { useDispatch, useSelector } from 'react-redux'; import className from 'classnames/bind'; import { defineMessages, useIntl } from 'react-intl'; @@ -33,13 +32,13 @@ import { URLS } from 'common/urls'; import { Dropdown } from 'componentLibrary/dropdown'; import { hideModalAction } from 'controllers/modal'; import { FieldText } from 'componentLibrary/fieldText'; -import { Checkbox } from 'componentLibrary/checkbox'; -import { PROJECT_SETTINGS_NOTIFICATIONS_EVENTS } from 'analyticsEvents/projectSettingsPageEvents'; +import { Checkbox } from '@reportportal/ui-kit'; import { AttributeListFormField } from 'components/containers/AttributeListFormField'; import { RadioGroup } from 'componentLibrary/radioGroup'; import { EMAIL } from 'common/constants/pluginNames'; import { FieldTextFlex } from 'componentLibrary/fieldTextFlex'; import { ruleField } from 'pages/inside/projectSettingsPageContainer/content/notifications/propTypes'; +import { capitalizeWord } from '../util'; import { RecipientsContainer } from './recipientsContainer'; import { LaunchNamesContainer } from './launchNamesContainer'; import { @@ -70,7 +69,7 @@ const cx = className.bind(styles); const messages = defineMessages({ title: { id: 'AddEditNotificationCaseModal.title', - defaultMessage: '{actionType} Notification Rule', + defaultMessage: '{actionType} {pluginType} Notification Rule', }, description: { id: 'AddEditNotificationCaseModal.description', @@ -215,7 +214,6 @@ const AddEditNotificationModal = ({ dirty, }) => { const { formatMessage } = useIntl(); - const { trackEvent } = useTracking(); const dispatch = useDispatch(); const [isEditorShown, setShowEditor] = React.useState(data.notification.attributes.length > 0); const attributesValue = @@ -279,10 +277,9 @@ const AddEditNotificationModal = ({ type: messages[sendCase].defaultMessage, switcher, number: isEditorShown ? length : undefined, + communicationChanelName: data.type, }; - - trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_SAVE_BUTTON_IN_MODAL(eventParameters)); - onSave(newFormValues); + onSave(newFormValues, eventParameters); }; const okButton = { @@ -323,6 +320,7 @@ const AddEditNotificationModal = ({ { +const DeleteNotificationCaseModal = ({ data: { onSave, type } }) => { const { formatMessage } = useIntl(); const dispatch = useDispatch(); return ( word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/notifications.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/notifications.jsx index 468243c60a..42a4520016 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/notifications.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/notifications.jsx @@ -18,7 +18,7 @@ import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import { useDispatch, useSelector } from 'react-redux'; import classNames from 'classnames/bind'; -import { trackEvent } from 'react-tracking'; +import { useTracking } from 'react-tracking'; import { useIntl } from 'react-intl'; import { canUpdateSettings } from 'common/utils/permissions'; import { @@ -54,6 +54,7 @@ export const Notifications = () => { const allNotificationPlugins = useSelector(notificationPluginsSelector); const { formatMessage } = useIntl(); const dispatch = useDispatch(); + const { trackEvent } = useTracking(); const userRoles = useSelector(userRolesSelector); const isAllNotificationsEnabled = useSelector(projectNotificationsStateSelector); @@ -66,7 +67,7 @@ export const Notifications = () => { }, []); const toggleNotificationsEnabled = (isEnabled) => { - trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_CHECKBOX_AUTO_NOTIFICATIONS(isEnabled)); + trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.SWITCH_ALL_NOTIFICATIONS(isEnabled)); dispatch(updateNotificationStateAction(isEnabled)); }; // separate notifications by types @@ -110,6 +111,3 @@ export const Notifications = () => { ); }; -Notifications.propTypes = { - setHeaderTitleNode: PropTypes.func.isRequired, -}; diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/ruleGroup/ruleGroup.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/ruleGroup/ruleGroup.jsx index 52a9b2e90c..2248434df2 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/notifications/ruleGroup/ruleGroup.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/notifications/ruleGroup/ruleGroup.jsx @@ -16,7 +16,7 @@ import { Layout } from 'pages/inside/projectSettingsPageContainer/content/layout'; import { Toggle } from 'componentLibrary/toggle'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import addIcon from 'common/img/add-inline.svg'; import React from 'react'; import classNames from 'classnames/bind'; @@ -98,7 +98,13 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled, pluginName === EMAIL && !isEmailIntegrationAvailable && isActivationRequired; const onToggleHandler = (isEnabled, notification) => { - trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.SWITCH_NOTIFICATION_RULE(isEnabled)); + trackEvent( + PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.SWITCH_NOTIFICATION_RULE( + pluginNameInCamelCase, + notification.id, + isEnabled, + ), + ); dispatch( updateProjectNotificationAction( @@ -109,11 +115,22 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled, const handleRuleItemClick = (isShown) => { if (isShown) { - trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_TO_EXPAND_NOTIFICATIONS_DETAILS); + trackEvent( + PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_TO_EXPAND_NOTIFICATIONS_DETAILS( + pluginNameInCamelCase, + ), + ); } }; const togglePluginNotificationsEnabled = (isEnabled) => { + trackEvent( + PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.SWITCH_PLUGIN_NOTIFICATIONS( + pluginNameInCamelCase, + isEnabled, + ), + ); + dispatch( updateNotificationStateAction( isEnabled, @@ -121,16 +138,29 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled, ), ); }; - const confirmAdd = (newNotification) => { + const confirmAdd = (newNotification, eventParameters) => { + const trackAddingEvent = (id) => + trackEvent( + PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_SAVE_BUTTON_IN_MODAL({ + ...eventParameters, + ruleId: id, + }), + ); const notification = convertNotificationCaseForSubmission(newNotification); - dispatch(addProjectNotificationAction(notification)); + dispatch(addProjectNotificationAction(notification, trackAddingEvent)); }; const confirmDelete = (id) => { dispatch(deleteProjectNotificationAction(id)); }; - const confirmEdit = (notification) => { + const confirmEdit = (notification, eventParameters) => { + trackEvent( + PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_SAVE_BUTTON_IN_MODAL({ + ...eventParameters, + ruleId: notification.id, + }), + ); dispatch( updateProjectNotificationAction( convertNotificationCaseForSubmission({ @@ -142,7 +172,9 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled, }; const onAdd = () => { - trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_CREATE_RULE_BUTTON); + trackEvent( + PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_CREATE_RULE_BUTTON(pluginNameInCamelCase), + ); dispatch( showModalAction({ @@ -160,7 +192,9 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled, }; const onEdit = (notification) => { - trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_EDIT_NOTIFICATIONS); + trackEvent( + PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_EDIT_NOTIFICATIONS(pluginNameInCamelCase), + ); dispatch( showModalAction({ @@ -178,19 +212,26 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled, }; const onDelete = (notification) => { - trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_DELETE_NOTIFICATIONS); + trackEvent( + PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_DELETE_NOTIFICATIONS(pluginNameInCamelCase), + ); dispatch( showModalAction({ id: 'deleteNotificationModal', data: { onSave: () => confirmDelete(notification.id), + type: pluginName, }, }), ); }; const onCopy = (notification) => { - trackEvent(PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_DUPLICATE_NOTIFICATIONS); + trackEvent( + PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_ICON_DUPLICATE_NOTIFICATIONS( + pluginNameInCamelCase, + ), + ); const { id, ...newNotification } = flatRule(notification); dispatch( @@ -200,7 +241,8 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled, type: pluginName, actionType: MODAL_ACTION_TYPE_COPY, ruleFields, - onSave: (withoutAttributes) => confirmAdd(withoutAttributes), + onSave: (withoutAttributes, eventParameters) => + confirmAdd(withoutAttributes, eventParameters), notification: { ...newNotification, ruleName: notification.ruleName + COPY_POSTFIX, @@ -283,6 +325,7 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled, }, }} icon={arrowRightIcon} + event={PROJECT_SETTINGS_NOTIFICATIONS_EVENTS.CLICK_CONFIGURE_INTEGRATION_LINK} > {formatMessage(messages.configureIntegration)}
@@ -311,11 +354,11 @@ export const RuleGroup = ({ pluginName, ruleDescription, rules, isPluginEnabled, /> {isUpdateSettingAvailable && ( diff --git a/app/src/pages/inside/projectSettingsPageContainer/content/patternAnalysis/patternAnalysisContent/patternAnalysisContent.jsx b/app/src/pages/inside/projectSettingsPageContainer/content/patternAnalysis/patternAnalysisContent/patternAnalysisContent.jsx index ac0973487d..b97e4bde07 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/content/patternAnalysis/patternAnalysisContent/patternAnalysisContent.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/content/patternAnalysis/patternAnalysisContent/patternAnalysisContent.jsx @@ -27,8 +27,7 @@ import { } from 'controllers/project'; import { hideModalAction, showModalAction } from 'controllers/modal'; import { useIntl } from 'react-intl'; -import { Checkbox } from 'componentLibrary/checkbox'; -import { Button } from 'componentLibrary/button'; +import { Button, Checkbox } from '@reportportal/ui-kit'; import classNames from 'classnames/bind'; import PropTypes from 'prop-types'; import PencilIcon from 'common/img/newIcons/pencil-inline.svg'; @@ -58,7 +57,7 @@ export const PatternAnalysisContent = ({ useEffect(() => { setHeaderTitleNode( - , diff --git a/app/src/pages/inside/projectSettingsPageContainer/generalTab/generalTab.jsx b/app/src/pages/inside/projectSettingsPageContainer/generalTab/generalTab.jsx index 09ef36a816..c3abf75d49 100644 --- a/app/src/pages/inside/projectSettingsPageContainer/generalTab/generalTab.jsx +++ b/app/src/pages/inside/projectSettingsPageContainer/generalTab/generalTab.jsx @@ -23,7 +23,7 @@ import { connect } from 'react-redux'; import { injectIntl } from 'react-intl'; import { formValueSelector, reduxForm } from 'redux-form'; import moment from 'moment'; -import { BubblesLoader } from '@reportportal/ui-kit'; +import { BubblesLoader, Button } from '@reportportal/ui-kit'; import { URLS } from 'common/urls'; import { fetch, secondsToDays } from 'common/utils'; import { canUpdateSettings } from 'common/utils/permissions'; @@ -44,7 +44,6 @@ import { userRolesSelector } from 'controllers/user'; import { showNotification, NOTIFICATION_TYPES } from 'controllers/notification'; import { langSelector } from 'controllers/lang'; import { SpinningPreloader } from 'components/preloaders/spinningPreloader'; -import { Button } from 'componentLibrary/button'; import { Dropdown } from 'componentLibrary/dropdown'; import { PROJECT_SETTINGS_GENERAL_TAB_EVENTS } from 'analyticsEvents/projectSettingsPageEvents'; import styles from './generalTab.scss'; @@ -429,7 +428,7 @@ export class GeneralTab extends Component { />
- {processingData && ( diff --git a/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx b/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx index d87959c216..b17b10afb0 100644 --- a/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx +++ b/app/src/pages/inside/stepPage/modals/postIssueModal/postIssueModal.jsx @@ -40,7 +40,7 @@ import { } from 'components/fields/dynamicFieldsSection/utils'; import { projectInfoSelector, projectKeySelector } from 'controllers/project'; import { FieldProvider } from 'components/fields/fieldProvider'; -import { Checkbox } from 'componentLibrary/checkbox'; +import { Checkbox } from '@reportportal/ui-kit'; import { ISSUE_TYPE_FIELD_KEY } from 'components/integrations/elements/bts/constants'; import { BtsIntegrationSelector } from 'pages/inside/common/btsIntegrationSelector'; import { DarkModalLayout, ModalFooter } from 'components/main/modal/darkModalLayout'; @@ -105,7 +105,7 @@ const messages = defineMessages({ }, postIssueSuccess: { id: 'PostIssueModal.postIssueSuccess', - defaultMessage: 'Ticket has been created.', + defaultMessage: 'Ticket has been created successfully', }, postIssueForTheTest: { id: 'PostIssueModal.postIssueForTheTest', @@ -381,10 +381,10 @@ export class PostIssueModal extends Component { type: NOTIFICATION_TYPES.SUCCESS, }); }) - .catch(() => { + .catch((err) => { this.props.hideScreenLockAction(); this.props.showNotification({ - message: formatMessage(messages.postIssueFailed), + message: `${formatMessage(messages.postIssueFailed)}. ${err.message}`, type: NOTIFICATION_TYPES.ERROR, }); }); diff --git a/app/src/pages/organization/emptyPageState/emptyPageState.jsx b/app/src/pages/organization/emptyPageState/emptyPageState.jsx index c41ae150a8..036e814bcd 100644 --- a/app/src/pages/organization/emptyPageState/emptyPageState.jsx +++ b/app/src/pages/organization/emptyPageState/emptyPageState.jsx @@ -15,7 +15,7 @@ */ import classNames from 'classnames/bind'; -import { Button } from 'componentLibrary/button'; +import { Button } from '@reportportal/ui-kit'; import PropTypes from 'prop-types'; import Parser from 'html-react-parser'; import styles from './emptyPageState.scss'; diff --git a/app/src/pages/organization/organizationProjectsPage/projectsPageHeader/projectsPageHeader.jsx b/app/src/pages/organization/organizationProjectsPage/projectsPageHeader/projectsPageHeader.jsx index 6ccecc918d..f820d05f13 100644 --- a/app/src/pages/organization/organizationProjectsPage/projectsPageHeader/projectsPageHeader.jsx +++ b/app/src/pages/organization/organizationProjectsPage/projectsPageHeader/projectsPageHeader.jsx @@ -19,13 +19,13 @@ import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import { useSelector } from 'react-redux'; import Parser from 'html-react-parser'; +import { Button } from '@reportportal/ui-kit'; import classNames from 'classnames/bind'; import { PROJECTS_PAGE } from 'controllers/pages'; import searchIcon from 'common/img/newIcons/search-outline-inline.svg'; import filterIcon from 'common/img/newIcons/filters-outline-inline.svg'; import plusIcon from 'common/img/plus-button-inline.svg'; import { Breadcrumbs } from 'componentLibrary/breadcrumbs'; -import { Button } from 'componentLibrary/button'; import { activeOrganizationSelector } from 'controllers/organizations/organization'; import userIcon from './img/user-inline.svg'; import { messages } from '../messages'; diff --git a/app/src/pages/organization/projectTeamPage/projectTeamPageHeader/projectTeamPageHeader.jsx b/app/src/pages/organization/projectTeamPage/projectTeamPageHeader/projectTeamPageHeader.jsx index 79e7e87298..4601e52e40 100644 --- a/app/src/pages/organization/projectTeamPage/projectTeamPageHeader/projectTeamPageHeader.jsx +++ b/app/src/pages/organization/projectTeamPage/projectTeamPageHeader/projectTeamPageHeader.jsx @@ -18,9 +18,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import Parser from 'html-react-parser'; import classNames from 'classnames/bind'; +import { Button } from '@reportportal/ui-kit'; import searchIcon from 'common/img/newIcons/search-outline-inline.svg'; import filterIcon from 'common/img/newIcons/filters-outline-inline.svg'; -import { Button } from 'componentLibrary/button'; import { useIntl } from 'react-intl'; import { messages } from '../messages'; import styles from './projectTeamPageHeader.scss'; diff --git a/docs/9-localization.md b/docs/9-localization.md index ffeae0d283..580a01d28c 100644 --- a/docs/9-localization.md +++ b/docs/9-localization.md @@ -5,7 +5,7 @@ For localization needs Report Portal uses [react-intl](https://github.com/yahoo/ [Documentation](https://github.com/yahoo/react-intl/wiki) All text content of application should be controlled by localization system. -At the moment Report Portal supports English (default), Russian, Belorussian and Ukrainian languages. +At the moment Report Portal supports English (default), Russian, Belorussian, Ukrainian and Spanish languages. Localization message id format: `ComponentsName.elementName` (for example FiltersPage.addFilterButton)